| Index: src/IceTargetLoweringX8632.cpp
|
| diff --git a/src/IceTargetLoweringX8632.cpp b/src/IceTargetLoweringX8632.cpp
|
| index 84333b45ef3f8b50b7eade4d65bf079e721de3c0..cf1136c054d69bfdb6fe16250ba4e71199cbeff9 100644
|
| --- a/src/IceTargetLoweringX8632.cpp
|
| +++ b/src/IceTargetLoweringX8632.cpp
|
| @@ -1375,6 +1375,8 @@ void TargetX8632::lowerArithmetic(const InstArithmetic *Inst) {
|
| } else if (isVectorType(Dest->getType())) {
|
| // TODO: Trap on integer divide and integer modulo by zero.
|
| // See: https://code.google.com/p/nativeclient/issues/detail?id=3899
|
| + if (llvm::isa<OperandX8632Mem>(Src1))
|
| + Src1 = legalizeToVar(Src1);
|
| switch (Inst->getOp()) {
|
| case InstArithmetic::_num:
|
| llvm_unreachable("Unknown arithmetic operator");
|
| @@ -2090,6 +2092,8 @@ void TargetX8632::lowerCast(const InstCast *Inst) {
|
| assert(Dest->getType() == IceType_v4i32 &&
|
| Inst->getSrc(0)->getType() == IceType_v4f32);
|
| Operand *Src0RM = legalize(Inst->getSrc(0), Legal_Reg | Legal_Mem);
|
| + if (llvm::isa<OperandX8632Mem>(Src0RM))
|
| + Src0RM = legalizeToVar(Src0RM);
|
| Variable *T = makeReg(Dest->getType());
|
| _cvt(T, Src0RM, InstX8632Cvt::Tps2dq);
|
| _movp(Dest, T);
|
| @@ -2165,6 +2169,8 @@ void TargetX8632::lowerCast(const InstCast *Inst) {
|
| assert(Dest->getType() == IceType_v4f32 &&
|
| Inst->getSrc(0)->getType() == IceType_v4i32);
|
| Operand *Src0RM = legalize(Inst->getSrc(0), Legal_Reg | Legal_Mem);
|
| + if (llvm::isa<OperandX8632Mem>(Src0RM))
|
| + Src0RM = legalizeToVar(Src0RM);
|
| Variable *T = makeReg(Dest->getType());
|
| _cvt(T, Src0RM, InstX8632Cvt::Dq2ps);
|
| _movp(Dest, T);
|
| @@ -2472,6 +2478,8 @@ void TargetX8632::lowerFcmp(const InstFcmp *Inst) {
|
| } else {
|
| Operand *Src0RM = legalize(Src0, Legal_Reg | Legal_Mem);
|
| Operand *Src1RM = legalize(Src1, Legal_Reg | Legal_Mem);
|
| + if (llvm::isa<OperandX8632Mem>(Src1RM))
|
| + Src1RM = legalizeToVar(Src1RM);
|
|
|
| switch (Condition) {
|
| default: {
|
| @@ -2609,10 +2617,14 @@ void TargetX8632::lowerIcmp(const InstIcmp *Inst) {
|
| llvm_unreachable("unexpected condition");
|
| break;
|
| case InstIcmp::Eq: {
|
| + if (llvm::isa<OperandX8632Mem>(Src1RM))
|
| + Src1RM = legalizeToVar(Src1RM);
|
| _movp(T, Src0RM);
|
| _pcmpeq(T, Src1RM);
|
| } break;
|
| case InstIcmp::Ne: {
|
| + if (llvm::isa<OperandX8632Mem>(Src1RM))
|
| + Src1RM = legalizeToVar(Src1RM);
|
| _movp(T, Src0RM);
|
| _pcmpeq(T, Src1RM);
|
| Variable *MinusOne = makeVectorOfMinusOnes(Ty);
|
| @@ -2620,12 +2632,16 @@ void TargetX8632::lowerIcmp(const InstIcmp *Inst) {
|
| } break;
|
| case InstIcmp::Ugt:
|
| case InstIcmp::Sgt: {
|
| + if (llvm::isa<OperandX8632Mem>(Src1RM))
|
| + Src1RM = legalizeToVar(Src1RM);
|
| _movp(T, Src0RM);
|
| _pcmpgt(T, Src1RM);
|
| } break;
|
| case InstIcmp::Uge:
|
| case InstIcmp::Sge: {
|
| // !(Src1RM > Src0RM)
|
| + if (llvm::isa<OperandX8632Mem>(Src0RM))
|
| + Src0RM = legalizeToVar(Src0RM);
|
| _movp(T, Src1RM);
|
| _pcmpgt(T, Src0RM);
|
| Variable *MinusOne = makeVectorOfMinusOnes(Ty);
|
| @@ -2633,12 +2649,16 @@ void TargetX8632::lowerIcmp(const InstIcmp *Inst) {
|
| } break;
|
| case InstIcmp::Ult:
|
| case InstIcmp::Slt: {
|
| + if (llvm::isa<OperandX8632Mem>(Src0RM))
|
| + Src0RM = legalizeToVar(Src0RM);
|
| _movp(T, Src1RM);
|
| _pcmpgt(T, Src0RM);
|
| } break;
|
| case InstIcmp::Ule:
|
| case InstIcmp::Sle: {
|
| // !(Src0RM > Src1RM)
|
| + if (llvm::isa<OperandX8632Mem>(Src1RM))
|
| + Src1RM = legalizeToVar(Src1RM);
|
| _movp(T, Src0RM);
|
| _pcmpgt(T, Src1RM);
|
| Variable *MinusOne = makeVectorOfMinusOnes(Ty);
|
| @@ -3092,8 +3112,12 @@ void TargetX8632::lowerIntrinsicCall(const InstIntrinsicCall *Instr) {
|
| Variable *T = makeVectorOfFabsMask(Ty);
|
| // The pand instruction operates on an m128 memory operand, so if
|
| // Src is an f32 or f64, we need to make sure it's in a register.
|
| - if (!isVectorType(Ty))
|
| + if (isVectorType(Ty)) {
|
| + if (llvm::isa<OperandX8632Mem>(Src))
|
| + Src = legalizeToVar(Src);
|
| + } else {
|
| Src = legalizeToVar(Src);
|
| + }
|
| _pand(T, Src);
|
| if (isVectorType(Ty))
|
| _movp(Dest, T);
|
|
|