|
|
|
@ -11064,118 +11064,20 @@
|
|
|
|
|
;; P6 processors will jump to the address after the decrement when %esp
|
|
|
|
|
;; is used as a call operand, so they will execute return address as a code.
|
|
|
|
|
;; See Pentium Pro errata 70, Pentium 2 errata A33 and Pentium 3 errata E17.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;; Register constraint for call instruction.
|
|
|
|
|
(define_mode_attr c [(SI "l") (DI "r")])
|
|
|
|
|
|
|
|
|
|
;; Call subroutine returning no value.
|
|
|
|
|
|
|
|
|
|
(define_expand "call_pop"
|
|
|
|
|
[(parallel [(call (match_operand:QI 0 "" "")
|
|
|
|
|
(match_operand:SI 1 "" ""))
|
|
|
|
|
(set (reg:SI SP_REG)
|
|
|
|
|
(plus:SI (reg:SI SP_REG)
|
|
|
|
|
(match_operand:SI 3 "" "")))])]
|
|
|
|
|
"!TARGET_64BIT"
|
|
|
|
|
{
|
|
|
|
|
ix86_expand_call (NULL, operands[0], operands[1],
|
|
|
|
|
operands[2], operands[3], 0);
|
|
|
|
|
DONE;
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
(define_insn_and_split "*call_pop_0_vzeroupper"
|
|
|
|
|
[(parallel
|
|
|
|
|
[(call (mem:QI (match_operand:SI 0 "constant_call_address_operand" ""))
|
|
|
|
|
(match_operand:SI 1 "" ""))
|
|
|
|
|
(set (reg:SI SP_REG)
|
|
|
|
|
(plus:SI (reg:SI SP_REG)
|
|
|
|
|
(match_operand:SI 2 "immediate_operand" "")))])
|
|
|
|
|
(unspec [(match_operand 3 "const_int_operand" "")]
|
|
|
|
|
UNSPEC_CALL_NEEDS_VZEROUPPER)]
|
|
|
|
|
"TARGET_VZEROUPPER && !TARGET_64BIT"
|
|
|
|
|
"#"
|
|
|
|
|
"&& reload_completed"
|
|
|
|
|
[(const_int 0)]
|
|
|
|
|
"ix86_split_call_vzeroupper (curr_insn, operands[3]); DONE;"
|
|
|
|
|
[(set_attr "type" "call")])
|
|
|
|
|
|
|
|
|
|
(define_insn "*call_pop_0"
|
|
|
|
|
[(call (mem:QI (match_operand:SI 0 "constant_call_address_operand" ""))
|
|
|
|
|
(match_operand:SI 1 "" ""))
|
|
|
|
|
(set (reg:SI SP_REG)
|
|
|
|
|
(plus:SI (reg:SI SP_REG)
|
|
|
|
|
(match_operand:SI 2 "immediate_operand" "")))]
|
|
|
|
|
"!TARGET_64BIT"
|
|
|
|
|
{
|
|
|
|
|
if (SIBLING_CALL_P (insn))
|
|
|
|
|
return "jmp\t%P0";
|
|
|
|
|
else
|
|
|
|
|
return "call\t%P0";
|
|
|
|
|
}
|
|
|
|
|
[(set_attr "type" "call")])
|
|
|
|
|
|
|
|
|
|
(define_insn_and_split "*call_pop_1_vzeroupper"
|
|
|
|
|
[(parallel
|
|
|
|
|
[(call (mem:QI (match_operand:SI 0 "call_insn_operand" "lsm"))
|
|
|
|
|
(match_operand:SI 1 "" ""))
|
|
|
|
|
(set (reg:SI SP_REG)
|
|
|
|
|
(plus:SI (reg:SI SP_REG)
|
|
|
|
|
(match_operand:SI 2 "immediate_operand" "i")))])
|
|
|
|
|
(unspec [(match_operand 3 "const_int_operand" "")]
|
|
|
|
|
UNSPEC_CALL_NEEDS_VZEROUPPER)]
|
|
|
|
|
"TARGET_VZEROUPPER && !TARGET_64BIT && !SIBLING_CALL_P (insn)"
|
|
|
|
|
"#"
|
|
|
|
|
"&& reload_completed"
|
|
|
|
|
[(const_int 0)]
|
|
|
|
|
"ix86_split_call_vzeroupper (curr_insn, operands[3]); DONE;"
|
|
|
|
|
[(set_attr "type" "call")])
|
|
|
|
|
|
|
|
|
|
(define_insn "*call_pop_1"
|
|
|
|
|
[(call (mem:QI (match_operand:SI 0 "call_insn_operand" "lsm"))
|
|
|
|
|
(match_operand:SI 1 "" ""))
|
|
|
|
|
(set (reg:SI SP_REG)
|
|
|
|
|
(plus:SI (reg:SI SP_REG)
|
|
|
|
|
(match_operand:SI 2 "immediate_operand" "i")))]
|
|
|
|
|
"!TARGET_64BIT && !SIBLING_CALL_P (insn)"
|
|
|
|
|
{
|
|
|
|
|
if (constant_call_address_operand (operands[0], Pmode))
|
|
|
|
|
return "call\t%P0";
|
|
|
|
|
return "call\t%A0";
|
|
|
|
|
}
|
|
|
|
|
[(set_attr "type" "call")])
|
|
|
|
|
|
|
|
|
|
(define_insn_and_split "*sibcall_pop_1_vzeroupper"
|
|
|
|
|
[(parallel
|
|
|
|
|
[(call (mem:QI (match_operand:SI 0 "sibcall_insn_operand" "s,U"))
|
|
|
|
|
(match_operand:SI 1 "" ""))
|
|
|
|
|
(set (reg:SI SP_REG)
|
|
|
|
|
(plus:SI (reg:SI SP_REG)
|
|
|
|
|
(match_operand:SI 2 "immediate_operand" "i,i")))])
|
|
|
|
|
(unspec [(match_operand 3 "const_int_operand" "")]
|
|
|
|
|
UNSPEC_CALL_NEEDS_VZEROUPPER)]
|
|
|
|
|
"TARGET_VZEROUPPER && !TARGET_64BIT && SIBLING_CALL_P (insn)"
|
|
|
|
|
"#"
|
|
|
|
|
"&& reload_completed"
|
|
|
|
|
[(const_int 0)]
|
|
|
|
|
"ix86_split_call_vzeroupper (curr_insn, operands[3]); DONE;"
|
|
|
|
|
[(set_attr "type" "call")])
|
|
|
|
|
|
|
|
|
|
(define_insn "*sibcall_pop_1"
|
|
|
|
|
[(call (mem:QI (match_operand:SI 0 "sibcall_insn_operand" "s,U"))
|
|
|
|
|
(match_operand:SI 1 "" ""))
|
|
|
|
|
(set (reg:SI SP_REG)
|
|
|
|
|
(plus:SI (reg:SI SP_REG)
|
|
|
|
|
(match_operand:SI 2 "immediate_operand" "i,i")))]
|
|
|
|
|
"!TARGET_64BIT && SIBLING_CALL_P (insn)"
|
|
|
|
|
"@
|
|
|
|
|
jmp\t%P0
|
|
|
|
|
jmp\t%A0"
|
|
|
|
|
[(set_attr "type" "call")])
|
|
|
|
|
|
|
|
|
|
(define_expand "call"
|
|
|
|
|
[(call (match_operand:QI 0 "" "")
|
|
|
|
|
(match_operand 1 "" ""))
|
|
|
|
|
(use (match_operand 2 "" ""))]
|
|
|
|
|
""
|
|
|
|
|
{
|
|
|
|
|
ix86_expand_call (NULL, operands[0], operands[1], operands[2], NULL, 0);
|
|
|
|
|
ix86_expand_call (NULL, operands[0], operands[1],
|
|
|
|
|
operands[2], NULL, 0);
|
|
|
|
|
DONE;
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
@ -11185,91 +11087,33 @@
|
|
|
|
|
(use (match_operand 2 "" ""))]
|
|
|
|
|
""
|
|
|
|
|
{
|
|
|
|
|
ix86_expand_call (NULL, operands[0], operands[1], operands[2], NULL, 1);
|
|
|
|
|
ix86_expand_call (NULL, operands[0], operands[1],
|
|
|
|
|
operands[2], NULL, 1);
|
|
|
|
|
DONE;
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
(define_insn_and_split "*call_0_vzeroupper"
|
|
|
|
|
[(call (mem:QI (match_operand 0 "constant_call_address_operand" ""))
|
|
|
|
|
(define_insn_and_split "*call_vzeroupper"
|
|
|
|
|
[(call (mem:QI (match_operand:P 0 "call_insn_operand" "<c>zm"))
|
|
|
|
|
(match_operand 1 "" ""))
|
|
|
|
|
(unspec [(match_operand 2 "const_int_operand" "")]
|
|
|
|
|
UNSPEC_CALL_NEEDS_VZEROUPPER)]
|
|
|
|
|
"TARGET_VZEROUPPER"
|
|
|
|
|
"TARGET_VZEROUPPER && !SIBLING_CALL_P (insn)"
|
|
|
|
|
"#"
|
|
|
|
|
"&& reload_completed"
|
|
|
|
|
[(const_int 0)]
|
|
|
|
|
"ix86_split_call_vzeroupper (curr_insn, operands[2]); DONE;"
|
|
|
|
|
[(set_attr "type" "call")])
|
|
|
|
|
|
|
|
|
|
(define_insn "*call_0"
|
|
|
|
|
[(call (mem:QI (match_operand 0 "constant_call_address_operand" ""))
|
|
|
|
|
(define_insn "*call"
|
|
|
|
|
[(call (mem:QI (match_operand:P 0 "call_insn_operand" "<c>zm"))
|
|
|
|
|
(match_operand 1 "" ""))]
|
|
|
|
|
""
|
|
|
|
|
{ return ix86_output_call_insn (insn, operands[0], 0); }
|
|
|
|
|
"!SIBLING_CALL_P (insn)"
|
|
|
|
|
"* return ix86_output_call_insn (insn, operands[0]);"
|
|
|
|
|
[(set_attr "type" "call")])
|
|
|
|
|
|
|
|
|
|
(define_insn_and_split "*call_1_vzeroupper"
|
|
|
|
|
[(call (mem:QI (match_operand:SI 0 "call_insn_operand" "lsm"))
|
|
|
|
|
(match_operand 1 "" ""))
|
|
|
|
|
(unspec [(match_operand 2 "const_int_operand" "")]
|
|
|
|
|
UNSPEC_CALL_NEEDS_VZEROUPPER)]
|
|
|
|
|
"TARGET_VZEROUPPER && !TARGET_64BIT && !SIBLING_CALL_P (insn)"
|
|
|
|
|
"#"
|
|
|
|
|
"&& reload_completed"
|
|
|
|
|
[(const_int 0)]
|
|
|
|
|
"ix86_split_call_vzeroupper (curr_insn, operands[2]); DONE;"
|
|
|
|
|
[(set_attr "type" "call")])
|
|
|
|
|
|
|
|
|
|
(define_insn "*call_1"
|
|
|
|
|
[(call (mem:QI (match_operand:SI 0 "call_insn_operand" "lsm"))
|
|
|
|
|
(match_operand 1 "" ""))]
|
|
|
|
|
"!TARGET_64BIT && !SIBLING_CALL_P (insn)"
|
|
|
|
|
{ return ix86_output_call_insn (insn, operands[0], 0); }
|
|
|
|
|
[(set_attr "type" "call")])
|
|
|
|
|
|
|
|
|
|
(define_insn_and_split "*sibcall_1_vzeroupper"
|
|
|
|
|
[(call (mem:QI (match_operand:SI 0 "sibcall_insn_operand" "s,U"))
|
|
|
|
|
(match_operand 1 "" ""))
|
|
|
|
|
(unspec [(match_operand 2 "const_int_operand" "")]
|
|
|
|
|
UNSPEC_CALL_NEEDS_VZEROUPPER)]
|
|
|
|
|
"TARGET_VZEROUPPER && !TARGET_64BIT && SIBLING_CALL_P (insn)"
|
|
|
|
|
"#"
|
|
|
|
|
"&& reload_completed"
|
|
|
|
|
[(const_int 0)]
|
|
|
|
|
"ix86_split_call_vzeroupper (curr_insn, operands[2]); DONE;"
|
|
|
|
|
[(set_attr "type" "call")])
|
|
|
|
|
|
|
|
|
|
(define_insn "*sibcall_1"
|
|
|
|
|
[(call (mem:QI (match_operand:SI 0 "sibcall_insn_operand" "s,U"))
|
|
|
|
|
(match_operand 1 "" ""))]
|
|
|
|
|
"!TARGET_64BIT && SIBLING_CALL_P (insn)"
|
|
|
|
|
{ return ix86_output_call_insn (insn, operands[0], 0); }
|
|
|
|
|
[(set_attr "type" "call")])
|
|
|
|
|
|
|
|
|
|
(define_insn_and_split "*call_1_rex64_vzeroupper"
|
|
|
|
|
[(call (mem:QI (match_operand:DI 0 "call_insn_operand" "rsm"))
|
|
|
|
|
(match_operand 1 "" ""))
|
|
|
|
|
(unspec [(match_operand 2 "const_int_operand" "")]
|
|
|
|
|
UNSPEC_CALL_NEEDS_VZEROUPPER)]
|
|
|
|
|
"TARGET_VZEROUPPER && TARGET_64BIT && !SIBLING_CALL_P (insn)
|
|
|
|
|
&& ix86_cmodel != CM_LARGE && ix86_cmodel != CM_LARGE_PIC"
|
|
|
|
|
"#"
|
|
|
|
|
"&& reload_completed"
|
|
|
|
|
[(const_int 0)]
|
|
|
|
|
"ix86_split_call_vzeroupper (curr_insn, operands[2]); DONE;"
|
|
|
|
|
[(set_attr "type" "call")])
|
|
|
|
|
|
|
|
|
|
(define_insn "*call_1_rex64"
|
|
|
|
|
[(call (mem:QI (match_operand:DI 0 "call_insn_operand" "rsm"))
|
|
|
|
|
(match_operand 1 "" ""))]
|
|
|
|
|
"TARGET_64BIT && !SIBLING_CALL_P (insn)
|
|
|
|
|
&& ix86_cmodel != CM_LARGE && ix86_cmodel != CM_LARGE_PIC"
|
|
|
|
|
{ return ix86_output_call_insn (insn, operands[0], 0); }
|
|
|
|
|
[(set_attr "type" "call")])
|
|
|
|
|
|
|
|
|
|
(define_insn_and_split "*call_1_rex64_ms_sysv_vzeroupper"
|
|
|
|
|
(define_insn_and_split "*call_rex64_ms_sysv_vzeroupper"
|
|
|
|
|
[(parallel
|
|
|
|
|
[(call (mem:QI (match_operand:DI 0 "call_insn_operand" "rsm"))
|
|
|
|
|
[(call (mem:QI (match_operand:DI 0 "call_insn_operand" "rzm"))
|
|
|
|
|
(match_operand 1 "" ""))
|
|
|
|
|
(unspec [(const_int 0)] UNSPEC_MS_TO_SYSV_CALL)
|
|
|
|
|
(clobber (reg:TI XMM6_REG))
|
|
|
|
@ -11293,8 +11137,8 @@
|
|
|
|
|
"ix86_split_call_vzeroupper (curr_insn, operands[2]); DONE;"
|
|
|
|
|
[(set_attr "type" "call")])
|
|
|
|
|
|
|
|
|
|
(define_insn "*call_1_rex64_ms_sysv"
|
|
|
|
|
[(call (mem:QI (match_operand:DI 0 "call_insn_operand" "rsm"))
|
|
|
|
|
(define_insn "*call_rex64_ms_sysv"
|
|
|
|
|
[(call (mem:QI (match_operand:DI 0 "call_insn_operand" "rzm"))
|
|
|
|
|
(match_operand 1 "" ""))
|
|
|
|
|
(unspec [(const_int 0)] UNSPEC_MS_TO_SYSV_CALL)
|
|
|
|
|
(clobber (reg:TI XMM6_REG))
|
|
|
|
@ -11310,48 +11154,209 @@
|
|
|
|
|
(clobber (reg:DI SI_REG))
|
|
|
|
|
(clobber (reg:DI DI_REG))]
|
|
|
|
|
"TARGET_64BIT && !SIBLING_CALL_P (insn)"
|
|
|
|
|
{ return ix86_output_call_insn (insn, operands[0], 0); }
|
|
|
|
|
"* return ix86_output_call_insn (insn, operands[0]);"
|
|
|
|
|
[(set_attr "type" "call")])
|
|
|
|
|
|
|
|
|
|
(define_insn_and_split "*call_1_rex64_large_vzeroupper"
|
|
|
|
|
[(call (mem:QI (match_operand:DI 0 "call_insn_operand" "rm"))
|
|
|
|
|
(define_insn_and_split "*sibcall_vzeroupper"
|
|
|
|
|
[(call (mem:QI (match_operand:P 0 "sibcall_insn_operand" "Uz"))
|
|
|
|
|
(match_operand 1 "" ""))
|
|
|
|
|
(unspec [(match_operand 2 "const_int_operand" "")]
|
|
|
|
|
UNSPEC_CALL_NEEDS_VZEROUPPER)]
|
|
|
|
|
"TARGET_VZEROUPPER && SIBLING_CALL_P (insn)"
|
|
|
|
|
"#"
|
|
|
|
|
"&& reload_completed"
|
|
|
|
|
[(const_int 0)]
|
|
|
|
|
"ix86_split_call_vzeroupper (curr_insn, operands[2]); DONE;"
|
|
|
|
|
[(set_attr "type" "call")])
|
|
|
|
|
|
|
|
|
|
(define_insn "*sibcall"
|
|
|
|
|
[(call (mem:QI (match_operand:P 0 "sibcall_insn_operand" "Uz"))
|
|
|
|
|
(match_operand 1 "" ""))]
|
|
|
|
|
"SIBLING_CALL_P (insn)"
|
|
|
|
|
"* return ix86_output_call_insn (insn, operands[0]);"
|
|
|
|
|
[(set_attr "type" "call")])
|
|
|
|
|
|
|
|
|
|
(define_expand "call_pop"
|
|
|
|
|
[(parallel [(call (match_operand:QI 0 "" "")
|
|
|
|
|
(match_operand:SI 1 "" ""))
|
|
|
|
|
(set (reg:SI SP_REG)
|
|
|
|
|
(plus:SI (reg:SI SP_REG)
|
|
|
|
|
(match_operand:SI 3 "" "")))])]
|
|
|
|
|
"!TARGET_64BIT"
|
|
|
|
|
{
|
|
|
|
|
ix86_expand_call (NULL, operands[0], operands[1],
|
|
|
|
|
operands[2], operands[3], 0);
|
|
|
|
|
DONE;
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
(define_insn_and_split "*call_pop_vzeroupper"
|
|
|
|
|
[(parallel
|
|
|
|
|
[(call (mem:QI (match_operand:SI 0 "call_insn_operand" "lzm"))
|
|
|
|
|
(match_operand:SI 1 "" ""))
|
|
|
|
|
(set (reg:SI SP_REG)
|
|
|
|
|
(plus:SI (reg:SI SP_REG)
|
|
|
|
|
(match_operand:SI 2 "immediate_operand" "i")))])
|
|
|
|
|
(unspec [(match_operand 3 "const_int_operand" "")]
|
|
|
|
|
UNSPEC_CALL_NEEDS_VZEROUPPER)]
|
|
|
|
|
"TARGET_VZEROUPPER && !TARGET_64BIT && !SIBLING_CALL_P (insn)"
|
|
|
|
|
"#"
|
|
|
|
|
"&& reload_completed"
|
|
|
|
|
[(const_int 0)]
|
|
|
|
|
"ix86_split_call_vzeroupper (curr_insn, operands[3]); DONE;"
|
|
|
|
|
[(set_attr "type" "call")])
|
|
|
|
|
|
|
|
|
|
(define_insn "*call_pop"
|
|
|
|
|
[(call (mem:QI (match_operand:SI 0 "call_insn_operand" "lzm"))
|
|
|
|
|
(match_operand 1 "" ""))
|
|
|
|
|
(set (reg:SI SP_REG)
|
|
|
|
|
(plus:SI (reg:SI SP_REG)
|
|
|
|
|
(match_operand:SI 2 "immediate_operand" "i")))]
|
|
|
|
|
"!TARGET_64BIT && !SIBLING_CALL_P (insn)"
|
|
|
|
|
"* return ix86_output_call_insn (insn, operands[0]);"
|
|
|
|
|
[(set_attr "type" "call")])
|
|
|
|
|
|
|
|
|
|
(define_insn_and_split "*sibcall_pop_vzeroupper"
|
|
|
|
|
[(parallel
|
|
|
|
|
[(call (mem:QI (match_operand:SI 0 "sibcall_insn_operand" "Uz"))
|
|
|
|
|
(match_operand 1 "" ""))
|
|
|
|
|
(set (reg:SI SP_REG)
|
|
|
|
|
(plus:SI (reg:SI SP_REG)
|
|
|
|
|
(match_operand:SI 2 "immediate_operand" "i")))])
|
|
|
|
|
(unspec [(match_operand 3 "const_int_operand" "")]
|
|
|
|
|
UNSPEC_CALL_NEEDS_VZEROUPPER)]
|
|
|
|
|
"TARGET_VZEROUPPER && !TARGET_64BIT && SIBLING_CALL_P (insn)"
|
|
|
|
|
"#"
|
|
|
|
|
"&& reload_completed"
|
|
|
|
|
[(const_int 0)]
|
|
|
|
|
"ix86_split_call_vzeroupper (curr_insn, operands[3]); DONE;"
|
|
|
|
|
[(set_attr "type" "call")])
|
|
|
|
|
|
|
|
|
|
(define_insn "*sibcall_pop"
|
|
|
|
|
[(call (mem:QI (match_operand:SI 0 "sibcall_insn_operand" "Uz"))
|
|
|
|
|
(match_operand 1 "" ""))
|
|
|
|
|
(set (reg:SI SP_REG)
|
|
|
|
|
(plus:SI (reg:SI SP_REG)
|
|
|
|
|
(match_operand:SI 2 "immediate_operand" "i")))]
|
|
|
|
|
"!TARGET_64BIT && SIBLING_CALL_P (insn)"
|
|
|
|
|
"* return ix86_output_call_insn (insn, operands[0]);"
|
|
|
|
|
[(set_attr "type" "call")])
|
|
|
|
|
|
|
|
|
|
;; Call subroutine, returning value in operand 0
|
|
|
|
|
|
|
|
|
|
(define_expand "call_value"
|
|
|
|
|
[(set (match_operand 0 "" "")
|
|
|
|
|
(call (match_operand:QI 1 "" "")
|
|
|
|
|
(match_operand 2 "" "")))
|
|
|
|
|
(use (match_operand 3 "" ""))]
|
|
|
|
|
""
|
|
|
|
|
{
|
|
|
|
|
ix86_expand_call (operands[0], operands[1], operands[2],
|
|
|
|
|
operands[3], NULL, 0);
|
|
|
|
|
DONE;
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
(define_expand "sibcall_value"
|
|
|
|
|
[(set (match_operand 0 "" "")
|
|
|
|
|
(call (match_operand:QI 1 "" "")
|
|
|
|
|
(match_operand 2 "" "")))
|
|
|
|
|
(use (match_operand 3 "" ""))]
|
|
|
|
|
""
|
|
|
|
|
{
|
|
|
|
|
ix86_expand_call (operands[0], operands[1], operands[2],
|
|
|
|
|
operands[3], NULL, 1);
|
|
|
|
|
DONE;
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
(define_insn_and_split "*call_value_vzeroupper"
|
|
|
|
|
[(set (match_operand 0 "" "")
|
|
|
|
|
(call (mem:QI (match_operand:P 1 "call_insn_operand" "<c>zm"))
|
|
|
|
|
(match_operand 2 "" "")))
|
|
|
|
|
(unspec [(match_operand 3 "const_int_operand" "")]
|
|
|
|
|
UNSPEC_CALL_NEEDS_VZEROUPPER)]
|
|
|
|
|
"TARGET_VZEROUPPER && !SIBLING_CALL_P (insn)"
|
|
|
|
|
"#"
|
|
|
|
|
"&& reload_completed"
|
|
|
|
|
[(const_int 0)]
|
|
|
|
|
"ix86_split_call_vzeroupper (curr_insn, operands[3]); DONE;"
|
|
|
|
|
[(set_attr "type" "callv")])
|
|
|
|
|
|
|
|
|
|
(define_insn "*call_value"
|
|
|
|
|
[(set (match_operand 0 "" "")
|
|
|
|
|
(call (mem:QI (match_operand:P 1 "call_insn_operand" "<c>zm"))
|
|
|
|
|
(match_operand 2 "" "")))]
|
|
|
|
|
"!SIBLING_CALL_P (insn)"
|
|
|
|
|
"* return ix86_output_call_insn (insn, operands[1]);"
|
|
|
|
|
[(set_attr "type" "callv")])
|
|
|
|
|
|
|
|
|
|
(define_insn_and_split "*sibcall_value_vzeroupper"
|
|
|
|
|
[(set (match_operand 0 "" "")
|
|
|
|
|
(call (mem:QI (match_operand:P 1 "sibcall_insn_operand" "Uz"))
|
|
|
|
|
(match_operand 2 "" "")))
|
|
|
|
|
(unspec [(match_operand 3 "const_int_operand" "")]
|
|
|
|
|
UNSPEC_CALL_NEEDS_VZEROUPPER)]
|
|
|
|
|
"TARGET_VZEROUPPER && SIBLING_CALL_P (insn)"
|
|
|
|
|
"#"
|
|
|
|
|
"&& reload_completed"
|
|
|
|
|
[(const_int 0)]
|
|
|
|
|
"ix86_split_call_vzeroupper (curr_insn, operands[3]); DONE;"
|
|
|
|
|
[(set_attr "type" "callv")])
|
|
|
|
|
|
|
|
|
|
(define_insn "*sibcall_value"
|
|
|
|
|
[(set (match_operand 0 "" "")
|
|
|
|
|
(call (mem:QI (match_operand:P 1 "sibcall_insn_operand" "Uz"))
|
|
|
|
|
(match_operand 2 "" "")))]
|
|
|
|
|
"SIBLING_CALL_P (insn)"
|
|
|
|
|
"* return ix86_output_call_insn (insn, operands[1]);"
|
|
|
|
|
[(set_attr "type" "callv")])
|
|
|
|
|
|
|
|
|
|
(define_insn_and_split "*call_value_rex64_ms_sysv_vzeroupper"
|
|
|
|
|
[(parallel
|
|
|
|
|
[(set (match_operand 0 "" "")
|
|
|
|
|
(call (mem:QI (match_operand:DI 1 "call_insn_operand" "rzm"))
|
|
|
|
|
(match_operand 2 "" "")))
|
|
|
|
|
(unspec [(const_int 0)] UNSPEC_MS_TO_SYSV_CALL)
|
|
|
|
|
(clobber (reg:TI XMM6_REG))
|
|
|
|
|
(clobber (reg:TI XMM7_REG))
|
|
|
|
|
(clobber (reg:TI XMM8_REG))
|
|
|
|
|
(clobber (reg:TI XMM9_REG))
|
|
|
|
|
(clobber (reg:TI XMM10_REG))
|
|
|
|
|
(clobber (reg:TI XMM11_REG))
|
|
|
|
|
(clobber (reg:TI XMM12_REG))
|
|
|
|
|
(clobber (reg:TI XMM13_REG))
|
|
|
|
|
(clobber (reg:TI XMM14_REG))
|
|
|
|
|
(clobber (reg:TI XMM15_REG))
|
|
|
|
|
(clobber (reg:DI SI_REG))
|
|
|
|
|
(clobber (reg:DI DI_REG))])
|
|
|
|
|
(unspec [(match_operand 3 "const_int_operand" "")]
|
|
|
|
|
UNSPEC_CALL_NEEDS_VZEROUPPER)]
|
|
|
|
|
"TARGET_VZEROUPPER && TARGET_64BIT && !SIBLING_CALL_P (insn)"
|
|
|
|
|
"#"
|
|
|
|
|
"&& reload_completed"
|
|
|
|
|
[(const_int 0)]
|
|
|
|
|
"ix86_split_call_vzeroupper (curr_insn, operands[2]); DONE;"
|
|
|
|
|
[(set_attr "type" "call")])
|
|
|
|
|
"ix86_split_call_vzeroupper (curr_insn, operands[3]); DONE;"
|
|
|
|
|
[(set_attr "type" "callv")])
|
|
|
|
|
|
|
|
|
|
(define_insn "*call_1_rex64_large"
|
|
|
|
|
[(call (mem:QI (match_operand:DI 0 "call_insn_operand" "rm"))
|
|
|
|
|
(match_operand 1 "" ""))]
|
|
|
|
|
(define_insn "*call_value_rex64_ms_sysv"
|
|
|
|
|
[(set (match_operand 0 "" "")
|
|
|
|
|
(call (mem:QI (match_operand:DI 1 "call_insn_operand" "rzm"))
|
|
|
|
|
(match_operand 2 "" "")))
|
|
|
|
|
(unspec [(const_int 0)] UNSPEC_MS_TO_SYSV_CALL)
|
|
|
|
|
(clobber (reg:TI XMM6_REG))
|
|
|
|
|
(clobber (reg:TI XMM7_REG))
|
|
|
|
|
(clobber (reg:TI XMM8_REG))
|
|
|
|
|
(clobber (reg:TI XMM9_REG))
|
|
|
|
|
(clobber (reg:TI XMM10_REG))
|
|
|
|
|
(clobber (reg:TI XMM11_REG))
|
|
|
|
|
(clobber (reg:TI XMM12_REG))
|
|
|
|
|
(clobber (reg:TI XMM13_REG))
|
|
|
|
|
(clobber (reg:TI XMM14_REG))
|
|
|
|
|
(clobber (reg:TI XMM15_REG))
|
|
|
|
|
(clobber (reg:DI SI_REG))
|
|
|
|
|
(clobber (reg:DI DI_REG))]
|
|
|
|
|
"TARGET_64BIT && !SIBLING_CALL_P (insn)"
|
|
|
|
|
{ return ix86_output_call_insn (insn, operands[0], 0); }
|
|
|
|
|
[(set_attr "type" "call")])
|
|
|
|
|
"* return ix86_output_call_insn (insn, operands[1]);"
|
|
|
|
|
[(set_attr "type" "callv")])
|
|
|
|
|
|
|
|
|
|
(define_insn_and_split "*sibcall_1_rex64_vzeroupper"
|
|
|
|
|
[(call (mem:QI (match_operand:DI 0 "sibcall_insn_operand" "s,U"))
|
|
|
|
|
(match_operand 1 "" ""))
|
|
|
|
|
(unspec [(match_operand 2 "const_int_operand" "")]
|
|
|
|
|
UNSPEC_CALL_NEEDS_VZEROUPPER)]
|
|
|
|
|
"TARGET_VZEROUPPER && TARGET_64BIT && SIBLING_CALL_P (insn)"
|
|
|
|
|
"#"
|
|
|
|
|
"&& reload_completed"
|
|
|
|
|
[(const_int 0)]
|
|
|
|
|
"ix86_split_call_vzeroupper (curr_insn, operands[2]); DONE;"
|
|
|
|
|
[(set_attr "type" "call")])
|
|
|
|
|
|
|
|
|
|
(define_insn "*sibcall_1_rex64"
|
|
|
|
|
[(call (mem:QI (match_operand:DI 0 "sibcall_insn_operand" "s,U"))
|
|
|
|
|
(match_operand 1 "" ""))]
|
|
|
|
|
"TARGET_64BIT && SIBLING_CALL_P (insn)"
|
|
|
|
|
{ return ix86_output_call_insn (insn, operands[0], 0); }
|
|
|
|
|
[(set_attr "type" "call")])
|
|
|
|
|
|
|
|
|
|
;; Call subroutine, returning value in operand 0
|
|
|
|
|
(define_expand "call_value_pop"
|
|
|
|
|
[(parallel [(set (match_operand 0 "" "")
|
|
|
|
|
(call (match_operand:QI 1 "" "")
|
|
|
|
@ -11366,31 +11371,61 @@
|
|
|
|
|
DONE;
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
(define_expand "call_value"
|
|
|
|
|
[(set (match_operand 0 "" "")
|
|
|
|
|
(call (match_operand:QI 1 "" "")
|
|
|
|
|
(match_operand:SI 2 "" "")))
|
|
|
|
|
(use (match_operand:SI 3 "" ""))]
|
|
|
|
|
;; Operand 3 is not used on the i386.
|
|
|
|
|
""
|
|
|
|
|
{
|
|
|
|
|
ix86_expand_call (operands[0], operands[1], operands[2],
|
|
|
|
|
operands[3], NULL, 0);
|
|
|
|
|
DONE;
|
|
|
|
|
})
|
|
|
|
|
(define_insn_and_split "*call_value_pop_vzeroupper"
|
|
|
|
|
[(parallel
|
|
|
|
|
[(set (match_operand 0 "" "")
|
|
|
|
|
(call (mem:QI (match_operand:SI 1 "call_insn_operand" "lzm"))
|
|
|
|
|
(match_operand 2 "" "")))
|
|
|
|
|
(set (reg:SI SP_REG)
|
|
|
|
|
(plus:SI (reg:SI SP_REG)
|
|
|
|
|
(match_operand:SI 3 "immediate_operand" "i")))])
|
|
|
|
|
(unspec [(match_operand 4 "const_int_operand" "")]
|
|
|
|
|
UNSPEC_CALL_NEEDS_VZEROUPPER)]
|
|
|
|
|
"TARGET_VZEROUPPER && !TARGET_64BIT && !SIBLING_CALL_P (insn)"
|
|
|
|
|
"#"
|
|
|
|
|
"&& reload_completed"
|
|
|
|
|
[(const_int 0)]
|
|
|
|
|
"ix86_split_call_vzeroupper (curr_insn, operands[4]); DONE;"
|
|
|
|
|
[(set_attr "type" "callv")])
|
|
|
|
|
|
|
|
|
|
(define_expand "sibcall_value"
|
|
|
|
|
(define_insn "*call_value_pop"
|
|
|
|
|
[(set (match_operand 0 "" "")
|
|
|
|
|
(call (match_operand:QI 1 "" "")
|
|
|
|
|
(match_operand:SI 2 "" "")))
|
|
|
|
|
(use (match_operand:SI 3 "" ""))]
|
|
|
|
|
;; Operand 3 is not used on the i386.
|
|
|
|
|
""
|
|
|
|
|
{
|
|
|
|
|
ix86_expand_call (operands[0], operands[1], operands[2],
|
|
|
|
|
operands[3], NULL, 1);
|
|
|
|
|
DONE;
|
|
|
|
|
})
|
|
|
|
|
(call (mem:QI (match_operand:SI 1 "call_insn_operand" "lzm"))
|
|
|
|
|
(match_operand 2 "" "")))
|
|
|
|
|
(set (reg:SI SP_REG)
|
|
|
|
|
(plus:SI (reg:SI SP_REG)
|
|
|
|
|
(match_operand:SI 3 "immediate_operand" "i")))]
|
|
|
|
|
"!TARGET_64BIT && !SIBLING_CALL_P (insn)"
|
|
|
|
|
"* return ix86_output_call_insn (insn, operands[1]);"
|
|
|
|
|
[(set_attr "type" "callv")])
|
|
|
|
|
|
|
|
|
|
(define_insn_and_split "*sibcall_value_pop_vzeroupper"
|
|
|
|
|
[(parallel
|
|
|
|
|
[(set (match_operand 0 "" "")
|
|
|
|
|
(call (mem:QI (match_operand:SI 1 "sibcall_insn_operand" "Uz"))
|
|
|
|
|
(match_operand 2 "" "")))
|
|
|
|
|
(set (reg:SI SP_REG)
|
|
|
|
|
(plus:SI (reg:SI SP_REG)
|
|
|
|
|
(match_operand:SI 3 "immediate_operand" "i")))])
|
|
|
|
|
(unspec [(match_operand 4 "const_int_operand" "")]
|
|
|
|
|
UNSPEC_CALL_NEEDS_VZEROUPPER)]
|
|
|
|
|
"TARGET_VZEROUPPER && !TARGET_64BIT && SIBLING_CALL_P (insn)"
|
|
|
|
|
"#"
|
|
|
|
|
"&& reload_completed"
|
|
|
|
|
[(const_int 0)]
|
|
|
|
|
"ix86_split_call_vzeroupper (curr_insn, operands[4]); DONE;"
|
|
|
|
|
[(set_attr "type" "callv")])
|
|
|
|
|
|
|
|
|
|
(define_insn "*sibcall_value_pop"
|
|
|
|
|
[(set (match_operand 0 "" "")
|
|
|
|
|
(call (mem:QI (match_operand:SI 1 "sibcall_insn_operand" "Uz"))
|
|
|
|
|
(match_operand 2 "" "")))
|
|
|
|
|
(set (reg:SI SP_REG)
|
|
|
|
|
(plus:SI (reg:SI SP_REG)
|
|
|
|
|
(match_operand:SI 3 "immediate_operand" "i")))]
|
|
|
|
|
"!TARGET_64BIT && SIBLING_CALL_P (insn)"
|
|
|
|
|
"* return ix86_output_call_insn (insn, operands[1]);"
|
|
|
|
|
[(set_attr "type" "callv")])
|
|
|
|
|
|
|
|
|
|
;; Call subroutine returning any type.
|
|
|
|
|
|
|
|
|
@ -12322,7 +12357,7 @@
|
|
|
|
|
[(set (match_operand:SI 0 "register_operand" "=a")
|
|
|
|
|
(unspec:SI [(match_operand:SI 1 "register_operand" "b")
|
|
|
|
|
(match_operand:SI 2 "tls_symbolic_operand" "")
|
|
|
|
|
(match_operand:SI 3 "call_insn_operand" "")]
|
|
|
|
|
(match_operand:SI 3 "constant_call_address_operand" "z")]
|
|
|
|
|
UNSPEC_TLS_GD))
|
|
|
|
|
(clobber (match_scratch:SI 4 "=d"))
|
|
|
|
|
(clobber (match_scratch:SI 5 "=c"))
|
|
|
|
@ -12337,7 +12372,7 @@
|
|
|
|
|
(unspec:SI
|
|
|
|
|
[(match_operand:SI 2 "register_operand" "")
|
|
|
|
|
(match_operand:SI 1 "tls_symbolic_operand" "")
|
|
|
|
|
(match_operand:SI 3 "call_insn_operand" "")]
|
|
|
|
|
(match_operand:SI 3 "constant_call_address_operand" "")]
|
|
|
|
|
UNSPEC_TLS_GD))
|
|
|
|
|
(clobber (match_scratch:SI 4 ""))
|
|
|
|
|
(clobber (match_scratch:SI 5 ""))
|
|
|
|
@ -12345,8 +12380,9 @@
|
|
|
|
|
|
|
|
|
|
(define_insn "*tls_global_dynamic_64"
|
|
|
|
|
[(set (match_operand:DI 0 "register_operand" "=a")
|
|
|
|
|
(call:DI (mem:QI (match_operand:DI 2 "call_insn_operand" ""))
|
|
|
|
|
(match_operand:DI 3 "" "")))
|
|
|
|
|
(call:DI
|
|
|
|
|
(mem:QI (match_operand:DI 2 "constant_call_address_operand" "z"))
|
|
|
|
|
(match_operand:DI 3 "" "")))
|
|
|
|
|
(unspec:DI [(match_operand:DI 1 "tls_symbolic_operand" "")]
|
|
|
|
|
UNSPEC_TLS_GD)]
|
|
|
|
|
"TARGET_64BIT"
|
|
|
|
@ -12357,7 +12393,7 @@
|
|
|
|
|
(define_expand "tls_global_dynamic_64"
|
|
|
|
|
[(parallel [(set (match_operand:DI 0 "register_operand" "")
|
|
|
|
|
(call:DI
|
|
|
|
|
(mem:QI (match_operand:DI 2 "call_insn_operand" ""))
|
|
|
|
|
(mem:QI (match_operand:DI 2 "constant_call_address_operand" ""))
|
|
|
|
|
(const_int 0)))
|
|
|
|
|
(unspec:DI [(match_operand:DI 1 "tls_symbolic_operand" "")]
|
|
|
|
|
UNSPEC_TLS_GD)])])
|
|
|
|
@ -12365,7 +12401,7 @@
|
|
|
|
|
(define_insn "*tls_local_dynamic_base_32_gnu"
|
|
|
|
|
[(set (match_operand:SI 0 "register_operand" "=a")
|
|
|
|
|
(unspec:SI [(match_operand:SI 1 "register_operand" "b")
|
|
|
|
|
(match_operand:SI 2 "call_insn_operand" "")]
|
|
|
|
|
(match_operand:SI 2 "constant_call_address_operand" "z")]
|
|
|
|
|
UNSPEC_TLS_LD_BASE))
|
|
|
|
|
(clobber (match_scratch:SI 3 "=d"))
|
|
|
|
|
(clobber (match_scratch:SI 4 "=c"))
|
|
|
|
@ -12378,7 +12414,7 @@
|
|
|
|
|
(define_expand "tls_local_dynamic_base_32"
|
|
|
|
|
[(parallel [(set (match_operand:SI 0 "register_operand" "")
|
|
|
|
|
(unspec:SI [(match_operand:SI 1 "register_operand" "")
|
|
|
|
|
(match_operand:SI 2 "call_insn_operand" "")]
|
|
|
|
|
(match_operand:SI 2 "constant_call_address_operand" "")]
|
|
|
|
|
UNSPEC_TLS_LD_BASE))
|
|
|
|
|
(clobber (match_scratch:SI 3 ""))
|
|
|
|
|
(clobber (match_scratch:SI 4 ""))
|
|
|
|
@ -12386,7 +12422,7 @@
|
|
|
|
|
|
|
|
|
|
(define_insn "*tls_local_dynamic_base_64"
|
|
|
|
|
[(set (match_operand:DI 0 "register_operand" "=a")
|
|
|
|
|
(call:DI (mem:QI (match_operand:DI 1 "call_insn_operand" ""))
|
|
|
|
|
(call:DI (mem:QI (match_operand:DI 1 "constant_call_address_operand" "z"))
|
|
|
|
|
(match_operand:DI 2 "" "")))
|
|
|
|
|
(unspec:DI [(const_int 0)] UNSPEC_TLS_LD_BASE)]
|
|
|
|
|
"TARGET_64BIT"
|
|
|
|
@ -12397,7 +12433,7 @@
|
|
|
|
|
(define_expand "tls_local_dynamic_base_64"
|
|
|
|
|
[(parallel [(set (match_operand:DI 0 "register_operand" "")
|
|
|
|
|
(call:DI
|
|
|
|
|
(mem:QI (match_operand:DI 1 "call_insn_operand" ""))
|
|
|
|
|
(mem:QI (match_operand:DI 1 "constant_call_address_operand" ""))
|
|
|
|
|
(const_int 0)))
|
|
|
|
|
(unspec:DI [(const_int 0)] UNSPEC_TLS_LD_BASE)])])
|
|
|
|
|
|
|
|
|
@ -12407,7 +12443,7 @@
|
|
|
|
|
(define_insn_and_split "*tls_local_dynamic_32_once"
|
|
|
|
|
[(set (match_operand:SI 0 "register_operand" "=a")
|
|
|
|
|
(plus:SI (unspec:SI [(match_operand:SI 1 "register_operand" "b")
|
|
|
|
|
(match_operand:SI 2 "call_insn_operand" "")]
|
|
|
|
|
(match_operand:SI 2 "constant_call_address_operand" "z")]
|
|
|
|
|
UNSPEC_TLS_LD_BASE)
|
|
|
|
|
(const:SI (unspec:SI
|
|
|
|
|
[(match_operand:SI 3 "tls_symbolic_operand" "")]
|
|
|
|
@ -17160,338 +17196,6 @@
|
|
|
|
|
operands[0] = dest;
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
;; Call-value patterns last so that the wildcard operand does not
|
|
|
|
|
;; disrupt insn-recog's switch tables.
|
|
|
|
|
|
|
|
|
|
(define_insn_and_split "*call_value_pop_0_vzeroupper"
|
|
|
|
|
[(parallel
|
|
|
|
|
[(set (match_operand 0 "" "")
|
|
|
|
|
(call (mem:QI (match_operand:SI 1 "constant_call_address_operand" ""))
|
|
|
|
|
(match_operand:SI 2 "" "")))
|
|
|
|
|
(set (reg:SI SP_REG)
|
|
|
|
|
(plus:SI (reg:SI SP_REG)
|
|
|
|
|
(match_operand:SI 3 "immediate_operand" "")))])
|
|
|
|
|
(unspec [(match_operand 4 "const_int_operand" "")]
|
|
|
|
|
UNSPEC_CALL_NEEDS_VZEROUPPER)]
|
|
|
|
|
"TARGET_VZEROUPPER && !TARGET_64BIT"
|
|
|
|
|
"#"
|
|
|
|
|
"&& reload_completed"
|
|
|
|
|
[(const_int 0)]
|
|
|
|
|
"ix86_split_call_vzeroupper (curr_insn, operands[4]); DONE;"
|
|
|
|
|
[(set_attr "type" "callv")])
|
|
|
|
|
|
|
|
|
|
(define_insn "*call_value_pop_0"
|
|
|
|
|
[(set (match_operand 0 "" "")
|
|
|
|
|
(call (mem:QI (match_operand:SI 1 "constant_call_address_operand" ""))
|
|
|
|
|
(match_operand:SI 2 "" "")))
|
|
|
|
|
(set (reg:SI SP_REG)
|
|
|
|
|
(plus:SI (reg:SI SP_REG)
|
|
|
|
|
(match_operand:SI 3 "immediate_operand" "")))]
|
|
|
|
|
"!TARGET_64BIT"
|
|
|
|
|
{ return ix86_output_call_insn (insn, operands[1], 1); }
|
|
|
|
|
[(set_attr "type" "callv")])
|
|
|
|
|
|
|
|
|
|
(define_insn_and_split "*call_value_pop_1_vzeroupper"
|
|
|
|
|
[(parallel
|
|
|
|
|
[(set (match_operand 0 "" "")
|
|
|
|
|
(call (mem:QI (match_operand:SI 1 "call_insn_operand" "lsm"))
|
|
|
|
|
(match_operand:SI 2 "" "")))
|
|
|
|
|
(set (reg:SI SP_REG)
|
|
|
|
|
(plus:SI (reg:SI SP_REG)
|
|
|
|
|
(match_operand:SI 3 "immediate_operand" "i")))])
|
|
|
|
|
(unspec [(match_operand 4 "const_int_operand" "")]
|
|
|
|
|
UNSPEC_CALL_NEEDS_VZEROUPPER)]
|
|
|
|
|
"TARGET_VZEROUPPER && !TARGET_64BIT && !SIBLING_CALL_P (insn)"
|
|
|
|
|
"#"
|
|
|
|
|
"&& reload_completed"
|
|
|
|
|
[(const_int 0)]
|
|
|
|
|
"ix86_split_call_vzeroupper (curr_insn, operands[4]); DONE;"
|
|
|
|
|
[(set_attr "type" "callv")])
|
|
|
|
|
|
|
|
|
|
(define_insn "*call_value_pop_1"
|
|
|
|
|
[(set (match_operand 0 "" "")
|
|
|
|
|
(call (mem:QI (match_operand:SI 1 "call_insn_operand" "lsm"))
|
|
|
|
|
(match_operand:SI 2 "" "")))
|
|
|
|
|
(set (reg:SI SP_REG)
|
|
|
|
|
(plus:SI (reg:SI SP_REG)
|
|
|
|
|
(match_operand:SI 3 "immediate_operand" "i")))]
|
|
|
|
|
"!TARGET_64BIT && !SIBLING_CALL_P (insn)"
|
|
|
|
|
{ return ix86_output_call_insn (insn, operands[1], 1); }
|
|
|
|
|
[(set_attr "type" "callv")])
|
|
|
|
|
|
|
|
|
|
(define_insn_and_split "*sibcall_value_pop_1_vzeroupper"
|
|
|
|
|
[(parallel
|
|
|
|
|
[(set (match_operand 0 "" "")
|
|
|
|
|
(call (mem:QI (match_operand:SI 1 "sibcall_insn_operand" "s,U"))
|
|
|
|
|
(match_operand:SI 2 "" "")))
|
|
|
|
|
(set (reg:SI SP_REG)
|
|
|
|
|
(plus:SI (reg:SI SP_REG)
|
|
|
|
|
(match_operand:SI 3 "immediate_operand" "i,i")))])
|
|
|
|
|
(unspec [(match_operand 4 "const_int_operand" "")]
|
|
|
|
|
UNSPEC_CALL_NEEDS_VZEROUPPER)]
|
|
|
|
|
"TARGET_VZEROUPPER && !TARGET_64BIT && SIBLING_CALL_P (insn)"
|
|
|
|
|
"#"
|
|
|
|
|
"&& reload_completed"
|
|
|
|
|
[(const_int 0)]
|
|
|
|
|
"ix86_split_call_vzeroupper (curr_insn, operands[4]); DONE;"
|
|
|
|
|
[(set_attr "type" "callv")])
|
|
|
|
|
|
|
|
|
|
(define_insn "*sibcall_value_pop_1"
|
|
|
|
|
[(set (match_operand 0 "" "")
|
|
|
|
|
(call (mem:QI (match_operand:SI 1 "sibcall_insn_operand" "s,U"))
|
|
|
|
|
(match_operand:SI 2 "" "")))
|
|
|
|
|
(set (reg:SI SP_REG)
|
|
|
|
|
(plus:SI (reg:SI SP_REG)
|
|
|
|
|
(match_operand:SI 3 "immediate_operand" "i,i")))]
|
|
|
|
|
"!TARGET_64BIT && SIBLING_CALL_P (insn)"
|
|
|
|
|
{ return ix86_output_call_insn (insn, operands[1], 1); }
|
|
|
|
|
[(set_attr "type" "callv")])
|
|
|
|
|
|
|
|
|
|
(define_insn_and_split "*call_value_0_vzeroupper"
|
|
|
|
|
[(set (match_operand 0 "" "")
|
|
|
|
|
(call (mem:QI (match_operand:SI 1 "constant_call_address_operand" ""))
|
|
|
|
|
(match_operand:SI 2 "" "")))
|
|
|
|
|
(unspec [(match_operand 3 "const_int_operand" "")]
|
|
|
|
|
UNSPEC_CALL_NEEDS_VZEROUPPER)]
|
|
|
|
|
"TARGET_VZEROUPPER && !TARGET_64BIT"
|
|
|
|
|
"#"
|
|
|
|
|
"&& reload_completed"
|
|
|
|
|
[(const_int 0)]
|
|
|
|
|
"ix86_split_call_vzeroupper (curr_insn, operands[3]); DONE;"
|
|
|
|
|
[(set_attr "type" "callv")])
|
|
|
|
|
|
|
|
|
|
(define_insn "*call_value_0"
|
|
|
|
|
[(set (match_operand 0 "" "")
|
|
|
|
|
(call (mem:QI (match_operand:SI 1 "constant_call_address_operand" ""))
|
|
|
|
|
(match_operand:SI 2 "" "")))]
|
|
|
|
|
"!TARGET_64BIT"
|
|
|
|
|
{ return ix86_output_call_insn (insn, operands[1], 1); }
|
|
|
|
|
[(set_attr "type" "callv")])
|
|
|
|
|
|
|
|
|
|
(define_insn_and_split "*call_value_0_rex64_vzeroupper"
|
|
|
|
|
[(set (match_operand 0 "" "")
|
|
|
|
|
(call (mem:QI (match_operand:DI 1 "constant_call_address_operand" ""))
|
|
|
|
|
(match_operand:DI 2 "const_int_operand" "")))
|
|
|
|
|
(unspec [(match_operand 3 "const_int_operand" "")]
|
|
|
|
|
UNSPEC_CALL_NEEDS_VZEROUPPER)]
|
|
|
|
|
"TARGET_VZEROUPPER && TARGET_64BIT"
|
|
|
|
|
"#"
|
|
|
|
|
"&& reload_completed"
|
|
|
|
|
[(const_int 0)]
|
|
|
|
|
"ix86_split_call_vzeroupper (curr_insn, operands[3]); DONE;"
|
|
|
|
|
[(set_attr "type" "callv")])
|
|
|
|
|
|
|
|
|
|
(define_insn "*call_value_0_rex64"
|
|
|
|
|
[(set (match_operand 0 "" "")
|
|
|
|
|
(call (mem:QI (match_operand:DI 1 "constant_call_address_operand" ""))
|
|
|
|
|
(match_operand:DI 2 "const_int_operand" "")))]
|
|
|
|
|
"TARGET_64BIT"
|
|
|
|
|
{ return ix86_output_call_insn (insn, operands[1], 1); }
|
|
|
|
|
[(set_attr "type" "callv")])
|
|
|
|
|
|
|
|
|
|
(define_insn_and_split "*call_value_0_rex64_ms_sysv_vzeroupper"
|
|
|
|
|
[(parallel
|
|
|
|
|
[(set (match_operand 0 "" "")
|
|
|
|
|
(call (mem:QI (match_operand:DI 1 "constant_call_address_operand" ""))
|
|
|
|
|
(match_operand:DI 2 "const_int_operand" "")))
|
|
|
|
|
(unspec [(const_int 0)] UNSPEC_MS_TO_SYSV_CALL)
|
|
|
|
|
(clobber (reg:TI XMM6_REG))
|
|
|
|
|
(clobber (reg:TI XMM7_REG))
|
|
|
|
|
(clobber (reg:TI XMM8_REG))
|
|
|
|
|
(clobber (reg:TI XMM9_REG))
|
|
|
|
|
(clobber (reg:TI XMM10_REG))
|
|
|
|
|
(clobber (reg:TI XMM11_REG))
|
|
|
|
|
(clobber (reg:TI XMM12_REG))
|
|
|
|
|
(clobber (reg:TI XMM13_REG))
|
|
|
|
|
(clobber (reg:TI XMM14_REG))
|
|
|
|
|
(clobber (reg:TI XMM15_REG))
|
|
|
|
|
(clobber (reg:DI SI_REG))
|
|
|
|
|
(clobber (reg:DI DI_REG))])
|
|
|
|
|
(unspec [(match_operand 3 "const_int_operand" "")]
|
|
|
|
|
UNSPEC_CALL_NEEDS_VZEROUPPER)]
|
|
|
|
|
"TARGET_VZEROUPPER && TARGET_64BIT && !SIBLING_CALL_P (insn)"
|
|
|
|
|
"#"
|
|
|
|
|
"&& reload_completed"
|
|
|
|
|
[(const_int 0)]
|
|
|
|
|
"ix86_split_call_vzeroupper (curr_insn, operands[3]); DONE;"
|
|
|
|
|
[(set_attr "type" "callv")])
|
|
|
|
|
|
|
|
|
|
(define_insn "*call_value_0_rex64_ms_sysv"
|
|
|
|
|
[(set (match_operand 0 "" "")
|
|
|
|
|
(call (mem:QI (match_operand:DI 1 "constant_call_address_operand" ""))
|
|
|
|
|
(match_operand:DI 2 "const_int_operand" "")))
|
|
|
|
|
(unspec [(const_int 0)] UNSPEC_MS_TO_SYSV_CALL)
|
|
|
|
|
(clobber (reg:TI XMM6_REG))
|
|
|
|
|
(clobber (reg:TI XMM7_REG))
|
|
|
|
|
(clobber (reg:TI XMM8_REG))
|
|
|
|
|
(clobber (reg:TI XMM9_REG))
|
|
|
|
|
(clobber (reg:TI XMM10_REG))
|
|
|
|
|
(clobber (reg:TI XMM11_REG))
|
|
|
|
|
(clobber (reg:TI XMM12_REG))
|
|
|
|
|
(clobber (reg:TI XMM13_REG))
|
|
|
|
|
(clobber (reg:TI XMM14_REG))
|
|
|
|
|
(clobber (reg:TI XMM15_REG))
|
|
|
|
|
(clobber (reg:DI SI_REG))
|
|
|
|
|
(clobber (reg:DI DI_REG))]
|
|
|
|
|
"TARGET_64BIT && !SIBLING_CALL_P (insn)"
|
|
|
|
|
{ return ix86_output_call_insn (insn, operands[1], 1); }
|
|
|
|
|
[(set_attr "type" "callv")])
|
|
|
|
|
|
|
|
|
|
(define_insn_and_split "*call_value_1_vzeroupper"
|
|
|
|
|
[(set (match_operand 0 "" "")
|
|
|
|
|
(call (mem:QI (match_operand:SI 1 "call_insn_operand" "lsm"))
|
|
|
|
|
(match_operand:SI 2 "" "")))
|
|
|
|
|
(unspec [(match_operand 3 "const_int_operand" "")]
|
|
|
|
|
UNSPEC_CALL_NEEDS_VZEROUPPER)]
|
|
|
|
|
"TARGET_VZEROUPPER && !TARGET_64BIT && !SIBLING_CALL_P (insn)"
|
|
|
|
|
"#"
|
|
|
|
|
"&& reload_completed"
|
|
|
|
|
[(const_int 0)]
|
|
|
|
|
"ix86_split_call_vzeroupper (curr_insn, operands[3]); DONE;"
|
|
|
|
|
[(set_attr "type" "callv")])
|
|
|
|
|
|
|
|
|
|
(define_insn "*call_value_1"
|
|
|
|
|
[(set (match_operand 0 "" "")
|
|
|
|
|
(call (mem:QI (match_operand:SI 1 "call_insn_operand" "lsm"))
|
|
|
|
|
(match_operand:SI 2 "" "")))]
|
|
|
|
|
"!TARGET_64BIT && !SIBLING_CALL_P (insn)"
|
|
|
|
|
{ return ix86_output_call_insn (insn, operands[1], 1); }
|
|
|
|
|
[(set_attr "type" "callv")])
|
|
|
|
|
|
|
|
|
|
(define_insn_and_split "*sibcall_value_1_vzeroupper"
|
|
|
|
|
[(set (match_operand 0 "" "")
|
|
|
|
|
(call (mem:QI (match_operand:SI 1 "sibcall_insn_operand" "s,U"))
|
|
|
|
|
(match_operand:SI 2 "" "")))
|
|
|
|
|
(unspec [(match_operand 3 "const_int_operand" "")]
|
|
|
|
|
UNSPEC_CALL_NEEDS_VZEROUPPER)]
|
|
|
|
|
"TARGET_VZEROUPPER && !TARGET_64BIT && SIBLING_CALL_P (insn)"
|
|
|
|
|
"#"
|
|
|
|
|
"&& reload_completed"
|
|
|
|
|
[(const_int 0)]
|
|
|
|
|
"ix86_split_call_vzeroupper (curr_insn, operands[3]); DONE;"
|
|
|
|
|
[(set_attr "type" "callv")])
|
|
|
|
|
|
|
|
|
|
(define_insn "*sibcall_value_1"
|
|
|
|
|
[(set (match_operand 0 "" "")
|
|
|
|
|
(call (mem:QI (match_operand:SI 1 "sibcall_insn_operand" "s,U"))
|
|
|
|
|
(match_operand:SI 2 "" "")))]
|
|
|
|
|
"!TARGET_64BIT && SIBLING_CALL_P (insn)"
|
|
|
|
|
{ return ix86_output_call_insn (insn, operands[1], 1); }
|
|
|
|
|
[(set_attr "type" "callv")])
|
|
|
|
|
|
|
|
|
|
(define_insn_and_split "*call_value_1_rex64_vzeroupper"
|
|
|
|
|
[(set (match_operand 0 "" "")
|
|
|
|
|
(call (mem:QI (match_operand:DI 1 "call_insn_operand" "rsm"))
|
|
|
|
|
(match_operand:DI 2 "" "")))
|
|
|
|
|
(unspec [(match_operand 3 "const_int_operand" "")]
|
|
|
|
|
UNSPEC_CALL_NEEDS_VZEROUPPER)]
|
|
|
|
|
"TARGET_VZEROUPPER && TARGET_64BIT && !SIBLING_CALL_P (insn)
|
|
|
|
|
&& ix86_cmodel != CM_LARGE && ix86_cmodel != CM_LARGE_PIC"
|
|
|
|
|
"#"
|
|
|
|
|
"&& reload_completed"
|
|
|
|
|
[(const_int 0)]
|
|
|
|
|
"ix86_split_call_vzeroupper (curr_insn, operands[3]); DONE;"
|
|
|
|
|
[(set_attr "type" "callv")])
|
|
|
|
|
|
|
|
|
|
(define_insn "*call_value_1_rex64"
|
|
|
|
|
[(set (match_operand 0 "" "")
|
|
|
|
|
(call (mem:QI (match_operand:DI 1 "call_insn_operand" "rsm"))
|
|
|
|
|
(match_operand:DI 2 "" "")))]
|
|
|
|
|
"TARGET_64BIT && !SIBLING_CALL_P (insn)
|
|
|
|
|
&& ix86_cmodel != CM_LARGE && ix86_cmodel != CM_LARGE_PIC"
|
|
|
|
|
{ return ix86_output_call_insn (insn, operands[1], 1); }
|
|
|
|
|
[(set_attr "type" "callv")])
|
|
|
|
|
|
|
|
|
|
(define_insn_and_split "*call_value_1_rex64_ms_sysv_vzeroupper"
|
|
|
|
|
[(parallel
|
|
|
|
|
[(set (match_operand 0 "" "")
|
|
|
|
|
(call (mem:QI (match_operand:DI 1 "call_insn_operand" "rsm"))
|
|
|
|
|
(match_operand:DI 2 "" "")))
|
|
|
|
|
(unspec [(const_int 0)] UNSPEC_MS_TO_SYSV_CALL)
|
|
|
|
|
(clobber (reg:TI XMM6_REG))
|
|
|
|
|
(clobber (reg:TI XMM7_REG))
|
|
|
|
|
(clobber (reg:TI XMM8_REG))
|
|
|
|
|
(clobber (reg:TI XMM9_REG))
|
|
|
|
|
(clobber (reg:TI XMM10_REG))
|
|
|
|
|
(clobber (reg:TI XMM11_REG))
|
|
|
|
|
(clobber (reg:TI XMM12_REG))
|
|
|
|
|
(clobber (reg:TI XMM13_REG))
|
|
|
|
|
(clobber (reg:TI XMM14_REG))
|
|
|
|
|
(clobber (reg:TI XMM15_REG))
|
|
|
|
|
(clobber (reg:DI SI_REG))
|
|
|
|
|
(clobber (reg:DI DI_REG))])
|
|
|
|
|
(unspec [(match_operand 3 "const_int_operand" "")]
|
|
|
|
|
UNSPEC_CALL_NEEDS_VZEROUPPER)]
|
|
|
|
|
"TARGET_VZEROUPPER && TARGET_64BIT && !SIBLING_CALL_P (insn)"
|
|
|
|
|
"#"
|
|
|
|
|
"&& reload_completed"
|
|
|
|
|
[(const_int 0)]
|
|
|
|
|
"ix86_split_call_vzeroupper (curr_insn, operands[3]); DONE;"
|
|
|
|
|
[(set_attr "type" "callv")])
|
|
|
|
|
|
|
|
|
|
(define_insn "*call_value_1_rex64_ms_sysv"
|
|
|
|
|
[(set (match_operand 0 "" "")
|
|
|
|
|
(call (mem:QI (match_operand:DI 1 "call_insn_operand" "rsm"))
|
|
|
|
|
(match_operand:DI 2 "" "")))
|
|
|
|
|
(unspec [(const_int 0)] UNSPEC_MS_TO_SYSV_CALL)
|
|
|
|
|
(clobber (reg:TI XMM6_REG))
|
|
|
|
|
(clobber (reg:TI XMM7_REG))
|
|
|
|
|
(clobber (reg:TI XMM8_REG))
|
|
|
|
|
(clobber (reg:TI XMM9_REG))
|
|
|
|
|
(clobber (reg:TI XMM10_REG))
|
|
|
|
|
(clobber (reg:TI XMM11_REG))
|
|
|
|
|
(clobber (reg:TI XMM12_REG))
|
|
|
|
|
(clobber (reg:TI XMM13_REG))
|
|
|
|
|
(clobber (reg:TI XMM14_REG))
|
|
|
|
|
(clobber (reg:TI XMM15_REG))
|
|
|
|
|
(clobber (reg:DI SI_REG))
|
|
|
|
|
(clobber (reg:DI DI_REG))]
|
|
|
|
|
"TARGET_64BIT && !SIBLING_CALL_P (insn)"
|
|
|
|
|
{ return ix86_output_call_insn (insn, operands[1], 1); }
|
|
|
|
|
[(set_attr "type" "callv")])
|
|
|
|
|
|
|
|
|
|
(define_insn_and_split "*call_value_1_rex64_large_vzeroupper"
|
|
|
|
|
[(set (match_operand 0 "" "")
|
|
|
|
|
(call (mem:QI (match_operand:DI 1 "call_insn_operand" "rm"))
|
|
|
|
|
(match_operand:DI 2 "" "")))
|
|
|
|
|
(unspec [(match_operand 3 "const_int_operand" "")]
|
|
|
|
|
UNSPEC_CALL_NEEDS_VZEROUPPER)]
|
|
|
|
|
"TARGET_VZEROUPPER && TARGET_64BIT && !SIBLING_CALL_P (insn)"
|
|
|
|
|
"#"
|
|
|
|
|
"&& reload_completed"
|
|
|
|
|
[(const_int 0)]
|
|
|
|
|
"ix86_split_call_vzeroupper (curr_insn, operands[3]); DONE;"
|
|
|
|
|
[(set_attr "type" "callv")])
|
|
|
|
|
|
|
|
|
|
(define_insn "*call_value_1_rex64_large"
|
|
|
|
|
[(set (match_operand 0 "" "")
|
|
|
|
|
(call (mem:QI (match_operand:DI 1 "call_insn_operand" "rm"))
|
|
|
|
|
(match_operand:DI 2 "" "")))]
|
|
|
|
|
"TARGET_64BIT && !SIBLING_CALL_P (insn)"
|
|
|
|
|
{ return ix86_output_call_insn (insn, operands[1], 1); }
|
|
|
|
|
[(set_attr "type" "callv")])
|
|
|
|
|
|
|
|
|
|
(define_insn_and_split "*sibcall_value_1_rex64_vzeroupper"
|
|
|
|
|
[(set (match_operand 0 "" "")
|
|
|
|
|
(call (mem:QI (match_operand:DI 1 "sibcall_insn_operand" "s,U"))
|
|
|
|
|
(match_operand:DI 2 "" "")))
|
|
|
|
|
(unspec [(match_operand 3 "const_int_operand" "")]
|
|
|
|
|
UNSPEC_CALL_NEEDS_VZEROUPPER)]
|
|
|
|
|
"TARGET_VZEROUPPER && TARGET_64BIT && SIBLING_CALL_P (insn)"
|
|
|
|
|
"#"
|
|
|
|
|
"&& reload_completed"
|
|
|
|
|
[(const_int 0)]
|
|
|
|
|
"ix86_split_call_vzeroupper (curr_insn, operands[3]); DONE;"
|
|
|
|
|
[(set_attr "type" "callv")])
|
|
|
|
|
|
|
|
|
|
(define_insn "*sibcall_value_1_rex64"
|
|
|
|
|
[(set (match_operand 0 "" "")
|
|
|
|
|
(call (mem:QI (match_operand:DI 1 "sibcall_insn_operand" "s,U"))
|
|
|
|
|
(match_operand:DI 2 "" "")))]
|
|
|
|
|
"TARGET_64BIT && SIBLING_CALL_P (insn)"
|
|
|
|
|
{ return ix86_output_call_insn (insn, operands[1], 1); }
|
|
|
|
|
[(set_attr "type" "callv")])
|
|
|
|
|
|
|
|
|
|
;; We used to use "int $5", in honor of #BR which maps to interrupt vector 5.
|
|
|
|
|
;; That, however, is usually mapped by the OS to SIGSEGV, which is often
|
|
|
|
|
;; caught for use by garbage collectors and the like. Using an insn that
|
|
|
|
|