From fc3100f7293cd9629739f34e0b6b612fc71b9c8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Grubbstr=C3=B6m=20=28Grubba=29?= <grubba@grubba.org> Date: Tue, 24 Jul 2001 14:19:31 +0200 Subject: [PATCH] Some improved code-generation ported from IA32. Rev: src/code/sparc.c:1.7 --- src/code/sparc.c | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/src/code/sparc.c b/src/code/sparc.c index 7ac8f2d095..8195108272 100644 --- a/src/code/sparc.c +++ b/src/code/sparc.c @@ -1,11 +1,13 @@ /* - * $Id: sparc.c,v 1.6 2001/07/21 16:30:50 grubba Exp $ + * $Id: sparc.c,v 1.7 2001/07/24 12:19:31 grubba Exp $ * * Machine code generator for sparc. * * Henrik Grubbstr�m 20010720 */ +#include "operators.h" + #define ADD_CALL(X, DELAY_OK) do { \ INT32 delta_; \ struct program *p_ = Pike_compiler->new_program; \ @@ -28,6 +30,8 @@ static void low_ins_f_byte(unsigned int b, int delay_ok) { + void *addr = instrs[b].address; + #ifdef PIKE_DEBUG if(store_linenumbers && b<F_MAX_OPCODE) ADD_COMPILED(b); @@ -51,6 +55,41 @@ static void low_ins_f_byte(unsigned int b, int delay_ok) delay_ok = 1; } } + +#ifndef PIKE_DEBUG + /* This is not very pretty */ + switch(b) + { + case F_MAKE_ITERATOR - F_OFFSET: + { + extern void f_Iterator(INT32); + SET_REG(SPARC_REG_O0, 1); + delay_ok = 1; + addr = (void *)f_Iterator; + } + break; + case F_COMPL - F_OFFSET: addr=(void *)o_compl; break; + case F_LSH - F_OFFSET: addr=(void *)o_lsh; break; + case F_RSH - F_OFFSET: addr=(void *)o_rsh; break; + case F_ADD - F_OFFSET: + SET_REG(SPARC_REG_O0, 2); + delay_ok = 1; + addr = (void *)f_add; + break; + case F_SUBTRACT - F_OFFSET: addr = (void *)o_subtract; break; + case F_AND - F_OFFSET: addr=(void *)o_and; break; + case F_OR - F_OFFSET: addr=(void *)o_or; break; + case F_XOR - F_OFFSET: addr=(void *)o_xor; break; + case F_MULTIPLY - F_OFFSET: addr=(void *)o_multiply; break; + case F_DIVIDE - F_OFFSET: addr=(void *)o_divide; break; + case F_MOD - F_OFFSET: addr=(void *)o_mod; break; + case F_CAST - F_OFFSET: addr = (void *)f_cast; break; + case F_CAST_TO_INT - F_OFFSET: addr = (void *)o_cast_to_int; break; + case F_CAST_TO_STRING - F_OFFSET: addr = (void *)o_cast_to_string; break; + case F_RANGE - F_OFFSET: addr = (void *)o_range; break; + case F_SSCANF - F_OFFSET: addr=(void *)o_sscanf; break; + } +#endif ADD_CALL(instrs[b].address, delay_ok); } -- GitLab