Skip to content
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
624a7ee
Adding support for FPR64/128, PPR16 and ZPR128 in setReg of llvm-exeg…
lakshayk-nv Feb 17, 2025
4c4d605
Adding support for FPR64/128, PPR16 and ZPR128 in setReg of llvm-exeg…
lakshayk-nv Feb 18, 2025
f8ce0cc
Merge branch 'main' into llvm-exegesis-setreg
lakshayk-nv Feb 18, 2025
d34cb6d
Added assert that Value is in range for the generated instructions an…
lakshayk-nv Feb 20, 2025
566081a
Merge branch 'llvm:main' into llvm-exegesis-setreg
lakshayk-nv Feb 20, 2025
803b9e9
Merge branch 'llvm:main' into llvm-exegesis-setreg
lakshayk-nv Feb 20, 2025
3589838
Merge branch 'llvm-exegesis-setreg' of github.com:lakshayk-nv/llvm-pr…
lakshayk-nv Feb 20, 2025
53b9f0b
Added combined testfile for register initialization (PPR,ZPR,FPR64/12…
lakshayk-nv Feb 21, 2025
caebb7b
Deleted Indvidual testfiles
lakshayk-nv Feb 21, 2025
230aade
Modified: requirement(aarch64) check only required once for a test
lakshayk-nv Feb 24, 2025
aab854b
Modified: PPR register class should be set with immediate value 31 fo…
lakshayk-nv Feb 24, 2025
f1e561c
Modified: Testcases to check disassembly, apart from setReg warning a…
lakshayk-nv Feb 27, 2025
25b02b6
Modified: Fixed Typo in assertion message
lakshayk-nv Feb 27, 2025
b83b52d
Modified: Simplified regex checks for disassembly
lakshayk-nv Feb 27, 2025
433b62e
Modified: Testcases to strictly check correct order of instruction in…
lakshayk-nv Feb 28, 2025
482a0a3
Modified: Stricter asserts for checking immediate (Value) to be set i…
lakshayk-nv Mar 4, 2025
951e05e
Modified: Base-instruction of FPR64 reg class to MOVID & ZPR reg clas…
lakshayk-nv Mar 5, 2025
ea8b28b
Modified: Updated testcases checks for disassembly as be base instruc…
lakshayk-nv Mar 5, 2025
b5853a9
Modified: reverted headers
lakshayk-nv Mar 5, 2025
2c16af6
Modified: Simplified testfile to check only disassembly.
lakshayk-nv Mar 5, 2025
c21ee8b
Modified: Removed redundant comments and asserts.
lakshayk-nv Mar 5, 2025
5cda550
Modified: Revert back to asserting bit width for GPR Register classes
lakshayk-nv Mar 6, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions llvm/test/tools/llvm-exegesis/AArch64/reg_based/reg_fpr128.s
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# RUN: llvm-exegesis -mcpu=neoverse-v2 -mode=latency -opcode-name=ADDVv16i8v | FileCheck %s
# REQUIRES: aarch64-registered-target

# Check that warning of not initializing registers is not printed
# CHECK-NOT: setRegTo is not implemented, results will be unreliable

# Check that we add ret (bx lr) instr to snippet
# CHECK: assembled_snippet: {{.*}}C0035FD6
7 changes: 7 additions & 0 deletions llvm/test/tools/llvm-exegesis/AArch64/reg_based/reg_fpr64.s
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# RUN: llvm-exegesis -mcpu=neoverse-v2 -mode=latency -opcode-name=ADDVv4i16v 2>&1 | FileCheck %s

# Check that warning of not initializing registers is not printed
# CHECK-NOT: setRegTo is not implemented, results will be unreliable

# Check that we add ret (bx lr) instr to snippet
# CHECK: assembled_snippet: {{.*}}C0035FD6
8 changes: 8 additions & 0 deletions llvm/test/tools/llvm-exegesis/AArch64/reg_based/reg_ppr.s
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# RUN: llvm-exegesis -mcpu=neoverse-v2 -mode=latency -opcode-name=FADDV_VPZ_D | FileCheck %s
# REQUIRES: aarch64-registered-target

# Check that warning of not initializing registers is not printed
# CHECK-NOT: setRegTo is not implemented, results will be unreliable

# Check that we add ret (bx lr) instr to snippet
# CHECK: assembled_snippet: {{.*}}C0035FD6
8 changes: 8 additions & 0 deletions llvm/test/tools/llvm-exegesis/AArch64/reg_based/reg_zpr.s
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# RUN: llvm-exegesis -mcpu=neoverse-v2 -mode=latency -opcode-name=FADDV_VPZ_S | FileCheck %s
# REQUIRES: aarch64-registered-target

# Check that warning of not initializing registers is not printed
# CHECK-NOT: setRegTo is not implemented, results will be unreliable

# Check that we add ret (bx lr) instr to snippet
# CHECK: assembled_snippet: {{.*}}C0035FD6
54 changes: 52 additions & 2 deletions llvm/tools/llvm-exegesis/lib/AArch64/Target.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,51 @@ static unsigned getLoadImmediateOpcode(unsigned RegBitWidth) {
// Generates instruction to load an immediate value into a register.
static MCInst loadImmediate(MCRegister Reg, unsigned RegBitWidth,
const APInt &Value) {
if (Value.getBitWidth() > RegBitWidth)
llvm_unreachable("Value must fit in the Register");
assert(Value.getBitWidth() <= RegBitWidth && "Value must fit in the Register");
return MCInstBuilder(getLoadImmediateOpcode(RegBitWidth))
.addReg(Reg)
.addImm(Value.getZExtValue());
}

static MCInst loadZPRImmediate(MCRegister Reg, unsigned RegBitWidth,
const APInt &Value) {
assert(Value.getBitWidth() <= RegBitWidth && "Value must fit in the PPR Register");
// For ZPR, we typically use DUPM instruction to load immediate values
return MCInstBuilder(AArch64::DUPM_ZI)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could this just use DUP and not DUPM? It is simpler to get the immediate correct. Both have a limit to the value they can represent. Can we add an assert that it will be encoded validly?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ZPR Reg Class seems to require DUPM.
DUP has only variants for 8 bits to 64 bits (DUPi8, DIPi16, DUPi32, DUPi64) which can't set a vector
For opcode FADDV_VPZ_D when tried to use base instruction DUPi64, It tries $z6 = DUPi64 0 which throws error $z6 is not a FPR64 register. .

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can this use a DUP_ZI and check the value is -128 to 127? The instruction might then need an extra .addImm(0) to represent the shift.

It think dupm is causing it to be a different value, which it why it is coming through as dupm z{{[0-9]+}}.s, #0x1.

.addReg(Reg)
.addImm(0x1);
}

static MCInst loadPPRImmediate(MCRegister Reg, unsigned RegBitWidth,
const APInt &Value) {
assert(Value.getBitWidth() <= RegBitWidth && "Value must fit in the PPR Register");
// For PPR, we typically use PTRUE instruction to set predicate registers
return MCInstBuilder(AArch64::PTRUE_B)
.addReg(Reg)
.addImm(0xFFFF); // All lanes true for 16 bits
}

// Generates instruction to load an FP immediate value into a register.
static unsigned getLoadFPImmediateOpcode(unsigned RegBitWidth) {
switch (RegBitWidth) {
case 64:
return AArch64::FMOVDi;
case 128:
return AArch64::MOVIv2d_ns;
}
llvm_unreachable("Invalid Value Width");
}


// Generates instruction to load an FP immediate value into a register.
static MCInst loadFPImmediate(MCRegister Reg, unsigned RegBitWidth,
const APInt &Value) {
assert(Value.getBitWidth() <= RegBitWidth && "Value must fit in the FP Register");
return MCInstBuilder(getLoadFPImmediateOpcode(RegBitWidth))
.addReg(Reg)
.addImm(Value.getZExtValue());
}

#include "AArch64GenExegesis.inc"

namespace {
Expand All @@ -51,6 +89,18 @@ class ExegesisAArch64Target : public ExegesisTarget {
return {loadImmediate(Reg, 32, Value)};
if (AArch64::GPR64RegClass.contains(Reg))
return {loadImmediate(Reg, 64, Value)};

if (AArch64::PPRRegClass.contains(Reg))
return {loadPPRImmediate(Reg, 16, Value)};

if (AArch64::FPR64RegClass.contains(Reg))
return {loadFPImmediate(Reg, 64, Value)};
if (AArch64::FPR128RegClass.contains(Reg))
return {loadFPImmediate(Reg, 128, Value)};

if (AArch64::ZPRRegClass.contains(Reg))
return {loadZPRImmediate(Reg, 128, Value)};

errs() << "setRegTo is not implemented, results will be unreliable\n";
return {};
}
Expand Down