Mercurial > hg > CbC > CbC_gcc
diff gcc/config/pdp11/pdp11.c @ 55:77e2b8dfacca gcc-4.4.5
update it from 4.4.3 to 4.5.0
author | ryoma <e075725@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 12 Feb 2010 23:39:51 +0900 |
parents | a06113de4d67 |
children | b7f97abdc517 |
line wrap: on
line diff
--- a/gcc/config/pdp11/pdp11.c Sun Feb 07 18:28:00 2010 +0900 +++ b/gcc/config/pdp11/pdp11.c Fri Feb 12 23:39:51 2010 +0900 @@ -1,6 +1,6 @@ /* Subroutines for gcc2 for pdp11. Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2004, 2005, - 2006, 2007, 2008 Free Software Foundation, Inc. + 2006, 2007, 2008, 2009 Free Software Foundation, Inc. Contributed by Michael K. Gschwind (mike@vlsivie.tuwien.ac.at). This file is part of GCC. @@ -152,6 +152,7 @@ static void pdp11_output_function_epilogue (FILE *, HOST_WIDE_INT); static bool pdp11_rtx_costs (rtx, int, int, int *, bool); static bool pdp11_return_in_memory (const_tree, const_tree); +static void pdp11_trampoline_init (rtx, tree, rtx); /* Initialize the GCC target structure. */ #undef TARGET_ASM_BYTE_OP @@ -185,6 +186,9 @@ #undef TARGET_RETURN_IN_MEMORY #define TARGET_RETURN_IN_MEMORY pdp11_return_in_memory +#undef TARGET_TRAMPOLINE_INIT +#define TARGET_TRAMPOLINE_INIT pdp11_trampoline_init + struct gcc_target targetm = TARGET_INITIALIZER; /* Implement TARGET_HANDLE_OPTION. */ @@ -241,23 +245,6 @@ knowing which registers should not be saved even if used. */ -#ifdef TWO_BSD - -static void -pdp11_output_function_prologue (FILE *stream, HOST_WIDE_INT size) -{ - fprintf (stream, "\tjsr r5, csv\n"); - if (size) - { - fprintf (stream, "\t/*abuse empty parameter slot for locals!*/\n"); - if (size > 2) - asm_fprintf (stream, "\tsub $%#wo, sp\n", size - 2); - - } -} - -#else /* !TWO_BSD */ - static void pdp11_output_function_prologue (FILE *stream, HOST_WIDE_INT size) { @@ -331,8 +318,6 @@ fprintf (stream, "\t;/* end of prologue */\n\n"); } -#endif /* !TWO_BSD */ - /* The function epilogue should not depend on the current stack pointer! It should use the frame pointer only. This is mandatory because @@ -352,18 +337,6 @@ maybe as option if you want to generate code for kernel mode? */ -#ifdef TWO_BSD - -static void -pdp11_output_function_epilogue (FILE *stream, - HOST_WIDE_INT size ATTRIBUTE_UNUSED) -{ - fprintf (stream, "\t/* SP ignored by cret? */\n"); - fprintf (stream, "\tjmp cret\n"); -} - -#else /* !TWO_BSD */ - static void pdp11_output_function_epilogue (FILE *stream, HOST_WIDE_INT size) { @@ -469,8 +442,6 @@ fprintf (stream, "\t;/* end of epilogue*/\n\n\n"); } -#endif /* !TWO_BSD */ - /* Return the best assembler insn template for moving operands[1] into operands[0] as a fullword. */ static const char * @@ -1203,11 +1174,27 @@ } const char * -output_jump (const char *pos, const char *neg, int length) +output_jump (enum rtx_code code, int inv, int length) { static int x = 0; static char buf[1000]; + const char *pos, *neg; + + switch (code) + { + case EQ: pos = "beq", neg = "bne"; break; + case NE: pos = "bne", neg = "beq"; break; + case GT: pos = "bgt", neg = "ble"; break; + case GTU: pos = "bhi", neg = "blos"; break; + case LT: pos = "blt", neg = "bge"; break; + case LTU: pos = "blo", neg = "bhis"; break; + case GE: pos = "bge", neg = "blt"; break; + case GEU: pos = "bhis", neg = "blo"; break; + case LE: pos = "ble", neg = "bgt"; break; + case LEU: pos = "blos", neg = "bhi"; break; + default: gcc_unreachable (); + } #if 0 /* currently we don't need this, because the tstdf and cmpdf @@ -1223,14 +1210,13 @@ { case 1: - strcpy(buf, pos); - strcat(buf, " %l0"); + sprintf(buf, "%s %%l1", inv ? neg : pos); return buf; case 3: - sprintf(buf, "%s JMP_%d\n\tjmp %%l0\nJMP_%d:", neg, x, x); + sprintf(buf, "%s JMP_%d\n\tjmp %%l1\nJMP_%d:", inv ? pos : neg, x, x); x++; @@ -1624,20 +1610,6 @@ return ""; } -int -legitimate_address_p (enum machine_mode mode, rtx address) -{ -/* #define REG_OK_STRICT */ - GO_IF_LEGITIMATE_ADDRESS(mode, address, win); - - return 0; - - win: - return 1; - -/* #undef REG_OK_STRICT */ -} - /* This function checks whether a real value can be encoded as a literal, i.e., addressing mode 27. In that mode, real values are one word values, so the remaining 48 bits have to be zero. */ @@ -1772,3 +1744,31 @@ return (TYPE_MODE (type) == DImode || (TYPE_MODE (type) == DFmode && ! TARGET_AC0)); } + +/* Worker function for TARGET_TRAMPOLINE_INIT. + + trampoline - how should i do it in separate i+d ? + have some allocate_trampoline magic??? + + the following should work for shared I/D: + + MV #STATIC, $4 0x940Y 0x0000 <- STATIC; Y = STATIC_CHAIN_REGNUM + JMP FUNCTION 0x0058 0x0000 <- FUNCTION +*/ + +static void +pdp11_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value) +{ + rtx fnaddr = XEXP (DECL_RTL (fndecl), 0); + rtx mem; + + gcc_assert (!TARGET_SPLIT); + + mem = adjust_address (m_tramp, HImode, 0); + emit_move_insn (mem, GEN_INT (0x9400+STATIC_CHAIN_REGNUM)); + mem = adjust_address (m_tramp, HImode, 2); + emit_move_insn (mem, chain_value); + mem = adjust_address (m_tramp, HImode, 4); + emit_move_insn (mem, GEN_INT (0x0058)); + emit_move_insn (mem, fnaddr); +}