* Added $fl=, $fl<, $fl>, $fl<=, $fl>= primops.
This commit is contained in:
		
							parent
							
								
									d4facf79d3
								
							
						
					
					
						commit
						3f3767800d
					
				
							
								
								
									
										
											BIN
										
									
								
								src/ikarus.boot
								
								
								
								
							
							
						
						
									
										
											BIN
										
									
								
								src/ikarus.boot
								
								
								
								
							
										
											Binary file not shown.
										
									
								
							|  | @ -496,6 +496,11 @@ | |||
|       [(and (xmmreg? dst) (or (xmmreg? src) (mem? src))) | ||||
|        (CODE #xF2 (CODE #x0F ((CODE/digit #x5E dst) src ac)))] | ||||
|       [else (error who "invalid ~s" instr)])]  | ||||
|    [(ucomisd src dst) | ||||
|     (cond | ||||
|       [(and (xmmreg? dst) (or (xmmreg? src) (mem? src))) | ||||
|        (CODE #x66 (CODE #x0F ((CODE/digit #x2E dst) src ac)))] | ||||
|       [else (error who "invalid ~s" instr)])] | ||||
|    [(addl src dst) | ||||
|     (cond    | ||||
|       [(and (imm8? src) (reg? dst))  | ||||
|  |  | |||
|  | @ -338,19 +338,6 @@ | |||
|     (binary/ (exact->inexact ($ratnum-n x))  | ||||
|              (exact->inexact ($ratnum-d x)))) | ||||
| 
 | ||||
|   #; | ||||
|   (begin | ||||
|     (define ($fl+ x y) | ||||
|       (foreign-call "ikrt_fl_plus" x y)) | ||||
|     (define ($fl- x y) | ||||
|       (foreign-call "ikrt_fl_minus" x y)) | ||||
|     (define ($fl* x y) | ||||
|       (foreign-call "ikrt_fl_times" x y)) | ||||
|     (define ($fl/ x y) | ||||
|       (foreign-call "ikrt_fl_div" x y))) | ||||
|    | ||||
| 
 | ||||
| 
 | ||||
|   (define binary+ | ||||
|     (lambda (x y) | ||||
|       (cond | ||||
|  | @ -1187,16 +1174,18 @@ | |||
|          (define-syntax bnfl?  | ||||
|            (syntax-rules () [(_ x y) (fl? (bignum->flonum x) y)])))])) | ||||
| 
 | ||||
|   (define-syntax $fl= | ||||
|     (syntax-rules () [(_ x y) (foreign-call "ikrt_fl_equal" x y)])) | ||||
|   (define-syntax $fl< | ||||
|     (syntax-rules () [(_ x y) (foreign-call "ikrt_fl_less" x y)])) | ||||
|   (define-syntax $fl<= | ||||
|     (syntax-rules () [(_ x y) (foreign-call "ikrt_fl_less_or_equal" x y)])) | ||||
|   (define-syntax $fl> | ||||
|     (syntax-rules () [(_ x y) (foreign-call "ikrt_fl_less" y x)])) | ||||
|   (define-syntax $fl>= | ||||
|     (syntax-rules () [(_ x y) (foreign-call "ikrt_fl_less_or_equal" y x)])) | ||||
|  ;;;  #; | ||||
|  ;;; (begin | ||||
|  ;;;   (define-syntax $fl= | ||||
|  ;;;     (syntax-rules () [(_ x y) (foreign-call "ikrt_fl_equal" x y)])) | ||||
|  ;;;   (define-syntax $fl< | ||||
|  ;;;     (syntax-rules () [(_ x y) (foreign-call "ikrt_fl_less" x y)])) | ||||
|  ;;;   (define-syntax $fl<= | ||||
|  ;;;     (syntax-rules () [(_ x y) (foreign-call "ikrt_fl_less_or_equal" x y)])) | ||||
|  ;;;   (define-syntax $fl> | ||||
|  ;;;     (syntax-rules () [(_ x y) (foreign-call "ikrt_fl_less" y x)])) | ||||
|  ;;;   (define-syntax $fl>= | ||||
|  ;;;     (syntax-rules () [(_ x y) (foreign-call "ikrt_fl_less_or_equal" y x)]))) | ||||
| 
 | ||||
|   (define-syntax define-flcmp | ||||
|     (syntax-rules () | ||||
|  |  | |||
|  | @ -470,7 +470,6 @@ | |||
|       [(bind lhs* rhs* e) | ||||
|        (do-bind lhs* rhs* (P e))] | ||||
|       [(primcall op rands) | ||||
|                 (unless (pair? rands) (error 'car "ha ~s" x)) | ||||
|        (let ([a (car rands)] [b (cadr rands)]) | ||||
|          (cond | ||||
|            [(and (constant? a) (constant? b)) | ||||
|  | @ -2208,6 +2207,13 @@ | |||
|         [(seq e0 e1) (make-seq (E e0) (P e1))] | ||||
|         [(asm-instr op a b)  | ||||
|          (cond | ||||
|            [(memq op '(fl:= fl:< fl:<= fl:> fl:>=))  | ||||
|             (if (mem? a)  | ||||
|                 (let ([u (mku)]) | ||||
|                   (make-seq  | ||||
|                     (E (make-asm-instr 'move u a)) | ||||
|                     (make-asm-instr op u b))) | ||||
|                 x)] | ||||
|            [(and (mem? a) (mem? b))  | ||||
|             (let ([u (mku)]) | ||||
|               (make-seq | ||||
|  | @ -2527,13 +2533,17 @@ | |||
|          (define (notop x) | ||||
|            (cond | ||||
|              [(assq x '([= !=] [!= =] [< >=] [<= >] [> <=] [>= <] | ||||
|                         [u< u>=] [u<= u>] [u> u<=] [u>= u<])) | ||||
|                         [u< u>=] [u<= u>] [u> u<=] [u>= u<] | ||||
|                         [fl:= fl:!=] [fl:!= fl:=]  | ||||
|                         [fl:< fl:>=] [fl:<= fl:>] [fl:> fl:<=] [fl:>= fl:<])) | ||||
|               => cadr] | ||||
|              [else (error who "invalid op ~s" x)])) | ||||
|          (define (jmpname x) | ||||
|            (cond | ||||
|              [(assq x '([= je] [!= jne] [< jl] [<= jle] [> jg] [>= jge] | ||||
|                         [u< jb] [u<= jbe] [u> ja] [u>= jae])) | ||||
|                         [u< jb] [u<= jbe] [u> ja] [u>= jae] | ||||
|                         [fl:= je] [fl:!= jne] | ||||
|                         [fl:< jl] [fl:> jg] [fl:<= jle] [fl:>= jge])) | ||||
|               => cadr] | ||||
|              [else (error who "invalid jmpname ~s" x)])) | ||||
|          (define (revjmpname x) | ||||
|  | @ -2544,6 +2554,10 @@ | |||
|              [else (error who "invalid jmpname ~s" x)])) | ||||
|          (define (cmp op a0 a1 lab ac) | ||||
|            (cond | ||||
|              [(memq op '(fl:= fl:!= fl:< fl:<= fl:> fl:>=)) | ||||
|               (list* `(ucomisd ,(R (make-disp a0 a1)) xmm0) | ||||
|                      `(,(jmpname op) ,lab) | ||||
|                      ac)] | ||||
|              [(or (symbol? a0) (constant? a1)) | ||||
|               (list* `(cmpl ,(R a1) ,(R a0)) | ||||
|                      `(,(jmpname op) ,lab) | ||||
|  |  | |||
|  | @ -607,6 +607,11 @@ | |||
|     [$fl-                           $flonums] | ||||
|     [$fl*                           $flonums] | ||||
|     [$fl/                           $flonums] | ||||
|     [$fl=                           $flonums] | ||||
|     [$fl<                           $flonums] | ||||
|     [$fl<=                           $flonums] | ||||
|     [$fl>                           $flonums] | ||||
|     [$fl>=                           $flonums] | ||||
| 
 | ||||
|     [$make-bignum       $bignums] | ||||
|     [$bignum-positive?  $bignums] | ||||
|  |  | |||
|  | @ -729,6 +729,11 @@ | |||
|      (prm 'fl:store x (K (- disp-flonum-data vector-tag))) | ||||
|      x)) | ||||
| 
 | ||||
| (define ($flcmp-aux op fl0 fl1) | ||||
|   (make-seq  | ||||
|     (prm 'fl:load (T fl0) (K (- disp-flonum-data vector-tag))) | ||||
|     (prm op (T fl1) (K (- disp-flonum-data vector-tag))))) | ||||
| 
 | ||||
| (define-primop flonum? safe | ||||
|   [(P x) (sec-tag-test (T x) vector-mask vector-tag #f flonum-tag)] | ||||
|   [(E x) (nop)]) | ||||
|  | @ -777,6 +782,17 @@ | |||
| (define-primop $fl/ unsafe | ||||
|   [(V x y) ($flop-aux 'fl:div! x y)]) | ||||
| 
 | ||||
| (define-primop $fl= unsafe | ||||
|   [(P x y) ($flcmp-aux 'fl:= x y)]) | ||||
| (define-primop $fl< unsafe | ||||
|   [(P x y) ($flcmp-aux 'fl:< x y)]) | ||||
| (define-primop $fl<= unsafe | ||||
|   [(P x y) ($flcmp-aux 'fl:<= x y)]) | ||||
| (define-primop $fl> unsafe | ||||
|   [(P x y) ($flcmp-aux 'fl:> x y)]) | ||||
| (define-primop $fl>= unsafe | ||||
|   [(P x y) ($flcmp-aux 'fl:>= x y)]) | ||||
| 
 | ||||
| /section) | ||||
| 
 | ||||
| (section ;;; ratnums | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Abdulaziz Ghuloum
						Abdulaziz Ghuloum