[PATCH, ARM] "Neon-style" VFP syntax for assembler
Nick Clifton
nickc@redhat.com
Tue May 9 12:48:00 GMT 2006
Hi Julian,
> Tested with "make check" with cross to arm-none-eabi, with a couple of
> tests added. OK to apply to CSL branch? Mainline?
OK for mainline.
> ChangeLog (gas):
>
> * config/tc-arm.c (stdarg.h): include.
> (arm_it): Add uncond_value field. Add isvec and issingle to operand
> array.
> (arm_reg_type): Add REG_TYPE_VFSD (single or double VFP reg) and
> REG_TYPE_NSDQ (single, double or quad vector reg).
> (reg_expected_msgs): Update.
> (BAD_FPU): Add macro for unsupported FPU instruction error.
> (parse_neon_type): Support 'd' as an alias for .f64.
> (parse_typed_reg_or_scalar): Support REG_TYPE_VFSD, REG_TYPE_NSDQ
> sets of registers.
> (parse_vfp_reg_list): Don't update first arg on error.
> (parse_neon_mov): Support extra syntax for VFP moves.
> (operand_parse_code): Add OP_RVSD, OP_RNSDQ, OP_VRSDLST, OP_RVSD_IO,
> OP_RNSDQ_RNSC, OP_RVC_PSR, OP_APSR_RR, OP_oRNSDQ.
> (parse_operands): Support isvec, issingle operands fields, new parse
> codes above.
> (do_vfp_nsyn_mrs, do_vfp_nsyn_msr): New functions. Support VFP mrs,
> msr variants.
> (do_mrs, do_msr, do_t_mrs, do_t_msr): Add support for above.
> (NEON_ENC_TAB): Add vnmul, vnmla, vnmls, vcmp, vcmpz, vcmpe, vcmpez.
> (NEON_ENC_SINGLE, NEON_ENC_DOUBLE): Define macros.
> (NEON_SHAPE_DEF): New macro. Define table of possible instruction
> shapes.
> (neon_shape): Redefine in terms of above.
> (neon_shape_class): New enumeration, table of shape classes.
> (neon_shape_el): New enumeration. One element of a shape.
> (neon_shape_el_size): Register widths of above, where appropriate.
> (neon_shape_info): New struct. Info for shape table.
> (neon_shape_tab): New array.
> (neon_type_mask): Add N_F64, N_VFP. Update N_MAX_NONSPECIAL.
> (neon_check_shape): Rewrite as...
> (neon_select_shape): New function to classify instruction shapes,
> driven by new table neon_shape_tab array.
> (neon_quad): New function. Return 1 if shape should set Q flag in
> instructions (or equivalent), 0 otherwise.
> (type_chk_of_el_type): Support F64.
> (el_type_of_type_chk): Likewise.
> (neon_check_type): Add support for VFP type checking (VFP data
> elements fill their containing registers).
> (do_vfp_cond_or_thumb): Fill in condition field in ARM mode, or 0xE
> in thumb mode for VFP instructions.
> (do_vfp_nsyn_opcode): New function. Look up the opcode in argument,
> and encode the current instruction as if it were that opcode.
> (try_vfp_nsyn): New. If this looks like a VFP instruction with ARGS
> arguments, call function in PFN.
> (do_vfp_nsyn_add_sub, do_vfp_nsyn_mla_mls, do_vfp_nsyn_mul)
> (do_vfp_nsyn_abs_neg, do_vfp_nsyn_ldm_stm, do_vfp_nsyn_ldr_str)
> (do_vfp_nsyn_sqrt, do_vfp_nsyn_div, do_vfp_nsyn_nmul)
> (do_vfp_nsyn_cmp, nsyn_insert_sp, do_vfp_nsyn_push)
> (do_vfp_nsyn_pop, do_vfp_nsyn_cvt, do_vfp_nsyn_cvtz): New functions.
> Redirect Neon-syntax VFP instructions to VFP instruction handlers.
> (do_neon_dyadic_i_su, do_neon_dyadic_i64_su, do_neon_shl_imm)
> (do_neon_qshl_imm, do_neon_logic, do_neon_bitfield)
> (neon_dyadic_misc, neon_compare, do_neon_tst, do_neon_qdmulh)
> (do_neon_fcmp_absolute, do_neon_step, do_neon_sli, do_neon_sri)
> (do_neon_qshlu_imm, neon_move_immediate, do_neon_mvn, do_neon_ext)
> (do_neon_rev, do_neon_dup, do_neon_rshift_round_imm, do_neon_trn)
> (do_neon_zip_uzp, do_neon_sat_abs_neg, do_neon_pair_long)
> (do_neon_recip_est, do_neon_cls, do_neon_clz, do_neon_cnt)
> (do_neon_swp): Use neon_select_shape not neon_check_shape. Use
> neon_quad.
> (vfp_or_neon_is_neon): New function. Call if a mnemonic shared
> between VFP and Neon turns out to belong to Neon. Perform
> architecture check and fill in condition field if appropriate.
> (do_neon_addsub_if_i, do_neon_mac_maybe_scalar, do_neon_abs_neg)
> (do_neon_cvt): Add support for VFP variants of instructions.
> (neon_cvt_flavour): Extend to cover VFP conversions.
> (do_neon_mov): Rewrite to use neon_select_shape. Add support for VFP
> vmov variants.
> (do_neon_ldr_str): Handle single-precision VFP load/store.
> (do_neon_ld_st_interleave, do_neon_ld_st_lane, do_neon_ld_dup): Use
> NS_NULL not NS_IGNORE.
> (opcode_tag): Add OT_csuffixF for operands which either take a
> conditional suffix, or have 0xF in the condition field.
> (md_assemble): Add support for OT_csuffixF.
> (NCE): Replace macro with...
> (NCE_tag, NCE, NCEF): New macros.
> (nCE): Replace macro with...
> (nCE_tag, nCE, nCEF): New macros.
> (insns): Add support for VFP insns or VFP versions of insns msr,
> mrs, vsqrt, vdiv, vnmul, vnmla, vnmls, vcmp, vcmpe, vpush, vpop,
> vcvtz, vmul, vmla, vmls, vadd, vsub, vabs, vneg, vldm, vldmia,
> vldbdb, vstm, vstmia, vstmdb, vldr, vstr, vcvt, vmov. Group shared
> VFP/Neon insns together.
>
> ChangeLog (gas/testsuite):
>
> * gas/arm/itblock.s: New file. Helper macro for making all-true IT
> blocks.
> * gas/arm/neon-cond-bad-inc.s: New test. Make sure unconditional
> Neon instructions are rejected...
> * gas/arm/neon-cond-bad.s: In ARM mode, and...
> * gas/arm/neon-cond-bad_t2.s: Accepted in Thumb mode (with IT).
> * gas/arm/neon-cond-bad.l: Expected error output in ARM mode.
> * gas/arm/neon-cond-bad.d: Control ARM mode test.
> * gas/arm/neon-cond-bad_t2.d: Expected output in Thumb mode.
> * gas/arm/vfp-neon-syntax-inc.s: Test VFP Neon-style syntax.
> * gas/arm/vfp-neon-syntax.s: ...in ARM mode.
> * gas/arm/vfp-neon-syntax_t2.s: ...and Thumb mode.
> * gas/arm/vfp-neon-syntax.d: Expected output in ARM mode.
> * gas/arm/vfp-neon-syntax_t2.d: Expected output in Thumb mode.
More information about the Binutils
mailing list