MIPS 74k scheduler adjustments
Richard Sandiford
richard@codesourcery.com
Wed Jul 18 11:40:00 GMT 2007
"Fu, Chao-Ying" <fu@mips.com> writes:
> Joseph S. Myers wrote:
>> This patch adjusts the MIPS 74k scheduler to reflect that certain
>> arithmetic instructions take only 1 cycle. This in turn
>> requires various
>> instructions to be marked as "logical", "signext" or "move"
>> instead of
>> "arith".
>>
>> Tested with no regressions with cross to mips-linux-gnu. OK
>> to commit?
>>
>> 2007-07-04 David Ung <davidu@mips.com>
>> Joseph Myers <joseph@codesourcery.com>
>>
>> gcc/
>> * config/mips/mips.md (type): Add logical, signext and move.
>> (one_cmpl<mode>2, *and<mode>3, *and<mode>3_mips16, *ior<mode>3,
>> *ior<mode>3_mips16, two unnamed insns after *ior<mode>3_mips16,
>> *nor<mode>3, "Combiner patterns to optimize truncate/zero_extend
>> combinations", *zero_extend<SHORT:mode><GPR:mode>2,
>> *zero_extendqihi2, *extend<SHORT:mode><GPR:mode>2_mips16e,
>> *extend<SHORT:mode><GPR:mode>2_se<SHORT:size>, *movdi_64bit,
>> *movdi_64bit_mips16, *movsi_internal, *movsi_mips16, movcc,
>> *movhi_internal, *movhi_mips16, *movqi_internal, *movqi_mips16,
>> *movsf_hardfloat, *movsf_softfloat, *movsf_mips16,
>> *movdf_hardfloat_64bit, *movdf_hardfloat_32bit,
>> movv2sf_hardfloat_64bit): Use the new types.
>> (*movdi_32bit, *movdi_gp32_fp64, *movdi_32bit_mips16,
>> *movdf_softfloat, *movdf_mips16): Use "multi".
>> (extendqihi2): Replace with a define_expand.
>> (*extendqihi2_mips16e, *extendqihi2, *extendqihi2_seb): New.
>> Based on extend<SHORT:mode><GPR:mode>2 patterns.
>>[...]
>
> I got one test that failed on the target of mipsisa32r2-elf
> (compiled with -mips32.) The issue may be from "*extendqihi2"
> where operands[0] is not converted to SImode.
> The test was ok with "gcc version 4.3.0 20070625 (experimental)",
> but not with the current mainline. Thanks!
>
> Ex:
> # cat bug129.c
> short test(signed char a, signed char b)
> {
> short c = (short) a;
> short d = (short) b;
> short e = c * d;
> return e;
> }
>
> # mipsisa32r2-elf-gcc -O -mips32 -S bug129.c
> bug129.c: In function â?~testâ?T:
> bug129.c:7: error: unrecognizable insn:
> (insn 28 6 29 2 bug129.c:2 (set (reg:HI 2 $2 [orig:199 b ] [199])
> (ashift:SI (reg:SI 5 $5 [ b+-7 ])
> (const_int 24 [0x18]))) -1 (nil))
> bug129.c:7: internal compiler error: in extract_insn, at recog.c:1991
> Please submit a full bug report,
> with preprocessed source if appropriate.
> See <URL:http://gcc.gnu.org/bugs.html> for instructions.
Joseph's away at the moment, so I've installed the fix below after
regression-testing on mipsisa64-elf.
Richard
gcc/
* config/mips/mips.md (*extendqihi2): Convert the destination
to SImode.
Index: gcc/config/mips/mips.md
===================================================================
--- gcc/config/mips/mips.md (revision 176278)
+++ gcc/config/mips/mips.md (working copy)
@@ -2639,6 +2639,7 @@ (define_insn_and_split "*extendqihi2"
[(set (match_dup 0) (ashift:SI (match_dup 1) (match_dup 2)))
(set (match_dup 0) (ashiftrt:SI (match_dup 0) (match_dup 2)))]
{
+ operands[0] = gen_lowpart (SImode, operands[0]);
operands[1] = gen_lowpart (SImode, operands[1]);
operands[2] = GEN_INT (GET_MODE_BITSIZE (SImode)
- GET_MODE_BITSIZE (QImode));
More information about the Gcc-patches
mailing list