mescc: Another attempt at divide.
[mes.git] / module / mescc / i386 / as.scm
1 ;;; GNU Mes --- Maxwell Equations of Software
2 ;;; Copyright © 2016,2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
3 ;;;
4 ;;; This file is part of GNU Mes.
5 ;;;
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.
10 ;;;
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.
15 ;;;
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/>.
18
19 ;;; Commentary:
20
21 ;;; define i386 assembly
22
23 ;;; Code:
24
25 (define-module (mescc i386 as)
26   #:use-module (mes guile)
27   #:use-module (mescc as)
28   #:use-module (mescc info)
29   #:export (
30             i386:instructions
31             ))
32
33 (define (e->x o)
34   (string-drop o 1))
35
36 (define (e->l o)
37   (string-append (string-drop-right (string-drop o 1) 1) "l"))
38
39
40 (define (i386:function-preamble . rest)
41   '(("push___%ebp")
42     ("mov____%esp,%ebp")))
43
44 (define (i386:function-locals . rest)
45   `(("sub____$i32,%esp" (#:immediate ,(+ (* 4 1025) (* 20 4)))))) ; 4*1024 buf, 20 local vars
46
47 (define (i386:r->local info n)
48   (or n (error "invalid value: i386:r->local: " n))
49   (let ((r (get-r info))
50         (n (- 0 (* 4 n))))
51     `(,(if (< (abs n) #x80) `(,(string-append "mov____%" r ",0x8(%ebp)") (#:immediate1 ,n))
52            `(,(string-append "mov____%" r ",0x32(%ebp)") (#:immediate ,n))))))
53
54 (define (i386:value->r info v)
55   (let ((r (get-r info)))
56     `((,(string-append "mov____$i32,%" r) (#:immediate ,v)))))
57
58 (define (i386:ret . rest)
59   '(("leave")
60     ("ret")))
61
62 (define (i386:r-zero? info)
63   (let ((r (get-r info)))
64     `((,(string-append "test___%" r "," "%" r)))))
65
66 (define (i386:local->r info n)
67   (let ((r (get-r info))
68         (n (- 0 (* 4 n))))
69     `(,(if (< (abs n) #x80) `(,(string-append "mov____0x8(%ebp),%" r) (#:immediate1 ,n))
70            `(,(string-append "mov____0x32(%ebp),%" r) (#:immediate ,n))))))
71
72 (define (i386:r0+r1 info)
73   (let ((r0 (get-r0 info))
74         (r1 (get-r1 info)))
75     `((,(string-append "add____%" r1 ",%" r0)))))
76
77 (define (i386:call-label info label n)
78   `((call32 (#:offset ,label))
79     ("add____$i8,%esp" (#:immediate1 ,(* n 4)))))
80
81 (define (i386:r->arg info i)
82   (let ((r (get-r info)))
83     `((,(string-append "push___%" r)))))
84
85 (define (i386:label->arg info label i)
86   `(("push___$i32" (#:address ,label))))
87
88 (define (i386:r-negate info)
89   (let* ((r (get-r info))
90          (l (e->l r)))
91     `((,(string-append "sete___%" l))
92       (,(string-append "movzbl_%" l ",%" r)))))
93
94 (define (i386:r0-r1 info)
95   (let ((r0 (get-r0 info))
96         (r1 (get-r1 info)))
97     `((,(string-append "sub____%" r1 ",%" r0)))))
98
99 (define (i386:zf->r info)
100   (let* ((r (get-r info))
101          (l (e->l r)))
102     `((,(string-append "sete___%" l))
103       (,(string-append "movzbl_%" l ",%" r)))))
104
105 (define (i386:xor-zf info)
106   '(("lahf")
107     ("xor____$i8,%ah" (#:immediate1 #x40))
108     ("sahf")))
109
110 (define (i386:r->local+n info id n)
111   (let ((n (+ (- 0 (* 4 id)) n))
112         (r (get-r info)))
113     `(,(if (< (abs n) #x80) `(,(string-append "mov____%" r ",0x8(%ebp)") (#:immediate1 ,n))
114            `(,(string-append "mov____%" r ",0x32(%ebp)") (#:immediate ,n))))))
115
116 (define (i386:r-mem-add info v)
117   (let ((r (get-r info)))
118     `(,(if (< (abs v) #x80) `(,(string-append "add____$i8,(%" r ")") (#:immediate1 ,v))
119            `(,(string-append "add____$i32,(%" r ")") (#:immediate ,v))))))
120
121 (define (i386:r-byte-mem-add info v)
122   (let ((r (get-r info)))
123     `((,(string-append "addb___$i8,(%" r ")") (#:immediate1 ,v)))))
124
125 (define (i386:r-word-mem-add info v)
126   (let ((r (get-r info)))
127     `((,(string-append "addw___$i8,(%" r ")") (#:immediate2 ,v)))))
128
129 (define (i386:local-ptr->r info n)
130   (let ((r (get-r info)))
131     (let ((n (- 0 (* 4 n))))
132       `((,(string-append "mov____%ebp,%" r))
133         ,(if (< (abs n) #x80) `(,(string-append "add____$i8,%" r) (#:immediate1 ,n))
134              `(,(string-append "add____$i32,%" r)  (#:immediate ,n)))))))
135
136 (define (i386:label->r info label)
137   (let ((r (get-r info)))
138     `((,(string-append "mov____$i32,%" r) (#:address ,label)))))
139
140 (define (i386:r0->r1 info)
141   (let ((r0 (get-r0 info))
142         (r1 (get-r1 info)))
143     `((,(string-append  "mov____%" r0 ",%" r1)))))
144
145 (define (i386:byte-mem->r info)
146   (let ((r (get-r info)))
147     `((,(string-append "movzbl_(%" r "),%" r)))))
148
149 (define (i386:byte-r info)
150   (let* ((r (get-r info))
151          (l (e->l r)))
152     `((,(string-append "movzbl_%" l ",%" r)))))
153
154 (define (i386:byte-signed-r info)
155   (let* ((r (get-r info))
156          (l (e->l r)))
157     `((,(string-append "movsbl_%" l ",%" r)))))
158
159 (define (i386:word-r info)
160   (let* ((r (get-r info))
161          (x (e->x r)))
162     `((,(string-append "movzwl_%" x ",%" r)))))
163
164 (define (i386:word-signed-r info)
165   (let* ((r (get-r info))
166          (x (e->x r)))
167     `((,(string-append "movswl_%" x ",%" r)))))
168
169 (define (i386:jump info label)
170   `(("jmp32 " (#:offset ,label))))
171
172 (define (i386:jump-z info label)
173   `(("je32  " (#:offset ,label))))
174
175 (define (i386:jump-nz info label)
176   `(("jne32 " (#:offset ,label))))
177
178 (define (i386:jump-byte-z info label)
179   `(("test___%al,%al")
180     ("je32  " (#:offset ,label))))
181
182 ;; signed
183 (define (i386:jump-g info label)
184   `(("jg32  " (#:offset ,label))))
185
186 (define (i386:jump-ge info label)
187   `(("jge32 " (#:offset ,label))))
188
189 (define (i386:jump-l info label)
190   `(("jl32  " (#:offset ,label))))
191
192 (define (i386:jump-le info label)
193   `(("jle32 " (#:offset ,label))))
194
195 ;; unsigned
196 (define (i386:jump-a info label)
197   `(("ja32  " (#:offset ,label))))
198
199 (define (i386:jump-ae info label)
200   `(("jae32 " (#:offset ,label))))
201
202 (define (i386:jump-b info label)
203   `(("jb32  " (#:offset ,label))))
204
205 (define (i386:jump-be info label)
206   `(("jbe32 " (#:offset ,label))))
207
208 (define (i386:byte-r0->r1-mem info)
209   (let* ((r0 (get-r0 info))
210          (r1 (get-r1 info))
211          (l0 (e->l r0)))
212     `((,(string-append "mov____%" l0 ",(%" r1 ")")))))
213
214 (define (i386:label-mem->r info label)
215   (let ((r (get-r info)))
216     `((,(string-append "mov____0x32,%" r) (#:address ,label)))))
217
218 (define (i386:word-mem->r info)
219   (let ((r (get-r info)))
220     `((,(string-append "movzwl_(%" r "),%" r)))))
221
222 (define (i386:mem->r info)
223   (let ((r (get-r info)))
224     `((,(string-append "mov____(%" r "),%" r)))))
225
226 (define (i386:local-add info n v)
227   (let ((n (- 0 (* 4 n))))
228     `(,(if (and (< (abs n) #x80)
229                 (< (abs v) #x80)) `("add____$i8,0x8(%ebp)" (#:immediate1 ,n) (#:immediate1 ,v))
230                 `("add____$i32,0x32(%ebp)" (#:immediate ,n) (#:immediate ,v))))))
231
232 (define (i386:label-mem-add info label v)
233   `(,(if (< (abs v) #x80) `("add____$i8,0x32" (#:address ,label) (#:immediate1 ,v))
234          `("add____$i32,0x32" (#:address ,label) (#:immediate ,v)))))
235
236 (define (i386:nop info)
237   '(("nop")))
238
239 (define (i386:swap-r0-r1 info)
240   (let ((r0 (get-r0 info))
241         (r1 (get-r1 info)))
242     `((,(string-append "xchg___%" r0 ",%" r1)))))
243
244 ;; signed
245 (define (i386:g?->r info)
246   (let* ((r (get-r info))
247          (l (e->l r)))
248     `((,(string-append "setg___%" l))
249       (,(string-append "movzbl_%" l ",%" r)))))
250
251 (define (i386:ge?->r info)
252   (let* ((r (get-r info))
253          (l (e->l r)))
254     `((,(string-append "setge__%" l))
255       (,(string-append "movzbl_%" l ",%" r)))))
256
257 (define (i386:l?->r info)
258   (let* ((r (get-r info))
259          (l (e->l r)))
260     `((,(string-append "setl___%" l))
261       (,(string-append "movzbl_%" l ",%" r)))))
262
263 (define (i386:le?->r info)
264   (let* ((r (get-r info))
265          (l (e->l r)))
266     `((,(string-append "setle__%" l))
267       (,(string-append "movzbl_%" l ",%" r)))))
268
269 ;; unsigned
270 (define (i386:a?->r info)
271   (let* ((r (get-r info))
272          (l (e->l r)))
273     `((,(string-append "seta___%" l))
274       (,(string-append "movzbl_%" l ",%" r)))))
275
276 (define (i386:ae?->r info)
277   (let* ((r (get-r info))
278          (l (e->l r)))
279     `((,(string-append "setae__%" l))
280       (,(string-append "movzbl_%" l ",%" r)))))
281
282 (define (i386:b?->r info)
283   (let* ((r (get-r info))
284          (l (e->l r)))
285     `((,(string-append "setb___%" l))
286       (,(string-append "movzbl_%" l ",%" r)))))
287
288 (define (i386:be?->r info)
289   (let* ((r (get-r info))
290          (l (e->l r)))
291     `((,(string-append "setbe__%" l))
292       (,(string-append "movzbl_%" l ",%" r)))))
293
294 (define (i386:test-r info)
295   (let ((r (get-r info)))
296     `((,(string-append "test___%" r ",%" r)))))
297
298 (define (i386:r->label info label)
299   (let ((r (get-r info)))
300     `((,(string-append "mov____%" r ",0x32") (#:address ,label)))))
301
302 (define (i386:r->byte-label info label)
303   (let* ((r (get-r info))
304          (l (e->l r)))
305     `((,(string-append "movb___%" l ",0x32") (#:address ,label)))))
306
307 (define (i386:r->word-label info label)
308   (let* ((r (get-r info))
309         (x (e->x r)))
310     `((,(string-append "movw___%" x ",0x32") (#:address ,label)))))
311
312 (define (i386:call-r info n)
313   (let ((r (get-r info)))
314     `((,(string-append "call___*%" r))
315       ("add____$i8,%esp" (#:immediate1  ,(* n 4))))))
316
317 (define (i386:r0*r1 info)
318   (let ((allocated (.allocated info))
319         (r0 (get-r0 info))
320         (r1 (get-r1 info)))
321     (if (not (member "edx" allocated))
322         `(,@(if (equal? r0 "eax") '()
323                 `(("push___%eax")
324                   (,(string-append "mov____%" r0 ",%eax"))))
325           (,(string-append "mul____%" r1))
326           ,@(if (equal? r0 "eax") '()
327                 `((,(string-append "mov____%eax,%" r0))
328                   ("pop____%eax"))))
329         `(("push___%eax")
330           ("push___%ebx")
331           ("push___%edx")
332           (,(string-append "mov____%" r1 ",%ebx"))
333           (,(string-append "mov____%" r0 ",%eax"))
334           (,(string-append "mul____%" r1))
335           ("pop____%edx")
336           ("pop____%ebx")
337           (,(string-append "mov____%eax,%" r0))
338           ("pop____%eax")))))
339
340 (define (i386:r0<<r1 info)
341   (let ((r0 (get-r0 info))
342         (r1 (get-r1 info)))
343     `((,(string-append "mov____%" r1 ",%ecx"))
344       (,(string-append "shl____%cl,%" r0)))))
345
346 (define (i386:r0>>r1 info)
347   (let ((r0 (get-r0 info))
348         (r1 (get-r1 info)))
349     `((,(string-append "mov____%" r1 ",%ecx"))
350       (,(string-append "shr____%cl,%" r0)))))
351
352 (define (i386:r0-and-r1 info)
353   (let ((r0 (get-r0 info))
354         (r1 (get-r1 info)))
355     `((,(string-append "and____%" r1 ",%" r0)))))
356
357 (define (i386:r0/r1 info signed?)
358   (let ((signed? #f)              ; nobody knows, -- all advice are belong to us?
359         (allocated (.allocated info))
360         (r0 (get-r0 info))
361         (r1 (get-r1 info)))
362     (if (not (member "edx" allocated))
363         `(,@(if (equal? r0 "eax") '()
364                 `(("push___%eax")
365                   (,(string-append "mov____%" r0 ",%eax"))))
366           ,(if signed? '("cltd") '("xor____%edx,%edx"))
367           ,(if signed? `(,(string-append "idiv___%" r1)) `(,(string-append "div___%" r1)))
368           ,@(if (equal? r0 "eax") '()
369                 `((,(string-append "mov____%eax,%" r0))
370                   ("pop____%eax"))))
371         `(("push___%eax")
372           ("push___%ebx")
373           ("push___%edx")
374           (,(string-append "mov____%" r1 ",%ebx"))
375           (,(string-append "mov____%" r0 ",%eax"))
376           ,(if signed? '("cltd") '("xor____%edx,%edx"))
377           ,(if signed? `(,(string-append "idiv___%ebx")) `(,(string-append "div___%ebx")))
378           ("pop____%edx")
379           ("pop____%ebx")
380           (,(string-append "mov____%eax,%" r0))
381           ("pop____%eax")))))
382
383 (define (i386:r0%r1 info signed?)
384   (let ((signed? #f)              ; nobody knows, -- all advice are belong to us?
385         (allocated (.allocated info))
386         (r0 (get-r0 info))
387         (r1 (get-r1 info)))
388     (if (not (member "edx" allocated))
389         `(,@(if (equal? r0 "eax") '()
390                 `(("push___%eax")
391                   (,(string-append "mov____%" r0 ",%eax"))))
392           ,(if signed? '("cltd") '("xor____%edx,%edx"))
393           ,(if signed? `(,(string-append "idiv___%" r1)) `(,(string-append "div___%" r1)))
394           (,(string-append "mov____%edx,%" r0)))
395         `(("push___%eax")
396           ("push___%ebx")
397           ("push___%edx")
398           (,(string-append "mov____%" r1 ",%ebx"))
399           (,(string-append "mov____%" r0 ",%eax"))
400           ,(if signed? '("cltd") '("xor____%edx,%edx"))
401           ,(if signed? `(,(string-append "idiv___%ebx")) `(,(string-append "div___%ebx")))
402           ("pop____%edx")
403           ("pop____%ebx")
404           (,(string-append "mov____%edx,%" r0))
405           ("pop____%eax")))))
406
407 (define (i386:r+value info v)
408   (let ((r (get-r info)))
409     `(,(if (< (abs v) #x80) `(,(string-append "add____$i8,%" r) (#:immediate1 ,v))
410            `(,(string-append "add____$i32,%" r) (#:immediate ,v))))))
411
412 (define (i386:r0->r1-mem info)
413   (let ((r0 (get-r0 info))
414          (r1 (get-r1 info)))
415     `((,(string-append "mov____%" r0 ",(%" r1 ")")))))
416
417 (define (i386:byte-r0->r1-mem info)
418   (let* ((r0 (get-r0 info))
419          (r1 (get-r1 info))
420          (l0 (e->l r0)))
421     `((,(string-append "mov____%" l0 ",(%" r1 ")")))))
422
423 (define (i386:word-r0->r1-mem info)
424   (let* ((r0 (get-r0 info))
425          (r1 (get-r1 info))
426          (x0 (e->x r0)))
427     `((,(string-append "mov____%" x0 ",(%" r1 ")")))))
428
429 (define (i386:r-cmp-value info v)
430   (let ((r (get-r info)))
431     `(,(if (< (abs v) #x80) `(,(string-append "cmp____$i8,%" r) (#:immediate1 ,v))
432            `(,(string-append "cmp____$i32,%" r) (#:immediate ,v))))))
433
434 (define (i386:push-register info r)
435   `((,(string-append "push___%" r))))
436
437 (define (i386:pop-register info r)
438   `((,(string-append "pop____%" r))))
439
440 (define (i386:return->r info)
441   (let ((r (get-r info)))
442     (if (equal? r "eax") '()
443         `((,(string-append "mov____%eax,%" r))))))
444
445 (define (i386:r0-or-r1 info)
446   (let ((r0 (get-r0 info))
447         (r1 (get-r1 info)))
448     `((,(string-append "or_____%" r1 ",%" r0)))))
449
450 (define (i386:shl-r info n)
451   (let ((r (get-r info)))
452     `((,(string-append "shl____$i8,%" r) (#:immediate1 ,n)))))
453
454 (define (i386:r+r info)
455   (let ((r (get-r info)))
456     `((,(string-append "add____%" r ",%" r)))))
457
458 (define (i386:not-r info)
459   (let ((r (get-r info)))
460     `((,(string-append "not____%" r)))))
461
462 (define (i386:r0-xor-r1 info)
463   (let ((r0 (get-r0 info))
464         (r1 (get-r1 info)))
465     `((,(string-append "xor____%" r1 ",%" r0)))))
466
467 (define (i386:r0-mem->r1-mem info)
468   (let* ((registers (.registers info))
469          (r0 (get-r0 info))
470          (r1 (get-r1 info))
471          (r2 (car registers)))
472     `((,(string-append "mov____(%" r0 "),%" r2))
473       (,(string-append "mov____%" r2 ",(%" r1 ")")))))
474
475 (define (i386:byte-r0-mem->r1-mem info)
476   (let* ((registers (.registers info))
477          (r0 (get-r0 info))
478          (r1 (get-r1 info))
479          (r2 (car registers))
480          (l2 (e->l r2)))
481     `((,(string-append "mov____(%" r0 "),%" l2))
482       (,(string-append "mov____%" l2 ",(%" r1 ")")))))
483
484 (define (i386:word-r0-mem->r1-mem info)
485   (let* ((registers (.registers info))
486          (r0 (get-r0 info))
487          (r1 (get-r1 info))
488          (r2 (car registers))
489          (x2 (e->x r2)))
490     `((,(string-append "mov____(%" r0 "),%" x2))
491       (,(string-append "mov____%" x2 ",(%" r1 ")")))))
492
493 (define (i386:r0+value info v)
494   (let ((r0 (get-r0 info)))
495     `(,(if (< (abs v) #x80) `(,(string-append "add____$i8,%" r0) (#:immediate1 ,v))
496            `(,(string-append "add____$i32,%" r0) (#:immediate ,v))))))
497
498 (define (i386:value->r0 info v)
499   (let ((r0 (get-r0 info)))
500     `((,(string-append "mov____$i32,%" r0) (#:immediate ,v)))))
501
502 (define (i386:byte-r->local+n info id n)
503   (let* ((n (+ (- 0 (* 4 id)) n))
504          (r (get-r info))
505          (l (e->l r) ))
506     `(,(if (< (abs n) #x80) `(,(string-append "mov____%" l ",0x8(%ebp)") (#:immediate1 ,n))
507            `(,(string-append "mov____%" l ",0x32(%ebp)") (#:immediate ,n))))))
508
509 (define (i386:word-r->local+n info id n)
510   (let* ((n (+ (- 0 (* 4 id)) n))
511          (r (get-r info))
512          (x (e->x r)))
513     `(,(if (< (abs n) #x80) `(,(string-append "mov____%" x ",0x8(%ebp)") (#:immediate1 ,n))
514            `(,(string-append "mov____%" x ",0x32(%ebp)") (#:immediate ,n))))))
515
516 (define (i386:r-and info v)
517   (let ((r (get-r info)))
518     `((,(string-append "and____$i32,%" r) (#:immediate ,v)))))
519
520 (define (i386:push-r0 info)
521   (let ((r0 (get-r0 info)))
522     `((,(string-append "push___%" r0)))))
523
524 (define (i386:r1->r0 info)
525   (let ((r0 (get-r0 info))
526         (r1 (get-r1 info)))
527     `((,(string-append  "mov____%" r1 ",%" r0)))))
528
529 (define (i386:pop-r0 info)
530   (let ((r0 (get-r0 info)))
531     `((,(string-append "pop____%" r0)))))
532
533 (define (i386:swap-r-stack info)
534   (let ((r (get-r info)))
535     `((,(string-append "xchg___%" r ",(%esp)")))))
536
537 (define (i386:swap-r1-stack info)
538   (let ((r0 (get-r0 info)))
539     `((,(string-append "xchg___%" r0 ",(%esp)")))))
540
541 (define (i386:r2->r0 info)
542   (let ((r0 (get-r0 info))
543         (allocated (.allocated info)))
544     (if (> (length allocated) 2)
545         (let ((r2 (cadddr allocated)))
546           `((,(string-append  "mov____%" r2 ",%" r1))))
547         `((,(string-append  "pop____%" r0))
548           (,(string-append  "push___%" r0))))))
549
550 (define i386:instructions
551   `(
552     (a?->r . ,i386:a?->r)
553     (ae?->r . ,i386:ae?->r)
554     (b?->r . ,i386:b?->r)
555     (be?->r . ,i386:be?->r)
556     (byte-mem->r . ,i386:byte-mem->r)
557     (byte-r . ,i386:byte-r)
558     (byte-r->local+n . ,i386:byte-r->local+n)
559     (byte-r0->r1-mem . ,i386:byte-r0->r1-mem)
560     (byte-r0->r1-mem . ,i386:byte-r0->r1-mem)
561     (byte-r0-mem->r1-mem . ,i386:byte-r0-mem->r1-mem)
562     (byte-signed-r . ,i386:byte-signed-r)
563     (call-label . ,i386:call-label)
564     (call-r . ,i386:call-r)
565     (function-locals . ,i386:function-locals)
566     (function-preamble . ,i386:function-preamble)
567     (g?->r . ,i386:g?->r)
568     (ge?->r . ,i386:ge?->r)
569     (jump . ,i386:jump)
570     (jump-a . ,i386:jump-a)
571     (jump-ae . ,i386:jump-ae)
572     (jump-b . ,i386:jump-b)
573     (jump-be . ,i386:jump-be)
574     (jump-byte-z . ,i386:jump-byte-z)
575     (jump-g . , i386:jump-g)
576     (jump-ge . , i386:jump-ge)
577     (jump-l . ,i386:jump-l)
578     (jump-le . ,i386:jump-le)
579     (jump-nz . ,i386:jump-nz)
580     (jump-z . ,i386:jump-z)
581     (l?->r . ,i386:l?->r)
582     (label->arg . ,i386:label->arg)
583     (label->r . ,i386:label->r)
584     (label-mem->r . ,i386:label-mem->r)
585     (label-mem-add . ,i386:label-mem-add)
586     (le?->r . ,i386:le?->r)
587     (local->r . ,i386:local->r)
588     (local-add . ,i386:local-add)
589     (local-ptr->r . ,i386:local-ptr->r)
590     (long-r0->r1-mem . ,i386:r0->r1-mem)
591     (long-r0-mem->r1-mem . ,i386:r0-mem->r1-mem)
592     (mem->r . ,i386:mem->r)
593     (nop . ,i386:nop)
594     (not-r . ,i386:not-r)
595     (pop-r0 . ,i386:pop-r0)
596     (pop-register . ,i386:pop-register)
597     (push-r0 . ,i386:push-r0)
598     (push-register . ,i386:push-register)
599     (r+r . ,i386:r+r)
600     (r+value . ,i386:r+value)
601     (r->arg . ,i386:r->arg)
602     (r->byte-label . ,i386:r->byte-label)
603     (r->label . ,i386:r->label)
604     (r->local . ,i386:r->local)
605     (r->local+n . ,i386:r->local+n)
606     (r->word-label . ,i386:r->word-label)
607     (r-and . ,i386:r-and)
608     (r-byte-mem-add . ,i386:r-byte-mem-add)
609     (r-cmp-value . ,i386:r-cmp-value)
610     (r-mem-add . ,i386:r-mem-add)
611     (r-negate . ,i386:r-negate)
612     (r-word-mem-add . ,i386:r-word-mem-add)
613     (r-zero? . ,i386:r-zero?)
614     (r0%r1 . ,i386:r0%r1)
615     (r0*r1 . ,i386:r0*r1)
616     (r0+r1 . ,i386:r0+r1)
617     (r0+value . ,i386:r0+value)
618     (r0->r1 . ,i386:r0->r1)
619     (r0->r1-mem . ,i386:r0->r1-mem)
620     (r0-and-r1 . ,i386:r0-and-r1)
621     (r0-mem->r1-mem . ,i386:r0-mem->r1-mem)
622     (r0-or-r1 . ,i386:r0-or-r1)
623     (r0-r1 . ,i386:r0-r1)
624     (r0-xor-r1 . ,i386:r0-xor-r1)
625     (r0/r1 . ,i386:r0/r1)
626     (r0<<r1 . ,i386:r0<<r1)
627     (r0>>r1 . ,i386:r0>>r1)
628     (r1->r0 . ,i386:r1->r0)
629     (r2->r0 . ,i386:r2->r0)
630     (ret . ,i386:ret)
631     (return->r . ,i386:return->r)
632     (shl-r . ,i386:shl-r)
633     (swap-r-stack . ,i386:swap-r-stack)
634     (swap-r0-r1 . ,i386:swap-r0-r1)
635     (swap-r1-stack . ,i386:swap-r1-stack)
636     (test-r . ,i386:test-r)
637     (value->r . ,i386:value->r)
638     (value->r0 . ,i386:value->r0)
639     (word-mem->r . ,i386:word-mem->r)
640     (word-r . ,i386:word-r)
641     (word-r->local+n . ,i386:word-r->local+n)
642     (word-r0->r1-mem . ,i386:word-r0->r1-mem)
643     (word-r0-mem->r1-mem . ,i386:word-r0-mem->r1-mem)
644     (word-signed-r . ,i386:word-signed-r)
645     (xor-zf . ,i386:xor-zf)
646     (zf->r . ,i386:zf->r)
647     ))