From 6a050123e5d33d43e0bbae07c747a7d787903d1a Mon Sep 17 00:00:00 2001 From: Ben Elliston Date: Mon, 2 Apr 2001 21:18:27 +0000 Subject: [PATCH] 2001-04-02 Ben Elliston * sid-cpu.scm (-last-insn): New function. (-gen-sem-switch-engine): Loop through idesc while less than or equal to the last instruction enum, not less than the MAX enum. (-gen-sfrag-engine-fn): Clean up frag_label_table initialisation. * sid-decode.scm (-gen-decode-insn-globals): Define the idesc table's size to be the last instruction enum plus one, not @PREFIX@_INSN_MAX. * sid.scm (gen-cpu-insn-enum-decl): Do not append a dummy `max' instruction onto the instruction list. --- ChangeLog | 12 ++++++++++++ sid-cpu.scm | 25 +++++++++++-------------- sid-decode.scm | 6 ++++-- sid.scm | 3 +-- 4 files changed, 28 insertions(+), 18 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1534069..b1a3a94 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2001-04-02 Ben Elliston + + * sid-cpu.scm (-last-insn): New function. + (-gen-sem-switch-engine): Loop through idesc while less than or + equal to the last instruction enum, not less than the MAX enum. + (-gen-sfrag-engine-fn): Clean up frag_label_table initialisation. + * sid-decode.scm (-gen-decode-insn-globals): Define the idesc + table's size to be the last instruction enum plus one, not + @PREFIX@_INSN_MAX. + * sid.scm (gen-cpu-insn-enum-decl): Do not append a dummy `max' + instruction onto the instruction list. + 2001-03-28 Ben Elliston * doc/version.texi (UPDATED, EDITION): Update. diff --git a/sid-cpu.scm b/sid-cpu.scm index 613b721..98434b4 100644 --- a/sid-cpu.scm +++ b/sid-cpu.scm @@ -5,6 +5,10 @@ ; *********** ; cgen-desc.h +(define (-last-insn) + (string-upcase (gen-c-symbol (caar (list-take -1 + (gen-obj-list-enums (non-multi-insns (current-insn-list)))))))) + ; Declare the attributes. (define (-gen-attr-decls) @@ -807,7 +811,7 @@ void @prefix@_idesc::idesc_table[labels[i].insn].cgoto.label = labels[i].label; // confirm that table is all filled up - for (int i=0; i<@PREFIX@_INSN_MAX; i++) + for (int i = 0; i <= @PREFIX@_INSN_" (-last-insn) "; i++) assert (@prefix@_idesc::idesc_table[i].cgoto.label != 0); // Initialize the compiler virtual insn. @@ -1049,12 +1053,7 @@ const @prefix@_insn_frag @prefix@_frag_usage[] = {\n" ", @PREFIX@_FRAG_LIST_END },\n")) insn-list frag-usage) "") - - "\ - { @PREFIX@_INSN_MAX } -}; -\n" - ) + "};\n\n") ) ; Return sfrag computed-goto engine. @@ -1112,21 +1111,19 @@ void // Allocate frag label table and point idesc table entries at it. // FIXME: Temporary hack, to be redone. static void** frag_label_table; - frag_label_table = new (void*) [@PREFIX@_INSN_MAX * 4]; - memset (frag_label_table, 0, sizeof (void*) * @PREFIX@_INSN_MAX * 4); + int max_insns = @PREFIX@_INSN_" (-last-insn) " + 1; + int tabsize = max_insns * 4; + frag_label_table = new (void*) [tabsize]; + memset (frag_label_table, 0, sizeof (void*) * tabsize); int i; void** v; - for (i = 0, v = frag_label_table; i < @PREFIX@_INSN_MAX; ++i) + for (i = 0, v = frag_label_table; i < max_insns; ++i) { @prefix@_idesc::idesc_table[@prefix@_frag_usage[i].itype].cgoto.frags = v; for (int j = 0; @prefix@_frag_usage[i].ftype[j] != @PREFIX@_FRAG_LIST_END; ++j) *v++ = labels[@prefix@_frag_usage[i].ftype[j]].label; } - // Record frags used by each insn. - //for (int i = 0; @prefix@_frag_usage[i].itype != @PREFIX@_INSN_MAX; ++i) - // @prefix@_idesc::idesc_table[@prefix@_frag_usage[i].itype].frags = & @prefix@_frag_usage[i]; - // Initialize the compiler virtual insn. // FIXME: Also needed if !gnuc. current_cpu->@prefix@_engine.compile_begin_insn (current_cpu); diff --git a/sid-decode.scm b/sid-decode.scm index eaf5d79..adb3157 100644 --- a/sid-decode.scm +++ b/sid-decode.scm @@ -11,7 +11,9 @@ ; Print the higher detailed stuff at higher verbosity. (logit 2 "Processing decode insn globals ...\n") - (let* ((all-attrs (current-insn-attr-list))) + (let* ((all-attrs (current-insn-attr-list)) + (last-insn (string-upcase (gen-c-symbol (caar (list-take -1 + (gen-obj-list-enums (non-multi-insns (current-insn-list))))))))) (string-write " @@ -27,7 +29,7 @@ bool @prefix@_idesc::idesc_table_initialized_p = false;\n\n" "") "\ -@prefix@_idesc @prefix@_idesc::idesc_table[@PREFIX@_INSN_MAX] = +@prefix@_idesc @prefix@_idesc::idesc_table[@PREFIX@_INSN_" last-insn " + 1] = {\n" (string-map diff --git a/sid.scm b/sid.scm index 2de060c..867c12d 100644 --- a/sid.scm +++ b/sid.scm @@ -1320,8 +1320,7 @@ (cons '- (atlist-attrs (obj-atlist i)))))) (parallel-insns insn-list))) - nil) - '((max)))) + nil))) ) ; Return the enum of INSN in cpu family CPU. -- 2.43.5