In the 680x0 compiled-code interface, added entry points for many
authorChris Hanson <org/chris-hanson/cph>
Sun, 10 Dec 1989 00:50:36 +0000 (00:50 +0000)
committerChris Hanson <org/chris-hanson/cph>
Sun, 10 Dec 1989 00:50:36 +0000 (00:50 +0000)
common entries; also added special entries for `apply' of small frame
sizes.  These entry points save space in the compiled code,
eliminating the code expansion caused by the recent upgrade of the
compiled-code interface.

v7/src/microcode/cmpauxmd/mc68k.m4
v7/src/microcode/cmpintmd/mc68k.h
v7/src/microcode/version.h
v8/src/microcode/version.h

index b8a4816a56c2cf9cc5c8429c1c50a658516f52bb..4326f1f40f6e87810eed1cc6987fdae6490b81fb 100644 (file)
@@ -1,6 +1,6 @@
 ### -*-Midas-*-
 ###
-###    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/cmpauxmd/mc68k.m4,v 1.7 1989/11/30 05:44:04 jinx Exp $
+###    $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/cmpauxmd/mc68k.m4,v 1.8 1989/12/10 00:49:54 cph Exp $
 ###
 ###    Copyright (c) 1989 Massachusetts Institute of Technology
 ###
@@ -303,6 +303,58 @@ define_debugging_label(scheme_to_interface_jsr)
        addq.l  &4,%d1                  # Skip format info.
        bra     scheme_to_interface
 
+define(define_interface_indirection,
+`define_c_label(asm_$1)
+       movq    &HEX($2),%d0
+       bra     scheme_to_interface')
+
+define(define_interface_jsr_indirection,
+`define_c_label(asm_$1)
+       movq    &HEX($2),%d0
+       bra     scheme_to_interface_jsr')
+
+define_interface_indirection(primitive_lexpr_apply,13)
+define_interface_indirection(error,15)
+define_interface_jsr_indirection(link,17)
+define_interface_indirection(interrupt_closure,18)
+define_interface_jsr_indirection(interrupt_procedure,1a)
+define_interface_jsr_indirection(interrupt_continuation,1b)
+define_interface_jsr_indirection(assignment_trap,1d)
+define_interface_jsr_indirection(reference_trap,1f)
+define_interface_jsr_indirection(safe_reference_trap,20)
+define_interface_indirection(generic_decrement,22)
+define_interface_indirection(generic_divide,23)
+define_interface_indirection(generic_equal,24)
+define_interface_indirection(generic_greater,25)
+define_interface_indirection(generic_increment,26)
+define_interface_indirection(generic_less,27)
+define_interface_indirection(generic_subtract,28)
+define_interface_indirection(generic_multiply,29)
+define_interface_indirection(generic_negative,2a)
+define_interface_indirection(generic_add,2b)
+define_interface_indirection(generic_positive,2c)
+define_interface_indirection(generic_zero,2d)
+
+# Save an additional instruction here to load the dynamic link.
+define_c_label(asm_interrupt_dlink)
+       mov.l   %a4,%d2                 # Dynamic link -> d2
+       movq    &HEX(19),%d0
+       bra     scheme_to_interface_jsr
+
+# Bum this one for speed.
+define_c_label(asm_primitive_apply)
+       switch_to_C_registers()
+       mov.l   %d1,-(%sp)              # only one argument
+       mov.l   extern_c_label(utility_table)+HEX(12)*4,%a0
+       jsr     (%a0)
+       addq.l  &4,%sp                  # pop the argument
+
+### On return, %d0 contains the address of interface_to_scheme or
+### interface_to_C.  %d1 contains the appropriate data for them.
+
+       mov.l   %d0,%a0
+       jmp     (%a0)
+\f
        set     tc_compiled_entry,HEX(28)
        set     offset_apply,HEX(14)
 
@@ -336,3 +388,34 @@ define_debugging_label(shortcircuit_apply_1)
                                        # Fall through
 define_debugging_label(shortcircuit_apply_2)
        call_utility(apply)
+
+### Optimized versions of shortcircuit_apply for 0-7 arguments.
+
+define(define_apply_size_n,
+`define_c_label(asm_shortcircuit_apply_size_$1)
+define_debugging_label(shortcircuit_apply_size_$1)
+       EXTRACT_TYPE_CODE((%sp),%d0)    # Get procedure type
+       mov.l   (%sp)+,%d1              # Get procedure
+       COMPARE_TYPE_CODE(%d0,tc_compiled_entry)
+       bne.b   shortcircuit_apply_size_$1_2
+       and.l   rmask,%d1               # Extract entry point
+       mov.l   %d1,%a0
+       cmp.b   -3(%a0),&$1             # Is the frame size right?
+       bne.b   shortcircuit_apply_size_$1_1
+       jmp     (%a0)                   # Invoke
+
+define_debugging_label(shortcircuit_apply_size_$1_1)
+       mov.l   -4(%sp),%d1             # Recover the type code
+                                       # Fall through
+define_debugging_label(shortcircuit_apply_size_$1_2)
+       movq    &$1,%d2                 # initialize frame size
+       call_utility(apply)')
+
+define_apply_size_n(1)
+define_apply_size_n(2)
+define_apply_size_n(3)
+define_apply_size_n(4)
+define_apply_size_n(5)
+define_apply_size_n(6)
+define_apply_size_n(7)
+define_apply_size_n(8)
index e25ea36993b24c1cd82ee6757201750dabe1d1f5..5a5101c0a13c15d7ffe9241aebae4a94032cf512 100644 (file)
@@ -30,7 +30,7 @@ Technology nor of any adaptation thereof in any advertising,
 promotional, or sales literature without prior written consent from
 MIT in each case. */
 
-/* $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/cmpintmd/mc68k.h,v 1.10 1989/11/30 05:45:25 jinx Exp $
+/* $Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/cmpintmd/mc68k.h,v 1.11 1989/12/10 00:49:58 cph Exp $
  *
  * Compiled code interface macros.
  *
@@ -195,30 +195,17 @@ procedures and continuations differ from closures) */
 
 #define A6_TRAMPOLINE_TO_INTERFACE_OFFSET                              \
   ((COMPILER_REGBLOCK_N_FIXED + (2 * COMPILER_HOOK_SIZE)) *            \
-((COMPILER_REGBLOCK_N_HOOKS * COMPILER_HOOK_SIZE))
-
-/* These must match machines/bobcat/lapgen.scm */
-
-#define A6_SCHEME_TO_INTERFACE_OFFSET                                  \
-(COMPILER_REGBLOCK_N_FIXED * (sizeof (SCHEME_OBJECT)))
-
-#define A6_SCHEME_TO_INTERFACE_JSR_OFFSET                              \
-(A6_SCHEME_TO_INTERFACE_OFFSET +                                       \
- (COMPILER_HOOK_SIZE * (sizeof (SCHEME_OBJECT))))
+(COMPILER_REGBLOCK_N_HOOKS * COMPILER_HOOK_SIZE)
 
 #define A6_CLOSURE_HOOK_OFFSET                                         \
-(A6_SCHEME_TO_INTERFACE_JSR_OFFSET +                                   \
- (COMPILER_HOOK_SIZE * (sizeof (SCHEME_OBJECT))))
-
-#define A6_SHORTCIRCUIT_APPLY_OFFSET                                   \
-(A6_TRAMPOLINE_TO_INTERFACE_OFFSET +                                   \
- (COMPILER_HOOK_SIZE * (sizeof (SCHEME_OBJECT))))
+((COMPILER_REGBLOCK_N_FIXED + (2 * COMPILER_HOOK_SIZE)) *              \
+ (sizeof (SCHEME_OBJECT)))
 
 #ifdef CAST_FUNCTION_TO_INT_BUG
 
-#define ASM_RESET_HOOK mc68k_reset_hook
+#define SETUP_REGISTER(hook) do                                                \
 {                                                                      \
-#define SETUP_REGISTER(hook, offset)                                   \
+#define SETUP_REGISTER(hook)                                           \
       (((unsigned short *) (a6_value + offset)) + 1))) =               \
   extern void hook();                                                  \
                                                                        \
@@ -226,25 +213,52 @@ procedures and continuations differ from closures) */
 } while (0)
 
 #endif
