diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index 05e377864b..4fdd462dba 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -4390,7 +4390,7 @@ pub const FuncGen = struct { var operand_llvm_ty = try self.dg.llvmType(operand_ty); if (bits % 16 == 8) { - // If not an even byte-multiple, we need zero-extend + shift-left 1 byte + // If not an even byte-multiple, we need zero-extend + shift-left 1 byte // The truncated result at the end will be the correct bswap operand_llvm_ty = self.context.intType(bits + 8); const extended = self.builder.buildZExt(operand, operand_llvm_ty, ""); diff --git a/test/behavior.zig b/test/behavior.zig index 713ea33d8d..5b575ba190 100644 --- a/test/behavior.zig +++ b/test/behavior.zig @@ -6,6 +6,8 @@ test { _ = @import("behavior/array.zig"); _ = @import("behavior/basic.zig"); _ = @import("behavior/bit_shifting.zig"); + _ = @import("behavior/bitreverse.zig"); + _ = @import("behavior/byteswap.zig"); _ = @import("behavior/bool.zig"); _ = @import("behavior/bugs/394.zig"); _ = @import("behavior/bugs/655.zig"); @@ -105,8 +107,6 @@ test { if (builtin.zig_backend != .stage2_c) { // Tests that pass for stage1 and the llvm backend. _ = @import("behavior/atomics.zig"); - _ = @import("behavior/bitreverse.zig"); - _ = @import("behavior/byteswap.zig"); _ = @import("behavior/bugs/9584.zig"); _ = @import("behavior/eval.zig"); _ = @import("behavior/floatop.zig"); diff --git a/test/behavior/bitreverse.zig b/test/behavior/bitreverse.zig index 9e74aa0510..ff0775eb07 100644 --- a/test/behavior/bitreverse.zig +++ b/test/behavior/bitreverse.zig @@ -3,10 +3,24 @@ const builtin = @import("builtin"); const expect = std.testing.expect; const minInt = std.math.minInt; +test "@bitReverse large exotic integer" { + if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; + // Currently failing on stage1 for big-endian targets + if (builtin.zig_backend == .stage1) return error.SkipZigTest; + + try expect(@bitReverse(u95, @as(u95, 0x123456789abcdef111213141)) == 0x4146424447bd9eac8f351624); +} + test "@bitReverse" { if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; comptime try testBitReverse(); try testBitReverse(); @@ -27,11 +41,6 @@ fn testBitReverse() !void { try expect(@bitReverse(u96, @as(u96, 0x123456789abcdef111213141)) == 0x828c84888f7b3d591e6a2c48); try expect(@bitReverse(u128, @as(u128, 0x123456789abcdef11121314151617181)) == 0x818e868a828c84888f7b3d591e6a2c48); - if (builtin.zig_backend != .stage1) { - // Currently failing on stage1 for big-endian targets - try expect(@bitReverse(u95, @as(u95, 0x123456789abcdef111213141)) == 0x4146424447bd9eac8f351624); - } - // using runtime uints, unsigned var num0: u0 = 0; try expect(@bitReverse(u0, num0) == 0); diff --git a/test/behavior/byteswap.zig b/test/behavior/byteswap.zig index ee482b916f..265bc40f99 100644 --- a/test/behavior/byteswap.zig +++ b/test/behavior/byteswap.zig @@ -6,6 +6,8 @@ test "@byteSwap integers" { if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; const ByteSwapIntTest = struct { fn run() !void { @@ -56,6 +58,8 @@ test "@byteSwap vectors" { if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; const ByteSwapVectorTest = struct { fn run() !void {