| OLD | NEW |
| 1 //===-- X86ISelLowering.cpp - X86 DAG Lowering Implementation -------------===// | 1 //===-- X86ISelLowering.cpp - X86 DAG Lowering Implementation -------------===// |
| 2 // | 2 // |
| 3 // The LLVM Compiler Infrastructure | 3 // The LLVM Compiler Infrastructure |
| 4 // | 4 // |
| 5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
| 6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
| 7 // | 7 // |
| 8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
| 9 // | 9 // |
| 10 // This file defines the interfaces that X86 uses to lower LLVM code into a | 10 // This file defines the interfaces that X86 uses to lower LLVM code into a |
| (...skipping 9430 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9441 case ISD::SETGE: Swap = true; | 9441 case ISD::SETGE: Swap = true; |
| 9442 case ISD::SETLE: Opc = X86ISD::PCMPGT; Invert = true; break; | 9442 case ISD::SETLE: Opc = X86ISD::PCMPGT; Invert = true; break; |
| 9443 case ISD::SETULT: Swap = true; | 9443 case ISD::SETULT: Swap = true; |
| 9444 case ISD::SETUGT: Opc = X86ISD::PCMPGT; FlipSigns = true; break; | 9444 case ISD::SETUGT: Opc = X86ISD::PCMPGT; FlipSigns = true; break; |
| 9445 case ISD::SETUGE: Swap = true; | 9445 case ISD::SETUGE: Swap = true; |
| 9446 case ISD::SETULE: Opc = X86ISD::PCMPGT; FlipSigns = true; Invert = true; break
; | 9446 case ISD::SETULE: Opc = X86ISD::PCMPGT; FlipSigns = true; Invert = true; break
; |
| 9447 } | 9447 } |
| 9448 if (Swap) | 9448 if (Swap) |
| 9449 std::swap(Op0, Op1); | 9449 std::swap(Op0, Op1); |
| 9450 | 9450 |
| 9451 // Since SSE has no unsigned integer comparisons, we need to flip the sign |
| 9452 // bits of the inputs before performing those operations. |
| 9453 if (FlipSigns) { |
| 9454 EVT EltVT = VT.getVectorElementType(); |
| 9455 SDValue SignBit = DAG.getConstant(APInt::getSignBit(EltVT.getSizeInBits()), |
| 9456 EltVT); |
| 9457 std::vector<SDValue> SignBits(VT.getVectorNumElements(), SignBit); |
| 9458 SDValue SignVec = DAG.getNode(ISD::BUILD_VECTOR, dl, VT, &SignBits[0], |
| 9459 SignBits.size()); |
| 9460 Op0 = DAG.getNode(ISD::XOR, dl, VT, Op0, SignVec); |
| 9461 Op1 = DAG.getNode(ISD::XOR, dl, VT, Op1, SignVec); |
| 9462 } |
| 9463 |
| 9451 // Check that the operation in question is available (most are plain SSE2, | 9464 // Check that the operation in question is available (most are plain SSE2, |
| 9452 // but PCMPGTQ and PCMPEQQ have different requirements). | 9465 // but PCMPGTQ and PCMPEQQ have different requirements). |
| 9453 if (VT == MVT::v2i64) { | 9466 if (VT == MVT::v2i64) { |
| 9454 if (Opc == X86ISD::PCMPGT && !Subtarget->hasSSE42()) { | 9467 if (Opc == X86ISD::PCMPGT && !Subtarget->hasSSE42()) { |
| 9455 assert(Subtarget->hasSSE2() && "Don't know how to lower!"); | 9468 assert(Subtarget->hasSSE2() && "Don't know how to lower!"); |
| 9456 | 9469 |
| 9457 // First cast everything to the right type. | 9470 // First cast everything to the right type, |
| 9458 Op0 = DAG.getNode(ISD::BITCAST, dl, MVT::v4i32, Op0); | 9471 Op0 = DAG.getNode(ISD::BITCAST, dl, MVT::v4i32, Op0); |
| 9459 Op1 = DAG.getNode(ISD::BITCAST, dl, MVT::v4i32, Op1); | 9472 Op1 = DAG.getNode(ISD::BITCAST, dl, MVT::v4i32, Op1); |
| 9460 | 9473 |
| 9461 // Since SSE has no unsigned integer comparisons, we need to flip the sign | |
| 9462 // bits of the inputs before performing those operations. The lower | |
| 9463 // compare is always unsigned. | |
| 9464 SDValue SB; | |
| 9465 if (FlipSigns) { | |
| 9466 SB = DAG.getConstant(0x80000000U, MVT::v4i32); | |
| 9467 } else { | |
| 9468 SDValue Sign = DAG.getConstant(0x80000000U, MVT::i32); | |
| 9469 SDValue Zero = DAG.getConstant(0x00000000U, MVT::i32); | |
| 9470 SB = DAG.getNode(ISD::BUILD_VECTOR, dl, MVT::v4i32, | |
| 9471 Sign, Zero, Sign, Zero); | |
| 9472 } | |
| 9473 Op0 = DAG.getNode(ISD::XOR, dl, MVT::v4i32, Op0, SB); | |
| 9474 Op1 = DAG.getNode(ISD::XOR, dl, MVT::v4i32, Op1, SB); | |
| 9475 | |
| 9476 // Emulate PCMPGTQ with (hi1 > hi2) | ((hi1 == hi2) & (lo1 > lo2)) | 9474 // Emulate PCMPGTQ with (hi1 > hi2) | ((hi1 == hi2) & (lo1 > lo2)) |
| 9477 SDValue GT = DAG.getNode(X86ISD::PCMPGT, dl, MVT::v4i32, Op0, Op1); | 9475 SDValue GT = DAG.getNode(X86ISD::PCMPGT, dl, MVT::v4i32, Op0, Op1); |
| 9478 SDValue EQ = DAG.getNode(X86ISD::PCMPEQ, dl, MVT::v4i32, Op0, Op1); | 9476 SDValue EQ = DAG.getNode(X86ISD::PCMPEQ, dl, MVT::v4i32, Op0, Op1); |
| 9479 | 9477 |
| 9480 // Create masks for only the low parts/high parts of the 64 bit integers. | 9478 // Create masks for only the low parts/high parts of the 64 bit integers. |
| 9481 const int MaskHi[] = { 1, 1, 3, 3 }; | 9479 const int MaskHi[] = { 1, 1, 3, 3 }; |
| 9482 const int MaskLo[] = { 0, 0, 2, 2 }; | 9480 const int MaskLo[] = { 0, 0, 2, 2 }; |
| 9483 SDValue EQHi = DAG.getVectorShuffle(MVT::v4i32, dl, EQ, EQ, MaskHi); | 9481 SDValue EQHi = DAG.getVectorShuffle(MVT::v4i32, dl, EQ, EQ, MaskHi); |
| 9484 SDValue GTLo = DAG.getVectorShuffle(MVT::v4i32, dl, GT, GT, MaskLo); | 9482 SDValue GTLo = DAG.getVectorShuffle(MVT::v4i32, dl, GT, GT, MaskLo); |
| 9485 SDValue GTHi = DAG.getVectorShuffle(MVT::v4i32, dl, GT, GT, MaskHi); | 9483 SDValue GTHi = DAG.getVectorShuffle(MVT::v4i32, dl, GT, GT, MaskHi); |
| 9486 | 9484 |
| 9487 SDValue Result = DAG.getNode(ISD::AND, dl, MVT::v4i32, EQHi, GTLo); | 9485 SDValue Result = DAG.getNode(ISD::AND, dl, MVT::v4i32, EQHi, GTLo); |
| 9488 Result = DAG.getNode(ISD::OR, dl, MVT::v4i32, Result, GTHi); | 9486 Result = DAG.getNode(ISD::OR, dl, MVT::v4i32, Result, GTHi); |
| 9489 | 9487 |
| 9490 if (Invert) | 9488 if (Invert) |
| 9491 Result = DAG.getNOT(dl, Result, MVT::v4i32); | 9489 Result = DAG.getNOT(dl, Result, MVT::v4i32); |
| 9492 | 9490 |
| 9493 return DAG.getNode(ISD::BITCAST, dl, VT, Result); | 9491 return DAG.getNode(ISD::BITCAST, dl, VT, Result); |
| 9494 } | 9492 } |
| 9495 | 9493 |
| 9496 if (Opc == X86ISD::PCMPEQ && !Subtarget->hasSSE41()) { | 9494 if (Opc == X86ISD::PCMPEQ && !Subtarget->hasSSE41()) { |
| 9497 // If pcmpeqq is missing but pcmpeqd is available synthesize pcmpeqq with | 9495 // If pcmpeqq is missing but pcmpeqd is available synthesize pcmpeqq with |
| 9498 // pcmpeqd + pshufd + pand. | 9496 // pcmpeqd + pshufd + pand. |
| 9499 assert(Subtarget->hasSSE2() && !FlipSigns && "Don't know how to lower!"); | 9497 assert(Subtarget->hasSSE2() && !FlipSigns && "Don't know how to lower!"); |
| 9500 | 9498 |
| 9501 // First cast everything to the right type. | 9499 // First cast everything to the right type, |
| 9502 Op0 = DAG.getNode(ISD::BITCAST, dl, MVT::v4i32, Op0); | 9500 Op0 = DAG.getNode(ISD::BITCAST, dl, MVT::v4i32, Op0); |
| 9503 Op1 = DAG.getNode(ISD::BITCAST, dl, MVT::v4i32, Op1); | 9501 Op1 = DAG.getNode(ISD::BITCAST, dl, MVT::v4i32, Op1); |
| 9504 | 9502 |
| 9505 // Do the compare. | 9503 // Do the compare. |
| 9506 SDValue Result = DAG.getNode(Opc, dl, MVT::v4i32, Op0, Op1); | 9504 SDValue Result = DAG.getNode(Opc, dl, MVT::v4i32, Op0, Op1); |
| 9507 | 9505 |
| 9508 // Make sure the lower and upper halves are both all-ones. | 9506 // Make sure the lower and upper halves are both all-ones. |
| 9509 const int Mask[] = { 1, 0, 3, 2 }; | 9507 const int Mask[] = { 1, 0, 3, 2 }; |
| 9510 SDValue Shuf = DAG.getVectorShuffle(MVT::v4i32, dl, Result, Result, Mask); | 9508 SDValue Shuf = DAG.getVectorShuffle(MVT::v4i32, dl, Result, Result, Mask); |
| 9511 Result = DAG.getNode(ISD::AND, dl, MVT::v4i32, Result, Shuf); | 9509 Result = DAG.getNode(ISD::AND, dl, MVT::v4i32, Result, Shuf); |
| 9512 | 9510 |
| 9513 if (Invert) | 9511 if (Invert) |
| 9514 Result = DAG.getNOT(dl, Result, MVT::v4i32); | 9512 Result = DAG.getNOT(dl, Result, MVT::v4i32); |
| 9515 | 9513 |
| 9516 return DAG.getNode(ISD::BITCAST, dl, VT, Result); | 9514 return DAG.getNode(ISD::BITCAST, dl, VT, Result); |
| 9517 } | 9515 } |
| 9518 } | 9516 } |
| 9519 | 9517 |
| 9520 // Since SSE has no unsigned integer comparisons, we need to flip the sign | |
| 9521 // bits of the inputs before performing those operations. | |
| 9522 if (FlipSigns) { | |
| 9523 EVT EltVT = VT.getVectorElementType(); | |
| 9524 SDValue SB = DAG.getConstant(APInt::getSignBit(EltVT.getSizeInBits()), VT); | |
| 9525 Op0 = DAG.getNode(ISD::XOR, dl, VT, Op0, SB); | |
| 9526 Op1 = DAG.getNode(ISD::XOR, dl, VT, Op1, SB); | |
| 9527 } | |
| 9528 | |
| 9529 SDValue Result = DAG.getNode(Opc, dl, VT, Op0, Op1); | 9518 SDValue Result = DAG.getNode(Opc, dl, VT, Op0, Op1); |
| 9530 | 9519 |
| 9531 // If the logical-not of the result is required, perform that now. | 9520 // If the logical-not of the result is required, perform that now. |
| 9532 if (Invert) | 9521 if (Invert) |
| 9533 Result = DAG.getNOT(dl, Result, VT); | 9522 Result = DAG.getNOT(dl, Result, VT); |
| 9534 | 9523 |
| 9535 return Result; | 9524 return Result; |
| 9536 } | 9525 } |
| 9537 | 9526 |
| 9538 SDValue X86TargetLowering::LowerSETCC(SDValue Op, SelectionDAG &DAG) const { | 9527 SDValue X86TargetLowering::LowerSETCC(SDValue Op, SelectionDAG &DAG) const { |
| (...skipping 9273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 18812 else if (VT == MVT::f64 || VT == MVT::i64) | 18801 else if (VT == MVT::f64 || VT == MVT::i64) |
| 18813 Res.second = &X86::FR64RegClass; | 18802 Res.second = &X86::FR64RegClass; |
| 18814 else if (X86::VR128RegClass.hasType(VT)) | 18803 else if (X86::VR128RegClass.hasType(VT)) |
| 18815 Res.second = &X86::VR128RegClass; | 18804 Res.second = &X86::VR128RegClass; |
| 18816 else if (X86::VR256RegClass.hasType(VT)) | 18805 else if (X86::VR256RegClass.hasType(VT)) |
| 18817 Res.second = &X86::VR256RegClass; | 18806 Res.second = &X86::VR256RegClass; |
| 18818 } | 18807 } |
| 18819 | 18808 |
| 18820 return Res; | 18809 return Res; |
| 18821 } | 18810 } |
| OLD | NEW |