Commit d895447b by Jaydeep Patil Committed by Jim Stichnoth

[SubZero] Fix floating-point comparison for MIPS

The patch fixes code generation and encoding of floating-point comparison. All floating-point comparison related test in test_fcmp cross test pass (after removing vector related tests): TotalTests=123904 Passes=123904 Failures=0 R=stichnot@chromium.org Review URL: https://codereview.chromium.org/2357143002 . Patch from Jaydeep Patil <jaydeep.patil@imgtec.com>.
parent 0465d026
......@@ -627,8 +627,8 @@ void AssemblerMIPS32::movn_s(const Operand *OpFd, const Operand *OpFs,
void AssemblerMIPS32::movt(const Operand *OpRd, const Operand *OpRs,
const Operand *OpCc) {
IValueT Opcode = 0x00000001;
const IValueT Rd = encodeGPRegister(OpRd, "Rd", "movf");
const IValueT Rs = encodeGPRegister(OpRs, "Rs", "movf");
const IValueT Rd = encodeGPRegister(OpRd, "Rd", "movt");
const IValueT Rs = encodeGPRegister(OpRs, "Rs", "movt");
OperandMIPS32FCC::FCC Cc = OperandMIPS32FCC::FCC0;
if (const auto *OpFCC = llvm::dyn_cast<OperandMIPS32FCC>(OpCc)) {
Cc = OpFCC->getFCC();
......
......@@ -930,7 +930,7 @@ template <> void InstMIPS32Mov_s::emitIAS(const Cfg *Func) const {
template <> void InstMIPS32Movf::emitIAS(const Cfg *Func) const {
auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
Asm->movf(getDest(), getSrc(0), getSrc(1));
Asm->movf(getDest(), getSrc(1), getSrc(2));
}
template <> void InstMIPS32Movn_d::emitIAS(const Cfg *Func) const {
......@@ -945,7 +945,7 @@ template <> void InstMIPS32Movn_s::emitIAS(const Cfg *Func) const {
template <> void InstMIPS32Movt::emitIAS(const Cfg *Func) const {
auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>();
Asm->movt(getDest(), getSrc(0), getSrc(1));
Asm->movt(getDest(), getSrc(1), getSrc(2));
}
template <> void InstMIPS32Movz_d::emitIAS(const Cfg *Func) const {
......
......@@ -95,8 +95,10 @@ public:
}
void dump(const Cfg *Func, Ostream &Str) const override {
if (!BuildDefs::dump())
return;
(void)Func;
(void)Str;
Str << "$fcc" << static_cast<uint16_t>(FpCondCode);
}
private:
......@@ -1062,13 +1064,13 @@ public:
if (!BuildDefs::dump())
return;
Ostream &Str = Func->getContext()->getStrEmit();
assert(getSrcSize() == 2);
assert(getSrcSize() == 3);
Str << "\t" << Opcode << "\t";
getDest()->emit(Func);
Str << ", ";
getSrc(0)->emit(Func);
Str << ", ";
getSrc(1)->emit(Func);
Str << ", ";
getSrc(2)->emit(Func);
}
void emitIAS(const Cfg *Func) const override {
......@@ -1091,7 +1093,8 @@ public:
private:
InstMIPS32MovConditional(Cfg *Func, Variable *Dest, Variable *Src,
Operand *FCC)
: InstMIPS32(Func, K, 2, Dest) {
: InstMIPS32(Func, K, 3, Dest) {
addSource(Dest);
addSource(Src);
addSource(FCC);
}
......
......@@ -2468,7 +2468,7 @@ void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) {
auto *Zero = getZero();
InstFcmp::FCond Cond = Instr->getCondition();
auto *DestR = legalizeToReg(Dest);
auto *DestR = makeReg(Dest->getType());
auto *Src0R = legalizeToReg(Src0);
auto *Src1R = legalizeToReg(Src1);
const Type Src0Ty = Src0->getType();
......@@ -2493,6 +2493,7 @@ void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) {
} else {
_c_eq_d(Src0R, Src1R);
}
_addiu(DestR, Zero, 1);
_movf(DestR, Zero, FCC0);
_mov(Dest, DestR);
break;
......@@ -2503,6 +2504,7 @@ void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) {
} else {
_c_ule_d(Src0R, Src1R);
}
_addiu(DestR, Zero, 1);
_movt(DestR, Zero, FCC0);
_mov(Dest, DestR);
break;
......@@ -2513,6 +2515,7 @@ void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) {
} else {
_c_ult_d(Src0R, Src1R);
}
_addiu(DestR, Zero, 1);
_movt(DestR, Zero, FCC0);
_mov(Dest, DestR);
break;
......@@ -2523,6 +2526,7 @@ void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) {
} else {
_c_olt_d(Src0R, Src1R);
}
_addiu(DestR, Zero, 1);
_movf(DestR, Zero, FCC0);
_mov(Dest, DestR);
break;
......@@ -2533,6 +2537,7 @@ void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) {
} else {
_c_ole_d(Src0R, Src1R);
}
_addiu(DestR, Zero, 1);
_movf(DestR, Zero, FCC0);
_mov(Dest, DestR);
break;
......@@ -2543,6 +2548,7 @@ void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) {
} else {
_c_ueq_d(Src0R, Src1R);
}
_addiu(DestR, Zero, 1);
_movt(DestR, Zero, FCC0);
_mov(Dest, DestR);
break;
......@@ -2553,6 +2559,7 @@ void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) {
} else {
_c_un_d(Src0R, Src1R);
}
_addiu(DestR, Zero, 1);
_movt(DestR, Zero, FCC0);
_mov(Dest, DestR);
break;
......@@ -2563,6 +2570,7 @@ void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) {
} else {
_c_ueq_d(Src0R, Src1R);
}
_addiu(DestR, Zero, 1);
_movf(DestR, Zero, FCC0);
_mov(Dest, DestR);
break;
......@@ -2573,6 +2581,7 @@ void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) {
} else {
_c_ole_d(Src0R, Src1R);
}
_addiu(DestR, Zero, 1);
_movt(DestR, Zero, FCC0);
_mov(Dest, DestR);
break;
......@@ -2583,6 +2592,7 @@ void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) {
} else {
_c_olt_d(Src0R, Src1R);
}
_addiu(DestR, Zero, 1);
_movt(DestR, Zero, FCC0);
_mov(Dest, DestR);
break;
......@@ -2593,6 +2603,7 @@ void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) {
} else {
_c_ult_d(Src0R, Src1R);
}
_addiu(DestR, Zero, 1);
_movf(DestR, Zero, FCC0);
_mov(Dest, DestR);
break;
......@@ -2603,6 +2614,7 @@ void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) {
} else {
_c_ule_d(Src0R, Src1R);
}
_addiu(DestR, Zero, 1);
_movf(DestR, Zero, FCC0);
_mov(Dest, DestR);
break;
......@@ -2613,6 +2625,7 @@ void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) {
} else {
_c_eq_d(Src0R, Src1R);
}
_addiu(DestR, Zero, 1);
_movt(DestR, Zero, FCC0);
_mov(Dest, DestR);
break;
......@@ -2623,6 +2636,7 @@ void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) {
} else {
_c_un_d(Src0R, Src1R);
}
_addiu(DestR, Zero, 1);
_movf(DestR, Zero, FCC0);
_mov(Dest, DestR);
break;
......
......@@ -357,7 +357,8 @@ public:
}
void _movf(Variable *Src0, Variable *Src1, Operand *FCC) {
Context.insert<InstMIPS32Movf>(Src0, Src1, FCC);
auto *Instr = Context.insert<InstMIPS32Movf>(Src0, Src1, FCC);
Instr->setDestRedefined();
}
void _movn(Variable *Dest, Variable *Src0, Variable *Src1) {
......@@ -373,7 +374,8 @@ public:
}
void _movt(Variable *Src0, Variable *Src1, Operand *FCC) {
Context.insert<InstMIPS32Movt>(Src0, Src1, FCC);
auto *Instr = Context.insert<InstMIPS32Movt>(Src0, Src1, FCC);
Instr->setDestRedefined();
}
void _movz(Variable *Dest, Variable *Src0, Variable *Src1) {
......
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