;; GENERAL_REGS. For the purposes of regclass, prefer FLOAT_REGS.
(define_insn "movsf"
- [(set (match_operand:SF 0 "general_operand" "=*rf,*rfm,f,!*rm")
- (match_operand:SF 1 "general_operand" "*rfm,*rf,fG,fF"))]
+ [(set (match_operand:SF 0 "general_operand" "=*rfm,*rf,f,!*rm")
+ (match_operand:SF 1 "general_operand" "*rf,*rfm,fG,fF"))]
""
"*
{
;; GENERAL_REGS. For the purposes of regclass, prefer FLOAT_REGS.
(define_insn "movdf"
- [(set (match_operand:DF 0 "general_operand" "=*rf,*rfm,f,!*rm")
- (match_operand:DF 1 "general_operand" "*rfm,*rf,fG,fF"))]
+ [(set (match_operand:DF 0 "general_operand" "=*rfm,*rf,f,!*rm")
+ (match_operand:DF 1 "general_operand" "*rf,*rfm,fG,fF"))]
""
"*
{
;; Conversions between float and double.
(define_insn "extendsfdf2"
- [(set (match_operand:DF 0 "general_operand" "=fm,f,f,!*r")
+ [(set (match_operand:DF 0 "general_operand" "=fm,f")
(float_extend:DF
- (match_operand:SF 1 "general_operand" "f,fm,!*r,f")))]
+ (match_operand:SF 1 "general_operand" "f,fm")))]
"TARGET_80387"
"*
{
abort ();
}")
+(define_expand "truncdfsf2"
+ [(parallel [(set (match_operand:SF 0 "nonimmediate_operand" "")
+ (float_truncate:SF
+ (match_operand:DF 1 "register_operand" "")))
+ (clobber (match_dup 2))])]
+ "TARGET_80387"
+ "
+{
+ operands[2] = (rtx) assign_386_stack_local (SFmode, 0);
+}")
+
;; This cannot output into an f-reg because there is no way to be sure
;; of truncating in that case. Otherwise this is just like a simple move
-;; insn.
+;; insn. So we pretend we can output to a reg in order to get better
+;; register preferencing, but we really use a stack slot.
-(define_insn "truncdfsf2"
+(define_insn ""
[(set (match_operand:SF 0 "nonimmediate_operand" "=f,m")
(float_truncate:SF
- (match_operand:DF 1 "register_operand" "0,f")))]
+ (match_operand:DF 1 "register_operand" "0,f")))
+ (clobber (match_operand:SF 2 "memory_operand" "m,m"))]
"TARGET_80387"
"*
{
}
else if (STACK_TOP_P (operands[0]))
{
- rtx xops[4];
-
- xops[0] = AT_SP (SFmode);
- xops[1] = stack_pointer_rtx;
- xops[2] = GEN_INT (GET_MODE_SIZE (SFmode));
- xops[3] = operands[0];
-
- output_asm_insn (AS2 (sub%L1,%2,%1), xops);
- output_asm_insn (AS1 (fstp%z0,%y0), xops);
- output_asm_insn (AS1 (fld%z0,%y0), xops);
- output_asm_insn (AS2 (add%L1,%2,%1), xops);
- RET;
+ output_asm_insn (AS1 (fstp%z2,%y2), operands);
+ return AS1 (fld%z2,%y2);
}
else
abort ();
;; part.
(define_expand "fixuns_truncdfsi2"
- [(set (match_dup 5)
+ [(set (match_dup 4)
(match_operand:DF 1 "register_operand" ""))
- (parallel [(set (match_dup 3)
- (fix:DI (fix:DF (match_dup 5))))
- (clobber (match_scratch:HI 2 ""))
- (clobber (match_dup 5))])
+ (parallel [(set (match_dup 2)
+ (fix:DI (fix:DF (match_dup 4))))
+ (clobber (match_dup 4))
+ (clobber (match_dup 5))
+ (clobber (match_dup 6))
+ (clobber (match_scratch:SI 7 ""))])
(set (match_operand:SI 0 "general_operand" "")
- (match_dup 4))]
+ (match_dup 3))]
"TARGET_80387"
"
{
- operands[3] = gen_reg_rtx (DImode);
- operands[4] = gen_lowpart (SImode, operands[3]);
- operands[5] = gen_reg_rtx (DFmode);
+ operands[2] = gen_reg_rtx (DImode);
+ operands[3] = gen_lowpart (SImode, operands[2]);
+ operands[4] = gen_reg_rtx (DFmode);
+ operands[5] = (rtx) assign_386_stack_local (SImode, 0);
+ operands[6] = (rtx) assign_386_stack_local (SImode, 1);
}")
(define_expand "fixuns_truncsfsi2"
- [(set (match_dup 5)
+ [(set (match_dup 4)
(match_operand:SF 1 "register_operand" ""))
- (parallel [(set (match_dup 3)
- (fix:DI (fix:SF (match_dup 5))))
- (clobber (match_scratch:HI 2 ""))
- (clobber (match_dup 5))])
+ (parallel [(set (match_dup 2)
+ (fix:DI (fix:SF (match_dup 4))))
+ (clobber (match_dup 4))
+ (clobber (match_dup 5))
+ (clobber (match_dup 6))
+ (clobber (match_scratch:SI 7 ""))])
(set (match_operand:SI 0 "general_operand" "")
- (match_dup 4))]
+ (match_dup 3))]
"TARGET_80387"
"
{
- operands[3] = gen_reg_rtx (DImode);
- operands[4] = gen_lowpart (SImode, operands[3]);
- operands[5] = gen_reg_rtx (SFmode);
+ operands[2] = gen_reg_rtx (DImode);
+ operands[3] = gen_lowpart (SImode, operands[2]);
+ operands[4] = gen_reg_rtx (SFmode);
+ operands[5] = (rtx) assign_386_stack_local (SImode, 0);
+ operands[6] = (rtx) assign_386_stack_local (SImode, 1);
}")
;; Signed conversion to DImode.
(define_expand "fix_truncdfdi2"
- [(set (match_dup 3)
+ [(set (match_dup 2)
(match_operand:DF 1 "register_operand" ""))
(parallel [(set (match_operand:DI 0 "general_operand" "")
- (fix:DI (fix:DF (match_dup 3))))
- (clobber (match_scratch:HI 2 ""))
- (clobber (match_dup 3))])]
+ (fix:DI (fix:DF (match_dup 2))))
+ (clobber (match_dup 2))
+ (clobber (match_dup 3))
+ (clobber (match_dup 4))
+ (clobber (match_scratch:SI 5 ""))])]
"TARGET_80387"
"
{
operands[1] = copy_to_mode_reg (DFmode, operands[1]);
- operands[3] = gen_reg_rtx (DFmode);
+ operands[2] = gen_reg_rtx (DFmode);
+ operands[3] = (rtx) assign_386_stack_local (SImode, 0);
+ operands[4] = (rtx) assign_386_stack_local (SImode, 1);
}")
(define_expand "fix_truncsfdi2"
- [(set (match_dup 3)
+ [(set (match_dup 2)
(match_operand:SF 1 "register_operand" ""))
(parallel [(set (match_operand:DI 0 "general_operand" "")
- (fix:DI (fix:SF (match_dup 3))))
- (clobber (match_scratch:HI 2 ""))
- (clobber (match_dup 3))])]
+ (fix:DI (fix:SF (match_dup 2))))
+ (clobber (match_dup 2))
+ (clobber (match_dup 3))
+ (clobber (match_dup 4))
+ (clobber (match_scratch:SI 5 ""))])]
"TARGET_80387"
"
{
operands[1] = copy_to_mode_reg (SFmode, operands[1]);
- operands[3] = gen_reg_rtx (SFmode);
+ operands[2] = gen_reg_rtx (SFmode);
+ operands[3] = (rtx) assign_386_stack_local (SImode, 0);
+ operands[4] = (rtx) assign_386_stack_local (SImode, 1);
}")
;; These match a signed conversion of either DFmode or SFmode to DImode.
(define_insn ""
[(set (match_operand:DI 0 "general_operand" "=rm")
(fix:DI (fix:DF (match_operand:DF 1 "register_operand" "f"))))
- (clobber (match_scratch:HI 2 "=&r"))
- (clobber (match_dup 1))]
+ (clobber (match_dup 1))
+ (clobber (match_operand:SI 2 "memory_operand" "m"))
+ (clobber (match_operand:SI 3 "memory_operand" "m"))
+ (clobber (match_scratch:SI 4 "=&q"))]
"TARGET_80387"
"* return (char *) output_fix_trunc (insn, operands);")
(define_insn ""
[(set (match_operand:DI 0 "general_operand" "=rm")
(fix:DI (fix:SF (match_operand:SF 1 "register_operand" "f"))))
- (clobber (match_scratch:HI 2 "=&r"))
- (clobber (match_dup 1))]
+ (clobber (match_dup 1))
+ (clobber (match_operand:SI 2 "memory_operand" "m"))
+ (clobber (match_operand:SI 3 "memory_operand" "m"))
+ (clobber (match_scratch:SI 4 "=&q"))]
"TARGET_80387"
"* return (char *) output_fix_trunc (insn, operands);")
[(parallel [(set (match_operand:SI 0 "general_operand" "")
(fix:SI
(fix:DF (match_operand:DF 1 "register_operand" ""))))
- (clobber (match_scratch:HI 2 ""))])]
+ (clobber (match_dup 2))
+ (clobber (match_dup 3))
+ (clobber (match_scratch:SI 4 ""))])]
"TARGET_80387"
- "")
+ "
+{
+ operands[2] = (rtx) assign_386_stack_local (SImode, 0);
+ operands[3] = (rtx) assign_386_stack_local (SImode, 1);
+}")
(define_expand "fix_truncsfsi2"
[(parallel [(set (match_operand:SI 0 "general_operand" "")
(fix:SI
(fix:SF (match_operand:SF 1 "register_operand" ""))))
- (clobber (match_scratch:HI 2 ""))])]
+ (clobber (match_dup 2))
+ (clobber (match_dup 3))
+ (clobber (match_scratch:SI 4 ""))])]
"TARGET_80387"
- "")
+ "
+{
+ operands[2] = (rtx) assign_386_stack_local (SImode, 0);
+ operands[3] = (rtx) assign_386_stack_local (SImode, 1);
+}")
(define_insn ""
[(set (match_operand:SI 0 "general_operand" "=rm")
(fix:SI (fix:DF (match_operand:DF 1 "register_operand" "f"))))
- (clobber (match_scratch:HI 2 "=&r"))]
+ (clobber (match_operand:SI 2 "memory_operand" "m"))
+ (clobber (match_operand:SI 3 "memory_operand" "m"))
+ (clobber (match_scratch:SI 4 "=&q"))]
"TARGET_80387"
"* return (char *) output_fix_trunc (insn, operands);")
(define_insn ""
[(set (match_operand:SI 0 "general_operand" "=rm")
(fix:SI (fix:SF (match_operand:SF 1 "register_operand" "f"))))
- (clobber (match_scratch:HI 2 "=&r"))]
+ (clobber (match_operand:SI 2 "memory_operand" "m"))
+ (clobber (match_operand:SI 3 "memory_operand" "m"))
+ (clobber (match_scratch:SI 4 "=&q"))]
"TARGET_80387"
"* return (char *) output_fix_trunc (insn, operands);")
\f