From ca2b0a67a63a67a1b8b28caf820287c15e2ee1a7 Mon Sep 17 00:00:00 2001 From: "Michael D. Lowis" Date: Fri, 5 Mar 2021 12:05:16 -0500 Subject: [PATCH] got load and store primitives working for args and locals --- main.s | 106 +++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 77 insertions(+), 29 deletions(-) diff --git a/main.s b/main.s index d6514de..fd1c134 100644 --- a/main.s +++ b/main.s @@ -1,12 +1,56 @@ +//--------------------------------------------------------------------- +// TODO +//--------------------------------------------------------------------- +/* + * Optimize return, load, and store primitives using macros + * Get rid of the negates and addition/subtraction +*/ + //--------------------------------------------------------------------- // Register Usage //--------------------------------------------------------------------- +// x86_64 Parameter Registers: +// rdi, rsi, rdx, rcx, r8, r9 +// +// x86_64 Preserved Registers: +// rbx, rsp, rbp, r12, r13, r14, r15 + .set PC, %rsi .set SP, %rsp .set FP, %rbp .set AC, %rax .set T1, %rbx +// When calling C code PC and AC must be manually preserved! + +//--------------------------------------------------------------------- +// Value Tagging +//--------------------------------------------------------------------- + +.set IMM_BITS_BITMASK, $0x3 +.set IMM_BITS_FIXNUM, $0x1 +.set IMM_BITS_CHARACTER, $0x2 + +.set OBJ_PRIMITIVE, $0x000000000000000 +.set OBJ_BOOLEAN, $0x100000000000000 +.set OBJ_TRUE, $0x100000000000004 +.set OBJ_FALSE, $0x100000000000000 +.set OBJ_NULL, $0x200000000000000 +.set OBJ_PAIR, $0x300000000000000 +.set OBJ_FLONUM, $0x400000000000000 +.set OBJ_SYMBOL, $0x500000000000000 +.set OBJ_STRING, $0x600000000000000 +.set OBJ_VECTOR, $0x700000000000000 +.set OBJ_PORT, $0x800000000000000 +.set OBJ_CLOSURE, $0x900000000000000 +.set OBJ_RESERVED1, $0xA00000000000000 +.set OBJ_RESERVED2, $0xB00000000000000 +.set OBJ_RESERVED3, $0xC00000000000000 +.set OBJ_RESERVED4, $0xD00000000000000 +.set OBJ_RESERVED5, $0xE00000000000000 +.set OBJ_BITMASK, $0xF00000000000003 +.set OBJ_VALUE_MASK, $0x0FFFFFFFFFFFFFC + //--------------------------------------------------------------------- // Main Routine //--------------------------------------------------------------------- @@ -47,9 +91,9 @@ code_\name : .p2align 4, 0x90 EXEC_FUN: pushq PC - pushq %rbp - leaq 8(%rax), %rsi - movq %rsp, %rbp + pushq FP + leaq 8(AC), PC + movq SP, FP NEXT //--------------------------------------------------------------------- @@ -63,68 +107,72 @@ defcode OP_halt // Exit a function, returning to the caller BROKEN!! defcode OP_return - popq %rbx - movq 8(%rbp), %rsi - movq (%rbp), %rbp + popq T1 lodsq - leaq (%rsp, %rax, 8), %rsp - pushq %rbx + addq $2, AC + leaq (FP, AC, 8), SP + movq 8(FP), PC + movq (FP), FP + pushq T1 NEXT // Pushes an immediate value onto the stack defcode OP_imm lodsq - pushq %rax + pushq AC NEXT // Duplicates the top value on the stack defcode OP_dup - movq (%rsp), %rax - pushq %rax + movq (SP), AC + pushq AC NEXT // Drops the top N values from the stack defcode OP_dropn lodsq - leaq (%rsp, %rax, 8), %rsp + leaq (SP, AC, 8), SP NEXT // Allocates space for N locals in the current stack frame defcode OP_localsn lodsq - leaq (%rsp, %rax, 8), %rsp + neg AC + leaq (SP, AC, 8), SP NEXT // Push the Nth argument onto the stack defcode OP_ldargn lodsq - addq $2, %rax - neg %rax - movq (%rbp, %rax, 8), %rax - pushq %rax + addq $2, AC + movq (FP, AC, 8), AC + pushq AC NEXT // Pop top of stack and store to the Nth argument slot defcode OP_stargn - popq %rbx + popq T1 lodsq - addq $2, %rax - neg %rax - movq %rbx, (%rbp, %rax, 8) + addq $2, AC + movq T1, (FP, AC, 8) NEXT // Push the Nth local onto the stack defcode OP_ldlocn lodsq - movq (%rbp, %rax, 8), %rax - pushq %rax + addq $1, AC + neg AC + movq (FP, AC, 8), AC + pushq AC NEXT // Pop top of stack and store to the Nth local slot defcode OP_stlocn - popq %rbx + popq T1 lodsq - movq %rbx, (%rbp, %rax, 8) + addq $1, AC + neg AC + movq T1, (FP, AC, 8) NEXT //--------------------------------------------------------------------- @@ -136,9 +184,9 @@ defcode OP_stlocn .p2align 4, 0x90 _main: main: - pushq %rax - movq %rsp, %rbp - leaq cold_start(%rip), %rsi + pushq AC + movq SP, FP + leaq cold_start(%rip), PC NEXT // First instructions to execute by the interpreter @@ -158,4 +206,4 @@ deffun dummy .quad OP_ldlocn, 0 .quad OP_stargn, 0 .quad OP_ldargn, 0 - .quad OP_return, -2 + .quad OP_return, 2 -- 2.49.0