123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- //=- AArch64SMEInstrInfo.td - AArch64 SME Instructions -*- 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
- //
- //===----------------------------------------------------------------------===//
- //
- // AArch64 Scalable Matrix Extension (SME) Instruction definitions.
- //
- //===----------------------------------------------------------------------===//
- //===----------------------------------------------------------------------===//
- // Add vector elements horizontally or vertically to ZA tile.
- //===----------------------------------------------------------------------===//
- let Predicates = [HasSME] in {
- def ADDHA_MPPZ_S : sme_add_vector_to_tile_u32<0b0, "addha">;
- def ADDVA_MPPZ_S : sme_add_vector_to_tile_u32<0b1, "addva">;
- }
- let Predicates = [HasSMEI64] in {
- def ADDHA_MPPZ_D : sme_add_vector_to_tile_u64<0b0, "addha">;
- def ADDVA_MPPZ_D : sme_add_vector_to_tile_u64<0b1, "addva">;
- }
- let Predicates = [HasSME] in {
- //===----------------------------------------------------------------------===//
- // Outer products
- //===----------------------------------------------------------------------===//
- defm BFMOPA_MPPZZ : sme_bf16_outer_product<0b0, "bfmopa">;
- defm BFMOPS_MPPZZ : sme_bf16_outer_product<0b1, "bfmops">;
- def FMOPA_MPPZZ_S : sme_outer_product_fp32<0b0, "fmopa">;
- def FMOPS_MPPZZ_S : sme_outer_product_fp32<0b1, "fmops">;
- }
- let Predicates = [HasSMEF64] in {
- def FMOPA_MPPZZ_D : sme_outer_product_fp64<0b0, "fmopa">;
- def FMOPS_MPPZZ_D : sme_outer_product_fp64<0b1, "fmops">;
- }
- let Predicates = [HasSME] in {
- defm FMOPAL_MPPZZ : sme_f16_outer_product<0b0, "fmopa">;
- defm FMOPSL_MPPZZ : sme_f16_outer_product<0b1, "fmops">;
- def SMOPA_MPPZZ_S : sme_int_outer_product_i32<0b000, "smopa">;
- def SMOPS_MPPZZ_S : sme_int_outer_product_i32<0b001, "smops">;
- def UMOPA_MPPZZ_S : sme_int_outer_product_i32<0b110, "umopa">;
- def UMOPS_MPPZZ_S : sme_int_outer_product_i32<0b111, "umops">;
- def SUMOPA_MPPZZ_S : sme_int_outer_product_i32<0b010, "sumopa">;
- def SUMOPS_MPPZZ_S : sme_int_outer_product_i32<0b011, "sumops">;
- def USMOPA_MPPZZ_S : sme_int_outer_product_i32<0b100, "usmopa">;
- def USMOPS_MPPZZ_S : sme_int_outer_product_i32<0b101, "usmops">;
- }
- let Predicates = [HasSMEI64] in {
- def SMOPA_MPPZZ_D : sme_int_outer_product_i64<0b000, "smopa">;
- def SMOPS_MPPZZ_D : sme_int_outer_product_i64<0b001, "smops">;
- def UMOPA_MPPZZ_D : sme_int_outer_product_i64<0b110, "umopa">;
- def UMOPS_MPPZZ_D : sme_int_outer_product_i64<0b111, "umops">;
- def SUMOPA_MPPZZ_D : sme_int_outer_product_i64<0b010, "sumopa">;
- def SUMOPS_MPPZZ_D : sme_int_outer_product_i64<0b011, "sumops">;
- def USMOPA_MPPZZ_D : sme_int_outer_product_i64<0b100, "usmopa">;
- def USMOPS_MPPZZ_D : sme_int_outer_product_i64<0b101, "usmops">;
- }
- let Predicates = [HasSME] in {
- //===----------------------------------------------------------------------===//
- // Loads and stores
- //===----------------------------------------------------------------------===//
- defm LD1_MXIPXX : sme_mem_ld_ss<"ld1">;
- defm ST1_MXIPXX : sme_mem_st_ss<"st1">;
- //===----------------------------------------------------------------------===//
- // Spill + fill
- //===----------------------------------------------------------------------===//
- defm LDR_ZA : sme_fill<"ldr">;
- defm STR_ZA : sme_spill<"str">;
- //===----------------------------------------------------------------------===//
- // Move instructions
- //===----------------------------------------------------------------------===//
- defm INSERT_MXIPZ : sme_vector_to_tile<"mova">;
- defm EXTRACT_ZPMXI : sme_tile_to_vector<"mova">;
- //===----------------------------------------------------------------------===//
- // Zero instruction
- //===----------------------------------------------------------------------===//
- defm ZERO_M : sme_zero<"zero">;
- //===----------------------------------------------------------------------===//
- // Mode selection and state access instructions
- //===----------------------------------------------------------------------===//
- // SME defines three pstate fields to set or clear PSTATE.SM, PSTATE.ZA, or
- // both fields:
- //
- // MSR SVCRSM, #<imm1>
- // MSR SVCRZA, #<imm1>
- // MSR SVCRSMZA, #<imm1>
- //
- // It's tricky to using the existing pstate operand defined in
- // AArch64SystemOperands.td since it only encodes 5 bits including op1;op2,
- // when these fields are also encoded in CRm[3:1].
- class MSRpstatesvcrImm0_1
- : PstateWriteSimple<(ins svcr_op:$pstatefield, imm0_1:$imm), "msr",
- "\t$pstatefield, $imm">,
- Sched<[WriteSys]> {
- bits<3> pstatefield;
- bit imm;
- let Inst{18-16} = 0b011; // op1
- let Inst{11-9} = pstatefield;
- let Inst{8} = imm;
- let Inst{7-5} = 0b011; // op2
- }
- def MSRpstatesvcrImm1 : MSRpstatesvcrImm0_1;
- def : InstAlias<"smstart", (MSRpstatesvcrImm1 0b011, 0b1)>;
- def : InstAlias<"smstart sm", (MSRpstatesvcrImm1 0b001, 0b1)>;
- def : InstAlias<"smstart za", (MSRpstatesvcrImm1 0b010, 0b1)>;
- def : InstAlias<"smstop", (MSRpstatesvcrImm1 0b011, 0b0)>;
- def : InstAlias<"smstop sm", (MSRpstatesvcrImm1 0b001, 0b0)>;
- def : InstAlias<"smstop za", (MSRpstatesvcrImm1 0b010, 0b0)>;
- //===----------------------------------------------------------------------===//
- // SVE2 instructions
- //===----------------------------------------------------------------------===//
- def REVD_ZPmZ : sve2_int_perm_revd<"revd">;
- defm SCLAMP_ZZZ : sve2_clamp<"sclamp", 0b0>;
- defm UCLAMP_ZZZ : sve2_clamp<"uclamp", 0b1>;
- defm PSEL_PPPRI : sve2_int_perm_sel_p<"psel">;
- } // End let Predicates = [HasSME]
|