pike.git
/
src
/
code
/
sparc.c
version
»
Context lines:
10
20
40
80
file
none
3
pike.git/src/code/sparc.c:1:
/* || 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.
27
2002/11/
08
17
:
37
:
00
grubba Exp $
+
|| $Id: sparc.c,v 1.
28
2002/11/
09
13
:
41
:
14
grubba Exp $
*/ /* * Machine code generator for sparc. * * Henrik Grubbström 20010720 */ #include "global.h" #include "svalue.h"
pike.git/src/code/sparc.c:74:
#define SPARC_OP3_ADDC 0x08 #define SPARC_OP3_ADDCcc 0x18 #define SPARC_OP3_SUB 0x04 #define SPARC_OP3_SUBcc 0x14 #define SPARC_OP3_SUBC 0x0c #define SPARC_OP3_SUBCcc 0x1c #define SPARC_OP3_SLL 0x25 #define SPARC_OP3_SRL 0x26 #define SPARC_OP3_SRA 0x27 #define SPARC_OP3_RD 0x28
+
#define SPARC_OP3_RETURN 0x39
#define SPARC_OP3_SAVE 0x3c #define SPARC_RD_REG_CCR 0x02 #define SPARC_RD_REG_PC 0x05 #define SPARC_ALU_OP(OP3, D, S1, S2, I) \ add_to_program(0x80000000|((D)<<25)|((OP3)<<19)|((S1)<<14)|((I)<<13)| \ ((S2)&0x1fff)) #define SPARC_OP3_LDUW 0x00
pike.git/src/code/sparc.c:103:
#define SPARC_OR(D,S1,S2,I) SPARC_ALU_OP(SPARC_OP3_OR, D, S1, S2, I) #define SPARC_SRA(D,S1,S2,I) SPARC_ALU_OP(SPARC_OP3_SRA, D, S1, S2, I) #define SPARC_ADD(D,S1,S2,I) SPARC_ALU_OP(SPARC_OP3_ADD, D, S1, S2, I) #define SPARC_SUBcc(D,S1,S2,I) SPARC_ALU_OP(SPARC_OP3_SUBcc, D, S1, S2, I) #define SPARC_RD(D, RDREG) SPARC_ALU_OP(SPARC_OP3_RD, D, RDREG, 0, 0)
+
#define SPARC_RETURN(S1, S2, I) SPARC_ALU_OP(SPARC_OP3_RETURN, 0, S1, S2, I)
+
#define SPARC_LDUW(D,S1,S2,I) SPARC_MEM_OP(SPARC_OP3_LDUW, D, S1, S2, I) #define SPARC_LDUH(D,S1,S2,I) SPARC_MEM_OP(SPARC_OP3_LDUH, D, S1, S2, I) #define SPARC_STW(D,S1,S2,I) SPARC_MEM_OP(SPARC_OP3_STW, D, S1, S2, I) #define SPARC_STH(D,S1,S2,I) SPARC_MEM_OP(SPARC_OP3_STH, D, S1, S2, I) #define SPARC_SETHI(D, VAL) \ add_to_program(0x01000000|((D)<<25)|(((VAL)>>10)&0x3fffff)) #define SPARC_BE(DISP22, A) \
pike.git/src/code/sparc.c:276:
{ /* save %sp, -112, %sp */ add_to_program(0x81e02000|(SPARC_REG_SP<<25)| (SPARC_REG_SP<<14)|((-112)&0x1fff)); FLUSH_CODE_GENERATOR_STATE(); } /* Update Pike_fp->pc */ void sparc_update_pc(void) {
+
LOAD_PIKE_FP();
/* rd %pc, %i0 */ SPARC_RD(SPARC_REG_I0, SPARC_RD_REG_PC);
-
LOAD_PIKE_FP();
+
/* stw %pc, [ %pike_fp + pc ] */ SPARC_STW(SPARC_REG_I0, SPARC_REG_PIKE_FP, OFFSETOF(pike_frame, pc), 1); } /* * Opcode implementations. */ #define MAKE_TYPE_WORD(TYPE, SUB_TYPE) (((TYPE) << 16)|(SUB_TYPE))
pike.git/src/code/sparc.c:402:
sparc_codegen_state |= SPARC_CODEGEN_SP_NEEDS_STORE; } void sparc_local_lvalue(unsigned int no) { LOAD_PIKE_SP(); LOAD_PIKE_FP(); SET_REG(SPARC_REG_I0, T_LVALUE); /* sth %i0, [ %pike_sp, %g0 ] */ SPARC_STH(SPARC_REG_I0, SPARC_REG_PIKE_SP, SPARC_REG_G0, 0);
-
SET_REG(SPARC_REG_
I1
, no * sizeof(struct svalue)
)
;
+
SET_REG(SPARC_REG_
I0
,
T_VOID);
+
no *
=
sizeof(struct svalue)
;
+
if (no < 4096
)
{
/* lduw [ %pike_fp, %offset(pike_frame, locals) ], %i2 */ SPARC_LDUW(SPARC_REG_I2, SPARC_REG_PIKE_FP, OFFSETOF(pike_frame, locals), 1);
-
SET_REG(SPARC_REG_
I0
,
T
_
VOID
);
+
/* add %i2, no * sizeof(struct svalue), %i2 */
+
SPARC_ADD(SPARC_REG_I2, SPARC_REG_I2, no, 1);
+
} else {
+
SET_REG(SPARC_REG_
I1
,
no);
+
/* lduw [ %pike
_
fp, %offset(pike_frame, locals
)
], %i2 */
+
SPARC_LDUW(SPARC_REG_I2, SPARC_REG_PIKE_FP,
+
OFFSETOF(pike_frame, locals), 1)
;
+
/* add %i2, %i1, %i2 */
+
SPARC_ADD(SPARC_REG_I2, SPARC_REG_I2, SPARC_REG_I1, 0);
+
}
/* stw %i2, [ %pike_sp, %offset(svalue, u.lval) ] */ SPARC_STW(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); /* sth %i0, [ %pike_sp , -sizeof(struct svalue) ] */ SPARC_STH(SPARC_REG_I0, SPARC_REG_PIKE_SP, -sizeof(struct svalue), 1); sparc_codegen_state |= SPARC_CODEGEN_SP_NEEDS_STORE; }
-
+
void sparc_escape_catch(void)
+
{
+
LOAD_PIKE_FP();
+
SPARC_FLUSH_UNSTORED();
+
/* rd %pc, %i0 */
+
SPARC_RD(SPARC_REG_I0, SPARC_RD_REG_PC);
+
/* add %i0, 20, %i0 */
+
SPARC_ADD(SPARC_REG_I0, SPARC_REG_I0, 20, 1);
+
/* stw %i0, [ %pike_fp, %offset(pike_frame, pc) ] */
+
SPARC_STW(SPARC_REG_I0, SPARC_REG_PIKE_FP,
+
OFFSETOF(pike_frame, pc), 1);
+
/* return %i7 + 8 */
+
SPARC_RETURN(SPARC_REG_I7, 8, 1);
+
/* or %g0, -2, %o0 */
+
SPARC_OR(SPARC_REG_O0, SPARC_REG_G0, -2, 1);
+
SPARC_UNLOAD_CACHED();
+
}
+
/* * */ static void low_ins_call(void *addr, int delay_ok) { SPARC_FLUSH_UNSTORED(); { static int last_prog_id=-1;
pike.git/src/code/sparc.c:512:
sparc_mark(0); sparc_push_int(1, 0); return; case F_CONST_1 - F_OFFSET: sparc_push_int(-1, 0); return; case F_BIGNUM - F_OFFSET: sparc_push_int(0x7fffffff, 0); return;
+
case F_EXIT_CATCH - F_OFFSET:
+
sparc_push_int(0, 1);
+
/* FALL_THROUGH */
+
case F_ESCAPE_CATCH - F_OFFSET:
+
sparc_escape_catch();
+
return;
+
#define F_ALIAS(F_FUN, O_FUN) \ case F_FUN - F_OFFSET: \ addr = (void *)O_FUN; \ break case F_MAKE_ITERATOR - F_OFFSET: { extern void f_Iterator(INT32); SET_REG(SPARC_REG_O0, 1); delay_ok = 1;
pike.git/src/code/sparc.c:574:
return; case F_NEG_NUMBER: sparc_push_int(-b, 0); return; case F_LFUN: sparc_push_lfun(b); return; case F_MARK_X: sparc_mark(-b); return;
+
case F_LOCAL_LVALUE:
+
sparc_local_lvalue(b);
+
return;
} SET_REG(SPARC_REG_O0, b); low_ins_f_byte(a, 1); return; } void ins_f_byte_with_2_args(unsigned int a, unsigned INT32 c, unsigned INT32 b) {