Skip to content

  • Projects
  • Groups
  • Snippets
  • Help
  • This project
    • Loading...
  • Sign in / Register
R
riscv-gcc-1
  • Overview
    • Overview
    • Details
    • Activity
    • Cycle Analytics
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
    • Charts
  • Issues 0
    • Issues 0
    • List
    • Board
    • Labels
    • Milestones
  • Merge Requests 0
    • Merge Requests 0
  • CI / CD
    • CI / CD
    • Pipelines
    • Jobs
    • Schedules
    • Charts
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Members
    • Members
  • Collapse sidebar
  • Activity
  • Graph
  • Charts
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
  • lvzhengyang
  • riscv-gcc-1
  • Repository

Switch branch/tag
  • riscv-gcc-1
  • gcc
  • config
  • arm
  • arm.h
Find file
BlameHistoryPermalink
  • Srinath Parvathaneni's avatar
    arm: Fix the wrong code-gen generated by MVE vector load/store intrinsics (PR94959). · 32c348ce
    Few MVE intrinsics like vldrbq_s32, vldrhq_s32 etc., the assembler instructions
    generated by current compiler are wrong.
    eg: vldrbq_s32 generates an assembly instructions `vldrb.s32 q0,[ip]`.
    But as per Arm-arm second argument in above instructions must also be a low
    register (<= r7). This patch fixes this issue by creating a new predicate
    "mve_memory_operand" and constraint "Ux" which allows low registers as arguments
    to the generated instructions depending on the mode of the argument. A new constraint
    "Ul" is created to handle loading to PC-relative addressing modes for vector
    store/load intrinsiscs.
    All the corresponding MVE intrinsic generating wrong code-gen as vldrbq_s32
    are modified in this patch.
    
    	Backported from mainline
    	2020-05-20  Srinath Parvathaneni  <srinath.parvathaneni@arm.com>
    
    gcc/
    	PR target/94959
    	* config/arm/arm-protos.h (arm_mode_base_reg_class): Function
    	declaration.
    	(mve_vector_mem_operand): Likewise.
    	* config/arm/arm.c (thumb2_legitimate_address_p): For MVE target check
    	the load from memory to a core register is legitimate for give mode.
    	(mve_vector_mem_operand): Define function.
    	(arm_print_operand): Modify comment.
    	(arm_mode_base_reg_class): Define.
    	* config/arm/arm.h (MODE_BASE_REG_CLASS): Modify to add check for
    	TARGET_HAVE_MVE and expand to arm_mode_base_reg_class on TRUE.
    	* config/arm/constraints.md (Ux): Likewise.
    	(Ul): Likewise.
    	* config/arm/mve.md (mve_mov): Replace constraint Us with Ux and also
    	add support for missing Vector Store Register and Vector Load Register.
    	Add a new alternative to support load from memory to PC (or label) in
    	vector store/load.
    	(mve_vstrbq_<supf><mode>): Modify constraint Us to Ux.
    	(mve_vldrbq_<supf><mode>): Modify constriant Us to Ux, predicate to
    	mve_memory_operand and also modify the MVE instructions to emit.
    	(mve_vldrbq_z_<supf><mode>): Modify constraint Us to Ux.
    	(mve_vldrhq_fv8hf): Modify constriant Us to Ux, predicate to
    	mve_memory_operand and also modify the MVE instructions to emit.
    	(mve_vldrhq_<supf><mode>): Modify constriant Us to Ux, predicate to
    	mve_memory_operand and also modify the MVE instructions to emit.
    	(mve_vldrhq_z_fv8hf): Likewise.
    	(mve_vldrhq_z_<supf><mode>): Likewise.
    	(mve_vldrwq_fv4sf): Likewise.
    	(mve_vldrwq_<supf>v4si): Likewise.
    	(mve_vldrwq_z_fv4sf): Likewise.
    	(mve_vldrwq_z_<supf>v4si): Likewise.
    	(mve_vld1q_f<mode>): Modify constriant Us to Ux.
    	(mve_vld1q_<supf><mode>): Likewise.
    	(mve_vstrhq_fv8hf): Modify constriant Us to Ux, predicate to
    	mve_memory_operand.
    	(mve_vstrhq_p_fv8hf): Modify constriant Us to Ux, predicate to
    	mve_memory_operand and also modify the MVE instructions to emit.
    	(mve_vstrhq_p_<supf><mode>): Likewise.
    	(mve_vstrhq_<supf><mode>): Modify constriant Us to Ux, predicate to
    	mve_memory_operand.
    	(mve_vstrwq_fv4sf): Modify constriant Us to Ux.
    	(mve_vstrwq_p_fv4sf): Modify constriant Us to Ux and also modify the MVE
    	instructions to emit.
    	(mve_vstrwq_p_<supf>v4si): Likewise.
    	(mve_vstrwq_<supf>v4si): Likewise.Modify constriant Us to Ux.
    	* config/arm/predicates.md (mve_memory_operand): Define.
    
    gcc/testsuite/
    	PR target/94959
    	* gcc.target/arm/mve/intrinsics/mve_vector_float2.c: Modify.
    	* gcc.target/arm/mve/intrinsics/mve_vldr.c: New test.
    	* gcc.target/arm/mve/intrinsics/mve_vldr_z.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/mve_vstr.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/mve_vstr_p.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vld1q_f16.c: Modify.
    	* gcc.target/arm/mve/intrinsics/vld1q_f32.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vld1q_s16.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vld1q_s32.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vld1q_s8.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vld1q_u16.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vld1q_u32.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vld1q_u8.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vld1q_z_f16.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vld1q_z_f32.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vld1q_z_s16.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vld1q_z_s32.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vld1q_z_s8.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vld1q_z_u16.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vld1q_z_u32.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vld1q_z_u8.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vldrbq_s8.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vldrbq_u8.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vldrbq_z_s8.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vldrbq_z_u8.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vldrdq_gather_base_wb_s64.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vldrdq_gather_base_wb_u64.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vldrdq_gather_base_wb_z_s64.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vldrdq_gather_base_wb_z_u64.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vldrhq_f16.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vldrhq_s16.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vldrhq_s32.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vldrhq_u16.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vldrhq_u32.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vldrhq_z_f16.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vldrhq_z_s16.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vldrhq_z_s32.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vldrhq_z_u16.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vldrhq_z_u32.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vldrwq_f32.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vldrwq_gather_base_wb_f32.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vldrwq_gather_base_wb_s32.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vldrwq_gather_base_wb_u32.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vldrwq_gather_base_wb_z_f32.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vldrwq_gather_base_wb_z_s32.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vldrwq_gather_base_wb_z_u32.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vldrwq_s32.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vldrwq_u32.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vldrwq_z_f32.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vldrwq_z_s32.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vldrwq_z_u32.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vuninitializedq_float.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vuninitializedq_float1.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vuninitializedq_int.c: Likewise.
    	* gcc.target/arm/mve/intrinsics/vuninitializedq_int1.c: Likewise.
    
    Co-Authored-By: Andre Vieira  <andre.simoesdiasvieira@arm.com>
    Srinath Parvathaneni committed Jun 16, 2020
    32c348ce
arm.h 88 KB
Edit