[llvm-commits] minor vector comparison patch
Mon P Wang
wangmp at apple.com
Fri Jul 25 11:32:35 PDT 2008
Hi,
Here is a minor patch to add support for some floating point
comparison cases that we missed.
-- Mon Ping
Index: lib/Target/X86/X86ISelLowering.cpp
===================================================================
--- lib/Target/X86/X86ISelLowering.cpp (revision 54030)
+++ lib/Target/X86/X86ISelLowering.cpp (working copy)
@@ -4772,6 +4772,7 @@
switch (SetCCOpcode) {
default: break;
+ case ISD::SETOEQ:
case ISD::SETEQ: SSECC = 0; break;
case ISD::SETOGT:
case ISD::SETGT: Swap = true; // Fallthrough
@@ -4782,7 +4783,7 @@
case ISD::SETLE:
case ISD::SETOLE: SSECC = 2; break;
case ISD::SETUO: SSECC = 3; break;
- case ISD::SETONE:
+ case ISD::SETUNE:
case ISD::SETNE: SSECC = 4; break;
case ISD::SETULE: Swap = true;
case ISD::SETUGE: SSECC = 5; break;
@@ -4795,13 +4796,19 @@
// In the one special case we can't handle, emit two comparisons.
if (SSECC == 8) {
- SDOperand UNORD, EQ;
-
- assert(SetCCOpcode == ISD::SETUEQ && "Illegal FP comparison");
-
- UNORD = DAG.getNode(Opc, VT, Op0, Op1, DAG.getConstant(3,
MVT::i8));
- EQ = DAG.getNode(Opc, VT, Op0, Op1, DAG.getConstant(0, MVT::i8));
- return DAG.getNode(ISD::OR, VT, UNORD, EQ);
+ if (SetCCOpcode == ISD::SETUEQ) {
+ SDOperand UNORD, EQ;
+ UNORD = DAG.getNode(Opc, VT, Op0, Op1, DAG.getConstant(3,
MVT::i8));
+ EQ = DAG.getNode(Opc, VT, Op0, Op1, DAG.getConstant(0,
MVT::i8));
+ return DAG.getNode(ISD::OR, VT, UNORD, EQ);
+ }
+ else if (SetCCOpcode == ISD::SETONE) {
+ SDOperand ORD, NEQ;
+ ORD = DAG.getNode(Opc, VT, Op0, Op1, DAG.getConstant(7,
MVT::i8));
+ NEQ = DAG.getNode(Opc, VT, Op0, Op1, DAG.getConstant(4,
MVT::i8));
+ return DAG.getNode(ISD::AND, VT, ORD, NEQ);
+ }
+ assert(0 && "Illegal FP comparison");
}
// Handle all other FP comparisons here.
return DAG.getNode(Opc, VT, Op0, Op1, DAG.getConstant(SSECC,
MVT::i8));
More information about the llvm-commits
mailing list