+\f
 }
 DEFUN_VOID (mc68k_reset_hook)
 
 mc68k_reset_hook ()
   int offset = (COMPILER_REGBLOCK_N_FIXED * (sizeof (SCHEME_OBJECT)));
-  unsigned char *a6_value;
-  extern void interface_initialize();
-
-  a6_value = ((unsigned char *) (&Registers[0]));
-
-  SETUP_REGISTER(asm_scheme_to_interface,
-                A6_SCHEME_TO_INTERFACE_OFFSET);
-  SETUP_REGISTER(asm_scheme_to_interface_jsr,
-                A6_SCHEME_TO_INTERFACE_JSR_OFFSET);
-  SETUP_REGISTER(asm_trampoline_to_interface,
-                A6_TRAMPOLINE_TO_INTERFACE_OFFSET);
-  SETUP_REGISTER(asm_shortcircuit_apply,
-                A6_SHORTCIRCUIT_APPLY_OFFSET);
-  interface_initialize();
+  /* These must match machines/bobcat/lapgen.scm */
+
+  extern void interface_initialize ();
+  SETUP_REGISTER (asm_scheme_to_interface_jsr);                /* 1 */
+  if (offset != A6_TRAMPOLINE_TO_INTERFACE_OFFSET)
+  {
+  SETUP_REGISTER (asm_shortcircuit_apply_size_2);      /* 5 */
+  SETUP_REGISTER (asm_shortcircuit_apply_size_3);      /* 6 */
+  SETUP_REGISTER (asm_shortcircuit_apply_size_4);      /* 7 */
+  SETUP_REGISTER (asm_shortcircuit_apply_size_5);      /* 8 */
+  SETUP_REGISTER (asm_shortcircuit_apply_size_6);      /* 9 */
+  SETUP_REGISTER (asm_shortcircuit_apply_size_7);      /* 10 */
+  SETUP_REGISTER (asm_shortcircuit_apply_size_8);      /* 11 */
+  SETUP_REGISTER (asm_primitive_apply);                        /* 12 */
+  SETUP_REGISTER (asm_primitive_lexpr_apply);          /* 13 */
+  SETUP_REGISTER (asm_error);                          /* 14 */
+  SETUP_REGISTER (asm_link);                           /* 15 */
+  SETUP_REGISTER (asm_interrupt_closure);              /* 16 */
+  SETUP_REGISTER (asm_interrupt_dlink);                        /* 17 */
+  SETUP_REGISTER (asm_interrupt_procedure);            /* 18 */
+  SETUP_REGISTER (asm_interrupt_continuation);         /* 19 */
+  SETUP_REGISTER (asm_assignment_trap);                        /* 20 */
+  SETUP_REGISTER (asm_reference_trap);                 /* 21 */
+  SETUP_REGISTER (asm_safe_reference_trap);            /* 22 */
+  SETUP_REGISTER (asm_generic_add);                    /* 23 */
+  SETUP_REGISTER (asm_generic_subtract);               /* 24 */
+  SETUP_REGISTER (asm_generic_multiply);               /* 25 */
+  SETUP_REGISTER (asm_generic_divide);                 /* 26 */
+  SETUP_REGISTER (asm_generic_equal);                  /* 27 */
+  SETUP_REGISTER (asm_generic_less);                   /* 28 */
+  SETUP_REGISTER (asm_generic_greater);                        /* 29 */
+  SETUP_REGISTER (asm_generic_increment);              /* 30 */
+  SETUP_REGISTER (asm_generic_decrement);              /* 31 */
+  SETUP_REGISTER (asm_generic_zero);                   /* 32 */
+  SETUP_REGISTER (asm_generic_positive);               /* 33 */
+  SETUP_REGISTER (asm_generic_negative);               /* 34 */
+  SETUP_REGISTER (asm_primitive_error);                        /* 35 */
+  SETUP_REGISTER (asm_allocate_closure);               /* 36 */
+
+\f
 #define CLOSURE_ENTRY_WORDS                                            \
   (COMPILED_CLOSURE_ENTRY_SIZE / (sizeof (SCHEME_OBJECT)))
 /* On the 68K, here's a  picture of a trampoline (offset in bytes from
index e7655eb76b0507fd9ef712261724de69f4678761..4be557aa82f4cbaa943363b6c0f648932dbc1226 100644 (file)
@@ -1,6 +1,6 @@
 /* -*-C-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/Attic/version.h,v 11.15 1989/12/08 01:50:01 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/Attic/version.h,v 11.16 1989/12/10 00:50:36 cph Exp $
 
 Copyright (c) 1988, 1989 Massachusetts Institute of Technology
 
@@ -46,7 +46,7 @@ MIT in each case. */
 #define VERSION                11
 #endif
 #ifndef SUBVERSION
-#define SUBVERSION     15
+#define SUBVERSION     16
 #endif
 
 #ifndef UCODE_TABLES_FILENAME
index eac45dee11621b24b78546019191d7c53ac31ed9..de90dd5a0519f077da8355064e62f5b2651c791a 100644 (file)
@@ -1,6 +1,6 @@
 /* -*-C-*-
 
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v8/src/microcode/version.h,v 11.15 1989/12/08 01:50:01 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v8/src/microcode/version.h,v 11.16 1989/12/10 00:50:36 cph Exp $
 
 Copyright (c) 1988, 1989 Massachusetts Institute of Technology
 
@@ -46,7 +46,7 @@ MIT in each case. */
 #define VERSION                11
 #endif
 #ifndef SUBVERSION
-#define SUBVERSION     15
+#define SUBVERSION     16
 #endif
 
 #ifndef UCODE_TABLES_FILENAME