bswap.zig (3260B) - Raw
1 const std = @import("std"); 2 const builtin = @import("builtin"); 3 const common = @import("common.zig"); 4 5 pub const panic = common.panic; 6 7 comptime { 8 @export(&__bswapsi2, .{ .name = "__bswapsi2", .linkage = common.linkage, .visibility = common.visibility }); 9 @export(&__bswapdi2, .{ .name = "__bswapdi2", .linkage = common.linkage, .visibility = common.visibility }); 10 @export(&__bswapti2, .{ .name = "__bswapti2", .linkage = common.linkage, .visibility = common.visibility }); 11 } 12 13 // bswap - byteswap 14 // - bswapXi2 for unoptimized big and little endian 15 // ie for u32 16 // DE AD BE EF <- little|big endian 17 // FE BE AD DE <- big|little endian 18 // ff 00 00 00 >> 3*8 (leftmost byte) 19 // 00 ff 00 00 >> 1*8 (2nd left byte) 20 // 00 00 ff 00 << 1*8 (2n right byte) 21 // 00 00 00 ff << 3*8 (rightmost byte) 22 23 inline fn bswapXi2(comptime T: type, a: T) T { 24 switch (@bitSizeOf(T)) { 25 32 => { 26 // zig fmt: off 27 return (((a & 0xff000000) >> 24) 28 | ((a & 0x00ff0000) >> 8 ) 29 | ((a & 0x0000ff00) << 8 ) 30 | ((a & 0x000000ff) << 24)); 31 // zig fmt: on 32 }, 33 64 => { 34 // zig fmt: off 35 return (((a & 0xff00000000000000) >> 56) 36 | ((a & 0x00ff000000000000) >> 40 ) 37 | ((a & 0x0000ff0000000000) >> 24 ) 38 | ((a & 0x000000ff00000000) >> 8 ) 39 | ((a & 0x00000000ff000000) << 8 ) 40 | ((a & 0x0000000000ff0000) << 24 ) 41 | ((a & 0x000000000000ff00) << 40 ) 42 | ((a & 0x00000000000000ff) << 56)); 43 // zig fmt: on 44 }, 45 128 => { 46 // zig fmt: off 47 return (((a & 0xff000000000000000000000000000000) >> 120) 48 | ((a & 0x00ff0000000000000000000000000000) >> 104) 49 | ((a & 0x0000ff00000000000000000000000000) >> 88 ) 50 | ((a & 0x000000ff000000000000000000000000) >> 72 ) 51 | ((a & 0x00000000ff0000000000000000000000) >> 56 ) 52 | ((a & 0x0000000000ff00000000000000000000) >> 40 ) 53 | ((a & 0x000000000000ff000000000000000000) >> 24 ) 54 | ((a & 0x00000000000000ff0000000000000000) >> 8 ) 55 | ((a & 0x0000000000000000ff00000000000000) << 8 ) 56 | ((a & 0x000000000000000000ff000000000000) << 24 ) 57 | ((a & 0x00000000000000000000ff0000000000) << 40 ) 58 | ((a & 0x0000000000000000000000ff00000000) << 56 ) 59 | ((a & 0x000000000000000000000000ff000000) << 72 ) 60 | ((a & 0x00000000000000000000000000ff0000) << 88 ) 61 | ((a & 0x0000000000000000000000000000ff00) << 104) 62 | ((a & 0x000000000000000000000000000000ff) << 120)); 63 // zig fmt: on 64 }, 65 else => unreachable, 66 } 67 } 68 69 pub fn __bswapsi2(a: u32) callconv(.c) u32 { 70 return bswapXi2(u32, a); 71 } 72 73 pub fn __bswapdi2(a: u64) callconv(.c) u64 { 74 return bswapXi2(u64, a); 75 } 76 77 pub fn __bswapti2(a: u128) callconv(.c) u128 { 78 return bswapXi2(u128, a); 79 } 80 81 test { 82 _ = @import("bswapsi2_test.zig"); 83 _ = @import("bswapdi2_test.zig"); 84 _ = @import("bswapti2_test.zig"); 85 }