1const std = @import("std");
2const builtin = @import("builtin");
3const expect = std.testing.expect;
4
5test "@byteSwap integers" {
6 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
7 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
8 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest;
9 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
10
11 const ByteSwapIntTest = struct {
12 fn run() !void {
13 try t(u0, 0, 0);
14 try t(u8, 0x12, 0x12);
15 try t(u16, 0x1234, 0x3412);
16 try t(u24, 0x123456, 0x563412);
17 try t(i24, @as(i24, @bitCast(@as(u24, 0xf23456))), 0x5634f2);
18 try t(i24, 0x1234f6, @as(i24, @bitCast(@as(u24, 0xf63412))));
19 try t(u32, 0x12345678, 0x78563412);
20 try t(i32, @as(i32, @bitCast(@as(u32, 0xf2345678))), 0x785634f2);
21 try t(i32, 0x123456f8, @as(i32, @bitCast(@as(u32, 0xf8563412))));
22 try t(u64, 0x123456789abcdef1, 0xf1debc9a78563412);
23
24 try t(u0, @as(u0, 0), 0);
25 try t(i8, @as(i8, -50), -50);
26 try t(i16, @as(i16, @bitCast(@as(u16, 0x1234))), @as(i16, @bitCast(@as(u16, 0x3412))));
27 try t(i24, @as(i24, @bitCast(@as(u24, 0x123456))), @as(i24, @bitCast(@as(u24, 0x563412))));
28 try t(i32, @as(i32, @bitCast(@as(u32, 0x12345678))), @as(i32, @bitCast(@as(u32, 0x78563412))));
29 try t(i64, @as(i64, @bitCast(@as(u64, 0x123456789abcdef1))), @as(i64, @bitCast(@as(u64, 0xf1debc9a78563412))));
30 }
31 fn t(comptime I: type, input: I, expected_output: I) !void {
32 try std.testing.expect(expected_output == @byteSwap(input));
33 }
34 };
35 try comptime ByteSwapIntTest.run();
36 try ByteSwapIntTest.run();
37}
38
39test "@byteSwap exotic integers" {
40 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
41 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
42 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
43 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest;
44 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
45
46 const ByteSwapIntTest = struct {
47 fn run() !void {
48 try t(u0, 0, 0);
49 try t(u40, 0x123456789a, 0x9a78563412);
50 try t(i48, 0x123456789abc, @as(i48, @bitCast(@as(u48, 0xbc9a78563412))));
51 try t(u56, 0x123456789abcde, 0xdebc9a78563412);
52 try t(u88, 0x123456789abcdef1112131, 0x312111f1debc9a78563412);
53 try t(u96, 0x123456789abcdef111213141, 0x41312111f1debc9a78563412);
54 try t(u128, 0x123456789abcdef11121314151617181, 0x8171615141312111f1debc9a78563412);
55
56 try t(u40, @as(i40, @bitCast(@as(u40, 0x123456789a))), @as(u40, 0x9a78563412));
57 try t(i48, @as(i48, @bitCast(@as(u48, 0x123456789abc))), @as(i48, @bitCast(@as(u48, 0xbc9a78563412))));
58 try t(i56, @as(i56, @bitCast(@as(u56, 0x123456789abcde))), @as(i56, @bitCast(@as(u56, 0xdebc9a78563412))));
59 try t(i88, @as(i88, @bitCast(@as(u88, 0x123456789abcdef1112131))), @as(i88, @bitCast(@as(u88, 0x312111f1debc9a78563412))));
60 try t(i96, @as(i96, @bitCast(@as(u96, 0x123456789abcdef111213141))), @as(i96, @bitCast(@as(u96, 0x41312111f1debc9a78563412))));
61 try t(
62 i128,
63 @as(i128, @bitCast(@as(u128, 0x123456789abcdef11121314151617181))),
64 @as(i128, @bitCast(@as(u128, 0x8171615141312111f1debc9a78563412))),
65 );
66 }
67 fn t(comptime I: type, input: I, expected_output: I) !void {
68 try std.testing.expect(expected_output == @byteSwap(input));
69 }
70 };
71 try comptime ByteSwapIntTest.run();
72 try ByteSwapIntTest.run();
73}
74
75fn vector8() !void {
76 var v = @Vector(2, u8){ 0x12, 0x13 };
77 _ = &v;
78 const result = @byteSwap(v);
79 try expect(result[0] == 0x12);
80 try expect(result[1] == 0x13);
81}
82
83test "@byteSwap vectors u8" {
84 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
85 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
86 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
87 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
88 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
89
90 try comptime vector8();
91 try vector8();
92}
93
94fn vector16() !void {
95 var v = @Vector(2, u16){ 0x1234, 0x2345 };
96 _ = &v;
97 const result = @byteSwap(v);
98 try expect(result[0] == 0x3412);
99 try expect(result[1] == 0x4523);
100}
101
102test "@byteSwap vectors u16" {
103 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
104 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
105 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
106 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
107 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
108
109 try comptime vector16();
110 try vector16();
111}
112
113fn vector24() !void {
114 var v = @Vector(2, u24){ 0x123456, 0x234567 };
115 _ = &v;
116 const result = @byteSwap(v);
117 try expect(result[0] == 0x563412);
118 try expect(result[1] == 0x674523);
119}
120
121test "@byteSwap vectors u24" {
122 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
123 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
124 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
125 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
126 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
127
128 try comptime vector24();
129 try vector24();
130}
131
132fn vector0() !void {
133 var v = @Vector(2, u0){ 0, 0 };
134 _ = &v;
135 const result = @byteSwap(v);
136 try expect(result[0] == 0);
137 try expect(result[1] == 0);
138}
139
140test "@byteSwap vectors u0" {
141 try comptime vector0();
142 try vector0();
143}