-
Notifications
You must be signed in to change notification settings - Fork 15.3k
[llvm-exegesis] Adding in llvm-exegesis for Aarch64 for handling FPR8/16/32 and FPCR setReg warning #130595
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[llvm-exegesis] Adding in llvm-exegesis for Aarch64 for handling FPR8/16/32 and FPCR setReg warning #130595
Changes from 2 commits
5f3de22
62e8e36
b684c97
fae356f
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -37,3 +37,40 @@ RUN: FileCheck %s --check-prefix=FPR64-ASM < %t.s | |
| FPR64-ASM: <foo>: | ||
| FPR64-ASM: movi d{{[0-9]+}}, #0000000000000000 | ||
| FPR64-ASM-NEXT: addv h{{[0-9]+}}, v{{[0-9]+}}.4h | ||
|
|
||
| ## FPR32 Register Class Initialization Testcase | ||
| RUN: llvm-exegesis -mcpu=neoverse-v2 -mode=latency --dump-object-to-disk=%d --opcode-name=FABSSr --benchmark-phase=assemble-measured-code 2>&1 | ||
| RUN: llvm-objdump -d %d > %t.s | ||
| RUN: FileCheck %s --check-prefix=FPR32-ASM < %t.s | ||
| FPR32-ASM: <foo>: | ||
| FPR32-ASM: movi d{{[0-9]+}}, #0000000000000000 | ||
| FPR32-ASM-NEXT: fabs s{{[0-9]+}}, s{{[0-9]+}} | ||
|
|
||
|
|
||
| ## FPR16 Register Class Initialization Testcase | ||
| RUN: llvm-exegesis -mcpu=neoverse-v2 -mode=latency --dump-object-to-disk=%d --opcode-name=FABSHr --benchmark-phase=assemble-measured-code 2>&1 | ||
| RUN: llvm-objdump -d %d > %t.s | ||
| RUN: FileCheck %s --check-prefix=FPR16-ASM < %t.s | ||
| FPR16-ASM: <foo>: | ||
| FPR16-ASM: movi d{{[0-9]+}}, #0000000000000000 | ||
sjoerdmeijer marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| FPR16-ASM-NEXT: fabs h{{[0-9]+}}, h{{[0-9]+}} | ||
|
|
||
| ## FPR8 Register Class Initialization Testcase | ||
| RUN: llvm-exegesis -mcpu=neoverse-v2 -mode=latency --dump-object-to-disk=%d --opcode-name=SQABSv1i8 --benchmark-phase=assemble-measured-code 2>&1 | ||
| RUN: llvm-objdump -d %d > %t.s | ||
| RUN: FileCheck %s --check-prefix=FPR8-ASM < %t.s | ||
| FPR8-ASM: <foo>: | ||
| FPR8-ASM: mov w{{[0-9]+}}, #0x0 | ||
| FPR8-ASM-NEXT: fmov h{{[0-9]+}}, w{{[0-9]+}} | ||
|
||
| FPR8-ASM-NEXT: sqabs b{{[0-9]+}}, b{{[0-9]+}} | ||
|
|
||
|
|
||
| ## FPCR Register Class Initialization Testcase | ||
| RUN: llvm-exegesis -mcpu=neoverse-v2 -mode=latency --dump-object-to-disk=%d --opcode-name=BFCVT --benchmark-phase=assemble-measured-code 2>&1 | ||
| RUN: llvm-objdump -d %d > %t.s | ||
| RUN: FileCheck %s --check-prefix=FPCR-ASM < %t.s | ||
| FPCR-ASM: <foo>: | ||
| FPCR-ASM: movi d{{[0-9]+}}, #0000000000000000 | ||
|
||
| FPCR-ASM-NEXT: mov x{{[0-9]+}}, #0x0 | ||
|
||
| FPCR-ASM-NEXT: msr FPCR, x{{[0-9]+}} | ||
| FPCR-ASM-NEXT: bfcvt h{{[0-9]+}}, s{{[0-9]+}} | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -28,8 +28,8 @@ 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) { | ||
| assert (Value.getBitWidth() <= RegBitWidth && | ||
| "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()); | ||
|
|
@@ -53,11 +53,46 @@ static MCInst loadPPRImmediate(MCRegister Reg, unsigned RegBitWidth, | |
| .addImm(31); // All lanes true for 16 bits | ||
| } | ||
|
|
||
| // Generates instructions to load an immediate value into an FPCR register. | ||
| static std::vector<MCInst> | ||
| loadFPCRImmediate(MCRegister Reg, unsigned RegBitWidth, const APInt &Value) { | ||
| MCRegister TempReg = AArch64::X8; | ||
| MCInst LoadImm = MCInstBuilder(AArch64::MOVi64imm).addReg(TempReg).addImm(0); | ||
| MCInst MoveToFPCR = | ||
| MCInstBuilder(AArch64::MSR).addImm(AArch64SysReg::FPCR).addReg(TempReg); | ||
| return {LoadImm, MoveToFPCR}; | ||
| } | ||
|
|
||
| // Generates instructions to load an immediate value into an FPR8 register. | ||
| static std::vector<MCInst> | ||
| loadFP8Immediate(MCRegister Reg, unsigned RegBitWidth, const APInt &Value) { | ||
| assert(Value.getBitWidth() <= 8 && "Value must fit in 8 bits"); | ||
|
|
||
| // Use a temporary general-purpose register (W8) to hold the 8-bit value | ||
| MCRegister TempReg = AArch64::W8; | ||
|
|
||
| // Load the 8-bit value into a general-purpose register (W8) | ||
| MCInst LoadImm = MCInstBuilder(AArch64::MOVi32imm) | ||
| .addReg(TempReg) | ||
| .addImm(Value.getZExtValue()); | ||
|
|
||
| // Move the value from the general-purpose register to the FPR16 register | ||
| // Convert the FPR8 register to an FPR16 register | ||
| MCRegister FPR16Reg = Reg + (AArch64::H0 - AArch64::B0); | ||
| MCInst MoveToFPR = | ||
| MCInstBuilder(AArch64::FMOVWHr).addReg(FPR16Reg).addReg(TempReg); | ||
| return {LoadImm, MoveToFPR}; | ||
| } | ||
|
|
||
| // Fetch base-instruction to load an FP immediate value into a register. | ||
| static unsigned getLoadFPImmediateOpcode(unsigned RegBitWidth) { | ||
| switch (RegBitWidth) { | ||
| case 16: | ||
| return AArch64::FMOVH0; // FMOVHi; | ||
| case 32: | ||
| return AArch64::FMOVS0; // FMOVSi; | ||
| case 64: | ||
| return AArch64::MOVID; //FMOVDi; | ||
| return AArch64::MOVID; // FMOVDi; | ||
| case 128: | ||
| return AArch64::MOVIv2d_ns; | ||
| } | ||
|
|
@@ -67,11 +102,12 @@ static unsigned getLoadFPImmediateOpcode(unsigned RegBitWidth) { | |
| // Generates instruction to load an FP immediate value into a register. | ||
| static MCInst loadFPImmediate(MCRegister Reg, unsigned RegBitWidth, | ||
| const APInt &Value) { | ||
| assert(Value.getZExtValue() == 0 && | ||
| "Expected initialisation value 0"); | ||
| return MCInstBuilder(getLoadFPImmediateOpcode(RegBitWidth)) | ||
| .addReg(Reg) | ||
| .addImm(Value.getZExtValue()); | ||
| assert(Value.getZExtValue() == 0 && "Expected initialisation value 0"); | ||
| MCInst Instructions = | ||
| MCInstBuilder(getLoadFPImmediateOpcode(RegBitWidth)).addReg(Reg); | ||
| if (RegBitWidth >= 64) | ||
| Instructions.addOperand(MCOperand::createImm(Value.getZExtValue())); | ||
| return Instructions; | ||
| } | ||
|
|
||
| #include "AArch64GenExegesis.inc" | ||
|
|
@@ -92,12 +128,20 @@ class ExegesisAArch64Target : public ExegesisTarget { | |
| return {loadImmediate(Reg, 64, Value)}; | ||
| if (AArch64::PPRRegClass.contains(Reg)) | ||
| return {loadPPRImmediate(Reg, 16, Value)}; | ||
| if (AArch64::FPR8RegClass.contains(Reg)) | ||
| return loadFP8Immediate(Reg, 8, Value); | ||
|
||
| if (AArch64::FPR16RegClass.contains(Reg)) | ||
| return {loadFPImmediate(Reg, 16, Value)}; | ||
| if (AArch64::FPR32RegClass.contains(Reg)) | ||
| return {loadFPImmediate(Reg, 32, 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)}; | ||
| if (Reg == AArch64::FPCR) | ||
| return {loadFPCRImmediate(Reg, 32, Value)}; | ||
|
|
||
| errs() << "setRegTo is not implemented, results will be unreliable\n"; | ||
| return {}; | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.