[PATCH 46/57][Arm][OBJDUMP] Add support for MVE instructions: vmovl, vmull, vqdmull, vqmovn, vqmovun and vmovn
opcodes/ChangeLog: 2019-05-16 Andre Vieira <andre.simoesdiasvieira@arm.com> Michael Collison <michael.collison@arm.com> * arm-dis.c (enum mve_instructions): Add new instructions. (is_mve_encoding_conflict): Handle new instructions. (is_mve_undefined): Likewise. (is_mve_unpredictable): Likewise. (print_mve_size): Likewise. (print_insn_mve): Likewise.
This commit is contained in:
parent
c507f10b07
commit
14925797f8
|
@ -1,3 +1,13 @@
|
||||||
|
2019-05-16 Andre Vieira <andre.simoesdiasvieira@arm.com>
|
||||||
|
Michael Collison <michael.collison@arm.com>
|
||||||
|
|
||||||
|
* arm-dis.c (enum mve_instructions): Add new instructions.
|
||||||
|
(is_mve_encoding_conflict): Handle new instructions.
|
||||||
|
(is_mve_undefined): Likewise.
|
||||||
|
(is_mve_unpredictable): Likewise.
|
||||||
|
(print_mve_size): Likewise.
|
||||||
|
(print_insn_mve): Likewise.
|
||||||
|
|
||||||
2019-05-16 Andre Vieira <andre.simoesdiasvieira@arm.com>
|
2019-05-16 Andre Vieira <andre.simoesdiasvieira@arm.com>
|
||||||
Michael Collison <michael.collison@arm.com>
|
Michael Collison <michael.collison@arm.com>
|
||||||
|
|
||||||
|
|
|
@ -144,6 +144,14 @@ enum mve_instructions
|
||||||
MVE_VBIC_IMM,
|
MVE_VBIC_IMM,
|
||||||
MVE_VBIC_REG,
|
MVE_VBIC_REG,
|
||||||
MVE_VMOVX,
|
MVE_VMOVX,
|
||||||
|
MVE_VMOVL,
|
||||||
|
MVE_VMOVN,
|
||||||
|
MVE_VMULL_INT,
|
||||||
|
MVE_VMULL_POLY,
|
||||||
|
MVE_VQDMULL_T1,
|
||||||
|
MVE_VQDMULL_T2,
|
||||||
|
MVE_VQMOVN,
|
||||||
|
MVE_VQMOVUN,
|
||||||
MVE_NONE
|
MVE_NONE
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1913,6 +1921,7 @@ static const struct opcode32 neon_opcodes[] =
|
||||||
%B print v{st,ld}[24] any one operands
|
%B print v{st,ld}[24] any one operands
|
||||||
%E print vmov, vmvn, vorr, vbic encoded constant
|
%E print vmov, vmvn, vorr, vbic encoded constant
|
||||||
%N print generic index for vmov
|
%N print generic index for vmov
|
||||||
|
%T print bottom ('b') or top ('t') of source register
|
||||||
|
|
||||||
%<bitfield>r print as an ARM register
|
%<bitfield>r print as an ARM register
|
||||||
%<bitfield>d print the bitfield in decimal
|
%<bitfield>d print the bitfield in decimal
|
||||||
|
@ -2280,12 +2289,36 @@ static const struct mopcode32 mve_opcodes[] =
|
||||||
0xee100b10, 0xff100f1f,
|
0xee100b10, 0xff100f1f,
|
||||||
"vmov%c.%u%5-6,21-22s\t%12-15r, %17-19,7Q[%N]"},
|
"vmov%c.%u%5-6,21-22s\t%12-15r, %17-19,7Q[%N]"},
|
||||||
|
|
||||||
|
/* Vector VMOVL long. */
|
||||||
|
{ARM_FEATURE_COPROC (FPU_MVE),
|
||||||
|
MVE_VMOVL,
|
||||||
|
0xeea00f40, 0xefa70fd1,
|
||||||
|
"vmovl%T%v.%u%19-20s\t%13-15,22Q, %1-3,5Q"},
|
||||||
|
|
||||||
|
/* Vector VMOV and narrow. */
|
||||||
|
{ARM_FEATURE_COPROC (FPU_MVE),
|
||||||
|
MVE_VMOVN,
|
||||||
|
0xfe310e81, 0xffb30fd1,
|
||||||
|
"vmovn%T%v.i%18-19s\t%13-15,22Q, %1-3,5Q"},
|
||||||
|
|
||||||
/* Floating point move extract. */
|
/* Floating point move extract. */
|
||||||
{ARM_FEATURE_COPROC (FPU_MVE_FP),
|
{ARM_FEATURE_COPROC (FPU_MVE_FP),
|
||||||
MVE_VMOVX,
|
MVE_VMOVX,
|
||||||
0xfeb00a40, 0xffbf0fd0,
|
0xfeb00a40, 0xffbf0fd0,
|
||||||
"vmovx.f16\t%22,12-15F, %5,0-3F"},
|
"vmovx.f16\t%22,12-15F, %5,0-3F"},
|
||||||
|
|
||||||
|
/* Vector VMULL integer. */
|
||||||
|
{ARM_FEATURE_COPROC (FPU_MVE),
|
||||||
|
MVE_VMULL_INT,
|
||||||
|
0xee010e00, 0xef810f51,
|
||||||
|
"vmull%T%v.%u%20-21s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
|
||||||
|
|
||||||
|
/* Vector VMULL polynomial. */
|
||||||
|
{ARM_FEATURE_COPROC (FPU_MVE),
|
||||||
|
MVE_VMULL_POLY,
|
||||||
|
0xee310e00, 0xefb10f51,
|
||||||
|
"vmull%T%v.%28s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
|
||||||
|
|
||||||
/* Vector VMVN immediate to vector. */
|
/* Vector VMVN immediate to vector. */
|
||||||
{ARM_FEATURE_COPROC (FPU_MVE),
|
{ARM_FEATURE_COPROC (FPU_MVE),
|
||||||
MVE_VMVN_IMM,
|
MVE_VMVN_IMM,
|
||||||
|
@ -2310,6 +2343,30 @@ static const struct mopcode32 mve_opcodes[] =
|
||||||
0xef200150, 0xffb11f51,
|
0xef200150, 0xffb11f51,
|
||||||
"vorr%v\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
|
"vorr%v\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
|
||||||
|
|
||||||
|
/* Vector VQDMULL T1 variant. */
|
||||||
|
{ARM_FEATURE_COPROC (FPU_MVE),
|
||||||
|
MVE_VQDMULL_T1,
|
||||||
|
0xee300f01, 0xefb10f51,
|
||||||
|
"vqdmull%T%v.s%28s\t%13-15,22Q, %17-19,7Q, %1-3,5Q"},
|
||||||
|
|
||||||
|
/* Vector VQDMULL T2 variant. */
|
||||||
|
{ARM_FEATURE_COPROC (FPU_MVE),
|
||||||
|
MVE_VQDMULL_T2,
|
||||||
|
0xee300f60, 0xefb10f70,
|
||||||
|
"vqdmull%T%v.s%28s\t%13-15,22Q, %17-19,7Q, %0-3r"},
|
||||||
|
|
||||||
|
/* Vector VQMOVN. */
|
||||||
|
{ARM_FEATURE_COPROC (FPU_MVE),
|
||||||
|
MVE_VQMOVN,
|
||||||
|
0xee330e01, 0xefb30fd1,
|
||||||
|
"vqmovn%T%v.%u%18-19s\t%13-15,22Q, %1-3,5Q"},
|
||||||
|
|
||||||
|
/* Vector VQMOVUN. */
|
||||||
|
{ARM_FEATURE_COPROC (FPU_MVE),
|
||||||
|
MVE_VQMOVUN,
|
||||||
|
0xee310e81, 0xffb30fd1,
|
||||||
|
"vqmovun%T%v.s%18-19s\t%13-15,22Q, %1-3,5Q"},
|
||||||
|
|
||||||
/* Vector VRINT floating point. */
|
/* Vector VRINT floating point. */
|
||||||
{ARM_FEATURE_COPROC (FPU_MVE_FP),
|
{ARM_FEATURE_COPROC (FPU_MVE_FP),
|
||||||
MVE_VRINT_FP,
|
MVE_VRINT_FP,
|
||||||
|
@ -4420,6 +4477,7 @@ is_mve_encoding_conflict (unsigned long given,
|
||||||
else
|
else
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
case MVE_VMULL_INT:
|
||||||
case MVE_VHADD_T2:
|
case MVE_VHADD_T2:
|
||||||
case MVE_VHSUB_T2:
|
case MVE_VHSUB_T2:
|
||||||
case MVE_VCMP_VEC_T1:
|
case MVE_VCMP_VEC_T1:
|
||||||
|
@ -4502,6 +4560,23 @@ is_mve_encoding_conflict (unsigned long given,
|
||||||
else
|
else
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
case MVE_VMOVL:
|
||||||
|
{
|
||||||
|
unsigned long size = arm_decode_field (given, 19, 20);
|
||||||
|
if ((size == 0) || (size == 3))
|
||||||
|
return TRUE;
|
||||||
|
else
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
case MVE_VMOVN:
|
||||||
|
case MVE_VQMOVUN:
|
||||||
|
case MVE_VQMOVN:
|
||||||
|
if (arm_decode_field (given, 18, 19) == 3)
|
||||||
|
return TRUE;
|
||||||
|
else
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
@ -4855,6 +4930,15 @@ is_mve_undefined (unsigned long given, enum mve_instructions matched_insn,
|
||||||
else
|
else
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
case MVE_VMOVN:
|
||||||
|
if (arm_decode_field (given, 18, 19) == 2)
|
||||||
|
{
|
||||||
|
*undefined_code = UNDEF_SIZE_2;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
@ -5126,6 +5210,86 @@ is_mve_unpredictable (unsigned long given, enum mve_instructions matched_insn,
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case MVE_VMULL_INT:
|
||||||
|
{
|
||||||
|
unsigned long Qd;
|
||||||
|
unsigned long Qm;
|
||||||
|
unsigned long Qn;
|
||||||
|
|
||||||
|
if (arm_decode_field (given, 20, 21) == 2)
|
||||||
|
{
|
||||||
|
Qd = arm_decode_field_multiple (given, 13, 15, 22, 22);
|
||||||
|
Qm = arm_decode_field_multiple (given, 1, 3, 5, 5);
|
||||||
|
Qn = arm_decode_field_multiple (given, 17, 19, 7, 7);
|
||||||
|
|
||||||
|
if ((Qd == Qn) || (Qd == Qm))
|
||||||
|
{
|
||||||
|
*unpredictable_code = UNPRED_Q_REGS_EQ_AND_SIZE_2;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
case MVE_VQDMULL_T1:
|
||||||
|
{
|
||||||
|
unsigned long Qd;
|
||||||
|
unsigned long Qm;
|
||||||
|
unsigned long Qn;
|
||||||
|
|
||||||
|
if (arm_decode_field (given, 28, 28) == 1)
|
||||||
|
{
|
||||||
|
Qd = arm_decode_field_multiple (given, 13, 15, 22, 22);
|
||||||
|
Qm = arm_decode_field_multiple (given, 1, 3, 5, 5);
|
||||||
|
Qn = arm_decode_field_multiple (given, 17, 19, 7, 7);
|
||||||
|
|
||||||
|
if ((Qd == Qn) || (Qd == Qm))
|
||||||
|
{
|
||||||
|
*unpredictable_code = UNPRED_Q_REGS_EQ_AND_SIZE_1;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
case MVE_VQDMULL_T2:
|
||||||
|
{
|
||||||
|
unsigned long gpr = arm_decode_field (given, 0, 3);
|
||||||
|
if (gpr == 0xd)
|
||||||
|
{
|
||||||
|
*unpredictable_code = UNPRED_R13;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
else if (gpr == 0xf)
|
||||||
|
{
|
||||||
|
*unpredictable_code = UNPRED_R15;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (arm_decode_field (given, 28, 28) == 1)
|
||||||
|
{
|
||||||
|
unsigned long Qd
|
||||||
|
= arm_decode_field_multiple (given, 13, 15, 22, 22);
|
||||||
|
unsigned long Qn = arm_decode_field_multiple (given, 17, 19, 7, 7);
|
||||||
|
|
||||||
|
if ((Qd == Qn))
|
||||||
|
{
|
||||||
|
*unpredictable_code = UNPRED_Q_REGS_EQ_AND_SIZE_1;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
@ -5804,6 +5968,24 @@ print_mve_size (struct disassemble_info *info,
|
||||||
func (stream, "16");
|
func (stream, "16");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case MVE_VMOVN:
|
||||||
|
case MVE_VQDMULL_T1:
|
||||||
|
case MVE_VQDMULL_T2:
|
||||||
|
case MVE_VQMOVN:
|
||||||
|
case MVE_VQMOVUN:
|
||||||
|
if (size == 0)
|
||||||
|
func (stream, "16");
|
||||||
|
else if (size == 1)
|
||||||
|
func (stream, "32");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MVE_VMOVL:
|
||||||
|
if (size == 1)
|
||||||
|
func (stream, "8");
|
||||||
|
else if (size == 2)
|
||||||
|
func (stream, "16");
|
||||||
|
break;
|
||||||
|
|
||||||
case MVE_VDUP:
|
case MVE_VDUP:
|
||||||
switch (size)
|
switch (size)
|
||||||
{
|
{
|
||||||
|
@ -5868,6 +6050,13 @@ print_mve_size (struct disassemble_info *info,
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case MVE_VMULL_POLY:
|
||||||
|
if (size == 0)
|
||||||
|
func (stream, "p8");
|
||||||
|
else if (size == 1)
|
||||||
|
func (stream, "p16");
|
||||||
|
break;
|
||||||
|
|
||||||
case MVE_VMVN_IMM:
|
case MVE_VMVN_IMM:
|
||||||
switch (size)
|
switch (size)
|
||||||
{
|
{
|
||||||
|
@ -7443,6 +7632,13 @@ print_insn_mve (struct disassemble_info *info, long given)
|
||||||
print_mve_vmov_index (info, given);
|
print_mve_vmov_index (info, given);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'T':
|
||||||
|
if (arm_decode_field (given, 12, 12) == 0)
|
||||||
|
func (stream, "b");
|
||||||
|
else
|
||||||
|
func (stream, "t");
|
||||||
|
break;
|
||||||
|
|
||||||
case '0': case '1': case '2': case '3': case '4':
|
case '0': case '1': case '2': case '3': case '4':
|
||||||
case '5': case '6': case '7': case '8': case '9':
|
case '5': case '6': case '7': case '8': case '9':
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue