Changeset 14842


Ignore:
Timestamp:
Jun 23, 2011, 3:32:08 AM (8 years ago)
Author:
gb
Message:

Determine arithmetic-error-operands for integer division,
double->single coercion.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/level-1/x86-trap-support.lisp

    r14841 r14842  
    365365  (let* ((name (make-keyword (string-upcase (x86-di-mnemonic instruction)))))
    366366    (case name
    367       ((:divss :divsd :idivl :idivd) '/)
     367      ((:divss :divsd :idivl :idivq) '/)
    368368      ((:mulss :mulsd) '*)
    369369      ((:addss :addsd) '+)
     
    387387             (opvals (xp-xmm-double-float xp xmmop1))
    388388             (opvals (xp-xmm-double-float xp xmmop0))))
     389          ;; (coerce a-double 'single-float) can overflow.
     390          (:cvtsd2ss
     391           (when xmmop0
     392             (opvals (xp-xmm-double-float xp xmmop1))
     393             (opvals 'single-float)))
     394          #+x8632-target
     395          (:idivl
     396           (let* ((reg (register-operand-regno op0 #.x86::+operand-type-Reg32+)))
     397             (when reg
     398               (opvals (logior (ash (encoded-gpr-integer xp 2) 32)
     399                               (logand #xfffffffff (encoded-gpr-integer xp 0))))
     400               (opvals (encoded-gpr-integer xp reg)))))
     401          #+x8664-target
     402          (:idivq
     403           (let* ((reg (register-operand-regno op0 #.x86::+operand-type-Reg64+)))
     404             (when reg
     405               (opvals (logior (ash (encoded-gpr-integer xp 2) 64)
     406                               (logand (1- (ash 1 64)) (encoded-gpr-integer xp 0))))
     407               (opvals (encoded-gpr-integer xp reg)))))
     408               
    389409           
    390410          )
Note: See TracChangeset for help on using the changeset viewer.