Commit 36847bdd by Srdjan Obucina Committed by Jim Stichnoth

Subzero, MIPS32: Extend InstMIPS32Mov to support different data types

This patch extends InstMIPS32Mov instruction to support different datatypes, and emit proper low level instruction depending on operands properties and data types. R=stichnot@chromium.org Review URL: https://codereview.chromium.org/2122043002 . Patch from Srdjan Obucina <Srdjan.Obucina@imgtec.com>.
parent a7e5a951
...@@ -553,29 +553,107 @@ void InstMIPS32Mov::emitSingleDestSingleSource(const Cfg *Func) const { ...@@ -553,29 +553,107 @@ void InstMIPS32Mov::emitSingleDestSingleSource(const Cfg *Func) const {
Ostream &Str = Func->getContext()->getStrEmit(); Ostream &Str = Func->getContext()->getStrEmit();
Variable *Dest = getDest(); Variable *Dest = getDest();
Operand *Src = getSrc(0); Operand *Src = getSrc(0);
auto *S = llvm::dyn_cast<Variable>(Src); auto *SrcV = llvm::dyn_cast<Variable>(Src);
Str << "\t";
if (Dest->hasReg()) { assert(!llvm::isa<Constant>(Src));
if (S && S->hasReg())
Str << "move"; const char *ActualOpcode = nullptr;
else const bool DestIsReg = Dest->hasReg();
Str << "lw"; const bool DestIsMem = !Dest->hasReg();
} else { const bool SrcIsReg = (SrcV && SrcV->hasReg());
if (S && S->hasReg()) { const bool SrcIsMem = !(SrcV && SrcV->hasReg());
Str << "sw"
// 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"
"add"
"\t"; "\t";
getDest()->emit(Func);
Str << ", $zero, ";
getSrc(0)->emit(Func);
return;
default:
UnimplementedError(getFlags());
return;
}
assert(ActualOpcode);
Str << "\t" << ActualOpcode << "\t";
getDest()->emit(Func);
Str << ", ";
getSrc(0)->emit(Func);
return;
}
// reg to stack
if (DestIsMem && SrcIsReg) {
switch (Dest->getType()) {
case IceType_f32:
ActualOpcode = "swc1";
break;
case IceType_f64:
ActualOpcode = "sdc1";
break;
case IceType_i1:
case IceType_i8:
case IceType_i16:
case IceType_i32:
ActualOpcode = "sw";
break;
default:
UnimplementedError(getFlags());
return;
}
assert(ActualOpcode);
Str << "\t" << ActualOpcode << "\t";
getSrc(0)->emit(Func); getSrc(0)->emit(Func);
Str << ", "; Str << ", ";
getDest()->emit(Func); getDest()->emit(Func);
return; return;
} else
Str << "move";
} }
Str << "\t"; // stack to reg
if (DestIsReg && SrcIsMem) {
switch (Dest->getType()) {
case IceType_f32:
ActualOpcode = "lwc1";
break;
case IceType_f64:
ActualOpcode = "ldc1";
break;
case IceType_i1:
case IceType_i8:
case IceType_i16:
case IceType_i32:
ActualOpcode = "lw";
break;
default:
UnimplementedError(getFlags());
return;
}
assert(ActualOpcode);
Str << "\t" << ActualOpcode << "\t";
getDest()->emit(Func); getDest()->emit(Func);
Str << ", "; Str << ", ";
getSrc(0)->emit(Func); getSrc(0)->emit(Func);
return;
}
// stack to stack
llvm::report_fatal_error("mov cant copy stack to stack.");
} }
} // end of namespace MIPS32 } // end of namespace MIPS32
......
...@@ -47,7 +47,7 @@ entry: ...@@ -47,7 +47,7 @@ entry:
} }
; MIPS32-LABEL: ignore64BitArg ; MIPS32-LABEL: ignore64BitArg
; MIPS32: move v0,a2 ; MIPS32: add v0,zero,a2
define internal i32 @pass64BitArg(i64 %a, i64 %b, i64 %c, i64 %d, i64 %e, i64 %f) { define internal i32 @pass64BitArg(i64 %a, i64 %b, i64 %c, i64 %d, i64 %e, i64 %f) {
entry: entry:
...@@ -203,8 +203,8 @@ entry: ...@@ -203,8 +203,8 @@ entry:
; ARM32: bx lr ; ARM32: bx lr
; MIPS32-LABEL; return64BitArg ; MIPS32-LABEL; return64BitArg
; MIPS32: move v0,a2 ; MIPS32: add v0,zero,a2
; MIPS32: move v1,a3 ; MIPS32: add v1,zero,a3
; MIPS32: jr ra ; MIPS32: jr ra
define internal i64 @return64BitConst() { define internal i64 @return64BitConst() {
...@@ -800,7 +800,7 @@ entry: ...@@ -800,7 +800,7 @@ entry:
; ARM32: mov r0, r2 ; ARM32: mov r0, r2
; MIPS32-LABEL: trunc64To32Signed ; MIPS32-LABEL: trunc64To32Signed
; MIPS32: move v0,a2 ; MIPS32: add v0,zero,a2
define internal i32 @trunc64To16Signed(i64 %a) { define internal i32 @trunc64To16Signed(i64 %a) {
entry: entry:
...@@ -822,7 +822,7 @@ entry: ...@@ -822,7 +822,7 @@ entry:
; MIPS32-LABEL: trunc64To16Signed ; MIPS32-LABEL: trunc64To16Signed
; MIPS32: sll a0,a0,0x10 ; MIPS32: sll a0,a0,0x10
; MIPS32: sra a0,a0,0x10 ; MIPS32: sra a0,a0,0x10
; MIPS32: move v0,a0 ; MIPS32: add v0,zero,a0
define internal i32 @trunc64To8Signed(i64 %a) { define internal i32 @trunc64To8Signed(i64 %a) {
entry: entry:
...@@ -844,7 +844,7 @@ entry: ...@@ -844,7 +844,7 @@ entry:
; MIPS32-LABEL: trunc64To8Signed ; MIPS32-LABEL: trunc64To8Signed
; MIPS32: sll a0,a0,0x18 ; MIPS32: sll a0,a0,0x18
; MIPS32: sra a0,a0,0x18 ; MIPS32: sra a0,a0,0x18
; MIPS32: move v0,a0 ; MIPS32: add v0,zero,a0
define internal i32 @trunc64To32SignedConst() { define internal i32 @trunc64To32SignedConst() {
entry: entry:
...@@ -905,7 +905,7 @@ entry: ...@@ -905,7 +905,7 @@ entry:
; ARM32: mov r0, r2 ; ARM32: mov r0, r2
; MIPS32-LABEL: trunc64To32Unsigned ; MIPS32-LABEL: trunc64To32Unsigned
; MIPS32: move v0,a2 ; MIPS32: add v0,zero,a2
define internal i32 @trunc64To16Unsigned(i64 %a) { define internal i32 @trunc64To16Unsigned(i64 %a) {
entry: entry:
...@@ -926,7 +926,7 @@ entry: ...@@ -926,7 +926,7 @@ entry:
; MIPS32-LABEL: trunc64To16Unsigned ; MIPS32-LABEL: trunc64To16Unsigned
; MIPS32: andi a0,a0,0xffff ; MIPS32: andi a0,a0,0xffff
; MIPS32: move v0,a0 ; MIPS32: add v0,zero,a0
define internal i32 @trunc64To8Unsigned(i64 %a) { define internal i32 @trunc64To8Unsigned(i64 %a) {
entry: entry:
...@@ -947,7 +947,7 @@ entry: ...@@ -947,7 +947,7 @@ entry:
; MIPS32-LABEL: trunc64To8Unsigned ; MIPS32-LABEL: trunc64To8Unsigned
; MIPS32: andi a0,a0,0xff ; MIPS32: andi a0,a0,0xff
; MIPS32: move v0,a0 ; MIPS32: add v0,zero,a0
define internal i32 @trunc64To1(i64 %a) { define internal i32 @trunc64To1(i64 %a) {
entry: entry:
...@@ -972,7 +972,7 @@ entry: ...@@ -972,7 +972,7 @@ entry:
; MIPS32-LABEL: trunc64To1 ; MIPS32-LABEL: trunc64To1
; MIPS32: andi {{.*}},a0,0x1 ; MIPS32: andi {{.*}},a0,0x1
; MIPS32: move v0,{{.*}} ; MIPS32: add v0,{{.*}}
define internal i64 @sext32To64(i32 %a) { define internal i64 @sext32To64(i32 %a) {
entry: entry:
...@@ -992,8 +992,8 @@ entry: ...@@ -992,8 +992,8 @@ entry:
; MIPS32-LABEL: sext32To64 ; MIPS32-LABEL: sext32To64
; MIPS32-LABEL: sra {{.*}},a0,0x1f ; MIPS32-LABEL: sra {{.*}},a0,0x1f
; MIPS32-LABEL: move v1,{{.*}} ; MIPS32-LABEL: add v1,{{.*}}
; MIPS32-LABEL: move v0,{{.*}} ; MIPS32-LABEL: add v0,{{.*}}
define internal i64 @sext16To64(i32 %a) { define internal i64 @sext16To64(i32 %a) {
entry: entry:
...@@ -1017,8 +1017,8 @@ entry: ...@@ -1017,8 +1017,8 @@ entry:
; MIPS32: sll {{.*}},{{.*}},0x10 ; MIPS32: sll {{.*}},{{.*}},0x10
; MIPS32: sra {{.*}},{{.*}},0x10 ; MIPS32: sra {{.*}},{{.*}},0x10
; MIPS32: sra {{.*}},{{.*}},0x1f ; MIPS32: sra {{.*}},{{.*}},0x1f
; MIPS32: move v1,{{.*}} ; MIPS32: add v1,{{.*}}
; MIPS32: move v0,{{.*}} ; MIPS32: add v0,{{.*}}
define internal i64 @sext8To64(i32 %a) { define internal i64 @sext8To64(i32 %a) {
entry: entry:
...@@ -1042,8 +1042,8 @@ entry: ...@@ -1042,8 +1042,8 @@ entry:
; MIPS32: sll {{.*}},a0,0x18 ; MIPS32: sll {{.*}},a0,0x18
; MIPS32: sra {{.*}},{{.*}},0x18 ; MIPS32: sra {{.*}},{{.*}},0x18
; MIPS32: sra {{.*}},{{.*}},0x1f ; MIPS32: sra {{.*}},{{.*}},0x1f
; MIPS32: move v1,{{.*}} ; MIPS32: add v1,{{.*}}
; MIPS32: move v0,{{.*}} ; MIPS32: add v0,{{.*}}
define internal i64 @sext1To64(i32 %a) { define internal i64 @sext1To64(i32 %a) {
entry: entry:
...@@ -1070,8 +1070,8 @@ entry: ...@@ -1070,8 +1070,8 @@ entry:
; MIPS32-LABEL: sext1To64 ; MIPS32-LABEL: sext1To64
; MIPS32: sll {{.*}},a0,0x1f ; MIPS32: sll {{.*}},a0,0x1f
; MIPS32: sra {{.*}},{{.*}},0x1f ; MIPS32: sra {{.*}},{{.*}},0x1f
; MIPS32: move v1,{{.*}} ; MIPS32: add v1,{{.*}}
; MIPS32: move v0,{{.*}} ; MIPS32: add v0,{{.*}}
define internal i64 @zext32To64(i32 %a) { define internal i64 @zext32To64(i32 %a) {
entry: entry:
...@@ -1091,8 +1091,8 @@ entry: ...@@ -1091,8 +1091,8 @@ entry:
; MIPS32-LABEL: zext32To64 ; MIPS32-LABEL: zext32To64
; MIPS32: li {{.*}},0 ; MIPS32: li {{.*}},0
; MIPS32: move v1,{{.*}} ; MIPS32: add v1,{{.*}}
; MIPS32: move v0,{{.*}} ; MIPS32: add v0,{{.*}}
define internal i64 @zext16To64(i32 %a) { define internal i64 @zext16To64(i32 %a) {
entry: entry:
...@@ -1115,8 +1115,8 @@ entry: ...@@ -1115,8 +1115,8 @@ entry:
; MIPS32-LABEL: zext16To64 ; MIPS32-LABEL: zext16To64
; MIPS32: andi {{.*}},a0,0xffff ; MIPS32: andi {{.*}},a0,0xffff
; MIPS32: li {{.*}},0 ; MIPS32: li {{.*}},0
; MIPS32: move v1,{{.*}} ; MIPS32: add v1,{{.*}}
; MIPS32: move v0,{{.*}} ; MIPS32: add v0,{{.*}}
define internal i64 @zext8To64(i32 %a) { define internal i64 @zext8To64(i32 %a) {
entry: entry:
...@@ -1139,8 +1139,8 @@ entry: ...@@ -1139,8 +1139,8 @@ entry:
; MIPS32-LABEL: zext8To64 ; MIPS32-LABEL: zext8To64
; MIPS32: andi {{.*}},a0,0xff ; MIPS32: andi {{.*}},a0,0xff
; MIPS32: li {{.*}},0 ; MIPS32: li {{.*}},0
; MIPS32: move v1,{{.*}} ; MIPS32: add v1,{{.*}}
; MIPS32: move v0,{{.*}} ; MIPS32: add v0,{{.*}}
define internal i64 @zext1To64(i32 %a) { define internal i64 @zext1To64(i32 %a) {
entry: entry:
...@@ -1164,8 +1164,8 @@ entry: ...@@ -1164,8 +1164,8 @@ entry:
; MIPS32-LABEL: zext1To64 ; MIPS32-LABEL: zext1To64
; MIPS32: andi {{.*}},a0,0x1 ; MIPS32: andi {{.*}},a0,0x1
; MIPS32: li {{.*}},0 ; MIPS32: li {{.*}},0
; MIPS32: move v1,{{.*}} ; MIPS32: add v1,{{.*}}
; MIPS32: move v0,{{.*}} ; MIPS32: add v0,{{.*}}
define internal void @icmpEq64(i64 %a, i64 %b, i64 %c, i64 %d) { define internal void @icmpEq64(i64 %a, i64 %b, i64 %c, i64 %d) {
entry: entry:
......
...@@ -42,7 +42,7 @@ entry: ...@@ -42,7 +42,7 @@ entry:
; ARM32-LABEL: test_returning32_arg0 ; ARM32-LABEL: test_returning32_arg0
; ARM32-NEXT: bx lr ; ARM32-NEXT: bx lr
; MIPS32-LABEL: test_returning32_arg0 ; MIPS32-LABEL: test_returning32_arg0
; MIPS32: move v0,a0 ; MIPS32: add v0,zero,a0
; MIPS32-NEXT: jr ra ; MIPS32-NEXT: jr ra
define internal i32 @test_returning32_arg1(i32 %arg0, i32 %arg1, i32 %arg2, i32 %arg3, i32 %arg4, i32 %arg5, i32 %arg6, i32 %arg7) { define internal i32 @test_returning32_arg1(i32 %arg0, i32 %arg1, i32 %arg2, i32 %arg3, i32 %arg4, i32 %arg5, i32 %arg6, i32 %arg7) {
...@@ -56,7 +56,7 @@ entry: ...@@ -56,7 +56,7 @@ entry:
; ARM32-NEXT: mov r0, r1 ; ARM32-NEXT: mov r0, r1
; ARM32-NEXT: bx lr ; ARM32-NEXT: bx lr
; MIPS32-LABEL: test_returning32_arg1 ; MIPS32-LABEL: test_returning32_arg1
; MIPS32: move v0,a1 ; MIPS32: add v0,zero,a1
; MIPS32-NEXT: jr ra ; MIPS32-NEXT: jr ra
define internal i32 @test_returning32_arg2(i32 %arg0, i32 %arg1, i32 %arg2, i32 %arg3, i32 %arg4, i32 %arg5, i32 %arg6, i32 %arg7) { define internal i32 @test_returning32_arg2(i32 %arg0, i32 %arg1, i32 %arg2, i32 %arg3, i32 %arg4, i32 %arg5, i32 %arg6, i32 %arg7) {
...@@ -70,7 +70,7 @@ entry: ...@@ -70,7 +70,7 @@ entry:
; ARM32-NEXT: mov r0, r2 ; ARM32-NEXT: mov r0, r2
; ARM32-NEXT: bx lr ; ARM32-NEXT: bx lr
; MIPS32-LABEL: test_returning32_arg2 ; MIPS32-LABEL: test_returning32_arg2
; MIPS32: move v0,a2 ; MIPS32: add v0,zero,a2
; MIPS32-NEXT: jr ra ; MIPS32-NEXT: jr ra
...@@ -122,8 +122,8 @@ entry: ...@@ -122,8 +122,8 @@ entry:
; ARM32-LABEL: test_returning64_arg0 ; ARM32-LABEL: test_returning64_arg0
; ARM32-NEXT: bx lr ; ARM32-NEXT: bx lr
; MIPS32-LABEL: test_returning64_arg0 ; MIPS32-LABEL: test_returning64_arg0
; MIPS32-NEXT: move v0,a0 ; MIPS32-NEXT: add v0,zero,a0
; MIPS32-NEXT: move v1,a1 ; MIPS32-NEXT: add v1,zero,a1
define internal i64 @test_returning64_arg1(i64 %arg0, i64 %arg1, i64 %arg2, i64 %arg3) { define internal i64 @test_returning64_arg1(i64 %arg0, i64 %arg1, i64 %arg2, i64 %arg3) {
...@@ -139,8 +139,8 @@ entry: ...@@ -139,8 +139,8 @@ entry:
; ARM32-NEXT: mov r1, r3 ; ARM32-NEXT: mov r1, r3
; ARM32-NEXT: bx lr ; ARM32-NEXT: bx lr
; MIPS32-LABEL: test_returning64_arg1 ; MIPS32-LABEL: test_returning64_arg1
; MIPS32-NEXT: move v0,a2 ; MIPS32-NEXT: add v0,zero,a2
; MIPS32-NEXT: move v1,a3 ; MIPS32-NEXT: add v1,zero,a3
define internal i64 @test_returning64_arg2(i64 %arg0, i64 %arg1, i64 %arg2, i64 %arg3) { define internal i64 @test_returning64_arg2(i64 %arg0, i64 %arg1, i64 %arg2, i64 %arg3) {
entry: entry:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment