predicates.md (call_insn_operand): Allow constant_call_address_operand in Pmode only.

* config/i386/predicates.md (call_insn_operand): Allow
	constant_call_address_operand in Pmode only.
	(sibcall_insn_operand): Ditto.
	* config/i386/i386.md (*call): Use W mode iterator instead of P mode.
	(*call_vzeroupper): Ditto.
	(*sibcall): Ditto.
	(*sibcall_vzeroupper): Ditto.
	(*call_value): Ditto.
	(*call_value_vzeroupper): Ditto.
	(*sibcall_value): Ditto.
	(*sibcall_value_vzeroupper): Ditto.
	(*indirect_jump): Ditto.
	(*tablejump_1): Ditto.
	(indirect_jump): Convert memory address to word mode for TARGET_X32.
	(tablejump): Ditto.
	* config/i386/i386.c (ix86_expand_call): Convert indirect operands
	to word mode.

From-SVN: r185193
This commit is contained in:
Uros Bizjak 2012-03-11 14:41:46 +01:00
parent 07c0b5604a
commit 1ce8d92538
4 changed files with 54 additions and 25 deletions

View File

@ -1,3 +1,23 @@
2012-03-11 Uros Bizjak <ubizjak@gmail.com>
* config/i386/predicates.md (call_insn_operand): Allow
constant_call_address_operand in Pmode only.
(sibcall_insn_operand): Ditto.
* config/i386/i386.md (*call): Use W mode iterator instead of P mode.
(*call_vzeroupper): Ditto.
(*sibcall): Ditto.
(*sibcall_vzeroupper): Ditto.
(*call_value): Ditto.
(*call_value_vzeroupper): Ditto.
(*sibcall_value): Ditto.
(*sibcall_value_vzeroupper): Ditto.
(*indirect_jump): Ditto.
(*tablejump_1): Ditto.
(indirect_jump): Convert memory address to word mode for TARGET_X32.
(tablejump): Ditto.
* config/i386/i386.c (ix86_expand_call): Convert indirect operands
to word mode.
2012-03-11 Oleg Endo <olegendo@gcc.gnu.org>
PR target/51244
@ -11,7 +31,7 @@
* config/i386/i386.c (ix86_decompose_address): Disallow fs:(reg)
if Pmode != word_mode.
(legitimize_tls_address): Call gen_tls_initial_exec_x32 if
Pmode == SImode for x32.
Pmode == SImode for TARGET_X32.
* config/i386/i386.md (UNSPEC_TLS_IE_X32): New.
(tls_initial_exec_x32): Likewise.
@ -1873,7 +1893,7 @@
PR target/52146
* config/i386/i386.c (ix86_legitimate_address_p): Disallow
negative constant address for x32.
negative constant address for TARGET_X32.
2012-02-10 Richard Henderson <rth@redhat.com>

View File

@ -22990,13 +22990,13 @@ ix86_expand_call (rtx retval, rtx fnaddr, rtx callarg1,
&& !local_symbolic_operand (XEXP (fnaddr, 0), VOIDmode))
fnaddr = gen_rtx_MEM (QImode, construct_plt_address (XEXP (fnaddr, 0)));
else if (sibcall
? !sibcall_insn_operand (XEXP (fnaddr, 0), Pmode)
: !call_insn_operand (XEXP (fnaddr, 0), Pmode))
? !sibcall_insn_operand (XEXP (fnaddr, 0), word_mode)
: !call_insn_operand (XEXP (fnaddr, 0), word_mode))
{
fnaddr = XEXP (fnaddr, 0);
if (GET_MODE (fnaddr) != Pmode)
fnaddr = convert_to_mode (Pmode, fnaddr, 1);
fnaddr = gen_rtx_MEM (QImode, copy_to_mode_reg (Pmode, fnaddr));
if (GET_MODE (fnaddr) != word_mode)
fnaddr = convert_to_mode (word_mode, fnaddr, 1);
fnaddr = gen_rtx_MEM (QImode, copy_to_mode_reg (word_mode, fnaddr));
}
vec_len = 0;

View File

