blob: d0bb5231a2d0033133d19715015632be68d2b45d [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),
Craig Topperefd67d42013-07-31 02:47:52 +000021 "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),
Craig Topperefd67d42013-07-31 02:47:52 +000024 "shl{w}\t{%cl, $dst|$dst, cl}",
Craig Topperfa6298a2014-02-02 09:25:09 +000025 [(set GR16:$dst, (shl GR16:$src1, CL))], IIC_SR>, OpSize16;
Chris Lattner1b3aa862010-10-05 07:00:12 +000026def SHL32rCL : I<0xD3, MRM4r, (outs GR32:$dst), (ins GR32:$src1),
Craig Topperefd67d42013-07-31 02:47:52 +000027 "shl{l}\t{%cl, $dst|$dst, cl}",
Craig Topperfa6298a2014-02-02 09:25:09 +000028 [(set GR32:$dst, (shl GR32:$src1, CL))], IIC_SR>, OpSize32;
Chris Lattner1818dd52010-10-05 07:13:35 +000029def SHL64rCL : RI<0xD3, MRM4r, (outs GR64:$dst), (ins GR64:$src1),
Craig Topperefd67d42013-07-31 02:47:52 +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>;
Nadav Rotemd61dcfc2013-05-04 23:27:32 +000037
Chris Lattner1b3aa862010-10-05 07:00:12 +000038let 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>,
Craig Topperfa6298a2014-02-02 09:25:09 +000042 OpSize16;
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}",
David Woodhouse956965c2014-01-08 12:57:40 +000045 [(set GR32:$dst, (shl GR32:$src1, (i8 imm:$src2)))], IIC_SR>,
Craig Topperfa6298a2014-02-02 09:25:09 +000046 OpSize32;
Nadav Rotemd61dcfc2013-05-04 23:27:32 +000047def SHL64ri : RIi8<0xC1, MRM4r, (outs GR64:$dst),
Chris Lattner1818dd52010-10-05 07:13:35 +000048 (ins GR64:$src1, i8imm:$src2),
49 "shl{q}\t{$src2, $dst|$dst, $src2}",
Andrew Trick8523b162012-02-01 23:20:51 +000050 [(set GR64:$dst, (shl GR64:$src1, (i8 imm:$src2)))],
51 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +000052
53// NOTE: We don't include patterns for shifts of a register by one, because
Chris Lattner1818dd52010-10-05 07:13:35 +000054// 'add reg,reg' is cheaper (and we have a Pat pattern for shift-by-one).
Craig Topper396cb792012-12-27 03:35:44 +000055let hasSideEffects = 0 in {
Chris Lattner1b3aa862010-10-05 07:00:12 +000056def SHL8r1 : I<0xD0, MRM4r, (outs GR8:$dst), (ins GR8:$src1),
Andrew Trick8523b162012-02-01 23:20:51 +000057 "shl{b}\t$dst", [], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +000058def SHL16r1 : I<0xD1, MRM4r, (outs GR16:$dst), (ins GR16:$src1),
Craig Topperfa6298a2014-02-02 09:25:09 +000059 "shl{w}\t$dst", [], IIC_SR>, OpSize16;
Chris Lattner1b3aa862010-10-05 07:00:12 +000060def SHL32r1 : I<0xD1, MRM4r, (outs GR32:$dst), (ins GR32:$src1),
Craig Topperfa6298a2014-02-02 09:25:09 +000061 "shl{l}\t$dst", [], IIC_SR>, OpSize32;
Chris Lattner1818dd52010-10-05 07:13:35 +000062def SHL64r1 : RI<0xD1, MRM4r, (outs GR64:$dst), (ins GR64:$src1),
Andrew Trick8523b162012-02-01 23:20:51 +000063 "shl{q}\t$dst", [], IIC_SR>;
Craig Topper396cb792012-12-27 03:35:44 +000064} // hasSideEffects = 0
Chris Lattner1b3aa862010-10-05 07:00:12 +000065} // isConvertibleToThreeAddress = 1
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +000066} // Constraints = "$src = $dst", SchedRW
Chris Lattner1b3aa862010-10-05 07:00:12 +000067
68
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +000069let SchedRW = [WriteShiftLd, WriteRMW] in {
Chris Lattner1818dd52010-10-05 07:13:35 +000070// FIXME: Why do we need an explicit "Uses = [CL]" when the instr has a pattern
71// using CL?
Chris Lattner1b3aa862010-10-05 07:00:12 +000072let Uses = [CL] in {
73def SHL8mCL : I<0xD2, MRM4m, (outs), (ins i8mem :$dst),
Craig Topperefd67d42013-07-31 02:47:52 +000074 "shl{b}\t{%cl, $dst|$dst, cl}",
Andrew Trick8523b162012-02-01 23:20:51 +000075 [(store (shl (loadi8 addr:$dst), CL), addr:$dst)], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +000076def SHL16mCL : I<0xD3, MRM4m, (outs), (ins i16mem:$dst),
Craig Topperefd67d42013-07-31 02:47:52 +000077 "shl{w}\t{%cl, $dst|$dst, cl}",
Andrew Trick8523b162012-02-01 23:20:51 +000078 [(store (shl (loadi16 addr:$dst), CL), addr:$dst)], IIC_SR>,
Craig Topperfa6298a2014-02-02 09:25:09 +000079 OpSize16;
Chris Lattner1b3aa862010-10-05 07:00:12 +000080def SHL32mCL : I<0xD3, MRM4m, (outs), (ins i32mem:$dst),
Craig Topperefd67d42013-07-31 02:47:52 +000081 "shl{l}\t{%cl, $dst|$dst, cl}",
David Woodhouse956965c2014-01-08 12:57:40 +000082 [(store (shl (loadi32 addr:$dst), CL), addr:$dst)], IIC_SR>,
Craig Topperfa6298a2014-02-02 09:25:09 +000083 OpSize32;
Chris Lattner1818dd52010-10-05 07:13:35 +000084def SHL64mCL : RI<0xD3, MRM4m, (outs), (ins i64mem:$dst),
Craig Topperefd67d42013-07-31 02:47:52 +000085 "shl{q}\t{%cl, $dst|$dst, cl}",
Andrew Trick8523b162012-02-01 23:20:51 +000086 [(store (shl (loadi64 addr:$dst), CL), addr:$dst)], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +000087}
88def SHL8mi : Ii8<0xC0, MRM4m, (outs), (ins i8mem :$dst, i8imm:$src),
89 "shl{b}\t{$src, $dst|$dst, $src}",
Andrew Trick8523b162012-02-01 23:20:51 +000090 [(store (shl (loadi8 addr:$dst), (i8 imm:$src)), addr:$dst)],
91 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +000092def SHL16mi : Ii8<0xC1, MRM4m, (outs), (ins i16mem:$dst, i8imm:$src),
93 "shl{w}\t{$src, $dst|$dst, $src}",
Andrew Trick8523b162012-02-01 23:20:51 +000094 [(store (shl (loadi16 addr:$dst), (i8 imm:$src)), addr:$dst)],
Craig Topperfa6298a2014-02-02 09:25:09 +000095 IIC_SR>, OpSize16;
Chris Lattner1b3aa862010-10-05 07:00:12 +000096def SHL32mi : Ii8<0xC1, MRM4m, (outs), (ins i32mem:$dst, i8imm:$src),
97 "shl{l}\t{$src, $dst|$dst, $src}",
Andrew Trick8523b162012-02-01 23:20:51 +000098 [(store (shl (loadi32 addr:$dst), (i8 imm:$src)), addr:$dst)],
Craig Topperfa6298a2014-02-02 09:25:09 +000099 IIC_SR>, OpSize32;
Chris Lattner1818dd52010-10-05 07:13:35 +0000100def SHL64mi : RIi8<0xC1, MRM4m, (outs), (ins i64mem:$dst, i8imm:$src),
101 "shl{q}\t{$src, $dst|$dst, $src}",
Andrew Trick8523b162012-02-01 23:20:51 +0000102 [(store (shl (loadi64 addr:$dst), (i8 imm:$src)), addr:$dst)],
103 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000104
105// Shift by 1
106def SHL8m1 : I<0xD0, MRM4m, (outs), (ins i8mem :$dst),
107 "shl{b}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000108 [(store (shl (loadi8 addr:$dst), (i8 1)), addr:$dst)],
109 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000110def SHL16m1 : I<0xD1, MRM4m, (outs), (ins i16mem:$dst),
111 "shl{w}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000112 [(store (shl (loadi16 addr:$dst), (i8 1)), addr:$dst)],
Craig Topperfa6298a2014-02-02 09:25:09 +0000113 IIC_SR>, OpSize16;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000114def 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)],
Craig Topperfa6298a2014-02-02 09:25:09 +0000117 IIC_SR>, OpSize32;
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),
Craig Topperefd67d42013-07-31 02:47:52 +0000127 "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),
Craig Topperefd67d42013-07-31 02:47:52 +0000130 "shr{w}\t{%cl, $dst|$dst, cl}",
Craig Topperfa6298a2014-02-02 09:25:09 +0000131 [(set GR16:$dst, (srl GR16:$src1, CL))], IIC_SR>, OpSize16;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000132def SHR32rCL : I<0xD3, MRM5r, (outs GR32:$dst), (ins GR32:$src1),
Craig Topperefd67d42013-07-31 02:47:52 +0000133 "shr{l}\t{%cl, $dst|$dst, cl}",
Craig Topperfa6298a2014-02-02 09:25:09 +0000134 [(set GR32:$dst, (srl GR32:$src1, CL))], IIC_SR>, OpSize32;
Chris Lattner1818dd52010-10-05 07:13:35 +0000135def SHR64rCL : RI<0xD3, MRM5r, (outs GR64:$dst), (ins GR64:$src1),
Craig Topperefd67d42013-07-31 02:47:52 +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)))],
Craig Topperfa6298a2014-02-02 09:25:09 +0000146 IIC_SR>, OpSize16;
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)))],
Craig Topperfa6298a2014-02-02 09:25:09 +0000150 IIC_SR>, OpSize32;
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",
Craig Topperfa6298a2014-02-02 09:25:09 +0000161 [(set GR16:$dst, (srl GR16:$src1, (i8 1)))], IIC_SR>, OpSize16;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000162def SHR32r1 : I<0xD1, MRM5r, (outs GR32:$dst), (ins GR32:$src1),
163 "shr{l}\t$dst",
Craig Topperfa6298a2014-02-02 09:25:09 +0000164 [(set GR32:$dst, (srl GR32:$src1, (i8 1)))], IIC_SR>, OpSize32;
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),
Craig Topperefd67d42013-07-31 02:47:52 +0000174 "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),
Craig Topperefd67d42013-07-31 02:47:52 +0000177 "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>,
Craig Topperfa6298a2014-02-02 09:25:09 +0000179 OpSize16;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000180def SHR32mCL : I<0xD3, MRM5m, (outs), (ins i32mem:$dst),
Craig Topperefd67d42013-07-31 02:47:52 +0000181 "shr{l}\t{%cl, $dst|$dst, cl}",
David Woodhouse956965c2014-01-08 12:57:40 +0000182 [(store (srl (loadi32 addr:$dst), CL), addr:$dst)], IIC_SR>,
Craig Topperfa6298a2014-02-02 09:25:09 +0000183 OpSize32;
Chris Lattner1818dd52010-10-05 07:13:35 +0000184def SHR64mCL : RI<0xD3, MRM5m, (outs), (ins i64mem:$dst),
Craig Topperefd67d42013-07-31 02:47:52 +0000185 "shr{q}\t{%cl, $dst|$dst, cl}",
Andrew Trick8523b162012-02-01 23:20:51 +0000186 [(store (srl (loadi64 addr:$dst), CL), addr:$dst)], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000187}
188def SHR8mi : Ii8<0xC0, MRM5m, (outs), (ins i8mem :$dst, i8imm:$src),
189 "shr{b}\t{$src, $dst|$dst, $src}",
Andrew Trick8523b162012-02-01 23:20:51 +0000190 [(store (srl (loadi8 addr:$dst), (i8 imm:$src)), addr:$dst)],
191 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000192def SHR16mi : Ii8<0xC1, MRM5m, (outs), (ins i16mem:$dst, i8imm:$src),
193 "shr{w}\t{$src, $dst|$dst, $src}",
Andrew Trick8523b162012-02-01 23:20:51 +0000194 [(store (srl (loadi16 addr:$dst), (i8 imm:$src)), addr:$dst)],
Craig Topperfa6298a2014-02-02 09:25:09 +0000195 IIC_SR>, OpSize16;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000196def 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)],
Craig Topperfa6298a2014-02-02 09:25:09 +0000199 IIC_SR>, OpSize32;
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)],
Craig Topperfa6298a2014-02-02 09:25:09 +0000213 IIC_SR>, OpSize16;
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)],
Craig Topperfa6298a2014-02-02 09:25:09 +0000217 IIC_SR>, OpSize32;
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),
Craig Topperefd67d42013-07-31 02:47:52 +0000227 "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),
Craig Topperefd67d42013-07-31 02:47:52 +0000231 "sar{w}\t{%cl, $dst|$dst, cl}",
Andrew Trick8523b162012-02-01 23:20:51 +0000232 [(set GR16:$dst, (sra GR16:$src1, CL))],
Craig Topperfa6298a2014-02-02 09:25:09 +0000233 IIC_SR>, OpSize16;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000234def SAR32rCL : I<0xD3, MRM7r, (outs GR32:$dst), (ins GR32:$src1),
Craig Topperefd67d42013-07-31 02:47:52 +0000235 "sar{l}\t{%cl, $dst|$dst, cl}",
Andrew Trick8523b162012-02-01 23:20:51 +0000236 [(set GR32:$dst, (sra GR32:$src1, CL))],
Craig Topperfa6298a2014-02-02 09:25:09 +0000237 IIC_SR>, OpSize32;
Chris Lattner1818dd52010-10-05 07:13:35 +0000238def SAR64rCL : RI<0xD3, MRM7r, (outs GR64:$dst), (ins GR64:$src1),
Craig Topperefd67d42013-07-31 02:47:52 +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)))],
Craig Topperfa6298a2014-02-02 09:25:09 +0000251 IIC_SR>, OpSize16;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000252def SAR32ri : Ii8<0xC1, MRM7r, (outs GR32:$dst), (ins GR32:$src1, i8imm:$src2),
253 "sar{l}\t{$src2, $dst|$dst, $src2}",
Andrew Trick8523b162012-02-01 23:20:51 +0000254 [(set GR32:$dst, (sra GR32:$src1, (i8 imm:$src2)))],
Craig Topperfa6298a2014-02-02 09:25:09 +0000255 IIC_SR>, OpSize32;
Chris Lattner1818dd52010-10-05 07:13:35 +0000256def SAR64ri : RIi8<0xC1, MRM7r, (outs GR64:$dst),
257 (ins GR64:$src1, i8imm:$src2),
258 "sar{q}\t{$src2, $dst|$dst, $src2}",
Andrew Trick8523b162012-02-01 23:20:51 +0000259 [(set GR64:$dst, (sra GR64:$src1, (i8 imm:$src2)))],
260 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000261
262// Shift by 1
263def SAR8r1 : I<0xD0, MRM7r, (outs GR8 :$dst), (ins GR8 :$src1),
264 "sar{b}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000265 [(set GR8:$dst, (sra GR8:$src1, (i8 1)))],
266 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000267def SAR16r1 : I<0xD1, MRM7r, (outs GR16:$dst), (ins GR16:$src1),
268 "sar{w}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000269 [(set GR16:$dst, (sra GR16:$src1, (i8 1)))],
Craig Topperfa6298a2014-02-02 09:25:09 +0000270 IIC_SR>, OpSize16;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000271def SAR32r1 : I<0xD1, MRM7r, (outs GR32:$dst), (ins GR32:$src1),
272 "sar{l}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000273 [(set GR32:$dst, (sra GR32:$src1, (i8 1)))],
Craig Topperfa6298a2014-02-02 09:25:09 +0000274 IIC_SR>, OpSize32;
Chris Lattner1818dd52010-10-05 07:13:35 +0000275def SAR64r1 : RI<0xD1, MRM7r, (outs GR64:$dst), (ins GR64:$src1),
276 "sar{q}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000277 [(set GR64:$dst, (sra GR64:$src1, (i8 1)))],
278 IIC_SR>;
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000279} // Constraints = "$src = $dst", SchedRW
Chris Lattner1b3aa862010-10-05 07:00:12 +0000280
281
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000282let SchedRW = [WriteShiftLd, WriteRMW] in {
Chris Lattner1b3aa862010-10-05 07:00:12 +0000283let Uses = [CL] in {
284def SAR8mCL : I<0xD2, MRM7m, (outs), (ins i8mem :$dst),
Craig Topperefd67d42013-07-31 02:47:52 +0000285 "sar{b}\t{%cl, $dst|$dst, cl}",
Andrew Trick8523b162012-02-01 23:20:51 +0000286 [(store (sra (loadi8 addr:$dst), CL), addr:$dst)],
287 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000288def SAR16mCL : I<0xD3, MRM7m, (outs), (ins i16mem:$dst),
Craig Topperefd67d42013-07-31 02:47:52 +0000289 "sar{w}\t{%cl, $dst|$dst, cl}",
Andrew Trick8523b162012-02-01 23:20:51 +0000290 [(store (sra (loadi16 addr:$dst), CL), addr:$dst)],
Craig Topperfa6298a2014-02-02 09:25:09 +0000291 IIC_SR>, OpSize16;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000292def SAR32mCL : I<0xD3, MRM7m, (outs), (ins i32mem:$dst),
Craig Topperefd67d42013-07-31 02:47:52 +0000293 "sar{l}\t{%cl, $dst|$dst, cl}",
Andrew Trick8523b162012-02-01 23:20:51 +0000294 [(store (sra (loadi32 addr:$dst), CL), addr:$dst)],
Craig Topperfa6298a2014-02-02 09:25:09 +0000295 IIC_SR>, OpSize32;
Chris Lattner1818dd52010-10-05 07:13:35 +0000296def SAR64mCL : RI<0xD3, MRM7m, (outs), (ins i64mem:$dst),
Craig Topperefd67d42013-07-31 02:47:52 +0000297 "sar{q}\t{%cl, $dst|$dst, cl}",
Andrew Trick8523b162012-02-01 23:20:51 +0000298 [(store (sra (loadi64 addr:$dst), CL), addr:$dst)],
299 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000300}
301def SAR8mi : Ii8<0xC0, MRM7m, (outs), (ins i8mem :$dst, i8imm:$src),
302 "sar{b}\t{$src, $dst|$dst, $src}",
Andrew Trick8523b162012-02-01 23:20:51 +0000303 [(store (sra (loadi8 addr:$dst), (i8 imm:$src)), addr:$dst)],
304 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000305def SAR16mi : Ii8<0xC1, MRM7m, (outs), (ins i16mem:$dst, i8imm:$src),
306 "sar{w}\t{$src, $dst|$dst, $src}",
Andrew Trick8523b162012-02-01 23:20:51 +0000307 [(store (sra (loadi16 addr:$dst), (i8 imm:$src)), addr:$dst)],
Craig Topperfa6298a2014-02-02 09:25:09 +0000308 IIC_SR>, OpSize16;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000309def SAR32mi : Ii8<0xC1, MRM7m, (outs), (ins i32mem:$dst, i8imm:$src),
310 "sar{l}\t{$src, $dst|$dst, $src}",
Andrew Trick8523b162012-02-01 23:20:51 +0000311 [(store (sra (loadi32 addr:$dst), (i8 imm:$src)), addr:$dst)],
Craig Topperfa6298a2014-02-02 09:25:09 +0000312 IIC_SR>, OpSize32;
Chris Lattner1818dd52010-10-05 07:13:35 +0000313def SAR64mi : RIi8<0xC1, MRM7m, (outs), (ins i64mem:$dst, i8imm:$src),
314 "sar{q}\t{$src, $dst|$dst, $src}",
Andrew Trick8523b162012-02-01 23:20:51 +0000315 [(store (sra (loadi64 addr:$dst), (i8 imm:$src)), addr:$dst)],
316 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000317
318// Shift by 1
319def SAR8m1 : I<0xD0, MRM7m, (outs), (ins i8mem :$dst),
320 "sar{b}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000321 [(store (sra (loadi8 addr:$dst), (i8 1)), addr:$dst)],
322 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000323def SAR16m1 : I<0xD1, MRM7m, (outs), (ins i16mem:$dst),
324 "sar{w}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000325 [(store (sra (loadi16 addr:$dst), (i8 1)), addr:$dst)],
Craig Topperfa6298a2014-02-02 09:25:09 +0000326 IIC_SR>, OpSize16;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000327def SAR32m1 : I<0xD1, MRM7m, (outs), (ins i32mem:$dst),
328 "sar{l}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000329 [(store (sra (loadi32 addr:$dst), (i8 1)), addr:$dst)],
Craig Topperfa6298a2014-02-02 09:25:09 +0000330 IIC_SR>, OpSize32;
Chris Lattner1818dd52010-10-05 07:13:35 +0000331def SAR64m1 : RI<0xD1, MRM7m, (outs), (ins i64mem:$dst),
332 "sar{q}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000333 [(store (sra (loadi64 addr:$dst), (i8 1)), addr:$dst)],
334 IIC_SR>;
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000335} // SchedRW
Chris Lattner1b3aa862010-10-05 07:00:12 +0000336
337//===----------------------------------------------------------------------===//
338// Rotate instructions
339//===----------------------------------------------------------------------===//
340
Craig Topper396cb792012-12-27 03:35:44 +0000341let hasSideEffects = 0 in {
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000342let Constraints = "$src1 = $dst", SchedRW = [WriteShift] in {
Chris Lattner1b3aa862010-10-05 07:00:12 +0000343def RCL8r1 : I<0xD0, MRM2r, (outs GR8:$dst), (ins GR8:$src1),
Andrew Trick8523b162012-02-01 23:20:51 +0000344 "rcl{b}\t$dst", [], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000345def RCL8ri : Ii8<0xC0, MRM2r, (outs GR8:$dst), (ins GR8:$src1, i8imm:$cnt),
Andrew Trick8523b162012-02-01 23:20:51 +0000346 "rcl{b}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000347let Uses = [CL] in
348def RCL8rCL : I<0xD2, MRM2r, (outs GR8:$dst), (ins GR8:$src1),
Craig Topperefd67d42013-07-31 02:47:52 +0000349 "rcl{b}\t{%cl, $dst|$dst, cl}", [], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000350
351def RCL16r1 : I<0xD1, MRM2r, (outs GR16:$dst), (ins GR16:$src1),
Craig Topperfa6298a2014-02-02 09:25:09 +0000352 "rcl{w}\t$dst", [], IIC_SR>, OpSize16;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000353def RCL16ri : Ii8<0xC1, MRM2r, (outs GR16:$dst), (ins GR16:$src1, i8imm:$cnt),
Craig Topperfa6298a2014-02-02 09:25:09 +0000354 "rcl{w}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>, OpSize16;
Chris Lattner1818dd52010-10-05 07:13:35 +0000355let Uses = [CL] in
356def RCL16rCL : I<0xD3, MRM2r, (outs GR16:$dst), (ins GR16:$src1),
Craig Topperfa6298a2014-02-02 09:25:09 +0000357 "rcl{w}\t{%cl, $dst|$dst, cl}", [], IIC_SR>, OpSize16;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000358
359def RCL32r1 : I<0xD1, MRM2r, (outs GR32:$dst), (ins GR32:$src1),
Craig Topperfa6298a2014-02-02 09:25:09 +0000360 "rcl{l}\t$dst", [], IIC_SR>, OpSize32;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000361def RCL32ri : Ii8<0xC1, MRM2r, (outs GR32:$dst), (ins GR32:$src1, i8imm:$cnt),
Craig Topperfa6298a2014-02-02 09:25:09 +0000362 "rcl{l}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>, OpSize32;
Chris Lattner1818dd52010-10-05 07:13:35 +0000363let Uses = [CL] in
364def RCL32rCL : I<0xD3, MRM2r, (outs GR32:$dst), (ins GR32:$src1),
Craig Topperfa6298a2014-02-02 09:25:09 +0000365 "rcl{l}\t{%cl, $dst|$dst, cl}", [], IIC_SR>, OpSize32;
Chris Lattner1818dd52010-10-05 07:13:35 +0000366
367
368def RCL64r1 : RI<0xD1, MRM2r, (outs GR64:$dst), (ins GR64:$src1),
Andrew Trick8523b162012-02-01 23:20:51 +0000369 "rcl{q}\t$dst", [], IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000370def RCL64ri : RIi8<0xC1, MRM2r, (outs GR64:$dst), (ins GR64:$src1, i8imm:$cnt),
Andrew Trick8523b162012-02-01 23:20:51 +0000371 "rcl{q}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000372let Uses = [CL] in
373def RCL64rCL : RI<0xD3, MRM2r, (outs GR64:$dst), (ins GR64:$src1),
Craig Topperefd67d42013-07-31 02:47:52 +0000374 "rcl{q}\t{%cl, $dst|$dst, cl}", [], IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000375
376
Chris Lattner1b3aa862010-10-05 07:00:12 +0000377def RCR8r1 : I<0xD0, MRM3r, (outs GR8:$dst), (ins GR8:$src1),
Andrew Trick8523b162012-02-01 23:20:51 +0000378 "rcr{b}\t$dst", [], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000379def RCR8ri : Ii8<0xC0, MRM3r, (outs GR8:$dst), (ins GR8:$src1, i8imm:$cnt),
Andrew Trick8523b162012-02-01 23:20:51 +0000380 "rcr{b}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000381let Uses = [CL] in
382def RCR8rCL : I<0xD2, MRM3r, (outs GR8:$dst), (ins GR8:$src1),
Craig Topperefd67d42013-07-31 02:47:52 +0000383 "rcr{b}\t{%cl, $dst|$dst, cl}", [], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000384
385def RCR16r1 : I<0xD1, MRM3r, (outs GR16:$dst), (ins GR16:$src1),
Craig Topperfa6298a2014-02-02 09:25:09 +0000386 "rcr{w}\t$dst", [], IIC_SR>, OpSize16;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000387def RCR16ri : Ii8<0xC1, MRM3r, (outs GR16:$dst), (ins GR16:$src1, i8imm:$cnt),
Craig Topperfa6298a2014-02-02 09:25:09 +0000388 "rcr{w}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>, OpSize16;
Chris Lattner1818dd52010-10-05 07:13:35 +0000389let Uses = [CL] in
390def RCR16rCL : I<0xD3, MRM3r, (outs GR16:$dst), (ins GR16:$src1),
Craig Topperfa6298a2014-02-02 09:25:09 +0000391 "rcr{w}\t{%cl, $dst|$dst, cl}", [], IIC_SR>, OpSize16;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000392
393def RCR32r1 : I<0xD1, MRM3r, (outs GR32:$dst), (ins GR32:$src1),
Craig Topperfa6298a2014-02-02 09:25:09 +0000394 "rcr{l}\t$dst", [], IIC_SR>, OpSize32;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000395def RCR32ri : Ii8<0xC1, MRM3r, (outs GR32:$dst), (ins GR32:$src1, i8imm:$cnt),
Craig Topperfa6298a2014-02-02 09:25:09 +0000396 "rcr{l}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>, OpSize32;
Chris Lattner1818dd52010-10-05 07:13:35 +0000397let Uses = [CL] in
398def RCR32rCL : I<0xD3, MRM3r, (outs GR32:$dst), (ins GR32:$src1),
Craig Topperfa6298a2014-02-02 09:25:09 +0000399 "rcr{l}\t{%cl, $dst|$dst, cl}", [], IIC_SR>, OpSize32;
Chris Lattner1818dd52010-10-05 07:13:35 +0000400
401def RCR64r1 : RI<0xD1, MRM3r, (outs GR64:$dst), (ins GR64:$src1),
Andrew Trick8523b162012-02-01 23:20:51 +0000402 "rcr{q}\t$dst", [], IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000403def RCR64ri : RIi8<0xC1, MRM3r, (outs GR64:$dst), (ins GR64:$src1, i8imm:$cnt),
Andrew Trick8523b162012-02-01 23:20:51 +0000404 "rcr{q}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000405let Uses = [CL] in
406def RCR64rCL : RI<0xD3, MRM3r, (outs GR64:$dst), (ins GR64:$src1),
Craig Topperefd67d42013-07-31 02:47:52 +0000407 "rcr{q}\t{%cl, $dst|$dst, cl}", [], IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000408
Chris Lattner1b3aa862010-10-05 07:00:12 +0000409} // Constraints = "$src = $dst"
410
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000411let SchedRW = [WriteShiftLd, WriteRMW] in {
Chris Lattner1b3aa862010-10-05 07:00:12 +0000412def RCL8m1 : I<0xD0, MRM2m, (outs), (ins i8mem:$dst),
Andrew Trick8523b162012-02-01 23:20:51 +0000413 "rcl{b}\t$dst", [], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000414def RCL8mi : Ii8<0xC0, MRM2m, (outs), (ins i8mem:$dst, i8imm:$cnt),
Andrew Trick8523b162012-02-01 23:20:51 +0000415 "rcl{b}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000416def RCL16m1 : I<0xD1, MRM2m, (outs), (ins i16mem:$dst),
Craig Topperfa6298a2014-02-02 09:25:09 +0000417 "rcl{w}\t$dst", [], IIC_SR>, OpSize16;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000418def RCL16mi : Ii8<0xC1, MRM2m, (outs), (ins i16mem:$dst, i8imm:$cnt),
Craig Topperfa6298a2014-02-02 09:25:09 +0000419 "rcl{w}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>, OpSize16;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000420def RCL32m1 : I<0xD1, MRM2m, (outs), (ins i32mem:$dst),
Craig Topperfa6298a2014-02-02 09:25:09 +0000421 "rcl{l}\t$dst", [], IIC_SR>, OpSize32;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000422def RCL32mi : Ii8<0xC1, MRM2m, (outs), (ins i32mem:$dst, i8imm:$cnt),
Craig Topperfa6298a2014-02-02 09:25:09 +0000423 "rcl{l}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>, OpSize32;
Chris Lattner1818dd52010-10-05 07:13:35 +0000424def RCL64m1 : RI<0xD1, MRM2m, (outs), (ins i64mem:$dst),
Andrew Trick8523b162012-02-01 23:20:51 +0000425 "rcl{q}\t$dst", [], IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000426def RCL64mi : RIi8<0xC1, MRM2m, (outs), (ins i64mem:$dst, i8imm:$cnt),
Andrew Trick8523b162012-02-01 23:20:51 +0000427 "rcl{q}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000428
Chris Lattner1b3aa862010-10-05 07:00:12 +0000429def RCR8m1 : I<0xD0, MRM3m, (outs), (ins i8mem:$dst),
Andrew Trick8523b162012-02-01 23:20:51 +0000430 "rcr{b}\t$dst", [], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000431def RCR8mi : Ii8<0xC0, MRM3m, (outs), (ins i8mem:$dst, i8imm:$cnt),
Andrew Trick8523b162012-02-01 23:20:51 +0000432 "rcr{b}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000433def RCR16m1 : I<0xD1, MRM3m, (outs), (ins i16mem:$dst),
Craig Topperfa6298a2014-02-02 09:25:09 +0000434 "rcr{w}\t$dst", [], IIC_SR>, OpSize16;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000435def RCR16mi : Ii8<0xC1, MRM3m, (outs), (ins i16mem:$dst, i8imm:$cnt),
Craig Topperfa6298a2014-02-02 09:25:09 +0000436 "rcr{w}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>, OpSize16;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000437def RCR32m1 : I<0xD1, MRM3m, (outs), (ins i32mem:$dst),
Craig Topperfa6298a2014-02-02 09:25:09 +0000438 "rcr{l}\t$dst", [], IIC_SR>, OpSize32;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000439def RCR32mi : Ii8<0xC1, MRM3m, (outs), (ins i32mem:$dst, i8imm:$cnt),
Craig Topperfa6298a2014-02-02 09:25:09 +0000440 "rcr{l}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>, OpSize32;
Chris Lattner1818dd52010-10-05 07:13:35 +0000441def RCR64m1 : RI<0xD1, MRM3m, (outs), (ins i64mem:$dst),
Andrew Trick8523b162012-02-01 23:20:51 +0000442 "rcr{q}\t$dst", [], IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000443def RCR64mi : RIi8<0xC1, MRM3m, (outs), (ins i64mem:$dst, i8imm:$cnt),
Andrew Trick8523b162012-02-01 23:20:51 +0000444 "rcr{q}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000445
446let Uses = [CL] in {
447def RCL8mCL : I<0xD2, MRM2m, (outs), (ins i8mem:$dst),
Craig Topperefd67d42013-07-31 02:47:52 +0000448 "rcl{b}\t{%cl, $dst|$dst, cl}", [], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000449def RCL16mCL : I<0xD3, MRM2m, (outs), (ins i16mem:$dst),
Craig Topperfa6298a2014-02-02 09:25:09 +0000450 "rcl{w}\t{%cl, $dst|$dst, cl}", [], IIC_SR>, OpSize16;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000451def RCL32mCL : I<0xD3, MRM2m, (outs), (ins i32mem:$dst),
Craig Topperfa6298a2014-02-02 09:25:09 +0000452 "rcl{l}\t{%cl, $dst|$dst, cl}", [], IIC_SR>, OpSize32;
Chris Lattner1818dd52010-10-05 07:13:35 +0000453def RCL64mCL : RI<0xD3, MRM2m, (outs), (ins i64mem:$dst),
Craig Topperefd67d42013-07-31 02:47:52 +0000454 "rcl{q}\t{%cl, $dst|$dst, cl}", [], IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000455
Chris Lattner1b3aa862010-10-05 07:00:12 +0000456def RCR8mCL : I<0xD2, MRM3m, (outs), (ins i8mem:$dst),
Craig Topperefd67d42013-07-31 02:47:52 +0000457 "rcr{b}\t{%cl, $dst|$dst, cl}", [], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000458def RCR16mCL : I<0xD3, MRM3m, (outs), (ins i16mem:$dst),
Craig Topperfa6298a2014-02-02 09:25:09 +0000459 "rcr{w}\t{%cl, $dst|$dst, cl}", [], IIC_SR>, OpSize16;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000460def RCR32mCL : I<0xD3, MRM3m, (outs), (ins i32mem:$dst),
Craig Topperfa6298a2014-02-02 09:25:09 +0000461 "rcr{l}\t{%cl, $dst|$dst, cl}", [], IIC_SR>, OpSize32;
Chris Lattner1818dd52010-10-05 07:13:35 +0000462def RCR64mCL : RI<0xD3, MRM3m, (outs), (ins i64mem:$dst),
Craig Topperefd67d42013-07-31 02:47:52 +0000463 "rcr{q}\t{%cl, $dst|$dst, cl}", [], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000464}
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000465} // SchedRW
Craig Topper396cb792012-12-27 03:35:44 +0000466} // hasSideEffects = 0
Chris Lattner1b3aa862010-10-05 07:00:12 +0000467
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000468let Constraints = "$src1 = $dst", SchedRW = [WriteShift] in {
Chris Lattner1b3aa862010-10-05 07:00:12 +0000469// FIXME: provide shorter instructions when imm8 == 1
470let Uses = [CL] in {
471def ROL8rCL : I<0xD2, MRM0r, (outs GR8 :$dst), (ins GR8 :$src1),
Craig Topperefd67d42013-07-31 02:47:52 +0000472 "rol{b}\t{%cl, $dst|$dst, cl}",
Andrew Trick8523b162012-02-01 23:20:51 +0000473 [(set GR8:$dst, (rotl GR8:$src1, CL))], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000474def ROL16rCL : I<0xD3, MRM0r, (outs GR16:$dst), (ins GR16:$src1),
Craig Topperefd67d42013-07-31 02:47:52 +0000475 "rol{w}\t{%cl, $dst|$dst, cl}",
Craig Topperfa6298a2014-02-02 09:25:09 +0000476 [(set GR16:$dst, (rotl GR16:$src1, CL))], IIC_SR>, OpSize16;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000477def ROL32rCL : I<0xD3, MRM0r, (outs GR32:$dst), (ins GR32:$src1),
Craig Topperefd67d42013-07-31 02:47:52 +0000478 "rol{l}\t{%cl, $dst|$dst, cl}",
Craig Topperfa6298a2014-02-02 09:25:09 +0000479 [(set GR32:$dst, (rotl GR32:$src1, CL))], IIC_SR>, OpSize32;
Chris Lattner1818dd52010-10-05 07:13:35 +0000480def ROL64rCL : RI<0xD3, MRM0r, (outs GR64:$dst), (ins GR64:$src1),
Craig Topperefd67d42013-07-31 02:47:52 +0000481 "rol{q}\t{%cl, $dst|$dst, cl}",
Andrew Trick8523b162012-02-01 23:20:51 +0000482 [(set GR64:$dst, (rotl GR64:$src1, CL))], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000483}
484
485def ROL8ri : Ii8<0xC0, MRM0r, (outs GR8 :$dst), (ins GR8 :$src1, i8imm:$src2),
486 "rol{b}\t{$src2, $dst|$dst, $src2}",
Andrew Trick8523b162012-02-01 23:20:51 +0000487 [(set GR8:$dst, (rotl GR8:$src1, (i8 imm:$src2)))], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000488def ROL16ri : Ii8<0xC1, MRM0r, (outs GR16:$dst), (ins GR16:$src1, i8imm:$src2),
489 "rol{w}\t{$src2, $dst|$dst, $src2}",
Andrew Trick8523b162012-02-01 23:20:51 +0000490 [(set GR16:$dst, (rotl GR16:$src1, (i8 imm:$src2)))],
Craig Topperfa6298a2014-02-02 09:25:09 +0000491 IIC_SR>, OpSize16;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000492def ROL32ri : Ii8<0xC1, MRM0r, (outs GR32:$dst), (ins GR32:$src1, i8imm:$src2),
493 "rol{l}\t{$src2, $dst|$dst, $src2}",
Andrew Trick8523b162012-02-01 23:20:51 +0000494 [(set GR32:$dst, (rotl GR32:$src1, (i8 imm:$src2)))],
Craig Topperfa6298a2014-02-02 09:25:09 +0000495 IIC_SR>, OpSize32;
Chris Lattner1818dd52010-10-05 07:13:35 +0000496def ROL64ri : RIi8<0xC1, MRM0r, (outs GR64:$dst),
497 (ins GR64:$src1, i8imm:$src2),
498 "rol{q}\t{$src2, $dst|$dst, $src2}",
Andrew Trick8523b162012-02-01 23:20:51 +0000499 [(set GR64:$dst, (rotl GR64:$src1, (i8 imm:$src2)))],
500 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000501
502// Rotate by 1
503def ROL8r1 : I<0xD0, MRM0r, (outs GR8 :$dst), (ins GR8 :$src1),
504 "rol{b}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000505 [(set GR8:$dst, (rotl GR8:$src1, (i8 1)))],
506 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000507def ROL16r1 : I<0xD1, MRM0r, (outs GR16:$dst), (ins GR16:$src1),
508 "rol{w}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000509 [(set GR16:$dst, (rotl GR16:$src1, (i8 1)))],
Craig Topperfa6298a2014-02-02 09:25:09 +0000510 IIC_SR>, OpSize16;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000511def ROL32r1 : I<0xD1, MRM0r, (outs GR32:$dst), (ins GR32:$src1),
512 "rol{l}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000513 [(set GR32:$dst, (rotl GR32:$src1, (i8 1)))],
Craig Topperfa6298a2014-02-02 09:25:09 +0000514 IIC_SR>, OpSize32;
Chris Lattner1818dd52010-10-05 07:13:35 +0000515def ROL64r1 : RI<0xD1, MRM0r, (outs GR64:$dst), (ins GR64:$src1),
516 "rol{q}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000517 [(set GR64:$dst, (rotl GR64:$src1, (i8 1)))],
518 IIC_SR>;
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000519} // Constraints = "$src = $dst", SchedRW
Chris Lattner1b3aa862010-10-05 07:00:12 +0000520
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000521let SchedRW = [WriteShiftLd, WriteRMW] in {
Chris Lattner1b3aa862010-10-05 07:00:12 +0000522let Uses = [CL] in {
523def ROL8mCL : I<0xD2, MRM0m, (outs), (ins i8mem :$dst),
Craig Topperefd67d42013-07-31 02:47:52 +0000524 "rol{b}\t{%cl, $dst|$dst, cl}",
Andrew Trick8523b162012-02-01 23:20:51 +0000525 [(store (rotl (loadi8 addr:$dst), CL), addr:$dst)],
526 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000527def ROL16mCL : I<0xD3, MRM0m, (outs), (ins i16mem:$dst),
Craig Topperefd67d42013-07-31 02:47:52 +0000528 "rol{w}\t{%cl, $dst|$dst, cl}",
Andrew Trick8523b162012-02-01 23:20:51 +0000529 [(store (rotl (loadi16 addr:$dst), CL), addr:$dst)],
Craig Topperfa6298a2014-02-02 09:25:09 +0000530 IIC_SR>, OpSize16;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000531def ROL32mCL : I<0xD3, MRM0m, (outs), (ins i32mem:$dst),
Craig Topperefd67d42013-07-31 02:47:52 +0000532 "rol{l}\t{%cl, $dst|$dst, cl}",
Andrew Trick8523b162012-02-01 23:20:51 +0000533 [(store (rotl (loadi32 addr:$dst), CL), addr:$dst)],
Craig Topperfa6298a2014-02-02 09:25:09 +0000534 IIC_SR>, OpSize32;
Chris Lattner1818dd52010-10-05 07:13:35 +0000535def ROL64mCL : RI<0xD3, MRM0m, (outs), (ins i64mem:$dst),
Craig Topperefd67d42013-07-31 02:47:52 +0000536 "rol{q}\t{%cl, $dst|$dst, cl}",
Andrew Trick8523b162012-02-01 23:20:51 +0000537 [(store (rotl (loadi64 addr:$dst), CL), addr:$dst)],
538 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000539}
Chris Lattner1818dd52010-10-05 07:13:35 +0000540def ROL8mi : Ii8<0xC0, MRM0m, (outs), (ins i8mem :$dst, i8imm:$src1),
541 "rol{b}\t{$src1, $dst|$dst, $src1}",
Andrew Trick8523b162012-02-01 23:20:51 +0000542 [(store (rotl (loadi8 addr:$dst), (i8 imm:$src1)), addr:$dst)],
543 IIC_SR>;
Chris Lattner1818dd52010-10-05 07:13:35 +0000544def ROL16mi : Ii8<0xC1, MRM0m, (outs), (ins i16mem:$dst, i8imm:$src1),
545 "rol{w}\t{$src1, $dst|$dst, $src1}",
Andrew Trick8523b162012-02-01 23:20:51 +0000546 [(store (rotl (loadi16 addr:$dst), (i8 imm:$src1)), addr:$dst)],
Craig Topperfa6298a2014-02-02 09:25:09 +0000547 IIC_SR>, OpSize16;
Chris Lattner1818dd52010-10-05 07:13:35 +0000548def ROL32mi : Ii8<0xC1, MRM0m, (outs), (ins i32mem:$dst, i8imm:$src1),
549 "rol{l}\t{$src1, $dst|$dst, $src1}",
Andrew Trick8523b162012-02-01 23:20:51 +0000550 [(store (rotl (loadi32 addr:$dst), (i8 imm:$src1)), addr:$dst)],
Craig Topperfa6298a2014-02-02 09:25:09 +0000551 IIC_SR>, OpSize32;
Chris Lattner1818dd52010-10-05 07:13:35 +0000552def ROL64mi : RIi8<0xC1, MRM0m, (outs), (ins i64mem:$dst, i8imm:$src1),
553 "rol{q}\t{$src1, $dst|$dst, $src1}",
Andrew Trick8523b162012-02-01 23:20:51 +0000554 [(store (rotl (loadi64 addr:$dst), (i8 imm:$src1)), addr:$dst)],
555 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000556
557// Rotate by 1
558def ROL8m1 : I<0xD0, MRM0m, (outs), (ins i8mem :$dst),
559 "rol{b}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000560 [(store (rotl (loadi8 addr:$dst), (i8 1)), addr:$dst)],
561 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000562def ROL16m1 : I<0xD1, MRM0m, (outs), (ins i16mem:$dst),
563 "rol{w}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000564 [(store (rotl (loadi16 addr:$dst), (i8 1)), addr:$dst)],
Craig Topperfa6298a2014-02-02 09:25:09 +0000565 IIC_SR>, OpSize16;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000566def ROL32m1 : I<0xD1, MRM0m, (outs), (ins i32mem:$dst),
567 "rol{l}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000568 [(store (rotl (loadi32 addr:$dst), (i8 1)), addr:$dst)],
Craig Topperfa6298a2014-02-02 09:25:09 +0000569 IIC_SR>, OpSize32;
Chris Lattner1818dd52010-10-05 07:13:35 +0000570def ROL64m1 : RI<0xD1, MRM0m, (outs), (ins i64mem:$dst),
571 "rol{q}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000572 [(store (rotl (loadi64 addr:$dst), (i8 1)), addr:$dst)],
573 IIC_SR>;
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000574} // SchedRW
Chris Lattner1b3aa862010-10-05 07:00:12 +0000575
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000576let Constraints = "$src1 = $dst", SchedRW = [WriteShift] in {
Chris Lattner1b3aa862010-10-05 07:00:12 +0000577let Uses = [CL] in {
578def ROR8rCL : I<0xD2, MRM1r, (outs GR8 :$dst), (ins GR8 :$src1),
Craig Topperefd67d42013-07-31 02:47:52 +0000579 "ror{b}\t{%cl, $dst|$dst, cl}",
Andrew Trick8523b162012-02-01 23:20:51 +0000580 [(set GR8:$dst, (rotr GR8:$src1, CL))], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000581def ROR16rCL : I<0xD3, MRM1r, (outs GR16:$dst), (ins GR16:$src1),
Craig Topperefd67d42013-07-31 02:47:52 +0000582 "ror{w}\t{%cl, $dst|$dst, cl}",
Craig Topperfa6298a2014-02-02 09:25:09 +0000583 [(set GR16:$dst, (rotr GR16:$src1, CL))], IIC_SR>, OpSize16;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000584def ROR32rCL : I<0xD3, MRM1r, (outs GR32:$dst), (ins GR32:$src1),
Craig Topperefd67d42013-07-31 02:47:52 +0000585 "ror{l}\t{%cl, $dst|$dst, cl}",
Craig Topperfa6298a2014-02-02 09:25:09 +0000586 [(set GR32:$dst, (rotr GR32:$src1, CL))], IIC_SR>, OpSize32;
Chris Lattner1818dd52010-10-05 07:13:35 +0000587def ROR64rCL : RI<0xD3, MRM1r, (outs GR64:$dst), (ins GR64:$src1),
Craig Topperefd67d42013-07-31 02:47:52 +0000588 "ror{q}\t{%cl, $dst|$dst, cl}",
Andrew Trick8523b162012-02-01 23:20:51 +0000589 [(set GR64:$dst, (rotr GR64:$src1, CL))], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000590}
591
592def ROR8ri : Ii8<0xC0, MRM1r, (outs GR8 :$dst), (ins GR8 :$src1, i8imm:$src2),
593 "ror{b}\t{$src2, $dst|$dst, $src2}",
Andrew Trick8523b162012-02-01 23:20:51 +0000594 [(set GR8:$dst, (rotr GR8:$src1, (i8 imm:$src2)))], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000595def ROR16ri : Ii8<0xC1, MRM1r, (outs GR16:$dst), (ins GR16:$src1, i8imm:$src2),
596 "ror{w}\t{$src2, $dst|$dst, $src2}",
Andrew Trick8523b162012-02-01 23:20:51 +0000597 [(set GR16:$dst, (rotr GR16:$src1, (i8 imm:$src2)))],
Craig Topperfa6298a2014-02-02 09:25:09 +0000598 IIC_SR>, OpSize16;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000599def ROR32ri : Ii8<0xC1, MRM1r, (outs GR32:$dst), (ins GR32:$src1, i8imm:$src2),
600 "ror{l}\t{$src2, $dst|$dst, $src2}",
Andrew Trick8523b162012-02-01 23:20:51 +0000601 [(set GR32:$dst, (rotr GR32:$src1, (i8 imm:$src2)))],
Craig Topperfa6298a2014-02-02 09:25:09 +0000602 IIC_SR>, OpSize32;
Chris Lattner1818dd52010-10-05 07:13:35 +0000603def ROR64ri : RIi8<0xC1, MRM1r, (outs GR64:$dst),
604 (ins GR64:$src1, i8imm:$src2),
605 "ror{q}\t{$src2, $dst|$dst, $src2}",
Andrew Trick8523b162012-02-01 23:20:51 +0000606 [(set GR64:$dst, (rotr GR64:$src1, (i8 imm:$src2)))],
607 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000608
609// Rotate by 1
610def ROR8r1 : I<0xD0, MRM1r, (outs GR8 :$dst), (ins GR8 :$src1),
611 "ror{b}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000612 [(set GR8:$dst, (rotr GR8:$src1, (i8 1)))],
613 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000614def ROR16r1 : I<0xD1, MRM1r, (outs GR16:$dst), (ins GR16:$src1),
615 "ror{w}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000616 [(set GR16:$dst, (rotr GR16:$src1, (i8 1)))],
Craig Topperfa6298a2014-02-02 09:25:09 +0000617 IIC_SR>, OpSize16;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000618def ROR32r1 : I<0xD1, MRM1r, (outs GR32:$dst), (ins GR32:$src1),
619 "ror{l}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000620 [(set GR32:$dst, (rotr GR32:$src1, (i8 1)))],
Craig Topperfa6298a2014-02-02 09:25:09 +0000621 IIC_SR>, OpSize32;
Chris Lattner1818dd52010-10-05 07:13:35 +0000622def ROR64r1 : RI<0xD1, MRM1r, (outs GR64:$dst), (ins GR64:$src1),
623 "ror{q}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000624 [(set GR64:$dst, (rotr GR64:$src1, (i8 1)))],
625 IIC_SR>;
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000626} // Constraints = "$src = $dst", SchedRW
Chris Lattner1b3aa862010-10-05 07:00:12 +0000627
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000628let SchedRW = [WriteShiftLd, WriteRMW] in {
Chris Lattner1b3aa862010-10-05 07:00:12 +0000629let Uses = [CL] in {
630def ROR8mCL : I<0xD2, MRM1m, (outs), (ins i8mem :$dst),
Craig Topperefd67d42013-07-31 02:47:52 +0000631 "ror{b}\t{%cl, $dst|$dst, cl}",
Andrew Trick8523b162012-02-01 23:20:51 +0000632 [(store (rotr (loadi8 addr:$dst), CL), addr:$dst)],
633 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000634def ROR16mCL : I<0xD3, MRM1m, (outs), (ins i16mem:$dst),
Craig Topperefd67d42013-07-31 02:47:52 +0000635 "ror{w}\t{%cl, $dst|$dst, cl}",
Andrew Trick8523b162012-02-01 23:20:51 +0000636 [(store (rotr (loadi16 addr:$dst), CL), addr:$dst)],
Craig Topperfa6298a2014-02-02 09:25:09 +0000637 IIC_SR>, OpSize16;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000638def ROR32mCL : I<0xD3, MRM1m, (outs), (ins i32mem:$dst),
Craig Topperefd67d42013-07-31 02:47:52 +0000639 "ror{l}\t{%cl, $dst|$dst, cl}",
Andrew Trick8523b162012-02-01 23:20:51 +0000640 [(store (rotr (loadi32 addr:$dst), CL), addr:$dst)],
Craig Topperfa6298a2014-02-02 09:25:09 +0000641 IIC_SR>, OpSize32;
Chris Lattner1818dd52010-10-05 07:13:35 +0000642def ROR64mCL : RI<0xD3, MRM1m, (outs), (ins i64mem:$dst),
Craig Topperefd67d42013-07-31 02:47:52 +0000643 "ror{q}\t{%cl, $dst|$dst, cl}",
Andrew Trick8523b162012-02-01 23:20:51 +0000644 [(store (rotr (loadi64 addr:$dst), CL), addr:$dst)],
645 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000646}
647def ROR8mi : Ii8<0xC0, MRM1m, (outs), (ins i8mem :$dst, i8imm:$src),
648 "ror{b}\t{$src, $dst|$dst, $src}",
Andrew Trick8523b162012-02-01 23:20:51 +0000649 [(store (rotr (loadi8 addr:$dst), (i8 imm:$src)), addr:$dst)],
650 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000651def ROR16mi : Ii8<0xC1, MRM1m, (outs), (ins i16mem:$dst, i8imm:$src),
652 "ror{w}\t{$src, $dst|$dst, $src}",
Andrew Trick8523b162012-02-01 23:20:51 +0000653 [(store (rotr (loadi16 addr:$dst), (i8 imm:$src)), addr:$dst)],
Craig Topperfa6298a2014-02-02 09:25:09 +0000654 IIC_SR>, OpSize16;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000655def ROR32mi : Ii8<0xC1, MRM1m, (outs), (ins i32mem:$dst, i8imm:$src),
656 "ror{l}\t{$src, $dst|$dst, $src}",
Andrew Trick8523b162012-02-01 23:20:51 +0000657 [(store (rotr (loadi32 addr:$dst), (i8 imm:$src)), addr:$dst)],
Craig Topperfa6298a2014-02-02 09:25:09 +0000658 IIC_SR>, OpSize32;
Chris Lattner1818dd52010-10-05 07:13:35 +0000659def ROR64mi : RIi8<0xC1, MRM1m, (outs), (ins i64mem:$dst, i8imm:$src),
660 "ror{q}\t{$src, $dst|$dst, $src}",
Andrew Trick8523b162012-02-01 23:20:51 +0000661 [(store (rotr (loadi64 addr:$dst), (i8 imm:$src)), addr:$dst)],
662 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000663
664// Rotate by 1
665def ROR8m1 : I<0xD0, MRM1m, (outs), (ins i8mem :$dst),
666 "ror{b}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000667 [(store (rotr (loadi8 addr:$dst), (i8 1)), addr:$dst)],
668 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000669def ROR16m1 : I<0xD1, MRM1m, (outs), (ins i16mem:$dst),
670 "ror{w}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000671 [(store (rotr (loadi16 addr:$dst), (i8 1)), addr:$dst)],
Craig Topperfa6298a2014-02-02 09:25:09 +0000672 IIC_SR>, OpSize16;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000673def ROR32m1 : I<0xD1, MRM1m, (outs), (ins i32mem:$dst),
674 "ror{l}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000675 [(store (rotr (loadi32 addr:$dst), (i8 1)), addr:$dst)],
Craig Topperfa6298a2014-02-02 09:25:09 +0000676 IIC_SR>, OpSize32;
Chris Lattner1818dd52010-10-05 07:13:35 +0000677def ROR64m1 : RI<0xD1, MRM1m, (outs), (ins i64mem:$dst),
678 "ror{q}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000679 [(store (rotr (loadi64 addr:$dst), (i8 1)), addr:$dst)],
680 IIC_SR>;
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000681} // SchedRW
Chris Lattner1b3aa862010-10-05 07:00:12 +0000682
683
684//===----------------------------------------------------------------------===//
685// Double shift instructions (generalizations of rotate)
686//===----------------------------------------------------------------------===//
687
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000688let Constraints = "$src1 = $dst", SchedRW = [WriteShift] in {
Chris Lattner1b3aa862010-10-05 07:00:12 +0000689
690let Uses = [CL] in {
Chris Lattner1b3aa862010-10-05 07:00:12 +0000691def SHLD16rrCL : I<0xA5, MRMDestReg, (outs GR16:$dst),
692 (ins GR16:$src1, GR16:$src2),
Craig Topperefd67d42013-07-31 02:47:52 +0000693 "shld{w}\t{%cl, $src2, $dst|$dst, $src2, cl}",
Andrew Trick8523b162012-02-01 23:20:51 +0000694 [(set GR16:$dst, (X86shld GR16:$src1, GR16:$src2, CL))],
695 IIC_SHD16_REG_CL>,
Craig Topperfa6298a2014-02-02 09:25:09 +0000696 TB, OpSize16;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000697def SHRD16rrCL : I<0xAD, MRMDestReg, (outs GR16:$dst),
698 (ins GR16:$src1, GR16:$src2),
Craig Topperefd67d42013-07-31 02:47:52 +0000699 "shrd{w}\t{%cl, $src2, $dst|$dst, $src2, cl}",
Andrew Trick8523b162012-02-01 23:20:51 +0000700 [(set GR16:$dst, (X86shrd GR16:$src1, GR16:$src2, CL))],
701 IIC_SHD16_REG_CL>,
Craig Topperfa6298a2014-02-02 09:25:09 +0000702 TB, OpSize16;
Chris Lattner1818dd52010-10-05 07:13:35 +0000703def SHLD32rrCL : I<0xA5, MRMDestReg, (outs GR32:$dst),
704 (ins GR32:$src1, GR32:$src2),
Craig Topperefd67d42013-07-31 02:47:52 +0000705 "shld{l}\t{%cl, $src2, $dst|$dst, $src2, cl}",
Andrew Trick8523b162012-02-01 23:20:51 +0000706 [(set GR32:$dst, (X86shld GR32:$src1, GR32:$src2, CL))],
Craig Topperfa6298a2014-02-02 09:25:09 +0000707 IIC_SHD32_REG_CL>, TB, OpSize32;
Chris Lattner1818dd52010-10-05 07:13:35 +0000708def SHRD32rrCL : I<0xAD, MRMDestReg, (outs GR32:$dst),
709 (ins GR32:$src1, GR32:$src2),
Craig Topperefd67d42013-07-31 02:47:52 +0000710 "shrd{l}\t{%cl, $src2, $dst|$dst, $src2, cl}",
Andrew Trick8523b162012-02-01 23:20:51 +0000711 [(set GR32:$dst, (X86shrd GR32:$src1, GR32:$src2, CL))],
Craig Topperfa6298a2014-02-02 09:25:09 +0000712 IIC_SHD32_REG_CL>, TB, OpSize32;
Chris Lattner1818dd52010-10-05 07:13:35 +0000713def SHLD64rrCL : RI<0xA5, MRMDestReg, (outs GR64:$dst),
714 (ins GR64:$src1, GR64:$src2),
Craig Topperefd67d42013-07-31 02:47:52 +0000715 "shld{q}\t{%cl, $src2, $dst|$dst, $src2, cl}",
Andrew Trick8523b162012-02-01 23:20:51 +0000716 [(set GR64:$dst, (X86shld GR64:$src1, GR64:$src2, CL))],
717 IIC_SHD64_REG_CL>,
Chris Lattner1818dd52010-10-05 07:13:35 +0000718 TB;
719def SHRD64rrCL : RI<0xAD, MRMDestReg, (outs GR64:$dst),
720 (ins GR64:$src1, GR64:$src2),
Craig Topperefd67d42013-07-31 02:47:52 +0000721 "shrd{q}\t{%cl, $src2, $dst|$dst, $src2, cl}",
Andrew Trick8523b162012-02-01 23:20:51 +0000722 [(set GR64:$dst, (X86shrd GR64:$src1, GR64:$src2, CL))],
723 IIC_SHD64_REG_CL>,
Chris Lattner1818dd52010-10-05 07:13:35 +0000724 TB;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000725}
726
727let isCommutable = 1 in { // These instructions commute to each other.
Chris Lattner1b3aa862010-10-05 07:00:12 +0000728def SHLD16rri8 : Ii8<0xA4, MRMDestReg,
729 (outs GR16:$dst),
730 (ins GR16:$src1, GR16:$src2, i8imm:$src3),
731 "shld{w}\t{$src3, $src2, $dst|$dst, $src2, $src3}",
732 [(set GR16:$dst, (X86shld GR16:$src1, GR16:$src2,
Andrew Trick8523b162012-02-01 23:20:51 +0000733 (i8 imm:$src3)))], IIC_SHD16_REG_IM>,
Craig Topperfa6298a2014-02-02 09:25:09 +0000734 TB, OpSize16;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000735def SHRD16rri8 : Ii8<0xAC, MRMDestReg,
736 (outs GR16:$dst),
737 (ins GR16:$src1, GR16:$src2, i8imm:$src3),
738 "shrd{w}\t{$src3, $src2, $dst|$dst, $src2, $src3}",
739 [(set GR16:$dst, (X86shrd GR16:$src1, GR16:$src2,
Andrew Trick8523b162012-02-01 23:20:51 +0000740 (i8 imm:$src3)))], IIC_SHD16_REG_IM>,
Craig Topperfa6298a2014-02-02 09:25:09 +0000741 TB, OpSize16;
Chris Lattner1818dd52010-10-05 07:13:35 +0000742def SHLD32rri8 : Ii8<0xA4, MRMDestReg,
743 (outs GR32:$dst),
744 (ins GR32:$src1, GR32:$src2, i8imm:$src3),
745 "shld{l}\t{$src3, $src2, $dst|$dst, $src2, $src3}",
746 [(set GR32:$dst, (X86shld GR32:$src1, GR32:$src2,
Andrew Trick8523b162012-02-01 23:20:51 +0000747 (i8 imm:$src3)))], IIC_SHD32_REG_IM>,
Craig Topperfa6298a2014-02-02 09:25:09 +0000748 TB, OpSize32;
Chris Lattner1818dd52010-10-05 07:13:35 +0000749def SHRD32rri8 : Ii8<0xAC, MRMDestReg,
750 (outs GR32:$dst),
751 (ins GR32:$src1, GR32:$src2, i8imm:$src3),
752 "shrd{l}\t{$src3, $src2, $dst|$dst, $src2, $src3}",
753 [(set GR32:$dst, (X86shrd GR32:$src1, GR32:$src2,
Andrew Trick8523b162012-02-01 23:20:51 +0000754 (i8 imm:$src3)))], IIC_SHD32_REG_IM>,
Craig Topperfa6298a2014-02-02 09:25:09 +0000755 TB, OpSize32;
Chris Lattner1818dd52010-10-05 07:13:35 +0000756def SHLD64rri8 : RIi8<0xA4, MRMDestReg,
757 (outs GR64:$dst),
758 (ins GR64:$src1, GR64:$src2, i8imm:$src3),
759 "shld{q}\t{$src3, $src2, $dst|$dst, $src2, $src3}",
760 [(set GR64:$dst, (X86shld GR64:$src1, GR64:$src2,
Andrew Trick8523b162012-02-01 23:20:51 +0000761 (i8 imm:$src3)))], IIC_SHD64_REG_IM>,
Chris Lattner1818dd52010-10-05 07:13:35 +0000762 TB;
763def SHRD64rri8 : RIi8<0xAC, MRMDestReg,
764 (outs GR64:$dst),
765 (ins GR64:$src1, GR64:$src2, i8imm:$src3),
766 "shrd{q}\t{$src3, $src2, $dst|$dst, $src2, $src3}",
767 [(set GR64:$dst, (X86shrd GR64:$src1, GR64:$src2,
Andrew Trick8523b162012-02-01 23:20:51 +0000768 (i8 imm:$src3)))], IIC_SHD64_REG_IM>,
Chris Lattner1818dd52010-10-05 07:13:35 +0000769 TB;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000770}
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000771} // Constraints = "$src = $dst", SchedRW
Chris Lattner1b3aa862010-10-05 07:00:12 +0000772
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000773let SchedRW = [WriteShiftLd, WriteRMW] in {
Chris Lattner1b3aa862010-10-05 07:00:12 +0000774let Uses = [CL] in {
Chris Lattner1818dd52010-10-05 07:13:35 +0000775def SHLD16mrCL : I<0xA5, MRMDestMem, (outs), (ins i16mem:$dst, GR16:$src2),
Craig Topperefd67d42013-07-31 02:47:52 +0000776 "shld{w}\t{%cl, $src2, $dst|$dst, $src2, cl}",
Chris Lattner1818dd52010-10-05 07:13:35 +0000777 [(store (X86shld (loadi16 addr:$dst), GR16:$src2, CL),
Craig Topperfa6298a2014-02-02 09:25:09 +0000778 addr:$dst)], IIC_SHD16_MEM_CL>, TB, OpSize16;
Chris Lattner1818dd52010-10-05 07:13:35 +0000779def SHRD16mrCL : I<0xAD, MRMDestMem, (outs), (ins i16mem:$dst, GR16:$src2),
Craig Topperefd67d42013-07-31 02:47:52 +0000780 "shrd{w}\t{%cl, $src2, $dst|$dst, $src2, cl}",
Chris Lattner1818dd52010-10-05 07:13:35 +0000781 [(store (X86shrd (loadi16 addr:$dst), GR16:$src2, CL),
Craig Topperfa6298a2014-02-02 09:25:09 +0000782 addr:$dst)], IIC_SHD16_MEM_CL>, TB, OpSize16;
Chris Lattner1818dd52010-10-05 07:13:35 +0000783
Chris Lattner1b3aa862010-10-05 07:00:12 +0000784def SHLD32mrCL : I<0xA5, MRMDestMem, (outs), (ins i32mem:$dst, GR32:$src2),
Craig Topperefd67d42013-07-31 02:47:52 +0000785 "shld{l}\t{%cl, $src2, $dst|$dst, $src2, cl}",
Chris Lattner1b3aa862010-10-05 07:00:12 +0000786 [(store (X86shld (loadi32 addr:$dst), GR32:$src2, CL),
Craig Topperfa6298a2014-02-02 09:25:09 +0000787 addr:$dst)], IIC_SHD32_MEM_CL>, TB, OpSize32;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000788def SHRD32mrCL : I<0xAD, MRMDestMem, (outs), (ins i32mem:$dst, GR32:$src2),
Craig Topperefd67d42013-07-31 02:47:52 +0000789 "shrd{l}\t{%cl, $src2, $dst|$dst, $src2, cl}",
Chris Lattner1b3aa862010-10-05 07:00:12 +0000790 [(store (X86shrd (loadi32 addr:$dst), GR32:$src2, CL),
Craig Topperfa6298a2014-02-02 09:25:09 +0000791 addr:$dst)], IIC_SHD32_MEM_CL>, TB, OpSize32;
Chris Lattner1818dd52010-10-05 07:13:35 +0000792
793def SHLD64mrCL : RI<0xA5, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src2),
Craig Topperefd67d42013-07-31 02:47:52 +0000794 "shld{q}\t{%cl, $src2, $dst|$dst, $src2, cl}",
Chris Lattner1818dd52010-10-05 07:13:35 +0000795 [(store (X86shld (loadi64 addr:$dst), GR64:$src2, CL),
Andrew Trick8523b162012-02-01 23:20:51 +0000796 addr:$dst)], IIC_SHD64_MEM_CL>, TB;
Chris Lattner1818dd52010-10-05 07:13:35 +0000797def SHRD64mrCL : RI<0xAD, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src2),
Craig Topperefd67d42013-07-31 02:47:52 +0000798 "shrd{q}\t{%cl, $src2, $dst|$dst, $src2, cl}",
Chris Lattner1818dd52010-10-05 07:13:35 +0000799 [(store (X86shrd (loadi64 addr:$dst), GR64:$src2, CL),
Andrew Trick8523b162012-02-01 23:20:51 +0000800 addr:$dst)], IIC_SHD64_MEM_CL>, TB;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000801}
Chris Lattner1818dd52010-10-05 07:13:35 +0000802
803def SHLD16mri8 : Ii8<0xA4, MRMDestMem,
804 (outs), (ins i16mem:$dst, GR16:$src2, i8imm:$src3),
805 "shld{w}\t{$src3, $src2, $dst|$dst, $src2, $src3}",
806 [(store (X86shld (loadi16 addr:$dst), GR16:$src2,
Andrew Trick8523b162012-02-01 23:20:51 +0000807 (i8 imm:$src3)), addr:$dst)],
808 IIC_SHD16_MEM_IM>,
Craig Topperfa6298a2014-02-02 09:25:09 +0000809 TB, OpSize16;
Chris Lattner1818dd52010-10-05 07:13:35 +0000810def SHRD16mri8 : Ii8<0xAC, MRMDestMem,
811 (outs), (ins i16mem:$dst, GR16:$src2, i8imm:$src3),
812 "shrd{w}\t{$src3, $src2, $dst|$dst, $src2, $src3}",
813 [(store (X86shrd (loadi16 addr:$dst), GR16:$src2,
Andrew Trick8523b162012-02-01 23:20:51 +0000814 (i8 imm:$src3)), addr:$dst)],
815 IIC_SHD16_MEM_IM>,
Craig Topperfa6298a2014-02-02 09:25:09 +0000816 TB, OpSize16;
Chris Lattner1818dd52010-10-05 07:13:35 +0000817
Chris Lattner1b3aa862010-10-05 07:00:12 +0000818def SHLD32mri8 : Ii8<0xA4, MRMDestMem,
819 (outs), (ins i32mem:$dst, GR32:$src2, i8imm:$src3),
820 "shld{l}\t{$src3, $src2, $dst|$dst, $src2, $src3}",
821 [(store (X86shld (loadi32 addr:$dst), GR32:$src2,
Andrew Trick8523b162012-02-01 23:20:51 +0000822 (i8 imm:$src3)), addr:$dst)],
823 IIC_SHD32_MEM_IM>,
Craig Topperfa6298a2014-02-02 09:25:09 +0000824 TB, OpSize32;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000825def SHRD32mri8 : Ii8<0xAC, MRMDestMem,
826 (outs), (ins i32mem:$dst, GR32:$src2, i8imm:$src3),
827 "shrd{l}\t{$src3, $src2, $dst|$dst, $src2, $src3}",
828 [(store (X86shrd (loadi32 addr:$dst), GR32:$src2,
Andrew Trick8523b162012-02-01 23:20:51 +0000829 (i8 imm:$src3)), addr:$dst)],
830 IIC_SHD32_MEM_IM>,
Craig Topperfa6298a2014-02-02 09:25:09 +0000831 TB, OpSize32;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000832
Chris Lattner1818dd52010-10-05 07:13:35 +0000833def SHLD64mri8 : RIi8<0xA4, MRMDestMem,
834 (outs), (ins i64mem:$dst, GR64:$src2, i8imm:$src3),
835 "shld{q}\t{$src3, $src2, $dst|$dst, $src2, $src3}",
836 [(store (X86shld (loadi64 addr:$dst), GR64:$src2,
Andrew Trick8523b162012-02-01 23:20:51 +0000837 (i8 imm:$src3)), addr:$dst)],
838 IIC_SHD64_MEM_IM>,
Chris Lattner1818dd52010-10-05 07:13:35 +0000839 TB;
840def SHRD64mri8 : RIi8<0xAC, MRMDestMem,
841 (outs), (ins i64mem:$dst, GR64:$src2, i8imm:$src3),
842 "shrd{q}\t{$src3, $src2, $dst|$dst, $src2, $src3}",
843 [(store (X86shrd (loadi64 addr:$dst), GR64:$src2,
Andrew Trick8523b162012-02-01 23:20:51 +0000844 (i8 imm:$src3)), addr:$dst)],
845 IIC_SHD64_MEM_IM>,
Chris Lattner1818dd52010-10-05 07:13:35 +0000846 TB;
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000847} // SchedRW
Chris Lattner1818dd52010-10-05 07:13:35 +0000848
Chris Lattner1b3aa862010-10-05 07:00:12 +0000849} // Defs = [EFLAGS]
850
Michael Liao2de86af2012-09-26 08:24:51 +0000851def ROT32L2R_imm8 : SDNodeXForm<imm, [{
852 // Convert a ROTL shamt to a ROTR shamt on 32-bit integer.
853 return getI8Imm(32 - N->getZExtValue());
854}]>;
855
856def ROT64L2R_imm8 : SDNodeXForm<imm, [{
857 // Convert a ROTL shamt to a ROTR shamt on 64-bit integer.
858 return getI8Imm(64 - N->getZExtValue());
859}]>;
860
Craig Topperb05d9e92011-10-23 22:18:24 +0000861multiclass bmi_rotate<string asm, RegisterClass RC, X86MemOperand x86memop> {
862let neverHasSideEffects = 1 in {
863 def ri : Ii8<0xF0, MRMSrcReg, (outs RC:$dst), (ins RC:$src1, i8imm:$src2),
864 !strconcat(asm, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000865 []>, TAXD, VEX, Sched<[WriteShift]>;
Craig Topper980d5982011-10-23 07:34:00 +0000866 let mayLoad = 1 in
Craig Topperb05d9e92011-10-23 22:18:24 +0000867 def mi : Ii8<0xF0, MRMSrcMem, (outs RC:$dst),
868 (ins x86memop:$src1, i8imm:$src2),
869 !strconcat(asm, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000870 []>, TAXD, VEX, Sched<[WriteShiftLd]>;
Craig Topperb05d9e92011-10-23 22:18:24 +0000871}
872}
Craig Topper980d5982011-10-23 07:34:00 +0000873
Craig Topperb05d9e92011-10-23 22:18:24 +0000874multiclass bmi_shift<string asm, RegisterClass RC, X86MemOperand x86memop> {
875let neverHasSideEffects = 1 in {
876 def rr : I<0xF7, MRMSrcReg, (outs RC:$dst), (ins RC:$src1, RC:$src2),
877 !strconcat(asm, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"), []>,
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000878 VEX_4VOp3, Sched<[WriteShift]>;
Craig Topper980d5982011-10-23 07:34:00 +0000879 let mayLoad = 1 in
Craig Topperb05d9e92011-10-23 22:18:24 +0000880 def rm : I<0xF7, MRMSrcMem, (outs RC:$dst), (ins x86memop:$src1, RC:$src2),
881 !strconcat(asm, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"), []>,
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000882 VEX_4VOp3,
883 Sched<[WriteShiftLd,
884 // x86memop:$src1
885 ReadDefault, ReadDefault, ReadDefault, ReadDefault,
886 ReadDefault,
887 // RC:$src1
888 ReadAfterLd]>;
Craig Topperb05d9e92011-10-23 22:18:24 +0000889}
890}
891
892let Predicates = [HasBMI2] in {
893 defm RORX32 : bmi_rotate<"rorx{l}", GR32, i32mem>;
894 defm RORX64 : bmi_rotate<"rorx{q}", GR64, i64mem>, VEX_W;
895 defm SARX32 : bmi_shift<"sarx{l}", GR32, i32mem>, T8XS;
896 defm SARX64 : bmi_shift<"sarx{q}", GR64, i64mem>, T8XS, VEX_W;
897 defm SHRX32 : bmi_shift<"shrx{l}", GR32, i32mem>, T8XD;
898 defm SHRX64 : bmi_shift<"shrx{q}", GR64, i64mem>, T8XD, VEX_W;
Craig Topperae11aed2014-01-14 07:41:20 +0000899 defm SHLX32 : bmi_shift<"shlx{l}", GR32, i32mem>, T8PD;
900 defm SHLX64 : bmi_shift<"shlx{q}", GR64, i64mem>, T8PD, VEX_W;
Michael Liao2de86af2012-09-26 08:24:51 +0000901
902 // Prefer RORX which is non-destructive and doesn't update EFLAGS.
903 let AddedComplexity = 10 in {
904 def : Pat<(rotl GR32:$src, (i8 imm:$shamt)),
905 (RORX32ri GR32:$src, (ROT32L2R_imm8 imm:$shamt))>;
906 def : Pat<(rotl GR64:$src, (i8 imm:$shamt)),
907 (RORX64ri GR64:$src, (ROT64L2R_imm8 imm:$shamt))>;
908 }
909
910 def : Pat<(rotl (loadi32 addr:$src), (i8 imm:$shamt)),
911 (RORX32mi addr:$src, (ROT32L2R_imm8 imm:$shamt))>;
912 def : Pat<(rotl (loadi64 addr:$src), (i8 imm:$shamt)),
913 (RORX64mi addr:$src, (ROT64L2R_imm8 imm:$shamt))>;
Michael Liao2b425e12012-09-26 08:26:25 +0000914
915 // Prefer SARX/SHRX/SHLX over SAR/SHR/SHL with variable shift BUT not
916 // immedidate shift, i.e. the following code is considered better
917 //
918 // mov %edi, %esi
919 // shl $imm, %esi
920 // ... %edi, ...
921 //
922 // than
923 //
924 // movb $imm, %sil
925 // shlx %sil, %edi, %esi
926 // ... %edi, ...
927 //
928 let AddedComplexity = 1 in {
929 def : Pat<(sra GR32:$src1, GR8:$src2),
930 (SARX32rr GR32:$src1,
931 (INSERT_SUBREG
932 (i32 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
933 def : Pat<(sra GR64:$src1, GR8:$src2),
934 (SARX64rr GR64:$src1,
935 (INSERT_SUBREG
936 (i64 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
937
938 def : Pat<(srl GR32:$src1, GR8:$src2),
939 (SHRX32rr GR32:$src1,
940 (INSERT_SUBREG
941 (i32 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
942 def : Pat<(srl GR64:$src1, GR8:$src2),
943 (SHRX64rr GR64:$src1,
944 (INSERT_SUBREG
945 (i64 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
946
947 def : Pat<(shl GR32:$src1, GR8:$src2),
948 (SHLX32rr GR32:$src1,
949 (INSERT_SUBREG
950 (i32 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
951 def : Pat<(shl GR64:$src1, GR8:$src2),
952 (SHLX64rr GR64:$src1,
953 (INSERT_SUBREG
954 (i64 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
955 }
956
957 // Patterns on SARXrm/SHRXrm/SHLXrm are explicitly omitted to favor
958 //
959 // mov (%ecx), %esi
960 // shl $imm, $esi
961 //
962 // over
963 //
964 // movb $imm %al
965 // shlx %al, (%ecx), %esi
966 //
967 // As SARXrr/SHRXrr/SHLXrr is favored on variable shift, the peephole
968 // optimization will fold them into SARXrm/SHRXrm/SHLXrm if possible.
Craig Topper980d5982011-10-23 07:34:00 +0000969}