mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-24 20:28:28 +08:00
[PATCH 31/57][Arm][GAS] Add support for MVE instructions: vshrn[tb], vrshrn[tb], vqshrn[tb], vqshrun[tb], vqrshrn[tb] and vqrshrun[tb]
gas/ChangeLog: 2019-05-16 Andre Vieira <andre.simoesdiasvieira@arm.com> * config/tc-arm.c (M_MNEM_vshrnt, M_MNEM_vshrnb, M_MNEM_vrshrnt, M_MNEM_vqshrnt, M_MNEM_vqshrnb, M_MNEM_vqshrunt, M_MNEM_vqshrunb, M_MNEM_vrshrnb, M_MNEM_vqrshrnt, M_MNEM_vqrshrnb, M_MNEM_vqrshrunt, M_MNEM_vqrshrunb): New instruction encodings. (do_mve_vshrn): New encoding function. (insns): Add entries for MVE mnemonics. * testsuite/gas/arm/mve-vqrshrn-bad.d: New test. * testsuite/gas/arm/mve-vqrshrn-bad.l: New test. * testsuite/gas/arm/mve-vqrshrn-bad.s: New test. * testsuite/gas/arm/mve-vshrn-bad.d: New test. * testsuite/gas/arm/mve-vshrn-bad.l: New test. * testsuite/gas/arm/mve-vshrn-bad.s: New test.
This commit is contained in:
@ -1,3 +1,18 @@
|
||||
2019-05-16 Andre Vieira <andre.simoesdiasvieira@arm.com>
|
||||
|
||||
* config/tc-arm.c (M_MNEM_vshrnt, M_MNEM_vshrnb, M_MNEM_vrshrnt,
|
||||
M_MNEM_vqshrnt, M_MNEM_vqshrnb, M_MNEM_vqshrunt, M_MNEM_vqshrunb,
|
||||
M_MNEM_vrshrnb, M_MNEM_vqrshrnt, M_MNEM_vqrshrnb, M_MNEM_vqrshrunt,
|
||||
M_MNEM_vqrshrunb): New instruction encodings.
|
||||
(do_mve_vshrn): New encoding function.
|
||||
(insns): Add entries for MVE mnemonics.
|
||||
* testsuite/gas/arm/mve-vqrshrn-bad.d: New test.
|
||||
* testsuite/gas/arm/mve-vqrshrn-bad.l: New test.
|
||||
* testsuite/gas/arm/mve-vqrshrn-bad.s: New test.
|
||||
* testsuite/gas/arm/mve-vshrn-bad.d: New test.
|
||||
* testsuite/gas/arm/mve-vshrn-bad.l: New test.
|
||||
* testsuite/gas/arm/mve-vshrn-bad.s: New test.
|
||||
|
||||
2019-05-16 Andre Vieira <andre.simoesdiasvieira@arm.com>
|
||||
|
||||
* config/tc-arm.c (M_MNEM_vqmovnt, M_MNEM_vqmovnb,
|
||||
|
@ -14206,6 +14206,18 @@ do_t_loloop (void)
|
||||
#define M_MNEM_vqmovnb 0xee330e01
|
||||
#define M_MNEM_vqmovunt 0xee311e81
|
||||
#define M_MNEM_vqmovunb 0xee310e81
|
||||
#define M_MNEM_vshrnt 0xee801fc1
|
||||
#define M_MNEM_vshrnb 0xee800fc1
|
||||
#define M_MNEM_vrshrnt 0xfe801fc1
|
||||
#define M_MNEM_vqshrnt 0xee801f40
|
||||
#define M_MNEM_vqshrnb 0xee800f40
|
||||
#define M_MNEM_vqshrunt 0xee801fc0
|
||||
#define M_MNEM_vqshrunb 0xee800fc0
|
||||
#define M_MNEM_vrshrnb 0xfe800fc1
|
||||
#define M_MNEM_vqrshrnt 0xee801f41
|
||||
#define M_MNEM_vqrshrnb 0xee800f41
|
||||
#define M_MNEM_vqrshrunt 0xfe801fc0
|
||||
#define M_MNEM_vqrshrunb 0xfe800fc0
|
||||
|
||||
/* Neon instruction encoder helpers. */
|
||||
|
||||
@ -15750,6 +15762,58 @@ do_mve_vmlas (void)
|
||||
inst.is_neon = 1;
|
||||
}
|
||||
|
||||
static void
|
||||
do_mve_vshrn (void)
|
||||
{
|
||||
unsigned types;
|
||||
switch (inst.instruction)
|
||||
{
|
||||
case M_MNEM_vshrnt:
|
||||
case M_MNEM_vshrnb:
|
||||
case M_MNEM_vrshrnt:
|
||||
case M_MNEM_vrshrnb:
|
||||
types = N_I16 | N_I32;
|
||||
break;
|
||||
case M_MNEM_vqshrnt:
|
||||
case M_MNEM_vqshrnb:
|
||||
case M_MNEM_vqrshrnt:
|
||||
case M_MNEM_vqrshrnb:
|
||||
types = N_U16 | N_U32 | N_S16 | N_S32;
|
||||
break;
|
||||
case M_MNEM_vqshrunt:
|
||||
case M_MNEM_vqshrunb:
|
||||
case M_MNEM_vqrshrunt:
|
||||
case M_MNEM_vqrshrunb:
|
||||
types = N_S16 | N_S32;
|
||||
break;
|
||||
default:
|
||||
abort ();
|
||||
}
|
||||
|
||||
struct neon_type_el et = neon_check_type (2, NS_QQI, N_EQK, types | N_KEY);
|
||||
|
||||
if (inst.cond > COND_ALWAYS)
|
||||
inst.pred_insn_type = INSIDE_VPT_INSN;
|
||||
else
|
||||
inst.pred_insn_type = MVE_OUTSIDE_PRED_INSN;
|
||||
|
||||
unsigned Qd = inst.operands[0].reg;
|
||||
unsigned Qm = inst.operands[1].reg;
|
||||
unsigned imm = inst.operands[2].imm;
|
||||
constraint (imm < 1 || ((unsigned) imm) > (et.size / 2),
|
||||
et.size == 16
|
||||
? _("immediate operand expected in the range [1,8]")
|
||||
: _("immediate operand expected in the range [1,16]"));
|
||||
|
||||
inst.instruction |= (et.type == NT_unsigned) << 28;
|
||||
inst.instruction |= HI1 (Qd) << 22;
|
||||
inst.instruction |= (et.size - imm) << 16;
|
||||
inst.instruction |= LOW4 (Qd) << 12;
|
||||
inst.instruction |= HI1 (Qm) << 5;
|
||||
inst.instruction |= LOW4 (Qm);
|
||||
inst.is_neon = 1;
|
||||
}
|
||||
|
||||
static void
|
||||
do_mve_vqmovn (void)
|
||||
{
|
||||
@ -24946,6 +25010,19 @@ static const struct asm_opcode insns[] =
|
||||
mCEF(vqmovunt, _vqmovunt, 2, (RMQ, RMQ), mve_vqmovn),
|
||||
mCEF(vqmovunb, _vqmovunb, 2, (RMQ, RMQ), mve_vqmovn),
|
||||
|
||||
mCEF(vshrnt, _vshrnt, 3, (RMQ, RMQ, I32z), mve_vshrn),
|
||||
mCEF(vshrnb, _vshrnb, 3, (RMQ, RMQ, I32z), mve_vshrn),
|
||||
mCEF(vrshrnt, _vrshrnt, 3, (RMQ, RMQ, I32z), mve_vshrn),
|
||||
mCEF(vrshrnb, _vrshrnb, 3, (RMQ, RMQ, I32z), mve_vshrn),
|
||||
mCEF(vqshrnt, _vqrshrnt, 3, (RMQ, RMQ, I32z), mve_vshrn),
|
||||
mCEF(vqshrnb, _vqrshrnb, 3, (RMQ, RMQ, I32z), mve_vshrn),
|
||||
mCEF(vqshrunt, _vqrshrunt, 3, (RMQ, RMQ, I32z), mve_vshrn),
|
||||
mCEF(vqshrunb, _vqrshrunb, 3, (RMQ, RMQ, I32z), mve_vshrn),
|
||||
mCEF(vqrshrnt, _vqrshrnt, 3, (RMQ, RMQ, I32z), mve_vshrn),
|
||||
mCEF(vqrshrnb, _vqrshrnb, 3, (RMQ, RMQ, I32z), mve_vshrn),
|
||||
mCEF(vqrshrunt, _vqrshrunt, 3, (RMQ, RMQ, I32z), mve_vshrn),
|
||||
mCEF(vqrshrunb, _vqrshrunb, 3, (RMQ, RMQ, I32z), mve_vshrn),
|
||||
|
||||
#undef THUMB_VARIANT
|
||||
#define THUMB_VARIANT & mve_fp_ext
|
||||
mToC("vcmul", ee300e00, 4, (RMQ, RMQ, RMQ, EXPi), mve_vcmul),
|
||||
|
5
gas/testsuite/gas/arm/mve-vqrshrn-bad.d
Normal file
5
gas/testsuite/gas/arm/mve-vqrshrn-bad.d
Normal file
@ -0,0 +1,5 @@
|
||||
#name: bad MVE VQRSHRNT, VQRSHRNB, VQRHSRUNT and MVQRSHRUNB instructions
|
||||
#as: -march=armv8.1-m.main+mve.fp
|
||||
#error_output: mve-vqrshrn-bad.l
|
||||
|
||||
.*: +file format .*arm.*
|
71
gas/testsuite/gas/arm/mve-vqrshrn-bad.l
Normal file
71
gas/testsuite/gas/arm/mve-vqrshrn-bad.l
Normal file
@ -0,0 +1,71 @@
|
||||
[^:]*: Assembler messages:
|
||||
[^:]*:10: Error: bad type in SIMD instruction -- `vqrshrnt.s8 q0,q1,#1'
|
||||
[^:]*:11: Error: bad type in SIMD instruction -- `vqrshrnt.s64 q0,q1,#1'
|
||||
[^:]*:12: Error: immediate operand expected in the range \[1,8\] -- `vqrshrnt.s16 q0,q1,#0'
|
||||
[^:]*:13: Error: immediate operand expected in the range \[1,8\] -- `vqrshrnt.s16 q0,q1,#9'
|
||||
[^:]*:14: Error: immediate operand expected in the range \[1,16\] -- `vqrshrnt.s32 q0,q1,#0'
|
||||
[^:]*:15: Error: immediate operand expected in the range \[1,16\] -- `vqrshrnt.s32 q0,q1,#17'
|
||||
[^:]*:16: Error: bad type in SIMD instruction -- `vqrshrnb.s8 q0,q1,#1'
|
||||
[^:]*:17: Error: bad type in SIMD instruction -- `vqrshrnb.s64 q0,q1,#1'
|
||||
[^:]*:18: Error: immediate operand expected in the range \[1,8\] -- `vqrshrnb.s16 q0,q1,#0'
|
||||
[^:]*:19: Error: immediate operand expected in the range \[1,8\] -- `vqrshrnb.s16 q0,q1,#9'
|
||||
[^:]*:20: Error: immediate operand expected in the range \[1,16\] -- `vqrshrnb.s32 q0,q1,#0'
|
||||
[^:]*:21: Error: immediate operand expected in the range \[1,16\] -- `vqrshrnb.s32 q0,q1,#17'
|
||||
[^:]*:22: Error: bad type in SIMD instruction -- `vqrshrunt.s8 q0,q1,#1'
|
||||
[^:]*:23: Error: bad type in SIMD instruction -- `vqrshrunt.s64 q0,q1,#1'
|
||||
[^:]*:24: Error: immediate operand expected in the range \[1,8\] -- `vqrshrunt.s16 q0,q1,#0'
|
||||
[^:]*:25: Error: immediate operand expected in the range \[1,8\] -- `vqrshrunt.s16 q0,q1,#9'
|
||||
[^:]*:26: Error: immediate operand expected in the range \[1,16\] -- `vqrshrunt.s32 q0,q1,#0'
|
||||
[^:]*:27: Error: immediate operand expected in the range \[1,16\] -- `vqrshrunt.s32 q0,q1,#17'
|
||||
[^:]*:28: Error: bad type in SIMD instruction -- `vqrshrunt.u16 q0,q1,#1'
|
||||
[^:]*:29: Error: bad type in SIMD instruction -- `vqrshrunb.s8 q0,q1,#1'
|
||||
[^:]*:30: Error: bad type in SIMD instruction -- `vqrshrunb.s64 q0,q1,#1'
|
||||
[^:]*:31: Error: immediate operand expected in the range \[1,8\] -- `vqrshrunb.s16 q0,q1,#0'
|
||||
[^:]*:32: Error: immediate operand expected in the range \[1,8\] -- `vqrshrunb.s16 q0,q1,#9'
|
||||
[^:]*:33: Error: immediate operand expected in the range \[1,16\] -- `vqrshrunb.s32 q0,q1,#0'
|
||||
[^:]*:34: Error: immediate operand expected in the range \[1,16\] -- `vqrshrunb.s32 q0,q1,#17'
|
||||
[^:]*:35: Error: bad type in SIMD instruction -- `vqrshrunb.u16 q0,q1,#1'
|
||||
[^:]*:36: Warning: instruction is UNPREDICTABLE in an IT block
|
||||
[^:]*:36: Warning: instruction is UNPREDICTABLE in an IT block
|
||||
[^:]*:36: Warning: instruction is UNPREDICTABLE in an IT block
|
||||
[^:]*:36: Warning: instruction is UNPREDICTABLE in an IT block
|
||||
[^:]*:36: Warning: instruction is UNPREDICTABLE in an IT block
|
||||
[^:]*:36: Warning: instruction is UNPREDICTABLE in an IT block
|
||||
[^:]*:37: Warning: instruction is UNPREDICTABLE in an IT block
|
||||
[^:]*:37: Warning: instruction is UNPREDICTABLE in an IT block
|
||||
[^:]*:37: Warning: instruction is UNPREDICTABLE in an IT block
|
||||
[^:]*:37: Warning: instruction is UNPREDICTABLE in an IT block
|
||||
[^:]*:37: Warning: instruction is UNPREDICTABLE in an IT block
|
||||
[^:]*:37: Warning: instruction is UNPREDICTABLE in an IT block
|
||||
[^:]*:38: Warning: instruction is UNPREDICTABLE in an IT block
|
||||
[^:]*:38: Warning: instruction is UNPREDICTABLE in an IT block
|
||||
[^:]*:38: Warning: instruction is UNPREDICTABLE in an IT block
|
||||
[^:]*:38: Warning: instruction is UNPREDICTABLE in an IT block
|
||||
[^:]*:38: Warning: instruction is UNPREDICTABLE in an IT block
|
||||
[^:]*:38: Warning: instruction is UNPREDICTABLE in an IT block
|
||||
[^:]*:39: Warning: instruction is UNPREDICTABLE in an IT block
|
||||
[^:]*:39: Warning: instruction is UNPREDICTABLE in an IT block
|
||||
[^:]*:39: Warning: instruction is UNPREDICTABLE in an IT block
|
||||
[^:]*:39: Warning: instruction is UNPREDICTABLE in an IT block
|
||||
[^:]*:39: Warning: instruction is UNPREDICTABLE in an IT block
|
||||
[^:]*:39: Warning: instruction is UNPREDICTABLE in an IT block
|
||||
[^:]*:41: Error: syntax error -- `vqrshrnteq.s16 q0,q1,#1'
|
||||
[^:]*:42: Error: syntax error -- `vqrshrnteq.s16 q0,q1,#1'
|
||||
[^:]*:44: Error: syntax error -- `vqrshrnteq.s16 q0,q1,#1'
|
||||
[^:]*:45: Error: vector predicated instruction should be in VPT/VPST block -- `vqrshrntt.s16 q0,q1,#1'
|
||||
[^:]*:47: Error: instruction missing MVE vector predication code -- `vqrshrnt.s16 q0,q1,#1'
|
||||
[^:]*:49: Error: syntax error -- `vqrshrnbeq.s16 q0,q1,#1'
|
||||
[^:]*:50: Error: syntax error -- `vqrshrnbeq.s16 q0,q1,#1'
|
||||
[^:]*:52: Error: syntax error -- `vqrshrnbeq.s16 q0,q1,#1'
|
||||
[^:]*:53: Error: vector predicated instruction should be in VPT/VPST block -- `vqrshrnbt.s16 q0,q1,#1'
|
||||
[^:]*:55: Error: instruction missing MVE vector predication code -- `vqrshrnb.s16 q0,q1,#1'
|
||||
[^:]*:57: Error: syntax error -- `vqrshrunteq.s16 q0,q1,#1'
|
||||
[^:]*:58: Error: syntax error -- `vqrshrunteq.s16 q0,q1,#1'
|
||||
[^:]*:60: Error: syntax error -- `vqrshrunteq.s16 q0,q1,#1'
|
||||
[^:]*:61: Error: vector predicated instruction should be in VPT/VPST block -- `vqrshruntt.s16 q0,q1,#1'
|
||||
[^:]*:63: Error: instruction missing MVE vector predication code -- `vqrshrunt.s16 q0,q1,#1'
|
||||
[^:]*:65: Error: syntax error -- `vqrshrunbeq.s16 q0,q1,#1'
|
||||
[^:]*:66: Error: syntax error -- `vqrshrunbeq.s16 q0,q1,#1'
|
||||
[^:]*:68: Error: syntax error -- `vqrshrunbeq.s16 q0,q1,#1'
|
||||
[^:]*:69: Error: vector predicated instruction should be in VPT/VPST block -- `vqrshrunbt.s16 q0,q1,#1'
|
||||
[^:]*:71: Error: instruction missing MVE vector predication code -- `vqrshrunb.s16 q0,q1,#1'
|
71
gas/testsuite/gas/arm/mve-vqrshrn-bad.s
Normal file
71
gas/testsuite/gas/arm/mve-vqrshrn-bad.s
Normal file
@ -0,0 +1,71 @@
|
||||
.macro cond op
|
||||
.irp cond, eq, ne, gt, ge, lt, le
|
||||
it \cond
|
||||
\op\().s16 q0, q0, #1
|
||||
.endr
|
||||
.endm
|
||||
|
||||
.syntax unified
|
||||
.thumb
|
||||
vqrshrnt.s8 q0, q1, #1
|
||||
vqrshrnt.s64 q0, q1, #1
|
||||
vqrshrnt.s16 q0, q1, #0
|
||||
vqrshrnt.s16 q0, q1, #9
|
||||
vqrshrnt.s32 q0, q1, #0
|
||||
vqrshrnt.s32 q0, q1, #17
|
||||
vqrshrnb.s8 q0, q1, #1
|
||||
vqrshrnb.s64 q0, q1, #1
|
||||
vqrshrnb.s16 q0, q1, #0
|
||||
vqrshrnb.s16 q0, q1, #9
|
||||
vqrshrnb.s32 q0, q1, #0
|
||||
vqrshrnb.s32 q0, q1, #17
|
||||
vqrshrunt.s8 q0, q1, #1
|
||||
vqrshrunt.s64 q0, q1, #1
|
||||
vqrshrunt.s16 q0, q1, #0
|
||||
vqrshrunt.s16 q0, q1, #9
|
||||
vqrshrunt.s32 q0, q1, #0
|
||||
vqrshrunt.s32 q0, q1, #17
|
||||
vqrshrunt.u16 q0, q1, #1
|
||||
vqrshrunb.s8 q0, q1, #1
|
||||
vqrshrunb.s64 q0, q1, #1
|
||||
vqrshrunb.s16 q0, q1, #0
|
||||
vqrshrunb.s16 q0, q1, #9
|
||||
vqrshrunb.s32 q0, q1, #0
|
||||
vqrshrunb.s32 q0, q1, #17
|
||||
vqrshrunb.u16 q0, q1, #1
|
||||
cond vqrshrnt
|
||||
cond vqrshrnb
|
||||
cond vqrshrunt
|
||||
cond vqrshrunb
|
||||
it eq
|
||||
vqrshrnteq.s16 q0, q1, #1
|
||||
vqrshrnteq.s16 q0, q1, #1
|
||||
vpst
|
||||
vqrshrnteq.s16 q0, q1, #1
|
||||
vqrshrntt.s16 q0, q1, #1
|
||||
vpst
|
||||
vqrshrnt.s16 q0, q1, #1
|
||||
it eq
|
||||
vqrshrnbeq.s16 q0, q1, #1
|
||||
vqrshrnbeq.s16 q0, q1, #1
|
||||
vpst
|
||||
vqrshrnbeq.s16 q0, q1, #1
|
||||
vqrshrnbt.s16 q0, q1, #1
|
||||
vpst
|
||||
vqrshrnb.s16 q0, q1, #1
|
||||
it eq
|
||||
vqrshrunteq.s16 q0, q1, #1
|
||||
vqrshrunteq.s16 q0, q1, #1
|
||||
vpst
|
||||
vqrshrunteq.s16 q0, q1, #1
|
||||
vqrshruntt.s16 q0, q1, #1
|
||||
vpst
|
||||
vqrshrunt.s16 q0, q1, #1
|
||||
it eq
|
||||
vqrshrunbeq.s16 q0, q1, #1
|
||||
vqrshrunbeq.s16 q0, q1, #1
|
||||
vpst
|
||||
vqrshrunbeq.s16 q0, q1, #1
|
||||
vqrshrunbt.s16 q0, q1, #1
|
||||
vpst
|
||||
vqrshrunb.s16 q0, q1, #1
|
5
gas/testsuite/gas/arm/mve-vshrn-bad.d
Normal file
5
gas/testsuite/gas/arm/mve-vshrn-bad.d
Normal file
@ -0,0 +1,5 @@
|
||||
#name: bad MVE VSHRN and VRSHRN instructions
|
||||
#as: -march=armv8.1-m.main+mve
|
||||
#error_output: mve-vshrn-bad.l
|
||||
|
||||
.*: +file format .*arm.*
|
57
gas/testsuite/gas/arm/mve-vshrn-bad.l
Normal file
57
gas/testsuite/gas/arm/mve-vshrn-bad.l
Normal file
@ -0,0 +1,57 @@
|
||||
[^:]*: Assembler messages:
|
||||
[^:]*:10: Error: bad type in SIMD instruction -- `vshrnt.i64 q0,q1,#1'
|
||||
[^:]*:11: Error: bad type in SIMD instruction -- `vshrnb.i64 q0,q1,#1'
|
||||
[^:]*:12: Error: bad type in SIMD instruction -- `vrshrnt.i64 q0,q1,#1'
|
||||
[^:]*:13: Error: bad type in SIMD instruction -- `vrshrnb.i64 q0,q1,#1'
|
||||
[^:]*:14: Error: immediate operand expected in the range \[1,8\] -- `vshrnt.i16 q0,q1,#0'
|
||||
[^:]*:15: Error: immediate operand expected in the range \[1,8\] -- `vshrnt.i16 q0,q1,#9'
|
||||
[^:]*:16: Error: immediate operand expected in the range \[1,16\] -- `vshrnt.i32 q0,q1,#0'
|
||||
[^:]*:17: Error: immediate operand expected in the range \[1,16\] -- `vshrnt.i32 q0,q1,#17'
|
||||
[^:]*:18: Error: immediate operand expected in the range \[1,8\] -- `vshrnb.i16 q0,q1,#0'
|
||||
[^:]*:19: Error: immediate operand expected in the range \[1,8\] -- `vshrnb.i16 q0,q1,#9'
|
||||
[^:]*:20: Error: immediate operand expected in the range \[1,16\] -- `vshrnb.i32 q0,q1,#0'
|
||||
[^:]*:21: Error: immediate operand expected in the range \[1,16\] -- `vshrnb.i32 q0,q1,#17'
|
||||
[^:]*:22: Warning: instruction is UNPREDICTABLE in an IT block
|
||||
[^:]*:22: Warning: instruction is UNPREDICTABLE in an IT block
|
||||
[^:]*:22: Warning: instruction is UNPREDICTABLE in an IT block
|
||||
[^:]*:22: Warning: instruction is UNPREDICTABLE in an IT block
|
||||
[^:]*:22: Warning: instruction is UNPREDICTABLE in an IT block
|
||||
[^:]*:22: Warning: instruction is UNPREDICTABLE in an IT block
|
||||
[^:]*:23: Warning: instruction is UNPREDICTABLE in an IT block
|
||||
[^:]*:23: Warning: instruction is UNPREDICTABLE in an IT block
|
||||
[^:]*:23: Warning: instruction is UNPREDICTABLE in an IT block
|
||||
[^:]*:23: Warning: instruction is UNPREDICTABLE in an IT block
|
||||
[^:]*:23: Warning: instruction is UNPREDICTABLE in an IT block
|
||||
[^:]*:23: Warning: instruction is UNPREDICTABLE in an IT block
|
||||
[^:]*:24: Warning: instruction is UNPREDICTABLE in an IT block
|
||||
[^:]*:24: Warning: instruction is UNPREDICTABLE in an IT block
|
||||
[^:]*:24: Warning: instruction is UNPREDICTABLE in an IT block
|
||||
[^:]*:24: Warning: instruction is UNPREDICTABLE in an IT block
|
||||
[^:]*:24: Warning: instruction is UNPREDICTABLE in an IT block
|
||||
[^:]*:24: Warning: instruction is UNPREDICTABLE in an IT block
|
||||
[^:]*:25: Warning: instruction is UNPREDICTABLE in an IT block
|
||||
[^:]*:25: Warning: instruction is UNPREDICTABLE in an IT block
|
||||
[^:]*:25: Warning: instruction is UNPREDICTABLE in an IT block
|
||||
[^:]*:25: Warning: instruction is UNPREDICTABLE in an IT block
|
||||
[^:]*:25: Warning: instruction is UNPREDICTABLE in an IT block
|
||||
[^:]*:25: Warning: instruction is UNPREDICTABLE in an IT block
|
||||
[^:]*:27: Error: syntax error -- `vshrnteq.i32 q0,q1,#1'
|
||||
[^:]*:28: Error: syntax error -- `vshrnteq.i32 q0,q1,#1'
|
||||
[^:]*:30: Error: syntax error -- `vshrnteq.i32 q0,q1,#1'
|
||||
[^:]*:31: Error: vector predicated instruction should be in VPT/VPST block -- `vshrntt.i32 q0,q1,#1'
|
||||
[^:]*:33: Error: instruction missing MVE vector predication code -- `vshrnt.i32 q0,q1,#1'
|
||||
[^:]*:35: Error: syntax error -- `vshrnbeq.i32 q0,q1,#1'
|
||||
[^:]*:36: Error: syntax error -- `vshrnbeq.i32 q0,q1,#1'
|
||||
[^:]*:38: Error: syntax error -- `vshrnbeq.i32 q0,q1,#1'
|
||||
[^:]*:39: Error: vector predicated instruction should be in VPT/VPST block -- `vshrnbt.i32 q0,q1,#1'
|
||||
[^:]*:41: Error: instruction missing MVE vector predication code -- `vshrnb.i32 q0,q1,#1'
|
||||
[^:]*:43: Error: syntax error -- `vrshrnteq.i32 q0,q1,#1'
|
||||
[^:]*:44: Error: syntax error -- `vrshrnteq.i32 q0,q1,#1'
|
||||
[^:]*:46: Error: syntax error -- `vrshrnteq.i32 q0,q1,#1'
|
||||
[^:]*:47: Error: vector predicated instruction should be in VPT/VPST block -- `vrshrntt.i32 q0,q1,#1'
|
||||
[^:]*:49: Error: instruction missing MVE vector predication code -- `vrshrnt.i32 q0,q1,#1'
|
||||
[^:]*:51: Error: syntax error -- `vrshrnbeq.i32 q0,q1,#1'
|
||||
[^:]*:52: Error: syntax error -- `vrshrnbeq.i32 q0,q1,#1'
|
||||
[^:]*:54: Error: syntax error -- `vrshrnbeq.i32 q0,q1,#1'
|
||||
[^:]*:55: Error: vector predicated instruction should be in VPT/VPST block -- `vrshrnbt.i32 q0,q1,#1'
|
||||
[^:]*:57: Error: instruction missing MVE vector predication code -- `vrshrnb.i32 q0,q1,#1'
|
57
gas/testsuite/gas/arm/mve-vshrn-bad.s
Normal file
57
gas/testsuite/gas/arm/mve-vshrn-bad.s
Normal file
@ -0,0 +1,57 @@
|
||||
.macro cond op
|
||||
.irp cond, eq, ne, gt, ge, lt, le
|
||||
it \cond
|
||||
\op\().i32 q0, q1, #1
|
||||
.endr
|
||||
.endm
|
||||
|
||||
.syntax unified
|
||||
.thumb
|
||||
vshrnt.i64 q0, q1, #1
|
||||
vshrnb.i64 q0, q1, #1
|
||||
vrshrnt.i64 q0, q1, #1
|
||||
vrshrnb.i64 q0, q1, #1
|
||||
vshrnt.i16 q0, q1, #0
|
||||
vshrnt.i16 q0, q1, #9
|
||||
vshrnt.i32 q0, q1, #0
|
||||
vshrnt.i32 q0, q1, #17
|
||||
vshrnb.i16 q0, q1, #0
|
||||
vshrnb.i16 q0, q1, #9
|
||||
vshrnb.i32 q0, q1, #0
|
||||
vshrnb.i32 q0, q1, #17
|
||||
cond vshrnt
|
||||
cond vshrnb
|
||||
cond vrshrnt
|
||||
cond vrshrnb
|
||||
it eq
|
||||
vshrnteq.i32 q0, q1, #1
|
||||
vshrnteq.i32 q0, q1, #1
|
||||
vpst
|
||||
vshrnteq.i32 q0, q1, #1
|
||||
vshrntt.i32 q0, q1, #1
|
||||
vpst
|
||||
vshrnt.i32 q0, q1, #1
|
||||
it eq
|
||||
vshrnbeq.i32 q0, q1, #1
|
||||
vshrnbeq.i32 q0, q1, #1
|
||||
vpst
|
||||
vshrnbeq.i32 q0, q1, #1
|
||||
vshrnbt.i32 q0, q1, #1
|
||||
vpst
|
||||
vshrnb.i32 q0, q1, #1
|
||||
it eq
|
||||
vrshrnteq.i32 q0, q1, #1
|
||||
vrshrnteq.i32 q0, q1, #1
|
||||
vpst
|
||||
vrshrnteq.i32 q0, q1, #1
|
||||
vrshrntt.i32 q0, q1, #1
|
||||
vpst
|
||||
vrshrnt.i32 q0, q1, #1
|
||||
it eq
|
||||
vrshrnbeq.i32 q0, q1, #1
|
||||
vrshrnbeq.i32 q0, q1, #1
|
||||
vpst
|
||||
vrshrnbeq.i32 q0, q1, #1
|
||||
vrshrnbt.i32 q0, q1, #1
|
||||
vpst
|
||||
vrshrnb.i32 q0, q1, #1
|
Reference in New Issue
Block a user