62 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Scheme
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			62 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Scheme
		
	
	
		
			Executable File
		
	
	
 | 
						|
(library (tests fxcarry)
 | 
						|
  (export test-fxcarry)
 | 
						|
  (import (ikarus) (tests framework))
 | 
						|
 | 
						|
 | 
						|
(define (fx*/carry-reference fx1 fx2 fx3)
 | 
						|
  (let* ([s (+ (* fx1 fx2) fx3)]
 | 
						|
         [s0 (mod0 s (expt 2 (fixnum-width)))]
 | 
						|
         [s1 (div0 s (expt 2 (fixnum-width)))])
 | 
						|
    (values s0 s1)))
 | 
						|
 | 
						|
(define (fx+/carry-reference fx1 fx2 fx3)
 | 
						|
  (let* ([s (+ (+ fx1 fx2) fx3)]
 | 
						|
         [s0 (mod0 s (expt 2 (fixnum-width)))]
 | 
						|
         [s1 (div0 s (expt 2 (fixnum-width)))])
 | 
						|
    (values s0 s1)))
 | 
						|
 | 
						|
(define (fx-/carry-reference fx1 fx2 fx3)
 | 
						|
  (let* ([s (- (- fx1 fx2) fx3)]
 | 
						|
         [s0 (mod0 s (expt 2 (fixnum-width)))]
 | 
						|
         [s1 (div0 s (expt 2 (fixnum-width)))])
 | 
						|
    (values s0 s1)))
 | 
						|
 | 
						|
(define (test name fxop/carry fxop/carry-reference fx1 fx2 fx3)
 | 
						|
  (let-values ([(s0 s1) (fxop/carry fx1 fx2 fx3)]
 | 
						|
               [(s2 s3) (fxop/carry-reference fx1 fx2 fx3)])
 | 
						|
    (unless (fx= s0 s2) 
 | 
						|
      (error name "failed (value1) on ~s ~s ~s, got ~s, should be ~s" 
 | 
						|
        fx1 fx2 fx3 s0 s2))
 | 
						|
    (unless (fx= s1 s3) 
 | 
						|
      (error name "failed (value2) on ~s ~s ~s, got ~s, should be ~s" 
 | 
						|
        fx1 fx2 fx3 s1 s3))))
 | 
						|
 | 
						|
(define ls 
 | 
						|
  (list 0 1 2 -1 -2 38734 -3843 2484598 -348732487 (greatest-fixnum) (least-fixnum)))
 | 
						|
 | 
						|
(define (test-fxcarry)
 | 
						|
  (printf "[~s: test-fxcarry] " (expt (length ls) 3))
 | 
						|
  (for-each 
 | 
						|
    (lambda (fx1)
 | 
						|
      (for-each 
 | 
						|
        (lambda (fx2)
 | 
						|
          (for-each 
 | 
						|
            (lambda (fx3)
 | 
						|
              (test 'fx*/carry fx*/carry fx*/carry-reference fx1 fx2 fx3)
 | 
						|
              (test 'fx+/carry fx+/carry fx+/carry-reference fx1 fx2 fx3)
 | 
						|
              (test 'fx-/carry fx-/carry fx-/carry-reference fx1 fx2 fx3))
 | 
						|
            ls))
 | 
						|
        ls))
 | 
						|
    ls)
 | 
						|
  (printf "Happy Happy Joy Joy\n"))
 | 
						|
 | 
						|
)
 | 
						|
 | 
						|
#!eof
 | 
						|
 | 
						|
(define (t x)
 | 
						|
  (= (fxsra (fx+ x 1) 1) 
 | 
						|
     (quotient x 2)))
 | 
						|
 |