Jia Liu | b22310f | 2012-02-18 12:03:15 +0000 | [diff] [blame] | 1 | //===-- X86InstrShiftRotate.td - Shift and Rotate Instrs ---*- tablegen -*-===// |
| 2 | // |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 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 | // |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 8 | //===----------------------------------------------------------------------===// |
| 9 | // |
| 10 | // This file describes the shift and rotate instructions. |
| 11 | // |
| 12 | //===----------------------------------------------------------------------===// |
| 13 | |
| 14 | // FIXME: Someone needs to smear multipattern goodness all over this file. |
| 15 | |
| 16 | let Defs = [EFLAGS] in { |
| 17 | |
Jakob Stoklund Olesen | 7fde8c4 | 2013-03-25 23:07:32 +0000 | [diff] [blame] | 18 | let Constraints = "$src1 = $dst", SchedRW = [WriteShift] in { |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 19 | let Uses = [CL] in { |
| 20 | def SHL8rCL : I<0xD2, MRM4r, (outs GR8 :$dst), (ins GR8 :$src1), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 21 | "shl{b}\t{%cl, $dst|$dst, cl}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 22 | [(set GR8:$dst, (shl GR8:$src1, CL))], IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 23 | def SHL16rCL : I<0xD3, MRM4r, (outs GR16:$dst), (ins GR16:$src1), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 24 | "shl{w}\t{%cl, $dst|$dst, cl}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 25 | [(set GR16:$dst, (shl GR16:$src1, CL))], IIC_SR>, OpSize; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 26 | def SHL32rCL : I<0xD3, MRM4r, (outs GR32:$dst), (ins GR32:$src1), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 27 | "shl{l}\t{%cl, $dst|$dst, cl}", |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 28 | [(set GR32:$dst, (shl GR32:$src1, CL))], IIC_SR>, OpSize16; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 29 | def SHL64rCL : RI<0xD3, MRM4r, (outs GR64:$dst), (ins GR64:$src1), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 30 | "shl{q}\t{%cl, $dst|$dst, cl}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 31 | [(set GR64:$dst, (shl GR64:$src1, CL))], IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 32 | } // Uses = [CL] |
| 33 | |
| 34 | def SHL8ri : Ii8<0xC0, MRM4r, (outs GR8 :$dst), (ins GR8 :$src1, i8imm:$src2), |
| 35 | "shl{b}\t{$src2, $dst|$dst, $src2}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 36 | [(set GR8:$dst, (shl GR8:$src1, (i8 imm:$src2)))], IIC_SR>; |
Nadav Rotem | d61dcfc | 2013-05-04 23:27:32 +0000 | [diff] [blame] | 37 | |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 38 | let isConvertibleToThreeAddress = 1 in { // Can transform into LEA. |
| 39 | def SHL16ri : Ii8<0xC1, MRM4r, (outs GR16:$dst), (ins GR16:$src1, i8imm:$src2), |
| 40 | "shl{w}\t{$src2, $dst|$dst, $src2}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 41 | [(set GR16:$dst, (shl GR16:$src1, (i8 imm:$src2)))], IIC_SR>, |
| 42 | OpSize; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 43 | def SHL32ri : Ii8<0xC1, MRM4r, (outs GR32:$dst), (ins GR32:$src1, i8imm:$src2), |
| 44 | "shl{l}\t{$src2, $dst|$dst, $src2}", |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 45 | [(set GR32:$dst, (shl GR32:$src1, (i8 imm:$src2)))], IIC_SR>, |
| 46 | OpSize16; |
Nadav Rotem | d61dcfc | 2013-05-04 23:27:32 +0000 | [diff] [blame] | 47 | def SHL64ri : RIi8<0xC1, MRM4r, (outs GR64:$dst), |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 48 | (ins GR64:$src1, i8imm:$src2), |
| 49 | "shl{q}\t{$src2, $dst|$dst, $src2}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 50 | [(set GR64:$dst, (shl GR64:$src1, (i8 imm:$src2)))], |
| 51 | IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 52 | |
| 53 | // NOTE: We don't include patterns for shifts of a register by one, because |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 54 | // 'add reg,reg' is cheaper (and we have a Pat pattern for shift-by-one). |
Craig Topper | 396cb79 | 2012-12-27 03:35:44 +0000 | [diff] [blame] | 55 | let hasSideEffects = 0 in { |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 56 | def SHL8r1 : I<0xD0, MRM4r, (outs GR8:$dst), (ins GR8:$src1), |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 57 | "shl{b}\t$dst", [], IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 58 | def SHL16r1 : I<0xD1, MRM4r, (outs GR16:$dst), (ins GR16:$src1), |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 59 | "shl{w}\t$dst", [], IIC_SR>, OpSize; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 60 | def SHL32r1 : I<0xD1, MRM4r, (outs GR32:$dst), (ins GR32:$src1), |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 61 | "shl{l}\t$dst", [], IIC_SR>, OpSize16; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 62 | def SHL64r1 : RI<0xD1, MRM4r, (outs GR64:$dst), (ins GR64:$src1), |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 63 | "shl{q}\t$dst", [], IIC_SR>; |
Craig Topper | 396cb79 | 2012-12-27 03:35:44 +0000 | [diff] [blame] | 64 | } // hasSideEffects = 0 |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 65 | } // isConvertibleToThreeAddress = 1 |
Jakob Stoklund Olesen | 7fde8c4 | 2013-03-25 23:07:32 +0000 | [diff] [blame] | 66 | } // Constraints = "$src = $dst", SchedRW |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 67 | |
| 68 | |
Jakob Stoklund Olesen | 7fde8c4 | 2013-03-25 23:07:32 +0000 | [diff] [blame] | 69 | let SchedRW = [WriteShiftLd, WriteRMW] in { |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 70 | // FIXME: Why do we need an explicit "Uses = [CL]" when the instr has a pattern |
| 71 | // using CL? |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 72 | let Uses = [CL] in { |
| 73 | def SHL8mCL : I<0xD2, MRM4m, (outs), (ins i8mem :$dst), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 74 | "shl{b}\t{%cl, $dst|$dst, cl}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 75 | [(store (shl (loadi8 addr:$dst), CL), addr:$dst)], IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 76 | def SHL16mCL : I<0xD3, MRM4m, (outs), (ins i16mem:$dst), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 77 | "shl{w}\t{%cl, $dst|$dst, cl}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 78 | [(store (shl (loadi16 addr:$dst), CL), addr:$dst)], IIC_SR>, |
| 79 | OpSize; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 80 | def SHL32mCL : I<0xD3, MRM4m, (outs), (ins i32mem:$dst), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 81 | "shl{l}\t{%cl, $dst|$dst, cl}", |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 82 | [(store (shl (loadi32 addr:$dst), CL), addr:$dst)], IIC_SR>, |
| 83 | OpSize16; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 84 | def SHL64mCL : RI<0xD3, MRM4m, (outs), (ins i64mem:$dst), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 85 | "shl{q}\t{%cl, $dst|$dst, cl}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 86 | [(store (shl (loadi64 addr:$dst), CL), addr:$dst)], IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 87 | } |
| 88 | def SHL8mi : Ii8<0xC0, MRM4m, (outs), (ins i8mem :$dst, i8imm:$src), |
| 89 | "shl{b}\t{$src, $dst|$dst, $src}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 90 | [(store (shl (loadi8 addr:$dst), (i8 imm:$src)), addr:$dst)], |
| 91 | IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 92 | def SHL16mi : Ii8<0xC1, MRM4m, (outs), (ins i16mem:$dst, i8imm:$src), |
| 93 | "shl{w}\t{$src, $dst|$dst, $src}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 94 | [(store (shl (loadi16 addr:$dst), (i8 imm:$src)), addr:$dst)], |
| 95 | IIC_SR>, |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 96 | OpSize; |
| 97 | def SHL32mi : Ii8<0xC1, MRM4m, (outs), (ins i32mem:$dst, i8imm:$src), |
| 98 | "shl{l}\t{$src, $dst|$dst, $src}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 99 | [(store (shl (loadi32 addr:$dst), (i8 imm:$src)), addr:$dst)], |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 100 | IIC_SR>, OpSize16; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 101 | def SHL64mi : RIi8<0xC1, MRM4m, (outs), (ins i64mem:$dst, i8imm:$src), |
| 102 | "shl{q}\t{$src, $dst|$dst, $src}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 103 | [(store (shl (loadi64 addr:$dst), (i8 imm:$src)), addr:$dst)], |
| 104 | IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 105 | |
| 106 | // Shift by 1 |
| 107 | def SHL8m1 : I<0xD0, MRM4m, (outs), (ins i8mem :$dst), |
| 108 | "shl{b}\t$dst", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 109 | [(store (shl (loadi8 addr:$dst), (i8 1)), addr:$dst)], |
| 110 | IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 111 | def SHL16m1 : I<0xD1, MRM4m, (outs), (ins i16mem:$dst), |
| 112 | "shl{w}\t$dst", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 113 | [(store (shl (loadi16 addr:$dst), (i8 1)), addr:$dst)], |
| 114 | IIC_SR>, |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 115 | OpSize; |
| 116 | def SHL32m1 : I<0xD1, MRM4m, (outs), (ins i32mem:$dst), |
| 117 | "shl{l}\t$dst", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 118 | [(store (shl (loadi32 addr:$dst), (i8 1)), addr:$dst)], |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 119 | IIC_SR>, OpSize16; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 120 | def SHL64m1 : RI<0xD1, MRM4m, (outs), (ins i64mem:$dst), |
| 121 | "shl{q}\t$dst", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 122 | [(store (shl (loadi64 addr:$dst), (i8 1)), addr:$dst)], |
| 123 | IIC_SR>; |
Jakob Stoklund Olesen | 7fde8c4 | 2013-03-25 23:07:32 +0000 | [diff] [blame] | 124 | } // SchedRW |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 125 | |
Jakob Stoklund Olesen | 7fde8c4 | 2013-03-25 23:07:32 +0000 | [diff] [blame] | 126 | let Constraints = "$src1 = $dst", SchedRW = [WriteShift] in { |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 127 | let Uses = [CL] in { |
| 128 | def SHR8rCL : I<0xD2, MRM5r, (outs GR8 :$dst), (ins GR8 :$src1), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 129 | "shr{b}\t{%cl, $dst|$dst, cl}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 130 | [(set GR8:$dst, (srl GR8:$src1, CL))], IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 131 | def SHR16rCL : I<0xD3, MRM5r, (outs GR16:$dst), (ins GR16:$src1), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 132 | "shr{w}\t{%cl, $dst|$dst, cl}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 133 | [(set GR16:$dst, (srl GR16:$src1, CL))], IIC_SR>, OpSize; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 134 | def SHR32rCL : I<0xD3, MRM5r, (outs GR32:$dst), (ins GR32:$src1), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 135 | "shr{l}\t{%cl, $dst|$dst, cl}", |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 136 | [(set GR32:$dst, (srl GR32:$src1, CL))], IIC_SR>, OpSize16; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 137 | def SHR64rCL : RI<0xD3, MRM5r, (outs GR64:$dst), (ins GR64:$src1), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 138 | "shr{q}\t{%cl, $dst|$dst, cl}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 139 | [(set GR64:$dst, (srl GR64:$src1, CL))], IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 140 | } |
| 141 | |
| 142 | def SHR8ri : Ii8<0xC0, MRM5r, (outs GR8:$dst), (ins GR8:$src1, i8imm:$src2), |
| 143 | "shr{b}\t{$src2, $dst|$dst, $src2}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 144 | [(set GR8:$dst, (srl GR8:$src1, (i8 imm:$src2)))], IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 145 | def SHR16ri : Ii8<0xC1, MRM5r, (outs GR16:$dst), (ins GR16:$src1, i8imm:$src2), |
| 146 | "shr{w}\t{$src2, $dst|$dst, $src2}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 147 | [(set GR16:$dst, (srl GR16:$src1, (i8 imm:$src2)))], |
| 148 | IIC_SR>, OpSize; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 149 | def SHR32ri : Ii8<0xC1, MRM5r, (outs GR32:$dst), (ins GR32:$src1, i8imm:$src2), |
| 150 | "shr{l}\t{$src2, $dst|$dst, $src2}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 151 | [(set GR32:$dst, (srl GR32:$src1, (i8 imm:$src2)))], |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 152 | IIC_SR>, OpSize16; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 153 | def SHR64ri : RIi8<0xC1, MRM5r, (outs GR64:$dst), (ins GR64:$src1, i8imm:$src2), |
| 154 | "shr{q}\t{$src2, $dst|$dst, $src2}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 155 | [(set GR64:$dst, (srl GR64:$src1, (i8 imm:$src2)))], IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 156 | |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 157 | // Shift right by 1 |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 158 | def SHR8r1 : I<0xD0, MRM5r, (outs GR8:$dst), (ins GR8:$src1), |
| 159 | "shr{b}\t$dst", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 160 | [(set GR8:$dst, (srl GR8:$src1, (i8 1)))], IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 161 | def SHR16r1 : I<0xD1, MRM5r, (outs GR16:$dst), (ins GR16:$src1), |
| 162 | "shr{w}\t$dst", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 163 | [(set GR16:$dst, (srl GR16:$src1, (i8 1)))], IIC_SR>, OpSize; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 164 | def SHR32r1 : I<0xD1, MRM5r, (outs GR32:$dst), (ins GR32:$src1), |
| 165 | "shr{l}\t$dst", |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 166 | [(set GR32:$dst, (srl GR32:$src1, (i8 1)))], IIC_SR>, OpSize16; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 167 | def SHR64r1 : RI<0xD1, MRM5r, (outs GR64:$dst), (ins GR64:$src1), |
| 168 | "shr{q}\t$dst", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 169 | [(set GR64:$dst, (srl GR64:$src1, (i8 1)))], IIC_SR>; |
Jakob Stoklund Olesen | 7fde8c4 | 2013-03-25 23:07:32 +0000 | [diff] [blame] | 170 | } // Constraints = "$src = $dst", SchedRW |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 171 | |
| 172 | |
Jakob Stoklund Olesen | 7fde8c4 | 2013-03-25 23:07:32 +0000 | [diff] [blame] | 173 | let SchedRW = [WriteShiftLd, WriteRMW] in { |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 174 | let Uses = [CL] in { |
| 175 | def SHR8mCL : I<0xD2, MRM5m, (outs), (ins i8mem :$dst), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 176 | "shr{b}\t{%cl, $dst|$dst, cl}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 177 | [(store (srl (loadi8 addr:$dst), CL), addr:$dst)], IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 178 | def SHR16mCL : I<0xD3, MRM5m, (outs), (ins i16mem:$dst), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 179 | "shr{w}\t{%cl, $dst|$dst, cl}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 180 | [(store (srl (loadi16 addr:$dst), CL), addr:$dst)], IIC_SR>, |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 181 | OpSize; |
| 182 | def SHR32mCL : I<0xD3, MRM5m, (outs), (ins i32mem:$dst), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 183 | "shr{l}\t{%cl, $dst|$dst, cl}", |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 184 | [(store (srl (loadi32 addr:$dst), CL), addr:$dst)], IIC_SR>, |
| 185 | OpSize16; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 186 | def SHR64mCL : RI<0xD3, MRM5m, (outs), (ins i64mem:$dst), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 187 | "shr{q}\t{%cl, $dst|$dst, cl}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 188 | [(store (srl (loadi64 addr:$dst), CL), addr:$dst)], IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 189 | } |
| 190 | def SHR8mi : Ii8<0xC0, MRM5m, (outs), (ins i8mem :$dst, i8imm:$src), |
| 191 | "shr{b}\t{$src, $dst|$dst, $src}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 192 | [(store (srl (loadi8 addr:$dst), (i8 imm:$src)), addr:$dst)], |
| 193 | IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 194 | def SHR16mi : Ii8<0xC1, MRM5m, (outs), (ins i16mem:$dst, i8imm:$src), |
| 195 | "shr{w}\t{$src, $dst|$dst, $src}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 196 | [(store (srl (loadi16 addr:$dst), (i8 imm:$src)), addr:$dst)], |
| 197 | IIC_SR>, |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 198 | OpSize; |
| 199 | def SHR32mi : Ii8<0xC1, MRM5m, (outs), (ins i32mem:$dst, i8imm:$src), |
| 200 | "shr{l}\t{$src, $dst|$dst, $src}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 201 | [(store (srl (loadi32 addr:$dst), (i8 imm:$src)), addr:$dst)], |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 202 | IIC_SR>, OpSize16; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 203 | def SHR64mi : RIi8<0xC1, MRM5m, (outs), (ins i64mem:$dst, i8imm:$src), |
| 204 | "shr{q}\t{$src, $dst|$dst, $src}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 205 | [(store (srl (loadi64 addr:$dst), (i8 imm:$src)), addr:$dst)], |
| 206 | IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 207 | |
| 208 | // Shift by 1 |
| 209 | def SHR8m1 : I<0xD0, MRM5m, (outs), (ins i8mem :$dst), |
| 210 | "shr{b}\t$dst", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 211 | [(store (srl (loadi8 addr:$dst), (i8 1)), addr:$dst)], |
| 212 | IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 213 | def SHR16m1 : I<0xD1, MRM5m, (outs), (ins i16mem:$dst), |
| 214 | "shr{w}\t$dst", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 215 | [(store (srl (loadi16 addr:$dst), (i8 1)), addr:$dst)], |
| 216 | IIC_SR>,OpSize; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 217 | def SHR32m1 : I<0xD1, MRM5m, (outs), (ins i32mem:$dst), |
| 218 | "shr{l}\t$dst", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 219 | [(store (srl (loadi32 addr:$dst), (i8 1)), addr:$dst)], |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 220 | IIC_SR>, OpSize16; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 221 | def SHR64m1 : RI<0xD1, MRM5m, (outs), (ins i64mem:$dst), |
| 222 | "shr{q}\t$dst", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 223 | [(store (srl (loadi64 addr:$dst), (i8 1)), addr:$dst)], |
| 224 | IIC_SR>; |
Jakob Stoklund Olesen | 7fde8c4 | 2013-03-25 23:07:32 +0000 | [diff] [blame] | 225 | } // SchedRW |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 226 | |
Jakob Stoklund Olesen | 7fde8c4 | 2013-03-25 23:07:32 +0000 | [diff] [blame] | 227 | let Constraints = "$src1 = $dst", SchedRW = [WriteShift] in { |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 228 | let Uses = [CL] in { |
| 229 | def SAR8rCL : I<0xD2, MRM7r, (outs GR8 :$dst), (ins GR8 :$src1), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 230 | "sar{b}\t{%cl, $dst|$dst, cl}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 231 | [(set GR8:$dst, (sra GR8:$src1, CL))], |
| 232 | IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 233 | def SAR16rCL : I<0xD3, MRM7r, (outs GR16:$dst), (ins GR16:$src1), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 234 | "sar{w}\t{%cl, $dst|$dst, cl}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 235 | [(set GR16:$dst, (sra GR16:$src1, CL))], |
| 236 | IIC_SR>, OpSize; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 237 | def SAR32rCL : I<0xD3, MRM7r, (outs GR32:$dst), (ins GR32:$src1), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 238 | "sar{l}\t{%cl, $dst|$dst, cl}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 239 | [(set GR32:$dst, (sra GR32:$src1, CL))], |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 240 | IIC_SR>, OpSize16; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 241 | def SAR64rCL : RI<0xD3, MRM7r, (outs GR64:$dst), (ins GR64:$src1), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 242 | "sar{q}\t{%cl, $dst|$dst, cl}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 243 | [(set GR64:$dst, (sra GR64:$src1, CL))], |
| 244 | IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 245 | } |
| 246 | |
| 247 | def SAR8ri : Ii8<0xC0, MRM7r, (outs GR8 :$dst), (ins GR8 :$src1, i8imm:$src2), |
| 248 | "sar{b}\t{$src2, $dst|$dst, $src2}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 249 | [(set GR8:$dst, (sra GR8:$src1, (i8 imm:$src2)))], |
| 250 | IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 251 | def SAR16ri : Ii8<0xC1, MRM7r, (outs GR16:$dst), (ins GR16:$src1, i8imm:$src2), |
| 252 | "sar{w}\t{$src2, $dst|$dst, $src2}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 253 | [(set GR16:$dst, (sra GR16:$src1, (i8 imm:$src2)))], |
| 254 | IIC_SR>, |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 255 | OpSize; |
| 256 | def SAR32ri : Ii8<0xC1, MRM7r, (outs GR32:$dst), (ins GR32:$src1, i8imm:$src2), |
| 257 | "sar{l}\t{$src2, $dst|$dst, $src2}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 258 | [(set GR32:$dst, (sra GR32:$src1, (i8 imm:$src2)))], |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 259 | IIC_SR>, OpSize16; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 260 | def SAR64ri : RIi8<0xC1, MRM7r, (outs GR64:$dst), |
| 261 | (ins GR64:$src1, i8imm:$src2), |
| 262 | "sar{q}\t{$src2, $dst|$dst, $src2}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 263 | [(set GR64:$dst, (sra GR64:$src1, (i8 imm:$src2)))], |
| 264 | IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 265 | |
| 266 | // Shift by 1 |
| 267 | def SAR8r1 : I<0xD0, MRM7r, (outs GR8 :$dst), (ins GR8 :$src1), |
| 268 | "sar{b}\t$dst", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 269 | [(set GR8:$dst, (sra GR8:$src1, (i8 1)))], |
| 270 | IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 271 | def SAR16r1 : I<0xD1, MRM7r, (outs GR16:$dst), (ins GR16:$src1), |
| 272 | "sar{w}\t$dst", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 273 | [(set GR16:$dst, (sra GR16:$src1, (i8 1)))], |
| 274 | IIC_SR>, OpSize; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 275 | def SAR32r1 : I<0xD1, MRM7r, (outs GR32:$dst), (ins GR32:$src1), |
| 276 | "sar{l}\t$dst", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 277 | [(set GR32:$dst, (sra GR32:$src1, (i8 1)))], |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 278 | IIC_SR>, OpSize16; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 279 | def SAR64r1 : RI<0xD1, MRM7r, (outs GR64:$dst), (ins GR64:$src1), |
| 280 | "sar{q}\t$dst", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 281 | [(set GR64:$dst, (sra GR64:$src1, (i8 1)))], |
| 282 | IIC_SR>; |
Jakob Stoklund Olesen | 7fde8c4 | 2013-03-25 23:07:32 +0000 | [diff] [blame] | 283 | } // Constraints = "$src = $dst", SchedRW |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 284 | |
| 285 | |
Jakob Stoklund Olesen | 7fde8c4 | 2013-03-25 23:07:32 +0000 | [diff] [blame] | 286 | let SchedRW = [WriteShiftLd, WriteRMW] in { |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 287 | let Uses = [CL] in { |
| 288 | def SAR8mCL : I<0xD2, MRM7m, (outs), (ins i8mem :$dst), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 289 | "sar{b}\t{%cl, $dst|$dst, cl}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 290 | [(store (sra (loadi8 addr:$dst), CL), addr:$dst)], |
| 291 | IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 292 | def SAR16mCL : I<0xD3, MRM7m, (outs), (ins i16mem:$dst), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 293 | "sar{w}\t{%cl, $dst|$dst, cl}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 294 | [(store (sra (loadi16 addr:$dst), CL), addr:$dst)], |
| 295 | IIC_SR>, OpSize; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 296 | def SAR32mCL : I<0xD3, MRM7m, (outs), (ins i32mem:$dst), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 297 | "sar{l}\t{%cl, $dst|$dst, cl}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 298 | [(store (sra (loadi32 addr:$dst), CL), addr:$dst)], |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 299 | IIC_SR>, OpSize16; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 300 | def SAR64mCL : RI<0xD3, MRM7m, (outs), (ins i64mem:$dst), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 301 | "sar{q}\t{%cl, $dst|$dst, cl}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 302 | [(store (sra (loadi64 addr:$dst), CL), addr:$dst)], |
| 303 | IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 304 | } |
| 305 | def SAR8mi : Ii8<0xC0, MRM7m, (outs), (ins i8mem :$dst, i8imm:$src), |
| 306 | "sar{b}\t{$src, $dst|$dst, $src}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 307 | [(store (sra (loadi8 addr:$dst), (i8 imm:$src)), addr:$dst)], |
| 308 | IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 309 | def SAR16mi : Ii8<0xC1, MRM7m, (outs), (ins i16mem:$dst, i8imm:$src), |
| 310 | "sar{w}\t{$src, $dst|$dst, $src}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 311 | [(store (sra (loadi16 addr:$dst), (i8 imm:$src)), addr:$dst)], |
| 312 | IIC_SR>, |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 313 | OpSize; |
| 314 | def SAR32mi : Ii8<0xC1, MRM7m, (outs), (ins i32mem:$dst, i8imm:$src), |
| 315 | "sar{l}\t{$src, $dst|$dst, $src}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 316 | [(store (sra (loadi32 addr:$dst), (i8 imm:$src)), addr:$dst)], |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 317 | IIC_SR>, OpSize16; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 318 | def SAR64mi : RIi8<0xC1, MRM7m, (outs), (ins i64mem:$dst, i8imm:$src), |
| 319 | "sar{q}\t{$src, $dst|$dst, $src}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 320 | [(store (sra (loadi64 addr:$dst), (i8 imm:$src)), addr:$dst)], |
| 321 | IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 322 | |
| 323 | // Shift by 1 |
| 324 | def SAR8m1 : I<0xD0, MRM7m, (outs), (ins i8mem :$dst), |
| 325 | "sar{b}\t$dst", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 326 | [(store (sra (loadi8 addr:$dst), (i8 1)), addr:$dst)], |
| 327 | IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 328 | def SAR16m1 : I<0xD1, MRM7m, (outs), (ins i16mem:$dst), |
| 329 | "sar{w}\t$dst", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 330 | [(store (sra (loadi16 addr:$dst), (i8 1)), addr:$dst)], |
| 331 | IIC_SR>, |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 332 | OpSize; |
| 333 | def SAR32m1 : I<0xD1, MRM7m, (outs), (ins i32mem:$dst), |
| 334 | "sar{l}\t$dst", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 335 | [(store (sra (loadi32 addr:$dst), (i8 1)), addr:$dst)], |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 336 | IIC_SR>, OpSize16; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 337 | def SAR64m1 : RI<0xD1, MRM7m, (outs), (ins i64mem:$dst), |
| 338 | "sar{q}\t$dst", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 339 | [(store (sra (loadi64 addr:$dst), (i8 1)), addr:$dst)], |
| 340 | IIC_SR>; |
Jakob Stoklund Olesen | 7fde8c4 | 2013-03-25 23:07:32 +0000 | [diff] [blame] | 341 | } // SchedRW |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 342 | |
| 343 | //===----------------------------------------------------------------------===// |
| 344 | // Rotate instructions |
| 345 | //===----------------------------------------------------------------------===// |
| 346 | |
Craig Topper | 396cb79 | 2012-12-27 03:35:44 +0000 | [diff] [blame] | 347 | let hasSideEffects = 0 in { |
Jakob Stoklund Olesen | 7fde8c4 | 2013-03-25 23:07:32 +0000 | [diff] [blame] | 348 | let Constraints = "$src1 = $dst", SchedRW = [WriteShift] in { |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 349 | def RCL8r1 : I<0xD0, MRM2r, (outs GR8:$dst), (ins GR8:$src1), |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 350 | "rcl{b}\t$dst", [], IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 351 | def RCL8ri : Ii8<0xC0, MRM2r, (outs GR8:$dst), (ins GR8:$src1, i8imm:$cnt), |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 352 | "rcl{b}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 353 | let Uses = [CL] in |
| 354 | def RCL8rCL : I<0xD2, MRM2r, (outs GR8:$dst), (ins GR8:$src1), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 355 | "rcl{b}\t{%cl, $dst|$dst, cl}", [], IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 356 | |
| 357 | def RCL16r1 : I<0xD1, MRM2r, (outs GR16:$dst), (ins GR16:$src1), |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 358 | "rcl{w}\t$dst", [], IIC_SR>, OpSize; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 359 | def RCL16ri : Ii8<0xC1, MRM2r, (outs GR16:$dst), (ins GR16:$src1, i8imm:$cnt), |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 360 | "rcl{w}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>, OpSize; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 361 | let Uses = [CL] in |
| 362 | def RCL16rCL : I<0xD3, MRM2r, (outs GR16:$dst), (ins GR16:$src1), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 363 | "rcl{w}\t{%cl, $dst|$dst, cl}", [], IIC_SR>, OpSize; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 364 | |
| 365 | def RCL32r1 : I<0xD1, MRM2r, (outs GR32:$dst), (ins GR32:$src1), |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 366 | "rcl{l}\t$dst", [], IIC_SR>, OpSize16; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 367 | def RCL32ri : Ii8<0xC1, MRM2r, (outs GR32:$dst), (ins GR32:$src1, i8imm:$cnt), |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 368 | "rcl{l}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>, OpSize16; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 369 | let Uses = [CL] in |
| 370 | def RCL32rCL : I<0xD3, MRM2r, (outs GR32:$dst), (ins GR32:$src1), |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 371 | "rcl{l}\t{%cl, $dst|$dst, cl}", [], IIC_SR>, OpSize16; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 372 | |
| 373 | |
| 374 | def RCL64r1 : RI<0xD1, MRM2r, (outs GR64:$dst), (ins GR64:$src1), |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 375 | "rcl{q}\t$dst", [], IIC_SR>; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 376 | def RCL64ri : RIi8<0xC1, MRM2r, (outs GR64:$dst), (ins GR64:$src1, i8imm:$cnt), |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 377 | "rcl{q}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 378 | let Uses = [CL] in |
| 379 | def RCL64rCL : RI<0xD3, MRM2r, (outs GR64:$dst), (ins GR64:$src1), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 380 | "rcl{q}\t{%cl, $dst|$dst, cl}", [], IIC_SR>; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 381 | |
| 382 | |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 383 | def RCR8r1 : I<0xD0, MRM3r, (outs GR8:$dst), (ins GR8:$src1), |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 384 | "rcr{b}\t$dst", [], IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 385 | def RCR8ri : Ii8<0xC0, MRM3r, (outs GR8:$dst), (ins GR8:$src1, i8imm:$cnt), |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 386 | "rcr{b}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 387 | let Uses = [CL] in |
| 388 | def RCR8rCL : I<0xD2, MRM3r, (outs GR8:$dst), (ins GR8:$src1), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 389 | "rcr{b}\t{%cl, $dst|$dst, cl}", [], IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 390 | |
| 391 | def RCR16r1 : I<0xD1, MRM3r, (outs GR16:$dst), (ins GR16:$src1), |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 392 | "rcr{w}\t$dst", [], IIC_SR>, OpSize; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 393 | def RCR16ri : Ii8<0xC1, MRM3r, (outs GR16:$dst), (ins GR16:$src1, i8imm:$cnt), |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 394 | "rcr{w}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>, OpSize; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 395 | let Uses = [CL] in |
| 396 | def RCR16rCL : I<0xD3, MRM3r, (outs GR16:$dst), (ins GR16:$src1), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 397 | "rcr{w}\t{%cl, $dst|$dst, cl}", [], IIC_SR>, OpSize; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 398 | |
| 399 | def RCR32r1 : I<0xD1, MRM3r, (outs GR32:$dst), (ins GR32:$src1), |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 400 | "rcr{l}\t$dst", [], IIC_SR>, OpSize16; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 401 | def RCR32ri : Ii8<0xC1, MRM3r, (outs GR32:$dst), (ins GR32:$src1, i8imm:$cnt), |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 402 | "rcr{l}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>, OpSize16; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 403 | let Uses = [CL] in |
| 404 | def RCR32rCL : I<0xD3, MRM3r, (outs GR32:$dst), (ins GR32:$src1), |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 405 | "rcr{l}\t{%cl, $dst|$dst, cl}", [], IIC_SR>, OpSize16; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 406 | |
| 407 | def RCR64r1 : RI<0xD1, MRM3r, (outs GR64:$dst), (ins GR64:$src1), |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 408 | "rcr{q}\t$dst", [], IIC_SR>; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 409 | def RCR64ri : RIi8<0xC1, MRM3r, (outs GR64:$dst), (ins GR64:$src1, i8imm:$cnt), |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 410 | "rcr{q}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 411 | let Uses = [CL] in |
| 412 | def RCR64rCL : RI<0xD3, MRM3r, (outs GR64:$dst), (ins GR64:$src1), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 413 | "rcr{q}\t{%cl, $dst|$dst, cl}", [], IIC_SR>; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 414 | |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 415 | } // Constraints = "$src = $dst" |
| 416 | |
Jakob Stoklund Olesen | 7fde8c4 | 2013-03-25 23:07:32 +0000 | [diff] [blame] | 417 | let SchedRW = [WriteShiftLd, WriteRMW] in { |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 418 | def RCL8m1 : I<0xD0, MRM2m, (outs), (ins i8mem:$dst), |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 419 | "rcl{b}\t$dst", [], IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 420 | def RCL8mi : Ii8<0xC0, MRM2m, (outs), (ins i8mem:$dst, i8imm:$cnt), |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 421 | "rcl{b}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 422 | def RCL16m1 : I<0xD1, MRM2m, (outs), (ins i16mem:$dst), |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 423 | "rcl{w}\t$dst", [], IIC_SR>, OpSize; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 424 | def RCL16mi : Ii8<0xC1, MRM2m, (outs), (ins i16mem:$dst, i8imm:$cnt), |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 425 | "rcl{w}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>, OpSize; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 426 | def RCL32m1 : I<0xD1, MRM2m, (outs), (ins i32mem:$dst), |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 427 | "rcl{l}\t$dst", [], IIC_SR>, OpSize16; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 428 | def RCL32mi : Ii8<0xC1, MRM2m, (outs), (ins i32mem:$dst, i8imm:$cnt), |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 429 | "rcl{l}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>, OpSize16; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 430 | def RCL64m1 : RI<0xD1, MRM2m, (outs), (ins i64mem:$dst), |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 431 | "rcl{q}\t$dst", [], IIC_SR>; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 432 | def RCL64mi : RIi8<0xC1, MRM2m, (outs), (ins i64mem:$dst, i8imm:$cnt), |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 433 | "rcl{q}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 434 | |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 435 | def RCR8m1 : I<0xD0, MRM3m, (outs), (ins i8mem:$dst), |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 436 | "rcr{b}\t$dst", [], IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 437 | def RCR8mi : Ii8<0xC0, MRM3m, (outs), (ins i8mem:$dst, i8imm:$cnt), |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 438 | "rcr{b}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 439 | def RCR16m1 : I<0xD1, MRM3m, (outs), (ins i16mem:$dst), |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 440 | "rcr{w}\t$dst", [], IIC_SR>, OpSize; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 441 | def RCR16mi : Ii8<0xC1, MRM3m, (outs), (ins i16mem:$dst, i8imm:$cnt), |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 442 | "rcr{w}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>, OpSize; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 443 | def RCR32m1 : I<0xD1, MRM3m, (outs), (ins i32mem:$dst), |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 444 | "rcr{l}\t$dst", [], IIC_SR>, OpSize16; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 445 | def RCR32mi : Ii8<0xC1, MRM3m, (outs), (ins i32mem:$dst, i8imm:$cnt), |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 446 | "rcr{l}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>, OpSize16; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 447 | def RCR64m1 : RI<0xD1, MRM3m, (outs), (ins i64mem:$dst), |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 448 | "rcr{q}\t$dst", [], IIC_SR>; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 449 | def RCR64mi : RIi8<0xC1, MRM3m, (outs), (ins i64mem:$dst, i8imm:$cnt), |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 450 | "rcr{q}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 451 | |
| 452 | let Uses = [CL] in { |
| 453 | def RCL8mCL : I<0xD2, MRM2m, (outs), (ins i8mem:$dst), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 454 | "rcl{b}\t{%cl, $dst|$dst, cl}", [], IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 455 | def RCL16mCL : I<0xD3, MRM2m, (outs), (ins i16mem:$dst), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 456 | "rcl{w}\t{%cl, $dst|$dst, cl}", [], IIC_SR>, OpSize; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 457 | def RCL32mCL : I<0xD3, MRM2m, (outs), (ins i32mem:$dst), |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 458 | "rcl{l}\t{%cl, $dst|$dst, cl}", [], IIC_SR>, OpSize16; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 459 | def RCL64mCL : RI<0xD3, MRM2m, (outs), (ins i64mem:$dst), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 460 | "rcl{q}\t{%cl, $dst|$dst, cl}", [], IIC_SR>; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 461 | |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 462 | def RCR8mCL : I<0xD2, MRM3m, (outs), (ins i8mem:$dst), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 463 | "rcr{b}\t{%cl, $dst|$dst, cl}", [], IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 464 | def RCR16mCL : I<0xD3, MRM3m, (outs), (ins i16mem:$dst), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 465 | "rcr{w}\t{%cl, $dst|$dst, cl}", [], IIC_SR>, OpSize; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 466 | def RCR32mCL : I<0xD3, MRM3m, (outs), (ins i32mem:$dst), |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 467 | "rcr{l}\t{%cl, $dst|$dst, cl}", [], IIC_SR>, OpSize16; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 468 | def RCR64mCL : RI<0xD3, MRM3m, (outs), (ins i64mem:$dst), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 469 | "rcr{q}\t{%cl, $dst|$dst, cl}", [], IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 470 | } |
Jakob Stoklund Olesen | 7fde8c4 | 2013-03-25 23:07:32 +0000 | [diff] [blame] | 471 | } // SchedRW |
Craig Topper | 396cb79 | 2012-12-27 03:35:44 +0000 | [diff] [blame] | 472 | } // hasSideEffects = 0 |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 473 | |
Jakob Stoklund Olesen | 7fde8c4 | 2013-03-25 23:07:32 +0000 | [diff] [blame] | 474 | let Constraints = "$src1 = $dst", SchedRW = [WriteShift] in { |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 475 | // FIXME: provide shorter instructions when imm8 == 1 |
| 476 | let Uses = [CL] in { |
| 477 | def ROL8rCL : I<0xD2, MRM0r, (outs GR8 :$dst), (ins GR8 :$src1), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 478 | "rol{b}\t{%cl, $dst|$dst, cl}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 479 | [(set GR8:$dst, (rotl GR8:$src1, CL))], IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 480 | def ROL16rCL : I<0xD3, MRM0r, (outs GR16:$dst), (ins GR16:$src1), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 481 | "rol{w}\t{%cl, $dst|$dst, cl}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 482 | [(set GR16:$dst, (rotl GR16:$src1, CL))], IIC_SR>, OpSize; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 483 | def ROL32rCL : I<0xD3, MRM0r, (outs GR32:$dst), (ins GR32:$src1), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 484 | "rol{l}\t{%cl, $dst|$dst, cl}", |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 485 | [(set GR32:$dst, (rotl GR32:$src1, CL))], IIC_SR>, OpSize16; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 486 | def ROL64rCL : RI<0xD3, MRM0r, (outs GR64:$dst), (ins GR64:$src1), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 487 | "rol{q}\t{%cl, $dst|$dst, cl}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 488 | [(set GR64:$dst, (rotl GR64:$src1, CL))], IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 489 | } |
| 490 | |
| 491 | def ROL8ri : Ii8<0xC0, MRM0r, (outs GR8 :$dst), (ins GR8 :$src1, i8imm:$src2), |
| 492 | "rol{b}\t{$src2, $dst|$dst, $src2}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 493 | [(set GR8:$dst, (rotl GR8:$src1, (i8 imm:$src2)))], IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 494 | def ROL16ri : Ii8<0xC1, MRM0r, (outs GR16:$dst), (ins GR16:$src1, i8imm:$src2), |
| 495 | "rol{w}\t{$src2, $dst|$dst, $src2}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 496 | [(set GR16:$dst, (rotl GR16:$src1, (i8 imm:$src2)))], |
| 497 | IIC_SR>, |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 498 | OpSize; |
| 499 | def ROL32ri : Ii8<0xC1, MRM0r, (outs GR32:$dst), (ins GR32:$src1, i8imm:$src2), |
| 500 | "rol{l}\t{$src2, $dst|$dst, $src2}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 501 | [(set GR32:$dst, (rotl GR32:$src1, (i8 imm:$src2)))], |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 502 | IIC_SR>, OpSize16; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 503 | def ROL64ri : RIi8<0xC1, MRM0r, (outs GR64:$dst), |
| 504 | (ins GR64:$src1, i8imm:$src2), |
| 505 | "rol{q}\t{$src2, $dst|$dst, $src2}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 506 | [(set GR64:$dst, (rotl GR64:$src1, (i8 imm:$src2)))], |
| 507 | IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 508 | |
| 509 | // Rotate by 1 |
| 510 | def ROL8r1 : I<0xD0, MRM0r, (outs GR8 :$dst), (ins GR8 :$src1), |
| 511 | "rol{b}\t$dst", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 512 | [(set GR8:$dst, (rotl GR8:$src1, (i8 1)))], |
| 513 | IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 514 | def ROL16r1 : I<0xD1, MRM0r, (outs GR16:$dst), (ins GR16:$src1), |
| 515 | "rol{w}\t$dst", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 516 | [(set GR16:$dst, (rotl GR16:$src1, (i8 1)))], |
| 517 | IIC_SR>, OpSize; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 518 | def ROL32r1 : I<0xD1, MRM0r, (outs GR32:$dst), (ins GR32:$src1), |
| 519 | "rol{l}\t$dst", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 520 | [(set GR32:$dst, (rotl GR32:$src1, (i8 1)))], |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 521 | IIC_SR>, OpSize16; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 522 | def ROL64r1 : RI<0xD1, MRM0r, (outs GR64:$dst), (ins GR64:$src1), |
| 523 | "rol{q}\t$dst", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 524 | [(set GR64:$dst, (rotl GR64:$src1, (i8 1)))], |
| 525 | IIC_SR>; |
Jakob Stoklund Olesen | 7fde8c4 | 2013-03-25 23:07:32 +0000 | [diff] [blame] | 526 | } // Constraints = "$src = $dst", SchedRW |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 527 | |
Jakob Stoklund Olesen | 7fde8c4 | 2013-03-25 23:07:32 +0000 | [diff] [blame] | 528 | let SchedRW = [WriteShiftLd, WriteRMW] in { |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 529 | let Uses = [CL] in { |
| 530 | def ROL8mCL : I<0xD2, MRM0m, (outs), (ins i8mem :$dst), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 531 | "rol{b}\t{%cl, $dst|$dst, cl}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 532 | [(store (rotl (loadi8 addr:$dst), CL), addr:$dst)], |
| 533 | IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 534 | def ROL16mCL : I<0xD3, MRM0m, (outs), (ins i16mem:$dst), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 535 | "rol{w}\t{%cl, $dst|$dst, cl}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 536 | [(store (rotl (loadi16 addr:$dst), CL), addr:$dst)], |
| 537 | IIC_SR>, OpSize; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 538 | def ROL32mCL : I<0xD3, MRM0m, (outs), (ins i32mem:$dst), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 539 | "rol{l}\t{%cl, $dst|$dst, cl}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 540 | [(store (rotl (loadi32 addr:$dst), CL), addr:$dst)], |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 541 | IIC_SR>, OpSize16; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 542 | def ROL64mCL : RI<0xD3, MRM0m, (outs), (ins i64mem:$dst), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 543 | "rol{q}\t{%cl, $dst|$dst, cl}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 544 | [(store (rotl (loadi64 addr:$dst), CL), addr:$dst)], |
| 545 | IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 546 | } |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 547 | def ROL8mi : Ii8<0xC0, MRM0m, (outs), (ins i8mem :$dst, i8imm:$src1), |
| 548 | "rol{b}\t{$src1, $dst|$dst, $src1}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 549 | [(store (rotl (loadi8 addr:$dst), (i8 imm:$src1)), addr:$dst)], |
| 550 | IIC_SR>; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 551 | def ROL16mi : Ii8<0xC1, MRM0m, (outs), (ins i16mem:$dst, i8imm:$src1), |
| 552 | "rol{w}\t{$src1, $dst|$dst, $src1}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 553 | [(store (rotl (loadi16 addr:$dst), (i8 imm:$src1)), addr:$dst)], |
| 554 | IIC_SR>, |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 555 | OpSize; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 556 | def ROL32mi : Ii8<0xC1, MRM0m, (outs), (ins i32mem:$dst, i8imm:$src1), |
| 557 | "rol{l}\t{$src1, $dst|$dst, $src1}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 558 | [(store (rotl (loadi32 addr:$dst), (i8 imm:$src1)), addr:$dst)], |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 559 | IIC_SR>, OpSize16; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 560 | def ROL64mi : RIi8<0xC1, MRM0m, (outs), (ins i64mem:$dst, i8imm:$src1), |
| 561 | "rol{q}\t{$src1, $dst|$dst, $src1}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 562 | [(store (rotl (loadi64 addr:$dst), (i8 imm:$src1)), addr:$dst)], |
| 563 | IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 564 | |
| 565 | // Rotate by 1 |
| 566 | def ROL8m1 : I<0xD0, MRM0m, (outs), (ins i8mem :$dst), |
| 567 | "rol{b}\t$dst", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 568 | [(store (rotl (loadi8 addr:$dst), (i8 1)), addr:$dst)], |
| 569 | IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 570 | def ROL16m1 : I<0xD1, MRM0m, (outs), (ins i16mem:$dst), |
| 571 | "rol{w}\t$dst", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 572 | [(store (rotl (loadi16 addr:$dst), (i8 1)), addr:$dst)], |
| 573 | IIC_SR>, |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 574 | OpSize; |
| 575 | def ROL32m1 : I<0xD1, MRM0m, (outs), (ins i32mem:$dst), |
| 576 | "rol{l}\t$dst", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 577 | [(store (rotl (loadi32 addr:$dst), (i8 1)), addr:$dst)], |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 578 | IIC_SR>, OpSize16; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 579 | def ROL64m1 : RI<0xD1, MRM0m, (outs), (ins i64mem:$dst), |
| 580 | "rol{q}\t$dst", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 581 | [(store (rotl (loadi64 addr:$dst), (i8 1)), addr:$dst)], |
| 582 | IIC_SR>; |
Jakob Stoklund Olesen | 7fde8c4 | 2013-03-25 23:07:32 +0000 | [diff] [blame] | 583 | } // SchedRW |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 584 | |
Jakob Stoklund Olesen | 7fde8c4 | 2013-03-25 23:07:32 +0000 | [diff] [blame] | 585 | let Constraints = "$src1 = $dst", SchedRW = [WriteShift] in { |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 586 | let Uses = [CL] in { |
| 587 | def ROR8rCL : I<0xD2, MRM1r, (outs GR8 :$dst), (ins GR8 :$src1), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 588 | "ror{b}\t{%cl, $dst|$dst, cl}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 589 | [(set GR8:$dst, (rotr GR8:$src1, CL))], IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 590 | def ROR16rCL : I<0xD3, MRM1r, (outs GR16:$dst), (ins GR16:$src1), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 591 | "ror{w}\t{%cl, $dst|$dst, cl}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 592 | [(set GR16:$dst, (rotr GR16:$src1, CL))], IIC_SR>, OpSize; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 593 | def ROR32rCL : I<0xD3, MRM1r, (outs GR32:$dst), (ins GR32:$src1), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 594 | "ror{l}\t{%cl, $dst|$dst, cl}", |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 595 | [(set GR32:$dst, (rotr GR32:$src1, CL))], IIC_SR>, OpSize16; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 596 | def ROR64rCL : RI<0xD3, MRM1r, (outs GR64:$dst), (ins GR64:$src1), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 597 | "ror{q}\t{%cl, $dst|$dst, cl}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 598 | [(set GR64:$dst, (rotr GR64:$src1, CL))], IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 599 | } |
| 600 | |
| 601 | def ROR8ri : Ii8<0xC0, MRM1r, (outs GR8 :$dst), (ins GR8 :$src1, i8imm:$src2), |
| 602 | "ror{b}\t{$src2, $dst|$dst, $src2}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 603 | [(set GR8:$dst, (rotr GR8:$src1, (i8 imm:$src2)))], IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 604 | def ROR16ri : Ii8<0xC1, MRM1r, (outs GR16:$dst), (ins GR16:$src1, i8imm:$src2), |
| 605 | "ror{w}\t{$src2, $dst|$dst, $src2}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 606 | [(set GR16:$dst, (rotr GR16:$src1, (i8 imm:$src2)))], |
| 607 | IIC_SR>, |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 608 | OpSize; |
| 609 | def ROR32ri : Ii8<0xC1, MRM1r, (outs GR32:$dst), (ins GR32:$src1, i8imm:$src2), |
| 610 | "ror{l}\t{$src2, $dst|$dst, $src2}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 611 | [(set GR32:$dst, (rotr GR32:$src1, (i8 imm:$src2)))], |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 612 | IIC_SR>, OpSize16; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 613 | def ROR64ri : RIi8<0xC1, MRM1r, (outs GR64:$dst), |
| 614 | (ins GR64:$src1, i8imm:$src2), |
| 615 | "ror{q}\t{$src2, $dst|$dst, $src2}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 616 | [(set GR64:$dst, (rotr GR64:$src1, (i8 imm:$src2)))], |
| 617 | IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 618 | |
| 619 | // Rotate by 1 |
| 620 | def ROR8r1 : I<0xD0, MRM1r, (outs GR8 :$dst), (ins GR8 :$src1), |
| 621 | "ror{b}\t$dst", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 622 | [(set GR8:$dst, (rotr GR8:$src1, (i8 1)))], |
| 623 | IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 624 | def ROR16r1 : I<0xD1, MRM1r, (outs GR16:$dst), (ins GR16:$src1), |
| 625 | "ror{w}\t$dst", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 626 | [(set GR16:$dst, (rotr GR16:$src1, (i8 1)))], |
| 627 | IIC_SR>, OpSize; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 628 | def ROR32r1 : I<0xD1, MRM1r, (outs GR32:$dst), (ins GR32:$src1), |
| 629 | "ror{l}\t$dst", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 630 | [(set GR32:$dst, (rotr GR32:$src1, (i8 1)))], |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 631 | IIC_SR>, OpSize16; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 632 | def ROR64r1 : RI<0xD1, MRM1r, (outs GR64:$dst), (ins GR64:$src1), |
| 633 | "ror{q}\t$dst", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 634 | [(set GR64:$dst, (rotr GR64:$src1, (i8 1)))], |
| 635 | IIC_SR>; |
Jakob Stoklund Olesen | 7fde8c4 | 2013-03-25 23:07:32 +0000 | [diff] [blame] | 636 | } // Constraints = "$src = $dst", SchedRW |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 637 | |
Jakob Stoklund Olesen | 7fde8c4 | 2013-03-25 23:07:32 +0000 | [diff] [blame] | 638 | let SchedRW = [WriteShiftLd, WriteRMW] in { |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 639 | let Uses = [CL] in { |
| 640 | def ROR8mCL : I<0xD2, MRM1m, (outs), (ins i8mem :$dst), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 641 | "ror{b}\t{%cl, $dst|$dst, cl}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 642 | [(store (rotr (loadi8 addr:$dst), CL), addr:$dst)], |
| 643 | IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 644 | def ROR16mCL : I<0xD3, MRM1m, (outs), (ins i16mem:$dst), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 645 | "ror{w}\t{%cl, $dst|$dst, cl}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 646 | [(store (rotr (loadi16 addr:$dst), CL), addr:$dst)], |
| 647 | IIC_SR>, OpSize; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 648 | def ROR32mCL : I<0xD3, MRM1m, (outs), (ins i32mem:$dst), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 649 | "ror{l}\t{%cl, $dst|$dst, cl}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 650 | [(store (rotr (loadi32 addr:$dst), CL), addr:$dst)], |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 651 | IIC_SR>, OpSize16; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 652 | def ROR64mCL : RI<0xD3, MRM1m, (outs), (ins i64mem:$dst), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 653 | "ror{q}\t{%cl, $dst|$dst, cl}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 654 | [(store (rotr (loadi64 addr:$dst), CL), addr:$dst)], |
| 655 | IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 656 | } |
| 657 | def ROR8mi : Ii8<0xC0, MRM1m, (outs), (ins i8mem :$dst, i8imm:$src), |
| 658 | "ror{b}\t{$src, $dst|$dst, $src}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 659 | [(store (rotr (loadi8 addr:$dst), (i8 imm:$src)), addr:$dst)], |
| 660 | IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 661 | def ROR16mi : Ii8<0xC1, MRM1m, (outs), (ins i16mem:$dst, i8imm:$src), |
| 662 | "ror{w}\t{$src, $dst|$dst, $src}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 663 | [(store (rotr (loadi16 addr:$dst), (i8 imm:$src)), addr:$dst)], |
| 664 | IIC_SR>, |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 665 | OpSize; |
| 666 | def ROR32mi : Ii8<0xC1, MRM1m, (outs), (ins i32mem:$dst, i8imm:$src), |
| 667 | "ror{l}\t{$src, $dst|$dst, $src}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 668 | [(store (rotr (loadi32 addr:$dst), (i8 imm:$src)), addr:$dst)], |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 669 | IIC_SR>, OpSize16; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 670 | def ROR64mi : RIi8<0xC1, MRM1m, (outs), (ins i64mem:$dst, i8imm:$src), |
| 671 | "ror{q}\t{$src, $dst|$dst, $src}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 672 | [(store (rotr (loadi64 addr:$dst), (i8 imm:$src)), addr:$dst)], |
| 673 | IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 674 | |
| 675 | // Rotate by 1 |
| 676 | def ROR8m1 : I<0xD0, MRM1m, (outs), (ins i8mem :$dst), |
| 677 | "ror{b}\t$dst", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 678 | [(store (rotr (loadi8 addr:$dst), (i8 1)), addr:$dst)], |
| 679 | IIC_SR>; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 680 | def ROR16m1 : I<0xD1, MRM1m, (outs), (ins i16mem:$dst), |
| 681 | "ror{w}\t$dst", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 682 | [(store (rotr (loadi16 addr:$dst), (i8 1)), addr:$dst)], |
| 683 | IIC_SR>, |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 684 | OpSize; |
| 685 | def ROR32m1 : I<0xD1, MRM1m, (outs), (ins i32mem:$dst), |
| 686 | "ror{l}\t$dst", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 687 | [(store (rotr (loadi32 addr:$dst), (i8 1)), addr:$dst)], |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 688 | IIC_SR>, OpSize16; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 689 | def ROR64m1 : RI<0xD1, MRM1m, (outs), (ins i64mem:$dst), |
| 690 | "ror{q}\t$dst", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 691 | [(store (rotr (loadi64 addr:$dst), (i8 1)), addr:$dst)], |
| 692 | IIC_SR>; |
Jakob Stoklund Olesen | 7fde8c4 | 2013-03-25 23:07:32 +0000 | [diff] [blame] | 693 | } // SchedRW |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 694 | |
| 695 | |
| 696 | //===----------------------------------------------------------------------===// |
| 697 | // Double shift instructions (generalizations of rotate) |
| 698 | //===----------------------------------------------------------------------===// |
| 699 | |
Jakob Stoklund Olesen | 7fde8c4 | 2013-03-25 23:07:32 +0000 | [diff] [blame] | 700 | let Constraints = "$src1 = $dst", SchedRW = [WriteShift] in { |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 701 | |
| 702 | let Uses = [CL] in { |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 703 | def SHLD16rrCL : I<0xA5, MRMDestReg, (outs GR16:$dst), |
| 704 | (ins GR16:$src1, GR16:$src2), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 705 | "shld{w}\t{%cl, $src2, $dst|$dst, $src2, cl}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 706 | [(set GR16:$dst, (X86shld GR16:$src1, GR16:$src2, CL))], |
| 707 | IIC_SHD16_REG_CL>, |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 708 | TB, OpSize; |
| 709 | def SHRD16rrCL : I<0xAD, MRMDestReg, (outs GR16:$dst), |
| 710 | (ins GR16:$src1, GR16:$src2), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 711 | "shrd{w}\t{%cl, $src2, $dst|$dst, $src2, cl}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 712 | [(set GR16:$dst, (X86shrd GR16:$src1, GR16:$src2, CL))], |
| 713 | IIC_SHD16_REG_CL>, |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 714 | TB, OpSize; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 715 | def SHLD32rrCL : I<0xA5, MRMDestReg, (outs GR32:$dst), |
| 716 | (ins GR32:$src1, GR32:$src2), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 717 | "shld{l}\t{%cl, $src2, $dst|$dst, $src2, cl}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 718 | [(set GR32:$dst, (X86shld GR32:$src1, GR32:$src2, CL))], |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 719 | IIC_SHD32_REG_CL>, TB, OpSize16; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 720 | def SHRD32rrCL : I<0xAD, MRMDestReg, (outs GR32:$dst), |
| 721 | (ins GR32:$src1, GR32:$src2), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 722 | "shrd{l}\t{%cl, $src2, $dst|$dst, $src2, cl}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 723 | [(set GR32:$dst, (X86shrd GR32:$src1, GR32:$src2, CL))], |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 724 | IIC_SHD32_REG_CL>, TB, OpSize16; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 725 | def SHLD64rrCL : RI<0xA5, MRMDestReg, (outs GR64:$dst), |
| 726 | (ins GR64:$src1, GR64:$src2), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 727 | "shld{q}\t{%cl, $src2, $dst|$dst, $src2, cl}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 728 | [(set GR64:$dst, (X86shld GR64:$src1, GR64:$src2, CL))], |
| 729 | IIC_SHD64_REG_CL>, |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 730 | TB; |
| 731 | def SHRD64rrCL : RI<0xAD, MRMDestReg, (outs GR64:$dst), |
| 732 | (ins GR64:$src1, GR64:$src2), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 733 | "shrd{q}\t{%cl, $src2, $dst|$dst, $src2, cl}", |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 734 | [(set GR64:$dst, (X86shrd GR64:$src1, GR64:$src2, CL))], |
| 735 | IIC_SHD64_REG_CL>, |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 736 | TB; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 737 | } |
| 738 | |
| 739 | let isCommutable = 1 in { // These instructions commute to each other. |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 740 | def SHLD16rri8 : Ii8<0xA4, MRMDestReg, |
| 741 | (outs GR16:$dst), |
| 742 | (ins GR16:$src1, GR16:$src2, i8imm:$src3), |
| 743 | "shld{w}\t{$src3, $src2, $dst|$dst, $src2, $src3}", |
| 744 | [(set GR16:$dst, (X86shld GR16:$src1, GR16:$src2, |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 745 | (i8 imm:$src3)))], IIC_SHD16_REG_IM>, |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 746 | TB, OpSize; |
| 747 | def SHRD16rri8 : Ii8<0xAC, MRMDestReg, |
| 748 | (outs GR16:$dst), |
| 749 | (ins GR16:$src1, GR16:$src2, i8imm:$src3), |
| 750 | "shrd{w}\t{$src3, $src2, $dst|$dst, $src2, $src3}", |
| 751 | [(set GR16:$dst, (X86shrd GR16:$src1, GR16:$src2, |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 752 | (i8 imm:$src3)))], IIC_SHD16_REG_IM>, |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 753 | TB, OpSize; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 754 | def SHLD32rri8 : Ii8<0xA4, MRMDestReg, |
| 755 | (outs GR32:$dst), |
| 756 | (ins GR32:$src1, GR32:$src2, i8imm:$src3), |
| 757 | "shld{l}\t{$src3, $src2, $dst|$dst, $src2, $src3}", |
| 758 | [(set GR32:$dst, (X86shld GR32:$src1, GR32:$src2, |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 759 | (i8 imm:$src3)))], IIC_SHD32_REG_IM>, |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 760 | TB, OpSize16; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 761 | def SHRD32rri8 : Ii8<0xAC, MRMDestReg, |
| 762 | (outs GR32:$dst), |
| 763 | (ins GR32:$src1, GR32:$src2, i8imm:$src3), |
| 764 | "shrd{l}\t{$src3, $src2, $dst|$dst, $src2, $src3}", |
| 765 | [(set GR32:$dst, (X86shrd GR32:$src1, GR32:$src2, |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 766 | (i8 imm:$src3)))], IIC_SHD32_REG_IM>, |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 767 | TB, OpSize16; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 768 | def SHLD64rri8 : RIi8<0xA4, MRMDestReg, |
| 769 | (outs GR64:$dst), |
| 770 | (ins GR64:$src1, GR64:$src2, i8imm:$src3), |
| 771 | "shld{q}\t{$src3, $src2, $dst|$dst, $src2, $src3}", |
| 772 | [(set GR64:$dst, (X86shld GR64:$src1, GR64:$src2, |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 773 | (i8 imm:$src3)))], IIC_SHD64_REG_IM>, |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 774 | TB; |
| 775 | def SHRD64rri8 : RIi8<0xAC, MRMDestReg, |
| 776 | (outs GR64:$dst), |
| 777 | (ins GR64:$src1, GR64:$src2, i8imm:$src3), |
| 778 | "shrd{q}\t{$src3, $src2, $dst|$dst, $src2, $src3}", |
| 779 | [(set GR64:$dst, (X86shrd GR64:$src1, GR64:$src2, |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 780 | (i8 imm:$src3)))], IIC_SHD64_REG_IM>, |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 781 | TB; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 782 | } |
Jakob Stoklund Olesen | 7fde8c4 | 2013-03-25 23:07:32 +0000 | [diff] [blame] | 783 | } // Constraints = "$src = $dst", SchedRW |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 784 | |
Jakob Stoklund Olesen | 7fde8c4 | 2013-03-25 23:07:32 +0000 | [diff] [blame] | 785 | let SchedRW = [WriteShiftLd, WriteRMW] in { |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 786 | let Uses = [CL] in { |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 787 | def SHLD16mrCL : I<0xA5, MRMDestMem, (outs), (ins i16mem:$dst, GR16:$src2), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 788 | "shld{w}\t{%cl, $src2, $dst|$dst, $src2, cl}", |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 789 | [(store (X86shld (loadi16 addr:$dst), GR16:$src2, CL), |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 790 | addr:$dst)], IIC_SHD16_MEM_CL>, TB, OpSize; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 791 | def SHRD16mrCL : I<0xAD, MRMDestMem, (outs), (ins i16mem:$dst, GR16:$src2), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 792 | "shrd{w}\t{%cl, $src2, $dst|$dst, $src2, cl}", |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 793 | [(store (X86shrd (loadi16 addr:$dst), GR16:$src2, CL), |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 794 | addr:$dst)], IIC_SHD16_MEM_CL>, TB, OpSize; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 795 | |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 796 | def SHLD32mrCL : I<0xA5, MRMDestMem, (outs), (ins i32mem:$dst, GR32:$src2), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 797 | "shld{l}\t{%cl, $src2, $dst|$dst, $src2, cl}", |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 798 | [(store (X86shld (loadi32 addr:$dst), GR32:$src2, CL), |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 799 | addr:$dst)], IIC_SHD32_MEM_CL>, TB, OpSize16; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 800 | def SHRD32mrCL : I<0xAD, MRMDestMem, (outs), (ins i32mem:$dst, GR32:$src2), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 801 | "shrd{l}\t{%cl, $src2, $dst|$dst, $src2, cl}", |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 802 | [(store (X86shrd (loadi32 addr:$dst), GR32:$src2, CL), |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 803 | addr:$dst)], IIC_SHD32_MEM_CL>, TB, OpSize16; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 804 | |
| 805 | def SHLD64mrCL : RI<0xA5, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src2), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 806 | "shld{q}\t{%cl, $src2, $dst|$dst, $src2, cl}", |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 807 | [(store (X86shld (loadi64 addr:$dst), GR64:$src2, CL), |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 808 | addr:$dst)], IIC_SHD64_MEM_CL>, TB; |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 809 | def SHRD64mrCL : RI<0xAD, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src2), |
Craig Topper | efd67d4 | 2013-07-31 02:47:52 +0000 | [diff] [blame] | 810 | "shrd{q}\t{%cl, $src2, $dst|$dst, $src2, cl}", |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 811 | [(store (X86shrd (loadi64 addr:$dst), GR64:$src2, CL), |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 812 | addr:$dst)], IIC_SHD64_MEM_CL>, TB; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 813 | } |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 814 | |
| 815 | def SHLD16mri8 : Ii8<0xA4, MRMDestMem, |
| 816 | (outs), (ins i16mem:$dst, GR16:$src2, i8imm:$src3), |
| 817 | "shld{w}\t{$src3, $src2, $dst|$dst, $src2, $src3}", |
| 818 | [(store (X86shld (loadi16 addr:$dst), GR16:$src2, |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 819 | (i8 imm:$src3)), addr:$dst)], |
| 820 | IIC_SHD16_MEM_IM>, |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 821 | TB, OpSize; |
| 822 | def SHRD16mri8 : Ii8<0xAC, MRMDestMem, |
| 823 | (outs), (ins i16mem:$dst, GR16:$src2, i8imm:$src3), |
| 824 | "shrd{w}\t{$src3, $src2, $dst|$dst, $src2, $src3}", |
| 825 | [(store (X86shrd (loadi16 addr:$dst), GR16:$src2, |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 826 | (i8 imm:$src3)), addr:$dst)], |
| 827 | IIC_SHD16_MEM_IM>, |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 828 | TB, OpSize; |
| 829 | |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 830 | def SHLD32mri8 : Ii8<0xA4, MRMDestMem, |
| 831 | (outs), (ins i32mem:$dst, GR32:$src2, i8imm:$src3), |
| 832 | "shld{l}\t{$src3, $src2, $dst|$dst, $src2, $src3}", |
| 833 | [(store (X86shld (loadi32 addr:$dst), GR32:$src2, |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 834 | (i8 imm:$src3)), addr:$dst)], |
| 835 | IIC_SHD32_MEM_IM>, |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 836 | TB, OpSize16; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 837 | def SHRD32mri8 : Ii8<0xAC, MRMDestMem, |
| 838 | (outs), (ins i32mem:$dst, GR32:$src2, i8imm:$src3), |
| 839 | "shrd{l}\t{$src3, $src2, $dst|$dst, $src2, $src3}", |
| 840 | [(store (X86shrd (loadi32 addr:$dst), GR32:$src2, |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 841 | (i8 imm:$src3)), addr:$dst)], |
| 842 | IIC_SHD32_MEM_IM>, |
David Woodhouse | 956965c | 2014-01-08 12:57:40 +0000 | [diff] [blame] | 843 | TB, OpSize16; |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 844 | |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 845 | def SHLD64mri8 : RIi8<0xA4, MRMDestMem, |
| 846 | (outs), (ins i64mem:$dst, GR64:$src2, i8imm:$src3), |
| 847 | "shld{q}\t{$src3, $src2, $dst|$dst, $src2, $src3}", |
| 848 | [(store (X86shld (loadi64 addr:$dst), GR64:$src2, |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 849 | (i8 imm:$src3)), addr:$dst)], |
| 850 | IIC_SHD64_MEM_IM>, |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 851 | TB; |
| 852 | def SHRD64mri8 : RIi8<0xAC, MRMDestMem, |
| 853 | (outs), (ins i64mem:$dst, GR64:$src2, i8imm:$src3), |
| 854 | "shrd{q}\t{$src3, $src2, $dst|$dst, $src2, $src3}", |
| 855 | [(store (X86shrd (loadi64 addr:$dst), GR64:$src2, |
Andrew Trick | 8523b16 | 2012-02-01 23:20:51 +0000 | [diff] [blame] | 856 | (i8 imm:$src3)), addr:$dst)], |
| 857 | IIC_SHD64_MEM_IM>, |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 858 | TB; |
Jakob Stoklund Olesen | 7fde8c4 | 2013-03-25 23:07:32 +0000 | [diff] [blame] | 859 | } // SchedRW |
Chris Lattner | 1818dd5 | 2010-10-05 07:13:35 +0000 | [diff] [blame] | 860 | |
Chris Lattner | 1b3aa86 | 2010-10-05 07:00:12 +0000 | [diff] [blame] | 861 | } // Defs = [EFLAGS] |
| 862 | |
Michael Liao | 2de86af | 2012-09-26 08:24:51 +0000 | [diff] [blame] | 863 | def ROT32L2R_imm8 : SDNodeXForm<imm, [{ |
| 864 | // Convert a ROTL shamt to a ROTR shamt on 32-bit integer. |
| 865 | return getI8Imm(32 - N->getZExtValue()); |
| 866 | }]>; |
| 867 | |
| 868 | def ROT64L2R_imm8 : SDNodeXForm<imm, [{ |
| 869 | // Convert a ROTL shamt to a ROTR shamt on 64-bit integer. |
| 870 | return getI8Imm(64 - N->getZExtValue()); |
| 871 | }]>; |
| 872 | |
Craig Topper | b05d9e9 | 2011-10-23 22:18:24 +0000 | [diff] [blame] | 873 | multiclass bmi_rotate<string asm, RegisterClass RC, X86MemOperand x86memop> { |
| 874 | let neverHasSideEffects = 1 in { |
| 875 | def ri : Ii8<0xF0, MRMSrcReg, (outs RC:$dst), (ins RC:$src1, i8imm:$src2), |
| 876 | !strconcat(asm, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"), |
Jakob Stoklund Olesen | 7fde8c4 | 2013-03-25 23:07:32 +0000 | [diff] [blame] | 877 | []>, TAXD, VEX, Sched<[WriteShift]>; |
Craig Topper | 980d598 | 2011-10-23 07:34:00 +0000 | [diff] [blame] | 878 | let mayLoad = 1 in |
Craig Topper | b05d9e9 | 2011-10-23 22:18:24 +0000 | [diff] [blame] | 879 | def mi : Ii8<0xF0, MRMSrcMem, (outs RC:$dst), |
| 880 | (ins x86memop:$src1, i8imm:$src2), |
| 881 | !strconcat(asm, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"), |
Jakob Stoklund Olesen | 7fde8c4 | 2013-03-25 23:07:32 +0000 | [diff] [blame] | 882 | []>, TAXD, VEX, Sched<[WriteShiftLd]>; |
Craig Topper | b05d9e9 | 2011-10-23 22:18:24 +0000 | [diff] [blame] | 883 | } |
| 884 | } |
Craig Topper | 980d598 | 2011-10-23 07:34:00 +0000 | [diff] [blame] | 885 | |
Craig Topper | b05d9e9 | 2011-10-23 22:18:24 +0000 | [diff] [blame] | 886 | multiclass bmi_shift<string asm, RegisterClass RC, X86MemOperand x86memop> { |
| 887 | let neverHasSideEffects = 1 in { |
| 888 | def rr : I<0xF7, MRMSrcReg, (outs RC:$dst), (ins RC:$src1, RC:$src2), |
| 889 | !strconcat(asm, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"), []>, |
Jakob Stoklund Olesen | 7fde8c4 | 2013-03-25 23:07:32 +0000 | [diff] [blame] | 890 | VEX_4VOp3, Sched<[WriteShift]>; |
Craig Topper | 980d598 | 2011-10-23 07:34:00 +0000 | [diff] [blame] | 891 | let mayLoad = 1 in |
Craig Topper | b05d9e9 | 2011-10-23 22:18:24 +0000 | [diff] [blame] | 892 | def rm : I<0xF7, MRMSrcMem, (outs RC:$dst), (ins x86memop:$src1, RC:$src2), |
| 893 | !strconcat(asm, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"), []>, |
Jakob Stoklund Olesen | 7fde8c4 | 2013-03-25 23:07:32 +0000 | [diff] [blame] | 894 | VEX_4VOp3, |
| 895 | Sched<[WriteShiftLd, |
| 896 | // x86memop:$src1 |
| 897 | ReadDefault, ReadDefault, ReadDefault, ReadDefault, |
| 898 | ReadDefault, |
| 899 | // RC:$src1 |
| 900 | ReadAfterLd]>; |
Craig Topper | b05d9e9 | 2011-10-23 22:18:24 +0000 | [diff] [blame] | 901 | } |
| 902 | } |
| 903 | |
| 904 | let Predicates = [HasBMI2] in { |
| 905 | defm RORX32 : bmi_rotate<"rorx{l}", GR32, i32mem>; |
| 906 | defm RORX64 : bmi_rotate<"rorx{q}", GR64, i64mem>, VEX_W; |
| 907 | defm SARX32 : bmi_shift<"sarx{l}", GR32, i32mem>, T8XS; |
| 908 | defm SARX64 : bmi_shift<"sarx{q}", GR64, i64mem>, T8XS, VEX_W; |
| 909 | defm SHRX32 : bmi_shift<"shrx{l}", GR32, i32mem>, T8XD; |
| 910 | defm SHRX64 : bmi_shift<"shrx{q}", GR64, i64mem>, T8XD, VEX_W; |
Craig Topper | ae11aed | 2014-01-14 07:41:20 +0000 | [diff] [blame] | 911 | defm SHLX32 : bmi_shift<"shlx{l}", GR32, i32mem>, T8PD; |
| 912 | defm SHLX64 : bmi_shift<"shlx{q}", GR64, i64mem>, T8PD, VEX_W; |
Michael Liao | 2de86af | 2012-09-26 08:24:51 +0000 | [diff] [blame] | 913 | |
| 914 | // Prefer RORX which is non-destructive and doesn't update EFLAGS. |
| 915 | let AddedComplexity = 10 in { |
| 916 | def : Pat<(rotl GR32:$src, (i8 imm:$shamt)), |
| 917 | (RORX32ri GR32:$src, (ROT32L2R_imm8 imm:$shamt))>; |
| 918 | def : Pat<(rotl GR64:$src, (i8 imm:$shamt)), |
| 919 | (RORX64ri GR64:$src, (ROT64L2R_imm8 imm:$shamt))>; |
| 920 | } |
| 921 | |
| 922 | def : Pat<(rotl (loadi32 addr:$src), (i8 imm:$shamt)), |
| 923 | (RORX32mi addr:$src, (ROT32L2R_imm8 imm:$shamt))>; |
| 924 | def : Pat<(rotl (loadi64 addr:$src), (i8 imm:$shamt)), |
| 925 | (RORX64mi addr:$src, (ROT64L2R_imm8 imm:$shamt))>; |
Michael Liao | 2b425e1 | 2012-09-26 08:26:25 +0000 | [diff] [blame] | 926 | |
| 927 | // Prefer SARX/SHRX/SHLX over SAR/SHR/SHL with variable shift BUT not |
| 928 | // immedidate shift, i.e. the following code is considered better |
| 929 | // |
| 930 | // mov %edi, %esi |
| 931 | // shl $imm, %esi |
| 932 | // ... %edi, ... |
| 933 | // |
| 934 | // than |
| 935 | // |
| 936 | // movb $imm, %sil |
| 937 | // shlx %sil, %edi, %esi |
| 938 | // ... %edi, ... |
| 939 | // |
| 940 | let AddedComplexity = 1 in { |
| 941 | def : Pat<(sra GR32:$src1, GR8:$src2), |
| 942 | (SARX32rr GR32:$src1, |
| 943 | (INSERT_SUBREG |
| 944 | (i32 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>; |
| 945 | def : Pat<(sra GR64:$src1, GR8:$src2), |
| 946 | (SARX64rr GR64:$src1, |
| 947 | (INSERT_SUBREG |
| 948 | (i64 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>; |
| 949 | |
| 950 | def : Pat<(srl GR32:$src1, GR8:$src2), |
| 951 | (SHRX32rr GR32:$src1, |
| 952 | (INSERT_SUBREG |
| 953 | (i32 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>; |
| 954 | def : Pat<(srl GR64:$src1, GR8:$src2), |
| 955 | (SHRX64rr GR64:$src1, |
| 956 | (INSERT_SUBREG |
| 957 | (i64 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>; |
| 958 | |
| 959 | def : Pat<(shl GR32:$src1, GR8:$src2), |
| 960 | (SHLX32rr GR32:$src1, |
| 961 | (INSERT_SUBREG |
| 962 | (i32 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>; |
| 963 | def : Pat<(shl GR64:$src1, GR8:$src2), |
| 964 | (SHLX64rr GR64:$src1, |
| 965 | (INSERT_SUBREG |
| 966 | (i64 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>; |
| 967 | } |
| 968 | |
| 969 | // Patterns on SARXrm/SHRXrm/SHLXrm are explicitly omitted to favor |
| 970 | // |
| 971 | // mov (%ecx), %esi |
| 972 | // shl $imm, $esi |
| 973 | // |
| 974 | // over |
| 975 | // |
| 976 | // movb $imm %al |
| 977 | // shlx %al, (%ecx), %esi |
| 978 | // |
| 979 | // As SARXrr/SHRXrr/SHLXrr is favored on variable shift, the peephole |
| 980 | // optimization will fold them into SARXrm/SHRXrm/SHLXrm if possible. |
Craig Topper | 980d598 | 2011-10-23 07:34:00 +0000 | [diff] [blame] | 981 | } |