1 ;;; GNU Mes --- Maxwell Equations of Software
2 ;;; Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
4 ;;; This file is part of GNU Mes.
6 ;;; GNU Mes is free software; you can redistribute it and/or modify it
7 ;;; under the terms of the GNU General Public License as published by
8 ;;; the Free Software Foundation; either version 3 of the License, or (at
9 ;;; your option) any later version.
11 ;;; GNU Mes is distributed in the hope that it will be useful, but
12 ;;; WITHOUT ANY WARRANTY; without even the implied warranty of
13 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 ;;; GNU General Public License for more details.
16 ;;; You should have received a copy of the GNU General Public License
17 ;;; along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
21 ;;; Define x86_64 M1 assembly
25 (define-module (mescc x86_64 as)
26 #:use-module (mes guile)
27 #:use-module (mescc as)
28 #:use-module (mescc info)
29 #:use-module (mescc x86_64 info)
35 (string-append "e" (string-drop o 1)))
50 (define (x86_64:function-preamble info . rest)
51 (format (current-error-port) "rest=~s\n" rest)
54 ("sub____$i32,%rbp" "%0x80")
56 '(("mov____%rdi,0x8(%rbp)" "!0x10")
57 ("mov____%rsi,0x8(%rbp)" "!0x18")
58 ("mov____%rdx,0x8(%rbp)" "!0x20")
59 ("mov____%rcx,0x8(%rbp)" "!0x28")
60 ("mov____%r8,0x8(%rbp)" "!0x30")
61 ("mov____%r9,0x8(%rbp)" "!0x38"))
62 (length (car rest)))))
65 (define (x86_64:function-preamble info . rest)
66 (format (current-error-port) "rest=~s\n" rest)
68 ("mov____%rsp,%rbp")))
70 (define (x86_64:function-locals . rest)
72 ;; FIXME: how on x86_64?
73 ("sub____$i32,%rsp" (#:immediate ,(+ (* 4 1025) (* 20 8))))
74 )) ; 4*1024 buf, 20 local vars
76 (define (x86_64:r->local info n)
77 (let ((r (get-r info))
79 `(,(if (< (abs n) #x80)
80 `(,(string-append "mov____%" r ",0x8(%rbp)") (#:immediate1 ,n))
81 `(,(string-append "mov____%" r ",0x32(%rbp)") (#:immediate ,n))))))
83 (define (x86_64:value->r info v)
84 (or v (error "invalid value: x86_64:value->r: " v))
85 (let ((r (get-r info)))
88 `((,(string-append "mov____$i32,%" r) (#:immediate ,v)))
89 `((,(string-append "mov____$i64,%" r) (#:immediate8 ,v))))))
92 (define (x86_64:ret . rest)
93 '(("add____$i32,%rbp" "%0x80")
99 (define (x86_64:ret . rest)
100 '(("mov____%rbp,%rsp")
104 (define (x86_64:r-zero? info)
105 (let ((r (car (if (pair? (.allocated info)) (.allocated info) (.registers info)))))
106 `((,(string-append "test___%" r "," "%" r)))))
108 (define (x86_64:local->r info n)
109 (let ((r (car (if (pair? (.allocated info)) (.allocated info) (.registers info))))
111 `(,(if (< (abs n) #x80) `(,(string-append "mov____0x8(%rbp),%" r) (#:immediate1 ,n))
112 `(,(string-append "mov____0x32(%rbp),%" r) (#:immediate ,n))))))
114 (define (x86_64:call-label info label n)
115 `((call32 (#:offset ,label))
116 ("add____$i8,%rsp" (#:immediate1 ,(* n 8))) ;; NOT AMD
119 (define x86_64:calling-convention-registers '("rax" "rdi" "rsi" "rdx" "rcx" "r8" "r9"))
122 (define (x86_64:r->arg info i)
123 (let ((r (get-r info))
124 (r1 (list-ref x86_64:calling-convention-registers (1+ i))))
125 `((,(string-append "mov____%" r ",%" r1))))) ; debug fail-safe check
127 (define (x86_64:label->arg info label i)
128 (let ((r0 (list-ref x86_64:registers (1+ i))))
129 (if (< (label v) #x80000000)
130 `((,(string-append "mov____$i32,%" r0) (#:address ,label)))
131 `((,(string-append "mov____$i64,%" r0) (#:address8 ,label))))))
134 (define (x86_64:r->arg info i)
135 (let ((r (get-r info)))
136 `((,(string-append "push___%" r)))))
138 (define (x86_64:label->arg info label i)
139 `(("push___$i32" (#:address ,label))))
142 ;; (define (x86_64:label->arg info label i)
143 ;; `((,(string-append "mov____$i64,%r15") (#:address8 ,label))
144 ;; ("push___%r15" (#:address ,label))))
146 (define (x86_64:r0+r1 info)
147 (let ((r1 (get-r1 info))
149 `((,(string-append "add____%" r1 ",%" r0)))))
151 (define (x86_64:r-negate info)
152 (let* ((r (get-r info))
154 `((,(string-append "sete___%" l))
155 (,(string-append "movzbq_%" l ",%" r)))))
157 (define (x86_64:r0-r1 info)
158 (let ((r0 (get-r0 info))
160 `((,(string-append "sub____%" r1 ",%" r0)))))
162 (define (x86_64:zf->r info)
163 (let* ((r (get-r info))
165 `((,(string-append "sete___%" l))
166 (,(string-append "movzbq_%" l ",%" r)))))
168 (define (x86_64:xor-zf info)
170 ("xor____$i8,%ah" (#:immediate1 #x40))
173 (define (x86_64:r->local+n info id n)
174 (let ((n (+ (- 0 (* 8 id)) n))
176 `(,(if (< (abs n) #x80) `(,(string-append "mov____%" r ",0x8(%rbp)") (#:immediate1 ,n))
177 `(,(string-append "mov____%" r ",0x32(%rbp)") (#:immediate ,n))))))
179 (define (x86_64:r-mem-add info v)
180 (let ((r (get-r info)))
181 `(,(if (< (abs v) #x80) `(,(string-append "add____$i8,(%" r ")") (#:immediate1 ,v))
182 `(,(string-append "add____$i32,(%" r ")") (#:immediate ,v)))))) ;; FIXME 64bit
184 (define (x86_64:r-byte-mem-add info v)
185 (let ((r (get-r info)))
186 `((,(string-append "addb___$i8,(%" r ")") (#:immediate1 ,v)))))
188 (define (x86_64:r-word-mem-add info v)
189 (let ((r (get-r info)))
190 `((,(string-append "addw___$i8,(%" r ")") (#:immediate2 ,v)))))
192 (define (x86_64:local-ptr->r info n)
193 (let ((r (get-r info)))
194 (let ((n (- 0 (* 8 n))))
195 `((,(string-append "mov____%rbp,%" r))
196 ,(if (< (abs n) #x80) `(,(string-append "add____$i8,%" r) (#:immediate1 ,n))
197 `(,(string-append "add____$i32,%" r) (#:immediate ,n))))))) ;; FIXME 64bit
199 (define (x86_64:label->r info label)
200 (let ((r (get-r info)))
201 `((,(string-append "mov____$i64,%" r) (#:address8 ,label)))))
203 (define (x86_64:r0->r1 info)
204 (let ((r0 (get-r0 info))
206 `((,(string-append "mov____%" r0 ",%" r1)))))
208 (define (x86_64:byte-mem->r info)
209 (let ((r (get-r info)))
210 `((,(string-append "movzbq_(%" r "),%" r)))))
212 (define (x86_64:byte-r info)
213 (let* ((r (get-r info))
215 `((,(string-append "movzbq_%" l ",%" r)))))
217 (define (x86_64:byte-signed-r info)
218 (let* ((r (get-r info))
220 `((,(string-append "movsbq_%" l ",%" r)))))
222 (define (x86_64:word-r info)
223 (let* ((r (get-r info))
225 `((,(string-append "movzwq_%" x ",%" r)))))
227 (define (x86_64:word-signed-r info)
228 (let* ((r (get-r info))
230 `((,(string-append "movswq_%" x ",%" r)))))
232 (define (x86_64:long-r info)
233 (let* ((r (get-r info))
235 `((,(string-append "movzlq_%" e ",%" r)))))
237 (define (x86_64:long-signed-r info)
238 (let* ((r (get-r info))
240 `((,(string-append "movslq_%" e ",%" r)))))
242 (define (x86_64:jump info label)
243 `(("jmp32 " (#:offset ,label))))
245 (define (x86_64:jump-nz info label)
246 `(("jne32 " (#:offset ,label))))
248 (define (x86_64:jump-z info label)
249 `(("je32 " (#:offset ,label))))
251 (define (x86_64:jump-byte-z info label)
253 ("je32 " (#:offset ,label))))
256 (define (x86_64:jump-g info label)
257 `(("jg32 " (#:offset ,label))))
259 (define (x86_64:jump-ge info label)
260 `(("jge32 " (#:offset ,label))))
262 (define (x86_64:jump-l info label)
263 `(("jl32 " (#:offset ,label))))
265 (define (x86_64:jump-le info label)
266 `(("jle32 " (#:offset ,label))))
269 (define (x86_64:jump-a info label)
270 `(("ja32 " (#:offset ,label))))
272 (define (x86_64:jump-ae info label)
273 `(("jae32 " (#:offset ,label))))
275 (define (x86_64:jump-b info label)
276 `(("jb32 " (#:offset ,label))))
278 (define (x86_64:jump-be info label)
279 `(("jbe32 " (#:offset ,label))))
281 (define (x86_64:byte-r0->r1-mem info)
282 (let* ((r0 (get-r0 info))
285 `((,(string-append "mov____%" l0 ",(%" r1 ")")))))
287 (define (x86_64:label-mem->r info label)
288 (let ((r (get-r info)))
289 `((,(string-append "mov____0x32,%" r) (#:address ,label)))))
291 (define (x86_64:word-mem->r info)
292 (let ((r (get-r info)))
293 `((,(string-append "movzwq_(%" r "),%" r)))))
295 (define (x86_64:long-mem->r info)
296 (let ((r (get-r info)))
297 `((,(string-append "movzlq_(%" r "),%" r)))))
299 (define (x86_64:mem->r info)
300 (let ((r (get-r info)))
301 `((,(string-append "mov____(%" r "),%" r)))))
303 (define (x86_64:local-add info n v)
304 (let ((n (- 0 (* 8 n))))
305 `(,(if (and (< (abs n) #x80)
306 (< (abs v) #x80)) `("add____$i8,0x8(%rbp)" (#:immediate1 ,n) (#:immediate1 ,v))
307 `("add____$i32,0x32(%rbp)" (#:immediate ,n) (#:immediate ,v)))))) ;; FIXME: 64b
309 (define (x86_64:label-mem-add info label v)
310 `(,(if (< (abs v) #x80) `("add____$i8,0x32" (#:address ,label) (#:immediate1 ,v))
311 `("add____$i32,0x32" (#:address ,label) (#:immediate ,v))))) ;; FIXME: 64b
313 (define (x86_64:nop info)
316 (define (x86_64:swap-r0-r1 info)
317 (let ((r0 (get-r0 info))
319 `((,(string-append "xchg___%" r0 ",%" r1)))))
322 (define (x86_64:g?->r info)
323 (let* ((r (get-r info))
325 `((,(string-append "setg___%" l))
326 (,(string-append "movzbq_%" l ",%" r)))))
328 (define (x86_64:ge?->r info)
329 (let* ((r (get-r info))
331 `((,(string-append "setge__%" l))
332 (,(string-append "movzbq_%" l ",%" r)))))
334 (define (x86_64:l?->r info)
335 (let* ((r (get-r info))
337 `((,(string-append "setl___%" l))
338 (,(string-append "movzbq_%" l ",%" r)))))
340 (define (x86_64:le?->r info)
341 (let* ((r (get-r info))
343 `((,(string-append "setle__%" l))
344 (,(string-append "movzbq_%" l ",%" r)))))
347 (define (x86_64:a?->r info)
348 (let* ((r (get-r info))
350 `((,(string-append "seta___%" l))
351 (,(string-append "movzbq_%" l ",%" r)))))
353 (define (x86_64:ae?->r info)
354 (let* ((r (get-r info))
356 `((,(string-append "setae__%" l))
357 (,(string-append "movzbq_%" l ",%" r)))))
359 (define (x86_64:b?->r info)
360 (let* ((r (get-r info))
362 `((,(string-append "setb___%" l))
363 (,(string-append "movzbq_%" l ",%" r)))))
365 (define (x86_64:be?->r info)
366 (let* ((r (get-r info))
368 `((,(string-append "setbe__%" l))
369 (,(string-append "movzbq_%" l ",%" r)))))
371 (define (x86_64:test-r info)
372 (let ((r (get-r info)))
373 `((,(string-append "test___%" r ",%" r)))))
375 (define (x86_64:r->label info label)
376 (let ((r (get-r info)))
377 `((,(string-append "mov____%" r ",0x32") (#:address ,label))))) ;; FIXME: 64 bits
379 (define (x86_64:r->byte-label info label)
380 (let* ((r (get-r info))
382 `((,(string-append "movb___%" l ",0x32") (#:address ,label)))))
384 (define (x86_64:r->word-label info label)
385 (let* ((r (get-r info))
387 `((,(string-append "movw___%" x ",0x32") (#:address ,label)))))
389 (define (x86_64:r->long-label info label)
390 (let* ((r (get-r info))
392 `((,(string-append "movl___%" e ",0x32") (#:address ,label)))))
394 (define (x86_64:call-r info n)
395 (let ((r (get-r info)))
396 `((,(string-append "call___*%" r))
397 ("add____$i8,%rsp" (#:immediate1 ,(* n 8)))))) ;; NOT AMD
399 (define (x86_64:r0*r1 info)
400 (let ((allocated (.allocated info))
403 (if (not (member "rdx" allocated))
404 `(,@(if (equal? r0 "rax") '()
406 ,(string-append "mov____%" r0 ",%rax"))))
407 (,(string-append "mul____%" r1))
408 ,@(if (equal? r0 "rax") '()
409 `((,(string-append "mov____%rax,%" r0)
414 (,(string-append "mov____%" r1 ",%rdi"))
415 (,(string-append "mov____%" r0 ",%rax"))
416 (,(string-append "mul____%" r1))
419 (,(string-append "mov____%rax,%" r0))
422 (define (x86_64:r0<<r1 info)
423 (let ((r0 (get-r0 info))
425 `((,(string-append "mov____%" r1 ",%rcx"))
426 (,(string-append "shl____%cl,%" r0)))))
428 (define (x86_64:r0>>r1 info)
429 (let ((r0 (get-r0 info))
431 `((,(string-append "mov____%" r1 ",%rcx"))
432 (,(string-append "shr____%cl,%" r0)))))
434 (define (x86_64:r0-and-r1 info)
435 (let ((r0 (get-r0 info))
437 `((,(string-append "and____%" r1 ",%" r0)))))
439 (define (x86_64:r0/r1 info signed?)
440 (let ((allocated (.allocated info))
443 (if (not (member "rdx" allocated))
444 `(,@(if (equal? r0 "rax") '()
446 (,(string-append "mov____%" r0 ",%rax"))))
447 ,(if signed? '("cqto") '("xor____%rdx,%rdx"))
448 (,(string-append "idiv___%" r1))
449 ,@(if (equal? r0 "rax") '()
450 `((,(string-append "mov____%rax,%" r0))
455 (,(string-append "mov____%" r1 ",%rdi"))
456 (,(string-append "mov____%" r0 ",%rax"))
457 ,(if signed? '("cqto") '("xor____%rdx,%rdx"))
458 (,(string-append "idiv___%rdi"))
461 (,(string-append "mov____%rax,%" r0))
464 (define (x86_64:r0%r1 info signed?)
465 (let ((allocated (.allocated info))
468 (if (not (member "rdx" allocated))
469 `(,@(if (equal? r0 "rax") '()
471 (,(string-append "mov____%" r0 ",%rax"))))
472 ,(if signed? '("cqto") '("xor____%rdx,%rdx"))
473 (,(string-append "idiv___%" r1))
474 (,(string-append "mov____%rdx,%" r0)))
478 (,(string-append "mov____%" r1 ",%rdi"))
479 (,(string-append "mov____%" r0 ",%rax"))
480 ,(if signed? '("cqto") '("xor____%rdx,%rdx"))
481 (,(string-append "idiv___%rdi"))
484 (,(string-append "mov____%rdx,%" r0))
487 (define (x86_64:r+value info v)
488 (let ((r (get-r info)))
489 (cond ((< (abs v) #x80)
490 `((,(string-append "add____$i8,%" r) (#:immediate1 ,v))))
491 ((< (abs v) #x80000000)
492 `((,(string-append "add____$i32,%" r) (#:immediate ,v))))
494 `((,(string-append "mov____$i64,%r15") (#:immediate8 ,v))
495 (,(string-append "add____%r15,%" r)))))))
497 (define (x86_64:r0->r1-mem info)
498 (let ((r0 (get-r0 info))
500 `((,(string-append "mov____%" r0 ",(%" r1 ")")))))
502 (define (x86_64:byte-r0->r1-mem info)
503 (let* ((r0 (get-r0 info))
506 `((,(string-append "mov____%" l0 ",(%" r1 ")")))))
508 (define (x86_64:word-r0->r1-mem info)
509 (let* ((r0 (get-r0 info))
512 `((,(string-append "mov____%" x0 ",(%" r1 ")")))))
514 (define (x86_64:long-r0->r1-mem info)
515 (let* ((r0 (get-r0 info))
518 `((,(string-append "mov____%" e0 ",(%" r1 ")")))))
520 (define (x86_64:r-cmp-value info v)
521 (let ((r (get-r info)))
522 (cond ((< (abs v) #x80)
523 `((,(string-append "cmp____$i8,%" r) (#:immediate1 ,v))))
526 `((,(string-append "cmp____$i32,%" r) (#:immediate ,v))))
528 `(,(string-append "mov____$i64,%r15") (#:immediate8 ,v)
529 ,(string-append "cmp____%r15,%" r))))))
531 (define (x86_64:push-register info r)
532 `((,(string-append "push___%" r))))
534 (define (x86_64:pop-register info r)
535 `((,(string-append "pop____%" r))))
537 (define (x86_64:return->r info)
538 (let ((r (car (.allocated info))))
539 (if (equal? r "rax") '()
540 `((,(string-append "mov____%rax,%" r))))))
542 (define (x86_64:r0-or-r1 info)
543 (let ((r0 (get-r0 info))
545 `((,(string-append "or_____%" r1 ",%" r0)))))
547 (define (x86_64:shl-r info n)
548 (let ((r (get-r info)))
549 `((,(string-append "shl____$i8,%" r) (#:immediate1 ,n)))))
551 (define (x86_64:r+r info)
552 (let ((r (get-r info)))
553 `((,(string-append "add____%" r ",%" r)))))
555 (define (x86_64:not-r info)
556 (let ((r (get-r info)))
557 `((,(string-append "not____%" r)))))
559 (define (x86_64:r0-xor-r1 info)
560 (let ((r0 (get-r0 info))
562 `((,(string-append "xor____%" r1 ",%" r0)))))
564 (define (x86_64:r0-mem->r1-mem info)
565 (let* ((registers (.registers info))
568 (r2 (car registers)))
569 `((,(string-append "mov____(%" r0 "),%" r2))
570 (,(string-append "mov____%" r2 ",(%" r1 ")")))))
572 (define (x86_64:r0+value info v)
573 (let ((r0 (get-r0 info)))
574 `(,(if (< (abs v) #x80) `(,(string-append "add____$i8,%" r0) (#:immediate1 ,v))
575 `(,(string-append "add____$i32,%" r0) (#:immediate ,v)))))) ; FIXME: 64bit
577 (define (x86_64:value->r0 info v)
578 (let ((r0 (get-r0 info)))
579 `((,(string-append "mov____$i32,%" r0) (#:immediate ,v)))))
581 (define (x86_64:r-long-mem-add info v)
582 (let ((r (get-r info)))
583 (cond ((< (abs v) #x80)
584 `((,(string-append "addl___$i8,(%" r ")") (#:immediate1 ,v))))
587 `((,(string-append "addl___$i32,(%" r ")") (#:immediate ,v))))
589 `((,(string-append "mov____$i64,%r15") (#:immediate8 ,v))
590 (,(string-append "add____%r15,(%" r ")")))))))
592 (define (x86_64:byte-r->local+n info id n)
593 (let* ((n (+ (- 0 (* 8 id)) n))
596 `(,(if (< (abs n) #x80) `(,(string-append "mov____%" l ",0x8(%rbp)") (#:immediate1 ,n))
597 `(,(string-append "mov____%" l ",0x32(%rbp)") (#:immediate ,n))))))
599 (define (x86_64:word-r->local+n info id n)
600 (let* ((n (+ (- 0 (* 8 id)) n))
603 `(,(if (< (abs n) #x80) `(,(string-append "mov____%" x ",0x8(%rbp)") (#:immediate1 ,n))
604 `(,(string-append "mov____%" x ",0x32(%rbp)") (#:immediate ,n))))))
606 (define (x86_64:long-r->local+n info id n)
607 (let* ((n (+ (- 0 (* 8 id)) n))
610 `(,(if (< (abs n) #x80) `(,(string-append "mov____%" e ",0x8(%rbp)") (#:immediate1 ,n))
611 `(,(string-append "mov____%" e ",0x32(%rbp)") (#:immediate ,n))))))
613 (define (x86_64:r-and info v)
614 (let ((r (get-r info)))
617 `((,(string-append "and____$i32,%" r) (#:immediate ,v)))
618 `((,(string-append "mov____$i64,%r15") (#:immediate8 ,v))
619 (,(string-append "and____%r15,%" r))))))
621 (define (x86_64:push-r0 info)
622 (let ((r0 (get-r0 info)))
623 `((,(string-append "push___%" r0)))))
625 (define (x86_64:r1->r0 info)
626 (let ((r0 (get-r0 info))
628 `((,(string-append "mov____%" r1 ",%" r0)))))
630 (define (x86_64:pop-r0 info)
631 (let ((r0 (get-r0 info)))
632 `((,(string-append "pop____%" r0)))))
634 (define (x86_64:swap-r-stack info)
635 (let ((r (get-r info)))
636 `((,(string-append "xchg___%" r ",(%rsp)")))))
638 (define (x86_64:swap-r1-stack info)
639 (let ((r0 (get-r0 info)))
640 `((,(string-append "xchg___%" r0 ",(%rsp)")))))
642 (define (x86_64:r2->r0 info)
643 (let ((r0 (get-r0 info))
644 (allocated (.allocated info)))
645 (if (> (length allocated) 2)
646 (let ((r2 (cadddr allocated)))
647 `((,(string-append "mov____%" r2 ",%" r1))))
648 `((,(string-append "pop____%" r0))
649 (,(string-append "push___%" r0))))))
651 (define x86_64:instructions
653 (a?->r . ,x86_64:a?->r)
654 (ae?->r . ,x86_64:ae?->r)
655 (b?->r . ,x86_64:b?->r)
656 (be?->r . ,x86_64:be?->r)
657 (byte-mem->r . ,x86_64:byte-mem->r)
658 (byte-r . ,x86_64:byte-r)
659 (byte-r->local+n . ,x86_64:byte-r->local+n)
660 (byte-r0->r1-mem . ,x86_64:byte-r0->r1-mem)
661 (byte-r0->r1-mem . ,x86_64:byte-r0->r1-mem)
662 (byte-signed-r . ,x86_64:byte-signed-r)
663 (call-label . ,x86_64:call-label)
664 (call-r . ,x86_64:call-r)
665 (function-locals . ,x86_64:function-locals)
666 (function-preamble . ,x86_64:function-preamble)
667 (g?->r . ,x86_64:g?->r)
668 (ge?->r . ,x86_64:ge?->r)
669 (jump . ,x86_64:jump)
670 (jump-a . ,x86_64:jump-a)
671 (jump-ae . ,x86_64:jump-ae)
672 (jump-b . ,x86_64:jump-b)
673 (jump-be . ,x86_64:jump-be)
674 (jump-byte-z . ,x86_64:jump-byte-z)
675 (jump-g . , x86_64:jump-g)
676 (jump-ge . , x86_64:jump-ge)
677 (jump-l . ,x86_64:jump-l)
678 (jump-le . ,x86_64:jump-le)
679 (jump-nz . ,x86_64:jump-nz)
680 (jump-z . ,x86_64:jump-z)
681 (l?->r . ,x86_64:l?->r)
682 (label->arg . ,x86_64:label->arg)
683 (label->r . ,x86_64:label->r)
684 (label-mem->r . ,x86_64:label-mem->r)
685 (label-mem-add . ,x86_64:label-mem-add)
686 (le?->r . ,x86_64:le?->r)
687 (local->r . ,x86_64:local->r)
688 (local-add . ,x86_64:local-add)
689 (local-ptr->r . ,x86_64:local-ptr->r)
690 (long-mem->r . ,x86_64:long-mem->r)
691 (long-r . ,x86_64:long-r)
692 (long-r->local+n . ,x86_64:long-r->local+n)
693 (long-r0->r1-mem . ,x86_64:long-r0->r1-mem)
694 (long-signed-r . ,x86_64:long-signed-r)
695 (mem->r . ,x86_64:mem->r)
697 (not-r . ,x86_64:not-r)
698 (pop-r0 . ,x86_64:pop-r0)
699 (pop-register . ,x86_64:pop-register)
700 (push-r0 . ,x86_64:push-r0)
701 (push-register . ,x86_64:push-register)
702 (quad-r0->r1-mem . ,x86_64:r0->r1-mem)
704 (r+value . ,x86_64:r+value)
705 (r->arg . ,x86_64:r->arg)
706 (r->byte-label . ,x86_64:r->byte-label)
707 (r->label . ,x86_64:r->label)
708 (r->local . ,x86_64:r->local)
709 (r->local+n . ,x86_64:r->local+n)
710 (r->long-label . ,x86_64:r->long-label)
711 (r->word-label . ,x86_64:r->word-label)
712 (r-and . ,x86_64:r-and)
713 (r-byte-mem-add . ,x86_64:r-byte-mem-add)
714 (r-cmp-value . ,x86_64:r-cmp-value)
715 (r-long-mem-add . ,x86_64:r-long-mem-add)
716 (r-mem-add . ,x86_64:r-mem-add)
717 (r-negate . ,x86_64:r-negate)
718 (r-word-mem-add . ,x86_64:r-word-mem-add)
719 (r-zero? . ,x86_64:r-zero?)
720 (r0%r1 . ,x86_64:r0%r1)
721 (r0*r1 . ,x86_64:r0*r1)
722 (r0+r1 . ,x86_64:r0+r1)
723 (r0+value . ,x86_64:r0+value)
724 (r0->r1 . ,x86_64:r0->r1)
725 (r0->r1-mem . ,x86_64:r0->r1-mem)
726 (r0-and-r1 . ,x86_64:r0-and-r1)
727 (r0-mem->r1-mem . ,x86_64:r0-mem->r1-mem)
728 (r0-or-r1 . ,x86_64:r0-or-r1)
729 (r0-r1 . ,x86_64:r0-r1)
730 (r0-xor-r1 . ,x86_64:r0-xor-r1)
731 (r0/r1 . ,x86_64:r0/r1)
732 (r0<<r1 . ,x86_64:r0<<r1)
733 (r0>>r1 . ,x86_64:r0>>r1)
734 (r1->r0 . ,x86_64:r1->r0)
735 (r2->r0 . ,x86_64:r2->r0)
737 (return->r . ,x86_64:return->r)
738 (shl-r . ,x86_64:shl-r)
739 (swap-r-stack . ,x86_64:swap-r-stack)
740 (swap-r0-r1 . ,x86_64:swap-r0-r1)
741 (swap-r1-stack . ,x86_64:swap-r1-stack)
742 (test-r . ,x86_64:test-r)
743 (value->r . ,x86_64:value->r)
744 (value->r0 . ,x86_64:value->r0)
745 (word-mem->r . ,x86_64:word-mem->r)
746 (word-r . ,x86_64:word-r)
747 (word-r->local+n . ,x86_64:word-r->local+n)
748 (word-r0->r1-mem . ,x86_64:word-r0->r1-mem)
749 (word-signed-r . ,x86_64:word-signed-r)
750 (xor-zf . ,x86_64:xor-zf)
751 (zf->r . ,x86_64:zf->r)