From 2b0629f87f0cb590aaf9e4e78d3bf73bd0d511f0 Mon Sep 17 00:00:00 2001 From: David Given Date: Wed, 6 Feb 2019 16:06:07 +0100 Subject: [PATCH] Common out boilerplate function prologue code; shrinks Star Trek from 44256 to 43892 bytes. --- mach/i80/libem/pro.s | 58 ++++++++++++++++++++++++++++++++++++++++++++ mach/i80/ncg/mach.c | 26 +++++++++----------- 2 files changed, 69 insertions(+), 15 deletions(-) create mode 100644 mach/i80/libem/pro.s diff --git a/mach/i80/libem/pro.s b/mach/i80/libem/pro.s new file mode 100644 index 000000000..05976358e --- /dev/null +++ b/mach/i80/libem/pro.s @@ -0,0 +1,58 @@ +.sect .text +.sect .rom +.sect .data +.sect .bss +.sect .text + +.define .proword, .probyte +.define .pro0, .pro2, .pro4 + +! BC is used as the frame pointer, but HL and DE can be corrupted. + +.proword: + pop h + push b + mov e, m + inx h + mov d, m + inx h + jmp .pron + +.probyte: + pop h + push b + mvi e, 0xff + mov d, m + inx h + jmp .pron + +.pro4: + pop h + push b + lxi d, -4 + jmp .pron + +.pro2: + pop h + push b + lxi d, -2 + jmp .pron + +.pro0: + pop h + push b + lxi d, 0 + ! fall through +.pron: + shld .retadr + ! Copy the current stack pointer to BC. + lxi h, 0 + dad sp + mov b, h + mov c, l + ! Calculate the new stack pointer. + dad d + sphl + lhld .retadr + pchl + diff --git a/mach/i80/ncg/mach.c b/mach/i80/ncg/mach.c index 6bae01350..a01c11eec 100644 --- a/mach/i80/ncg/mach.c +++ b/mach/i80/ncg/mach.c @@ -52,22 +52,18 @@ void con_mult(sz) word sz; #define FL_MSB_AT_LOW_ADDRESS 0 #include -void prolog(nlocals) full nlocals; +void prolog(full nlocals) { - - fprintf(codefile, "\tpush\tb\n\tlxi\th,0\n\tdad\tsp\n\tmov\tb,h\n\tmov\tc,l\n"); - switch (nlocals) - { - case 4: - fprintf(codefile, "\tpush\th\n"); - case 2: - fprintf(codefile, "\tpush\th\n"); - case 0: - break; - default: - fprintf(codefile, "\tlxi\th,%d\n\tdad\tsp\n\tsphl\n", -nlocals); - break; - } + if (nlocals == 0) + fprintf(codefile, "\tcall .pro0\n"); + else if (nlocals == 2) + fprintf(codefile, "\tcall .pro2\n"); + else if (nlocals == 4) + fprintf(codefile, "\tcall .pro4\n"); + else if (nlocals < 0x100) + fprintf(codefile, "\tcall .probyte\n\t.data1 %d\n", -nlocals); + else + fprintf(codefile, "\tcall .proword\n\t.data2 %d\n", -nlocals); } void mes(type) word type;