From 64276d76e1271c7853adafb8de5364220976aa9b Mon Sep 17 00:00:00 2001 From: Chen Liqin Date: Fri, 17 Aug 2007 03:38:47 +0000 Subject: [PATCH] score.md: Update pattern tablejump. 2007-08-17 Chen Liqin * config/score/score.md : Update pattern tablejump. * config/score/score.c : Update score_initialize_trampoline function. * config/score/score.h (TRAMPOLINE_TEMPLATE): Added macro. (TRAMPOLINE_INSNS, TRAMPOLINE_SIZE) Update macro. * doc/contrib.texi: Add my entry. From-SVN: r127577 --- gcc/ChangeLog | 8 ++++++++ gcc/config/score/score.c | 35 ++++++++++++----------------------- gcc/config/score/score.h | 19 ++++++++++++++++--- gcc/config/score/score.md | 2 -- gcc/doc/contrib.texi | 4 ++++ 5 files changed, 40 insertions(+), 28 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f027d79452a..c729337cdb1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2007-08-17 Chen Liqin + * config/score/score.md : Update pattern tablejump. + * config/score/score.c : Update score_initialize_trampoline + function. + * config/score/score.h (TRAMPOLINE_TEMPLATE): Added macro. + (TRAMPOLINE_INSNS, TRAMPOLINE_SIZE) Update macro. + * doc/contrib.texi: Add my entry. + 2007-08-16 H.J. Lu * Makefile.in (REVISION): New. diff --git a/gcc/config/score/score.c b/gcc/config/score/score.c index 7b8c0c20984..1a3aee5412f 100644 --- a/gcc/config/score/score.c +++ b/gcc/config/score/score.c @@ -182,6 +182,9 @@ th_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED, /* Pretend to be a post-reload pass while generating rtl. */ reload_completed = 1; + /* Mark the end of the (empty) prologue. */ + emit_note (NOTE_INSN_PROLOGUE_END); + /* We need two temporary registers in some cases. */ temp1 = gen_rtx_REG (Pmode, 8); temp2 = gen_rtx_REG (Pmode, 9); @@ -747,30 +750,13 @@ score_initialize_trampoline (rtx ADDR, rtx FUNC, rtx CHAIN) #define FFCACHE "_flush_cache" #define CODE_SIZE (TRAMPOLINE_INSNS * UNITS_PER_WORD) - unsigned int tramp[TRAMPOLINE_INSNS] = { - 0x8103bc56, /* mv r8, r3 */ - 0x9000bc05, /* bl 0x0x8 */ - 0xc1238000 | (CODE_SIZE - 8), /* lw r9, &func */ - 0xc0038000 - | (STATIC_CHAIN_REGNUM << 21) - | (CODE_SIZE - 4), /* lw static chain reg, &chain */ - 0x8068bc56, /* mv r3, r8 */ - 0x8009bc08, /* br r9 */ - 0x0, - 0x0, - }; rtx pfunc, pchain; - int i; - - for (i = 0; i < TRAMPOLINE_INSNS; i++) - emit_move_insn (gen_rtx_MEM (ptr_mode, plus_constant (ADDR, i << 2)), - GEN_INT (tramp[i])); pfunc = plus_constant (ADDR, CODE_SIZE); - pchain = plus_constant (ADDR, CODE_SIZE + GET_MODE_SIZE (ptr_mode)); + pchain = plus_constant (ADDR, CODE_SIZE + GET_MODE_SIZE (SImode)); - emit_move_insn (gen_rtx_MEM (ptr_mode, pfunc), FUNC); - emit_move_insn (gen_rtx_MEM (ptr_mode, pchain), CHAIN); + emit_move_insn (gen_rtx_MEM (SImode, pfunc), FUNC); + emit_move_insn (gen_rtx_MEM (SImode, pchain), CHAIN); emit_library_call (gen_rtx_SYMBOL_REF (Pmode, FFCACHE), 0, VOIDmode, 2, ADDR, Pmode, @@ -1172,7 +1158,7 @@ score_print_operand (FILE *file, rtx op, int c) { rtx temp = gen_lowpart (SImode, op); gcc_assert (GET_MODE (op) == SFmode); - fprintf (file, HOST_WIDE_INT_PRINT_HEX, INTVAL (temp) & 0xffffffff); + fprintf (file, HOST_WIDE_INT_PRINT_HEX, INTVAL (temp) & 0xffffffff); } else output_addr_const (file, op); @@ -1297,8 +1283,11 @@ score_print_operand_address (FILE *file, rtx x) INTVAL (addr.offset)); break; default: - fprintf (file, "[%s,%ld]", reg_names[REGNO (addr.reg)], - INTVAL (addr.offset)); + if (INTVAL(addr.offset) == 0) + fprintf(file, "[%s]", reg_names[REGNO (addr.reg)]); + else + fprintf(file, "[%s, %ld]", reg_names[REGNO (addr.reg)], + INTVAL(addr.offset)); break; } } diff --git a/gcc/config/score/score.h b/gcc/config/score/score.h index 998a25a6793..c0cc3040364 100644 --- a/gcc/config/score/score.h +++ b/gcc/config/score/score.h @@ -628,12 +628,25 @@ typedef struct score_args fprintf (FILE, " .set nor1 \n"); \ } +#define TRAMPOLINE_TEMPLATE(STREAM) \ +{ \ + fprintf (STREAM, "\t.set r1\n"); \ + fprintf (STREAM, "\tmv r31, r3\n"); \ + fprintf (STREAM, "\tbl nextinsn\n"); \ + fprintf (STREAM, "nextinsn:\n"); \ + fprintf (STREAM, "\tlw r1, [r3, 6*4-8]\n"); \ + fprintf (STREAM, "\tlw r23, [r3, 6*4-4]\n"); \ + fprintf (STREAM, "\tmv r3, r31\n"); \ + fprintf (STREAM, "\tbr! r1\n"); \ + fprintf (STREAM, "\tnop!\n"); \ + fprintf (STREAM, "\t.set nor1\n"); \ +} + /* Trampolines for Nested Functions. */ -#define TRAMPOLINE_INSNS 8 +#define TRAMPOLINE_INSNS 6 /* A C expression for the size in bytes of the trampoline, as an integer. */ -#define TRAMPOLINE_SIZE \ - (TRAMPOLINE_INSNS * GET_MODE_SIZE (SImode) + GET_MODE_SIZE (ptr_mode) * 2) +#define TRAMPOLINE_SIZE (24 + GET_MODE_SIZE (ptr_mode) * 2) /* A C statement to initialize the variable parts of a trampoline. ADDR is an RTX for the address of the trampoline; FNADDR is an diff --git a/gcc/config/score/score.md b/gcc/config/score/score.md index 98ba96299c5..c2b94c4eb17 100644 --- a/gcc/config/score/score.md +++ b/gcc/config/score/score.md @@ -1429,8 +1429,6 @@ (use (label_ref (match_operand 1 "" "")))] "" { - if (GET_MODE (operands[0]) != ptr_mode) - gcc_unreachable (); emit_jump_insn (gen_tablejump_internal1 (operands[0], operands[1])); DONE; }) diff --git a/gcc/doc/contrib.texi b/gcc/doc/contrib.texi index 4d5b5afdd48..929e355346b 100644 --- a/gcc/doc/contrib.texi +++ b/gcc/doc/contrib.texi @@ -513,6 +513,10 @@ patches. @item Robert Lipe for OpenServer support, new testsuites, testing, etc. +@item +Chen Liqin for various S+core related fixes/improvement, and for +maintaining the S+core port. + @item Weiwen Liu for testing and various bug fixes. -- 2.30.2