return "ldw -4(0,%1),%R0\n\tldws,mb -8(0,%1),%0";
}
}
+ else if (GET_CODE (addr) == PLUS
+ && GET_CODE (XEXP (addr, 0)) == MULT)
+ {
+ rtx high_reg = gen_rtx (SUBREG, SImode, operands[0], 0);
+
+ if (!reg_overlap_mentioned_p (high_reg, addr))
+ {
+ rtx xoperands[3];
+
+ xoperands[0] = high_reg;
+ xoperands[1] = XEXP (addr, 1);
+ xoperands[2] = XEXP (XEXP (addr, 0), 0);
+ xoperands[3] = XEXP (XEXP (addr, 0), 1);
+ output_asm_insn ("sh%O3addl %2,%1,%0", xoperands);
+ return "ldw 4(0,%0),%R0\n\tldw 0(0,%0),%0";
+ }
+ else
+ {
+ rtx xoperands[3];
+
+ xoperands[0] = high_reg;
+ xoperands[1] = XEXP (addr, 1);
+ xoperands[2] = XEXP (XEXP (addr, 0), 0);
+ xoperands[3] = XEXP (XEXP (addr, 0), 1);
+ output_asm_insn ("sh%O3addl %2,%1,%R0", xoperands);
+ return "ldw 0(0,%R0),%0\n\tldw 4(0,%R0),%R0";
+ }
+
+ }
}
/* If an operand is an unoffsettable memory ref, find a register
[(set (match_operand:DF 0 "reg_or_nonsymb_mem_operand"
"=f,*r,RQ,?o,?Q,f,*r,*r")
(match_operand:DF 1 "reg_or_0_or_nonsymb_mem_operand"
- "fG,*rG,f,*r,*r,RQ,o,Q"))]
+ "fG,*rG,f,*r,*r,RQ,o,RQ"))]
"(register_operand (operands[0], DFmode)
|| reg_or_0_operand (operands[1], DFmode))
&& ! (GET_CODE (operands[1]) == CONST_DOUBLE
[(set (match_operand:DI 0 "reg_or_nonsymb_mem_operand"
"=r,o,Q,r,r,r,f,f,*TR")
(match_operand:DI 1 "general_operand"
- "rM,r,r,o,Q,i,fM,*TR,f"))]
+ "rM,r,r,o*R,Q,i,fM,*TR,f"))]
"(register_operand (operands[0], DImode)
|| reg_or_0_operand (operands[1], DImode))
&& ! TARGET_SOFT_FLOAT"