@ -11086,10 +11086,15 @@
(set_attr "modrm" "0")])
(define_expand "indirect_jump"
[(set (pc) (match_operand 0 "indirect_branch_operand" ""))])
[(set (pc) (match_operand 0 "indirect_branch_operand" ""))]
""
{
if (TARGET_X32)
operands[0] = convert_memory_address (word_mode, operands[0]);
})
(define_insn "*indirect_jump"
[(set (pc) (match_operand:P 0 "indirect_branch_operand" "rw"))]
[(set (pc) (match_operand:W 0 "indirect_branch_operand" "rw"))]
""
"jmp\t%A0"
[(set_attr "type" "ibr")
@ -11131,12 +11136,13 @@
operands[0] = expand_simple_binop (Pmode, code, op0, op1, NULL_RTX, 0,
OPTAB_DIRECT);
}
else if (TARGET_X32)
operands[0] = convert_memory_address (Pmode, operands[0]);
if (TARGET_X32)
operands[0] = convert_memory_address (word_mode, operands[0]);
})
(define_insn "*tablejump_1"
[(set (pc) (match_operand:P 0 "indirect_branch_operand" "rw"))
[(set (pc) (match_operand:W 0 "indirect_branch_operand" "rw"))
(use (label_ref (match_operand 1 "" "")))]
""
"jmp\t%A0"
@ -11223,7 +11229,7 @@
})
(define_insn_and_split "*call_vzeroupper"
[(call (mem:QI (match_operand:P 0 "call_insn_operand" "<c>zw"))
[(call (mem:QI (match_operand:W 0 "call_insn_operand" "<c>zw"))
(match_operand 1 "" ""))
(unspec [(match_operand 2 "const_int_operand" "")]
UNSPEC_CALL_NEEDS_VZEROUPPER)]
@ -11235,7 +11241,7 @@
[(set_attr "type" "call")])
(define_insn "*call"
[(call (mem:QI (match_operand:P 0 "call_insn_operand" "<c>zw"))
[(call (mem:QI (match_operand:W 0 "call_insn_operand" "<c>zw"))
(match_operand 1 "" ""))]
"!SIBLING_CALL_P (insn)"
"* return ix86_output_call_insn (insn, operands[0]);"
@ -11287,7 +11293,7 @@
[(set_attr "type" "call")])
(define_insn_and_split "*sibcall_vzeroupper"
[(call (mem:QI (match_operand:P 0 "sibcall_insn_operand" "Uz"))
[(call (mem:QI (match_operand:W 0 "sibcall_insn_operand" "Uz"))
(match_operand 1 "" ""))
(unspec [(match_operand 2 "const_int_operand" "")]
UNSPEC_CALL_NEEDS_VZEROUPPER)]
@ -11299,7 +11305,7 @@
[(set_attr "type" "call")])
(define_insn "*sibcall"
[(call (mem:QI (match_operand:P 0 "sibcall_insn_operand" "Uz"))
[(call (mem:QI (match_operand:W 0 "sibcall_insn_operand" "Uz"))
(match_operand 1 "" ""))]
"SIBLING_CALL_P (insn)"
"* return ix86_output_call_insn (insn, operands[0]);"
@ -11396,7 +11402,7 @@
(define_insn_and_split "*call_value_vzeroupper"
[(set (match_operand 0 "" "")
(call (mem:QI (match_operand:P 1 "call_insn_operand" "<c>zw"))
(call (mem:QI (match_operand:W 1 "call_insn_operand" "<c>zw"))
(match_operand 2 "" "")))
(unspec [(match_operand 3 "const_int_operand" "")]
UNSPEC_CALL_NEEDS_VZEROUPPER)]
@ -11409,7 +11415,7 @@
(define_insn "*call_value"
[(set (match_operand 0 "" "")
(call (mem:QI (match_operand:P 1 "call_insn_operand" "<c>zw"))
(call (mem:QI (match_operand:W 1 "call_insn_operand" "<c>zw"))
(match_operand 2 "" "")))]
"!SIBLING_CALL_P (insn)"
"* return ix86_output_call_insn (insn, operands[1]);"
@ -11417,7 +11423,7 @@
(define_insn_and_split "*sibcall_value_vzeroupper"
[(set (match_operand 0 "" "")
(call (mem:QI (match_operand:P 1 "sibcall_insn_operand" "Uz"))
(call (mem:QI (match_operand:W 1 "sibcall_insn_operand" "Uz"))
(match_operand 2 "" "")))
(unspec [(match_operand 3 "const_int_operand" "")]
UNSPEC_CALL_NEEDS_VZEROUPPER)]
@ -11430,7 +11436,7 @@
(define_insn "*sibcall_value"
[(set (match_operand 0 "" "")
(call (mem:QI (match_operand:P 1 "sibcall_insn_operand" "Uz"))
(call (mem:QI (match_operand:W 1 "sibcall_insn_operand" "Uz"))
(match_operand 2 "" "")))]
"SIBLING_CALL_P (insn)"
"* return ix86_output_call_insn (insn, operands[1]);"

View File

@ -1,5 +1,5 @@
;; Predicate definitions for IA-32 and x86-64.
;; Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
;; Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
;; Free Software Foundation, Inc.
;;
;; This file is part of GCC.
@ -571,15 +571,18 @@
(match_operand 0 "memory_operand"))))
;; Test for a valid operand for a call instruction.
(define_predicate "call_insn_operand"
(ior (match_operand 0 "constant_call_address_operand")
;; Allow constant call address operands in Pmode only.
(define_special_predicate "call_insn_operand"
(ior (match_test "constant_call_address_operand
(op, mode == VOIDmode ? mode : Pmode)")
(match_operand 0 "call_register_no_elim_operand")
(and (not (match_test "TARGET_X32"))
(match_operand 0 "memory_operand"))))
;; Similarly, but for tail calls, in which we cannot allow memory references.
(define_predicate "sibcall_insn_operand"
(ior (match_operand 0 "constant_call_address_operand")
(define_special_predicate "sibcall_insn_operand"
(ior (match_test "constant_call_address_operand
(op, mode == VOIDmode ? mode : Pmode)")
(match_operand 0 "register_no_elim_operand")))
;; Match exactly zero.