From 1030b193dc13261991d5ec29167a79e9d5b4e997 Mon Sep 17 00:00:00 2001 From: Chris Hanson Date: Sun, 10 Dec 1989 00:50:36 +0000 Subject: [PATCH] In the 680x0 compiled-code interface, added entry points for many 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 | 85 +++++++++++++++++++++++++++++- v7/src/microcode/cmpintmd/mc68k.h | 80 ++++++++++++++++------------ v7/src/microcode/version.h | 4 +- v8/src/microcode/version.h | 4 +- 4 files changed, 135 insertions(+), 38 deletions(-) diff --git a/v7/src/microcode/cmpauxmd/mc68k.m4 b/v7/src/microcode/cmpauxmd/mc68k.m4 index b8a4816a5..4326f1f40 100644 --- a/v7/src/microcode/cmpauxmd/mc68k.m4 +++ b/v7/src/microcode/cmpauxmd/mc68k.m4 @@ -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) + 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) diff --git a/v7/src/microcode/cmpintmd/mc68k.h b/v7/src/microcode/cmpintmd/mc68k.h index e25ea3699..5a5101c0a 100644 --- a/v7/src/microcode/cmpintmd/mc68k.h +++ b/v7/src/microcode/cmpintmd/mc68k.h @@ -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 + } 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 */ + + #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 diff --git a/v7/src/microcode/version.h b/v7/src/microcode/version.h index e7655eb76..4be557aa8 100644 --- a/v7/src/microcode/version.h +++ b/v7/src/microcode/version.h @@ -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 diff --git a/v8/src/microcode/version.h b/v8/src/microcode/version.h index eac45dee1..de90dd5a0 100644 --- a/v8/src/microcode/version.h +++ b/v8/src/microcode/version.h @@ -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 -- 2.25.1