arm64: Refactor Inst::Extend handling
This refactors the handling of Inst::Extend and simplifies the lowering of Bextend and Bmask, which allows the use of SBFX instructions for extensions from 1-bit booleans. Other extensions use aliases of BFM, and the code was changed to reflect that, rather than hard coding bit patterns. Also ImmLogic is now implemented, so another hard coded instruction can be removed. As part of looking at boolean handling, `normalize_boolean_result` was changed to `materialize_boolean_result`, such that it can use either CSET or CSETM. Using CSETM saves an instruction (previously CSET + SUB) for booleans bigger than 1-bit. Copyright (c) 2020, Arm Limited.
This commit is contained in:
@@ -1784,6 +1784,22 @@ fn test_aarch64_binemit() {
|
||||
"EFB79F9A",
|
||||
"cset x15, ge",
|
||||
));
|
||||
insns.push((
|
||||
Inst::CSetm {
|
||||
rd: writable_xreg(0),
|
||||
cond: Cond::Eq,
|
||||
},
|
||||
"E0139FDA",
|
||||
"csetm x0, eq",
|
||||
));
|
||||
insns.push((
|
||||
Inst::CSetm {
|
||||
rd: writable_xreg(16),
|
||||
cond: Cond::Vs,
|
||||
},
|
||||
"F0739FDA",
|
||||
"csetm x16, vs",
|
||||
));
|
||||
insns.push((
|
||||
Inst::CCmpImm {
|
||||
size: OperandSize::Size64,
|
||||
@@ -3890,6 +3906,50 @@ fn test_aarch64_binemit() {
|
||||
"vcsel v5.16b, v10.16b, v19.16b, gt (if-then-else diamond)",
|
||||
));
|
||||
|
||||
insns.push((
|
||||
Inst::Extend {
|
||||
rd: writable_xreg(3),
|
||||
rn: xreg(5),
|
||||
signed: false,
|
||||
from_bits: 1,
|
||||
to_bits: 32,
|
||||
},
|
||||
"A3000012",
|
||||
"and w3, w5, #1",
|
||||
));
|
||||
insns.push((
|
||||
Inst::Extend {
|
||||
rd: writable_xreg(3),
|
||||
rn: xreg(5),
|
||||
signed: false,
|
||||
from_bits: 1,
|
||||
to_bits: 64,
|
||||
},
|
||||
"A3000012",
|
||||
"and w3, w5, #1",
|
||||
));
|
||||
insns.push((
|
||||
Inst::Extend {
|
||||
rd: writable_xreg(10),
|
||||
rn: xreg(21),
|
||||
signed: true,
|
||||
from_bits: 1,
|
||||
to_bits: 32,
|
||||
},
|
||||
"AA020013",
|
||||
"sbfx w10, w21, #0, #1",
|
||||
));
|
||||
insns.push((
|
||||
Inst::Extend {
|
||||
rd: writable_xreg(1),
|
||||
rn: xreg(2),
|
||||
signed: true,
|
||||
from_bits: 1,
|
||||
to_bits: 64,
|
||||
},
|
||||
"41004093",
|
||||
"sbfx x1, x2, #0, #1",
|
||||
));
|
||||
insns.push((
|
||||
Inst::Extend {
|
||||
rd: writable_xreg(1),
|
||||
@@ -3943,7 +4003,7 @@ fn test_aarch64_binemit() {
|
||||
to_bits: 64,
|
||||
},
|
||||
"411C0053",
|
||||
"uxtb x1, w2",
|
||||
"uxtb w1, w2",
|
||||
));
|
||||
insns.push((
|
||||
Inst::Extend {
|
||||
@@ -3965,7 +4025,7 @@ fn test_aarch64_binemit() {
|
||||
to_bits: 64,
|
||||
},
|
||||
"413C0053",
|
||||
"uxth x1, w2",
|
||||
"uxth w1, w2",
|
||||
));
|
||||
insns.push((
|
||||
Inst::Extend {
|
||||
|
||||
Reference in New Issue
Block a user