aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2001-04-09 13:18:39 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2001-04-09 11:18:39 +0000
commit39d04363053e586b594f31a5e02ea6c4a5b6e7f7 (patch)
tree634c7e0b3be2bc2c554d8bc00b3d5f7082b014e0 /gcc
parenta6b9fb7a348173fe5592c40e947c2b714f5963f8 (diff)
downloadgcc-39d04363053e586b594f31a5e02ea6c4a5b6e7f7.zip
gcc-39d04363053e586b594f31a5e02ea6c4a5b6e7f7.tar.gz
gcc-39d04363053e586b594f31a5e02ea6c4a5b6e7f7.tar.bz2
i386.c (call, call_value): Make sure that resulting call_insn does have proper second operand.
* i386.c (call, call_value): Make sure that resulting call_insn does have proper second operand. From-SVN: r41201
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/i386/i386-protos.h1
-rw-r--r--gcc/config/i386/i386.h13
-rw-r--r--gcc/config/i386/i386.md19
4 files changed, 21 insertions, 17 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2c95ae3..235e319 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+Sun Apr 8 00:43:27 CEST 2001 Jan Hubicka <jh@suse.cz>
+
+ * i386.c (call, call_value): Make sure that resulting call_insn
+ does have proper second operand.
+
Sun Apr 8 22:50:49 2001 Christopher Faylor <cgf@cygnus.com>
* config/i386/xm-cygwin.h (GET_ENV_PATH_LIST): Eliminate obsolete
diff --git a/gcc/config/i386/i386-protos.h b/gcc/config/i386/i386-protos.h
index 28fc3ff..f5e9371 100644
--- a/gcc/config/i386/i386-protos.h
+++ b/gcc/config/i386/i386-protos.h
@@ -118,6 +118,7 @@ extern void ix86_expand_branch PARAMS ((enum rtx_code, rtx));
extern int ix86_expand_setcc PARAMS ((enum rtx_code, rtx));
extern int ix86_expand_int_movcc PARAMS ((rtx[]));
extern int ix86_expand_fp_movcc PARAMS ((rtx[]));
+extern void x86_initialize_trampoline PARAMS ((rtx, rtx, rtx));
extern void ix86_split_long_move PARAMS ((rtx[]));
extern void ix86_split_ashldi PARAMS ((rtx *, rtx));
extern void ix86_split_ashrdi PARAMS ((rtx *, rtx));
diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
index 8ccf891..c448827 100644
--- a/gcc/config/i386/i386.h
+++ b/gcc/config/i386/i386.h
@@ -1704,23 +1704,14 @@ pop{l} %0" \
/* Length in units of the trampoline for entering a nested function. */
-#define TRAMPOLINE_SIZE 10
+#define TRAMPOLINE_SIZE (TARGET_64BIT ? 23 : 10)
/* Emit RTL insns to initialize the variable parts of a trampoline.
FNADDR is an RTX for the address of the function's pure code.
CXT is an RTX for the static chain value for the function. */
#define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT) \
-{ \
- /* Compute offset from the end of the jmp to the target function. */ \
- rtx disp = expand_binop (SImode, sub_optab, FNADDR, \
- plus_constant (TRAMP, 10), \
- NULL_RTX, 1, OPTAB_DIRECT); \
- emit_move_insn (gen_rtx_MEM (QImode, TRAMP), GEN_INT (0xb9)); \
- emit_move_insn (gen_rtx_MEM (SImode, plus_constant (TRAMP, 1)), CXT); \
- emit_move_insn (gen_rtx_MEM (QImode, plus_constant (TRAMP, 5)), GEN_INT (0xe9));\
- emit_move_insn (gen_rtx_MEM (SImode, plus_constant (TRAMP, 6)), disp); \
-}
+ x86_initialize_trampoline (TRAMP, FNADDR, CXT)
/* Definitions for register eliminations.
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index 5aa3e49..dd10423 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -12882,11 +12882,13 @@
(define_expand "call"
[(call (match_operand:QI 0 "" "")
- (match_operand 2 "" ""))]
+ (match_operand 1 "" ""))
+ (use (match_operand 2 "" ""))]
;; Operand 1 not used on the i386.
""
"
{
+ rtx insn;
/* Static functions and indirect calls don't need
current_function_uses_pic_offset_table. */
if (flag_pic
@@ -12898,13 +12900,14 @@
XEXP (operands[0], 0) = copy_to_mode_reg (Pmode, XEXP (operands[0], 0));
if (TARGET_64BIT && INTVAL (operands[2]) >= 0)
{
- rtx insn;
rtx reg = gen_rtx_REG (QImode, 0);
emit_move_insn (reg, operands[2]);
- insn = emit_call_insn (gen_call_exp (operands[0], operands[2]));
+ insn = emit_call_insn (gen_call_exp (operands[0], operands[1]));
use_reg (&CALL_INSN_FUNCTION_USAGE (insn), reg);
DONE;
}
+ insn = emit_call_insn (gen_call_exp (operands[0], operands[1]));
+ DONE;
}")
(define_expand "call_exp"
@@ -12998,11 +13001,13 @@
(define_expand "call_value"
[(set (match_operand 0 "" "")
(call (match_operand:QI 1 "" "")
- (match_operand:SI 3 "" "")))]
+ (match_operand:SI 2 "" "")))
+ (use (match_operand:SI 3 "" ""))]
;; Operand 2 not used on the i386.
""
"
{
+ rtx insn;
/* Static functions and indirect calls don't need
current_function_uses_pic_offset_table. */
if (flag_pic
@@ -13013,14 +13018,16 @@
XEXP (operands[1], 0) = copy_to_mode_reg (Pmode, XEXP (operands[1], 0));
if (TARGET_64BIT && INTVAL (operands[3]) >= 0)
{
- rtx insn;
rtx reg = gen_rtx_REG (QImode, 0);
emit_move_insn (reg, operands[3]);
insn = emit_call_insn (gen_call_value_exp (operands[0], operands[1],
- operands[3]));
+ operands[2]));
use_reg (&CALL_INSN_FUNCTION_USAGE (insn), reg);
DONE;
}
+ insn = emit_call_insn (gen_call_value_exp (operands[0], operands[1],
+ operands[2]));
+ DONE;
}")
(define_expand "call_value_exp"