1 ;;;============================================================================
5 ;;; Copyright (c) 2010-2012 by Marc Feeley, All Rights Reserved.
7 ;;;============================================================================
258 ;;;============================================================================
260 ;; Define x86 register classes.
262 (define-macro (x86-define-registers . definitions)
264 (define names (make-vector (+ 96 8) "invalidreg"))
266 (define (get d attrib)
267 (let ((x (member attrib (cdr d))))
272 (let ((class (get d 'class:))
273 (field (get d 'field:))
274 (mode (get d 'mode:))
275 (name (or (get d 'name:) id)))
276 (if (member class '(r8 r16 r32 r64 fpu mm xmm))
278 (if (and (eq? class 'r8)
281 (not (eq? mode 'long)))
292 (vector-set! names i name)
293 `((define-macro (,(string->symbol (string-append "x86-" (symbol->string id))))
298 (apply append (map gen-def definitions)))
301 (define-macro (x86-implement)
303 (define (x86-register-name reg)
304 (vector-ref ',',names reg))))
305 (define-macro (x86-reg? x)
307 (define-macro (x86-reg8? reg)
308 `(let ((n ,reg)) (fx>= n 80)))
309 (define-macro (x86-reg8-h? reg)
310 `(let ((n ,reg)) (fx>= n 96)))
311 (define-macro (x86-xmm? reg)
312 `(let ((n ,reg)) (and (fx>= n 64) (fx< n 80))))
313 (define-macro (x86-mm? reg)
314 `(let ((n ,reg)) (and (fx>= n 56) (fx< n 64))))
315 (define-macro (x86-fpu? reg)
316 `(let ((n ,reg)) (and (fx>= n 48) (fx< n 56))))
317 (define-macro (x86-reg16? reg)
318 `(let ((n ,reg)) (and (fx>= n 32) (fx< n 48))))
319 (define-macro (x86-reg32? reg)
320 `(let ((n ,reg)) (and (fx>= n 16) (fx< n 32))))
321 (define-macro (x86-reg64? reg)
322 `(let ((n ,reg)) (fx< n 16)))
323 (define-macro (x86-reg-field reg)
325 (define-macro (x86-reg8 n)
327 (define-macro (x86-reg16 n)
329 (define-macro (x86-reg32 n)
331 (define-macro (x86-reg64 n)
333 (define-macro (x86-fpu n)
335 (define-macro (x86-reg-width reg)
337 (cond ((fx< n 16) 64)
348 (x86-define-registers
350 (al class: r8 field: 0 )
351 (cl class: r8 field: 1 )
352 (dl class: r8 field: 2 )
353 (bl class: r8 field: 3 )
354 (ah class: r8 field: 4 )
355 (ch class: r8 field: 5 )
356 (dh class: r8 field: 6 )
357 (bh class: r8 field: 7 )
358 (spl class: r8 field: 4 mode: long)
359 (bpl class: r8 field: 5 mode: long)
360 (sil class: r8 field: 6 mode: long)
361 (dil class: r8 field: 7 mode: long)
362 (r8b class: r8 field: 8 mode: long)
363 (r9b class: r8 field: 9 mode: long)
364 (r10b class: r8 field: 10 mode: long)
365 (r11b class: r8 field: 11 mode: long)
366 (r12b class: r8 field: 12 mode: long)
367 (r13b class: r8 field: 13 mode: long)
368 (r14b class: r8 field: 14 mode: long)
369 (r15b class: r8 field: 15 mode: long)
371 (ax class: r16 field: 0 )
372 (cx class: r16 field: 1 )
373 (dx class: r16 field: 2 )
374 (bx class: r16 field: 3 )
375 (sp class: r16 field: 4 )
376 (bp class: r16 field: 5 )
377 (si class: r16 field: 6 )
378 (di class: r16 field: 7 )
379 (r8w class: r16 field: 8 mode: long)
380 (r9w class: r16 field: 9 mode: long)
381 (r10w class: r16 field: 10 mode: long)
382 (r11w class: r16 field: 11 mode: long)
383 (r12w class: r16 field: 12 mode: long)
384 (r13w class: r16 field: 13 mode: long)
385 (r14w class: r16 field: 14 mode: long)
386 (r15w class: r16 field: 15 mode: long)
388 (eax class: r32 field: 0 )
389 (ecx class: r32 field: 1 )
390 (edx class: r32 field: 2 )
391 (ebx class: r32 field: 3 )
392 (esp class: r32 field: 4 )
393 (ebp class: r32 field: 5 )
394 (esi class: r32 field: 6 )
395 (edi class: r32 field: 7 )
396 (r8d class: r32 field: 8 mode: long)
397 (r9d class: r32 field: 9 mode: long)
398 (r10d class: r32 field: 10 mode: long)
399 (r11d class: r32 field: 11 mode: long)
400 (r12d class: r32 field: 12 mode: long)
401 (r13d class: r32 field: 13 mode: long)
402 (r14d class: r32 field: 14 mode: long)
403 (r15d class: r32 field: 15 mode: long)
405 (rax class: r64 field: 0 )
406 (rcx class: r64 field: 1 )
407 (rdx class: r64 field: 2 )
408 (rbx class: r64 field: 3 )
409 (rsp class: r64 field: 4 )
410 (rbp class: r64 field: 5 )
411 (rsi class: r64 field: 6 )
412 (rdi class: r64 field: 7 )
413 (r8 class: r64 field: 8 mode: long)
414 (r9 class: r64 field: 9 mode: long)
415 (r10 class: r64 field: 10 mode: long)
416 (r11 class: r64 field: 11 mode: long)
417 (r12 class: r64 field: 12 mode: long)
418 (r13 class: r64 field: 13 mode: long)
419 (r14 class: r64 field: 14 mode: long)
420 (r15 class: r64 field: 15 mode: long)
422 (st class: fpu field: 0 )
423 (st1 class: fpu field: 1 name: |st(1)|)
424 (st2 class: fpu field: 2 name: |st(2)|)
425 (st3 class: fpu field: 3 name: |st(3)|)
426 (st4 class: fpu field: 4 name: |st(4)|)
427 (st5 class: fpu field: 5 name: |st(5)|)
428 (st6 class: fpu field: 6 name: |st(6)|)
429 (st7 class: fpu field: 7 name: |st(7)|)
431 (mm0 class: mm field: 0 )
432 (mm1 class: mm field: 1 )
433 (mm2 class: mm field: 2 )
434 (mm3 class: mm field: 3 )
435 (mm4 class: mm field: 4 )
436 (mm5 class: mm field: 5 )
437 (mm6 class: mm field: 6 )
438 (mm7 class: mm field: 7 )
440 (xmm0 class: xmm field: 0 )
441 (xmm1 class: xmm field: 1 )
442 (xmm2 class: xmm field: 2 )
443 (xmm3 class: xmm field: 3 )
444 (xmm4 class: xmm field: 4 )
445 (xmm5 class: xmm field: 5 )
446 (xmm6 class: xmm field: 6 )
447 (xmm7 class: xmm field: 7 )
448 (xmm8 class: xmm field: 8 mode: long)
449 (xmm9 class: xmm field: 9 mode: long)
450 (xmm10 class: xmm field: 10 mode: long)
451 (xmm11 class: xmm field: 11 mode: long)
452 (xmm12 class: xmm field: 12 mode: long)
453 (xmm13 class: xmm field: 13 mode: long)
454 (xmm14 class: xmm field: 14 mode: long)
455 (xmm15 class: xmm field: 15 mode: long)
457 (es class: seg field: 0 )
458 (cs class: seg field: 1 )
459 (ss class: seg field: 2 )
460 (ds class: seg field: 3 )
461 (fs class: seg field: 4 )
462 (gs class: seg field: 5 )
466 ;;;============================================================================