2929#include " llvm/CodeGen/MachineFrameInfo.h"
3030#include " llvm/CodeGen/MachineInstrBuilder.h"
3131#include " llvm/CodeGen/MachineMemOperand.h"
32+ #include " llvm/CodeGen/TargetOpcodes.h"
3233#include " llvm/CodeGenTypes/LowLevelType.h"
3334#include " llvm/IR/Argument.h"
3435#include " llvm/IR/DataLayout.h"
@@ -108,9 +109,12 @@ mergeVectorRegsToResultRegs(MachineIRBuilder &B, ArrayRef<Register> DstRegs,
108109// / typed values to the original IR value. \p OrigRegs contains the destination
109110// / value registers of type \p LLTy, and \p Regs contains the legalized pieces
110111// / with type \p PartLLT. This is used for incoming values (physregs to vregs).
112+
113+ // Modified to account for floating-point extends/truncations
111114static void buildCopyFromRegs (MachineIRBuilder &B, ArrayRef<Register> OrigRegs,
112115 ArrayRef<Register> Regs, LLT LLTy, LLT PartLLT,
113- const ISD::ArgFlagsTy Flags) {
116+ const ISD::ArgFlagsTy Flags,
117+ bool IsFloatingPoint) {
114118 MachineRegisterInfo &MRI = *B.getMRI ();
115119
116120 if (PartLLT == LLTy) {
@@ -153,7 +157,10 @@ static void buildCopyFromRegs(MachineIRBuilder &B, ArrayRef<Register> OrigRegs,
153157 return ;
154158 }
155159
156- B.buildTrunc (OrigRegs[0 ], SrcReg);
160+ if (IsFloatingPoint)
161+ B.buildFPTrunc (OrigRegs[0 ], SrcReg);
162+ else
163+ B.buildTrunc (OrigRegs[0 ], SrcReg);
157164 return ;
158165 }
159166
@@ -166,7 +173,11 @@ static void buildCopyFromRegs(MachineIRBuilder &B, ArrayRef<Register> OrigRegs,
166173 B.buildMergeValues (OrigRegs[0 ], Regs);
167174 else {
168175 auto Widened = B.buildMergeLikeInstr (LLT::scalar (SrcSize), Regs);
169- B.buildTrunc (OrigRegs[0 ], Widened);
176+
177+ if (IsFloatingPoint)
178+ B.buildFPTrunc (OrigRegs[0 ], Widened);
179+ else
180+ B.buildTrunc (OrigRegs[0 ], Widened);
170181 }
171182
172183 return ;
@@ -496,7 +507,9 @@ bool WebAssemblyCallLowering::lowerReturn(MachineIRBuilder &MIRBuilder,
496507 Arg.Regs [Part] = MRI.createGenericVirtualRegister (NewLLT);
497508 }
498509 buildCopyToRegs (MIRBuilder, Arg.Regs , Arg.OrigRegs [0 ], OrigLLT, NewLLT,
499- extendOpFromFlags (Arg.Flags [0 ]));
510+ Arg.Ty ->isFloatingPointTy ()
511+ ? TargetOpcode::G_FPEXT
512+ : extendOpFromFlags (Arg.Flags [0 ]));
500513 }
501514
502515 for (unsigned Part = 0 ; Part < NumParts; ++Part) {
@@ -630,7 +643,7 @@ bool WebAssemblyCallLowering::lowerFormalArguments(
630643 Arg.Regs [Part] = MRI.createGenericVirtualRegister (NewLLT);
631644 }
632645 buildCopyFromRegs (MIRBuilder, Arg.OrigRegs , Arg.Regs , OrigLLT, NewLLT,
633- Arg.Flags [0 ]);
646+ Arg.Flags [0 ], Arg. Ty -> isFloatingPointTy () );
634647 }
635648
636649 for (unsigned Part = 0 ; Part < NumParts; ++Part) {
@@ -955,7 +968,9 @@ bool WebAssemblyCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
955968 }
956969
957970 buildCopyToRegs (MIRBuilder, Arg.Regs , Arg.OrigRegs [0 ], OrigLLT, NewLLT,
958- extendOpFromFlags (Arg.Flags [0 ]));
971+ Arg.Ty ->isFloatingPointTy ()
972+ ? TargetOpcode::G_FPEXT
973+ : extendOpFromFlags (Arg.Flags [0 ]));
959974 }
960975
961976 if (!Arg.Flags [0 ].isVarArg ()) {
@@ -1135,7 +1150,7 @@ bool WebAssemblyCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
11351150 Ret.Regs [Part] = MRI.createGenericVirtualRegister (NewLLT);
11361151 }
11371152 buildCopyFromRegs (MIRBuilder, Ret.OrigRegs , Ret.Regs , OrigLLT, NewLLT,
1138- Ret.Flags [0 ]);
1153+ Ret.Flags [0 ], Ret. Ty -> isFloatingPointTy () );
11391154 }
11401155
11411156 for (unsigned Part = 0 ; Part < NumParts; ++Part) {
0 commit comments