diff options
author | Przemyslaw Wirkus <przemyslaw.wirkus@arm.com> | 2021-11-17 20:26:53 +0000 |
---|---|---|
committer | Przemyslaw Wirkus <przemyslaw.wirkus@arm.com> | 2021-11-17 20:27:42 +0000 |
commit | d3de0860104b8bb8d496527fbb042c3b4c5c82dc (patch) | |
tree | d639da6b0a9e7bc01d3331c170d7e15099299203 /gas/config/tc-aarch64.c | |
parent | 8f1bfdb44894423680a6d56a0994dafb4b82efca (diff) | |
download | gdb-d3de0860104b8bb8d496527fbb042c3b4c5c82dc.zip gdb-d3de0860104b8bb8d496527fbb042c3b4c5c82dc.tar.gz gdb-d3de0860104b8bb8d496527fbb042c3b4c5c82dc.tar.bz2 |
aarch64: [SME] SVE2 instructions added to support SME
This patch is adding new SVE2 instructions added to support SME extension.
The following SVE2 instructions are added by the SME architecture:
* PSEL,
* REVD, SCLAMP and UCLAMP.
gas/ChangeLog:
* config/tc-aarch64.c (parse_sme_pred_reg_with_index):
New parser.
(parse_operands): New parser.
* testsuite/gas/aarch64/sme-9-illegal.d: New test.
* testsuite/gas/aarch64/sme-9-illegal.l: New test.
* testsuite/gas/aarch64/sme-9-illegal.s: New test.
* testsuite/gas/aarch64/sme-9.d: New test.
* testsuite/gas/aarch64/sme-9.s: New test.
include/ChangeLog:
* opcode/aarch64.h (enum aarch64_opnd): New operand
AARCH64_OPND_SME_PnT_Wm_imm.
opcodes/ChangeLog:
* aarch64-asm.c (aarch64_ins_sme_pred_reg_with_index):
New inserter.
* aarch64-dis.c (aarch64_ext_sme_pred_reg_with_index):
New extractor.
* aarch64-opc.c (aarch64_print_operand): Printout of
OPND_SME_PnT_Wm_imm.
* aarch64-opc.h (enum aarch64_field_kind): New bitfields
FLD_SME_Rm, FLD_SME_i1, FLD_SME_tszh, FLD_SME_tszl.
* aarch64-tbl.h (OP_SVE_NN_BHSD): New qualifier.
(OP_SVE_QMQ): New qualifier.
(struct aarch64_opcode): New instructions PSEL, REVD,
SCLAMP and UCLAMP.
aarch64-asm-2.c: Regenerate.
aarch64-dis-2.c: Regenerate.
aarch64-opc-2.c: Regenerate.
Diffstat (limited to 'gas/config/tc-aarch64.c')
-rw-r--r-- | gas/config/tc-aarch64.c | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/gas/config/tc-aarch64.c b/gas/config/tc-aarch64.c index 24cfabf..9fc61f7 100644 --- a/gas/config/tc-aarch64.c +++ b/gas/config/tc-aarch64.c @@ -4655,6 +4655,65 @@ parse_sme_sm_za (char **str) return TOLOWER (p[0]); } +/* Parse the name of the source scalable predicate register, the index base + register W12-W15 and the element index. Function performs element index + limit checks as well as qualifier type checks. + + <Pn>.<T>[<Wv>, <imm>] + <Pn>.<T>[<Wv>, #<imm>] + + On success function sets <Wv> to INDEX_BASE_REG, <T> to QUALIFIER and + <imm> to IMM. + Function returns <Pn>, or PARSE_FAIL. +*/ +static int +parse_sme_pred_reg_with_index(char **str, + int *index_base_reg, + int *imm, + aarch64_opnd_qualifier_t *qualifier) +{ + int regno; + int64_t imm_limit; + int64_t imm_value; + const reg_entry *reg = parse_reg_with_qual (str, REG_TYPE_PN, qualifier); + + if (reg == NULL) + return PARSE_FAIL; + regno = reg->number; + + switch (*qualifier) + { + case AARCH64_OPND_QLF_S_B: + imm_limit = 15; + break; + case AARCH64_OPND_QLF_S_H: + imm_limit = 7; + break; + case AARCH64_OPND_QLF_S_S: + imm_limit = 3; + break; + case AARCH64_OPND_QLF_S_D: + imm_limit = 1; + break; + default: + set_syntax_error (_("wrong predicate register element size, allowed b, h, s and d")); + return PARSE_FAIL; + } + + if (! parse_sme_za_hv_tiles_operand_index (str, index_base_reg, &imm_value)) + return PARSE_FAIL; + + if (imm_value < 0 || imm_value > imm_limit) + { + set_syntax_error (_("element index out of range for given variant")); + return PARSE_FAIL; + } + + *imm = imm_value; + + return regno; +} + /* Parse a system register or a PSTATE field name for an MSR/MRS instruction. Returns the encoding for the option, or PARSE_FAIL. @@ -7068,6 +7127,25 @@ parse_operands (char *str, const aarch64_opcode *opcode) info->reg.regno = val; break; + case AARCH64_OPND_SME_PnT_Wm_imm: + /* <Pn>.<T>[<Wm>, #<imm>] */ + { + int index_base_reg; + int imm; + val = parse_sme_pred_reg_with_index (&str, + &index_base_reg, + &imm, + &qualifier); + if (val == PARSE_FAIL) + goto failure; + + info->za_tile_vector.regno = val; + info->za_tile_vector.index.regno = index_base_reg; + info->za_tile_vector.index.imm = imm; + info->qualifier = qualifier; + break; + } + case AARCH64_OPND_SVE_ADDR_RI_S4x16: case AARCH64_OPND_SVE_ADDR_RI_S4x32: case AARCH64_OPND_SVE_ADDR_RI_S4xVL: |