aboutsummaryrefslogtreecommitdiff
path: root/gas/config/tc-aarch64.c
diff options
context:
space:
mode:
authorPrzemyslaw Wirkus <przemyslaw.wirkus@arm.com>2021-11-17 20:26:53 +0000
committerPrzemyslaw Wirkus <przemyslaw.wirkus@arm.com>2021-11-17 20:27:42 +0000
commitd3de0860104b8bb8d496527fbb042c3b4c5c82dc (patch)
treed639da6b0a9e7bc01d3331c170d7e15099299203 /gas/config/tc-aarch64.c
parent8f1bfdb44894423680a6d56a0994dafb4b82efca (diff)
downloadgdb-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.c78
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: