[llvm] [llvm-exegesis] Add AArch64 operand initializers, SetRegTo (PR #169912)
Cullen Rhodes via llvm-commits
llvm-commits at lists.llvm.org
Wed Dec 10 05:14:01 PST 2025
================
@@ -106,6 +149,59 @@ static MCInst loadFPImmediate(MCRegister Reg, unsigned RegBitWidth,
return Instructions;
}
+// Generates instructions to load an immediate value into a DD, DDD, DDDD,
+// QQ, QQQ or QQQQ Reg
+static std::vector<MCInst>
+loadDQ234RegImmediate(MCRegister Reg, unsigned RegBitWidth, const APInt &Value,
+ MCRegister BaseReg, unsigned RegCount) {
+ MCRegister RegDorQ0 = AArch64::D0;
+ if (RegBitWidth == 128)
+ RegDorQ0 = AArch64::Q0;
+
+ MCRegister RegDQ0 = RegDorQ0 + ((Reg - BaseReg + 0) % 32);
+ MCRegister RegDQ1 = RegDorQ0 + ((Reg - BaseReg + 1) % 32);
+ MCRegister RegDQ2 = RegDorQ0 + ((Reg - BaseReg + 2) % 32);
+ MCRegister RegDQ3 = RegDorQ0 + ((Reg - BaseReg + 3) % 32);
+
+ MCInst LoadDQ0 = loadFPImmediate(RegDQ0, RegBitWidth, Value);
+ MCInst LoadDQ1 = loadFPImmediate(RegDQ1, RegBitWidth, Value);
+ if (RegCount == 2)
+ return {LoadDQ0, LoadDQ1};
+ MCInst LoadDQ2 = loadFPImmediate(RegDQ2, RegBitWidth, Value);
+ if (RegCount == 3)
+ return {LoadDQ0, LoadDQ1, LoadDQ2};
+ MCInst LoadDQ3 = loadFPImmediate(RegDQ3, RegBitWidth, Value);
+ assert((RegCount == 4) && "ExpectedRegCount 2, 3 or 4");
+ return {LoadDQ0, LoadDQ1, LoadDQ2, LoadDQ3};
+}
+
+// Generates instructions to load immediate in the flags register
+static std::vector<MCInst>
+loadNZCVImmediate(MCRegister Reg, unsigned RegBitWidth, const APInt &Value) {
+ MCRegister TempReg1 = AArch64::X8;
+ MCRegister TempReg2 = AArch64::X9;
+
+ MCInst MoveFromNZCV =
+ MCInstBuilder(AArch64::MRS).addReg(TempReg1).addImm(AArch64SysReg::NZCV);
+ MCInst LoadMask =
+ MCInstBuilder(AArch64::MOVi64imm).addReg(TempReg2).addImm(0xf0000000);
+ MCInst BitClear = MCInstBuilder(AArch64::BICXrr)
+ .addReg(TempReg1)
+ .addReg(TempReg1)
+ .addReg(TempReg2);
+ MCInst MoveToNZCV =
+ MCInstBuilder(AArch64::MSR).addImm(AArch64SysReg::NZCV).addReg(TempReg1);
+
+ if (Value.getZExtValue() == 0)
+ return {MoveFromNZCV, LoadMask, BitClear, MoveToNZCV};
+
+ MCInst OrrMask = MCInstBuilder(AArch64::ORRXrr)
+ .addReg(TempReg1)
+ .addReg(TempReg1)
+ .addImm(Value.getZExtValue());
+ return {MoveFromNZCV, LoadMask, BitClear, OrrMask, MoveToNZCV};
----------------
c-rhodes wrote:
not sure how to test this, I tried a seed range of 1..1000 but could only get an initial value of 0 for NZCV
```
for i in `seq 1 1000` ; do llvm-exegesis -mtriple=aarch64 -mcpu=neoverse-v2 -mode=latency --opcode-name=ADCSWr --benchmark-phase=assemble-measured-code --dump-object-to-disk=ADCSWr.o --random-generator-seed=$i ; done | grep NZCV
```
https://github.com/llvm/llvm-project/pull/169912
More information about the llvm-commits
mailing list