From 1baa7ca1ecf03a4b5bfa2632989f41ae91e885fe Mon Sep 17 00:00:00 2001 From: John David Anglin Date: Sat, 9 Dec 2006 03:35:43 +0000 Subject: [PATCH] re PR target/30039 (HPPA: Incorrect code generated on 64bit host) PR target/30039 * pa.md (high:DI and lo_sum:DI): Handle 64-bit CONST_INTs in 32-bit patterns. Correct length of high:DI instruction sequence. From-SVN: r119685 --- gcc/ChangeLog | 6 ++++++ gcc/config/pa/pa.md | 16 +++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 43202958dba3..3da6b308d2ef 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2006-12-08 John David Anglin + + PR target/30039 + * pa.md (high:DI and lo_sum:DI): Handle 64-bit CONST_INTs in 32-bit + patterns. Correct length of high:DI instruction sequence. + 2006-11-23 John David Anglin * pa.c (return_addr_rtx): Change 0xe0400002 to -532676606. diff --git a/gcc/config/pa/pa.md b/gcc/config/pa/pa.md index e779d4d4ce1f..02a947a6f1a4 100644 --- a/gcc/config/pa/pa.md +++ b/gcc/config/pa/pa.md @@ -4199,6 +4199,7 @@ if (GET_CODE (op1) == CONST_INT) { +#if HOST_BITS_PER_WIDE_INT <= 32 operands[0] = operand_subword (op0, 1, 0, DImode); output_asm_insn (\"ldil L'%1,%0\", operands); @@ -4208,6 +4209,16 @@ else output_asm_insn (\"ldi 0,%0\", operands); return \"\"; +#else + operands[0] = operand_subword (op0, 1, 0, DImode); + operands[1] = GEN_INT (INTVAL (op1) & 0xffffffff)); + output_asm_insn (\"ldil L'%1,%0\", operands); + + operands[0] = operand_subword (op0, 0, 0, DImode); + operands[1] = GEN_INT (INTVAL (op1) >> 32); + output_asm_insn (singlemove_string (operands), operands); + return \"\"; +#endif } else if (GET_CODE (op1) == CONST_DOUBLE) { @@ -4224,7 +4235,7 @@ abort (); }" [(set_attr "type" "move") - (set_attr "length" "8")]) + (set_attr "length" "12")]) (define_insn "" [(set (match_operand:DI 0 "move_dest_operand" @@ -4384,6 +4395,9 @@ handle it correctly. */ if (GET_CODE (operands[2]) == CONST_DOUBLE) operands[2] = GEN_INT (CONST_DOUBLE_LOW (operands[2])); + else if (HOST_BITS_PER_WIDE_INT > 32 + && GET_CODE (operands[2]) == CONST_INT) + operands[2] = GEN_INT (INTVAL (operands[2]) & 0xffffffff); if (which_alternative == 1) output_asm_insn (\"copy %1,%0\", operands); return \"ldo R'%G2(%R1),%R0\"; -- 2.47.2