CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
562 lines
21 KiB
TableGen
562 lines
21 KiB
TableGen
//===------- X86InstrOperands.td - X86 Operand Definitions --*- tablegen -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
def x86_ptr_rc : RegClassByHwMode<
|
|
[X86_32, X86_64, X86_64_X32],
|
|
[GR32, GR64, LOW32_ADDR_ACCESS]>;
|
|
|
|
// A version of ptr_rc which excludes SP, ESP, and RSP. This is used for
|
|
// the index operand of an address, to conform to x86 encoding restrictions.
|
|
def ptr_rc_nosp : RegClassByHwMode<
|
|
[X86_32, X86_64, X86_64_X32],
|
|
[GR32_NOSP, GR64_NOSP, GR32_NOSP]>;
|
|
|
|
// *mem - Operand definitions for the funky X86 addressing mode operands.
|
|
//
|
|
def X86MemAsmOperand : AsmOperandClass {
|
|
let Name = "Mem";
|
|
}
|
|
let RenderMethod = "addMemOperands", SuperClasses = [X86MemAsmOperand] in {
|
|
def X86Mem8AsmOperand : AsmOperandClass { let Name = "Mem8"; }
|
|
def X86Mem16AsmOperand : AsmOperandClass { let Name = "Mem16"; }
|
|
def X86Mem32AsmOperand : AsmOperandClass { let Name = "Mem32"; }
|
|
def X86Mem64AsmOperand : AsmOperandClass { let Name = "Mem64"; }
|
|
def X86Mem80AsmOperand : AsmOperandClass { let Name = "Mem80"; }
|
|
def X86Mem128AsmOperand : AsmOperandClass { let Name = "Mem128"; }
|
|
def X86Mem256AsmOperand : AsmOperandClass { let Name = "Mem256"; }
|
|
def X86Mem512AsmOperand : AsmOperandClass { let Name = "Mem512"; }
|
|
// Gather mem operands
|
|
def X86Mem32_RC128Operand : AsmOperandClass { let Name = "Mem32_RC128"; }
|
|
def X86Mem64_RC128Operand : AsmOperandClass { let Name = "Mem64_RC128"; }
|
|
def X86Mem32_RC256Operand : AsmOperandClass { let Name = "Mem32_RC256"; }
|
|
def X86Mem64_RC256Operand : AsmOperandClass { let Name = "Mem64_RC256"; }
|
|
|
|
def X86Mem32_RC128XOperand : AsmOperandClass { let Name = "Mem32_RC128X"; }
|
|
def X86Mem64_RC128XOperand : AsmOperandClass { let Name = "Mem64_RC128X"; }
|
|
def X86Mem32_RC256XOperand : AsmOperandClass { let Name = "Mem32_RC256X"; }
|
|
def X86Mem64_RC256XOperand : AsmOperandClass { let Name = "Mem64_RC256X"; }
|
|
def X86Mem32_RC512Operand : AsmOperandClass { let Name = "Mem32_RC512"; }
|
|
def X86Mem64_RC512Operand : AsmOperandClass { let Name = "Mem64_RC512"; }
|
|
|
|
def X86Mem512_GR16Operand : AsmOperandClass { let Name = "Mem512_GR16"; }
|
|
def X86Mem512_GR32Operand : AsmOperandClass { let Name = "Mem512_GR32"; }
|
|
def X86Mem512_GR64Operand : AsmOperandClass { let Name = "Mem512_GR64"; }
|
|
|
|
def X86SibMemOperand : AsmOperandClass { let Name = "SibMem"; }
|
|
}
|
|
|
|
def X86AbsMemAsmOperand : AsmOperandClass {
|
|
let Name = "AbsMem";
|
|
let SuperClasses = [X86MemAsmOperand];
|
|
}
|
|
|
|
class X86MemOperand<string printMethod,
|
|
AsmOperandClass parserMatchClass = X86MemAsmOperand,
|
|
int size = 0> : Operand<iPTR> {
|
|
let PrintMethod = printMethod;
|
|
let MIOperandInfo = (ops x86_ptr_rc, i8imm, ptr_rc_nosp, i32imm, SEGMENT_REG);
|
|
let ParserMatchClass = parserMatchClass;
|
|
let OperandType = "OPERAND_MEMORY";
|
|
int Size = size;
|
|
}
|
|
|
|
// Gather mem operands
|
|
class X86VMemOperand<RegisterClass RC, string printMethod,
|
|
AsmOperandClass parserMatchClass, int size = 0>
|
|
: X86MemOperand<printMethod, parserMatchClass, size> {
|
|
let MIOperandInfo = (ops x86_ptr_rc, i8imm, RC, i32imm, SEGMENT_REG);
|
|
}
|
|
|
|
def anymem : X86MemOperand<"printMemReference">;
|
|
|
|
// FIXME: Right now we allow any size during parsing, but we might want to
|
|
// restrict to only unsized memory.
|
|
def opaquemem : X86MemOperand<"printMemReference">;
|
|
|
|
def sibmem: X86MemOperand<"printMemReference", X86SibMemOperand>;
|
|
|
|
def i8mem : X86MemOperand<"printbytemem", X86Mem8AsmOperand, 8>;
|
|
def i16mem : X86MemOperand<"printwordmem", X86Mem16AsmOperand, 16>;
|
|
def i32mem : X86MemOperand<"printdwordmem", X86Mem32AsmOperand, 32>;
|
|
def i64mem : X86MemOperand<"printqwordmem", X86Mem64AsmOperand, 64>;
|
|
def i128mem : X86MemOperand<"printxmmwordmem", X86Mem128AsmOperand, 128>;
|
|
def i256mem : X86MemOperand<"printymmwordmem", X86Mem256AsmOperand, 256>;
|
|
def i512mem : X86MemOperand<"printzmmwordmem", X86Mem512AsmOperand, 512>;
|
|
def f16mem : X86MemOperand<"printwordmem", X86Mem16AsmOperand, 16>;
|
|
def f32mem : X86MemOperand<"printdwordmem", X86Mem32AsmOperand, 32>;
|
|
def f64mem : X86MemOperand<"printqwordmem", X86Mem64AsmOperand, 64>;
|
|
def f80mem : X86MemOperand<"printtbytemem", X86Mem80AsmOperand, 80>;
|
|
def f128mem : X86MemOperand<"printxmmwordmem", X86Mem128AsmOperand, 128>;
|
|
def f256mem : X86MemOperand<"printymmwordmem", X86Mem256AsmOperand, 256>;
|
|
def f512mem : X86MemOperand<"printzmmwordmem", X86Mem512AsmOperand, 512>;
|
|
|
|
// 32/64 mode specific mem operands
|
|
def i512mem_GR16 : X86MemOperand<"printzmmwordmem", X86Mem512_GR16Operand, 512>;
|
|
def i512mem_GR32 : X86MemOperand<"printzmmwordmem", X86Mem512_GR32Operand, 512>;
|
|
def i512mem_GR64 : X86MemOperand<"printzmmwordmem", X86Mem512_GR64Operand, 512>;
|
|
|
|
// Gather mem operands
|
|
def vx32mem : X86VMemOperand<VR128, "printdwordmem", X86Mem32_RC128Operand, 32>;
|
|
def vx64mem : X86VMemOperand<VR128, "printqwordmem", X86Mem64_RC128Operand, 64>;
|
|
def vy32mem : X86VMemOperand<VR256, "printdwordmem", X86Mem32_RC256Operand, 32>;
|
|
def vy64mem : X86VMemOperand<VR256, "printqwordmem", X86Mem64_RC256Operand, 64>;
|
|
|
|
def vx32xmem : X86VMemOperand<VR128X, "printdwordmem", X86Mem32_RC128XOperand, 32>;
|
|
def vx64xmem : X86VMemOperand<VR128X, "printqwordmem", X86Mem64_RC128XOperand, 64>;
|
|
def vy32xmem : X86VMemOperand<VR256X, "printdwordmem", X86Mem32_RC256XOperand, 32>;
|
|
def vy64xmem : X86VMemOperand<VR256X, "printqwordmem", X86Mem64_RC256XOperand, 64>;
|
|
def vz32mem : X86VMemOperand<VR512, "printdwordmem", X86Mem32_RC512Operand, 32>;
|
|
def vz64mem : X86VMemOperand<VR512, "printqwordmem", X86Mem64_RC512Operand, 64>;
|
|
|
|
def shmem : X86MemOperand<"printwordmem", X86Mem16AsmOperand>;
|
|
def ssmem : X86MemOperand<"printdwordmem", X86Mem32AsmOperand>;
|
|
def sdmem : X86MemOperand<"printqwordmem", X86Mem64AsmOperand>;
|
|
|
|
// A version of i8mem for use on x86-64 and x32 that uses a NOREX GPR instead
|
|
// of a plain GPR, so that it doesn't potentially require a REX prefix.
|
|
def ptr_rc_norex : RegClassByHwMode<
|
|
[X86_32, X86_64, X86_64_X32],
|
|
[GR32_NOREX, GR64_NOREX, GR32_NOREX]>;
|
|
|
|
def ptr_rc_norex_nosp : RegClassByHwMode<
|
|
[X86_32, X86_64, X86_64_X32],
|
|
[GR32_NOREX_NOSP, GR64_NOREX_NOSP, GR32_NOREX_NOSP]>;
|
|
|
|
|
|
def i8mem_NOREX : X86MemOperand<"printbytemem", X86Mem8AsmOperand, 8> {
|
|
let MIOperandInfo = (ops ptr_rc_norex, i8imm, ptr_rc_norex_nosp, i32imm,
|
|
SEGMENT_REG);
|
|
}
|
|
|
|
// GPRs available for tailcall.
|
|
// It represents GR32_TC, GR64_TC or GR64_TCW64.
|
|
def ptr_rc_tailcall : RegClassByHwMode<
|
|
[X86_32, X86_64, X86_64_X32],
|
|
[GR32_TC, GR64_TC, GR64_TC]>;
|
|
|
|
// Special i32mem for addresses of load folding tail calls. These are not
|
|
// allowed to use callee-saved registers since they must be scheduled
|
|
// after callee-saved register are popped.
|
|
def i32mem_TC : X86MemOperand<"printdwordmem", X86Mem32AsmOperand, 32> {
|
|
let MIOperandInfo = (ops ptr_rc_tailcall, i8imm, ptr_rc_tailcall,
|
|
i32imm, SEGMENT_REG);
|
|
}
|
|
|
|
// Special i64mem for addresses of load folding tail calls. These are not
|
|
// allowed to use callee-saved registers since they must be scheduled
|
|
// after callee-saved register are popped.
|
|
def i64mem_TC : X86MemOperand<"printqwordmem", X86Mem64AsmOperand, 64> {
|
|
let MIOperandInfo = (ops ptr_rc_tailcall, i8imm,
|
|
ptr_rc_tailcall, i32imm, SEGMENT_REG);
|
|
}
|
|
|
|
def i64mem_w64TC : X86MemOperand<"printqwordmem", X86Mem64AsmOperand, 64> {
|
|
let MIOperandInfo = (ops GR64_TCW64, i8imm,
|
|
GR64_TCW64, i32imm, SEGMENT_REG);
|
|
}
|
|
|
|
// Special parser to detect 16-bit mode to select 16-bit displacement.
|
|
def X86AbsMemMode16AsmOperand : AsmOperandClass {
|
|
let Name = "AbsMemMode16";
|
|
let RenderMethod = "addAbsMemOperands";
|
|
let SuperClasses = [X86AbsMemAsmOperand];
|
|
}
|
|
|
|
def X86AbsMem8AsmOperand : AsmOperandClass {
|
|
let Name = "AbsMem8";
|
|
let RenderMethod = "addAbsMemOperands";
|
|
let SuperClasses = [X86AbsMemAsmOperand];
|
|
}
|
|
|
|
// Branch targets print as pc-relative values.
|
|
class BranchTargetOperand<ValueType ty> : Operand<ty> {
|
|
let OperandType = "OPERAND_PCREL";
|
|
let PrintMethod = "printPCRelImm";
|
|
let ParserMatchClass = X86AbsMemAsmOperand;
|
|
}
|
|
|
|
def i32imm_brtarget : BranchTargetOperand<i32>;
|
|
def i16imm_brtarget : BranchTargetOperand<i16>;
|
|
def i8imm_brtarget : BranchTargetOperand<i8> {
|
|
let ParserMatchClass = X86AbsMem8AsmOperand;
|
|
}
|
|
|
|
// 64-bits but only 32 bits are significant, and those bits are treated as being
|
|
// pc relative.
|
|
def i64i32imm_brtarget : BranchTargetOperand<i64>;
|
|
|
|
def brtarget : BranchTargetOperand<OtherVT>;
|
|
def brtarget8 : BranchTargetOperand<OtherVT>;
|
|
def brtarget16 : BranchTargetOperand<OtherVT> {
|
|
let ParserMatchClass = X86AbsMemMode16AsmOperand;
|
|
}
|
|
def brtarget32 : BranchTargetOperand<OtherVT>;
|
|
|
|
let RenderMethod = "addSrcIdxOperands" in {
|
|
def X86SrcIdx8Operand : AsmOperandClass {
|
|
let Name = "SrcIdx8";
|
|
let SuperClasses = [X86Mem8AsmOperand];
|
|
}
|
|
def X86SrcIdx16Operand : AsmOperandClass {
|
|
let Name = "SrcIdx16";
|
|
let SuperClasses = [X86Mem16AsmOperand];
|
|
}
|
|
def X86SrcIdx32Operand : AsmOperandClass {
|
|
let Name = "SrcIdx32";
|
|
let SuperClasses = [X86Mem32AsmOperand];
|
|
}
|
|
def X86SrcIdx64Operand : AsmOperandClass {
|
|
let Name = "SrcIdx64";
|
|
let SuperClasses = [X86Mem64AsmOperand];
|
|
}
|
|
} // RenderMethod = "addSrcIdxOperands"
|
|
|
|
let RenderMethod = "addDstIdxOperands" in {
|
|
def X86DstIdx8Operand : AsmOperandClass {
|
|
let Name = "DstIdx8";
|
|
let SuperClasses = [X86Mem8AsmOperand];
|
|
}
|
|
def X86DstIdx16Operand : AsmOperandClass {
|
|
let Name = "DstIdx16";
|
|
let SuperClasses = [X86Mem16AsmOperand];
|
|
}
|
|
def X86DstIdx32Operand : AsmOperandClass {
|
|
let Name = "DstIdx32";
|
|
let SuperClasses = [X86Mem32AsmOperand];
|
|
}
|
|
def X86DstIdx64Operand : AsmOperandClass {
|
|
let Name = "DstIdx64";
|
|
let SuperClasses = [X86Mem64AsmOperand];
|
|
}
|
|
} // RenderMethod = "addDstIdxOperands"
|
|
|
|
let RenderMethod = "addMemOffsOperands" in {
|
|
def X86MemOffs16_8AsmOperand : AsmOperandClass {
|
|
let Name = "MemOffs16_8";
|
|
let SuperClasses = [X86Mem8AsmOperand];
|
|
}
|
|
def X86MemOffs16_16AsmOperand : AsmOperandClass {
|
|
let Name = "MemOffs16_16";
|
|
let SuperClasses = [X86Mem16AsmOperand];
|
|
}
|
|
def X86MemOffs16_32AsmOperand : AsmOperandClass {
|
|
let Name = "MemOffs16_32";
|
|
let SuperClasses = [X86Mem32AsmOperand];
|
|
}
|
|
def X86MemOffs32_8AsmOperand : AsmOperandClass {
|
|
let Name = "MemOffs32_8";
|
|
let SuperClasses = [X86Mem8AsmOperand];
|
|
}
|
|
def X86MemOffs32_16AsmOperand : AsmOperandClass {
|
|
let Name = "MemOffs32_16";
|
|
let SuperClasses = [X86Mem16AsmOperand];
|
|
}
|
|
def X86MemOffs32_32AsmOperand : AsmOperandClass {
|
|
let Name = "MemOffs32_32";
|
|
let SuperClasses = [X86Mem32AsmOperand];
|
|
}
|
|
def X86MemOffs32_64AsmOperand : AsmOperandClass {
|
|
let Name = "MemOffs32_64";
|
|
let SuperClasses = [X86Mem64AsmOperand];
|
|
}
|
|
def X86MemOffs64_8AsmOperand : AsmOperandClass {
|
|
let Name = "MemOffs64_8";
|
|
let SuperClasses = [X86Mem8AsmOperand];
|
|
}
|
|
def X86MemOffs64_16AsmOperand : AsmOperandClass {
|
|
let Name = "MemOffs64_16";
|
|
let SuperClasses = [X86Mem16AsmOperand];
|
|
}
|
|
def X86MemOffs64_32AsmOperand : AsmOperandClass {
|
|
let Name = "MemOffs64_32";
|
|
let SuperClasses = [X86Mem32AsmOperand];
|
|
}
|
|
def X86MemOffs64_64AsmOperand : AsmOperandClass {
|
|
let Name = "MemOffs64_64";
|
|
let SuperClasses = [X86Mem64AsmOperand];
|
|
}
|
|
def X86MemConstOffs64_AsmOperand : AsmOperandClass {
|
|
let Name = "MemConstOffs64";
|
|
let SuperClasses = [X86Mem8AsmOperand];
|
|
}
|
|
} // RenderMethod = "addMemOffsOperands"
|
|
|
|
class X86SrcIdxOperand<string printMethod, AsmOperandClass parserMatchClass>
|
|
: X86MemOperand<printMethod, parserMatchClass> {
|
|
let MIOperandInfo = (ops x86_ptr_rc, SEGMENT_REG);
|
|
}
|
|
|
|
class X86DstIdxOperand<string printMethod, AsmOperandClass parserMatchClass>
|
|
: X86MemOperand<printMethod, parserMatchClass> {
|
|
let MIOperandInfo = (ops x86_ptr_rc);
|
|
}
|
|
|
|
def srcidx8 : X86SrcIdxOperand<"printSrcIdx8", X86SrcIdx8Operand>;
|
|
def srcidx16 : X86SrcIdxOperand<"printSrcIdx16", X86SrcIdx16Operand>;
|
|
def srcidx32 : X86SrcIdxOperand<"printSrcIdx32", X86SrcIdx32Operand>;
|
|
def srcidx64 : X86SrcIdxOperand<"printSrcIdx64", X86SrcIdx64Operand>;
|
|
def dstidx8 : X86DstIdxOperand<"printDstIdx8", X86DstIdx8Operand>;
|
|
def dstidx16 : X86DstIdxOperand<"printDstIdx16", X86DstIdx16Operand>;
|
|
def dstidx32 : X86DstIdxOperand<"printDstIdx32", X86DstIdx32Operand>;
|
|
def dstidx64 : X86DstIdxOperand<"printDstIdx64", X86DstIdx64Operand>;
|
|
|
|
class X86MemOffsOperand<Operand immOperand, string printMethod,
|
|
AsmOperandClass parserMatchClass>
|
|
: X86MemOperand<printMethod, parserMatchClass> {
|
|
let MIOperandInfo = (ops immOperand, SEGMENT_REG);
|
|
}
|
|
|
|
def offset16_8 : X86MemOffsOperand<i16imm, "printMemOffs8",
|
|
X86MemOffs16_8AsmOperand>;
|
|
def offset16_16 : X86MemOffsOperand<i16imm, "printMemOffs16",
|
|
X86MemOffs16_16AsmOperand>;
|
|
def offset16_32 : X86MemOffsOperand<i16imm, "printMemOffs32",
|
|
X86MemOffs16_32AsmOperand>;
|
|
def offset32_8 : X86MemOffsOperand<i32imm, "printMemOffs8",
|
|
X86MemOffs32_8AsmOperand>;
|
|
def offset32_16 : X86MemOffsOperand<i32imm, "printMemOffs16",
|
|
X86MemOffs32_16AsmOperand>;
|
|
def offset32_32 : X86MemOffsOperand<i32imm, "printMemOffs32",
|
|
X86MemOffs32_32AsmOperand>;
|
|
def offset32_64 : X86MemOffsOperand<i32imm, "printMemOffs64",
|
|
X86MemOffs32_64AsmOperand>;
|
|
def offset64_8 : X86MemOffsOperand<i64imm, "printMemOffs8",
|
|
X86MemOffs64_8AsmOperand>;
|
|
def offset64_16 : X86MemOffsOperand<i64imm, "printMemOffs16",
|
|
X86MemOffs64_16AsmOperand>;
|
|
def offset64_32 : X86MemOffsOperand<i64imm, "printMemOffs32",
|
|
X86MemOffs64_32AsmOperand>;
|
|
def offset64_64 : X86MemOffsOperand<i64imm, "printMemOffs64",
|
|
X86MemOffs64_64AsmOperand>;
|
|
|
|
def offset64const : X86MemOffsOperand<i64imm, "printMemOffset",
|
|
X86MemConstOffs64_AsmOperand>;
|
|
|
|
def ccode : Operand<i8> {
|
|
let PrintMethod = "printCondCode";
|
|
let OperandNamespace = "X86";
|
|
let OperandType = "OPERAND_COND_CODE";
|
|
}
|
|
|
|
class ImmSExtAsmOperandClass : AsmOperandClass {
|
|
let SuperClasses = [ImmAsmOperand];
|
|
let RenderMethod = "addImmOperands";
|
|
}
|
|
|
|
def X86GR32orGR64AsmOperand : AsmOperandClass {
|
|
let Name = "GR32orGR64";
|
|
}
|
|
def GR32orGR64 : RegisterOperand<GR32> {
|
|
let ParserMatchClass = X86GR32orGR64AsmOperand;
|
|
}
|
|
|
|
def X86GR16orGR32orGR64AsmOperand : AsmOperandClass {
|
|
let Name = "GR16orGR32orGR64";
|
|
}
|
|
def GR16orGR32orGR64 : RegisterOperand<GR16> {
|
|
let ParserMatchClass = X86GR16orGR32orGR64AsmOperand;
|
|
}
|
|
|
|
def AVX512RCOperand : AsmOperandClass {
|
|
let Name = "AVX512RC";
|
|
}
|
|
def AVX512RC : Operand<i32> {
|
|
let PrintMethod = "printRoundingControl";
|
|
let OperandNamespace = "X86";
|
|
let OperandType = "OPERAND_ROUNDING_CONTROL";
|
|
let ParserMatchClass = AVX512RCOperand;
|
|
}
|
|
|
|
// Sign-extended immediate classes. We don't need to define the full lattice
|
|
// here because there is no instruction with an ambiguity between ImmSExti64i32
|
|
// and ImmSExti32i8.
|
|
//
|
|
// The strange ranges come from the fact that the assembler always works with
|
|
// 64-bit immediates, but for a 16-bit target value we want to accept both "-1"
|
|
// (which will be a -1ULL), and "0xFF" (-1 in 16-bits).
|
|
|
|
// [0, 0x7FFFFFFF] |
|
|
// [0xFFFFFFFF80000000, 0xFFFFFFFFFFFFFFFF]
|
|
def ImmSExti64i32AsmOperand : ImmSExtAsmOperandClass {
|
|
let Name = "ImmSExti64i32";
|
|
}
|
|
|
|
// [0, 0x0000007F] | [0x000000000000FF80, 0x000000000000FFFF] |
|
|
// [0xFFFFFFFFFFFFFF80, 0xFFFFFFFFFFFFFFFF]
|
|
def ImmSExti16i8AsmOperand : ImmSExtAsmOperandClass {
|
|
let Name = "ImmSExti16i8";
|
|
let SuperClasses = [ImmSExti64i32AsmOperand];
|
|
}
|
|
|
|
// [0, 0x0000007F] | [0x00000000FFFFFF80, 0x00000000FFFFFFFF] |
|
|
// [0xFFFFFFFFFFFFFF80, 0xFFFFFFFFFFFFFFFF]
|
|
def ImmSExti32i8AsmOperand : ImmSExtAsmOperandClass {
|
|
let Name = "ImmSExti32i8";
|
|
}
|
|
|
|
// [0, 0x0000007F] |
|
|
// [0xFFFFFFFFFFFFFF80, 0xFFFFFFFFFFFFFFFF]
|
|
def ImmSExti64i8AsmOperand : ImmSExtAsmOperandClass {
|
|
let Name = "ImmSExti64i8";
|
|
let SuperClasses = [ImmSExti16i8AsmOperand, ImmSExti32i8AsmOperand,
|
|
ImmSExti64i32AsmOperand];
|
|
}
|
|
|
|
// 4-bit immediate used by some XOP instructions
|
|
// [0, 0xF]
|
|
def ImmUnsignedi4AsmOperand : AsmOperandClass {
|
|
let Name = "ImmUnsignedi4";
|
|
let RenderMethod = "addImmOperands";
|
|
let DiagnosticType = "InvalidImmUnsignedi4";
|
|
}
|
|
|
|
// 6-bit immediate used by some AMX instructions
|
|
// [0, 0x3F]
|
|
def ImmUnsignedi6AsmOperand : AsmOperandClass {
|
|
let Name = "ImmUnsignedi6";
|
|
let RenderMethod = "addImmOperands";
|
|
let DiagnosticType = "InvalidImmUnsignedi6";
|
|
}
|
|
|
|
// Unsigned immediate used by SSE/AVX instructions
|
|
// [0, 0xFF]
|
|
// [0xFFFFFFFFFFFFFF80, 0xFFFFFFFFFFFFFFFF]
|
|
def ImmUnsignedi8AsmOperand : AsmOperandClass {
|
|
let Name = "ImmUnsignedi8";
|
|
let RenderMethod = "addImmOperands";
|
|
}
|
|
|
|
// A couple of more descriptive operand definitions.
|
|
// 16-bits but only 8 bits are significant.
|
|
def i16i8imm : Operand<i16> {
|
|
let ParserMatchClass = ImmSExti16i8AsmOperand;
|
|
let OperandType = "OPERAND_IMMEDIATE";
|
|
}
|
|
// 32-bits but only 8 bits are significant.
|
|
def i32i8imm : Operand<i32> {
|
|
let ParserMatchClass = ImmSExti32i8AsmOperand;
|
|
let OperandType = "OPERAND_IMMEDIATE";
|
|
}
|
|
|
|
// 64-bits but only 32 bits are significant.
|
|
def i64i32imm : Operand<i64> {
|
|
let ParserMatchClass = ImmSExti64i32AsmOperand;
|
|
let OperandType = "OPERAND_IMMEDIATE";
|
|
}
|
|
|
|
// 64-bits but only 8 bits are significant.
|
|
def i64i8imm : Operand<i64> {
|
|
let ParserMatchClass = ImmSExti64i8AsmOperand;
|
|
let OperandType = "OPERAND_IMMEDIATE";
|
|
}
|
|
|
|
// Unsigned 4-bit immediate used by some XOP instructions.
|
|
def u4imm : Operand<i8> {
|
|
let PrintMethod = "printU8Imm";
|
|
let ParserMatchClass = ImmUnsignedi4AsmOperand;
|
|
let OperandType = "OPERAND_IMMEDIATE";
|
|
}
|
|
|
|
def cflags : Operand<i8> {
|
|
let PrintMethod = "printCondFlags";
|
|
let ParserMatchClass = ImmUnsignedi4AsmOperand;
|
|
let OperandType = "OPERAND_IMMEDIATE";
|
|
}
|
|
|
|
// Unsigned 8-bit immediate used by SSE/AVX instructions.
|
|
def u8imm : Operand<i8> {
|
|
let PrintMethod = "printU8Imm";
|
|
let ParserMatchClass = ImmUnsignedi8AsmOperand;
|
|
let OperandType = "OPERAND_IMMEDIATE";
|
|
}
|
|
|
|
// 16-bit immediate but only 8-bits are significant and they are unsigned.
|
|
// Used by BT instructions.
|
|
def i16u8imm : Operand<i16> {
|
|
let PrintMethod = "printU8Imm";
|
|
let ParserMatchClass = ImmUnsignedi8AsmOperand;
|
|
let OperandType = "OPERAND_IMMEDIATE";
|
|
}
|
|
|
|
// 32-bit immediate but only 6-bits are significant and they are unsigned.
|
|
// Used by some AMX instructions that use intrinsics.
|
|
def i32u6imm : Operand<i32> {
|
|
let PrintMethod = "printU8Imm";
|
|
let ParserMatchClass = ImmUnsignedi6AsmOperand;
|
|
let OperandType = "OPERAND_IMMEDIATE";
|
|
}
|
|
|
|
// 32-bit immediate but only 8-bits are significant and they are unsigned.
|
|
// Used by some SSE/AVX instructions that use intrinsics.
|
|
def i32u8imm : Operand<i32> {
|
|
let PrintMethod = "printU8Imm";
|
|
let ParserMatchClass = ImmUnsignedi8AsmOperand;
|
|
let OperandType = "OPERAND_IMMEDIATE";
|
|
}
|
|
|
|
// 64-bit immediate but only 8-bits are significant and they are unsigned.
|
|
// Used by BT instructions.
|
|
def i64u8imm : Operand<i64> {
|
|
let PrintMethod = "printU8Imm";
|
|
let ParserMatchClass = ImmUnsignedi8AsmOperand;
|
|
let OperandType = "OPERAND_IMMEDIATE";
|
|
}
|
|
|
|
def lea64_8mem : Operand<i8> {
|
|
let PrintMethod = "printMemReference";
|
|
let MIOperandInfo = (ops GR64, i8imm, GR64_NOSP, i8imm, SEGMENT_REG);
|
|
let ParserMatchClass = X86MemAsmOperand;
|
|
}
|
|
|
|
def lea64_16mem : Operand<i16> {
|
|
let PrintMethod = "printMemReference";
|
|
let MIOperandInfo = (ops GR64, i8imm, GR64_NOSP, i16imm, SEGMENT_REG);
|
|
let ParserMatchClass = X86MemAsmOperand;
|
|
}
|
|
|
|
def lea64_32mem : Operand<i32> {
|
|
let PrintMethod = "printMemReference";
|
|
let MIOperandInfo = (ops GR64, i8imm, GR64_NOSP, i32imm, SEGMENT_REG);
|
|
let ParserMatchClass = X86MemAsmOperand;
|
|
}
|
|
|
|
// Memory operands that use 64-bit pointers in both ILP32 and LP64.
|
|
def lea64mem : Operand<i64> {
|
|
let PrintMethod = "printMemReference";
|
|
let MIOperandInfo = (ops GR64, i8imm, GR64_NOSP, i32imm, SEGMENT_REG);
|
|
let ParserMatchClass = X86MemAsmOperand;
|
|
}
|
|
|
|
let RenderMethod = "addMaskPairOperands" in {
|
|
def VK1PairAsmOperand : AsmOperandClass { let Name = "VK1Pair"; }
|
|
def VK2PairAsmOperand : AsmOperandClass { let Name = "VK2Pair"; }
|
|
def VK4PairAsmOperand : AsmOperandClass { let Name = "VK4Pair"; }
|
|
def VK8PairAsmOperand : AsmOperandClass { let Name = "VK8Pair"; }
|
|
def VK16PairAsmOperand : AsmOperandClass { let Name = "VK16Pair"; }
|
|
}
|
|
|
|
def VK1Pair : RegisterOperand<VK1PAIR, "printVKPair"> {
|
|
let ParserMatchClass = VK1PairAsmOperand;
|
|
}
|
|
|
|
def VK2Pair : RegisterOperand<VK2PAIR, "printVKPair"> {
|
|
let ParserMatchClass = VK2PairAsmOperand;
|
|
}
|
|
|
|
def VK4Pair : RegisterOperand<VK4PAIR, "printVKPair"> {
|
|
let ParserMatchClass = VK4PairAsmOperand;
|
|
}
|
|
|
|
def VK8Pair : RegisterOperand<VK8PAIR, "printVKPair"> {
|
|
let ParserMatchClass = VK8PairAsmOperand;
|
|
}
|
|
|
|
def VK16Pair : RegisterOperand<VK16PAIR, "printVKPair"> {
|
|
let ParserMatchClass = VK16PairAsmOperand;
|
|
}
|