OSDN Git Service

Jan Hubicka <hubicka@freesoft.cz>
[pf3gnuchains/gcc-fork.git] / gcc / config / i386 / i386.md
index 7e143ac..02256d4 100644 (file)
 (define_insn "movsf_push"
   [(set (match_operand:SF 0 "push_operand" "=<,<")
        (match_operand:SF 1 "general_operand" "*rfF,m"))]
-  "GET_CODE (operands[1]) != MEM || reload_in_progress || reload_completed"
+  "TARGET_PUSH_MEMORY || GET_CODE (operands[1]) != MEM 
+   || reload_in_progress || reload_completed"
   "*
 {
   if (STACK_REG_P (operands[1]))
   return AS1 (push%L0,%1);
 }")
 
-(define_insn "movsf_push_memory"
-  [(set (match_operand:SF 0 "push_operand" "=<")
-       (match_operand:SF 1 "memory_operand" "m"))]
-  "TARGET_PUSH_MEMORY"
-  "* return AS1 (push%L0,%1);")
+(define_split
+  [(set (match_operand:SF 0 "push_operand" "")
+        (match_operand:SF 1 "general_operand" ""))]
+  "reload_completed && STACK_REG_P (operands[1])"
+  [(set (reg:SI 7)
+        (minus:SI (reg:SI 7) (const_int 4)))
+   (set (mem:SF (reg:SI 7))
+        (match_dup 1))]
+  "")
 
 (define_expand "movsf"
   [(set (match_operand:SF 0 "general_operand" "")
 (define_insn "movdf_push"
   [(set (match_operand:DF 0 "push_operand" "=<,<")
        (match_operand:DF 1 "general_operand" "*rfF,o"))]
-  "GET_CODE (operands[1]) != MEM || reload_in_progress || reload_completed"
+  "TARGET_PUSH_MEMORY || GET_CODE (operands[1]) != MEM 
+   || reload_in_progress || reload_completed"
   "*
 {
   if (STACK_REG_P (operands[1]))
   return output_move_double (operands);
 }")
 
-(define_insn "movdf_push_memory"
-  [(set (match_operand:DF 0 "push_operand" "=<")
-       (match_operand:DF 1 "memory_operand" "o"))]
-  "TARGET_PUSH_MEMORY"
-  "* return output_move_pushmem (operands, insn, GET_MODE_SIZE (DFmode),0,0);")
+(define_split
+  [(set (match_operand:DF 0 "push_operand" "")
+        (match_operand:DF 1 "register_operand" ""))]
+  "reload_completed && STACK_REG_P (operands[1])"
+  [(set (reg:SI 7)
+        (minus:SI (reg:SI 7) (const_int 8)))
+   (set (mem:DF (reg:SI 7))
+        (match_dup 1))]
+  "")
 
 (define_expand "movdf"
   [(set (match_operand:DF 0 "general_operand" "")
 (define_insn "movxf_push"
   [(set (match_operand:XF 0 "push_operand" "=<,<")
        (match_operand:XF 1 "general_operand" "*rfF,o"))]
-  "GET_CODE (operands[1]) != MEM || reload_in_progress || reload_completed"
+  "TARGET_PUSH_MEMORY || GET_CODE (operands[1]) != MEM 
+   || reload_in_progress || reload_completed"
   "*
 {
   if (STACK_REG_P (operands[1]))
   return output_move_double (operands);
  }")
 
-(define_insn "movxf_push_memory"
-  [(set (match_operand:XF 0 "push_operand" "=<")
-       (match_operand:XF 1 "memory_operand" "o"))]
-  "TARGET_PUSH_MEMORY"
-  "* return output_move_pushmem (operands, insn, GET_MODE_SIZE (XFmode),0,0);")
+(define_split
+  [(set (match_operand:XF 0 "push_operand" "")
+        (match_operand:XF 1 "register_operand" ""))]
+  "reload_completed && STACK_REG_P (operands[1])"
+  [(set (reg:SI 7)
+        (minus:SI (reg:SI 7) (const_int 12)))
+   (set (mem:XF (reg:SI 7))
+        (match_dup 1))]
+  "")
 
 (define_expand "movxf"
   [(set (match_operand:XF 0 "general_operand" "")