1//===- PPCInstrQPX.td - The PowerPC QPX Extension --*- tablegen -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file describes the QPX extension to the PowerPC instruction set. 11// Reference: 12// Book Q: QPX Architecture Definition. IBM (as updated in) 2011. 13// 14//===----------------------------------------------------------------------===// 15 16def PPCRegQFRCAsmOperand : AsmOperandClass { 17 let Name = "RegQFRC"; let PredicateMethod = "isRegNumber"; 18} 19def qfrc : RegisterOperand<QFRC> { 20 let ParserMatchClass = PPCRegQFRCAsmOperand; 21} 22def PPCRegQSRCAsmOperand : AsmOperandClass { 23 let Name = "RegQSRC"; let PredicateMethod = "isRegNumber"; 24} 25def qsrc : RegisterOperand<QSRC> { 26 let ParserMatchClass = PPCRegQSRCAsmOperand; 27} 28def PPCRegQBRCAsmOperand : AsmOperandClass { 29 let Name = "RegQBRC"; let PredicateMethod = "isRegNumber"; 30} 31def qbrc : RegisterOperand<QBRC> { 32 let ParserMatchClass = PPCRegQBRCAsmOperand; 33} 34 35//===----------------------------------------------------------------------===// 36// Helpers for defining instructions that directly correspond to intrinsics. 37 38// QPXA1_Int - A AForm_1 intrinsic definition. 39class QPXA1_Int<bits<6> opcode, bits<5> xo, string opc, Intrinsic IntID> 40 : AForm_1<opcode, xo, (outs qfrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB, qfrc:$FRC), 41 !strconcat(opc, " $FRT, $FRA, $FRC, $FRB"), IIC_FPFused, 42 [(set v4f64:$FRT, (IntID v4f64:$FRA, v4f64:$FRB, v4f64:$FRC))]>; 43// QPXA1s_Int - A AForm_1 intrinsic definition (simple instructions). 44class QPXA1s_Int<bits<6> opcode, bits<5> xo, string opc, Intrinsic IntID> 45 : AForm_1<opcode, xo, (outs qfrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB, qfrc:$FRC), 46 !strconcat(opc, " $FRT, $FRA, $FRC, $FRB"), IIC_VecPerm, 47 [(set v4f64:$FRT, (IntID v4f64:$FRA, v4f64:$FRB, v4f64:$FRC))]>; 48// QPXA2_Int - A AForm_2 intrinsic definition. 49class QPXA2_Int<bits<6> opcode, bits<5> xo, string opc, Intrinsic IntID> 50 : AForm_2<opcode, xo, (outs qfrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB), 51 !strconcat(opc, " $FRT, $FRA, $FRB"), IIC_FPGeneral, 52 [(set v4f64:$FRT, (IntID v4f64:$FRA, v4f64:$FRB))]>; 53// QPXA3_Int - A AForm_3 intrinsic definition. 54class QPXA3_Int<bits<6> opcode, bits<5> xo, string opc, Intrinsic IntID> 55 : AForm_3<opcode, xo, (outs qfrc:$FRT), (ins qfrc:$FRA, qfrc:$FRC), 56 !strconcat(opc, " $FRT, $FRA, $FRC"), IIC_FPGeneral, 57 [(set v4f64:$FRT, (IntID v4f64:$FRA, v4f64:$FRC))]>; 58// QPXA4_Int - A AForm_4a intrinsic definition. 59class QPXA4_Int<bits<6> opcode, bits<5> xo, string opc, Intrinsic IntID> 60 : AForm_4a<opcode, xo, (outs qfrc:$FRT), (ins qfrc:$FRB), 61 !strconcat(opc, " $FRT, $FRB"), IIC_FPGeneral, 62 [(set v4f64:$FRT, (IntID v4f64:$FRB))]>; 63// QPXX18_Int - A XForm_18 intrinsic definition. 64class QPXX18_Int<bits<6> opcode, bits<10> xo, string opc, Intrinsic IntID> 65 : XForm_18<opcode, xo, (outs qfrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB), 66 !strconcat(opc, " $FRT, $FRA, $FRB"), IIC_FPCompare, 67 [(set v4f64:$FRT, (IntID v4f64:$FRA, v4f64:$FRB))]>; 68// QPXX19_Int - A XForm_19 intrinsic definition. 69class QPXX19_Int<bits<6> opcode, bits<10> xo, string opc, Intrinsic IntID> 70 : XForm_19<opcode, xo, (outs qfrc:$FRT), (ins qfrc:$FRB), 71 !strconcat(opc, " $FRT, $FRB"), IIC_FPGeneral, 72 [(set v4f64:$FRT, (IntID v4f64:$FRB))]>; 73 74//===----------------------------------------------------------------------===// 75// Pattern Frags. 76 77def extloadv4f32 : PatFrag<(ops node:$ptr), (extload node:$ptr), [{ 78 return cast<LoadSDNode>(N)->getMemoryVT() == MVT::v4f32; 79}]>; 80 81def truncstorev4f32 : PatFrag<(ops node:$val, node:$ptr), 82 (truncstore node:$val, node:$ptr), [{ 83 return cast<StoreSDNode>(N)->getMemoryVT() == MVT::v4f32; 84}]>; 85def pre_truncstv4f32 : PatFrag<(ops node:$val, node:$base, node:$offset), 86 (pre_truncst node:$val, 87 node:$base, node:$offset), [{ 88 return cast<StoreSDNode>(N)->getMemoryVT() == MVT::v4f32; 89}]>; 90 91def fround_inexact : PatFrag<(ops node:$val), (fround node:$val), [{ 92 return cast<ConstantSDNode>(N->getOperand(1))->getZExtValue() == 0; 93}]>; 94 95def fround_exact : PatFrag<(ops node:$val), (fround node:$val), [{ 96 return cast<ConstantSDNode>(N->getOperand(1))->getZExtValue() == 1; 97}]>; 98 99let FastIselShouldIgnore = 1 in // FastIsel should ignore all u12 instrs. 100 def u12 : ImmLeaf<i32, [{ return (Imm & 0xFFF) == Imm; }]>; 101 102//===----------------------------------------------------------------------===// 103// Instruction Definitions. 104 105def HasQPX : Predicate<"PPCSubTarget->hasQPX()">; 106let Predicates = [HasQPX] in { 107let DecoderNamespace = "QPX" in { 108let hasSideEffects = 0 in { // QPX instructions don't have side effects. 109let Uses = [RM] in { 110 // Add Instructions 111 let isCommutable = 1 in { 112 def QVFADD : AForm_2<4, 21, 113 (outs qfrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB), 114 "qvfadd $FRT, $FRA, $FRB", IIC_FPGeneral, 115 [(set v4f64:$FRT, (fadd v4f64:$FRA, v4f64:$FRB))]>; 116 let isCodeGenOnly = 1 in 117 def QVFADDS : QPXA2_Int<0, 21, "qvfadds", int_ppc_qpx_qvfadds>; 118 def QVFADDSs : AForm_2<0, 21, 119 (outs qsrc:$FRT), (ins qsrc:$FRA, qsrc:$FRB), 120 "qvfadds $FRT, $FRA, $FRB", IIC_FPGeneral, 121 [(set v4f32:$FRT, (fadd v4f32:$FRA, v4f32:$FRB))]>; 122 } 123 def QVFSUB : AForm_2<4, 20, 124 (outs qfrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB), 125 "qvfsub $FRT, $FRA, $FRB", IIC_FPGeneral, 126 [(set v4f64:$FRT, (fsub v4f64:$FRA, v4f64:$FRB))]>; 127 let isCodeGenOnly = 1 in 128 def QVFSUBS : QPXA2_Int<0, 20, "qvfsubs", int_ppc_qpx_qvfsubs>; 129 def QVFSUBSs : AForm_2<0, 20, 130 (outs qsrc:$FRT), (ins qsrc:$FRA, qsrc:$FRB), 131 "qvfsubs $FRT, $FRA, $FRB", IIC_FPGeneral, 132 [(set v4f32:$FRT, (fsub v4f32:$FRA, v4f32:$FRB))]>; 133 134 // Estimate Instructions 135 def QVFRE : AForm_4a<4, 24, (outs qfrc:$FRT), (ins qfrc:$FRB), 136 "qvfre $FRT, $FRB", IIC_FPGeneral, 137 [(set v4f64:$FRT, (PPCfre v4f64:$FRB))]>; 138 def QVFRES : QPXA4_Int<0, 24, "qvfres", int_ppc_qpx_qvfres>; 139 let isCodeGenOnly = 1 in 140 def QVFRESs : AForm_4a<0, 24, (outs qsrc:$FRT), (ins qsrc:$FRB), 141 "qvfres $FRT, $FRB", IIC_FPGeneral, 142 [(set v4f32:$FRT, (PPCfre v4f32:$FRB))]>; 143 144 def QVFRSQRTE : AForm_4a<4, 26, (outs qfrc:$FRT), (ins qfrc:$FRB), 145 "qvfrsqrte $FRT, $FRB", IIC_FPGeneral, 146 [(set v4f64:$FRT, (PPCfrsqrte v4f64:$FRB))]>; 147 def QVFRSQRTES : QPXA4_Int<0, 26, "qvfrsqrtes", int_ppc_qpx_qvfrsqrtes>; 148 let isCodeGenOnly = 1 in 149 def QVFRSQRTESs : AForm_4a<0, 26, (outs qsrc:$FRT), (ins qsrc:$FRB), 150 "qvfrsqrtes $FRT, $FRB", IIC_FPGeneral, 151 [(set v4f32:$FRT, (PPCfrsqrte v4f32:$FRB))]>; 152 153 // Multiply Instructions 154 let isCommutable = 1 in { 155 def QVFMUL : AForm_3<4, 25, 156 (outs qfrc:$FRT), (ins qfrc:$FRA, qfrc:$FRC), 157 "qvfmul $FRT, $FRA, $FRC", IIC_FPGeneral, 158 [(set v4f64:$FRT, (fmul v4f64:$FRA, v4f64:$FRC))]>; 159 let isCodeGenOnly = 1 in 160 def QVFMULS : QPXA3_Int<0, 25, "qvfmuls", int_ppc_qpx_qvfmuls>; 161 def QVFMULSs : AForm_3<0, 25, 162 (outs qsrc:$FRT), (ins qsrc:$FRA, qsrc:$FRC), 163 "qvfmuls $FRT, $FRA, $FRC", IIC_FPGeneral, 164 [(set v4f32:$FRT, (fmul v4f32:$FRA, v4f32:$FRC))]>; 165 } 166 def QVFXMUL : QPXA3_Int<4, 17, "qvfxmul", int_ppc_qpx_qvfxmul>; 167 def QVFXMULS : QPXA3_Int<0, 17, "qvfxmuls", int_ppc_qpx_qvfxmuls>; 168 169 // Multiply-add instructions 170 def QVFMADD : AForm_1<4, 29, 171 (outs qfrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB, qfrc:$FRC), 172 "qvfmadd $FRT, $FRA, $FRC, $FRB", IIC_FPFused, 173 [(set v4f64:$FRT, (fma v4f64:$FRA, v4f64:$FRC, v4f64:$FRB))]>; 174 let isCodeGenOnly = 1 in 175 def QVFMADDS : QPXA1_Int<0, 29, "qvfmadds", int_ppc_qpx_qvfmadds>; 176 def QVFMADDSs : AForm_1<0, 29, 177 (outs qsrc:$FRT), (ins qsrc:$FRA, qsrc:$FRB, qsrc:$FRC), 178 "qvfmadds $FRT, $FRA, $FRC, $FRB", IIC_FPFused, 179 [(set v4f32:$FRT, (fma v4f32:$FRA, v4f32:$FRC, v4f32:$FRB))]>; 180 def QVFNMADD : AForm_1<4, 31, 181 (outs qfrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB, qfrc:$FRC), 182 "qvfnmadd $FRT, $FRA, $FRC, $FRB", IIC_FPFused, 183 [(set v4f64:$FRT, (fneg (fma v4f64:$FRA, v4f64:$FRC, 184 v4f64:$FRB)))]>; 185 let isCodeGenOnly = 1 in 186 def QVFNMADDS : QPXA1_Int<0, 31, "qvfnmadds", int_ppc_qpx_qvfnmadds>; 187 def QVFNMADDSs : AForm_1<0, 31, 188 (outs qsrc:$FRT), (ins qsrc:$FRA, qsrc:$FRB, qsrc:$FRC), 189 "qvfnmadds $FRT, $FRA, $FRC, $FRB", IIC_FPFused, 190 [(set v4f32:$FRT, (fneg (fma v4f32:$FRA, v4f32:$FRC, 191 v4f32:$FRB)))]>; 192 def QVFMSUB : AForm_1<4, 28, 193 (outs qfrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB, qfrc:$FRC), 194 "qvfmsub $FRT, $FRA, $FRC, $FRB", IIC_FPFused, 195 [(set v4f64:$FRT, (fma v4f64:$FRA, v4f64:$FRC, 196 (fneg v4f64:$FRB)))]>; 197 let isCodeGenOnly = 1 in 198 def QVFMSUBS : QPXA1_Int<0, 28, "qvfmsubs", int_ppc_qpx_qvfmsubs>; 199 def QVFMSUBSs : AForm_1<0, 28, 200 (outs qsrc:$FRT), (ins qsrc:$FRA, qsrc:$FRB, qsrc:$FRC), 201 "qvfmsubs $FRT, $FRA, $FRC, $FRB", IIC_FPFused, 202 [(set v4f32:$FRT, (fma v4f32:$FRA, v4f32:$FRC, 203 (fneg v4f32:$FRB)))]>; 204 def QVFNMSUB : AForm_1<4, 30, 205 (outs qfrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB, qfrc:$FRC), 206 "qvfnmsub $FRT, $FRA, $FRC, $FRB", IIC_FPFused, 207 [(set v4f64:$FRT, (fneg (fma v4f64:$FRA, v4f64:$FRC, 208 (fneg v4f64:$FRB))))]>; 209 let isCodeGenOnly = 1 in 210 def QVFNMSUBS : QPXA1_Int<0, 30, "qvfnmsubs", int_ppc_qpx_qvfnmsubs>; 211 def QVFNMSUBSs : AForm_1<0, 30, 212 (outs qsrc:$FRT), (ins qsrc:$FRA, qsrc:$FRB, qsrc:$FRC), 213 "qvfnmsubs $FRT, $FRA, $FRC, $FRB", IIC_FPFused, 214 [(set v4f32:$FRT, (fneg (fma v4f32:$FRA, v4f32:$FRC, 215 (fneg v4f32:$FRB))))]>; 216 def QVFXMADD : QPXA1_Int<4, 9, "qvfxmadd", int_ppc_qpx_qvfxmadd>; 217 def QVFXMADDS : QPXA1_Int<0, 9, "qvfxmadds", int_ppc_qpx_qvfxmadds>; 218 def QVFXXNPMADD : QPXA1_Int<4, 11, "qvfxxnpmadd", int_ppc_qpx_qvfxxnpmadd>; 219 def QVFXXNPMADDS : QPXA1_Int<0, 11, "qvfxxnpmadds", int_ppc_qpx_qvfxxnpmadds>; 220 def QVFXXCPNMADD : QPXA1_Int<4, 3, "qvfxxcpnmadd", int_ppc_qpx_qvfxxcpnmadd>; 221 def QVFXXCPNMADDS : QPXA1_Int<0, 3, "qvfxxcpnmadds", int_ppc_qpx_qvfxxcpnmadds>; 222 def QVFXXMADD : QPXA1_Int<4, 1, "qvfxxmadd", int_ppc_qpx_qvfxxmadd>; 223 def QVFXXMADDS : QPXA1_Int<0, 1, "qvfxxmadds", int_ppc_qpx_qvfxxmadds>; 224 225 // Select Instruction 226 let isCodeGenOnly = 1 in 227 def QVFSEL : QPXA1s_Int<4, 23, "qvfsel", int_ppc_qpx_qvfsel>; 228 def QVFSELb : AForm_1<4, 23, (outs qfrc:$FRT), 229 (ins qbrc:$FRA, qfrc:$FRB, qfrc:$FRC), 230 "qvfsel $FRT, $FRA, $FRC, $FRB", IIC_VecPerm, 231 [(set v4f64:$FRT, (vselect v4i1:$FRA, 232 v4f64:$FRC, v4f64:$FRB))]>; 233 let isCodeGenOnly = 1 in 234 def QVFSELbs : AForm_1<4, 23, (outs qsrc:$FRT), 235 (ins qbrc:$FRA, qsrc:$FRB, qsrc:$FRC), 236 "qvfsel $FRT, $FRA, $FRC, $FRB", IIC_VecPerm, 237 [(set v4f32:$FRT, (vselect v4i1:$FRA, 238 v4f32:$FRC, v4f32:$FRB))]>; 239 let isCodeGenOnly = 1 in 240 def QVFSELbb: AForm_1<4, 23, (outs qbrc:$FRT), 241 (ins qbrc:$FRA, qbrc:$FRB, qbrc:$FRC), 242 "qvfsel $FRT, $FRA, $FRC, $FRB", IIC_VecPerm, 243 [(set v4i1:$FRT, (vselect v4i1:$FRA, 244 v4i1:$FRC, v4i1:$FRB))]>; 245 246 // SELECT_CC_* - Used to implement the SELECT_CC DAG operation. Expanded after 247 // instruction selection into a branch sequence. 248 let usesCustomInserter = 1 in { 249 def SELECT_CC_QFRC: Pseudo<(outs qfrc:$dst), (ins crrc:$cond, qfrc:$T, qfrc:$F, 250 i32imm:$BROPC), "#SELECT_CC_QFRC", 251 []>; 252 def SELECT_CC_QSRC: Pseudo<(outs qsrc:$dst), (ins crrc:$cond, qsrc:$T, qsrc:$F, 253 i32imm:$BROPC), "#SELECT_CC_QSRC", 254 []>; 255 def SELECT_CC_QBRC: Pseudo<(outs qbrc:$dst), (ins crrc:$cond, qbrc:$T, qbrc:$F, 256 i32imm:$BROPC), "#SELECT_CC_QBRC", 257 []>; 258 259 // SELECT_* pseudo instructions, like SELECT_CC_* but taking condition 260 // register bit directly. 261 def SELECT_QFRC: Pseudo<(outs qfrc:$dst), (ins crbitrc:$cond, 262 qfrc:$T, qfrc:$F), "#SELECT_QFRC", 263 [(set v4f64:$dst, 264 (select i1:$cond, v4f64:$T, v4f64:$F))]>; 265 def SELECT_QSRC: Pseudo<(outs qsrc:$dst), (ins crbitrc:$cond, 266 qsrc:$T, qsrc:$F), "#SELECT_QSRC", 267 [(set v4f32:$dst, 268 (select i1:$cond, v4f32:$T, v4f32:$F))]>; 269 def SELECT_QBRC: Pseudo<(outs qbrc:$dst), (ins crbitrc:$cond, 270 qbrc:$T, qbrc:$F), "#SELECT_QBRC", 271 [(set v4i1:$dst, 272 (select i1:$cond, v4i1:$T, v4i1:$F))]>; 273 } 274 275 // Convert and Round Instructions 276 def QVFCTID : QPXX19_Int<4, 814, "qvfctid", int_ppc_qpx_qvfctid>; 277 let isCodeGenOnly = 1 in 278 def QVFCTIDb : XForm_19<4, 814, (outs qbrc:$FRT), (ins qbrc:$FRB), 279 "qvfctid $FRT, $FRB", IIC_FPGeneral, []>; 280 281 def QVFCTIDU : QPXX19_Int<4, 942, "qvfctidu", int_ppc_qpx_qvfctidu>; 282 def QVFCTIDZ : QPXX19_Int<4, 815, "qvfctidz", int_ppc_qpx_qvfctidz>; 283 def QVFCTIDUZ : QPXX19_Int<4, 943, "qvfctiduz", int_ppc_qpx_qvfctiduz>; 284 def QVFCTIW : QPXX19_Int<4, 14, "qvfctiw", int_ppc_qpx_qvfctiw>; 285 def QVFCTIWU : QPXX19_Int<4, 142, "qvfctiwu", int_ppc_qpx_qvfctiwu>; 286 def QVFCTIWZ : QPXX19_Int<4, 15, "qvfctiwz", int_ppc_qpx_qvfctiwz>; 287 def QVFCTIWUZ : QPXX19_Int<4, 143, "qvfctiwuz", int_ppc_qpx_qvfctiwuz>; 288 def QVFCFID : QPXX19_Int<4, 846, "qvfcfid", int_ppc_qpx_qvfcfid>; 289 let isCodeGenOnly = 1 in 290 def QVFCFIDb : XForm_19<4, 846, (outs qbrc:$FRT), (ins qbrc:$FRB), 291 "qvfcfid $FRT, $FRB", IIC_FPGeneral, []>; 292 293 def QVFCFIDU : QPXX19_Int<4, 974, "qvfcfidu", int_ppc_qpx_qvfcfidu>; 294 def QVFCFIDS : QPXX19_Int<0, 846, "qvfcfids", int_ppc_qpx_qvfcfids>; 295 def QVFCFIDUS : QPXX19_Int<0, 974, "qvfcfidus", int_ppc_qpx_qvfcfidus>; 296 297 let isCodeGenOnly = 1 in 298 def QVFRSP : QPXX19_Int<4, 12, "qvfrsp", int_ppc_qpx_qvfrsp>; 299 def QVFRSPs : XForm_19<4, 12, 300 (outs qsrc:$FRT), (ins qfrc:$FRB), 301 "qvfrsp $FRT, $FRB", IIC_FPGeneral, 302 [(set v4f32:$FRT, (fround_inexact v4f64:$FRB))]>; 303 304 def QVFRIZ : XForm_19<4, 424, (outs qfrc:$FRT), (ins qfrc:$FRB), 305 "qvfriz $FRT, $FRB", IIC_FPGeneral, 306 [(set v4f64:$FRT, (ftrunc v4f64:$FRB))]>; 307 let isCodeGenOnly = 1 in 308 def QVFRIZs : XForm_19<4, 424, (outs qsrc:$FRT), (ins qsrc:$FRB), 309 "qvfriz $FRT, $FRB", IIC_FPGeneral, 310 [(set v4f32:$FRT, (ftrunc v4f32:$FRB))]>; 311 312 def QVFRIN : XForm_19<4, 392, (outs qfrc:$FRT), (ins qfrc:$FRB), 313 "qvfrin $FRT, $FRB", IIC_FPGeneral, 314 [(set v4f64:$FRT, (frnd v4f64:$FRB))]>; 315 let isCodeGenOnly = 1 in 316 def QVFRINs : XForm_19<4, 392, (outs qsrc:$FRT), (ins qsrc:$FRB), 317 "qvfrin $FRT, $FRB", IIC_FPGeneral, 318 [(set v4f32:$FRT, (frnd v4f32:$FRB))]>; 319 320 def QVFRIP : XForm_19<4, 456, (outs qfrc:$FRT), (ins qfrc:$FRB), 321 "qvfrip $FRT, $FRB", IIC_FPGeneral, 322 [(set v4f64:$FRT, (fceil v4f64:$FRB))]>; 323 let isCodeGenOnly = 1 in 324 def QVFRIPs : XForm_19<4, 456, (outs qsrc:$FRT), (ins qsrc:$FRB), 325 "qvfrip $FRT, $FRB", IIC_FPGeneral, 326 [(set v4f32:$FRT, (fceil v4f32:$FRB))]>; 327 328 def QVFRIM : XForm_19<4, 488, (outs qfrc:$FRT), (ins qfrc:$FRB), 329 "qvfrim $FRT, $FRB", IIC_FPGeneral, 330 [(set v4f64:$FRT, (ffloor v4f64:$FRB))]>; 331 let isCodeGenOnly = 1 in 332 def QVFRIMs : XForm_19<4, 488, (outs qsrc:$FRT), (ins qsrc:$FRB), 333 "qvfrim $FRT, $FRB", IIC_FPGeneral, 334 [(set v4f32:$FRT, (ffloor v4f32:$FRB))]>; 335 336 // Move Instructions 337 def QVFMR : XForm_19<4, 72, 338 (outs qfrc:$FRT), (ins qfrc:$FRB), 339 "qvfmr $FRT, $FRB", IIC_VecPerm, 340 [/* (set v4f64:$FRT, v4f64:$FRB) */]>; 341 let isCodeGenOnly = 1 in { 342 def QVFMRs : XForm_19<4, 72, 343 (outs qsrc:$FRT), (ins qsrc:$FRB), 344 "qvfmr $FRT, $FRB", IIC_VecPerm, 345 [/* (set v4f32:$FRT, v4f32:$FRB) */]>; 346 def QVFMRb : XForm_19<4, 72, 347 (outs qbrc:$FRT), (ins qbrc:$FRB), 348 "qvfmr $FRT, $FRB", IIC_VecPerm, 349 [/* (set v4i1:$FRT, v4i1:$FRB) */]>; 350 } 351 def QVFNEG : XForm_19<4, 40, 352 (outs qfrc:$FRT), (ins qfrc:$FRB), 353 "qvfneg $FRT, $FRB", IIC_VecPerm, 354 [(set v4f64:$FRT, (fneg v4f64:$FRB))]>; 355 let isCodeGenOnly = 1 in 356 def QVFNEGs : XForm_19<4, 40, 357 (outs qsrc:$FRT), (ins qsrc:$FRB), 358 "qvfneg $FRT, $FRB", IIC_VecPerm, 359 [(set v4f32:$FRT, (fneg v4f32:$FRB))]>; 360 def QVFABS : XForm_19<4, 264, 361 (outs qfrc:$FRT), (ins qfrc:$FRB), 362 "qvfabs $FRT, $FRB", IIC_VecPerm, 363 [(set v4f64:$FRT, (fabs v4f64:$FRB))]>; 364 let isCodeGenOnly = 1 in 365 def QVFABSs : XForm_19<4, 264, 366 (outs qsrc:$FRT), (ins qsrc:$FRB), 367 "qvfabs $FRT, $FRB", IIC_VecPerm, 368 [(set v4f32:$FRT, (fabs v4f32:$FRB))]>; 369 def QVFNABS : XForm_19<4, 136, 370 (outs qfrc:$FRT), (ins qfrc:$FRB), 371 "qvfnabs $FRT, $FRB", IIC_VecPerm, 372 [(set v4f64:$FRT, (fneg (fabs v4f64:$FRB)))]>; 373 let isCodeGenOnly = 1 in 374 def QVFNABSs : XForm_19<4, 136, 375 (outs qsrc:$FRT), (ins qsrc:$FRB), 376 "qvfnabs $FRT, $FRB", IIC_VecPerm, 377 [(set v4f32:$FRT, (fneg (fabs v4f32:$FRB)))]>; 378 def QVFCPSGN : XForm_18<4, 8, 379 (outs qfrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB), 380 "qvfcpsgn $FRT, $FRA, $FRB", IIC_VecPerm, 381 [(set v4f64:$FRT, (fcopysign v4f64:$FRB, v4f64:$FRA))]>; 382 let isCodeGenOnly = 1 in 383 def QVFCPSGNs : XForm_18<4, 8, 384 (outs qsrc:$FRT), (ins qsrc:$FRA, qsrc:$FRB), 385 "qvfcpsgn $FRT, $FRA, $FRB", IIC_VecPerm, 386 [(set v4f32:$FRT, (fcopysign v4f32:$FRB, v4f32:$FRA))]>; 387 388 def QVALIGNI : Z23Form_1<4, 5, 389 (outs qfrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB, u2imm:$idx), 390 "qvaligni $FRT, $FRA, $FRB, $idx", IIC_VecPerm, 391 [(set v4f64:$FRT, 392 (PPCqvaligni v4f64:$FRA, v4f64:$FRB, 393 (i32 imm:$idx)))]>; 394 let isCodeGenOnly = 1 in 395 def QVALIGNIs : Z23Form_1<4, 5, 396 (outs qsrc:$FRT), (ins qsrc:$FRA, qsrc:$FRB, u2imm:$idx), 397 "qvaligni $FRT, $FRA, $FRB, $idx", IIC_VecPerm, 398 [(set v4f32:$FRT, 399 (PPCqvaligni v4f32:$FRA, v4f32:$FRB, 400 (i32 imm:$idx)))]>; 401 let isCodeGenOnly = 1 in 402 def QVALIGNIb : Z23Form_1<4, 5, 403 (outs qbrc:$FRT), (ins qbrc:$FRA, qbrc:$FRB, u2imm:$idx), 404 "qvaligni $FRT, $FRA, $FRB, $idx", IIC_VecPerm, 405 [(set v4i1:$FRT, 406 (PPCqvaligni v4i1:$FRA, v4i1:$FRB, 407 (i32 imm:$idx)))]>; 408 409 def QVESPLATI : Z23Form_2<4, 37, 410 (outs qfrc:$FRT), (ins qfrc:$FRA, u2imm:$idx), 411 "qvesplati $FRT, $FRA, $idx", IIC_VecPerm, 412 [(set v4f64:$FRT, 413 (PPCqvesplati v4f64:$FRA, (i32 imm:$idx)))]>; 414 let isCodeGenOnly = 1 in 415 def QVESPLATIs : Z23Form_2<4, 37, 416 (outs qsrc:$FRT), (ins qsrc:$FRA, u2imm:$idx), 417 "qvesplati $FRT, $FRA, $idx", IIC_VecPerm, 418 [(set v4f32:$FRT, 419 (PPCqvesplati v4f32:$FRA, (i32 imm:$idx)))]>; 420 let isCodeGenOnly = 1 in 421 def QVESPLATIb : Z23Form_2<4, 37, 422 (outs qbrc:$FRT), (ins qbrc:$FRA, u2imm:$idx), 423 "qvesplati $FRT, $FRA, $idx", IIC_VecPerm, 424 [(set v4i1:$FRT, 425 (PPCqvesplati v4i1:$FRA, (i32 imm:$idx)))]>; 426 427 def QVFPERM : AForm_1<4, 6, 428 (outs qfrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB, qfrc:$FRC), 429 "qvfperm $FRT, $FRA, $FRB, $FRC", IIC_VecPerm, 430 [(set v4f64:$FRT, 431 (PPCqvfperm v4f64:$FRA, v4f64:$FRB, v4f64:$FRC))]>; 432 let isCodeGenOnly = 1 in 433 def QVFPERMs : AForm_1<4, 6, 434 (outs qsrc:$FRT), (ins qsrc:$FRA, qsrc:$FRB, qfrc:$FRC), 435 "qvfperm $FRT, $FRA, $FRB, $FRC", IIC_VecPerm, 436 [(set v4f32:$FRT, 437 (PPCqvfperm v4f32:$FRA, v4f32:$FRB, v4f64:$FRC))]>; 438 439 let isReMaterializable = 1, isAsCheapAsAMove = 1 in 440 def QVGPCI : Z23Form_3<4, 133, 441 (outs qfrc:$FRT), (ins u12imm:$idx), 442 "qvgpci $FRT, $idx", IIC_VecPerm, 443 [(set v4f64:$FRT, (PPCqvgpci (u12:$idx)))]>; 444 445 // Compare Instruction 446 let isCodeGenOnly = 1 in 447 def QVFTSTNAN : QPXX18_Int<4, 64, "qvftstnan", int_ppc_qpx_qvftstnan>; 448 def QVFTSTNANb : XForm_18<4, 64, (outs qbrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB), 449 "qvftstnan $FRT, $FRA, $FRB", IIC_FPCompare, 450 [(set v4i1:$FRT, 451 (setcc v4f64:$FRA, v4f64:$FRB, SETUO))]>; 452 let isCodeGenOnly = 1 in 453 def QVFTSTNANbs : XForm_18<4, 64, (outs qbrc:$FRT), (ins qsrc:$FRA, qsrc:$FRB), 454 "qvftstnan $FRT, $FRA, $FRB", IIC_FPCompare, 455 [(set v4i1:$FRT, 456 (setcc v4f32:$FRA, v4f32:$FRB, SETUO))]>; 457 let isCodeGenOnly = 1 in 458 def QVFCMPLT : QPXX18_Int<4, 96, "qvfcmplt", int_ppc_qpx_qvfcmplt>; 459 def QVFCMPLTb : XForm_18<4, 96, (outs qbrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB), 460 "qvfcmplt $FRT, $FRA, $FRB", IIC_FPCompare, 461 [(set v4i1:$FRT, 462 (setcc v4f64:$FRA, v4f64:$FRB, SETOLT))]>; 463 let isCodeGenOnly = 1 in 464 def QVFCMPLTbs : XForm_18<4, 96, (outs qbrc:$FRT), (ins qsrc:$FRA, qsrc:$FRB), 465 "qvfcmplt $FRT, $FRA, $FRB", IIC_FPCompare, 466 [(set v4i1:$FRT, 467 (setcc v4f32:$FRA, v4f32:$FRB, SETOLT))]>; 468 let isCodeGenOnly = 1 in 469 def QVFCMPGT : QPXX18_Int<4, 32, "qvfcmpgt", int_ppc_qpx_qvfcmpgt>; 470 def QVFCMPGTb : XForm_18<4, 32, (outs qbrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB), 471 "qvfcmpgt $FRT, $FRA, $FRB", IIC_FPCompare, 472 [(set v4i1:$FRT, 473 (setcc v4f64:$FRA, v4f64:$FRB, SETOGT))]>; 474 let isCodeGenOnly = 1 in 475 def QVFCMPGTbs : XForm_18<4, 32, (outs qbrc:$FRT), (ins qsrc:$FRA, qsrc:$FRB), 476 "qvfcmpgt $FRT, $FRA, $FRB", IIC_FPCompare, 477 [(set v4i1:$FRT, 478 (setcc v4f32:$FRA, v4f32:$FRB, SETOGT))]>; 479 let isCodeGenOnly = 1 in 480 def QVFCMPEQ : QPXX18_Int<4, 0, "qvfcmpeq", int_ppc_qpx_qvfcmpeq>; 481 def QVFCMPEQb : XForm_18<4, 0, (outs qbrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB), 482 "qvfcmpeq $FRT, $FRA, $FRB", IIC_FPCompare, 483 [(set v4i1:$FRT, 484 (setcc v4f64:$FRA, v4f64:$FRB, SETOEQ))]>; 485 let isCodeGenOnly = 1 in 486 def QVFCMPEQbs : XForm_18<4, 0, (outs qbrc:$FRT), (ins qsrc:$FRA, qsrc:$FRB), 487 "qvfcmpeq $FRT, $FRA, $FRB", IIC_FPCompare, 488 [(set v4i1:$FRT, 489 (setcc v4f32:$FRA, v4f32:$FRB, SETOEQ))]>; 490 491 let isCodeGenOnly = 1 in 492 def QVFLOGICAL : XForm_20<4, 4, 493 (outs qfrc:$FRT), (ins qfrc:$FRA, qfrc:$FRB, u12imm:$tttt), 494 "qvflogical $FRT, $FRA, $FRB, $tttt", IIC_VecPerm, []>; 495 def QVFLOGICALb : XForm_20<4, 4, 496 (outs qbrc:$FRT), (ins qbrc:$FRA, qbrc:$FRB, u12imm:$tttt), 497 "qvflogical $FRT, $FRA, $FRB, $tttt", IIC_VecPerm, []>; 498 let isCodeGenOnly = 1 in 499 def QVFLOGICALs : XForm_20<4, 4, 500 (outs qbrc:$FRT), (ins qbrc:$FRA, qbrc:$FRB, u12imm:$tttt), 501 "qvflogical $FRT, $FRA, $FRB, $tttt", IIC_VecPerm, []>; 502 503 // Load indexed instructions 504 let mayLoad = 1 in { 505 def QVLFDX : XForm_1<31, 583, 506 (outs qfrc:$FRT), (ins memrr:$src), 507 "qvlfdx $FRT, $src", IIC_LdStLFD, 508 [(set v4f64:$FRT, (load xoaddr:$src))]>; 509 let isCodeGenOnly = 1 in 510 def QVLFDXb : XForm_1<31, 583, 511 (outs qbrc:$FRT), (ins memrr:$src), 512 "qvlfdx $FRT, $src", IIC_LdStLFD, []>; 513 514 let RC = 1 in 515 def QVLFDXA : XForm_1<31, 583, 516 (outs qfrc:$FRT), (ins memrr:$src), 517 "qvlfdxa $FRT, $src", IIC_LdStLFD, []>; 518 519 def QVLFDUX : XForm_1<31, 615, 520 (outs qfrc:$FRT, ptr_rc_nor0:$ea_result), 521 (ins memrr:$src), 522 "qvlfdux $FRT, $src", IIC_LdStLFDU, []>, 523 RegConstraint<"$src.ptrreg = $ea_result">, 524 NoEncode<"$ea_result">; 525 let RC = 1 in 526 def QVLFDUXA : XForm_1<31, 615, 527 (outs qfrc:$FRT), (ins memrr:$src), 528 "qvlfduxa $FRT, $src", IIC_LdStLFD, []>; 529 530 def QVLFSX : XForm_1<31, 519, 531 (outs qfrc:$FRT), (ins memrr:$src), 532 "qvlfsx $FRT, $src", IIC_LdStLFD, 533 [(set v4f64:$FRT, (extloadv4f32 xoaddr:$src))]>; 534 535 let isCodeGenOnly = 1 in 536 def QVLFSXb : XForm_1<31, 519, 537 (outs qbrc:$FRT), (ins memrr:$src), 538 "qvlfsx $FRT, $src", IIC_LdStLFD, 539 [(set v4i1:$FRT, (PPCqvlfsb xoaddr:$src))]>; 540 let isCodeGenOnly = 1 in 541 def QVLFSXs : XForm_1<31, 519, 542 (outs qsrc:$FRT), (ins memrr:$src), 543 "qvlfsx $FRT, $src", IIC_LdStLFD, 544 [(set v4f32:$FRT, (load xoaddr:$src))]>; 545 546 let RC = 1 in 547 def QVLFSXA : XForm_1<31, 519, 548 (outs qfrc:$FRT), (ins memrr:$src), 549 "qvlfsxa $FRT, $src", IIC_LdStLFD, []>; 550 551 def QVLFSUX : XForm_1<31, 551, 552 (outs qsrc:$FRT, ptr_rc_nor0:$ea_result), 553 (ins memrr:$src), 554 "qvlfsux $FRT, $src", IIC_LdStLFDU, []>, 555 RegConstraint<"$src.ptrreg = $ea_result">, 556 NoEncode<"$ea_result">; 557 558 let RC = 1 in 559 def QVLFSUXA : XForm_1<31, 551, 560 (outs qfrc:$FRT), (ins memrr:$src), 561 "qvlfsuxa $FRT, $src", IIC_LdStLFD, []>; 562 563 def QVLFCDX : XForm_1<31, 71, 564 (outs qfrc:$FRT), (ins memrr:$src), 565 "qvlfcdx $FRT, $src", IIC_LdStLFD, []>; 566 let RC = 1 in 567 def QVLFCDXA : XForm_1<31, 71, 568 (outs qfrc:$FRT), (ins memrr:$src), 569 "qvlfcdxa $FRT, $src", IIC_LdStLFD, []>; 570 571 def QVLFCDUX : XForm_1<31, 103, 572 (outs qfrc:$FRT), (ins memrr:$src), 573 "qvlfcdux $FRT, $src", IIC_LdStLFD, []>; 574 let RC = 1 in 575 def QVLFCDUXA : XForm_1<31, 103, 576 (outs qfrc:$FRT), (ins memrr:$src), 577 "qvlfcduxa $FRT, $src", IIC_LdStLFD, []>; 578 579 def QVLFCSX : XForm_1<31, 7, 580 (outs qfrc:$FRT), (ins memrr:$src), 581 "qvlfcsx $FRT, $src", IIC_LdStLFD, []>; 582 let isCodeGenOnly = 1 in 583 def QVLFCSXs : XForm_1<31, 7, 584 (outs qsrc:$FRT), (ins memrr:$src), 585 "qvlfcsx $FRT, $src", IIC_LdStLFD, []>; 586 587 let RC = 1 in 588 def QVLFCSXA : XForm_1<31, 7, 589 (outs qfrc:$FRT), (ins memrr:$src), 590 "qvlfcsxa $FRT, $src", IIC_LdStLFD, []>; 591 592 def QVLFCSUX : XForm_1<31, 39, 593 (outs qfrc:$FRT), (ins memrr:$src), 594 "qvlfcsux $FRT, $src", IIC_LdStLFD, []>; 595 let RC = 1 in 596 def QVLFCSUXA : XForm_1<31, 39, 597 (outs qfrc:$FRT), (ins memrr:$src), 598 "qvlfcsuxa $FRT, $src", IIC_LdStLFD, []>; 599 600 def QVLFIWAX : XForm_1<31, 871, 601 (outs qfrc:$FRT), (ins memrr:$src), 602 "qvlfiwax $FRT, $src", IIC_LdStLFD, []>; 603 let RC = 1 in 604 def QVLFIWAXA : XForm_1<31, 871, 605 (outs qfrc:$FRT), (ins memrr:$src), 606 "qvlfiwaxa $FRT, $src", IIC_LdStLFD, []>; 607 608 def QVLFIWZX : XForm_1<31, 839, 609 (outs qfrc:$FRT), (ins memrr:$src), 610 "qvlfiwzx $FRT, $src", IIC_LdStLFD, []>; 611 let RC = 1 in 612 def QVLFIWZXA : XForm_1<31, 839, 613 (outs qfrc:$FRT), (ins memrr:$src), 614 "qvlfiwzxa $FRT, $src", IIC_LdStLFD, []>; 615 } 616 617 618 def QVLPCLDX : XForm_1<31, 582, 619 (outs qfrc:$FRT), (ins memrr:$src), 620 "qvlpcldx $FRT, $src", IIC_LdStLFD, []>; 621 def QVLPCLSX : XForm_1<31, 518, 622 (outs qfrc:$FRT), (ins memrr:$src), 623 "qvlpclsx $FRT, $src", IIC_LdStLFD, []>; 624 let isCodeGenOnly = 1 in 625 def QVLPCLSXint : XForm_11<31, 518, 626 (outs qfrc:$FRT), (ins G8RC:$src), 627 "qvlpclsx $FRT, 0, $src", IIC_LdStLFD, []>; 628 def QVLPCRDX : XForm_1<31, 70, 629 (outs qfrc:$FRT), (ins memrr:$src), 630 "qvlpcrdx $FRT, $src", IIC_LdStLFD, []>; 631 def QVLPCRSX : XForm_1<31, 6, 632 (outs qfrc:$FRT), (ins memrr:$src), 633 "qvlpcrsx $FRT, $src", IIC_LdStLFD, []>; 634 635 // Store indexed instructions 636 let mayStore = 1 in { 637 def QVSTFDX : XForm_8<31, 711, 638 (outs), (ins qfrc:$FRT, memrr:$dst), 639 "qvstfdx $FRT, $dst", IIC_LdStSTFD, 640 [(store qfrc:$FRT, xoaddr:$dst)]>; 641 let isCodeGenOnly = 1 in 642 def QVSTFDXb : XForm_8<31, 711, 643 (outs), (ins qbrc:$FRT, memrr:$dst), 644 "qvstfdx $FRT, $dst", IIC_LdStSTFD, []>; 645 646 let RC = 1 in 647 def QVSTFDXA : XForm_8<31, 711, 648 (outs), (ins qfrc:$FRT, memrr:$dst), 649 "qvstfdxa $FRT, $dst", IIC_LdStSTFD, []>; 650 651 def QVSTFDUX : XForm_8<31, 743, (outs ptr_rc_nor0:$ea_res), 652 (ins qfrc:$FRT, memrr:$dst), 653 "qvstfdux $FRT, $dst", IIC_LdStSTFDU, []>, 654 RegConstraint<"$dst.ptrreg = $ea_res">, 655 NoEncode<"$ea_res">; 656 657 let RC = 1 in 658 def QVSTFDUXA : XForm_8<31, 743, 659 (outs), (ins qfrc:$FRT, memrr:$dst), 660 "qvstfduxa $FRT, $dst", IIC_LdStSTFD, []>; 661 662 def QVSTFDXI : XForm_8<31, 709, 663 (outs), (ins qfrc:$FRT, memrr:$dst), 664 "qvstfdxi $FRT, $dst", IIC_LdStSTFD, []>; 665 let RC = 1 in 666 def QVSTFDXIA : XForm_8<31, 709, 667 (outs), (ins qfrc:$FRT, memrr:$dst), 668 "qvstfdxia $FRT, $dst", IIC_LdStSTFD, []>; 669 670 def QVSTFDUXI : XForm_8<31, 741, 671 (outs), (ins qfrc:$FRT, memrr:$dst), 672 "qvstfduxi $FRT, $dst", IIC_LdStSTFD, []>; 673 let RC = 1 in 674 def QVSTFDUXIA : XForm_8<31, 741, 675 (outs), (ins qfrc:$FRT, memrr:$dst), 676 "qvstfduxia $FRT, $dst", IIC_LdStSTFD, []>; 677 678 def QVSTFSX : XForm_8<31, 647, 679 (outs), (ins qfrc:$FRT, memrr:$dst), 680 "qvstfsx $FRT, $dst", IIC_LdStSTFD, 681 [(truncstorev4f32 qfrc:$FRT, xoaddr:$dst)]>; 682 let isCodeGenOnly = 1 in 683 def QVSTFSXs : XForm_8<31, 647, 684 (outs), (ins qsrc:$FRT, memrr:$dst), 685 "qvstfsx $FRT, $dst", IIC_LdStSTFD, 686 [(store qsrc:$FRT, xoaddr:$dst)]>; 687 688 let RC = 1 in 689 def QVSTFSXA : XForm_8<31, 647, 690 (outs), (ins qfrc:$FRT, memrr:$dst), 691 "qvstfsxa $FRT, $dst", IIC_LdStSTFD, []>; 692 693 def QVSTFSUX : XForm_8<31, 679, (outs ptr_rc_nor0:$ea_res), 694 (ins qsrc:$FRT, memrr:$dst), 695 "qvstfsux $FRT, $dst", IIC_LdStSTFDU, []>, 696 RegConstraint<"$dst.ptrreg = $ea_res">, 697 NoEncode<"$ea_res">; 698 let isCodeGenOnly = 1 in 699 def QVSTFSUXs: XForm_8<31, 679, (outs ptr_rc_nor0:$ea_res), 700 (ins qfrc:$FRT, memrr:$dst), 701 "qvstfsux $FRT, $dst", IIC_LdStSTFDU, []>, 702 RegConstraint<"$dst.ptrreg = $ea_res">, 703 NoEncode<"$ea_res">; 704 705 let RC = 1 in 706 def QVSTFSUXA : XForm_8<31, 679, 707 (outs), (ins qfrc:$FRT, memrr:$dst), 708 "qvstfsuxa $FRT, $dst", IIC_LdStSTFD, []>; 709 710 def QVSTFSXI : XForm_8<31, 645, 711 (outs), (ins qfrc:$FRT, memrr:$dst), 712 "qvstfsxi $FRT, $dst", IIC_LdStSTFD, []>; 713 let RC = 1 in 714 def QVSTFSXIA : XForm_8<31, 645, 715 (outs), (ins qfrc:$FRT, memrr:$dst), 716 "qvstfsxia $FRT, $dst", IIC_LdStSTFD, []>; 717 718 def QVSTFSUXI : XForm_8<31, 677, 719 (outs), (ins qfrc:$FRT, memrr:$dst), 720 "qvstfsuxi $FRT, $dst", IIC_LdStSTFD, []>; 721 let RC = 1 in 722 def QVSTFSUXIA : XForm_8<31, 677, 723 (outs), (ins qfrc:$FRT, memrr:$dst), 724 "qvstfsuxia $FRT, $dst", IIC_LdStSTFD, []>; 725 726 def QVSTFCDX : XForm_8<31, 199, 727 (outs), (ins qfrc:$FRT, memrr:$dst), 728 "qvstfcdx $FRT, $dst", IIC_LdStSTFD, []>; 729 let RC = 1 in 730 def QVSTFCDXA : XForm_8<31, 199, 731 (outs), (ins qfrc:$FRT, memrr:$dst), 732 "qvstfcdxa $FRT, $dst", IIC_LdStSTFD, []>; 733 734 def QVSTFCSX : XForm_8<31, 135, 735 (outs), (ins qfrc:$FRT, memrr:$dst), 736 "qvstfcsx $FRT, $dst", IIC_LdStSTFD, []>; 737 let isCodeGenOnly = 1 in 738 def QVSTFCSXs : XForm_8<31, 135, 739 (outs), (ins qsrc:$FRT, memrr:$dst), 740 "qvstfcsx $FRT, $dst", IIC_LdStSTFD, []>; 741 742 let RC = 1 in 743 def QVSTFCSXA : XForm_8<31, 135, 744 (outs), (ins qfrc:$FRT, memrr:$dst), 745 "qvstfcsxa $FRT, $dst", IIC_LdStSTFD, []>; 746 747 def QVSTFCDUX : XForm_8<31, 231, 748 (outs), (ins qfrc:$FRT, memrr:$dst), 749 "qvstfcdux $FRT, $dst", IIC_LdStSTFD, []>; 750 let RC = 1 in 751 def QVSTFCDUXA : XForm_8<31, 231, 752 (outs), (ins qfrc:$FRT, memrr:$dst), 753 "qvstfcduxa $FRT, $dst", IIC_LdStSTFD, []>; 754 755 def QVSTFCSUX : XForm_8<31, 167, 756 (outs), (ins qfrc:$FRT, memrr:$dst), 757 "qvstfcsux $FRT, $dst", IIC_LdStSTFD, []>; 758 let RC = 1 in 759 def QVSTFCSUXA : XForm_8<31, 167, 760 (outs), (ins qfrc:$FRT, memrr:$dst), 761 "qvstfcsuxa $FRT, $dst", IIC_LdStSTFD, []>; 762 763 def QVSTFCDXI : XForm_8<31, 197, 764 (outs), (ins qfrc:$FRT, memrr:$dst), 765 "qvstfcdxi $FRT, $dst", IIC_LdStSTFD, []>; 766 let RC = 1 in 767 def QVSTFCDXIA : XForm_8<31, 197, 768 (outs), (ins qfrc:$FRT, memrr:$dst), 769 "qvstfcdxia $FRT, $dst", IIC_LdStSTFD, []>; 770 771 def QVSTFCSXI : XForm_8<31, 133, 772 (outs), (ins qfrc:$FRT, memrr:$dst), 773 "qvstfcsxi $FRT, $dst", IIC_LdStSTFD, []>; 774 let RC = 1 in 775 def QVSTFCSXIA : XForm_8<31, 133, 776 (outs), (ins qfrc:$FRT, memrr:$dst), 777 "qvstfcsxia $FRT, $dst", IIC_LdStSTFD, []>; 778 779 def QVSTFCDUXI : XForm_8<31, 229, 780 (outs), (ins qfrc:$FRT, memrr:$dst), 781 "qvstfcduxi $FRT, $dst", IIC_LdStSTFD, []>; 782 let RC = 1 in 783 def QVSTFCDUXIA : XForm_8<31, 229, 784 (outs), (ins qfrc:$FRT, memrr:$dst), 785 "qvstfcduxia $FRT, $dst", IIC_LdStSTFD, []>; 786 787 def QVSTFCSUXI : XForm_8<31, 165, 788 (outs), (ins qfrc:$FRT, memrr:$dst), 789 "qvstfcsuxi $FRT, $dst", IIC_LdStSTFD, []>; 790 let RC = 1 in 791 def QVSTFCSUXIA : XForm_8<31, 165, 792 (outs), (ins qfrc:$FRT, memrr:$dst), 793 "qvstfcsuxia $FRT, $dst", IIC_LdStSTFD, []>; 794 795 def QVSTFIWX : XForm_8<31, 967, 796 (outs), (ins qfrc:$FRT, memrr:$dst), 797 "qvstfiwx $FRT, $dst", IIC_LdStSTFD, []>; 798 let RC = 1 in 799 def QVSTFIWXA : XForm_8<31, 967, 800 (outs), (ins qfrc:$FRT, memrr:$dst), 801 "qvstfiwxa $FRT, $dst", IIC_LdStSTFD, []>; 802 } 803} 804 805} // neverHasSideEffects 806} 807 808def : InstAlias<"qvfclr $FRT", 809 (QVFLOGICALb qbrc:$FRT, qbrc:$FRT, qbrc:$FRT, 0)>; 810def : InstAlias<"qvfand $FRT, $FRA, $FRB", 811 (QVFLOGICALb qbrc:$FRT, qbrc:$FRA, qbrc:$FRB, 1)>; 812def : InstAlias<"qvfandc $FRT, $FRA, $FRB", 813 (QVFLOGICALb qbrc:$FRT, qbrc:$FRA, qbrc:$FRB, 4)>; 814def : InstAlias<"qvfctfb $FRT, $FRA", 815 (QVFLOGICALb qbrc:$FRT, qbrc:$FRA, qbrc:$FRA, 5)>; 816def : InstAlias<"qvfxor $FRT, $FRA, $FRB", 817 (QVFLOGICALb qbrc:$FRT, qbrc:$FRA, qbrc:$FRB, 6)>; 818def : InstAlias<"qvfor $FRT, $FRA, $FRB", 819 (QVFLOGICALb qbrc:$FRT, qbrc:$FRA, qbrc:$FRB, 7)>; 820def : InstAlias<"qvfnor $FRT, $FRA, $FRB", 821 (QVFLOGICALb qbrc:$FRT, qbrc:$FRA, qbrc:$FRB, 8)>; 822def : InstAlias<"qvfequ $FRT, $FRA, $FRB", 823 (QVFLOGICALb qbrc:$FRT, qbrc:$FRA, qbrc:$FRB, 9)>; 824def : InstAlias<"qvfnot $FRT, $FRA", 825 (QVFLOGICALb qbrc:$FRT, qbrc:$FRA, qbrc:$FRA, 10)>; 826def : InstAlias<"qvforc $FRT, $FRA, $FRB", 827 (QVFLOGICALb qbrc:$FRT, qbrc:$FRA, qbrc:$FRB, 13)>; 828def : InstAlias<"qvfnand $FRT, $FRA, $FRB", 829 (QVFLOGICALb qbrc:$FRT, qbrc:$FRA, qbrc:$FRB, 14)>; 830def : InstAlias<"qvfset $FRT", 831 (QVFLOGICALb qbrc:$FRT, qbrc:$FRT, qbrc:$FRT, 15)>; 832 833//===----------------------------------------------------------------------===// 834// Additional QPX Patterns 835// 836 837def : Pat<(v4f64 (scalar_to_vector f64:$A)), 838 (INSERT_SUBREG (v4f64 (IMPLICIT_DEF)), $A, sub_64)>; 839def : Pat<(v4f32 (scalar_to_vector f32:$A)), 840 (INSERT_SUBREG (v4f32 (IMPLICIT_DEF)), $A, sub_64)>; 841 842def : Pat<(f64 (extractelt v4f64:$S, 0)), 843 (EXTRACT_SUBREG $S, sub_64)>; 844def : Pat<(f32 (extractelt v4f32:$S, 0)), 845 (EXTRACT_SUBREG $S, sub_64)>; 846 847def : Pat<(f64 (extractelt v4f64:$S, 1)), 848 (EXTRACT_SUBREG (QVESPLATI $S, 1), sub_64)>; 849def : Pat<(f64 (extractelt v4f64:$S, 2)), 850 (EXTRACT_SUBREG (QVESPLATI $S, 2), sub_64)>; 851def : Pat<(f64 (extractelt v4f64:$S, 3)), 852 (EXTRACT_SUBREG (QVESPLATI $S, 3), sub_64)>; 853 854def : Pat<(f32 (extractelt v4f32:$S, 1)), 855 (EXTRACT_SUBREG (QVESPLATIs $S, 1), sub_64)>; 856def : Pat<(f32 (extractelt v4f32:$S, 2)), 857 (EXTRACT_SUBREG (QVESPLATIs $S, 2), sub_64)>; 858def : Pat<(f32 (extractelt v4f32:$S, 3)), 859 (EXTRACT_SUBREG (QVESPLATIs $S, 3), sub_64)>; 860 861def : Pat<(f64 (extractelt v4f64:$S, i64:$F)), 862 (EXTRACT_SUBREG (QVFPERM $S, $S, 863 (QVLPCLSXint (RLDICR $F, 2, 864 /* 63-2 = */ 61))), 865 sub_64)>; 866def : Pat<(f32 (extractelt v4f32:$S, i64:$F)), 867 (EXTRACT_SUBREG (QVFPERMs $S, $S, 868 (QVLPCLSXint (RLDICR $F, 2, 869 /* 63-2 = */ 61))), 870 sub_64)>; 871 872def : Pat<(int_ppc_qpx_qvfperm v4f64:$A, v4f64:$B, v4f64:$C), 873 (QVFPERM $A, $B, $C)>; 874 875def : Pat<(int_ppc_qpx_qvfcpsgn v4f64:$A, v4f64:$B), 876 (QVFCPSGN $A, $B)>; 877 878// FCOPYSIGN's operand types need not agree. 879def : Pat<(fcopysign v4f64:$frB, v4f32:$frA), 880 (QVFCPSGN (COPY_TO_REGCLASS $frA, QFRC), $frB)>; 881def : Pat<(fcopysign QSRC:$frB, QFRC:$frA), 882 (QVFCPSGNs (COPY_TO_REGCLASS $frA, QSRC), $frB)>; 883 884def : Pat<(int_ppc_qpx_qvfneg v4f64:$A), (QVFNEG $A)>; 885def : Pat<(int_ppc_qpx_qvfabs v4f64:$A), (QVFABS $A)>; 886def : Pat<(int_ppc_qpx_qvfnabs v4f64:$A), (QVFNABS $A)>; 887 888def : Pat<(int_ppc_qpx_qvfriz v4f64:$A), (QVFRIZ $A)>; 889def : Pat<(int_ppc_qpx_qvfrin v4f64:$A), (QVFRIN $A)>; 890def : Pat<(int_ppc_qpx_qvfrip v4f64:$A), (QVFRIP $A)>; 891def : Pat<(int_ppc_qpx_qvfrim v4f64:$A), (QVFRIM $A)>; 892 893def : Pat<(int_ppc_qpx_qvfre v4f64:$A), (QVFRE $A)>; 894def : Pat<(int_ppc_qpx_qvfrsqrte v4f64:$A), (QVFRSQRTE $A)>; 895 896def : Pat<(int_ppc_qpx_qvfadd v4f64:$A, v4f64:$B), 897 (QVFADD $A, $B)>; 898def : Pat<(int_ppc_qpx_qvfsub v4f64:$A, v4f64:$B), 899 (QVFSUB $A, $B)>; 900def : Pat<(int_ppc_qpx_qvfmul v4f64:$A, v4f64:$B), 901 (QVFMUL $A, $B)>; 902 903// Additional QVFNMSUB patterns: -a*c + b == -(a*c - b) 904def : Pat<(fma (fneg v4f64:$A), v4f64:$C, v4f64:$B), 905 (QVFNMSUB $A, $B, $C)>; 906def : Pat<(fma v4f64:$A, (fneg v4f64:$C), v4f64:$B), 907 (QVFNMSUB $A, $B, $C)>; 908def : Pat<(fma (fneg v4f32:$A), v4f32:$C, v4f32:$B), 909 (QVFNMSUBSs $A, $B, $C)>; 910def : Pat<(fma v4f32:$A, (fneg v4f32:$C), v4f32:$B), 911 (QVFNMSUBSs $A, $B, $C)>; 912 913def : Pat<(int_ppc_qpx_qvfmadd v4f64:$A, v4f64:$B, v4f64:$C), 914 (QVFMADD $A, $B, $C)>; 915def : Pat<(int_ppc_qpx_qvfnmadd v4f64:$A, v4f64:$B, v4f64:$C), 916 (QVFNMADD $A, $B, $C)>; 917def : Pat<(int_ppc_qpx_qvfmsub v4f64:$A, v4f64:$B, v4f64:$C), 918 (QVFMSUB $A, $B, $C)>; 919def : Pat<(int_ppc_qpx_qvfnmsub v4f64:$A, v4f64:$B, v4f64:$C), 920 (QVFNMSUB $A, $B, $C)>; 921 922def : Pat<(int_ppc_qpx_qvlfd xoaddr:$src), 923 (QVLFDX xoaddr:$src)>; 924def : Pat<(int_ppc_qpx_qvlfda xoaddr:$src), 925 (QVLFDXA xoaddr:$src)>; 926def : Pat<(int_ppc_qpx_qvlfs xoaddr:$src), 927 (QVLFSX xoaddr:$src)>; 928def : Pat<(int_ppc_qpx_qvlfsa xoaddr:$src), 929 (QVLFSXA xoaddr:$src)>; 930def : Pat<(int_ppc_qpx_qvlfcda xoaddr:$src), 931 (QVLFCDXA xoaddr:$src)>; 932def : Pat<(int_ppc_qpx_qvlfcd xoaddr:$src), 933 (QVLFCDX xoaddr:$src)>; 934def : Pat<(int_ppc_qpx_qvlfcsa xoaddr:$src), 935 (QVLFCSXA xoaddr:$src)>; 936def : Pat<(int_ppc_qpx_qvlfcs xoaddr:$src), 937 (QVLFCSX xoaddr:$src)>; 938def : Pat<(int_ppc_qpx_qvlfda xoaddr:$src), 939 (QVLFDXA xoaddr:$src)>; 940def : Pat<(int_ppc_qpx_qvlfiwaa xoaddr:$src), 941 (QVLFIWAXA xoaddr:$src)>; 942def : Pat<(int_ppc_qpx_qvlfiwa xoaddr:$src), 943 (QVLFIWAX xoaddr:$src)>; 944def : Pat<(int_ppc_qpx_qvlfiwza xoaddr:$src), 945 (QVLFIWZXA xoaddr:$src)>; 946def : Pat<(int_ppc_qpx_qvlfiwz xoaddr:$src), 947 (QVLFIWZX xoaddr:$src)>; 948def : Pat<(int_ppc_qpx_qvlfsa xoaddr:$src), 949 (QVLFSXA xoaddr:$src)>; 950def : Pat<(int_ppc_qpx_qvlpcld xoaddr:$src), 951 (QVLPCLDX xoaddr:$src)>; 952def : Pat<(int_ppc_qpx_qvlpcls xoaddr:$src), 953 (QVLPCLSX xoaddr:$src)>; 954def : Pat<(int_ppc_qpx_qvlpcrd xoaddr:$src), 955 (QVLPCRDX xoaddr:$src)>; 956def : Pat<(int_ppc_qpx_qvlpcrs xoaddr:$src), 957 (QVLPCRSX xoaddr:$src)>; 958 959def : Pat<(int_ppc_qpx_qvstfd v4f64:$T, xoaddr:$dst), 960 (QVSTFDX $T, xoaddr:$dst)>; 961def : Pat<(int_ppc_qpx_qvstfs v4f64:$T, xoaddr:$dst), 962 (QVSTFSX $T, xoaddr:$dst)>; 963def : Pat<(int_ppc_qpx_qvstfcda v4f64:$T, xoaddr:$dst), 964 (QVSTFCDXA $T, xoaddr:$dst)>; 965def : Pat<(int_ppc_qpx_qvstfcd v4f64:$T, xoaddr:$dst), 966 (QVSTFCDX $T, xoaddr:$dst)>; 967def : Pat<(int_ppc_qpx_qvstfcsa v4f64:$T, xoaddr:$dst), 968 (QVSTFCSXA $T, xoaddr:$dst)>; 969def : Pat<(int_ppc_qpx_qvstfcs v4f64:$T, xoaddr:$dst), 970 (QVSTFCSX $T, xoaddr:$dst)>; 971def : Pat<(int_ppc_qpx_qvstfda v4f64:$T, xoaddr:$dst), 972 (QVSTFDXA $T, xoaddr:$dst)>; 973def : Pat<(int_ppc_qpx_qvstfiwa v4f64:$T, xoaddr:$dst), 974 (QVSTFIWXA $T, xoaddr:$dst)>; 975def : Pat<(int_ppc_qpx_qvstfiw v4f64:$T, xoaddr:$dst), 976 (QVSTFIWX $T, xoaddr:$dst)>; 977def : Pat<(int_ppc_qpx_qvstfsa v4f64:$T, xoaddr:$dst), 978 (QVSTFSXA $T, xoaddr:$dst)>; 979 980def : Pat<(pre_store v4f64:$rS, iPTR:$ptrreg, iPTR:$ptroff), 981 (QVSTFDUX $rS, $ptrreg, $ptroff)>; 982def : Pat<(pre_store v4f32:$rS, iPTR:$ptrreg, iPTR:$ptroff), 983 (QVSTFSUX $rS, $ptrreg, $ptroff)>; 984def : Pat<(pre_truncstv4f32 v4f64:$rS, iPTR:$ptrreg, iPTR:$ptroff), 985 (QVSTFSUXs $rS, $ptrreg, $ptroff)>; 986 987def : Pat<(int_ppc_qpx_qvflogical v4f64:$A, v4f64:$B, (i32 imm:$idx)), 988 (QVFLOGICAL $A, $B, imm:$idx)>; 989def : Pat<(int_ppc_qpx_qvgpci (u12:$idx)), 990 (QVGPCI imm:$idx)>; 991 992def : Pat<(setcc v4f64:$FRA, v4f64:$FRB, SETOGE), 993 (QVFLOGICALb (QVFCMPLTb $FRA, $FRB), 994 (QVFTSTNANb $FRA, $FRB), (i32 8))>; 995def : Pat<(setcc v4f64:$FRA, v4f64:$FRB, SETOLE), 996 (QVFLOGICALb (QVFCMPGTb $FRA, $FRB), 997 (QVFTSTNANb $FRA, $FRB), (i32 8))>; 998def : Pat<(setcc v4f64:$FRA, v4f64:$FRB, SETONE), 999 (QVFLOGICALb (QVFCMPEQb $FRA, $FRB), 1000 (QVFTSTNANb $FRA, $FRB), (i32 8))>; 1001def : Pat<(setcc v4f64:$FRA, v4f64:$FRB, SETO), 1002 (QVFLOGICALb (QVFTSTNANb $FRA, $FRB), 1003 (QVFTSTNANb $FRA, $FRB), (i32 10))>; 1004def : Pat<(setcc v4f64:$FRA, v4f64:$FRB, SETUEQ), 1005 (QVFLOGICALb (QVFCMPEQb $FRA, $FRB), 1006 (QVFTSTNANb $FRA, $FRB), (i32 7))>; 1007def : Pat<(setcc v4f64:$FRA, v4f64:$FRB, SETUGT), 1008 (QVFLOGICALb (QVFCMPGTb $FRA, $FRB), 1009 (QVFTSTNANb $FRA, $FRB), (i32 7))>; 1010def : Pat<(setcc v4f64:$FRA, v4f64:$FRB, SETUGE), 1011 (QVFLOGICALb (QVFTSTNANb $FRA, $FRB), 1012 (QVFCMPLTb $FRA, $FRB), (i32 13))>; 1013def : Pat<(setcc v4f64:$FRA, v4f64:$FRB, SETULT), 1014 (QVFLOGICALb (QVFCMPLTb $FRA, $FRB), 1015 (QVFTSTNANb $FRA, $FRB), (i32 7))>; 1016def : Pat<(setcc v4f64:$FRA, v4f64:$FRB, SETULE), 1017 (QVFLOGICALb (QVFTSTNANb $FRA, $FRB), 1018 (QVFCMPGTb $FRA, $FRB), (i32 13))>; 1019def : Pat<(setcc v4f64:$FRA, v4f64:$FRB, SETUNE), 1020 (QVFLOGICALb (QVFTSTNANb $FRA, $FRB), 1021 (QVFCMPEQb $FRA, $FRB), (i32 13))>; 1022 1023def : Pat<(setcc v4f64:$FRA, v4f64:$FRB, SETEQ), 1024 (QVFCMPEQb $FRA, $FRB)>; 1025def : Pat<(setcc v4f64:$FRA, v4f64:$FRB, SETGT), 1026 (QVFCMPGTb $FRA, $FRB)>; 1027def : Pat<(setcc v4f64:$FRA, v4f64:$FRB, SETGE), 1028 (QVFLOGICALb (QVFCMPLTb $FRA, $FRB), 1029 (QVFCMPLTb $FRA, $FRB), (i32 10))>; 1030def : Pat<(setcc v4f64:$FRA, v4f64:$FRB, SETLT), 1031 (QVFCMPLTb $FRA, $FRB)>; 1032def : Pat<(setcc v4f64:$FRA, v4f64:$FRB, SETLE), 1033 (QVFLOGICALb (QVFCMPGTb $FRA, $FRB), 1034 (QVFCMPGTb $FRA, $FRB), (i32 10))>; 1035def : Pat<(setcc v4f64:$FRA, v4f64:$FRB, SETNE), 1036 (QVFLOGICALb (QVFCMPEQb $FRA, $FRB), 1037 (QVFCMPEQb $FRA, $FRB), (i32 10))>; 1038 1039def : Pat<(setcc v4f32:$FRA, v4f32:$FRB, SETOGE), 1040 (QVFLOGICALb (QVFCMPLTbs $FRA, $FRB), 1041 (QVFTSTNANbs $FRA, $FRB), (i32 8))>; 1042def : Pat<(setcc v4f32:$FRA, v4f32:$FRB, SETOLE), 1043 (QVFLOGICALb (QVFCMPGTbs $FRA, $FRB), 1044 (QVFTSTNANbs $FRA, $FRB), (i32 8))>; 1045def : Pat<(setcc v4f32:$FRA, v4f32:$FRB, SETONE), 1046 (QVFLOGICALb (QVFCMPEQbs $FRA, $FRB), 1047 (QVFTSTNANbs $FRA, $FRB), (i32 8))>; 1048def : Pat<(setcc v4f32:$FRA, v4f32:$FRB, SETO), 1049 (QVFLOGICALb (QVFTSTNANbs $FRA, $FRB), 1050 (QVFTSTNANbs $FRA, $FRB), (i32 10))>; 1051def : Pat<(setcc v4f32:$FRA, v4f32:$FRB, SETUEQ), 1052 (QVFLOGICALb (QVFCMPEQbs $FRA, $FRB), 1053 (QVFTSTNANbs $FRA, $FRB), (i32 7))>; 1054def : Pat<(setcc v4f32:$FRA, v4f32:$FRB, SETUGT), 1055 (QVFLOGICALb (QVFCMPGTbs $FRA, $FRB), 1056 (QVFTSTNANbs $FRA, $FRB), (i32 7))>; 1057def : Pat<(setcc v4f32:$FRA, v4f32:$FRB, SETUGE), 1058 (QVFLOGICALb (QVFTSTNANbs $FRA, $FRB), 1059 (QVFCMPLTbs $FRA, $FRB), (i32 13))>; 1060def : Pat<(setcc v4f32:$FRA, v4f32:$FRB, SETULT), 1061 (QVFLOGICALb (QVFCMPLTbs $FRA, $FRB), 1062 (QVFTSTNANbs $FRA, $FRB), (i32 7))>; 1063def : Pat<(setcc v4f32:$FRA, v4f32:$FRB, SETULE), 1064 (QVFLOGICALb (QVFTSTNANbs $FRA, $FRB), 1065 (QVFCMPGTbs $FRA, $FRB), (i32 13))>; 1066def : Pat<(setcc v4f32:$FRA, v4f32:$FRB, SETUNE), 1067 (QVFLOGICALb (QVFTSTNANbs $FRA, $FRB), 1068 (QVFCMPEQbs $FRA, $FRB), (i32 13))>; 1069 1070def : Pat<(setcc v4f32:$FRA, v4f32:$FRB, SETEQ), 1071 (QVFCMPEQbs $FRA, $FRB)>; 1072def : Pat<(setcc v4f32:$FRA, v4f32:$FRB, SETGT), 1073 (QVFCMPGTbs $FRA, $FRB)>; 1074def : Pat<(setcc v4f32:$FRA, v4f32:$FRB, SETGE), 1075 (QVFLOGICALb (QVFCMPLTbs $FRA, $FRB), 1076 (QVFCMPLTbs $FRA, $FRB), (i32 10))>; 1077def : Pat<(setcc v4f32:$FRA, v4f32:$FRB, SETLT), 1078 (QVFCMPLTbs $FRA, $FRB)>; 1079def : Pat<(setcc v4f32:$FRA, v4f32:$FRB, SETLE), 1080 (QVFLOGICALb (QVFCMPGTbs $FRA, $FRB), 1081 (QVFCMPGTbs $FRA, $FRB), (i32 10))>; 1082def : Pat<(setcc v4f32:$FRA, v4f32:$FRB, SETNE), 1083 (QVFLOGICALb (QVFCMPEQbs $FRA, $FRB), 1084 (QVFCMPEQbs $FRA, $FRB), (i32 10))>; 1085 1086def : Pat<(and v4i1:$FRA, (not v4i1:$FRB)), 1087 (QVFLOGICALb $FRA, $FRB, (i32 4))>; 1088def : Pat<(not (or v4i1:$FRA, v4i1:$FRB)), 1089 (QVFLOGICALb $FRA, $FRB, (i32 8))>; 1090def : Pat<(not (xor v4i1:$FRA, v4i1:$FRB)), 1091 (QVFLOGICALb $FRA, $FRB, (i32 9))>; 1092def : Pat<(or v4i1:$FRA, (not v4i1:$FRB)), 1093 (QVFLOGICALb $FRA, $FRB, (i32 13))>; 1094def : Pat<(not (and v4i1:$FRA, v4i1:$FRB)), 1095 (QVFLOGICALb $FRA, $FRB, (i32 14))>; 1096 1097def : Pat<(and v4i1:$FRA, v4i1:$FRB), 1098 (QVFLOGICALb $FRA, $FRB, (i32 1))>; 1099def : Pat<(or v4i1:$FRA, v4i1:$FRB), 1100 (QVFLOGICALb $FRA, $FRB, (i32 7))>; 1101def : Pat<(xor v4i1:$FRA, v4i1:$FRB), 1102 (QVFLOGICALb $FRA, $FRB, (i32 6))>; 1103def : Pat<(not v4i1:$FRA), 1104 (QVFLOGICALb $FRA, $FRA, (i32 10))>; 1105 1106def : Pat<(v4f64 (fextend v4f32:$src)), 1107 (COPY_TO_REGCLASS $src, QFRC)>; 1108 1109def : Pat<(v4f32 (fround_exact v4f64:$src)), 1110 (COPY_TO_REGCLASS $src, QSRC)>; 1111 1112// Extract the underlying floating-point values from the 1113// QPX (-1.0, 1.0) boolean representation. 1114def : Pat<(v4f64 (PPCqbflt v4i1:$src)), 1115 (COPY_TO_REGCLASS $src, QFRC)>; 1116 1117def : Pat<(v4f64 (selectcc i1:$lhs, i1:$rhs, v4f64:$tval, v4f64:$fval, SETLT)), 1118 (SELECT_QFRC (CRANDC $lhs, $rhs), $tval, $fval)>; 1119def : Pat<(v4f64 (selectcc i1:$lhs, i1:$rhs, v4f64:$tval, v4f64:$fval, SETULT)), 1120 (SELECT_QFRC (CRANDC $rhs, $lhs), $tval, $fval)>; 1121def : Pat<(v4f64 (selectcc i1:$lhs, i1:$rhs, v4f64:$tval, v4f64:$fval, SETLE)), 1122 (SELECT_QFRC (CRORC $lhs, $rhs), $tval, $fval)>; 1123def : Pat<(v4f64 (selectcc i1:$lhs, i1:$rhs, v4f64:$tval, v4f64:$fval, SETULE)), 1124 (SELECT_QFRC (CRORC $rhs, $lhs), $tval, $fval)>; 1125def : Pat<(v4f64 (selectcc i1:$lhs, i1:$rhs, v4f64:$tval, v4f64:$fval, SETEQ)), 1126 (SELECT_QFRC (CREQV $lhs, $rhs), $tval, $fval)>; 1127def : Pat<(v4f64 (selectcc i1:$lhs, i1:$rhs, v4f64:$tval, v4f64:$fval, SETGE)), 1128 (SELECT_QFRC (CRORC $rhs, $lhs), $tval, $fval)>; 1129def : Pat<(v4f64 (selectcc i1:$lhs, i1:$rhs, v4f64:$tval, v4f64:$fval, SETUGE)), 1130 (SELECT_QFRC (CRORC $lhs, $rhs), $tval, $fval)>; 1131def : Pat<(v4f64 (selectcc i1:$lhs, i1:$rhs, v4f64:$tval, v4f64:$fval, SETGT)), 1132 (SELECT_QFRC (CRANDC $rhs, $lhs), $tval, $fval)>; 1133def : Pat<(v4f64 (selectcc i1:$lhs, i1:$rhs, v4f64:$tval, v4f64:$fval, SETUGT)), 1134 (SELECT_QFRC (CRANDC $lhs, $rhs), $tval, $fval)>; 1135def : Pat<(v4f64 (selectcc i1:$lhs, i1:$rhs, v4f64:$tval, v4f64:$fval, SETNE)), 1136 (SELECT_QFRC (CRXOR $lhs, $rhs), $tval, $fval)>; 1137 1138def : Pat<(v4f32 (selectcc i1:$lhs, i1:$rhs, v4f32:$tval, v4f32:$fval, SETLT)), 1139 (SELECT_QSRC (CRANDC $lhs, $rhs), $tval, $fval)>; 1140def : Pat<(v4f32 (selectcc i1:$lhs, i1:$rhs, v4f32:$tval, v4f32:$fval, SETULT)), 1141 (SELECT_QSRC (CRANDC $rhs, $lhs), $tval, $fval)>; 1142def : Pat<(v4f32 (selectcc i1:$lhs, i1:$rhs, v4f32:$tval, v4f32:$fval, SETLE)), 1143 (SELECT_QSRC (CRORC $lhs, $rhs), $tval, $fval)>; 1144def : Pat<(v4f32 (selectcc i1:$lhs, i1:$rhs, v4f32:$tval, v4f32:$fval, SETULE)), 1145 (SELECT_QSRC (CRORC $rhs, $lhs), $tval, $fval)>; 1146def : Pat<(v4f32 (selectcc i1:$lhs, i1:$rhs, v4f32:$tval, v4f32:$fval, SETEQ)), 1147 (SELECT_QSRC (CREQV $lhs, $rhs), $tval, $fval)>; 1148def : Pat<(v4f32 (selectcc i1:$lhs, i1:$rhs, v4f32:$tval, v4f32:$fval, SETGE)), 1149 (SELECT_QSRC (CRORC $rhs, $lhs), $tval, $fval)>; 1150def : Pat<(v4f32 (selectcc i1:$lhs, i1:$rhs, v4f32:$tval, v4f32:$fval, SETUGE)), 1151 (SELECT_QSRC (CRORC $lhs, $rhs), $tval, $fval)>; 1152def : Pat<(v4f32 (selectcc i1:$lhs, i1:$rhs, v4f32:$tval, v4f32:$fval, SETGT)), 1153 (SELECT_QSRC (CRANDC $rhs, $lhs), $tval, $fval)>; 1154def : Pat<(v4f32 (selectcc i1:$lhs, i1:$rhs, v4f32:$tval, v4f32:$fval, SETUGT)), 1155 (SELECT_QSRC (CRANDC $lhs, $rhs), $tval, $fval)>; 1156def : Pat<(v4f32 (selectcc i1:$lhs, i1:$rhs, v4f32:$tval, v4f32:$fval, SETNE)), 1157 (SELECT_QSRC (CRXOR $lhs, $rhs), $tval, $fval)>; 1158 1159def : Pat<(v4i1 (selectcc i1:$lhs, i1:$rhs, v4i1:$tval, v4i1:$fval, SETLT)), 1160 (SELECT_QBRC (CRANDC $lhs, $rhs), $tval, $fval)>; 1161def : Pat<(v4i1 (selectcc i1:$lhs, i1:$rhs, v4i1:$tval, v4i1:$fval, SETULT)), 1162 (SELECT_QBRC (CRANDC $rhs, $lhs), $tval, $fval)>; 1163def : Pat<(v4i1 (selectcc i1:$lhs, i1:$rhs, v4i1:$tval, v4i1:$fval, SETLE)), 1164 (SELECT_QBRC (CRORC $lhs, $rhs), $tval, $fval)>; 1165def : Pat<(v4i1 (selectcc i1:$lhs, i1:$rhs, v4i1:$tval, v4i1:$fval, SETULE)), 1166 (SELECT_QBRC (CRORC $rhs, $lhs), $tval, $fval)>; 1167def : Pat<(v4i1 (selectcc i1:$lhs, i1:$rhs, v4i1:$tval, v4i1:$fval, SETEQ)), 1168 (SELECT_QBRC (CREQV $lhs, $rhs), $tval, $fval)>; 1169def : Pat<(v4i1 (selectcc i1:$lhs, i1:$rhs, v4i1:$tval, v4i1:$fval, SETGE)), 1170 (SELECT_QBRC (CRORC $rhs, $lhs), $tval, $fval)>; 1171def : Pat<(v4i1 (selectcc i1:$lhs, i1:$rhs, v4i1:$tval, v4i1:$fval, SETUGE)), 1172 (SELECT_QBRC (CRORC $lhs, $rhs), $tval, $fval)>; 1173def : Pat<(v4i1 (selectcc i1:$lhs, i1:$rhs, v4i1:$tval, v4i1:$fval, SETGT)), 1174 (SELECT_QBRC (CRANDC $rhs, $lhs), $tval, $fval)>; 1175def : Pat<(v4i1 (selectcc i1:$lhs, i1:$rhs, v4i1:$tval, v4i1:$fval, SETUGT)), 1176 (SELECT_QBRC (CRANDC $lhs, $rhs), $tval, $fval)>; 1177def : Pat<(v4i1 (selectcc i1:$lhs, i1:$rhs, v4i1:$tval, v4i1:$fval, SETNE)), 1178 (SELECT_QBRC (CRXOR $lhs, $rhs), $tval, $fval)>; 1179 1180} // end HasQPX 1181 1182let Predicates = [HasQPX, NoNaNsFPMath] in { 1183def : Pat<(fminnum v4f64:$FRA, v4f64:$FRB), 1184 (QVFSELb (QVFCMPLTb $FRA, $FRB), $FRB, $FRA)>; 1185def : Pat<(fmaxnum v4f64:$FRA, v4f64:$FRB), 1186 (QVFSELb (QVFCMPGTb $FRA, $FRB), $FRB, $FRA)>; 1187 1188def : Pat<(fminnum v4f32:$FRA, v4f32:$FRB), 1189 (QVFSELbs (QVFCMPLTbs $FRA, $FRB), $FRB, $FRA)>; 1190def : Pat<(fmaxnum v4f32:$FRA, v4f32:$FRB), 1191 (QVFSELbs (QVFCMPGTbs $FRA, $FRB), $FRB, $FRA)>; 1192} 1193 1194let Predicates = [HasQPX, NaNsFPMath] in { 1195// When either of these operands is NaN, we should return the other operand. 1196// QVFCMPLT/QVFCMPGT return false is either operand is NaN, which means we need 1197// to explicitly or with a NaN test on the second operand. 1198def : Pat<(fminnum v4f64:$FRA, v4f64:$FRB), 1199 (QVFSELb (QVFLOGICALb (QVFCMPLTb $FRA, $FRB), 1200 (QVFTSTNANb $FRB, $FRB), (i32 7)), 1201 $FRB, $FRA)>; 1202def : Pat<(fmaxnum v4f64:$FRA, v4f64:$FRB), 1203 (QVFSELb (QVFLOGICALb (QVFCMPGTb $FRA, $FRB), 1204 (QVFTSTNANb $FRB, $FRB), (i32 7)), 1205 $FRB, $FRA)>; 1206 1207def : Pat<(fminnum v4f32:$FRA, v4f32:$FRB), 1208 (QVFSELbs (QVFLOGICALb (QVFCMPLTbs $FRA, $FRB), 1209 (QVFTSTNANbs $FRB, $FRB), (i32 7)), 1210 $FRB, $FRA)>; 1211def : Pat<(fmaxnum v4f32:$FRA, v4f32:$FRB), 1212 (QVFSELbs (QVFLOGICALb (QVFCMPGTbs $FRA, $FRB), 1213 (QVFTSTNANbs $FRB, $FRB), (i32 7)), 1214 $FRB, $FRA)>; 1215} 1216 1217