Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
R
riscv-gcc-1
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lvzhengyang
riscv-gcc-1
Commits
2ae0f82c
Commit
2ae0f82c
authored
Feb 09, 1996
by
Stan Cox
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
(fp, integer): Added function units for pentium.
From-SVN: r11190
parent
d4ba09c0
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
1140 additions
and
384 deletions
+1140
-384
gcc/config/i386/i386.md
+1140
-384
No files found.
gcc/config/i386/i386.md
View file @
2ae0f82c
...
@@ -17,8 +17,7 @@
...
@@ -17,8 +17,7 @@
;; You should have received a copy of the GNU General Public License
;; You should have received a copy of the GNU General Public License
;; along with GNU CC; see the file COPYING. If not, write to
;; along with GNU CC; see the file COPYING. If not, write to
;; the Free Software Foundation, 59 Temple Place - Suite 330,
;; the Free Software Foundation, 59 Temple Place - Suite 330,
;; Boston, MA 02111-1307, USA.
;; Boston, MA 02111-1307, USA.
*
/
;; The original PO technology requires these to be ordered by speed,
;; The original PO technology requires these to be ordered by speed,
;; so that assigner will pick the fastest.
;; so that assigner will pick the fastest.
...
@@ -60,6 +59,37 @@
...
@@ -60,6 +59,37 @@
;; 2 This is a `
cos' operation. The mode of the UNSPEC is MODE_FLOAT.
;; 2 This is a `
cos' operation. The mode of the UNSPEC is MODE_FLOAT.
;; operand 0 is the argument for
`cos'.
;; operand 0 is the argument for
`cos'.
;; This shadows the processor_type enumeration, so changes must be made
;; to i386.h at the same time.
(define_attr "type" "integer,fld,fpop,fpdiv"
(const_string "integer"))
;; Functional units
;; Floating point
(define_function_unit "fp" 1 0
(and (eq_attr "type" "fpop") (eq_attr "cpu" "!pentium"))
5 5)
(define_function_unit "fp" 1 0
(and (eq_attr "type" "fpop") (eq_attr "cpu" "pentium"))
3 0)
(define_function_unit "fp" 1 0
(eq_attr "type" "fpdiv")
10 10)
(define_function_unit "fp" 1 0
(eq_attr "type" "fld")
1 0)
(define_function_unit "integer" 1 0
(and (eq_attr "type" "integer") (eq_attr "cpu" "!i386"))
2 0)
;; "movl MEM,REG / testl REG,REG" is faster on a 486 than "cmpl $0,MEM".
;; "movl MEM,REG / testl REG,REG" is faster on a 486 than "cmpl $0,MEM".
;; But restricting MEM here would mean that gcc could not remove a redundant
;; But restricting MEM here would mean that gcc could not remove a redundant
;; test in cases like "incl MEM / je TARGET".
;; test in cases like "incl MEM / je TARGET".
...
@@ -76,7 +106,7 @@
...
@@ -76,7 +106,7 @@
;; enumeration in rs6000.h.
;; enumeration in rs6000.h.
(define_attr "cpu" "i386,i486,pentium"
(define_attr "cpu" "i386,i486,pentium"
(const (symbol_ref "ix86_cpu
_attr
")))
(const (symbol_ref "ix86_cpu")))
(define_insn "tstsi_1"
(define_insn "tstsi_1"
[(set (cc0)
[(set (cc0)
...
@@ -234,7 +264,7 @@
...
@@ -234,7 +264,7 @@
return output_fp_cc0_set (insn);
return output_fp_cc0_set (insn);
}")
}")
;; Don't generate tst
d
f if generating IEEE code, since the `
ftst' opcode
;; Don't generate tst
x
f if generating IEEE code, since the `
ftst' opcode
;; isn't IEEE compliant.
;; isn't IEEE compliant.
(define_expand "tstxf"
(define_expand "tstxf"
...
@@ -352,8 +382,8 @@
...
@@ -352,8 +382,8 @@
(define_insn ""
(define_insn ""
[
(set (cc0)
[
(set (cc0)
(match_operator 2 "VOIDmode_compare_op"
(match_operator 2 "VOIDmode_compare_op"
[
(match_operand:XF 0 "
nonimmediate
_operand" "f")
[
(match_operand:XF 0 "
register
_operand" "f")
(match_operand:XF 1 "
nonimmediate
_operand" "f")]))
(match_operand:XF 1 "
register
_operand" "f")]))
(clobber (match_scratch:HI 3 "=a"))]
(clobber (match_scratch:HI 3 "=a"))]
"TARGET_80387
"TARGET_80387
&& (GET_CODE (operands
[
0
]
) != MEM || GET_CODE (operands
[
1
]
) != MEM)"
&& (GET_CODE (operands
[
0
]
) != MEM || GET_CODE (operands
[
1
]
) != MEM)"
...
@@ -459,6 +489,16 @@
...
@@ -459,6 +489,16 @@
(define_insn ""
(define_insn ""
[
(set (cc0)
[
(set (cc0)
(match_operator 2 "VOIDmode_compare_op"
[
(float_extend:DF
(match_operand:SF 0 "register_operand" "f"))
(match_operand:DF 1 "nonimmediate_operand" "fm")]))
(clobber (match_scratch:HI 3 "=a"))]
"TARGET_80387"
"
*
return output_float_compare (insn, operands);")
(define_insn ""
[
(set (cc0)
(compare:CCFPEQ (match_operand:DF 0 "register_operand" "f")
(compare:CCFPEQ (match_operand:DF 0 "register_operand" "f")
(match_operand:DF 1 "register_operand" "f")))
(match_operand:DF 1 "register_operand" "f")))
(clobber (match_scratch:HI 2 "=a"))]
(clobber (match_scratch:HI 2 "=a"))]
...
@@ -533,35 +573,38 @@
...
@@ -533,35 +573,38 @@
i386_compare_gen = gen_cmpxf_cc;
i386_compare_gen = gen_cmpxf_cc;
i386_compare_gen_eq = gen_cmpxf_ccfpeq;
i386_compare_gen_eq = gen_cmpxf_ccfpeq;
i386_compare_op0 = operands
[
0
]
;
i386_compare_op0 = operands
[
0
]
;
i386_compare_op1 = operands
[
1
]
;
i386_compare_op1 = (immediate_operand (operands
[
1
]
, XFmode))
? copy_to_mode_reg (XFmode, operands
[
1
]
) : operands
[
1
]
;
DONE;
DONE;
}")
}")
(define_expand "cmpdf"
(define_expand "cmpdf"
[
(set (cc0)
[
(set (cc0)
(compare (match_operand:DF 0 "register_operand" "")
(compare (match_operand:DF 0 "register_operand" "")
(match_operand:DF 1 "
nonimmediate
_operand" "")))]
(match_operand:DF 1 "
general
_operand" "")))]
"TARGET_80387"
"TARGET_80387"
"
"
{
{
i386_compare_gen = gen_cmpdf_cc;
i386_compare_gen = gen_cmpdf_cc;
i386_compare_gen_eq = gen_cmpdf_ccfpeq;
i386_compare_gen_eq = gen_cmpdf_ccfpeq;
i386_compare_op0 = operands
[
0
]
;
i386_compare_op0 = operands
[
0
]
;
i386_compare_op1 = operands
[
1
]
;
i386_compare_op1 = (immediate_operand (operands
[
1
]
, DFmode))
? copy_to_mode_reg (DFmode, operands
[
1
]
) : operands
[
1
]
;
DONE;
DONE;
}")
}")
(define_expand "cmpsf"
(define_expand "cmpsf"
[
(set (cc0)
[
(set (cc0)
(compare (match_operand:SF 0 "register_operand" "")
(compare (match_operand:SF 0 "register_operand" "")
(match_operand:SF 1 "
nonimmediate
_operand" "")))]
(match_operand:SF 1 "
general
_operand" "")))]
"TARGET_80387"
"TARGET_80387"
"
"
{
{
i386_compare_gen = gen_cmpsf_cc;
i386_compare_gen = gen_cmpsf_cc;
i386_compare_gen_eq = gen_cmpsf_ccfpeq;
i386_compare_gen_eq = gen_cmpsf_ccfpeq;
i386_compare_op0 = operands
[
0
]
;
i386_compare_op0 = operands
[
0
]
;
i386_compare_op1 = operands
[
1
]
;
i386_compare_op1 = (immediate_operand (operands
[
1
]
, SFmode))
? copy_to_mode_reg (SFmode, operands
[
1
]
) : operands
[
1
]
;
DONE;
DONE;
}")
}")
...
@@ -630,7 +673,7 @@
...
@@ -630,7 +673,7 @@
(define_insn ""
(define_insn ""
[
(set (cc0)
[
(set (cc0)
(and:SI (match_operand:SI 0 "general_operand" "%ro")
(and:SI (match_operand:SI 0 "general_operand" "%ro")
(match_operand:SI 1 "
general
_operand" "ri")))]
(match_operand:SI 1 "
nonmemory
_operand" "ri")))]
""
""
"
*
"
*
{
{
...
@@ -688,7 +731,7 @@
...
@@ -688,7 +731,7 @@
(define_insn ""
(define_insn ""
[
(set (cc0)
[
(set (cc0)
(and:HI (match_operand:HI 0 "general_operand" "%ro")
(and:HI (match_operand:HI 0 "general_operand" "%ro")
(match_operand:HI 1 "
general
_operand" "ri")))]
(match_operand:HI 1 "
nonmemory
_operand" "ri")))]
""
""
"
*
"
*
{
{
...
@@ -729,8 +772,8 @@
...
@@ -729,8 +772,8 @@
(define_insn ""
(define_insn ""
[
(set (cc0)
[
(set (cc0)
(and:QI (match_operand:QI 0 "
general
_operand" "%qm")
(and:QI (match_operand:QI 0 "
nonimmediate
_operand" "%qm")
(match_operand:QI 1 "
general
_operand" "qi")))]
(match_operand:QI 1 "
nonmemory
_operand" "qi")))]
""
""
"
*
"
*
{
{
...
@@ -762,7 +805,7 @@
...
@@ -762,7 +805,7 @@
(define_insn ""
(define_insn ""
[
(set (match_operand:SI 0 "push_operand" "=<")
[
(set (match_operand:SI 0 "push_operand" "=<")
(match_operand:SI 1 "
general
_operand" "ri"))]
(match_operand:SI 1 "
nonmemory
_operand" "ri"))]
"!TARGET_PUSH_MEMORY && !TARGET_MOVE"
"!TARGET_PUSH_MEMORY && !TARGET_MOVE"
"push%L0 %1")
"push%L0 %1")
...
@@ -836,7 +879,7 @@
...
@@ -836,7 +879,7 @@
(define_insn ""
(define_insn ""
[
(set (match_operand:HI 0 "push_operand" "=<")
[
(set (match_operand:HI 0 "push_operand" "=<")
(match_operand:HI 1 "
general
_operand" "ri"))]
(match_operand:HI 1 "
nonmemory
_operand" "ri"))]
"!TARGET_PUSH_MEMORY && !TARGET_MOVE"
"!TARGET_PUSH_MEMORY && !TARGET_MOVE"
"push%W0 %1")
"push%W0 %1")
...
@@ -938,13 +981,13 @@
...
@@ -938,13 +981,13 @@
;; the amount pushed up to a halfword.
;; the amount pushed up to a halfword.
(define_insn ""
(define_insn ""
[
(set (match_operand:QI 0 "push_operand" "=<")
[
(set (match_operand:QI 0 "push_operand" "=<")
(match_operand:QI 1 "
immediate
_operand" "n"))]
(match_operand:QI 1 "
const_int
_operand" "n"))]
""
""
"
*
return AS1 (push%W0,%1);")
"
*
return AS1 (push%W0,%1);")
(define_insn ""
(define_insn ""
[
(set (match_operand:QI 0 "push_operand" "=<")
[
(set (match_operand:QI 0 "push_operand" "=<")
(match_operand:QI 1 "
nonimmediate
_operand" "q"))]
(match_operand:QI 1 "
register
_operand" "q"))]
"!TARGET_MOVE"
"!TARGET_MOVE"
"
*
"
*
{
{
...
@@ -984,7 +1027,7 @@
...
@@ -984,7 +1027,7 @@
}")
}")
(define_insn ""
(define_insn ""
[
(set (match_operand:QI 0 "
general
_operand" "=q,
*
r,qm")
[
(set (match_operand:QI 0 "
nonimmediate
_operand" "=q,
*
r,qm")
(match_operand:QI 1 "general_operand" "
*
g,q,qn"))]
(match_operand:QI 1 "general_operand" "
*
g,q,qn"))]
"(!TARGET_MOVE || GET_CODE (operands
[
0
]
) != MEM) || (GET_CODE (operands
[
1
]
) != MEM)"
"(!TARGET_MOVE || GET_CODE (operands
[
0
]
) != MEM) || (GET_CODE (operands
[
1
]
) != MEM)"
"
*
"
*
...
@@ -1038,7 +1081,7 @@
...
@@ -1038,7 +1081,7 @@
}")
}")
(define_insn ""
(define_insn ""
[
(set (strict_low_part (match_operand:QI 0 "
general
_operand" "+qm,q"))
[
(set (strict_low_part (match_operand:QI 0 "
nonimmediate
_operand" "+qm,q"))
(match_operand:QI 1 "general_operand" "
*
qn,m"))]
(match_operand:QI 1 "general_operand" "
*
qn,m"))]
"(!TARGET_MOVE || GET_CODE (operands
[
0
]
) != MEM) || (GET_CODE (operands
[
1
]
) != MEM)"
"(!TARGET_MOVE || GET_CODE (operands
[
0
]
) != MEM) || (GET_CODE (operands
[
1
]
) != MEM)"
"
*
"
*
...
@@ -1089,16 +1132,28 @@
...
@@ -1089,16 +1132,28 @@
DONE;
DONE;
}
}
/
*
If we are loading a floating point constant that isn't 0 or 1
into a register,
/
*
If we are loading a floating point constant that isn't 0 or 1
indicate we need the pic register loaded. This could be optimized into stores
into a register, indicate we need the pic register loaded. This could
of constants if the target eventually moves to memory, but better safe than
be optimized into stores of constants if the target eventually moves
sorry.
*
/
to memory, but better safe than
sorry.
*
/
if (
flag_pic
if (
(reload_in_progress | reload_completed) == 0
&& GET_CODE (operands
[
0
]
) != MEM
&& GET_CODE (operands
[
0
]
) != MEM
&& GET_CODE (operands
[
1
]
) == CONST_DOUBLE
&& GET_CODE (operands
[
1
]
) == CONST_DOUBLE
&& !standard_80387_constant_p (operands
[
1
]
))
&& !standard_80387_constant_p (operands
[
1
]
))
{
{
current_function_uses_pic_offset_table = 1;
rtx insn, note, fp_const;
fp_const = force_const_mem (SFmode, operands[1]);
if (flag_pic)
current_function_uses_pic_offset_table = 1;
insn = emit_insn (gen_rtx (SET, SFmode, operands[0], fp_const));
note = find_reg_note (insn, REG_EQUAL, NULL_RTX);
if (note)
XEXP (note, 0) = operands[1];
else
REG_NOTES (insn) = gen_rtx (EXPR_LIST, REG_EQUAL, operands[1], REG_NOTES (insn));
}
}
}")
}")
...
@@ -1182,7 +1237,7 @@
...
@@ -1182,7 +1237,7 @@
;; For the purposes of regclass, prefer FLOAT_REGS.
;; For the purposes of regclass, prefer FLOAT_REGS.
(define_insn "movsf_normal"
(define_insn "movsf_normal"
[
(set (match_operand:SF 0 "
general
_operand" "=
*rfm,*
rf,f,!
*
rm")
[
(set (match_operand:SF 0 "
nonimmediate
_operand" "=
*rfm,*
rf,f,!
*
rm")
(match_operand:SF 1 "general_operand" "
*rf,*
rfm,fG,fF"))]
(match_operand:SF 1 "general_operand" "
*rf,*
rfm,fG,fF"))]
"(!TARGET_MOVE || GET_CODE (operands
[
0
]
) != MEM) || (GET_CODE (operands
[
1
]
) != MEM)"
"(!TARGET_MOVE || GET_CODE (operands
[
0
]
) != MEM) || (GET_CODE (operands
[
1
]
) != MEM)"
"
*
"
*
...
@@ -1234,7 +1289,9 @@
...
@@ -1234,7 +1289,9 @@
/
* Handle all SFmode moves not involving the 387 *
/
/
* Handle all SFmode moves not involving the 387 *
/
return singlemove_string (operands);
return singlemove_string (operands);
}")
}"
[
(set_attr "type" "fld")
]
)
(define_insn "swapsf"
(define_insn "swapsf"
[
(set (match_operand:SF 0 "register_operand" "f")
[
(set (match_operand:SF 0 "register_operand" "f")
...
@@ -1274,12 +1331,24 @@
...
@@ -1274,12 +1331,24 @@
indicate we need the pic register loaded. This could be optimized into stores
indicate we need the pic register loaded. This could be optimized into stores
of constants if the target eventually moves to memory, but better safe than
of constants if the target eventually moves to memory, but better safe than
sorry.
*
/
sorry.
*
/
if (
flag_pic
if (
(reload_in_progress | reload_completed) == 0
&& GET_CODE (operands
[
0
]
) != MEM
&& GET_CODE (operands
[
0
]
) != MEM
&& GET_CODE (operands
[
1
]
) == CONST_DOUBLE
&& GET_CODE (operands
[
1
]
) == CONST_DOUBLE
&& !standard_80387_constant_p (operands
[
1
]
))
&& !standard_80387_constant_p (operands
[
1
]
))
{
{
current_function_uses_pic_offset_table = 1;
rtx insn, note, fp_const;
fp_const = force_const_mem (DFmode, operands[1]);
if (flag_pic)
current_function_uses_pic_offset_table = 1;
insn = emit_insn (gen_rtx (SET, DFmode, operands[0], fp_const));
note = find_reg_note (insn, REG_EQUAL, NULL_RTX);
if (note)
XEXP (note, 0) = operands[1];
else
REG_NOTES (insn) = gen_rtx (EXPR_LIST, REG_EQUAL, operands[1], REG_NOTES (insn));
}
}
}")
}")
...
@@ -1353,7 +1422,7 @@
...
@@ -1353,7 +1422,7 @@
;; For the purposes of regclass, prefer FLOAT_REGS.
;; For the purposes of regclass, prefer FLOAT_REGS.
(define_insn "movdf_normal"
(define_insn "movdf_normal"
[
(set (match_operand:DF 0 "
general
_operand" "=f,fm,!
*rf,!*
rm")
[
(set (match_operand:DF 0 "
nonimmediate
_operand" "=f,fm,!
*rf,!*
rm")
(match_operand:DF 1 "general_operand" "fmG,f,
*rfm,*
rfF"))]
(match_operand:DF 1 "general_operand" "fmG,f,
*rfm,*
rfF"))]
"(!TARGET_MOVE || GET_CODE (operands
[
0
]
) != MEM) || (GET_CODE (operands
[
1
]
) != MEM)"
"(!TARGET_MOVE || GET_CODE (operands
[
0
]
) != MEM) || (GET_CODE (operands
[
1
]
) != MEM)"
"
*
"
*
...
@@ -1405,7 +1474,10 @@
...
@@ -1405,7 +1474,10 @@
/
* Handle all DFmode moves not involving the 387 *
/
/
* Handle all DFmode moves not involving the 387 *
/
return output_move_double (operands);
return output_move_double (operands);
}")
}"
[
(set_attr "type" "fld")
]
)
(define_insn "swapdf"
(define_insn "swapdf"
[
(set (match_operand:DF 0 "register_operand" "f")
[
(set (match_operand:DF 0 "register_operand" "f")
...
@@ -1441,16 +1513,28 @@
...
@@ -1441,16 +1513,28 @@
DONE;
DONE;
}
}
/
*
If we are loading a floating point constant that isn't 0 or 1
into a register,
/
*
If we are loading a floating point constant that isn't 0 or 1
indicate we need the pic register loaded. This could be optimized into stores
into a register, indicate we need the pic register loaded. This could
of constants if the target eventually moves to memory, but better safe than
be optimized into stores of constants if the target eventually moves
sorry.
*
/
to memory, but better safe than
sorry.
*
/
if (
flag_pic
if (
(reload_in_progress | reload_completed) == 0
&& GET_CODE (operands
[
0
]
) != MEM
&& GET_CODE (operands
[
0
]
) != MEM
&& GET_CODE (operands
[
1
]
) == CONST_DOUBLE
&& GET_CODE (operands
[
1
]
) == CONST_DOUBLE
&& !standard_80387_constant_p (operands
[
1
]
))
&& !standard_80387_constant_p (operands
[
1
]
))
{
{
current_function_uses_pic_offset_table = 1;
rtx insn, note, fp_const;
fp_const = force_const_mem (XFmode, operands[1]);
if (flag_pic)
current_function_uses_pic_offset_table = 1;
insn = emit_insn (gen_rtx (SET, XFmode, operands[0], fp_const));
note = find_reg_note (insn, REG_EQUAL, NULL_RTX);
if (note)
XEXP (note, 0) = operands[1];
else
REG_NOTES (insn) = gen_rtx (EXPR_LIST, REG_EQUAL, operands[1], REG_NOTES (insn));
}
}
}")
}")
...
@@ -1521,7 +1605,7 @@
...
@@ -1521,7 +1605,7 @@
"
*
return output_move_memory (operands, insn, GET_MODE_SIZE (XFmode), 2, 4);")
"
*
return output_move_memory (operands, insn, GET_MODE_SIZE (XFmode), 2, 4);")
(define_insn "movxf_normal"
(define_insn "movxf_normal"
[
(set (match_operand:XF 0 "
general
_operand" "=f,fm,!
*rf,!*
rm")
[
(set (match_operand:XF 0 "
nonimmediate
_operand" "=f,fm,!
*rf,!*
rm")
(match_operand:XF 1 "general_operand" "fmG,f,
*rfm,*
rfF"))]
(match_operand:XF 1 "general_operand" "fmG,f,
*rfm,*
rfF"))]
"(!TARGET_MOVE || GET_CODE (operands
[
0
]
) != MEM) || (GET_CODE (operands
[
1
]
) != MEM)"
"(!TARGET_MOVE || GET_CODE (operands
[
0
]
) != MEM) || (GET_CODE (operands
[
1
]
) != MEM)"
"
*
"
*
...
@@ -1576,7 +1660,7 @@
...
@@ -1576,7 +1660,7 @@
return output_move_double (operands);
return output_move_double (operands);
}")
}")
(define_insn "swapxf"
(define_insn "swapxf"
[
(set (match_operand:XF 0 "register_operand" "f")
[
(set (match_operand:XF 0 "register_operand" "f")
(match_operand:XF 1 "register_operand" "f"))
(match_operand:XF 1 "register_operand" "f"))
(set (match_dup 1)
(set (match_dup 1)
...
@@ -1629,21 +1713,36 @@
...
@@ -1629,21 +1713,36 @@
;; See comments by
`andsi' for when andl is faster than movzx.
;; See comments by
`andsi' for when andl is faster than movzx.
(define_insn "zero_extendhisi2"
(define_insn "zero_extendhisi2"
[(set (match_operand:SI 0 "general_operand" "=r")
[(set (match_operand:SI 0 "register_operand" "=r,&r,?r")
(zero_extend:SI
(zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "0,rm,rm")))]
(match_operand:HI 1 "nonimmediate_operand" "rm")))]
""
""
"*
"*
{
{
if ((TARGET_ZERO_EXTEND_WITH_AND || REGNO (operands[0]) == 0)
rtx xops[2];
if ((TARGET_ZERO_EXTEND_WITH_AND || REGNO (operands[0]) == 0)
&& REG_P (operands[1]) && REGNO (operands[0]) == REGNO (operands[1]))
&& REG_P (operands[1]) && REGNO (operands[0]) == REGNO (operands[1]))
{
{
rtx xops[2];
xops[0] = operands[0];
xops[0] = operands[0];
xops[1] = GEN_INT (0xffff);
xops[1] = GEN_INT (0xffff);
output_asm_insn (AS2 (and%L0,%1,%k0), xops);
output_asm_insn (AS2 (and%L0,%1,%k0), xops);
RET;
RET;
}
}
if (TARGET_ZERO_EXTEND_WITH_AND && !reg_overlap_mentioned_p (operands[0], operands[1]))
{
output_asm_insn (AS2 (xor%L0,%0,%0),operands);
output_asm_insn (AS2 (mov%W0,%1,%w0),operands);
RET;
}
if (TARGET_ZERO_EXTEND_WITH_AND)
{
xops[0] = operands[0];
xops[1] = gen_rtx (CONST_INT, VOIDmode, 0xffff);
output_asm_insn (AS2 (mov%W0,%1,%w0),operands);
output_asm_insn (AS2 (and%L0,%1,%k0), xops);
RET;
}
#ifdef INTEL_SYNTAX
#ifdef INTEL_SYNTAX
return AS2 (movzx,%1,%0);
return AS2 (movzx,%1,%0);
...
@@ -1652,23 +1751,62 @@
...
@@ -1652,23 +1751,62 @@
#endif
#endif
}")
}")
(define_split
[(set (match_operand:SI 0 "register_operand" "")
(zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "")))]
"reload_completed && TARGET_ZERO_EXTEND_WITH_AND && !reg_overlap_mentioned_p (operands[0], operands[1])"
[(set (match_dup 0)
(const_int 0))
(set (strict_low_part (match_dup 2))
(match_dup 1))]
"operands[2] = gen_rtx (REG, HImode, REGNO (operands[0]));")
(define_split
[(set (match_operand:SI 0 "register_operand" "")
(zero_extend:SI (match_operand:HI 1 "memory_operand" "")))]
"reload_completed && TARGET_ZERO_EXTEND_WITH_AND && reg_overlap_mentioned_p (operands[0], operands[1])"
[(set (strict_low_part (match_dup 2))
(match_dup 1))
(set (match_dup 0)
(and:SI (match_dup 0)
(const_int 65535)))]
"operands[2] = gen_rtx (REG, HImode, REGNO (operands[0]));")
(define_insn "zero_extendqihi2"
(define_insn "zero_extendqihi2"
[(set (match_operand:HI 0 "general_operand" "=r")
[(set (match_operand:HI 0 "register_operand" "=q,&q,?r")
(zero_extend:HI
(zero_extend:HI (match_operand:QI 1 "nonimmediate_operand" "0,qm,qm")))]
(match_operand:QI 1 "nonimmediate_operand" "qm")))]
""
""
"*
"*
{
{
rtx xops[2];
if ((TARGET_ZERO_EXTEND_WITH_AND || REGNO (operands[0]) == 0)
if ((TARGET_ZERO_EXTEND_WITH_AND || REGNO (operands[0]) == 0)
&& REG_P (operands[1]) && REGNO (operands[0]) == REGNO (operands[1]))
&& REG_P (operands[1])
&& REGNO (operands[0]) == REGNO (operands[1]))
{
{
rtx xops[2];
xops[0] = operands[0];
xops[0] = operands[0];
xops[1] = GEN_INT (0xff);
xops[1] = GEN_INT (0xff);
output_asm_insn (AS2 (and%L0,%1,%k0), xops);
output_asm_insn (AS2 (and%L0,%1,%k0), xops);
RET;
RET;
}
}
if (TARGET_ZERO_EXTEND_WITH_AND && QI_REG_P (operands[0]))
{
if(!reg_overlap_mentioned_p(operands[0],operands[1]))
{
output_asm_insn (AS2 (xor%L0,%k0,%k0), operands);
output_asm_insn (AS2 (mov%B0,%1,%b0), operands);
}
else
{
xops[0] = operands[0];
xops[1] = gen_rtx (CONST_INT, VOIDmode, 0xff);
output_asm_insn (AS2 (mov%B0,%1,%b0),operands);
output_asm_insn (AS2 (and%L0,%1,%k0), xops);
}
RET;
}
#ifdef INTEL_SYNTAX
#ifdef INTEL_SYNTAX
return AS2 (movzx,%1,%0);
return AS2 (movzx,%1,%0);
#else
#else
...
@@ -1676,22 +1814,84 @@
...
@@ -1676,22 +1814,84 @@
#endif
#endif
}")
}")
(define_split
[(set (match_operand:HI 0 "register_operand" "")
(zero_extend:HI (match_operand:QI 1 "nonimmediate_operand" "")))]
"reload_completed && QI_REG_P (operands[0]) && TARGET_ZERO_EXTEND_WITH_AND
&& !reg_overlap_mentioned_p (operands[0], operands[1])"
[(set (match_dup 0)
(const_int 0))
(set (strict_low_part (match_dup 2))
(match_dup 1))]
"operands[2] = gen_rtx (REG, QImode, REGNO (operands[0]));")
(define_split
[(set (match_operand:HI 0 "register_operand" "")
(zero_extend:HI (match_operand:QI 1 "memory_operand" "")))]
"reload_completed && QI_REG_P (operands[0]) && TARGET_ZERO_EXTEND_WITH_AND
&& reg_overlap_mentioned_p (operands[0], operands[1])"
[(set (strict_low_part (match_dup 2))
(match_dup 1))
(set (match_dup 0)
(and:HI (match_dup 0)
(const_int 255)))]
"operands[2] = gen_rtx (REG, QImode, REGNO (operands[0]));")
(define_split
[(set (match_operand:HI 0 "register_operand" "")
(zero_extend:HI (match_operand:QI 1 "register_operand" "")))]
"reload_completed && TARGET_ZERO_EXTEND_WITH_AND && REGNO (operands[0]) != REGNO (operands[1])"
[(set (match_dup 0)
(match_dup 2))
(set (match_dup 0)
(and:HI (match_dup 0)
(const_int 255)))]
"operands[2] = gen_rtx (REG, HImode, REGNO (operands[1]));")
(define_insn "zero_extendqisi2"
(define_insn "zero_extendqisi2"
[(set (match_operand:SI 0 "general_operand" "=r")
[(set (match_operand:SI 0 "register_operand" "=q,&q,?r")
(zero_extend:SI
(zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "0,qm,qm")))]
(match_operand:QI 1 "nonimmediate_operand" "qm")))]
""
""
"*
"*
{
{
rtx xops[2];
if ((TARGET_ZERO_EXTEND_WITH_AND || REGNO (operands[0]) == 0)
if ((TARGET_ZERO_EXTEND_WITH_AND || REGNO (operands[0]) == 0)
&& REG_P (operands[1]) && REGNO (operands[0]) == REGNO (operands[1]))
&& REG_P (operands[1])
&& REGNO (operands[0]) == REGNO (operands[1]))
{
{
rtx xops[2];
xops[0] = operands[0];
xops[0] = operands[0];
xops[1] = GEN_INT (0xff);
xops[1] = GEN_INT (0xff);
output_asm_insn (AS2 (and%L0,%1,%k0), xops);
output_asm_insn (AS2 (and%L0,%1,%k0), xops);
RET;
RET;
}
}
if (TARGET_ZERO_EXTEND_WITH_AND && QI_REG_P (operands[0]))
{
if(!reg_overlap_mentioned_p (operands[0], operands[1]))
{
output_asm_insn (AS2 (xor%L0,%0,%0),operands);
output_asm_insn (AS2 (mov%B0,%1,%b0),operands);
}
else
{
xops[0] = operands[0];
xops[1] = gen_rtx (CONST_INT, VOIDmode, 0xff);
output_asm_insn (AS2 (mov%B0,%1,%b0), operands);
output_asm_insn (AS2 (and%L0,%1,%k0), xops);
}
RET;
}
if (TARGET_ZERO_EXTEND_WITH_AND && GET_CODE (operands[1]) == REG)
{
xops[0] = operands[0];
xops[1] = gen_rtx (CONST_INT, VOIDmode, 0xff);
operands[1] = gen_rtx (REG, SImode, REGNO (operands[1]));
output_asm_insn (AS2 (mov%L0,%1,%0), operands);
output_asm_insn (AS2 (and%L0,%1,%k0), xops);
RET;
}
#ifdef INTEL_SYNTAX
#ifdef INTEL_SYNTAX
return AS2 (movzx,%1,%0);
return AS2 (movzx,%1,%0);
...
@@ -1700,23 +1900,76 @@
...
@@ -1700,23 +1900,76 @@
#endif
#endif
}")
}")
(define_split
[(set (match_operand:SI 0 "register_operand" "")
(zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "")))]
"reload_completed && QI_REG_P (operands[0]) && TARGET_ZERO_EXTEND_WITH_AND
&& !reg_overlap_mentioned_p (operands[0], operands[1])"
[(set (match_dup 0)
(const_int 0))
(set (strict_low_part (match_dup 2))
(match_dup 1))]
"operands[2] = gen_rtx (REG, QImode, REGNO (operands[0]));")
(define_split
[(set (match_operand:SI 0 "register_operand" "")
(zero_extend:SI (match_operand:QI 1 "memory_operand" "")))]
"reload_completed && QI_REG_P (operands[0]) && TARGET_ZERO_EXTEND_WITH_AND
&& reg_overlap_mentioned_p (operands[0], operands[1])"
[(set (strict_low_part (match_dup 2))
(match_dup 1))
(set (match_dup 0)
(and:SI (match_dup 0)
(const_int 255)))]
"operands[2] = gen_rtx (REG, QImode, REGNO (operands[0]));")
(define_split
[(set (match_operand:SI 0 "register_operand" "")
(zero_extend:SI (match_operand:QI 1 "register_operand" "")))]
"reload_completed && TARGET_ZERO_EXTEND_WITH_AND && REGNO (operands[0]) != REGNO (operands[1])"
[(set (match_dup 0)
(match_dup 2))
(set (match_dup 0)
(and:SI (match_dup 0)
(const_int 255)))]
"operands[2] = gen_rtx (REG, SImode, REGNO (operands[1]));")
(define_insn "zero_extendsidi2"
(define_insn "zero_extendsidi2"
[(set (match_operand:DI 0 "register_operand" "=r")
[(set (match_operand:DI 0 "nonimmediate_operand" "=r,?r,?m")
(zero_extend:DI
(zero_extend:DI (match_operand:SI 1 "register_operand" "0,rm,r")))]
(match_operand:SI 1 "register_operand" "0")))]
""
""
"*
"*
{
{
operands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
rtx high[2], low[2], xops[4];
return AS2 (xor%L0,%0,%0);
if (REG_P (operands[0]) && REG_P (operands[1])
&& REGNO (operands[0]) == REGNO (operands[1]))
{
operands[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
return AS2 (xor%L0,%0,%0);
}
split_di (operands, 1, low, high);
xops[0] = low[0];
xops[1] = operands[1];
xops[2] = high[0];
xops[3] = const0_rtx;
output_asm_insn (AS2 (mov%L0,%1,%0), xops);
if (GET_CODE (low[0]) == MEM)
output_asm_insn (AS2 (mov%L2,%3,%2), xops);
else
output_asm_insn (AS2 (xor%L2,%2,%2), xops);
RET;
}")
}")
;;- sign extension instructions
;;- sign extension instructions
(define_insn "extendsidi2"
(define_insn "extendsidi2"
[(set (match_operand:DI 0 "register_operand" "=r")
[(set (match_operand:DI 0 "register_operand" "=r")
(sign_extend:DI
(sign_extend:DI (match_operand:SI 1 "register_operand" "0")))]
(match_operand:SI 1 "register_operand" "0")))]
""
""
"*
"*
{
{
...
@@ -1742,9 +1995,8 @@
...
@@ -1742,9 +1995,8 @@
;; We use what the Unix assembler expects.
;; We use what the Unix assembler expects.
(define_insn "extendhisi2"
(define_insn "extendhisi2"
[(set (match_operand:SI 0 "general_operand" "=r")
[(set (match_operand:SI 0 "register_operand" "=r")
(sign_extend:SI
(sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "rm")))]
(match_operand:HI 1 "nonimmediate_operand" "rm")))]
""
""
"*
"*
{
{
...
@@ -1764,9 +2016,8 @@
...
@@ -1764,9 +2016,8 @@
}")
}")
(define_insn "extendqihi2"
(define_insn "extendqihi2"
[(set (match_operand:HI 0 "general_operand" "=r")
[(set (match_operand:HI 0 "register_operand" "=r")
(sign_extend:HI
(sign_extend:HI (match_operand:QI 1 "nonimmediate_operand" "qm")))]
(match_operand:QI 1 "nonimmediate_operand" "qm")))]
""
""
"*
"*
{
{
...
@@ -1782,9 +2033,8 @@
...
@@ -1782,9 +2033,8 @@
}")
}")
(define_insn "extendqisi2"
(define_insn "extendqisi2"
[(set (match_operand:SI 0 "general_operand" "=r")
[(set (match_operand:SI 0 "register_operand" "=r")
(sign_extend:SI
(sign_extend:SI (match_operand:QI 1 "nonimmediate_operand" "qm")))]
(match_operand:QI 1 "nonimmediate_operand" "qm")))]
""
""
"*
"*
{
{
...
@@ -1794,13 +2044,72 @@
...
@@ -1794,13 +2044,72 @@
return AS2 (movs%B0%L0,%1,%0);
return AS2 (movs%B0%L0,%1,%0);
#endif
#endif
}")
}")
;; Truncation of long long -> 32 bit
(define_expand "truncdisi2"
[(set (match_operand:SI 0 "nonimmediate_operand" "=r,m")
(truncate:SI (match_operand:DI 1 "nonimmediate_operand" "ro,r")))]
""
"
{
/* Don't generate memory->memory moves, go through a register */
if (TARGET_MOVE
&& (reload_in_progress | reload_completed) == 0
&& GET_CODE (operands[0]) == MEM
&& GET_CODE (operands[1]) == MEM)
{
rtx target = gen_reg_rtx (SImode);
emit_insn (gen_truncdisi2 (target, operands[1]));
emit_move_insn (operands[0], target);
DONE;
}
}")
(define_insn ""
[(set (match_operand:SI 0 "nonimmediate_operand" "=r,m")
(truncate:SI (match_operand:DI 1 "nonimmediate_operand" "ro,r")))]
"(!TARGET_MOVE || GET_CODE (operands[0]) != MEM) || (GET_CODE (operands[1]) != MEM)"
"*
{
rtx low[2], high[2], xops[2];
split_di (&operands[1], 1, low, high);
xops[0] = operands[0];
xops[1] = low[0];
if (!rtx_equal_p (xops[0], xops[1]))
output_asm_insn (AS2 (mov%L0,%1,%0), xops);
RET;
}")
(define_insn ""
[(set (match_operand:SI 0 "nonimmediate_operand" "=r,m")
(truncate:SI (lshiftrt:DI (match_operand:DI 1 "nonimmediate_operand" "ro,r")
(const_int 32))))]
"(!TARGET_MOVE || GET_CODE (operands[0]) != MEM) || (GET_CODE (operands[1]) != MEM)"
"*
{
rtx low[2], high[2], xops[2];
split_di (&operands[1], 1, low, high);
xops[0] = operands[0];
xops[1] = high[0];
if (!rtx_equal_p (xops[0], xops[1]))
output_asm_insn (AS2 (mov%L0,%1,%0), xops);
RET;
}")
;; Conversions between float and double.
;; Conversions between float and double.
(define_insn "extendsfdf2"
(define_insn "extendsfdf2"
[(set (match_operand:DF 0 "
general
_operand" "=fm,f")
[(set (match_operand:DF 0 "
nonimmediate
_operand" "=fm,f")
(float_extend:DF
(float_extend:DF
(match_operand:SF 1 "
general
_operand" "f,fm")))]
(match_operand:SF 1 "
nonimmediate
_operand" "f,fm")))]
"TARGET_80387"
"TARGET_80387"
"*
"*
{
{
...
@@ -1833,9 +2142,9 @@
...
@@ -1833,9 +2142,9 @@
}")
}")
(define_insn "extenddfxf2"
(define_insn "extenddfxf2"
[(set (match_operand:XF 0 "
general
_operand" "=fm,f,f,!*r")
[(set (match_operand:XF 0 "
nonimmediate
_operand" "=fm,f,f,!*r")
(float_extend:XF
(float_extend:XF
(match_operand:DF 1 "
general
_operand" "f,fm,!*r,f")))]
(match_operand:DF 1 "
nonimmediate
_operand" "f,fm,!*r,f")))]
"TARGET_80387"
"TARGET_80387"
"*
"*
{
{
...
@@ -1868,9 +2177,9 @@
...
@@ -1868,9 +2177,9 @@
}")
}")
(define_insn "extendsfxf2"
(define_insn "extendsfxf2"
[(set (match_operand:XF 0 "
general
_operand" "=fm,f,f,!*r")
[(set (match_operand:XF 0 "
nonimmediate
_operand" "=fm,f,f,!*r")
(float_extend:XF
(float_extend:XF
(match_operand:SF 1 "
general
_operand" "f,fm,!*r,f")))]
(match_operand:SF 1 "
nonimmediate
_operand" "f,fm,!*r,f")))]
"TARGET_80387"
"TARGET_80387"
"*
"*
{
{
...
@@ -1945,7 +2254,7 @@
...
@@ -1945,7 +2254,7 @@
}")
}")
(define_insn "truncxfsf2"
(define_insn "truncxfsf2"
[(set (match_operand:SF 0 "
general
_operand" "=m,!*r")
[(set (match_operand:SF 0 "
nonimmediate
_operand" "=m,!*r")
(float_truncate:SF
(float_truncate:SF
(match_operand:XF 1 "register_operand" "f,f")))]
(match_operand:XF 1 "register_operand" "f,f")))]
"TARGET_80387"
"TARGET_80387"
...
@@ -1978,7 +2287,7 @@
...
@@ -1978,7 +2287,7 @@
}")
}")
(define_insn "truncxfdf2"
(define_insn "truncxfdf2"
[(set (match_operand:DF 0 "
general
_operand" "=m,!*r")
[(set (match_operand:DF 0 "
nonimmediate
_operand" "=m,!*r")
(float_truncate:DF
(float_truncate:DF
(match_operand:XF 1 "register_operand" "f,f")))]
(match_operand:XF 1 "register_operand" "f,f")))]
"TARGET_80387"
"TARGET_80387"
...
@@ -2139,7 +2448,7 @@
...
@@ -2139,7 +2448,7 @@
;; These match a signed conversion of either DFmode or SFmode to DImode.
;; These match a signed conversion of either DFmode or SFmode to DImode.
(define_insn ""
(define_insn ""
[(set (match_operand:DI 0 "
general
_operand" "=rm")
[(set (match_operand:DI 0 "
nonimmediate
_operand" "=rm")
(fix:DI (fix:XF (match_operand:XF 1 "register_operand" "f"))))
(fix:DI (fix:XF (match_operand:XF 1 "register_operand" "f"))))
(clobber (match_dup 1))
(clobber (match_dup 1))
(clobber (match_operand:SI 2 "memory_operand" "m"))
(clobber (match_operand:SI 2 "memory_operand" "m"))
...
@@ -2149,7 +2458,7 @@
...
@@ -2149,7 +2458,7 @@
"* return output_fix_trunc (insn, operands);")
"* return output_fix_trunc (insn, operands);")
(define_insn ""
(define_insn ""
[(set (match_operand:DI 0 "
general
_operand" "=rm")
[(set (match_operand:DI 0 "
nonimmediate
_operand" "=rm")
(fix:DI (fix:DF (match_operand:DF 1 "register_operand" "f"))))
(fix:DI (fix:DF (match_operand:DF 1 "register_operand" "f"))))
(clobber (match_dup 1))
(clobber (match_dup 1))
(clobber (match_operand:SI 2 "memory_operand" "m"))
(clobber (match_operand:SI 2 "memory_operand" "m"))
...
@@ -2159,7 +2468,7 @@
...
@@ -2159,7 +2468,7 @@
"* return output_fix_trunc (insn, operands);")
"* return output_fix_trunc (insn, operands);")
(define_insn ""
(define_insn ""
[(set (match_operand:DI 0 "
general
_operand" "=rm")
[(set (match_operand:DI 0 "
nonimmediate
_operand" "=rm")
(fix:DI (fix:SF (match_operand:SF 1 "register_operand" "f"))))
(fix:DI (fix:SF (match_operand:SF 1 "register_operand" "f"))))
(clobber (match_dup 1))
(clobber (match_dup 1))
(clobber (match_operand:SI 2 "memory_operand" "m"))
(clobber (match_operand:SI 2 "memory_operand" "m"))
...
@@ -2213,7 +2522,7 @@
...
@@ -2213,7 +2522,7 @@
}")
}")
(define_insn ""
(define_insn ""
[(set (match_operand:SI 0 "
general
_operand" "=rm")
[(set (match_operand:SI 0 "
nonimmediate
_operand" "=rm")
(fix:SI (fix:XF (match_operand:XF 1 "register_operand" "f"))))
(fix:SI (fix:XF (match_operand:XF 1 "register_operand" "f"))))
(clobber (match_operand:SI 2 "memory_operand" "m"))
(clobber (match_operand:SI 2 "memory_operand" "m"))
(clobber (match_operand:SI 3 "memory_operand" "m"))
(clobber (match_operand:SI 3 "memory_operand" "m"))
...
@@ -2222,7 +2531,7 @@
...
@@ -2222,7 +2531,7 @@
"* return output_fix_trunc (insn, operands);")
"* return output_fix_trunc (insn, operands);")
(define_insn ""
(define_insn ""
[(set (match_operand:SI 0 "
general
_operand" "=rm")
[(set (match_operand:SI 0 "
nonimmediate
_operand" "=rm")
(fix:SI (fix:DF (match_operand:DF 1 "register_operand" "f"))))
(fix:SI (fix:DF (match_operand:DF 1 "register_operand" "f"))))
(clobber (match_operand:SI 2 "memory_operand" "m"))
(clobber (match_operand:SI 2 "memory_operand" "m"))
(clobber (match_operand:SI 3 "memory_operand" "m"))
(clobber (match_operand:SI 3 "memory_operand" "m"))
...
@@ -2231,7 +2540,7 @@
...
@@ -2231,7 +2540,7 @@
"* return output_fix_trunc (insn, operands);")
"* return output_fix_trunc (insn, operands);")
(define_insn ""
(define_insn ""
[(set (match_operand:SI 0 "
general
_operand" "=rm")
[(set (match_operand:SI 0 "
nonimmediate
_operand" "=rm")
(fix:SI (fix:SF (match_operand:SF 1 "register_operand" "f"))))
(fix:SI (fix:SF (match_operand:SF 1 "register_operand" "f"))))
(clobber (match_operand:SI 2 "memory_operand" "m"))
(clobber (match_operand:SI 2 "memory_operand" "m"))
(clobber (match_operand:SI 3 "memory_operand" "m"))
(clobber (match_operand:SI 3 "memory_operand" "m"))
...
@@ -2284,7 +2593,7 @@
...
@@ -2284,7 +2593,7 @@
(define_insn ""
(define_insn ""
[(set (match_operand:XF 0 "register_operand" "=f")
[(set (match_operand:XF 0 "register_operand" "=f")
(float:XF (match_operand:DI 1 "
general
_operand" "rm")))]
(float:XF (match_operand:DI 1 "
nonimmediate
_operand" "rm")))]
"TARGET_80387"
"TARGET_80387"
"*
"*
{
{
...
@@ -2352,7 +2661,7 @@
...
@@ -2352,7 +2661,7 @@
(define_insn ""
(define_insn ""
[(set (match_operand:XF 0 "register_operand" "=f,f")
[(set (match_operand:XF 0 "register_operand" "=f,f")
(float:XF (match_operand:SI 1 "
general
_operand" "m,!*r")))]
(float:XF (match_operand:SI 1 "
nonimmediate
_operand" "m,!*r")))]
"TARGET_80387"
"TARGET_80387"
"*
"*
{
{
...
@@ -2386,6 +2695,102 @@
...
@@ -2386,6 +2695,102 @@
;;- add instructions
;;- add instructions
(define_insn "addsidi3_1"
[(set (match_operand:DI 0 "nonimmediate_operand" "=&r,r,o,&r,r,o,o")
(plus:DI (match_operand:DI 1 "general_operand" "0,0,0,o,riF,riF,o")
(zero_extend:DI (match_operand:SI 2 "general_operand" "o,ri,ri,roi,roi,ri,ri"))))
(clobber (match_scratch:SI 3 "=X,X,X,X,X,X,&r"))]
""
"*
{
rtx low[3], high[3], xops[7], temp;
CC_STATUS_INIT;
split_di (operands, 2, low, high);
high[2] = const0_rtx;
low[2] = operands[2];
if (!rtx_equal_p (operands[0], operands[1]))
{
xops[0] = high[0];
xops[1] = low[0];
xops[2] = high[1];
xops[3] = low[1];
if (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)
{
output_asm_insn (AS2 (mov%L1,%3,%1), xops);
output_asm_insn (AS2 (mov%L0,%2,%0), xops);
}
else
{
xops[4] = high[2];
xops[5] = low[2];
xops[6] = operands[3];
output_asm_insn (AS2 (mov%L6,%3,%6), xops);
output_asm_insn (AS2 (add%L6,%5,%6), xops);
output_asm_insn (AS2 (mov%L1,%6,%1), xops);
output_asm_insn (AS2 (mov%L6,%2,%6), xops);
output_asm_insn (AS2 (adc%L6,%4,%6), xops);
output_asm_insn (AS2 (mov%L0,%6,%0), xops);
RET;
}
}
output_asm_insn (AS2 (add%L0,%2,%0), low);
output_asm_insn (AS2 (adc%L0,%2,%0), high);
RET;
}")
(define_insn "addsidi3_2"
[(set (match_operand:DI 0 "nonimmediate_operand" "=&r,r,o,&r,r,o,o")
(plus:DI (zero_extend:DI (match_operand:SI 2 "general_operand" "o,ri,ri,o,ri,ri,ri"))
(match_operand:DI 1 "general_operand" "0,0,0,roiF,roiF,riF,o")))
(clobber (match_scratch:SI 3 "=X,X,X,X,X,X,&r"))]
""
"*
{
rtx low[3], high[3], xops[7], temp;
CC_STATUS_INIT;
split_di (operands, 2, low, high);
high[2] = const0_rtx;
low[2] = operands[2];
if (!rtx_equal_p (operands[0], operands[1]))
{
xops[0] = high[0];
xops[1] = low[0];
xops[2] = high[1];
xops[3] = low[1];
if (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)
{
output_asm_insn (AS2 (mov%L1,%3,%1), xops);
output_asm_insn (AS2 (mov%L0,%2,%0), xops);
}
else
{
xops[4] = high[2];
xops[5] = low[2];
xops[6] = operands[3];
output_asm_insn (AS2 (mov%L6,%3,%6), xops);
output_asm_insn (AS2 (add%L6,%5,%6), xops);
output_asm_insn (AS2 (mov%L1,%6,%1), xops);
output_asm_insn (AS2 (mov%L6,%2,%6), xops);
output_asm_insn (AS2 (adc%L6,%4,%6), xops);
output_asm_insn (AS2 (mov%L0,%6,%0), xops);
RET;
}
}
output_asm_insn (AS2 (add%L0,%2,%0), low);
output_asm_insn (AS2 (adc%L0,%2,%0), high);
RET;
}")
(define_insn "adddi3"
(define_insn "adddi3"
[(set (match_operand:DI 0 "general_operand" "=&r,ro,o,&r,ro,o,&r,o,o,o")
[(set (match_operand:DI 0 "general_operand" "=&r,ro,o,&r,ro,o,&r,o,o,o")
(plus:DI (match_operand:DI 1 "general_operand" "%0,0,0,o,riF,o,or,riF,riF,o")
(plus:DI (match_operand:DI 1 "general_operand" "%0,0,0,o,riF,o,or,riF,riF,o")
...
@@ -2462,14 +2867,23 @@
...
@@ -2462,14 +2867,23 @@
;; On a 486, it is faster to do movl/addl than to do a single leal if
;; On a 486, it is faster to do movl/addl than to do a single leal if
;; operands[1] and operands[2] are both registers.
;; operands[1] and operands[2] are both registers.
(define_
insn
"addsi3"
(define_
expand
"addsi3"
[(set (match_operand:SI 0 "
general_operand" "=?r,rm,r
")
[(set (match_operand:SI 0 "
nonimmediate_operand" "
")
(plus:SI (match_operand:SI 1 "
general_operand" "%r,0,0
")
(plus:SI (match_operand:SI 1 "
nonimmediate_operand" "
")
(match_operand:SI 2 "general_operand" "
ri,ri,rm
")))]
(match_operand:SI 2 "general_operand" "")))]
""
""
"IX86_EXPAND_BINARY_OPERATOR (PLUS, SImode, operands);")
(define_insn ""
[(set (match_operand:SI 0 "nonimmediate_operand" "=r,rm,r")
(plus:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,r")
(match_operand:SI 2 "general_operand" "rmi,ri,ri")))]
"ix86_binary_operator_ok (PLUS, SImode, operands)"
"*
"*
{
{
if (REG_P (operands[0]) && REGNO (operands[0]) != REGNO (operands[1]))
if (REG_P (operands[0]) && REG_P (operands[1])
&& (REG_P (operands[2]) || GET_CODE (operands[2]) == CONST_INT)
&& REGNO (operands[0]) != REGNO (operands[1]))
{
{
if (REG_P (operands[2]) && REGNO (operands[0]) == REGNO (operands[2]))
if (REG_P (operands[2]) && REGNO (operands[0]) == REGNO (operands[2]))
return AS2 (add%L0,%1,%0);
return AS2 (add%L0,%1,%0);
...
@@ -2489,10 +2903,11 @@
...
@@ -2489,10 +2903,11 @@
operands[1] = SET_SRC (PATTERN (insn));
operands[1] = SET_SRC (PATTERN (insn));
return AS2 (lea%L0,%a1,%0);
return AS2 (lea%L0,%a1,%0);
}
}
output_asm_insn (AS2 (mov%L0,%1,%0), operands);
}
}
if (!rtx_equal_p (operands[0], operands[1]))
output_asm_insn (AS2 (mov%L0,%1,%0), operands);
if (operands[2] == const1_rtx)
if (operands[2] == const1_rtx)
return AS1 (inc%L0,%0);
return AS1 (inc%L0,%0);
...
@@ -2502,15 +2917,51 @@
...
@@ -2502,15 +2917,51 @@
return AS2 (add%L0,%2,%0);
return AS2 (add%L0,%2,%0);
}")
}")
;; addsi3 is faster, so put this after.
(define_insn "movsi_lea"
[(set (match_operand:SI 0 "register_operand" "=r")
(match_operand:QI 1 "address_operand" "p"))]
""
"*
{
/* Adding a constant to a register is faster with an add. */
/* ??? can this ever happen? */
if (GET_CODE (operands[1]) == PLUS
&& GET_CODE (XEXP (operands[1], 1)) == CONST_INT
&& rtx_equal_p (operands[0], XEXP (operands[1], 0)))
{
operands[1] = XEXP (operands[1], 1);
if (operands[1] == const1_rtx)
return AS1 (inc%L0,%0);
if (operands[1] == constm1_rtx)
return AS1 (dec%L0,%0);
return AS2 (add%L0,%1,%0);
}
CC_STATUS_INIT;
return AS2 (lea%L0,%a1,%0);
}")
;; ??? `
lea' here, for three operand add? If leaw is used, only %bx,
;; ??? `
lea' here, for three operand add? If leaw is used, only %bx,
;; %si and %di can appear in SET_SRC, and output_asm_insn might not be
;; %si and %di can appear in SET_SRC, and output_asm_insn might not be
;; able to handle the operand. But leal always works?
;; able to handle the operand. But leal always works?
(define_
insn
"addhi3"
(define_
expand
"addhi3"
[
(set (match_operand:HI 0 "general_operand" "
=rm,r
")
[
(set (match_operand:HI 0 "general_operand" "")
(plus:HI (match_operand:HI 1 "
general_operand" "%0,0
")
(plus:HI (match_operand:HI 1 "
nonimmediate_operand" "
")
(match_operand:HI 2 "general_operand" "
ri,rm
")))]
(match_operand:HI 2 "general_operand" "")))]
""
""
"IX86_EXPAND_BINARY_OPERATOR (PLUS, HImode, operands);")
(define_insn ""
[
(set (match_operand:HI 0 "nonimmediate_operand" "=rm,r")
(plus:HI (match_operand:HI 1 "nonimmediate_operand" "%0,0")
(match_operand:HI 2 "general_operand" "ri,rm")))]
"ix86_binary_operator_ok (PLUS, HImode, operands)"
"
*
"
*
{
{
/
* ??? what about offsettable memory references? *
/
/
* ??? what about offsettable memory references? *
/
...
@@ -2541,11 +2992,18 @@
...
@@ -2541,11 +2992,18 @@
return AS2 (add%W0,%2,%0);
return AS2 (add%W0,%2,%0);
}")
}")
(define_
insn
"addqi3"
(define_
expand
"addqi3"
[
(set (match_operand:QI 0 "general_operand" "
=qm,q
")
[
(set (match_operand:QI 0 "general_operand" "")
(plus:QI (match_operand:QI 1 "general_operand" "
%0,0
")
(plus:QI (match_operand:QI 1 "general_operand" "")
(match_operand:QI 2 "general_operand" "
qn,qmn
")))]
(match_operand:QI 2 "general_operand" "")))]
""
""
"IX86_EXPAND_BINARY_OPERATOR (PLUS, QImode, operands);")
(define_insn ""
[
(set (match_operand:QI 0 "nonimmediate_operand" "=qm,q")
(plus:QI (match_operand:QI 1 "nonimmediate_operand" "%0,0")
(match_operand:QI 2 "general_operand" "qn,qmn")))]
"ix86_binary_operator_ok (PLUS, QImode, operands)"
"
*
"
*
{
{
if (operands
[
2
]
== const1_rtx)
if (operands
[
2
]
== const1_rtx)
...
@@ -2569,8 +3027,8 @@
...
@@ -2569,8 +3027,8 @@
;
;
;(define_insn ""
;(define_insn ""
;
[
(set (match_operand:SI 0 "push_operand" "=<")
;
[
(set (match_operand:SI 0 "push_operand" "=<")
; (plus:SI (match_operand:SI 1 "
general
_operand" "%r")
; (plus:SI (match_operand:SI 1 "
register
_operand" "%r")
; (match_operand:SI 2 "
general
_operand" "ri")))]
; (match_operand:SI 2 "
nonmemory
_operand" "ri")))]
; ""
; ""
; "
*
; "
*
;{
;{
...
@@ -2584,40 +3042,12 @@
...
@@ -2584,40 +3042,12 @@
; RET;
; RET;
;}")
;}")
;; addsi3 is faster, so put this after.
(define_insn "movsi_lea"
[
(set (match_operand:SI 0 "register_operand" "=r")
(match_operand:QI 1 "address_operand" "p"))]
""
"
*
{
CC_STATUS_INIT;
/
* Adding a constant to a register is faster with an add. *
/
/
* ??? can this ever happen? *
/
if (GET_CODE (operands
[
1
]
) == PLUS
&& GET_CODE (XEXP (operands
[
1
]
, 1)) == CONST_INT
&& rtx_equal_p (operands
[
0
]
, XEXP (operands
[
1
]
, 0)))
{
operands
[
1
]
= XEXP (operands
[
1
]
, 1);
if (operands[1] == const1_rtx)
return AS1 (inc%L0,%0);
if (operands[1] == constm1_rtx)
return AS1 (dec%L0,%0);
return AS2 (add%L0,%1,%0);
}
return AS2 (lea%L0,%a1,%0);
}")
;; The patterns that match these are at the end of this file.
;; The patterns that match these are at the end of this file.
(define_expand "addxf3"
(define_expand "addxf3"
[
(set (match_operand:XF 0 "register_operand" "")
[
(set (match_operand:XF 0 "register_operand" "")
(plus:XF (match_operand:XF 1 "
nonimmediate
_operand" "")
(plus:XF (match_operand:XF 1 "
register
_operand" "")
(match_operand:XF 2 "
nonimmediate
_operand" "")))]
(match_operand:XF 2 "
register
_operand" "")))]
"TARGET_80387"
"TARGET_80387"
"")
"")
...
@@ -2637,6 +3067,54 @@
...
@@ -2637,6 +3067,54 @@
;;- subtract instructions
;;- subtract instructions
(define_insn "subsidi3"
[
(set (match_operand:DI 0 "general_operand" "=&r,ro,&r,o,o")
(minus:DI (match_operand:DI 1 "general_operand" "0,0,roiF,riF,o")
(zero_extend:DI (match_operand:SI 2 "general_operand" "o,ri,roi,ri,ri"))))
(clobber (match_scratch:SI 3 "=X,X,X,X,&r"))]
""
"
*
{
rtx low
[
3
]
, high
[
3
]
, xops
[
7
]
;
CC_STATUS_INIT;
split_di (operands, 2, low, high);
high
[
2
]
= const0_rtx;
low
[
2
]
= operands
[
2
]
;
if (!rtx_equal_p (operands
[
0
]
, operands
[
1
]
))
{
xops
[
0
]
= high
[
0
]
;
xops
[
1
]
= low
[
0
]
;
xops
[
2
]
= high
[
1
]
;
xops
[
3
]
= low
[
1
]
;
if (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)
{
output_asm_insn (AS2 (mov%L1,%3,%1), xops);
output_asm_insn (AS2 (mov%L0,%2,%0), xops);
}
else
{
xops[4] = high[2];
xops[5] = low[2];
xops[6] = operands[3];
output_asm_insn (AS2 (mov%L6,%3,%6), xops);
output_asm_insn (AS2 (sub%L6,%5,%6), xops);
output_asm_insn (AS2 (mov%L1,%6,%1), xops);
output_asm_insn (AS2 (mov%L6,%2,%6), xops);
output_asm_insn (AS2 (sbb%L6,%4,%6), xops);
output_asm_insn (AS2 (mov%L0,%6,%0), xops);
RET;
}
}
output_asm_insn (AS2 (sub%L0,%2,%0), low);
output_asm_insn (AS2 (sbb%L0,%2,%0), high);
RET;
}")
(define_insn "subdi3"
(define_insn "subdi3"
[
(set (match_operand:DI 0 "general_operand" "=&r,ro,&r,o,o")
[
(set (match_operand:DI 0 "general_operand" "=&r,ro,&r,o,o")
(minus:DI (match_operand:DI 1 "general_operand" "0,0,roiF,riF,o")
(minus:DI (match_operand:DI 1 "general_operand" "0,0,roiF,riF,o")
...
@@ -2704,33 +3182,75 @@
...
@@ -2704,33 +3182,75 @@
RET;
RET;
}")
}")
(define_
insn
"subsi3"
(define_
expand
"subsi3"
[
(set (match_operand:SI 0 "
general_operand" "=rm,r
")
[
(set (match_operand:SI 0 "
nonimmediate_operand" "
")
(minus:SI (match_operand:SI 1 "
general_operand" "0,0
")
(minus:SI (match_operand:SI 1 "
nonimmediate_operand" "
")
(match_operand:SI 2 "general_operand" "
ri,rm
")))]
(match_operand:SI 2 "general_operand" "")))]
""
""
"IX86_EXPAND_BINARY_OPERATOR (MINUS, SImode, operands);")
(define_insn ""
[
(set (match_operand:SI 0 "nonimmediate_operand" "=rm,r")
(minus:SI (match_operand:SI 1 "nonimmediate_operand" "0,0")
(match_operand:SI 2 "general_operand" "ri,rm")))]
"ix86_binary_operator_ok (MINUS, SImode, operands)"
"
*
return AS2 (sub%L0,%2,%0);")
"
*
return AS2 (sub%L0,%2,%0);")
(define_insn "subhi3"
(define_insn ""
[
(set (match_operand:HI 0 "general_operand" "=rm,r")
[
(set (match_operand:SI 0 "nonimmediate_operand" "=rm,r")
(minus:HI (match_operand:HI 1 "general_operand" "0,0")
(minus:SI (match_operand:SI 1 "general_operand" "ri,rm")
(match_operand:HI 2 "general_operand" "ri,rm")))]
(match_operand:SI 2 "nonimmediate_operand" "0,0")))]
"ix86_binary_operator_ok (MINUS, SImode, operands)"
"
*
return AS2 (sub%L0,%2,%0);")
(define_expand "subhi3"
[
(set (match_operand:HI 0 "general_operand" "")
(minus:HI (match_operand:HI 1 "nonimmediate_operand" "")
(match_operand:HI 2 "general_operand" "")))]
""
""
"IX86_EXPAND_BINARY_OPERATOR (MINUS, HImode, operands);")
(define_insn ""
[
(set (match_operand:HI 0 "nonimmediate_operand" "=rm,r")
(minus:HI (match_operand:HI 1 "nonimmediate_operand" "%0,0")
(match_operand:HI 2 "general_operand" "ri,rm")))]
"ix86_binary_operator_ok (MINUS, HImode, operands)"
"
*
return AS2 (sub%W0,%2,%0);")
"
*
return AS2 (sub%W0,%2,%0);")
(define_insn "subqi3"
(define_insn ""
[
(set (match_operand:QI 0 "general_operand" "=qm,q")
[
(set (match_operand:HI 0 "nonimmediate_operand" "=rm,r")
(minus:QI (match_operand:QI 1 "general_operand" "0,0")
(minus:HI (match_operand:HI 1 "general_operand" "ri,rm")
(match_operand:QI 2 "general_operand" "qn,qmn")))]
(match_operand:HI 2 "nonimmediate_operand" "0,0")))]
"ix86_binary_operator_ok (MINUS, HImode, operands)"
"
*
return AS2 (sub%W0,%2,%0);")
(define_expand "subqi3"
[
(set (match_operand:QI 0 "general_operand" "")
(minus:QI (match_operand:QI 1 "general_operand" "")
(match_operand:QI 2 "general_operand" "")))]
""
""
"IX86_EXPAND_BINARY_OPERATOR (MINUS, QImode, operands);")
(define_insn ""
[
(set (match_operand:QI 0 "nonimmediate_operand" "=qm,q")
(minus:QI (match_operand:QI 1 "nonimmediate_operand" "0,0")
(match_operand:QI 2 "general_operand" "qn,qmn")))]
"ix86_binary_operator_ok (MINUS, QImode, operands)"
"
*
return AS2 (sub%B0,%2,%0);")
(define_insn ""
[
(set (match_operand:QI 0 "nonimmediate_operand" "=qm,q")
(minus:QI (match_operand:QI 1 "general_operand" "qn,qmn")
(match_operand:QI 2 "nonimmediate_operand" "0,0")))]
"ix86_binary_operator_ok (MINUS, QImode, operands)"
"
*
return AS2 (sub%B0,%2,%0);")
"
*
return AS2 (sub%B0,%2,%0);")
;; The patterns that match these are at the end of this file.
;; The patterns that match these are at the end of this file.
(define_expand "subxf3"
(define_expand "subxf3"
[
(set (match_operand:XF 0 "register_operand" "")
[
(set (match_operand:XF 0 "register_operand" "")
(minus:XF (match_operand:XF 1 "
nonimmediate
_operand" "")
(minus:XF (match_operand:XF 1 "
register
_operand" "")
(match_operand:XF 2 "
nonimmediate
_operand" "")))]
(match_operand:XF 2 "
register
_operand" "")))]
"TARGET_80387"
"TARGET_80387"
"")
"")
...
@@ -2751,22 +3271,15 @@
...
@@ -2751,22 +3271,15 @@
;;- multiply instructions
;;- multiply instructions
;(define_insn "mulqi3"
;(define_insn "mulqi3"
;
[
(set (match_operand:QI 0 "
general
_operand" "=a")
;
[
(set (match_operand:QI 0 "
register
_operand" "=a")
; (mult:QI (match_operand:QI 1 "
general
_operand" "%0")
; (mult:QI (match_operand:QI 1 "
register
_operand" "%0")
; (match_operand:QI 2 "
general
_operand" "qm")))]
; (match_operand:QI 2 "
nonimmediate
_operand" "qm")))]
; ""
; ""
; "imul%B0 %2,%0")
; "imul%B0 %2,%0")
(define_insn ""
[
(set (match_operand:HI 0 "general_operand" "=r")
(mult:HI (match_operand:HI 1 "general_operand" "%0")
(match_operand:HI 2 "general_operand" "r")))]
"GET_CODE (operands
[
2
]
) == CONST_INT && INTVAL (operands
[
2
]
) == 0x80"
"
*
return AS2 (imul%W0,%2,%0);")
(define_insn "mulhi3"
(define_insn "mulhi3"
[
(set (match_operand:HI 0 "
general
_operand" "=r,r")
[
(set (match_operand:HI 0 "
register
_operand" "=r,r")
(mult:HI (match_operand:HI 1 "
general
_operand" "%0,rm")
(mult:HI (match_operand:HI 1 "
nonimmediate
_operand" "%0,rm")
(match_operand:HI 2 "general_operand" "g,i")))]
(match_operand:HI 2 "general_operand" "g,i")))]
""
""
"
*
"
*
...
@@ -2779,16 +3292,9 @@
...
@@ -2779,16 +3292,9 @@
return AS3 (imul%W0,%2,%1,%0);
return AS3 (imul%W0,%2,%1,%0);
}")
}")
(define_insn ""
[
(set (match_operand:SI 0 "general_operand" "=r")
(mult:SI (match_operand:SI 1 "general_operand" "%0")
(match_operand:SI 2 "general_operand" "r")))]
"GET_CODE (operands
[
2
]
) == CONST_INT && INTVAL (operands
[
2
]
) == 0x80"
"
*
return AS2 (imul%L0,%2,%0);")
(define_insn "mulsi3"
(define_insn "mulsi3"
[
(set (match_operand:SI 0 "
general
_operand" "=r,r")
[
(set (match_operand:SI 0 "
register
_operand" "=r,r")
(mult:SI (match_operand:SI 1 "
general
_operand" "%0,rm")
(mult:SI (match_operand:SI 1 "
nonimmediate
_operand" "%0,rm")
(match_operand:SI 2 "general_operand" "g,i")))]
(match_operand:SI 2 "general_operand" "g,i")))]
""
""
"
*
"
*
...
@@ -2802,15 +3308,15 @@
...
@@ -2802,15 +3308,15 @@
}")
}")
(define_insn "umulqihi3"
(define_insn "umulqihi3"
[
(set (match_operand:HI 0 "
general
_operand" "=a")
[
(set (match_operand:HI 0 "
register
_operand" "=a")
(mult:HI (zero_extend:HI (match_operand:QI 1 "
nonimmediate
_operand" "%0"))
(mult:HI (zero_extend:HI (match_operand:QI 1 "
register
_operand" "%0"))
(zero_extend:HI (match_operand:QI 2 "nonimmediate_operand" "qm"))))]
(zero_extend:HI (match_operand:QI 2 "nonimmediate_operand" "qm"))))]
""
""
"mul%B0 %2")
"mul%B0 %2")
(define_insn "mulqihi3"
(define_insn "mulqihi3"
[
(set (match_operand:HI 0 "
general
_operand" "=a")
[
(set (match_operand:HI 0 "
register
_operand" "=a")
(mult:HI (sign_extend:HI (match_operand:QI 1 "
nonimmediate
_operand" "%0"))
(mult:HI (sign_extend:HI (match_operand:QI 1 "
register
_operand" "%0"))
(sign_extend:HI (match_operand:QI 2 "nonimmediate_operand" "qm"))))]
(sign_extend:HI (match_operand:QI 2 "nonimmediate_operand" "qm"))))]
""
""
"imul%B0 %2")
"imul%B0 %2")
...
@@ -2851,21 +3357,21 @@
...
@@ -2851,21 +3357,21 @@
(define_expand "mulxf3"
(define_expand "mulxf3"
[
(set (match_operand:XF 0 "register_operand" "")
[
(set (match_operand:XF 0 "register_operand" "")
(mult:XF (match_operand:XF 1 "
nonimmediate
_operand" "")
(mult:XF (match_operand:XF 1 "
register
_operand" "")
(match_operand:XF 2 "
nonimmediate
_operand" "")))]
(match_operand:XF 2 "
register
_operand" "")))]
"TARGET_80387"
"TARGET_80387"
"")
"")
(define_expand "muldf3"
(define_expand "muldf3"
[
(set (match_operand:DF 0 "register_operand" "")
[
(set (match_operand:DF 0 "register_operand" "")
(mult:DF (match_operand:DF 1 "
nonimmediate
_operand" "")
(mult:DF (match_operand:DF 1 "
register
_operand" "")
(match_operand:DF 2 "nonimmediate_operand" "")))]
(match_operand:DF 2 "nonimmediate_operand" "")))]
"TARGET_80387"
"TARGET_80387"
"")
"")
(define_expand "mulsf3"
(define_expand "mulsf3"
[
(set (match_operand:SF 0 "register_operand" "")
[
(set (match_operand:SF 0 "register_operand" "")
(mult:SF (match_operand:SF 1 "
nonimmediate
_operand" "")
(mult:SF (match_operand:SF 1 "
register
_operand" "")
(match_operand:SF 2 "nonimmediate_operand" "")))]
(match_operand:SF 2 "nonimmediate_operand" "")))]
"TARGET_80387"
"TARGET_80387"
"")
"")
...
@@ -2873,16 +3379,16 @@
...
@@ -2873,16 +3379,16 @@
;;- divide instructions
;;- divide instructions
(define_insn "divqi3"
(define_insn "divqi3"
[
(set (match_operand:QI 0 "
general
_operand" "=a")
[
(set (match_operand:QI 0 "
register
_operand" "=a")
(div:QI (match_operand:HI 1 "
general
_operand" "0")
(div:QI (match_operand:HI 1 "
register
_operand" "0")
(match_operand:QI 2 "
general
_operand" "qm")))]
(match_operand:QI 2 "
nonimmediate
_operand" "qm")))]
""
""
"idiv%B0 %2")
"idiv%B0 %2")
(define_insn "udivqi3"
(define_insn "udivqi3"
[
(set (match_operand:QI 0 "
general
_operand" "=a")
[
(set (match_operand:QI 0 "
register
_operand" "=a")
(udiv:QI (match_operand:HI 1 "
general
_operand" "0")
(udiv:QI (match_operand:HI 1 "
register
_operand" "0")
(match_operand:QI 2 "
general
_operand" "qm")))]
(match_operand:QI 2 "
nonimmediate
_operand" "qm")))]
""
""
"div%B0 %2")
"div%B0 %2")
...
@@ -2890,21 +3396,14 @@
...
@@ -2890,21 +3396,14 @@
(define_expand "divxf3"
(define_expand "divxf3"
[
(set (match_operand:XF 0 "register_operand" "")
[
(set (match_operand:XF 0 "register_operand" "")
(div:XF (match_operand:XF 1 "nonimmediate_operand" "")
(div:XF (match_operand:XF 1 "register_operand" "")
(match_operand:XF 2 "nonimmediate_operand" "")))]
(match_operand:XF 2 "register_operand" "")))]
"TARGET_80387"
"")
(define_expand "divdf3"
[
(set (match_operand:DF 0 "register_operand" "")
(div:DF (match_operand:DF 1 "nonimmediate_operand" "")
(match_operand:DF 2 "nonimmediate_operand" "")))]
"TARGET_80387"
"TARGET_80387"
"")
"")
(define_expand "divsf3"
(define_expand "divsf3"
[
(set (match_operand:SF 0 "register_operand" "")
[
(set (match_operand:SF 0 "register_operand" "")
(div:SF (match_operand:SF 1 "
nonimmediate
_operand" "")
(div:SF (match_operand:SF 1 "
register
_operand" "")
(match_operand:SF 2 "nonimmediate_operand" "")))]
(match_operand:SF 2 "nonimmediate_operand" "")))]
"TARGET_80387"
"TARGET_80387"
"")
"")
...
@@ -2914,7 +3413,7 @@
...
@@ -2914,7 +3413,7 @@
(define_insn "divmodsi4"
(define_insn "divmodsi4"
[
(set (match_operand:SI 0 "register_operand" "=a")
[
(set (match_operand:SI 0 "register_operand" "=a")
(div:SI (match_operand:SI 1 "register_operand" "0")
(div:SI (match_operand:SI 1 "register_operand" "0")
(match_operand:SI 2 "
general
_operand" "rm")))
(match_operand:SI 2 "
nonimmediate
_operand" "rm")))
(set (match_operand:SI 3 "register_operand" "=&d")
(set (match_operand:SI 3 "register_operand" "=&d")
(mod:SI (match_dup 1) (match_dup 2)))]
(mod:SI (match_dup 1) (match_dup 2)))]
""
""
...
@@ -2931,7 +3430,7 @@
...
@@ -2931,7 +3430,7 @@
(define_insn "divmodhi4"
(define_insn "divmodhi4"
[
(set (match_operand:HI 0 "register_operand" "=a")
[
(set (match_operand:HI 0 "register_operand" "=a")
(div:HI (match_operand:HI 1 "register_operand" "0")
(div:HI (match_operand:HI 1 "register_operand" "0")
(match_operand:HI 2 "
general
_operand" "rm")))
(match_operand:HI 2 "
nonimmediate
_operand" "rm")))
(set (match_operand:HI 3 "register_operand" "=&d")
(set (match_operand:HI 3 "register_operand" "=&d")
(mod:HI (match_dup 1) (match_dup 2)))]
(mod:HI (match_dup 1) (match_dup 2)))]
""
""
...
@@ -2941,7 +3440,7 @@
...
@@ -2941,7 +3440,7 @@
(define_insn "udivmodsi4"
(define_insn "udivmodsi4"
[
(set (match_operand:SI 0 "register_operand" "=a")
[
(set (match_operand:SI 0 "register_operand" "=a")
(udiv:SI (match_operand:SI 1 "register_operand" "0")
(udiv:SI (match_operand:SI 1 "register_operand" "0")
(match_operand:SI 2 "
general
_operand" "rm")))
(match_operand:SI 2 "
nonimmediate
_operand" "rm")))
(set (match_operand:SI 3 "register_operand" "=&d")
(set (match_operand:SI 3 "register_operand" "=&d")
(umod:SI (match_dup 1) (match_dup 2)))]
(umod:SI (match_dup 1) (match_dup 2)))]
""
""
...
@@ -2955,7 +3454,7 @@
...
@@ -2955,7 +3454,7 @@
(define_insn "udivmodhi4"
(define_insn "udivmodhi4"
[
(set (match_operand:HI 0 "register_operand" "=a")
[
(set (match_operand:HI 0 "register_operand" "=a")
(udiv:HI (match_operand:HI 1 "register_operand" "0")
(udiv:HI (match_operand:HI 1 "register_operand" "0")
(match_operand:HI 2 "
general
_operand" "rm")))
(match_operand:HI 2 "
nonimmediate
_operand" "rm")))
(set (match_operand:HI 3 "register_operand" "=&d")
(set (match_operand:HI 3 "register_operand" "=&d")
(umod:HI (match_dup 1) (match_dup 2)))]
(umod:HI (match_dup 1) (match_dup 2)))]
""
""
...
@@ -2971,7 +3470,7 @@
...
@@ -2971,7 +3470,7 @@
(define_insn ""
(define_insn ""
[
(set (match_operand:SI 0 "register_operand" "=a")
[
(set (match_operand:SI 0 "register_operand" "=a")
(udiv:DI (match_operand:DI 1 "register_operand" "a")
(udiv:DI (match_operand:DI 1 "register_operand" "a")
(match_operand:SI 2 "
general
_operand" "rm")))
(match_operand:SI 2 "
nonimmediate
_operand" "rm")))
(set (match_operand:SI 3 "register_operand" "=d")
(set (match_operand:SI 3 "register_operand" "=d")
(umod:SI (match_dup 1) (match_dup 2)))]
(umod:SI (match_dup 1) (match_dup 2)))]
""
""
...
@@ -2997,12 +3496,20 @@
...
@@ -2997,12 +3496,20 @@
;; ??? What if we only change one byte of an offsettable memory reference?
;; ??? What if we only change one byte of an offsettable memory reference?
(define_insn "andsi3"
(define_insn "andsi3"
[
(set (match_operand:SI 0 "
general_operand" "=r,r,
rm,r")
[
(set (match_operand:SI 0 "
nonimmediate_operand" "=
rm,r")
(and:SI (match_operand:SI 1 "
general_operand" "%rm,qm,
0,0")
(and:SI (match_operand:SI 1 "
nonimmediate_operand" "%
0,0")
(match_operand:SI 2 "general_operand" "
L,K,
ri,rm")))]
(match_operand:SI 2 "general_operand" "ri,rm")))]
""
""
"
*
"
*
{
{
if (!rtx_equal_p (operands
[
0
]
, operands
[
1
]
)
&& rtx_equal_p (operands
[
0
]
, operands
[
2
]
))
{
rtx tmp;
tmp = operands
[
1
]
;
operands
[
1
]
= operands
[
2
]
;
operands
[
2
]
= tmp;
}
if (GET_CODE (operands
[
2
]
) == CONST_INT
if (GET_CODE (operands
[
2
]
) == CONST_INT
&& ! (GET_CODE (operands
[
0
]
) == MEM && MEM_VOLATILE_P (operands
[
0
]
)))
&& ! (GET_CODE (operands
[
0
]
) == MEM && MEM_VOLATILE_P (operands
[
0
]
)))
{
{
...
@@ -3076,8 +3583,8 @@
...
@@ -3076,8 +3583,8 @@
}")
}")
(define_insn "andhi3"
(define_insn "andhi3"
[
(set (match_operand:HI 0 "
general
_operand" "=rm,r")
[
(set (match_operand:HI 0 "
nonimmediate
_operand" "=rm,r")
(and:HI (match_operand:HI 1 "
general
_operand" "%0,0")
(and:HI (match_operand:HI 1 "
nonimmediate
_operand" "%0,0")
(match_operand:HI 2 "general_operand" "ri,rm")))]
(match_operand:HI 2 "general_operand" "ri,rm")))]
""
""
"
*
"
*
...
@@ -3122,8 +3629,8 @@
...
@@ -3122,8 +3629,8 @@
}")
}")
(define_insn "andqi3"
(define_insn "andqi3"
[
(set (match_operand:QI 0 "
general
_operand" "=qm,q")
[
(set (match_operand:QI 0 "
nonimmediate
_operand" "=qm,q")
(and:QI (match_operand:QI 1 "
general
_operand" "%0,0")
(and:QI (match_operand:QI 1 "
nonimmediate
_operand" "%0,0")
(match_operand:QI 2 "general_operand" "qn,qmn")))]
(match_operand:QI 2 "general_operand" "qn,qmn")))]
""
""
"
*
return AS2 (and%B0,%2,%0);")
"
*
return AS2 (and%B0,%2,%0);")
...
@@ -3142,10 +3649,10 @@
...
@@ -3142,10 +3649,10 @@
"and%W0 %1,%0")
"and%W0 %1,%0")
(define_insn ""
(define_insn ""
[
(set (match_operand:SI 0 "
general
_operand" "=q")
[
(set (match_operand:SI 0 "
register
_operand" "=q")
(and:SI
(and:SI
(zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "qm"))
(zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "qm"))
(match_operand:SI 2 "
general
_operand" "0")))]
(match_operand:SI 2 "
register
_operand" "0")))]
"GET_CODE (operands
[
2
]
) == CONST_INT
"GET_CODE (operands
[
2
]
) == CONST_INT
&& (unsigned int) INTVAL (operands
[
2
]
) < (1 << GET_MODE_BITSIZE (QImode))"
&& (unsigned int) INTVAL (operands
[
2
]
) < (1 << GET_MODE_BITSIZE (QImode))"
"and%L0 %1,%0")
"and%L0 %1,%0")
...
@@ -3156,8 +3663,8 @@
...
@@ -3156,8 +3663,8 @@
;; ??? What if we only change one byte of an offsettable memory reference?
;; ??? What if we only change one byte of an offsettable memory reference?
(define_insn "iorsi3"
(define_insn "iorsi3"
[
(set (match_operand:SI 0 "
general
_operand" "=rm,r")
[
(set (match_operand:SI 0 "
nonimmediate
_operand" "=rm,r")
(ior:SI (match_operand:SI 1 "
general
_operand" "%0,0")
(ior:SI (match_operand:SI 1 "
nonimmediate
_operand" "%0,0")
(match_operand:SI 2 "general_operand" "ri,rm")))]
(match_operand:SI 2 "general_operand" "ri,rm")))]
""
""
"
*
"
*
...
@@ -3192,8 +3699,8 @@
...
@@ -3192,8 +3699,8 @@
}")
}")
(define_insn "iorhi3"
(define_insn "iorhi3"
[
(set (match_operand:HI 0 "
general
_operand" "=rm,r")
[
(set (match_operand:HI 0 "
nonimmediate
_operand" "=rm,r")
(ior:HI (match_operand:HI 1 "
general
_operand" "%0,0")
(ior:HI (match_operand:HI 1 "
nonimmediate
_operand" "%0,0")
(match_operand:HI 2 "general_operand" "ri,rm")))]
(match_operand:HI 2 "general_operand" "ri,rm")))]
""
""
"
*
"
*
...
@@ -3234,8 +3741,8 @@
...
@@ -3234,8 +3741,8 @@
}")
}")
(define_insn "iorqi3"
(define_insn "iorqi3"
[
(set (match_operand:QI 0 "
general
_operand" "=qm,q")
[
(set (match_operand:QI 0 "
nonimmediate
_operand" "=qm,q")
(ior:QI (match_operand:QI 1 "
general
_operand" "%0,0")
(ior:QI (match_operand:QI 1 "
nonimmediate
_operand" "%0,0")
(match_operand:QI 2 "general_operand" "qn,qmn")))]
(match_operand:QI 2 "general_operand" "qn,qmn")))]
""
""
"
*
return AS2 (or%B0,%2,%0);")
"
*
return AS2 (or%B0,%2,%0);")
...
@@ -3244,8 +3751,8 @@
...
@@ -3244,8 +3751,8 @@
;; ??? What if we only change one byte of an offsettable memory reference?
;; ??? What if we only change one byte of an offsettable memory reference?
(define_insn "xorsi3"
(define_insn "xorsi3"
[
(set (match_operand:SI 0 "
general
_operand" "=rm,r")
[
(set (match_operand:SI 0 "
nonimmediate
_operand" "=rm,r")
(xor:SI (match_operand:SI 1 "
general
_operand" "%0,0")
(xor:SI (match_operand:SI 1 "
nonimmediate
_operand" "%0,0")
(match_operand:SI 2 "general_operand" "ri,rm")))]
(match_operand:SI 2 "general_operand" "ri,rm")))]
""
""
"
*
"
*
...
@@ -3280,8 +3787,8 @@
...
@@ -3280,8 +3787,8 @@
}")
}")
(define_insn "xorhi3"
(define_insn "xorhi3"
[
(set (match_operand:HI 0 "
general
_operand" "=rm,r")
[
(set (match_operand:HI 0 "
nonimmediate
_operand" "=rm,r")
(xor:HI (match_operand:HI 1 "
general
_operand" "%0,0")
(xor:HI (match_operand:HI 1 "
nonimmediate
_operand" "%0,0")
(match_operand:HI 2 "general_operand" "ri,rm")))]
(match_operand:HI 2 "general_operand" "ri,rm")))]
""
""
"
*
"
*
...
@@ -3322,8 +3829,8 @@
...
@@ -3322,8 +3829,8 @@
}")
}")
(define_insn "xorqi3"
(define_insn "xorqi3"
[
(set (match_operand:QI 0 "
general
_operand" "=qm,q")
[
(set (match_operand:QI 0 "
nonimmediate
_operand" "=qm,q")
(xor:QI (match_operand:QI 1 "
general
_operand" "%0,0")
(xor:QI (match_operand:QI 1 "
nonimmediate
_operand" "%0,0")
(match_operand:QI 2 "general_operand" "qn,qm")))]
(match_operand:QI 2 "general_operand" "qn,qm")))]
""
""
"
*
return AS2 (xor%B0,%2,%0);")
"
*
return AS2 (xor%B0,%2,%0);")
...
@@ -3351,50 +3858,50 @@
...
@@ -3351,50 +3858,50 @@
}")
}")
(define_insn "negsi2"
(define_insn "negsi2"
[
(set (match_operand:SI 0 "
general
_operand" "=rm")
[
(set (match_operand:SI 0 "
nonimmediate
_operand" "=rm")
(neg:SI (match_operand:SI 1 "
general
_operand" "0")))]
(neg:SI (match_operand:SI 1 "
nonimmediate
_operand" "0")))]
""
""
"neg%L0 %0")
"neg%L0 %0")
(define_insn "neghi2"
(define_insn "neghi2"
[
(set (match_operand:HI 0 "
general
_operand" "=rm")
[
(set (match_operand:HI 0 "
nonimmediate
_operand" "=rm")
(neg:HI (match_operand:HI 1 "
general
_operand" "0")))]
(neg:HI (match_operand:HI 1 "
nonimmediate
_operand" "0")))]
""
""
"neg%W0 %0")
"neg%W0 %0")
(define_insn "negqi2"
(define_insn "negqi2"
[
(set (match_operand:QI 0 "
general
_operand" "=qm")
[
(set (match_operand:QI 0 "
nonimmediate
_operand" "=qm")
(neg:QI (match_operand:QI 1 "
general
_operand" "0")))]
(neg:QI (match_operand:QI 1 "
nonimmediate
_operand" "0")))]
""
""
"neg%B0 %0")
"neg%B0 %0")
(define_insn "negsf2"
(define_insn "negsf2"
[
(set (match_operand:SF 0 "register_operand" "=f")
[
(set (match_operand:SF 0 "register_operand" "=f")
(neg:SF (match_operand:SF 1 "
general
_operand" "0")))]
(neg:SF (match_operand:SF 1 "
register
_operand" "0")))]
"TARGET_80387"
"TARGET_80387"
"fchs")
"fchs")
(define_insn "negdf2"
(define_insn "negdf2"
[
(set (match_operand:DF 0 "register_operand" "=f")
[
(set (match_operand:DF 0 "register_operand" "=f")
(neg:DF (match_operand:DF 1 "
general
_operand" "0")))]
(neg:DF (match_operand:DF 1 "
register
_operand" "0")))]
"TARGET_80387"
"TARGET_80387"
"fchs")
"fchs")
(define_insn ""
(define_insn ""
[
(set (match_operand:DF 0 "register_operand" "=f")
[
(set (match_operand:DF 0 "register_operand" "=f")
(neg:DF (float_extend:DF (match_operand:SF 1 "
general
_operand" "0"))))]
(neg:DF (float_extend:DF (match_operand:SF 1 "
register
_operand" "0"))))]
"TARGET_80387"
"TARGET_80387"
"fchs")
"fchs")
(define_insn "negxf2"
(define_insn "negxf2"
[
(set (match_operand:XF 0 "register_operand" "=f")
[
(set (match_operand:XF 0 "register_operand" "=f")
(neg:XF (match_operand:XF 1 "
general
_operand" "0")))]
(neg:XF (match_operand:XF 1 "
register
_operand" "0")))]
"TARGET_80387"
"TARGET_80387"
"fchs")
"fchs")
(define_insn ""
(define_insn ""
[
(set (match_operand:XF 0 "register_operand" "=f")
[
(set (match_operand:XF 0 "register_operand" "=f")
(neg:XF (float_extend:XF (match_operand:DF 1 "
general
_operand" "0"))))]
(neg:XF (float_extend:XF (match_operand:DF 1 "
register
_operand" "0"))))]
"TARGET_80387"
"TARGET_80387"
"fchs")
"fchs")
...
@@ -3402,44 +3909,48 @@
...
@@ -3402,44 +3909,48 @@
(define_insn "abssf2"
(define_insn "abssf2"
[
(set (match_operand:SF 0 "register_operand" "=f")
[
(set (match_operand:SF 0 "register_operand" "=f")
(abs:SF (match_operand:SF 1 "
general
_operand" "0")))]
(abs:SF (match_operand:SF 1 "
register
_operand" "0")))]
"TARGET_80387"
"TARGET_80387"
"fabs")
"fabs"
[
(set_attr "type" "fpop")
]
)
(define_insn "absdf2"
(define_insn "absdf2"
[
(set (match_operand:DF 0 "register_operand" "=f")
[
(set (match_operand:DF 0 "register_operand" "=f")
(abs:DF (match_operand:DF 1 "
general
_operand" "0")))]
(abs:DF (match_operand:DF 1 "
register
_operand" "0")))]
"TARGET_80387"
"TARGET_80387"
"fabs")
"fabs"
[
(set_attr "type" "fpop")
]
)
(define_insn ""
(define_insn ""
[
(set (match_operand:DF 0 "register_operand" "=f")
[
(set (match_operand:DF 0 "register_operand" "=f")
(abs:DF (float_extend:DF (match_operand:SF 1 "
general
_operand" "0"))))]
(abs:DF (float_extend:DF (match_operand:SF 1 "
register
_operand" "0"))))]
"TARGET_80387"
"TARGET_80387"
"fabs")
"fabs"
[
(set_attr "type" "fpop")
]
)
(define_insn "absxf2"
(define_insn "absxf2"
[
(set (match_operand:XF 0 "register_operand" "=f")
[
(set (match_operand:XF 0 "register_operand" "=f")
(abs:XF (match_operand:XF 1 "
general
_operand" "0")))]
(abs:XF (match_operand:XF 1 "
register
_operand" "0")))]
"TARGET_80387"
"TARGET_80387"
"fabs")
"fabs"
[
(set_attr "type" "fpop")
]
)
(define_insn ""
(define_insn ""
[
(set (match_operand:XF 0 "register_operand" "=f")
[
(set (match_operand:XF 0 "register_operand" "=f")
(abs:XF (float_extend:XF (match_operand:DF 1 "
general
_operand" "0"))))]
(abs:XF (float_extend:XF (match_operand:DF 1 "
register
_operand" "0"))))]
"TARGET_80387"
"TARGET_80387"
"fabs")
"fabs"
[
(set_attr "type" "fpop")
]
)
(define_insn "sqrtsf2"
(define_insn "sqrtsf2"
[
(set (match_operand:SF 0 "register_operand" "=f")
[
(set (match_operand:SF 0 "register_operand" "=f")
(sqrt:SF (match_operand:SF 1 "general_operand" "0")))]
(sqrt:SF (match_operand:SF 1 "register_operand" "0")))]
"! TARGET_NO_FANCY_MATH_387 && TARGET_80387
"! TARGET_NO_FANCY_MATH_387 && TARGET_80387"
&& (TARGET_IEEE_FP || flag_fast_math) "
"fsqrt")
"fsqrt")
(define_insn "sqrtdf2"
(define_insn "sqrtdf2"
[
(set (match_operand:DF 0 "register_operand" "=f")
[
(set (match_operand:DF 0 "register_operand" "=f")
(sqrt:DF (match_operand:DF 1 "
general
_operand" "0")))]
(sqrt:DF (match_operand:DF 1 "
register
_operand" "0")))]
"! TARGET_NO_FANCY_MATH_387 && TARGET_80387
"! TARGET_NO_FANCY_MATH_387 && TARGET_80387
&& (TARGET_IEEE_FP || flag_fast_math) "
&& (TARGET_IEEE_FP || flag_fast_math) "
"fsqrt")
"fsqrt")
...
@@ -3447,14 +3958,13 @@
...
@@ -3447,14 +3958,13 @@
(define_insn ""
(define_insn ""
[
(set (match_operand:DF 0 "register_operand" "=f")
[
(set (match_operand:DF 0 "register_operand" "=f")
(sqrt:DF (float_extend:DF
(sqrt:DF (float_extend:DF
(match_operand:SF 1 "general_operand" "0"))))]
(match_operand:SF 1 "register_operand" "0"))))]
"! TARGET_NO_FANCY_MATH_387 && TARGET_80387
"! TARGET_NO_FANCY_MATH_387 && TARGET_80387"
&& (TARGET_IEEE_FP || flag_fast_math) "
"fsqrt")
"fsqrt")
(define_insn "sqrtxf2"
(define_insn "sqrtxf2"
[
(set (match_operand:XF 0 "register_operand" "=f")
[
(set (match_operand:XF 0 "register_operand" "=f")
(sqrt:XF (match_operand:XF 1 "
general
_operand" "0")))]
(sqrt:XF (match_operand:XF 1 "
register
_operand" "0")))]
"! TARGET_NO_FANCY_MATH_387 && TARGET_80387
"! TARGET_NO_FANCY_MATH_387 && TARGET_80387
&& (TARGET_IEEE_FP || flag_fast_math) "
&& (TARGET_IEEE_FP || flag_fast_math) "
"fsqrt")
"fsqrt")
...
@@ -3462,94 +3972,84 @@
...
@@ -3462,94 +3972,84 @@
(define_insn ""
(define_insn ""
[
(set (match_operand:XF 0 "register_operand" "=f")
[
(set (match_operand:XF 0 "register_operand" "=f")
(sqrt:XF (float_extend:XF
(sqrt:XF (float_extend:XF
(match_operand:DF 1 "general_operand" "0"))))]
(match_operand:DF 1 "register_operand" "0"))))]
"! TARGET_NO_FANCY_MATH_387 && TARGET_80387
"! TARGET_NO_FANCY_MATH_387 && TARGET_80387"
&& (TARGET_IEEE_FP || flag_fast_math) "
"fsqrt")
"fsqrt")
(define_insn ""
(define_insn ""
[
(set (match_operand:XF 0 "register_operand" "=f")
[
(set (match_operand:XF 0 "register_operand" "=f")
(sqrt:XF (float_extend:XF
(sqrt:XF (float_extend:XF
(match_operand:SF 1 "general_operand" "0"))))]
(match_operand:SF 1 "register_operand" "0"))))]
"! TARGET_NO_FANCY_MATH_387 && TARGET_80387
"! TARGET_NO_FANCY_MATH_387 && TARGET_80387"
&& (TARGET_IEEE_FP || flag_fast_math) "
"fsqrt")
"fsqrt")
(define_insn "sindf2"
(define_insn "sindf2"
[
(set (match_operand:DF 0 "register_operand" "=f")
[
(set (match_operand:DF 0 "register_operand" "=f")
(unspec:DF
[
(match_operand:DF 1 "register_operand" "0")
]
1))]
(unspec:DF
[
(match_operand:DF 1 "register_operand" "0")
]
1))]
"! TARGET_NO_FANCY_MATH_387 && TARGET_80387
"! TARGET_NO_FANCY_MATH_387 && TARGET_80387 && flag_fast_math"
&& (TARGET_IEEE_FP || flag_fast_math) "
"fsin")
"fsin")
(define_insn "sinsf2"
(define_insn "sinsf2"
[
(set (match_operand:SF 0 "register_operand" "=f")
[
(set (match_operand:SF 0 "register_operand" "=f")
(unspec:SF
[
(match_operand:SF 1 "register_operand" "0")
]
1))]
(unspec:SF
[
(match_operand:SF 1 "register_operand" "0")
]
1))]
"! TARGET_NO_FANCY_MATH_387 && TARGET_80387
"! TARGET_NO_FANCY_MATH_387 && TARGET_80387 && flag_fast_math"
&& (TARGET_IEEE_FP || flag_fast_math) "
"fsin")
"fsin")
(define_insn ""
(define_insn ""
[
(set (match_operand:DF 0 "register_operand" "=f")
[
(set (match_operand:DF 0 "register_operand" "=f")
(unspec:DF
[
(float_extend:DF
(unspec:DF
[
(float_extend:DF
(match_operand:SF 1 "register_operand" "0"))] 1))]
(match_operand:SF 1 "register_operand" "0"))] 1))]
"! TARGET_NO_FANCY_MATH_387 && TARGET_80387
"! TARGET_NO_FANCY_MATH_387 && TARGET_80387 && flag_fast_math"
&& (TARGET_IEEE_FP || flag_fast_math) "
"fsin")
"fsin")
(define_insn "sinxf2"
(define_insn "sinxf2"
[
(set (match_operand:XF 0 "register_operand" "=f")
[
(set (match_operand:XF 0 "register_operand" "=f")
(unspec:XF
[
(match_operand:XF 1 "register_operand" "0")
]
1))]
(unspec:XF
[
(match_operand:XF 1 "register_operand" "0")
]
1))]
"! TARGET_NO_FANCY_MATH_387 && TARGET_80387
"! TARGET_NO_FANCY_MATH_387 && TARGET_80387 && flag_fast_math"
&& (TARGET_IEEE_FP || flag_fast_math) "
"fsin")
"fsin")
(define_insn "cosdf2"
(define_insn "cosdf2"
[
(set (match_operand:DF 0 "register_operand" "=f")
[
(set (match_operand:DF 0 "register_operand" "=f")
(unspec:DF
[
(match_operand:DF 1 "register_operand" "0")
]
2))]
(unspec:DF
[
(match_operand:DF 1 "register_operand" "0")
]
2))]
"! TARGET_NO_FANCY_MATH_387 && TARGET_80387
"! TARGET_NO_FANCY_MATH_387 && TARGET_80387 && flag_fast_math"
&& (TARGET_IEEE_FP || flag_fast_math) "
"fcos")
"fcos")
(define_insn "cossf2"
(define_insn "cossf2"
[
(set (match_operand:SF 0 "register_operand" "=f")
[
(set (match_operand:SF 0 "register_operand" "=f")
(unspec:SF
[
(match_operand:SF 1 "register_operand" "0")
]
2))]
(unspec:SF
[
(match_operand:SF 1 "register_operand" "0")
]
2))]
"! TARGET_NO_FANCY_MATH_387 && TARGET_80387
"! TARGET_NO_FANCY_MATH_387 && TARGET_80387 && flag_fast_math"
&& (TARGET_IEEE_FP || flag_fast_math) "
"fcos")
"fcos")
(define_insn ""
(define_insn ""
[
(set (match_operand:DF 0 "register_operand" "=f")
[
(set (match_operand:DF 0 "register_operand" "=f")
(unspec:DF
[
(float_extend:DF
(unspec:DF
[
(float_extend:DF
(match_operand:SF 1 "register_operand" "0"))] 2))]
(match_operand:SF 1 "register_operand" "0"))] 2))]
"! TARGET_NO_FANCY_MATH_387 && TARGET_80387
"! TARGET_NO_FANCY_MATH_387 && TARGET_80387 && flag_fast_math"
&& (TARGET_IEEE_FP || flag_fast_math) "
"fcos")
"fcos")
(define_insn "cosxf2"
(define_insn "cosxf2"
[
(set (match_operand:XF 0 "register_operand" "=f")
[
(set (match_operand:XF 0 "register_operand" "=f")
(unspec:XF
[
(match_operand:XF 1 "register_operand" "0")
]
2))]
(unspec:XF
[
(match_operand:XF 1 "register_operand" "0")
]
2))]
"! TARGET_NO_FANCY_MATH_387 && TARGET_80387
"! TARGET_NO_FANCY_MATH_387 && TARGET_80387 && flag_fast_math"
&& (TARGET_IEEE_FP || flag_fast_math) "
"fcos")
"fcos")
;;- one complement instructions
;;- one complement instructions
(define_insn "one_cmplsi2"
(define_insn "one_cmplsi2"
[
(set (match_operand:SI 0 "
general
_operand" "=rm")
[
(set (match_operand:SI 0 "
nonimmediate
_operand" "=rm")
(not:SI (match_operand:SI 1 "
general
_operand" "0")))]
(not:SI (match_operand:SI 1 "
nonimmediate
_operand" "0")))]
""
""
"not%L0 %0")
"not%L0 %0")
(define_insn "one_cmplhi2"
(define_insn "one_cmplhi2"
[
(set (match_operand:HI 0 "
general
_operand" "=rm")
[
(set (match_operand:HI 0 "
nonimmediate
_operand" "=rm")
(not:HI (match_operand:HI 1 "
general
_operand" "0")))]
(not:HI (match_operand:HI 1 "
nonimmediate
_operand" "0")))]
""
""
"not%W0 %0")
"not%W0 %0")
(define_insn "one_cmplqi2"
(define_insn "one_cmplqi2"
[
(set (match_operand:QI 0 "
general
_operand" "=qm")
[
(set (match_operand:QI 0 "
nonimmediate
_operand" "=qm")
(not:QI (match_operand:QI 1 "
general
_operand" "0")))]
(not:QI (match_operand:QI 1 "
nonimmediate
_operand" "0")))]
""
""
"not%B0 %0")
"not%B0 %0")
...
@@ -3674,8 +4174,8 @@
...
@@ -3674,8 +4174,8 @@
;; is smaller - use leal for now unless the shift count is 1.
;; is smaller - use leal for now unless the shift count is 1.
(define_insn "ashlsi3"
(define_insn "ashlsi3"
[(set (match_operand:SI 0 "
general
_operand" "=r,rm")
[(set (match_operand:SI 0 "
nonimmediate
_operand" "=r,rm")
(ashift:SI (match_operand:SI 1 "
general
_operand" "r,0")
(ashift:SI (match_operand:SI 1 "
nonimmediate
_operand" "r,0")
(match_operand:SI 2 "nonmemory_operand" "M,cI")))]
(match_operand:SI 2 "nonmemory_operand" "M,cI")))]
""
""
"*
"*
...
@@ -3712,8 +4212,8 @@
...
@@ -3712,8 +4212,8 @@
}")
}")
(define_insn "ashlhi3"
(define_insn "ashlhi3"
[(set (match_operand:HI 0 "
general
_operand" "=rm")
[(set (match_operand:HI 0 "
nonimmediate
_operand" "=rm")
(ashift:HI (match_operand:HI 1 "
general
_operand" "0")
(ashift:HI (match_operand:HI 1 "
nonimmediate
_operand" "0")
(match_operand:HI 2 "nonmemory_operand" "cI")))]
(match_operand:HI 2 "nonmemory_operand" "cI")))]
""
""
"*
"*
...
@@ -3728,8 +4228,8 @@
...
@@ -3728,8 +4228,8 @@
}")
}")
(define_insn "ashlqi3"
(define_insn "ashlqi3"
[(set (match_operand:QI 0 "
general
_operand" "=qm")
[(set (match_operand:QI 0 "
nonimmediate
_operand" "=qm")
(ashift:QI (match_operand:QI 1 "
general
_operand" "0")
(ashift:QI (match_operand:QI 1 "
nonimmediate
_operand" "0")
(match_operand:QI 2 "nonmemory_operand" "cI")))]
(match_operand:QI 2 "nonmemory_operand" "cI")))]
""
""
"*
"*
...
@@ -3765,6 +4265,31 @@
...
@@ -3765,6 +4265,31 @@
DONE;
DONE;
}")
}")
(define_insn "ashldi3_32"
[
(set (match_operand:DI 0 "nonimmediate_operand" "=r,m")
(ashift:DI (match_operand:DI 1 "nonimmediate_operand" "ro,r")
(const_int 32)))]
""
"
*
{
rtx low
[
2
]
, high
[
2
]
, xops
[
4
]
;
split_di (operands, 2, low, high);
xops
[
0
]
= high
[
0
]
;
xops
[
1
]
= low
[
1
]
;
xops
[
2
]
= low
[
0
]
;
xops
[
3
]
= const0_rtx;
if (!rtx_equal_p (xops
[
0
]
, xops
[
1
]
))
output_asm_insn (AS2 (mov%L0,%1,%0), xops);
if (GET_CODE (low
[
0
]
) == MEM)
output_asm_insn (AS2 (mov%L2,%3,%2), xops);
else
output_asm_insn (AS2 (xor%L2,%2,%2), xops);
RET;
}")
(define_insn "ashrdi3_const_int"
(define_insn "ashrdi3_const_int"
[
(set (match_operand:DI 0 "register_operand" "=&r")
[
(set (match_operand:DI 0 "register_operand" "=&r")
(ashiftrt:DI (match_operand:DI 1 "register_operand" "0")
(ashiftrt:DI (match_operand:DI 1 "register_operand" "0")
...
@@ -3839,8 +4364,8 @@
...
@@ -3839,8 +4364,8 @@
}")
}")
(define_insn "ashrsi3"
(define_insn "ashrsi3"
[
(set (match_operand:SI 0 "
general
_operand" "=rm")
[
(set (match_operand:SI 0 "
nonimmediate
_operand" "=rm")
(ashiftrt:SI (match_operand:SI 1 "
general
_operand" "0")
(ashiftrt:SI (match_operand:SI 1 "
nonimmediate
_operand" "0")
(match_operand:SI 2 "nonmemory_operand" "cI")))]
(match_operand:SI 2 "nonmemory_operand" "cI")))]
""
""
"
*
"
*
...
@@ -3852,8 +4377,8 @@
...
@@ -3852,8 +4377,8 @@
}")
}")
(define_insn "ashrhi3"
(define_insn "ashrhi3"
[
(set (match_operand:HI 0 "
general
_operand" "=rm")
[
(set (match_operand:HI 0 "
nonimmediate
_operand" "=rm")
(ashiftrt:HI (match_operand:HI 1 "
general
_operand" "0")
(ashiftrt:HI (match_operand:HI 1 "
nonimmediate
_operand" "0")
(match_operand:HI 2 "nonmemory_operand" "cI")))]
(match_operand:HI 2 "nonmemory_operand" "cI")))]
""
""
"
*
"
*
...
@@ -3865,8 +4390,8 @@
...
@@ -3865,8 +4390,8 @@
}")
}")
(define_insn "ashrqi3"
(define_insn "ashrqi3"
[
(set (match_operand:QI 0 "
general
_operand" "=qm")
[
(set (match_operand:QI 0 "
nonimmediate
_operand" "=qm")
(ashiftrt:QI (match_operand:QI 1 "
general
_operand" "0")
(ashiftrt:QI (match_operand:QI 1 "
nonimmediate
_operand" "0")
(match_operand:QI 2 "nonmemory_operand" "cI")))]
(match_operand:QI 2 "nonmemory_operand" "cI")))]
""
""
"
*
"
*
...
@@ -3901,6 +4426,31 @@
...
@@ -3901,6 +4426,31 @@
DONE;
DONE;
}")
}")
(define_insn "lshrdi3_32"
[(set (match_operand:DI 0 "nonimmediate_operand" "=r,m")
(lshiftrt:DI (match_operand:DI 1 "nonimmediate_operand" "ro,r")
(const_int 32)))]
""
"*
{
rtx low[2], high[2], xops[4];
split_di (operands, 2, low, high);
xops[0] = low[0];
xops[1] = high[1];
xops[2] = high[0];
xops[3] = const0_rtx;
if (!rtx_equal_p (xops[0], xops[1]))
output_asm_insn (AS2 (mov%L0,%1,%0), xops);
if (GET_CODE (low[0]) == MEM)
output_asm_insn (AS2 (mov%L2,%3,%2), xops);
else
output_asm_insn (AS2 (xor%L2,%2,%2), xops);
RET;
}")
(define_insn "lshrdi3_const_int"
(define_insn "lshrdi3_const_int"
[(set (match_operand:DI 0 "register_operand" "=&r")
[(set (match_operand:DI 0 "register_operand" "=&r")
(lshiftrt:DI (match_operand:DI 1 "register_operand" "0")
(lshiftrt:DI (match_operand:DI 1 "register_operand" "0")
...
@@ -3974,8 +4524,8 @@
...
@@ -3974,8 +4524,8 @@
}")
}")
(define_insn "lshrsi3"
(define_insn "lshrsi3"
[(set (match_operand:SI 0 "
general
_operand" "=rm")
[(set (match_operand:SI 0 "
nonimmediate
_operand" "=rm")
(lshiftrt:SI (match_operand:SI 1 "
general
_operand" "0")
(lshiftrt:SI (match_operand:SI 1 "
nonimmediate
_operand" "0")
(match_operand:SI 2 "nonmemory_operand" "cI")))]
(match_operand:SI 2 "nonmemory_operand" "cI")))]
""
""
"*
"*
...
@@ -3987,8 +4537,8 @@
...
@@ -3987,8 +4537,8 @@
}")
}")
(define_insn "lshrhi3"
(define_insn "lshrhi3"
[(set (match_operand:HI 0 "
general
_operand" "=rm")
[(set (match_operand:HI 0 "
nonimmediate
_operand" "=rm")
(lshiftrt:HI (match_operand:HI 1 "
general
_operand" "0")
(lshiftrt:HI (match_operand:HI 1 "
nonimmediate
_operand" "0")
(match_operand:HI 2 "nonmemory_operand" "cI")))]
(match_operand:HI 2 "nonmemory_operand" "cI")))]
""
""
"*
"*
...
@@ -4000,8 +4550,8 @@
...
@@ -4000,8 +4550,8 @@
}")
}")
(define_insn "lshrqi3"
(define_insn "lshrqi3"
[(set (match_operand:QI 0 "
general
_operand" "=qm")
[(set (match_operand:QI 0 "
nonimmediate
_operand" "=qm")
(lshiftrt:QI (match_operand:QI 1 "
general
_operand" "0")
(lshiftrt:QI (match_operand:QI 1 "
nonimmediate
_operand" "0")
(match_operand:QI 2 "nonmemory_operand" "cI")))]
(match_operand:QI 2 "nonmemory_operand" "cI")))]
""
""
"*
"*
...
@@ -4015,8 +4565,8 @@
...
@@ -4015,8 +4565,8 @@
;;- rotate instructions
;;- rotate instructions
(define_insn "rotlsi3"
(define_insn "rotlsi3"
[(set (match_operand:SI 0 "
general
_operand" "=rm")
[(set (match_operand:SI 0 "
nonimmediate
_operand" "=rm")
(rotate:SI (match_operand:SI 1 "
general
_operand" "0")
(rotate:SI (match_operand:SI 1 "
nonimmediate
_operand" "0")
(match_operand:SI 2 "nonmemory_operand" "cI")))]
(match_operand:SI 2 "nonmemory_operand" "cI")))]
""
""
"*
"*
...
@@ -4028,8 +4578,8 @@
...
@@ -4028,8 +4578,8 @@
}")
}")
(define_insn "rotlhi3"
(define_insn "rotlhi3"
[(set (match_operand:HI 0 "
general
_operand" "=rm")
[(set (match_operand:HI 0 "
nonimmediate
_operand" "=rm")
(rotate:HI (match_operand:HI 1 "
general
_operand" "0")
(rotate:HI (match_operand:HI 1 "
nonimmediate
_operand" "0")
(match_operand:HI 2 "nonmemory_operand" "cI")))]
(match_operand:HI 2 "nonmemory_operand" "cI")))]
""
""
"*
"*
...
@@ -4041,8 +4591,8 @@
...
@@ -4041,8 +4591,8 @@
}")
}")
(define_insn "rotlqi3"
(define_insn "rotlqi3"
[(set (match_operand:QI 0 "
general
_operand" "=qm")
[(set (match_operand:QI 0 "
nonimmediate
_operand" "=qm")
(rotate:QI (match_operand:QI 1 "
general
_operand" "0")
(rotate:QI (match_operand:QI 1 "
nonimmediate
_operand" "0")
(match_operand:QI 2 "nonmemory_operand" "cI")))]
(match_operand:QI 2 "nonmemory_operand" "cI")))]
""
""
"*
"*
...
@@ -4054,8 +4604,8 @@
...
@@ -4054,8 +4604,8 @@
}")
}")
(define_insn "rotrsi3"
(define_insn "rotrsi3"
[(set (match_operand:SI 0 "
general
_operand" "=rm")
[(set (match_operand:SI 0 "
nonimmediate
_operand" "=rm")
(rotatert:SI (match_operand:SI 1 "
general
_operand" "0")
(rotatert:SI (match_operand:SI 1 "
nonimmediate
_operand" "0")
(match_operand:SI 2 "nonmemory_operand" "cI")))]
(match_operand:SI 2 "nonmemory_operand" "cI")))]
""
""
"*
"*
...
@@ -4067,8 +4617,8 @@
...
@@ -4067,8 +4617,8 @@
}")
}")
(define_insn "rotrhi3"
(define_insn "rotrhi3"
[(set (match_operand:HI 0 "
general
_operand" "=rm")
[(set (match_operand:HI 0 "
nonimmediate
_operand" "=rm")
(rotatert:HI (match_operand:HI 1 "
general
_operand" "0")
(rotatert:HI (match_operand:HI 1 "
nonimmediate
_operand" "0")
(match_operand:HI 2 "nonmemory_operand" "cI")))]
(match_operand:HI 2 "nonmemory_operand" "cI")))]
""
""
"*
"*
...
@@ -4080,8 +4630,8 @@
...
@@ -4080,8 +4630,8 @@
}")
}")
(define_insn "rotrqi3"
(define_insn "rotrqi3"
[(set (match_operand:QI 0 "
general
_operand" "=qm")
[(set (match_operand:QI 0 "
nonimmediate
_operand" "=qm")
(rotatert:QI (match_operand:QI 1 "
general
_operand" "0")
(rotatert:QI (match_operand:QI 1 "
nonimmediate
_operand" "0")
(match_operand:QI 2 "nonmemory_operand" "cI")))]
(match_operand:QI 2 "nonmemory_operand" "cI")))]
""
""
"*
"*
...
@@ -4098,9 +4648,9 @@
...
@@ -4098,9 +4648,9 @@
;; %ah, %bh, %ch, %dh.
;; %ah, %bh, %ch, %dh.
(define_insn "insv"
(define_insn "insv"
[(set (zero_extract:SI (match_operand:SI 0 "register_operand" "+&r")
[(set (zero_extract:SI (match_operand:SI 0 "register_operand" "+&r")
(match_operand:SI 1 "
general
_operand" "i")
(match_operand:SI 1 "
immediate
_operand" "i")
(match_operand:SI 2 "
general
_operand" "i"))
(match_operand:SI 2 "
immediate
_operand" "i"))
(match_operand:SI 3 "
general
_operand" "ri"))]
(match_operand:SI 3 "
nonmemory
_operand" "ri"))]
""
""
"*
"*
{
{
...
@@ -4136,7 +4686,7 @@
...
@@ -4136,7 +4686,7 @@
[(set (zero_extract:SI (match_operand:SI 0 "general_operand" "")
[(set (zero_extract:SI (match_operand:SI 0 "general_operand" "")
(match_operand:SI 1 "immediate_operand" "")
(match_operand:SI 1 "immediate_operand" "")
(match_operand:SI 2 "immediate_operand" ""))
(match_operand:SI 2 "immediate_operand" ""))
(match_operand:QI 3 "
general
_operand" "ri"))]
(match_operand:QI 3 "
nonmemory
_operand" "ri"))]
""
""
"
"
{
{
...
@@ -4179,9 +4729,9 @@
...
@@ -4179,9 +4729,9 @@
;; General bit set and clear.
;; General bit set and clear.
(define_insn ""
(define_insn ""
[(set (zero_extract:SI (match_operand:SI 0 "
general
_operand" "+rm")
[(set (zero_extract:SI (match_operand:SI 0 "
nonimmediate
_operand" "+rm")
(const_int 1)
(const_int 1)
(match_operand:SI 2 "
general
_operand" "r"))
(match_operand:SI 2 "
register
_operand" "r"))
(match_operand:SI 3 "const_int_operand" "n"))]
(match_operand:SI 3 "const_int_operand" "n"))]
"TARGET_USE_BIT_TEST && GET_CODE (operands[2]) != CONST_INT"
"TARGET_USE_BIT_TEST && GET_CODE (operands[2]) != CONST_INT"
"*
"*
...
@@ -4197,10 +4747,10 @@
...
@@ -4197,10 +4747,10 @@
;; Bit complement. See comments on previous pattern.
;; Bit complement. See comments on previous pattern.
;; ??? Is this really worthwhile?
;; ??? Is this really worthwhile?
(define_insn ""
(define_insn ""
[(set (match_operand:SI 0 "
general
_operand" "=rm")
[(set (match_operand:SI 0 "
nonimmediate
_operand" "=rm")
(xor:SI (ashift:SI (const_int 1)
(xor:SI (ashift:SI (const_int 1)
(match_operand:SI 1 "
general
_operand" "r"))
(match_operand:SI 1 "
register
_operand" "r"))
(match_operand:SI 2 "
general
_operand" "0")))]
(match_operand:SI 2 "
nonimmediate
_operand" "0")))]
"TARGET_USE_BIT_TEST && GET_CODE (operands[1]) != CONST_INT"
"TARGET_USE_BIT_TEST && GET_CODE (operands[1]) != CONST_INT"
"*
"*
{
{
...
@@ -4210,10 +4760,10 @@
...
@@ -4210,10 +4760,10 @@
}")
}")
(define_insn ""
(define_insn ""
[(set (match_operand:SI 0 "
general
_operand" "=rm")
[(set (match_operand:SI 0 "
nonimmediate
_operand" "=rm")
(xor:SI (match_operand:SI 1 "
general
_operand" "0")
(xor:SI (match_operand:SI 1 "
nonimmediate
_operand" "0")
(ashift:SI (const_int 1)
(ashift:SI (const_int 1)
(match_operand:SI 2 "
general
_operand" "r"))))]
(match_operand:SI 2 "
register
_operand" "r"))))]
"TARGET_USE_BIT_TEST && GET_CODE (operands[2]) != CONST_INT"
"TARGET_USE_BIT_TEST && GET_CODE (operands[2]) != CONST_INT"
"*
"*
{
{
...
@@ -4235,7 +4785,7 @@
...
@@ -4235,7 +4785,7 @@
(define_insn ""
(define_insn ""
[(set (cc0) (zero_extract (match_operand:SI 0 "register_operand" "r")
[(set (cc0) (zero_extract (match_operand:SI 0 "register_operand" "r")
(const_int 1)
(const_int 1)
(match_operand:SI 1 "
general
_operand" "r")))]
(match_operand:SI 1 "
register
_operand" "r")))]
"GET_CODE (operands[1]) != CONST_INT"
"GET_CODE (operands[1]) != CONST_INT"
"*
"*
{
{
...
@@ -4278,7 +4828,7 @@
...
@@ -4278,7 +4828,7 @@
;; The CPU may access unspecified bytes around the actual target byte.
;; The CPU may access unspecified bytes around the actual target byte.
(define_insn ""
(define_insn ""
[(set (cc0) (zero_extract (match_operand:QI 0 "
general
_operand" "rm")
[(set (cc0) (zero_extract (match_operand:QI 0 "
nonimmediate
_operand" "rm")
(match_operand:SI 1 "const_int_operand" "n")
(match_operand:SI 1 "const_int_operand" "n")
(match_operand:SI 2 "const_int_operand" "n")))]
(match_operand:SI 2 "const_int_operand" "n")))]
"GET_CODE (operands[0]) != MEM || ! MEM_VOLATILE_P (operands[0])"
"GET_CODE (operands[0]) != MEM || ! MEM_VOLATILE_P (operands[0])"
...
@@ -4559,6 +5109,14 @@
...
@@ -4559,6 +5109,14 @@
if (cc_prev_status.flags & CC_Z_IN_NOT_C)
if (cc_prev_status.flags & CC_Z_IN_NOT_C)
return \"jnc %l0\";
return \"jnc %l0\";
else
else
if (cc_prev_status.flags & CC_TEST_AX)
{
operands[1] = gen_rtx (REG, SImode, 0);
operands[2] = GEN_INT (0x4000);
output_asm_insn (AS2 (testl,%2,%1), operands);
return AS1 (jne,%l0);
}
return \"je %l0\";
return \"je %l0\";
}")
}")
...
@@ -4591,6 +5149,14 @@
...
@@ -4591,6 +5149,14 @@
if (cc_prev_status.flags & CC_Z_IN_NOT_C)
if (cc_prev_status.flags & CC_Z_IN_NOT_C)
return \"jc %l0\";
return \"jc %l0\";
else
else
if (cc_prev_status.flags & CC_TEST_AX)
{
operands[1] = gen_rtx (REG, SImode, 0);
operands[2] = GEN_INT (0x4000);
output_asm_insn (AS2 (testl,%2,%1), operands);
return AS1 (je,%l0);
}
return \"jne %l0\";
return \"jne %l0\";
}")
}")
...
@@ -4616,6 +5182,13 @@
...
@@ -4616,6 +5182,13 @@
if (TARGET_IEEE_FP && (cc_prev_status.flags & CC_IN_80387))
if (TARGET_IEEE_FP && (cc_prev_status.flags & CC_IN_80387))
return AS1 (je,%l0);
return AS1 (je,%l0);
if (cc_prev_status.flags & CC_TEST_AX)
{
operands[1] = gen_rtx (REG, SImode, 0);
operands[2] = GEN_INT (0x4100);
output_asm_insn (AS2 (testl,%2,%1), operands);
return AS1 (je,%l0);
}
OUTPUT_JUMP (\"jg %l0\", \"ja %l0\", NULL_PTR);
OUTPUT_JUMP (\"jg %l0\", \"ja %l0\", NULL_PTR);
}")
}")
...
@@ -4660,6 +5233,13 @@
...
@@ -4660,6 +5233,13 @@
if (TARGET_IEEE_FP && (cc_prev_status.flags & CC_IN_80387))
if (TARGET_IEEE_FP && (cc_prev_status.flags & CC_IN_80387))
return AS1 (je,%l0);
return AS1 (je,%l0);
if (cc_prev_status.flags & CC_TEST_AX)
{
operands[1] = gen_rtx (REG, SImode, 0);
operands[2] = GEN_INT (0x100);
output_asm_insn (AS2 (testl,%2,%1), operands);
return AS1 (jne,%l0);
}
OUTPUT_JUMP (\"jl %l0\", \"jb %l0\", \"js %l0\");
OUTPUT_JUMP (\"jl %l0\", \"jb %l0\", \"js %l0\");
}")
}")
...
@@ -4703,7 +5283,13 @@
...
@@ -4703,7 +5283,13 @@
{
{
if (TARGET_IEEE_FP && (cc_prev_status.flags & CC_IN_80387))
if (TARGET_IEEE_FP && (cc_prev_status.flags & CC_IN_80387))
return AS1 (je,%l0);
return AS1 (je,%l0);
if (cc_prev_status.flags & CC_TEST_AX)
{
operands[1] = gen_rtx (REG, SImode, 0);
operands[2] = GEN_INT (0x100);
output_asm_insn (AS2 (testl,%2,%1), operands);
return AS1 (je,%l0);
}
OUTPUT_JUMP (\"jge %l0\", \"jae %l0\", \"jns %l0\");
OUTPUT_JUMP (\"jge %l0\", \"jae %l0\", \"jns %l0\");
}")
}")
...
@@ -4747,6 +5333,13 @@
...
@@ -4747,6 +5333,13 @@
{
{
if (TARGET_IEEE_FP && (cc_prev_status.flags & CC_IN_80387))
if (TARGET_IEEE_FP && (cc_prev_status.flags & CC_IN_80387))
return AS1 (jb,%l0);
return AS1 (jb,%l0);
if (cc_prev_status.flags & CC_TEST_AX)
{
operands[1] = gen_rtx (REG, SImode, 0);
operands[2] = GEN_INT (0x4100);
output_asm_insn (AS2 (testl,%2,%1), operands);
return AS1 (jne,%l0);
}
OUTPUT_JUMP (\"jle %l0\", \"jbe %l0\", NULL_PTR);
OUTPUT_JUMP (\"jle %l0\", \"jbe %l0\", NULL_PTR);
}")
}")
...
@@ -4784,6 +5377,13 @@
...
@@ -4784,6 +5377,13 @@
if (cc_prev_status.flags & CC_Z_IN_NOT_C)
if (cc_prev_status.flags & CC_Z_IN_NOT_C)
return \"jc %l0\";
return \"jc %l0\";
else
else
if (cc_prev_status.flags & CC_TEST_AX)
{
operands[1] = gen_rtx (REG, SImode, 0);
operands[2] = GEN_INT (0x4000);
output_asm_insn (AS2 (testl,%2,%1), operands);
return AS1 (je,%l0);
}
return \"jne %l0\";
return \"jne %l0\";
}")
}")
...
@@ -4799,6 +5399,13 @@
...
@@ -4799,6 +5399,13 @@
if (cc_prev_status.flags & CC_Z_IN_NOT_C)
if (cc_prev_status.flags & CC_Z_IN_NOT_C)
return \"jnc %l0\";
return \"jnc %l0\";
else
else
if (cc_prev_status.flags & CC_TEST_AX)
{
operands[1] = gen_rtx (REG, SImode, 0);
operands[2] = GEN_INT (0x4000);
output_asm_insn (AS2 (testl,%2,%1), operands);
return AS1 (jne,%l0);
}
return \"je %l0\";
return \"je %l0\";
}")
}")
...
@@ -4813,7 +5420,13 @@
...
@@ -4813,7 +5420,13 @@
{
{
if (TARGET_IEEE_FP && (cc_prev_status.flags & CC_IN_80387))
if (TARGET_IEEE_FP && (cc_prev_status.flags & CC_IN_80387))
return AS1 (jne,%l0);
return AS1 (jne,%l0);
if (cc_prev_status.flags & CC_TEST_AX)
{
operands[1] = gen_rtx (REG, SImode, 0);
operands[2] = GEN_INT (0x4100);
output_asm_insn (AS2 (testl,%2,%1), operands);
return AS1 (jne,%l0);
}
OUTPUT_JUMP (\"jle %l0\", \"jbe %l0\", NULL_PTR);
OUTPUT_JUMP (\"jle %l0\", \"jbe %l0\", NULL_PTR);
}")
}")
...
@@ -4837,6 +5450,13 @@
...
@@ -4837,6 +5450,13 @@
{
{
if (TARGET_IEEE_FP && (cc_prev_status.flags & CC_IN_80387))
if (TARGET_IEEE_FP && (cc_prev_status.flags & CC_IN_80387))
return AS1 (jne,%l0);
return AS1 (jne,%l0);
if (cc_prev_status.flags & CC_TEST_AX)
{
operands[1] = gen_rtx (REG, SImode, 0);
operands[2] = GEN_INT (0x100);
output_asm_insn (AS2 (testl,%2,%1), operands);
return AS1 (je,%l0);
}
OUTPUT_JUMP (\"jge %l0\", \"jae %l0\", \"jns %l0\");
OUTPUT_JUMP (\"jge %l0\", \"jae %l0\", \"jns %l0\");
}")
}")
...
@@ -4861,7 +5481,13 @@
...
@@ -4861,7 +5481,13 @@
{
{
if (TARGET_IEEE_FP && (cc_prev_status.flags & CC_IN_80387))
if (TARGET_IEEE_FP && (cc_prev_status.flags & CC_IN_80387))
return AS1 (jne,%l0);
return AS1 (jne,%l0);
if (cc_prev_status.flags & CC_TEST_AX)
{
operands[1] = gen_rtx (REG, SImode, 0);
operands[2] = GEN_INT (0x100);
output_asm_insn (AS2 (testl,%2,%1), operands);
return AS1 (jne,%l0);
}
OUTPUT_JUMP (\"jl %l0\", \"jb %l0\", \"js %l0\");
OUTPUT_JUMP (\"jl %l0\", \"jb %l0\", \"js %l0\");
}")
}")
...
@@ -4886,6 +5512,13 @@
...
@@ -4886,6 +5512,13 @@
if (TARGET_IEEE_FP && (cc_prev_status.flags & CC_IN_80387))
if (TARGET_IEEE_FP && (cc_prev_status.flags & CC_IN_80387))
return AS1 (jae,%l0);
return AS1 (jae,%l0);
if (cc_prev_status.flags & CC_TEST_AX)
{
operands[1] = gen_rtx (REG, SImode, 0);
operands[2] = GEN_INT (0x4100);
output_asm_insn (AS2 (testl,%2,%1), operands);
return AS1 (je,%l0);
}
OUTPUT_JUMP (\"jg %l0\", \"ja %l0\", NULL_PTR);
OUTPUT_JUMP (\"jg %l0\", \"ja %l0\", NULL_PTR);
}")
}")
...
@@ -4907,7 +5540,7 @@
...
@@ -4907,7 +5540,7 @@
"jmp %l0")
"jmp %l0")
(define_insn "indirect_jump"
(define_insn "indirect_jump"
[(set (pc) (match_operand:SI 0 "
general
_operand" "rm"))]
[(set (pc) (match_operand:SI 0 "
nonimmediate
_operand" "rm"))]
""
""
"*
"*
{
{
...
@@ -4935,7 +5568,7 @@
...
@@ -4935,7 +5568,7 @@
(define_insn ""
(define_insn ""
[(set (pc)
[(set (pc)
(if_then_else (match_operator 0 "arithmetic_comparison_operator"
(if_then_else (match_operator 0 "arithmetic_comparison_operator"
[(plus:SI (match_operand:SI 1 "
general
_operand" "+r,m")
[(plus:SI (match_operand:SI 1 "
nonimmediate
_operand" "+r,m")
(match_operand:SI 2 "general_operand" "rmi,ri"))
(match_operand:SI 2 "general_operand" "rmi,ri"))
(const_int 0)])
(const_int 0)])
(label_ref (match_operand 3 "" ""))
(label_ref (match_operand 3 "" ""))
...
@@ -4962,7 +5595,7 @@
...
@@ -4962,7 +5595,7 @@
(define_insn ""
(define_insn ""
[(set (pc)
[(set (pc)
(if_then_else (match_operator 0 "arithmetic_comparison_operator"
(if_then_else (match_operator 0 "arithmetic_comparison_operator"
[(minus:SI (match_operand:SI 1 "
general
_operand" "+r,m")
[(minus:SI (match_operand:SI 1 "
nonimmediate
_operand" "+r,m")
(match_operand:SI 2 "general_operand" "rmi,ri"))
(match_operand:SI 2 "general_operand" "rmi,ri"))
(const_int 0)])
(const_int 0)])
(label_ref (match_operand 3 "" ""))
(label_ref (match_operand 3 "" ""))
...
@@ -5072,7 +5705,7 @@
...
@@ -5072,7 +5705,7 @@
}")
}")
(define_insn "tablejump"
(define_insn "tablejump"
[
(set (pc) (match_operand:SI 0 "
general
_operand" "rm"))
[
(set (pc) (match_operand:SI 0 "
nonimmediate
_operand" "rm"))
(use (label_ref (match_operand 1 "" "")))]
(use (label_ref (match_operand 1 "" "")))]
""
""
"
*
"
*
...
@@ -5537,7 +6170,7 @@
...
@@ -5537,7 +6170,7 @@
;; code to handle zero-length compares.
;; code to handle zero-length compares.
(define_insn ""
(define_insn ""
[
(set (match_operand:SI 0 "
general
_operand" "=&r")
[
(set (match_operand:SI 0 "
register
_operand" "=&r")
(compare:SI (mem:BLK (match_operand:SI 1 "address_operand" "S"))
(compare:SI (mem:BLK (match_operand:SI 1 "address_operand" "S"))
(mem:BLK (match_operand:SI 2 "address_operand" "D"))))
(mem:BLK (match_operand:SI 2 "address_operand" "D"))))
(use (match_operand:SI 3 "register_operand" "c"))
(use (match_operand:SI 3 "register_operand" "c"))
...
@@ -5548,7 +6181,7 @@
...
@@ -5548,7 +6181,7 @@
""
""
"
*
"
*
{
{
rtx xops
[
4
]
, label;
rtx xops
[
2
]
, label;
label = gen_label_rtx ();
label = gen_label_rtx ();
...
@@ -5558,16 +6191,13 @@
...
@@ -5558,16 +6191,13 @@
output_asm_insn (
\"
je %l0
\"
,
&label);
output_asm_insn (
\"
je %l0
\"
,
&label);
xops
[
0
]
= operands
[
0
]
;
xops
[
0
]
= operands
[
0
]
;
xops
[
1
]
= gen_rtx (MEM, QImode,
xops
[
1
]
= const1_rtx;
gen_rtx (PLUS, SImode, operands
[
1
]
, constm1_rtx));
output_asm_insn (AS2 (sbb%L0,%0,%0), xops);
xops
[
2
]
= gen_rtx (MEM, QImode,
if (QI_REG_P (xops
[
0
]
))
gen_rtx (PLUS, SImode, operands
[
2
]
, constm1_rtx));
output_asm_insn (AS2 (or%B0,%1,%b0), xops);
xops
[
3
]
= operands
[
3
]
;
else
output_asm_insn (AS2 (or%L0,%1,%0), xops);
output_asm_insn (AS2 (movz%B1%L0,%1,%0), xops);
output_asm_insn (AS2 (movz%B2%L3,%2,%3), xops);
output_asm_insn (AS2 (sub%L0,%3,%0), xops);
ASM_OUTPUT_INTERNAL_LABEL (asm_out_file,
\"
L
\"
, CODE_LABEL_NUMBER (label));
ASM_OUTPUT_INTERNAL_LABEL (asm_out_file,
\"
L
\"
, CODE_LABEL_NUMBER (label));
RET;
RET;
}")
}")
...
@@ -5596,6 +6226,7 @@
...
@@ -5596,6 +6226,7 @@
return
\"
repz
\;
cmps%B2
\"
;
return
\"
repz
\;
cmps%B2
\"
;
}")
}")
(define_expand "ffssi2"
(define_expand "ffssi2"
[
(set (match_dup 2)
[
(set (match_dup 2)
(plus:SI (ffs:SI (match_operand:SI 1 "general_operand" ""))
(plus:SI (ffs:SI (match_operand:SI 1 "general_operand" ""))
...
@@ -5610,8 +6241,8 @@
...
@@ -5610,8 +6241,8 @@
;; x86 implementations do this.
;; x86 implementations do this.
(define_insn ""
(define_insn ""
[
(set (match_operand:SI 0 "
general
_operand" "=&r")
[
(set (match_operand:SI 0 "
register
_operand" "=&r")
(plus:SI (ffs:SI (match_operand:SI 1 "
general
_operand" "rm"))
(plus:SI (ffs:SI (match_operand:SI 1 "
nonimmediate
_operand" "rm"))
(const_int -1)))]
(const_int -1)))]
""
""
"
*
"
*
...
@@ -5656,8 +6287,8 @@
...
@@ -5656,8 +6287,8 @@
"operands
[
2
]
= gen_reg_rtx (HImode);")
"operands
[
2
]
= gen_reg_rtx (HImode);")
(define_insn ""
(define_insn ""
[
(set (match_operand:HI 0 "
general
_operand" "=&r")
[
(set (match_operand:HI 0 "
register
_operand" "=&r")
(plus:HI (ffs:HI (match_operand:SI 1 "
general
_operand" "rm"))
(plus:HI (ffs:HI (match_operand:SI 1 "
nonimmediate
_operand" "rm"))
(const_int -1)))]
(const_int -1)))]
""
""
"
*
"
*
...
@@ -5706,81 +6337,171 @@
...
@@ -5706,81 +6337,171 @@
[
(match_operand:DF 1 "nonimmediate_operand" "0,fm")
[
(match_operand:DF 1 "nonimmediate_operand" "0,fm")
(match_operand:DF 2 "nonimmediate_operand" "fm,0")]))]
(match_operand:DF 2 "nonimmediate_operand" "fm,0")]))]
"TARGET_80387"
"TARGET_80387"
"
*
return output_387_binary_op (insn, operands);")
"
*
return output_387_binary_op (insn, operands);"
[
(set (attr "type")
(cond
[
(match_operand:DF 3 "is_mul" "")
(const_string "fpop")
(match_operand:DF 3 "is_div" "")
(const_string "fpdiv")
]
(const_string "fpop")
)
)])
(define_insn ""
(define_insn ""
[
(set (match_operand:DF 0 "register_operand" "=f")
[
(set (match_operand:DF 0 "register_operand" "=f")
(match_operator:DF 3 "binary_387_op"
(match_operator:DF 3 "binary_387_op"
[
(float:DF (match_operand:SI 1 "
general
_operand" "rm"))
[
(float:DF (match_operand:SI 1 "
nonimmediate
_operand" "rm"))
(match_operand:DF 2 "
general
_operand" "0")]))]
(match_operand:DF 2 "
register
_operand" "0")]))]
"TARGET_80387"
"TARGET_80387"
"
*
return output_387_binary_op (insn, operands);")
"
*
return output_387_binary_op (insn, operands);"
[
(set (attr "type")
(cond
[
(match_operand:DF 3 "is_mul" "")
(const_string "fpop")
(match_operand:DF 3 "is_div" "")
(const_string "fpdiv")
]
(const_string "fpop")
)
)])
(define_insn ""
(define_insn ""
[
(set (match_operand:XF 0 "register_operand" "=f,f")
[
(set (match_operand:XF 0 "register_operand" "=f,f")
(match_operator:XF 3 "binary_387_op"
(match_operator:XF 3 "binary_387_op"
[
(match_operand:XF 1 "
nonimmediate
_operand" "0,f")
[
(match_operand:XF 1 "
register
_operand" "0,f")
(match_operand:XF 2 "
nonimmediate
_operand" "f,0")]))]
(match_operand:XF 2 "
register
_operand" "f,0")]))]
"TARGET_80387"
"TARGET_80387"
"
*
return output_387_binary_op (insn, operands);")
"
*
return output_387_binary_op (insn, operands);"
[
(set (attr "type")
(cond
[
(match_operand:DF 3 "is_mul" "")
(const_string "fpop")
(match_operand:DF 3 "is_div" "")
(const_string "fpdiv")
]
(const_string "fpop")
)
)])
(define_insn ""
(define_insn ""
[
(set (match_operand:XF 0 "register_operand" "=f")
[
(set (match_operand:XF 0 "register_operand" "=f")
(match_operator:XF 3 "binary_387_op"
(match_operator:XF 3 "binary_387_op"
[
(float:XF (match_operand:SI 1 "
general
_operand" "rm"))
[
(float:XF (match_operand:SI 1 "
nonimmediate
_operand" "rm"))
(match_operand:XF 2 "
general
_operand" "0")]))]
(match_operand:XF 2 "
register
_operand" "0")]))]
"TARGET_80387"
"TARGET_80387"
"
*
return output_387_binary_op (insn, operands);")
"
*
return output_387_binary_op (insn, operands);"
[
(set (attr "type")
(cond
[
(match_operand:DF 3 "is_mul" "")
(const_string "fpop")
(match_operand:DF 3 "is_div" "")
(const_string "fpdiv")
]
(const_string "fpop")
)
)])
(define_insn ""
(define_insn ""
[
(set (match_operand:XF 0 "register_operand" "=f,f")
[
(set (match_operand:XF 0 "register_operand" "=f,f")
(match_operator:XF 3 "binary_387_op"
(match_operator:XF 3 "binary_387_op"
[
(float_extend:XF (match_operand:SF 1 "
general
_operand" "fm,0"))
[
(float_extend:XF (match_operand:SF 1 "
nonimmediate
_operand" "fm,0"))
(match_operand:XF 2 "
general
_operand" "0,f")]))]
(match_operand:XF 2 "
register
_operand" "0,f")]))]
"TARGET_80387"
"TARGET_80387"
"
*
return output_387_binary_op (insn, operands);")
"
*
return output_387_binary_op (insn, operands);"
[
(set (attr "type")
(cond
[
(match_operand:DF 3 "is_mul" "")
(const_string "fpop")
(match_operand:DF 3 "is_div" "")
(const_string "fpdiv")
]
(const_string "fpop")
)
)])
(define_insn ""
(define_insn ""
[
(set (match_operand:XF 0 "register_operand" "=f")
[
(set (match_operand:XF 0 "register_operand" "=f")
(match_operator:XF 3 "binary_387_op"
(match_operator:XF 3 "binary_387_op"
[
(match_operand:XF 1 "
general
_operand" "0")
[
(match_operand:XF 1 "
register
_operand" "0")
(float:XF (match_operand:SI 2 "
general
_operand" "rm"))]))]
(float:XF (match_operand:SI 2 "
nonimmediate
_operand" "rm"))]))]
"TARGET_80387"
"TARGET_80387"
"
*
return output_387_binary_op (insn, operands);")
"
*
return output_387_binary_op (insn, operands);"
[
(set (attr "type")
(cond
[
(match_operand:DF 3 "is_mul" "")
(const_string "fpop")
(match_operand:DF 3 "is_div" "")
(const_string "fpdiv")
]
(const_string "fpop")
)
)])
(define_insn ""
(define_insn ""
[
(set (match_operand:XF 0 "register_operand" "=f,f")
[
(set (match_operand:XF 0 "register_operand" "=f,f")
(match_operator:XF 3 "binary_387_op"
(match_operator:XF 3 "binary_387_op"
[
(match_operand:XF 1 "
general
_operand" "0,f")
[
(match_operand:XF 1 "
register
_operand" "0,f")
(float_extend:XF
(float_extend:XF
(match_operand:SF 2 "
general
_operand" "fm,0"))]))]
(match_operand:SF 2 "
nonimmediate
_operand" "fm,0"))]))]
"TARGET_80387"
"TARGET_80387"
"
*
return output_387_binary_op (insn, operands);")
"
*
return output_387_binary_op (insn, operands);"
[
(set (attr "type")
(cond
[
(match_operand:DF 3 "is_mul" "")
(const_string "fpop")
(match_operand:DF 3 "is_div" "")
(const_string "fpdiv")
]
(const_string "fpop")
)
)])
(define_insn ""
(define_insn ""
[
(set (match_operand:DF 0 "register_operand" "=f,f")
[
(set (match_operand:DF 0 "register_operand" "=f,f")
(match_operator:DF 3 "binary_387_op"
(match_operator:DF 3 "binary_387_op"
[
(float_extend:DF (match_operand:SF 1 "
general
_operand" "fm,0"))
[
(float_extend:DF (match_operand:SF 1 "
nonimmediate
_operand" "fm,0"))
(match_operand:DF 2 "
general
_operand" "0,f")]))]
(match_operand:DF 2 "
register
_operand" "0,f")]))]
"TARGET_80387"
"TARGET_80387"
"
*
return output_387_binary_op (insn, operands);")
"
*
return output_387_binary_op (insn, operands);"
[
(set (attr "type")
(cond
[
(match_operand:DF 3 "is_mul" "")
(const_string "fpop")
(match_operand:DF 3 "is_div" "")
(const_string "fpdiv")
]
(const_string "fpop")
)
)])
(define_insn ""
(define_insn ""
[
(set (match_operand:DF 0 "register_operand" "=f")
[
(set (match_operand:DF 0 "register_operand" "=f")
(match_operator:DF 3 "binary_387_op"
(match_operator:DF 3 "binary_387_op"
[
(match_operand:DF 1 "
general
_operand" "0")
[
(match_operand:DF 1 "
register
_operand" "0")
(float:DF (match_operand:SI 2 "
general
_operand" "rm"))]))]
(float:DF (match_operand:SI 2 "
nonimmediate
_operand" "rm"))]))]
"TARGET_80387"
"TARGET_80387"
"
*
return output_387_binary_op (insn, operands);")
"
*
return output_387_binary_op (insn, operands);"
[
(set (attr "type")
(cond
[
(match_operand:DF 3 "is_mul" "")
(const_string "fpop")
(match_operand:DF 3 "is_div" "")
(const_string "fpdiv")
]
(const_string "fpop")
)
)])
(define_insn ""
(define_insn ""
[
(set (match_operand:DF 0 "register_operand" "=f,f")
[
(set (match_operand:DF 0 "register_operand" "=f,f")
(match_operator:DF 3 "binary_387_op"
(match_operator:DF 3 "binary_387_op"
[
(match_operand:DF 1 "
general
_operand" "0,f")
[
(match_operand:DF 1 "
register
_operand" "0,f")
(float_extend:DF
(float_extend:DF
(match_operand:SF 2 "
general
_operand" "fm,0"))]))]
(match_operand:SF 2 "
nonimmediate
_operand" "fm,0"))]))]
"TARGET_80387"
"TARGET_80387"
"
*
return output_387_binary_op (insn, operands);")
"
*
return output_387_binary_op (insn, operands);"
[
(set (attr "type")
(cond
[
(match_operand:DF 3 "is_mul" "")
(const_string "fpop")
(match_operand:DF 3 "is_div" "")
(const_string "fpdiv")
]
(const_string "fpop")
)
)])
(define_insn ""
(define_insn ""
[
(set (match_operand:SF 0 "register_operand" "=f,f")
[
(set (match_operand:SF 0 "register_operand" "=f,f")
...
@@ -5788,23 +6509,50 @@
...
@@ -5788,23 +6509,50 @@
[
(match_operand:SF 1 "nonimmediate_operand" "0,fm")
[
(match_operand:SF 1 "nonimmediate_operand" "0,fm")
(match_operand:SF 2 "nonimmediate_operand" "fm,0")]))]
(match_operand:SF 2 "nonimmediate_operand" "fm,0")]))]
"TARGET_80387"
"TARGET_80387"
"
*
return output_387_binary_op (insn, operands);")
"
*
return output_387_binary_op (insn, operands);"
[
(set (attr "type")
(cond
[
(match_operand:DF 3 "is_mul" "")
(const_string "fpop")
(match_operand:DF 3 "is_div" "")
(const_string "fpdiv")
]
(const_string "fpop")
)
)])
(define_insn ""
(define_insn ""
[
(set (match_operand:SF 0 "register_operand" "=f")
[
(set (match_operand:SF 0 "register_operand" "=f")
(match_operator:SF 3 "binary_387_op"
(match_operator:SF 3 "binary_387_op"
[
(float:SF (match_operand:SI 1 "
general
_operand" "rm"))
[
(float:SF (match_operand:SI 1 "
nonimmediate
_operand" "rm"))
(match_operand:SF 2 "
general
_operand" "0")]))]
(match_operand:SF 2 "
register
_operand" "0")]))]
"TARGET_80387"
"TARGET_80387"
"
*
return output_387_binary_op (insn, operands);")
"
*
return output_387_binary_op (insn, operands);"
[
(set (attr "type")
(cond
[
(match_operand:DF 3 "is_mul" "")
(const_string "fpop")
(match_operand:DF 3 "is_div" "")
(const_string "fpdiv")
]
(const_string "fpop")
)
)])
(define_insn ""
(define_insn ""
[
(set (match_operand:SF 0 "register_operand" "=f")
[
(set (match_operand:SF 0 "register_operand" "=f")
(match_operator:SF 3 "binary_387_op"
(match_operator:SF 3 "binary_387_op"
[
(match_operand:SF 1 "
general
_operand" "0")
[
(match_operand:SF 1 "
register
_operand" "0")
(float:SF (match_operand:SI 2 "
general
_operand" "rm"))]))]
(float:SF (match_operand:SI 2 "
nonimmediate
_operand" "rm"))]))]
"TARGET_80387"
"TARGET_80387"
"
*
return output_387_binary_op (insn, operands);")
"
*
return output_387_binary_op (insn, operands);"
[
(set (attr "type")
(cond
[
(match_operand:DF 3 "is_mul" "")
(const_string "fpop")
(match_operand:DF 3 "is_div" "")
(const_string "fpdiv")
]
(const_string "fpop")
)
)])
(define_expand "strlensi"
(define_expand "strlensi"
[
(parallel
[
(set (match_dup 4)
[
(parallel
[
(set (match_dup 4)
...
@@ -5888,6 +6636,14 @@
...
@@ -5888,6 +6636,14 @@
return
\"
repnz
\;
scas%B2
\"
;
return
\"
repnz
\;
scas%B2
\"
;
}")
}")
(define_insn "strlensi_unroll"
[
(set (match_operand:SI 0 "register_operand" "=&r,&r")
(unspec:SI
[
(mem:BLK (match_operand:SI 1 "address_operand" "r,r"))
(match_operand:SI 2 "immediate_operand" "i,i")] 0))
(clobber (match_scratch:SI 3 "=&q,&r"))]
"optimize > 1"
"
*
return output_strlen_unroll (operands);")
;; the only difference between the following patterns is the register preference
;; the only difference between the following patterns is the register preference
;; on a pentium using a q-register saves one clock cycle per 4 characters
;; on a pentium using a q-register saves one clock cycle per 4 characters
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment