[PATCH] D90738: [RISCV] Support Zfh half-precision floating-point extension.

Jessica Clarke via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 24 02:06:09 PST 2020


jrtc27 added inline comments.


================
Comment at: llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp:990
 
+static MCRegister convertFPR64ToFPR16(MCRegister Reg) {
+  assert(Reg >= RISCV::F0_D && Reg <= RISCV::F31_D && "Invalid register");
----------------
Nit: I'd put FPR16 before FPR32 in this file (here and below).


================
Comment at: llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp:1251-1252
   RegNo = MatchRegisterName(Name);
   // The 32- and 64-bit FPRs have the same asm name. Check that the initial
   // match always matches the 64-bit variant, and not the 32-bit one.
   assert(!(RegNo >= RISCV::F0_F && RegNo <= RISCV::F31_F));
----------------
Comment needs updating.


================
Comment at: llvm/lib/Target/RISCV/RISCVISelLowering.cpp:1838-1843
+  // UseGPRForF16 if targeting one of the soft-float ABIs, if passing a
+  // variadic argument, or if no F16 argument registers are available.
+  bool UseGPRForF16 = true;
   // UseGPRForF32 if targeting one of the soft-float ABIs, if passing a
   // variadic argument, or if no F32 argument registers are available.
   bool UseGPRForF32 = true;
----------------
These two are always the same value (unless you want an RV16I!), just rename the F32 one to encompass F16.


================
Comment at: llvm/lib/Target/RISCV/RISCVISelLowering.cpp:1867-1872
+  if (State.getFirstUnallocated(ArgFPR16s) == array_lengthof(ArgFPR16s))
+    UseGPRForF16 = true;
   if (State.getFirstUnallocated(ArgFPR32s) == array_lengthof(ArgFPR32s))
     UseGPRForF32 = true;
   if (State.getFirstUnallocated(ArgFPR64s) == array_lengthof(ArgFPR64s))
     UseGPRForF64 = true;
----------------
Hm, this code is a bit silly, we only need to look at one of the arrays as the registers all alias each other.


================
Comment at: llvm/lib/Target/RISCV/RISCVISelLowering.cpp:1999-2001
+  // When an f16, f32 or f64 is passed on the stack, no bit-conversion is
+  // needed.
+  if (ValVT == MVT::f16 || ValVT == MVT::f32 || ValVT == MVT::f64) {
----------------
Since this code is not already ISA/ABI-dependent this should be fine?


================
Comment at: llvm/lib/Target/RISCV/RISCVRegisterInfo.td:33-35
 // Because RISCVReg64 register have AsmName and AltNames that alias with their
 // 32-bit sub-register, RISCVAsmParser will need to coerce a register number
 // from a RISCVReg32 to the equivalent RISCVReg64 when appropriate.
----------------
Needs updating to mention RISCVReg16? Though this is currently backwards; the 64-bit register is the canonical one given the diff in RISCVAsmParser...


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D90738/new/

https://reviews.llvm.org/D90738



More information about the llvm-commits mailing list