[llvm] dc69265 - [VE] setcc isel patterns

Simon Moll via llvm-commits llvm-commits at lists.llvm.org
Wed Jan 22 06:46:45 PST 2020


Author: Kazushi (Jam) Marukawa
Date: 2020-01-22T15:45:57+01:00
New Revision: dc69265eea888e8c6255aebcdd6650420dd00cfb

URL: https://github.com/llvm/llvm-project/commit/dc69265eea888e8c6255aebcdd6650420dd00cfb
DIFF: https://github.com/llvm/llvm-project/commit/dc69265eea888e8c6255aebcdd6650420dd00cfb.diff

LOG: [VE] setcc isel patterns

Summary: SETCC isel patterns and tests for i32/64 and fp32/64 comparison

Reviewers: arsenm, rengolin, craig.topper, k-ishizaka

Reviewed By: arsenm

Subscribers: merge_guards_bot, wdng, hiraditya, llvm-commits

Tags: #ve, #llvm

Differential Revision: https://reviews.llvm.org/D73171

Added: 
    llvm/test/CodeGen/VE/setccf32.ll
    llvm/test/CodeGen/VE/setccf32i.ll
    llvm/test/CodeGen/VE/setccf64.ll
    llvm/test/CodeGen/VE/setccf64i.ll
    llvm/test/CodeGen/VE/setcci32.ll
    llvm/test/CodeGen/VE/setcci32i.ll
    llvm/test/CodeGen/VE/setcci64.ll
    llvm/test/CodeGen/VE/setcci64i.ll

