[PATCH 30/57][Arm][GAS] Add support for MVE instructions: vqmovnt, vqmovnb, vqmovunt, vqmovunb, vqrshl and vrshl

gas/ChangeLog:
2019-05-16  Andre Vieira  <andre.simoesdiasvieira@arm.com>

	* config/tc-arm.c (M_MNEM_vqmovnt, M_MNEM_vqmovnb,
	 M_MNEM_vqmovunt, M_MNEM_vqmovunb): New instruction encodings.
	(do_mve_vqmovn): New encoding function.
	(do_neon_rshl): Change to accepte MVE variants.
	(insns): Change entries and add new for MVE mnemonics.
	* testsuite/gas/arm/mve-vqmovn-bad.d: New test.
	* testsuite/gas/arm/mve-vqmovn-bad.l: New test.
	* testsuite/gas/arm/mve-vqmovn-bad.s: New test.
	* testsuite/gas/arm/mve-vqrshl-bad.d: New test.
	* testsuite/gas/arm/mve-vqrshl-bad.l: New test.
	* testsuite/gas/arm/mve-vqrshl-bad.s: New test.
	* testsuite/gas/arm/mve-vrshl-bad.d: New test.
	* testsuite/gas/arm/mve-vrshl-bad.l: New test.
	* testsuite/gas/arm/mve-vrshl-bad.s: New test.
This commit is contained in:
Andre Vieira 2019-05-16 12:04:35 +01:00
parent 35d1cfc200
commit 1be7aba392
11 changed files with 366 additions and 9 deletions

View File

@ -1,3 +1,20 @@
2019-05-16 Andre Vieira <andre.simoesdiasvieira@arm.com>
* config/tc-arm.c (M_MNEM_vqmovnt, M_MNEM_vqmovnb,
M_MNEM_vqmovunt, M_MNEM_vqmovunb): New instruction encodings.
(do_mve_vqmovn): New encoding function.
(do_neon_rshl): Change to accepte MVE variants.
(insns): Change entries and add new for MVE mnemonics.
* testsuite/gas/arm/mve-vqmovn-bad.d: New test.
* testsuite/gas/arm/mve-vqmovn-bad.l: New test.
* testsuite/gas/arm/mve-vqmovn-bad.s: New test.
* testsuite/gas/arm/mve-vqrshl-bad.d: New test.
* testsuite/gas/arm/mve-vqrshl-bad.l: New test.
* testsuite/gas/arm/mve-vqrshl-bad.s: New test.
* testsuite/gas/arm/mve-vrshl-bad.d: New test.
* testsuite/gas/arm/mve-vrshl-bad.l: New test.
* testsuite/gas/arm/mve-vrshl-bad.s: New test.
2019-05-16 Andre Vieira <andre.simoesdiasvieira@arm.com>
* config/tc-arm.c (enum operand_parse_code): Add new operand.

View File

