Hi all, Created a v3 of these two patches. For this 1/2 patch, this includes: a) A rebase onto latest trunk and onto Andre's: https://gcc.gnu.org/pipermail/gcc-patches/2023-January/610520.html patch series. b) Minor change to the macro definitions in arm.h I recognise that we are now in Stage 4 and, even though these have been on the list since Stage 1, the 2/2 patch does contain mid-end changes, so do let me know if there's a chance to get this into GCC13 or if we should retarget this for GCC14. Thank you! Stam On 11/01/2023 14:23, Stam Markianos-Wright via Gcc-patches wrote: > ----- Respin of the below patch ----- > > In this 1/2 patch, from v1 to v2 I have added: > > * The three new helper #defines in arm.h. > > * Attribute mappings to unpredicated MVE instructions that map to > themselves. This allows us to distinguish between unpredicated > insns that do have a VPT predicated form (are VPT predicable) and > insns that do not. > > > Original email with updated Changelog at the end: > > > > Hi all, > > I'd like to submit two patches that add support for Arm's MVE > Tail Predicated Low Overhead Loop feature. > > --- Introduction --- > > The M-class Arm-ARM: > https://developer.arm.com/documentation/ddi0553/bu/?lang=en > Section B5.5.1 "Loop tail predication" describes the feature > we are adding support for with this patch (although > we only add codegen for DLSTP/LETP instruction loops). > > Previously with commit d2ed233cb94 we'd added support for > non-MVE DLS/LE loops through the loop-doloop pass, which, given > a standard MVE loop like: > > ``` > void  __attribute__ ((noinline)) test (int16_t *a, int16_t *b, int16_t > *c, int n) > { >   while (n > 0) >     { >       mve_pred16_t p = vctp16q (n); >       int16x8_t va = vldrhq_z_s16 (a, p); >       int16x8_t vb = vldrhq_z_s16 (b, p); >       int16x8_t vc = vaddq_x_s16 (va, vb, p); >       vstrhq_p_s16 (c, vc, p); >       c+=8; >       a+=8; >       b+=8; >       n-=8; >     } > } > ``` > .. would output: > > ``` >         >         dls     lr, lr > .L3: >         vctp.16 r3 >         vmrs    ip, P0  @ movhi >         sxth    ip, ip >         vmsr     P0, ip @ movhi >         mov     r4, r0 >         vpst >         vldrht.16       q2, [r4] >         mov     r4, r1 >         vmov    q3, q0 >         vpst >         vldrht.16       q1, [r4] >         mov     r4, r2 >         vpst >         vaddt.i16       q3, q2, q1 >         subs    r3, r3, #8 >         vpst >         vstrht.16       q3, [r4] >         adds    r0, r0, #16 >         adds    r1, r1, #16 >         adds    r2, r2, #16 >         le      lr, .L3 > ``` > > where the LE instruction will decrement LR by 1, compare and > branch if needed. > > (there are also other inefficiencies with the above code, like the > pointless vmrs/sxth/vmsr on the VPR and the adds not being merged > into the vldrht/vstrht as a #16 offsets and some random movs! > But that's different problems...) > > The MVE version is similar, except that: > * Instead of DLS/LE the instructions are DLSTP/LETP. > * Instead of pre-calculating the number of iterations of the >   loop, we place the number of elements to be processed by the >   loop into LR. > * Instead of decrementing the LR by one, LETP will decrement it >   by FPSCR.LTPSIZE, which is the number of elements being >   processed in each iteration: 16 for 8-bit elements, 5 for 16-bit >   elements, etc. > * On the final iteration, automatic Loop Tail Predication is >   performed, as if the instructions within the loop had been VPT >   predicated with a VCTP generating the VPR predicate in every >   loop iteration. > > The dlstp/letp loop now looks like: > > ``` >         >         dlstp.16        lr, r3 > .L14: >         mov     r3, r0 >         vldrh.16        q3, [r3] >         mov     r3, r1 >         vldrh.16        q2, [r3] >         mov     r3, r2 >         vadd.i16  q3, q3, q2 >         adds    r0, r0, #16 >         vstrh.16        q3, [r3] >         adds    r1, r1, #16 >         adds    r2, r2, #16 >         letp    lr, .L14 > > ``` > > Since the loop tail predication is automatic, we have eliminated > the VCTP that had been specified by the user in the intrinsic > and converted the VPT-predicated instructions into their > unpredicated equivalents (which also saves us from VPST insns). > > The LE instruction here decrements LR by 8 in each iteration. > > --- This 1/2 patch --- > > This first patch lays some groundwork by adding an attribute to > md patterns, and then the second patch contains the functional > changes. > > One major difficulty in implementing MVE Tail-Predicated Low > Overhead Loops was the need to transform VPT-predicated insns > in the insn chain into their unpredicated equivalents, like: > `mve_vldrbq_z_ -> mve_vldrbq_`. > > This requires us to have a deterministic link between two > different patterns in mve.md -- this _could_ be done by > re-ordering the entirety of mve.md such that the patterns are > at some constant icode proximity (e.g. having the _z immediately > after the unpredicated version would mean that to map from the > former to the latter you could use icode-1), but that is a very > messy solution that would lead to complex unknown dependencies > between patterns. > > This patch proves an alternative way of doing that: using an insn > attribute to encode the icode of the unpredicated instruction. > > This was implemented by doing a find n replace across mve.md > using the following patterns: > > define_insn "(.*)_p_(.*)"((.|\n)*?)\n( )*\[\(set_attr > define_insn "$1_p_$2"$3\n$5[(set (attr "mve_unpredicated_insn") > (symbol_ref "CODE_FOR_$1_$2"))\n$5 (set_attr > > > define_insn "(.*)_m_(.*)"((.|\n)*?)\n( )*\[\(set_attr > define_insn "$1_m_$2"$3\n$5[(set (attr "mve_unpredicated_insn") > (symbol_ref "CODE_FOR_$1_$2"))\n$5 (set_attr > > define_insn "(.*)_z_(.*)"((.|\n)*?)\n( )*\[\(set_attr > define_insn "$1_z_$2"$3\n$5[(set (attr "mve_unpredicated_insn") > (symbol_ref "CODE_FOR_$1_$2"))\n$5 (set_attr > > and then a number of manual fixes were needed for the md patterns > that did not conform to the above.  Those changes were: > > Dropped the type suffix _s/_u_f: > CODE_FOR_mve_vcmpcsq_n_ > CODE_FOR_mve_vcmpcsq_ > CODE_FOR_mve_vcmpeqq_n_ > CODE_FOR_mve_vcmpeqq_ > CODE_FOR_mve_vcmpgeq_n_ > CODE_FOR_mve_vcmpgeq_ > CODE_FOR_mve_vcmpgtq_n_ > CODE_FOR_mve_vcmpgtq_ > CODE_FOR_mve_vcmphiq_n_ > CODE_FOR_mve_vcmphiq_ > CODE_FOR_mve_vcmpleq_n_ > CODE_FOR_mve_vcmpleq_ > CODE_FOR_mve_vcmpltq_n_ > CODE_FOR_mve_vcmpltq_ > CODE_FOR_mve_vcmpneq_n_ > CODE_FOR_mve_vcmpneq_ > CODE_FOR_mve_vaddq > CODE_FOR_mve_vcaddq_rot270 > CODE_FOR_mve_vcaddq_rot90 > CODE_FOR_mve_vcaddq_rot270 > CODE_FOR_mve_vcaddq_rot90 > CODE_FOR_mve_vcmlaq > CODE_FOR_mve_vcmlaq_rot180 > CODE_FOR_mve_vcmlaq_rot270 > CODE_FOR_mve_vcmlaq_rot90 > CODE_FOR_mve_vcmulq > CODE_FOR_mve_vcmulq_rot180 > CODE_FOR_mve_vcmulq_rot270 > CODE_FOR_mve_vcmulq_rot90 > > Dropped _wb_: > CODE_FOR_mve_vidupq_u_insn > CODE_FOR_mve_vddupq_u_insn > > Dropped one underscore character: > CODE_FOR_arm_vcx1qv16qi > CODE_FOR_arm_vcx2qv16qi > CODE_FOR_arm_vcx3qv16qi > > No regressions on arm-none-eabi with an MVE target. > > Thank you, > Stam Markianos-Wright > > gcc/ChangeLog: > >         * config/arm/arm.md (mve_unpredicated_insn): New attribute. >         * config/arm/arm.h (MVE_VPT_PREDICATED_INSN_P): New define. >     (MVE_VPT_UNPREDICATED_INSN_P): Likewise. >     (MVE_VPT_PREDICABLE_INSN_P): Likewise. >         * config/arm/vec-common.md (mve_vshlq_): Add > attribute. >         * config/arm/mve.md (arm_vcx1q_p_v16qi): Add attribute. >     (arm_vcx1qv16qi): Likewise. >     (arm_vcx1qav16qi): Likewise. >     (arm_vcx1qv16qi): Likewise. >     (arm_vcx2q_p_v16qi): Likewise. >     (arm_vcx2qv16qi): Likewise. >     (arm_vcx2qav16qi): Likewise. >     (arm_vcx2qv16qi): Likewise. >     (arm_vcx3q_p_v16qi): Likewise. >     (arm_vcx3qv16qi): Likewise. >     (arm_vcx3qav16qi: Likewise. >     (arm_vcx3qv16qi): Likewise. >     (mve_vabavq_): Likewise. >     (mve_vabavq_p_): Likewise. >     (mve_vabdq_): Likewise. >     (mve_vabdq_f): Likewise. >     (mve_vabdq_m_): Likewise. >     (mve_vabdq_m_f): Likewise. >     (mve_vabsq_f): Likewise. >     (mve_vabsq_m_f): Likewise. >     (mve_vabsq_m_s): Likewise. >     (mve_vabsq_s): Likewise. >     (mve_vadciq_v4si): Likewise. >     (mve_vadciq_m_v4si): Likewise. >     (mve_vadcq_v4si): Likewise. >     (mve_vadcq_m_v4si): Likewise. >     (mve_vaddlvaq_v4si): Likewise. >     (mve_vaddlvaq_p_v4si): Likewise. >     (mve_vaddlvq_v4si): Likewise. >     (mve_vaddlvq_p_v4si): Likewise. >     (mve_vaddq_f): Likewise. >     (mve_vaddq_m_): Likewise. >     (mve_vaddq_m_f): Likewise. >     (mve_vaddq_m_n_): Likewise. >     (mve_vaddq_m_n_f): Likewise. >     (mve_vaddq_n_): Likewise. >     (mve_vaddq_n_f): Likewise. >     (mve_vaddq): Likewise. >     (mve_vaddvaq_): Likewise. >     (mve_vaddvaq_p_): Likewise. >     (mve_vaddvq_): Likewise. >     (mve_vaddvq_p_): Likewise. >     (mve_vandq_): Likewise. >     (mve_vandq_f): Likewise. >     (mve_vandq_m_): Likewise. >     (mve_vandq_m_f): Likewise. >     (mve_vandq_s): Likewise. >     (mve_vandq_u): Likewise. >     (mve_vbicq_): Likewise. >     (mve_vbicq_f): Likewise. >     (mve_vbicq_m_): Likewise. >     (mve_vbicq_m_f): Likewise. >     (mve_vbicq_m_n_): Likewise. >     (mve_vbicq_n_): Likewise. >     (mve_vbicq_s): Likewise. >     (mve_vbicq_u): Likewise. >     (mve_vbrsrq_m_n_): Likewise. >     (mve_vbrsrq_m_n_f): Likewise. >     (mve_vbrsrq_n_): Likewise. >     (mve_vbrsrq_n_f): Likewise. >     (mve_vcaddq_rot270_m_): Likewise. >     (mve_vcaddq_rot270_m_f): Likewise. >     (mve_vcaddq_rot270): Likewise. >     (mve_vcaddq_rot270): Likewise. >     (mve_vcaddq_rot90_m_): Likewise. >     (mve_vcaddq_rot90_m_f): Likewise. >     (mve_vcaddq_rot90): Likewise. >     (mve_vcaddq_rot90): Likewise. >     (mve_vcaddq): Likewise. >     (mve_vcaddq): Likewise. >     (mve_vclsq_m_s): Likewise. >     (mve_vclsq_s): Likewise. >     (mve_vclzq_): Likewise. >     (mve_vclzq_m_): Likewise. >     (mve_vclzq_s): Likewise. >     (mve_vclzq_u): Likewise. >     (mve_vcmlaq_m_f): Likewise. >     (mve_vcmlaq_rot180_m_f): Likewise. >     (mve_vcmlaq_rot180): Likewise. >     (mve_vcmlaq_rot270_m_f): Likewise. >     (mve_vcmlaq_rot270): Likewise. >     (mve_vcmlaq_rot90_m_f): Likewise. >     (mve_vcmlaq_rot90): Likewise. >     (mve_vcmlaq): Likewise. >     (mve_vcmlaq): Likewise. >     (mve_vcmpq_): Likewise. >     (mve_vcmpq_f): Likewise. >     (mve_vcmpq_n_): Likewise. >     (mve_vcmpq_n_f): Likewise. >     (mve_vcmpcsq_): Likewise. >     (mve_vcmpcsq_m_n_u): Likewise. >     (mve_vcmpcsq_m_u): Likewise. >     (mve_vcmpcsq_n_): Likewise. >     (mve_vcmpeqq_): Likewise. >     (mve_vcmpeqq_f): Likewise. >     (mve_vcmpeqq_m_): Likewise. >     (mve_vcmpeqq_m_f): Likewise. >     (mve_vcmpeqq_m_n_): Likewise. >     (mve_vcmpeqq_m_n_f): Likewise. >     (mve_vcmpeqq_n_): Likewise. >     (mve_vcmpeqq_n_f): Likewise. >     (mve_vcmpgeq_): Likewise. >     (mve_vcmpgeq_f): Likewise. >     (mve_vcmpgeq_m_f): Likewise. >     (mve_vcmpgeq_m_n_f): Likewise. >     (mve_vcmpgeq_m_n_s): Likewise. >     (mve_vcmpgeq_m_s): Likewise. >     (mve_vcmpgeq_n_): Likewise. >     (mve_vcmpgeq_n_f): Likewise. >     (mve_vcmpgtq_): Likewise. >     (mve_vcmpgtq_f): Likewise. >     (mve_vcmpgtq_m_f): Likewise. >     (mve_vcmpgtq_m_n_f): Likewise. >     (mve_vcmpgtq_m_n_s): Likewise. >     (mve_vcmpgtq_m_s): Likewise. >     (mve_vcmpgtq_n_): Likewise. >     (mve_vcmpgtq_n_f): Likewise. >     (mve_vcmphiq_): Likewise. >     (mve_vcmphiq_m_n_u): Likewise. >     (mve_vcmphiq_m_u): Likewise. >     (mve_vcmphiq_n_): Likewise. >     (mve_vcmpleq_): Likewise. >     (mve_vcmpleq_f): Likewise. >     (mve_vcmpleq_m_f): Likewise. >     (mve_vcmpleq_m_n_f): Likewise. >     (mve_vcmpleq_m_n_s): Likewise. >     (mve_vcmpleq_m_s): Likewise. >     (mve_vcmpleq_n_): Likewise. >     (mve_vcmpleq_n_f): Likewise. >     (mve_vcmpltq_): Likewise. >     (mve_vcmpltq_f): Likewise. >     (mve_vcmpltq_m_f): Likewise. >     (mve_vcmpltq_m_n_f): Likewise. >     (mve_vcmpltq_m_n_s): Likewise. >     (mve_vcmpltq_m_s): Likewise. >     (mve_vcmpltq_n_): Likewise. >     (mve_vcmpltq_n_f): Likewise. >     (mve_vcmpneq_): Likewise. >     (mve_vcmpneq_f): Likewise. >     (mve_vcmpneq_m_): Likewise. >     (mve_vcmpneq_m_f): Likewise. >     (mve_vcmpneq_m_n_): Likewise. >     (mve_vcmpneq_m_n_f): Likewise. >     (mve_vcmpneq_n_): Likewise. >     (mve_vcmpneq_n_f): Likewise. >     (mve_vcmulq_m_f): Likewise. >     (mve_vcmulq_rot180_m_f): Likewise. >     (mve_vcmulq_rot180): Likewise. >     (mve_vcmulq_rot270_m_f): Likewise. >     (mve_vcmulq_rot270): Likewise. >     (mve_vcmulq_rot90_m_f): Likewise. >     (mve_vcmulq_rot90): Likewise. >     (mve_vcmulq): Likewise. >     (mve_vcmulq): Likewise. >     (mve_vctpq_mhi): Likewise. >     (mve_vctpqhi): Likewise. >     (mve_vcvtaq_): Likewise. >     (mve_vcvtaq_m_): Likewise. >     (mve_vcvtbq_f16_f32v8hf): Likewise. >     (mve_vcvtbq_f32_f16v4sf): Likewise. >     (mve_vcvtbq_m_f16_f32v8hf): Likewise. >     (mve_vcvtbq_m_f32_f16v4sf): Likewise. >     (mve_vcvtmq_): Likewise. >     (mve_vcvtmq_m_): Likewise. >     (mve_vcvtnq_): Likewise. >     (mve_vcvtnq_m_): Likewise. >     (mve_vcvtpq_): Likewise. >     (mve_vcvtpq_m_): Likewise. >     (mve_vcvtq_from_f_): Likewise. >     (mve_vcvtq_m_from_f_): Likewise. >     (mve_vcvtq_m_n_from_f_): Likewise. >     (mve_vcvtq_m_n_to_f_): Likewise. >     (mve_vcvtq_m_to_f_): Likewise. >     (mve_vcvtq_n_from_f_): Likewise. >     (mve_vcvtq_n_to_f_): Likewise. >     (mve_vcvtq_to_f_): Likewise. >     (mve_vcvttq_f16_f32v8hf): Likewise. >     (mve_vcvttq_f32_f16v4sf): Likewise. >     (mve_vcvttq_m_f16_f32v8hf): Likewise. >     (mve_vcvttq_m_f32_f16v4sf): Likewise. >     (mve_vddupq_m_wb_u_insn): Likewise. >     (mve_vddupq_u_insn): Likewise. >     (mve_vdupq_m_n_): Likewise. >     (mve_vdupq_m_n_f): Likewise. >     (mve_vdupq_n_): Likewise. >     (mve_vdupq_n_f): Likewise. >     (mve_vdwdupq_m_wb_u_insn): Likewise. >     (mve_vdwdupq_wb_u_insn): Likewise. >     (mve_veorq_): Likewise. >     (mve_veorq_f): Likewise. >     (mve_veorq_m_): Likewise. >     (mve_veorq_m_f): Likewise. >     (mve_veorq_s): Likewise. >     (mve_veorq_u): Likewise. >     (mve_vfmaq_f): Likewise. >     (mve_vfmaq_m_f): Likewise. >     (mve_vfmaq_m_n_f): Likewise. >     (mve_vfmaq_n_f): Likewise. >     (mve_vfmasq_m_n_f): Likewise. >     (mve_vfmasq_n_f): Likewise. >     (mve_vfmsq_f): Likewise. >     (mve_vfmsq_m_f): Likewise. >     (mve_vhaddq_): Likewise. >     (mve_vhaddq_m_): Likewise. >     (mve_vhaddq_m_n_): Likewise. >     (mve_vhaddq_n_): Likewise. >     (mve_vhcaddq_rot270_m_s): Likewise. >     (mve_vhcaddq_rot270_s): Likewise. >     (mve_vhcaddq_rot90_m_s): Likewise. >     (mve_vhcaddq_rot90_s): Likewise. >     (mve_vhsubq_): Likewise. >     (mve_vhsubq_m_): Likewise. >     (mve_vhsubq_m_n_): Likewise. >     (mve_vhsubq_n_): Likewise. >     (mve_vidupq_m_wb_u_insn): Likewise. >     (mve_vidupq_u_insn): Likewise. >     (mve_viwdupq_m_wb_u_insn): Likewise. >     (mve_viwdupq_wb_u_insn): Likewise. >     (mve_vldrbq_): Likewise. >     (mve_vldrbq_gather_offset_): Likewise. >     (mve_vldrbq_gather_offset_z_): Likewise. >     (mve_vldrbq_z_): Likewise. >     (mve_vldrdq_gather_base_v2di): Likewise. >     (mve_vldrdq_gather_base_wb_v2di_insn): Likewise. >     (mve_vldrdq_gather_base_wb_z_v2di_insn): Likewise. >     (mve_vldrdq_gather_base_z_v2di): Likewise. >     (mve_vldrdq_gather_offset_v2di): Likewise. >     (mve_vldrdq_gather_offset_z_v2di): Likewise. >     (mve_vldrdq_gather_shifted_offset_v2di): Likewise. >     (mve_vldrdq_gather_shifted_offset_z_v2di): Likewise. >     (mve_vldrhq_): Likewise. >     (mve_vldrhq_fv8hf): Likewise. >     (mve_vldrhq_gather_offset_): Likewise. >     (mve_vldrhq_gather_offset_fv8hf): Likewise. >     (mve_vldrhq_gather_offset_z_): Likewise. >     (mve_vldrhq_gather_offset_z_fv8hf): Likewise. >     (mve_vldrhq_gather_shifted_offset_): Likewise. >     (mve_vldrhq_gather_shifted_offset_fv8hf): Likewise. >  (mve_vldrhq_gather_shifted_offset_z_): Likewise. >     (mve_vldrhq_gather_shifted_offset_z_fv8hf): Likewise. >     (mve_vldrhq_z_): Likewise. >     (mve_vldrhq_z_fv8hf): Likewise. >     (mve_vldrwq_v4si): Likewise. >     (mve_vldrwq_fv4sf): Likewise. >     (mve_vldrwq_gather_base_v4si): Likewise. >     (mve_vldrwq_gather_base_fv4sf): Likewise. >     (mve_vldrwq_gather_base_wb_v4si_insn): Likewise. >     (mve_vldrwq_gather_base_wb_fv4sf_insn): Likewise. >     (mve_vldrwq_gather_base_wb_z_v4si_insn): Likewise. >     (mve_vldrwq_gather_base_wb_z_fv4sf_insn): Likewise. >     (mve_vldrwq_gather_base_z_v4si): Likewise. >     (mve_vldrwq_gather_base_z_fv4sf): Likewise. >     (mve_vldrwq_gather_offset_v4si): Likewise. >     (mve_vldrwq_gather_offset_fv4sf): Likewise. >     (mve_vldrwq_gather_offset_z_v4si): Likewise. >     (mve_vldrwq_gather_offset_z_fv4sf): Likewise. >     (mve_vldrwq_gather_shifted_offset_v4si): Likewise. >     (mve_vldrwq_gather_shifted_offset_fv4sf): Likewise. >     (mve_vldrwq_gather_shifted_offset_z_v4si): Likewise. >     (mve_vldrwq_gather_shifted_offset_z_fv4sf): Likewise. >     (mve_vldrwq_z_v4si): Likewise. >     (mve_vldrwq_z_fv4sf): Likewise. >     (mve_vmaxaq_m_s): Likewise. >     (mve_vmaxaq_s): Likewise. >     (mve_vmaxavq_p_s): Likewise. >     (mve_vmaxavq_s): Likewise. >     (mve_vmaxnmaq_f): Likewise. >     (mve_vmaxnmaq_m_f): Likewise. >     (mve_vmaxnmavq_f): Likewise. >     (mve_vmaxnmavq_p_f): Likewise. >     (mve_vmaxnmq_f): Likewise. >     (mve_vmaxnmq_m_f): Likewise. >     (mve_vmaxnmvq_f): Likewise. >     (mve_vmaxnmvq_p_f): Likewise. >     (mve_vmaxq_): Likewise. >     (mve_vmaxq_m_): Likewise. >     (mve_vmaxq_s): Likewise. >     (mve_vmaxq_u): Likewise. >     (mve_vmaxvq_): Likewise. >     (mve_vmaxvq_p_): Likewise. >     (mve_vminaq_m_s): Likewise. >     (mve_vminaq_s): Likewise. >     (mve_vminavq_p_s): Likewise. >     (mve_vminavq_s): Likewise. >     (mve_vminnmaq_f): Likewise. >     (mve_vminnmaq_m_f): Likewise. >     (mve_vminnmavq_f): Likewise. >     (mve_vminnmavq_p_f): Likewise. >     (mve_vminnmq_f): Likewise. >     (mve_vminnmq_m_f): Likewise. >     (mve_vminnmvq_f): Likewise. >     (mve_vminnmvq_p_f): Likewise. >     (mve_vminq_): Likewise. >     (mve_vminq_m_): Likewise. >     (mve_vminq_s): Likewise. >     (mve_vminq_u): Likewise. >     (mve_vminvq_): Likewise. >     (mve_vminvq_p_): Likewise. >     (mve_vmladavaq_): Likewise. >     (mve_vmladavaq_p_): Likewise. >     (mve_vmladavaxq_p_s): Likewise. >     (mve_vmladavaxq_s): Likewise. >     (mve_vmladavq_): Likewise. >     (mve_vmladavq_p_): Likewise. >     (mve_vmladavxq_p_s): Likewise. >     (mve_vmladavxq_s): Likewise. >     (mve_vmlaldavaq_): Likewise. >     (mve_vmlaldavaq_p_): Likewise. >     (mve_vmlaldavaxq_): Likewise. >     (mve_vmlaldavaxq_p_): Likewise. >     (mve_vmlaldavaxq_s): Likewise. >     (mve_vmlaldavq_): Likewise. >     (mve_vmlaldavq_p_): Likewise. >     (mve_vmlaldavxq_p_s): Likewise. >     (mve_vmlaldavxq_s): Likewise. >     (mve_vmlaq_m_n_): Likewise. >     (mve_vmlaq_n_): Likewise. >     (mve_vmlasq_m_n_): Likewise. >     (mve_vmlasq_n_): Likewise. >     (mve_vmlsdavaq_p_s): Likewise. >     (mve_vmlsdavaq_s): Likewise. >     (mve_vmlsdavaxq_p_s): Likewise. >     (mve_vmlsdavaxq_s): Likewise. >     (mve_vmlsdavq_p_s): Likewise. >     (mve_vmlsdavq_s): Likewise. >     (mve_vmlsdavxq_p_s): Likewise. >     (mve_vmlsdavxq_s): Likewise. >     (mve_vmlsldavaq_p_s): Likewise. >     (mve_vmlsldavaq_s): Likewise. >     (mve_vmlsldavaxq_p_s): Likewise. >     (mve_vmlsldavaxq_s): Likewise. >     (mve_vmlsldavq_p_s): Likewise. >     (mve_vmlsldavq_s): Likewise. >     (mve_vmlsldavxq_p_s): Likewise. >     (mve_vmlsldavxq_s): Likewise. >     (mve_vmovlbq_): Likewise. >     (mve_vmovlbq_m_): Likewise. >     (mve_vmovltq_): Likewise. >     (mve_vmovltq_m_): Likewise. >     (mve_vmovnbq_): Likewise. >     (mve_vmovnbq_m_): Likewise. >     (mve_vmovntq_): Likewise. >     (mve_vmovntq_m_): Likewise. >     (mve_vmulhq_): Likewise. >     (mve_vmulhq_m_): Likewise. >     (mve_vmullbq_int_): Likewise. >     (mve_vmullbq_int_m_): Likewise. >     (mve_vmullbq_poly_m_p): Likewise. >     (mve_vmullbq_poly_p): Likewise. >     (mve_vmulltq_int_): Likewise. >     (mve_vmulltq_int_m_): Likewise. >     (mve_vmulltq_poly_m_p): Likewise. >     (mve_vmulltq_poly_p): Likewise. >     (mve_vmulq_): Likewise. >     (mve_vmulq_f): Likewise. >     (mve_vmulq_m_): Likewise. >     (mve_vmulq_m_f): Likewise. >     (mve_vmulq_m_n_): Likewise. >     (mve_vmulq_m_n_f): Likewise. >     (mve_vmulq_n_): Likewise. >     (mve_vmulq_n_f): Likewise. >     (mve_vmvnq_): Likewise. >     (mve_vmvnq_m_): Likewise. >     (mve_vmvnq_m_n_): Likewise. >     (mve_vmvnq_n_): Likewise. >     (mve_vmvnq_s): Likewise. >     (mve_vmvnq_u): Likewise. >     (mve_vnegq_f): Likewise. >     (mve_vnegq_m_f): Likewise. >     (mve_vnegq_m_s): Likewise. >     (mve_vnegq_s): Likewise. >     (mve_vornq_): Likewise. >     (mve_vornq_f): Likewise. >     (mve_vornq_m_): Likewise. >     (mve_vornq_m_f): Likewise. >     (mve_vornq_s): Likewise. >     (mve_vornq_u): Likewise. >     (mve_vorrq_): Likewise. >     (mve_vorrq_f): Likewise. >     (mve_vorrq_m_): Likewise. >     (mve_vorrq_m_f): Likewise. >     (mve_vorrq_m_n_): Likewise. >     (mve_vorrq_n_): Likewise. >     (mve_vorrq_s): Likewise. >     (mve_vorrq_s): Likewise. >     (mve_vqabsq_m_s): Likewise. >     (mve_vqabsq_s): Likewise. >     (mve_vqaddq_): Likewise. >     (mve_vqaddq_m_): Likewise. >     (mve_vqaddq_m_n_): Likewise. >     (mve_vqaddq_n_): Likewise. >     (mve_vqdmladhq_m_s): Likewise. >     (mve_vqdmladhq_s): Likewise. >     (mve_vqdmladhxq_m_s): Likewise. >     (mve_vqdmladhxq_s): Likewise. >     (mve_vqdmlahq_m_n_s): Likewise. >     (mve_vqdmlahq_n_): Likewise. >     (mve_vqdmlahq_n_s): Likewise. >     (mve_vqdmlashq_m_n_s): Likewise. >     (mve_vqdmlashq_n_): Likewise. >     (mve_vqdmlashq_n_s): Likewise. >     (mve_vqdmlsdhq_m_s): Likewise. >     (mve_vqdmlsdhq_s): Likewise. >     (mve_vqdmlsdhxq_m_s): Likewise. >     (mve_vqdmlsdhxq_s): Likewise. >     (mve_vqdmulhq_m_n_s): Likewise. >     (mve_vqdmulhq_m_s): Likewise. >     (mve_vqdmulhq_n_s): Likewise. >     (mve_vqdmulhq_s): Likewise. >     (mve_vqdmullbq_m_n_s): Likewise. >     (mve_vqdmullbq_m_s): Likewise. >     (mve_vqdmullbq_n_s): Likewise. >     (mve_vqdmullbq_s): Likewise. >     (mve_vqdmulltq_m_n_s): Likewise. >     (mve_vqdmulltq_m_s): Likewise. >     (mve_vqdmulltq_n_s): Likewise. >     (mve_vqdmulltq_s): Likewise. >     (mve_vqmovnbq_): Likewise. >     (mve_vqmovnbq_m_): Likewise. >     (mve_vqmovntq_): Likewise. >     (mve_vqmovntq_m_): Likewise. >     (mve_vqmovunbq_m_s): Likewise. >     (mve_vqmovunbq_s): Likewise. >     (mve_vqmovuntq_m_s): Likewise. >     (mve_vqmovuntq_s): Likewise. >     (mve_vqnegq_m_s): Likewise. >     (mve_vqnegq_s): Likewise. >     (mve_vqrdmladhq_m_s): Likewise. >     (mve_vqrdmladhq_s): Likewise. >     (mve_vqrdmladhxq_m_s): Likewise. >     (mve_vqrdmladhxq_s): Likewise. >     (mve_vqrdmlahq_m_n_s): Likewise. >     (mve_vqrdmlahq_n_): Likewise. >     (mve_vqrdmlahq_n_s): Likewise. >     (mve_vqrdmlashq_m_n_s): Likewise. >     (mve_vqrdmlashq_n_): Likewise. >     (mve_vqrdmlashq_n_s): Likewise. >     (mve_vqrdmlsdhq_m_s): Likewise. >     (mve_vqrdmlsdhq_s): Likewise. >     (mve_vqrdmlsdhxq_m_s): Likewise. >     (mve_vqrdmlsdhxq_s): Likewise. >     (mve_vqrdmulhq_m_n_s): Likewise. >     (mve_vqrdmulhq_m_s): Likewise. >     (mve_vqrdmulhq_n_s): Likewise. >     (mve_vqrdmulhq_s): Likewise. >     (mve_vqrshlq_): Likewise. >     (mve_vqrshlq_m_): Likewise. >     (mve_vqrshlq_m_n_): Likewise. >     (mve_vqrshlq_n_): Likewise. >     (mve_vqrshrnbq_m_n_): Likewise. >     (mve_vqrshrnbq_n_): Likewise. >     (mve_vqrshrntq_m_n_): Likewise. >     (mve_vqrshrntq_n_): Likewise. >     (mve_vqrshrunbq_m_n_s): Likewise. >     (mve_vqrshrunbq_n_s): Likewise. >     (mve_vqrshruntq_m_n_s): Likewise. >     (mve_vqrshruntq_n_s): Likewise. >     (mve_vqshlq_): Likewise. >     (mve_vqshlq_m_): Likewise. >     (mve_vqshlq_m_n_): Likewise. >     (mve_vqshlq_m_r_): Likewise. >     (mve_vqshlq_n_): Likewise. >     (mve_vqshlq_r_): Likewise. >     (mve_vqshluq_m_n_s): Likewise. >     (mve_vqshluq_n_s): Likewise. >     (mve_vqshrnbq_m_n_): Likewise. >     (mve_vqshrnbq_n_): Likewise. >     (mve_vqshrntq_m_n_): Likewise. >     (mve_vqshrntq_n_): Likewise. >     (mve_vqshrunbq_m_n_s): Likewise. >     (mve_vqshrunbq_n_s): Likewise. >     (mve_vqshruntq_m_n_s): Likewise. >     (mve_vqshruntq_n_s): Likewise. >     (mve_vqsubq_): Likewise. >     (mve_vqsubq_m_): Likewise. >     (mve_vqsubq_m_n_): Likewise. >     (mve_vqsubq_n_): Likewise. >     (mve_vrev16q_v16qi): Likewise. >     (mve_vrev16q_m_v16qi): Likewise. >     (mve_vrev32q_): Likewise. >     (mve_vrev32q_fv8hf): Likewise. >     (mve_vrev32q_m_): Likewise. >     (mve_vrev32q_m_fv8hf): Likewise. >     (mve_vrev64q_): Likewise. >     (mve_vrev64q_f): Likewise. >     (mve_vrev64q_m_): Likewise. >     (mve_vrev64q_m_f): Likewise. >     (mve_vrhaddq_): Likewise. >     (mve_vrhaddq_m_): Likewise. >     (mve_vrmlaldavhaq_v4si): Likewise. >     (mve_vrmlaldavhaq_p_sv4si): Likewise. >     (mve_vrmlaldavhaq_p_uv4si): Likewise. >     (mve_vrmlaldavhaq_sv4si): Likewise. >     (mve_vrmlaldavhaq_uv4si): Likewise. >     (mve_vrmlaldavhaxq_p_sv4si): Likewise. >     (mve_vrmlaldavhaxq_sv4si): Likewise. >     (mve_vrmlaldavhq_v4si): Likewise. >     (mve_vrmlaldavhq_p_v4si): Likewise. >     (mve_vrmlaldavhxq_p_sv4si): Likewise. >     (mve_vrmlaldavhxq_sv4si): Likewise. >     (mve_vrmlsldavhaq_p_sv4si): Likewise. >     (mve_vrmlsldavhaq_sv4si): Likewise. >     (mve_vrmlsldavhaxq_p_sv4si): Likewise. >     (mve_vrmlsldavhaxq_sv4si): Likewise. >     (mve_vrmlsldavhq_p_sv4si): Likewise. >     (mve_vrmlsldavhq_sv4si): Likewise. >     (mve_vrmlsldavhxq_p_sv4si): Likewise. >     (mve_vrmlsldavhxq_sv4si): Likewise. >     (mve_vrmulhq_): Likewise. >     (mve_vrmulhq_m_): Likewise. >     (mve_vrndaq_f): Likewise. >     (mve_vrndaq_m_f): Likewise. >     (mve_vrndmq_f): Likewise. >     (mve_vrndmq_m_f): Likewise. >     (mve_vrndnq_f): Likewise. >     (mve_vrndnq_m_f): Likewise. >     (mve_vrndpq_f): Likewise. >     (mve_vrndpq_m_f): Likewise. >     (mve_vrndq_f): Likewise. >     (mve_vrndq_m_f): Likewise. >     (mve_vrndxq_f): Likewise. >     (mve_vrndxq_m_f): Likewise. >     (mve_vrshlq_): Likewise. >     (mve_vrshlq_m_): Likewise. >     (mve_vrshlq_m_n_): Likewise. >     (mve_vrshlq_n_): Likewise. >     (mve_vrshrnbq_m_n_): Likewise. >     (mve_vrshrnbq_n_): Likewise. >     (mve_vrshrntq_m_n_): Likewise. >     (mve_vrshrntq_n_): Likewise. >     (mve_vrshrq_m_n_): Likewise. >     (mve_vrshrq_n_): Likewise. >     (mve_vsbciq_v4si): Likewise. >     (mve_vsbciq_m_v4si): Likewise. >     (mve_vsbcq_v4si): Likewise. >     (mve_vsbcq_m_v4si): Likewise. >     (mve_vshlcq_): Likewise. >     (mve_vshlcq_m_): Likewise. >     (mve_vshllbq_m_n_): Likewise. >     (mve_vshllbq_n_): Likewise. >     (mve_vshlltq_m_n_): Likewise. >     (mve_vshlltq_n_): Likewise. >     (mve_vshlq_): Likewise. >     (mve_vshlq_): Likewise. >     (mve_vshlq_m_): Likewise. >     (mve_vshlq_m_n_): Likewise. >     (mve_vshlq_m_r_): Likewise. >     (mve_vshlq_n_): Likewise. >     (mve_vshlq_r_): Likewise. >     (mve_vshrnbq_m_n_): Likewise. >     (mve_vshrnbq_n_): Likewise. >     (mve_vshrntq_m_n_): Likewise. >     (mve_vshrntq_n_): Likewise. >     (mve_vshrq_m_n_): Likewise. >     (mve_vshrq_n_): Likewise. >     (mve_vsliq_m_n_): Likewise. >     (mve_vsliq_n_): Likewise. >     (mve_vsriq_m_n_): Likewise. >     (mve_vsriq_n_): Likewise. >     (mve_vstrbq_): Likewise. >     (mve_vstrbq_p_): Likewise. >     (mve_vstrbq_scatter_offset__insn): Likewise. >     (mve_vstrbq_scatter_offset_p__insn): Likewise. >     (mve_vstrdq_scatter_base_v2di): Likewise. >     (mve_vstrdq_scatter_base_p_v2di): Likewise. >     (mve_vstrdq_scatter_base_wb_v2di): Likewise. >     (mve_vstrdq_scatter_base_wb_p_v2di): Likewise. >     (mve_vstrdq_scatter_offset_v2di_insn): Likewise. >     (mve_vstrdq_scatter_offset_p_v2di_insn): Likewise. >     (mve_vstrdq_scatter_shifted_offset_v2di_insn): Likewise. >     (mve_vstrdq_scatter_shifted_offset_p_v2di_insn): Likewise. >     (mve_vstrhq_): Likewise. >     (mve_vstrhq_fv8hf): Likewise. >     (mve_vstrhq_p_): Likewise. >     (mve_vstrhq_p_fv8hf): Likewise. >     (mve_vstrhq_scatter_offset__insn): Likewise. >     (mve_vstrhq_scatter_offset_fv8hf_insn): Likewise. >     (mve_vstrhq_scatter_offset_p__insn): Likewise. >     (mve_vstrhq_scatter_offset_p_fv8hf_insn): Likewise. >  (mve_vstrhq_scatter_shifted_offset__insn): Likewise. >     (mve_vstrhq_scatter_shifted_offset_fv8hf_insn): Likewise. >  (mve_vstrhq_scatter_shifted_offset_p__insn): Likewise. >     (mve_vstrhq_scatter_shifted_offset_p_fv8hf_insn): Likewise. >     (mve_vstrwq_v4si): Likewise. >     (mve_vstrwq_fv4sf): Likewise. >     (mve_vstrwq_p_v4si): Likewise. >     (mve_vstrwq_p_fv4sf): Likewise. >     (mve_vstrwq_scatter_base_v4si): Likewise. >     (mve_vstrwq_scatter_base_fv4sf): Likewise. >     (mve_vstrwq_scatter_base_p_v4si): Likewise. >     (mve_vstrwq_scatter_base_p_fv4sf): Likewise. >     (mve_vstrwq_scatter_base_wb_v4si): Likewise. >     (mve_vstrwq_scatter_base_wb_fv4sf): Likewise. >     (mve_vstrwq_scatter_base_wb_p_v4si): Likewise. >     (mve_vstrwq_scatter_base_wb_p_fv4sf): Likewise. >     (mve_vstrwq_scatter_offset_v4si_insn): Likewise. >     (mve_vstrwq_scatter_offset_fv4sf_insn): Likewise. >     (mve_vstrwq_scatter_offset_p_v4si_insn): Likewise. >     (mve_vstrwq_scatter_offset_p_fv4sf_insn): Likewise. >     (mve_vstrwq_scatter_shifted_offset_v4si_insn): Likewise. >     (mve_vstrwq_scatter_shifted_offset_fv4sf_insn): Likewise. >     (mve_vstrwq_scatter_shifted_offset_p_v4si_insn): Likewise. >     (mve_vstrwq_scatter_shifted_offset_p_fv4sf_insn): Likewise. >     (mve_vsubq_): Likewise. >     (mve_vsubq_f): Likewise. >     (mve_vsubq_m_): Likewise. >     (mve_vsubq_m_f): Likewise. >     (mve_vsubq_m_n_): Likewise. >     (mve_vsubq_m_n_f): Likewise. >     (mve_vsubq_n_): Likewise. >     (mve_vsubq_n_f): Likewise. > > > gcc/testsuite/ChangeLog: > >         * gcc.target/arm/dlstp-compile-asm.c: New test. >