+2007-08-17 Chen liqin <liqin@sunnorth.com.cn>
+
+ * 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-02 Andreas Krebbel <krebbel1@de.ibm.com>
* config/s390/s390.md ("*xordi3_cconly"): Change xr to xg.
#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,
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;
}
}
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
(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;
})
@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.