Changeset 13546


Ignore:
Timestamp:
Mar 18, 2010, 1:36:14 PM (10 years ago)
Author:
gz
Message:

From trunk: fix for truncate of most-positive-fixnum (r13529,r13530,r13531,r13532)

Location:
branches/working-0711/ccl
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • branches/working-0711/ccl

  • branches/working-0711/ccl/level-0/X86/x86-numbers.lisp

    r13339 r13546  
    112112
    113113
     114
    114115;;; We'll get a SIGFPE if divisor is 0.
    115116;;; Don't use %rbp.  Trust callback_for_interrupt() to preserve
     
    117118(defx86lapfunction %fixnum-truncate ((dividend arg_y) (divisor arg_z))
    118119  (save-simple-frame)
     120  (cmpq ($ '-1) (% divisor))
     121  (je @neg)
    119122  (unbox-fixnum divisor imm0)
    120123  (movq (% imm0) (% imm2))
     
    129132  (pushq (% arg_y))
    130133  (set-nargs 2)
     134  (jmp-subprim .SPvalues)
     135  @neg
     136  (negq (% dividend))
     137  (load-constant *least-positive-bignum* arg_z)
     138  (cmovoq (@ x8664::symbol.vcell (% arg_z)) (% dividend))
     139  (pop (% rbp))
     140  (movq (% rsp) (% temp0))
     141  (pushq (% dividend))
     142  (pushq ($ 0))
     143  (set-nargs 2)
    131144  (jmp-subprim .SPvalues))
     145 
    132146
    133147(defx86lapfunction called-for-mv-p ()
  • branches/working-0711/ccl/level-0/l0-numbers.lisp

    r13502 r13546  
    11401140         #+32-bit-target
    11411141         `(target::with-stack-short-floats ((fnum ,number)
    1142                                            (f2))
     1142                                            (f2))
    11431143           (let ((res (%unary-truncate (%short-float/-2! fnum ,divisor f2))))
    11441144             (values res
    11451145                     (%short-float--2 fnum (%short-float*-2! (%short-float res f2) ,divisor f2)))))
    1146           #+64-bit-target
     1146         #+64-bit-target
    11471147         `(let* ((temp (%short-float ,number))
    11481148                 (res (%unary-truncate (/ (the short-float temp)
     
    11521152             (the short-float (* (the short-float (%short-float res))
    11531153                                 (the short-float ,divisor)))))))
    1154          )
     1154       )
    11551155    (number-case number
    11561156      (fixnum
    1157        (if (eql number target::target-most-negative-fixnum)
    1158          (if (zerop divisor)
    1159            (error 'division-by-zero :operation 'truncate :operands (list number divisor))
    1160            (with-small-bignum-buffers ((bn number))
    1161              (multiple-value-bind (quo rem) (truncate bn divisor)
    1162                (if (eq quo bn)
    1163                  (values number rem)
    1164                  (values quo rem)))))
    1165          (number-case divisor
    1166            (fixnum (if (eq divisor 1) (values number 0) (%fixnum-truncate number divisor)))
    1167            (bignum (values 0 number))
    1168            (double-float (truncate-rat-dfloat number divisor))
    1169            (short-float (truncate-rat-sfloat number divisor))
    1170            (ratio (let ((q (truncate (* number (%denominator divisor)) ; this was wrong
    1171                                      (%numerator divisor))))
    1172                     (values q (- number (* q divisor))))))))
     1157       (number-case divisor
     1158         (fixnum (if (eq divisor 1) (values number 0) (%fixnum-truncate number divisor)))
     1159         (bignum (values 0 number))
     1160         (double-float (truncate-rat-dfloat number divisor))
     1161         (short-float (truncate-rat-sfloat number divisor))
     1162         (ratio (let ((q (truncate (* number (%denominator divisor)) ; this was wrong
     1163                                   (%numerator divisor))))
     1164                  (values q (- number (* q divisor)))))))
    11731165      (bignum (number-case divisor
    11741166                (fixnum (if (eq divisor 1) (values number 0)
     
    11991191                                    (/ (the short-float number)
    12001192                                       (the short-float divisor)))))
    1201                             (values res
    1202                                     (- (the short-float number)
    1203                                        (* (the short-float (%short-float res))
    1204                                           (the short-float divisor))))))
     1193                          (values res
     1194                                  (- (the short-float number)
     1195                                     (* (the short-float (%short-float res))
     1196                                        (the short-float divisor))))))
    12051197                       ((fixnum bignum ratio)
    12061198                        #+32-bit-target
    12071199                        (target::with-stack-short-floats ((fdiv divisor)
    1208                                                          (f2))
     1200                                                          (f2))
    12091201                          (let ((res (%unary-truncate (%short-float/-2! number fdiv f2))))
    12101202                            (values res
  • branches/working-0711/ccl/level-1/l1-init.lisp

    r13409 r13546  
    162162  "the fixnum closest in value to negative infinity")
    163163
     164(defstatic *least-positive-bignum* (1+ target::target-most-positive-fixnum)
     165  "used internally; value should be treated as a constant")
     166
    164167
    165168(defconstant lambda-list-keywords
Note: See TracChangeset for help on using the changeset viewer.