zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

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 }