2005-06-23
2005-06-23 16:30:02 by Henrik Grubbström (Grubba) <grubba@grubba.org>
-
6a2a6d9603130b0557f17e19a9cc63682037dec9
(70 lines)
(+44/-26)
[
Show
| Annotate
]
Branch: 7.9
Now uses bias when accessing the pike stack.
Fixed a few signed/unsigned bugs.
Rev: src/code/sparc.c:1.45
2:
|| This file is part of Pike. For copyright information see COPYRIGHT.
|| Pike is distributed under GPL, LGPL and MPL. See the file COPYING
|| for more information.
- || $Id: sparc.c,v 1.44 2005/06/23 15:09:42 grubba Exp $
+ || $Id: sparc.c,v 1.45 2005/06/23 16:30:02 grubba Exp $
*/
/*
246:
* Code generator state.
*/
unsigned INT32 sparc_codegen_state = 0;
+ static int sparc_pike_sp_bias = 0;
ptrdiff_t sparc_last_pc = 0;
#ifdef PIKE_BYTECODE_SPARC64
281:
PIKE_LDPTR(SPARC_REG_PIKE_SP, SPARC_REG_PIKE_IP, \
OFFSETOF(Pike_interpreter, stack_pointer), 1); \
sparc_codegen_state |= SPARC_CODEGEN_SP_IS_SET; \
+ sparc_pike_sp_bias = 0; \
+ } else if (sparc_pike_sp_bias > 0xf00) { \
+ /* Make sure there's always space for at least 256 bytes. */ \
+ SPARC_ADD(SPARC_REG_PIKE_SP, SPARC_REG_PIKE_SP, \
+ sparc_pike_sp_bias, 1); \
+ sparc_pike_sp_bias = 0; \
+ sparc_codegen_state |= SPARC_CODEGEN_SP_NEEDS_STORE; \
} \
} while(0)
295:
} while(0)
#define SPARC_FLUSH_UNSTORED() do { \
+ if (sparc_pike_sp_bias) { \
+ SPARC_ADD(SPARC_REG_PIKE_SP, SPARC_REG_PIKE_SP, \
+ sparc_pike_sp_bias, 1); \
+ sparc_pike_sp_bias = 0; \
+ sparc_codegen_state |= SPARC_CODEGEN_SP_NEEDS_STORE; \
+ } \
if (sparc_codegen_state & SPARC_CODEGEN_MARK_SP_NEEDS_STORE) { \
/* stw %pike_mark_sp, [ %ip, %offset(Pike_interpreter, mark_stack_pointer) ] */ \
PIKE_STPTR(SPARC_REG_PIKE_MARK_SP, SPARC_REG_PIKE_IP, \
399:
sparc_codegen_state |= SPARC_CODEGEN_MARK_SP_NEEDS_STORE;
}
- static void sparc_mark(int off)
+ static void sparc_mark(ptrdiff_t off)
{
LOAD_PIKE_SP();
LOAD_PIKE_MARK_SP();
- if (off) {
+
off *= sizeof(struct svalue);
-
+ off += sparc_pike_sp_bias;
+ if (off) {
if ((-4096 <= off) && (off < 4096)) {
/* add %i0, %pike_sp, off */
SPARC_ADD(SPARC_REG_I0, SPARC_REG_PIKE_SP, off, 1);
436: Inside #if defined(PIKE_DEBUG)
/* Pad until we reach the anything field. */
if (e == OFFSETOF(svalue, u.integer)) continue;
/* stw %g0, [ %pike_sp, e ] */
- SPARC_STW(SPARC_REG_G0, SPARC_REG_PIKE_SP, e, 1);
+ SPARC_STW(SPARC_REG_G0, SPARC_REG_PIKE_SP, sparc_pike_sp_bias + e, 1);
}
}
#endif /* PIKE_DEBUG */
445:
reg = SPARC_REG_I1;
}
if (sizeof(INT_TYPE) == 4) {
- SPARC_STW(reg, SPARC_REG_PIKE_SP, OFFSETOF(svalue, u.integer), 1);
+ SPARC_STW(reg, SPARC_REG_PIKE_SP,
+ sparc_pike_sp_bias + OFFSETOF(svalue, u.integer), 1);
} else {
- SPARC_STX(reg, SPARC_REG_PIKE_SP, OFFSETOF(svalue, u.integer), 1);
+ SPARC_STX(reg, SPARC_REG_PIKE_SP,
+ sparc_pike_sp_bias + OFFSETOF(svalue, u.integer), 1);
}
if (x != type_word) {
SET_REG(SPARC_REG_I1, type_word);
}
/* This is safe since type_word is never zero. */
/* stw %i1, [ %pike_sp ] */
- SPARC_STW(SPARC_REG_I1, SPARC_REG_PIKE_SP, 0, 1);
- /* add %pike_sp, %pike_sp, sizeof(struct svalue) */
- SPARC_ADD(SPARC_REG_PIKE_SP, SPARC_REG_PIKE_SP, sizeof(struct svalue), 1);
+ SPARC_STW(SPARC_REG_I1, SPARC_REG_PIKE_SP, sparc_pike_sp_bias, 1);
+ sparc_pike_sp_bias += sizeof(struct svalue);
sparc_codegen_state |= SPARC_CODEGEN_SP_NEEDS_STORE;
}
464:
{
LOAD_PIKE_SP();
/* lduh [ %pike_sp, %g0 ], %i0 */
- SPARC_LDUH(SPARC_REG_I0, SPARC_REG_PIKE_SP, OFFSETOF(svalue, type), 1);
+ SPARC_LDUH(SPARC_REG_I0, SPARC_REG_PIKE_SP,
+ sparc_pike_sp_bias + OFFSETOF(svalue, type), 1);
/* subcc %g0, %i0, 8 */
SPARC_SUBcc(SPARC_REG_G0, SPARC_REG_I0, PIKE_T_INT, 1);
/* be,a .+8 */
SPARC_BE(8, 1);
/* sth %g0, [ %pike_sp, 2 ] */
- SPARC_STH(SPARC_REG_G0, SPARC_REG_PIKE_SP, OFFSETOF(svalue, subtype), 1);
+ SPARC_STH(SPARC_REG_G0, SPARC_REG_PIKE_SP,
+ sparc_pike_sp_bias + OFFSETOF(svalue, subtype), 1);
}
static void sparc_push_lfun(unsigned int no)
482:
OFFSETOF(pike_frame, current_object), 1);
/* stw %pike_obj, [ %pike_sp, %offset(svalue, u.object) ] */
PIKE_STPTR(SPARC_REG_PIKE_OBJ, SPARC_REG_PIKE_SP,
- OFFSETOF(svalue, u.object), 1);
+ sparc_pike_sp_bias + OFFSETOF(svalue, u.object), 1);
/* lduw [ %pike_obj, %offset(object, refs) ], %i0 */
SPARC_LDUW(SPARC_REG_I0, SPARC_REG_PIKE_OBJ,
OFFSETOF(object, refs), 1);
498:
/* add %i1, %i2, %i1 */
SPARC_ADD(SPARC_REG_I1, SPARC_REG_I1, SPARC_REG_I2, 0);
/* stw %i1, [ %pike_sp, %g0 ] */
- SPARC_STW(SPARC_REG_I1, SPARC_REG_PIKE_SP, SPARC_REG_G0, 0);
- /* add %pike_sp, sizeof(struct svalue), %pike_sp */
- SPARC_ADD(SPARC_REG_PIKE_SP, SPARC_REG_PIKE_SP, sizeof(struct svalue), 1);
+ SPARC_STW(SPARC_REG_I1, SPARC_REG_PIKE_SP, sparc_pike_sp_bias, 1);
+ sparc_pike_sp_bias += sizeof(struct svalue);
sparc_codegen_state |= SPARC_CODEGEN_SP_NEEDS_STORE;
}
510:
LOAD_PIKE_FP();
SET_REG(SPARC_REG_I0, T_SVALUE_PTR);
/* sth %i0, [ %pike_sp, %g0 ] */
- SPARC_STH(SPARC_REG_I0, SPARC_REG_PIKE_SP, SPARC_REG_G0, 0);
+ SPARC_STH(SPARC_REG_I0, SPARC_REG_PIKE_SP, sparc_pike_sp_bias, 1);
SET_REG(SPARC_REG_I0, T_VOID);
no *= sizeof(struct svalue);
if (no < 4096) {
529:
}
/* stw %i2, [ %pike_sp, %offset(svalue, u.lval) ] */
PIKE_STPTR(SPARC_REG_I2, SPARC_REG_PIKE_SP,
- OFFSETOF(svalue, u.lval), 1);
- /* add %pike_sp, sizeof(struct svalue) * 2, %pike_sp */
- SPARC_ADD(SPARC_REG_PIKE_SP, SPARC_REG_PIKE_SP, sizeof(struct svalue)*2, 1);
+ sparc_pike_sp_bias + OFFSETOF(svalue, u.lval), 1);
+ sparc_pike_sp_bias += sizeof(struct svalue) * 2;
/* sth %i0, [ %pike_sp , -sizeof(struct svalue) ] */
- SPARC_STH(SPARC_REG_I0, SPARC_REG_PIKE_SP, -sizeof(struct svalue), 1);
+ SPARC_STH(SPARC_REG_I0, SPARC_REG_PIKE_SP,
+ sparc_pike_sp_bias - sizeof(struct svalue), 1);
sparc_codegen_state |= SPARC_CODEGEN_SP_NEEDS_STORE;
}
628: Inside #if defined(PIKE_DEBUG) and #if defined(PIKE_BYTECODE_SPARC64)
SPARC_SETHI(SPARC_REG_O7, ((ptrdiff_t)sparc_debug_check_registers)>>2);
SPARC_OR(SPARC_REG_O2, SPARC_REG_PIKE_FP, SPARC_REG_G0, 0);
SPARC_SLL(SPARC_REG_O7, SPARC_REG_O7, 2, 1);
- SPARC_OR(SPARC_REG_O3, SPARC_REG_PIKE_SP, SPARC_REG_G0, 0);
+ SPARC_ADD(SPARC_REG_O3, SPARC_REG_PIKE_SP, sparc_pike_sp_bias, 1);
SPARC_JMPL(SPARC_REG_O7, SPARC_REG_O7,
((ptrdiff_t)sparc_debug_check_registers) & 0xfff, 1);
SPARC_OR(SPARC_REG_O4, SPARC_REG_PIKE_MARK_SP, SPARC_REG_G0, 0);
637: Inside #if defined(PIKE_DEBUG)
SPARC_BE(6*4, 0);
SPARC_OR(SPARC_REG_O1, SPARC_REG_PIKE_IP, SPARC_REG_G0, 0);
SPARC_OR(SPARC_REG_O2, SPARC_REG_PIKE_FP, SPARC_REG_G0, 0);
- SPARC_OR(SPARC_REG_O3, SPARC_REG_PIKE_SP, SPARC_REG_G0, 0);
+ SPARC_ADD(SPARC_REG_O3, SPARC_REG_PIKE_SP, sparc_pike_sp_bias, 1);
SPARC_OR(SPARC_REG_O4, SPARC_REG_PIKE_MARK_SP, SPARC_REG_G0, 0);
ADD_CALL(sparc_debug_check_registers, 1);
#endif /* PIKE_BYTECODE_SPARC64 */
791:
sparc_push_int(b, 0);
return;
case F_NEG_NUMBER:
- sparc_push_int(-b, 0);
+ sparc_push_int(-(ptrdiff_t)b, 0);
return;
case F_LFUN:
sparc_push_lfun(b);
return;
case F_MARK_X:
- sparc_mark(-b);
+ sparc_mark(-(ptrdiff_t)b);
return;
case F_LOCAL_LVALUE:
sparc_local_lvalue(b);
844:
#endif /* PIKE_DEBUG */
/* Relocate to being relative to NULL */
opcode = 0x40000000 |
- ((p->program[off] + (((INT32)(p->program)>>2))) & 0x3fffffff);
+ ((p->program[off] + (((INT32)(ptrdiff_t)(p->program)>>2))) & 0x3fffffff);
adddata2(&opcode, 1);
prev = off+1;
}
855:
{
/* Relocate the program... */
PIKE_OPCODE_T *prog = p->program;
- INT32 delta = ((INT32)p->program)>>2;
+ INT32 delta = ((INT32)(ptrdiff_t)p->program)>>2;
size_t rel = p->num_relocations;
while (rel--) {
#ifdef PIKE_DEBUG