This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
This patch fixes the way that we manage QImode indexes when compiling for ARM Architecture v4 or later. In v4 we have a ldrsb instruction that can sign-extend a byte load (ldrb zero-extends). Unfortunately the indexing capabilities of this insn are less flexible than its unsigned counterpart. In the past we have restricted (mostly) the indexing range of ldrb to that of its poorer cousin: that generates correct code, but at the expense of wasting instructions when the indexing exceeds the capabilities of ldrsb. The patch below addresses all this by introducing a new memory predicate arm_extendqisi_mem_op which can validate a ldrsb address index distinctly from an ldrb address index (it does so by calling arm_legitimate_address_p with a new argument, the 'outer' code in much the same way as the RTX_COST macros do. Measurements on CSiBE code show about 0.1% code size reduction with this change. Built and regress tested for arm-unknown-elf on the csl-arm-branch and HEAD, and fully bootstrapped on armv4-linux-gnu on HEAD. Committed to csl-arm and HEAD. 2004-03-13 Richard Earnshaw <rearnsha@arm.com> * arm.c (arm_legitimate_address_p): New argument, OUTER. Pass through to arm_legitimate_index_p. Update all callers with SET as default value. (arm_legitimate_index_p): New argument, OUTER. Restrict the index range if OUTER is a sign-extend operation on QImode. Correctly reject shift operations on sign-extended QImode addresses. (bad_signed_byte_operand): Delete. (arm_extendqisi_mem_op): New function. * arm.h (EXTRA_CONSTRAINT_ARM): Delete. Replace with... (EXTRA_CONSTRAINT_STR_ARM): ... this. Handle extended address constraints. (CONSTRAINT_LEN): New. (EXTRA_CONSTRAINT): Delete. Replace with... (EXTRA_CONSTRAINT_STR): ... this. (PREDICATE_CODES): Remove bad_signed_byte_operand. * arm.md (extendqihi_insn): Use new constraint Uq. Rework. Length is now always default. (define_splits for bad sign-extend loads): Delete. (arm_extendqisi, arm_extendqisi_v5): Likewise. * arm/vfp.md (arm_movsi_vfp, arm_movdi_vfp, movsf_vfp, movdf_vfp): Rework 'U' constraint to 'Uv'. * arm-protos.h: Remove bad_signed_byte_operand. Add arm_extendqisi_mem_op. * doc/md.texi (ARM constraints): Rename VFP constraint (now Uv). Add Uq constraint.
Attachment:
extendqisi-addr.patch
Description: extendqisi-addr.patch
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |