Commit 202f590e by Richard Henderson Committed by Jeff Law

alpha.c (call_operand): Any reg is valid for WinNT.

        * alpha.c (call_operand): Any reg is valid for WinNT.
        * alpha.md (call_nt, call_value_nt): Don't force address into $27.
        (anon nt calls): Add 'R' alternative.
        * alpha/win-nt.h (TRAMPOLINE_TEMPLATE, TRAMPOLINE_SIZE,
        INITIALIZE_TRAMPOLINE): Handle lack of original $27 and 32-bit ptrs.

From-SVN: r16487
parent f78b5ca1
Fri Nov 14 07:24:20 1997 Richard Henderson <rth@cygnus.com>
* alpha.c (call_operand): Any reg is valid for WinNT.
* alpha.md (call_nt, call_value_nt): Don't force address into $27.
(anon nt calls): Add 'R' alternative.
* alpha/win-nt.h (TRAMPOLINE_TEMPLATE, TRAMPOLINE_SIZE,
INITIALIZE_TRAMPOLINE): Handle lack of original $27 and 32-bit ptrs.
Fri Nov 14 06:59:33 1997 Jeffrey A Law (law@cygnus.com) Fri Nov 14 06:59:33 1997 Jeffrey A Law (law@cygnus.com)
* calls.c (expand_call): Handle pcc_struct_value correctly for C++. * calls.c (expand_call): Handle pcc_struct_value correctly for C++.
......
...@@ -542,7 +542,8 @@ call_operand (op, mode) ...@@ -542,7 +542,8 @@ call_operand (op, mode)
return 0; return 0;
return (GET_CODE (op) == SYMBOL_REF return (GET_CODE (op) == SYMBOL_REF
|| (GET_CODE (op) == REG && (TARGET_OPEN_VMS || REGNO (op) == 27))); || (GET_CODE (op) == REG
&& (TARGET_OPEN_VMS || TARGET_WINDOWS_NT || REGNO (op) == 27)));
} }
/* Return 1 if OP is a valid Alpha comparison operator. Here we know which /* Return 1 if OP is a valid Alpha comparison operator. Here we know which
......
...@@ -3216,22 +3216,17 @@ ...@@ -3216,22 +3216,17 @@
}") }")
(define_expand "call_nt" (define_expand "call_nt"
[(parallel [(call (mem:DI (match_operand:DI 0 "" "")) [(parallel [(call (mem:DI (match_operand 0 "" ""))
(match_operand 1 "" "")) (match_operand 1 "" ""))
(clobber (reg:DI 26))])] (clobber (reg:DI 26))])]
"" ""
" "
{ if (GET_CODE (operands[0]) != MEM) { if (GET_CODE (operands[0]) != MEM)
abort (); abort ();
operands[0] = XEXP (operands[0], 0);
if (GET_CODE (operands[1]) != SYMBOL_REF operands[0] = XEXP (operands[0], 0);
&& ! (GET_CODE (operands[1]) == REG && REGNO (operands[1]) == 27)) if (GET_CODE (operands[0]) != SYMBOL_REF && GET_CODE (operands[0]) != REG)
{ operands[0] = force_reg (DImode, operands[0]);
rtx tem = gen_rtx (REG, DImode, 27);
emit_move_insn (tem, operands[1]);
operands[1] = tem;
}
}") }")
;; ;;
...@@ -3329,7 +3324,7 @@ ...@@ -3329,7 +3324,7 @@
(define_expand "call_value_nt" (define_expand "call_value_nt"
[(parallel [(set (match_operand 0 "" "") [(parallel [(set (match_operand 0 "" "")
(call (mem:DI (match_operand:DI 1 "" "")) (call (mem:DI (match_operand 1 "" ""))
(match_operand 2 "" ""))) (match_operand 2 "" "")))
(clobber (reg:DI 26))])] (clobber (reg:DI 26))])]
"" ""
...@@ -3338,13 +3333,8 @@ ...@@ -3338,13 +3333,8 @@
abort (); abort ();
operands[1] = XEXP (operands[1], 0); operands[1] = XEXP (operands[1], 0);
if (GET_CODE (operands[1]) != SYMBOL_REF if (GET_CODE (operands[0]) != SYMBOL_REF && GET_CODE (operands[0]) != REG)
&& ! (GET_CODE (operands[1]) == REG && REGNO (operands[1]) == 27)) operands[1] = force_reg (DImode, operands[1]);
{
rtx tem = gen_rtx (REG, DImode, 27);
emit_move_insn (tem, operands[1]);
operands[1] = tem;
}
}") }")
(define_expand "call_value_vms" (define_expand "call_value_vms"
...@@ -3406,13 +3396,14 @@ ...@@ -3406,13 +3396,14 @@
[(set_attr "type" "jsr")]) [(set_attr "type" "jsr")])
(define_insn "" (define_insn ""
[(call (mem:DI (match_operand:DI 0 "call_operand" "r,i")) [(call (mem:DI (match_operand:DI 0 "call_operand" "r,R,i"))
(match_operand 1 "" "")) (match_operand 1 "" ""))
(clobber (reg:DI 26))] (clobber (reg:DI 26))]
"TARGET_WINDOWS_NT" "TARGET_WINDOWS_NT"
"@ "@
jsr $26,(%0) jsr $26,(%0)
bsr $26,%0" bsr $26,%0
jsr $26,%0"
[(set_attr "type" "jsr")]) [(set_attr "type" "jsr")])
(define_insn "" (define_insn ""
...@@ -3442,14 +3433,15 @@ ...@@ -3442,14 +3433,15 @@
[(set_attr "type" "jsr")]) [(set_attr "type" "jsr")])
(define_insn "" (define_insn ""
[(set (match_operand 0 "register_operand" "=rf,rf") [(set (match_operand 0 "register_operand" "=rf,rf,rf")
(call (mem:DI (match_operand:DI 1 "call_operand" "r,i")) (call (mem:DI (match_operand:DI 1 "call_operand" "r,R,i"))
(match_operand 2 "" ""))) (match_operand 2 "" "")))
(clobber (reg:DI 26))] (clobber (reg:DI 26))]
"TARGET_WINDOWS_NT" "TARGET_WINDOWS_NT"
"@ "@
jsr $26,(%1) jsr $26,(%1)
bsr $26,%1" bsr $26,%1
jsr $26,%1"
[(set_attr "type" "jsr")]) [(set_attr "type" "jsr")])
(define_insn "" (define_insn ""
......
...@@ -70,3 +70,59 @@ Boston, MA 02111-1307, USA. */ ...@@ -70,3 +70,59 @@ Boston, MA 02111-1307, USA. */
%{!mwindows:-subsystem console -e _mainCRTStartup} \ %{!mwindows:-subsystem console -e _mainCRTStartup} \
%{mcrtmt:LIBCMT.LIB%s KERNEL32.LIB%s} %{!mcrtmt:LIBC.LIB%s KERNEL32.LIB%s} \ %{mcrtmt:LIBCMT.LIB%s KERNEL32.LIB%s} %{!mcrtmt:LIBC.LIB%s KERNEL32.LIB%s} \
%{v}" %{v}"
/* Output assembler code for a block containing the constant parts
of a trampoline, leaving space for the variable parts.
The trampoline should set the static chain pointer to value placed
into the trampoline and should branch to the specified routine. */
#undef TRAMPOLINE_TEMPLATE
#define TRAMPOLINE_TEMPLATE(FILE) \
{ \
fprintf (FILE, "\tbr $27,$LTRAMPP\n"); \
fprintf (FILE, "$LTRAMPP:\n\tldl $1,12($27)\n"); \
fprintf (FILE, "\tldl $27,16($27)\n"); \
fprintf (FILE, "\tjmp $31,($27),0\n"); \
fprintf (FILE, "\t.long 0,0\n"); \
}
/* Length in units of the trampoline for entering a nested function. */
#undef TRAMPOLINE_SIZE
#define TRAMPOLINE_SIZE 24
/* 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.
This differs from the standard version in that:
We are not passed the current address in any register, and so have to
load it ourselves.
We do not initialize the "hint" field because it only has an 8k
range and so the target is in range of something on the stack.
Omitting the hint saves a bogus branch-prediction cache line load.
Always have an executable stack -- no need for a system call.
*/
#undef INITIALIZE_TRAMPOLINE
#define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT) \
{ \
rtx _addr, _val; \
\
_addr = memory_address (Pmode, plus_constant ((TRAMP), 16)); \
_val = force_reg(Pmode, (FNADDR)); \
emit_move_insn (gen_rtx (MEM, SImode, _addr), \
gen_rtx (SUBREG, SImode, _val, 0)); \
_addr = memory_address (Pmode, plus_constant ((TRAMP), 20)); \
_val = force_reg(Pmode, (CXT)); \
emit_move_insn (gen_rtx (MEM, SImode, _addr), \
gen_rtx (SUBREG, SImode, _val, 0)); \
\
emit_insn (gen_rtx (UNSPEC_VOLATILE, VOIDmode, \
gen_rtvec (1, const0_rtx), 0)); \
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment