Chromium Code Reviews| Index: src/IceTargetLoweringX8632.cpp |
| diff --git a/src/IceTargetLoweringX8632.cpp b/src/IceTargetLoweringX8632.cpp |
| index 8e78228d709a248537a9426bbd56c325069e8896..e0c23149eb5803a25fb0c3acb9e863d115dcb935 100644 |
| --- a/src/IceTargetLoweringX8632.cpp |
| +++ b/src/IceTargetLoweringX8632.cpp |
| @@ -219,7 +219,8 @@ void TargetX8632::lowerCall(const InstCall *Instr) { |
| Variable *ReturnReg = nullptr; |
| Variable *ReturnRegHi = nullptr; |
| if (Dest) { |
| - switch (Dest->getType()) { |
| + const Type DestTy = Dest->getType(); |
| + switch (DestTy) { |
| case IceType_NUM: |
| case IceType_void: |
| llvm::report_fatal_error("Invalid Call dest type"); |
| @@ -228,7 +229,8 @@ void TargetX8632::lowerCall(const InstCall *Instr) { |
| case IceType_i8: |
| case IceType_i16: |
| case IceType_i32: |
| - ReturnReg = makeReg(Dest->getType(), Traits::RegisterSet::Reg_eax); |
| + ReturnReg = makeReg( |
| + DestTy, Traits::getGprForType(DestTy, Traits::RegisterSet::Reg_al)); |
|
Jim Stichnoth
2016/01/10 03:08:56
I don't really like this Reg_al trick.
At the ver
sehr
2016/01/11 21:49:48
Done.
|
| break; |
| case IceType_i64: |
| ReturnReg = makeReg(IceType_i32, Traits::RegisterSet::Reg_eax); |
| @@ -246,7 +248,7 @@ void TargetX8632::lowerCall(const InstCall *Instr) { |
| case IceType_v8i16: |
| case IceType_v4i32: |
| case IceType_v4f32: |
| - ReturnReg = makeReg(Dest->getType(), Traits::RegisterSet::Reg_xmm0); |
| + ReturnReg = makeReg(DestTy, Traits::RegisterSet::Reg_xmm0); |
| break; |
| } |
| } |
| @@ -303,10 +305,11 @@ void TargetX8632::lowerCall(const InstCall *Instr) { |
| _mov(DestLo, ReturnReg); |
| _mov(DestHi, ReturnRegHi); |
| } else { |
| - assert(Dest->getType() == IceType_i32 || Dest->getType() == IceType_i16 || |
| - Dest->getType() == IceType_i8 || Dest->getType() == IceType_i1 || |
| - isVectorType(Dest->getType())); |
| - if (isVectorType(Dest->getType())) { |
| + const Type DestTy = Dest->getType(); |
| + assert(DestTy == IceType_i32 || DestTy == IceType_i16 || |
| + DestTy == IceType_i8 || DestTy == IceType_i1 || |
| + isVectorType(DestTy)); |
| + if (isVectorType(DestTy)) { |
| _movp(Dest, ReturnReg); |
| } else { |
| _mov(Dest, ReturnReg); |
| @@ -352,20 +355,23 @@ void TargetX8632::lowerRet(const InstRet *Inst) { |
| Variable *Reg = nullptr; |
| if (Inst->hasRetValue()) { |
| Operand *Src0 = legalize(Inst->getRetValue()); |
| + const Type Src0Ty = Src0->getType(); |
| // TODO(jpp): this is not needed. |
| - if (Src0->getType() == IceType_i64) { |
| + if (Src0Ty == IceType_i64) { |
| Variable *eax = |
| legalizeToReg(loOperand(Src0), Traits::RegisterSet::Reg_eax); |
| Variable *edx = |
| legalizeToReg(hiOperand(Src0), Traits::RegisterSet::Reg_edx); |
| Reg = eax; |
| Context.insert<InstFakeUse>(edx); |
| - } else if (isScalarFloatingType(Src0->getType())) { |
| + } else if (isScalarFloatingType(Src0Ty)) { |
| _fld(Src0); |
| - } else if (isVectorType(Src0->getType())) { |
| + } else if (isVectorType(Src0Ty)) { |
| Reg = legalizeToReg(Src0, Traits::RegisterSet::Reg_xmm0); |
| } else { |
| - _mov(Reg, Src0, Traits::RegisterSet::Reg_eax); |
| + assert(isScalarIntegerType(Src0Ty)); |
| + _mov(Reg, Src0, |
| + Traits::getGprForType(Src0Ty, Traits::RegisterSet::Reg_eax)); |
|
Jim Stichnoth
2016/01/10 03:08:56
Similar comment to above. The lit tests that defi
sehr
2016/01/11 21:49:48
Done.
|
| } |
| } |
| // Add a ret instruction even if sandboxing is enabled, because addEpilog |