| Jia Liu | e1d6196 | 2012-02-19 02:03:36 +0000 | [diff] [blame] | 1 | //===-- X86InstrFragmentsSIMD.td - x86 SIMD ISA ------------*- tablegen -*-===// | 
| David Greene | 509be1f | 2010-02-09 23:52:19 +0000 | [diff] [blame] | 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. | 
| Jia Liu | b22310f | 2012-02-18 12:03:15 +0000 | [diff] [blame] | 7 | // | 
| David Greene | 509be1f | 2010-02-09 23:52:19 +0000 | [diff] [blame] | 8 | //===----------------------------------------------------------------------===// | 
|  | 9 | // | 
|  | 10 | // This file provides pattern fragments useful for SIMD instructions. | 
|  | 11 | // | 
|  | 12 | //===----------------------------------------------------------------------===// | 
|  | 13 |  | 
|  | 14 | //===----------------------------------------------------------------------===// | 
| Bruno Cardoso Lopes | e446aef | 2015-02-05 13:22:50 +0000 | [diff] [blame] | 15 | // MMX specific DAG Nodes. | 
|  | 16 | //===----------------------------------------------------------------------===// | 
|  | 17 |  | 
|  | 18 | // Low word of MMX to GPR. | 
|  | 19 | def MMX_X86movd2w : SDNode<"X86ISD::MMX_MOVD2W", SDTypeProfile<1, 1, | 
|  | 20 | [SDTCisVT<0, i32>, SDTCisVT<1, x86mmx>]>>; | 
| Bruno Cardoso Lopes | ab9ae87 | 2015-02-05 13:23:07 +0000 | [diff] [blame] | 21 | // GPR to low word of MMX. | 
|  | 22 | def MMX_X86movw2d : SDNode<"X86ISD::MMX_MOVW2D", SDTypeProfile<1, 1, | 
|  | 23 | [SDTCisVT<0, x86mmx>, SDTCisVT<1, i32>]>>; | 
| Bruno Cardoso Lopes | e446aef | 2015-02-05 13:22:50 +0000 | [diff] [blame] | 24 |  | 
|  | 25 | //===----------------------------------------------------------------------===// | 
| David Greene | 509be1f | 2010-02-09 23:52:19 +0000 | [diff] [blame] | 26 | // MMX Pattern Fragments | 
|  | 27 | //===----------------------------------------------------------------------===// | 
|  | 28 |  | 
| Dale Johannesen | dd224d2 | 2010-09-30 23:57:10 +0000 | [diff] [blame] | 29 | def load_mmx : PatFrag<(ops node:$ptr), (x86mmx (load node:$ptr))>; | 
| David Greene | 03264ef | 2010-07-12 23:41:28 +0000 | [diff] [blame] | 30 |  | 
|  | 31 | //===----------------------------------------------------------------------===// | 
|  | 32 | // SSE specific DAG Nodes. | 
|  | 33 | //===----------------------------------------------------------------------===// | 
|  | 34 |  | 
| Craig Topper | 2b92542 | 2017-03-12 23:05:00 +0000 | [diff] [blame] | 35 | def SDTX86VFCMP : SDTypeProfile<1, 3, [SDTCisFP<0>, SDTCisVec<0>, | 
|  | 36 | SDTCisSameAs<0, 1>, SDTCisSameAs<1, 2>, | 
|  | 37 | SDTCisVT<3, i8>]>; | 
| David Greene | 03264ef | 2010-07-12 23:41:28 +0000 | [diff] [blame] | 38 |  | 
|  | 39 | def X86fmin    : SDNode<"X86ISD::FMIN",      SDTFPBinOp>; | 
|  | 40 | def X86fmax    : SDNode<"X86ISD::FMAX",      SDTFPBinOp>; | 
| Craig Topper | 56d4022 | 2017-02-22 06:54:18 +0000 | [diff] [blame] | 41 | def X86fmins   : SDNode<"X86ISD::FMINS",     SDTFPBinOp>; | 
|  | 42 | def X86fmaxs   : SDNode<"X86ISD::FMAXS",     SDTFPBinOp>; | 
| Nadav Rotem | 178250a | 2012-08-19 13:06:16 +0000 | [diff] [blame] | 43 |  | 
|  | 44 | // Commutative and Associative FMIN and FMAX. | 
|  | 45 | def X86fminc    : SDNode<"X86ISD::FMINC", SDTFPBinOp, | 
|  | 46 | [SDNPCommutative, SDNPAssociative]>; | 
|  | 47 | def X86fmaxc    : SDNode<"X86ISD::FMAXC", SDTFPBinOp, | 
|  | 48 | [SDNPCommutative, SDNPAssociative]>; | 
|  | 49 |  | 
| David Greene | 03264ef | 2010-07-12 23:41:28 +0000 | [diff] [blame] | 50 | def X86fand    : SDNode<"X86ISD::FAND",      SDTFPBinOp, | 
|  | 51 | [SDNPCommutative, SDNPAssociative]>; | 
|  | 52 | def X86for     : SDNode<"X86ISD::FOR",       SDTFPBinOp, | 
|  | 53 | [SDNPCommutative, SDNPAssociative]>; | 
|  | 54 | def X86fxor    : SDNode<"X86ISD::FXOR",      SDTFPBinOp, | 
|  | 55 | [SDNPCommutative, SDNPAssociative]>; | 
| Craig Topper | dbc387c | 2016-08-15 04:47:28 +0000 | [diff] [blame] | 56 | def X86fandn   : SDNode<"X86ISD::FANDN",     SDTFPBinOp>; | 
| David Greene | 03264ef | 2010-07-12 23:41:28 +0000 | [diff] [blame] | 57 | def X86frsqrt  : SDNode<"X86ISD::FRSQRT",    SDTFPUnaryOp>; | 
|  | 58 | def X86frcp    : SDNode<"X86ISD::FRCP",      SDTFPUnaryOp>; | 
| Michael Zuckerman | a63a129 | 2016-05-21 14:44:18 +0000 | [diff] [blame] | 59 | def X86frsqrt14s: SDNode<"X86ISD::FRSQRTS",  SDTFPBinOp>; | 
|  | 60 | def X86frcp14s : SDNode<"X86ISD::FRCPS",    SDTFPBinOp>; | 
| Duncan Sands | 0e4fcb8 | 2011-09-22 20:15:48 +0000 | [diff] [blame] | 61 | def X86fhadd   : SDNode<"X86ISD::FHADD",     SDTFPBinOp>; | 
|  | 62 | def X86fhsub   : SDNode<"X86ISD::FHSUB",     SDTFPBinOp>; | 
| Craig Topper | f984efb | 2011-11-19 09:02:40 +0000 | [diff] [blame] | 63 | def X86hadd    : SDNode<"X86ISD::HADD",      SDTIntBinOp>; | 
|  | 64 | def X86hsub    : SDNode<"X86ISD::HSUB",      SDTIntBinOp>; | 
| David Greene | 03264ef | 2010-07-12 23:41:28 +0000 | [diff] [blame] | 65 | def X86comi    : SDNode<"X86ISD::COMI",      SDTX86CmpTest>; | 
|  | 66 | def X86ucomi   : SDNode<"X86ISD::UCOMI",     SDTX86CmpTest>; | 
| Elena Demikhovsky | 47fc44e | 2013-12-16 13:52:35 +0000 | [diff] [blame] | 67 | def X86cmps    : SDNode<"X86ISD::FSETCC",     SDTX86Cmps>; | 
| David Greene | 03264ef | 2010-07-12 23:41:28 +0000 | [diff] [blame] | 68 | def X86pshufb  : SDNode<"X86ISD::PSHUFB", | 
| Craig Topper | a3ac738 | 2015-11-26 07:58:20 +0000 | [diff] [blame] | 69 | SDTypeProfile<1, 2, [SDTCVecEltisVT<0, i8>, SDTCisSameAs<0,1>, | 
| David Greene | 03264ef | 2010-07-12 23:41:28 +0000 | [diff] [blame] | 70 | SDTCisSameAs<0,2>]>>; | 
| Chandler Carruth | 6ba9730 | 2015-05-30 03:20:59 +0000 | [diff] [blame] | 71 | def X86psadbw  : SDNode<"X86ISD::PSADBW", | 
| Craig Topper | 4c175cd | 2015-11-26 07:02:21 +0000 | [diff] [blame] | 72 | SDTypeProfile<1, 2, [SDTCVecEltisVT<0, i64>, | 
|  | 73 | SDTCVecEltisVT<1, i8>, | 
|  | 74 | SDTCisSameSizeAs<0,1>, | 
| Craig Topper | 80c8b80 | 2016-08-15 04:47:30 +0000 | [diff] [blame] | 75 | SDTCisSameAs<1,2>]>, [SDNPCommutative]>; | 
| Igor Breger | f3ded81 | 2015-08-31 13:09:30 +0000 | [diff] [blame] | 76 | def X86dbpsadbw : SDNode<"X86ISD::DBPSADBW", | 
| Craig Topper | 4c175cd | 2015-11-26 07:02:21 +0000 | [diff] [blame] | 77 | SDTypeProfile<1, 3, [SDTCVecEltisVT<0, i16>, | 
|  | 78 | SDTCVecEltisVT<1, i8>, | 
|  | 79 | SDTCisSameSizeAs<0,1>, | 
| Igor Breger | f3ded81 | 2015-08-31 13:09:30 +0000 | [diff] [blame] | 80 | SDTCisSameAs<1,2>, SDTCisInt<3>]>>; | 
| Bruno Cardoso Lopes | 7ba479d | 2011-07-13 21:36:47 +0000 | [diff] [blame] | 81 | def X86andnp   : SDNode<"X86ISD::ANDNP", | 
| Bruno Cardoso Lopes | 9613b64 | 2011-07-13 21:36:51 +0000 | [diff] [blame] | 82 | SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>, | 
| Nate Begeman | 97b72c9 | 2010-12-17 22:55:37 +0000 | [diff] [blame] | 83 | SDTCisSameAs<0,2>]>>; | 
| Asaf Badouh | 5a3a023 | 2016-02-01 15:48:21 +0000 | [diff] [blame] | 84 | def X86multishift   : SDNode<"X86ISD::MULTISHIFT", | 
|  | 85 | SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisVec<1>, | 
|  | 86 | SDTCisSameAs<1,2>]>>; | 
| David Greene | 03264ef | 2010-07-12 23:41:28 +0000 | [diff] [blame] | 87 | def X86pextrb  : SDNode<"X86ISD::PEXTRB", | 
| Craig Topper | a3ac738 | 2015-11-26 07:58:20 +0000 | [diff] [blame] | 88 | SDTypeProfile<1, 2, [SDTCisVT<0, i32>, SDTCisVT<1, v16i8>, | 
|  | 89 | SDTCisPtrTy<2>]>>; | 
| David Greene | 03264ef | 2010-07-12 23:41:28 +0000 | [diff] [blame] | 90 | def X86pextrw  : SDNode<"X86ISD::PEXTRW", | 
| Craig Topper | a3ac738 | 2015-11-26 07:58:20 +0000 | [diff] [blame] | 91 | SDTypeProfile<1, 2, [SDTCisVT<0, i32>, SDTCisVT<1, v8i16>, | 
|  | 92 | SDTCisPtrTy<2>]>>; | 
| David Greene | 03264ef | 2010-07-12 23:41:28 +0000 | [diff] [blame] | 93 | def X86pinsrb  : SDNode<"X86ISD::PINSRB", | 
|  | 94 | SDTypeProfile<1, 3, [SDTCisVT<0, v16i8>, SDTCisSameAs<0,1>, | 
|  | 95 | SDTCisVT<2, i32>, SDTCisPtrTy<3>]>>; | 
|  | 96 | def X86pinsrw  : SDNode<"X86ISD::PINSRW", | 
|  | 97 | SDTypeProfile<1, 3, [SDTCisVT<0, v8i16>, SDTCisSameAs<0,1>, | 
|  | 98 | SDTCisVT<2, i32>, SDTCisPtrTy<3>]>>; | 
| Filipe Cabecinhas | 2035221 | 2014-04-21 20:07:29 +0000 | [diff] [blame] | 99 | def X86insertps : SDNode<"X86ISD::INSERTPS", | 
| David Greene | 03264ef | 2010-07-12 23:41:28 +0000 | [diff] [blame] | 100 | SDTypeProfile<1, 3, [SDTCisVT<0, v4f32>, SDTCisSameAs<0,1>, | 
| Chandler Carruth | 373b2b1 | 2014-09-06 10:00:01 +0000 | [diff] [blame] | 101 | SDTCisVT<2, v4f32>, SDTCisVT<3, i8>]>>; | 
| David Greene | 03264ef | 2010-07-12 23:41:28 +0000 | [diff] [blame] | 102 | def X86vzmovl  : SDNode<"X86ISD::VZEXT_MOVL", | 
|  | 103 | SDTypeProfile<1, 1, [SDTCisSameAs<0,1>]>>; | 
| Elena Demikhovsky | 8d7e56c | 2012-04-22 09:39:03 +0000 | [diff] [blame] | 104 |  | 
| David Greene | 03264ef | 2010-07-12 23:41:28 +0000 | [diff] [blame] | 105 | def X86vzload  : SDNode<"X86ISD::VZEXT_LOAD", SDTLoad, | 
| Chris Lattner | 54e5329 | 2010-09-22 00:34:38 +0000 | [diff] [blame] | 106 | [SDNPHasChain, SDNPMayLoad, SDNPMemOperand]>; | 
| Michael Liao | 34107b9 | 2012-08-14 21:24:47 +0000 | [diff] [blame] | 107 |  | 
| Michael Liao | 1be96bb | 2012-10-23 17:34:00 +0000 | [diff] [blame] | 108 | def X86vzext   : SDNode<"X86ISD::VZEXT", | 
|  | 109 | SDTypeProfile<1, 1, [SDTCisVec<0>, SDTCisVec<1>, | 
| Craig Topper | aefaab6 | 2014-01-26 04:59:39 +0000 | [diff] [blame] | 110 | SDTCisInt<0>, SDTCisInt<1>, | 
|  | 111 | SDTCisOpSmallerThanOp<1, 0>]>>; | 
| Michael Liao | 1be96bb | 2012-10-23 17:34:00 +0000 | [diff] [blame] | 112 |  | 
|  | 113 | def X86vsext   : SDNode<"X86ISD::VSEXT", | 
|  | 114 | SDTypeProfile<1, 1, [SDTCisVec<0>, SDTCisVec<1>, | 
| Craig Topper | aefaab6 | 2014-01-26 04:59:39 +0000 | [diff] [blame] | 115 | SDTCisInt<0>, SDTCisInt<1>, | 
|  | 116 | SDTCisOpSmallerThanOp<1, 0>]>>; | 
| Michael Liao | 1be96bb | 2012-10-23 17:34:00 +0000 | [diff] [blame] | 117 |  | 
| Igor Breger | 074a64e | 2015-07-24 17:24:15 +0000 | [diff] [blame] | 118 | def SDTVtrunc    : SDTypeProfile<1, 1, [SDTCisVec<0>, SDTCisVec<1>, | 
|  | 119 | SDTCisInt<0>, SDTCisInt<1>, | 
|  | 120 | SDTCisOpSmallerThanOp<0, 1>]>; | 
|  | 121 |  | 
|  | 122 | def X86vtrunc    : SDNode<"X86ISD::VTRUNC",   SDTVtrunc>; | 
|  | 123 | def X86vtruncs   : SDNode<"X86ISD::VTRUNCS",  SDTVtrunc>; | 
|  | 124 | def X86vtruncus  : SDNode<"X86ISD::VTRUNCUS", SDTVtrunc>; | 
|  | 125 |  | 
| Michael Liao | 34107b9 | 2012-08-14 21:24:47 +0000 | [diff] [blame] | 126 | def X86vfpext  : SDNode<"X86ISD::VFPEXT", | 
| Craig Topper | a5d0bf5 | 2016-05-09 05:34:14 +0000 | [diff] [blame] | 127 | SDTypeProfile<1, 1, [SDTCVecEltisVT<0, f64>, | 
|  | 128 | SDTCVecEltisVT<1, f32>, | 
|  | 129 | SDTCisSameSizeAs<0, 1>]>>; | 
| Michael Liao | e999b86 | 2012-10-10 16:53:28 +0000 | [diff] [blame] | 130 | def X86vfpround: SDNode<"X86ISD::VFPROUND", | 
| Craig Topper | a5d0bf5 | 2016-05-09 05:34:14 +0000 | [diff] [blame] | 131 | SDTypeProfile<1, 1, [SDTCVecEltisVT<0, f32>, | 
|  | 132 | SDTCVecEltisVT<1, f64>, | 
|  | 133 | SDTCisSameSizeAs<0, 1>]>>; | 
| Michael Liao | 34107b9 | 2012-08-14 21:24:47 +0000 | [diff] [blame] | 134 |  | 
| Craig Topper | a02e394 | 2016-09-23 06:24:43 +0000 | [diff] [blame] | 135 | def X86froundRnd: SDNode<"X86ISD::VFPROUNDS_RND", | 
| Craig Topper | a58abd1 | 2016-05-09 05:34:12 +0000 | [diff] [blame] | 136 | SDTypeProfile<1, 3, [SDTCVecEltisVT<0, f32>, | 
|  | 137 | SDTCisSameAs<0, 1>, | 
| Asaf Badouh | 2744d21 | 2015-09-20 14:31:19 +0000 | [diff] [blame] | 138 | SDTCVecEltisVT<2, f64>, | 
| Craig Topper | a58abd1 | 2016-05-09 05:34:12 +0000 | [diff] [blame] | 139 | SDTCisSameSizeAs<0, 2>, | 
| Craig Topper | a5d0bf5 | 2016-05-09 05:34:14 +0000 | [diff] [blame] | 140 | SDTCisVT<3, i32>]>>; | 
| Asaf Badouh | 2744d21 | 2015-09-20 14:31:19 +0000 | [diff] [blame] | 141 |  | 
| Craig Topper | a02e394 | 2016-09-23 06:24:43 +0000 | [diff] [blame] | 142 | def X86fpextRnd  : SDNode<"X86ISD::VFPEXTS_RND", | 
| Craig Topper | a58abd1 | 2016-05-09 05:34:12 +0000 | [diff] [blame] | 143 | SDTypeProfile<1, 3, [SDTCVecEltisVT<0, f64>, | 
|  | 144 | SDTCisSameAs<0, 1>, | 
| Asaf Badouh | 2744d21 | 2015-09-20 14:31:19 +0000 | [diff] [blame] | 145 | SDTCVecEltisVT<2, f32>, | 
| Craig Topper | a58abd1 | 2016-05-09 05:34:12 +0000 | [diff] [blame] | 146 | SDTCisSameSizeAs<0, 2>, | 
| Craig Topper | a5d0bf5 | 2016-05-09 05:34:14 +0000 | [diff] [blame] | 147 | SDTCisVT<3, i32>]>>; | 
| Asaf Badouh | 2744d21 | 2015-09-20 14:31:19 +0000 | [diff] [blame] | 148 |  | 
| Craig Topper | 0946264 | 2012-01-22 19:15:14 +0000 | [diff] [blame] | 149 | def X86vshldq  : SDNode<"X86ISD::VSHLDQ",    SDTIntShiftOp>; | 
|  | 150 | def X86vshrdq  : SDNode<"X86ISD::VSRLDQ",    SDTIntShiftOp>; | 
| Craig Topper | 0b7ad76 | 2012-01-22 23:36:02 +0000 | [diff] [blame] | 151 | def X86cmpp    : SDNode<"X86ISD::CMPP",      SDTX86VFCMP>; | 
| Craig Topper | bd488437 | 2012-01-22 22:42:16 +0000 | [diff] [blame] | 152 | def X86pcmpeq  : SDNode<"X86ISD::PCMPEQ", SDTIntBinOp, [SDNPCommutative]>; | 
|  | 153 | def X86pcmpgt  : SDNode<"X86ISD::PCMPGT", SDTIntBinOp>; | 
| David Greene | 03264ef | 2010-07-12 23:41:28 +0000 | [diff] [blame] | 154 |  | 
| Elena Demikhovsky | 60b1f28 | 2013-08-13 13:24:07 +0000 | [diff] [blame] | 155 | def X86IntCmpMask : SDTypeProfile<1, 2, | 
| Craig Topper | f8ad647 | 2016-09-02 04:25:33 +0000 | [diff] [blame] | 156 | [SDTCisVec<0>, SDTCVecEltisVT<0, i1>, SDTCisSameAs<1, 2>, SDTCisInt<1>, | 
|  | 157 | SDTCisSameNumEltsAs<0, 1>]>; | 
| Elena Demikhovsky | 60b1f28 | 2013-08-13 13:24:07 +0000 | [diff] [blame] | 158 | def X86pcmpeqm  : SDNode<"X86ISD::PCMPEQM", X86IntCmpMask, [SDNPCommutative]>; | 
|  | 159 | def X86pcmpgtm  : SDNode<"X86ISD::PCMPGTM", X86IntCmpMask>; | 
|  | 160 |  | 
| Elena Demikhovsky | 47fc44e | 2013-12-16 13:52:35 +0000 | [diff] [blame] | 161 | def X86CmpMaskCC : | 
| Elena Demikhovsky | 29792e9 | 2015-05-07 11:24:42 +0000 | [diff] [blame] | 162 | SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCVecEltisVT<0, i1>, | 
|  | 163 | SDTCisVec<1>, SDTCisSameAs<2, 1>, | 
|  | 164 | SDTCisSameNumEltsAs<0, 1>, SDTCisVT<3, i8>]>; | 
|  | 165 | def X86CmpMaskCCRound : | 
|  | 166 | SDTypeProfile<1, 4, [SDTCisVec<0>,SDTCVecEltisVT<0, i1>, | 
|  | 167 | SDTCisVec<1>, SDTCisSameAs<2, 1>, | 
|  | 168 | SDTCisSameNumEltsAs<0, 1>, SDTCisVT<3, i8>, | 
| Craig Topper | f8ad647 | 2016-09-02 04:25:33 +0000 | [diff] [blame] | 169 | SDTCisVT<4, i32>]>; | 
| Elena Demikhovsky | 47fc44e | 2013-12-16 13:52:35 +0000 | [diff] [blame] | 170 | def X86CmpMaskCCScalar : | 
|  | 171 | SDTypeProfile<1, 3, [SDTCisInt<0>, SDTCisSameAs<1, 2>, SDTCisVT<3, i8>]>; | 
|  | 172 |  | 
| Igor Breger | b7e1f9d | 2015-09-20 15:15:10 +0000 | [diff] [blame] | 173 | def X86CmpMaskCCScalarRound : | 
|  | 174 | SDTypeProfile<1, 4, [SDTCisInt<0>, SDTCisSameAs<1, 2>, SDTCisVT<3, i8>, | 
| Craig Topper | f8ad647 | 2016-09-02 04:25:33 +0000 | [diff] [blame] | 175 | SDTCisVT<4, i32>]>; | 
| Igor Breger | b7e1f9d | 2015-09-20 15:15:10 +0000 | [diff] [blame] | 176 |  | 
|  | 177 | def X86cmpm     : SDNode<"X86ISD::CMPM",     X86CmpMaskCC>; | 
|  | 178 | def X86cmpmRnd  : SDNode<"X86ISD::CMPM_RND", X86CmpMaskCCRound>; | 
|  | 179 | def X86cmpmu    : SDNode<"X86ISD::CMPMU",    X86CmpMaskCC>; | 
| Craig Topper | 29f1a1f | 2016-09-21 06:37:54 +0000 | [diff] [blame] | 180 | def X86cmpms    : SDNode<"X86ISD::FSETCCM",   X86CmpMaskCCScalar>; | 
|  | 181 | def X86cmpmsRnd : SDNode<"X86ISD::FSETCCM_RND",   X86CmpMaskCCScalarRound>; | 
| Elena Demikhovsky | 60b1f28 | 2013-08-13 13:24:07 +0000 | [diff] [blame] | 182 |  | 
| Craig Topper | 0946264 | 2012-01-22 19:15:14 +0000 | [diff] [blame] | 183 | def X86vshl    : SDNode<"X86ISD::VSHL", | 
|  | 184 | SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>, | 
|  | 185 | SDTCisVec<2>]>>; | 
|  | 186 | def X86vsrl    : SDNode<"X86ISD::VSRL", | 
|  | 187 | SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>, | 
|  | 188 | SDTCisVec<2>]>>; | 
|  | 189 | def X86vsra    : SDNode<"X86ISD::VSRA", | 
|  | 190 | SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>, | 
|  | 191 | SDTCisVec<2>]>>; | 
|  | 192 |  | 
| Craig Topper | 05629d0 | 2016-07-24 07:32:45 +0000 | [diff] [blame] | 193 | def X86vsrav   : SDNode<"X86ISD::VSRAV" , | 
|  | 194 | SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>, | 
|  | 195 | SDTCisSameAs<0,2>]>>; | 
| Igor Breger | e59165c | 2016-06-20 07:05:43 +0000 | [diff] [blame] | 196 |  | 
| Craig Topper | 0946264 | 2012-01-22 19:15:14 +0000 | [diff] [blame] | 197 | def X86vshli   : SDNode<"X86ISD::VSHLI", SDTIntShiftOp>; | 
|  | 198 | def X86vsrli   : SDNode<"X86ISD::VSRLI", SDTIntShiftOp>; | 
|  | 199 | def X86vsrai   : SDNode<"X86ISD::VSRAI", SDTIntShiftOp>; | 
|  | 200 |  | 
| Craig Topper | 3b7e823 | 2017-01-30 00:06:01 +0000 | [diff] [blame] | 201 | def X86kshiftl : SDNode<"X86ISD::KSHIFTL", | 
|  | 202 | SDTypeProfile<1, 2, [SDTCVecEltisVT<0, i1>, | 
|  | 203 | SDTCisSameAs<0, 1>, | 
|  | 204 | SDTCisVT<2, i8>]>>; | 
|  | 205 | def X86kshiftr : SDNode<"X86ISD::KSHIFTR", | 
|  | 206 | SDTypeProfile<1, 2, [SDTCVecEltisVT<0, i1>, | 
|  | 207 | SDTCisSameAs<0, 1>, | 
|  | 208 | SDTCisVT<2, i8>]>>; | 
|  | 209 |  | 
| Michael Zuckerman | 2ddcbcf | 2016-01-12 21:19:17 +0000 | [diff] [blame] | 210 | def X86vrotli  : SDNode<"X86ISD::VROTLI", SDTIntShiftOp>; | 
| Michael Zuckerman | 298a680 | 2016-01-13 12:39:33 +0000 | [diff] [blame] | 211 | def X86vrotri  : SDNode<"X86ISD::VROTRI", SDTIntShiftOp>; | 
| Michael Zuckerman | 2ddcbcf | 2016-01-12 21:19:17 +0000 | [diff] [blame] | 212 |  | 
| Simon Pilgrim | 86c5e85 | 2015-10-17 19:04:24 +0000 | [diff] [blame] | 213 | def X86vprot   : SDNode<"X86ISD::VPROT", | 
|  | 214 | SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>, | 
| Craig Topper | a3ac738 | 2015-11-26 07:58:20 +0000 | [diff] [blame] | 215 | SDTCisSameAs<0,2>]>>; | 
| Simon Pilgrim | 86c5e85 | 2015-10-17 19:04:24 +0000 | [diff] [blame] | 216 | def X86vproti  : SDNode<"X86ISD::VPROTI", | 
|  | 217 | SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>, | 
| Craig Topper | a3ac738 | 2015-11-26 07:58:20 +0000 | [diff] [blame] | 218 | SDTCisVT<2, i8>]>>; | 
| Simon Pilgrim | 86c5e85 | 2015-10-17 19:04:24 +0000 | [diff] [blame] | 219 |  | 
| Simon Pilgrim | 3d11c99 | 2015-09-30 08:17:50 +0000 | [diff] [blame] | 220 | def X86vpshl   : SDNode<"X86ISD::VPSHL", | 
|  | 221 | SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>, | 
| Craig Topper | a3ac738 | 2015-11-26 07:58:20 +0000 | [diff] [blame] | 222 | SDTCisSameAs<0,2>]>>; | 
| Simon Pilgrim | 3d11c99 | 2015-09-30 08:17:50 +0000 | [diff] [blame] | 223 | def X86vpsha   : SDNode<"X86ISD::VPSHA", | 
|  | 224 | SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>, | 
| Craig Topper | a3ac738 | 2015-11-26 07:58:20 +0000 | [diff] [blame] | 225 | SDTCisSameAs<0,2>]>>; | 
| Simon Pilgrim | 3d11c99 | 2015-09-30 08:17:50 +0000 | [diff] [blame] | 226 |  | 
| Simon Pilgrim | 52d47e5 | 2015-10-11 14:15:17 +0000 | [diff] [blame] | 227 | def X86vpcom   : SDNode<"X86ISD::VPCOM", | 
|  | 228 | SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisSameAs<0,1>, | 
| Craig Topper | a3ac738 | 2015-11-26 07:58:20 +0000 | [diff] [blame] | 229 | SDTCisSameAs<0,2>, | 
|  | 230 | SDTCisVT<3, i8>]>>; | 
| Simon Pilgrim | 52d47e5 | 2015-10-11 14:15:17 +0000 | [diff] [blame] | 231 | def X86vpcomu  : SDNode<"X86ISD::VPCOMU", | 
|  | 232 | SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisSameAs<0,1>, | 
| Craig Topper | a3ac738 | 2015-11-26 07:58:20 +0000 | [diff] [blame] | 233 | SDTCisSameAs<0,2>, | 
|  | 234 | SDTCisVT<3, i8>]>>; | 
| Simon Pilgrim | e85506b | 2016-06-03 08:06:03 +0000 | [diff] [blame] | 235 | def X86vpermil2 : SDNode<"X86ISD::VPERMIL2", | 
|  | 236 | SDTypeProfile<1, 4, [SDTCisVec<0>, SDTCisSameAs<0,1>, | 
|  | 237 | SDTCisSameAs<0,2>, | 
|  | 238 | SDTCisSameSizeAs<0,3>, | 
|  | 239 | SDTCisSameNumEltsAs<0, 3>, | 
| Craig Topper | 811756b | 2017-02-18 22:53:43 +0000 | [diff] [blame] | 240 | SDTCisFP<0>, SDTCisInt<3>, | 
| Simon Pilgrim | e85506b | 2016-06-03 08:06:03 +0000 | [diff] [blame] | 241 | SDTCisVT<4, i8>]>>; | 
| Simon Pilgrim | 572ca71 | 2016-03-24 11:52:43 +0000 | [diff] [blame] | 242 | def X86vpperm : SDNode<"X86ISD::VPPERM", | 
|  | 243 | SDTypeProfile<1, 3, [SDTCisVT<0, v16i8>, SDTCisSameAs<0,1>, | 
| Craig Topper | 06ae5e8 | 2017-02-19 01:54:47 +0000 | [diff] [blame] | 244 | SDTCisSameAs<0,2>, SDTCisSameAs<0, 3>]>>; | 
| Simon Pilgrim | 572ca71 | 2016-03-24 11:52:43 +0000 | [diff] [blame] | 245 |  | 
| David Greene | 03264ef | 2010-07-12 23:41:28 +0000 | [diff] [blame] | 246 | def SDTX86CmpPTest : SDTypeProfile<1, 2, [SDTCisVT<0, i32>, | 
| Bruno Cardoso Lopes | 91d61df | 2010-08-10 23:25:42 +0000 | [diff] [blame] | 247 | SDTCisVec<1>, | 
|  | 248 | SDTCisSameAs<2, 1>]>; | 
| Igor Breger | 639fde7 | 2016-03-03 14:18:38 +0000 | [diff] [blame] | 249 |  | 
|  | 250 | def SDTX86Testm : SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisVec<1>, | 
|  | 251 | SDTCisSameAs<2, 1>, SDTCVecEltisVT<0, i1>, | 
|  | 252 | SDTCisSameNumEltsAs<0, 1>]>; | 
|  | 253 |  | 
| Craig Topper | 80c8b80 | 2016-08-15 04:47:30 +0000 | [diff] [blame] | 254 | def X86addus   : SDNode<"X86ISD::ADDUS", SDTIntBinOp, [SDNPCommutative]>; | 
| Benjamin Kramer | b16ccde | 2012-12-15 16:47:44 +0000 | [diff] [blame] | 255 | def X86subus   : SDNode<"X86ISD::SUBUS", SDTIntBinOp>; | 
| Craig Topper | 80c8b80 | 2016-08-15 04:47:30 +0000 | [diff] [blame] | 256 | def X86adds    : SDNode<"X86ISD::ADDS", SDTIntBinOp, [SDNPCommutative]>; | 
| Elena Demikhovsky | 5226638 | 2015-05-04 12:35:55 +0000 | [diff] [blame] | 257 | def X86subs    : SDNode<"X86ISD::SUBS", SDTIntBinOp>; | 
| Craig Topper | 80c8b80 | 2016-08-15 04:47:30 +0000 | [diff] [blame] | 258 | def X86mulhrs  : SDNode<"X86ISD::MULHRS", SDTIntBinOp, [SDNPCommutative]>; | 
|  | 259 | def X86avg     : SDNode<"X86ISD::AVG" , SDTIntBinOp, [SDNPCommutative]>; | 
| David Greene | 03264ef | 2010-07-12 23:41:28 +0000 | [diff] [blame] | 260 | def X86ptest   : SDNode<"X86ISD::PTEST", SDTX86CmpPTest>; | 
| Bruno Cardoso Lopes | 91d61df | 2010-08-10 23:25:42 +0000 | [diff] [blame] | 261 | def X86testp   : SDNode<"X86ISD::TESTP", SDTX86CmpPTest>; | 
| Elena Demikhovsky | 40864b6 | 2013-08-05 08:52:21 +0000 | [diff] [blame] | 262 | def X86kortest : SDNode<"X86ISD::KORTEST", SDTX86CmpPTest>; | 
| Igor Breger | 5ea0a681 | 2015-08-31 13:30:19 +0000 | [diff] [blame] | 263 | def X86ktest   : SDNode<"X86ISD::KTEST", SDTX86CmpPTest>; | 
| Igor Breger | 639fde7 | 2016-03-03 14:18:38 +0000 | [diff] [blame] | 264 | def X86testm   : SDNode<"X86ISD::TESTM", SDTX86Testm, [SDNPCommutative]>; | 
|  | 265 | def X86testnm  : SDNode<"X86ISD::TESTNM", SDTX86Testm, [SDNPCommutative]>; | 
|  | 266 |  | 
| Simon Pilgrim | cd0dfc9 | 2016-04-03 18:22:03 +0000 | [diff] [blame] | 267 | def X86movmsk : SDNode<"X86ISD::MOVMSK", | 
|  | 268 | SDTypeProfile<1, 1, [SDTCisVT<0, i32>, SDTCisVec<1>]>>; | 
|  | 269 |  | 
| Craig Topper | 74ed087 | 2016-05-18 06:55:59 +0000 | [diff] [blame] | 270 | def X86select  : SDNode<"X86ISD::SELECT", | 
|  | 271 | SDTypeProfile<1, 3, [SDTCVecEltisVT<1, i1>, | 
|  | 272 | SDTCisSameAs<0, 2>, | 
|  | 273 | SDTCisSameAs<2, 3>, | 
|  | 274 | SDTCisSameNumEltsAs<0, 1>]>>; | 
|  | 275 |  | 
| Craig Topper | aeca046 | 2016-09-24 21:42:47 +0000 | [diff] [blame] | 276 | def X86selects : SDNode<"X86ISD::SELECTS", | 
| Guy Blank | 548e22a | 2017-05-19 12:35:15 +0000 | [diff] [blame] | 277 | SDTypeProfile<1, 3, [SDTCisVT<1, v1i1>, | 
| Craig Topper | 74ed087 | 2016-05-18 06:55:59 +0000 | [diff] [blame] | 278 | SDTCisSameAs<0, 2>, | 
|  | 279 | SDTCisSameAs<2, 3>]>>; | 
| David Greene | 03264ef | 2010-07-12 23:41:28 +0000 | [diff] [blame] | 280 |  | 
| Craig Topper | 1d471e3 | 2012-02-05 03:14:49 +0000 | [diff] [blame] | 281 | def X86pmuludq : SDNode<"X86ISD::PMULUDQ", | 
| Craig Topper | a3ac738 | 2015-11-26 07:58:20 +0000 | [diff] [blame] | 282 | SDTypeProfile<1, 2, [SDTCVecEltisVT<0, i64>, | 
|  | 283 | SDTCVecEltisVT<1, i32>, | 
|  | 284 | SDTCisSameSizeAs<0,1>, | 
| Craig Topper | 80c8b80 | 2016-08-15 04:47:30 +0000 | [diff] [blame] | 285 | SDTCisSameAs<1,2>]>, | 
|  | 286 | [SDNPCommutative]>; | 
| Benjamin Kramer | 6d2dff6 | 2014-04-26 14:12:19 +0000 | [diff] [blame] | 287 | def X86pmuldq  : SDNode<"X86ISD::PMULDQ", | 
| Craig Topper | a3ac738 | 2015-11-26 07:58:20 +0000 | [diff] [blame] | 288 | SDTypeProfile<1, 2, [SDTCVecEltisVT<0, i64>, | 
|  | 289 | SDTCVecEltisVT<1, i32>, | 
|  | 290 | SDTCisSameSizeAs<0,1>, | 
| Craig Topper | 80c8b80 | 2016-08-15 04:47:30 +0000 | [diff] [blame] | 291 | SDTCisSameAs<1,2>]>, | 
|  | 292 | [SDNPCommutative]>; | 
| Craig Topper | 1d471e3 | 2012-02-05 03:14:49 +0000 | [diff] [blame] | 293 |  | 
| Simon Pilgrim | d85cae3 | 2015-07-06 20:46:41 +0000 | [diff] [blame] | 294 | def X86extrqi : SDNode<"X86ISD::EXTRQI", | 
|  | 295 | SDTypeProfile<1, 3, [SDTCisVT<0, v2i64>, SDTCisSameAs<0,1>, | 
|  | 296 | SDTCisVT<2, i8>, SDTCisVT<3, i8>]>>; | 
|  | 297 | def X86insertqi : SDNode<"X86ISD::INSERTQI", | 
|  | 298 | SDTypeProfile<1, 4, [SDTCisVT<0, v2i64>, SDTCisSameAs<0,1>, | 
|  | 299 | SDTCisSameAs<1,2>, SDTCisVT<3, i8>, | 
|  | 300 | SDTCisVT<4, i8>]>>; | 
|  | 301 |  | 
| Bruno Cardoso Lopes | 6f3b38a | 2010-08-20 22:55:05 +0000 | [diff] [blame] | 302 | // Specific shuffle nodes - At some point ISD::VECTOR_SHUFFLE will always get | 
|  | 303 | // translated into one of the target nodes below during lowering. | 
|  | 304 | // Note: this is a work in progress... | 
|  | 305 | def SDTShuff1Op : SDTypeProfile<1, 1, [SDTCisVec<0>, SDTCisSameAs<0,1>]>; | 
|  | 306 | def SDTShuff2Op : SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>, | 
|  | 307 | SDTCisSameAs<0,2>]>; | 
|  | 308 |  | 
| Chandler Carruth | 6d5916a | 2014-09-23 10:08:29 +0000 | [diff] [blame] | 309 | def SDTShuff2OpM : SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>, | 
| Craig Topper | a3ac738 | 2015-11-26 07:58:20 +0000 | [diff] [blame] | 310 | SDTCisSameSizeAs<0,2>, | 
| Craig Topper | 06ae5e8 | 2017-02-19 01:54:47 +0000 | [diff] [blame] | 311 | SDTCisSameNumEltsAs<0,2>, | 
|  | 312 | SDTCisFP<0>, SDTCisInt<2>]>; | 
| Bruno Cardoso Lopes | 6f3b38a | 2010-08-20 22:55:05 +0000 | [diff] [blame] | 313 | def SDTShuff2OpI : SDTypeProfile<1, 2, [SDTCisVec<0>, | 
| Craig Topper | a3ac738 | 2015-11-26 07:58:20 +0000 | [diff] [blame] | 314 | SDTCisSameAs<0,1>, SDTCisVT<2, i8>]>; | 
| Bruno Cardoso Lopes | 6f3b38a | 2010-08-20 22:55:05 +0000 | [diff] [blame] | 315 | def SDTShuff3OpI : SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisSameAs<0,1>, | 
| Craig Topper | a3ac738 | 2015-11-26 07:58:20 +0000 | [diff] [blame] | 316 | SDTCisSameAs<0,2>, SDTCisVT<3, i8>]>; | 
| Craig Topper | 06ae5e8 | 2017-02-19 01:54:47 +0000 | [diff] [blame] | 317 | def SDTFPBinOpImmRound: SDTypeProfile<1, 4, [SDTCisFP<0>, SDTCisVec<0>, | 
|  | 318 | SDTCisSameAs<0,1>, | 
|  | 319 | SDTCisSameAs<0,2>, | 
|  | 320 | SDTCisVT<3, i32>, | 
|  | 321 | SDTCisVT<4, i32>]>; | 
| Craig Topper | 7ee092a | 2016-05-19 02:05:55 +0000 | [diff] [blame] | 322 | def SDTFPTernaryOpImmRound: SDTypeProfile<1, 5, [SDTCisFP<0>, SDTCisSameAs<0,1>, | 
|  | 323 | SDTCisSameAs<0,2>, | 
|  | 324 | SDTCisInt<3>, | 
|  | 325 | SDTCisSameSizeAs<0, 3>, | 
|  | 326 | SDTCisSameNumEltsAs<0, 3>, | 
|  | 327 | SDTCisVT<4, i32>, | 
|  | 328 | SDTCisVT<5, i32>]>; | 
| Craig Topper | 06ae5e8 | 2017-02-19 01:54:47 +0000 | [diff] [blame] | 329 | def SDTFPUnaryOpImmRound: SDTypeProfile<1, 3, [SDTCisFP<0>, SDTCisVec<0>, | 
|  | 330 | SDTCisSameAs<0,1>, | 
|  | 331 | SDTCisVT<2, i32>, | 
|  | 332 | SDTCisVT<3, i32>]>; | 
| Bruno Cardoso Lopes | 6f3b38a | 2010-08-20 22:55:05 +0000 | [diff] [blame] | 333 |  | 
| Elena Demikhovsky | 45c54ad | 2013-08-07 12:34:55 +0000 | [diff] [blame] | 334 | def SDTVBroadcast  : SDTypeProfile<1, 1, [SDTCisVec<0>]>; | 
| Asaf Badouh | 0d957b8 | 2015-11-18 09:42:45 +0000 | [diff] [blame] | 335 | def SDTVBroadcastm : SDTypeProfile<1, 1, [SDTCisVec<0>, | 
|  | 336 | SDTCisInt<0>, SDTCisInt<1>]>; | 
| Elena Demikhovsky | 45c54ad | 2013-08-07 12:34:55 +0000 | [diff] [blame] | 337 |  | 
| Nadav Rotem | 9bc178a | 2012-04-11 06:40:27 +0000 | [diff] [blame] | 338 | def SDTBlend : SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisSameAs<0,1>, | 
| Chandler Carruth | 373b2b1 | 2014-09-06 10:00:01 +0000 | [diff] [blame] | 339 | SDTCisSameAs<1,2>, SDTCisVT<3, i8>]>; | 
| Elena Demikhovsky | 3cb3b00 | 2012-08-01 12:06:00 +0000 | [diff] [blame] | 340 |  | 
| Craig Topper | 06ae5e8 | 2017-02-19 01:54:47 +0000 | [diff] [blame] | 341 | def SDTTernlog  : SDTypeProfile<1, 4, [SDTCisInt<0>, SDTCisVec<0>, | 
|  | 342 | SDTCisSameAs<0,1>, SDTCisSameAs<0,2>, | 
|  | 343 | SDTCisSameAs<0,3>, SDTCisVT<4, i8>]>; | 
| Igor Breger | b4bb190 | 2015-10-15 12:33:24 +0000 | [diff] [blame] | 344 |  | 
| Elena Demikhovsky | 714f23b | 2015-02-18 07:59:20 +0000 | [diff] [blame] | 345 | def SDTFPBinOpRound : SDTypeProfile<1, 3, [      // fadd_round, fmul_round, etc. | 
| Craig Topper | 095fc41 | 2016-05-18 06:56:01 +0000 | [diff] [blame] | 346 | SDTCisSameAs<0, 1>, SDTCisSameAs<0, 2>, SDTCisFP<0>, SDTCisVT<3, i32>]>; | 
| Elena Demikhovsky | 714f23b | 2015-02-18 07:59:20 +0000 | [diff] [blame] | 347 |  | 
| Asaf Badouh | 402ebb3 | 2015-06-03 13:41:48 +0000 | [diff] [blame] | 348 | def SDTFPUnaryOpRound : SDTypeProfile<1, 2, [      // fsqrt_round, fgetexp_round, etc. | 
| Craig Topper | 095fc41 | 2016-05-18 06:56:01 +0000 | [diff] [blame] | 349 | SDTCisSameAs<0, 1>, SDTCisFP<0>, SDTCisVT<2, i32>]>; | 
| Asaf Badouh | 402ebb3 | 2015-06-03 13:41:48 +0000 | [diff] [blame] | 350 |  | 
| Elena Demikhovsky | 7b0dd39 | 2015-01-28 10:21:27 +0000 | [diff] [blame] | 351 | def SDTFmaRound : SDTypeProfile<1, 4, [SDTCisSameAs<0,1>, | 
| Craig Topper | 095fc41 | 2016-05-18 06:56:01 +0000 | [diff] [blame] | 352 | SDTCisSameAs<1,2>, SDTCisSameAs<1,3>, | 
| Craig Topper | 06ae5e8 | 2017-02-19 01:54:47 +0000 | [diff] [blame] | 353 | SDTCisFP<0>, SDTCisVT<4, i32>]>; | 
| Bruno Cardoso Lopes | be5e987 | 2011-08-17 02:29:19 +0000 | [diff] [blame] | 354 |  | 
| Craig Topper | bbe3e46 | 2017-08-17 01:48:00 +0000 | [diff] [blame] | 355 | def X86PAlignr : SDNode<"X86ISD::PALIGNR", | 
|  | 356 | SDTypeProfile<1, 3, [SDTCVecEltisVT<0, i8>, | 
|  | 357 | SDTCisSameAs<0,1>, | 
|  | 358 | SDTCisSameAs<0,2>, | 
|  | 359 | SDTCisVT<3, i8>]>>; | 
| Adam Nemet | 2f10cc6 | 2014-08-05 17:22:55 +0000 | [diff] [blame] | 360 | def X86VAlign  : SDNode<"X86ISD::VALIGN", SDTShuff3OpI>; | 
| Igor Breger | 0dcd8bc | 2015-09-03 09:05:31 +0000 | [diff] [blame] | 361 |  | 
| Igor Breger | 0dcd8bc | 2015-09-03 09:05:31 +0000 | [diff] [blame] | 362 | def X86Conflict : SDNode<"X86ISD::CONFLICT", SDTIntUnaryOp>; | 
| Bruno Cardoso Lopes | 6f3b38a | 2010-08-20 22:55:05 +0000 | [diff] [blame] | 363 |  | 
|  | 364 | def X86PShufd  : SDNode<"X86ISD::PSHUFD", SDTShuff2OpI>; | 
|  | 365 | def X86PShufhw : SDNode<"X86ISD::PSHUFHW", SDTShuff2OpI>; | 
|  | 366 | def X86PShuflw : SDNode<"X86ISD::PSHUFLW", SDTShuff2OpI>; | 
|  | 367 |  | 
| Elena Demikhovsky | 9e38086 | 2015-06-03 10:56:40 +0000 | [diff] [blame] | 368 | def X86Shufp   : SDNode<"X86ISD::SHUFP", SDTShuff3OpI>; | 
|  | 369 | def X86Shuf128 : SDNode<"X86ISD::SHUF128", SDTShuff3OpI>; | 
| Bruno Cardoso Lopes | 6f3b38a | 2010-08-20 22:55:05 +0000 | [diff] [blame] | 370 |  | 
|  | 371 | def X86Movddup  : SDNode<"X86ISD::MOVDDUP", SDTShuff1Op>; | 
|  | 372 | def X86Movshdup : SDNode<"X86ISD::MOVSHDUP", SDTShuff1Op>; | 
|  | 373 | def X86Movsldup : SDNode<"X86ISD::MOVSLDUP", SDTShuff1Op>; | 
|  | 374 |  | 
| Bruno Cardoso Lopes | 6f3b38a | 2010-08-20 22:55:05 +0000 | [diff] [blame] | 375 | def X86Movsd : SDNode<"X86ISD::MOVSD", SDTShuff2Op>; | 
|  | 376 | def X86Movss : SDNode<"X86ISD::MOVSS", SDTShuff2Op>; | 
|  | 377 |  | 
|  | 378 | def X86Movlhps : SDNode<"X86ISD::MOVLHPS", SDTShuff2Op>; | 
| Bruno Cardoso Lopes | 6f3b38a | 2010-08-20 22:55:05 +0000 | [diff] [blame] | 379 | def X86Movlhpd : SDNode<"X86ISD::MOVLHPD", SDTShuff2Op>; | 
| Bruno Cardoso Lopes | 03e4c35 | 2010-08-31 21:15:21 +0000 | [diff] [blame] | 380 | def X86Movhlps : SDNode<"X86ISD::MOVHLPS", SDTShuff2Op>; | 
| Bruno Cardoso Lopes | 6f3b38a | 2010-08-20 22:55:05 +0000 | [diff] [blame] | 381 |  | 
| Bruno Cardoso Lopes | b382521 | 2010-09-01 05:08:25 +0000 | [diff] [blame] | 382 | def X86Movlps : SDNode<"X86ISD::MOVLPS", SDTShuff2Op>; | 
|  | 383 | def X86Movlpd : SDNode<"X86ISD::MOVLPD", SDTShuff2Op>; | 
| Bruno Cardoso Lopes | 6f3b38a | 2010-08-20 22:55:05 +0000 | [diff] [blame] | 384 |  | 
| Craig Topper | 06ae5e8 | 2017-02-19 01:54:47 +0000 | [diff] [blame] | 385 | def SDTPack : SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisInt<0>, | 
|  | 386 | SDTCisVec<1>, SDTCisInt<1>, | 
| Craig Topper | a3ac738 | 2015-11-26 07:58:20 +0000 | [diff] [blame] | 387 | SDTCisSameSizeAs<0,1>, | 
| Craig Topper | 06ae5e8 | 2017-02-19 01:54:47 +0000 | [diff] [blame] | 388 | SDTCisSameAs<1,2>, | 
|  | 389 | SDTCisOpSmallerThanOp<0, 1>]>; | 
| Chandler Carruth | 8366ceb | 2014-06-20 01:05:28 +0000 | [diff] [blame] | 390 | def X86Packss : SDNode<"X86ISD::PACKSS", SDTPack>; | 
|  | 391 | def X86Packus : SDNode<"X86ISD::PACKUS", SDTPack>; | 
|  | 392 |  | 
| Craig Topper | 8d4ba19 | 2011-12-06 08:21:25 +0000 | [diff] [blame] | 393 | def X86Unpckl : SDNode<"X86ISD::UNPCKL", SDTShuff2Op>; | 
|  | 394 | def X86Unpckh : SDNode<"X86ISD::UNPCKH", SDTShuff2Op>; | 
| Bruno Cardoso Lopes | 6f3b38a | 2010-08-20 22:55:05 +0000 | [diff] [blame] | 395 |  | 
| Craig Topper | 06ae5e8 | 2017-02-19 01:54:47 +0000 | [diff] [blame] | 396 | def X86vpmaddubsw  : SDNode<"X86ISD::VPMADDUBSW", | 
|  | 397 | SDTypeProfile<1, 2, [SDTCVecEltisVT<0, i16>, | 
|  | 398 | SDTCVecEltisVT<1, i8>, | 
|  | 399 | SDTCisSameSizeAs<0,1>, | 
|  | 400 | SDTCisSameAs<1,2>]>>; | 
|  | 401 | def X86vpmaddwd    : SDNode<"X86ISD::VPMADDWD", | 
|  | 402 | SDTypeProfile<1, 2, [SDTCVecEltisVT<0, i32>, | 
|  | 403 | SDTCVecEltisVT<1, i16>, | 
|  | 404 | SDTCisSameSizeAs<0,1>, | 
|  | 405 | SDTCisSameAs<1,2>]>, | 
|  | 406 | [SDNPCommutative]>; | 
| Igor Breger | f7fd547 | 2015-07-21 07:11:28 +0000 | [diff] [blame] | 407 |  | 
| Chandler Carruth | 6d5916a | 2014-09-23 10:08:29 +0000 | [diff] [blame] | 408 | def X86VPermilpv  : SDNode<"X86ISD::VPERMILPV", SDTShuff2OpM>; | 
| Chandler Carruth | ed5dfff | 2014-09-22 22:29:42 +0000 | [diff] [blame] | 409 | def X86VPermilpi  : SDNode<"X86ISD::VPERMILPI", SDTShuff2OpI>; | 
| Craig Topper | ecae476 | 2015-11-29 22:53:22 +0000 | [diff] [blame] | 410 | def X86VPermv     : SDNode<"X86ISD::VPERMV", | 
|  | 411 | SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisInt<1>, | 
|  | 412 | SDTCisSameNumEltsAs<0,1>, | 
|  | 413 | SDTCisSameSizeAs<0,1>, | 
|  | 414 | SDTCisSameAs<0,2>]>>; | 
| Chandler Carruth | ed5dfff | 2014-09-22 22:29:42 +0000 | [diff] [blame] | 415 | def X86VPermi     : SDNode<"X86ISD::VPERMI",    SDTShuff2OpI>; | 
| Craig Topper | 05858f5 | 2015-11-26 20:02:01 +0000 | [diff] [blame] | 416 | def X86VPermt2     : SDNode<"X86ISD::VPERMV3", | 
|  | 417 | SDTypeProfile<1, 3, [SDTCisVec<0>, | 
| Elena Demikhovsky | f07df9f | 2015-11-25 08:17:56 +0000 | [diff] [blame] | 418 | SDTCisSameAs<0,1>, SDTCisInt<2>, | 
|  | 419 | SDTCisVec<2>, SDTCisSameNumEltsAs<0, 2>, | 
| Craig Topper | a3ac738 | 2015-11-26 07:58:20 +0000 | [diff] [blame] | 420 | SDTCisSameSizeAs<0,2>, | 
| Elena Demikhovsky | f07df9f | 2015-11-25 08:17:56 +0000 | [diff] [blame] | 421 | SDTCisSameAs<0,3>]>, []>; | 
| Elena Demikhovsky | f07df9f | 2015-11-25 08:17:56 +0000 | [diff] [blame] | 422 |  | 
| Craig Topper | 4fa3b50 | 2016-09-06 06:56:59 +0000 | [diff] [blame] | 423 | // Even though the index operand should be integer, we need to make it match the | 
|  | 424 | // destination type so that we can pattern match the masked version where the | 
|  | 425 | // index is also the passthru operand. | 
| Craig Topper | aad5f11 | 2015-11-30 00:13:24 +0000 | [diff] [blame] | 426 | def X86VPermi2X   : SDNode<"X86ISD::VPERMIV3", | 
| Craig Topper | 4fa3b50 | 2016-09-06 06:56:59 +0000 | [diff] [blame] | 427 | SDTypeProfile<1, 3, [SDTCisVec<0>, | 
|  | 428 | SDTCisSameAs<0,1>, | 
| Craig Topper | aad5f11 | 2015-11-30 00:13:24 +0000 | [diff] [blame] | 429 | SDTCisSameAs<0,2>, | 
|  | 430 | SDTCisSameAs<0,3>]>, []>; | 
|  | 431 |  | 
| Igor Breger | b4bb190 | 2015-10-15 12:33:24 +0000 | [diff] [blame] | 432 | def X86vpternlog  : SDNode<"X86ISD::VPTERNLOG", SDTTernlog>; | 
| Bruno Cardoso Lopes | b878caa | 2011-07-21 01:55:47 +0000 | [diff] [blame] | 433 |  | 
| Craig Topper | 0a672ea | 2011-11-30 07:47:51 +0000 | [diff] [blame] | 434 | def X86VPerm2x128 : SDNode<"X86ISD::VPERM2X128", SDTShuff3OpI>; | 
| Bruno Cardoso Lopes | f15dfe5 | 2011-08-12 21:48:26 +0000 | [diff] [blame] | 435 |  | 
| Asaf Badouh | d4a0d9a | 2016-01-19 14:21:39 +0000 | [diff] [blame] | 436 | def X86VFixupimm   : SDNode<"X86ISD::VFIXUPIMM", SDTFPTernaryOpImmRound>; | 
| Craig Topper | 7ee092a | 2016-05-19 02:05:55 +0000 | [diff] [blame] | 437 | def X86VFixupimmScalar   : SDNode<"X86ISD::VFIXUPIMMS", SDTFPTernaryOpImmRound>; | 
| Igor Breger | 1e58e8a | 2015-09-02 11:18:55 +0000 | [diff] [blame] | 438 | def X86VRange      : SDNode<"X86ISD::VRANGE",    SDTFPBinOpImmRound>; | 
|  | 439 | def X86VReduce     : SDNode<"X86ISD::VREDUCE",   SDTFPUnaryOpImmRound>; | 
|  | 440 | def X86VRndScale   : SDNode<"X86ISD::VRNDSCALE", SDTFPUnaryOpImmRound>; | 
|  | 441 | def X86VGetMant    : SDNode<"X86ISD::VGETMANT",  SDTFPUnaryOpImmRound>; | 
| Craig Topper | 9d1deb4 | 2015-11-26 18:31:19 +0000 | [diff] [blame] | 442 | def X86Vfpclass    : SDNode<"X86ISD::VFPCLASS", | 
| Craig Topper | 06ae5e8 | 2017-02-19 01:54:47 +0000 | [diff] [blame] | 443 | SDTypeProfile<1, 2, [SDTCVecEltisVT<0, i1>, | 
|  | 444 | SDTCisFP<1>, | 
| Craig Topper | 0009656 | 2015-11-26 19:41:34 +0000 | [diff] [blame] | 445 | SDTCisSameNumEltsAs<0,1>, | 
|  | 446 | SDTCisVT<2, i32>]>, []>; | 
|  | 447 | def X86Vfpclasss   : SDNode<"X86ISD::VFPCLASSS", | 
| Guy Blank | 548e22a | 2017-05-19 12:35:15 +0000 | [diff] [blame] | 448 | SDTypeProfile<1, 2, [SDTCisVT<0, v1i1>, | 
| Craig Topper | 0009656 | 2015-11-26 19:41:34 +0000 | [diff] [blame] | 449 | SDTCisFP<1>, SDTCisVT<2, i32>]>,[]>; | 
| Elena Demikhovsky | 42c96d9 | 2015-06-01 06:50:49 +0000 | [diff] [blame] | 450 |  | 
| Elena Demikhovsky | ad9c396 | 2015-05-18 06:42:57 +0000 | [diff] [blame] | 451 | def X86SubVBroadcast : SDNode<"X86ISD::SUBV_BROADCAST", | 
|  | 452 | SDTypeProfile<1, 1, [SDTCisVec<0>, SDTCisVec<1>, | 
|  | 453 | SDTCisSubVecOfVec<1, 0>]>, []>; | 
| Igor Breger | fa798a9 | 2015-11-02 07:39:36 +0000 | [diff] [blame] | 454 |  | 
| Bruno Cardoso Lopes | be5e987 | 2011-08-17 02:29:19 +0000 | [diff] [blame] | 455 | def X86VBroadcast : SDNode<"X86ISD::VBROADCAST", SDTVBroadcast>; | 
| Asaf Badouh | 0d957b8 | 2015-11-18 09:42:45 +0000 | [diff] [blame] | 456 | def X86VBroadcastm : SDNode<"X86ISD::VBROADCASTM", SDTVBroadcastm>; | 
| Elena Demikhovsky | 9f423d6 | 2014-02-10 07:02:39 +0000 | [diff] [blame] | 457 | def X86Vextract   : SDNode<"X86ISD::VEXTRACT",  SDTypeProfile<1, 2, | 
| Guy Blank | 548e22a | 2017-05-19 12:35:15 +0000 | [diff] [blame] | 458 | [SDTCisVec<1>, | 
| Craig Topper | 9d1deb4 | 2015-11-26 18:31:19 +0000 | [diff] [blame] | 459 | SDTCisPtrTy<2>]>, []>; | 
| Bruno Cardoso Lopes | be5e987 | 2011-08-17 02:29:19 +0000 | [diff] [blame] | 460 |  | 
| Elena Demikhovsky | cd3c1c4 | 2012-12-05 09:24:57 +0000 | [diff] [blame] | 461 | def X86Blendi    : SDNode<"X86ISD::BLENDI",   SDTBlend>; | 
| Chandler Carruth | 204ad4c | 2014-09-15 20:09:47 +0000 | [diff] [blame] | 462 |  | 
|  | 463 | def X86Addsub    : SDNode<"X86ISD::ADDSUB", SDTFPBinOp>; | 
|  | 464 |  | 
| Elena Demikhovsky | 714f23b | 2015-02-18 07:59:20 +0000 | [diff] [blame] | 465 | def X86faddRnd   : SDNode<"X86ISD::FADD_RND",  SDTFPBinOpRound>; | 
| Craig Topper | 8783bbb | 2017-02-24 07:21:10 +0000 | [diff] [blame] | 466 | def X86faddRnds  : SDNode<"X86ISD::FADDS_RND", SDTFPBinOpRound>; | 
| Elena Demikhovsky | 714f23b | 2015-02-18 07:59:20 +0000 | [diff] [blame] | 467 | def X86fsubRnd   : SDNode<"X86ISD::FSUB_RND",  SDTFPBinOpRound>; | 
| Craig Topper | 8783bbb | 2017-02-24 07:21:10 +0000 | [diff] [blame] | 468 | def X86fsubRnds  : SDNode<"X86ISD::FSUBS_RND", SDTFPBinOpRound>; | 
| Elena Demikhovsky | 714f23b | 2015-02-18 07:59:20 +0000 | [diff] [blame] | 469 | def X86fmulRnd   : SDNode<"X86ISD::FMUL_RND",  SDTFPBinOpRound>; | 
| Craig Topper | 8783bbb | 2017-02-24 07:21:10 +0000 | [diff] [blame] | 470 | def X86fmulRnds  : SDNode<"X86ISD::FMULS_RND", SDTFPBinOpRound>; | 
| Elena Demikhovsky | 714f23b | 2015-02-18 07:59:20 +0000 | [diff] [blame] | 471 | def X86fdivRnd   : SDNode<"X86ISD::FDIV_RND",  SDTFPBinOpRound>; | 
| Craig Topper | 8783bbb | 2017-02-24 07:21:10 +0000 | [diff] [blame] | 472 | def X86fdivRnds  : SDNode<"X86ISD::FDIVS_RND", SDTFPBinOpRound>; | 
|  | 473 | def X86fmaxRnd   : SDNode<"X86ISD::FMAX_RND",  SDTFPBinOpRound>; | 
|  | 474 | def X86fmaxRnds  : SDNode<"X86ISD::FMAXS_RND", SDTFPBinOpRound>; | 
|  | 475 | def X86fminRnd   : SDNode<"X86ISD::FMIN_RND",  SDTFPBinOpRound>; | 
|  | 476 | def X86fminRnds  : SDNode<"X86ISD::FMINS_RND", SDTFPBinOpRound>; | 
| Igor Breger | 4c4cd78 | 2015-09-20 09:13:41 +0000 | [diff] [blame] | 477 | def X86scalef    : SDNode<"X86ISD::SCALEF",         SDTFPBinOpRound>; | 
| Michael Zuckerman | 11b55b2 | 2016-05-21 11:09:53 +0000 | [diff] [blame] | 478 | def X86scalefs   : SDNode<"X86ISD::SCALEFS",        SDTFPBinOpRound>; | 
| Igor Breger | 4c4cd78 | 2015-09-20 09:13:41 +0000 | [diff] [blame] | 479 | def X86fsqrtRnd     : SDNode<"X86ISD::FSQRT_RND",   SDTFPUnaryOpRound>; | 
| Craig Topper | d70ec9b | 2016-09-23 06:24:35 +0000 | [diff] [blame] | 480 | def X86fsqrtRnds    : SDNode<"X86ISD::FSQRTS_RND", SDTFPBinOpRound>; | 
| Igor Breger | 8352a0d | 2015-07-28 06:53:28 +0000 | [diff] [blame] | 481 | def X86fgetexpRnd   : SDNode<"X86ISD::FGETEXP_RND", SDTFPUnaryOpRound>; | 
| Craig Topper | d70ec9b | 2016-09-23 06:24:35 +0000 | [diff] [blame] | 482 | def X86fgetexpRnds  : SDNode<"X86ISD::FGETEXPS_RND", SDTFPBinOpRound>; | 
| Elena Demikhovsky | 714f23b | 2015-02-18 07:59:20 +0000 | [diff] [blame] | 483 |  | 
| Craig Topper | 06ae5e8 | 2017-02-19 01:54:47 +0000 | [diff] [blame] | 484 | def X86Fmadd     : SDNode<"X86ISD::FMADD",     SDTFPTernaryOp>; | 
|  | 485 | def X86Fnmadd    : SDNode<"X86ISD::FNMADD",    SDTFPTernaryOp>; | 
|  | 486 | def X86Fmsub     : SDNode<"X86ISD::FMSUB",     SDTFPTernaryOp>; | 
|  | 487 | def X86Fnmsub    : SDNode<"X86ISD::FNMSUB",    SDTFPTernaryOp>; | 
|  | 488 | def X86Fmaddsub  : SDNode<"X86ISD::FMADDSUB",  SDTFPTernaryOp>; | 
|  | 489 | def X86Fmsubadd  : SDNode<"X86ISD::FMSUBADD",  SDTFPTernaryOp>; | 
| Nadav Rotem | 9bc178a | 2012-04-11 06:40:27 +0000 | [diff] [blame] | 490 |  | 
| Elena Demikhovsky | 7b0dd39 | 2015-01-28 10:21:27 +0000 | [diff] [blame] | 491 | def X86FmaddRnd     : SDNode<"X86ISD::FMADD_RND",     SDTFmaRound>; | 
|  | 492 | def X86FnmaddRnd    : SDNode<"X86ISD::FNMADD_RND",    SDTFmaRound>; | 
|  | 493 | def X86FmsubRnd     : SDNode<"X86ISD::FMSUB_RND",     SDTFmaRound>; | 
|  | 494 | def X86FnmsubRnd    : SDNode<"X86ISD::FNMSUB_RND",    SDTFmaRound>; | 
|  | 495 | def X86FmaddsubRnd  : SDNode<"X86ISD::FMADDSUB_RND",  SDTFmaRound>; | 
|  | 496 | def X86FmsubaddRnd  : SDNode<"X86ISD::FMSUBADD_RND",  SDTFmaRound>; | 
|  | 497 |  | 
| Craig Topper | a55b483 | 2016-12-09 06:42:28 +0000 | [diff] [blame] | 498 | // Scalar FMA intrinsics with passthru bits in operand 1. | 
|  | 499 | def X86FmaddRnds1   : SDNode<"X86ISD::FMADDS1_RND",     SDTFmaRound>; | 
|  | 500 | def X86FnmaddRnds1  : SDNode<"X86ISD::FNMADDS1_RND",    SDTFmaRound>; | 
|  | 501 | def X86FmsubRnds1   : SDNode<"X86ISD::FMSUBS1_RND",     SDTFmaRound>; | 
|  | 502 | def X86FnmsubRnds1  : SDNode<"X86ISD::FNMSUBS1_RND",    SDTFmaRound>; | 
|  | 503 |  | 
|  | 504 | // Scalar FMA intrinsics with passthru bits in operand 3. | 
|  | 505 | def X86FmaddRnds3   : SDNode<"X86ISD::FMADDS3_RND",     SDTFmaRound>; | 
|  | 506 | def X86FnmaddRnds3  : SDNode<"X86ISD::FNMADDS3_RND",    SDTFmaRound>; | 
|  | 507 | def X86FmsubRnds3   : SDNode<"X86ISD::FMSUBS3_RND",     SDTFmaRound>; | 
|  | 508 | def X86FnmsubRnds3  : SDNode<"X86ISD::FNMSUBS3_RND",    SDTFmaRound>; | 
|  | 509 |  | 
| Craig Topper | 06ae5e8 | 2017-02-19 01:54:47 +0000 | [diff] [blame] | 510 | def SDTIFma : SDTypeProfile<1, 3, [SDTCisInt<0>, SDTCisSameAs<0,1>, | 
|  | 511 | SDTCisSameAs<1,2>, SDTCisSameAs<1,3>]>; | 
|  | 512 | def x86vpmadd52l     : SDNode<"X86ISD::VPMADD52L",     SDTIFma>; | 
|  | 513 | def x86vpmadd52h     : SDNode<"X86ISD::VPMADD52H",     SDTIFma>; | 
| Asaf Badouh | 655822a | 2016-01-25 11:14:24 +0000 | [diff] [blame] | 514 |  | 
| Craig Topper | 4fcff19 | 2016-05-19 02:05:58 +0000 | [diff] [blame] | 515 | def X86rsqrt28   : SDNode<"X86ISD::RSQRT28",  SDTFPUnaryOpRound>; | 
|  | 516 | def X86rcp28     : SDNode<"X86ISD::RCP28",    SDTFPUnaryOpRound>; | 
|  | 517 | def X86exp2      : SDNode<"X86ISD::EXP2",     SDTFPUnaryOpRound>; | 
| Elena Demikhovsky | 905a5a6 | 2014-11-26 10:46:49 +0000 | [diff] [blame] | 518 |  | 
| Craig Topper | d70ec9b | 2016-09-23 06:24:35 +0000 | [diff] [blame] | 519 | def X86rsqrt28s  : SDNode<"X86ISD::RSQRT28S",   SDTFPBinOpRound>; | 
|  | 520 | def X86rcp28s    : SDNode<"X86ISD::RCP28S",     SDTFPBinOpRound>; | 
|  | 521 | def X86RndScales : SDNode<"X86ISD::VRNDSCALES", SDTFPBinOpImmRound>; | 
|  | 522 | def X86Reduces   : SDNode<"X86ISD::VREDUCES",   SDTFPBinOpImmRound>; | 
|  | 523 | def X86GetMants  : SDNode<"X86ISD::VGETMANTS",  SDTFPBinOpImmRound>; | 
| Elena Demikhovsky | be8808d | 2014-11-12 07:31:03 +0000 | [diff] [blame] | 524 |  | 
| Craig Topper | ab47fe4 | 2012-08-06 06:22:36 +0000 | [diff] [blame] | 525 | def SDT_PCMPISTRI : SDTypeProfile<2, 3, [SDTCisVT<0, i32>, SDTCisVT<1, i32>, | 
|  | 526 | SDTCisVT<2, v16i8>, SDTCisVT<3, v16i8>, | 
|  | 527 | SDTCisVT<4, i8>]>; | 
|  | 528 | def SDT_PCMPESTRI : SDTypeProfile<2, 5, [SDTCisVT<0, i32>, SDTCisVT<1, i32>, | 
|  | 529 | SDTCisVT<2, v16i8>, SDTCisVT<3, i32>, | 
|  | 530 | SDTCisVT<4, v16i8>, SDTCisVT<5, i32>, | 
|  | 531 | SDTCisVT<6, i8>]>; | 
|  | 532 |  | 
|  | 533 | def X86pcmpistri : SDNode<"X86ISD::PCMPISTRI", SDT_PCMPISTRI>; | 
|  | 534 | def X86pcmpestri : SDNode<"X86ISD::PCMPESTRI", SDT_PCMPESTRI>; | 
|  | 535 |  | 
| Elena Demikhovsky | ba5ab32 | 2015-06-22 11:16:30 +0000 | [diff] [blame] | 536 | def X86compress: SDNode<"X86ISD::COMPRESS", SDTypeProfile<1, 1, | 
|  | 537 | [SDTCisSameAs<0, 1>, SDTCisVec<1>]>, []>; | 
|  | 538 | def X86expand  : SDNode<"X86ISD::EXPAND", SDTypeProfile<1, 1, | 
|  | 539 | [SDTCisSameAs<0, 1>, SDTCisVec<1>]>, []>; | 
| Elena Demikhovsky | 908dbf4 | 2014-12-11 15:02:24 +0000 | [diff] [blame] | 540 |  | 
| Igor Breger | abe4a79 | 2015-06-14 12:44:55 +0000 | [diff] [blame] | 541 | def SDTintToFPRound: SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisFP<0>, | 
| Craig Topper | 9d1deb4 | 2015-11-26 18:31:19 +0000 | [diff] [blame] | 542 | SDTCisSameAs<0,1>, SDTCisInt<2>, | 
|  | 543 | SDTCisVT<3, i32>]>; | 
| Igor Breger | abe4a79 | 2015-06-14 12:44:55 +0000 | [diff] [blame] | 544 |  | 
| Elena Demikhovsky | 0f37093 | 2015-07-13 13:26:20 +0000 | [diff] [blame] | 545 | def SDTFloatToInt: SDTypeProfile<1, 1, [SDTCisVec<0>, SDTCisVec<1>, | 
| Craig Topper | 19e04b6 | 2016-05-19 06:13:58 +0000 | [diff] [blame] | 546 | SDTCisInt<0>, SDTCisFP<1>]>; | 
| Elena Demikhovsky | 0f37093 | 2015-07-13 13:26:20 +0000 | [diff] [blame] | 547 | def SDTFloatToIntRnd: SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisVec<1>, | 
| Craig Topper | 19e04b6 | 2016-05-19 06:13:58 +0000 | [diff] [blame] | 548 | SDTCisInt<0>, SDTCisFP<1>, | 
|  | 549 | SDTCisVT<2, i32>]>; | 
| Asaf Badouh | 2744d21 | 2015-09-20 14:31:19 +0000 | [diff] [blame] | 550 | def SDTSFloatToIntRnd: SDTypeProfile<1, 2, [SDTCisInt<0>, SDTCisFP<1>, | 
| Craig Topper | 19e04b6 | 2016-05-19 06:13:58 +0000 | [diff] [blame] | 551 | SDTCisVec<1>, SDTCisVT<2, i32>]>; | 
| Simon Pilgrim | a3af796 | 2016-11-24 12:13:46 +0000 | [diff] [blame] | 552 |  | 
|  | 553 | def SDTVintToFP: SDTypeProfile<1, 1, [SDTCisVec<0>, SDTCisVec<1>, | 
|  | 554 | SDTCisFP<0>, SDTCisInt<1>]>; | 
| Elena Demikhovsky | 0f37093 | 2015-07-13 13:26:20 +0000 | [diff] [blame] | 555 | def SDTVintToFPRound: SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisVec<1>, | 
| Craig Topper | 19e04b6 | 2016-05-19 06:13:58 +0000 | [diff] [blame] | 556 | SDTCisFP<0>, SDTCisInt<1>, | 
| Craig Topper | 095fc41 | 2016-05-18 06:56:01 +0000 | [diff] [blame] | 557 | SDTCisVT<2, i32>]>; | 
| Elena Demikhovsky | 0f37093 | 2015-07-13 13:26:20 +0000 | [diff] [blame] | 558 |  | 
|  | 559 | // Scalar | 
| Craig Topper | 3174b6e | 2016-09-23 06:24:39 +0000 | [diff] [blame] | 560 | def X86SintToFpRnd  : SDNode<"X86ISD::SCALAR_SINT_TO_FP_RND",  SDTintToFPRound>; | 
|  | 561 | def X86UintToFpRnd  : SDNode<"X86ISD::SCALAR_UINT_TO_FP_RND",  SDTintToFPRound>; | 
| Elena Demikhovsky | 0f37093 | 2015-07-13 13:26:20 +0000 | [diff] [blame] | 562 |  | 
| Craig Topper | 3174b6e | 2016-09-23 06:24:39 +0000 | [diff] [blame] | 563 | def X86cvtts2IntRnd  : SDNode<"X86ISD::CVTTS2SI_RND",  SDTSFloatToIntRnd>; | 
|  | 564 | def X86cvtts2UIntRnd : SDNode<"X86ISD::CVTTS2UI_RND",  SDTSFloatToIntRnd>; | 
| Asaf Badouh | ad5c3fc | 2016-02-07 14:59:13 +0000 | [diff] [blame] | 565 |  | 
| Craig Topper | 3174b6e | 2016-09-23 06:24:39 +0000 | [diff] [blame] | 566 | def  X86cvts2si  : SDNode<"X86ISD::CVTS2SI_RND", SDTSFloatToIntRnd>; | 
|  | 567 | def  X86cvts2usi : SDNode<"X86ISD::CVTS2UI_RND", SDTSFloatToIntRnd>; | 
| Asaf Badouh | ad5c3fc | 2016-02-07 14:59:13 +0000 | [diff] [blame] | 568 |  | 
| Elena Demikhovsky | 0f37093 | 2015-07-13 13:26:20 +0000 | [diff] [blame] | 569 | // Vector with rounding mode | 
|  | 570 |  | 
|  | 571 | // cvtt fp-to-int staff | 
| Craig Topper | 3174b6e | 2016-09-23 06:24:39 +0000 | [diff] [blame] | 572 | def X86cvttp2siRnd    : SDNode<"X86ISD::CVTTP2SI_RND", SDTFloatToIntRnd>; | 
|  | 573 | def X86cvttp2uiRnd    : SDNode<"X86ISD::CVTTP2UI_RND", SDTFloatToIntRnd>; | 
| Elena Demikhovsky | 0f37093 | 2015-07-13 13:26:20 +0000 | [diff] [blame] | 574 |  | 
| Craig Topper | 3174b6e | 2016-09-23 06:24:39 +0000 | [diff] [blame] | 575 | def X86VSintToFpRnd   : SDNode<"X86ISD::SINT_TO_FP_RND",  SDTVintToFPRound>; | 
|  | 576 | def X86VUintToFpRnd   : SDNode<"X86ISD::UINT_TO_FP_RND",  SDTVintToFPRound>; | 
| Elena Demikhovsky | 0f37093 | 2015-07-13 13:26:20 +0000 | [diff] [blame] | 577 |  | 
|  | 578 | // cvt fp-to-int staff | 
| Craig Topper | 3174b6e | 2016-09-23 06:24:39 +0000 | [diff] [blame] | 579 | def X86cvtp2IntRnd      : SDNode<"X86ISD::CVTP2SI_RND",  SDTFloatToIntRnd>; | 
|  | 580 | def X86cvtp2UIntRnd     : SDNode<"X86ISD::CVTP2UI_RND",  SDTFloatToIntRnd>; | 
| Elena Demikhovsky | 0f37093 | 2015-07-13 13:26:20 +0000 | [diff] [blame] | 581 |  | 
|  | 582 | // Vector without rounding mode | 
| Simon Pilgrim | a3af796 | 2016-11-24 12:13:46 +0000 | [diff] [blame] | 583 |  | 
|  | 584 | // cvtt fp-to-int staff | 
|  | 585 | def X86cvttp2si      : SDNode<"X86ISD::CVTTP2SI",  SDTFloatToInt>; | 
|  | 586 | def X86cvttp2ui      : SDNode<"X86ISD::CVTTP2UI",  SDTFloatToInt>; | 
|  | 587 |  | 
|  | 588 | def X86VSintToFP      : SDNode<"X86ISD::CVTSI2P",  SDTVintToFP>; | 
|  | 589 | def X86VUintToFP      : SDNode<"X86ISD::CVTUI2P",  SDTVintToFP>; | 
|  | 590 |  | 
|  | 591 | // cvt int-to-fp staff | 
| Craig Topper | 3174b6e | 2016-09-23 06:24:39 +0000 | [diff] [blame] | 592 | def X86cvtp2Int      : SDNode<"X86ISD::CVTP2SI",  SDTFloatToInt>; | 
|  | 593 | def X86cvtp2UInt     : SDNode<"X86ISD::CVTP2UI",  SDTFloatToInt>; | 
| Elena Demikhovsky | 0f37093 | 2015-07-13 13:26:20 +0000 | [diff] [blame] | 594 |  | 
| Craig Topper | e18258d | 2016-09-21 02:05:22 +0000 | [diff] [blame] | 595 | def X86cvtph2ps     : SDNode<"X86ISD::CVTPH2PS", | 
| Craig Topper | 9152f5f | 2016-05-19 06:13:48 +0000 | [diff] [blame] | 596 | SDTypeProfile<1, 2, [SDTCVecEltisVT<0, f32>, | 
| Asaf Badouh | 7c52245 | 2015-10-22 14:01:16 +0000 | [diff] [blame] | 597 | SDTCVecEltisVT<1, i16>, | 
| Craig Topper | 9d1deb4 | 2015-11-26 18:31:19 +0000 | [diff] [blame] | 598 | SDTCisVT<2, i32>]> >; | 
| Asaf Badouh | 7c52245 | 2015-10-22 14:01:16 +0000 | [diff] [blame] | 599 |  | 
| Craig Topper | e18258d | 2016-09-21 02:05:22 +0000 | [diff] [blame] | 600 | def X86cvtps2ph   : SDNode<"X86ISD::CVTPS2PH", | 
| Craig Topper | d868870 | 2016-09-21 03:58:44 +0000 | [diff] [blame] | 601 | SDTypeProfile<1, 2, [SDTCVecEltisVT<0, i16>, | 
| Asaf Badouh | c7cb880 | 2015-10-27 15:37:17 +0000 | [diff] [blame] | 602 | SDTCVecEltisVT<1, f32>, | 
| Craig Topper | d868870 | 2016-09-21 03:58:44 +0000 | [diff] [blame] | 603 | SDTCisVT<2, i32>]> >; | 
| Craig Topper | a02e394 | 2016-09-23 06:24:43 +0000 | [diff] [blame] | 604 | def X86vfpextRnd  : SDNode<"X86ISD::VFPEXT_RND", | 
| Craig Topper | 9152f5f | 2016-05-19 06:13:48 +0000 | [diff] [blame] | 605 | SDTypeProfile<1, 2, [SDTCVecEltisVT<0, f64>, | 
| Craig Topper | 9d1deb4 | 2015-11-26 18:31:19 +0000 | [diff] [blame] | 606 | SDTCVecEltisVT<1, f32>, | 
| Elena Demikhovsky | 0f37093 | 2015-07-13 13:26:20 +0000 | [diff] [blame] | 607 | SDTCisOpSmallerThanOp<1, 0>, | 
| Craig Topper | 9d1deb4 | 2015-11-26 18:31:19 +0000 | [diff] [blame] | 608 | SDTCisVT<2, i32>]>>; | 
| Craig Topper | a02e394 | 2016-09-23 06:24:43 +0000 | [diff] [blame] | 609 | def X86vfproundRnd: SDNode<"X86ISD::VFPROUND_RND", | 
| Craig Topper | 9152f5f | 2016-05-19 06:13:48 +0000 | [diff] [blame] | 610 | SDTypeProfile<1, 2, [SDTCVecEltisVT<0, f32>, | 
| Elena Demikhovsky | 0f37093 | 2015-07-13 13:26:20 +0000 | [diff] [blame] | 611 | SDTCVecEltisVT<1, f64>, | 
| Craig Topper | 9d1deb4 | 2015-11-26 18:31:19 +0000 | [diff] [blame] | 612 | SDTCisOpSmallerThanOp<0, 1>, | 
|  | 613 | SDTCisVT<2, i32>]>>; | 
| Igor Breger | abe4a79 | 2015-06-14 12:44:55 +0000 | [diff] [blame] | 614 |  | 
| Igor Breger | 756c289 | 2015-12-27 13:56:16 +0000 | [diff] [blame] | 615 | def X86cvt2mask   : SDNode<"X86ISD::CVT2MASK", SDTIntTruncOp>; | 
|  | 616 |  | 
| David Greene | 03264ef | 2010-07-12 23:41:28 +0000 | [diff] [blame] | 617 | //===----------------------------------------------------------------------===// | 
|  | 618 | // SSE Complex Patterns | 
|  | 619 | //===----------------------------------------------------------------------===// | 
|  | 620 |  | 
|  | 621 | // These are 'extloads' from a scalar to the low element of a vector, zeroing | 
|  | 622 | // the top elements.  These are used for the SSE 'ss' and 'sd' instruction | 
|  | 623 | // forms. | 
| Sanjay Patel | 85030aa | 2015-10-13 16:23:00 +0000 | [diff] [blame] | 624 | def sse_load_f32 : ComplexPattern<v4f32, 5, "selectScalarSSELoad", [], | 
| Chris Lattner | 0e023ea | 2010-09-21 20:31:19 +0000 | [diff] [blame] | 625 | [SDNPHasChain, SDNPMayLoad, SDNPMemOperand, | 
|  | 626 | SDNPWantRoot]>; | 
| Sanjay Patel | 85030aa | 2015-10-13 16:23:00 +0000 | [diff] [blame] | 627 | def sse_load_f64 : ComplexPattern<v2f64, 5, "selectScalarSSELoad", [], | 
| Chris Lattner | 0e023ea | 2010-09-21 20:31:19 +0000 | [diff] [blame] | 628 | [SDNPHasChain, SDNPMayLoad, SDNPMemOperand, | 
|  | 629 | SDNPWantRoot]>; | 
| David Greene | 03264ef | 2010-07-12 23:41:28 +0000 | [diff] [blame] | 630 |  | 
|  | 631 | def ssmem : Operand<v4f32> { | 
|  | 632 | let PrintMethod = "printf32mem"; | 
| Ahmed Bougacha | 63f78b0 | 2016-06-02 18:29:15 +0000 | [diff] [blame] | 633 | let MIOperandInfo = (ops ptr_rc, i8imm, ptr_rc_nosp, i32imm, SEGMENT_REG); | 
| Craig Topper | 6269f49 | 2013-08-26 00:39:04 +0000 | [diff] [blame] | 634 | let ParserMatchClass = X86Mem32AsmOperand; | 
| Benjamin Kramer | 9654eef | 2011-07-14 21:47:22 +0000 | [diff] [blame] | 635 | let OperandType = "OPERAND_MEMORY"; | 
| David Greene | 03264ef | 2010-07-12 23:41:28 +0000 | [diff] [blame] | 636 | } | 
|  | 637 | def sdmem : Operand<v2f64> { | 
|  | 638 | let PrintMethod = "printf64mem"; | 
| Ahmed Bougacha | 63f78b0 | 2016-06-02 18:29:15 +0000 | [diff] [blame] | 639 | let MIOperandInfo = (ops ptr_rc, i8imm, ptr_rc_nosp, i32imm, SEGMENT_REG); | 
| Craig Topper | 6269f49 | 2013-08-26 00:39:04 +0000 | [diff] [blame] | 640 | let ParserMatchClass = X86Mem64AsmOperand; | 
| Benjamin Kramer | 9654eef | 2011-07-14 21:47:22 +0000 | [diff] [blame] | 641 | let OperandType = "OPERAND_MEMORY"; | 
| David Greene | 03264ef | 2010-07-12 23:41:28 +0000 | [diff] [blame] | 642 | } | 
|  | 643 |  | 
|  | 644 | //===----------------------------------------------------------------------===// | 
|  | 645 | // SSE pattern fragments | 
|  | 646 | //===----------------------------------------------------------------------===// | 
|  | 647 |  | 
| Simon Pilgrim | bed1fa1 | 2017-06-25 16:57:46 +0000 | [diff] [blame] | 648 | // Vector load wrappers to prevent folding of non-temporal aligned loads on | 
| Simon Pilgrim | a25bf0b | 2017-06-05 15:43:03 +0000 | [diff] [blame] | 649 | // supporting targets. | 
|  | 650 | def vec128load : PatFrag<(ops node:$ptr), (load node:$ptr), [{ | 
|  | 651 | return !Subtarget->hasSSE41() || !cast<LoadSDNode>(N)->isNonTemporal() || | 
|  | 652 | cast<LoadSDNode>(N)->getAlignment() < 16; | 
|  | 653 | }]>; | 
|  | 654 | def vec256load : PatFrag<(ops node:$ptr), (load node:$ptr), [{ | 
|  | 655 | return !Subtarget->hasAVX2() || !cast<LoadSDNode>(N)->isNonTemporal() || | 
|  | 656 | cast<LoadSDNode>(N)->getAlignment() < 32; | 
|  | 657 | }]>; | 
|  | 658 | def vec512load : PatFrag<(ops node:$ptr), (load node:$ptr), [{ | 
|  | 659 | return !Subtarget->hasAVX512() || !cast<LoadSDNode>(N)->isNonTemporal() || | 
|  | 660 | cast<LoadSDNode>(N)->getAlignment() < 64; | 
|  | 661 | }]>; | 
|  | 662 |  | 
| Bruno Cardoso Lopes | 160be29 | 2010-08-13 20:39:01 +0000 | [diff] [blame] | 663 | // 128-bit load pattern fragments | 
| Craig Topper | 0d8e67a | 2012-01-24 03:03:17 +0000 | [diff] [blame] | 664 | // NOTE: all 128-bit integer vector loads are promoted to v2i64 | 
| Simon Pilgrim | a25bf0b | 2017-06-05 15:43:03 +0000 | [diff] [blame] | 665 | def loadv4f32    : PatFrag<(ops node:$ptr), (v4f32 (vec128load node:$ptr))>; | 
|  | 666 | def loadv2f64    : PatFrag<(ops node:$ptr), (v2f64 (vec128load node:$ptr))>; | 
|  | 667 | def loadv2i64    : PatFrag<(ops node:$ptr), (v2i64 (vec128load node:$ptr))>; | 
| David Greene | 03264ef | 2010-07-12 23:41:28 +0000 | [diff] [blame] | 668 |  | 
| Bruno Cardoso Lopes | 160be29 | 2010-08-13 20:39:01 +0000 | [diff] [blame] | 669 | // 256-bit load pattern fragments | 
| Craig Topper | 0d8e67a | 2012-01-24 03:03:17 +0000 | [diff] [blame] | 670 | // NOTE: all 256-bit integer vector loads are promoted to v4i64 | 
| Simon Pilgrim | a25bf0b | 2017-06-05 15:43:03 +0000 | [diff] [blame] | 671 | def loadv8f32    : PatFrag<(ops node:$ptr), (v8f32 (vec256load node:$ptr))>; | 
|  | 672 | def loadv4f64    : PatFrag<(ops node:$ptr), (v4f64 (vec256load node:$ptr))>; | 
|  | 673 | def loadv4i64    : PatFrag<(ops node:$ptr), (v4i64 (vec256load node:$ptr))>; | 
| David Greene | 03264ef | 2010-07-12 23:41:28 +0000 | [diff] [blame] | 674 |  | 
| Elena Demikhovsky | cf5b145 | 2013-08-11 07:55:09 +0000 | [diff] [blame] | 675 | // 512-bit load pattern fragments | 
| Simon Pilgrim | a25bf0b | 2017-06-05 15:43:03 +0000 | [diff] [blame] | 676 | def loadv16f32   : PatFrag<(ops node:$ptr), (v16f32 (vec512load node:$ptr))>; | 
|  | 677 | def loadv8f64    : PatFrag<(ops node:$ptr), (v8f64 (vec512load node:$ptr))>; | 
|  | 678 | def loadv8i64    : PatFrag<(ops node:$ptr), (v8i64 (vec512load node:$ptr))>; | 
| Elena Demikhovsky | cf5b145 | 2013-08-11 07:55:09 +0000 | [diff] [blame] | 679 |  | 
|  | 680 | // 128-/256-/512-bit extload pattern fragments | 
| Michael Liao | 400f7ef | 2012-09-10 18:33:51 +0000 | [diff] [blame] | 681 | def extloadv2f32 : PatFrag<(ops node:$ptr), (v2f64 (extloadvf32 node:$ptr))>; | 
|  | 682 | def extloadv4f32 : PatFrag<(ops node:$ptr), (v4f64 (extloadvf32 node:$ptr))>; | 
| Elena Demikhovsky | cf5b145 | 2013-08-11 07:55:09 +0000 | [diff] [blame] | 683 | def extloadv8f32 : PatFrag<(ops node:$ptr), (v8f64 (extloadvf32 node:$ptr))>; | 
| Michael Liao | 400f7ef | 2012-09-10 18:33:51 +0000 | [diff] [blame] | 684 |  | 
| Bruno Cardoso Lopes | 03d6002 | 2011-09-13 19:33:03 +0000 | [diff] [blame] | 685 | // Like 'store', but always requires 128-bit vector alignment. | 
| David Greene | 03264ef | 2010-07-12 23:41:28 +0000 | [diff] [blame] | 686 | def alignedstore : PatFrag<(ops node:$val, node:$ptr), | 
|  | 687 | (store node:$val, node:$ptr), [{ | 
|  | 688 | return cast<StoreSDNode>(N)->getAlignment() >= 16; | 
|  | 689 | }]>; | 
|  | 690 |  | 
| Bruno Cardoso Lopes | 03d6002 | 2011-09-13 19:33:03 +0000 | [diff] [blame] | 691 | // Like 'store', but always requires 256-bit vector alignment. | 
|  | 692 | def alignedstore256 : PatFrag<(ops node:$val, node:$ptr), | 
|  | 693 | (store node:$val, node:$ptr), [{ | 
|  | 694 | return cast<StoreSDNode>(N)->getAlignment() >= 32; | 
|  | 695 | }]>; | 
|  | 696 |  | 
| Elena Demikhovsky | cf5b145 | 2013-08-11 07:55:09 +0000 | [diff] [blame] | 697 | // Like 'store', but always requires 512-bit vector alignment. | 
|  | 698 | def alignedstore512 : PatFrag<(ops node:$val, node:$ptr), | 
|  | 699 | (store node:$val, node:$ptr), [{ | 
|  | 700 | return cast<StoreSDNode>(N)->getAlignment() >= 64; | 
|  | 701 | }]>; | 
|  | 702 |  | 
| Bruno Cardoso Lopes | 03d6002 | 2011-09-13 19:33:03 +0000 | [diff] [blame] | 703 | // Like 'load', but always requires 128-bit vector alignment. | 
| David Greene | 03264ef | 2010-07-12 23:41:28 +0000 | [diff] [blame] | 704 | def alignedload : PatFrag<(ops node:$ptr), (load node:$ptr), [{ | 
| Craig Topper | 050c9c8 | 2017-07-26 04:31:04 +0000 | [diff] [blame] | 705 | return cast<LoadSDNode>(N)->getAlignment() >= 16 && | 
|  | 706 | (!Subtarget->hasSSE41() || !cast<LoadSDNode>(N)->isNonTemporal()); | 
| David Greene | 03264ef | 2010-07-12 23:41:28 +0000 | [diff] [blame] | 707 | }]>; | 
|  | 708 |  | 
| Bruno Cardoso Lopes | 03d6002 | 2011-09-13 19:33:03 +0000 | [diff] [blame] | 709 | // Like 'load', but always requires 256-bit vector alignment. | 
|  | 710 | def alignedload256 : PatFrag<(ops node:$ptr), (load node:$ptr), [{ | 
| Craig Topper | 050c9c8 | 2017-07-26 04:31:04 +0000 | [diff] [blame] | 711 | return cast<LoadSDNode>(N)->getAlignment() >= 32 && | 
|  | 712 | (!Subtarget->hasAVX2() || !cast<LoadSDNode>(N)->isNonTemporal()); | 
| Bruno Cardoso Lopes | 03d6002 | 2011-09-13 19:33:03 +0000 | [diff] [blame] | 713 | }]>; | 
|  | 714 |  | 
| Elena Demikhovsky | cf5b145 | 2013-08-11 07:55:09 +0000 | [diff] [blame] | 715 | // Like 'load', but always requires 512-bit vector alignment. | 
|  | 716 | def alignedload512 : PatFrag<(ops node:$ptr), (load node:$ptr), [{ | 
| Craig Topper | 050c9c8 | 2017-07-26 04:31:04 +0000 | [diff] [blame] | 717 | return cast<LoadSDNode>(N)->getAlignment() >= 64 && | 
|  | 718 | (!Subtarget->hasAVX512() || !cast<LoadSDNode>(N)->isNonTemporal()); | 
| Elena Demikhovsky | cf5b145 | 2013-08-11 07:55:09 +0000 | [diff] [blame] | 719 | }]>; | 
|  | 720 |  | 
| Bruno Cardoso Lopes | 160be29 | 2010-08-13 20:39:01 +0000 | [diff] [blame] | 721 | // 128-bit aligned load pattern fragments | 
| Craig Topper | 0d8e67a | 2012-01-24 03:03:17 +0000 | [diff] [blame] | 722 | // NOTE: all 128-bit integer vector loads are promoted to v2i64 | 
| David Greene | 03264ef | 2010-07-12 23:41:28 +0000 | [diff] [blame] | 723 | def alignedloadv4f32 : PatFrag<(ops node:$ptr), | 
|  | 724 | (v4f32 (alignedload node:$ptr))>; | 
|  | 725 | def alignedloadv2f64 : PatFrag<(ops node:$ptr), | 
|  | 726 | (v2f64 (alignedload node:$ptr))>; | 
| David Greene | 03264ef | 2010-07-12 23:41:28 +0000 | [diff] [blame] | 727 | def alignedloadv2i64 : PatFrag<(ops node:$ptr), | 
|  | 728 | (v2i64 (alignedload node:$ptr))>; | 
|  | 729 |  | 
| Bruno Cardoso Lopes | 160be29 | 2010-08-13 20:39:01 +0000 | [diff] [blame] | 730 | // 256-bit aligned load pattern fragments | 
| Craig Topper | 0d8e67a | 2012-01-24 03:03:17 +0000 | [diff] [blame] | 731 | // NOTE: all 256-bit integer vector loads are promoted to v4i64 | 
| David Greene | 03264ef | 2010-07-12 23:41:28 +0000 | [diff] [blame] | 732 | def alignedloadv8f32 : PatFrag<(ops node:$ptr), | 
| Bruno Cardoso Lopes | 03d6002 | 2011-09-13 19:33:03 +0000 | [diff] [blame] | 733 | (v8f32 (alignedload256 node:$ptr))>; | 
| David Greene | 03264ef | 2010-07-12 23:41:28 +0000 | [diff] [blame] | 734 | def alignedloadv4f64 : PatFrag<(ops node:$ptr), | 
| Bruno Cardoso Lopes | 03d6002 | 2011-09-13 19:33:03 +0000 | [diff] [blame] | 735 | (v4f64 (alignedload256 node:$ptr))>; | 
| David Greene | 03264ef | 2010-07-12 23:41:28 +0000 | [diff] [blame] | 736 | def alignedloadv4i64 : PatFrag<(ops node:$ptr), | 
| Bruno Cardoso Lopes | 03d6002 | 2011-09-13 19:33:03 +0000 | [diff] [blame] | 737 | (v4i64 (alignedload256 node:$ptr))>; | 
| David Greene | 03264ef | 2010-07-12 23:41:28 +0000 | [diff] [blame] | 738 |  | 
| Elena Demikhovsky | cf5b145 | 2013-08-11 07:55:09 +0000 | [diff] [blame] | 739 | // 512-bit aligned load pattern fragments | 
|  | 740 | def alignedloadv16f32 : PatFrag<(ops node:$ptr), | 
|  | 741 | (v16f32 (alignedload512 node:$ptr))>; | 
|  | 742 | def alignedloadv8f64  : PatFrag<(ops node:$ptr), | 
|  | 743 | (v8f64  (alignedload512 node:$ptr))>; | 
| Elena Demikhovsky | cf5b145 | 2013-08-11 07:55:09 +0000 | [diff] [blame] | 744 | def alignedloadv8i64  : PatFrag<(ops node:$ptr), | 
|  | 745 | (v8i64  (alignedload512 node:$ptr))>; | 
|  | 746 |  | 
| Simon Pilgrim | b079c8b | 2017-06-12 10:01:27 +0000 | [diff] [blame] | 747 | // Like 'vec128load', but uses special alignment checks suitable for use in | 
| David Greene | 03264ef | 2010-07-12 23:41:28 +0000 | [diff] [blame] | 748 | // memory operands in most SSE instructions, which are required to | 
|  | 749 | // be naturally aligned on some targets but not on others.  If the subtarget | 
|  | 750 | // allows unaligned accesses, match any load, though this may require | 
|  | 751 | // setting a feature bit in the processor (on startup, for example). | 
|  | 752 | // Opteron 10h and later implement such a feature. | 
| Simon Pilgrim | b079c8b | 2017-06-12 10:01:27 +0000 | [diff] [blame] | 753 | def memop : PatFrag<(ops node:$ptr), (vec128load node:$ptr), [{ | 
|  | 754 | return Subtarget->hasSSEUnalignedMem() || | 
|  | 755 | cast<LoadSDNode>(N)->getAlignment() >= 16; | 
| David Greene | 03264ef | 2010-07-12 23:41:28 +0000 | [diff] [blame] | 756 | }]>; | 
|  | 757 |  | 
| Bruno Cardoso Lopes | 160be29 | 2010-08-13 20:39:01 +0000 | [diff] [blame] | 758 | // 128-bit memop pattern fragments | 
| Craig Topper | 0d8e67a | 2012-01-24 03:03:17 +0000 | [diff] [blame] | 759 | // NOTE: all 128-bit integer vector loads are promoted to v2i64 | 
| David Greene | 03264ef | 2010-07-12 23:41:28 +0000 | [diff] [blame] | 760 | def memopv4f32 : PatFrag<(ops node:$ptr), (v4f32 (memop node:$ptr))>; | 
|  | 761 | def memopv2f64 : PatFrag<(ops node:$ptr), (v2f64 (memop node:$ptr))>; | 
| David Greene | 03264ef | 2010-07-12 23:41:28 +0000 | [diff] [blame] | 762 | def memopv2i64 : PatFrag<(ops node:$ptr), (v2i64 (memop node:$ptr))>; | 
| David Greene | 03264ef | 2010-07-12 23:41:28 +0000 | [diff] [blame] | 763 |  | 
| Elena Demikhovsky | 2dac0b4 | 2017-06-22 06:47:41 +0000 | [diff] [blame] | 764 | def X86masked_gather  : SDNode<"X86ISD::MGATHER",  SDTMaskedGather, | 
|  | 765 | [SDNPHasChain, SDNPMayLoad, SDNPMemOperand]>; | 
|  | 766 |  | 
| Elena Demikhovsky | 6a1a357 | 2015-06-28 10:53:29 +0000 | [diff] [blame] | 767 | def mgatherv4i32 : PatFrag<(ops node:$src1, node:$src2, node:$src3), | 
|  | 768 | (masked_gather node:$src1, node:$src2, node:$src3) , [{ | 
|  | 769 | if (MaskedGatherSDNode *Mgt = dyn_cast<MaskedGatherSDNode>(N)) | 
|  | 770 | return (Mgt->getIndex().getValueType() == MVT::v4i32 || | 
|  | 771 | Mgt->getBasePtr().getValueType() == MVT::v4i32); | 
|  | 772 | return false; | 
|  | 773 | }]>; | 
|  | 774 |  | 
| Elena Demikhovsky | e1eda8a | 2015-04-30 08:38:48 +0000 | [diff] [blame] | 775 | def mgatherv8i32 : PatFrag<(ops node:$src1, node:$src2, node:$src3), | 
|  | 776 | (masked_gather node:$src1, node:$src2, node:$src3) , [{ | 
|  | 777 | if (MaskedGatherSDNode *Mgt = dyn_cast<MaskedGatherSDNode>(N)) | 
|  | 778 | return (Mgt->getIndex().getValueType() == MVT::v8i32 || | 
|  | 779 | Mgt->getBasePtr().getValueType() == MVT::v8i32); | 
|  | 780 | return false; | 
|  | 781 | }]>; | 
|  | 782 |  | 
| Elena Demikhovsky | 6a1a357 | 2015-06-28 10:53:29 +0000 | [diff] [blame] | 783 | def mgatherv2i64 : PatFrag<(ops node:$src1, node:$src2, node:$src3), | 
|  | 784 | (masked_gather node:$src1, node:$src2, node:$src3) , [{ | 
|  | 785 | if (MaskedGatherSDNode *Mgt = dyn_cast<MaskedGatherSDNode>(N)) | 
|  | 786 | return (Mgt->getIndex().getValueType() == MVT::v2i64 || | 
|  | 787 | Mgt->getBasePtr().getValueType() == MVT::v2i64); | 
|  | 788 | return false; | 
|  | 789 | }]>; | 
| Elena Demikhovsky | 2dac0b4 | 2017-06-22 06:47:41 +0000 | [diff] [blame] | 790 | def X86mgatherv2i64 : PatFrag<(ops node:$src1, node:$src2, node:$src3), | 
|  | 791 | (X86masked_gather node:$src1, node:$src2, node:$src3) , [{ | 
|  | 792 | if (X86MaskedGatherSDNode *Mgt = dyn_cast<X86MaskedGatherSDNode>(N)) | 
|  | 793 | return (Mgt->getIndex().getValueType() == MVT::v2i64 || | 
|  | 794 | Mgt->getBasePtr().getValueType() == MVT::v2i64) && | 
|  | 795 | (Mgt->getMemoryVT() == MVT::v2i32 || | 
|  | 796 | Mgt->getMemoryVT() == MVT::v2f32); | 
|  | 797 | return false; | 
|  | 798 | }]>; | 
| Elena Demikhovsky | 6a1a357 | 2015-06-28 10:53:29 +0000 | [diff] [blame] | 799 | def mgatherv4i64 : PatFrag<(ops node:$src1, node:$src2, node:$src3), | 
|  | 800 | (masked_gather node:$src1, node:$src2, node:$src3) , [{ | 
|  | 801 | if (MaskedGatherSDNode *Mgt = dyn_cast<MaskedGatherSDNode>(N)) | 
|  | 802 | return (Mgt->getIndex().getValueType() == MVT::v4i64 || | 
|  | 803 | Mgt->getBasePtr().getValueType() == MVT::v4i64); | 
|  | 804 | return false; | 
|  | 805 | }]>; | 
| Elena Demikhovsky | e1eda8a | 2015-04-30 08:38:48 +0000 | [diff] [blame] | 806 | def mgatherv8i64 : PatFrag<(ops node:$src1, node:$src2, node:$src3), | 
|  | 807 | (masked_gather node:$src1, node:$src2, node:$src3) , [{ | 
|  | 808 | if (MaskedGatherSDNode *Mgt = dyn_cast<MaskedGatherSDNode>(N)) | 
|  | 809 | return (Mgt->getIndex().getValueType() == MVT::v8i64 || | 
|  | 810 | Mgt->getBasePtr().getValueType() == MVT::v8i64); | 
|  | 811 | return false; | 
|  | 812 | }]>; | 
|  | 813 | def mgatherv16i32 : PatFrag<(ops node:$src1, node:$src2, node:$src3), | 
|  | 814 | (masked_gather node:$src1, node:$src2, node:$src3) , [{ | 
|  | 815 | if (MaskedGatherSDNode *Mgt = dyn_cast<MaskedGatherSDNode>(N)) | 
|  | 816 | return (Mgt->getIndex().getValueType() == MVT::v16i32 || | 
|  | 817 | Mgt->getBasePtr().getValueType() == MVT::v16i32); | 
|  | 818 | return false; | 
|  | 819 | }]>; | 
|  | 820 |  | 
| Elena Demikhovsky | 30bc4ca | 2015-06-29 12:14:24 +0000 | [diff] [blame] | 821 | def mscatterv2i64 : PatFrag<(ops node:$src1, node:$src2, node:$src3), | 
|  | 822 | (masked_scatter node:$src1, node:$src2, node:$src3) , [{ | 
|  | 823 | if (MaskedScatterSDNode *Sc = dyn_cast<MaskedScatterSDNode>(N)) | 
|  | 824 | return (Sc->getIndex().getValueType() == MVT::v2i64 || | 
|  | 825 | Sc->getBasePtr().getValueType() == MVT::v2i64); | 
|  | 826 | return false; | 
|  | 827 | }]>; | 
|  | 828 |  | 
|  | 829 | def mscatterv4i32 : PatFrag<(ops node:$src1, node:$src2, node:$src3), | 
|  | 830 | (masked_scatter node:$src1, node:$src2, node:$src3) , [{ | 
|  | 831 | if (MaskedScatterSDNode *Sc = dyn_cast<MaskedScatterSDNode>(N)) | 
|  | 832 | return (Sc->getIndex().getValueType() == MVT::v4i32 || | 
|  | 833 | Sc->getBasePtr().getValueType() == MVT::v4i32); | 
|  | 834 | return false; | 
|  | 835 | }]>; | 
|  | 836 |  | 
|  | 837 | def mscatterv4i64 : PatFrag<(ops node:$src1, node:$src2, node:$src3), | 
|  | 838 | (masked_scatter node:$src1, node:$src2, node:$src3) , [{ | 
|  | 839 | if (MaskedScatterSDNode *Sc = dyn_cast<MaskedScatterSDNode>(N)) | 
|  | 840 | return (Sc->getIndex().getValueType() == MVT::v4i64 || | 
|  | 841 | Sc->getBasePtr().getValueType() == MVT::v4i64); | 
|  | 842 | return false; | 
|  | 843 | }]>; | 
|  | 844 |  | 
| Elena Demikhovsky | e1eda8a | 2015-04-30 08:38:48 +0000 | [diff] [blame] | 845 | def mscatterv8i32 : PatFrag<(ops node:$src1, node:$src2, node:$src3), | 
|  | 846 | (masked_scatter node:$src1, node:$src2, node:$src3) , [{ | 
|  | 847 | if (MaskedScatterSDNode *Sc = dyn_cast<MaskedScatterSDNode>(N)) | 
|  | 848 | return (Sc->getIndex().getValueType() == MVT::v8i32 || | 
|  | 849 | Sc->getBasePtr().getValueType() == MVT::v8i32); | 
|  | 850 | return false; | 
|  | 851 | }]>; | 
|  | 852 |  | 
|  | 853 | def mscatterv8i64 : PatFrag<(ops node:$src1, node:$src2, node:$src3), | 
|  | 854 | (masked_scatter node:$src1, node:$src2, node:$src3) , [{ | 
|  | 855 | if (MaskedScatterSDNode *Sc = dyn_cast<MaskedScatterSDNode>(N)) | 
|  | 856 | return (Sc->getIndex().getValueType() == MVT::v8i64 || | 
|  | 857 | Sc->getBasePtr().getValueType() == MVT::v8i64); | 
|  | 858 | return false; | 
|  | 859 | }]>; | 
|  | 860 | def mscatterv16i32 : PatFrag<(ops node:$src1, node:$src2, node:$src3), | 
|  | 861 | (masked_scatter node:$src1, node:$src2, node:$src3) , [{ | 
|  | 862 | if (MaskedScatterSDNode *Sc = dyn_cast<MaskedScatterSDNode>(N)) | 
|  | 863 | return (Sc->getIndex().getValueType() == MVT::v16i32 || | 
|  | 864 | Sc->getBasePtr().getValueType() == MVT::v16i32); | 
|  | 865 | return false; | 
|  | 866 | }]>; | 
|  | 867 |  | 
| Bruno Cardoso Lopes | 160be29 | 2010-08-13 20:39:01 +0000 | [diff] [blame] | 868 | // 128-bit bitconvert pattern fragments | 
| David Greene | 03264ef | 2010-07-12 23:41:28 +0000 | [diff] [blame] | 869 | def bc_v4f32 : PatFrag<(ops node:$in), (v4f32 (bitconvert node:$in))>; | 
|  | 870 | def bc_v2f64 : PatFrag<(ops node:$in), (v2f64 (bitconvert node:$in))>; | 
|  | 871 | def bc_v16i8 : PatFrag<(ops node:$in), (v16i8 (bitconvert node:$in))>; | 
|  | 872 | def bc_v8i16 : PatFrag<(ops node:$in), (v8i16 (bitconvert node:$in))>; | 
|  | 873 | def bc_v4i32 : PatFrag<(ops node:$in), (v4i32 (bitconvert node:$in))>; | 
|  | 874 | def bc_v2i64 : PatFrag<(ops node:$in), (v2i64 (bitconvert node:$in))>; | 
|  | 875 |  | 
| Bruno Cardoso Lopes | 160be29 | 2010-08-13 20:39:01 +0000 | [diff] [blame] | 876 | // 256-bit bitconvert pattern fragments | 
| Craig Topper | 682b850 | 2011-11-02 04:42:13 +0000 | [diff] [blame] | 877 | def bc_v32i8 : PatFrag<(ops node:$in), (v32i8 (bitconvert node:$in))>; | 
|  | 878 | def bc_v16i16 : PatFrag<(ops node:$in), (v16i16 (bitconvert node:$in))>; | 
| Bruno Cardoso Lopes | e3acfd4 | 2010-07-21 23:53:50 +0000 | [diff] [blame] | 879 | def bc_v8i32 : PatFrag<(ops node:$in), (v8i32 (bitconvert node:$in))>; | 
| Bruno Cardoso Lopes | 1021b4a | 2011-07-13 01:15:33 +0000 | [diff] [blame] | 880 | def bc_v4i64 : PatFrag<(ops node:$in), (v4i64 (bitconvert node:$in))>; | 
| Elena Demikhovsky | 3629b4a | 2014-01-06 08:45:54 +0000 | [diff] [blame] | 881 | def bc_v8f32 : PatFrag<(ops node:$in), (v8f32 (bitconvert node:$in))>; | 
| Bruno Cardoso Lopes | e3acfd4 | 2010-07-21 23:53:50 +0000 | [diff] [blame] | 882 |  | 
| Craig Topper | 8c92962 | 2013-08-16 06:07:34 +0000 | [diff] [blame] | 883 | // 512-bit bitconvert pattern fragments | 
| Craig Topper | 850feaf | 2016-08-28 22:20:51 +0000 | [diff] [blame] | 884 | def bc_v64i8 : PatFrag<(ops node:$in), (v64i8 (bitconvert node:$in))>; | 
| Craig Topper | 8c92962 | 2013-08-16 06:07:34 +0000 | [diff] [blame] | 885 | def bc_v16i32 : PatFrag<(ops node:$in), (v16i32 (bitconvert node:$in))>; | 
|  | 886 | def bc_v8i64 : PatFrag<(ops node:$in), (v8i64 (bitconvert node:$in))>; | 
| Elena Demikhovsky | de3f751 | 2014-01-01 15:12:34 +0000 | [diff] [blame] | 887 | def bc_v8f64 : PatFrag<(ops node:$in), (v8f64 (bitconvert node:$in))>; | 
|  | 888 | def bc_v16f32 : PatFrag<(ops node:$in), (v16f32 (bitconvert node:$in))>; | 
| Craig Topper | 8c92962 | 2013-08-16 06:07:34 +0000 | [diff] [blame] | 889 |  | 
| David Greene | 03264ef | 2010-07-12 23:41:28 +0000 | [diff] [blame] | 890 | def vzmovl_v2i64 : PatFrag<(ops node:$src), | 
|  | 891 | (bitconvert (v2i64 (X86vzmovl | 
|  | 892 | (v2i64 (scalar_to_vector (loadi64 node:$src))))))>; | 
|  | 893 | def vzmovl_v4i32 : PatFrag<(ops node:$src), | 
|  | 894 | (bitconvert (v4i32 (X86vzmovl | 
|  | 895 | (v4i32 (scalar_to_vector (loadi32 node:$src))))))>; | 
|  | 896 |  | 
|  | 897 | def vzload_v2i64 : PatFrag<(ops node:$src), | 
|  | 898 | (bitconvert (v2i64 (X86vzload node:$src)))>; | 
|  | 899 |  | 
|  | 900 |  | 
|  | 901 | def fp32imm0 : PatLeaf<(f32 fpimm), [{ | 
|  | 902 | return N->isExactlyValue(+0.0); | 
|  | 903 | }]>; | 
|  | 904 |  | 
| Ayman Musa | 46af8f9 | 2016-11-13 14:29:32 +0000 | [diff] [blame] | 905 | def fp64imm0 : PatLeaf<(f64 fpimm), [{ | 
|  | 906 | return N->isExactlyValue(+0.0); | 
|  | 907 | }]>; | 
|  | 908 |  | 
| Elena Demikhovsky | de3f751 | 2014-01-01 15:12:34 +0000 | [diff] [blame] | 909 | def I8Imm : SDNodeXForm<imm, [{ | 
|  | 910 | // Transformation function: get the low 8 bits. | 
| Sergey Dmitrouk | 842a51b | 2015-04-28 14:05:47 +0000 | [diff] [blame] | 911 | return getI8Imm((uint8_t)N->getZExtValue(), SDLoc(N)); | 
| Elena Demikhovsky | de3f751 | 2014-01-01 15:12:34 +0000 | [diff] [blame] | 912 | }]>; | 
|  | 913 |  | 
|  | 914 | def FROUND_NO_EXC : ImmLeaf<i32, [{ return Imm == 8; }]>; | 
| Adam Nemet | 50b83f0 | 2014-08-14 17:13:26 +0000 | [diff] [blame] | 915 | def FROUND_CURRENT : ImmLeaf<i32, [{ | 
|  | 916 | return Imm == X86::STATIC_ROUNDING::CUR_DIRECTION; | 
|  | 917 | }]>; | 
| Elena Demikhovsky | de3f751 | 2014-01-01 15:12:34 +0000 | [diff] [blame] | 918 |  | 
| David Greene | 03264ef | 2010-07-12 23:41:28 +0000 | [diff] [blame] | 919 | // BYTE_imm - Transform bit immediates into byte immediates. | 
|  | 920 | def BYTE_imm  : SDNodeXForm<imm, [{ | 
|  | 921 | // Transformation function: imm >> 3 | 
| Sergey Dmitrouk | 842a51b | 2015-04-28 14:05:47 +0000 | [diff] [blame] | 922 | return getI32Imm(N->getZExtValue() >> 3, SDLoc(N)); | 
| David Greene | 03264ef | 2010-07-12 23:41:28 +0000 | [diff] [blame] | 923 | }]>; | 
|  | 924 |  | 
| Elena Demikhovsky | 67b05fc | 2013-07-31 11:35:14 +0000 | [diff] [blame] | 925 | // EXTRACT_get_vextract128_imm xform function: convert extract_subvector index | 
|  | 926 | // to VEXTRACTF128/VEXTRACTI128 imm. | 
|  | 927 | def EXTRACT_get_vextract128_imm : SDNodeXForm<extract_subvector, [{ | 
| Sergey Dmitrouk | 842a51b | 2015-04-28 14:05:47 +0000 | [diff] [blame] | 928 | return getI8Imm(X86::getExtractVEXTRACT128Immediate(N), SDLoc(N)); | 
| David Greene | c4da110 | 2011-02-03 15:50:00 +0000 | [diff] [blame] | 929 | }]>; | 
|  | 930 |  | 
| Elena Demikhovsky | 67b05fc | 2013-07-31 11:35:14 +0000 | [diff] [blame] | 931 | // INSERT_get_vinsert128_imm xform function: convert insert_subvector index to | 
|  | 932 | // VINSERTF128/VINSERTI128 imm. | 
|  | 933 | def INSERT_get_vinsert128_imm : SDNodeXForm<insert_subvector, [{ | 
| Sergey Dmitrouk | 842a51b | 2015-04-28 14:05:47 +0000 | [diff] [blame] | 934 | return getI8Imm(X86::getInsertVINSERT128Immediate(N), SDLoc(N)); | 
| David Greene | 653f1ee | 2011-02-04 16:08:29 +0000 | [diff] [blame] | 935 | }]>; | 
|  | 936 |  | 
| Elena Demikhovsky | 67b05fc | 2013-07-31 11:35:14 +0000 | [diff] [blame] | 937 | // EXTRACT_get_vextract256_imm xform function: convert extract_subvector index | 
|  | 938 | // to VEXTRACTF64x4 imm. | 
|  | 939 | def EXTRACT_get_vextract256_imm : SDNodeXForm<extract_subvector, [{ | 
| Sergey Dmitrouk | 842a51b | 2015-04-28 14:05:47 +0000 | [diff] [blame] | 940 | return getI8Imm(X86::getExtractVEXTRACT256Immediate(N), SDLoc(N)); | 
| Elena Demikhovsky | 67b05fc | 2013-07-31 11:35:14 +0000 | [diff] [blame] | 941 | }]>; | 
|  | 942 |  | 
|  | 943 | // INSERT_get_vinsert256_imm xform function: convert insert_subvector index to | 
|  | 944 | // VINSERTF64x4 imm. | 
|  | 945 | def INSERT_get_vinsert256_imm : SDNodeXForm<insert_subvector, [{ | 
| Sergey Dmitrouk | 842a51b | 2015-04-28 14:05:47 +0000 | [diff] [blame] | 946 | return getI8Imm(X86::getInsertVINSERT256Immediate(N), SDLoc(N)); | 
| Elena Demikhovsky | 67b05fc | 2013-07-31 11:35:14 +0000 | [diff] [blame] | 947 | }]>; | 
|  | 948 |  | 
|  | 949 | def vextract128_extract : PatFrag<(ops node:$bigvec, node:$index), | 
| David Greene | c4da110 | 2011-02-03 15:50:00 +0000 | [diff] [blame] | 950 | (extract_subvector node:$bigvec, | 
|  | 951 | node:$index), [{ | 
| Elena Demikhovsky | 67b05fc | 2013-07-31 11:35:14 +0000 | [diff] [blame] | 952 | return X86::isVEXTRACT128Index(N); | 
|  | 953 | }], EXTRACT_get_vextract128_imm>; | 
| David Greene | 653f1ee | 2011-02-04 16:08:29 +0000 | [diff] [blame] | 954 |  | 
| Elena Demikhovsky | 67b05fc | 2013-07-31 11:35:14 +0000 | [diff] [blame] | 955 | def vinsert128_insert : PatFrag<(ops node:$bigvec, node:$smallvec, | 
| David Greene | 653f1ee | 2011-02-04 16:08:29 +0000 | [diff] [blame] | 956 | node:$index), | 
|  | 957 | (insert_subvector node:$bigvec, node:$smallvec, | 
|  | 958 | node:$index), [{ | 
| Elena Demikhovsky | 67b05fc | 2013-07-31 11:35:14 +0000 | [diff] [blame] | 959 | return X86::isVINSERT128Index(N); | 
|  | 960 | }], INSERT_get_vinsert128_imm>; | 
|  | 961 |  | 
|  | 962 |  | 
|  | 963 | def vextract256_extract : PatFrag<(ops node:$bigvec, node:$index), | 
|  | 964 | (extract_subvector node:$bigvec, | 
|  | 965 | node:$index), [{ | 
|  | 966 | return X86::isVEXTRACT256Index(N); | 
|  | 967 | }], EXTRACT_get_vextract256_imm>; | 
|  | 968 |  | 
|  | 969 | def vinsert256_insert : PatFrag<(ops node:$bigvec, node:$smallvec, | 
|  | 970 | node:$index), | 
|  | 971 | (insert_subvector node:$bigvec, node:$smallvec, | 
|  | 972 | node:$index), [{ | 
|  | 973 | return X86::isVINSERT256Index(N); | 
|  | 974 | }], INSERT_get_vinsert256_imm>; | 
| Bruno Cardoso Lopes | 123dff0 | 2011-07-25 23:05:25 +0000 | [diff] [blame] | 975 |  | 
| Elena Demikhovsky | 5b10aa1 | 2016-10-09 10:48:52 +0000 | [diff] [blame] | 976 | def X86mload : PatFrag<(ops node:$src1, node:$src2, node:$src3), | 
| Elena Demikhovsky | d207f17 | 2015-03-03 15:03:35 +0000 | [diff] [blame] | 977 | (masked_load node:$src1, node:$src2, node:$src3), [{ | 
| Elena Demikhovsky | 5b10aa1 | 2016-10-09 10:48:52 +0000 | [diff] [blame] | 978 | return !cast<MaskedLoadSDNode>(N)->isExpandingLoad() && | 
|  | 979 | cast<MaskedLoadSDNode>(N)->getExtensionType() == ISD::NON_EXTLOAD; | 
|  | 980 | }]>; | 
|  | 981 |  | 
|  | 982 | def masked_load_aligned128 : PatFrag<(ops node:$src1, node:$src2, node:$src3), | 
|  | 983 | (X86mload node:$src1, node:$src2, node:$src3), [{ | 
|  | 984 | return cast<MaskedLoadSDNode>(N)->getAlignment() >= 16; | 
| Elena Demikhovsky | d207f17 | 2015-03-03 15:03:35 +0000 | [diff] [blame] | 985 | }]>; | 
|  | 986 |  | 
|  | 987 | def masked_load_aligned256 : PatFrag<(ops node:$src1, node:$src2, node:$src3), | 
| Elena Demikhovsky | 5b10aa1 | 2016-10-09 10:48:52 +0000 | [diff] [blame] | 988 | (X86mload node:$src1, node:$src2, node:$src3), [{ | 
|  | 989 | return cast<MaskedLoadSDNode>(N)->getAlignment() >= 32; | 
| Elena Demikhovsky | d207f17 | 2015-03-03 15:03:35 +0000 | [diff] [blame] | 990 | }]>; | 
|  | 991 |  | 
|  | 992 | def masked_load_aligned512 : PatFrag<(ops node:$src1, node:$src2, node:$src3), | 
| Elena Demikhovsky | 5b10aa1 | 2016-10-09 10:48:52 +0000 | [diff] [blame] | 993 | (X86mload node:$src1, node:$src2, node:$src3), [{ | 
|  | 994 | return cast<MaskedLoadSDNode>(N)->getAlignment() >= 64; | 
| Elena Demikhovsky | d207f17 | 2015-03-03 15:03:35 +0000 | [diff] [blame] | 995 | }]>; | 
|  | 996 |  | 
|  | 997 | def masked_load_unaligned : PatFrag<(ops node:$src1, node:$src2, node:$src3), | 
|  | 998 | (masked_load node:$src1, node:$src2, node:$src3), [{ | 
| Elena Demikhovsky | 5b10aa1 | 2016-10-09 10:48:52 +0000 | [diff] [blame] | 999 | return !cast<MaskedLoadSDNode>(N)->isExpandingLoad() && | 
|  | 1000 | cast<MaskedLoadSDNode>(N)->getExtensionType() == ISD::NON_EXTLOAD; | 
|  | 1001 | }]>; | 
|  | 1002 |  | 
|  | 1003 | def X86mExpandingLoad : PatFrag<(ops node:$src1, node:$src2, node:$src3), | 
|  | 1004 | (masked_load node:$src1, node:$src2, node:$src3), [{ | 
|  | 1005 | return cast<MaskedLoadSDNode>(N)->isExpandingLoad(); | 
| Elena Demikhovsky | d207f17 | 2015-03-03 15:03:35 +0000 | [diff] [blame] | 1006 | }]>; | 
|  | 1007 |  | 
| Sanjay Patel | c54600d | 2016-02-01 23:53:35 +0000 | [diff] [blame] | 1008 | // Masked store fragments. | 
| Igor Breger | 074a64e | 2015-07-24 17:24:15 +0000 | [diff] [blame] | 1009 | // X86mstore can't be implemented in core DAG files because some targets | 
| Sanjay Patel | c54600d | 2016-02-01 23:53:35 +0000 | [diff] [blame] | 1010 | // do not support vector types (llvm-tblgen will fail). | 
| Igor Breger | 074a64e | 2015-07-24 17:24:15 +0000 | [diff] [blame] | 1011 | def X86mstore : PatFrag<(ops node:$src1, node:$src2, node:$src3), | 
|  | 1012 | (masked_store node:$src1, node:$src2, node:$src3), [{ | 
| Ayman Musa | d7a5ed4 | 2016-09-26 06:22:08 +0000 | [diff] [blame] | 1013 | return (!cast<MaskedStoreSDNode>(N)->isTruncatingStore()) && | 
|  | 1014 | (!cast<MaskedStoreSDNode>(N)->isCompressingStore()); | 
| Igor Breger | 074a64e | 2015-07-24 17:24:15 +0000 | [diff] [blame] | 1015 | }]>; | 
|  | 1016 |  | 
| Elena Demikhovsky | d207f17 | 2015-03-03 15:03:35 +0000 | [diff] [blame] | 1017 | def masked_store_aligned128 : PatFrag<(ops node:$src1, node:$src2, node:$src3), | 
| Igor Breger | 074a64e | 2015-07-24 17:24:15 +0000 | [diff] [blame] | 1018 | (X86mstore node:$src1, node:$src2, node:$src3), [{ | 
| Elena Demikhovsky | caaceef | 2016-11-03 03:23:55 +0000 | [diff] [blame] | 1019 | return cast<MaskedStoreSDNode>(N)->getAlignment() >= 16; | 
| Elena Demikhovsky | d207f17 | 2015-03-03 15:03:35 +0000 | [diff] [blame] | 1020 | }]>; | 
|  | 1021 |  | 
|  | 1022 | def masked_store_aligned256 : PatFrag<(ops node:$src1, node:$src2, node:$src3), | 
| Igor Breger | 074a64e | 2015-07-24 17:24:15 +0000 | [diff] [blame] | 1023 | (X86mstore node:$src1, node:$src2, node:$src3), [{ | 
| Elena Demikhovsky | caaceef | 2016-11-03 03:23:55 +0000 | [diff] [blame] | 1024 | return cast<MaskedStoreSDNode>(N)->getAlignment() >= 32; | 
| Elena Demikhovsky | d207f17 | 2015-03-03 15:03:35 +0000 | [diff] [blame] | 1025 | }]>; | 
|  | 1026 |  | 
|  | 1027 | def masked_store_aligned512 : PatFrag<(ops node:$src1, node:$src2, node:$src3), | 
| Igor Breger | 074a64e | 2015-07-24 17:24:15 +0000 | [diff] [blame] | 1028 | (X86mstore node:$src1, node:$src2, node:$src3), [{ | 
| Elena Demikhovsky | caaceef | 2016-11-03 03:23:55 +0000 | [diff] [blame] | 1029 | return cast<MaskedStoreSDNode>(N)->getAlignment() >= 64; | 
| Elena Demikhovsky | d207f17 | 2015-03-03 15:03:35 +0000 | [diff] [blame] | 1030 | }]>; | 
|  | 1031 |  | 
|  | 1032 | def masked_store_unaligned : PatFrag<(ops node:$src1, node:$src2, node:$src3), | 
| Elena Demikhovsky | caaceef | 2016-11-03 03:23:55 +0000 | [diff] [blame] | 1033 | (masked_store node:$src1, node:$src2, node:$src3), [{ | 
|  | 1034 | return (!cast<MaskedStoreSDNode>(N)->isTruncatingStore()) && | 
|  | 1035 | (!cast<MaskedStoreSDNode>(N)->isCompressingStore()); | 
| Elena Demikhovsky | d207f17 | 2015-03-03 15:03:35 +0000 | [diff] [blame] | 1036 | }]>; | 
|  | 1037 |  | 
| Ayman Musa | d7a5ed4 | 2016-09-26 06:22:08 +0000 | [diff] [blame] | 1038 | def X86mCompressingStore : PatFrag<(ops node:$src1, node:$src2, node:$src3), | 
|  | 1039 | (masked_store node:$src1, node:$src2, node:$src3), [{ | 
|  | 1040 | return cast<MaskedStoreSDNode>(N)->isCompressingStore(); | 
|  | 1041 | }]>; | 
|  | 1042 |  | 
| Igor Breger | 074a64e | 2015-07-24 17:24:15 +0000 | [diff] [blame] | 1043 | // masked truncstore fragments | 
|  | 1044 | // X86mtruncstore can't be implemented in core DAG files because some targets | 
|  | 1045 | // doesn't support vector type ( llvm-tblgen will fail) | 
|  | 1046 | def X86mtruncstore : PatFrag<(ops node:$src1, node:$src2, node:$src3), | 
|  | 1047 | (masked_store node:$src1, node:$src2, node:$src3), [{ | 
|  | 1048 | return cast<MaskedStoreSDNode>(N)->isTruncatingStore(); | 
|  | 1049 | }]>; | 
|  | 1050 | def masked_truncstorevi8 : | 
|  | 1051 | PatFrag<(ops node:$src1, node:$src2, node:$src3), | 
|  | 1052 | (X86mtruncstore node:$src1, node:$src2, node:$src3), [{ | 
|  | 1053 | return cast<MaskedStoreSDNode>(N)->getMemoryVT().getScalarType() == MVT::i8; | 
|  | 1054 | }]>; | 
|  | 1055 | def masked_truncstorevi16 : | 
|  | 1056 | PatFrag<(ops node:$src1, node:$src2, node:$src3), | 
|  | 1057 | (X86mtruncstore node:$src1, node:$src2, node:$src3), [{ | 
|  | 1058 | return cast<MaskedStoreSDNode>(N)->getMemoryVT().getScalarType() == MVT::i16; | 
|  | 1059 | }]>; | 
|  | 1060 | def masked_truncstorevi32 : | 
|  | 1061 | PatFrag<(ops node:$src1, node:$src2, node:$src3), | 
|  | 1062 | (X86mtruncstore node:$src1, node:$src2, node:$src3), [{ | 
|  | 1063 | return cast<MaskedStoreSDNode>(N)->getMemoryVT().getScalarType() == MVT::i32; | 
|  | 1064 | }]>; | 
| Elena Demikhovsky | b906df9 | 2016-09-13 07:57:00 +0000 | [diff] [blame] | 1065 |  | 
| Elena Demikhovsky | 7c7bf1b | 2016-12-21 10:43:36 +0000 | [diff] [blame] | 1066 | def X86TruncSStore : SDNode<"X86ISD::VTRUNCSTORES",  SDTStore, | 
|  | 1067 | [SDNPHasChain, SDNPMayStore, SDNPMemOperand]>; | 
|  | 1068 |  | 
|  | 1069 | def X86TruncUSStore : SDNode<"X86ISD::VTRUNCSTOREUS",  SDTStore, | 
|  | 1070 | [SDNPHasChain, SDNPMayStore, SDNPMemOperand]>; | 
|  | 1071 |  | 
|  | 1072 | def X86MTruncSStore : SDNode<"X86ISD::VMTRUNCSTORES",  SDTMaskedStore, | 
|  | 1073 | [SDNPHasChain, SDNPMayStore, SDNPMemOperand]>; | 
|  | 1074 |  | 
|  | 1075 | def X86MTruncUSStore : SDNode<"X86ISD::VMTRUNCSTOREUS",  SDTMaskedStore, | 
|  | 1076 | [SDNPHasChain, SDNPMayStore, SDNPMemOperand]>; | 
|  | 1077 |  | 
|  | 1078 | def truncstore_s_vi8 : PatFrag<(ops node:$val, node:$ptr), | 
|  | 1079 | (X86TruncSStore node:$val, node:$ptr), [{ | 
|  | 1080 | return cast<TruncSStoreSDNode>(N)->getMemoryVT().getScalarType() == MVT::i8; | 
|  | 1081 | }]>; | 
|  | 1082 |  | 
|  | 1083 | def truncstore_us_vi8 : PatFrag<(ops node:$val, node:$ptr), | 
|  | 1084 | (X86TruncUSStore node:$val, node:$ptr), [{ | 
|  | 1085 | return cast<TruncUSStoreSDNode>(N)->getMemoryVT().getScalarType() == MVT::i8; | 
|  | 1086 | }]>; | 
|  | 1087 |  | 
|  | 1088 | def truncstore_s_vi16 : PatFrag<(ops node:$val, node:$ptr), | 
|  | 1089 | (X86TruncSStore node:$val, node:$ptr), [{ | 
|  | 1090 | return cast<TruncSStoreSDNode>(N)->getMemoryVT().getScalarType() == MVT::i16; | 
|  | 1091 | }]>; | 
|  | 1092 |  | 
|  | 1093 | def truncstore_us_vi16 : PatFrag<(ops node:$val, node:$ptr), | 
|  | 1094 | (X86TruncUSStore node:$val, node:$ptr), [{ | 
|  | 1095 | return cast<TruncUSStoreSDNode>(N)->getMemoryVT().getScalarType() == MVT::i16; | 
|  | 1096 | }]>; | 
|  | 1097 |  | 
|  | 1098 | def truncstore_s_vi32 : PatFrag<(ops node:$val, node:$ptr), | 
|  | 1099 | (X86TruncSStore node:$val, node:$ptr), [{ | 
|  | 1100 | return cast<TruncSStoreSDNode>(N)->getMemoryVT().getScalarType() == MVT::i32; | 
|  | 1101 | }]>; | 
|  | 1102 |  | 
|  | 1103 | def truncstore_us_vi32 : PatFrag<(ops node:$val, node:$ptr), | 
|  | 1104 | (X86TruncUSStore node:$val, node:$ptr), [{ | 
|  | 1105 | return cast<TruncUSStoreSDNode>(N)->getMemoryVT().getScalarType() == MVT::i32; | 
|  | 1106 | }]>; | 
|  | 1107 |  | 
|  | 1108 | def masked_truncstore_s_vi8 : PatFrag<(ops node:$src1, node:$src2, node:$src3), | 
|  | 1109 | (X86MTruncSStore node:$src1, node:$src2, node:$src3), [{ | 
|  | 1110 | return cast<MaskedTruncSStoreSDNode>(N)->getMemoryVT().getScalarType() == MVT::i8; | 
|  | 1111 | }]>; | 
|  | 1112 |  | 
|  | 1113 | def masked_truncstore_us_vi8 : PatFrag<(ops node:$src1, node:$src2, node:$src3), | 
|  | 1114 | (X86MTruncUSStore node:$src1, node:$src2, node:$src3), [{ | 
|  | 1115 | return cast<MaskedTruncUSStoreSDNode>(N)->getMemoryVT().getScalarType() == MVT::i8; | 
|  | 1116 | }]>; | 
|  | 1117 |  | 
|  | 1118 | def masked_truncstore_s_vi16 : PatFrag<(ops node:$src1, node:$src2, node:$src3), | 
|  | 1119 | (X86MTruncSStore node:$src1, node:$src2, node:$src3), [{ | 
|  | 1120 | return cast<MaskedTruncSStoreSDNode>(N)->getMemoryVT().getScalarType() == MVT::i16; | 
|  | 1121 | }]>; | 
|  | 1122 |  | 
|  | 1123 | def masked_truncstore_us_vi16 : PatFrag<(ops node:$src1, node:$src2, node:$src3), | 
|  | 1124 | (X86MTruncUSStore node:$src1, node:$src2, node:$src3), [{ | 
|  | 1125 | return cast<MaskedTruncUSStoreSDNode>(N)->getMemoryVT().getScalarType() == MVT::i16; | 
|  | 1126 | }]>; | 
|  | 1127 |  | 
|  | 1128 | def masked_truncstore_s_vi32 : PatFrag<(ops node:$src1, node:$src2, node:$src3), | 
|  | 1129 | (X86MTruncSStore node:$src1, node:$src2, node:$src3), [{ | 
|  | 1130 | return cast<MaskedTruncSStoreSDNode>(N)->getMemoryVT().getScalarType() == MVT::i32; | 
|  | 1131 | }]>; | 
|  | 1132 |  | 
|  | 1133 | def masked_truncstore_us_vi32 : PatFrag<(ops node:$src1, node:$src2, node:$src3), | 
|  | 1134 | (X86MTruncUSStore node:$src1, node:$src2, node:$src3), [{ | 
|  | 1135 | return cast<MaskedTruncUSStoreSDNode>(N)->getMemoryVT().getScalarType() == MVT::i32; | 
|  | 1136 | }]>; |