Changeset 9802


Ignore:
Timestamp:
Jun 21, 2008, 2:42:04 AM (11 years ago)
Author:
rme
Message:

New function UNSIGNED-TO-SIGNED. Add missing vinsns misc-ref-c-u16,
misc-ref-c-s16, misc-set-c-u16.

In several vinsns for doing natural operations with a constant
operand, change spec of constant arg to :u32const, and use
UNSIGNED-TO-SIGNED to transform it into an imm32s for the assembler.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/ia32/compiler/X86/X8632/x8632-vinsns.lisp

    r9756 r9802  
    99(eval-when (:compile-toplevel :execute)
    1010  (require "X8632ENV"))
     11
     12(defun unsigned-to-signed (u nbits)
     13  (if (logbitp (1- nbits) u)
     14    (- u (ash 1 nbits))
     15    u))
    1116
    1217(defmacro define-x8632-vinsn (vinsn-name (results args &optional temps) &body body)
     
    9095                                  (scaled-idx :s32)))
    9196  (movsbl (:@ x8632::misc-data-offset (:%l v) (:%l scaled-idx)) (:%l dest)))
     97
     98(define-x8632-vinsn misc-ref-c-u16 (((dest :u16))
     99                                    ((v :lisp)
     100                                     (idx :u32const)))
     101  (movzwl (:@ (:apply + x8632::misc-data-offset (:apply ash idx 1)) (:%l v)) (:%l dest)))
     102
     103(define-x8632-vinsn misc-ref-c-s16 (((dest :s16))
     104                                    ((v :lisp)
     105                                     (idx :u32const)))
     106  (movswl (:@ (:apply + x8632::misc-data-offset (:apply ash idx 1)) (:%l v)) (:%l dest)))
    92107
    93108(define-x8632-vinsn misc-ref-u16 (((dest :u16))
     
    19922007  (movb (:%b val) (:@ x8632::misc-data-offset (:%l v) (:%l scaled-idx))))
    19932008
     2009(define-x8632-vinsn misc-set-c-u16  (()
     2010                                    ((val :u16)
     2011                                     (v :lisp)
     2012                                     (idx :s32const))
     2013                                    ())
     2014  (movw (:%w val) (:@ (:apply + x8632::misc-data-offset (:apply * 2 idx)) (:%l v))))
     2015
    19942016(define-x8632-vinsn misc-set-u16  (()
    19952017                                   ((val :u16)
     
    30013023(define-x8632-vinsn %natural+-c (((result :u32))
    30023024                                ((result :u32)
    3003                                  (constant :s32const)))
    3004   (addl (:$l constant) (:%l result)))
     3025                                 (constant :u32const)))
     3026  (addl (:$l (:apply unsigned-to-signed constant 32)) (:%l result)))
    30053027
    30063028(define-x8632-vinsn %natural-  (((result :u32))
     
    30113033(define-x8632-vinsn %natural--c (((result :u32))
    30123034                                ((result :u32)
    3013                                  (constant :s32const)))
    3014   (subl (:$l constant) (:%l result)))
     3035                                 (constant :u32const)))
     3036  (subl (:$l (:apply unsigned-to-signed constant 32)) (:%l result)))
    30153037
    30163038(define-x8632-vinsn %natural-logior (((result :u32))
     
    30213043(define-x8632-vinsn %natural-logior-c (((result :u32))
    30223044                                      ((result :u32)
    3023                                        (constant :s32const)))
    3024   (orl (:$l constant) (:%l result)))
     3045                                       (constant :u32const)))
     3046  (orl (:$l (:apply unsigned-to-signed constant 32)) (:%l result)))
    30253047
    30263048(define-x8632-vinsn %natural-logand (((result :u32))
     
    30313053(define-x8632-vinsn %natural-logand-c (((result :u32))
    30323054                                      ((result :u32)
    3033                                        (constant :s32const)))
    3034   (andl (:$l constant) (:%l result)))
     3055                                       (constant :u32const)))
     3056  (andl (:$l (:apply unsigned-to-signed constant 32)) (:%l result)))
    30353057
    30363058(define-x8632-vinsn %natural-logxor (((result :u32))
     
    30413063(define-x8632-vinsn %natural-logxor-c (((result :u32))
    30423064                                       ((result :u32)
    3043                                         (constant :s32const)))
    3044   (xorl (:$l constant) (:%l result)))
     3065                                        (constant :u32const)))
     3066  (xorl (:$l (:apply unsigned-to-signed constant 32)) (:%l result)))
    30453067
    30463068(define-x8632-vinsn natural-shift-left (((dest :u32))
Note: See TracChangeset for help on using the changeset viewer.