* bytevector-sint-set! is completed.
This commit is contained in:
		
							parent
							
								
									8f885aa848
								
							
						
					
					
						commit
						d62c01dfa7
					
				
							
								
								
									
										
											BIN
										
									
								
								src/ikarus.boot
								
								
								
								
							
							
						
						
									
										
											BIN
										
									
								
								src/ikarus.boot
								
								
								
								
							
										
											Binary file not shown.
										
									
								
							| 
						 | 
				
			
			@ -408,6 +408,22 @@
 | 
			
		|||
         (let ([c ($fx- ($fx+ 255 ($fxsra c 8)) ($bignum-byte-ref n ni))])
 | 
			
		||||
           (lbn-neg-copy! x ($fxadd1 xi) n ($fxadd1 ni) xj nj c)
 | 
			
		||||
           ($bytevector-set! x xi ($fxlogand c 255)))]))
 | 
			
		||||
    (define (bbn-neg-copy! x xi n ni xj nj c)
 | 
			
		||||
      (cond
 | 
			
		||||
        [($fx= ni nj)
 | 
			
		||||
         (case ($fxsra c 7)
 | 
			
		||||
           [(#x01) ;;; borrow is 0, last byte was negative
 | 
			
		||||
            (bv-neg-zero! x xi xj)]
 | 
			
		||||
           [(#x00) ;;; borrow is 0, last byte was positive
 | 
			
		||||
            (if ($fx< xi xj)
 | 
			
		||||
                (bv-neg-zero! x xi xj)
 | 
			
		||||
                (error 'bytevector-sint-set! "number ~s does not fit" n))]
 | 
			
		||||
           [else (error 'bbn-neg-copy! "BUG: not handled ~s" c)])]
 | 
			
		||||
        [else
 | 
			
		||||
         (let ([c ($fx- ($fx+ 255 ($fxsra c 8)) ($bignum-byte-ref n ni))]
 | 
			
		||||
               [xj ($fxsub1 xj)])
 | 
			
		||||
           (bbn-neg-copy! x xi n ($fxadd1 ni) xj nj c)
 | 
			
		||||
           ($bytevector-set! x xj ($fxlogand c 255)))]))
 | 
			
		||||
    (define (lbn-pos-copy! x xi n ni nj xj c)
 | 
			
		||||
      (cond
 | 
			
		||||
        [($fx= ni nj)
 | 
			
		||||
| 
						 | 
				
			
			@ -421,6 +437,20 @@
 | 
			
		|||
         (let ([c ($bignum-byte-ref n ni)])
 | 
			
		||||
           (lbn-pos-copy! x ($fxadd1 xi) n ($fxadd1 ni) nj xj c)
 | 
			
		||||
           ($bytevector-set! x xi ($fxlogand c 255)))]))
 | 
			
		||||
    (define (bbn-pos-copy! x xi n ni nj xj c)
 | 
			
		||||
      (cond
 | 
			
		||||
        [($fx= ni nj)
 | 
			
		||||
         (cond
 | 
			
		||||
           [(or ($fx<= c 127) ($fx< xi xj))
 | 
			
		||||
            ;;; last byte was positive
 | 
			
		||||
            (bv-zero! x xi xj)]
 | 
			
		||||
           [else 
 | 
			
		||||
            (error 'bytevector-sint-set! "number ~s does not fit" n)])]
 | 
			
		||||
        [else
 | 
			
		||||
         (let ([c ($bignum-byte-ref n ni)]
 | 
			
		||||
               [xj ($fxsub1 xj)])
 | 
			
		||||
           (bbn-pos-copy! x xi n ($fxadd1 ni) nj xj c)
 | 
			
		||||
           ($bytevector-set! x xj ($fxlogand c 255)))]))
 | 
			
		||||
    (define (bv-neg-zero! x i j)
 | 
			
		||||
      (unless ($fx= i j)
 | 
			
		||||
        ($bytevector-set! x i 255)
 | 
			
		||||
| 
						 | 
				
			
			@ -504,17 +534,18 @@
 | 
			
		|||
          [(big)
 | 
			
		||||
           (cond
 | 
			
		||||
             [(fixnum? n) (bsfx-set! x k n ($fx+ k size) who n)]
 | 
			
		||||
             ;[(bignum? n)
 | 
			
		||||
             ; (if ($bignum-positive? n)
 | 
			
		||||
             ;     (let ([sz ($bignum-size n)])
 | 
			
		||||
             ;       (cond
 | 
			
		||||
             ;         [($fx<= sz size) 
 | 
			
		||||
             ;          (bbn-copy! x ($fx+ k size) n 0 sz)]
 | 
			
		||||
             ;         [($fx< sz size)
 | 
			
		||||
             ;          (bbn-copy! x ($fx+ k size) n 0 sz)
 | 
			
		||||
             ;          (bv-zero! x k ($fx+ k ($fx- size sz)))]
 | 
			
		||||
             ;         [else (error who "number ~s does not fit" n)]))
 | 
			
		||||
             ;     (error who "value ~s must be positive" n))]
 | 
			
		||||
             [(bignum? n)
 | 
			
		||||
              (if ($bignum-positive? n)
 | 
			
		||||
                  (let ([sz (bignum-bytes n)])
 | 
			
		||||
                    (cond
 | 
			
		||||
                      [($fx<= sz size) 
 | 
			
		||||
                       (bbn-pos-copy! x k n 0 size sz 255)]
 | 
			
		||||
                      [else (error who "number ~s does not fit" n)]))
 | 
			
		||||
                  (let ([sz (bignum-bytes n)])
 | 
			
		||||
                    (cond
 | 
			
		||||
                      [($fx<= sz size) 
 | 
			
		||||
                       (bbn-neg-copy! x k n 0 size sz 256)]
 | 
			
		||||
                      [else (error who "number ~s does not fit" n)])))] 
 | 
			
		||||
             [else (error who "invalid value argument ~s" n)])]
 | 
			
		||||
          [else (error who "invalid endianness ~s" endianness)]))))
 | 
			
		||||
  )
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -146,8 +146,48 @@
 | 
			
		|||
    [(lambda (x) (= x #x-100000000))
 | 
			
		||||
     (let ([b (make-bytevector 5 38)])
 | 
			
		||||
       (bytevector-sint-set! b 0 (- (expt 2 32)) 'little 5)
 | 
			
		||||
       (printf "b=~s\n" b)
 | 
			
		||||
       (bytevector-sint-ref b 0 'little 5))]
 | 
			
		||||
    [(lambda (x) (= x #xFFFFFFFF))
 | 
			
		||||
     (let ([b (make-bytevector 4 0)])
 | 
			
		||||
       (bytevector-sint-set! b 0 -1 'big 4)
 | 
			
		||||
       (bytevector-uint-ref b 0 'big 4))]
 | 
			
		||||
    [(lambda (x) (= x #xFFFFFF00))
 | 
			
		||||
     (let ([b (make-bytevector 4 0)])
 | 
			
		||||
       (bytevector-sint-set! b 0 -256 'big 4)
 | 
			
		||||
       (bytevector-uint-ref b 0 'big 4))]
 | 
			
		||||
    [(lambda (x) (= x #xFFFF0000))
 | 
			
		||||
     (let ([b (make-bytevector 4 0)])
 | 
			
		||||
       (bytevector-sint-set! b 0 (- (expt 256 2)) 'big 4)
 | 
			
		||||
       (bytevector-uint-ref b 0 'big 4))]
 | 
			
		||||
    [(lambda (x) (= x #xFFFFFFFFFFFF0000))
 | 
			
		||||
     (let ([b (make-bytevector 8 0)])
 | 
			
		||||
       (bytevector-sint-set! b 0 (- (expt 256 2)) 'big 8)
 | 
			
		||||
       (bytevector-uint-ref b 0 'big 8))]
 | 
			
		||||
    [(lambda (x) (= x #xFFFFFFFF00000000))
 | 
			
		||||
     (let ([b (make-bytevector 8 0)])
 | 
			
		||||
       (bytevector-sint-set! b 0 (- (expt 256 4)) 'big 8)
 | 
			
		||||
       (bytevector-uint-ref b 0 'big 8))]
 | 
			
		||||
    [(lambda (x) (= x #xFF00000000000000))
 | 
			
		||||
     (let ([b (make-bytevector 8 0)])
 | 
			
		||||
       (bytevector-sint-set! b 0 (- (expt 256 7)) 'big 8)
 | 
			
		||||
       (bytevector-uint-ref b 0 'big 8))] 
 | 
			
		||||
    [(lambda (x) (= x (- 1 (expt 2 63))))
 | 
			
		||||
     (let ([b (make-bytevector 8 0)])
 | 
			
		||||
       (bytevector-sint-set! b 0 (- 1 (expt 2 63)) 'big 8)
 | 
			
		||||
       (bytevector-sint-ref b 0 'big 8))]
 | 
			
		||||
    [(lambda (x) (= x #x7FFFFFFF))
 | 
			
		||||
     (let ([b (make-bytevector 4 38)])
 | 
			
		||||
       (bytevector-sint-set! b 0 (sub1 (expt 2 31)) 'big 4)
 | 
			
		||||
       (bytevector-sint-ref b 0 'big 4))]
 | 
			
		||||
    [(lambda (x) (= x #x-80000000))
 | 
			
		||||
     (let ([b (make-bytevector 4 38)])
 | 
			
		||||
       (bytevector-sint-set! b 0 (- (expt 2 31)) 'big 4)
 | 
			
		||||
       (bytevector-sint-ref b 0 'big 4))]
 | 
			
		||||
    [(lambda (x) (= x #x-100000000))
 | 
			
		||||
     (let ([b (make-bytevector 5 38)])
 | 
			
		||||
       (bytevector-sint-set! b 0 (- (expt 2 32)) 'big 5)
 | 
			
		||||
       (bytevector-sint-ref b 0 'big 5))]
 | 
			
		||||
 | 
			
		||||
    ))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue