1//===-- X86InstrFormats.td - X86 Instruction Formats -------*- tablegen -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10//===----------------------------------------------------------------------===// 11// X86 Instruction Format Definitions. 12// 13 14// Format specifies the encoding used by the instruction. This is part of the 15// ad-hoc solution used to emit machine instruction encodings by our machine 16// code emitter. 17class Format<bits<6> val> { 18 bits<6> Value = val; 19} 20 21def Pseudo : Format<0>; def RawFrm : Format<1>; 22def AddRegFrm : Format<2>; def MRMDestReg : Format<3>; 23def MRMDestMem : Format<4>; def MRMSrcReg : Format<5>; 24def MRMSrcMem : Format<6>; 25def MRM0r : Format<16>; def MRM1r : Format<17>; def MRM2r : Format<18>; 26def MRM3r : Format<19>; def MRM4r : Format<20>; def MRM5r : Format<21>; 27def MRM6r : Format<22>; def MRM7r : Format<23>; 28def MRM0m : Format<24>; def MRM1m : Format<25>; def MRM2m : Format<26>; 29def MRM3m : Format<27>; def MRM4m : Format<28>; def MRM5m : Format<29>; 30def MRM6m : Format<30>; def MRM7m : Format<31>; 31def MRMInitReg : Format<32>; 32def MRM_C1 : Format<33>; 33def MRM_C2 : Format<34>; 34def MRM_C3 : Format<35>; 35def MRM_C4 : Format<36>; 36def MRM_C8 : Format<37>; 37def MRM_C9 : Format<38>; 38def MRM_E8 : Format<39>; 39def MRM_F0 : Format<40>; 40def MRM_F8 : Format<41>; 41def MRM_F9 : Format<42>; 42def RawFrmImm8 : Format<43>; 43def RawFrmImm16 : Format<44>; 44def MRM_D0 : Format<45>; 45def MRM_D1 : Format<46>; 46def MRM_D4 : Format<47>; 47def MRM_D5 : Format<48>; 48def MRM_D8 : Format<49>; 49def MRM_D9 : Format<50>; 50def MRM_DA : Format<51>; 51def MRM_DB : Format<52>; 52def MRM_DC : Format<53>; 53def MRM_DD : Format<54>; 54def MRM_DE : Format<55>; 55def MRM_DF : Format<56>; 56 57// ImmType - This specifies the immediate type used by an instruction. This is 58// part of the ad-hoc solution used to emit machine instruction encodings by our 59// machine code emitter. 60class ImmType<bits<3> val> { 61 bits<3> Value = val; 62} 63def NoImm : ImmType<0>; 64def Imm8 : ImmType<1>; 65def Imm8PCRel : ImmType<2>; 66def Imm16 : ImmType<3>; 67def Imm16PCRel : ImmType<4>; 68def Imm32 : ImmType<5>; 69def Imm32PCRel : ImmType<6>; 70def Imm64 : ImmType<7>; 71 72// FPFormat - This specifies what form this FP instruction has. This is used by 73// the Floating-Point stackifier pass. 74class FPFormat<bits<3> val> { 75 bits<3> Value = val; 76} 77def NotFP : FPFormat<0>; 78def ZeroArgFP : FPFormat<1>; 79def OneArgFP : FPFormat<2>; 80def OneArgFPRW : FPFormat<3>; 81def TwoArgFP : FPFormat<4>; 82def CompareFP : FPFormat<5>; 83def CondMovFP : FPFormat<6>; 84def SpecialFP : FPFormat<7>; 85 86// Class specifying the SSE execution domain, used by the SSEDomainFix pass. 87// Keep in sync with tables in X86InstrInfo.cpp. 88class Domain<bits<2> val> { 89 bits<2> Value = val; 90} 91def GenericDomain : Domain<0>; 92def SSEPackedSingle : Domain<1>; 93def SSEPackedDouble : Domain<2>; 94def SSEPackedInt : Domain<3>; 95 96// Prefix byte classes which are used to indicate to the ad-hoc machine code 97// emitter that various prefix bytes are required. 98class OpSize { bit hasOpSizePrefix = 1; } 99class AdSize { bit hasAdSizePrefix = 1; } 100class REX_W { bit hasREX_WPrefix = 1; } 101class LOCK { bit hasLockPrefix = 1; } 102class SegFS { bits<2> SegOvrBits = 1; } 103class SegGS { bits<2> SegOvrBits = 2; } 104class TB { bits<5> Prefix = 1; } 105class REP { bits<5> Prefix = 2; } 106class D8 { bits<5> Prefix = 3; } 107class D9 { bits<5> Prefix = 4; } 108class DA { bits<5> Prefix = 5; } 109class DB { bits<5> Prefix = 6; } 110class DC { bits<5> Prefix = 7; } 111class DD { bits<5> Prefix = 8; } 112class DE { bits<5> Prefix = 9; } 113class DF { bits<5> Prefix = 10; } 114class XD { bits<5> Prefix = 11; } 115class XS { bits<5> Prefix = 12; } 116class T8 { bits<5> Prefix = 13; } 117class TA { bits<5> Prefix = 14; } 118class A6 { bits<5> Prefix = 15; } 119class A7 { bits<5> Prefix = 16; } 120class T8XD { bits<5> Prefix = 17; } 121class T8XS { bits<5> Prefix = 18; } 122class TAXD { bits<5> Prefix = 19; } 123class XOP8 { bits<5> Prefix = 20; } 124class XOP9 { bits<5> Prefix = 21; } 125class VEX { bit hasVEXPrefix = 1; } 126class VEX_W { bit hasVEX_WPrefix = 1; } 127class VEX_4V : VEX { bit hasVEX_4VPrefix = 1; } 128class VEX_4VOp3 : VEX { bit hasVEX_4VOp3Prefix = 1; } 129class VEX_I8IMM { bit hasVEX_i8ImmReg = 1; } 130class VEX_L { bit hasVEX_L = 1; } 131class VEX_LIG { bit ignoresVEX_L = 1; } 132class Has3DNow0F0FOpcode { bit has3DNow0F0FOpcode = 1; } 133class MemOp4 { bit hasMemOp4Prefix = 1; } 134class XOP { bit hasXOP_Prefix = 1; } 135class X86Inst<bits<8> opcod, Format f, ImmType i, dag outs, dag ins, 136 string AsmStr, 137 InstrItinClass itin, 138 Domain d = GenericDomain> 139 : Instruction { 140 let Namespace = "X86"; 141 142 bits<8> Opcode = opcod; 143 Format Form = f; 144 bits<6> FormBits = Form.Value; 145 ImmType ImmT = i; 146 147 dag OutOperandList = outs; 148 dag InOperandList = ins; 149 string AsmString = AsmStr; 150 151 // If this is a pseudo instruction, mark it isCodeGenOnly. 152 let isCodeGenOnly = !eq(!cast<string>(f), "Pseudo"); 153 154 let Itinerary = itin; 155 156 // 157 // Attributes specific to X86 instructions... 158 // 159 bit hasOpSizePrefix = 0; // Does this inst have a 0x66 prefix? 160 bit hasAdSizePrefix = 0; // Does this inst have a 0x67 prefix? 161 162 bits<5> Prefix = 0; // Which prefix byte does this inst have? 163 bit hasREX_WPrefix = 0; // Does this inst require the REX.W prefix? 164 FPFormat FPForm = NotFP; // What flavor of FP instruction is this? 165 bit hasLockPrefix = 0; // Does this inst have a 0xF0 prefix? 166 bits<2> SegOvrBits = 0; // Segment override prefix. 167 Domain ExeDomain = d; 168 bit hasVEXPrefix = 0; // Does this inst require a VEX prefix? 169 bit hasVEX_WPrefix = 0; // Does this inst set the VEX_W field? 170 bit hasVEX_4VPrefix = 0; // Does this inst require the VEX.VVVV field? 171 bit hasVEX_4VOp3Prefix = 0; // Does this inst require the VEX.VVVV field to 172 // encode the third operand? 173 bit hasVEX_i8ImmReg = 0; // Does this inst require the last source register 174 // to be encoded in a immediate field? 175 bit hasVEX_L = 0; // Does this inst use large (256-bit) registers? 176 bit ignoresVEX_L = 0; // Does this instruction ignore the L-bit 177 bit has3DNow0F0FOpcode =0;// Wacky 3dNow! encoding? 178 bit hasMemOp4Prefix = 0; // Same bit as VEX_W, but used for swapping operands 179 bit hasXOP_Prefix = 0; // Does this inst require an XOP prefix? 180 181 // TSFlags layout should be kept in sync with X86InstrInfo.h. 182 let TSFlags{5-0} = FormBits; 183 let TSFlags{6} = hasOpSizePrefix; 184 let TSFlags{7} = hasAdSizePrefix; 185 let TSFlags{12-8} = Prefix; 186 let TSFlags{13} = hasREX_WPrefix; 187 let TSFlags{16-14} = ImmT.Value; 188 let TSFlags{19-17} = FPForm.Value; 189 let TSFlags{20} = hasLockPrefix; 190 let TSFlags{22-21} = SegOvrBits; 191 let TSFlags{24-23} = ExeDomain.Value; 192 let TSFlags{32-25} = Opcode; 193 let TSFlags{33} = hasVEXPrefix; 194 let TSFlags{34} = hasVEX_WPrefix; 195 let TSFlags{35} = hasVEX_4VPrefix; 196 let TSFlags{36} = hasVEX_4VOp3Prefix; 197 let TSFlags{37} = hasVEX_i8ImmReg; 198 let TSFlags{38} = hasVEX_L; 199 let TSFlags{39} = ignoresVEX_L; 200 let TSFlags{40} = has3DNow0F0FOpcode; 201 let TSFlags{41} = hasMemOp4Prefix; 202 let TSFlags{42} = hasXOP_Prefix; 203} 204 205class PseudoI<dag oops, dag iops, list<dag> pattern> 206 : X86Inst<0, Pseudo, NoImm, oops, iops, "", NoItinerary> { 207 let Pattern = pattern; 208} 209 210class I<bits<8> o, Format f, dag outs, dag ins, string asm, 211 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT, 212 Domain d = GenericDomain> 213 : X86Inst<o, f, NoImm, outs, ins, asm, itin, d> { 214 let Pattern = pattern; 215 let CodeSize = 3; 216} 217class Ii8 <bits<8> o, Format f, dag outs, dag ins, string asm, 218 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT, 219 Domain d = GenericDomain> 220 : X86Inst<o, f, Imm8, outs, ins, asm, itin, d> { 221 let Pattern = pattern; 222 let CodeSize = 3; 223} 224class Ii8PCRel<bits<8> o, Format f, dag outs, dag ins, string asm, 225 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 226 : X86Inst<o, f, Imm8PCRel, outs, ins, asm, itin> { 227 let Pattern = pattern; 228 let CodeSize = 3; 229} 230class Ii16<bits<8> o, Format f, dag outs, dag ins, string asm, 231 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 232 : X86Inst<o, f, Imm16, outs, ins, asm, itin> { 233 let Pattern = pattern; 234 let CodeSize = 3; 235} 236class Ii32<bits<8> o, Format f, dag outs, dag ins, string asm, 237 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 238 : X86Inst<o, f, Imm32, outs, ins, asm, itin> { 239 let Pattern = pattern; 240 let CodeSize = 3; 241} 242 243class Ii16PCRel<bits<8> o, Format f, dag outs, dag ins, string asm, 244 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 245 : X86Inst<o, f, Imm16PCRel, outs, ins, asm, itin> { 246 let Pattern = pattern; 247 let CodeSize = 3; 248} 249 250class Ii32PCRel<bits<8> o, Format f, dag outs, dag ins, string asm, 251 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 252 : X86Inst<o, f, Imm32PCRel, outs, ins, asm, itin> { 253 let Pattern = pattern; 254 let CodeSize = 3; 255} 256 257// FPStack Instruction Templates: 258// FPI - Floating Point Instruction template. 259class FPI<bits<8> o, Format F, dag outs, dag ins, string asm, 260 InstrItinClass itin = IIC_DEFAULT> 261 : I<o, F, outs, ins, asm, [], itin> {} 262 263// FpI_ - Floating Point Pseudo Instruction template. Not Predicated. 264class FpI_<dag outs, dag ins, FPFormat fp, list<dag> pattern, 265 InstrItinClass itin = IIC_DEFAULT> 266 : X86Inst<0, Pseudo, NoImm, outs, ins, "", itin> { 267 let FPForm = fp; 268 let Pattern = pattern; 269} 270 271// Templates for instructions that use a 16- or 32-bit segmented address as 272// their only operand: lcall (FAR CALL) and ljmp (FAR JMP) 273// 274// Iseg16 - 16-bit segment selector, 16-bit offset 275// Iseg32 - 16-bit segment selector, 32-bit offset 276 277class Iseg16 <bits<8> o, Format f, dag outs, dag ins, string asm, 278 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 279 : X86Inst<o, f, Imm16, outs, ins, asm, itin> { 280 let Pattern = pattern; 281 let CodeSize = 3; 282} 283 284class Iseg32 <bits<8> o, Format f, dag outs, dag ins, string asm, 285 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 286 : X86Inst<o, f, Imm32, outs, ins, asm, itin> { 287 let Pattern = pattern; 288 let CodeSize = 3; 289} 290 291def __xs : XS; 292 293// SI - SSE 1 & 2 scalar instructions 294class SI<bits<8> o, Format F, dag outs, dag ins, string asm, 295 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 296 : I<o, F, outs, ins, asm, pattern, itin> { 297 let Predicates = !if(hasVEXPrefix /* VEX */, [HasAVX], 298 !if(!eq(Prefix, __xs.Prefix), [UseSSE1], [UseSSE2])); 299 300 // AVX instructions have a 'v' prefix in the mnemonic 301 let AsmString = !if(hasVEXPrefix, !strconcat("v", asm), asm); 302} 303 304// SIi8 - SSE 1 & 2 scalar instructions 305class SIi8<bits<8> o, Format F, dag outs, dag ins, string asm, 306 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 307 : Ii8<o, F, outs, ins, asm, pattern, itin> { 308 let Predicates = !if(hasVEXPrefix /* VEX */, [HasAVX], 309 !if(!eq(Prefix, __xs.Prefix), [UseSSE1], [UseSSE2])); 310 311 // AVX instructions have a 'v' prefix in the mnemonic 312 let AsmString = !if(hasVEXPrefix, !strconcat("v", asm), asm); 313} 314 315// PI - SSE 1 & 2 packed instructions 316class PI<bits<8> o, Format F, dag outs, dag ins, string asm, list<dag> pattern, 317 InstrItinClass itin, Domain d> 318 : I<o, F, outs, ins, asm, pattern, itin, d> { 319 let Predicates = !if(hasVEXPrefix /* VEX */, [HasAVX], 320 !if(hasOpSizePrefix /* OpSize */, [UseSSE2], [UseSSE1])); 321 322 // AVX instructions have a 'v' prefix in the mnemonic 323 let AsmString = !if(hasVEXPrefix, !strconcat("v", asm), asm); 324} 325 326// MMXPI - SSE 1 & 2 packed instructions with MMX operands 327class MMXPI<bits<8> o, Format F, dag outs, dag ins, string asm, list<dag> pattern, 328 InstrItinClass itin, Domain d> 329 : I<o, F, outs, ins, asm, pattern, itin, d> { 330 let Predicates = !if(hasOpSizePrefix /* OpSize */, [HasSSE2], [HasSSE1]); 331} 332 333// PIi8 - SSE 1 & 2 packed instructions with immediate 334class PIi8<bits<8> o, Format F, dag outs, dag ins, string asm, 335 list<dag> pattern, InstrItinClass itin, Domain d> 336 : Ii8<o, F, outs, ins, asm, pattern, itin, d> { 337 let Predicates = !if(hasVEX_4VPrefix /* VEX */, [HasAVX], 338 !if(hasOpSizePrefix /* OpSize */, [UseSSE2], [UseSSE1])); 339 340 // AVX instructions have a 'v' prefix in the mnemonic 341 let AsmString = !if(hasVEX_4VPrefix, !strconcat("v", asm), asm); 342} 343 344// SSE1 Instruction Templates: 345// 346// SSI - SSE1 instructions with XS prefix. 347// PSI - SSE1 instructions with TB prefix. 348// PSIi8 - SSE1 instructions with ImmT == Imm8 and TB prefix. 349// VSSI - SSE1 instructions with XS prefix in AVX form. 350// VPSI - SSE1 instructions with TB prefix in AVX form. 351 352class SSI<bits<8> o, Format F, dag outs, dag ins, string asm, 353 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 354 : I<o, F, outs, ins, asm, pattern, itin>, XS, Requires<[UseSSE1]>; 355class SSIi8<bits<8> o, Format F, dag outs, dag ins, string asm, 356 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 357 : Ii8<o, F, outs, ins, asm, pattern, itin>, XS, Requires<[UseSSE1]>; 358class PSI<bits<8> o, Format F, dag outs, dag ins, string asm, 359 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 360 : I<o, F, outs, ins, asm, pattern, itin, SSEPackedSingle>, TB, 361 Requires<[UseSSE1]>; 362class PSIi8<bits<8> o, Format F, dag outs, dag ins, string asm, 363 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 364 : Ii8<o, F, outs, ins, asm, pattern, itin, SSEPackedSingle>, TB, 365 Requires<[UseSSE1]>; 366class VSSI<bits<8> o, Format F, dag outs, dag ins, string asm, 367 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 368 : I<o, F, outs, ins, !strconcat("v", asm), pattern, itin>, XS, 369 Requires<[HasAVX]>; 370class VPSI<bits<8> o, Format F, dag outs, dag ins, string asm, 371 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 372 : I<o, F, outs, ins, !strconcat("v", asm), pattern, itin, SSEPackedSingle>, TB, 373 Requires<[HasAVX]>; 374 375// SSE2 Instruction Templates: 376// 377// SDI - SSE2 instructions with XD prefix. 378// SDIi8 - SSE2 instructions with ImmT == Imm8 and XD prefix. 379// S2SI - SSE2 instructions with XS prefix. 380// SSDIi8 - SSE2 instructions with ImmT == Imm8 and XS prefix. 381// PDI - SSE2 instructions with TB and OpSize prefixes. 382// PDIi8 - SSE2 instructions with ImmT == Imm8 and TB and OpSize prefixes. 383// VSDI - SSE2 instructions with XD prefix in AVX form. 384// VPDI - SSE2 instructions with TB and OpSize prefixes in AVX form. 385// MMXSDIi8 - SSE2 instructions with ImmT == Imm8 and XD prefix as well as 386// MMX operands. 387// MMXSSDIi8 - SSE2 instructions with ImmT == Imm8 and XS prefix as well as 388// MMX operands. 389 390class SDI<bits<8> o, Format F, dag outs, dag ins, string asm, 391 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 392 : I<o, F, outs, ins, asm, pattern, itin>, XD, Requires<[UseSSE2]>; 393class SDIi8<bits<8> o, Format F, dag outs, dag ins, string asm, 394 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 395 : Ii8<o, F, outs, ins, asm, pattern, itin>, XD, Requires<[UseSSE2]>; 396class S2SI<bits<8> o, Format F, dag outs, dag ins, string asm, 397 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 398 : I<o, F, outs, ins, asm, pattern, itin>, XS, Requires<[UseSSE2]>; 399class S2SIi8<bits<8> o, Format F, dag outs, dag ins, string asm, 400 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 401 : Ii8<o, F, outs, ins, asm, pattern>, XS, Requires<[UseSSE2]>; 402class PDI<bits<8> o, Format F, dag outs, dag ins, string asm, 403 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 404 : I<o, F, outs, ins, asm, pattern, itin, SSEPackedDouble>, TB, OpSize, 405 Requires<[UseSSE2]>; 406class PDIi8<bits<8> o, Format F, dag outs, dag ins, string asm, 407 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 408 : Ii8<o, F, outs, ins, asm, pattern, itin, SSEPackedDouble>, TB, OpSize, 409 Requires<[UseSSE2]>; 410class VSDI<bits<8> o, Format F, dag outs, dag ins, string asm, 411 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 412 : I<o, F, outs, ins, !strconcat("v", asm), pattern, itin>, XD, 413 Requires<[HasAVX]>; 414class VS2SI<bits<8> o, Format F, dag outs, dag ins, string asm, 415 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 416 : I<o, F, outs, ins, !strconcat("v", asm), pattern, itin>, XS, 417 Requires<[HasAVX]>; 418class VPDI<bits<8> o, Format F, dag outs, dag ins, string asm, 419 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 420 : I<o, F, outs, ins, !strconcat("v", asm), pattern, itin, SSEPackedDouble>, TB, 421 OpSize, Requires<[HasAVX]>; 422class MMXSDIi8<bits<8> o, Format F, dag outs, dag ins, string asm, 423 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 424 : Ii8<o, F, outs, ins, asm, pattern, itin>, XD, Requires<[HasSSE2]>; 425class MMXS2SIi8<bits<8> o, Format F, dag outs, dag ins, string asm, 426 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 427 : Ii8<o, F, outs, ins, asm, pattern>, XS, Requires<[HasSSE2]>; 428 429// SSE3 Instruction Templates: 430// 431// S3I - SSE3 instructions with TB and OpSize prefixes. 432// S3SI - SSE3 instructions with XS prefix. 433// S3DI - SSE3 instructions with XD prefix. 434 435class S3SI<bits<8> o, Format F, dag outs, dag ins, string asm, 436 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 437 : I<o, F, outs, ins, asm, pattern, itin, SSEPackedSingle>, XS, 438 Requires<[UseSSE3]>; 439class S3DI<bits<8> o, Format F, dag outs, dag ins, string asm, 440 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 441 : I<o, F, outs, ins, asm, pattern, itin, SSEPackedDouble>, XD, 442 Requires<[UseSSE3]>; 443class S3I<bits<8> o, Format F, dag outs, dag ins, string asm, 444 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 445 : I<o, F, outs, ins, asm, pattern, itin, SSEPackedDouble>, TB, OpSize, 446 Requires<[UseSSE3]>; 447 448 449// SSSE3 Instruction Templates: 450// 451// SS38I - SSSE3 instructions with T8 prefix. 452// SS3AI - SSSE3 instructions with TA prefix. 453// MMXSS38I - SSSE3 instructions with T8 prefix and MMX operands. 454// MMXSS3AI - SSSE3 instructions with TA prefix and MMX operands. 455// 456// Note: SSSE3 instructions have 64-bit and 128-bit versions. The 64-bit version 457// uses the MMX registers. The 64-bit versions are grouped with the MMX 458// classes. They need to be enabled even if AVX is enabled. 459 460class SS38I<bits<8> o, Format F, dag outs, dag ins, string asm, 461 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 462 : I<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, T8, 463 Requires<[UseSSSE3]>; 464class SS3AI<bits<8> o, Format F, dag outs, dag ins, string asm, 465 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 466 : Ii8<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, TA, 467 Requires<[UseSSSE3]>; 468class MMXSS38I<bits<8> o, Format F, dag outs, dag ins, string asm, 469 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 470 : I<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, T8, 471 Requires<[HasSSSE3]>; 472class MMXSS3AI<bits<8> o, Format F, dag outs, dag ins, string asm, 473 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 474 : Ii8<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, TA, 475 Requires<[HasSSSE3]>; 476 477// SSE4.1 Instruction Templates: 478// 479// SS48I - SSE 4.1 instructions with T8 prefix. 480// SS41AIi8 - SSE 4.1 instructions with TA prefix and ImmT == Imm8. 481// 482class SS48I<bits<8> o, Format F, dag outs, dag ins, string asm, 483 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 484 : I<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, T8, 485 Requires<[UseSSE41]>; 486class SS4AIi8<bits<8> o, Format F, dag outs, dag ins, string asm, 487 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 488 : Ii8<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, TA, 489 Requires<[UseSSE41]>; 490 491// SSE4.2 Instruction Templates: 492// 493// SS428I - SSE 4.2 instructions with T8 prefix. 494class SS428I<bits<8> o, Format F, dag outs, dag ins, string asm, 495 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 496 : I<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, T8, 497 Requires<[UseSSE42]>; 498 499// SS42FI - SSE 4.2 instructions with T8XD prefix. 500// NOTE: 'HasSSE42' is used as SS42FI is only used for CRC32 insns. 501class SS42FI<bits<8> o, Format F, dag outs, dag ins, string asm, 502 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 503 : I<o, F, outs, ins, asm, pattern, itin>, T8XD, Requires<[HasSSE42]>; 504 505// SS42AI = SSE 4.2 instructions with TA prefix 506class SS42AI<bits<8> o, Format F, dag outs, dag ins, string asm, 507 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 508 : Ii8<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, TA, 509 Requires<[UseSSE42]>; 510 511// AVX Instruction Templates: 512// Instructions introduced in AVX (no SSE equivalent forms) 513// 514// AVX8I - AVX instructions with T8 and OpSize prefix. 515// AVXAIi8 - AVX instructions with TA, OpSize prefix and ImmT = Imm8. 516class AVX8I<bits<8> o, Format F, dag outs, dag ins, string asm, 517 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 518 : I<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, T8, OpSize, 519 Requires<[HasAVX]>; 520class AVXAIi8<bits<8> o, Format F, dag outs, dag ins, string asm, 521 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 522 : Ii8<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, TA, OpSize, 523 Requires<[HasAVX]>; 524 525// AVX2 Instruction Templates: 526// Instructions introduced in AVX2 (no SSE equivalent forms) 527// 528// AVX28I - AVX2 instructions with T8 and OpSize prefix. 529// AVX2AIi8 - AVX2 instructions with TA, OpSize prefix and ImmT = Imm8. 530class AVX28I<bits<8> o, Format F, dag outs, dag ins, string asm, 531 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 532 : I<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, T8, OpSize, 533 Requires<[HasAVX2]>; 534class AVX2AIi8<bits<8> o, Format F, dag outs, dag ins, string asm, 535 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 536 : Ii8<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, TA, OpSize, 537 Requires<[HasAVX2]>; 538 539// AES Instruction Templates: 540// 541// AES8I 542// These use the same encoding as the SSE4.2 T8 and TA encodings. 543class AES8I<bits<8> o, Format F, dag outs, dag ins, string asm, 544 list<dag>pattern, InstrItinClass itin = IIC_DEFAULT> 545 : I<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, T8, 546 Requires<[HasAES]>; 547 548class AESAI<bits<8> o, Format F, dag outs, dag ins, string asm, 549 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 550 : Ii8<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, TA, 551 Requires<[HasAES]>; 552 553// PCLMUL Instruction Templates 554class PCLMULIi8<bits<8> o, Format F, dag outs, dag ins, string asm, 555 list<dag>pattern, InstrItinClass itin = IIC_DEFAULT> 556 : Ii8<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, TA, 557 OpSize, Requires<[HasPCLMUL]>; 558 559class AVXPCLMULIi8<bits<8> o, Format F, dag outs, dag ins, string asm, 560 list<dag>pattern, InstrItinClass itin = IIC_DEFAULT> 561 : Ii8<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, TA, 562 OpSize, VEX_4V, Requires<[HasAVX, HasPCLMUL]>; 563 564// FMA3 Instruction Templates 565class FMA3<bits<8> o, Format F, dag outs, dag ins, string asm, 566 list<dag>pattern, InstrItinClass itin = IIC_DEFAULT> 567 : I<o, F, outs, ins, asm, pattern, itin>, T8, 568 OpSize, VEX_4V, Requires<[HasFMA]>; 569 570// FMA4 Instruction Templates 571class FMA4<bits<8> o, Format F, dag outs, dag ins, string asm, 572 list<dag>pattern, InstrItinClass itin = IIC_DEFAULT> 573 : Ii8<o, F, outs, ins, asm, pattern, itin>, TA, 574 OpSize, VEX_4V, VEX_I8IMM, Requires<[HasFMA4]>; 575 576// XOP 2, 3 and 4 Operand Instruction Template 577class IXOP<bits<8> o, Format F, dag outs, dag ins, string asm, 578 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 579 : I<o, F, outs, ins, asm, pattern, itin, SSEPackedDouble>, 580 XOP, XOP9, Requires<[HasXOP]>; 581 582// XOP 2, 3 and 4 Operand Instruction Templates with imm byte 583class IXOPi8<bits<8> o, Format F, dag outs, dag ins, string asm, 584 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 585 : Ii8<o, F, outs, ins, asm, pattern, itin, SSEPackedDouble>, 586 XOP, XOP8, Requires<[HasXOP]>; 587 588// XOP 5 operand instruction (VEX encoding!) 589class IXOP5<bits<8> o, Format F, dag outs, dag ins, string asm, 590 list<dag>pattern, InstrItinClass itin = IIC_DEFAULT> 591 : Ii8<o, F, outs, ins, asm, pattern, itin, SSEPackedInt>, TA, 592 OpSize, VEX_4V, VEX_I8IMM, Requires<[HasXOP]>; 593 594// X86-64 Instruction templates... 595// 596 597class RI<bits<8> o, Format F, dag outs, dag ins, string asm, 598 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 599 : I<o, F, outs, ins, asm, pattern, itin>, REX_W; 600class RIi8 <bits<8> o, Format F, dag outs, dag ins, string asm, 601 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 602 : Ii8<o, F, outs, ins, asm, pattern, itin>, REX_W; 603class RIi32 <bits<8> o, Format F, dag outs, dag ins, string asm, 604 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 605 : Ii32<o, F, outs, ins, asm, pattern, itin>, REX_W; 606 607class RIi64<bits<8> o, Format f, dag outs, dag ins, string asm, 608 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 609 : X86Inst<o, f, Imm64, outs, ins, asm, itin>, REX_W { 610 let Pattern = pattern; 611 let CodeSize = 3; 612} 613 614class RSSI<bits<8> o, Format F, dag outs, dag ins, string asm, 615 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 616 : SSI<o, F, outs, ins, asm, pattern, itin>, REX_W; 617class RSDI<bits<8> o, Format F, dag outs, dag ins, string asm, 618 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 619 : SDI<o, F, outs, ins, asm, pattern, itin>, REX_W; 620class RPDI<bits<8> o, Format F, dag outs, dag ins, string asm, 621 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 622 : PDI<o, F, outs, ins, asm, pattern, itin>, REX_W; 623class VRPDI<bits<8> o, Format F, dag outs, dag ins, string asm, 624 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 625 : VPDI<o, F, outs, ins, asm, pattern, itin>, VEX_W; 626 627// MMX Instruction templates 628// 629 630// MMXI - MMX instructions with TB prefix. 631// MMXI64 - MMX instructions with TB prefix valid only in 64 bit mode. 632// MMX2I - MMX / SSE2 instructions with TB and OpSize prefixes. 633// MMXIi8 - MMX instructions with ImmT == Imm8 and TB prefix. 634// MMXIi8 - MMX instructions with ImmT == Imm8 and TB prefix. 635// MMXID - MMX instructions with XD prefix. 636// MMXIS - MMX instructions with XS prefix. 637class MMXI<bits<8> o, Format F, dag outs, dag ins, string asm, 638 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 639 : I<o, F, outs, ins, asm, pattern, itin>, TB, Requires<[HasMMX]>; 640class MMXI64<bits<8> o, Format F, dag outs, dag ins, string asm, 641 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 642 : I<o, F, outs, ins, asm, pattern, itin>, TB, Requires<[HasMMX,In64BitMode]>; 643class MMXRI<bits<8> o, Format F, dag outs, dag ins, string asm, 644 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 645 : I<o, F, outs, ins, asm, pattern, itin>, TB, REX_W, Requires<[HasMMX]>; 646class MMX2I<bits<8> o, Format F, dag outs, dag ins, string asm, 647 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 648 : I<o, F, outs, ins, asm, pattern, itin>, TB, OpSize, Requires<[HasMMX]>; 649class MMXIi8<bits<8> o, Format F, dag outs, dag ins, string asm, 650 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 651 : Ii8<o, F, outs, ins, asm, pattern, itin>, TB, Requires<[HasMMX]>; 652class MMXID<bits<8> o, Format F, dag outs, dag ins, string asm, 653 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 654 : Ii8<o, F, outs, ins, asm, pattern, itin>, XD, Requires<[HasMMX]>; 655class MMXIS<bits<8> o, Format F, dag outs, dag ins, string asm, 656 list<dag> pattern, InstrItinClass itin = IIC_DEFAULT> 657 : Ii8<o, F, outs, ins, asm, pattern, itin>, XS, Requires<[HasMMX]>; 658