29
29
#include " llvm/CodeGen/MachineFrameInfo.h"
30
30
#include " llvm/CodeGen/MachineInstrBuilder.h"
31
31
#include " llvm/CodeGen/MachineMemOperand.h"
32
+ #include " llvm/CodeGen/TargetOpcodes.h"
32
33
#include " llvm/CodeGenTypes/LowLevelType.h"
33
34
#include " llvm/IR/Argument.h"
34
35
#include " llvm/IR/DataLayout.h"
@@ -108,9 +109,12 @@ mergeVectorRegsToResultRegs(MachineIRBuilder &B, ArrayRef<Register> DstRegs,
108
109
// / typed values to the original IR value. \p OrigRegs contains the destination
109
110
// / value registers of type \p LLTy, and \p Regs contains the legalized pieces
110
111
// / with type \p PartLLT. This is used for incoming values (physregs to vregs).
112
+
113
+ // Modified to account for floating-point extends/truncations
111
114
static void buildCopyFromRegs (MachineIRBuilder &B, ArrayRef<Register> OrigRegs,
112
115
ArrayRef<Register> Regs, LLT LLTy, LLT PartLLT,
113
- const ISD::ArgFlagsTy Flags) {
116
+ const ISD::ArgFlagsTy Flags,
117
+ bool IsFloatingPoint) {
114
118
MachineRegisterInfo &MRI = *B.getMRI ();
115
119
116
120
if (PartLLT == LLTy) {
@@ -153,7 +157,10 @@ static void buildCopyFromRegs(MachineIRBuilder &B, ArrayRef<Register> OrigRegs,
153
157
return ;
154
158
}
155
159
156
- B.buildTrunc (OrigRegs[0 ], SrcReg);
160
+ if (IsFloatingPoint)
161
+ B.buildFPTrunc (OrigRegs[0 ], SrcReg);
162
+ else
163
+ B.buildTrunc (OrigRegs[0 ], SrcReg);
157
164
return ;
158
165
}
159
166
@@ -166,7 +173,11 @@ static void buildCopyFromRegs(MachineIRBuilder &B, ArrayRef<Register> OrigRegs,
166
173
B.buildMergeValues (OrigRegs[0 ], Regs);
167
174
else {
168
175
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);
170
181
}
171
182
172
183
return ;
@@ -496,7 +507,9 @@ bool WebAssemblyCallLowering::lowerReturn(MachineIRBuilder &MIRBuilder,
496
507
Arg.Regs [Part] = MRI.createGenericVirtualRegister (NewLLT);
497
508
}
498
509
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 ]));
500
513
}
501
514
502
515
for (unsigned Part = 0 ; Part < NumParts; ++Part) {
@@ -630,7 +643,7 @@ bool WebAssemblyCallLowering::lowerFormalArguments(
630
643
Arg.Regs [Part] = MRI.createGenericVirtualRegister (NewLLT);
631
644
}
632
645
buildCopyFromRegs (MIRBuilder, Arg.OrigRegs , Arg.Regs , OrigLLT, NewLLT,
633
- Arg.Flags [0 ]);
646
+ Arg.Flags [0 ], Arg. Ty -> isFloatingPointTy () );
634
647
}
635
648
636
649
for (unsigned Part = 0 ; Part < NumParts; ++Part) {
@@ -955,7 +968,9 @@ bool WebAssemblyCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
955
968
}
956
969
957
970
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 ]));
959
974
}
960
975
961
976
if (!Arg.Flags [0 ].isVarArg ()) {
@@ -1135,7 +1150,7 @@ bool WebAssemblyCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
1135
1150
Ret.Regs [Part] = MRI.createGenericVirtualRegister (NewLLT);
1136
1151
}
1137
1152
buildCopyFromRegs (MIRBuilder, Ret.OrigRegs , Ret.Regs , OrigLLT, NewLLT,
1138
- Ret.Flags [0 ]);
1153
+ Ret.Flags [0 ], Ret. Ty -> isFloatingPointTy () );
1139
1154
}
1140
1155
1141
1156
for (unsigned Part = 0 ; Part < NumParts; ++Part) {
0 commit comments