Modified: 
    llvm/lib/Target/VE/VEISelLowering.cpp
    llvm/lib/Target/VE/VEInstrInfo.td

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/VE/VEISelLowering.cpp b/llvm/lib/Target/VE/VEISelLowering.cpp
index 471d4c2c9ef8..46cbf57eb746 100644
--- a/llvm/lib/Target/VE/VEISelLowering.cpp
+++ b/llvm/lib/Target/VE/VEISelLowering.cpp
@@ -245,5 +245,5 @@ const char *VETargetLowering::getTargetNodeName(unsigned Opcode) const {
 
 EVT VETargetLowering::getSetCCResultType(const DataLayout &, LLVMContext &,
                                          EVT VT) const {
-  return MVT::i64;
+  return MVT::i32;
 }

diff  --git a/llvm/lib/Target/VE/VEInstrInfo.td b/llvm/lib/Target/VE/VEInstrInfo.td
index 82b6b0dd8bad..9fb0a866f326 100644
--- a/llvm/lib/Target/VE/VEInstrInfo.td
+++ b/llvm/lib/Target/VE/VEInstrInfo.td
@@ -37,6 +37,26 @@ def fplomsbzero : PatLeaf<(fpimm), [{ return (N->getValueAPF().bitcastToAPInt()
 def fplozero    : PatLeaf<(fpimm), [{ return (N->getValueAPF().bitcastToAPInt()
                                       .getZExtValue() & 0xffffffff) == 0; }]>;
 
+def CCSIOp : PatLeaf<(cond), [{
+  switch (N->get()) {
+  default:          return true;
+  case ISD::SETULT:
+  case ISD::SETULE:
+  case ISD::SETUGT:
+  case ISD::SETUGE: return false;
+  }
+}]>;
+
+def CCUIOp : PatLeaf<(cond), [{
+  switch (N->get()) {
+  default:         return true;
+  case ISD::SETLT:
+  case ISD::SETLE:
+  case ISD::SETGT:
+  case ISD::SETGE: return false;
+  }
+}]>;
+
 def LOFP32 : SDNodeXForm<fpimm, [{
   // Get a integer immediate from fpimm
   const APInt& imm = N->getValueAPF().bitcastToAPInt();
@@ -62,6 +82,54 @@ def HI32 : SDNodeXForm<imm, [{
                                    SDLoc(N), MVT::i32);
 }]>;
 
+def icond2cc : SDNodeXForm<cond, [{
+  VECC::CondCodes cc;
+  switch (N->get()) {
+  default:          llvm_unreachable("Unknown integer condition code!");
+  case ISD::SETEQ:  cc = VECC::CC_IEQ; break;
+  case ISD::SETNE:  cc = VECC::CC_INE; break;
+  case ISD::SETLT:  cc = VECC::CC_IL;  break;
+  case ISD::SETGT:  cc = VECC::CC_IG;  break;
+  case ISD::SETLE:  cc = VECC::CC_ILE; break;
+  case ISD::SETGE:  cc = VECC::CC_IGE; break;
+  case ISD::SETULT: cc = VECC::CC_IL;  break;
+  case ISD::SETULE: cc = VECC::CC_ILE; break;
+  case ISD::SETUGT: cc = VECC::CC_IG;  break;
+  case ISD::SETUGE: cc = VECC::CC_IGE; break;
+  }
+  return CurDAG->getTargetConstant(cc, SDLoc(N), MVT::i32);
+}]>;
+
+def fcond2cc : SDNodeXForm<cond, [{
+  VECC::CondCodes cc;
+  switch (N->get()) {
+  default:          llvm_unreachable("Unknown float condition code!");
+  case ISD::SETFALSE: cc = VECC::CC_AF;    break;
+  case ISD::SETEQ:
+  case ISD::SETOEQ:   cc = VECC::CC_EQ;    break;
+  case ISD::SETNE:
+  case ISD::SETONE:   cc = VECC::CC_NE;    break;
+  case ISD::SETLT:
+  case ISD::SETOLT:   cc = VECC::CC_L;     break;
+  case ISD::SETGT:
+  case ISD::SETOGT:   cc = VECC::CC_G;     break;
+  case ISD::SETLE:
+  case ISD::SETOLE:   cc = VECC::CC_LE;    break;
+  case ISD::SETGE:
+  case ISD::SETOGE:   cc = VECC::CC_GE;    break;
+  case ISD::SETO:     cc = VECC::CC_NUM;   break;
+  case ISD::SETUO:    cc = VECC::CC_NAN;   break;
+  case ISD::SETUEQ:   cc = VECC::CC_EQNAN; break;
+  case ISD::SETUNE:   cc = VECC::CC_NENAN; break;
+  case ISD::SETULT:   cc = VECC::CC_LNAN;  break;
+  case ISD::SETUGT:   cc = VECC::CC_GNAN;  break;
+  case ISD::SETULE:   cc = VECC::CC_LENAN; break;
+  case ISD::SETUGE:   cc = VECC::CC_GENAN; break;
+  case ISD::SETTRUE:  cc = VECC::CC_AT;    break;
+  }
+  return CurDAG->getTargetConstant(cc, SDLoc(N), MVT::i32);
+}]>;
+
 // ASX format of memory address
 def MEMri : Operand<iPTR> {
   let PrintMethod = "printMemASXOperand";
@@ -195,6 +263,14 @@ multiclass RRmrr<string opcStr, bits<8>opc, SDNode OpNode,
            { let cy = 1; let cz = 1; let hasSideEffects = 0; }
 }
 
+multiclass RRNDmrr<string opcStr, bits<8>opc,
+                 RegisterClass RCo, ValueType Tyo,
+                 RegisterClass RCi, ValueType Tyi> {
+  def rr : RR<opc, (outs RCo:$sx), (ins RCi:$sy, RCi:$sz),
+              !strconcat(opcStr, " $sx, $sy, $sz")>
+           { let cy = 1; let cz = 1; let hasSideEffects = 0; }
+}
+
 multiclass RRmri<string opcStr, bits<8>opc, SDNode OpNode,
                  RegisterClass RCo, ValueType Tyo,
                  RegisterClass RCi, ValueType Tyi, Operand immOp> {
@@ -258,6 +334,18 @@ multiclass RRm<string opcStr, bits<8>opc, SDNode OpNode,
   RRNDmrm<opcStr, opc, RC, Ty, RC, Ty, immOp2>,
   RRNDmim<opcStr, opc, RC, Ty, RC, Ty, immOp, immOp2>;
 
+// Used by cmp instruction
+//   The order of operands are "$sx, $sy, $sz"
+
+multiclass RRNDm<string opcStr, bits<8>opc,
+                 RegisterClass RC, ValueType Ty,
+                 Operand immOp, Operand immOp2> :
+  RRNDmrr<opcStr, opc, RC, Ty, RC, Ty>,
+  //RRNDmir<opcStr, opc, RC, Ty, RC, Ty, immOp>,
+  //RRNDmiz<opcStr, opc, RC, Ty, RC, Ty, immOp>,
+  RRNDmrm<opcStr, opc, RC, Ty, RC, Ty, immOp2>,
+  RRNDmim<opcStr, opc, RC, Ty, RC, Ty, immOp, immOp2>;
+
 // Multiclass for RR type instructions
 //   Used by sra, sla, sll, and similar instructions
 //   The order of operands are "$sx, $sz, $sy"
@@ -274,6 +362,22 @@ multiclass RRIm<string opcStr, bits<8>opc, SDNode OpNode,
   }
 }
 
+// Multiclass for RR type instructions
+//   Used by cmov instruction
+
+let Constraints = "$sx = $sd", DisableEncoding = "$sd" in
+multiclass RRCMOVm<string opcStr, bits<8>opc,
+               RegisterClass RC, ValueType Ty, Operand immOp, Operand immOp2> {
+  def rm0 : RR<
+    opc, (outs I64:$sx), (ins CCOp:$cf, RC:$sy, immOp2:$sz, I64:$sd),
+    !strconcat(opcStr, " $sx, (${sz})0, $sy")> {
+    let cy = 1;
+    let cz = 0;
+    let sz{6} = 1;
+    let hasSideEffects = 0;
+  }
+}
+
 // Branch multiclass
 let isBranch = 1, isTerminator = 1, hasDelaySlot = 1 in
 multiclass BCRm<string opcStr, string opcStrAt, bits<8> opc,
@@ -292,6 +396,20 @@ multiclass BCRm<string opcStr, string opcStrAt, bits<8> opc,
 // Instructions
 //===----------------------------------------------------------------------===//
 
+// CMOV instructions
+let cx = 0, cw = 0, cw2 = 0 in
+defm CMOVL : RRCMOVm<"cmov.l.${cf}", 0x3B, I64, i64, simm7Op64, uimm6Op64>;
+
+let cx = 0, cw = 1, cw2 = 0 in
+defm CMOVW : RRCMOVm<"cmov.w.${cf}", 0x3B, I32, i32, simm7Op64, uimm6Op32>;
+
+let cx = 0, cw = 0, cw2 = 1 in
+defm CMOVD : RRCMOVm<"cmov.d.${cf}", 0x3B, I64, f64, simm7Op64, uimm6Op64>;
+
+let cx = 0, cw = 1, cw2 = 1 in
+defm CMOVS : RRCMOVm<"cmov.s.${cf}", 0x3B, F32, f32, simm7Op64, uimm6Op32>;
+
+
 // LEA and LEASL instruction (load 32 bit imm to low or high part)
 let cx = 0 in
 defm LEA : RMm<"lea", 0x06, I64, i64, simm7Op64, simm32Op64>;
@@ -311,11 +429,27 @@ defm ADS : RRm<"adds.w.sx", 0x4A, add, I32, i32, simm7Op32, uimm6Op32>;
 let cx = 1 in
 defm ADSU : RRm<"adds.w.zx", 0x4A, add, I32, i32, simm7Op32, uimm6Op32>;
 
-
 // ADX instruction
 let cx = 0 in
 defm ADX : RRm<"adds.l", 0x59, add, I64, i64, simm7Op64, uimm6Op64>;
 
+// CMP instruction
+let cx = 0 in
+defm CMP : RRNDm<"cmpu.l", 0x55, I64, i64, simm7Op64, uimm6Op64>;
+let cx = 1 in
+defm CMPUW : RRNDm<"cmpu.w", 0x55, I32, i32, simm7Op32, uimm6Op32>;
+
+// CPS instruction
+let cx = 0 in
+defm CPS : RRNDm<"cmps.w.sx", 0x7A, I32, i32, simm7Op32, uimm6Op32>;
+let cx = 1 in
+defm CPSU : RRNDm<"cmps.w.zx", 0x7A, I32, i32, simm7Op32, uimm6Op32>;
+
+// CPX instruction
+let cx = 0 in
+defm CPX : RRNDm<"cmps.l", 0x6A, I64, i64, simm7Op64, uimm6Op64>;
+
+
 // 5.3.2.3. Logical Arithmetic Operation Instructions
 
 let cx = 0 in {
@@ -324,6 +458,7 @@ let cx = 0 in {
   let isCodeGenOnly = 1 in {
     defm AND32 : RRm<"and", 0x44, and, I32, i32, simm7Op32, uimm6Op32>;
     defm OR32 : RRm<"or", 0x45, or, I32, i32, simm7Op32, uimm6Op32>;
+    defm XOR32 : RRm<"xor", 0x46, xor, I32, i32, simm7Op32, uimm6Op32>;
   }
 }
 
@@ -340,6 +475,11 @@ defm SLL : RRIm<"sll", 0x65, shl, I64, i64, simm7Op32, uimm6Op64>;
 let cx = 0 in
 defm SLA : RRIm<"sla.w.sx", 0x66, shl, I32, i32, simm7Op32, uimm6Op32>;
 
+// FCP instruction
+let cx = 0 in
+defm FCP : RRNDm<"fcmp.d", 0x7E, I64, f64, simm7Op64, uimm6Op64>;
+let cx = 1 in
+defm FCPS : RRNDm<"fcmp.s", 0x7E, F32, f32, simm7Op32, uimm6Op32>;
 
 // Load and Store instructions
 // As 1st step, only uses sz and imm32 to represent $addr
@@ -488,6 +628,55 @@ def EXTEND_STACK_GUARD : Pseudo<(outs), (ins),
                                 "# EXTEND STACK GUARD",
                                 []>;
 
+// SETCC pattern matches
+//
+//   CMP  %tmp, lhs, rhs     ; compare lhs and rhs
+//   or   %res, 0, (0)1      ; initialize by 0
+//   CMOV %res, (63)0, %tmp  ; set 1 if %tmp is true
+
+def : Pat<(i32 (setcc i64:$LHS, i64:$RHS, CCSIOp:$cond)),
+          (EXTRACT_SUBREG
+              (CMOVLrm0 (icond2cc $cond),
+                        (CPXrr i64:$LHS, i64:$RHS),
+                        63,
+                        (ORim1 0, 0)), sub_i32)>;
+
+def : Pat<(i32 (setcc i64:$LHS, i64:$RHS, CCUIOp:$cond)),
+          (EXTRACT_SUBREG
+              (CMOVLrm0 (icond2cc $cond),
+                        (CMPrr i64:$LHS, i64:$RHS),
+                        63,
+                        (ORim1 0, 0)), sub_i32)>;
+
+def : Pat<(i32 (setcc i32:$LHS, i32:$RHS, CCSIOp:$cond)),
+          (EXTRACT_SUBREG
+              (CMOVWrm0 (icond2cc $cond),
+                        (CPSrr i32:$LHS, i32:$RHS),
+                        63,
+                        (ORim1 0, 0)), sub_i32)>;
+
+def : Pat<(i32 (setcc i32:$LHS, i32:$RHS, CCUIOp:$cond)),
+          (EXTRACT_SUBREG
+              (CMOVWrm0 (icond2cc $cond),
+                        (CMPUWrr i32:$LHS, i32:$RHS),
+                        63,
+                        (ORim1 0, 0)), sub_i32)>;
+
+def : Pat<(i32 (setcc f64:$LHS, f64:$RHS, cond:$cond)),
+          (EXTRACT_SUBREG
+              (CMOVDrm0 (fcond2cc $cond),
+                        (FCPrr f64:$LHS, f64:$RHS),
+                        63,
+                        (ORim1 0, 0)), sub_i32)>;
+
+def : Pat<(i32 (setcc f32:$LHS, f32:$RHS, cond:$cond)),
+          (EXTRACT_SUBREG
+              (CMOVSrm0 (fcond2cc $cond),
+                        (FCPSrr f32:$LHS, f32:$RHS),
+                        63,
+                        (ORim1 0, 0)), sub_i32)>;
+
+
 // Several special pattern matches to optimize code
 
 def : Pat<(i32 (and i32:$lhs, 0xff)),

diff  --git a/llvm/test/CodeGen/VE/setccf32.ll b/llvm/test/CodeGen/VE/setccf32.ll
new file mode 100644
index 000000000000..6ced8ce53b9c
--- /dev/null
+++ b/llvm/test/CodeGen/VE/setccf32.ll
@@ -0,0 +1,187 @@
+; RUN: llc < %s -mtriple=ve-unknown-unknown | FileCheck %s
+
+define zeroext i1 @setccaf(float, float) {
+; CHECK-LABEL: setccaf:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp false float %0, %1
+  ret i1 %3
+}
+
+define zeroext i1 @setccat(float, float) {
+; CHECK-LABEL: setccat:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    or %s0, 1, (0)1
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp true float %0, %1
+  ret i1 %3
+}
+
+define zeroext i1 @setccoeq(float, float) {
+; CHECK-LABEL: setccoeq:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    fcmp.s %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.s.eq %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp oeq float %0, %1
+  ret i1 %3
+}
+
+define zeroext i1 @setccone(float, float) {
+; CHECK-LABEL: setccone:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    fcmp.s %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.s.ne %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp one float %0, %1
+  ret i1 %3
+}
+
+define zeroext i1 @setccogt(float, float) {
+; CHECK-LABEL: setccogt:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    fcmp.s %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.s.gt %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp ogt float %0, %1
+  ret i1 %3
+}
+
+define zeroext i1 @setccoge(float, float) {
+; CHECK-LABEL: setccoge:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    fcmp.s %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.s.ge %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp oge float %0, %1
+  ret i1 %3
+}
+
+define zeroext i1 @setccolt(float, float) {
+; CHECK-LABEL: setccolt:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    fcmp.s %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.s.lt %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp olt float %0, %1
+  ret i1 %3
+}
+
+define zeroext i1 @setccole(float, float) {
+; CHECK-LABEL: setccole:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    fcmp.s %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.s.le %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp ole float %0, %1
+  ret i1 %3
+}
+
+define zeroext i1 @setccord(float, float) {
+; CHECK-LABEL: setccord:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    fcmp.s %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.s.num %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp ord float %0, %1
+  ret i1 %3
+}
+
+define zeroext i1 @setccuno(float, float) {
+; CHECK-LABEL: setccuno:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    fcmp.s %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.s.nan %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp uno float %0, %1
+  ret i1 %3
+}
+
+define zeroext i1 @setccueq(float, float) {
+; CHECK-LABEL: setccueq:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    fcmp.s %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.s.eqnan %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp ueq float %0, %1
+  ret i1 %3
+}
+
+define zeroext i1 @setccune(float, float) {
+; CHECK-LABEL: setccune:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    fcmp.s %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.s.nenan %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp une float %0, %1
+  ret i1 %3
+}
+
+define zeroext i1 @setccugt(float, float) {
+; CHECK-LABEL: setccugt:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    fcmp.s %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.s.gtnan %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp ugt float %0, %1
+  ret i1 %3
+}
+
+define zeroext i1 @setccuge(float, float) {
+; CHECK-LABEL: setccuge:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    fcmp.s %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.s.genan %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp uge float %0, %1
+  ret i1 %3
+}
+
+define zeroext i1 @setccult(float, float) {
+; CHECK-LABEL: setccult:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    fcmp.s %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.s.ltnan %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp ult float %0, %1
+  ret i1 %3
+}
+
+define zeroext i1 @setccule(float, float) {
+; CHECK-LABEL: setccule:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    fcmp.s %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.s.lenan %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp ule float %0, %1
+  ret i1 %3
+}

diff  --git a/llvm/test/CodeGen/VE/setccf32i.ll b/llvm/test/CodeGen/VE/setccf32i.ll
new file mode 100644
index 000000000000..44bd6717545a
--- /dev/null
+++ b/llvm/test/CodeGen/VE/setccf32i.ll
@@ -0,0 +1,211 @@
+; RUN: llc < %s -mtriple=ve-unknown-unknown | FileCheck %s
+
+define zeroext i1 @setccaf(float, float) {
+; CHECK-LABEL: setccaf:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp false float %0, 0.0
+  ret i1 %3
+}
+
+define zeroext i1 @setccat(float, float) {
+; CHECK-LABEL: setccat:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    or %s0, 1, (0)1
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp true float %0, 0.0
+  ret i1 %3
+}
+
+define zeroext i1 @setccoeq(float, float) {
+; CHECK-LABEL: setccoeq:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    lea.sl %s1, 0
+; CHECK-NEXT:    or %s1, 0, %s1
+; CHECK-NEXT:    fcmp.s %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.s.eq %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp oeq float %0, 0.0
+  ret i1 %3
+}
+
+define zeroext i1 @setccone(float, float) {
+; CHECK-LABEL: setccone:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    lea.sl %s1, 0
+; CHECK-NEXT:    or %s1, 0, %s1
+; CHECK-NEXT:    fcmp.s %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.s.ne %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp one float %0, 0.0
+  ret i1 %3
+}
+
+define zeroext i1 @setccogt(float, float) {
+; CHECK-LABEL: setccogt:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    lea.sl %s1, 0
+; CHECK-NEXT:    or %s1, 0, %s1
+; CHECK-NEXT:    fcmp.s %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.s.gt %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp ogt float %0, 0.0
+  ret i1 %3
+}
+
+define zeroext i1 @setccoge(float, float) {
+; CHECK-LABEL: setccoge:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    lea.sl %s1, 0
+; CHECK-NEXT:    or %s1, 0, %s1
+; CHECK-NEXT:    fcmp.s %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.s.ge %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp oge float %0, 0.0
+  ret i1 %3
+}
+
+define zeroext i1 @setccolt(float, float) {
+; CHECK-LABEL: setccolt:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    lea.sl %s1, 0
+; CHECK-NEXT:    or %s1, 0, %s1
+; CHECK-NEXT:    fcmp.s %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.s.lt %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp olt float %0, 0.0
+  ret i1 %3
+}
+
+define zeroext i1 @setccole(float, float) {
+; CHECK-LABEL: setccole:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    lea.sl %s1, 0
+; CHECK-NEXT:    or %s1, 0, %s1
+; CHECK-NEXT:    fcmp.s %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.s.le %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp ole float %0, 0.0
+  ret i1 %3
+}
+
+define zeroext i1 @setccord(float, float) {
+; CHECK-LABEL: setccord:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    fcmp.s %s1, %s0, %s0
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.s.num %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp ord float %0, 0.0
+  ret i1 %3
+}
+
+define zeroext i1 @setccuno(float, float) {
+; CHECK-LABEL: setccuno:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    fcmp.s %s1, %s0, %s0
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.s.nan %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp uno float %0, 0.0
+  ret i1 %3
+}
+
+define zeroext i1 @setccueq(float, float) {
+; CHECK-LABEL: setccueq:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    lea.sl %s1, 0
+; CHECK-NEXT:    or %s1, 0, %s1
+; CHECK-NEXT:    fcmp.s %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.s.eqnan %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp ueq float %0, 0.0
+  ret i1 %3
+}
+
+define zeroext i1 @setccune(float, float) {
+; CHECK-LABEL: setccune:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    lea.sl %s1, 0
+; CHECK-NEXT:    or %s1, 0, %s1
+; CHECK-NEXT:    fcmp.s %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.s.nenan %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp une float %0, 0.0
+  ret i1 %3
+}
+
+define zeroext i1 @setccugt(float, float) {
+; CHECK-LABEL: setccugt:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    lea.sl %s1, 0
+; CHECK-NEXT:    or %s1, 0, %s1
+; CHECK-NEXT:    fcmp.s %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.s.gtnan %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp ugt float %0, 0.0
+  ret i1 %3
+}
+
+define zeroext i1 @setccuge(float, float) {
+; CHECK-LABEL: setccuge:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    lea.sl %s1, 0
+; CHECK-NEXT:    or %s1, 0, %s1
+; CHECK-NEXT:    fcmp.s %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.s.genan %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp uge float %0, 0.0
+  ret i1 %3
+}
+
+define zeroext i1 @setccult(float, float) {
+; CHECK-LABEL: setccult:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    lea.sl %s1, 0
+; CHECK-NEXT:    or %s1, 0, %s1
+; CHECK-NEXT:    fcmp.s %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.s.ltnan %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp ult float %0, 0.0
+  ret i1 %3
+}
+
+define zeroext i1 @setccule(float, float) {
+; CHECK-LABEL: setccule:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    lea.sl %s1, 0
+; CHECK-NEXT:    or %s1, 0, %s1
+; CHECK-NEXT:    fcmp.s %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.s.lenan %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp ule float %0, 0.0
+  ret i1 %3
+}

diff  --git a/llvm/test/CodeGen/VE/setccf64.ll b/llvm/test/CodeGen/VE/setccf64.ll
new file mode 100644
index 000000000000..dca40e8231fa
--- /dev/null
+++ b/llvm/test/CodeGen/VE/setccf64.ll
@@ -0,0 +1,187 @@
+; RUN: llc < %s -mtriple=ve-unknown-unknown | FileCheck %s
+
+define zeroext i1 @setccaf(double, double) {
+; CHECK-LABEL: setccaf:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp false double %0, %1
+  ret i1 %3
+}
+
+define zeroext i1 @setccat(double, double) {
+; CHECK-LABEL: setccat:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    or %s0, 1, (0)1
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp true double %0, %1
+  ret i1 %3
+}
+
+define zeroext i1 @setccoeq(double, double) {
+; CHECK-LABEL: setccoeq:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    fcmp.d %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.d.eq %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp oeq double %0, %1
+  ret i1 %3
+}
+
+define zeroext i1 @setccone(double, double) {
+; CHECK-LABEL: setccone:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    fcmp.d %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.d.ne %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp one double %0, %1
+  ret i1 %3
+}
+
+define zeroext i1 @setccogt(double, double) {
+; CHECK-LABEL: setccogt:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    fcmp.d %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.d.gt %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp ogt double %0, %1
+  ret i1 %3
+}
+
+define zeroext i1 @setccoge(double, double) {
+; CHECK-LABEL: setccoge:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    fcmp.d %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.d.ge %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp oge double %0, %1
+  ret i1 %3
+}
+
+define zeroext i1 @setccolt(double, double) {
+; CHECK-LABEL: setccolt:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    fcmp.d %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.d.lt %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp olt double %0, %1
+  ret i1 %3
+}
+
+define zeroext i1 @setccole(double, double) {
+; CHECK-LABEL: setccole:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    fcmp.d %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.d.le %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp ole double %0, %1
+  ret i1 %3
+}
+
+define zeroext i1 @setccord(double, double) {
+; CHECK-LABEL: setccord:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    fcmp.d %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.d.num %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp ord double %0, %1
+  ret i1 %3
+}
+
+define zeroext i1 @setccuno(double, double) {
+; CHECK-LABEL: setccuno:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    fcmp.d %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.d.nan %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp uno double %0, %1
+  ret i1 %3
+}
+
+define zeroext i1 @setccueq(double, double) {
+; CHECK-LABEL: setccueq:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    fcmp.d %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.d.eqnan %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp ueq double %0, %1
+  ret i1 %3
+}
+
+define zeroext i1 @setccune(double, double) {
+; CHECK-LABEL: setccune:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    fcmp.d %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.d.nenan %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp une double %0, %1
+  ret i1 %3
+}
+
+define zeroext i1 @setccugt(double, double) {
+; CHECK-LABEL: setccugt:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    fcmp.d %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.d.gtnan %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp ugt double %0, %1
+  ret i1 %3
+}
+
+define zeroext i1 @setccuge(double, double) {
+; CHECK-LABEL: setccuge:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    fcmp.d %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.d.genan %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp uge double %0, %1
+  ret i1 %3
+}
+
+define zeroext i1 @setccult(double, double) {
+; CHECK-LABEL: setccult:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    fcmp.d %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.d.ltnan %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp ult double %0, %1
+  ret i1 %3
+}
+
+define zeroext i1 @setccule(double, double) {
+; CHECK-LABEL: setccule:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    fcmp.d %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.d.lenan %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp ule double %0, %1
+  ret i1 %3
+}

diff  --git a/llvm/test/CodeGen/VE/setccf64i.ll b/llvm/test/CodeGen/VE/setccf64i.ll
new file mode 100644
index 000000000000..59af1b4103f6
--- /dev/null
+++ b/llvm/test/CodeGen/VE/setccf64i.ll
@@ -0,0 +1,199 @@
+; RUN: llc < %s -mtriple=ve-unknown-unknown | FileCheck %s
+
+define zeroext i1 @setccaf(double, double) {
+; CHECK-LABEL: setccaf:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp false double %0, 0.0
+  ret i1 %3
+}
+
+define zeroext i1 @setccat(double, double) {
+; CHECK-LABEL: setccat:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    or %s0, 1, (0)1
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp true double %0, 0.0
+  ret i1 %3
+}
+
+define zeroext i1 @setccoeq(double, double) {
+; CHECK-LABEL: setccoeq:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    lea.sl %s1, 0
+; CHECK-NEXT:    fcmp.d %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.d.eq %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp oeq double %0, 0.0
+  ret i1 %3
+}
+
+define zeroext i1 @setccone(double, double) {
+; CHECK-LABEL: setccone:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    lea.sl %s1, 0
+; CHECK-NEXT:    fcmp.d %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.d.ne %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp one double %0, 0.0
+  ret i1 %3
+}
+
+define zeroext i1 @setccogt(double, double) {
+; CHECK-LABEL: setccogt:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    lea.sl %s1, 0
+; CHECK-NEXT:    fcmp.d %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.d.gt %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp ogt double %0, 0.0
+  ret i1 %3
+}
+
+define zeroext i1 @setccoge(double, double) {
+; CHECK-LABEL: setccoge:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    lea.sl %s1, 0
+; CHECK-NEXT:    fcmp.d %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.d.ge %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp oge double %0, 0.0
+  ret i1 %3
+}
+
+define zeroext i1 @setccolt(double, double) {
+; CHECK-LABEL: setccolt:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    lea.sl %s1, 0
+; CHECK-NEXT:    fcmp.d %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.d.lt %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp olt double %0, 0.0
+  ret i1 %3
+}
+
+define zeroext i1 @setccole(double, double) {
+; CHECK-LABEL: setccole:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    lea.sl %s1, 0
+; CHECK-NEXT:    fcmp.d %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.d.le %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp ole double %0, 0.0
+  ret i1 %3
+}
+
+define zeroext i1 @setccord(double, double) {
+; CHECK-LABEL: setccord:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    fcmp.d %s1, %s0, %s0
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.d.num %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp ord double %0, 0.0
+  ret i1 %3
+}
+
+define zeroext i1 @setccuno(double, double) {
+; CHECK-LABEL: setccuno:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    fcmp.d %s1, %s0, %s0
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.d.nan %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp uno double %0, 0.0
+  ret i1 %3
+}
+
+define zeroext i1 @setccueq(double, double) {
+; CHECK-LABEL: setccueq:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    lea.sl %s1, 0
+; CHECK-NEXT:    fcmp.d %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.d.eqnan %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp ueq double %0, 0.0
+  ret i1 %3
+}
+
+define zeroext i1 @setccune(double, double) {
+; CHECK-LABEL: setccune:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    lea.sl %s1, 0
+; CHECK-NEXT:    fcmp.d %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.d.nenan %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp une double %0, 0.0
+  ret i1 %3
+}
+
+define zeroext i1 @setccugt(double, double) {
+; CHECK-LABEL: setccugt:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    lea.sl %s1, 0
+; CHECK-NEXT:    fcmp.d %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.d.gtnan %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp ugt double %0, 0.0
+  ret i1 %3
+}
+
+define zeroext i1 @setccuge(double, double) {
+; CHECK-LABEL: setccuge:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    lea.sl %s1, 0
+; CHECK-NEXT:    fcmp.d %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.d.genan %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp uge double %0, 0.0
+  ret i1 %3
+}
+
+define zeroext i1 @setccult(double, double) {
+; CHECK-LABEL: setccult:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    lea.sl %s1, 0
+; CHECK-NEXT:    fcmp.d %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.d.ltnan %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp ult double %0, 0.0
+  ret i1 %3
+}
+
+define zeroext i1 @setccule(double, double) {
+; CHECK-LABEL: setccule:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    lea.sl %s1, 0
+; CHECK-NEXT:    fcmp.d %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.d.lenan %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = fcmp ule double %0, 0.0
+  ret i1 %3
+}

diff  --git a/llvm/test/CodeGen/VE/setcci32.ll b/llvm/test/CodeGen/VE/setcci32.ll
new file mode 100644
index 000000000000..7e92a2c7f5ed
--- /dev/null
+++ b/llvm/test/CodeGen/VE/setcci32.ll
@@ -0,0 +1,121 @@
+; RUN: llc < %s -mtriple=ve-unknown-unknown | FileCheck %s
+
+define zeroext i1 @setcceq(i32, i32) {
+; CHECK-LABEL: setcceq:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    cmps.w.sx %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.w.eq %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = icmp eq i32 %0, %1
+  ret i1 %3
+}
+
+define zeroext i1 @setccne(i32, i32) {
+; CHECK-LABEL: setccne:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    cmps.w.sx %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.w.ne %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = icmp ne i32 %0, %1
+  ret i1 %3
+}
+
+define zeroext i1 @setccugt(i32, i32) {
+; CHECK-LABEL: setccugt:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    cmpu.w %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.w.gt %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = icmp ugt i32 %0, %1
+  ret i1 %3
+}
+
+define zeroext i1 @setccuge(i32, i32) {
+; CHECK-LABEL: setccuge:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    cmpu.w %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.w.ge %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = icmp uge i32 %0, %1
+  ret i1 %3
+}
+
+define zeroext i1 @setccult(i32, i32) {
+; CHECK-LABEL: setccult:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    cmpu.w %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.w.lt %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = icmp ult i32 %0, %1
+  ret i1 %3
+}
+
+define zeroext i1 @setccule(i32, i32) {
+; CHECK-LABEL: setccule:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    cmpu.w %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.w.le %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = icmp ule i32 %0, %1
+  ret i1 %3
+}
+
+define zeroext i1 @setccsgt(i32, i32) {
+; CHECK-LABEL: setccsgt:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    cmps.w.sx %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.w.gt %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = icmp sgt i32 %0, %1
+  ret i1 %3
+}
+
+define zeroext i1 @setccsge(i32, i32) {
+; CHECK-LABEL: setccsge:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    cmps.w.sx %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.w.ge %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = icmp sge i32 %0, %1
+  ret i1 %3
+}
+
+define zeroext i1 @setccslt(i32, i32) {
+; CHECK-LABEL: setccslt:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    cmps.w.sx %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.w.lt %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = icmp slt i32 %0, %1
+  ret i1 %3
+}
+
+define zeroext i1 @setccsle(i32, i32) {
+; CHECK-LABEL: setccsle:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    cmps.w.sx %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.w.le %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = icmp sle i32 %0, %1
+  ret i1 %3
+}

diff  --git a/llvm/test/CodeGen/VE/setcci32i.ll b/llvm/test/CodeGen/VE/setcci32i.ll
new file mode 100644
index 000000000000..c0d1fb0a67e4
--- /dev/null
+++ b/llvm/test/CodeGen/VE/setcci32i.ll
@@ -0,0 +1,131 @@
+; RUN: llc < %s -mtriple=ve-unknown-unknown | FileCheck %s
+
+define zeroext i1 @setcceq(i32, i32) {
+; CHECK-LABEL: setcceq:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    or %s1, 12, (0)1
+; CHECK-NEXT:    cmps.w.sx %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.w.eq %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = icmp eq i32 %0, 12
+  ret i1 %3
+}
+
+define zeroext i1 @setccne(i32, i32) {
+; CHECK-LABEL: setccne:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    or %s1, 12, (0)1
+; CHECK-NEXT:    cmps.w.sx %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.w.ne %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = icmp ne i32 %0, 12
+  ret i1 %3
+}
+
+define zeroext i1 @setccugt(i32, i32) {
+; CHECK-LABEL: setccugt:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    or %s1, 12, (0)1
+; CHECK-NEXT:    cmpu.w %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.w.gt %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = icmp ugt i32 %0, 12
+  ret i1 %3
+}
+
+define zeroext i1 @setccuge(i32, i32) {
+; CHECK-LABEL: setccuge:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    or %s1, 11, (0)1
+; CHECK-NEXT:    cmpu.w %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.w.gt %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = icmp uge i32 %0, 12
+  ret i1 %3
+}
+
+define zeroext i1 @setccult(i32, i32) {
+; CHECK-LABEL: setccult:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    or %s1, 12, (0)1
+; CHECK-NEXT:    cmpu.w %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.w.lt %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = icmp ult i32 %0, 12
+  ret i1 %3
+}
+
+define zeroext i1 @setccule(i32, i32) {
+; CHECK-LABEL: setccule:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    or %s1, 13, (0)1
+; CHECK-NEXT:    cmpu.w %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.w.lt %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = icmp ule i32 %0, 12
+  ret i1 %3
+}
+
+define zeroext i1 @setccsgt(i32, i32) {
+; CHECK-LABEL: setccsgt:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    or %s1, 12, (0)1
+; CHECK-NEXT:    cmps.w.sx %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.w.gt %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = icmp sgt i32 %0, 12
+  ret i1 %3
+}
+
+define zeroext i1 @setccsge(i32, i32) {
+; CHECK-LABEL: setccsge:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    or %s1, 11, (0)1
+; CHECK-NEXT:    cmps.w.sx %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.w.gt %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = icmp sge i32 %0, 12
+  ret i1 %3
+}
+
+define zeroext i1 @setccslt(i32, i32) {
+; CHECK-LABEL: setccslt:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    or %s1, 12, (0)1
+; CHECK-NEXT:    cmps.w.sx %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.w.lt %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = icmp slt i32 %0, 12
+  ret i1 %3
+}
+
+define zeroext i1 @setccsle(i32, i32) {
+; CHECK-LABEL: setccsle:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    or %s1, 13, (0)1
+; CHECK-NEXT:    cmps.w.sx %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.w.lt %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = icmp sle i32 %0, 12
+  ret i1 %3
+}

diff  --git a/llvm/test/CodeGen/VE/setcci64.ll b/llvm/test/CodeGen/VE/setcci64.ll
new file mode 100644
index 000000000000..8b86601594da
--- /dev/null
+++ b/llvm/test/CodeGen/VE/setcci64.ll
@@ -0,0 +1,121 @@
+; RUN: llc < %s -mtriple=ve-unknown-unknown | FileCheck %s
+
+define zeroext i1 @setcceq(i64, i64) {
+; CHECK-LABEL: setcceq:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    cmps.l %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.l.eq %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = icmp eq i64 %0, %1
+  ret i1 %3
+}
+
+define zeroext i1 @setccne(i64, i64) {
+; CHECK-LABEL: setccne:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    cmps.l %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.l.ne %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = icmp ne i64 %0, %1
+  ret i1 %3
+}
+
+define zeroext i1 @setccugt(i64, i64) {
+; CHECK-LABEL: setccugt:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    cmpu.l %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.l.gt %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = icmp ugt i64 %0, %1
+  ret i1 %3
+}
+
+define zeroext i1 @setccuge(i64, i64) {
+; CHECK-LABEL: setccuge:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    cmpu.l %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.l.ge %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = icmp uge i64 %0, %1
+  ret i1 %3
+}
+
+define zeroext i1 @setccult(i64, i64) {
+; CHECK-LABEL: setccult:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    cmpu.l %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.l.lt %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = icmp ult i64 %0, %1
+  ret i1 %3
+}
+
+define zeroext i1 @setccule(i64, i64) {
+; CHECK-LABEL: setccule:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    cmpu.l %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.l.le %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = icmp ule i64 %0, %1
+  ret i1 %3
+}
+
+define zeroext i1 @setccsgt(i64, i64) {
+; CHECK-LABEL: setccsgt:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    cmps.l %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.l.gt %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = icmp sgt i64 %0, %1
+  ret i1 %3
+}
+
+define zeroext i1 @setccsge(i64, i64) {
+; CHECK-LABEL: setccsge:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    cmps.l %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.l.ge %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = icmp sge i64 %0, %1
+  ret i1 %3
+}
+
+define zeroext i1 @setccslt(i64, i64) {
+; CHECK-LABEL: setccslt:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    cmps.l %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.l.lt %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = icmp slt i64 %0, %1
+  ret i1 %3
+}
+
+define zeroext i1 @setccsle(i64, i64) {
+; CHECK-LABEL: setccsle:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    cmps.l %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.l.le %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = icmp sle i64 %0, %1
+  ret i1 %3
+}

diff  --git a/llvm/test/CodeGen/VE/setcci64i.ll b/llvm/test/CodeGen/VE/setcci64i.ll
new file mode 100644
index 000000000000..aecbe40b0a34
--- /dev/null
+++ b/llvm/test/CodeGen/VE/setcci64i.ll
@@ -0,0 +1,131 @@
+; RUN: llc < %s -mtriple=ve-unknown-unknown | FileCheck %s
+
+define zeroext i1 @setcceq(i64, i64) {
+; CHECK-LABEL: setcceq:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    or %s1, 12, (0)1
+; CHECK-NEXT:    cmps.l %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.l.eq %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = icmp eq i64 %0, 12
+  ret i1 %3
+}
+
+define zeroext i1 @setccne(i64, i64) {
+; CHECK-LABEL: setccne:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    or %s1, 12, (0)1
+; CHECK-NEXT:    cmps.l %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.l.ne %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = icmp ne i64 %0, 12
+  ret i1 %3
+}
+
+define zeroext i1 @setccugt(i64, i64) {
+; CHECK-LABEL: setccugt:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    or %s1, 12, (0)1
+; CHECK-NEXT:    cmpu.l %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.l.gt %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = icmp ugt i64 %0, 12
+  ret i1 %3
+}
+
+define zeroext i1 @setccuge(i64, i64) {
+; CHECK-LABEL: setccuge:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    or %s1, 11, (0)1
+; CHECK-NEXT:    cmpu.l %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.l.gt %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = icmp uge i64 %0, 12
+  ret i1 %3
+}
+
+define zeroext i1 @setccult(i64, i64) {
+; CHECK-LABEL: setccult:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    or %s1, 12, (0)1
+; CHECK-NEXT:    cmpu.l %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.l.lt %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = icmp ult i64 %0, 12
+  ret i1 %3
+}
+
+define zeroext i1 @setccule(i64, i64) {
+; CHECK-LABEL: setccule:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    or %s1, 13, (0)1
+; CHECK-NEXT:    cmpu.l %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.l.lt %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = icmp ule i64 %0, 12
+  ret i1 %3
+}
+
+define zeroext i1 @setccsgt(i64, i64) {
+; CHECK-LABEL: setccsgt:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    or %s1, 12, (0)1
+; CHECK-NEXT:    cmps.l %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.l.gt %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = icmp sgt i64 %0, 12
+  ret i1 %3
+}
+
+define zeroext i1 @setccsge(i64, i64) {
+; CHECK-LABEL: setccsge:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    or %s1, 11, (0)1
+; CHECK-NEXT:    cmps.l %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.l.gt %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = icmp sge i64 %0, 12
+  ret i1 %3
+}
+
+define zeroext i1 @setccslt(i64, i64) {
+; CHECK-LABEL: setccslt:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    or %s1, 12, (0)1
+; CHECK-NEXT:    cmps.l %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.l.lt %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = icmp slt i64 %0, 12
+  ret i1 %3
+}
+
+define zeroext i1 @setccsle(i64, i64) {
+; CHECK-LABEL: setccsle:
+; CHECK:       .LBB{{[0-9]+}}_2:
+; CHECK-NEXT:    or %s1, 13, (0)1
+; CHECK-NEXT:    cmps.l %s1, %s0, %s1
+; CHECK-NEXT:    or %s0, 0, (0)1
+; CHECK-NEXT:    cmov.l.lt %s0, (63)0, %s1
+; CHECK-NEXT:    # kill: def $sw0 killed $sw0 killed $sx0
+; CHECK-NEXT:    or %s11, 0, %s9
+  %3 = icmp sle i64 %0, 12
+  ret i1 %3
+}


        


More information about the llvm-commits mailing list