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}