From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 13915 invoked by alias); 1 May 2019 17:06:00 -0000 Mailing-List: contact binutils-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: binutils-owner@sourceware.org Received: (qmail 13903 invoked by uid 89); 1 May 2019 17:05:59 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-24.8 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_LOTSOFHASH,SPF_PASS autolearn=ham version=3.3.1 spammy= X-HELO: foss.arm.com Received: from usa-sjc-mx-foss1.foss.arm.com (HELO foss.arm.com) (217.140.101.70) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 01 May 2019 17:05:57 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 4D1E880D for ; Wed, 1 May 2019 10:05:56 -0700 (PDT) Received: from [10.2.207.62] (e107157-lin.cambridge.arm.com [10.2.207.62]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id BF0E73F719 for ; Wed, 1 May 2019 10:05:55 -0700 (PDT) Subject: [PATCH 12/57][Arm][GAS] Add support for MVE instructions: vaddlv and vaddv To: binutils@sourceware.org References: <19569550-4d2e-0bb3-592a-d91050d490f6@arm.com> From: "Andre Vieira (lists)" Message-ID: <93090826-56b6-61a0-0e35-3be335892c87@arm.com> Date: Wed, 01 May 2019 17:06:00 -0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.6.1 MIME-Version: 1.0 In-Reply-To: <19569550-4d2e-0bb3-592a-d91050d490f6@arm.com> Content-Type: multipart/mixed; boundary="------------B7AD5EDB5861620D2024544E" X-IsSubscribed: yes X-SW-Source: 2019-05/txt/msg00041.txt.bz2 This is a multi-part message in MIME format. --------------B7AD5EDB5861620D2024544E Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Content-length: 682 Hi, This patch adds support for MVE instructions VADDLV and VADDV. gas/ChangeLog: 2019-05-01 Andre Vieira * config/tc-arm.c (M_MNEM_vaddlv, M_MNEM_vaddlva, M_MNEM_vaddv, M_MNEM_vaddva): New instruction encodings. (mve_encode_rq): New encoding helper function. (do_mve_vaddlv): New encoding function. (do_mve_vaddv): New encoding function. * testsuite/gas/arm/mve-vaddlv-bad.d: New test. * testsuite/gas/arm/mve-vaddlv-bad.l: New test. * testsuite/gas/arm/mve-vaddlv-bad.s: New test. * testsuite/gas/arm/mve-vaddv-bad.d: New test. * testsuite/gas/arm/mve-vaddv-bad.l: New test. * testsuite/gas/arm/mve-vaddv-bad.s: New test. --------------B7AD5EDB5861620D2024544E Content-Type: text/x-patch; name="12.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="12.patch" Content-length: 11537 diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c index 91754e3da9d500300443e28455ee6f248ded249b..34e2c592ab00c32bd829152693d6fa036dc2a81f 100644 --- a/gas/config/tc-arm.c +++ b/gas/config/tc-arm.c @@ -14142,6 +14142,10 @@ do_t_loloop (void) #define M_MNEM_vadc 0xee300f00 #define M_MNEM_vadci 0xee301f00 #define M_MNEM_vbrsr 0xfe011e60 +#define M_MNEM_vaddlv 0xee890f00 +#define M_MNEM_vaddlva 0xee890f20 +#define M_MNEM_vaddv 0xeef10f00 +#define M_MNEM_vaddva 0xeef10f20 /* Neon instruction encoder helpers. */ @@ -14318,6 +14322,8 @@ NEON_ENC_TAB X(3, (D, D, S), DOUBLE), \ X(3, (Q, Q, S), QUAD), \ X(3, (Q, Q, R), QUAD), \ + X(3, (R, R, Q), QUAD), \ + X(2, (R, Q), QUAD), \ X(2, (D, D), DOUBLE), \ X(2, (Q, Q), QUAD), \ X(2, (D, S), DOUBLE), \ @@ -15766,6 +15772,15 @@ mve_encode_qqq (int ubit, int size) inst.is_neon = 1; } +static void +mve_encode_rq (unsigned bit28, unsigned size) +{ + inst.instruction |= bit28 << 28; + inst.instruction |= neon_logbits (size) << 18; + inst.instruction |= inst.operands[0].reg << 12; + inst.instruction |= LOW4 (inst.operands[1].reg); + inst.is_neon = 1; +} /* Encode insns with bit pattern: @@ -16489,6 +16504,30 @@ do_mve_vst_vld (void) inst.is_neon = 1; } +static void +do_mve_vaddlv (void) +{ + enum neon_shape rs = neon_select_shape (NS_RRQ, NS_NULL); + struct neon_type_el et + = neon_check_type (3, rs, N_EQK, N_EQK, N_S32 | N_U32 | N_KEY); + + if (et.type == NT_invtype) + first_error (BAD_EL_TYPE); + + if (inst.cond > COND_ALWAYS) + inst.pred_insn_type = INSIDE_VPT_INSN; + else + inst.pred_insn_type = MVE_OUTSIDE_PRED_INSN; + + constraint (inst.operands[1].reg > 14, MVE_BAD_QREG); + + inst.instruction |= (et.type == NT_unsigned) << 28; + inst.instruction |= inst.operands[1].reg << 19; + inst.instruction |= inst.operands[0].reg << 12; + inst.instruction |= inst.operands[2].reg; + inst.is_neon = 1; +} + static void do_neon_dyadic_if_su (void) { @@ -16764,6 +16803,26 @@ do_neon_qdmulh (void) } } +static void +do_mve_vaddv (void) +{ + enum neon_shape rs = neon_select_shape (NS_RQ, NS_NULL); + struct neon_type_el et + = neon_check_type (2, rs, N_EQK, N_SU_32 | N_KEY); + + if (et.type == NT_invtype) + first_error (BAD_EL_TYPE); + + if (inst.cond > COND_ALWAYS) + inst.pred_insn_type = INSIDE_VPT_INSN; + else + inst.pred_insn_type = MVE_OUTSIDE_PRED_INSN; + + constraint (inst.operands[1].reg > 14, MVE_BAD_QREG); + + mve_encode_rq (et.type == NT_unsigned, et.size); +} + static void do_mve_vadc (void) { @@ -24001,6 +24060,10 @@ static const struct asm_opcode insns[] = mCEF(vmovnt, _vmovnt, 2, (RMQ, RMQ), mve_movn), mCEF(vmovnb, _vmovnb, 2, (RMQ, RMQ), mve_movn), mCEF(vbrsr, _vbrsr, 3, (RMQ, RMQ, RR), mve_vbrsr), + mCEF(vaddlv, _vaddlv, 3, (RRe, RRo, RMQ), mve_vaddlv), + mCEF(vaddlva, _vaddlva, 3, (RRe, RRo, RMQ), mve_vaddlv), + mCEF(vaddv, _vaddv, 2, (RRe, RMQ), mve_vaddv), + mCEF(vaddva, _vaddva, 2, (RRe, RMQ), mve_vaddv), #undef ARM_VARIANT #define ARM_VARIANT & fpu_vfp_ext_v1 diff --git a/gas/testsuite/gas/arm/mve-vaddlv-bad.d b/gas/testsuite/gas/arm/mve-vaddlv-bad.d new file mode 100644 index 0000000000000000000000000000000000000000..b5993f3181cd4885d81a59224e7f19e1c5a9425f --- /dev/null +++ b/gas/testsuite/gas/arm/mve-vaddlv-bad.d @@ -0,0 +1,5 @@ +#name: Bad MVE VADDLV instructions +#as: -march=armv8.1-m.main+mve.fp +#error_output: mve-vaddlv-bad.l + +.*: +file format .*arm.* diff --git a/gas/testsuite/gas/arm/mve-vaddlv-bad.l b/gas/testsuite/gas/arm/mve-vaddlv-bad.l new file mode 100644 index 0000000000000000000000000000000000000000..771fc009f9ea7e802e15ddfe1e41dd6e75523627 --- /dev/null +++ b/gas/testsuite/gas/arm/mve-vaddlv-bad.l @@ -0,0 +1,42 @@ +[^:]*: Assembler messages: +[^:]*:12: Warning: instruction is UNPREDICTABLE in an IT block +[^:]*:12: Warning: instruction is UNPREDICTABLE in an IT block +[^:]*:12: Warning: instruction is UNPREDICTABLE in an IT block +[^:]*:12: Warning: instruction is UNPREDICTABLE in an IT block +[^:]*:12: Warning: instruction is UNPREDICTABLE in an IT block +[^:]*:12: Warning: instruction is UNPREDICTABLE in an IT block +[^:]*:12: Warning: instruction is UNPREDICTABLE in an IT block +[^:]*:12: Warning: instruction is UNPREDICTABLE in an IT block +[^:]*:12: Warning: instruction is UNPREDICTABLE in an IT block +[^:]*:12: Warning: instruction is UNPREDICTABLE in an IT block +[^:]*:12: Warning: instruction is UNPREDICTABLE in an IT block +[^:]*:12: Warning: instruction is UNPREDICTABLE in an IT block +[^:]*:13: Error: bad type in SIMD instruction -- `vaddlv.i32 r0,r1,q0' +[^:]*:14: Error: bad type in SIMD instruction -- `vaddlv.f32 r0,r1,q0' +[^:]*:15: Error: bad type in SIMD instruction -- `vaddlv.s8 r0,r1,q0' +[^:]*:16: Error: bad type in SIMD instruction -- `vaddlv.s16 r0,r1,q0' +[^:]*:17: Error: bad type in SIMD instruction -- `vaddlv.s64 r0,r1,q0' +[^:]*:18: Error: bad type in SIMD instruction -- `vaddlv.u8 r0,r1,q0' +[^:]*:19: Error: bad type in SIMD instruction -- `vaddlv.u16 r0,r1,q0' +[^:]*:20: Error: bad type in SIMD instruction -- `vaddlv.u64 r0,r1,q0' +[^:]*:21: Error: bad type in SIMD instruction -- `vaddlva.i32 r0,r1,q0' +[^:]*:22: Error: bad type in SIMD instruction -- `vaddlva.f32 r0,r1,q0' +[^:]*:23: Error: bad type in SIMD instruction -- `vaddlva.s8 r0,r1,q0' +[^:]*:24: Error: bad type in SIMD instruction -- `vaddlva.s16 r0,r1,q0' +[^:]*:25: Error: bad type in SIMD instruction -- `vaddlva.s64 r0,r1,q0' +[^:]*:26: Error: bad type in SIMD instruction -- `vaddlva.u8 r0,r1,q0' +[^:]*:27: Error: bad type in SIMD instruction -- `vaddlva.u16 r0,r1,q0' +[^:]*:28: Error: bad type in SIMD instruction -- `vaddlva.u64 r0,r1,q0' +[^:]*:29: Error: Odd register not allowed here -- `vaddlv.s32 r1,r3,q0' +[^:]*:30: Error: Even register not allowed here -- `vaddlva.s32 r0,r2,q0' +[^:]*:31: Warning: instruction is UNPREDICTABLE with SP operand +[^:]*:33: Error: syntax error -- `vaddlveq.s32 r0,r1,q0' +[^:]*:34: Error: syntax error -- `vaddlveq.s32 r0,r1,q0' +[^:]*:36: Error: syntax error -- `vaddlveq.s32 r0,r1,q0' +[^:]*:37: Error: vector predicated instruction should be in VPT/VPST block -- `vaddlvt.s32 r0,r1,q0' +[^:]*:39: Error: instruction missing MVE vector predication code -- `vaddlv.s32 r0,r1,q0' +[^:]*:41: Error: syntax error -- `vaddlvaeq.s32 r0,r1,q0' +[^:]*:42: Error: syntax error -- `vaddlvaeq.s32 r0,r1,q0' +[^:]*:44: Error: syntax error -- `vaddlvaeq.s32 r0,r1,q0' +[^:]*:45: Error: vector predicated instruction should be in VPT/VPST block -- `vaddlvat.s32 r0,r1,q0' +[^:]*:47: Error: instruction missing MVE vector predication code -- `vaddlva.s32 r0,r1,q0' diff --git a/gas/testsuite/gas/arm/mve-vaddlv-bad.s b/gas/testsuite/gas/arm/mve-vaddlv-bad.s new file mode 100644 index 0000000000000000000000000000000000000000..eda6923ffed6b836f5b40db73309e39601f8e650 --- /dev/null +++ b/gas/testsuite/gas/arm/mve-vaddlv-bad.s @@ -0,0 +1,47 @@ +.macro cond +.irp cond, eq, ne, gt, ge, lt, le +.irp mnem, vaddlv.s32, vaddlva.u32 +it \cond +\mnem r0, r1, q0 +.endr +.endr +.endm + +.syntax unified +.thumb +cond +vaddlv.i32 r0, r1, q0 +vaddlv.f32 r0, r1, q0 +vaddlv.s8 r0, r1, q0 +vaddlv.s16 r0, r1, q0 +vaddlv.s64 r0, r1, q0 +vaddlv.u8 r0, r1, q0 +vaddlv.u16 r0, r1, q0 +vaddlv.u64 r0, r1, q0 +vaddlva.i32 r0, r1, q0 +vaddlva.f32 r0, r1, q0 +vaddlva.s8 r0, r1, q0 +vaddlva.s16 r0, r1, q0 +vaddlva.s64 r0, r1, q0 +vaddlva.u8 r0, r1, q0 +vaddlva.u16 r0, r1, q0 +vaddlva.u64 r0, r1, q0 +vaddlv.s32 r1, r3, q0 +vaddlva.s32 r0, r2, q0 +vaddlv.s32 r0, sp, q0 +it eq +vaddlveq.s32 r0, r1, q0 +vaddlveq.s32 r0, r1, q0 +vpst +vaddlveq.s32 r0, r1, q0 +vaddlvt.s32 r0, r1, q0 +vpst +vaddlv.s32 r0, r1, q0 +it eq +vaddlvaeq.s32 r0, r1, q0 +vaddlvaeq.s32 r0, r1, q0 +vpst +vaddlvaeq.s32 r0, r1, q0 +vaddlvat.s32 r0, r1, q0 +vpst +vaddlva.s32 r0, r1, q0 diff --git a/gas/testsuite/gas/arm/mve-vaddv-bad.d b/gas/testsuite/gas/arm/mve-vaddv-bad.d new file mode 100644 index 0000000000000000000000000000000000000000..2291b7af74f47a34a3c3ef94d9c481f789877c2a --- /dev/null +++ b/gas/testsuite/gas/arm/mve-vaddv-bad.d @@ -0,0 +1,5 @@ +#name: bad MVE VADDV instructions +#as: -march=armv8.1-m.main+mve.fp +#error_output: mve-vaddv-bad.l + +.*: +file format .*arm.* diff --git a/gas/testsuite/gas/arm/mve-vaddv-bad.l b/gas/testsuite/gas/arm/mve-vaddv-bad.l new file mode 100644 index 0000000000000000000000000000000000000000..0d77dbdb41bcab7b2decdb91258dcd93f5e6c955 --- /dev/null +++ b/gas/testsuite/gas/arm/mve-vaddv-bad.l @@ -0,0 +1,32 @@ +[^:]*: Assembler messages: +[^:]*:12: Warning: instruction is UNPREDICTABLE in an IT block +[^:]*:12: Warning: instruction is UNPREDICTABLE in an IT block +[^:]*:12: Warning: instruction is UNPREDICTABLE in an IT block +[^:]*:12: Warning: instruction is UNPREDICTABLE in an IT block +[^:]*:12: Warning: instruction is UNPREDICTABLE in an IT block +[^:]*:12: Warning: instruction is UNPREDICTABLE in an IT block +[^:]*:12: Warning: instruction is UNPREDICTABLE in an IT block +[^:]*:12: Warning: instruction is UNPREDICTABLE in an IT block +[^:]*:12: Warning: instruction is UNPREDICTABLE in an IT block +[^:]*:12: Warning: instruction is UNPREDICTABLE in an IT block +[^:]*:12: Warning: instruction is UNPREDICTABLE in an IT block +[^:]*:12: Warning: instruction is UNPREDICTABLE in an IT block +[^:]*:13: Error: bad type in SIMD instruction -- `vaddv.i32 r0,q0' +[^:]*:14: Error: bad type in SIMD instruction -- `vaddv.f32 r0,q0' +[^:]*:15: Error: bad type in SIMD instruction -- `vaddv.s64 r0,q0' +[^:]*:16: Error: bad type in SIMD instruction -- `vaddv.u64 r0,q0' +[^:]*:17: Error: bad type in SIMD instruction -- `vaddva.i32 r0,q0' +[^:]*:18: Error: bad type in SIMD instruction -- `vaddva.f32 r0,q0' +[^:]*:19: Error: bad type in SIMD instruction -- `vaddva.s64 r0,q0' +[^:]*:20: Error: bad type in SIMD instruction -- `vaddva.u64 r0,q0' +[^:]*:21: Error: Odd register not allowed here -- `vaddv.s32 r1,q0' +[^:]*:23: Error: syntax error -- `vaddveq.s32 r0,q0' +[^:]*:24: Error: syntax error -- `vaddveq.s32 r0,q0' +[^:]*:26: Error: syntax error -- `vaddveq.s32 r0,q0' +[^:]*:27: Error: vector predicated instruction should be in VPT/VPST block -- `vaddvt.s32 r0,q0' +[^:]*:29: Error: instruction missing MVE vector predication code -- `vaddv.s32 r0,q0' +[^:]*:31: Error: syntax error -- `vaddvaeq.s32 r0,q0' +[^:]*:32: Error: syntax error -- `vaddvaeq.s32 r0,q0' +[^:]*:34: Error: syntax error -- `vaddvaeq.s32 r0,q0' +[^:]*:35: Error: vector predicated instruction should be in VPT/VPST block -- `vaddvat.s32 r0,q0' +[^:]*:37: Error: instruction missing MVE vector predication code -- `vaddva.s32 r0,q0' diff --git a/gas/testsuite/gas/arm/mve-vaddv-bad.s b/gas/testsuite/gas/arm/mve-vaddv-bad.s new file mode 100644 index 0000000000000000000000000000000000000000..eb5a65de128c5b9dbdca13231c8874152adf119c --- /dev/null +++ b/gas/testsuite/gas/arm/mve-vaddv-bad.s @@ -0,0 +1,37 @@ +.macro cond +.irp cond, eq, ne, gt, ge, lt, le +.irp mnem, vaddv.s32, vaddva.u32 +it \cond +\mnem r0, q0 +.endr +.endr +.endm + +.syntax unified +.thumb +cond +vaddv.i32 r0, q0 +vaddv.f32 r0, q0 +vaddv.s64 r0, q0 +vaddv.u64 r0, q0 +vaddva.i32 r0, q0 +vaddva.f32 r0, q0 +vaddva.s64 r0, q0 +vaddva.u64 r0, q0 +vaddv.s32 r1, q0 +it eq +vaddveq.s32 r0, q0 +vaddveq.s32 r0, q0 +vpst +vaddveq.s32 r0, q0 +vaddvt.s32 r0, q0 +vpst +vaddv.s32 r0, q0 +it eq +vaddvaeq.s32 r0, q0 +vaddvaeq.s32 r0, q0 +vpst +vaddvaeq.s32 r0, q0 +vaddvat.s32 r0, q0 +vpst +vaddva.s32 r0, q0 --------------B7AD5EDB5861620D2024544E--