diff --git a/gas/testsuite/gas/aarch64/sme-f16f16-2-bad.d b/gas/testsuite/gas/aarch64/sme-f16f16-2-bad.d new file mode 100644 index 00000000000..fec7d2a1125 --- /dev/null +++ b/gas/testsuite/gas/aarch64/sme-f16f16-2-bad.d @@ -0,0 +1,4 @@ +#name: Test of invalid FEAT_SME_F16F16 fmops and fmopa instructions. +#as: -march=armv8-a+sme-f16f16 +#source: sme-f16f16-2-bad.s +#error_output: sme-f16f16-2-bad.l diff --git a/gas/testsuite/gas/aarch64/sme-f16f16-2-bad.l b/gas/testsuite/gas/aarch64/sme-f16f16-2-bad.l new file mode 100644 index 00000000000..083b3a08ca4 --- /dev/null +++ b/gas/testsuite/gas/aarch64/sme-f16f16-2-bad.l @@ -0,0 +1,29 @@ +.*: Assembler messages: +.*: Error: operand mismatch -- `fmopa ZA1.h,p0,p0/m,z0.h,z0.h' +.*: Info: did you mean this\? +.*: Info: fmopa za1.h, p0/m, p0/m, z0.h, z0.h +.*: Error: operand mismatch -- `fmopa ZA0.h,p7/m,p0,z0.h,z0.h' +.*: Info: did you mean this\? +.*: Info: fmopa za0.h, p7/m, p0/m, z0.h, z0.h +.*: Error: operand mismatch -- `fmopa ZA0.h,p0/m,p7/m,z0.s,z0.s' +.*: Info: did you mean this\? +.*: Info: fmopa za0.s, p0/m, p7/m, z0.s, z0.s +.*: Error: operand mismatch -- `fmopa ZA0.h,p0/m,p0/m,z31.d,z0.d' +.*: Info: did you mean this\? +.*: Info: fmopa za0.d, p0/m, p0/m, z31.d, z0.d +.*: Error: ZA tile number out of range at operand 1 -- `fmopa ZA2.h,p0/m,p8/m,z0.s,z31.b' +.*: Error: ZA tile number out of range at operand 1 -- `fmopa ZA4.h,p15/m,p11/m,z0.s,z31.b' +.*: Error: operand mismatch -- `fmops ZA1.h,p0,p0/m,z0.h,z0.h' +.*: Info: did you mean this\? +.*: Info: fmops za1.h, p0/m, p0/m, z0.h, z0.h +.*: Error: operand mismatch -- `fmops ZA0.h,p7/m,p0,z0.h,z0.h' +.*: Info: did you mean this\? +.*: Info: fmops za0.h, p7/m, p0/m, z0.h, z0.h +.*: Error: operand mismatch -- `fmops ZA0.h,p0/m,p7/m,z0.s,z0.s' +.*: Info: did you mean this\? +.*: Info: fmops za0.s, p0/m, p7/m, z0.s, z0.s +.*: Error: operand mismatch -- `fmops ZA0.h,p0/m,p0/m,z31.d,z0.d' +.*: Info: did you mean this\? +.*: Info: fmops za0.d, p0/m, p0/m, z31.d, z0.d +.*: Error: ZA tile number out of range at operand 1 -- `fmops ZA2.h,p0/m,p8/m,z0.s,z31.b' +.*: Error: ZA tile number out of range at operand 1 -- `fmops ZA4.h,p15/m,p11/m,z0.s,z31.b' diff --git a/gas/testsuite/gas/aarch64/sme-f16f16-2-bad.s b/gas/testsuite/gas/aarch64/sme-f16f16-2-bad.s new file mode 100644 index 00000000000..4bce38087a9 --- /dev/null +++ b/gas/testsuite/gas/aarch64/sme-f16f16-2-bad.s @@ -0,0 +1,17 @@ +/* FMOPA. */ +fmopa ZA0.s, p0/m, p0/m, z0.h, z0.h +fmopa ZA1.h, p0, p0/m, z0.h, z0.h +fmopa ZA0.h, p7/m, p0, z0.h, z0.h +fmopa ZA0.h, p0/m, p7/m, z0.s, z0.s +fmopa ZA0.h, p0/m, p0/m, z31.d, z0.d +fmopa ZA2.h, p0/m, p8/m, z0.s, z31.b +fmopa ZA4.h, p15/m, p11/m, z0.s, z31.b + +/* FMOPS. */ +fmops ZA0.s, p0/m, p0/m, z0.h, z0.h +fmops ZA1.h, p0, p0/m, z0.h, z0.h +fmops ZA0.h, p7/m, p0, z0.h, z0.h +fmops ZA0.h, p0/m, p7/m, z0.s, z0.s +fmops ZA0.h, p0/m, p0/m, z31.d, z0.d +fmops ZA2.h, p0/m, p8/m, z0.s, z31.b +fmops ZA4.h, p15/m, p11/m, z0.s, z31.b diff --git a/gas/testsuite/gas/aarch64/sme-f16f16-2.d b/gas/testsuite/gas/aarch64/sme-f16f16-2.d new file mode 100644 index 00000000000..f35c1b1890b --- /dev/null +++ b/gas/testsuite/gas/aarch64/sme-f16f16-2.d @@ -0,0 +1,28 @@ +#name: Test of FEAT_SME_F16F16 fmopa and fmops instructions. +#as: -march=armv8-a+sme-f16f16 +#objdump: -dr + +[^:]+: file format .* + + +[^:]+: + +[^:]+: +.*: 81800008 fmopa za0.h, p0/m, p0/m, z0.h, z0.h +.*: 81800009 fmopa za1.h, p0/m, p0/m, z0.h, z0.h +.*: 81801c08 fmopa za0.h, p7/m, p0/m, z0.h, z0.h +.*: 8180e008 fmopa za0.h, p0/m, p7/m, z0.h, z0.h +.*: 818003e8 fmopa za0.h, p0/m, p0/m, z31.h, z0.h +.*: 819f0008 fmopa za0.h, p0/m, p0/m, z0.h, z31.h +.*: 819fffe9 fmopa za1.h, p7/m, p7/m, z31.h, z31.h +.*: 818fad48 fmopa za0.h, p3/m, p5/m, z10.h, z15.h +.*: 819965e9 fmopa za1.h, p1/m, p3/m, z15.h, z25.h +.*: 81800018 fmops za0.h, p0/m, p0/m, z0.h, z0.h +.*: 81800019 fmops za1.h, p0/m, p0/m, z0.h, z0.h +.*: 81801c18 fmops za0.h, p7/m, p0/m, z0.h, z0.h +.*: 8180e018 fmops za0.h, p0/m, p7/m, z0.h, z0.h +.*: 818003f8 fmops za0.h, p0/m, p0/m, z31.h, z0.h +.*: 819f0018 fmops za0.h, p0/m, p0/m, z0.h, z31.h +.*: 819ffff9 fmops za1.h, p7/m, p7/m, z31.h, z31.h +.*: 818fad58 fmops za0.h, p3/m, p5/m, z10.h, z15.h +.*: 819965f9 fmops za1.h, p1/m, p3/m, z15.h, z25.h diff --git a/gas/testsuite/gas/aarch64/sme-f16f16-2.s b/gas/testsuite/gas/aarch64/sme-f16f16-2.s new file mode 100644 index 00000000000..2032cf36790 --- /dev/null +++ b/gas/testsuite/gas/aarch64/sme-f16f16-2.s @@ -0,0 +1,21 @@ +/* FMOPA. */ +fmopa ZA0.h, p0/m, p0/m, z0.h, z0.h +fmopa ZA1.h, p0/m, p0/m, z0.h, z0.h +fmopa ZA0.h, p7/m, p0/m, z0.h, z0.h +fmopa ZA0.h, p0/m, p7/m, z0.h, z0.h +fmopa ZA0.h, p0/m, p0/m, z31.h, z0.h +fmopa ZA0.h, p0/m, p0/m, z0.h, z31.h +fmopa ZA1.h, p7/m, p7/m, z31.h, z31.h +fmopa ZA0.h, p3/m, p5/m, z10.h, z15.h +fmopa ZA1.h, p1/m, p3/m, z15.h, z25.h + +/* FMOPS. */ +fmops ZA0.h, p0/m, p0/m, z0.h, z0.h +fmops ZA1.h, p0/m, p0/m, z0.h, z0.h +fmops ZA0.h, p7/m, p0/m, z0.h, z0.h +fmops ZA0.h, p0/m, p7/m, z0.h, z0.h +fmops ZA0.h, p0/m, p0/m, z31.h, z0.h +fmops ZA0.h, p0/m, p0/m, z0.h, z31.h +fmops ZA1.h, p7/m, p7/m, z31.h, z31.h +fmops ZA0.h, p3/m, p5/m, z10.h, z15.h +fmops ZA1.h, p1/m, p3/m, z15.h, z25.h diff --git a/opcodes/aarch64-tbl.h b/opcodes/aarch64-tbl.h index 28f9dd324f3..7619cd7acb7 100644 --- a/opcodes/aarch64-tbl.h +++ b/opcodes/aarch64-tbl.h @@ -1715,6 +1715,10 @@ { \ QLF5(S_H,P_M,P_M,S_B,S_B) \ } +#define OP_SVE_HMMHH \ +{ \ + QLF5(S_H,P_M,P_M,S_H,S_H) \ +} #define OP_SVE_HMS \ { \ QLF3(S_H,P_M,S_S), \ @@ -2861,6 +2865,8 @@ static const aarch64_feature_set aarch64_feature_sme_f8f16 = AARCH64_FEATURES (2, SME_F8F32, SME2); static const aarch64_feature_set aarch64_feature_sme_f16f16_f8f16 = AARCH64_FEATURES (2, SME_F16F16_F8F16, SME2); +static const aarch64_feature_set aarch64_feature_sme_f16f16 = + AARCH64_FEATURES (2, SME_F16F16, SME2); #define CORE &aarch64_feature_v8 #define FP &aarch64_feature_fp @@ -2948,6 +2954,7 @@ static const aarch64_feature_set aarch64_feature_sme_f16f16_f8f16 = #define SME_F8F32 &aarch64_feature_sme_f8f32 #define SME_F8F16 &aarch64_feature_sme_f8f16 #define SME_F16F16_F8F16 &aarch64_feature_sme_f16f16_f8f16 +#define SME_F16F16 &aarch64_feature_sme_f16f16 #define CORE_INSN(NAME,OPCODE,MASK,CLASS,OP,OPS,QUALS,FLAGS) \ { NAME, OPCODE, MASK, CLASS, OP, CORE, OPS, QUALS, FLAGS, 0, 0, NULL } @@ -3169,6 +3176,9 @@ static const aarch64_feature_set aarch64_feature_sme_f16f16_f8f16 = { NAME, OPCODE, MASK, CLASS, 0, SME_F8F16, OPS, QUALS, F_STRICT | FLAGS, CONSTRAINTS, 0, NULL } #define SME_F16F16_F8F16_INSNC(NAME,OPCODE,MASK,CLASS,OPS,QUALS,FLAGS,CONSTRAINTS) \ { NAME, OPCODE, MASK, CLASS, 0, SME_F16F16_F8F16, OPS, QUALS, F_STRICT | FLAGS, CONSTRAINTS, 0, NULL } +#define SME_F16F16_INSN(NAME,OPCODE,MASK,CLASS,OP,OPS,QUALS,FLAGS,TIED) \ + { NAME, OPCODE, MASK, CLASS, OP, SME_F16F16, OPS, QUALS, \ + FLAGS | F_STRICT, 0, TIED, NULL } #define MOPS_CPY_OP1_OP2_PME_INSN(NAME, OPCODE, MASK, FLAGS, CONSTRAINTS) \ MOPS_INSN (NAME, OPCODE, MASK, 0, \ @@ -6686,6 +6696,10 @@ const struct aarch64_opcode aarch64_opcode_table[] = SME2p1_INSN ("zero", 0xc00f0000, 0xffff9ffe, sme2_movaz, 0, OP1 (SME_ZA_array_off1x4), OP_SVE_D, F_OD (2) | F_VG_REQ, 0), SME2p1_INSN ("zero", 0xc00f8000, 0xffff9ffe, sme2_movaz, 0, OP1 (SME_ZA_array_off1x4), OP_SVE_D, F_OD (4) | F_VG_REQ, 0), +/* SME2.1 half-precision floating-point instructions. */ + SME_F16F16_INSN("fmopa", 0x81800008, 0xffe0001e, sme_misc, 0, OP5 (SME_ZAda_1b, SVE_Pg3, SME_Pm, SVE_Zn, SVE_Zm_16), OP_SVE_HMMHH, 0, 0), + SME_F16F16_INSN("fmops", 0x81800018, 0xffe0001e, sme_misc, 0, OP5 (SME_ZAda_1b, SVE_Pg3, SME_Pm, SVE_Zn, SVE_Zm_16), OP_SVE_HMMHH, 0, 0), + /* SVE2p1 Instructions. */ SVE2p1_INSN("addqv",0x04052000, 0xff3fe000, sve2_urqvs, 0, OP3 (Vd, SVE_Pg3, SVE_Zn), OP_SVE_vUS_BHSD_BHSD, F_OPD_SIZE, 0), SVE2p1_INSN("andqv",0x041e2000, 0xff3fe000, sve2_urqvs, 0, OP3 (Vd, SVE_Pg3, SVE_Zn), OP_SVE_vUS_BHSD_BHSD, F_OPD_SIZE, 0),