@ -14202,6 +14202,10 @@ do_t_loloop (void)
#define M_MNEM_vrmlsldavha 0xfe800e21
#define M_MNEM_vrmlsldavhx 0xfe801e01
#define M_MNEM_vrmlsldavhax 0xfe801e21
#define M_MNEM_vqmovnt 0xee331e01
#define M_MNEM_vqmovnb 0xee330e01
#define M_MNEM_vqmovunt 0xee311e81
#define M_MNEM_vqmovunb 0xee310e81
/* Neon instruction encoder helpers. */
@ -15746,6 +15750,31 @@ do_mve_vmlas (void)
inst.is_neon = 1;
}
static void
do_mve_vqmovn (void)
{
struct neon_type_el et;
if (inst.instruction == M_MNEM_vqmovnt
|| inst.instruction == M_MNEM_vqmovnb)
et = neon_check_type (2, NS_QQ, N_EQK,
N_U16 | N_U32 | N_S16 | N_S32 | N_KEY);
else
et = neon_check_type (2, NS_QQ, N_EQK, N_S16 | N_S32 | N_KEY);
if (inst.cond > COND_ALWAYS)
inst.pred_insn_type = INSIDE_VPT_INSN;
else
inst.pred_insn_type = MVE_OUTSIDE_PRED_INSN;
inst.instruction |= (et.type == NT_unsigned) << 28;
inst.instruction |= HI1 (inst.operands[0].reg) << 22;
inst.instruction |= (et.size == 32) << 18;
inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
inst.instruction |= HI1 (inst.operands[1].reg) << 5;
inst.instruction |= LOW4 (inst.operands[1].reg);
inst.is_neon = 1;
}
static void
do_mve_vpsel (void)
{
@ -16353,15 +16382,55 @@ do_neon_qshl_imm (void)
static void
do_neon_rshl (void)
{
enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
struct neon_type_el et = neon_check_type (3, rs,
N_EQK, N_EQK, N_SU_ALL | N_KEY);
if (check_simd_pred_availability (0, NEON_CHECK_ARCH | NEON_CHECK_CC))
return;
enum neon_shape rs;
struct neon_type_el et;
if (ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext))
{
rs = neon_select_shape (NS_QQR, NS_QQQ, NS_NULL);
et = neon_check_type (3, rs, N_EQK, N_EQK, N_SU_MVE | N_KEY);
}
else
{
rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
et = neon_check_type (3, rs, N_EQK, N_EQK, N_SU_ALL | N_KEY);
}
unsigned int tmp;
tmp = inst.operands[2].reg;
inst.operands[2].reg = inst.operands[1].reg;
inst.operands[1].reg = tmp;
neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
if (rs == NS_QQR)
{
if (inst.operands[2].reg == REG_PC)
as_tsktsk (MVE_BAD_PC);
else if (inst.operands[2].reg == REG_SP)
as_tsktsk (MVE_BAD_SP);
constraint (inst.operands[0].reg != inst.operands[1].reg,
_("invalid instruction shape"));
if (inst.instruction == 0x0000510)
/* We are dealing with vqrshl. */
inst.instruction = 0xee331ee0;
else
/* We are dealing with vrshl. */
inst.instruction = 0xee331e60;
inst.instruction |= (et.type == NT_unsigned) << 28;
inst.instruction |= HI1 (inst.operands[0].reg) << 22;
inst.instruction |= neon_logbits (et.size) << 18;
inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
inst.instruction |= inst.operands[2].reg;
inst.is_neon = 1;
}
else
{
tmp = inst.operands[2].reg;
inst.operands[2].reg = inst.operands[1].reg;
inst.operands[1].reg = tmp;
neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
}
}
static int
@ -24110,9 +24179,7 @@ static const struct asm_opcode insns[] =
/* integer ops, valid types S8 S16 S32 S64 U8 U16 U32 U64. */
NUF(vqaddq, 0000010, 3, (RNQ, oRNQ, RNQ), neon_dyadic_i64_su),
NUF(vqsubq, 0000210, 3, (RNQ, oRNQ, RNQ), neon_dyadic_i64_su),
NUF(vrshl, 0000500, 3, (RNDQ, oRNDQ, RNDQ), neon_rshl),
NUF(vrshlq, 0000500, 3, (RNQ, oRNQ, RNQ), neon_rshl),
NUF(vqrshl, 0000510, 3, (RNDQ, oRNDQ, RNDQ), neon_rshl),
NUF(vqrshlq, 0000510, 3, (RNQ, oRNQ, RNQ), neon_rshl),
/* If not immediate, fall back to neon_dyadic_i64_su.
shl_imm should accept I8 I16 I32 I64,
@ -24874,6 +24941,10 @@ static const struct asm_opcode insns[] =
mToC("vqrdmlash", ee001e40, 3, (RMQ, RMQ, RR), mve_vqdmlah),
mToC("vqdmullt", ee301f00, 3, (RMQ, RMQ, RMQRR), mve_vqdmull),
mToC("vqdmullb", ee300f00, 3, (RMQ, RMQ, RMQRR), mve_vqdmull),
mCEF(vqmovnt, _vqmovnt, 2, (RMQ, RMQ), mve_vqmovn),
mCEF(vqmovnb, _vqmovnb, 2, (RMQ, RMQ), mve_vqmovn),
mCEF(vqmovunt, _vqmovunt, 2, (RMQ, RMQ), mve_vqmovn),
mCEF(vqmovunb, _vqmovunb, 2, (RMQ, RMQ), mve_vqmovn),
#undef THUMB_VARIANT
#define THUMB_VARIANT & mve_fp_ext
@ -24960,6 +25031,8 @@ static const struct asm_opcode insns[] =
mnUF(vqrdmlah, _vqrdmlah,3, (RNDQMQ, oRNDQMQ, RNDQ_RNSC_RR), neon_qrdmlah),
mnUF(vqdmulh, _vqdmulh, 3, (RNDQMQ, oRNDQMQ, RNDQMQ_RNSC_RR), neon_qdmulh),
mnUF(vqrdmulh, _vqrdmulh,3, (RNDQMQ, oRNDQMQ, RNDQMQ_RNSC_RR), neon_qdmulh),
MNUF(vqrshl, 0000510, 3, (RNDQMQ, oRNDQMQ, RNDQMQR), neon_rshl),
MNUF(vrshl, 0000500, 3, (RNDQMQ, oRNDQMQ, RNDQMQR), neon_rshl),
#undef ARM_VARIANT
#define ARM_VARIANT & arm_ext_v8_3

View File

@ -0,0 +1,5 @@
#name: bad MVE VQMOVNT and VQMOVNB instructions
#as: -march=armv8.1-m.main+mve.fp
#error_output: mve-vqmovn-bad.l
.*: +file format .*arm.*

View File

@ -0,0 +1,61 @@
[^:]*: Assembler messages:
[^:]*:10: Error: bad type in SIMD instruction -- `vqmovnt.s8 q0,q1'
[^:]*:11: Error: bad type in SIMD instruction -- `vqmovnt.s64 q0,q1'
[^:]*:12: Error: bad type in SIMD instruction -- `vqmovnt.i16 q0,q1'
[^:]*:13: Error: bad type in SIMD instruction -- `vqmovnb.u8 q0,q1'
[^:]*:14: Error: bad type in SIMD instruction -- `vqmovnb.u64 q0,q1'
[^:]*:15: Error: bad type in SIMD instruction -- `vqmovnb.i16 q0,q1'
[^:]*:16: Error: bad type in SIMD instruction -- `vqmovunt.s8 q0,q1'
[^:]*:17: Error: bad type in SIMD instruction -- `vqmovunt.s64 q0,q1'
[^:]*:18: Error: bad type in SIMD instruction -- `vqmovunt.i16 q0,q1'
[^:]*:19: Error: bad type in SIMD instruction -- `vqmovunb.s8 q0,q1'
[^:]*:20: Error: bad type in SIMD instruction -- `vqmovunb.s64 q0,q1'
[^:]*:21: Error: bad type in SIMD instruction -- `vqmovunb.i16 q0,q1'
[^:]*:22: Error: bad type in SIMD instruction -- `vqmovunt.u16 q0,q1'
[^:]*:23: Error: bad type in SIMD instruction -- `vqmovunt.u32 q0,q1'
[^:]*:24: Error: bad type in SIMD instruction -- `vqmovunb.u16 q0,q1'
[^:]*:25: Error: bad type in SIMD instruction -- `vqmovunb.u32 q0,q1'
[^:]*:26: Warning: instruction is UNPREDICTABLE in an IT block
[^:]*:26: Warning: instruction is UNPREDICTABLE in an IT block
[^:]*:26: Warning: instruction is UNPREDICTABLE in an IT block
[^:]*:26: Warning: instruction is UNPREDICTABLE in an IT block
[^:]*:26: Warning: instruction is UNPREDICTABLE in an IT block
[^:]*:26: Warning: instruction is UNPREDICTABLE in an IT block
[^:]*:27: Warning: instruction is UNPREDICTABLE in an IT block
[^:]*:27: Warning: instruction is UNPREDICTABLE in an IT block
[^:]*:27: Warning: instruction is UNPREDICTABLE in an IT block
[^:]*:27: Warning: instruction is UNPREDICTABLE in an IT block
[^:]*:27: Warning: instruction is UNPREDICTABLE in an IT block
[^:]*:27: Warning: instruction is UNPREDICTABLE in an IT block
[^:]*:28: Warning: instruction is UNPREDICTABLE in an IT block
[^:]*:28: Warning: instruction is UNPREDICTABLE in an IT block
[^:]*:28: Warning: instruction is UNPREDICTABLE in an IT block
[^:]*:28: Warning: instruction is UNPREDICTABLE in an IT block
[^:]*:28: Warning: instruction is UNPREDICTABLE in an IT block
[^:]*:28: Warning: instruction is UNPREDICTABLE in an IT block
[^:]*:29: Warning: instruction is UNPREDICTABLE in an IT block
[^:]*:29: Warning: instruction is UNPREDICTABLE in an IT block
[^:]*:29: Warning: instruction is UNPREDICTABLE in an IT block
[^:]*:29: Warning: instruction is UNPREDICTABLE in an IT block
[^:]*:29: Warning: instruction is UNPREDICTABLE in an IT block
[^:]*:29: Warning: instruction is UNPREDICTABLE in an IT block
[^:]*:31: Error: syntax error -- `vqmovnteq.s16 q0,q1'
[^:]*:32: Error: syntax error -- `vqmovnteq.s16 q0,q1'
[^:]*:34: Error: syntax error -- `vqmovnteq.s16 q0,q1'
[^:]*:35: Error: vector predicated instruction should be in VPT/VPST block -- `vqmovntt.s16 q0,q1'
[^:]*:37: Error: instruction missing MVE vector predication code -- `vqmovnt.s16 q0,q1'
[^:]*:39: Error: syntax error -- `vqmovnbeq.s16 q0,q1'
[^:]*:40: Error: syntax error -- `vqmovnbeq.s16 q0,q1'
[^:]*:42: Error: syntax error -- `vqmovnbeq.s16 q0,q1'
[^:]*:43: Error: vector predicated instruction should be in VPT/VPST block -- `vqmovnbt.s16 q0,q1'
[^:]*:45: Error: instruction missing MVE vector predication code -- `vqmovnb.s16 q0,q1'
[^:]*:47: Error: syntax error -- `vqmovunteq.s16 q0,q1'
[^:]*:48: Error: syntax error -- `vqmovunteq.s16 q0,q1'
[^:]*:50: Error: syntax error -- `vqmovunteq.s16 q0,q1'
[^:]*:51: Error: vector predicated instruction should be in VPT/VPST block -- `vqmovuntt.s16 q0,q1'
[^:]*:53: Error: instruction missing MVE vector predication code -- `vqmovunt.s16 q0,q1'
[^:]*:55: Error: syntax error -- `vqmovunbeq.s16 q0,q1'
[^:]*:56: Error: syntax error -- `vqmovunbeq.s16 q0,q1'
[^:]*:58: Error: syntax error -- `vqmovunbeq.s16 q0,q1'
[^:]*:59: Error: vector predicated instruction should be in VPT/VPST block -- `vqmovunbt.s16 q0,q1'
[^:]*:61: Error: instruction missing MVE vector predication code -- `vqmovunb.s16 q0,q1'

View File

@ -0,0 +1,61 @@
.macro cond op
.irp cond, eq, ne, gt, ge, lt, le
it \cond
\op\().s16 q0, q1
.endr
.endm
.syntax unified
.thumb
vqmovnt.s8 q0, q1
vqmovnt.s64 q0, q1
vqmovnt.i16 q0, q1
vqmovnb.u8 q0, q1
vqmovnb.u64 q0, q1
vqmovnb.i16 q0, q1
vqmovunt.s8 q0, q1
vqmovunt.s64 q0, q1
vqmovunt.i16 q0, q1
vqmovunb.s8 q0, q1
vqmovunb.s64 q0, q1
vqmovunb.i16 q0, q1
vqmovunt.u16 q0, q1
vqmovunt.u32 q0, q1
vqmovunb.u16 q0, q1
vqmovunb.u32 q0, q1
cond vqmovnt
cond vqmovnb
cond vqmovunt
cond vqmovunb
it eq
vqmovnteq.s16 q0, q1
vqmovnteq.s16 q0, q1
vpst
vqmovnteq.s16 q0, q1
vqmovntt.s16 q0, q1
vpst
vqmovnt.s16 q0, q1
it eq
vqmovnbeq.s16 q0, q1
vqmovnbeq.s16 q0, q1
vpst
vqmovnbeq.s16 q0, q1
vqmovnbt.s16 q0, q1
vpst
vqmovnb.s16 q0, q1
it eq
vqmovunteq.s16 q0, q1
vqmovunteq.s16 q0, q1
vpst
vqmovunteq.s16 q0, q1
vqmovuntt.s16 q0, q1
vpst
vqmovunt.s16 q0, q1
it eq
vqmovunbeq.s16 q0, q1
vqmovunbeq.s16 q0, q1
vpst
vqmovunbeq.s16 q0, q1
vqmovunbt.s16 q0, q1
vpst
vqmovunb.s16 q0, q1

View File

@ -0,0 +1,5 @@
#name: bad MVE VQRSHL instructions
#as: -march=armv8.1-m.main+mve.fp
#error_output: mve-vqrshl-bad.l
.*: +file format .*arm.*

View File

@ -0,0 +1,32 @@
[^:]*: Assembler messages:
[^:]*:10: Error: bad type in SIMD instruction -- `vqrshl.s64 q0,q1,q2'
[^:]*:11: Error: bad type in SIMD instruction -- `vqrshl.u64 q0,q1,q2'
[^:]*:12: Error: bad type in SIMD instruction -- `vqrshl.i32 q0,q1,q2'
[^:]*:13: Error: bad type in SIMD instruction -- `vqrshl.s64 q0,r2'
[^:]*:14: Error: bad type in SIMD instruction -- `vqrshl.u64 q0,r2'
[^:]*:15: Error: bad type in SIMD instruction -- `vqrshl.i32 q0,r2'
[^:]*:16: Error: invalid instruction shape -- `vqrshl.s32 q0,q1,r2'
[^:]*:17: Warning: instruction is UNPREDICTABLE with PC operand
[^:]*:18: Warning: instruction is UNPREDICTABLE with SP operand
[^:]*:19: Warning: instruction is UNPREDICTABLE in an IT block
[^:]*:19: Warning: instruction is UNPREDICTABLE in an IT block
[^:]*:19: Warning: instruction is UNPREDICTABLE in an IT block
[^:]*:19: Warning: instruction is UNPREDICTABLE in an IT block
[^:]*:19: Warning: instruction is UNPREDICTABLE in an IT block
[^:]*:19: Warning: instruction is UNPREDICTABLE in an IT block
[^:]*:20: Warning: instruction is UNPREDICTABLE in an IT block
[^:]*:20: Warning: instruction is UNPREDICTABLE in an IT block
[^:]*:20: Warning: instruction is UNPREDICTABLE in an IT block
[^:]*:20: Warning: instruction is UNPREDICTABLE in an IT block
[^:]*:20: Warning: instruction is UNPREDICTABLE in an IT block
[^:]*:20: Warning: instruction is UNPREDICTABLE in an IT block
[^:]*:22: Error: syntax error -- `vqrshleq.s32 q0,q1,q2'
[^:]*:23: Error: syntax error -- `vqrshleq.s32 q0,q1,q2'
[^:]*:25: Error: syntax error -- `vqrshleq.s32 q0,q1,q2'
[^:]*:26: Error: vector predicated instruction should be in VPT/VPST block -- `vqrshlt.s32 q0,q1,q2'
[^:]*:28: Error: instruction missing MVE vector predication code -- `vqrshl.s32 q0,q1,q2'
[^:]*:30: Error: syntax error -- `vqrshleq.s32 q0,r2'
[^:]*:31: Error: syntax error -- `vqrshleq.s32 q0,r2'
[^:]*:33: Error: syntax error -- `vqrshleq.s32 q0,r2'
[^:]*:34: Error: vector predicated instruction should be in VPT/VPST block -- `vqrshlt.s32 q0,r2'
[^:]*:36: Error: instruction missing MVE vector predication code -- `vqrshl.s32 q0,r2'

View File

@ -0,0 +1,36 @@
.macro cond lastreg
.irp cond, eq, ne, gt, ge, lt, le
it \cond
vqrshl.s16 q0, q0, \lastreg
.endr
.endm
.syntax unified
.thumb
vqrshl.s64 q0, q1, q2
vqrshl.u64 q0, q1, q2
vqrshl.i32 q0, q1, q2
vqrshl.s64 q0, r2
vqrshl.u64 q0, r2
vqrshl.i32 q0, r2
vqrshl.s32 q0, q1, r2
vqrshl.s32 q0, pc
vqrshl.s32 q0, sp
cond q2
cond r2
it eq
vqrshleq.s32 q0, q1, q2
vqrshleq.s32 q0, q1, q2
vpst
vqrshleq.s32 q0, q1, q2
vqrshlt.s32 q0, q1, q2
vpst
vqrshl.s32 q0, q1, q2
it eq
vqrshleq.s32 q0, r2
vqrshleq.s32 q0, r2
vpst
vqrshleq.s32 q0, r2
vqrshlt.s32 q0, r2
vpst
vqrshl.s32 q0, r2

View File

@ -0,0 +1,5 @@
#name: bad MVE VRSHL instructions
#as: -march=armv8.1-m.main+mve
#error_output: mve-vrshl-bad.l
.*: +file format .*arm.*

View File

@ -0,0 +1,29 @@
[^:]*: Assembler messages:
[^:]*:10: Error: bad type in SIMD instruction -- `vrshl.i16 q0,q1,q2'
[^:]*:11: Error: bad type in SIMD instruction -- `vrshl.i16 q0,r2'
[^:]*:12: Error: bad type in SIMD instruction -- `vrshl.s64 q0,q1,q2'
[^:]*:13: Error: bad type in SIMD instruction -- `vrshl.s64 q0,r2'
[^:]*:14: Warning: instruction is UNPREDICTABLE with SP operand
[^:]*:15: Warning: instruction is UNPREDICTABLE with PC operand
[^:]*:16: Warning: instruction is UNPREDICTABLE in an IT block
[^:]*:16: Warning: instruction is UNPREDICTABLE in an IT block
[^:]*:16: Warning: instruction is UNPREDICTABLE in an IT block
[^:]*:16: Warning: instruction is UNPREDICTABLE in an IT block
[^:]*:16: Warning: instruction is UNPREDICTABLE in an IT block
[^:]*:16: Warning: instruction is UNPREDICTABLE in an IT block
[^:]*:17: Warning: instruction is UNPREDICTABLE in an IT block
[^:]*:17: Warning: instruction is UNPREDICTABLE in an IT block
[^:]*:17: Warning: instruction is UNPREDICTABLE in an IT block
[^:]*:17: Warning: instruction is UNPREDICTABLE in an IT block
[^:]*:17: Warning: instruction is UNPREDICTABLE in an IT block
[^:]*:17: Warning: instruction is UNPREDICTABLE in an IT block
[^:]*:19: Error: syntax error -- `vrshleq.s32 q0,q1,q2'
[^:]*:20: Error: syntax error -- `vrshleq.s32 q0,q1,q2'
[^:]*:22: Error: syntax error -- `vrshleq.s32 q0,q1,q2'
[^:]*:23: Error: vector predicated instruction should be in VPT/VPST block -- `vrshlt.s32 q0,q1,q2'
[^:]*:25: Error: instruction missing MVE vector predication code -- `vrshl.s32 q0,q1,q2'
[^:]*:27: Error: syntax error -- `vrshleq.s32 q0,r2'
[^:]*:28: Error: syntax error -- `vrshleq.s32 q0,r2'
[^:]*:30: Error: syntax error -- `vrshleq.s32 q0,r2'
[^:]*:31: Error: vector predicated instruction should be in VPT/VPST block -- `vrshlt.s32 q0,r2'
[^:]*:33: Error: instruction missing MVE vector predication code -- `vrshl.s32 q0,r2'

View File

@ -0,0 +1,33 @@
.macro cond lastreg
.irp cond, eq, ne, gt, ge, lt, le
it \cond
vrshl.s32 q0, q0, \lastreg
.endr
.endm
.syntax unified
.thumb
vrshl.i16 q0, q1, q2
vrshl.i16 q0, r2
vrshl.s64 q0, q1, q2
vrshl.s64 q0, r2
vrshl.s32 q0, sp
vrshl.s32 q0, pc
cond q2
cond r2
it eq
vrshleq.s32 q0, q1, q2
vrshleq.s32 q0, q1, q2
vpst
vrshleq.s32 q0, q1, q2
vrshlt.s32 q0, q1, q2
vpst
vrshl.s32 q0, q1, q2
it eq
vrshleq.s32 q0, r2
vrshleq.s32 q0, r2
vpst
vrshleq.s32 q0, r2
vrshlt.s32 q0, r2
vpst
vrshl.s32 q0, r2