blob: e2be73532157eefddf36a1a233d877dd7e228398 [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
Craig Topper8d2e6bc2015-10-12 06:23:10 +000034def SHL8ri : Ii8<0xC0, MRM4r, (outs GR8 :$dst), (ins GR8 :$src1, u8imm:$src2),
Chris Lattner1b3aa862010-10-05 07:00:12 +000035 "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.
Craig Topper8d2e6bc2015-10-12 06:23:10 +000039def SHL16ri : Ii8<0xC1, MRM4r, (outs GR16:$dst), (ins GR16:$src1, u8imm:$src2),
Chris Lattner1b3aa862010-10-05 07:00:12 +000040 "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;
Craig Topper8d2e6bc2015-10-12 06:23:10 +000043def SHL32ri : Ii8<0xC1, MRM4r, (outs GR32:$dst), (ins GR32:$src1, u8imm:$src2),
Chris Lattner1b3aa862010-10-05 07:00:12 +000044 "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),
Craig Topper8d2e6bc2015-10-12 06:23:10 +000048 (ins GR64:$src1, u8imm:$src2),
Chris Lattner1818dd52010-10-05 07:13:35 +000049 "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>;
Craig Topper8b3c47c2015-01-07 08:10:36 +000052} // isConvertibleToThreeAddress = 1
Chris Lattner1b3aa862010-10-05 07:00:12 +000053
54// NOTE: We don't include patterns for shifts of a register by one, because
Chris Lattner1818dd52010-10-05 07:13:35 +000055// 'add reg,reg' is cheaper (and we have a Pat pattern for shift-by-one).
Craig Topper396cb792012-12-27 03:35:44 +000056let hasSideEffects = 0 in {
Chris Lattner1b3aa862010-10-05 07:00:12 +000057def SHL8r1 : I<0xD0, MRM4r, (outs GR8:$dst), (ins GR8:$src1),
Andrew Trick8523b162012-02-01 23:20:51 +000058 "shl{b}\t$dst", [], IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +000059def SHL16r1 : I<0xD1, MRM4r, (outs GR16:$dst), (ins GR16:$src1),
Craig Topperfa6298a2014-02-02 09:25:09 +000060 "shl{w}\t$dst", [], IIC_SR>, OpSize16;
Chris Lattner1b3aa862010-10-05 07:00:12 +000061def SHL32r1 : I<0xD1, MRM4r, (outs GR32:$dst), (ins GR32:$src1),
Craig Topperfa6298a2014-02-02 09:25:09 +000062 "shl{l}\t$dst", [], IIC_SR>, OpSize32;
Chris Lattner1818dd52010-10-05 07:13:35 +000063def SHL64r1 : RI<0xD1, MRM4r, (outs GR64:$dst), (ins GR64:$src1),
Andrew Trick8523b162012-02-01 23:20:51 +000064 "shl{q}\t$dst", [], IIC_SR>;
Craig Topper396cb792012-12-27 03:35:44 +000065} // hasSideEffects = 0
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}
Craig Topper8d2e6bc2015-10-12 06:23:10 +000088def SHL8mi : Ii8<0xC0, MRM4m, (outs), (ins i8mem :$dst, u8imm:$src),
Chris Lattner1b3aa862010-10-05 07:00:12 +000089 "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>;
Craig Topper8d2e6bc2015-10-12 06:23:10 +000092def SHL16mi : Ii8<0xC1, MRM4m, (outs), (ins i16mem:$dst, u8imm:$src),
Chris Lattner1b3aa862010-10-05 07:00:12 +000093 "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;
Craig Topper8d2e6bc2015-10-12 06:23:10 +000096def SHL32mi : Ii8<0xC1, MRM4m, (outs), (ins i32mem:$dst, u8imm:$src),
Chris Lattner1b3aa862010-10-05 07:00:12 +000097 "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;
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000100def SHL64mi : RIi8<0xC1, MRM4m, (outs), (ins i64mem:$dst, u8imm:$src),
Chris Lattner1818dd52010-10-05 07:13:35 +0000101 "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
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000140def SHR8ri : Ii8<0xC0, MRM5r, (outs GR8:$dst), (ins GR8:$src1, u8imm:$src2),
Chris Lattner1b3aa862010-10-05 07:00:12 +0000141 "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>;
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000143def SHR16ri : Ii8<0xC1, MRM5r, (outs GR16:$dst), (ins GR16:$src1, u8imm:$src2),
Chris Lattner1b3aa862010-10-05 07:00:12 +0000144 "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;
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000147def SHR32ri : Ii8<0xC1, MRM5r, (outs GR32:$dst), (ins GR32:$src1, u8imm:$src2),
Chris Lattner1b3aa862010-10-05 07:00:12 +0000148 "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;
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000151def SHR64ri : RIi8<0xC1, MRM5r, (outs GR64:$dst), (ins GR64:$src1, u8imm:$src2),
Chris Lattner1818dd52010-10-05 07:13:35 +0000152 "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}
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000188def SHR8mi : Ii8<0xC0, MRM5m, (outs), (ins i8mem :$dst, u8imm:$src),
Chris Lattner1b3aa862010-10-05 07:00:12 +0000189 "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>;
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000192def SHR16mi : Ii8<0xC1, MRM5m, (outs), (ins i16mem:$dst, u8imm:$src),
Chris Lattner1b3aa862010-10-05 07:00:12 +0000193 "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;
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000196def SHR32mi : Ii8<0xC1, MRM5m, (outs), (ins i32mem:$dst, u8imm:$src),
Chris Lattner1b3aa862010-10-05 07:00:12 +0000197 "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;
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000200def SHR64mi : RIi8<0xC1, MRM5m, (outs), (ins i64mem:$dst, u8imm:$src),
Chris Lattner1818dd52010-10-05 07:13:35 +0000201 "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
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000244def SAR8ri : Ii8<0xC0, MRM7r, (outs GR8 :$dst), (ins GR8 :$src1, u8imm:$src2),
Chris Lattner1b3aa862010-10-05 07:00:12 +0000245 "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>;
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000248def SAR16ri : Ii8<0xC1, MRM7r, (outs GR16:$dst), (ins GR16:$src1, u8imm:$src2),
Chris Lattner1b3aa862010-10-05 07:00:12 +0000249 "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;
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000252def SAR32ri : Ii8<0xC1, MRM7r, (outs GR32:$dst), (ins GR32:$src1, u8imm:$src2),
Chris Lattner1b3aa862010-10-05 07:00:12 +0000253 "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),
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000257 (ins GR64:$src1, u8imm:$src2),
Chris Lattner1818dd52010-10-05 07:13:35 +0000258 "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;
Michael Liao5bf95782014-12-04 05:20:33 +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;
Michael Liao5bf95782014-12-04 05:20:33 +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}
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000301def SAR8mi : Ii8<0xC0, MRM7m, (outs), (ins i8mem :$dst, u8imm:$src),
Chris Lattner1b3aa862010-10-05 07:00:12 +0000302 "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>;
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000305def SAR16mi : Ii8<0xC1, MRM7m, (outs), (ins i16mem:$dst, u8imm:$src),
Chris Lattner1b3aa862010-10-05 07:00:12 +0000306 "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;
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000309def SAR32mi : Ii8<0xC1, MRM7m, (outs), (ins i32mem:$dst, u8imm:$src),
Chris Lattner1b3aa862010-10-05 07:00:12 +0000310 "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;
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000313def SAR64mi : RIi8<0xC1, MRM7m, (outs), (ins i64mem:$dst, u8imm:$src),
Chris Lattner1818dd52010-10-05 07:13:35 +0000314 "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>;
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000345def RCL8ri : Ii8<0xC0, MRM2r, (outs GR8:$dst), (ins GR8:$src1, u8imm:$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>;
Michael Liao5bf95782014-12-04 05:20:33 +0000350
Chris Lattner1b3aa862010-10-05 07:00:12 +0000351def 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;
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000353def RCL16ri : Ii8<0xC1, MRM2r, (outs GR16:$dst), (ins GR16:$src1, u8imm:$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;
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000361def RCL32ri : Ii8<0xC1, MRM2r, (outs GR32:$dst), (ins GR32:$src1, u8imm:$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>;
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000370def RCL64ri : RIi8<0xC1, MRM2r, (outs GR64:$dst), (ins GR64:$src1, u8imm:$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>;
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000379def RCR8ri : Ii8<0xC0, MRM3r, (outs GR8:$dst), (ins GR8:$src1, u8imm:$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>;
Michael Liao5bf95782014-12-04 05:20:33 +0000384
Chris Lattner1b3aa862010-10-05 07:00:12 +0000385def 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;
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000387def RCR16ri : Ii8<0xC1, MRM3r, (outs GR16:$dst), (ins GR16:$src1, u8imm:$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;
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000395def RCR32ri : Ii8<0xC1, MRM3r, (outs GR32:$dst), (ins GR32:$src1, u8imm:$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;
Michael Liao5bf95782014-12-04 05:20:33 +0000400
Chris Lattner1818dd52010-10-05 07:13:35 +0000401def RCR64r1 : RI<0xD1, MRM3r, (outs GR64:$dst), (ins GR64:$src1),
Andrew Trick8523b162012-02-01 23:20:51 +0000402 "rcr{q}\t$dst", [], IIC_SR>;
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000403def RCR64ri : RIi8<0xC1, MRM3r, (outs GR64:$dst), (ins GR64:$src1, u8imm:$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>;
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000414def RCL8mi : Ii8<0xC0, MRM2m, (outs), (ins i8mem:$dst, u8imm:$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;
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000418def RCL16mi : Ii8<0xC1, MRM2m, (outs), (ins i16mem:$dst, u8imm:$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;
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000422def RCL32mi : Ii8<0xC1, MRM2m, (outs), (ins i32mem:$dst, u8imm:$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>;
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000426def RCL64mi : RIi8<0xC1, MRM2m, (outs), (ins i64mem:$dst, u8imm:$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>;
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000431def RCR8mi : Ii8<0xC0, MRM3m, (outs), (ins i8mem:$dst, u8imm:$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;
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000435def RCR16mi : Ii8<0xC1, MRM3m, (outs), (ins i16mem:$dst, u8imm:$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;
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000439def RCR32mi : Ii8<0xC1, MRM3m, (outs), (ins i32mem:$dst, u8imm:$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>;
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000443def RCR64mi : RIi8<0xC1, MRM3m, (outs), (ins i64mem:$dst, u8imm:$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
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000485def ROL8ri : Ii8<0xC0, MRM0r, (outs GR8 :$dst), (ins GR8 :$src1, u8imm:$src2),
Chris Lattner1b3aa862010-10-05 07:00:12 +0000486 "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>;
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000488def ROL16ri : Ii8<0xC1, MRM0r, (outs GR16:$dst), (ins GR16:$src1, u8imm:$src2),
Chris Lattner1b3aa862010-10-05 07:00:12 +0000489 "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;
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000492def ROL32ri : Ii8<0xC1, MRM0r, (outs GR32:$dst), (ins GR32:$src1, u8imm:$src2),
Chris Lattner1b3aa862010-10-05 07:00:12 +0000493 "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;
Michael Liao5bf95782014-12-04 05:20:33 +0000496def ROL64ri : RIi8<0xC1, MRM0r, (outs GR64:$dst),
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000497 (ins GR64:$src1, u8imm:$src2),
Chris Lattner1818dd52010-10-05 07:13:35 +0000498 "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}
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000540def ROL8mi : Ii8<0xC0, MRM0m, (outs), (ins i8mem :$dst, u8imm:$src1),
Chris Lattner1818dd52010-10-05 07:13:35 +0000541 "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>;
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000544def ROL16mi : Ii8<0xC1, MRM0m, (outs), (ins i16mem:$dst, u8imm:$src1),
Chris Lattner1818dd52010-10-05 07:13:35 +0000545 "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;
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000548def ROL32mi : Ii8<0xC1, MRM0m, (outs), (ins i32mem:$dst, u8imm:$src1),
Chris Lattner1818dd52010-10-05 07:13:35 +0000549 "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;
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000552def ROL64mi : RIi8<0xC1, MRM0m, (outs), (ins i64mem:$dst, u8imm:$src1),
Chris Lattner1818dd52010-10-05 07:13:35 +0000553 "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
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000592def ROR8ri : Ii8<0xC0, MRM1r, (outs GR8 :$dst), (ins GR8 :$src1, u8imm:$src2),
Chris Lattner1b3aa862010-10-05 07:00:12 +0000593 "ror{b}\t{$src2, $dst|$dst, $src2}",
Peter Collingbourne235c2752016-12-08 19:01:00 +0000594 [(set GR8:$dst, (rotr GR8:$src1, (i8 relocImm:$src2)))],
595 IIC_SR>;
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000596def ROR16ri : Ii8<0xC1, MRM1r, (outs GR16:$dst), (ins GR16:$src1, u8imm:$src2),
Chris Lattner1b3aa862010-10-05 07:00:12 +0000597 "ror{w}\t{$src2, $dst|$dst, $src2}",
Peter Collingbourne235c2752016-12-08 19:01:00 +0000598 [(set GR16:$dst, (rotr GR16:$src1, (i8 relocImm:$src2)))],
Craig Topperfa6298a2014-02-02 09:25:09 +0000599 IIC_SR>, OpSize16;
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000600def ROR32ri : Ii8<0xC1, MRM1r, (outs GR32:$dst), (ins GR32:$src1, u8imm:$src2),
Chris Lattner1b3aa862010-10-05 07:00:12 +0000601 "ror{l}\t{$src2, $dst|$dst, $src2}",
Peter Collingbourne235c2752016-12-08 19:01:00 +0000602 [(set GR32:$dst, (rotr GR32:$src1, (i8 relocImm:$src2)))],
Craig Topperfa6298a2014-02-02 09:25:09 +0000603 IIC_SR>, OpSize32;
Michael Liao5bf95782014-12-04 05:20:33 +0000604def ROR64ri : RIi8<0xC1, MRM1r, (outs GR64:$dst),
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000605 (ins GR64:$src1, u8imm:$src2),
Chris Lattner1818dd52010-10-05 07:13:35 +0000606 "ror{q}\t{$src2, $dst|$dst, $src2}",
Peter Collingbourne235c2752016-12-08 19:01:00 +0000607 [(set GR64:$dst, (rotr GR64:$src1, (i8 relocImm:$src2)))],
Andrew Trick8523b162012-02-01 23:20:51 +0000608 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000609
610// Rotate by 1
611def ROR8r1 : I<0xD0, MRM1r, (outs GR8 :$dst), (ins GR8 :$src1),
612 "ror{b}\t$dst",
Zvi Rackover2a21f122016-10-10 14:43:55 +0000613 [(set GR8:$dst, (rotl GR8:$src1, (i8 7)))],
Andrew Trick8523b162012-02-01 23:20:51 +0000614 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000615def ROR16r1 : I<0xD1, MRM1r, (outs GR16:$dst), (ins GR16:$src1),
616 "ror{w}\t$dst",
Zvi Rackover2a21f122016-10-10 14:43:55 +0000617 [(set GR16:$dst, (rotl GR16:$src1, (i8 15)))],
Craig Topperfa6298a2014-02-02 09:25:09 +0000618 IIC_SR>, OpSize16;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000619def ROR32r1 : I<0xD1, MRM1r, (outs GR32:$dst), (ins GR32:$src1),
620 "ror{l}\t$dst",
Zvi Rackover2a21f122016-10-10 14:43:55 +0000621 [(set GR32:$dst, (rotl GR32:$src1, (i8 31)))],
Craig Topperfa6298a2014-02-02 09:25:09 +0000622 IIC_SR>, OpSize32;
Chris Lattner1818dd52010-10-05 07:13:35 +0000623def ROR64r1 : RI<0xD1, MRM1r, (outs GR64:$dst), (ins GR64:$src1),
624 "ror{q}\t$dst",
Zvi Rackover2a21f122016-10-10 14:43:55 +0000625 [(set GR64:$dst, (rotl GR64:$src1, (i8 63)))],
Andrew Trick8523b162012-02-01 23:20:51 +0000626 IIC_SR>;
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000627} // Constraints = "$src = $dst", SchedRW
Chris Lattner1b3aa862010-10-05 07:00:12 +0000628
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000629let SchedRW = [WriteShiftLd, WriteRMW] in {
Chris Lattner1b3aa862010-10-05 07:00:12 +0000630let Uses = [CL] in {
631def ROR8mCL : I<0xD2, MRM1m, (outs), (ins i8mem :$dst),
Craig Topperefd67d42013-07-31 02:47:52 +0000632 "ror{b}\t{%cl, $dst|$dst, cl}",
Andrew Trick8523b162012-02-01 23:20:51 +0000633 [(store (rotr (loadi8 addr:$dst), CL), addr:$dst)],
634 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000635def ROR16mCL : I<0xD3, MRM1m, (outs), (ins i16mem:$dst),
Craig Topperefd67d42013-07-31 02:47:52 +0000636 "ror{w}\t{%cl, $dst|$dst, cl}",
Andrew Trick8523b162012-02-01 23:20:51 +0000637 [(store (rotr (loadi16 addr:$dst), CL), addr:$dst)],
Craig Topperfa6298a2014-02-02 09:25:09 +0000638 IIC_SR>, OpSize16;
Michael Liao5bf95782014-12-04 05:20:33 +0000639def ROR32mCL : I<0xD3, MRM1m, (outs), (ins i32mem:$dst),
Craig Topperefd67d42013-07-31 02:47:52 +0000640 "ror{l}\t{%cl, $dst|$dst, cl}",
Andrew Trick8523b162012-02-01 23:20:51 +0000641 [(store (rotr (loadi32 addr:$dst), CL), addr:$dst)],
Craig Topperfa6298a2014-02-02 09:25:09 +0000642 IIC_SR>, OpSize32;
Michael Liao5bf95782014-12-04 05:20:33 +0000643def ROR64mCL : RI<0xD3, MRM1m, (outs), (ins i64mem:$dst),
Craig Topperefd67d42013-07-31 02:47:52 +0000644 "ror{q}\t{%cl, $dst|$dst, cl}",
Andrew Trick8523b162012-02-01 23:20:51 +0000645 [(store (rotr (loadi64 addr:$dst), CL), addr:$dst)],
646 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000647}
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000648def ROR8mi : Ii8<0xC0, MRM1m, (outs), (ins i8mem :$dst, u8imm:$src),
Chris Lattner1b3aa862010-10-05 07:00:12 +0000649 "ror{b}\t{$src, $dst|$dst, $src}",
Andrew Trick8523b162012-02-01 23:20:51 +0000650 [(store (rotr (loadi8 addr:$dst), (i8 imm:$src)), addr:$dst)],
651 IIC_SR>;
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000652def ROR16mi : Ii8<0xC1, MRM1m, (outs), (ins i16mem:$dst, u8imm:$src),
Chris Lattner1b3aa862010-10-05 07:00:12 +0000653 "ror{w}\t{$src, $dst|$dst, $src}",
Andrew Trick8523b162012-02-01 23:20:51 +0000654 [(store (rotr (loadi16 addr:$dst), (i8 imm:$src)), addr:$dst)],
Craig Topperfa6298a2014-02-02 09:25:09 +0000655 IIC_SR>, OpSize16;
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000656def ROR32mi : Ii8<0xC1, MRM1m, (outs), (ins i32mem:$dst, u8imm:$src),
Chris Lattner1b3aa862010-10-05 07:00:12 +0000657 "ror{l}\t{$src, $dst|$dst, $src}",
Andrew Trick8523b162012-02-01 23:20:51 +0000658 [(store (rotr (loadi32 addr:$dst), (i8 imm:$src)), addr:$dst)],
Craig Topperfa6298a2014-02-02 09:25:09 +0000659 IIC_SR>, OpSize32;
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000660def ROR64mi : RIi8<0xC1, MRM1m, (outs), (ins i64mem:$dst, u8imm:$src),
Chris Lattner1818dd52010-10-05 07:13:35 +0000661 "ror{q}\t{$src, $dst|$dst, $src}",
Andrew Trick8523b162012-02-01 23:20:51 +0000662 [(store (rotr (loadi64 addr:$dst), (i8 imm:$src)), addr:$dst)],
663 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000664
665// Rotate by 1
666def ROR8m1 : I<0xD0, MRM1m, (outs), (ins i8mem :$dst),
667 "ror{b}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000668 [(store (rotr (loadi8 addr:$dst), (i8 1)), addr:$dst)],
669 IIC_SR>;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000670def ROR16m1 : I<0xD1, MRM1m, (outs), (ins i16mem:$dst),
671 "ror{w}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000672 [(store (rotr (loadi16 addr:$dst), (i8 1)), addr:$dst)],
Craig Topperfa6298a2014-02-02 09:25:09 +0000673 IIC_SR>, OpSize16;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000674def ROR32m1 : I<0xD1, MRM1m, (outs), (ins i32mem:$dst),
675 "ror{l}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000676 [(store (rotr (loadi32 addr:$dst), (i8 1)), addr:$dst)],
Craig Topperfa6298a2014-02-02 09:25:09 +0000677 IIC_SR>, OpSize32;
Chris Lattner1818dd52010-10-05 07:13:35 +0000678def ROR64m1 : RI<0xD1, MRM1m, (outs), (ins i64mem:$dst),
679 "ror{q}\t$dst",
Andrew Trick8523b162012-02-01 23:20:51 +0000680 [(store (rotr (loadi64 addr:$dst), (i8 1)), addr:$dst)],
681 IIC_SR>;
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000682} // SchedRW
Chris Lattner1b3aa862010-10-05 07:00:12 +0000683
684
685//===----------------------------------------------------------------------===//
686// Double shift instructions (generalizations of rotate)
687//===----------------------------------------------------------------------===//
688
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000689let Constraints = "$src1 = $dst", SchedRW = [WriteShift] in {
Chris Lattner1b3aa862010-10-05 07:00:12 +0000690
691let Uses = [CL] in {
Michael Liao5bf95782014-12-04 05:20:33 +0000692def SHLD16rrCL : I<0xA5, MRMDestReg, (outs GR16:$dst),
Chris Lattner1b3aa862010-10-05 07:00:12 +0000693 (ins GR16:$src1, GR16:$src2),
Craig Topperefd67d42013-07-31 02:47:52 +0000694 "shld{w}\t{%cl, $src2, $dst|$dst, $src2, cl}",
Andrew Trick8523b162012-02-01 23:20:51 +0000695 [(set GR16:$dst, (X86shld GR16:$src1, GR16:$src2, CL))],
696 IIC_SHD16_REG_CL>,
Craig Topperfa6298a2014-02-02 09:25:09 +0000697 TB, OpSize16;
Michael Liao5bf95782014-12-04 05:20:33 +0000698def SHRD16rrCL : I<0xAD, MRMDestReg, (outs GR16:$dst),
Chris Lattner1b3aa862010-10-05 07:00:12 +0000699 (ins GR16:$src1, GR16:$src2),
Craig Topperefd67d42013-07-31 02:47:52 +0000700 "shrd{w}\t{%cl, $src2, $dst|$dst, $src2, cl}",
Andrew Trick8523b162012-02-01 23:20:51 +0000701 [(set GR16:$dst, (X86shrd GR16:$src1, GR16:$src2, CL))],
702 IIC_SHD16_REG_CL>,
Craig Topperfa6298a2014-02-02 09:25:09 +0000703 TB, OpSize16;
Michael Liao5bf95782014-12-04 05:20:33 +0000704def SHLD32rrCL : I<0xA5, MRMDestReg, (outs GR32:$dst),
Chris Lattner1818dd52010-10-05 07:13:35 +0000705 (ins GR32:$src1, GR32:$src2),
Craig Topperefd67d42013-07-31 02:47:52 +0000706 "shld{l}\t{%cl, $src2, $dst|$dst, $src2, cl}",
Andrew Trick8523b162012-02-01 23:20:51 +0000707 [(set GR32:$dst, (X86shld GR32:$src1, GR32:$src2, CL))],
Craig Topperfa6298a2014-02-02 09:25:09 +0000708 IIC_SHD32_REG_CL>, TB, OpSize32;
Chris Lattner1818dd52010-10-05 07:13:35 +0000709def SHRD32rrCL : I<0xAD, MRMDestReg, (outs GR32:$dst),
710 (ins GR32:$src1, GR32:$src2),
Craig Topperefd67d42013-07-31 02:47:52 +0000711 "shrd{l}\t{%cl, $src2, $dst|$dst, $src2, cl}",
Andrew Trick8523b162012-02-01 23:20:51 +0000712 [(set GR32:$dst, (X86shrd GR32:$src1, GR32:$src2, CL))],
Craig Topperfa6298a2014-02-02 09:25:09 +0000713 IIC_SHD32_REG_CL>, TB, OpSize32;
Michael Liao5bf95782014-12-04 05:20:33 +0000714def SHLD64rrCL : RI<0xA5, MRMDestReg, (outs GR64:$dst),
Chris Lattner1818dd52010-10-05 07:13:35 +0000715 (ins GR64:$src1, GR64:$src2),
Craig Topperefd67d42013-07-31 02:47:52 +0000716 "shld{q}\t{%cl, $src2, $dst|$dst, $src2, cl}",
Andrew Trick8523b162012-02-01 23:20:51 +0000717 [(set GR64:$dst, (X86shld GR64:$src1, GR64:$src2, CL))],
Michael Liao5bf95782014-12-04 05:20:33 +0000718 IIC_SHD64_REG_CL>,
Chris Lattner1818dd52010-10-05 07:13:35 +0000719 TB;
Michael Liao5bf95782014-12-04 05:20:33 +0000720def SHRD64rrCL : RI<0xAD, MRMDestReg, (outs GR64:$dst),
Chris Lattner1818dd52010-10-05 07:13:35 +0000721 (ins GR64:$src1, GR64:$src2),
Craig Topperefd67d42013-07-31 02:47:52 +0000722 "shrd{q}\t{%cl, $src2, $dst|$dst, $src2, cl}",
Andrew Trick8523b162012-02-01 23:20:51 +0000723 [(set GR64:$dst, (X86shrd GR64:$src1, GR64:$src2, CL))],
Michael Liao5bf95782014-12-04 05:20:33 +0000724 IIC_SHD64_REG_CL>,
Chris Lattner1818dd52010-10-05 07:13:35 +0000725 TB;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000726}
727
728let isCommutable = 1 in { // These instructions commute to each other.
Chris Lattner1b3aa862010-10-05 07:00:12 +0000729def SHLD16rri8 : Ii8<0xA4, MRMDestReg,
Michael Liao5bf95782014-12-04 05:20:33 +0000730 (outs GR16:$dst),
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000731 (ins GR16:$src1, GR16:$src2, u8imm:$src3),
Chris Lattner1b3aa862010-10-05 07:00:12 +0000732 "shld{w}\t{$src3, $src2, $dst|$dst, $src2, $src3}",
733 [(set GR16:$dst, (X86shld GR16:$src1, GR16:$src2,
Andrew Trick8523b162012-02-01 23:20:51 +0000734 (i8 imm:$src3)))], IIC_SHD16_REG_IM>,
Craig Topperfa6298a2014-02-02 09:25:09 +0000735 TB, OpSize16;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000736def SHRD16rri8 : Ii8<0xAC, MRMDestReg,
Michael Liao5bf95782014-12-04 05:20:33 +0000737 (outs GR16:$dst),
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000738 (ins GR16:$src1, GR16:$src2, u8imm:$src3),
Chris Lattner1b3aa862010-10-05 07:00:12 +0000739 "shrd{w}\t{$src3, $src2, $dst|$dst, $src2, $src3}",
740 [(set GR16:$dst, (X86shrd GR16:$src1, GR16:$src2,
Andrew Trick8523b162012-02-01 23:20:51 +0000741 (i8 imm:$src3)))], IIC_SHD16_REG_IM>,
Craig Topperfa6298a2014-02-02 09:25:09 +0000742 TB, OpSize16;
Chris Lattner1818dd52010-10-05 07:13:35 +0000743def SHLD32rri8 : Ii8<0xA4, MRMDestReg,
Michael Liao5bf95782014-12-04 05:20:33 +0000744 (outs GR32:$dst),
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000745 (ins GR32:$src1, GR32:$src2, u8imm:$src3),
Chris Lattner1818dd52010-10-05 07:13:35 +0000746 "shld{l}\t{$src3, $src2, $dst|$dst, $src2, $src3}",
747 [(set GR32:$dst, (X86shld GR32:$src1, GR32:$src2,
Andrew Trick8523b162012-02-01 23:20:51 +0000748 (i8 imm:$src3)))], IIC_SHD32_REG_IM>,
Craig Topperfa6298a2014-02-02 09:25:09 +0000749 TB, OpSize32;
Chris Lattner1818dd52010-10-05 07:13:35 +0000750def SHRD32rri8 : Ii8<0xAC, MRMDestReg,
Michael Liao5bf95782014-12-04 05:20:33 +0000751 (outs GR32:$dst),
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000752 (ins GR32:$src1, GR32:$src2, u8imm:$src3),
Chris Lattner1818dd52010-10-05 07:13:35 +0000753 "shrd{l}\t{$src3, $src2, $dst|$dst, $src2, $src3}",
754 [(set GR32:$dst, (X86shrd GR32:$src1, GR32:$src2,
Andrew Trick8523b162012-02-01 23:20:51 +0000755 (i8 imm:$src3)))], IIC_SHD32_REG_IM>,
Craig Topperfa6298a2014-02-02 09:25:09 +0000756 TB, OpSize32;
Chris Lattner1818dd52010-10-05 07:13:35 +0000757def SHLD64rri8 : RIi8<0xA4, MRMDestReg,
Michael Liao5bf95782014-12-04 05:20:33 +0000758 (outs GR64:$dst),
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000759 (ins GR64:$src1, GR64:$src2, u8imm:$src3),
Chris Lattner1818dd52010-10-05 07:13:35 +0000760 "shld{q}\t{$src3, $src2, $dst|$dst, $src2, $src3}",
761 [(set GR64:$dst, (X86shld GR64:$src1, GR64:$src2,
Andrew Trick8523b162012-02-01 23:20:51 +0000762 (i8 imm:$src3)))], IIC_SHD64_REG_IM>,
Chris Lattner1818dd52010-10-05 07:13:35 +0000763 TB;
764def SHRD64rri8 : RIi8<0xAC, MRMDestReg,
Michael Liao5bf95782014-12-04 05:20:33 +0000765 (outs GR64:$dst),
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000766 (ins GR64:$src1, GR64:$src2, u8imm:$src3),
Chris Lattner1818dd52010-10-05 07:13:35 +0000767 "shrd{q}\t{$src3, $src2, $dst|$dst, $src2, $src3}",
768 [(set GR64:$dst, (X86shrd GR64:$src1, GR64:$src2,
Andrew Trick8523b162012-02-01 23:20:51 +0000769 (i8 imm:$src3)))], IIC_SHD64_REG_IM>,
Chris Lattner1818dd52010-10-05 07:13:35 +0000770 TB;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000771}
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000772} // Constraints = "$src = $dst", SchedRW
Chris Lattner1b3aa862010-10-05 07:00:12 +0000773
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000774let SchedRW = [WriteShiftLd, WriteRMW] in {
Chris Lattner1b3aa862010-10-05 07:00:12 +0000775let Uses = [CL] in {
Chris Lattner1818dd52010-10-05 07:13:35 +0000776def SHLD16mrCL : I<0xA5, MRMDestMem, (outs), (ins i16mem:$dst, GR16:$src2),
Craig Topperefd67d42013-07-31 02:47:52 +0000777 "shld{w}\t{%cl, $src2, $dst|$dst, $src2, cl}",
Chris Lattner1818dd52010-10-05 07:13:35 +0000778 [(store (X86shld (loadi16 addr:$dst), GR16:$src2, CL),
Craig Topperfa6298a2014-02-02 09:25:09 +0000779 addr:$dst)], IIC_SHD16_MEM_CL>, TB, OpSize16;
Chris Lattner1818dd52010-10-05 07:13:35 +0000780def SHRD16mrCL : I<0xAD, MRMDestMem, (outs), (ins i16mem:$dst, GR16:$src2),
Craig Topperefd67d42013-07-31 02:47:52 +0000781 "shrd{w}\t{%cl, $src2, $dst|$dst, $src2, cl}",
Chris Lattner1818dd52010-10-05 07:13:35 +0000782 [(store (X86shrd (loadi16 addr:$dst), GR16:$src2, CL),
Craig Topperfa6298a2014-02-02 09:25:09 +0000783 addr:$dst)], IIC_SHD16_MEM_CL>, TB, OpSize16;
Chris Lattner1818dd52010-10-05 07:13:35 +0000784
Chris Lattner1b3aa862010-10-05 07:00:12 +0000785def SHLD32mrCL : I<0xA5, MRMDestMem, (outs), (ins i32mem:$dst, GR32:$src2),
Craig Topperefd67d42013-07-31 02:47:52 +0000786 "shld{l}\t{%cl, $src2, $dst|$dst, $src2, cl}",
Chris Lattner1b3aa862010-10-05 07:00:12 +0000787 [(store (X86shld (loadi32 addr:$dst), GR32:$src2, CL),
Craig Topperfa6298a2014-02-02 09:25:09 +0000788 addr:$dst)], IIC_SHD32_MEM_CL>, TB, OpSize32;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000789def SHRD32mrCL : I<0xAD, MRMDestMem, (outs), (ins i32mem:$dst, GR32:$src2),
Craig Topperefd67d42013-07-31 02:47:52 +0000790 "shrd{l}\t{%cl, $src2, $dst|$dst, $src2, cl}",
Chris Lattner1b3aa862010-10-05 07:00:12 +0000791 [(store (X86shrd (loadi32 addr:$dst), GR32:$src2, CL),
Craig Topperfa6298a2014-02-02 09:25:09 +0000792 addr:$dst)], IIC_SHD32_MEM_CL>, TB, OpSize32;
Michael Liao5bf95782014-12-04 05:20:33 +0000793
Chris Lattner1818dd52010-10-05 07:13:35 +0000794def SHLD64mrCL : RI<0xA5, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src2),
Craig Topperefd67d42013-07-31 02:47:52 +0000795 "shld{q}\t{%cl, $src2, $dst|$dst, $src2, cl}",
Chris Lattner1818dd52010-10-05 07:13:35 +0000796 [(store (X86shld (loadi64 addr:$dst), GR64:$src2, CL),
Andrew Trick8523b162012-02-01 23:20:51 +0000797 addr:$dst)], IIC_SHD64_MEM_CL>, TB;
Chris Lattner1818dd52010-10-05 07:13:35 +0000798def SHRD64mrCL : RI<0xAD, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src2),
Craig Topperefd67d42013-07-31 02:47:52 +0000799 "shrd{q}\t{%cl, $src2, $dst|$dst, $src2, cl}",
Chris Lattner1818dd52010-10-05 07:13:35 +0000800 [(store (X86shrd (loadi64 addr:$dst), GR64:$src2, CL),
Andrew Trick8523b162012-02-01 23:20:51 +0000801 addr:$dst)], IIC_SHD64_MEM_CL>, TB;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000802}
Chris Lattner1818dd52010-10-05 07:13:35 +0000803
804def SHLD16mri8 : Ii8<0xA4, MRMDestMem,
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000805 (outs), (ins i16mem:$dst, GR16:$src2, u8imm:$src3),
Chris Lattner1818dd52010-10-05 07:13:35 +0000806 "shld{w}\t{$src3, $src2, $dst|$dst, $src2, $src3}",
807 [(store (X86shld (loadi16 addr:$dst), GR16:$src2,
Andrew Trick8523b162012-02-01 23:20:51 +0000808 (i8 imm:$src3)), addr:$dst)],
809 IIC_SHD16_MEM_IM>,
Craig Topperfa6298a2014-02-02 09:25:09 +0000810 TB, OpSize16;
Michael Liao5bf95782014-12-04 05:20:33 +0000811def SHRD16mri8 : Ii8<0xAC, MRMDestMem,
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000812 (outs), (ins i16mem:$dst, GR16:$src2, u8imm:$src3),
Chris Lattner1818dd52010-10-05 07:13:35 +0000813 "shrd{w}\t{$src3, $src2, $dst|$dst, $src2, $src3}",
814 [(store (X86shrd (loadi16 addr:$dst), GR16:$src2,
Andrew Trick8523b162012-02-01 23:20:51 +0000815 (i8 imm:$src3)), addr:$dst)],
816 IIC_SHD16_MEM_IM>,
Craig Topperfa6298a2014-02-02 09:25:09 +0000817 TB, OpSize16;
Chris Lattner1818dd52010-10-05 07:13:35 +0000818
Chris Lattner1b3aa862010-10-05 07:00:12 +0000819def SHLD32mri8 : Ii8<0xA4, MRMDestMem,
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000820 (outs), (ins i32mem:$dst, GR32:$src2, u8imm:$src3),
Chris Lattner1b3aa862010-10-05 07:00:12 +0000821 "shld{l}\t{$src3, $src2, $dst|$dst, $src2, $src3}",
822 [(store (X86shld (loadi32 addr:$dst), GR32:$src2,
Andrew Trick8523b162012-02-01 23:20:51 +0000823 (i8 imm:$src3)), addr:$dst)],
824 IIC_SHD32_MEM_IM>,
Craig Topperfa6298a2014-02-02 09:25:09 +0000825 TB, OpSize32;
Michael Liao5bf95782014-12-04 05:20:33 +0000826def SHRD32mri8 : Ii8<0xAC, MRMDestMem,
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000827 (outs), (ins i32mem:$dst, GR32:$src2, u8imm:$src3),
Chris Lattner1b3aa862010-10-05 07:00:12 +0000828 "shrd{l}\t{$src3, $src2, $dst|$dst, $src2, $src3}",
829 [(store (X86shrd (loadi32 addr:$dst), GR32:$src2,
Andrew Trick8523b162012-02-01 23:20:51 +0000830 (i8 imm:$src3)), addr:$dst)],
831 IIC_SHD32_MEM_IM>,
Craig Topperfa6298a2014-02-02 09:25:09 +0000832 TB, OpSize32;
Chris Lattner1b3aa862010-10-05 07:00:12 +0000833
Chris Lattner1818dd52010-10-05 07:13:35 +0000834def SHLD64mri8 : RIi8<0xA4, MRMDestMem,
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000835 (outs), (ins i64mem:$dst, GR64:$src2, u8imm:$src3),
Chris Lattner1818dd52010-10-05 07:13:35 +0000836 "shld{q}\t{$src3, $src2, $dst|$dst, $src2, $src3}",
837 [(store (X86shld (loadi64 addr:$dst), GR64:$src2,
Andrew Trick8523b162012-02-01 23:20:51 +0000838 (i8 imm:$src3)), addr:$dst)],
839 IIC_SHD64_MEM_IM>,
Chris Lattner1818dd52010-10-05 07:13:35 +0000840 TB;
Michael Liao5bf95782014-12-04 05:20:33 +0000841def SHRD64mri8 : RIi8<0xAC, MRMDestMem,
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000842 (outs), (ins i64mem:$dst, GR64:$src2, u8imm:$src3),
Chris Lattner1818dd52010-10-05 07:13:35 +0000843 "shrd{q}\t{$src3, $src2, $dst|$dst, $src2, $src3}",
844 [(store (X86shrd (loadi64 addr:$dst), GR64:$src2,
Andrew Trick8523b162012-02-01 23:20:51 +0000845 (i8 imm:$src3)), addr:$dst)],
846 IIC_SHD64_MEM_IM>,
Chris Lattner1818dd52010-10-05 07:13:35 +0000847 TB;
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000848} // SchedRW
Chris Lattner1818dd52010-10-05 07:13:35 +0000849
Chris Lattner1b3aa862010-10-05 07:00:12 +0000850} // Defs = [EFLAGS]
851
Michael Liao2de86af2012-09-26 08:24:51 +0000852def ROT32L2R_imm8 : SDNodeXForm<imm, [{
853 // Convert a ROTL shamt to a ROTR shamt on 32-bit integer.
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +0000854 return getI8Imm(32 - N->getZExtValue(), SDLoc(N));
Michael Liao2de86af2012-09-26 08:24:51 +0000855}]>;
856
857def ROT64L2R_imm8 : SDNodeXForm<imm, [{
858 // Convert a ROTL shamt to a ROTR shamt on 64-bit integer.
Sergey Dmitrouk842a51b2015-04-28 14:05:47 +0000859 return getI8Imm(64 - N->getZExtValue(), SDLoc(N));
Michael Liao2de86af2012-09-26 08:24:51 +0000860}]>;
861
Craig Topperb05d9e92011-10-23 22:18:24 +0000862multiclass bmi_rotate<string asm, RegisterClass RC, X86MemOperand x86memop> {
Craig Topperc50d64b2014-11-26 00:46:26 +0000863let hasSideEffects = 0 in {
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000864 def ri : Ii8<0xF0, MRMSrcReg, (outs RC:$dst), (ins RC:$src1, u8imm:$src2),
Craig Topperb05d9e92011-10-23 22:18:24 +0000865 !strconcat(asm, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000866 []>, TAXD, VEX, Sched<[WriteShift]>;
Craig Topper980d5982011-10-23 07:34:00 +0000867 let mayLoad = 1 in
Craig Topperb05d9e92011-10-23 22:18:24 +0000868 def mi : Ii8<0xF0, MRMSrcMem, (outs RC:$dst),
Craig Topper8d2e6bc2015-10-12 06:23:10 +0000869 (ins x86memop:$src1, u8imm:$src2),
Craig Topperb05d9e92011-10-23 22:18:24 +0000870 !strconcat(asm, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
Jakob Stoklund Olesen7fde8c42013-03-25 23:07:32 +0000871 []>, TAXD, VEX, Sched<[WriteShiftLd]>;
Craig Topperb05d9e92011-10-23 22:18:24 +0000872}
873}
Craig Topper980d5982011-10-23 07:34:00 +0000874
Craig Topperb05d9e92011-10-23 22:18:24 +0000875multiclass bmi_shift<string asm, RegisterClass RC, X86MemOperand x86memop> {
Craig Topperc50d64b2014-11-26 00:46:26 +0000876let hasSideEffects = 0 in {
Craig Topper5f8419d2016-08-22 07:38:50 +0000877 def rr : I<0xF7, MRMSrcReg4VOp3, (outs RC:$dst), (ins RC:$src1, RC:$src2),
Craig Topperb05d9e92011-10-23 22:18:24 +0000878 !strconcat(asm, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"), []>,
Craig Topper5f8419d2016-08-22 07:38:50 +0000879 VEX, Sched<[WriteShift]>;
Craig Topper980d5982011-10-23 07:34:00 +0000880 let mayLoad = 1 in
Craig Topper5f8419d2016-08-22 07:38:50 +0000881 def rm : I<0xF7, MRMSrcMem4VOp3,
882 (outs RC:$dst), (ins x86memop:$src1, RC:$src2),
Craig Topperb05d9e92011-10-23 22:18:24 +0000883 !strconcat(asm, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"), []>,
Craig Topper5f8419d2016-08-22 07:38:50 +0000884 VEX, Sched<[WriteShiftLd,
885 // x86memop:$src1
886 ReadDefault, ReadDefault, ReadDefault, ReadDefault,
887 ReadDefault,
888 // RC:$src1
889 ReadAfterLd]>;
Craig Topperb05d9e92011-10-23 22:18:24 +0000890}
891}
892
893let Predicates = [HasBMI2] in {
894 defm RORX32 : bmi_rotate<"rorx{l}", GR32, i32mem>;
895 defm RORX64 : bmi_rotate<"rorx{q}", GR64, i64mem>, VEX_W;
896 defm SARX32 : bmi_shift<"sarx{l}", GR32, i32mem>, T8XS;
897 defm SARX64 : bmi_shift<"sarx{q}", GR64, i64mem>, T8XS, VEX_W;
898 defm SHRX32 : bmi_shift<"shrx{l}", GR32, i32mem>, T8XD;
899 defm SHRX64 : bmi_shift<"shrx{q}", GR64, i64mem>, T8XD, VEX_W;
Craig Topperae11aed2014-01-14 07:41:20 +0000900 defm SHLX32 : bmi_shift<"shlx{l}", GR32, i32mem>, T8PD;
901 defm SHLX64 : bmi_shift<"shlx{q}", GR64, i64mem>, T8PD, VEX_W;
Michael Liao2de86af2012-09-26 08:24:51 +0000902
903 // Prefer RORX which is non-destructive and doesn't update EFLAGS.
904 let AddedComplexity = 10 in {
905 def : Pat<(rotl GR32:$src, (i8 imm:$shamt)),
906 (RORX32ri GR32:$src, (ROT32L2R_imm8 imm:$shamt))>;
907 def : Pat<(rotl GR64:$src, (i8 imm:$shamt)),
908 (RORX64ri GR64:$src, (ROT64L2R_imm8 imm:$shamt))>;
909 }
910
911 def : Pat<(rotl (loadi32 addr:$src), (i8 imm:$shamt)),
912 (RORX32mi addr:$src, (ROT32L2R_imm8 imm:$shamt))>;
913 def : Pat<(rotl (loadi64 addr:$src), (i8 imm:$shamt)),
914 (RORX64mi addr:$src, (ROT64L2R_imm8 imm:$shamt))>;
Michael Liao2b425e12012-09-26 08:26:25 +0000915
916 // Prefer SARX/SHRX/SHLX over SAR/SHR/SHL with variable shift BUT not
917 // immedidate shift, i.e. the following code is considered better
918 //
919 // mov %edi, %esi
920 // shl $imm, %esi
921 // ... %edi, ...
922 //
923 // than
924 //
925 // movb $imm, %sil
926 // shlx %sil, %edi, %esi
927 // ... %edi, ...
928 //
929 let AddedComplexity = 1 in {
930 def : Pat<(sra GR32:$src1, GR8:$src2),
931 (SARX32rr GR32:$src1,
932 (INSERT_SUBREG
933 (i32 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
934 def : Pat<(sra GR64:$src1, GR8:$src2),
935 (SARX64rr GR64:$src1,
936 (INSERT_SUBREG
937 (i64 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
938
939 def : Pat<(srl GR32:$src1, GR8:$src2),
940 (SHRX32rr GR32:$src1,
941 (INSERT_SUBREG
942 (i32 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
943 def : Pat<(srl GR64:$src1, GR8:$src2),
944 (SHRX64rr GR64:$src1,
945 (INSERT_SUBREG
946 (i64 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
947
948 def : Pat<(shl GR32:$src1, GR8:$src2),
949 (SHLX32rr GR32:$src1,
950 (INSERT_SUBREG
951 (i32 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
952 def : Pat<(shl GR64:$src1, GR8:$src2),
953 (SHLX64rr GR64:$src1,
954 (INSERT_SUBREG
955 (i64 (IMPLICIT_DEF)), GR8:$src2, sub_8bit))>;
956 }
957
958 // Patterns on SARXrm/SHRXrm/SHLXrm are explicitly omitted to favor
959 //
960 // mov (%ecx), %esi
961 // shl $imm, $esi
962 //
963 // over
964 //
965 // movb $imm %al
966 // shlx %al, (%ecx), %esi
967 //
968 // As SARXrr/SHRXrr/SHLXrr is favored on variable shift, the peephole
969 // optimization will fold them into SARXrm/SHRXrm/SHLXrm if possible.
Craig Topper980d5982011-10-23 07:34:00 +0000970}