Chromium Code Reviews| Index: src/IceInstMIPS32.cpp |
| diff --git a/src/IceInstMIPS32.cpp b/src/IceInstMIPS32.cpp |
| index efae86753f22cfaff20b644be1be0640ea180edd..7e93dec24d35b2da67021c43d4c47fd19fb611f5 100644 |
| --- a/src/IceInstMIPS32.cpp |
| +++ b/src/IceInstMIPS32.cpp |
| @@ -553,29 +553,138 @@ void InstMIPS32Mov::emitSingleDestSingleSource(const Cfg *Func) const { |
| Ostream &Str = Func->getContext()->getStrEmit(); |
| Variable *Dest = getDest(); |
| Operand *Src = getSrc(0); |
| - auto *S = llvm::dyn_cast<Variable>(Src); |
| - Str << "\t"; |
| - if (Dest->hasReg()) { |
| - if (S && S->hasReg()) |
| - Str << "move"; |
| - else |
| - Str << "lw"; |
| - } else { |
| - if (S && S->hasReg()) { |
| - Str << "sw" |
| - "\t"; |
| - getSrc(0)->emit(Func); |
| - Str << ", "; |
| + auto *SrcV = llvm::dyn_cast<Variable>(Src); |
| + |
| + const char *ActualOpcode = NULL; |
|
Jim Stichnoth
2016/07/06 11:18:57
nullptr
obucinac
2016/07/06 13:40:53
Done.
|
| + bool DestIsReg = Dest->hasReg(); |
|
Jim Stichnoth
2016/07/06 11:18:57
const bool
for these 4 variables
obucinac
2016/07/06 13:40:53
Done.
|
| + bool DestIsMem = !Dest->hasReg(); |
| + bool SrcIsReg = (SrcV && SrcV->hasReg()); |
| + bool SrcIsMem = !(SrcV && SrcV->hasReg()); |
|
Jim Stichnoth
2016/07/06 11:18:57
Just checking - what is Src is a Constant, e.g. "4
obucinac
2016/07/06 13:40:53
All constants are lowered to OperandMIPS32Mem. We
|
| + |
| + // reg to reg |
| + if (DestIsReg && SrcIsReg) { |
| + switch (Dest->getType()) { |
| + default: |
| + UnimplementedError(getFlags()); |
| + case IceType_f32: |
| + ActualOpcode = "mov.s"; |
| + break; |
| + case IceType_f64: |
| + ActualOpcode = "mov.d"; |
| + break; |
| + case IceType_i32: |
| + Str << "\t"; |
|
Jim Stichnoth
2016/07/06 11:18:58
Str << "\t" "add" "\t";
to use compile-time string
obucinac
2016/07/06 13:40:53
Done.
|
| + Str << "add"; |
| + Str << "\t"; |
| getDest()->emit(Func); |
| + Str << ", $zero, "; |
| + getSrc(0)->emit(Func); |
| return; |
| - } else |
| - Str << "move"; |
| + case IceType_i64: { |
| + UnimplementedError(getFlags()); |
| + break; |
| + } |
| + case IceType_v4i1: |
| + case IceType_v8i1: |
| + case IceType_v16i1: |
| + case IceType_v16i8: |
| + case IceType_v8i16: |
| + case IceType_v4i32: |
| + case IceType_v4f32: { |
| + UnimplementedError(getFlags()); |
| + break; |
| + } |
| + } |
| + |
| + Str << "\t"; |
|
Jim Stichnoth
2016/07/06 11:18:57
Str << "\t" << ActualOpcode << "\t";
here and belo
obucinac
2016/07/06 13:40:53
Done.
|
| + Str << ActualOpcode; |
| + Str << "\t"; |
| + getDest()->emit(Func); |
| + Str << ", "; |
| + getSrc(0)->emit(Func); |
| + return; |
| } |
| - Str << "\t"; |
| - getDest()->emit(Func); |
| - Str << ", "; |
| - getSrc(0)->emit(Func); |
| + // reg to stack |
| + if (DestIsMem && SrcIsReg) { |
| + switch (Dest->getType()) { |
| + default: |
| + UnimplementedError(getFlags()); |
|
Jim Stichnoth
2016/07/06 11:18:58
add "break" after this?
obucinac
2016/07/06 13:40:53
Done.
|
| + case IceType_f32: |
| + ActualOpcode = "swc1"; |
| + break; |
| + case IceType_f64: |
| + ActualOpcode = "sdc1"; |
| + break; |
| + case IceType_i32: |
| + ActualOpcode = "sw"; |
| + break; |
| + case IceType_i64: { |
| + UnimplementedError(getFlags()); |
| + break; |
| + } |
| + case IceType_v4i1: |
| + case IceType_v8i1: |
| + case IceType_v16i1: |
| + case IceType_v16i8: |
| + case IceType_v8i16: |
| + case IceType_v4i32: |
| + case IceType_v4f32: { |
| + UnimplementedError(getFlags()); |
| + break; |
| + } |
| + } |
| + |
| + Str << "\t"; |
| + Str << ActualOpcode; |
| + Str << "\t"; |
| + getSrc(0)->emit(Func); |
| + Str << ", "; |
| + getDest()->emit(Func); |
| + return; |
| + } |
| + |
| + // stack to reg |
| + if (DestIsReg && SrcIsMem) { |
| + switch (Dest->getType()) { |
| + default: |
| + UnimplementedError(getFlags()); |
| + case IceType_f32: |
| + ActualOpcode = "lwc1"; |
| + break; |
| + case IceType_f64: |
| + ActualOpcode = "ldc1"; |
| + break; |
| + case IceType_i32: |
| + ActualOpcode = "lw"; |
| + break; |
| + case IceType_i64: { |
| + UnimplementedError(getFlags()); |
| + break; |
| + } |
| + case IceType_v4i1: |
| + case IceType_v8i1: |
| + case IceType_v16i1: |
| + case IceType_v16i8: |
| + case IceType_v8i16: |
| + case IceType_v4i32: |
| + case IceType_v4f32: { |
| + UnimplementedError(getFlags()); |
| + break; |
| + } |
| + } |
| + |
| + Str << "\t"; |
| + Str << ActualOpcode; |
| + Str << "\t"; |
| + getDest()->emit(Func); |
| + Str << ", "; |
| + getSrc(0)->emit(Func); |
| + return; |
| + } |
| + |
| + // stack to stack |
| + UnimplementedError(getFlags()); |
|
Jim Stichnoth
2016/07/06 11:18:57
Should this be a hard error? E.g. in x86 it would
obucinac
2016/07/06 13:40:53
This case will be covered in lowerAssign, by copyi
|
| } |
| } // end of namespace MIPS32 |