Skip to content

[AArch64][ARM] Avoid some APFloat copies in tablegen patterns. NFC. #114416

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

Merged
merged 1 commit into from
Nov 1, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
16 changes: 6 additions & 10 deletions llvm/lib/Target/AArch64/AArch64InstrFormats.td
Original file line number Diff line number Diff line change
Expand Up @@ -1390,15 +1390,13 @@ def arith_uxtx : ComplexPattern<i64, 2, "SelectArithUXTXRegister", []>;
// Floating-point immediate.

def fpimm16XForm : SDNodeXForm<fpimm, [{
APFloat InVal = N->getValueAPF();
uint32_t enc = AArch64_AM::getFP16Imm(InVal);
return CurDAG->getTargetConstant(enc, SDLoc(N), MVT::i32);
uint32_t Enc = AArch64_AM::getFP16Imm(N->getValueAPF());
return CurDAG->getTargetConstant(Enc, SDLoc(N), MVT::i32);
}]>;

def fpimm32XForm : SDNodeXForm<fpimm, [{
APFloat InVal = N->getValueAPF();
uint32_t enc = AArch64_AM::getFP32Imm(InVal);
return CurDAG->getTargetConstant(enc, SDLoc(N), MVT::i32);
uint32_t Enc = AArch64_AM::getFP32Imm(N->getValueAPF());
return CurDAG->getTargetConstant(Enc, SDLoc(N), MVT::i32);
}]>;

def fpimm32SIMDModImmType4XForm : SDNodeXForm<fpimm, [{
Expand All @@ -1409,9 +1407,8 @@ def fpimm32SIMDModImmType4XForm : SDNodeXForm<fpimm, [{
}]>;

def fpimm64XForm : SDNodeXForm<fpimm, [{
APFloat InVal = N->getValueAPF();
uint32_t enc = AArch64_AM::getFP64Imm(InVal);
return CurDAG->getTargetConstant(enc, SDLoc(N), MVT::i32);
uint32_t Enc = AArch64_AM::getFP64Imm(N->getValueAPF());
return CurDAG->getTargetConstant(Enc, SDLoc(N), MVT::i32);
}]>;

def fpimm16 : Operand<f16>,
Expand Down Expand Up @@ -1681,7 +1678,6 @@ def simdimmtype10 : Operand<i32>,
return AArch64_AM::isAdvSIMDModImmType10(
Imm.bitcastToAPInt().getZExtValue());
}], SDNodeXForm<fpimm, [{
APFloat InVal = N->getValueAPF();
uint32_t enc = AArch64_AM::encodeAdvSIMDModImmType10(N->getValueAPF()
.bitcastToAPInt()
.getZExtValue());
Expand Down
20 changes: 8 additions & 12 deletions llvm/lib/Target/ARM/ARMInstrVFP.td
Original file line number Diff line number Diff line change
Expand Up @@ -46,28 +46,25 @@ def vfp_f16imm : Operand<f16>,
PatLeaf<(f16 fpimm), [{
return ARM_AM::getFP16Imm(N->getValueAPF()) != -1;
}], SDNodeXForm<fpimm, [{
APFloat InVal = N->getValueAPF();
uint32_t enc = ARM_AM::getFP16Imm(InVal);
return CurDAG->getTargetConstant(enc, SDLoc(N), MVT::i32);
uint32_t Enc = ARM_AM::getFP16Imm(N->getValueAPF());
return CurDAG->getTargetConstant(Enc, SDLoc(N), MVT::i32);
}]>> {
let PrintMethod = "printFPImmOperand";
let ParserMatchClass = FPImmOperand;
}

def vfp_f32f16imm_xform : SDNodeXForm<fpimm, [{
APFloat InVal = N->getValueAPF();
uint32_t enc = ARM_AM::getFP32FP16Imm(InVal);
return CurDAG->getTargetConstant(enc, SDLoc(N), MVT::i32);
uint32_t Enc = ARM_AM::getFP32FP16Imm(N->getValueAPF());
return CurDAG->getTargetConstant(Enc, SDLoc(N), MVT::i32);
}]>;

def vfp_f32f16imm : PatLeaf<(f32 fpimm), [{
return ARM_AM::getFP32FP16Imm(N->getValueAPF()) != -1;
}], vfp_f32f16imm_xform>;

def vfp_f32imm_xform : SDNodeXForm<fpimm, [{
APFloat InVal = N->getValueAPF();
uint32_t enc = ARM_AM::getFP32Imm(InVal);
return CurDAG->getTargetConstant(enc, SDLoc(N), MVT::i32);
uint32_t Enc = ARM_AM::getFP32Imm(N->getValueAPF());
return CurDAG->getTargetConstant(Enc, SDLoc(N), MVT::i32);
}]>;

def gi_vfp_f32imm : GICustomOperandRenderer<"renderVFPF32Imm">,
Expand All @@ -88,9 +85,8 @@ def vfp_f32imm : Operand<f32>,
}

def vfp_f64imm_xform : SDNodeXForm<fpimm, [{
APFloat InVal = N->getValueAPF();
uint32_t enc = ARM_AM::getFP64Imm(InVal);
return CurDAG->getTargetConstant(enc, SDLoc(N), MVT::i32);
uint32_t Enc = ARM_AM::getFP64Imm(N->getValueAPF());
return CurDAG->getTargetConstant(Enc, SDLoc(N), MVT::i32);
}]>;

def gi_vfp_f64imm : GICustomOperandRenderer<"renderVFPF64Imm">,
Expand Down
Loading