Chromium Code Reviews| Index: src/IceTargetLoweringMIPS32.cpp |
| diff --git a/src/IceTargetLoweringMIPS32.cpp b/src/IceTargetLoweringMIPS32.cpp |
| index 2bfdf7252acd2e832757fc42d5024e7319b1e45c..5307f4d0c868acf953169df016752e2618c0fab0 100644 |
| --- a/src/IceTargetLoweringMIPS32.cpp |
| +++ b/src/IceTargetLoweringMIPS32.cpp |
| @@ -319,7 +319,7 @@ void TargetMIPS32::emitVariable(const Variable *Var) const { |
| } else { |
| int32_t Offset = Var->getStackOffset(); |
| Str << Offset; |
| - Str << "(" << getRegName(getFrameOrStackReg(), FrameSPTy); |
| + Str << "($" << getRegName(getFrameOrStackReg(), FrameSPTy); |
| Str << ")"; |
| } |
| UnimplementedError(Func->getContext()->getFlags()); |
| @@ -518,38 +518,57 @@ void TargetMIPS32::lowerArithmetic(const InstArithmetic *Inst) { |
| Variable *Dest = Inst->getDest(); |
| Operand *Src0 = legalizeUndef(Inst->getSrc(0)); |
| Operand *Src1 = legalizeUndef(Inst->getSrc(1)); |
| - (void)Src0; |
| - (void)Src1; |
| if (Dest->getType() == IceType_i64) { |
| + // TODO(reed kotler): fakedef needed for now until all cases are implemented |
| + Variable *DestLo = llvm::cast<Variable>(loOperand(Dest)); |
| + Variable *DestHi = llvm::cast<Variable>(hiOperand(Dest)); |
| + Context.insert(InstFakeDef::create(Func, DestLo)); |
| + Context.insert(InstFakeDef::create(Func, DestHi)); |
| UnimplementedError(Func->getContext()->getFlags()); |
| + return; |
| } else if (isVectorType(Dest->getType())) { |
|
Jim Stichnoth
2015/11/04 14:47:24
Don't use "else if" when the "if" branch ends with
rkotlerimgtec
2015/11/05 01:28:43
Done.
|
| UnimplementedError(Func->getContext()->getFlags()); |
| } else { // Dest->getType() is non-i64 scalar |
| + Variable *T = makeReg(Dest->getType()); |
|
Jim Stichnoth
2015/11/04 14:47:24
Now is the part where I wish I had learned more ab
rkotlerimgtec
2015/11/05 01:28:43
Done.
|
| + Variable *Src0R = legalizeToReg(Src0); |
| + Operand *Src1R = legalize(Src1, Legal_Reg); |
| + // TODO(reed kotler): |
| + // fakedef and fakeuse needed for now until all cases are implemented |
| + Context.insert(InstFakeUse::create(Func, Src0R)); |
|
Jim Stichnoth
2015/11/04 14:47:24
I think the FakeUse and FakeDef instructions shoul
rkotlerimgtec
2015/11/05 01:28:43
Done.
|
| + if (auto *S1 = llvm::dyn_cast<Variable>(Src1R)) { |
| + Context.insert(InstFakeUse::create(Func, S1)); |
| + } |
| + Context.insert(InstFakeDef::create(Func, Dest)); |
| switch (Inst->getOp()) { |
| case InstArithmetic::_num: |
| UnimplementedError(Func->getContext()->getFlags()); |
| break; |
| case InstArithmetic::Add: |
| - UnimplementedError(Func->getContext()->getFlags()); |
| - // Variable *T = makeReg(Dest->getType()); |
| - // _add(T, Src0, Src1); |
| - // _mov(Dest, T); |
| + _add(T, Src0R, Src1R); |
| + _mov(Dest, T); |
| return; |
| case InstArithmetic::And: |
| - UnimplementedError(Func->getContext()->getFlags()); |
| - break; |
| + _and(T, Src0R, Src1R); |
| + _mov(Dest, T); |
| + return; |
| case InstArithmetic::Or: |
| - UnimplementedError(Func->getContext()->getFlags()); |
| - break; |
| + _or(T, Src0R, Src1R); |
| + _mov(Dest, T); |
| + return; |
| case InstArithmetic::Xor: |
| - UnimplementedError(Func->getContext()->getFlags()); |
| - break; |
| + _xor(T, Src0R, Src1R); |
| + _mov(Dest, T); |
| + return; |
| case InstArithmetic::Sub: |
| - UnimplementedError(Func->getContext()->getFlags()); |
| - break; |
| - case InstArithmetic::Mul: |
| - UnimplementedError(Func->getContext()->getFlags()); |
| - break; |
| + _sub(T, Src0R, Src1R); |
| + _mov(Dest, T); |
| + return; |
| + case InstArithmetic::Mul: { |
| + Variable *Src1R_ = legalizeToReg(Src1R); |
|
Jim Stichnoth
2015/11/04 14:47:24
If you follow the comment above and declare Src1R
rkotlerimgtec
2015/11/05 01:28:43
Done.
|
| + _mul(T, Src0R, Src1R_); |
| + _mov(Dest, T); |
| + return; |
| + } |
| case InstArithmetic::Shl: |
| UnimplementedError(Func->getContext()->getFlags()); |
| break; |