1 ;;; GNU Mes --- Maxwell Equations of Software
2 ;;; Copyright © 2016,2017,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 i386 assembly
25 (define-module (mescc i386 as)
26 #:use-module (mes guile)
27 #:use-module (mescc as)
28 #:use-module (mescc info)
39 i386:byte-accu->base-mem
40 i386:word-accu->base-mem
42 i386:byte-accu->base-mem+n
43 i386:word-accu->base-mem+n
50 i386:accu-and-base-mem
54 i386:accu-mem->base-mem
71 i386:base-mem->accu-mem
75 i386:byte-accu->base-mem
76 i386:word-accu->base-mem
77 i386:byte-base->accu-mem
78 i386:byte-base->accu-mem+n
79 i386:byte-base-mem->accu
111 i386:local-address->accu
112 i386:local-address->accu
113 i386:local-address->base
118 i386:byte-mem+n->accu
119 i386:word-mem+n->accu
128 i386:push-byte-local-de-de-ref
129 i386:push-byte-local-de-ref
130 i386:push-word-local-de-ref
134 i386:push-local-address
135 i386:push-local-de-ref
141 i386:value->accu-mem+n
157 i386:signed-byte-accu
159 i386:signed-word-accu
167 (define (i386:function-preamble . rest)
169 ("mov____%esp,%ebp")))
171 (define (i386:function-locals . rest)
172 `(("sub____$i32,%esp" (#:immediate ,(+ (* 4 1025) (* 20 4)))))) ; 4*1024 buf, 20 local vars
174 (define (i386:push-label label)
175 `(("push___$i32" (#:address ,label)))) ; push $0x<label>
177 (define (i386:push-label-mem label)
178 `(("mov____0x32,%eax" (#:address ,label)) ; mov 0x804a000,%eax
179 ("push___%eax"))) ; push %eax
184 (define (i386:push-local n)
185 (or n (error "invalid value: push-local: " n))
186 (let ((n (- 0 (* 4 n))))
187 `(,(if (< (abs n) #x80) `("push___0x8(%ebp)" (#:immediate1 ,n))
188 `("push___0x32(%ebp)" (#:immediate ,n))))))
190 (define (i386:push-local-address n)
191 (or n (error "invalid value: push-local-address: " n))
192 (let ((n (- 0 (* 4 n))))
193 `(,(if (< (abs n) #x80) `("lea____0x8(%ebp),%eax" (#:immediate1 ,n))
194 `("lea____0x32(%ebp),%eax" (#:immediate ,n)))
197 (define (i386:push-byte-local-de-ref n)
198 (or n (error "invalid value: push-byte-local-de-ref: " n))
199 (let ((n (- 0 (* 4 n))))
200 `(,(if (< (abs n) #x80) `("mov____0x8(%ebp),%eax" (#:immediate1 ,n))
201 `("mov____0x32(%ebp),%eax" (#:immediate ,n)))
202 ("movzbl_(%eax),%eax")
205 (define (i386:push-word-local-de-ref n)
206 (or n (error "invalid value: push-word-local-de-ref: " n))
207 (let ((n (- 0 (* 4 n))))
208 `(,(if (< (abs n) #x80) `("mov____0x8(%ebp),%eax" (#:immediate1 ,n))
209 `("mov____0x32(%ebp),%eax" (#:immediate ,n)))
210 ("movzwl_(%eax),%eax")
213 (define (i386:push-byte-local-de-de-ref n)
214 (or n (error "invalid value: push-byte-local-de-de-ref: " n))
215 (let ((n (- 0 (* 4 n))))
216 `(,(if (< (abs n) #x80) `("mov____0x8(%ebp),%eax" (#:immediate1 ,n))
217 `("mov____0x32(%ebp),%eax" (#:immediate ,n)))
218 ("mov____(%eax),%eax")
219 ("movzbl_(%eax),%eax")
222 (define (i386:push-local-de-ref n)
223 (or n (error "invalid value: push-byte-local-de-ref: " n))
224 (let ((n (- 0 (* 4 n))))
225 `(,(if (< (abs n) #x80) `("mov____0x8(%ebp),%eax" (#:immediate1 ,n))
226 `("mov____0x32(%ebp),%eax" (#:immediate ,n)))
227 ("mov____(%eax),%eax")
230 (define (i386:local-add n v)
231 (or n (error "invalid value: i386:local-add: " n))
232 (let ((n (- 0 (* 4 n))))
233 `(,(if (and (< (abs n) #x80)
234 (< (abs v) #x80)) `("add____$i8,0x8(%ebp)" (#:immediate1 ,n) (#:immediate1 ,v))
235 `("add____$i32,0x32(%ebp)" (#:immediate ,n) (#:immediate ,v))))))
237 (define (i386:accu->local n)
238 (or n (error "invalid value: accu->local: " n))
239 (let ((n (- 0 (* 4 n))))
240 `(,(if (< (abs n) #x80) `("mov____%eax,0x8(%ebp)" (#:immediate1 ,n))
241 `("mov____%eax,0x32(%ebp)" (#:immediate ,n))))))
243 (define (i386:accu->local+n id n)
244 (let ((n (+ (- 0 (* 4 id)) n)))
245 `(,(if (< (abs n) #x80) `("mov____%eax,0x8(%ebp)" (#:immediate1 ,n))
246 `("mov____%eax,0x32(%ebp)" (#:immediate ,n))))))
248 (define (i386:accu*n->local i n)
249 (or n (error "invalid value: accu->local: " n))
250 (let ((o (- 0 (* 4 i))))
252 (if (>= i n) '() ;; FIXME: byte, word-sized
255 (if (< (abs o) #x80) `(("mov____0x8(%eax),%ebx" (#:immediate1 ,i))
256 ("mov____%ebx,0x8(%ebp)" (#:immediate1 ,o)))
257 `(("mov____0x8(%eax),%ebx" (#:immediate1 ,i))
258 ("mov____%ebx,0x32(%ebp)" (#:immediate ,o))))
261 (define (i386:local->accu n)
262 (or n (error "invalid value: local->accu: " n))
263 (let ((n (- 0 (* 4 n))))
264 `(,(if (< (abs n) #x80) `("mov____0x8(%ebp),%eax" (#:immediate1 ,n))
265 `("mov____0x32(%ebp),%eax" (#:immediate ,n))))))
267 (define (i386:local-address->accu n)
268 (or n (error "invalid value: ladd: " n))
269 (let ((n (- 0 (* 4 n))))
270 `(,(if (< (abs n) #x80) `("lea____0x8(%ebp),%eax" (#:immediate1 ,n))
271 `("lea____0x32(%ebp),%eax" (#:immediate ,n))))))
273 (define (i386:local-ptr->accu n)
274 (or n (error "invalid value: local-ptr->accu: " n))
275 (let ((n (- 0 (* 4 n))))
276 `(("mov____%ebp,%eax") ; mov %ebp,%eax
277 ,(if (< (abs n) #x80) `("add____$i8,%eax" (#:immediate1 ,n))
278 `("add____$i32,%eax" (#:immediate ,n))))))
280 (define (i386:byte-local->base n)
281 (or n (error "invalid value: byte-local->base: " n))
282 (let ((n (- 0 (* 4 n))))
283 `(,(if (< (abs n) #x80) `("movzbl_0x8(%ebp),%edx" (#:immediate1 ,n))
284 `,@(("mov_0x32(%ebp),%edx" (#:immediate ,n))
285 ("movzbl_%dl,%edx"))))))
287 (define (i386:local->base n)
288 (or n (error "invalid value: local->base: " n))
289 (let ((n (- 0 (* 4 n))))
290 `(,(if (< (abs n) #x80) `("mov____0x8(%ebp),%edx" (#:immediate1 ,n))
291 `("mov____0x32(%ebp),%edx" (#:immediate ,n))))))
293 (define (i386:local-address->base n) ;; DE-REF
294 (or n (error "invalid value: local-address->base: " n))
295 (let ((n (- 0 (* 4 n))))
296 `(,(if (< (abs n) #x80) `("lea____0x8(%ebp),%edx" (#:immediate1 ,n))
297 `("lea____0x32(%ebp),%edx" (#:immediate ,n))))))
299 (define (i386:local-ptr->base n)
300 (or n (error "invalid value: local-ptr->base: " n))
301 (let ((n (- 0 (* 4 n))))
302 `(("mov____%ebp,%edx") ; mov %ebp,%edx
303 ,(if (< (abs n) #x80) `("add____$i8,%edx" (#:immediate1 ,n))
304 `("add____$i32,%edx" (#:immediate ,n))))))
306 (define (i386:value->local n v)
307 (or n (error "invalid value: value->local: " n))
308 (let ((n (- 0 (* 4 n))))
309 `(,(if (< (abs n) #x80) `("mov____$i32,0x8(%ebp)" (#:immediate1 ,n) (#:immediate ,v))
310 `("mov____$i32,0x32(%ebp)" (#:immediate ,n) (#:immediate ,v))))))
312 (define (i386:local-test n v)
313 (or n (error "invalid value: local-test: " n))
314 (let ((n (- 0 (* 4 n))))
315 `(,(cond ((and (< (abs n) #x80)
316 (< (abs v) #x80)) `("cmp____$i8,0x8(%ebp)" (#:immediate1 ,n) (#:immediate1 ,v)))
317 ((< (abs n) #x80) `("cmp____$i32,0x8(%ebp)" (#:immediate1 ,n) (#:immediate ,v)))
318 ((< (abs v) #x80) `("cmp____$i8,0x32(%ebp)" (#:immediate ,n) (#:immediate1 ,v)))
319 (else `("cmp____$i32,0x32(%ebp)" (#:immediate ,n) (#:immediate ,v)))))))
321 (define (i386:pop-accu)
322 '(("pop____%eax"))) ; pop %eax
324 (define (i386:push-accu)
325 '(("push___%eax"))) ; push %eax
327 (define (i386:pop-base)
328 '(("pop____%edx"))) ; pop %edx
330 (define (i386:push-base)
331 '(("push___%edx"))) ; push %edx
333 (define (i386:ret . rest)
337 (define (i386:accu->base)
338 '(("mov____%eax,%edx"))) ; mov %eax,%edx
340 (define (i386:accu->base-mem)
341 '(("mov____%eax,(%edx)"))) ; mov %eax,(%edx)
343 (define (i386:byte-accu->base-mem)
344 '(("mov____%al,(%edx)"))) ; mov %al,(%edx)
346 (define (i386:word-accu->base-mem)
347 '(("mov____%ax,(%edx)"))) ; mov %ax,(%edx)
349 (define (i386:accu->base-mem+n n)
350 (or n (error "invalid value: accu->base-mem+n: " n))
351 `(,(if (< (abs n) #x80) `("mov____%eax,0x8(%edx)" (#:immediate1 ,n))
352 `("mov____%eax,0x32(%edx)" (#:immediate ,n)))))
354 (define (i386:byte-accu->base-mem+n n)
355 (or n (error "invalid value: accu->base-mem+n: " n))
356 `(,(if (< (abs n) #x80) `("mov____%al,0x8(%edx)" (#:immediate1 ,n))
357 `("mov____%al,0x32(%edx)" (#:immediate ,n)))))
359 (define (i386:word-accu->base-mem+n n)
360 (or n (error "invalid value: accu->base-mem+n: " n))
361 `(,(if (< (abs n) #x80) `("mov____%ax,0x8(%edx)" (#:immediate1 ,n))
362 `("mov____%ax,0x32(%edx)" (#:immediate ,n)))))
364 (define (i386:accu->label label)
365 `(("mov____%eax,0x32" (#:address ,label)))) ; mov %eax,0x<label>
367 (define (i386:accu*n->label label n)
371 (if (>= i n) '() ;; FIXME: byte, word-sized
373 `(("mov____$i32,%edx" (#:address ,label))
374 ("mov____0x8(%eax),%ebx" (#:immediate1 ,i))
375 ("mov____%ebx,0x8(%edx)" (#:immediate1 ,i)))
379 (define (i386:accu-shl n)
380 (or n (error "invalid value: accu:shl n: " n))
381 `(("shl____$i8,%eax" (#:immediate1 ,n)))) ; shl $0x8,%eax
383 (define (i386:accu<<base)
384 '(("xor____%ecx,%ecx") ; xor %ecx,%ecx
385 ("mov____%edx,%ecx") ; mov %edx,%ecx
386 ("shl____%cl,%eax"))) ; shl %cl,%eax
388 (define (i386:accu>>base)
389 '(("xor____%ecx,%ecx") ; xor %ecx,%ecx
390 ("mov____%edx,%ecx") ; mov %edx,%ecx
391 ("shr____%cl,%eax"))) ; shr %cl,%eax
393 (define (i386:accu-and-base)
394 '(("and____%edx,%eax")))
396 (define (i386:accu-and v)
397 `(("and____$i32,%eax" (#:immediate ,v))))
399 (define (i386:accu-and-base-mem)
400 '(("and____(%edx),%eax")))
402 (define (i386:accu-or-base-mem)
403 '(("or_____(%edx),%eax")))
405 (define (i386:accu-not)
406 '(("not____%eax"))) ; not %eax
408 (define (i386:accu-or-base)
409 '(("or_____%edx,%eax"))) ; or %edx,%eax
411 (define (i386:accu-xor-base)
412 '(("xor____%edx,%eax"))) ; xor %edx,%eax
414 (define (i386:accu+accu)
415 '(("add____%eax,%eax"))) ; add %eax,%eax
417 (define (i386:accu+base)
418 `(("add____%edx,%eax"))) ; add %edx,%eax
420 (define (i386:accu+value v)
421 `(,(if (< (abs v) #x80) `("add____$i8,%eax" (#:immediate1 ,v))
422 `("add____$i32,%eax" (#:immediate ,v)))))
424 (define (i386:base+value v)
425 `(,(if (< (abs v) #x80) `("add____$i8,%edx" (#:immediate1 ,v))
426 `("add____$i32,%edx" (#:immediate ,v)))))
428 (define (i386:accu-base)
429 `(("sub____%edx,%eax"))) ; sub %edx,%eax
431 (define (i386:accu*base)
432 `(("mul____%edx"))) ; mul %edx
434 (define (i386:accu/base)
435 '(("mov____%edx,%ebx") ; mov %edx,%ebx
436 ("xor____%edx,%edx") ; xor %edx,%edx
437 ("idiv___%ebx"))) ; div %ebx
439 (define (i386:accu%base)
440 '(("mov____%edx,%ebx") ; mov %edx,%ebx
441 ("xor____%edx,%edx") ; xor %edx,%edx
442 ("idiv___%ebx") ; div %ebx
443 ("mov____%edx,%eax"))) ; mov %edx,%eax
445 (define (i386:base->accu)
446 '(("mov____%edx,%eax"))) ; mov %edx,%eax
448 (define (i386:label->accu label)
449 `(("mov____$i32,%eax" (#:address ,label)))) ; mov $<n>,%eax
451 (define (i386:label->base label)
452 `(("mov____$i32,%edx" (#:address ,label)))) ; mov $<n>,%edx
454 (define (i386:label-mem->accu label)
455 `(("mov____0x32,%eax" (#:address ,label)))) ; mov 0x<n>,%eax
457 (define (i386:label-mem->base label)
458 `(("mov____0x32,%edx" (#:address ,label)))) ; mov 0x<n>,%edx
460 (define (i386:label-mem-add label v)
461 `(,(if (< (abs v) #x80) `("add____$i8,0x32" (#:address ,label) (#:immediate1 ,v))
462 `("add____$i32,0x32" (#:address ,label) (#:immediate ,v)))))
464 (define (i386:byte-base-mem->accu)
465 '(("add____%edx,%eax") ; add %edx,%eax
466 ("movzbl_(%eax),%eax"))) ; movzbl (%eax),%eax
468 (define (i386:byte-mem->accu)
469 '(("movzbl_(%eax),%eax"))) ; movzbl (%eax),%eax
471 (define (i386:word-mem->accu)
472 '(("movzwl_(%eax),%eax")))
474 (define (i386:byte-mem->base)
475 '(("movzbl_(%edx),%edx"))) ; movzbl (%edx),%edx
477 (define (i386:base-mem->accu)
478 '(("mov____(%edx),%eax")))
480 (define (i386:mem->accu)
481 '(("mov____(%eax),%eax")))
483 (define (i386:mem->base)
484 '(("mov____(%edx),%edx")))
486 (define (i386:mem+n->accu n)
487 `(,(if (< (abs n) #x80) `("mov____0x8(%eax),%eax" (#:immediate1 ,n))
488 `("mov____0x32(%eax),%eax" (#:immediate ,n)))))
490 (define (i386:byte-mem+n->accu n)
491 `(,(if (< (abs n) #x80) `("movzbl_0x8(%eax),%eax" (#:immediate1 ,n))
492 `("movzbl_0x32(%eax),%eax" (#:immediate ,n)))))
494 (define (i386:word-mem+n->accu n)
495 `(,(if (< (abs n) #x80) `("movzwl_0x8(%eax),%eax" (#:immediate1 ,n))
496 `("movzwl_xb0x32(%eax),%eax" (#:immediate ,n)))))
498 (define (i386:base-mem+n->accu v)
499 (or v (error "invalid value: base-mem+n->accu: " v))
500 `(("add___%edx,%eax")
501 ,(if (< (abs v) #x80) `("mov____0x8(%eax),%eax" (#:immediate1 ,v))
502 `("mov____0x32(%eax),%eax" (#:immediate ,v)))))
504 (define (i386:value->accu v)
505 (or v (error "invalid value: i386:value->accu: " v))
506 `(("mov____$i32,%eax" (#:immediate ,v))))
508 (define (i386:value->accu-mem v)
509 `(("mov____$i32,(%eax)" (#:immediate ,v)))) ; movl $0x<v>,(%eax)
511 (define (i386:value->accu-mem+n n v)
512 (or v (error "invalid value: i386:value->accu-mem+n: " v))
513 `(,(if (< (abs v) #x80) `("mov____$i32,0x8(%eax)" (#:immediate1 ,n) (#:immediate ,v))
514 `("mov____$i32,0x32(%eax)" (#:immediate ,n) (#:immediate ,v)))))
516 (define (i386:base->accu-mem)
517 '(("mov____%edx,(%eax)"))) ; mov %edx,(%eax)
519 (define (i386:accu-mem->base-mem)
520 '(("mov____(%eax),%ecx")
521 ("mov____%ecx,(%edx)")))
523 (define (i386:base-mem->accu-mem)
524 '(("mov____(%edx),%ecx") ; mov (%edx),%ecx
525 ("mov____%ecx,(%eax)"))) ; mov %ecx,(%eax)
527 (define (i386:byte-base->accu-mem)
528 '(("mov____%dl,(%eax)"))) ; mov %dl,(%eax)
530 (define (i386:byte-base->accu-mem+n n)
531 (or n (error "invalid value: byte-base->accu-mem+n: " n))
532 `(,(if (< (abs n) #x80) `("mov____%dl,0x8(%eax)" (#:immediate1 ,n))
533 `("mov____%dl,0x32(%eax)" (#:immediate ,n)))))
535 (define (i386:value->base v)
536 (or v (error "invalid value: i386:value->base: " v))
537 `(("mov____$i32,%edx" (#:immediate ,v)))) ; mov $<v>,%edx
539 (define (i386:accu-mem-add v)
540 `(,(if (< (abs v) #x80) `("add____$i8,(%eax)" (#:immediate1 ,v))
541 `("add____$i32,(%eax)" (#:immediate ,v)))))
543 (define (i386:value->label label v)
544 (or v (error "invalid value: value->label: " v))
545 `(("mov____$i32,0x32" (#:address ,label)
548 (define (i386:call-label info label n)
549 `((call32 (#:offset ,label))
550 ("add____$i8,%esp" (#:immediate1 ,(* n 4)))))
552 (define (i386:call-accu n)
555 ("call___*%eax") ; call *%eax
556 ("add____$i8,%esp" (#:immediate1 ,(* n 4))))) ; add $00,%esp
558 (define (i386:accu-zero?)
559 '(("test___%eax,%eax")))
561 (define (i386:accu-negate)
562 '(("sete___%al") ; sete %al
563 ("movzbl_%al,%eax"))) ; movzbl %al,%eax
565 (define (i386:xor-accu v)
566 (or v (error "invalid value: i386:xor-accu: n: " v))
567 `(("xor___$i32,%eax" (#:immediate ,v)))) ;xor $0xff,%eax
569 (define (i386:xor-zf)
571 ("xor____$i8,%ah" (#:immediate1 #x40)) ; xor $0x40,%ah
574 (define (i386:accu-cmp-value v)
575 `(,(if (< (abs v) #x80) `("cmp____$i8,%eax" (#:immediate1 ,v))
576 `("cmp____$i32,%eax" (#:immediate ,v)))))
578 (define (i386:accu-test)
579 '(("test___%eax,%eax"))) ; test %eax,%eax
581 (define (i386:jump label)
582 `(("jmp32 " (#:offset ,label))))
584 (define (i386:jump-z label)
585 `(("je32 " (#:offset ,label)))) ; jz . + <n>
587 (define (i386:jump-byte-z label)
588 `(("test___%al,%al") ; test %al,%al
589 ("je32 " (#:offset ,label)))) ; je <n>
592 (define (i386:jump-g label)
593 `(("jg32 " (#:offset ,label))))
595 (define (i386:jump-ge label)
596 `(("jge32 " (#:offset ,label))))
598 (define (i386:jump-l label)
599 `(("jl32 " (#:offset ,label))))
601 (define (i386:jump-le label)
602 `(("jle32 " (#:offset ,label))))
604 (define (i386:g?->accu)
606 ("movzbl_%al,%eax")))
608 (define (i386:ge?->accu)
610 ("movzbl_%al,%eax")))
612 (define (i386:l?->accu)
614 ("movzbl_%al,%eax")))
616 (define (i386:le?->accu)
618 ("movzbl_%al,%eax")))
621 (define (i386:jump-a label)
622 `(("ja32 " (#:offset ,label))))
624 (define (i386:jump-ae label)
625 `(("jae32 " (#:offset ,label))))
627 (define (i386:jump-b label)
628 `(("jb32 " (#:offset ,label))))
630 (define (i386:jump-be label)
631 `(("jbe32 " (#:offset ,label))))
633 (define (i386:a?->accu)
635 ("movzbl_%al,%eax")))
637 (define (i386:ae?->accu)
639 ("movzbl_%al,%eax")))
641 (define (i386:b?->accu)
643 ("movzbl_%al,%eax")))
645 (define (i386:be?->accu)
647 ("movzbl_%al,%eax")))
649 (define (i386:jump-nz label)
650 `(("jne32 " (#:offset ,label)))) ; jnz . + <n>
652 (define (i386:byte-test-base)
653 '(("cmp____%al,%dl"))) ; cmp %al,%dl
655 (define (i386:test-base)
656 (("cmp____%edx,%eax"))) ; cmp %edx,%eax
658 (define (i386:byte-sub-base)
659 '(("sub____%dl,%al"))) ; sub %dl,%al
661 (define (i386:byte-base-sub)
662 `(("sub____%al,%dl"))) ; sub %al,%dl
664 (define (i386:sub-base)
665 `(("sub____%edx,%eax"))) ; sub %edx,%eax
667 (define (i386:base-sub)
668 `(("sub____%eax,%edx"))) ; sub %eax,%edx
670 (define (i386:nz->accu)
671 '(("setne__%al") ; setne %al
672 ("movzbl_%al,%eax"))) ; movzbl %al,%eax
674 (define (i386:z->accu)
675 '(("sete___%al") ; sete %al
676 ("movzbl_%al,%eax"))) ; movzbl %al,%eax
678 (define (i386:accu<->stack)
679 '(("xchg___%eax,(%esp)"))) ; xchg %eax,(%esp)
681 (define (i386:byte-accu)
682 '(("movzbl_%al,%eax")))
684 (define (i386:signed-byte-accu)
685 '(("movsbl_%al,%eax")))
687 (define (i386:word-accu)
688 '(("movzwl_%ax,%eax")))
690 (define (i386:signed-word-accu)
691 '(("movswl_%ax,%eax")))
696 (define (i386:r0->local info n)
697 (or n (error "invalid value: i386:r0->local: " n))
698 (let ((r0 (car (if (pair? (.allocated info)) (.allocated info) (.registers info))))
700 `(,(if (< (abs n) #x80) `(,(string-append "mov____%" r0 ",0x8(%ebp)") (#:immediate1 ,n))
701 `(,(string-append "mov____%" r0 ",0x32(%ebp)") (#:immediate ,n))))))
703 (define (i386:value->r0 info v)
704 (or v (error "invalid value: i386:value->r0: " v))
705 (let ((r0 (car (if (pair? (.allocated info)) (.allocated info) (.registers info)))))
706 `((,(string-append "mov____$i32,%" r0) (#:immediate ,v)))))
708 (define (i386:r0-zero? info)
709 (let ((r0 (car (if (pair? (.allocated info)) (.allocated info) (.registers info)))))
710 `((,(string-append "test___%" r0 "," "%" r0)))))
712 (define (i386:local->r0 info n)
713 (or n (error "invalid value: i386:local->r0: " n))
714 (let ((r0 (car (if (pair? (.allocated info)) (.allocated info) (.registers info))))
716 `(,(if (< (abs n) #x80) `(,(string-append "mov____0x8(%ebp),%" r0) (#:immediate1 ,n))
717 `(,(string-append "mov____0x32(%ebp),%" r0) (#:immediate ,n))))))
719 (define i386:instructions
721 (call-label . ,i386:call-label)
722 (function-preamble . ,i386:function-preamble)
723 (function-locals . ,i386:function-locals)
724 (local->r0 . ,i386:local->r0)
725 (r0->local . ,i386:r0->local)
726 (r0-zero? . ,i386:r0-zero?)
728 (value->r0 . ,i386:value->r0)