|
14 | 14 | (define (asm-string a) |
15 | 15 | (with-output-to-string (lambda () (asm-display a)))) |
16 | 16 |
|
| 17 | +(define label-occurred? (make-parameter #f)) |
| 18 | +(define-syntax (sqbracket stx) |
| 19 | + (syntax-case stx () |
| 20 | + [(_ e) |
| 21 | + #'(parameterize ([label-occurred? #f]) |
| 22 | + (let ([v e]) |
| 23 | + (string-append "[" |
| 24 | + v |
| 25 | + (if (label-occurred?) |
| 26 | + " + rip" |
| 27 | + "") |
| 28 | + "]")))])) |
| 29 | + |
17 | 30 | (define tab (make-string 8 #\space)) |
18 | 31 |
|
19 | 32 | (define (comment->string c) |
|
28 | 41 | ;; prefix with _ for Mac |
29 | 42 | (define label-symbol->string |
30 | 43 | (match (system-type 'os) |
31 | | - ['macosx (λ (s) (string-append "_" (symbol->string s)))] |
32 | | - [_ (λ (s) (symbol->string s))])) |
| 44 | + ['macosx |
| 45 | + (λ (s) |
| 46 | + (label-occurred? #t) |
| 47 | + (string-append "_" (symbol->string s)))] |
| 48 | + [_ |
| 49 | + (λ (s) |
| 50 | + (label-occurred? #t) |
| 51 | + (symbol->string s))])) |
33 | 52 |
|
34 | 53 | ;(if (and (current-shared?) (memq s (current-extern-labels))) |
35 | 54 | ; hack for ELF64 shared libraries in service of |
|
39 | 58 |
|
40 | 59 | (define extern-label-decl-symbol->string |
41 | 60 | (match (system-type 'os) |
42 | | - ['macosx (λ (s) (string-append "_" (symbol->string s)))] |
43 | | - [_ (λ (s) (symbol->string s))])) |
44 | | - |
| 61 | + ['macosx |
| 62 | + (λ (s) |
| 63 | + (label-occurred? #t) |
| 64 | + (string-append "_" (symbol->string s)))] |
| 65 | + [_ |
| 66 | + (λ (s) |
| 67 | + (label-occurred? #t) |
| 68 | + (symbol->string s))])) |
| 69 | + |
45 | 70 | ;; Instruction -> String |
46 | 71 | (define (common-instruction->string i) |
47 | 72 | (let ((as (instruction-args i))) |
|
66 | 91 | (match x |
67 | 92 | [(? integer?) (number->string x)] |
68 | 93 | [(? symbol?) (symbol->string x)] |
69 | | - [($ x) (string-append (label-symbol->string x) " + rip ")])) |
| 94 | + [($ x) (label-symbol->string x)])) |
70 | 95 | (match m |
71 | 96 | [(Mem l b i o s) |
72 | 97 | (string-append |
|
80 | 105 | (define (arg->string e) |
81 | 106 | (match e |
82 | 107 | [(? register?) (symbol->string e)] |
83 | | - [(? Mem?) (string-append "[" (mem->string e) "]")] |
84 | | - [(Offset (? register? r)) (string-append "[" (symbol->string r) "]")] |
85 | | - [(Offset ($ (? label? r))) (string-append "[" (label-symbol->string r) " + rip]")] |
86 | | - [(Offset e) |
87 | | - (string-append "[" (exp->string e) "]")] |
| 108 | + #;[(? Mem?) (string-append "[" (mem->string e) "]")] |
| 109 | + #;[(Offset (? register? r)) (string-append "[" (symbol->string r) "]")] |
| 110 | + #;[(Offset ($ (? label? r))) (string-append "[" (label-symbol->string r) " + rip]")] |
| 111 | + #;[(Offset e) (string-append "[" (exp->string e) "]")] |
| 112 | + [(? Mem?) (sqbracket (mem->string e))] |
| 113 | + [(Offset (? register? r)) (sqbracket (symbol->string r))] |
| 114 | + [(Offset ($ (? label? r))) (sqbracket (label-symbol->string r))] |
| 115 | + [(Offset e) (sqbracket (exp->string e))] |
88 | 116 | [_ (exp->string e)])) |
89 | 117 |
|
90 | 118 | ;; Exp -> String |
|
93 | 121 | [(? register?) (symbol->string e)] |
94 | 122 | [(? integer?) (number->string e)] |
95 | 123 | [($ x) (label-symbol->string x)] |
| 124 | + ;; [($ x) (string-append (label-symbol->string x) " + rip")] |
96 | 125 | [(list '? e1 e2 e3) |
97 | 126 | (string-append "(" (exp->string e1) " ? " (exp->string e2) " : " (exp->string e3) ")")] |
98 | 127 | [(list (? exp-unop? o) e1) |
|
118 | 147 | [(Data) (string-append tab ".data\n\t .p2align 3")] ; 8-byte aligned data |
119 | 148 | [(Data n) (string-append tab (data-section n))] |
120 | 149 | [(Extern ($ l)) (string-append tab ".extern " (extern-label-decl-symbol->string l))] |
121 | | - [(Global ($ l)) (string-append tab ".global " (label-symbol->string l))] |
| 150 | + [(Global ($ l)) (string-append tab ".global " (label-symbol->string l))] |
122 | 151 | ;;[(Label ($ l)) (string-append "_" (symbol->string l) ":")] |
123 | 152 | [(Label ($ l)) (string-append (label-symbol->string l) ":")] |
124 | 153 | [(Lea d (? Mem? m)) |
125 | 154 | (string-append tab "lea " |
126 | | - (arg->string d) ", [rip + " |
127 | | - (mem->string m) "]")] |
| 155 | + (arg->string d) ", " |
| 156 | + (sqbracket (mem->string m)))] |
128 | 157 | [(Lea d e) |
129 | 158 | (string-append tab "lea " |
130 | | - (arg->string d) ", [rip + " |
131 | | - (arg->string e) "]")] |
| 159 | + (arg->string d) ", " |
| 160 | + (sqbracket (arg->string e)))] |
132 | 161 | [(Equ x c) |
133 | 162 | (string-append tab |
134 | 163 | (symbol->string x) |
|
0 commit comments