123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- //===---- X86InstrAMX.td - AMX Instruction Set Extension --*- 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
- //
- //===----------------------------------------------------------------------===//
- //
- // This file describes the instructions that make up the Intel AMX instruction
- // set.
- //
- //===----------------------------------------------------------------------===//
- //===----------------------------------------------------------------------===//
- // AMX instructions
- let Predicates = [HasAMXTILE, In64BitMode] in {
- let SchedRW = [WriteSystem] in {
- let hasSideEffects = 1,
- Defs = [TMM0,TMM1,TMM2,TMM3,TMM4,TMM5,TMM6,TMM7] in
- def LDTILECFG : I <0x49, MRM0m, (outs), (ins opaquemem:$src),
- "ldtilecfg\t$src",
- [(int_x86_ldtilecfg addr:$src)]>, VEX, T8PS;
- let hasSideEffects = 1 in
- def STTILECFG : I <0x49, MRM0m, (outs), (ins opaquemem:$src),
- "sttilecfg\t$src",
- [(int_x86_sttilecfg addr:$src)]>, VEX, T8PD;
- let mayLoad = 1 in
- def TILELOADD : I<0x4b, MRMSrcMemFSIB, (outs TILE:$dst),
- (ins sibmem:$src),
- "tileloadd\t{$src, $dst|$dst, $src}", []>,
- VEX, T8XD;
- let mayLoad = 1 in
- def TILELOADDT1 : I<0x4b, MRMSrcMemFSIB, (outs TILE:$dst),
- (ins sibmem:$src),
- "tileloaddt1\t{$src, $dst|$dst, $src}", []>,
- VEX, T8PD;
- let Defs = [TMM0,TMM1,TMM2,TMM3,TMM4,TMM5,TMM6,TMM7] in
- def TILERELEASE : I<0x49, MRM_C0, (outs), (ins),
- "tilerelease", [(int_x86_tilerelease)]>, VEX, T8PS;
- let mayStore = 1 in
- def TILESTORED : I<0x4b, MRMDestMemFSIB, (outs),
- (ins sibmem:$dst, TILE:$src),
- "tilestored\t{$src, $dst|$dst, $src}", []>,
- VEX, T8XS;
- def TILEZERO : I<0x49, MRMr0, (outs TILE:$dst), (ins),
- "tilezero\t$dst", []>,
- VEX, T8XD;
- // Pseduo instruction for RA.
- def PLDTILECFGV : PseudoI<(outs), (ins opaquemem:$src),
- [(int_x86_ldtilecfg_internal addr:$src)]>;
- def PTILELOADDV : PseudoI<(outs TILE:$dst), (ins GR16:$src1,
- GR16:$src2,
- opaquemem:$src3), []>;
- def PTILELOADDT1V : PseudoI<(outs TILE:$dst), (ins GR16:$src1,
- GR16:$src2,
- opaquemem:$src3), []>;
- def PTILESTOREDV : PseudoI<(outs), (ins GR16:$src1,
- GR16:$src2, opaquemem:$src3,
- TILE:$src4), []>;
- let isReMaterializable = 1, isAsCheapAsAMove = 1, canFoldAsLoad = 1 in
- def PTILEZEROV : PseudoI<(outs TILE:$dst), (ins GR16:$src1, GR16:$src2),
- [(set TILE:$dst, (int_x86_tilezero_internal
- GR16:$src1, GR16:$src2))]>;
- let usesCustomInserter = 1 in {
- // Pseudo instructions, using immediates instead of tile registers.
- // To be translated to the actual instructions in X86ISelLowering.cpp
- def PTILELOADD : PseudoI<(outs), (ins u8imm:$src1, sibmem:$src2), []>;
- def PTILELOADDT1 : PseudoI<(outs), (ins u8imm:$src1,
- sibmem:$src2), []>;
- def PTILESTORED : PseudoI<(outs), (ins i8mem:$dst, u8imm:$src), []>;
- def PTILEZERO : PseudoI<(outs), (ins u8imm:$src),
- [(int_x86_tilezero timm:$src)]>;
- }
- } // SchedRW
- } // HasAMXTILE
- let Predicates = [HasAMXINT8, In64BitMode] in {
- let SchedRW = [WriteSystem] in {
- let Constraints = "$src1 = $dst" in {
- def TDPBSSD : I<0x5e, MRMSrcReg4VOp3, (outs TILE:$dst),
- (ins TILE:$src1, TILE:$src2, TILE:$src3),
- "tdpbssd\t{$src3, $src2, $dst|$dst, $src2, $src3}", []>,
- VEX_4V, T8XD;
- def TDPBSUD : I<0x5e, MRMSrcReg4VOp3, (outs TILE:$dst),
- (ins TILE:$src1, TILE:$src2, TILE:$src3),
- "tdpbsud\t{$src3, $src2, $dst|$dst, $src2, $src3}", []>,
- VEX_4V, T8XS;
- def TDPBUSD : I<0x5e, MRMSrcReg4VOp3, (outs TILE:$dst),
- (ins TILE:$src1, TILE:$src2, TILE:$src3),
- "tdpbusd\t{$src3, $src2, $dst|$dst, $src2, $src3}", []>,
- VEX_4V, T8PD;
- def TDPBUUD : I<0x5e, MRMSrcReg4VOp3, (outs TILE:$dst),
- (ins TILE:$src1, TILE:$src2, TILE:$src3),
- "tdpbuud\t{$src3, $src2, $dst|$dst, $src2, $src3}", []>,
- VEX_4V, T8PS;
- }
- // Pseduo instruction for RA.
- let Constraints = "$src4 = $dst" in {
- def PTDPBSSDV : PseudoI<(outs TILE:$dst), (ins GR16:$src1,
- GR16:$src2, GR16:$src3, TILE:$src4,
- TILE:$src5, TILE:$src6),
- [(set TILE: $dst,
- (int_x86_tdpbssd_internal GR16:$src1, GR16:$src2,
- GR16:$src3, TILE:$src4, TILE:$src5, TILE:$src6))]>;
- def PTDPBSUDV : PseudoI<(outs TILE: $dst), (ins GR16:$src1,
- GR16:$src2, GR16:$src3, TILE:$src4,
- TILE:$src5, TILE:$src6),
- [(set TILE: $dst,
- (int_x86_tdpbsud_internal GR16:$src1, GR16:$src2,
- GR16:$src3, TILE:$src4, TILE:$src5, TILE:$src6))]>;
- def PTDPBUSDV : PseudoI<(outs TILE: $dst), (ins GR16:$src1,
- GR16:$src2, GR16:$src3, TILE:$src4,
- TILE:$src5, TILE:$src6),
- [(set TILE: $dst,
- (int_x86_tdpbusd_internal GR16:$src1, GR16:$src2,
- GR16:$src3, TILE:$src4, TILE:$src5, TILE:$src6))]>;
- def PTDPBUUDV : PseudoI<(outs TILE: $dst), (ins GR16:$src1,
- GR16:$src2, GR16:$src3, TILE:$src4,
- TILE:$src5, TILE:$src6),
- [(set TILE: $dst,
- (int_x86_tdpbuud_internal GR16:$src1, GR16:$src2,
- GR16:$src3, TILE:$src4, TILE:$src5, TILE:$src6))]>;
- }
- let usesCustomInserter = 1 in {
- // Pseudo instructions, using immediates instead of tile registers.
- // To be translated to the actual instructions in X86ISelLowering.cpp
- def PTDPBSSD : PseudoI<(outs), (ins u8imm:$src1,
- u8imm:$src2, u8imm:$src3),
- [(int_x86_tdpbssd timm:$src1,
- timm:$src2, timm:$src3)]>;
- def PTDPBSUD : PseudoI<(outs), (ins u8imm:$src1,
- u8imm:$src2, u8imm:$src3),
- [(int_x86_tdpbsud timm:$src1,
- timm:$src2, timm:$src3)]>;
- def PTDPBUSD : PseudoI<(outs), (ins u8imm:$src1,
- u8imm:$src2, u8imm:$src3),
- [(int_x86_tdpbusd timm:$src1,
- timm:$src2, timm:$src3)]>;
- def PTDPBUUD : PseudoI<(outs), (ins u8imm:$src1,
- u8imm:$src2, u8imm:$src3),
- [(int_x86_tdpbuud timm:$src1,
- timm:$src2, timm:$src3)]>;
- }
- }
- } // HasAMXTILE
- let Predicates = [HasAMXBF16, In64BitMode] in {
- let SchedRW = [WriteSystem] in {
- let Constraints = "$src1 = $dst" in
- def TDPBF16PS : I<0x5c, MRMSrcReg4VOp3, (outs TILE:$dst),
- (ins TILE:$src1, TILE:$src2, TILE:$src3),
- "tdpbf16ps\t{$src3, $src2, $dst|$dst, $src2, $src3}",
- []>, VEX_4V, T8XS;
- // Pseduo instruction for RA.
- let Constraints = "$src4 = $dst" in
- def PTDPBF16PSV : PseudoI<(outs TILE: $dst), (ins GR16:$src1,
- GR16:$src2, GR16:$src3, TILE:$src4,
- TILE:$src5, TILE:$src6),
- [(set TILE: $dst,
- (int_x86_tdpbf16ps_internal GR16:$src1,
- GR16:$src2, GR16:$src3, TILE:$src4,
- TILE:$src5, TILE:$src6))]>;
- let usesCustomInserter = 1 in {
- // Pseudo instructions, using immediates instead of tile registers.
- // To be translated to the actual instructions in X86ISelLowering.cpp
- def PTDPBF16PS : PseudoI<(outs), (ins u8imm:$src1,
- u8imm:$src2, u8imm:$src3),
- [(int_x86_tdpbf16ps timm:$src1,
- timm:$src2, timm:$src3)]>;
- }
- }
- } // HasAMXTILE, HasAMXBF16
|