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, ...@@ -627,8 +627,8 @@ void AssemblerMIPS32::movn_s(const Operand *OpFd, const Operand *OpFs,
void AssemblerMIPS32::movt(const Operand *OpRd, const Operand *OpRs, void AssemblerMIPS32::movt(const Operand *OpRd, const Operand *OpRs,
const Operand *OpCc) { const Operand *OpCc) {
IValueT Opcode = 0x00000001; IValueT Opcode = 0x00000001;
const IValueT Rd = encodeGPRegister(OpRd, "Rd", "movf"); const IValueT Rd = encodeGPRegister(OpRd, "Rd", "movt");
const IValueT Rs = encodeGPRegister(OpRs, "Rs", "movf"); const IValueT Rs = encodeGPRegister(OpRs, "Rs", "movt");
OperandMIPS32FCC::FCC Cc = OperandMIPS32FCC::FCC0; OperandMIPS32FCC::FCC Cc = OperandMIPS32FCC::FCC0;
if (const auto *OpFCC = llvm::dyn_cast<OperandMIPS32FCC>(OpCc)) { if (const auto *OpFCC = llvm::dyn_cast<OperandMIPS32FCC>(OpCc)) {
Cc = OpFCC->getFCC(); Cc = OpFCC->getFCC();
......
...@@ -930,7 +930,7 @@ template <> void InstMIPS32Mov_s::emitIAS(const Cfg *Func) const { ...@@ -930,7 +930,7 @@ template <> void InstMIPS32Mov_s::emitIAS(const Cfg *Func) const {
template <> void InstMIPS32Movf::emitIAS(const Cfg *Func) const { template <> void InstMIPS32Movf::emitIAS(const Cfg *Func) const {
auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>(); 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 { template <> void InstMIPS32Movn_d::emitIAS(const Cfg *Func) const {
...@@ -945,7 +945,7 @@ template <> void InstMIPS32Movn_s::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 { template <> void InstMIPS32Movt::emitIAS(const Cfg *Func) const {
auto *Asm = Func->getAssembler<MIPS32::AssemblerMIPS32>(); 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 { template <> void InstMIPS32Movz_d::emitIAS(const Cfg *Func) const {
......
...@@ -95,8 +95,10 @@ public: ...@@ -95,8 +95,10 @@ public:
} }
void dump(const Cfg *Func, Ostream &Str) const override { void dump(const Cfg *Func, Ostream &Str) const override {
if (!BuildDefs::dump())
return;
(void)Func; (void)Func;
(void)Str; Str << "$fcc" << static_cast<uint16_t>(FpCondCode);
} }
private: private:
...@@ -1062,13 +1064,13 @@ public: ...@@ -1062,13 +1064,13 @@ public:
if (!BuildDefs::dump()) if (!BuildDefs::dump())
return; return;
Ostream &Str = Func->getContext()->getStrEmit(); Ostream &Str = Func->getContext()->getStrEmit();
assert(getSrcSize() == 2); assert(getSrcSize() == 3);
Str << "\t" << Opcode << "\t"; Str << "\t" << Opcode << "\t";
getDest()->emit(Func); getDest()->emit(Func);
Str << ", "; Str << ", ";
getSrc(0)->emit(Func);
Str << ", ";
getSrc(1)->emit(Func); getSrc(1)->emit(Func);
Str << ", ";
getSrc(2)->emit(Func);
} }
void emitIAS(const Cfg *Func) const override { void emitIAS(const Cfg *Func) const override {
...@@ -1091,7 +1093,8 @@ public: ...@@ -1091,7 +1093,8 @@ public:
private: private:
InstMIPS32MovConditional(Cfg *Func, Variable *Dest, Variable *Src, InstMIPS32MovConditional(Cfg *Func, Variable *Dest, Variable *Src,
Operand *FCC) Operand *FCC)
: InstMIPS32(Func, K, 2, Dest) { : InstMIPS32(Func, K, 3, Dest) {
addSource(Dest);
addSource(Src); addSource(Src);
addSource(FCC); addSource(FCC);
} }
......
...@@ -2468,7 +2468,7 @@ void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) { ...@@ -2468,7 +2468,7 @@ void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) {
auto *Zero = getZero(); auto *Zero = getZero();
InstFcmp::FCond Cond = Instr->getCondition(); InstFcmp::FCond Cond = Instr->getCondition();
auto *DestR = legalizeToReg(Dest); auto *DestR = makeReg(Dest->getType());
auto *Src0R = legalizeToReg(Src0); auto *Src0R = legalizeToReg(Src0);
auto *Src1R = legalizeToReg(Src1); auto *Src1R = legalizeToReg(Src1);
const Type Src0Ty = Src0->getType(); const Type Src0Ty = Src0->getType();
...@@ -2493,6 +2493,7 @@ void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) { ...@@ -2493,6 +2493,7 @@ void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) {
} else { } else {
_c_eq_d(Src0R, Src1R); _c_eq_d(Src0R, Src1R);
} }
_addiu(DestR, Zero, 1);
_movf(DestR, Zero, FCC0); _movf(DestR, Zero, FCC0);
_mov(Dest, DestR); _mov(Dest, DestR);
break; break;
...@@ -2503,6 +2504,7 @@ void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) { ...@@ -2503,6 +2504,7 @@ void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) {
} else { } else {
_c_ule_d(Src0R, Src1R); _c_ule_d(Src0R, Src1R);
} }
_addiu(DestR, Zero, 1);
_movt(DestR, Zero, FCC0); _movt(DestR, Zero, FCC0);
_mov(Dest, DestR); _mov(Dest, DestR);
break; break;
...@@ -2513,6 +2515,7 @@ void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) { ...@@ -2513,6 +2515,7 @@ void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) {
} else { } else {
_c_ult_d(Src0R, Src1R); _c_ult_d(Src0R, Src1R);
} }
_addiu(DestR, Zero, 1);
_movt(DestR, Zero, FCC0); _movt(DestR, Zero, FCC0);
_mov(Dest, DestR); _mov(Dest, DestR);
break; break;
...@@ -2523,6 +2526,7 @@ void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) { ...@@ -2523,6 +2526,7 @@ void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) {
} else { } else {
_c_olt_d(Src0R, Src1R); _c_olt_d(Src0R, Src1R);
} }
_addiu(DestR, Zero, 1);
_movf(DestR, Zero, FCC0); _movf(DestR, Zero, FCC0);
_mov(Dest, DestR); _mov(Dest, DestR);
break; break;
...@@ -2533,6 +2537,7 @@ void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) { ...@@ -2533,6 +2537,7 @@ void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) {
} else { } else {
_c_ole_d(Src0R, Src1R); _c_ole_d(Src0R, Src1R);
} }
_addiu(DestR, Zero, 1);
_movf(DestR, Zero, FCC0); _movf(DestR, Zero, FCC0);
_mov(Dest, DestR); _mov(Dest, DestR);
break; break;
...@@ -2543,6 +2548,7 @@ void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) { ...@@ -2543,6 +2548,7 @@ void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) {
} else { } else {
_c_ueq_d(Src0R, Src1R); _c_ueq_d(Src0R, Src1R);
} }
_addiu(DestR, Zero, 1);
_movt(DestR, Zero, FCC0); _movt(DestR, Zero, FCC0);
_mov(Dest, DestR); _mov(Dest, DestR);
break; break;
...@@ -2553,6 +2559,7 @@ void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) { ...@@ -2553,6 +2559,7 @@ void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) {
} else { } else {
_c_un_d(Src0R, Src1R); _c_un_d(Src0R, Src1R);
} }
_addiu(DestR, Zero, 1);
_movt(DestR, Zero, FCC0); _movt(DestR, Zero, FCC0);
_mov(Dest, DestR); _mov(Dest, DestR);
break; break;
...@@ -2563,6 +2570,7 @@ void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) { ...@@ -2563,6 +2570,7 @@ void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) {
} else { } else {
_c_ueq_d(Src0R, Src1R); _c_ueq_d(Src0R, Src1R);
} }
_addiu(DestR, Zero, 1);
_movf(DestR, Zero, FCC0); _movf(DestR, Zero, FCC0);
_mov(Dest, DestR); _mov(Dest, DestR);
break; break;
...@@ -2573,6 +2581,7 @@ void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) { ...@@ -2573,6 +2581,7 @@ void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) {
} else { } else {
_c_ole_d(Src0R, Src1R); _c_ole_d(Src0R, Src1R);
} }
_addiu(DestR, Zero, 1);
_movt(DestR, Zero, FCC0); _movt(DestR, Zero, FCC0);
_mov(Dest, DestR); _mov(Dest, DestR);
break; break;
...@@ -2583,6 +2592,7 @@ void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) { ...@@ -2583,6 +2592,7 @@ void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) {
} else { } else {
_c_olt_d(Src0R, Src1R); _c_olt_d(Src0R, Src1R);
} }
_addiu(DestR, Zero, 1);
_movt(DestR, Zero, FCC0); _movt(DestR, Zero, FCC0);
_mov(Dest, DestR); _mov(Dest, DestR);
break; break;
...@@ -2593,6 +2603,7 @@ void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) { ...@@ -2593,6 +2603,7 @@ void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) {
} else { } else {
_c_ult_d(Src0R, Src1R); _c_ult_d(Src0R, Src1R);
} }
_addiu(DestR, Zero, 1);
_movf(DestR, Zero, FCC0); _movf(DestR, Zero, FCC0);
_mov(Dest, DestR); _mov(Dest, DestR);
break; break;
...@@ -2603,6 +2614,7 @@ void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) { ...@@ -2603,6 +2614,7 @@ void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) {
} else { } else {
_c_ule_d(Src0R, Src1R); _c_ule_d(Src0R, Src1R);
} }
_addiu(DestR, Zero, 1);
_movf(DestR, Zero, FCC0); _movf(DestR, Zero, FCC0);
_mov(Dest, DestR); _mov(Dest, DestR);
break; break;
...@@ -2613,6 +2625,7 @@ void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) { ...@@ -2613,6 +2625,7 @@ void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) {
} else { } else {
_c_eq_d(Src0R, Src1R); _c_eq_d(Src0R, Src1R);
} }
_addiu(DestR, Zero, 1);
_movt(DestR, Zero, FCC0); _movt(DestR, Zero, FCC0);
_mov(Dest, DestR); _mov(Dest, DestR);
break; break;
...@@ -2623,6 +2636,7 @@ void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) { ...@@ -2623,6 +2636,7 @@ void TargetMIPS32::lowerFcmp(const InstFcmp *Instr) {
} else { } else {
_c_un_d(Src0R, Src1R); _c_un_d(Src0R, Src1R);
} }
_addiu(DestR, Zero, 1);
_movf(DestR, Zero, FCC0); _movf(DestR, Zero, FCC0);
_mov(Dest, DestR); _mov(Dest, DestR);
break; break;
......
...@@ -357,7 +357,8 @@ public: ...@@ -357,7 +357,8 @@ public:
} }
void _movf(Variable *Src0, Variable *Src1, Operand *FCC) { 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) { void _movn(Variable *Dest, Variable *Src0, Variable *Src1) {
...@@ -373,7 +374,8 @@ public: ...@@ -373,7 +374,8 @@ public:
} }
void _movt(Variable *Src0, Variable *Src1, Operand *FCC) { 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) { 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