diff --git a/cranelift/codegen/src/isa/aarch64/lower.isle b/cranelift/codegen/src/isa/aarch64/lower.isle index 8c5d8bea81..5b9651947d 100644 --- a/cranelift/codegen/src/isa/aarch64/lower.isle +++ b/cranelift/codegen/src/isa/aarch64/lower.isle @@ -1528,6 +1528,11 @@ (rule (lower (has_type $I64 (bswap x))) (a64_rev64 $I64 x)) +(rule (lower (has_type $I128 (bswap x))) + (value_regs + (a64_rev64 $I64 (value_regs_get x 1)) + (a64_rev64 $I64 (value_regs_get x 0)))) + ;;;; Rules for `bmask` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Bmask tests the value against zero, and uses `csetm` to assert the result. diff --git a/cranelift/codegen/src/isa/s390x/lower.isle b/cranelift/codegen/src/isa/s390x/lower.isle index 9e0e43bb2d..7970286059 100644 --- a/cranelift/codegen/src/isa/s390x/lower.isle +++ b/cranelift/codegen/src/isa/s390x/lower.isle @@ -1190,15 +1190,8 @@ ;;;; Rules for `bswap` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(rule (lower (has_type $I16 (bswap x))) - (lshr_imm $I32 (bswap_reg $I32 x) 16)) - -(rule (lower (has_type $I32 (bswap x))) - (bswap_reg $I32 x)) - -(rule (lower (has_type $I64 (bswap x))) - (bswap_reg $I64 x)) - +(rule (lower (has_type ty (bswap x))) + (bitrev_bytes ty x)) ;;;; Rules for `clz` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/cranelift/codegen/src/isa/x64/lower.isle b/cranelift/codegen/src/isa/x64/lower.isle index 18d3f01890..2060ea7337 100644 --- a/cranelift/codegen/src/isa/x64/lower.isle +++ b/cranelift/codegen/src/isa/x64/lower.isle @@ -2060,6 +2060,11 @@ (rule (lower (has_type $I64 (bswap src))) (x64_bswap $I64 src)) +(rule (lower (has_type $I128 (bswap src))) + (value_regs + (x64_bswap $I64 (value_regs_get_gpr src 1)) + (x64_bswap $I64 (value_regs_get_gpr src 0)))) + ;; Rules for `is_null` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Null references are represented by the constant value `0`. diff --git a/cranelift/filetests/filetests/runtests/i128-bswap.clif b/cranelift/filetests/filetests/runtests/i128-bswap.clif index 657c32d11a..62651992c3 100644 --- a/cranelift/filetests/filetests/runtests/i128-bswap.clif +++ b/cranelift/filetests/filetests/runtests/i128-bswap.clif @@ -1,4 +1,9 @@ test interpret +test run +set enable_llvm_abi_extensions +target x86_64 +target aarch64 +target s390x function %bswap_i128(i128) -> i128 { block0(v0: i128): @@ -9,4 +14,3 @@ block0(v0: i128): ; run: %bswap_i128(1) == 0x01000000_00000000_00000000_00000000 ; run: %bswap_i128(0x12345678_9ABCDEF0_CAFEF00D_F00DCAFE) == 0xFECA0DF0_0DF0FECA_F0DEBC9A_78563412 ; run: %bswap_i128(-2) == 0xFEFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFF - diff --git a/cranelift/fuzzgen/src/function_generator.rs b/cranelift/fuzzgen/src/function_generator.rs index 6e129501eb..df19663d6b 100644 --- a/cranelift/fuzzgen/src/function_generator.rs +++ b/cranelift/fuzzgen/src/function_generator.rs @@ -672,12 +672,10 @@ const OPCODE_SIGNATURES: &'static [( (Opcode::Bmask, &[I64], &[I128], insert_opcode), (Opcode::Bmask, &[I128], &[I128], insert_opcode), // Bswap - (Opcode::Bswap, &[I16, I16], &[I16], insert_opcode), - (Opcode::Bswap, &[I32, I32], &[I32], insert_opcode), - (Opcode::Bswap, &[I64, I64], &[I64], insert_opcode), - // I128 version not yet implemented. - #[cfg(not(any(target_arch = "x86_64", target_arch = "aarch64")))] - (Opcode::Bswap, &[I128, I128], &[I128], insert_opcode), + (Opcode::Bswap, &[I16], &[I16], insert_opcode), + (Opcode::Bswap, &[I32], &[I32], insert_opcode), + (Opcode::Bswap, &[I64], &[I64], insert_opcode), + (Opcode::Bswap, &[I128], &[I128], insert_opcode), // Fadd (Opcode::Fadd, &[F32, F32], &[F32], insert_opcode), (Opcode::Fadd, &[F64, F64], &[F64], insert_opcode),