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)
53 ("sub____$i32,%rbp" "%0x80")
55 '(("mov____%rdi,0x8(%rbp)" "!0x10")
56 ("mov____%rsi,0x8(%rbp)" "!0x18")
57 ("mov____%rdx,0x8(%rbp)" "!0x20")
58 ("mov____%rcx,0x8(%rbp)" "!0x28")
59 ("mov____%r8,0x8(%rbp)" "!0x30")
60 ("mov____%r9,0x8(%rbp)" "!0x38"))
61 (length (car rest)))))
64 (define (x86_64:function-preamble info . rest)
66 ("mov____%rsp,%rbp")))
68 (define (x86_64:function-locals . rest)
70 ;; FIXME: how on x86_64?
71 ("sub____$i32,%rsp" (#:immediate ,(+ (* 4 1025) (* 20 8))))
72 )) ; 4*1024 buf, 20 local vars
74 (define (x86_64:r->local info n)
75 (let ((r (get-r info))
77 `(,(if (< (abs n) #x80)
78 `(,(string-append "mov____%" r ",0x8(%rbp)") (#:immediate1 ,n))
79 `(,(string-append "mov____%" r ",0x32(%rbp)") (#:immediate ,n))))))
81 (define (x86_64:value->r info v)
82 (or v (error "invalid value: x86_64:value->r: " v))
83 (let ((r (get-r info)))
86 `((,(string-append "mov____$i32,%" r) (#:immediate ,v)))
87 `((,(string-append "mov____$i64,%" r) (#:immediate8 ,v))))))
90 (define (x86_64:ret . rest)
91 '(("add____$i32,%rbp" "%0x80")
97 (define (x86_64:ret . rest)
98 '(("mov____%rbp,%rsp")
102 (define (x86_64:r-zero? info)
103 (let ((r (car (if (pair? (.allocated info)) (.allocated info) (.registers info)))))
104 `((,(string-append "test___%" r "," "%" r)))))
106 (define (x86_64:local->r info n)
107 (let ((r (car (if (pair? (.allocated info)) (.allocated info) (.registers info))))
109 `(,(if (< (abs n) #x80) `(,(string-append "mov____0x8(%rbp),%" r) (#:immediate1 ,n))
110 `(,(string-append "mov____0x32(%rbp),%" r) (#:immediate ,n))))))
112 (define (x86_64:call-label info label n)
113 `((call32 (#:offset ,label))
114 ("add____$i8,%rsp" (#:immediate1 ,(* n 8))) ;; NOT AMD
117 (define x86_64:calling-convention-registers '("rax" "rdi" "rsi" "rdx" "rcx" "r8" "r9"))
120 (define (x86_64:r->arg info i)
121 (let ((r (get-r info))
122 (r1 (list-ref x86_64:calling-convention-registers (1+ i))))
123 `((,(string-append "mov____%" r ",%" r1))))) ; debug fail-safe check
125 (define (x86_64:label->arg info label i)
126 (let ((r0 (list-ref x86_64:registers (1+ i))))
127 (if (< (label v) #x80000000)
128 `((,(string-append "mov____$i32,%" r0) (#:address ,label)))
129 `((,(string-append "mov____$i64,%" r0) (#:address8 ,label))))))
132 (define (x86_64:r->arg info i)
133 (let ((r (get-r info)))
134 `((,(string-append "push___%" r)))))
136 (define (x86_64:label->arg info label i)
137 `(("push___$i32" (#:address ,label))))
140 ;; (define (x86_64:label->arg info label i)
141 ;; `((,(string-append "mov____$i64,%r15") (#:address8 ,label))
142 ;; ("push___%r15" (#:address ,label))))
144 (define (x86_64:r0+r1 info)
145 (let ((r1 (get-r1 info))
147 `((,(string-append "add____%" r1 ",%" r0)))))
149 (define (x86_64:r-negate info)
150 (let* ((r (get-r info))
152 `((,(string-append "sete___%" l))
153 (,(string-append "movzbq_%" l ",%" r)))))
155 (define (x86_64:r0-r1 info)
156 (let ((r0 (get-r0 info))
158 `((,(string-append "sub____%" r1 ",%" r0)))))
160 (define (x86_64:zf->r info)
161 (let* ((r (get-r info))
163 `((,(string-append "sete___%" l))
164 (,(string-append "movzbq_%" l ",%" r)))))
166 (define (x86_64:xor-zf info)
168 ("xor____$i8,%ah" (#:immediate1 #x40))
171 (define (x86_64:r->local+n info id n)
172 (let ((n (+ (- 0 (* 8 id)) n))
174 `(,(if (< (abs n) #x80) `(,(string-append "mov____%" r ",0x8(%rbp)") (#:immediate1 ,n))
175 `(,(string-append "mov____%" r ",0x32(%rbp)") (#:immediate ,n))))))
177 (define (x86_64:r-mem-add info v)
178 (let ((r (get-r info)))
179 `(,(if (< (abs v) #x80) `(,(string-append "add____$i8,(%" r ")") (#:immediate1 ,v))
180 `(,(string-append "add____$i32,(%" r ")") (#:immediate ,v)))))) ;; FIXME 64bit
182 (define (x86_64:r-byte-mem-add info v)
183 (let ((r (get-r info)))
184 `((,(string-append "addb___$i8,(%" r ")") (#:immediate1 ,v)))))
186 (define (x86_64:r-word-mem-add info v)
187 (let ((r (get-r info)))
188 `((,(string-append "addw___$i8,(%" r ")") (#:immediate2 ,v)))))
190 (define (x86_64:local-ptr->r info n)
191 (let ((r (get-r info)))
192 (let ((n (- 0 (* 8 n))))
193 `((,(string-append "mov____%rbp,%" r))
194 ,(if (< (abs n) #x80) `(,(string-append "add____$i8,%" r) (#:immediate1 ,n))
195 `(,(string-append "add____$i32,%" r) (#:immediate ,n))))))) ;; FIXME 64bit
197 (define (x86_64:label->r info label)
198 (let ((r (get-r info)))
199 `((,(string-append "mov____$i64,%" r) (#:address8 ,label)))))
201 (define (x86_64:r0->r1 info)
202 (let ((r0 (get-r0 info))
204 `((,(string-append "mov____%" r0 ",%" r1)))))
206 (define (x86_64:byte-mem->r info)
207 (let ((r (get-r info)))
208 `((,(string-append "movzbq_(%" r "),%" r)))))
210 (define (x86_64:byte-r info)
211 (let* ((r (get-r info))
213 `((,(string-append "movzbq_%" l ",%" r)))))
215 (define (x86_64:byte-signed-r info)
216 (let* ((r (get-r info))
218 `((,(string-append "movsbq_%" l ",%" r)))))
220 (define (x86_64:word-r info)
221 (let* ((r (get-r info))
223 `((,(string-append "movzwq_%" x ",%" r)))))
225 (define (x86_64:word-signed-r info)
226 (let* ((r (get-r info))
228 `((,(string-append "movswq_%" x ",%" r)))))
230 (define (x86_64:long-r info)
231 (let* ((r (get-r info))
233 `((,(string-append "movzlq_%" e ",%" r)))))
235 (define (x86_64:long-signed-r info)
236 (let* ((r (get-r info))
238 `((,(string-append "movslq_%" e ",%" r)))))
240 (define (x86_64:jump info label)
241 `(("jmp32 " (#:offset ,label))))
243 (define (x86_64:jump-nz info label)
244 `(("jne32 " (#:offset ,label))))
246 (define (x86_64:jump-z info label)
247 `(("je32 " (#:offset ,label))))
249 (define (x86_64:jump-byte-z info label)
251 ("je32 " (#:offset ,label))))
254 (define (x86_64:jump-g info label)
255 `(("jg32 " (#:offset ,label))))
257 (define (x86_64:jump-ge info label)
258 `(("jge32 " (#:offset ,label))))
260 (define (x86_64:jump-l info label)
261 `(("jl32 " (#:offset ,label))))
263 (define (x86_64:jump-le info label)
264 `(("jle32 " (#:offset ,label))))
267 (define (x86_64:jump-a info label)
268 `(("ja32 " (#:offset ,label))))
270 (define (x86_64:jump-ae info label)
271 `(("jae32 " (#:offset ,label))))
273 (define (x86_64:jump-b info label)
274 `(("jb32 " (#:offset ,label))))
276 (define (x86_64:jump-be info label)
277 `(("jbe32 " (#:offset ,label))))
279 (define (x86_64:byte-r0->r1-mem info)
280 (let* ((r0 (get-r0 info))
283 `((,(string-append "mov____%" l0 ",(%" r1 ")")))))
285 (define (x86_64:label-mem->r info label)
286 (let ((r (get-r info)))
287 `((,(string-append "mov____0x32,%" r) (#:address ,label)))))
289 (define (x86_64:word-mem->r info)
290 (let ((r (get-r info)))
291 `((,(string-append "movzwq_(%" r "),%" r)))))
293 (define (x86_64:long-mem->r info)
294 (let ((r (get-r info)))
295 `((,(string-append "movzlq_(%" r "),%" r)))))
297 (define (x86_64:mem->r info)
298 (let ((r (get-r info)))
299 `((,(string-append "mov____(%" r "),%" r)))))
301 (define (x86_64:local-add info n v)
302 (let ((n (- 0 (* 8 n))))
303 `(,(if (and (< (abs n) #x80)
304 (< (abs v) #x80)) `("add____$i8,0x8(%rbp)" (#:immediate1 ,n) (#:immediate1 ,v))
305 `("add____$i32,0x32(%rbp)" (#:immediate ,n) (#:immediate ,v)))))) ;; FIXME: 64b
307 (define (x86_64:label-mem-add info label v)
308 `(,(if (< (abs v) #x80) `("add____$i8,0x32" (#:address ,label) (#:immediate1 ,v))
309 `("add____$i32,0x32" (#:address ,label) (#:immediate ,v))))) ;; FIXME: 64b
311 (define (x86_64:nop info)
314 (define (x86_64:swap-r0-r1 info)
315 (let ((r0 (get-r0 info))
317 `((,(string-append "xchg___%" r0 ",%" r1)))))
320 (define (x86_64:g?->r info)
321 (let* ((r (get-r info))
323 `((,(string-append "setg___%" l))
324 (,(string-append "movzbq_%" l ",%" r)))))
326 (define (x86_64:ge?->r info)
327 (let* ((r (get-r info))
329 `((,(string-append "setge__%" l))
330 (,(string-append "movzbq_%" l ",%" r)))))
332 (define (x86_64:l?->r info)
333 (let* ((r (get-r info))
335 `((,(string-append "setl___%" l))
336 (,(string-append "movzbq_%" l ",%" r)))))
338 (define (x86_64:le?->r info)
339 (let* ((r (get-r info))
341 `((,(string-append "setle__%" l))
342 (,(string-append "movzbq_%" l ",%" r)))))
345 (define (x86_64:a?->r info)
346 (let* ((r (get-r info))
348 `((,(string-append "seta___%" l))
349 (,(string-append "movzbq_%" l ",%" r)))))
351 (define (x86_64:ae?->r info)
352 (let* ((r (get-r info))
354 `((,(string-append "setae__%" l))
355 (,(string-append "movzbq_%" l ",%" r)))))
357 (define (x86_64:b?->r info)
358 (let* ((r (get-r info))
360 `((,(string-append "setb___%" l))
361 (,(string-append "movzbq_%" l ",%" r)))))
363 (define (x86_64:be?->r info)
364 (let* ((r (get-r info))
366 `((,(string-append "setbe__%" l))
367 (,(string-append "movzbq_%" l ",%" r)))))
369 (define (x86_64:test-r info)
370 (let ((r (get-r info)))
371 `((,(string-append "test___%" r ",%" r)))))
373 (define (x86_64:r->label info label)
374 (let ((r (get-r info)))
375 `((,(string-append "mov____%" r ",0x32") (#:address ,label))))) ;; FIXME: 64 bits
377 (define (x86_64:r->byte-label info label)
378 (let* ((r (get-r info))
380 `((,(string-append "movb___%" l ",0x32") (#:address ,label)))))
382 (define (x86_64:r->word-label info label)
383 (let* ((r (get-r info))
385 `((,(string-append "movw___%" x ",0x32") (#:address ,label)))))
387 (define (x86_64:r->long-label info label)
388 (let* ((r (get-r info))
390 `((,(string-append "movl___%" e ",0x32") (#:address ,label)))))
392 (define (x86_64:call-r info n)
393 (let ((r (get-r info)))
394 `((,(string-append "call___*%" r))
395 ("add____$i8,%rsp" (#:immediate1 ,(* n 8)))))) ;; NOT AMD
397 (define (x86_64:r0*r1 info)
398 (let ((allocated (.allocated info))
401 (if (not (member "rdx" allocated))
402 `(,@(if (equal? r0 "rax") '()
404 ,(string-append "mov____%" r0 ",%rax"))))
405 (,(string-append "mul____%" r1))
406 ,@(if (equal? r0 "rax") '()
407 `((,(string-append "mov____%rax,%" r0)
412 (,(string-append "mov____%" r1 ",%rdi"))
413 (,(string-append "mov____%" r0 ",%rax"))
414 (,(string-append "mul____%" r1))
417 (,(string-append "mov____%rax,%" r0))
420 (define (x86_64:r0<<r1 info)
421 (let ((r0 (get-r0 info))
423 `((,(string-append "mov____%" r1 ",%rcx"))
424 (,(string-append "shl____%cl,%" r0)))))
426 (define (x86_64:r0>>r1 info)
427 (let ((r0 (get-r0 info))
429 `((,(string-append "mov____%" r1 ",%rcx"))
430 (,(string-append "shr____%cl,%" r0)))))
432 (define (x86_64:r0-and-r1 info)
433 (let ((r0 (get-r0 info))
435 `((,(string-append "and____%" r1 ",%" r0)))))
437 (define (x86_64:r0/r1 info signed?)
438 (let ((allocated (.allocated info))
441 (if (not (member "rdx" allocated))
442 `(,@(if (equal? r0 "rax") '()
444 (,(string-append "mov____%" r0 ",%rax"))))
445 ,(if signed? '("cqto") '("xor____%rdx,%rdx"))
446 (,(string-append "idiv___%" r1))
447 ,@(if (equal? r0 "rax") '()
448 `((,(string-append "mov____%rax,%" r0))
453 (,(string-append "mov____%" r1 ",%rdi"))
454 (,(string-append "mov____%" r0 ",%rax"))
455 ,(if signed? '("cqto") '("xor____%rdx,%rdx"))
456 (,(string-append "idiv___%rdi"))
459 (,(string-append "mov____%rax,%" r0))
462 (define (x86_64:r0%r1 info signed?)
463 (let ((allocated (.allocated info))
466 (if (not (member "rdx" allocated))
467 `(,@(if (equal? r0 "rax") '()
469 (,(string-append "mov____%" r0 ",%rax"))))
470 ,(if signed? '("cqto") '("xor____%rdx,%rdx"))
471 (,(string-append "idiv___%" r1))
472 (,(string-append "mov____%rdx,%" r0)))
476 (,(string-append "mov____%" r1 ",%rdi"))
477 (,(string-append "mov____%" r0 ",%rax"))
478 ,(if signed? '("cqto") '("xor____%rdx,%rdx"))
479 (,(string-append "idiv___%rdi"))
482 (,(string-append "mov____%rdx,%" r0))
485 (define (x86_64:r+value info v)
486 (let ((r (get-r info)))
487 (cond ((< (abs v) #x80)
488 `((,(string-append "add____$i8,%" r) (#:immediate1 ,v))))
489 ((< (abs v) #x80000000)
490 `((,(string-append "add____$i32,%" r) (#:immediate ,v))))
492 `((,(string-append "mov____$i64,%r15") (#:immediate8 ,v))
493 (,(string-append "add____%r15,%" r)))))))
495 (define (x86_64:r0->r1-mem info)
496 (let ((r0 (get-r0 info))
498 `((,(string-append "mov____%" r0 ",(%" r1 ")")))))
500 (define (x86_64:byte-r0->r1-mem info)
501 (let* ((r0 (get-r0 info))
504 `((,(string-append "mov____%" l0 ",(%" r1 ")")))))
506 (define (x86_64:word-r0->r1-mem info)
507 (let* ((r0 (get-r0 info))
510 `((,(string-append "mov____%" x0 ",(%" r1 ")")))))
512 (define (x86_64:long-r0->r1-mem info)
513 (let* ((r0 (get-r0 info))
516 `((,(string-append "mov____%" e0 ",(%" r1 ")")))))
518 (define (x86_64:r-cmp-value info v)
519 (let ((r (get-r info)))
520 (cond ((< (abs v) #x80)
521 `((,(string-append "cmp____$i8,%" r) (#:immediate1 ,v))))
524 `((,(string-append "cmp____$i32,%" r) (#:immediate ,v))))
526 `(,(string-append "mov____$i64,%r15") (#:immediate8 ,v)
527 ,(string-append "cmp____%r15,%" r))))))
529 (define (x86_64:push-register info r)
530 `((,(string-append "push___%" r))))
532 (define (x86_64:pop-register info r)
533 `((,(string-append "pop____%" r))))
535 (define (x86_64:return->r info)
536 (let ((r (car (.allocated info))))
537 (if (equal? r "rax") '()
538 `((,(string-append "mov____%rax,%" r))))))
540 (define (x86_64:r0-or-r1 info)
541 (let ((r0 (get-r0 info))
543 `((,(string-append "or_____%" r1 ",%" r0)))))
545 (define (x86_64:shl-r info n)
546 (let ((r (get-r info)))
547 `((,(string-append "shl____$i8,%" r) (#:immediate1 ,n)))))
549 (define (x86_64:r+r info)
550 (let ((r (get-r info)))
551 `((,(string-append "add____%" r ",%" r)))))
553 (define (x86_64:not-r info)
554 (let ((r (get-r info)))
555 `((,(string-append "not____%" r)))))
557 (define (x86_64:r0-xor-r1 info)
558 (let ((r0 (get-r0 info))
560 `((,(string-append "xor____%" r1 ",%" r0)))))
562 (define (x86_64:r0-mem->r1-mem info)
563 (let* ((registers (.registers info))
566 (r2 (car registers)))
567 `((,(string-append "mov____(%" r0 "),%" r2))
568 (,(string-append "mov____%" r2 ",(%" r1 ")")))))
570 (define (x86_64:byte-r0-mem->r1-mem info)
571 (let* ((registers (.registers info))
576 `((,(string-append "mov____(%" r0 "),%" l2))
577 (,(string-append "mov____%" l2 ",(%" r1 ")")))))
579 (define (x86_64:word-r0-mem->r1-mem info)
580 (let* ((registers (.registers info))
585 `((,(string-append "mov____(%" r0 "),%" x2))
586 (,(string-append "mov____%" x2 ",(%" r1 ")")))))
588 (define (x86_64:long-r0-mem->r1-mem info)
589 (let* ((registers (.registers info))
594 `((,(string-append "mov____(%" r0 "),%" e2))
595 (,(string-append "mov____%" e2 ",(%" r1 ")")))))
597 (define (x86_64:r0+value info v)
598 (let ((r0 (get-r0 info)))
599 `(,(if (< (abs v) #x80) `(,(string-append "add____$i8,%" r0) (#:immediate1 ,v))
600 `(,(string-append "add____$i32,%" r0) (#:immediate ,v)))))) ; FIXME: 64bit
602 (define (x86_64:value->r0 info v)
603 (let ((r0 (get-r0 info)))
604 `((,(string-append "mov____$i32,%" r0) (#:immediate ,v)))))
606 (define (x86_64:r-long-mem-add info v)
607 (let ((r (get-r info)))
608 (cond ((< (abs v) #x80)
609 `((,(string-append "addl___$i8,(%" r ")") (#:immediate1 ,v))))
612 `((,(string-append "addl___$i32,(%" r ")") (#:immediate ,v))))
614 `((,(string-append "mov____$i64,%r15") (#:immediate8 ,v))
615 (,(string-append "add____%r15,(%" r ")")))))))
617 (define (x86_64:byte-r->local+n info id n)
618 (let* ((n (+ (- 0 (* 8 id)) n))
621 `(,(if (< (abs n) #x80) `(,(string-append "mov____%" l ",0x8(%rbp)") (#:immediate1 ,n))
622 `(,(string-append "mov____%" l ",0x32(%rbp)") (#:immediate ,n))))))
624 (define (x86_64:word-r->local+n info id n)
625 (let* ((n (+ (- 0 (* 8 id)) n))
628 `(,(if (< (abs n) #x80) `(,(string-append "mov____%" x ",0x8(%rbp)") (#:immediate1 ,n))
629 `(,(string-append "mov____%" x ",0x32(%rbp)") (#:immediate ,n))))))
631 (define (x86_64:long-r->local+n info id n)
632 (let* ((n (+ (- 0 (* 8 id)) n))
635 `(,(if (< (abs n) #x80) `(,(string-append "mov____%" e ",0x8(%rbp)") (#:immediate1 ,n))
636 `(,(string-append "mov____%" e ",0x32(%rbp)") (#:immediate ,n))))))
638 (define (x86_64:r-and info v)
639 (let ((r (get-r info)))
642 `((,(string-append "and____$i32,%" r) (#:immediate ,v)))
643 `((,(string-append "mov____$i64,%r15") (#:immediate8 ,v))
644 (,(string-append "and____%r15,%" r))))))
646 (define (x86_64:push-r0 info)
647 (let ((r0 (get-r0 info)))
648 `((,(string-append "push___%" r0)))))
650 (define (x86_64:r1->r0 info)
651 (let ((r0 (get-r0 info))
653 `((,(string-append "mov____%" r1 ",%" r0)))))
655 (define (x86_64:pop-r0 info)
656 (let ((r0 (get-r0 info)))
657 `((,(string-append "pop____%" r0)))))
659 (define (x86_64:swap-r-stack info)
660 (let ((r (get-r info)))
661 `((,(string-append "xchg___%" r ",(%rsp)")))))
663 (define (x86_64:swap-r1-stack info)
664 (let ((r0 (get-r0 info)))
665 `((,(string-append "xchg___%" r0 ",(%rsp)")))))
667 (define (x86_64:r2->r0 info)
668 (let ((r0 (get-r0 info))
669 (allocated (.allocated info)))
670 (if (> (length allocated) 2)
671 (let ((r2 (cadddr allocated)))
672 `((,(string-append "mov____%" r2 ",%" r1))))
673 `((,(string-append "pop____%" r0))
674 (,(string-append "push___%" r0))))))
676 (define x86_64:instructions
678 (a?->r . ,x86_64:a?->r)
679 (ae?->r . ,x86_64:ae?->r)
680 (b?->r . ,x86_64:b?->r)
681 (be?->r . ,x86_64:be?->r)
682 (byte-mem->r . ,x86_64:byte-mem->r)
683 (byte-r . ,x86_64:byte-r)
684 (byte-r->local+n . ,x86_64:byte-r->local+n)
685 (byte-r0->r1-mem . ,x86_64:byte-r0->r1-mem)
686 (byte-r0-mem->r1-mem . ,x86_64:byte-r0-mem->r1-mem)
687 (byte-signed-r . ,x86_64:byte-signed-r)
688 (call-label . ,x86_64:call-label)
689 (call-r . ,x86_64:call-r)
690 (function-locals . ,x86_64:function-locals)
691 (function-preamble . ,x86_64:function-preamble)
692 (g?->r . ,x86_64:g?->r)
693 (ge?->r . ,x86_64:ge?->r)
694 (jump . ,x86_64:jump)
695 (jump-a . ,x86_64:jump-a)
696 (jump-ae . ,x86_64:jump-ae)
697 (jump-b . ,x86_64:jump-b)
698 (jump-be . ,x86_64:jump-be)
699 (jump-byte-z . ,x86_64:jump-byte-z)
700 (jump-g . , x86_64:jump-g)
701 (jump-ge . , x86_64:jump-ge)
702 (jump-l . ,x86_64:jump-l)
703 (jump-le . ,x86_64:jump-le)
704 (jump-nz . ,x86_64:jump-nz)
705 (jump-z . ,x86_64:jump-z)
706 (l?->r . ,x86_64:l?->r)
707 (label->arg . ,x86_64:label->arg)
708 (label->r . ,x86_64:label->r)
709 (label-mem->r . ,x86_64:label-mem->r)
710 (label-mem-add . ,x86_64:label-mem-add)
711 (le?->r . ,x86_64:le?->r)
712 (local->r . ,x86_64:local->r)
713 (local-add . ,x86_64:local-add)
714 (local-ptr->r . ,x86_64:local-ptr->r)
715 (long-mem->r . ,x86_64:long-mem->r)
716 (long-r . ,x86_64:long-r)
717 (long-r->local+n . ,x86_64:long-r->local+n)
718 (long-r0->r1-mem . ,x86_64:long-r0->r1-mem)
719 (long-r0-mem->r1-mem . ,x86_64:long-r0-mem->r1-mem)
720 (long-signed-r . ,x86_64:long-signed-r)
721 (mem->r . ,x86_64:mem->r)
723 (not-r . ,x86_64:not-r)
724 (pop-r0 . ,x86_64:pop-r0)
725 (pop-register . ,x86_64:pop-register)
726 (push-r0 . ,x86_64:push-r0)
727 (push-register . ,x86_64:push-register)
728 (quad-r0->r1-mem . ,x86_64:r0->r1-mem)
730 (r+value . ,x86_64:r+value)
731 (r->arg . ,x86_64:r->arg)
732 (r->byte-label . ,x86_64:r->byte-label)
733 (r->label . ,x86_64:r->label)
734 (r->local . ,x86_64:r->local)
735 (r->local+n . ,x86_64:r->local+n)
736 (r->long-label . ,x86_64:r->long-label)
737 (r->word-label . ,x86_64:r->word-label)
738 (r-and . ,x86_64:r-and)
739 (r-byte-mem-add . ,x86_64:r-byte-mem-add)
740 (r-cmp-value . ,x86_64:r-cmp-value)
741 (r-long-mem-add . ,x86_64:r-long-mem-add)
742 (r-mem-add . ,x86_64:r-mem-add)
743 (r-negate . ,x86_64:r-negate)
744 (r-word-mem-add . ,x86_64:r-word-mem-add)
745 (r-zero? . ,x86_64:r-zero?)
746 (r0%r1 . ,x86_64:r0%r1)
747 (r0*r1 . ,x86_64:r0*r1)
748 (r0+r1 . ,x86_64:r0+r1)
749 (r0+value . ,x86_64:r0+value)
750 (r0->r1 . ,x86_64:r0->r1)
751 (r0->r1-mem . ,x86_64:r0->r1-mem)
752 (r0-and-r1 . ,x86_64:r0-and-r1)
753 (r0-mem->r1-mem . ,x86_64:r0-mem->r1-mem)
754 (r0-or-r1 . ,x86_64:r0-or-r1)
755 (r0-r1 . ,x86_64:r0-r1)
756 (r0-xor-r1 . ,x86_64:r0-xor-r1)
757 (r0/r1 . ,x86_64:r0/r1)
758 (r0<<r1 . ,x86_64:r0<<r1)
759 (r0>>r1 . ,x86_64:r0>>r1)
760 (r1->r0 . ,x86_64:r1->r0)
761 (r2->r0 . ,x86_64:r2->r0)
763 (return->r . ,x86_64:return->r)
764 (shl-r . ,x86_64:shl-r)
765 (swap-r-stack . ,x86_64:swap-r-stack)
766 (swap-r0-r1 . ,x86_64:swap-r0-r1)
767 (swap-r1-stack . ,x86_64:swap-r1-stack)
768 (test-r . ,x86_64:test-r)
769 (value->r . ,x86_64:value->r)
770 (value->r0 . ,x86_64:value->r0)
771 (word-mem->r . ,x86_64:word-mem->r)
772 (word-r . ,x86_64:word-r)
773 (word-r->local+n . ,x86_64:word-r->local+n)
774 (word-r0->r1-mem . ,x86_64:word-r0->r1-mem)
775 (word-r0-mem->r1-mem . ,x86_64:word-r0-mem->r1-mem)
776 (word-signed-r . ,x86_64:word-signed-r)
777 (xor-zf . ,x86_64:xor-zf)
778 (zf->r . ,x86_64:zf->r)