aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorStan Cox <coxs@gnu.org>1997-05-29 19:41:36 +0000
committerStan Cox <coxs@gnu.org>1997-05-29 19:41:36 +0000
commitf3e10ef29e6b2b6e6d1918ce10426dcf73285825 (patch)
tree2fc56cab82620cc144d3dc6b36e630b8e09f52c6 /gcc
parentb078c5c69ca6f58eb0367c0569e426b69b03c1af (diff)
downloadgcc-f3e10ef29e6b2b6e6d1918ce10426dcf73285825.zip
gcc-f3e10ef29e6b2b6e6d1918ce10426dcf73285825.tar.gz
gcc-f3e10ef29e6b2b6e6d1918ce10426dcf73285825.tar.bz2
(movsfcc_1, movdfcc_1, movxfcc_1): Use singlemove_string
From-SVN: r14138
Diffstat (limited to 'gcc')
-rw-r--r--gcc/config/i386/i386.md58
1 files changed, 45 insertions, 13 deletions
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index b5ef6a7..e3deee5 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -7365,8 +7365,8 @@ byte_xor_operation:
[(match_dup 4)
(set (match_operand 0 "register_operand" "t")
(if_then_else:DF (match_operand 1 "comparison_operator" "")
- (match_operand:DF 2 "register_operand" "f")
- (match_operand:DF 3 "register_operand" "f")))]
+ (match_operand:DF 2 "general_operand" "")
+ (match_operand:DF 3 "general_operand" "")))]
"TARGET_CMOVE"
"
{
@@ -7377,8 +7377,8 @@ byte_xor_operation:
[(match_dup 4)
(set (match_operand 0 "register_operand" "t")
(if_then_else:XF (match_operand 1 "comparison_operator" "")
- (match_operand:XF 2 "register_operand" "f")
- (match_operand:XF 3 "register_operand" "f")))]
+ (match_operand:XF 2 "general_operand" "")
+ (match_operand:XF 3 "general_operand" "")))]
"TARGET_CMOVE"
"
{
@@ -7423,16 +7423,16 @@ byte_xor_operation:
{
xops[0] = operands[0];
xops[1] = operands[2];
- output_move_const_single (xops);
+ output_asm_insn (singlemove_string (xops), xops);
}
output_asm_insn (\"j%C1 %l4\", operands);
if (STACK_REG_P (operands[3]) || GET_CODE (operands[0]) == MEM)
output_asm_insn (AS1 (fld%z3,%y3), operands);
else
{
+ xops[0] = operands[0];
xops[1] = operands[3];
- SET_SRC (PATTERN (insn)) = XEXP (SET_SRC (PATTERN (insn)), 2);
- output_move_const_single (xops);
+ output_asm_insn (singlemove_string (xops), xops);
}
ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\", CODE_LABEL_NUMBER (operands[4]));
}
@@ -7477,16 +7477,16 @@ byte_xor_operation:
{
xops[0] = operands[0];
xops[1] = operands[2];
- output_move_const_single (xops);
+ output_asm_insn (singlemove_string (xops), xops);
}
output_asm_insn (\"j%C1 %l4\", operands);
if (STACK_REG_P (operands[3]) || GET_CODE (operands[0]) == MEM)
output_asm_insn (AS1 (fld%z3,%y3), operands);
else
{
+ xops[0] = operands[0];
xops[1] = operands[3];
- SET_SRC (PATTERN (insn)) = XEXP (SET_SRC (PATTERN (insn)), 2);
- output_move_const_single (xops);
+ output_asm_insn (singlemove_string (xops), xops);
}
ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\", CODE_LABEL_NUMBER (operands[4]));
}
@@ -7494,11 +7494,11 @@ byte_xor_operation:
}")
(define_insn "movxfcc_1"
- [(set (match_operand:XF 0 "register_operand" "=t,t")
+ [(set (match_operand:XF 0 "register_operand" "=t,=t,f,fFm")
(if_then_else:XF (match_operator 1 "comparison_operator"
[(cc0) (const_int 0)])
- (match_operand:XF 2 "register_operand" "0,f")
- (match_operand:XF 3 "register_operand" "f,0")))]
+ (match_operand:XF 2 "register_operand" "0,f,f,fFm")
+ (match_operand:XF 3 "register_operand" "f,0,f,fFm")))]
"TARGET_CMOVE"
"*
{
@@ -7512,6 +7512,38 @@ byte_xor_operation:
/* r <- cond ? r : arg */
output_asm_insn (AS2 (fcmov%F1,%2,%0), operands);
}
+ else if (which_alternative == 2)
+ {
+ /* r <- cond ? r : arg */
+ output_asm_insn (AS2 (fcmov%F1,%2,%0), operands);
+ output_asm_insn (AS2 (fcmov%f1,%3,%0), operands);
+ }
+ else if (which_alternative == 3)
+ {
+ rtx xops[2];
+
+ /* r <- cond ? arg1 : arg2 */
+ operands[4] = gen_label_rtx ();
+
+ if (STACK_REG_P (operands[2]) || GET_CODE (operands[2]) == MEM)
+ output_asm_insn (AS1 (fld%z2,%y2), operands);
+ else
+ {
+ xops[0] = operands[0];
+ xops[1] = operands[2];
+ output_asm_insn (singlemove_string (xops), xops);
+ }
+ output_asm_insn (\"j%C1 %l4\", operands);
+ if (STACK_REG_P (operands[3]) || GET_CODE (operands[0]) == MEM)
+ output_asm_insn (AS1 (fld%z3,%y3), operands);
+ else
+ {
+ xops[0] = operands[0];
+ xops[1] = operands[3];
+ output_asm_insn (singlemove_string (xops), xops);
+ }
+ ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\", CODE_LABEL_NUMBER (operands[4]));
+}
RET;
}")