Skip to content

Commit c9f29a4

Browse files
authored
aarch64: implement ISLE lowering for bitselect.i128 (#14237)
* aarch64: implement ISLE lowering for bitselect.i128 This implements the missing bitselect lowering rule for i128 on AArch64 using pair-wise 64-bit word operations (and, bic, orr). Fixes #5198 * aarch64: convert bitselect-i128 test to precise-output, enable runtest
1 parent e253c25 commit c9f29a4

3 files changed

Lines changed: 49 additions & 0 deletions

File tree

cranelift/codegen/src/isa/aarch64/lower.isle

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2116,6 +2116,25 @@
21162116
(tmp2 Reg (bic ty y c)))
21172117
(orr ty tmp1 tmp2)))
21182118

2119+
(attr rule bitselect_i128 (tag i128))
2120+
(rule bitselect_i128 2 (lower (bitselect $I128 c x y))
2121+
(let ((c ValueRegs (put_in_regs c))
2122+
(x ValueRegs (put_in_regs x))
2123+
(y ValueRegs (put_in_regs y))
2124+
(c_lo Reg (value_regs_get c 0))
2125+
(c_hi Reg (value_regs_get c 1))
2126+
(x_lo Reg (value_regs_get x 0))
2127+
(x_hi Reg (value_regs_get x 1))
2128+
(y_lo Reg (value_regs_get y 0))
2129+
(y_hi Reg (value_regs_get y 1))
2130+
(tmp1_lo Reg (and_reg $I64 x_lo c_lo))
2131+
(tmp1_hi Reg (and_reg $I64 x_hi c_hi))
2132+
(tmp2_lo Reg (bic $I64 y_lo c_lo))
2133+
(tmp2_hi Reg (bic $I64 y_hi c_hi))
2134+
(res_lo Reg (orr $I64 tmp1_lo tmp2_lo))
2135+
(res_hi Reg (orr $I64 tmp1_hi tmp2_hi)))
2136+
(value_regs res_lo res_hi)))
2137+
21192138
(rule 1 (lower (bitselect (ty_vec128 ty) c x y))
21202139
(bsl ty c x y))
21212140

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
test compile precise-output
2+
set unwind_info=false
3+
target aarch64
4+
5+
function %f0(i128, i128, i128) -> i128 {
6+
block0(v0: i128, v1: i128, v2: i128):
7+
v3 = bitselect v0, v1, v2
8+
return v3
9+
}
10+
11+
; VCode:
12+
; block0:
13+
; and x7, x2, x0
14+
; and x9, x3, x1
15+
; bic x11, x4, x0
16+
; bic x13, x5, x1
17+
; orr x0, x7, x11
18+
; orr x1, x9, x13
19+
; ret
20+
;
21+
; Disassembled:
22+
; block0: ; offset 0x0
23+
; and x7, x2, x0
24+
; and x9, x3, x1
25+
; bic x11, x4, x0
26+
; bic x13, x5, x1
27+
; orr x0, x7, x11
28+
; orr x1, x9, x13
29+
; ret

cranelift/filetests/filetests/runtests/i128-bitselect.clif

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
test run
22
set opt_level=none
33
set enable_llvm_abi_extensions=true
4+
target aarch64
45
target x86_64
56
set enable_multi_ret_implicit_sret
67
target s390x

0 commit comments

Comments
 (0)