diff options
| author | Mistivia <i@mistivia.com> | 2024-12-05 20:53:32 +0800 |
|---|---|---|
| committer | Mistivia <i@mistivia.com> | 2024-12-05 20:53:32 +0800 |
| commit | 79194983d0331d632bd094370a410fa0aaefe6aa (patch) | |
| tree | e6288068a65f587b64b22206c1d510b65e7d189b /assembler/fvm-as.scm | |
| parent | fb4dca6c42147cd1ce082636640b50b5fac8826f (diff) | |
fix float number immediate
Diffstat (limited to 'assembler/fvm-as.scm')
| -rw-r--r-- | assembler/fvm-as.scm | 27 |
1 files changed, 14 insertions, 13 deletions
diff --git a/assembler/fvm-as.scm b/assembler/fvm-as.scm index 5f1951e..8730e66 100644 --- a/assembler/fvm-as.scm +++ b/assembler/fvm-as.scm @@ -5,6 +5,8 @@ (import (chicken keyword)) (import (chicken process-context)) (import (chicken port)) +(import (chicken blob)) +(import srfi-4) (define (make-opcode-table) (define opcodes @@ -150,18 +152,17 @@ (impl prog '() 0)) (define (output-prog prog output-file) - (define (write-64bit-number port x) - (if (or (>= x (expt 2 63)) - (< x (- (expt 2 63)))) - (abort "number out of limit!")) - (if (< x 0) - (set! x (+ x (expt 2 64)))) - (let loop ((i 0) (x x)) - (if (>= i 8) - '() - (let () - (write-byte (modulo x 256) port) - (loop (+ i 1) (quotient x 256)))))) + (define (write-number x port) + (cond ((or (rational? x) + (real? x)) (write-string + (blob->string (f64vector->blob (f64vector x))) + #f + port)) + ((integer? x) (write-string (blob->string + (u64vector->blob (u64vector x))) + #f + port)) + (else (abort "Expect a number")))) (call-with-output-file output-file (lambda (port) (let loop ((prog prog)) @@ -172,7 +173,7 @@ (('imm x) (let () (write-byte (hash-table-ref opcode-table 'imm) port) - (write-64bit-number port x) + (write-number x port) (loop (cdr prog)))) (x (let () |
