diff options
author | Jiong Wang <jiong.wang@arm.com> | 2017-06-28 11:00:55 +0100 |
---|---|---|
committer | Jiong Wang <jiong.wang@arm.com> | 2017-06-28 11:00:55 +0100 |
commit | c604a79ad4d47070bbcc0bc082188fb16892ceef (patch) | |
tree | e05bd320fafe416bbb5c0724572c63f73c2ee344 /gas/config | |
parent | 41664b45ab6387184bd0e7512fcf7a72c58744e7 (diff) | |
download | gdb-c604a79ad4d47070bbcc0bc082188fb16892ceef.zip gdb-c604a79ad4d47070bbcc0bc082188fb16892ceef.tar.gz gdb-c604a79ad4d47070bbcc0bc082188fb16892ceef.tar.bz2 |
[ARM] Assembler and disassembler support Dot Product Extension
This patch add assembler and disassembler support for new Dot Product
Extension.
The support can be enabled through the new "+dotprod" extension.
include/
* opcode/arm.h (FPU_NEON_EXT_DOTPROD): New macro.
(FPU_ARCH_DOTPROD_NEON_VFP_ARMV8): New macro.
gas/
* config/tc-arm.c (fpu_neon_ext_dotprod): New variable.
(neon_scalar_for_mul): Improve comments.
(do_neon_dotproduct): New function to encode Dot Product instructions.
(do_neon_dotproduct_s): Wrapper function for signed Dot Product
instructions.
(do_neon_dotproduct_u): Wrapper function for unsigned Dot Product
instructions.
(insns): New entries for vsdot and vudot.
(arm_extensions): New entry for "dotprod".
* doc/c-arm.texi: Document new "dotprod" extension.
* testsuite/gas/arm/dotprod.s: New test source.
* testsuite/gas/arm/dotprod-illegal.s: New test source.
* testsuite/gas/arm/dotprod.d: New test.
* testsuite/gas/arm/dotprod-thumb2.d: New test.
* testsuite/gas/arm/dotprod-illegal.d: New test.
* testsuite/gas/arm/dotprod-legacy-arch.d: New test.
* testsuite/gas/arm/dotprod-illegal.l: New error file.
* testsuite/gas/arm/dotprod-legacy-arch.l: New error file.
opcodes/
* arm-dis.c (coprocessor_opcodes): New entries for vsdot and vudot.
Diffstat (limited to 'gas/config')
-rw-r--r-- | gas/config/tc-arm.c | 94 |
1 files changed, 93 insertions, 1 deletions
diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c index f0b11f4..f1d8fd0 100644 --- a/gas/config/tc-arm.c +++ b/gas/config/tc-arm.c @@ -294,6 +294,8 @@ static const arm_feature_set crc_ext_armv8 = ARM_FEATURE_COPROC (CRC_EXT_ARMV8); static const arm_feature_set fpu_neon_ext_v8_1 = ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA); +static const arm_feature_set fpu_neon_ext_dotprod = + ARM_FEATURE_COPROC (FPU_NEON_EXT_DOTPROD); static int mfloat_abi_opt = -1; /* Record user cpu selection for object attributes. */ @@ -15023,7 +15025,14 @@ do_neon_ceq (void) scalars, which are encoded in 5 bits, M : Rm. For 16-bit scalars, the register is encoded in Rm[2:0] and the index in M:Rm[3], and for 32-bit scalars, the register is encoded in Rm[3:0] and the - index in M. */ + index in M. + + Dot Product instructions are similar to multiply instructions except elsize + should always be 32. + + This function translates SCALAR, which is GAS's internal encoding of indexed + scalar register, to raw encoding. There is also register and index range + check based on ELSIZE. */ static unsigned neon_scalar_for_mul (unsigned scalar, unsigned elsize) @@ -17365,6 +17374,79 @@ do_vcadd (void) inst.instruction |= (size == 32) << 20; } +/* Dot Product instructions encoding support. */ + +static void +do_neon_dotproduct (int unsigned_p) +{ + enum neon_shape rs; + unsigned scalar_oprd2 = 0; + int high8; + + if (inst.cond != COND_ALWAYS) + as_warn (_("Dot Product instructions cannot be conditional, the behaviour " + "is UNPREDICTABLE")); + + constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_armv8), + _(BAD_FPU)); + + /* Dot Product instructions are in three-same D/Q register format or the third + operand can be a scalar index register. */ + if (inst.operands[2].isscalar) + { + scalar_oprd2 = neon_scalar_for_mul (inst.operands[2].reg, 32); + high8 = 0xfe000000; + rs = neon_select_shape (NS_DDS, NS_QQS, NS_NULL); + } + else + { + high8 = 0xfc000000; + rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL); + } + + if (unsigned_p) + neon_check_type (3, rs, N_EQK, N_EQK, N_KEY | N_U8); + else + neon_check_type (3, rs, N_EQK, N_EQK, N_KEY | N_S8); + + /* The "U" bit in traditional Three Same encoding is fixed to 0 for Dot + Product instruction, so we pass 0 as the "ubit" parameter. And the + "Size" field are fixed to 0x2, so we pass 32 as the "size" parameter. */ + neon_three_same (neon_quad (rs), 0, 32); + + /* Undo neon_dp_fixup. Dot Product instructions are using a slightly + different NEON three-same encoding. */ + inst.instruction &= 0x00ffffff; + inst.instruction |= high8; + /* Encode 'U' bit which indicates signedness. */ + inst.instruction |= (unsigned_p ? 1 : 0) << 4; + /* Re-encode operand2 if it's indexed scalar operand. What has been encoded + from inst.operand[2].reg in neon_three_same is GAS's internal encoding, not + the instruction encoding. */ + if (inst.operands[2].isscalar) + { + inst.instruction &= 0xffffffd0; + inst.instruction |= LOW4 (scalar_oprd2); + inst.instruction |= HI1 (scalar_oprd2) << 5; + } +} + +/* Dot Product instructions for signed integer. */ + +static void +do_neon_dotproduct_s (void) +{ + return do_neon_dotproduct (0); +} + +/* Dot Product instructions for unsigned integer. */ + +static void +do_neon_dotproduct_u (void) +{ + return do_neon_dotproduct (1); +} + /* Crypto v1 instructions. */ static void do_crypto_2op_1 (unsigned elttype, int op) @@ -19914,6 +19996,13 @@ static const struct asm_opcode insns[] = NUF (vcadd, 0, 4, (RNDQ, RNDQ, RNDQ, EXPi), vcadd), #undef ARM_VARIANT +#define ARM_VARIANT & fpu_neon_ext_dotprod +#undef THUMB_VARIANT +#define THUMB_VARIANT & fpu_neon_ext_dotprod + NUF (vsdot, d00, 3, (RNDQ, RNDQ, RNDQ_RNSC), neon_dotproduct_s), + NUF (vudot, d00, 3, (RNDQ, RNDQ, RNDQ_RNSC), neon_dotproduct_u), + +#undef ARM_VARIANT #define ARM_VARIANT & fpu_fpa_ext_v1 /* Core FPA instruction set (V1). */ #undef THUMB_VARIANT #define THUMB_VARIANT NULL @@ -25950,6 +26039,9 @@ static const struct arm_option_extension_value_table arm_extensions[] = ARM_EXT_OPT ("crypto", FPU_ARCH_CRYPTO_NEON_VFP_ARMV8, ARM_FEATURE_COPROC (FPU_CRYPTO_ARMV8), ARM_FEATURE_CORE_LOW (ARM_EXT_V8)), + ARM_EXT_OPT ("dotprod", FPU_ARCH_DOTPROD_NEON_VFP_ARMV8, + ARM_FEATURE_COPROC (FPU_NEON_EXT_DOTPROD), + ARM_ARCH_V8_2A), ARM_EXT_OPT ("dsp", ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP | ARM_EXT_V6_DSP), ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP | ARM_EXT_V6_DSP), ARM_FEATURE_CORE (ARM_EXT_V7M, ARM_EXT2_V8M)), |