master
  1const std = @import("std");
  2const builtin = @import("builtin");
  3const expect = std.testing.expect;
  4
  5test "@byteSwap integers" {
  6    if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
  7    if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
  8    if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest;
  9    if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
 10
 11    const ByteSwapIntTest = struct {
 12        fn run() !void {
 13            try t(u0, 0, 0);
 14            try t(u8, 0x12, 0x12);
 15            try t(u16, 0x1234, 0x3412);
 16            try t(u24, 0x123456, 0x563412);
 17            try t(i24, @as(i24, @bitCast(@as(u24, 0xf23456))), 0x5634f2);
 18            try t(i24, 0x1234f6, @as(i24, @bitCast(@as(u24, 0xf63412))));
 19            try t(u32, 0x12345678, 0x78563412);
 20            try t(i32, @as(i32, @bitCast(@as(u32, 0xf2345678))), 0x785634f2);
 21            try t(i32, 0x123456f8, @as(i32, @bitCast(@as(u32, 0xf8563412))));
 22            try t(u64, 0x123456789abcdef1, 0xf1debc9a78563412);
 23
 24            try t(u0, @as(u0, 0), 0);
 25            try t(i8, @as(i8, -50), -50);
 26            try t(i16, @as(i16, @bitCast(@as(u16, 0x1234))), @as(i16, @bitCast(@as(u16, 0x3412))));
 27            try t(i24, @as(i24, @bitCast(@as(u24, 0x123456))), @as(i24, @bitCast(@as(u24, 0x563412))));
 28            try t(i32, @as(i32, @bitCast(@as(u32, 0x12345678))), @as(i32, @bitCast(@as(u32, 0x78563412))));
 29            try t(i64, @as(i64, @bitCast(@as(u64, 0x123456789abcdef1))), @as(i64, @bitCast(@as(u64, 0xf1debc9a78563412))));
 30        }
 31        fn t(comptime I: type, input: I, expected_output: I) !void {
 32            try std.testing.expect(expected_output == @byteSwap(input));
 33        }
 34    };
 35    try comptime ByteSwapIntTest.run();
 36    try ByteSwapIntTest.run();
 37}
 38
 39test "@byteSwap exotic integers" {
 40    if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
 41    if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
 42    if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
 43    if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest;
 44    if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
 45    if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
 46
 47    const ByteSwapIntTest = struct {
 48        fn run() !void {
 49            try t(u0, 0, 0);
 50            try t(u40, 0x123456789a, 0x9a78563412);
 51            try t(i48, 0x123456789abc, @as(i48, @bitCast(@as(u48, 0xbc9a78563412))));
 52            try t(u56, 0x123456789abcde, 0xdebc9a78563412);
 53            try t(u88, 0x123456789abcdef1112131, 0x312111f1debc9a78563412);
 54            try t(u96, 0x123456789abcdef111213141, 0x41312111f1debc9a78563412);
 55            try t(u128, 0x123456789abcdef11121314151617181, 0x8171615141312111f1debc9a78563412);
 56
 57            try t(u40, @as(i40, @bitCast(@as(u40, 0x123456789a))), @as(u40, 0x9a78563412));
 58            try t(i48, @as(i48, @bitCast(@as(u48, 0x123456789abc))), @as(i48, @bitCast(@as(u48, 0xbc9a78563412))));
 59            try t(i56, @as(i56, @bitCast(@as(u56, 0x123456789abcde))), @as(i56, @bitCast(@as(u56, 0xdebc9a78563412))));
 60            try t(i88, @as(i88, @bitCast(@as(u88, 0x123456789abcdef1112131))), @as(i88, @bitCast(@as(u88, 0x312111f1debc9a78563412))));
 61            try t(i96, @as(i96, @bitCast(@as(u96, 0x123456789abcdef111213141))), @as(i96, @bitCast(@as(u96, 0x41312111f1debc9a78563412))));
 62            try t(
 63                i128,
 64                @as(i128, @bitCast(@as(u128, 0x123456789abcdef11121314151617181))),
 65                @as(i128, @bitCast(@as(u128, 0x8171615141312111f1debc9a78563412))),
 66            );
 67        }
 68        fn t(comptime I: type, input: I, expected_output: I) !void {
 69            try std.testing.expect(expected_output == @byteSwap(input));
 70        }
 71    };
 72    try comptime ByteSwapIntTest.run();
 73    try ByteSwapIntTest.run();
 74}
 75
 76fn vector8() !void {
 77    var v = @Vector(2, u8){ 0x12, 0x13 };
 78    _ = &v;
 79    const result = @byteSwap(v);
 80    try expect(result[0] == 0x12);
 81    try expect(result[1] == 0x13);
 82}
 83
 84test "@byteSwap vectors u8" {
 85    if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
 86    if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
 87    if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
 88    if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
 89    if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
 90    if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
 91
 92    try comptime vector8();
 93    try vector8();
 94}
 95
 96fn vector16() !void {
 97    var v = @Vector(2, u16){ 0x1234, 0x2345 };
 98    _ = &v;
 99    const result = @byteSwap(v);
100    try expect(result[0] == 0x3412);
101    try expect(result[1] == 0x4523);
102}
103
104test "@byteSwap vectors u16" {
105    if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
106    if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
107    if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
108    if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
109    if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
110    if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
111
112    try comptime vector16();
113    try vector16();
114}
115
116fn vector24() !void {
117    var v = @Vector(2, u24){ 0x123456, 0x234567 };
118    _ = &v;
119    const result = @byteSwap(v);
120    try expect(result[0] == 0x563412);
121    try expect(result[1] == 0x674523);
122}
123
124test "@byteSwap vectors u24" {
125    if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
126    if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
127    if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
128    if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
129    if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
130    if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
131
132    try comptime vector24();
133    try vector24();
134}
135
136fn vector0() !void {
137    var v = @Vector(2, u0){ 0, 0 };
138    _ = &v;
139    const result = @byteSwap(v);
140    try expect(result[0] == 0);
141    try expect(result[1] == 0);
142}
143
144test "@byteSwap vectors u0" {
145    if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
146
147    try comptime vector0();
148    try vector0();
149}