master
1const std = @import("std");
2const builtin = @import("builtin");
3const expect = std.testing.expect;
4const minInt = std.math.minInt;
5
6test "@bitReverse large exotic integer" {
7 try expect(@bitReverse(@as(u95, 0x123456789abcdef111213141)) == 0x4146424447bd9eac8f351624);
8}
9
10test "@bitReverse" {
11 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
12 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
13 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
14 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
15 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
16
17 try comptime testBitReverse();
18 try testBitReverse();
19}
20
21fn testBitReverse() !void {
22 // using comptime_ints, unsigned
23 try expect(@bitReverse(@as(u0, 0)) == 0);
24 try expect(@bitReverse(@as(u5, 0x12)) == 0x9);
25 try expect(@bitReverse(@as(u8, 0x12)) == 0x48);
26 try expect(@bitReverse(@as(u16, 0x1234)) == 0x2c48);
27 try expect(@bitReverse(@as(u24, 0x123456)) == 0x6a2c48);
28 try expect(@bitReverse(@as(u32, 0x12345678)) == 0x1e6a2c48);
29 try expect(@bitReverse(@as(u40, 0x123456789a)) == 0x591e6a2c48);
30 try expect(@bitReverse(@as(u48, 0x123456789abc)) == 0x3d591e6a2c48);
31 try expect(@bitReverse(@as(u56, 0x123456789abcde)) == 0x7b3d591e6a2c48);
32 try expect(@bitReverse(@as(u64, 0x123456789abcdef1)) == 0x8f7b3d591e6a2c48);
33 try expect(@bitReverse(@as(u96, 0x123456789abcdef111213141)) == 0x828c84888f7b3d591e6a2c48);
34 try expect(@bitReverse(@as(u128, 0x123456789abcdef11121314151617181)) == 0x818e868a828c84888f7b3d591e6a2c48);
35
36 // using runtime uints, unsigned
37 var num0: u0 = 0;
38 try expect(@bitReverse(num0) == 0);
39 var num5: u5 = 0x12;
40 try expect(@bitReverse(num5) == 0x9);
41 var num8: u8 = 0x12;
42 try expect(@bitReverse(num8) == 0x48);
43 var num16: u16 = 0x1234;
44 try expect(@bitReverse(num16) == 0x2c48);
45 var num24: u24 = 0x123456;
46 try expect(@bitReverse(num24) == 0x6a2c48);
47 var num32: u32 = 0x12345678;
48 try expect(@bitReverse(num32) == 0x1e6a2c48);
49 var num40: u40 = 0x123456789a;
50 try expect(@bitReverse(num40) == 0x591e6a2c48);
51 var num48: u48 = 0x123456789abc;
52 try expect(@bitReverse(num48) == 0x3d591e6a2c48);
53 var num56: u56 = 0x123456789abcde;
54 try expect(@bitReverse(num56) == 0x7b3d591e6a2c48);
55 var num64: u64 = 0x123456789abcdef1;
56 try expect(@bitReverse(num64) == 0x8f7b3d591e6a2c48);
57 var num95: u95 = 0x123456789abcdef111213141;
58 try expect(@bitReverse(num95) == 0x4146424447bd9eac8f351624);
59 var num96: u96 = 0x123456789abcdef111213141;
60 try expect(@bitReverse(num96) == 0x828c84888f7b3d591e6a2c48);
61 var num97: u97 = 0x1123456789abcdef111213141;
62 try expect(@bitReverse(num97) == 0x1051909111ef67ab23cd45891);
63 var num128: u128 = 0x123456789abcdef11121314151617181;
64 try expect(@bitReverse(num128) == 0x818e868a828c84888f7b3d591e6a2c48);
65
66 // using comptime_ints, signed, positive
67 try expect(@bitReverse(@as(u8, 0)) == 0);
68 try expect(@bitReverse(@as(i8, @bitCast(@as(u8, 0x92)))) == @as(i8, @bitCast(@as(u8, 0x49))));
69 try expect(@bitReverse(@as(i16, @bitCast(@as(u16, 0x1234)))) == @as(i16, @bitCast(@as(u16, 0x2c48))));
70 try expect(@bitReverse(@as(i24, @bitCast(@as(u24, 0x123456)))) == @as(i24, @bitCast(@as(u24, 0x6a2c48))));
71 try expect(@bitReverse(@as(i24, @bitCast(@as(u24, 0x12345f)))) == @as(i24, @bitCast(@as(u24, 0xfa2c48))));
72 try expect(@bitReverse(@as(i24, @bitCast(@as(u24, 0xf23456)))) == @as(i24, @bitCast(@as(u24, 0x6a2c4f))));
73 try expect(@bitReverse(@as(i32, @bitCast(@as(u32, 0x12345678)))) == @as(i32, @bitCast(@as(u32, 0x1e6a2c48))));
74 try expect(@bitReverse(@as(i32, @bitCast(@as(u32, 0xf2345678)))) == @as(i32, @bitCast(@as(u32, 0x1e6a2c4f))));
75 try expect(@bitReverse(@as(i32, @bitCast(@as(u32, 0x1234567f)))) == @as(i32, @bitCast(@as(u32, 0xfe6a2c48))));
76 try expect(@bitReverse(@as(i40, @bitCast(@as(u40, 0x123456789a)))) == @as(i40, @bitCast(@as(u40, 0x591e6a2c48))));
77 try expect(@bitReverse(@as(i48, @bitCast(@as(u48, 0x123456789abc)))) == @as(i48, @bitCast(@as(u48, 0x3d591e6a2c48))));
78 try expect(@bitReverse(@as(i56, @bitCast(@as(u56, 0x123456789abcde)))) == @as(i56, @bitCast(@as(u56, 0x7b3d591e6a2c48))));
79 try expect(@bitReverse(@as(i64, @bitCast(@as(u64, 0x123456789abcdef1)))) == @as(i64, @bitCast(@as(u64, 0x8f7b3d591e6a2c48))));
80 try expect(@bitReverse(@as(i96, @bitCast(@as(u96, 0x123456789abcdef111213141)))) == @as(i96, @bitCast(@as(u96, 0x828c84888f7b3d591e6a2c48))));
81 try expect(@bitReverse(@as(i128, @bitCast(@as(u128, 0x123456789abcdef11121314151617181)))) == @as(i128, @bitCast(@as(u128, 0x818e868a828c84888f7b3d591e6a2c48))));
82
83 // using signed, negative. Compare to runtime ints returned from llvm.
84 var neg8: i8 = -18;
85 try expect(@bitReverse(@as(i8, -18)) == @bitReverse(neg8));
86 var neg16: i16 = -32694;
87 try expect(@bitReverse(@as(i16, -32694)) == @bitReverse(neg16));
88 var neg24: i24 = -6773785;
89 try expect(@bitReverse(@as(i24, -6773785)) == @bitReverse(neg24));
90 var neg32: i32 = -16773785;
91 try expect(@bitReverse(@as(i32, -16773785)) == @bitReverse(neg32));
92
93 _ = .{
94 &num0,
95 &num5,
96 &num8,
97 &num16,
98 &num24,
99 &num32,
100 &num40,
101 &num48,
102 &num56,
103 &num64,
104 &num95,
105 &num96,
106 &num97,
107 &num128,
108 &neg8,
109 &neg16,
110 &neg24,
111 &neg32,
112 };
113}
114
115fn vector8() !void {
116 var v = @Vector(2, u8){ 0x12, 0x23 };
117 _ = &v;
118 const result = @bitReverse(v);
119 try expect(result[0] == 0x48);
120 try expect(result[1] == 0xc4);
121}
122
123test "bitReverse vectors u8" {
124 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
125 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
126 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
127 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
128 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
129 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
130
131 try comptime vector8();
132 try vector8();
133}
134
135fn vector16() !void {
136 var v = @Vector(2, u16){ 0x1234, 0x2345 };
137 _ = &v;
138 const result = @bitReverse(v);
139 try expect(result[0] == 0x2c48);
140 try expect(result[1] == 0xa2c4);
141}
142
143test "bitReverse vectors u16" {
144 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
145 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
146 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
147 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
148 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
149 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
150
151 try comptime vector16();
152 try vector16();
153}
154
155fn vector24() !void {
156 var v = @Vector(2, u24){ 0x123456, 0x234567 };
157 _ = &v;
158 const result = @bitReverse(v);
159 try expect(result[0] == 0x6a2c48);
160 try expect(result[1] == 0xe6a2c4);
161}
162
163test "bitReverse vectors u24" {
164 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
165 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
166 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
167 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
168 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
169 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
170
171 try comptime vector24();
172 try vector24();
173}
174
175fn vector0() !void {
176 var v = @Vector(2, u0){ 0, 0 };
177 _ = &v;
178 const result = @bitReverse(v);
179 try expect(result[0] == 0);
180 try expect(result[1] == 0);
181}
182
183test "bitReverse vectors u0" {
184 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
185
186 try comptime vector0();
187 try vector0();
188}