Add legalization for bitrev.i128 via narrowing, fixes #1116 (#1229)

This commit is contained in:
krk
2019-11-22 12:38:04 +01:00
committed by Benjamin Bouvier
parent b4528beaf5
commit bc9f05e5e2
3 changed files with 145 additions and 0 deletions

View File

@@ -877,6 +877,16 @@ pub(crate) fn define(insts: &InstructionGroup, imm: &Immediates) -> TransformGro
], ],
); );
narrow.legalize(
def!(a = bitrev.I128(x)),
vec![
def!((xl, xh) = isplit(x)),
def!(yh = bitrev(xl)),
def!(yl = bitrev(xh)),
def!(a = iconcat(yl, yh)),
],
);
// Floating-point sign manipulations. // Floating-point sign manipulations.
for &(ty, const_inst, minus_zero) in &[ for &(ty, const_inst, minus_zero) in &[
(F32, f32const, &Literal::bits(&imm.ieee32, 0x8000_0000)), (F32, f32const, &Literal::bits(&imm.ieee32, 0x8000_0000)),

View File

@@ -0,0 +1,46 @@
test run
target x86_64
function %reverse_bits_zero() -> b1 {
ebb0:
v0 = iconst.i64 0
v1 = iconcat v0, v0
v2 = bitrev.i128 v1
v3 = icmp eq v2, v1
return v3
}
; run
function %reverse_bits_one() -> b1 {
ebb0:
v0 = iconst.i64 0
v1 = iconst.i64 1
v2 = iconcat v0, v1
v3 = bitrev.i128 v2
v4 = iconst.i64 0x8000_0000_0000_0000
v5 = iconst.i64 0
v6 = iconcat v4, v5
v7 = icmp eq v3, v6
return v7
}
; run
function %reverse_bits() -> b1 {
ebb0:
v0 = iconst.i64 0x06AD_8667_69EC_41BA
v1 = iconst.i64 0x6C83_D81A_6E28_83AB
v2 = iconcat v0, v1
v3 = bitrev.i128 v2
v4 = iconst.i64 0xD5C11476581BC136
v5 = iconst.i64 0x5D823796E661B560
v6 = iconcat v4, v5
v7 = icmp eq v3, v6
return v7
}
; run

View File

@@ -0,0 +1,89 @@
test legalizer
target x86_64
function %reverse_bits(i128) -> i128 {
ebb0(v0: i128):
v1 = bitrev.i128 v0
return v1
}
; check: ebb0(v2: i64, v3: i64):
; check: v0 = iconcat v2, v3
; check: v33 = iconst.i64 0xaaaa_aaaa_aaaa_aaaa
; check: v6 = band v2, v33
; check: v7 = ushr_imm v6, 1
; check: v34 = iconst.i64 0x5555_5555_5555_5555
; check: v8 = band v2, v34
; check: v9 = ishl_imm v8, 1
; check: v10 = bor v7, v9
; check: v35 = iconst.i64 0xcccc_cccc_cccc_cccc
; check: v11 = band v10, v35
; check: v12 = ushr_imm v11, 2
; check: v36 = iconst.i64 0x3333_3333_3333_3333
; check: v13 = band v10, v36
; check: v14 = ishl_imm v13, 2
; check: v15 = bor v12, v14
; check: v37 = iconst.i64 0xf0f0_f0f0_f0f0_f0f0
; check: v16 = band v15, v37
; check: v17 = ushr_imm v16, 4
; check: v38 = iconst.i64 0x0f0f_0f0f_0f0f_0f0f
; check: v18 = band v15, v38
; check: v19 = ishl_imm v18, 4
; check: v20 = bor v17, v19
; check: v39 = iconst.i64 0xff00_ff00_ff00_ff00
; check: v21 = band v20, v39
; check: v22 = ushr_imm v21, 8
; check: v40 = iconst.i64 0x00ff_00ff_00ff_00ff
; check: v23 = band v20, v40
; check: v24 = ishl_imm v23, 8
; check: v25 = bor v22, v24
; check: v41 = iconst.i64 0xffff_0000_ffff_0000
; check: v26 = band v25, v41
; check: v27 = ushr_imm v26, 16
; check: v42 = iconst.i64 0xffff_0000_ffff
; check: v28 = band v25, v42
; check: v29 = ishl_imm v28, 16
; check: v30 = bor v27, v29
; check: v31 = ushr_imm v30, 32
; check: v32 = ishl_imm v30, 32
; check: v4 = bor v31, v32
; check: v70 = iconst.i64 0xaaaa_aaaa_aaaa_aaaa
; check: v43 = band v3, v70
; check: v44 = ushr_imm v43, 1
; check: v71 = iconst.i64 0x5555_5555_5555_5555
; check: v45 = band v3, v71
; check: v46 = ishl_imm v45, 1
; check: v47 = bor v44, v46
; check: v72 = iconst.i64 0xcccc_cccc_cccc_cccc
; check: v48 = band v47, v72
; check: v49 = ushr_imm v48, 2
; check: v73 = iconst.i64 0x3333_3333_3333_3333
; check: v50 = band v47, v73
; check: v51 = ishl_imm v50, 2
; check: v52 = bor v49, v51
; check: v74 = iconst.i64 0xf0f0_f0f0_f0f0_f0f0
; check: v53 = band v52, v74
; check: v54 = ushr_imm v53, 4
; check: v75 = iconst.i64 0x0f0f_0f0f_0f0f_0f0f
; check: v55 = band v52, v75
; check: v56 = ishl_imm v55, 4
; check: v57 = bor v54, v56
; check: v76 = iconst.i64 0xff00_ff00_ff00_ff00
; check: v58 = band v57, v76
; check: v59 = ushr_imm v58, 8
; check: v77 = iconst.i64 0x00ff_00ff_00ff_00ff
; check: v60 = band v57, v77
; check: v61 = ishl_imm v60, 8
; check: v62 = bor v59, v61
; check: v78 = iconst.i64 0xffff_0000_ffff_0000
; check: v63 = band v62, v78
; check: v64 = ushr_imm v63, 16
; check: v79 = iconst.i64 0xffff_0000_ffff
; check: v65 = band v62, v79
; check: v66 = ishl_imm v65, 16
; check: v67 = bor v64, v66
; check: v68 = ushr_imm v67, 32
; check: v69 = ishl_imm v67, 32
; check: v5 = bor v68, v69
; check: v1 = iconcat v5, v4
; check: return v5, v4