| Index: src/IceInstMIPS32.cpp
|
| diff --git a/src/IceInstMIPS32.cpp b/src/IceInstMIPS32.cpp
|
| index c25fbe1ca8a63ce1ebebf0f2ce868c7b4f11cd1f..85cf07b560ca4a2a2e2209b0937469c26ee62035 100644
|
| --- a/src/IceInstMIPS32.cpp
|
| +++ b/src/IceInstMIPS32.cpp
|
| @@ -733,27 +733,39 @@ void InstMIPS32Mov::emitSingleDestSingleSource(const Cfg *Func) const {
|
|
|
| // reg to reg
|
| if (DestIsReg && SrcIsReg) {
|
| - switch (Dest->getType()) {
|
| - case IceType_f32:
|
| - ActualOpcode = "mov.s";
|
| - break;
|
| - case IceType_f64:
|
| - ActualOpcode = "mov.d";
|
| - break;
|
| - case IceType_i1:
|
| - case IceType_i8:
|
| - case IceType_i16:
|
| - case IceType_i32:
|
| - Str << "\t"
|
| - << "move"
|
| - << "\t";
|
| - getDest()->emit(Func);
|
| - Str << ", ";
|
| - getSrc(0)->emit(Func);
|
| - return;
|
| - default:
|
| - UnimplementedError(getFlags());
|
| - return;
|
| + const Type DstType = Dest->getType();
|
| + const Type SrcType = Src->getType();
|
| +
|
| + // move GP to/from FP
|
| + if (DstType != SrcType) {
|
| + if (isScalarFloatingType(DstType)) {
|
| + Str << "\t"
|
| + "mtc1"
|
| + "\t";
|
| + getSrc(0)->emit(Func);
|
| + Str << ", ";
|
| + getDest()->emit(Func);
|
| + return;
|
| + }
|
| + ActualOpcode = "mfc1";
|
| + } else {
|
| + switch (Dest->getType()) {
|
| + case IceType_f32:
|
| + ActualOpcode = "mov.s";
|
| + break;
|
| + case IceType_f64:
|
| + ActualOpcode = "mov.d";
|
| + break;
|
| + case IceType_i1:
|
| + case IceType_i8:
|
| + case IceType_i16:
|
| + case IceType_i32:
|
| + ActualOpcode = "move";
|
| + break;
|
| + default:
|
| + UnimplementedError(getFlags());
|
| + return;
|
| + }
|
| }
|
|
|
| assert(ActualOpcode);
|
|
|