Skip to content

Commit 9cc477b

Browse files
authored
[llvm-exegesis][AArch64] Handle register classes FPR8/16/32 and FPCR (#130595)
Current implementation (for AArch64) only supports the GRP32, GPR64, FPR64/128, PPR16 and ZPR128 register classes. This adds support for the other floating point register classes to initialize registers and avoid the "setReg is not implemented" warning for these cases.
1 parent da0f9e7 commit 9cc477b

File tree

2 files changed

+67
-8
lines changed

2 files changed

+67
-8
lines changed

llvm/test/tools/llvm-exegesis/AArch64/setReg_init_check.s

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,39 @@ RUN: FileCheck %s --check-prefix=FPR64-ASM < %t.s
3737
FPR64-ASM: <foo>:
3838
FPR64-ASM: movi d{{[0-9]+}}, #0000000000000000
3939
FPR64-ASM-NEXT: addv h{{[0-9]+}}, v{{[0-9]+}}.4h
40+
41+
## FPR32 Register Class Initialization Testcase
42+
RUN: llvm-exegesis -mcpu=neoverse-v2 -mode=latency --dump-object-to-disk=%d --opcode-name=FABSSr --benchmark-phase=assemble-measured-code 2>&1
43+
RUN: llvm-objdump -d %d > %t.s
44+
RUN: FileCheck %s --check-prefix=FPR32-ASM < %t.s
45+
FPR32-ASM: <foo>:
46+
FPR32-ASM: movi d{{[0-9]+}}, #0000000000000000
47+
FPR32-ASM-NEXT: fabs s{{[0-9]+}}, s{{[0-9]+}}
48+
49+
50+
## FPR16 Register Class Initialization Testcase
51+
RUN: llvm-exegesis -mcpu=neoverse-v2 -mode=latency --dump-object-to-disk=%d --opcode-name=FABSHr --benchmark-phase=assemble-measured-code 2>&1
52+
RUN: llvm-objdump -d %d > %t.s
53+
RUN: FileCheck %s --check-prefix=FPR16-ASM < %t.s
54+
FPR16-ASM: <foo>:
55+
FPR16-ASM: movi d{{[0-9]+}}, #0000000000000000
56+
FPR16-ASM-NEXT: fabs h{{[0-9]+}}, h{{[0-9]+}}
57+
58+
## FPR8 Register Class Initialization Testcase
59+
RUN: llvm-exegesis -mcpu=neoverse-v2 -mode=latency --dump-object-to-disk=%d --opcode-name=SQABSv1i8 --benchmark-phase=assemble-measured-code 2>&1
60+
RUN: llvm-objdump -d %d > %t.s
61+
RUN: FileCheck %s --check-prefix=FPR8-ASM < %t.s
62+
FPR8-ASM: <foo>:
63+
FPR8-ASM: movi d{{[0-9]+}}, #0000000000000000
64+
FPR8-ASM-NEXT: sqabs b{{[0-9]+}}, b{{[0-9]+}}
65+
66+
67+
## FPCR Register Class Initialization Testcase
68+
RUN: llvm-exegesis -mcpu=neoverse-v2 -mode=latency --dump-object-to-disk=%d --opcode-name=BFCVT --benchmark-phase=assemble-measured-code 2>&1
69+
RUN: llvm-objdump -d %d > %t.s
70+
RUN: FileCheck %s --check-prefix=FPCR-ASM < %t.s
71+
FPCR-ASM: <foo>:
72+
FPCR-ASM: movi d{{[0-9]+}}, #0000000000000000
73+
FPCR-ASM-NEXT: mov x8, #0x0
74+
FPCR-ASM-NEXT: msr FPCR, x8
75+
FPCR-ASM-NEXT: bfcvt h{{[0-9]+}}, s{{[0-9]+}}

llvm/tools/llvm-exegesis/lib/AArch64/Target.cpp

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ static unsigned getLoadImmediateOpcode(unsigned RegBitWidth) {
2828
// Generates instruction to load an immediate value into a register.
2929
static MCInst loadImmediate(MCRegister Reg, unsigned RegBitWidth,
3030
const APInt &Value) {
31-
assert (Value.getBitWidth() <= RegBitWidth &&
32-
"Value must fit in the Register");
31+
assert(Value.getBitWidth() <= RegBitWidth &&
32+
"Value must fit in the Register");
3333
return MCInstBuilder(getLoadImmediateOpcode(RegBitWidth))
3434
.addReg(Reg)
3535
.addImm(Value.getZExtValue());
@@ -53,11 +53,25 @@ static MCInst loadPPRImmediate(MCRegister Reg, unsigned RegBitWidth,
5353
.addImm(31); // All lanes true for 16 bits
5454
}
5555

56+
// Generates instructions to load an immediate value into an FPCR register.
57+
static std::vector<MCInst>
58+
loadFPCRImmediate(MCRegister Reg, unsigned RegBitWidth, const APInt &Value) {
59+
MCRegister TempReg = AArch64::X8;
60+
MCInst LoadImm = MCInstBuilder(AArch64::MOVi64imm).addReg(TempReg).addImm(0);
61+
MCInst MoveToFPCR =
62+
MCInstBuilder(AArch64::MSR).addImm(AArch64SysReg::FPCR).addReg(TempReg);
63+
return {LoadImm, MoveToFPCR};
64+
}
65+
5666
// Fetch base-instruction to load an FP immediate value into a register.
5767
static unsigned getLoadFPImmediateOpcode(unsigned RegBitWidth) {
5868
switch (RegBitWidth) {
69+
case 16:
70+
return AArch64::FMOVH0; // FMOVHi;
71+
case 32:
72+
return AArch64::FMOVS0; // FMOVSi;
5973
case 64:
60-
return AArch64::MOVID; //FMOVDi;
74+
return AArch64::MOVID; // FMOVDi;
6175
case 128:
6276
return AArch64::MOVIv2d_ns;
6377
}
@@ -67,11 +81,12 @@ static unsigned getLoadFPImmediateOpcode(unsigned RegBitWidth) {
6781
// Generates instruction to load an FP immediate value into a register.
6882
static MCInst loadFPImmediate(MCRegister Reg, unsigned RegBitWidth,
6983
const APInt &Value) {
70-
assert(Value.getZExtValue() == 0 &&
71-
"Expected initialisation value 0");
72-
return MCInstBuilder(getLoadFPImmediateOpcode(RegBitWidth))
73-
.addReg(Reg)
74-
.addImm(Value.getZExtValue());
84+
assert(Value.getZExtValue() == 0 && "Expected initialisation value 0");
85+
MCInst Instructions =
86+
MCInstBuilder(getLoadFPImmediateOpcode(RegBitWidth)).addReg(Reg);
87+
if (RegBitWidth >= 64)
88+
Instructions.addOperand(MCOperand::createImm(Value.getZExtValue()));
89+
return Instructions;
7590
}
7691

7792
#include "AArch64GenExegesis.inc"
@@ -92,12 +107,20 @@ class ExegesisAArch64Target : public ExegesisTarget {
92107
return {loadImmediate(Reg, 64, Value)};
93108
if (AArch64::PPRRegClass.contains(Reg))
94109
return {loadPPRImmediate(Reg, 16, Value)};
110+
if (AArch64::FPR8RegClass.contains(Reg))
111+
return {loadFPImmediate(Reg - AArch64::B0 + AArch64::D0, 64, Value)};
112+
if (AArch64::FPR16RegClass.contains(Reg))
113+
return {loadFPImmediate(Reg, 16, Value)};
114+
if (AArch64::FPR32RegClass.contains(Reg))
115+
return {loadFPImmediate(Reg, 32, Value)};
95116
if (AArch64::FPR64RegClass.contains(Reg))
96117
return {loadFPImmediate(Reg, 64, Value)};
97118
if (AArch64::FPR128RegClass.contains(Reg))
98119
return {loadFPImmediate(Reg, 128, Value)};
99120
if (AArch64::ZPRRegClass.contains(Reg))
100121
return {loadZPRImmediate(Reg, 128, Value)};
122+
if (Reg == AArch64::FPCR)
123+
return {loadFPCRImmediate(Reg, 32, Value)};
101124

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

0 commit comments

Comments
 (0)