blob: 5b6298b541bccae2985755180fcc2002815c1ad3 [file] [log] [blame]
Jia Liub22310f2012-02-18 12:03:15 +00001//===-- X86InstrShiftRotate.td - Shift and Rotate Instrs ---*- tablegen -*-===//
2//
Chris Lattner1b3aa862010-10-05 07:00:12 +00003// 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 Liub22310f2012-02-18 12:03:15 +00007//
Chris Lattner1b3aa862010-10-05 07:00:12 +00008//===----------------------------------------------------------------------===//
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
16let Defs = [EFLAGS] in {
17
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +000018let Constraints = "$src1 = $dst", SchedRW = [WriteShift] in {
Chris Lattner1b3aa862010-10-05 07:00:12 +000019let Uses = [CL] in {
20def SHL8rCL : I<0xD2, MRM4r, (outs GR8 :$dst), (ins GR8 :$src1),
21 "shl{b}\t{%cl, $dst|$dst, CL}",
Andrew Trick8523b162012-02-01 23:20:51 +000022 [(set GR8:$dst, (shl GR8:$src1, CL))], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +000023def SHL16rCL : I<0xD3, MRM4r, (outs GR16:$dst), (ins GR16:$src1),
24 "shl{w}\t{%cl, $dst|$dst, CL}",
Andrew Trick8523b162012-02-01 23:20:51 +000025 [(set GR16:$dst, (shl GR16:$src1, CL))], IIC_SR>, OpSize;
Chris Lattner1b3aa862010-10-05 07:00:12 +000026def SHL32rCL : I<0xD3, MRM4r, (outs GR32:$dst), (ins GR32:$src1),
27 "shl{l}\t{%cl, $dst|$dst, CL}",
Andrew Trick8523b162012-02-01 23:20:51 +000028 [(set GR32:$dst, (shl GR32:$src1, CL))], IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +000029def SHL64rCL : RI<0xD3, MRM4r, (outs GR64:$dst), (ins GR64:$src1),
Devang Patelc1215322012-01-03 18:22:10 +000030 "shl{q}\t{%cl, $dst|$dst, CL}",
Andrew Trick8523b162012-02-01 23:20:51 +000031 [(set GR64:$dst, (shl GR64:$src1, CL))], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +000032} // Uses = [CL]
33
34def SHL8ri : Ii8<0xC0, MRM4r, (outs GR8 :$dst), (ins GR8 :$src1, i8imm:$src2),
35 "shl{b}\t{$src2, $dst|$dst, $src2}",
Andrew Trick8523b162012-02-01 23:20:51 +000036 [(set GR8:$dst, (shl GR8:$src1, (i8 imm:$src2)))], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +000037
38let isConvertibleToThreeAddress = 1 in { // Can transform into LEA.
39def SHL16ri : Ii8<0xC1, MRM4r, (outs GR16:$dst), (ins GR16:$src1, i8imm:$src2),
40 "shl{w}\t{$src2, $dst|$dst, $src2}",
Andrew Trick8523b162012-02-01 23:20:51 +000041 [(set GR16:$dst, (shl GR16:$src1, (i8 imm:$src2)))], IIC_SR>,
42 OpSize;
Chris Lattner1b3aa862010-10-05 07:00:12 +000043def SHL32ri : Ii8<0xC1, MRM4r, (outs GR32:$dst), (ins GR32:$src1, i8imm:$src2),
44 "shl{l}\t{$src2, $dst|$dst, $src2}",
Andrew Trick8523b162012-02-01 23:20:51 +000045 [(set GR32:$dst, (shl GR32:$src1, (i8 imm:$src2)))], IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +000046def SHL64ri : RIi8<0xC1, MRM4r, (outs GR64:$dst),
47 (ins GR64:$src1, i8imm:$src2),
48 "shl{q}\t{$src2, $dst|$dst, $src2}",
Andrew Trick8523b162012-02-01 23:20:51 +000049 [(set GR64:$dst, (shl GR64:$src1, (i8 imm:$src2)))],
50 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +000051
52// NOTE: We don't include patterns for shifts of a register by one, because
Chris Lattner1818dd52010-10-05 07:13:35 +000053// 'add reg,reg' is cheaper (and we have a Pat pattern for shift-by-one).
Craig Topper396cb792012-12-27 03:35:44 +000054let hasSideEffects = 0 in {
Chris Lattner1b3aa862010-10-05 07:00:12 +000055def SHL8r1 : I<0xD0, MRM4r, (outs GR8:$dst), (ins GR8:$src1),
Andrew Trick8523b162012-02-01 23:20:51 +000056 "shl{b}\t$dst", [], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +000057def SHL16r1 : I<0xD1, MRM4r, (outs GR16:$dst), (ins GR16:$src1),
Andrew Trick8523b162012-02-01 23:20:51 +000058 "shl{w}\t$dst", [], IIC_SR>, OpSize;
Chris Lattner1b3aa862010-10-05 07:00:12 +000059def SHL32r1 : I<0xD1, MRM4r, (outs GR32:$dst), (ins GR32:$src1),
Andrew Trick8523b162012-02-01 23:20:51 +000060 "shl{l}\t$dst", [], IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +000061def SHL64r1 : RI<0xD1, MRM4r, (outs GR64:$dst), (ins GR64:$src1),
Andrew Trick8523b162012-02-01 23:20:51 +000062 "shl{q}\t$dst", [], IIC_SR>;
Craig Topper396cb792012-12-27 03:35:44 +000063} // hasSideEffects = 0
Chris Lattner1b3aa862010-10-05 07:00:12 +000064} // isConvertibleToThreeAddress = 1
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +000065} // Constraints = "$src = $dst", SchedRW
Chris Lattner1b3aa862010-10-05 07:00:12 +000066
67
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +000068let SchedRW = [WriteShiftLd, WriteRMW] in {
Chris Lattner1818dd52010-10-05 07:13:35 +000069// FIXME: Why do we need an explicit "Uses = [CL]" when the instr has a pattern
70// using CL?
Chris Lattner1b3aa862010-10-05 07:00:12 +000071let Uses = [CL] in {
72def SHL8mCL : I<0xD2, MRM4m, (outs), (ins i8mem :$dst),
73 "shl{b}\t{%cl, $dst|$dst, CL}",
Andrew Trick8523b162012-02-01 23:20:51 +000074 [(store (shl (loadi8 addr:$dst), CL), addr:$dst)], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +000075def SHL16mCL : I<0xD3, MRM4m, (outs), (ins i16mem:$dst),
76 "shl{w}\t{%cl, $dst|$dst, CL}",
Andrew Trick8523b162012-02-01 23:20:51 +000077 [(store (shl (loadi16 addr:$dst), CL), addr:$dst)], IIC_SR>,
78 OpSize;
Chris Lattner1b3aa862010-10-05 07:00:12 +000079def SHL32mCL : I<0xD3, MRM4m, (outs), (ins i32mem:$dst),
80 "shl{l}\t{%cl, $dst|$dst, CL}",
Andrew Trick8523b162012-02-01 23:20:51 +000081 [(store (shl (loadi32 addr:$dst), CL), addr:$dst)], IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +000082def SHL64mCL : RI<0xD3, MRM4m, (outs), (ins i64mem:$dst),
Devang Patelc1215322012-01-03 18:22:10 +000083 "shl{q}\t{%cl, $dst|$dst, CL}",
Andrew Trick8523b162012-02-01 23:20:51 +000084 [(store (shl (loadi64 addr:$dst), CL), addr:$dst)], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +000085}
86def SHL8mi : Ii8<0xC0, MRM4m, (outs), (ins i8mem :$dst, i8imm:$src),
87 "shl{b}\t{$src, $dst|$dst, $src}",
Andrew Trick8523b162012-02-01 23:20:51 +000088 [(store (shl (loadi8 addr:$dst), (i8 imm:$src)), addr:$dst)],
89 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +000090def SHL16mi : Ii8<0xC1, MRM4m, (outs), (ins i16mem:$dst, i8imm:$src),
91 "shl{w}\t{$src, $dst|$dst, $src}",
Andrew Trick8523b162012-02-01 23:20:51 +000092 [(store (shl (loadi16 addr:$dst), (i8 imm:$src)), addr:$dst)],
93 IIC_SR>,
Chris Lattner1b3aa862010-10-05 07:00:12 +000094 OpSize;
95def SHL32mi : Ii8<0xC1, MRM4m, (outs), (ins i32mem:$dst, i8imm:$src),
96 "shl{l}\t{$src, $dst|$dst, $src}",
Andrew Trick8523b162012-02-01 23:20:51 +000097 [(store (shl (loadi32 addr:$dst), (i8 imm:$src)), addr:$dst)],
98 IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +000099def SHL64mi : RIi8<0xC1, MRM4m, (outs), (ins i64mem:$dst, i8imm:$src),
100 "shl{q}\t{$src, $dst|$dst, $src}",
Andrew Trick8523b162012-02-01 23:20:51 +0000101 [(store (shl (loadi64 addr:$dst), (i8 imm:$src)), addr:$dst)],
102 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000103
104// Shift by 1
105def SHL8m1 : I<0xD0, MRM4m, (outs), (ins i8mem :$dst),
106 "shl{b}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000107 [(store (shl (loadi8 addr:$dst), (i8 1)), addr:$dst)],
108 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000109def SHL16m1 : I<0xD1, MRM4m, (outs), (ins i16mem:$dst),
110 "shl{w}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000111 [(store (shl (loadi16 addr:$dst), (i8 1)), addr:$dst)],
112 IIC_SR>,
Chris Lattner1b3aa862010-10-05 07:00:12 +0000113 OpSize;
114def SHL32m1 : I<0xD1, MRM4m, (outs), (ins i32mem:$dst),
115 "shl{l}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000116 [(store (shl (loadi32 addr:$dst), (i8 1)), addr:$dst)],
117 IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000118def SHL64m1 : RI<0xD1, MRM4m, (outs), (ins i64mem:$dst),
119 "shl{q}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000120 [(store (shl (loadi64 addr:$dst), (i8 1)), addr:$dst)],
121 IIC_SR>;
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000122} // SchedRW
Chris Lattner1b3aa862010-10-05 07:00:12 +0000123
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000124let Constraints = "$src1 = $dst", SchedRW = [WriteShift] in {
Chris Lattner1b3aa862010-10-05 07:00:12 +0000125let Uses = [CL] in {
126def SHR8rCL : I<0xD2, MRM5r, (outs GR8 :$dst), (ins GR8 :$src1),
127 "shr{b}\t{%cl, $dst|$dst, CL}",
Andrew Trick8523b162012-02-01 23:20:51 +0000128 [(set GR8:$dst, (srl GR8:$src1, CL))], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000129def SHR16rCL : I<0xD3, MRM5r, (outs GR16:$dst), (ins GR16:$src1),
130 "shr{w}\t{%cl, $dst|$dst, CL}",
Andrew Trick8523b162012-02-01 23:20:51 +0000131 [(set GR16:$dst, (srl GR16:$src1, CL))], IIC_SR>, OpSize;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000132def SHR32rCL : I<0xD3, MRM5r, (outs GR32:$dst), (ins GR32:$src1),
133 "shr{l}\t{%cl, $dst|$dst, CL}",
Andrew Trick8523b162012-02-01 23:20:51 +0000134 [(set GR32:$dst, (srl GR32:$src1, CL))], IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000135def SHR64rCL : RI<0xD3, MRM5r, (outs GR64:$dst), (ins GR64:$src1),
Devang Patelc1215322012-01-03 18:22:10 +0000136 "shr{q}\t{%cl, $dst|$dst, CL}",
Andrew Trick8523b162012-02-01 23:20:51 +0000137 [(set GR64:$dst, (srl GR64:$src1, CL))], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000138}
139
140def SHR8ri : Ii8<0xC0, MRM5r, (outs GR8:$dst), (ins GR8:$src1, i8imm:$src2),
141 "shr{b}\t{$src2, $dst|$dst, $src2}",
Andrew Trick8523b162012-02-01 23:20:51 +0000142 [(set GR8:$dst, (srl GR8:$src1, (i8 imm:$src2)))], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000143def SHR16ri : Ii8<0xC1, MRM5r, (outs GR16:$dst), (ins GR16:$src1, i8imm:$src2),
144 "shr{w}\t{$src2, $dst|$dst, $src2}",
Andrew Trick8523b162012-02-01 23:20:51 +0000145 [(set GR16:$dst, (srl GR16:$src1, (i8 imm:$src2)))],
146 IIC_SR>, OpSize;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000147def SHR32ri : Ii8<0xC1, MRM5r, (outs GR32:$dst), (ins GR32:$src1, i8imm:$src2),
148 "shr{l}\t{$src2, $dst|$dst, $src2}",
Andrew Trick8523b162012-02-01 23:20:51 +0000149 [(set GR32:$dst, (srl GR32:$src1, (i8 imm:$src2)))],
150 IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000151def SHR64ri : RIi8<0xC1, MRM5r, (outs GR64:$dst), (ins GR64:$src1, i8imm:$src2),
152 "shr{q}\t{$src2, $dst|$dst, $src2}",
Andrew Trick8523b162012-02-01 23:20:51 +0000153 [(set GR64:$dst, (srl GR64:$src1, (i8 imm:$src2)))], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000154
Chris Lattner1818dd52010-10-05 07:13:35 +0000155// Shift right by 1
Chris Lattner1b3aa862010-10-05 07:00:12 +0000156def SHR8r1 : I<0xD0, MRM5r, (outs GR8:$dst), (ins GR8:$src1),
157 "shr{b}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000158 [(set GR8:$dst, (srl GR8:$src1, (i8 1)))], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000159def SHR16r1 : I<0xD1, MRM5r, (outs GR16:$dst), (ins GR16:$src1),
160 "shr{w}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000161 [(set GR16:$dst, (srl GR16:$src1, (i8 1)))], IIC_SR>, OpSize;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000162def SHR32r1 : I<0xD1, MRM5r, (outs GR32:$dst), (ins GR32:$src1),
163 "shr{l}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000164 [(set GR32:$dst, (srl GR32:$src1, (i8 1)))], IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000165def SHR64r1 : RI<0xD1, MRM5r, (outs GR64:$dst), (ins GR64:$src1),
166 "shr{q}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000167 [(set GR64:$dst, (srl GR64:$src1, (i8 1)))], IIC_SR>;
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000168} // Constraints = "$src = $dst", SchedRW
Chris Lattner1b3aa862010-10-05 07:00:12 +0000169
170
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000171let SchedRW = [WriteShiftLd, WriteRMW] in {
Chris Lattner1b3aa862010-10-05 07:00:12 +0000172let Uses = [CL] in {
173def SHR8mCL : I<0xD2, MRM5m, (outs), (ins i8mem :$dst),
174 "shr{b}\t{%cl, $dst|$dst, CL}",
Andrew Trick8523b162012-02-01 23:20:51 +0000175 [(store (srl (loadi8 addr:$dst), CL), addr:$dst)], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000176def SHR16mCL : I<0xD3, MRM5m, (outs), (ins i16mem:$dst),
177 "shr{w}\t{%cl, $dst|$dst, CL}",
Andrew Trick8523b162012-02-01 23:20:51 +0000178 [(store (srl (loadi16 addr:$dst), CL), addr:$dst)], IIC_SR>,
Chris Lattner1b3aa862010-10-05 07:00:12 +0000179 OpSize;
180def SHR32mCL : I<0xD3, MRM5m, (outs), (ins i32mem:$dst),
181 "shr{l}\t{%cl, $dst|$dst, CL}",
Andrew Trick8523b162012-02-01 23:20:51 +0000182 [(store (srl (loadi32 addr:$dst), CL), addr:$dst)], IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000183def SHR64mCL : RI<0xD3, MRM5m, (outs), (ins i64mem:$dst),
Devang Patelc1215322012-01-03 18:22:10 +0000184 "shr{q}\t{%cl, $dst|$dst, CL}",
Andrew Trick8523b162012-02-01 23:20:51 +0000185 [(store (srl (loadi64 addr:$dst), CL), addr:$dst)], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000186}
187def SHR8mi : Ii8<0xC0, MRM5m, (outs), (ins i8mem :$dst, i8imm:$src),
188 "shr{b}\t{$src, $dst|$dst, $src}",
Andrew Trick8523b162012-02-01 23:20:51 +0000189 [(store (srl (loadi8 addr:$dst), (i8 imm:$src)), addr:$dst)],
190 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000191def SHR16mi : Ii8<0xC1, MRM5m, (outs), (ins i16mem:$dst, i8imm:$src),
192 "shr{w}\t{$src, $dst|$dst, $src}",
Andrew Trick8523b162012-02-01 23:20:51 +0000193 [(store (srl (loadi16 addr:$dst), (i8 imm:$src)), addr:$dst)],
194 IIC_SR>,
Chris Lattner1b3aa862010-10-05 07:00:12 +0000195 OpSize;
196def SHR32mi : Ii8<0xC1, MRM5m, (outs), (ins i32mem:$dst, i8imm:$src),
197 "shr{l}\t{$src, $dst|$dst, $src}",
Andrew Trick8523b162012-02-01 23:20:51 +0000198 [(store (srl (loadi32 addr:$dst), (i8 imm:$src)), addr:$dst)],
199 IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000200def SHR64mi : RIi8<0xC1, MRM5m, (outs), (ins i64mem:$dst, i8imm:$src),
201 "shr{q}\t{$src, $dst|$dst, $src}",
Andrew Trick8523b162012-02-01 23:20:51 +0000202 [(store (srl (loadi64 addr:$dst), (i8 imm:$src)), addr:$dst)],
203 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000204
205// Shift by 1
206def SHR8m1 : I<0xD0, MRM5m, (outs), (ins i8mem :$dst),
207 "shr{b}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000208 [(store (srl (loadi8 addr:$dst), (i8 1)), addr:$dst)],
209 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000210def SHR16m1 : I<0xD1, MRM5m, (outs), (ins i16mem:$dst),
211 "shr{w}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000212 [(store (srl (loadi16 addr:$dst), (i8 1)), addr:$dst)],
213 IIC_SR>,OpSize;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000214def SHR32m1 : I<0xD1, MRM5m, (outs), (ins i32mem:$dst),
215 "shr{l}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000216 [(store (srl (loadi32 addr:$dst), (i8 1)), addr:$dst)],
217 IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000218def SHR64m1 : RI<0xD1, MRM5m, (outs), (ins i64mem:$dst),
219 "shr{q}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000220 [(store (srl (loadi64 addr:$dst), (i8 1)), addr:$dst)],
221 IIC_SR>;
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000222} // SchedRW
Chris Lattner1b3aa862010-10-05 07:00:12 +0000223
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000224let Constraints = "$src1 = $dst", SchedRW = [WriteShift] in {
Chris Lattner1b3aa862010-10-05 07:00:12 +0000225let Uses = [CL] in {
226def SAR8rCL : I<0xD2, MRM7r, (outs GR8 :$dst), (ins GR8 :$src1),
227 "sar{b}\t{%cl, $dst|$dst, CL}",
Andrew Trick8523b162012-02-01 23:20:51 +0000228 [(set GR8:$dst, (sra GR8:$src1, CL))],
229 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000230def SAR16rCL : I<0xD3, MRM7r, (outs GR16:$dst), (ins GR16:$src1),
231 "sar{w}\t{%cl, $dst|$dst, CL}",
Andrew Trick8523b162012-02-01 23:20:51 +0000232 [(set GR16:$dst, (sra GR16:$src1, CL))],
233 IIC_SR>, OpSize;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000234def SAR32rCL : I<0xD3, MRM7r, (outs GR32:$dst), (ins GR32:$src1),
235 "sar{l}\t{%cl, $dst|$dst, CL}",
Andrew Trick8523b162012-02-01 23:20:51 +0000236 [(set GR32:$dst, (sra GR32:$src1, CL))],
237 IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000238def SAR64rCL : RI<0xD3, MRM7r, (outs GR64:$dst), (ins GR64:$src1),
Devang Patelc1215322012-01-03 18:22:10 +0000239 "sar{q}\t{%cl, $dst|$dst, CL}",
Andrew Trick8523b162012-02-01 23:20:51 +0000240 [(set GR64:$dst, (sra GR64:$src1, CL))],
241 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000242}
243
244def SAR8ri : Ii8<0xC0, MRM7r, (outs GR8 :$dst), (ins GR8 :$src1, i8imm:$src2),
245 "sar{b}\t{$src2, $dst|$dst, $src2}",
Andrew Trick8523b162012-02-01 23:20:51 +0000246 [(set GR8:$dst, (sra GR8:$src1, (i8 imm:$src2)))],
247 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000248def SAR16ri : Ii8<0xC1, MRM7r, (outs GR16:$dst), (ins GR16:$src1, i8imm:$src2),
249 "sar{w}\t{$src2, $dst|$dst, $src2}",
Andrew Trick8523b162012-02-01 23:20:51 +0000250 [(set GR16:$dst, (sra GR16:$src1, (i8 imm:$src2)))],
251 IIC_SR>,
Chris Lattner1b3aa862010-10-05 07:00:12 +0000252 OpSize;
253def SAR32ri : Ii8<0xC1, MRM7r, (outs GR32:$dst), (ins GR32:$src1, i8imm:$src2),
254 "sar{l}\t{$src2, $dst|$dst, $src2}",
Andrew Trick8523b162012-02-01 23:20:51 +0000255 [(set GR32:$dst, (sra GR32:$src1, (i8 imm:$src2)))],
256 IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000257def SAR64ri : RIi8<0xC1, MRM7r, (outs GR64:$dst),
258 (ins GR64:$src1, i8imm:$src2),
259 "sar{q}\t{$src2, $dst|$dst, $src2}",
Andrew Trick8523b162012-02-01 23:20:51 +0000260 [(set GR64:$dst, (sra GR64:$src1, (i8 imm:$src2)))],
261 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000262
263// Shift by 1
264def SAR8r1 : I<0xD0, MRM7r, (outs GR8 :$dst), (ins GR8 :$src1),
265 "sar{b}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000266 [(set GR8:$dst, (sra GR8:$src1, (i8 1)))],
267 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000268def SAR16r1 : I<0xD1, MRM7r, (outs GR16:$dst), (ins GR16:$src1),
269 "sar{w}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000270 [(set GR16:$dst, (sra GR16:$src1, (i8 1)))],
271 IIC_SR>, OpSize;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000272def SAR32r1 : I<0xD1, MRM7r, (outs GR32:$dst), (ins GR32:$src1),
273 "sar{l}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000274 [(set GR32:$dst, (sra GR32:$src1, (i8 1)))],
275 IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000276def SAR64r1 : RI<0xD1, MRM7r, (outs GR64:$dst), (ins GR64:$src1),
277 "sar{q}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000278 [(set GR64:$dst, (sra GR64:$src1, (i8 1)))],
279 IIC_SR>;
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000280} // Constraints = "$src = $dst", SchedRW
Chris Lattner1b3aa862010-10-05 07:00:12 +0000281
282
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000283let SchedRW = [WriteShiftLd, WriteRMW] in {
Chris Lattner1b3aa862010-10-05 07:00:12 +0000284let Uses = [CL] in {
285def SAR8mCL : I<0xD2, MRM7m, (outs), (ins i8mem :$dst),
286 "sar{b}\t{%cl, $dst|$dst, CL}",
Andrew Trick8523b162012-02-01 23:20:51 +0000287 [(store (sra (loadi8 addr:$dst), CL), addr:$dst)],
288 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000289def SAR16mCL : I<0xD3, MRM7m, (outs), (ins i16mem:$dst),
290 "sar{w}\t{%cl, $dst|$dst, CL}",
Andrew Trick8523b162012-02-01 23:20:51 +0000291 [(store (sra (loadi16 addr:$dst), CL), addr:$dst)],
292 IIC_SR>, OpSize;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000293def SAR32mCL : I<0xD3, MRM7m, (outs), (ins i32mem:$dst),
294 "sar{l}\t{%cl, $dst|$dst, CL}",
Andrew Trick8523b162012-02-01 23:20:51 +0000295 [(store (sra (loadi32 addr:$dst), CL), addr:$dst)],
296 IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000297def SAR64mCL : RI<0xD3, MRM7m, (outs), (ins i64mem:$dst),
Devang Patelc1215322012-01-03 18:22:10 +0000298 "sar{q}\t{%cl, $dst|$dst, CL}",
Andrew Trick8523b162012-02-01 23:20:51 +0000299 [(store (sra (loadi64 addr:$dst), CL), addr:$dst)],
300 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000301}
302def SAR8mi : Ii8<0xC0, MRM7m, (outs), (ins i8mem :$dst, i8imm:$src),
303 "sar{b}\t{$src, $dst|$dst, $src}",
Andrew Trick8523b162012-02-01 23:20:51 +0000304 [(store (sra (loadi8 addr:$dst), (i8 imm:$src)), addr:$dst)],
305 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000306def SAR16mi : Ii8<0xC1, MRM7m, (outs), (ins i16mem:$dst, i8imm:$src),
307 "sar{w}\t{$src, $dst|$dst, $src}",
Andrew Trick8523b162012-02-01 23:20:51 +0000308 [(store (sra (loadi16 addr:$dst), (i8 imm:$src)), addr:$dst)],
309 IIC_SR>,
Chris Lattner1b3aa862010-10-05 07:00:12 +0000310 OpSize;
311def SAR32mi : Ii8<0xC1, MRM7m, (outs), (ins i32mem:$dst, i8imm:$src),
312 "sar{l}\t{$src, $dst|$dst, $src}",
Andrew Trick8523b162012-02-01 23:20:51 +0000313 [(store (sra (loadi32 addr:$dst), (i8 imm:$src)), addr:$dst)],
314 IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000315def SAR64mi : RIi8<0xC1, MRM7m, (outs), (ins i64mem:$dst, i8imm:$src),
316 "sar{q}\t{$src, $dst|$dst, $src}",
Andrew Trick8523b162012-02-01 23:20:51 +0000317 [(store (sra (loadi64 addr:$dst), (i8 imm:$src)), addr:$dst)],
318 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000319
320// Shift by 1
321def SAR8m1 : I<0xD0, MRM7m, (outs), (ins i8mem :$dst),
322 "sar{b}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000323 [(store (sra (loadi8 addr:$dst), (i8 1)), addr:$dst)],
324 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000325def SAR16m1 : I<0xD1, MRM7m, (outs), (ins i16mem:$dst),
326 "sar{w}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000327 [(store (sra (loadi16 addr:$dst), (i8 1)), addr:$dst)],
328 IIC_SR>,
Chris Lattner1b3aa862010-10-05 07:00:12 +0000329 OpSize;
330def SAR32m1 : I<0xD1, MRM7m, (outs), (ins i32mem:$dst),
331 "sar{l}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000332 [(store (sra (loadi32 addr:$dst), (i8 1)), addr:$dst)],
333 IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000334def SAR64m1 : RI<0xD1, MRM7m, (outs), (ins i64mem:$dst),
335 "sar{q}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000336 [(store (sra (loadi64 addr:$dst), (i8 1)), addr:$dst)],
337 IIC_SR>;
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000338} // SchedRW
Chris Lattner1b3aa862010-10-05 07:00:12 +0000339
340//===----------------------------------------------------------------------===//
341// Rotate instructions
342//===----------------------------------------------------------------------===//
343
Craig Topper396cb792012-12-27 03:35:44 +0000344let hasSideEffects = 0 in {
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000345let Constraints = "$src1 = $dst", SchedRW = [WriteShift] in {
Chris Lattner1b3aa862010-10-05 07:00:12 +0000346def RCL8r1 : I<0xD0, MRM2r, (outs GR8:$dst), (ins GR8:$src1),
Andrew Trick8523b162012-02-01 23:20:51 +0000347 "rcl{b}\t$dst", [], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000348def RCL8ri : Ii8<0xC0, MRM2r, (outs GR8:$dst), (ins GR8:$src1, i8imm:$cnt),
Andrew Trick8523b162012-02-01 23:20:51 +0000349 "rcl{b}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000350let Uses = [CL] in
351def RCL8rCL : I<0xD2, MRM2r, (outs GR8:$dst), (ins GR8:$src1),
Andrew Trick8523b162012-02-01 23:20:51 +0000352 "rcl{b}\t{%cl, $dst|$dst, CL}", [], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000353
354def RCL16r1 : I<0xD1, MRM2r, (outs GR16:$dst), (ins GR16:$src1),
Andrew Trick8523b162012-02-01 23:20:51 +0000355 "rcl{w}\t$dst", [], IIC_SR>, OpSize;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000356def RCL16ri : Ii8<0xC1, MRM2r, (outs GR16:$dst), (ins GR16:$src1, i8imm:$cnt),
Andrew Trick8523b162012-02-01 23:20:51 +0000357 "rcl{w}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>, OpSize;
Chris Lattner1818dd52010-10-05 07:13:35 +0000358let Uses = [CL] in
359def RCL16rCL : I<0xD3, MRM2r, (outs GR16:$dst), (ins GR16:$src1),
Andrew Trick8523b162012-02-01 23:20:51 +0000360 "rcl{w}\t{%cl, $dst|$dst, CL}", [], IIC_SR>, OpSize;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000361
362def RCL32r1 : I<0xD1, MRM2r, (outs GR32:$dst), (ins GR32:$src1),
Andrew Trick8523b162012-02-01 23:20:51 +0000363 "rcl{l}\t$dst", [], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000364def RCL32ri : Ii8<0xC1, MRM2r, (outs GR32:$dst), (ins GR32:$src1, i8imm:$cnt),
Andrew Trick8523b162012-02-01 23:20:51 +0000365 "rcl{l}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000366let Uses = [CL] in
367def RCL32rCL : I<0xD3, MRM2r, (outs GR32:$dst), (ins GR32:$src1),
Andrew Trick8523b162012-02-01 23:20:51 +0000368 "rcl{l}\t{%cl, $dst|$dst, CL}", [], IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000369
370
371def RCL64r1 : RI<0xD1, MRM2r, (outs GR64:$dst), (ins GR64:$src1),
Andrew Trick8523b162012-02-01 23:20:51 +0000372 "rcl{q}\t$dst", [], IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000373def RCL64ri : RIi8<0xC1, MRM2r, (outs GR64:$dst), (ins GR64:$src1, i8imm:$cnt),
Andrew Trick8523b162012-02-01 23:20:51 +0000374 "rcl{q}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000375let Uses = [CL] in
376def RCL64rCL : RI<0xD3, MRM2r, (outs GR64:$dst), (ins GR64:$src1),
Andrew Trick8523b162012-02-01 23:20:51 +0000377 "rcl{q}\t{%cl, $dst|$dst, CL}", [], IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000378
379
Chris Lattner1b3aa862010-10-05 07:00:12 +0000380def RCR8r1 : I<0xD0, MRM3r, (outs GR8:$dst), (ins GR8:$src1),
Andrew Trick8523b162012-02-01 23:20:51 +0000381 "rcr{b}\t$dst", [], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000382def RCR8ri : Ii8<0xC0, MRM3r, (outs GR8:$dst), (ins GR8:$src1, i8imm:$cnt),
Andrew Trick8523b162012-02-01 23:20:51 +0000383 "rcr{b}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000384let Uses = [CL] in
385def RCR8rCL : I<0xD2, MRM3r, (outs GR8:$dst), (ins GR8:$src1),
Andrew Trick8523b162012-02-01 23:20:51 +0000386 "rcr{b}\t{%cl, $dst|$dst, CL}", [], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000387
388def RCR16r1 : I<0xD1, MRM3r, (outs GR16:$dst), (ins GR16:$src1),
Andrew Trick8523b162012-02-01 23:20:51 +0000389 "rcr{w}\t$dst", [], IIC_SR>, OpSize;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000390def RCR16ri : Ii8<0xC1, MRM3r, (outs GR16:$dst), (ins GR16:$src1, i8imm:$cnt),
Andrew Trick8523b162012-02-01 23:20:51 +0000391 "rcr{w}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>, OpSize;
Chris Lattner1818dd52010-10-05 07:13:35 +0000392let Uses = [CL] in
393def RCR16rCL : I<0xD3, MRM3r, (outs GR16:$dst), (ins GR16:$src1),
Andrew Trick8523b162012-02-01 23:20:51 +0000394 "rcr{w}\t{%cl, $dst|$dst, CL}", [], IIC_SR>, OpSize;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000395
396def RCR32r1 : I<0xD1, MRM3r, (outs GR32:$dst), (ins GR32:$src1),
Andrew Trick8523b162012-02-01 23:20:51 +0000397 "rcr{l}\t$dst", [], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000398def RCR32ri : Ii8<0xC1, MRM3r, (outs GR32:$dst), (ins GR32:$src1, i8imm:$cnt),
Andrew Trick8523b162012-02-01 23:20:51 +0000399 "rcr{l}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000400let Uses = [CL] in
401def RCR32rCL : I<0xD3, MRM3r, (outs GR32:$dst), (ins GR32:$src1),
Andrew Trick8523b162012-02-01 23:20:51 +0000402 "rcr{l}\t{%cl, $dst|$dst, CL}", [], IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000403
404def RCR64r1 : RI<0xD1, MRM3r, (outs GR64:$dst), (ins GR64:$src1),
Andrew Trick8523b162012-02-01 23:20:51 +0000405 "rcr{q}\t$dst", [], IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000406def RCR64ri : RIi8<0xC1, MRM3r, (outs GR64:$dst), (ins GR64:$src1, i8imm:$cnt),
Andrew Trick8523b162012-02-01 23:20:51 +0000407 "rcr{q}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000408let Uses = [CL] in
409def RCR64rCL : RI<0xD3, MRM3r, (outs GR64:$dst), (ins GR64:$src1),
Andrew Trick8523b162012-02-01 23:20:51 +0000410 "rcr{q}\t{%cl, $dst|$dst, CL}", [], IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000411
Chris Lattner1b3aa862010-10-05 07:00:12 +0000412} // Constraints = "$src = $dst"
413
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000414let SchedRW = [WriteShiftLd, WriteRMW] in {
Chris Lattner1b3aa862010-10-05 07:00:12 +0000415def RCL8m1 : I<0xD0, MRM2m, (outs), (ins i8mem:$dst),
Andrew Trick8523b162012-02-01 23:20:51 +0000416 "rcl{b}\t$dst", [], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000417def RCL8mi : Ii8<0xC0, MRM2m, (outs), (ins i8mem:$dst, i8imm:$cnt),
Andrew Trick8523b162012-02-01 23:20:51 +0000418 "rcl{b}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000419def RCL16m1 : I<0xD1, MRM2m, (outs), (ins i16mem:$dst),
Andrew Trick8523b162012-02-01 23:20:51 +0000420 "rcl{w}\t$dst", [], IIC_SR>, OpSize;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000421def RCL16mi : Ii8<0xC1, MRM2m, (outs), (ins i16mem:$dst, i8imm:$cnt),
Andrew Trick8523b162012-02-01 23:20:51 +0000422 "rcl{w}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>, OpSize;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000423def RCL32m1 : I<0xD1, MRM2m, (outs), (ins i32mem:$dst),
Andrew Trick8523b162012-02-01 23:20:51 +0000424 "rcl{l}\t$dst", [], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000425def RCL32mi : Ii8<0xC1, MRM2m, (outs), (ins i32mem:$dst, i8imm:$cnt),
Andrew Trick8523b162012-02-01 23:20:51 +0000426 "rcl{l}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000427def RCL64m1 : RI<0xD1, MRM2m, (outs), (ins i64mem:$dst),
Andrew Trick8523b162012-02-01 23:20:51 +0000428 "rcl{q}\t$dst", [], IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000429def RCL64mi : RIi8<0xC1, MRM2m, (outs), (ins i64mem:$dst, i8imm:$cnt),
Andrew Trick8523b162012-02-01 23:20:51 +0000430 "rcl{q}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000431
Chris Lattner1b3aa862010-10-05 07:00:12 +0000432def RCR8m1 : I<0xD0, MRM3m, (outs), (ins i8mem:$dst),
Andrew Trick8523b162012-02-01 23:20:51 +0000433 "rcr{b}\t$dst", [], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000434def RCR8mi : Ii8<0xC0, MRM3m, (outs), (ins i8mem:$dst, i8imm:$cnt),
Andrew Trick8523b162012-02-01 23:20:51 +0000435 "rcr{b}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000436def RCR16m1 : I<0xD1, MRM3m, (outs), (ins i16mem:$dst),
Andrew Trick8523b162012-02-01 23:20:51 +0000437 "rcr{w}\t$dst", [], IIC_SR>, OpSize;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000438def RCR16mi : Ii8<0xC1, MRM3m, (outs), (ins i16mem:$dst, i8imm:$cnt),
Andrew Trick8523b162012-02-01 23:20:51 +0000439 "rcr{w}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>, OpSize;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000440def RCR32m1 : I<0xD1, MRM3m, (outs), (ins i32mem:$dst),
Andrew Trick8523b162012-02-01 23:20:51 +0000441 "rcr{l}\t$dst", [], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000442def RCR32mi : Ii8<0xC1, MRM3m, (outs), (ins i32mem:$dst, i8imm:$cnt),
Andrew Trick8523b162012-02-01 23:20:51 +0000443 "rcr{l}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000444def RCR64m1 : RI<0xD1, MRM3m, (outs), (ins i64mem:$dst),
Andrew Trick8523b162012-02-01 23:20:51 +0000445 "rcr{q}\t$dst", [], IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000446def RCR64mi : RIi8<0xC1, MRM3m, (outs), (ins i64mem:$dst, i8imm:$cnt),
Andrew Trick8523b162012-02-01 23:20:51 +0000447 "rcr{q}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000448
449let Uses = [CL] in {
450def RCL8mCL : I<0xD2, MRM2m, (outs), (ins i8mem:$dst),
Andrew Trick8523b162012-02-01 23:20:51 +0000451 "rcl{b}\t{%cl, $dst|$dst, CL}", [], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000452def RCL16mCL : I<0xD3, MRM2m, (outs), (ins i16mem:$dst),
Andrew Trick8523b162012-02-01 23:20:51 +0000453 "rcl{w}\t{%cl, $dst|$dst, CL}", [], IIC_SR>, OpSize;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000454def RCL32mCL : I<0xD3, MRM2m, (outs), (ins i32mem:$dst),
Andrew Trick8523b162012-02-01 23:20:51 +0000455 "rcl{l}\t{%cl, $dst|$dst, CL}", [], IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000456def RCL64mCL : RI<0xD3, MRM2m, (outs), (ins i64mem:$dst),
Andrew Trick8523b162012-02-01 23:20:51 +0000457 "rcl{q}\t{%cl, $dst|$dst, CL}", [], IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000458
Chris Lattner1b3aa862010-10-05 07:00:12 +0000459def RCR8mCL : I<0xD2, MRM3m, (outs), (ins i8mem:$dst),
Andrew Trick8523b162012-02-01 23:20:51 +0000460 "rcr{b}\t{%cl, $dst|$dst, CL}", [], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000461def RCR16mCL : I<0xD3, MRM3m, (outs), (ins i16mem:$dst),
Andrew Trick8523b162012-02-01 23:20:51 +0000462 "rcr{w}\t{%cl, $dst|$dst, CL}", [], IIC_SR>, OpSize;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000463def RCR32mCL : I<0xD3, MRM3m, (outs), (ins i32mem:$dst),
Andrew Trick8523b162012-02-01 23:20:51 +0000464 "rcr{l}\t{%cl, $dst|$dst, CL}", [], IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000465def RCR64mCL : RI<0xD3, MRM3m, (outs), (ins i64mem:$dst),
Andrew Trick8523b162012-02-01 23:20:51 +0000466 "rcr{q}\t{%cl, $dst|$dst, CL}", [], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000467}
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000468} // SchedRW
Craig Topper396cb792012-12-27 03:35:44 +0000469} // hasSideEffects = 0
Chris Lattner1b3aa862010-10-05 07:00:12 +0000470
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000471let Constraints = "$src1 = $dst", SchedRW = [WriteShift] in {
Chris Lattner1b3aa862010-10-05 07:00:12 +0000472// FIXME: provide shorter instructions when imm8 == 1
473let Uses = [CL] in {
474def ROL8rCL : I<0xD2, MRM0r, (outs GR8 :$dst), (ins GR8 :$src1),
475 "rol{b}\t{%cl, $dst|$dst, CL}",
Andrew Trick8523b162012-02-01 23:20:51 +0000476 [(set GR8:$dst, (rotl GR8:$src1, CL))], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000477def ROL16rCL : I<0xD3, MRM0r, (outs GR16:$dst), (ins GR16:$src1),
478 "rol{w}\t{%cl, $dst|$dst, CL}",
Andrew Trick8523b162012-02-01 23:20:51 +0000479 [(set GR16:$dst, (rotl GR16:$src1, CL))], IIC_SR>, OpSize;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000480def ROL32rCL : I<0xD3, MRM0r, (outs GR32:$dst), (ins GR32:$src1),
481 "rol{l}\t{%cl, $dst|$dst, CL}",
Andrew Trick8523b162012-02-01 23:20:51 +0000482 [(set GR32:$dst, (rotl GR32:$src1, CL))], IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000483def ROL64rCL : RI<0xD3, MRM0r, (outs GR64:$dst), (ins GR64:$src1),
Devang Patelc1215322012-01-03 18:22:10 +0000484 "rol{q}\t{%cl, $dst|$dst, CL}",
Andrew Trick8523b162012-02-01 23:20:51 +0000485 [(set GR64:$dst, (rotl GR64:$src1, CL))], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000486}
487
488def ROL8ri : Ii8<0xC0, MRM0r, (outs GR8 :$dst), (ins GR8 :$src1, i8imm:$src2),
489 "rol{b}\t{$src2, $dst|$dst, $src2}",
Andrew Trick8523b162012-02-01 23:20:51 +0000490 [(set GR8:$dst, (rotl GR8:$src1, (i8 imm:$src2)))], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000491def ROL16ri : Ii8<0xC1, MRM0r, (outs GR16:$dst), (ins GR16:$src1, i8imm:$src2),
492 "rol{w}\t{$src2, $dst|$dst, $src2}",
Andrew Trick8523b162012-02-01 23:20:51 +0000493 [(set GR16:$dst, (rotl GR16:$src1, (i8 imm:$src2)))],
494 IIC_SR>,
Chris Lattner1b3aa862010-10-05 07:00:12 +0000495 OpSize;
496def ROL32ri : Ii8<0xC1, MRM0r, (outs GR32:$dst), (ins GR32:$src1, i8imm:$src2),
497 "rol{l}\t{$src2, $dst|$dst, $src2}",
Andrew Trick8523b162012-02-01 23:20:51 +0000498 [(set GR32:$dst, (rotl GR32:$src1, (i8 imm:$src2)))],
499 IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000500def ROL64ri : RIi8<0xC1, MRM0r, (outs GR64:$dst),
501 (ins GR64:$src1, i8imm:$src2),
502 "rol{q}\t{$src2, $dst|$dst, $src2}",
Andrew Trick8523b162012-02-01 23:20:51 +0000503 [(set GR64:$dst, (rotl GR64:$src1, (i8 imm:$src2)))],
504 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000505
506// Rotate by 1
507def ROL8r1 : I<0xD0, MRM0r, (outs GR8 :$dst), (ins GR8 :$src1),
508 "rol{b}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000509 [(set GR8:$dst, (rotl GR8:$src1, (i8 1)))],
510 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000511def ROL16r1 : I<0xD1, MRM0r, (outs GR16:$dst), (ins GR16:$src1),
512 "rol{w}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000513 [(set GR16:$dst, (rotl GR16:$src1, (i8 1)))],
514 IIC_SR>, OpSize;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000515def ROL32r1 : I<0xD1, MRM0r, (outs GR32:$dst), (ins GR32:$src1),
516 "rol{l}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000517 [(set GR32:$dst, (rotl GR32:$src1, (i8 1)))],
518 IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000519def ROL64r1 : RI<0xD1, MRM0r, (outs GR64:$dst), (ins GR64:$src1),
520 "rol{q}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000521 [(set GR64:$dst, (rotl GR64:$src1, (i8 1)))],
522 IIC_SR>;
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000523} // Constraints = "$src = $dst", SchedRW
Chris Lattner1b3aa862010-10-05 07:00:12 +0000524
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000525let SchedRW = [WriteShiftLd, WriteRMW] in {
Chris Lattner1b3aa862010-10-05 07:00:12 +0000526let Uses = [CL] in {
527def ROL8mCL : I<0xD2, MRM0m, (outs), (ins i8mem :$dst),
528 "rol{b}\t{%cl, $dst|$dst, CL}",
Andrew Trick8523b162012-02-01 23:20:51 +0000529 [(store (rotl (loadi8 addr:$dst), CL), addr:$dst)],
530 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000531def ROL16mCL : I<0xD3, MRM0m, (outs), (ins i16mem:$dst),
532 "rol{w}\t{%cl, $dst|$dst, CL}",
Andrew Trick8523b162012-02-01 23:20:51 +0000533 [(store (rotl (loadi16 addr:$dst), CL), addr:$dst)],
534 IIC_SR>, OpSize;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000535def ROL32mCL : I<0xD3, MRM0m, (outs), (ins i32mem:$dst),
536 "rol{l}\t{%cl, $dst|$dst, CL}",
Andrew Trick8523b162012-02-01 23:20:51 +0000537 [(store (rotl (loadi32 addr:$dst), CL), addr:$dst)],
538 IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000539def ROL64mCL : RI<0xD3, MRM0m, (outs), (ins i64mem:$dst),
Devang Patelc1215322012-01-03 18:22:10 +0000540 "rol{q}\t{%cl, $dst|$dst, %cl}",
Andrew Trick8523b162012-02-01 23:20:51 +0000541 [(store (rotl (loadi64 addr:$dst), CL), addr:$dst)],
542 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000543}
Chris Lattner1818dd52010-10-05 07:13:35 +0000544def ROL8mi : Ii8<0xC0, MRM0m, (outs), (ins i8mem :$dst, i8imm:$src1),
545 "rol{b}\t{$src1, $dst|$dst, $src1}",
Andrew Trick8523b162012-02-01 23:20:51 +0000546 [(store (rotl (loadi8 addr:$dst), (i8 imm:$src1)), addr:$dst)],
547 IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000548def ROL16mi : Ii8<0xC1, MRM0m, (outs), (ins i16mem:$dst, i8imm:$src1),
549 "rol{w}\t{$src1, $dst|$dst, $src1}",
Andrew Trick8523b162012-02-01 23:20:51 +0000550 [(store (rotl (loadi16 addr:$dst), (i8 imm:$src1)), addr:$dst)],
551 IIC_SR>,
Chris Lattner1b3aa862010-10-05 07:00:12 +0000552 OpSize;
Chris Lattner1818dd52010-10-05 07:13:35 +0000553def ROL32mi : Ii8<0xC1, MRM0m, (outs), (ins i32mem:$dst, i8imm:$src1),
554 "rol{l}\t{$src1, $dst|$dst, $src1}",
Andrew Trick8523b162012-02-01 23:20:51 +0000555 [(store (rotl (loadi32 addr:$dst), (i8 imm:$src1)), addr:$dst)],
556 IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000557def ROL64mi : RIi8<0xC1, MRM0m, (outs), (ins i64mem:$dst, i8imm:$src1),
558 "rol{q}\t{$src1, $dst|$dst, $src1}",
Andrew Trick8523b162012-02-01 23:20:51 +0000559 [(store (rotl (loadi64 addr:$dst), (i8 imm:$src1)), addr:$dst)],
560 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000561
562// Rotate by 1
563def ROL8m1 : I<0xD0, MRM0m, (outs), (ins i8mem :$dst),
564 "rol{b}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000565 [(store (rotl (loadi8 addr:$dst), (i8 1)), addr:$dst)],
566 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000567def ROL16m1 : I<0xD1, MRM0m, (outs), (ins i16mem:$dst),
568 "rol{w}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000569 [(store (rotl (loadi16 addr:$dst), (i8 1)), addr:$dst)],
570 IIC_SR>,
Chris Lattner1b3aa862010-10-05 07:00:12 +0000571 OpSize;
572def ROL32m1 : I<0xD1, MRM0m, (outs), (ins i32mem:$dst),
573 "rol{l}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000574 [(store (rotl (loadi32 addr:$dst), (i8 1)), addr:$dst)],
575 IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000576def ROL64m1 : RI<0xD1, MRM0m, (outs), (ins i64mem:$dst),
577 "rol{q}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000578 [(store (rotl (loadi64 addr:$dst), (i8 1)), addr:$dst)],
579 IIC_SR>;
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000580} // SchedRW
Chris Lattner1b3aa862010-10-05 07:00:12 +0000581
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000582let Constraints = "$src1 = $dst", SchedRW = [WriteShift] in {
Chris Lattner1b3aa862010-10-05 07:00:12 +0000583let Uses = [CL] in {
584def ROR8rCL : I<0xD2, MRM1r, (outs GR8 :$dst), (ins GR8 :$src1),
585 "ror{b}\t{%cl, $dst|$dst, CL}",
Andrew Trick8523b162012-02-01 23:20:51 +0000586 [(set GR8:$dst, (rotr GR8:$src1, CL))], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000587def ROR16rCL : I<0xD3, MRM1r, (outs GR16:$dst), (ins GR16:$src1),
588 "ror{w}\t{%cl, $dst|$dst, CL}",
Andrew Trick8523b162012-02-01 23:20:51 +0000589 [(set GR16:$dst, (rotr GR16:$src1, CL))], IIC_SR>, OpSize;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000590def ROR32rCL : I<0xD3, MRM1r, (outs GR32:$dst), (ins GR32:$src1),
591 "ror{l}\t{%cl, $dst|$dst, CL}",
Andrew Trick8523b162012-02-01 23:20:51 +0000592 [(set GR32:$dst, (rotr GR32:$src1, CL))], IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000593def ROR64rCL : RI<0xD3, MRM1r, (outs GR64:$dst), (ins GR64:$src1),
Devang Patelc1215322012-01-03 18:22:10 +0000594 "ror{q}\t{%cl, $dst|$dst, CL}",
Andrew Trick8523b162012-02-01 23:20:51 +0000595 [(set GR64:$dst, (rotr GR64:$src1, CL))], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000596}
597
598def ROR8ri : Ii8<0xC0, MRM1r, (outs GR8 :$dst), (ins GR8 :$src1, i8imm:$src2),
599 "ror{b}\t{$src2, $dst|$dst, $src2}",
Andrew Trick8523b162012-02-01 23:20:51 +0000600 [(set GR8:$dst, (rotr GR8:$src1, (i8 imm:$src2)))], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000601def ROR16ri : Ii8<0xC1, MRM1r, (outs GR16:$dst), (ins GR16:$src1, i8imm:$src2),
602 "ror{w}\t{$src2, $dst|$dst, $src2}",
Andrew Trick8523b162012-02-01 23:20:51 +0000603 [(set GR16:$dst, (rotr GR16:$src1, (i8 imm:$src2)))],
604 IIC_SR>,
Chris Lattner1b3aa862010-10-05 07:00:12 +0000605 OpSize;
606def ROR32ri : Ii8<0xC1, MRM1r, (outs GR32:$dst), (ins GR32:$src1, i8imm:$src2),
607 "ror{l}\t{$src2, $dst|$dst, $src2}",
Andrew Trick8523b162012-02-01 23:20:51 +0000608 [(set GR32:$dst, (rotr GR32:$src1, (i8 imm:$src2)))],
609 IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000610def ROR64ri : RIi8<0xC1, MRM1r, (outs GR64:$dst),
611 (ins GR64:$src1, i8imm:$src2),
612 "ror{q}\t{$src2, $dst|$dst, $src2}",
Andrew Trick8523b162012-02-01 23:20:51 +0000613 [(set GR64:$dst, (rotr GR64:$src1, (i8 imm:$src2)))],
614 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000615
616// Rotate by 1
617def ROR8r1 : I<0xD0, MRM1r, (outs GR8 :$dst), (ins GR8 :$src1),
618 "ror{b}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000619 [(set GR8:$dst, (rotr GR8:$src1, (i8 1)))],
620 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000621def ROR16r1 : I<0xD1, MRM1r, (outs GR16:$dst), (ins GR16:$src1),
622 "ror{w}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000623 [(set GR16:$dst, (rotr GR16:$src1, (i8 1)))],
624 IIC_SR>, OpSize;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000625def ROR32r1 : I<0xD1, MRM1r, (outs GR32:$dst), (ins GR32:$src1),
626 "ror{l}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000627 [(set GR32:$dst, (rotr GR32:$src1, (i8 1)))],
628 IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000629def ROR64r1 : RI<0xD1, MRM1r, (outs GR64:$dst), (ins GR64:$src1),
630 "ror{q}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000631 [(set GR64:$dst, (rotr GR64:$src1, (i8 1)))],
632 IIC_SR>;
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000633} // Constraints = "$src = $dst", SchedRW
Chris Lattner1b3aa862010-10-05 07:00:12 +0000634
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000635let SchedRW = [WriteShiftLd, WriteRMW] in {
Chris Lattner1b3aa862010-10-05 07:00:12 +0000636let Uses = [CL] in {
637def ROR8mCL : I<0xD2, MRM1m, (outs), (ins i8mem :$dst),
638 "ror{b}\t{%cl, $dst|$dst, CL}",
Andrew Trick8523b162012-02-01 23:20:51 +0000639 [(store (rotr (loadi8 addr:$dst), CL), addr:$dst)],
640 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000641def ROR16mCL : I<0xD3, MRM1m, (outs), (ins i16mem:$dst),
642 "ror{w}\t{%cl, $dst|$dst, CL}",
Andrew Trick8523b162012-02-01 23:20:51 +0000643 [(store (rotr (loadi16 addr:$dst), CL), addr:$dst)],
644 IIC_SR>, OpSize;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000645def ROR32mCL : I<0xD3, MRM1m, (outs), (ins i32mem:$dst),
646 "ror{l}\t{%cl, $dst|$dst, CL}",
Andrew Trick8523b162012-02-01 23:20:51 +0000647 [(store (rotr (loadi32 addr:$dst), CL), addr:$dst)],
648 IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000649def ROR64mCL : RI<0xD3, MRM1m, (outs), (ins i64mem:$dst),
Devang Patelc1215322012-01-03 18:22:10 +0000650 "ror{q}\t{%cl, $dst|$dst, CL}",
Andrew Trick8523b162012-02-01 23:20:51 +0000651 [(store (rotr (loadi64 addr:$dst), CL), addr:$dst)],
652 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000653}
654def ROR8mi : Ii8<0xC0, MRM1m, (outs), (ins i8mem :$dst, i8imm:$src),
655 "ror{b}\t{$src, $dst|$dst, $src}",
Andrew Trick8523b162012-02-01 23:20:51 +0000656 [(store (rotr (loadi8 addr:$dst), (i8 imm:$src)), addr:$dst)],
657 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000658def ROR16mi : Ii8<0xC1, MRM1m, (outs), (ins i16mem:$dst, i8imm:$src),
659 "ror{w}\t{$src, $dst|$dst, $src}",
Andrew Trick8523b162012-02-01 23:20:51 +0000660 [(store (rotr (loadi16 addr:$dst), (i8 imm:$src)), addr:$dst)],
661 IIC_SR>,
Chris Lattner1b3aa862010-10-05 07:00:12 +0000662 OpSize;
663def ROR32mi : Ii8<0xC1, MRM1m, (outs), (ins i32mem:$dst, i8imm:$src),
664 "ror{l}\t{$src, $dst|$dst, $src}",
Andrew Trick8523b162012-02-01 23:20:51 +0000665 [(store (rotr (loadi32 addr:$dst), (i8 imm:$src)), addr:$dst)],
666 IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000667def ROR64mi : RIi8<0xC1, MRM1m, (outs), (ins i64mem:$dst, i8imm:$src),
668 "ror{q}\t{$src, $dst|$dst, $src}",
Andrew Trick8523b162012-02-01 23:20:51 +0000669 [(store (rotr (loadi64 addr:$dst), (i8 imm:$src)), addr:$dst)],
670 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000671
672// Rotate by 1
673def ROR8m1 : I<0xD0, MRM1m, (outs), (ins i8mem :$dst),
674 "ror{b}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000675 [(store (rotr (loadi8 addr:$dst), (i8 1)), addr:$dst)],
676 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000677def ROR16m1 : I<0xD1, MRM1m, (outs), (ins i16mem:$dst),
678 "ror{w}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000679 [(store (rotr (loadi16 addr:$dst), (i8 1)), addr:$dst)],
680 IIC_SR>,
Chris Lattner1b3aa862010-10-05 07:00:12 +0000681 OpSize;
682def ROR32m1 : I<0xD1, MRM1m, (outs), (ins i32mem:$dst),
683 "ror{l}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000684 [(store (rotr (loadi32 addr:$dst), (i8 1)), addr:$dst)],
685 IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000686def ROR64m1 : RI<0xD1, MRM1m, (outs), (ins i64mem:$dst),
687 "ror{q}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000688 [(store (rotr (loadi64 addr:$dst), (i8 1)), addr:$dst)],
689 IIC_SR>;
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000690} // SchedRW
Chris Lattner1b3aa862010-10-05 07:00:12 +0000691
692
693//===----------------------------------------------------------------------===//
694// Double shift instructions (generalizations of rotate)
695//===----------------------------------------------------------------------===//
696
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000697let Constraints = "$src1 = $dst", SchedRW = [WriteShift] in {
Chris Lattner1b3aa862010-10-05 07:00:12 +0000698
699let Uses = [CL] in {
Chris Lattner1b3aa862010-10-05 07:00:12 +0000700def SHLD16rrCL : I<0xA5, MRMDestReg, (outs GR16:$dst),
701 (ins GR16:$src1, GR16:$src2),
702 "shld{w}\t{%cl, $src2, $dst|$dst, $src2, CL}",
Andrew Trick8523b162012-02-01 23:20:51 +0000703 [(set GR16:$dst, (X86shld GR16:$src1, GR16:$src2, CL))],
704 IIC_SHD16_REG_CL>,
Chris Lattner1b3aa862010-10-05 07:00:12 +0000705 TB, OpSize;
706def SHRD16rrCL : I<0xAD, MRMDestReg, (outs GR16:$dst),
707 (ins GR16:$src1, GR16:$src2),
708 "shrd{w}\t{%cl, $src2, $dst|$dst, $src2, CL}",
Andrew Trick8523b162012-02-01 23:20:51 +0000709 [(set GR16:$dst, (X86shrd GR16:$src1, GR16:$src2, CL))],
710 IIC_SHD16_REG_CL>,
Chris Lattner1b3aa862010-10-05 07:00:12 +0000711 TB, OpSize;
Chris Lattner1818dd52010-10-05 07:13:35 +0000712def SHLD32rrCL : I<0xA5, MRMDestReg, (outs GR32:$dst),
713 (ins GR32:$src1, GR32:$src2),
714 "shld{l}\t{%cl, $src2, $dst|$dst, $src2, CL}",
Andrew Trick8523b162012-02-01 23:20:51 +0000715 [(set GR32:$dst, (X86shld GR32:$src1, GR32:$src2, CL))],
716 IIC_SHD32_REG_CL>, TB;
Chris Lattner1818dd52010-10-05 07:13:35 +0000717def SHRD32rrCL : I<0xAD, MRMDestReg, (outs GR32:$dst),
718 (ins GR32:$src1, GR32:$src2),
719 "shrd{l}\t{%cl, $src2, $dst|$dst, $src2, CL}",
Andrew Trick8523b162012-02-01 23:20:51 +0000720 [(set GR32:$dst, (X86shrd GR32:$src1, GR32:$src2, CL))],
721 IIC_SHD32_REG_CL>, TB;
Chris Lattner1818dd52010-10-05 07:13:35 +0000722def SHLD64rrCL : RI<0xA5, MRMDestReg, (outs GR64:$dst),
723 (ins GR64:$src1, GR64:$src2),
Devang Patelc1215322012-01-03 18:22:10 +0000724 "shld{q}\t{%cl, $src2, $dst|$dst, $src2, CL}",
Andrew Trick8523b162012-02-01 23:20:51 +0000725 [(set GR64:$dst, (X86shld GR64:$src1, GR64:$src2, CL))],
726 IIC_SHD64_REG_CL>,
Chris Lattner1818dd52010-10-05 07:13:35 +0000727 TB;
728def SHRD64rrCL : RI<0xAD, MRMDestReg, (outs GR64:$dst),
729 (ins GR64:$src1, GR64:$src2),
Devang Patelc1215322012-01-03 18:22:10 +0000730 "shrd{q}\t{%cl, $src2, $dst|$dst, $src2, CL}",
Andrew Trick8523b162012-02-01 23:20:51 +0000731 [(set GR64:$dst, (X86shrd GR64:$src1, GR64:$src2, CL))],
732 IIC_SHD64_REG_CL>,
Chris Lattner1818dd52010-10-05 07:13:35 +0000733 TB;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000734}
735
736let isCommutable = 1 in { // These instructions commute to each other.
Chris Lattner1b3aa862010-10-05 07:00:12 +0000737def SHLD16rri8 : Ii8<0xA4, MRMDestReg,
738 (outs GR16:$dst),
739 (ins GR16:$src1, GR16:$src2, i8imm:$src3),
740 "shld{w}\t{$src3, $src2, $dst|$dst, $src2, $src3}",
741 [(set GR16:$dst, (X86shld GR16:$src1, GR16:$src2,
Andrew Trick8523b162012-02-01 23:20:51 +0000742 (i8 imm:$src3)))], IIC_SHD16_REG_IM>,
Chris Lattner1b3aa862010-10-05 07:00:12 +0000743 TB, OpSize;
744def SHRD16rri8 : Ii8<0xAC, MRMDestReg,
745 (outs GR16:$dst),
746 (ins GR16:$src1, GR16:$src2, i8imm:$src3),
747 "shrd{w}\t{$src3, $src2, $dst|$dst, $src2, $src3}",
748 [(set GR16:$dst, (X86shrd GR16:$src1, GR16:$src2,
Andrew Trick8523b162012-02-01 23:20:51 +0000749 (i8 imm:$src3)))], IIC_SHD16_REG_IM>,
Chris Lattner1b3aa862010-10-05 07:00:12 +0000750 TB, OpSize;
Chris Lattner1818dd52010-10-05 07:13:35 +0000751def SHLD32rri8 : Ii8<0xA4, MRMDestReg,
752 (outs GR32:$dst),
753 (ins GR32:$src1, GR32:$src2, i8imm:$src3),
754 "shld{l}\t{$src3, $src2, $dst|$dst, $src2, $src3}",
755 [(set GR32:$dst, (X86shld GR32:$src1, GR32:$src2,
Andrew Trick8523b162012-02-01 23:20:51 +0000756 (i8 imm:$src3)))], IIC_SHD32_REG_IM>,
Chris Lattner1818dd52010-10-05 07:13:35 +0000757 TB;
758def SHRD32rri8 : Ii8<0xAC, MRMDestReg,
759 (outs GR32:$dst),
760 (ins GR32:$src1, GR32:$src2, i8imm:$src3),
761 "shrd{l}\t{$src3, $src2, $dst|$dst, $src2, $src3}",
762 [(set GR32:$dst, (X86shrd GR32:$src1, GR32:$src2,
Andrew Trick8523b162012-02-01 23:20:51 +0000763 (i8 imm:$src3)))], IIC_SHD32_REG_IM>,
Chris Lattner1818dd52010-10-05 07:13:35 +0000764 TB;
765def SHLD64rri8 : RIi8<0xA4, MRMDestReg,
766 (outs GR64:$dst),
767 (ins GR64:$src1, GR64:$src2, i8imm:$src3),
768 "shld{q}\t{$src3, $src2, $dst|$dst, $src2, $src3}",
769 [(set GR64:$dst, (X86shld GR64:$src1, GR64:$src2,
Andrew Trick8523b162012-02-01 23:20:51 +0000770 (i8 imm:$src3)))], IIC_SHD64_REG_IM>,
Chris Lattner1818dd52010-10-05 07:13:35 +0000771 TB;
772def SHRD64rri8 : RIi8<0xAC, MRMDestReg,
773 (outs GR64:$dst),
774 (ins GR64:$src1, GR64:$src2, i8imm:$src3),
775 "shrd{q}\t{$src3, $src2, $dst|$dst, $src2, $src3}",
776 [(set GR64:$dst, (X86shrd GR64:$src1, GR64:$src2,
Andrew Trick8523b162012-02-01 23:20:51 +0000777 (i8 imm:$src3)))], IIC_SHD64_REG_IM>,
Chris Lattner1818dd52010-10-05 07:13:35 +0000778 TB;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000779}
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000780} // Constraints = "$src = $dst", SchedRW
Chris Lattner1b3aa862010-10-05 07:00:12 +0000781
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000782let SchedRW = [WriteShiftLd, WriteRMW] in {
Chris Lattner1b3aa862010-10-05 07:00:12 +0000783let Uses = [CL] in {
Chris Lattner1818dd52010-10-05 07:13:35 +0000784def SHLD16mrCL : I<0xA5, MRMDestMem, (outs), (ins i16mem:$dst, GR16:$src2),
785 "shld{w}\t{%cl, $src2, $dst|$dst, $src2, CL}",
786 [(store (X86shld (loadi16 addr:$dst), GR16:$src2, CL),
Andrew Trick8523b162012-02-01 23:20:51 +0000787 addr:$dst)], IIC_SHD16_MEM_CL>, TB, OpSize;
Chris Lattner1818dd52010-10-05 07:13:35 +0000788def SHRD16mrCL : I<0xAD, MRMDestMem, (outs), (ins i16mem:$dst, GR16:$src2),
789 "shrd{w}\t{%cl, $src2, $dst|$dst, $src2, CL}",
790 [(store (X86shrd (loadi16 addr:$dst), GR16:$src2, CL),
Andrew Trick8523b162012-02-01 23:20:51 +0000791 addr:$dst)], IIC_SHD16_MEM_CL>, TB, OpSize;
Chris Lattner1818dd52010-10-05 07:13:35 +0000792
Chris Lattner1b3aa862010-10-05 07:00:12 +0000793def SHLD32mrCL : I<0xA5, MRMDestMem, (outs), (ins i32mem:$dst, GR32:$src2),
794 "shld{l}\t{%cl, $src2, $dst|$dst, $src2, CL}",
795 [(store (X86shld (loadi32 addr:$dst), GR32:$src2, CL),
Andrew Trick8523b162012-02-01 23:20:51 +0000796 addr:$dst)], IIC_SHD32_MEM_CL>, TB;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000797def SHRD32mrCL : I<0xAD, MRMDestMem, (outs), (ins i32mem:$dst, GR32:$src2),
798 "shrd{l}\t{%cl, $src2, $dst|$dst, $src2, CL}",
799 [(store (X86shrd (loadi32 addr:$dst), GR32:$src2, CL),
Andrew Trick8523b162012-02-01 23:20:51 +0000800 addr:$dst)], IIC_SHD32_MEM_CL>, TB;
Chris Lattner1818dd52010-10-05 07:13:35 +0000801
802def SHLD64mrCL : RI<0xA5, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src2),
Devang Patelc1215322012-01-03 18:22:10 +0000803 "shld{q}\t{%cl, $src2, $dst|$dst, $src2, CL}",
Chris Lattner1818dd52010-10-05 07:13:35 +0000804 [(store (X86shld (loadi64 addr:$dst), GR64:$src2, CL),
Andrew Trick8523b162012-02-01 23:20:51 +0000805 addr:$dst)], IIC_SHD64_MEM_CL>, TB;
Chris Lattner1818dd52010-10-05 07:13:35 +0000806def SHRD64mrCL : RI<0xAD, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src2),
Devang Patelc1215322012-01-03 18:22:10 +0000807 "shrd{q}\t{%cl, $src2, $dst|$dst, $src2, CL}",
Chris Lattner1818dd52010-10-05 07:13:35 +0000808 [(store (X86shrd (loadi64 addr:$dst), GR64:$src2, CL),
Andrew Trick8523b162012-02-01 23:20:51 +0000809 addr:$dst)], IIC_SHD64_MEM_CL>, TB;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000810}
Chris Lattner1818dd52010-10-05 07:13:35 +0000811
812def SHLD16mri8 : Ii8<0xA4, MRMDestMem,
813 (outs), (ins i16mem:$dst, GR16:$src2, i8imm:$src3),
814 "shld{w}\t{$src3, $src2, $dst|$dst, $src2, $src3}",
815 [(store (X86shld (loadi16 addr:$dst), GR16:$src2,
Andrew Trick8523b162012-02-01 23:20:51 +0000816 (i8 imm:$src3)), addr:$dst)],
817 IIC_SHD16_MEM_IM>,
Chris Lattner1818dd52010-10-05 07:13:35 +0000818 TB, OpSize;
819def SHRD16mri8 : Ii8<0xAC, MRMDestMem,
820 (outs), (ins i16mem:$dst, GR16:$src2, i8imm:$src3),
821 "shrd{w}\t{$src3, $src2, $dst|$dst, $src2, $src3}",
822 [(store (X86shrd (loadi16 addr:$dst), GR16:$src2,
Andrew Trick8523b162012-02-01 23:20:51 +0000823 (i8 imm:$src3)), addr:$dst)],
824 IIC_SHD16_MEM_IM>,
Chris Lattner1818dd52010-10-05 07:13:35 +0000825 TB, OpSize;
826
Chris Lattner1b3aa862010-10-05 07:00:12 +0000827def SHLD32mri8 : Ii8<0xA4, MRMDestMem,
828 (outs), (ins i32mem:$dst, GR32:$src2, i8imm:$src3),
829 "shld{l}\t{$src3, $src2, $dst|$dst, $src2, $src3}",
830 [(store (X86shld (loadi32 addr:$dst), GR32:$src2,
Andrew Trick8523b162012-02-01 23:20:51 +0000831 (i8 imm:$src3)), addr:$dst)],
832 IIC_SHD32_MEM_IM>,
Chris Lattner1b3aa862010-10-05 07:00:12 +0000833 TB;
834def SHRD32mri8 : Ii8<0xAC, MRMDestMem,
835 (outs), (ins i32mem:$dst, GR32:$src2, i8imm:$src3),
836 "shrd{l}\t{$src3, $src2, $dst|$dst, $src2, $src3}",
837 [(store (X86shrd (loadi32 addr:$dst), GR32:$src2,
Andrew Trick8523b162012-02-01 23:20:51 +0000838 (i8 imm:$src3)), addr:$dst)],
839 IIC_SHD32_MEM_IM>,
Chris Lattner1b3aa862010-10-05 07:00:12 +0000840 TB;
841
Chris Lattner1818dd52010-10-05 07:13:35 +0000842def SHLD64mri8 : RIi8<0xA4, MRMDestMem,
843 (outs), (ins i64mem:$dst, GR64:$src2, i8imm:$src3),
844 "shld{q}\t{$src3, $src2, $dst|$dst, $src2, $src3}",
845 [(store (X86shld (loadi64 addr:$dst), GR64:$src2,
Andrew Trick8523b162012-02-01 23:20:51 +0000846 (i8 imm:$src3)), addr:$dst)],
847 IIC_SHD64_MEM_IM>,
Chris Lattner1818dd52010-10-05 07:13:35 +0000848 TB;
849def SHRD64mri8 : RIi8<0xAC, MRMDestMem,
850 (outs), (ins i64mem:$dst, GR64:$src2, i8imm:$src3),
851 "shrd{q}\t{$src3, $src2, $dst|$dst, $src2, $src3}",
852 [(store (X86shrd (loadi64 addr:$dst), GR64:$src2,
Andrew Trick8523b162012-02-01 23:20:51 +0000853 (i8 imm:$src3)), addr:$dst)],
854 IIC_SHD64_MEM_IM>,
Chris Lattner1818dd52010-10-05 07:13:35 +0000855 TB;
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000856} // SchedRW
Chris Lattner1818dd52010-10-05 07:13:35 +0000857
Chris Lattner1b3aa862010-10-05 07:00:12 +0000858} // Defs = [EFLAGS]
859
Michael Liao2de86af2012-09-26 08:24:51 +0000860def ROT32L2R_imm8 : SDNodeXForm<imm, [{
861 // Convert a ROTL shamt to a ROTR shamt on 32-bit integer.
862 return getI8Imm(32 - N->getZExtValue());
863}]>;
864
865def ROT64L2R_imm8 : SDNodeXForm<imm, [{
866 // Convert a ROTL shamt to a ROTR shamt on 64-bit integer.
867 return getI8Imm(64 - N->getZExtValue());
868}]>;
869
Craig Topperb05d9e92011-10-23 22:18:24 +0000870multiclass bmi_rotate<string asm, RegisterClass RC, X86MemOperand x86memop> {
871let neverHasSideEffects = 1 in {
872 def ri : Ii8<0xF0, MRMSrcReg, (outs RC:$dst), (ins RC:$src1, i8imm:$src2),
873 !strconcat(asm, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000874 []>, TAXD, VEX, Sched<[WriteShift]>;
Craig Topper980d5982011-10-23 07:34:00 +0000875 let mayLoad = 1 in
Craig Topperb05d9e92011-10-23 22:18:24 +0000876 def mi : Ii8<0xF0, MRMSrcMem, (outs RC:$dst),
877 (ins x86memop:$src1, i8imm:$src2),
878 !strconcat(asm, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000879 []>, TAXD, VEX, Sched<[WriteShiftLd]>;
Craig Topperb05d9e92011-10-23 22:18:24 +0000880}
881}
Craig Topper980d5982011-10-23 07:34:00 +0000882
Craig Topperb05d9e92011-10-23 22:18:24 +0000883multiclass bmi_shift<string asm, RegisterClass RC, X86MemOperand x86memop> {
884let neverHasSideEffects = 1 in {
885 def rr : I<0xF7, MRMSrcReg, (outs RC:$dst), (ins RC:$src1, RC:$src2),
886 !strconcat(asm, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"), []>,
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000887 VEX_4VOp3, Sched<[WriteShift]>;
Craig Topper980d5982011-10-23 07:34:00 +0000888 let mayLoad = 1 in
Craig Topperb05d9e92011-10-23 22:18:24 +0000889 def rm : I<0xF7, MRMSrcMem, (outs RC:$dst), (ins x86memop:$src1, RC:$src2),
890 !strconcat(asm, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"), []>,
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000891 VEX_4VOp3,
892 Sched<[WriteShiftLd,
893 // x86memop:$src1
894 ReadDefault, ReadDefault, ReadDefault, ReadDefault,
895 ReadDefault,
896 // RC:$src1
897 ReadAfterLd]>;
Craig Topperb05d9e92011-10-23 22:18:24 +0000898}
899}
900
901let Predicates = [HasBMI2] in {
902 defm RORX32 : bmi_rotate<"rorx{l}", GR32, i32mem>;
903 defm RORX64 : bmi_rotate<"rorx{q}", GR64, i64mem>, VEX_W;
904 defm SARX32 : bmi_shift<"sarx{l}", GR32, i32mem>, T8XS;
905 defm SARX64 : bmi_shift<"sarx{q}", GR64, i64mem>, T8XS, VEX_W;
906 defm SHRX32 : bmi_shift<"shrx{l}", GR32, i32mem>, T8XD;
907 defm SHRX64 : bmi_shift<"shrx{q}", GR64, i64mem>, T8XD, VEX_W;
908 defm SHLX32 : bmi_shift<"shlx{l}", GR32, i32mem>, T8, OpSize;
909 defm SHLX64 : bmi_shift<"shlx{q}", GR64, i64mem>, T8, OpSize, VEX_W;
Michael Liao2de86af2012-09-26 08:24:51 +0000910
911 // Prefer RORX which is non-destructive and doesn't update EFLAGS.
912 let AddedComplexity = 10 in {
913 def : Pat<(rotl GR32:$src, (i8 imm:$shamt)),
914 (RORX32ri GR32:$src, (ROT32L2R_imm8 imm:$shamt))>;
915 def : Pat<(rotl GR64:$src, (i8 imm:$shamt)),
916 (RORX64ri GR64:$src, (ROT64L2R_imm8 imm:$shamt))>;
917 }
918
919 def : Pat<(rotl (loadi32 addr:$src), (i8 imm:$shamt)),
920 (RORX32mi addr:$src, (ROT32L2R_imm8 imm:$shamt))>;
921 def : Pat<(rotl (loadi64 addr:$src), (i8 imm:$shamt)),
922 (RORX64mi addr:$src, (ROT64L2R_imm8 imm:$shamt))>;
Michael Liao2b425e12012-09-26 08:26:25 +0000923
924 // Prefer SARX/SHRX/SHLX over SAR/SHR/SHL with variable shift BUT not
925 // immedidate shift, i.e. the following code is considered better
926 //
927 // mov %edi, %esi
928 // shl $imm, %esi
929 // ... %edi, ...
930 //
931 // than
932 //
933 // movb $imm, %sil
934 // shlx %sil, %edi, %esi
935 // ... %edi, ...
936 //
937 let AddedComplexity = 1 in {
938 def : Pat<(sra GR32:$src1, GR8:$src2),
939 (SARX32rr GR32:$src1,
940 (INSERT_SUBREG
941 (i32 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
942 def : Pat<(sra GR64:$src1, GR8:$src2),
943 (SARX64rr GR64:$src1,
944 (INSERT_SUBREG
945 (i64 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
946
947 def : Pat<(srl GR32:$src1, GR8:$src2),
948 (SHRX32rr GR32:$src1,
949 (INSERT_SUBREG
950 (i32 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
951 def : Pat<(srl GR64:$src1, GR8:$src2),
952 (SHRX64rr GR64:$src1,
953 (INSERT_SUBREG
954 (i64 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
955
956 def : Pat<(shl GR32:$src1, GR8:$src2),
957 (SHLX32rr GR32:$src1,
958 (INSERT_SUBREG
959 (i32 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
960 def : Pat<(shl GR64:$src1, GR8:$src2),
961 (SHLX64rr GR64:$src1,
962 (INSERT_SUBREG
963 (i64 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
964 }
965
966 // Patterns on SARXrm/SHRXrm/SHLXrm are explicitly omitted to favor
967 //
968 // mov (%ecx), %esi
969 // shl $imm, $esi
970 //
971 // over
972 //
973 // movb $imm %al
974 // shlx %al, (%ecx), %esi
975 //
976 // As SARXrr/SHRXrr/SHLXrr is favored on variable shift, the peephole
977 // optimization will fold them into SARXrm/SHRXrm/SHLXrm if possible.
Craig Topper980d5982011-10-23 07:34:00 +0000978}