From f1d1ebe80fad6189211557c01da52853df6abfb4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Henrik=20Grubbstr=C3=B6m=20=28Grubba=29?=
 <grubba@grubba.org>
Date: Fri, 20 Jul 2001 21:44:59 +0200
Subject: [PATCH] Improved code-generator and a bugfix.

Rev: src/code/sparc.c:1.4
---
 src/code/sparc.c | 37 ++++++++++++++++++++++++-------------
 1 file changed, 24 insertions(+), 13 deletions(-)

diff --git a/src/code/sparc.c b/src/code/sparc.c
index c368cb321f..c2a0b73e08 100644
--- a/src/code/sparc.c
+++ b/src/code/sparc.c
@@ -1,25 +1,32 @@
 /*
- * $Id: sparc.c,v 1.3 2001/07/20 16:21:32 grubba Exp $
+ * $Id: sparc.c,v 1.4 2001/07/20 19:44:59 grubba Exp $
  *
  * Machine code generator for sparc.
  *
  * Henrik Grubbstr�m 20010720
  */
 
-#define CALL_ABSOLUTE(X) do {						\
+#define ADD_CALL(X, DELAY_OK) do {					\
     INT32 delta_;							\
     struct program *p_ = Pike_compiler->new_program;			\
     INT32 off_ = p_->num_program;					\
+    /* noop		*/						\
+    INT32 delay_ = 0x01000000;						\
+									\
+    if (DELAY_OK) {							\
+      /* Move the previous opcode to the delay-slot. */			\
+      delay_ = p_->program[--off_];					\
+    } else {								\
+      add_to_program(0); /* Placeholder... */				\
+    }									\
     /* call X	*/							\
-    add_to_program(0); /* Placeholder... */				\
     delta_ = ((PIKE_OPCODE_T *)(X)) - (p_->program + off_);		\
     p_->program[off_] = 0x40000000 | (delta_ & 0x3fffffff);		\
     add_to_relocations(off_);						\
-    /* noop		*/						\
-    add_to_program(0x01000000);						\
+    add_to_program(delay_);						\
   } while(0)
 
-void ins_f_byte(unsigned int b)
+static void low_ins_f_byte(unsigned int b, int delay_ok)
 {
 #ifdef PIKE_DEBUG
   if(store_linenumbers && b<F_MAX_OPCODE)
@@ -32,7 +39,7 @@ void ins_f_byte(unsigned int b)
     Pike_error("Instruction too big %d\n",b);
 #endif
     
-  do{
+  {
     static int last_prog_id=-1;
     static int last_num_linenumbers=-1;
     if(last_prog_id != Pike_compiler->new_program->id ||
@@ -41,17 +48,22 @@ void ins_f_byte(unsigned int b)
       last_prog_id=Pike_compiler->new_program->id;
       last_num_linenumbers = Pike_compiler->new_program->num_linenumbers;
       UPDATE_PC();
+      delay_ok = 1;
     }
-  }while(0);
+  }
   
-  CALL_ABSOLUTE(instrs[b].address);
-  return;
+  ADD_CALL(instrs[b].address, delay_ok);
+}
+
+void ins_f_byte(unsigned int opcode)
+{
+  low_ins_f_byte(opcode, 0);
 }
 
 void ins_f_byte_with_arg(unsigned int a,unsigned INT32 b)
 {
   SET_REG(REG_O0, b);
-  ins_f_byte(a);
+  low_ins_f_byte(a, 1);
   return;
 }
 
@@ -61,7 +73,7 @@ void ins_f_byte_with_2_args(unsigned int a,
 {
   SET_REG(REG_O0, c);
   SET_REG(REG_O1, b);
-  ins_f_byte(a);
+  low_ins_f_byte(a, 1);
   return;
 }
 
@@ -114,5 +126,4 @@ void sparc_decode_program(struct program *p)
       (((prog[p->relocations[rel]] & 0x3fffffff) - delta) &
        0x3fffffff);
   }
-#endif /* sparc */
 }
-- 
GitLab