From 3ad161f74a0e4c0946da4d267d31184123f24eb1 Mon Sep 17 00:00:00 2001 From: "russell@unturf.com" Date: Wed, 15 Apr 2026 20:16:59 -0400 Subject: [PATCH] =?UTF-8?q?asm:=20fix=204=20defects,=20add=20vector=20prin?= =?UTF-8?q?ting,=2033=20new=20tests=20(75=20=E2=86=92=20108)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixed: map/filter/fold r13 register collision with heap limit, apply_proc_raw closure body dispatch (begin vs single expr), vector-ref/set GETARG clobber, vector printing (#(e1 e2 ...)). 108/108 asm tests pass. All implementations green: Python 571 + C 83 + asm 108 + functional 181 = 943 assertions. --- asm/test.sh | 37 ++++++++ asm/uncommonlisp | Bin 25696 -> 36936 bytes asm/uncommonlisp.o | Bin 23120 -> 34872 bytes asm/uncommonlisp.s | 215 ++++++++++++++++++++++++--------------------- 4 files changed, 152 insertions(+), 100 deletions(-) diff --git a/asm/test.sh b/asm/test.sh index c05743f..32adee4 100644 --- a/asm/test.sh +++ b/asm/test.sh @@ -50,6 +50,12 @@ check "abs" "(abs -7)" "7" check "min" "(min 3 1 4)" "1" check "max" "(max 3 1 4)" "4" check "expt" "(* 2 2 2 2 2 2 2 2 2 2)" "1024" +check "div" "(/ 10 2)" "5" +check "expt-bi" "(expt 2 10)" "1024" +check "odd?" "(odd? 3)" "#t" +check "odd?-even" "(odd? 4)" "#f" +check "even?" "(even? 4)" "#t" +check "even?-odd" "(even? 3)" "#f" echo "[unit] comparison" check "eq" "(= 5 5)" "#t" @@ -77,6 +83,10 @@ check "boolean?" "(boolean? #t)" "#t" check "symbol?" "(symbol? 'x)" "#t" check "positive?" "(positive? 5)" "#t" check "negative?" "(negative? -3)" "#t" +check "integer?" "(integer? 42)" "#t" +check "integer?-f" "(integer? #t)" "#f" +check "list?" "(list? (list 1 2))" "#t" +check "list?-f" "(list? 42)" "#f" echo "[unit] pairs & lists" check "cons" "(cons 1 2)" "(1 . 2)" @@ -86,6 +96,12 @@ check "list" "(list 1 2 3)" "(1 2 3)" check "length" "(length (list 1 2 3 4 5))" "5" check "car-list" "(car (list 10 20 30))" "10" check "cdr-list" "(car (cdr (list 10 20 30)))" "20" +check "append" "(append (list 1 2) (list 3 4))" "(1 2 3 4)" +check "append-nil" "(append '() (list 1))" "(1)" +check "reverse" "(reverse (list 1 2 3))" "(3 2 1)" +check "member" "(car (member 3 (list 1 2 3 4)))" "3" +check "member-f" "(member 9 (list 1 2 3))" "#f" +check "assoc" "(cdr (assoc 'b (list (cons 'a 1) (cons 'b 2))))" "2" echo "[unit] and/or" check "and-all" "(and 1 2 3)" "3" @@ -123,6 +139,27 @@ check "fib-rec" "(define (fib n) (if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2) echo "[integration] higher-order" check "apply-lambda" "((lambda (f x) (f x)) (lambda (n) (* n n)) 7)" "49" +check "map" "(map (lambda (x) (* x x)) (list 1 2 3))" "(1 4 9)" +check "map-add" "(map (lambda (x) (+ x 10)) (list 1 2 3))" "(11 12 13)" +check "filter" "(filter odd? (list 1 2 3 4 5))" "(1 3 5)" +check "filter-all" "(filter even? (list 1 3 5))" "()" +check "fold-left" "(fold-left + 0 (list 1 2 3 4))" "10" +check "fold-sub" "(fold-left - 100 (list 10 20 30))" "40" + +echo "[integration] strings" +check "str-length" "(string-length \"hello\")" "5" +check "str-eq" "(string=? \"abc\" \"abc\")" "#t" +check "str-neq" "(string=? \"abc\" \"def\")" "#f" +check "str-to-num" "(string->number \"42\")" "42" +check "char-to-int" "(char->integer (string-ref \"A\" 0))" "65" + +echo "[integration] vectors" +check "vec-ref" "(vector-ref (vector 10 20 30) 1)" "20" +check "vec-ref0" "(vector-ref (vector 10 20 30) 0)" "10" +check "vec-len" "(vector-length (vector 1 2 3))" "3" +check "vec?" "(vector? (vector 1))" "#t" +check "vec?-f" "(vector? 42)" "#f" +check "vec-set" "(let ((v (vector 1 2 3))) (vector-set! v 1 99) (vector-ref v 1))" "99" # ─── FUNCTIONAL TESTS: real programs ───────────────────── diff --git a/asm/uncommonlisp b/asm/uncommonlisp index adf1ec2227d506207230f4144b168c2fb6696351..62d23aa4daf1e7c74d128854b02cebf87b2725de 100755 GIT binary patch literal 36936 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 U!{E`$(l^!0G-oE03W=xxA6f8DQvd(} diff --git a/asm/uncommonlisp.o b/asm/uncommonlisp.o index 4af19d64e935ab96853ac7826da50cf670779944..1798cd128bb5194e8463e45d3ef534efc1f99677 100644 GIT binary patch literal 34872 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 literal 23120 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 V!@%PO!=>M|Qt6+|>GVUU{~tUVAvgd4 diff --git a/asm/uncommonlisp.s b/asm/uncommonlisp.s index b89495e..1637e5b 100644 --- a/asm/uncommonlisp.s +++ b/asm/uncommonlisp.s @@ -257,6 +257,7 @@ s_rparen: .ascii ")" s_space: .ascii " " s_dotsp: .ascii " . " s_minus: .ascii "-" +s_hashparen: .ascii "#(" # Interned special form symbols (filled at init) .align 8 @@ -1129,6 +1130,8 @@ scheme_print: je .sp_builtin cmpq $TAG_STRING, %rax je .sp_string + cmpq $7, %rax + je .sp_vector popq %r12 popq %rbx @@ -1277,6 +1280,54 @@ scheme_print: popq %rbx ret +.sp_vector: + # Print "#(" then elements separated by spaces, then ")" + # %rbx = tagged vector value + movq %rbx, %rax + andq $-8, %rax # untagged vector ptr + movq %rax, %rbx # %rbx = untagged vector ptr + movq (%rbx), %r12 # %r12 = length + # Print "#(" + movq $SYS_WRITE, %rax + movq $1, %rdi + leaq s_hashparen(%rip), %rsi + movq $2, %rdx + syscall + xorq %rcx, %rcx # index = 0 +.sp_vec_loop: + cmpq %r12, %rcx + jge .sp_vec_close + # Print space before all but first element + testq %rcx, %rcx + jz .sp_vec_elem + pushq %rcx + movq $SYS_WRITE, %rax + movq $1, %rdi + leaq s_space(%rip), %rsi + movq $1, %rdx + syscall + popq %rcx +.sp_vec_elem: + pushq %rcx + pushq %rbx + pushq %r12 + movq 8(%rbx,%rcx,8), %rdi # element at index + call scheme_print + popq %r12 + popq %rbx + popq %rcx + incq %rcx + jmp .sp_vec_loop +.sp_vec_close: + movq $SYS_WRITE, %rax + movq $1, %rdi + leaq s_rparen(%rip), %rsi + movq $1, %rdx + syscall + popq %r12 + popq %rbx + ret + # print_int64: %rdi = signed 64-bit integer print_int64: pushq %rbx @@ -2787,37 +2838,12 @@ apply_proc_raw: jmp .apr_bind .apr_eval_body: - # Eval body expressions (begin-style) - movq %rdx, %rdi # body (list of exprs) + # Body is already wrap_begin'd: single expr or (begin ...) form. + # Eval it directly. + movq %rdx, %rdi # body expression movq %rbp, %rsi # env -.apr_body_loop: - cmpq $VAL_NIL, %rdi - je .apr_done_void - movq %rdi, %rax - andq $-8, %rax - movq (%rax), %rbx # car = expr - movq 8(%rax), %rdi # cdr = rest - cmpq $VAL_NIL, %rdi - je .apr_last_expr - pushq %rdi - pushq %rbp - movq %rbx, %rdi - movq %rbp, %rsi call eval popq %rbp - popq %rdi - jmp .apr_body_loop -.apr_last_expr: - movq %rbx, %rdi - movq %rbp, %rsi - call eval - popq %rbp - popq %r12 - popq %rbx - ret -.apr_done_void: - movq $VAL_VOID, %rax - popq %rbp popq %r12 popq %rbx ret @@ -2920,135 +2946,124 @@ bi_reverse: bi_map: # (map f lst) — apply f to each element, build result list + # NOTE: %r13 is the heap limit (global), must not be used as scratch. + # Stack slot for accumulator: [acc] at base of our frame. GETARG %rbx # f (proc/closure/builtin) GETARG %rdi # lst - pushq %r13 - movq $VAL_NIL, %r13 # acc (reversed) + subq $8, %rsp # allocate stack slot for acc + movq $VAL_NIL, (%rsp) # acc = NIL .bmap_loop: cmpq $VAL_NIL, %rdi je .bmap_done - pushq %rdi + pushq %rdi # save input list movq %rdi, %rax andq $-8, %rax - movq (%rax), %rdi # car - # Build a 1-element arg list: (cons car nil) + movq (%rax), %rdi # car = element + # Build 1-element arg list: (element) movq $VAL_NIL, %rsi call make_pair - movq %rax, %r12 # arg list for apply - movq %rbx, %rax # proc - # We need to call the proc — use the existing apply path - # Save state and call eval_apply - pushq %rbx - pushq %r13 + movq %rax, %rsi # arg list + pushq %rbx # save proc movq %rbx, %rdi # proc - movq %r12, %rsi # args list call apply_proc_raw - popq %r13 - popq %rbx + popq %rbx # restore proc # cons result onto acc - movq %rax, %rdi - movq %r13, %rsi + # stack: [input_list] [acc] + movq %rax, %rdi # result value + movq 8(%rsp), %rsi # acc (past saved input_list) call make_pair - movq %rax, %r13 - popq %rdi + movq %rax, 8(%rsp) # update acc + popq %rdi # restore input list movq %rdi, %rax andq $-8, %rax - movq 8(%rax), %rdi # cdr + movq 8(%rax), %rdi # cdr of input list jmp .bmap_loop .bmap_done: - movq %r13, %rdi + popq %rdi # acc (from stack slot) call list_reverse - popq %r13 RET_VAL bi_filter: # (filter pred lst) + # NOTE: %r13 is the heap limit (global), must not be used as scratch. GETARG %rbx # pred GETARG %rdi # lst - pushq %r13 - movq $VAL_NIL, %r13 # acc (reversed) + subq $8, %rsp # stack slot for acc + movq $VAL_NIL, (%rsp) # acc = NIL .bfilt_loop: cmpq $VAL_NIL, %rdi je .bfilt_done - pushq %rdi + pushq %rdi # save input list movq %rdi, %rax andq $-8, %rax movq (%rax), %rcx # car = element - pushq %rcx + pushq %rcx # save element # Call pred on element movq %rcx, %rdi movq $VAL_NIL, %rsi call make_pair - movq %rax, %r12 - pushq %rbx - pushq %r13 - movq %rbx, %rdi - movq %r12, %rsi + movq %rax, %rsi # arg list + pushq %rbx # save pred + movq %rbx, %rdi # pred call apply_proc_raw - popq %r13 - popq %rbx - popq %rcx # element + popq %rbx # restore pred + popq %rcx # restore element # Check if result is truthy (not #f) cmpq $VAL_FALSE, %rax je .bfilt_skip + # cons element onto acc + # stack: [input_list] [acc] movq %rcx, %rdi - movq %r13, %rsi + movq 8(%rsp), %rsi # acc (past saved input_list) call make_pair - movq %rax, %r13 + movq %rax, 8(%rsp) # update acc .bfilt_skip: - popq %rdi + popq %rdi # restore input list movq %rdi, %rax andq $-8, %rax - movq 8(%rax), %rdi + movq 8(%rax), %rdi # cdr jmp .bfilt_loop .bfilt_done: - movq %r13, %rdi + popq %rdi # acc call list_reverse - popq %r13 RET_VAL bi_foldl: # (fold-left f init lst) + # NOTE: %r13 is the heap limit (global), must not be used as scratch. GETARG %rbx # f GETARG %rcx # init (accumulator) GETARG %rdi # lst - pushq %r13 - movq %rcx, %r13 # acc + subq $8, %rsp # stack slot for acc + movq %rcx, (%rsp) # acc = init .bfl_loop: cmpq $VAL_NIL, %rdi je .bfl_done - pushq %rdi + pushq %rdi # save input list movq %rdi, %rax andq $-8, %rax movq (%rax), %rdi # car = element - # Build arg list: (cons element (cons acc nil)) - movq %r13, %rsi - movq $VAL_NIL, %rdx - # Actually need (list element acc) = (cons element (cons acc nil)) + # Build arg list: (list acc element) for fold-left convention pushq %rdi # save element - movq %r13, %rdi movq $VAL_NIL, %rsi - call make_pair # (acc) + call make_pair # (element) movq %rax, %rsi - popq %rdi # element - call make_pair # (element acc) - movq %rax, %r12 # arg list - pushq %rbx - pushq %r13 - movq %rbx, %rdi - movq %r12, %rsi + movq 16(%rsp), %rdi # acc (past element, input_list) + call make_pair # (acc element) + movq %rax, %rsi # arg list + pushq %rbx # save proc + movq %rbx, %rdi # proc call apply_proc_raw - popq %r13 - popq %rbx - movq %rax, %r13 # new acc - popq %rdi + popq %rbx # restore proc + addq $8, %rsp # discard saved element + movq %rax, 8(%rsp) # update acc (past saved input_list) + popq %rdi # restore input list movq %rdi, %rax andq $-8, %rax - movq 8(%rax), %rdi + movq 8(%rax), %rdi # cdr jmp .bfl_loop .bfl_done: - movq %r13, %rax - popq %r13 + popq %rax # acc = result RET_VAL bi_foreach: @@ -3537,20 +3552,20 @@ bi_makevec: RET_VAL bi_vecref: - GETARG %rax # vector - andq $-8, %rax - GETARG %rcx # index - sarq $3, %rcx - movq 8(%rax,%rcx,8), %rax # element + GETARG %rdi # vector (tagged) + andq $-8, %rdi # untag — use %rdi (not clobbered by GETARG) + GETARG %rcx # index (tagged int) + sarq $3, %rcx # untag index + movq 8(%rdi,%rcx,8), %rax # element RET_VAL bi_vecset: - GETARG %rax # vector - andq $-8, %rax - GETARG %rcx # index - sarq $3, %rcx + GETARG %rdi # vector (tagged) + andq $-8, %rdi # untag — use %rdi (not clobbered by GETARG) + GETARG %rcx # index (tagged int) + sarq $3, %rcx # untag index GETARG %rdx # value - movq %rdx, 8(%rax,%rcx,8) + movq %rdx, 8(%rdi,%rcx,8) movq $VAL_VOID, %rax RET_VAL