| 1 | const std = @import("std"); |
| 2 | const builtin = @import("builtin"); |
| 3 | const compiler_rt = @import("../compiler_rt.zig"); |
| 4 | const symbol = compiler_rt.symbol; |
| 5 | |
| 6 | comptime { |
| 7 | symbol(&__bitreversesi2, "__bitreversesi2"); |
| 8 | symbol(&__bitreversedi2, "__bitreversedi2"); |
| 9 | symbol(&__bitreverseti2, "__bitreverseti2"); |
| 10 | } |
| 11 | |
| 12 | inline fn bitreverseXi2(comptime T: type, a: T) T { |
| 13 | switch (@bitSizeOf(T)) { |
| 14 | 32 => { |
| 15 | var t: T = a; |
| 16 | t = ((t >> 1) & 0x55555555) | ((t & 0x55555555) << 1); |
| 17 | t = ((t >> 2) & 0x33333333) | ((t & 0x33333333) << 2); |
| 18 | t = ((t >> 4) & 0x0F0F0F0F) | ((t & 0x0F0F0F0F) << 4); |
| 19 | t = ((t >> 8) & 0x00FF00FF) | ((t & 0x00FF00FF) << 8); |
| 20 | t = (t >> 16) | (t << 16); |
| 21 | return t; |
| 22 | }, |
| 23 | 64 => { |
| 24 | var t: T = a; |
| 25 | t = ((t >> 1) & 0x5555555555555555) | ((t & 0x5555555555555555) << 1); |
| 26 | t = ((t >> 2) & 0x3333333333333333) | ((t & 0x3333333333333333) << 2); |
| 27 | t = ((t >> 4) & 0x0F0F0F0F0F0F0F0F) | ((t & 0x0F0F0F0F0F0F0F0F) << 4); |
| 28 | t = ((t >> 8) & 0x00FF00FF00FF00FF) | ((t & 0x00FF00FF00FF00FF) << 8); |
| 29 | t = ((t >> 16) & 0x0000FFFF0000FFFF) | ((t & 0x0000FFFF0000FFFF) << 16); |
| 30 | t = (t >> 32) | (t << 32); |
| 31 | return t; |
| 32 | }, |
| 33 | 128 => { |
| 34 | var t: T = a; |
| 35 | t = ((t >> 1) & 0x55555555555555555555555555555555) | ((t & 0x55555555555555555555555555555555) << 1); |
| 36 | t = ((t >> 2) & 0x33333333333333333333333333333333) | ((t & 0x33333333333333333333333333333333) << 2); |
| 37 | t = ((t >> 4) & 0x0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F) | ((t & 0x0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F) << 4); |
| 38 | t = ((t >> 8) & 0x00FF00FF00FF00FF00FF00FF00FF00FF) | ((t & 0x00FF00FF00FF00FF00FF00FF00FF00FF) << 8); |
| 39 | t = ((t >> 16) & 0x0000FFFF0000FFFF0000FFFF0000FFFF) | ((t & 0x0000FFFF0000FFFF0000FFFF0000FFFF) << 16); |
| 40 | t = ((t >> 32) & 0x00000000FFFFFFFF00000000FFFFFFFF) | ((t & 0x00000000FFFFFFFF00000000FFFFFFFF) << 32); |
| 41 | t = (t >> 64) | (t << 64); |
| 42 | return t; |
| 43 | }, |
| 44 | else => unreachable, |
| 45 | } |
| 46 | } |
| 47 | |
| 48 | pub fn __bitreversesi2(a: u32) callconv(.c) u32 { |
| 49 | return bitreverseXi2(u32, a); |
| 50 | } |
| 51 | |
| 52 | pub fn __bitreversedi2(a: u64) callconv(.c) u64 { |
| 53 | return bitreverseXi2(u64, a); |
| 54 | } |
| 55 | |
| 56 | pub fn __bitreverseti2(a: u128) callconv(.c) u128 { |
| 57 | return bitreverseXi2(u128, a); |
| 58 | } |
| 59 | |
| 60 | test { |
| 61 | _ = @import("bitreversesi2_test.zig"); |
| 62 | _ = @import("bitreversedi2_test.zig"); |
| 63 | _ = @import("bitreverseti2_test.zig"); |
| 64 | } |