| 
									
										
										
										
											2008-01-09 05:00:02 -05:00
										 |  |  | ! Copyright (C) 2007, 2008 Slava Pestov. | 
					
						
							| 
									
										
										
										
											2007-09-21 23:29:38 -04:00
										 |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							| 
									
										
										
										
											2008-07-11 18:25:46 -04:00
										 |  |  | USING: bootstrap.image.private kernel kernel.private namespaces | 
					
						
							| 
									
										
										
										
											2008-08-12 04:31:48 -04:00
										 |  |  | system cpu.x86.assembler layouts compiler.units math | 
					
						
							| 
									
										
										
										
											2008-10-23 06:49:32 -04:00
										 |  |  | math.private compiler.constants vocabs slots.private words | 
					
						
							|  |  |  | words.private locals.backend ;
 | 
					
						
							| 
									
										
										
										
											2007-09-21 23:29:38 -04:00
										 |  |  | IN: bootstrap.x86 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | big-endian off
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 1 jit-code-format set
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ | 
					
						
							| 
									
										
										
										
											2008-01-02 19:36:36 -05:00
										 |  |  |     ! Load word | 
					
						
							| 
									
										
										
										
											2008-01-12 18:46:22 -05:00
										 |  |  |     temp-reg 0 MOV | 
					
						
							| 
									
										
										
										
											2008-01-02 19:36:36 -05:00
										 |  |  |     ! Bump profiling counter | 
					
						
							| 
									
										
										
										
											2008-01-02 22:07:25 -05:00
										 |  |  |     temp-reg profile-count-offset [+] 1 tag-fixnum ADD | 
					
						
							| 
									
										
										
										
											2008-01-02 19:36:36 -05:00
										 |  |  |     ! Load word->code | 
					
						
							| 
									
										
										
										
											2008-01-02 22:07:25 -05:00
										 |  |  |     temp-reg temp-reg word-code-offset [+] MOV | 
					
						
							| 
									
										
										
										
											2008-01-02 19:36:36 -05:00
										 |  |  |     ! Compute word XT | 
					
						
							| 
									
										
										
										
											2008-01-02 22:07:25 -05:00
										 |  |  |     temp-reg compiled-header-size ADD | 
					
						
							| 
									
										
										
										
											2008-01-02 19:36:36 -05:00
										 |  |  |     ! Jump to XT | 
					
						
							| 
									
										
										
										
											2008-01-02 22:07:25 -05:00
										 |  |  |     temp-reg JMP | 
					
						
							| 
									
										
										
										
											2008-11-24 07:40:51 -05:00
										 |  |  | ] rc-absolute-cell rt-immediate 1 rex-length + jit-profiling jit-define | 
					
						
							| 
									
										
										
										
											2008-01-02 19:36:36 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | [ | 
					
						
							| 
									
										
										
										
											2008-01-12 21:38:57 -05:00
										 |  |  |     temp-reg 0 MOV                             ! load XT | 
					
						
							| 
									
										
										
										
											2007-12-25 23:40:36 -05:00
										 |  |  |     stack-frame-size PUSH                      ! save stack frame size | 
					
						
							| 
									
										
										
										
											2008-01-12 21:38:57 -05:00
										 |  |  |     temp-reg PUSH                              ! push XT | 
					
						
							| 
									
										
										
										
											2008-11-07 21:33:32 -05:00
										 |  |  |     stack-reg stack-frame-size 3 bootstrap-cells - SUB   ! alignment | 
					
						
							| 
									
										
										
										
											2008-01-12 21:38:57 -05:00
										 |  |  | ] rc-absolute-cell rt-label 1 rex-length + jit-prolog jit-define | 
					
						
							| 
									
										
										
										
											2007-12-25 23:40:36 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-12 23:27:28 -04:00
										 |  |  | [ | 
					
						
							|  |  |  |     arg0 0 MOV                                 ! load literal | 
					
						
							|  |  |  |     ds-reg bootstrap-cell ADD                  ! increment datastack pointer | 
					
						
							|  |  |  |     ds-reg [] arg0 MOV                         ! store literal on datastack | 
					
						
							|  |  |  | ] rc-absolute-cell rt-immediate 1 rex-length + jit-push-immediate jit-define | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-12-25 23:40:36 -05:00
										 |  |  | [ | 
					
						
							| 
									
										
										
										
											2008-11-24 01:23:17 -05:00
										 |  |  |     f JMP | 
					
						
							| 
									
										
										
										
											2007-12-26 02:33:49 -05:00
										 |  |  | ] rc-relative rt-xt 1 jit-word-jump jit-define | 
					
						
							| 
									
										
										
										
											2007-12-25 23:40:36 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | [ | 
					
						
							| 
									
										
										
										
											2008-11-24 01:23:17 -05:00
										 |  |  |     f CALL | 
					
						
							| 
									
										
										
										
											2007-12-26 20:02:41 -05:00
										 |  |  | ] rc-relative rt-xt 1 jit-word-call jit-define | 
					
						
							| 
									
										
										
										
											2007-12-25 23:40:36 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-12-26 01:45:16 -05:00
										 |  |  | [ | 
					
						
							| 
									
										
										
										
											2007-09-21 23:29:38 -04:00
										 |  |  |     arg0 ds-reg [] MOV                         ! load boolean | 
					
						
							|  |  |  |     ds-reg bootstrap-cell SUB                  ! pop boolean | 
					
						
							| 
									
										
										
										
											2008-11-24 01:23:17 -05:00
										 |  |  |     arg0 \ f tag-number CMP                    ! compare boolean with f | 
					
						
							|  |  |  |     f JNE                                      ! jump to true branch if not equal | 
					
						
							|  |  |  | ] rc-relative rt-xt 10 rex-length 3 * + jit-if-1 jit-define | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ | 
					
						
							|  |  |  |     f JMP                                      ! jump to false branch if equal | 
					
						
							|  |  |  | ] rc-relative rt-xt 1 jit-if-2 jit-define | 
					
						
							| 
									
										
										
										
											2007-09-21 23:29:38 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | [ | 
					
						
							| 
									
										
										
										
											2008-01-12 18:46:22 -05:00
										 |  |  |     arg1 0 MOV                                 ! load dispatch table | 
					
						
							| 
									
										
										
										
											2007-09-21 23:29:38 -04:00
										 |  |  |     arg0 ds-reg [] MOV                         ! load index | 
					
						
							|  |  |  |     fixnum>slot@                               ! turn it into an array offset | 
					
						
							|  |  |  |     ds-reg bootstrap-cell SUB                  ! pop index | 
					
						
							| 
									
										
										
										
											2007-12-26 01:45:16 -05:00
										 |  |  |     arg0 arg1 ADD                              ! compute quotation location | 
					
						
							| 
									
										
										
										
											2008-06-08 16:32:55 -04:00
										 |  |  |     arg0 arg0 array-start-offset [+] MOV       ! load quotation | 
					
						
							|  |  |  |     arg0 quot-xt-offset [+] JMP                ! execute branch | 
					
						
							| 
									
										
										
										
											2008-11-24 07:40:51 -05:00
										 |  |  | ] rc-absolute-cell rt-immediate 1 rex-length + jit-dispatch jit-define | 
					
						
							| 
									
										
										
										
											2007-09-21 23:29:38 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-23 03:44:56 -05:00
										 |  |  | : jit->r ( -- )
 | 
					
						
							|  |  |  |     rs-reg bootstrap-cell ADD | 
					
						
							| 
									
										
										
										
											2008-11-24 01:23:17 -05:00
										 |  |  |     arg0 ds-reg [] MOV | 
					
						
							| 
									
										
										
										
											2008-11-23 03:44:56 -05:00
										 |  |  |     ds-reg bootstrap-cell SUB | 
					
						
							| 
									
										
										
										
											2008-11-24 01:23:17 -05:00
										 |  |  |     rs-reg [] arg0 MOV ;
 | 
					
						
							| 
									
										
										
										
											2008-11-23 03:44:56 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : jit-2>r ( -- )
 | 
					
						
							|  |  |  |     rs-reg 2 bootstrap-cells ADD | 
					
						
							| 
									
										
										
										
											2008-11-24 01:23:17 -05:00
										 |  |  |     arg0 ds-reg [] MOV | 
					
						
							| 
									
										
										
										
											2008-11-23 03:44:56 -05:00
										 |  |  |     arg1 ds-reg -1 bootstrap-cells [+] MOV | 
					
						
							|  |  |  |     ds-reg 2 bootstrap-cells SUB | 
					
						
							| 
									
										
										
										
											2008-11-24 01:23:17 -05:00
										 |  |  |     rs-reg [] arg0 MOV | 
					
						
							| 
									
										
										
										
											2008-11-23 03:44:56 -05:00
										 |  |  |     rs-reg -1 bootstrap-cells [+] arg1 MOV ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : jit-3>r ( -- )
 | 
					
						
							|  |  |  |     rs-reg 3 bootstrap-cells ADD | 
					
						
							| 
									
										
										
										
											2008-11-24 01:23:17 -05:00
										 |  |  |     arg0 ds-reg [] MOV | 
					
						
							| 
									
										
										
										
											2008-11-23 03:44:56 -05:00
										 |  |  |     arg1 ds-reg -1 bootstrap-cells [+] MOV | 
					
						
							|  |  |  |     arg2 ds-reg -2 bootstrap-cells [+] MOV | 
					
						
							|  |  |  |     ds-reg 3 bootstrap-cells SUB | 
					
						
							| 
									
										
										
										
											2008-11-24 01:23:17 -05:00
										 |  |  |     rs-reg [] arg0 MOV | 
					
						
							| 
									
										
										
										
											2008-11-23 03:44:56 -05:00
										 |  |  |     rs-reg -1 bootstrap-cells [+] arg1 MOV | 
					
						
							|  |  |  |     rs-reg -2 bootstrap-cells [+] arg2 MOV ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : jit-r> ( -- )
 | 
					
						
							|  |  |  |     ds-reg bootstrap-cell ADD | 
					
						
							| 
									
										
										
										
											2008-11-24 01:23:17 -05:00
										 |  |  |     arg0 rs-reg [] MOV | 
					
						
							| 
									
										
										
										
											2008-11-23 03:44:56 -05:00
										 |  |  |     rs-reg bootstrap-cell SUB | 
					
						
							| 
									
										
										
										
											2008-11-24 01:23:17 -05:00
										 |  |  |     ds-reg [] arg0 MOV ;
 | 
					
						
							| 
									
										
										
										
											2008-11-23 03:44:56 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : jit-2r> ( -- )
 | 
					
						
							|  |  |  |     ds-reg 2 bootstrap-cells ADD | 
					
						
							| 
									
										
										
										
											2008-11-24 01:23:17 -05:00
										 |  |  |     arg0 rs-reg [] MOV | 
					
						
							| 
									
										
										
										
											2008-11-23 03:44:56 -05:00
										 |  |  |     arg1 rs-reg -1 bootstrap-cells [+] MOV | 
					
						
							|  |  |  |     rs-reg 2 bootstrap-cells SUB | 
					
						
							| 
									
										
										
										
											2008-11-24 01:23:17 -05:00
										 |  |  |     ds-reg [] arg0 MOV | 
					
						
							| 
									
										
										
										
											2008-11-23 03:44:56 -05:00
										 |  |  |     ds-reg -1 bootstrap-cells [+] arg1 MOV ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : jit-3r> ( -- )
 | 
					
						
							|  |  |  |     ds-reg 3 bootstrap-cells ADD | 
					
						
							| 
									
										
										
										
											2008-11-24 01:23:17 -05:00
										 |  |  |     arg0 rs-reg [] MOV | 
					
						
							| 
									
										
										
										
											2008-11-23 03:44:56 -05:00
										 |  |  |     arg1 rs-reg -1 bootstrap-cells [+] MOV | 
					
						
							|  |  |  |     arg2 rs-reg -2 bootstrap-cells [+] MOV | 
					
						
							|  |  |  |     rs-reg 3 bootstrap-cells SUB | 
					
						
							| 
									
										
										
										
											2008-11-24 01:23:17 -05:00
										 |  |  |     ds-reg [] arg0 MOV | 
					
						
							| 
									
										
										
										
											2008-11-23 03:44:56 -05:00
										 |  |  |     ds-reg -1 bootstrap-cells [+] arg1 MOV | 
					
						
							|  |  |  |     ds-reg -2 bootstrap-cells [+] arg2 MOV ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ | 
					
						
							|  |  |  |     jit->r | 
					
						
							| 
									
										
										
										
											2008-11-24 01:23:17 -05:00
										 |  |  |     f CALL | 
					
						
							| 
									
										
										
										
											2008-11-23 03:44:56 -05:00
										 |  |  |     jit-r> | 
					
						
							| 
									
										
										
										
											2008-11-24 01:23:17 -05:00
										 |  |  | ] rc-relative rt-xt 11 rex-length 4 * + jit-dip jit-define | 
					
						
							| 
									
										
										
										
											2008-11-23 03:44:56 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | [ | 
					
						
							|  |  |  |     jit-2>r | 
					
						
							| 
									
										
										
										
											2008-11-24 01:23:17 -05:00
										 |  |  |     f CALL | 
					
						
							| 
									
										
										
										
											2008-11-23 03:44:56 -05:00
										 |  |  |     jit-2r> | 
					
						
							| 
									
										
										
										
											2008-11-24 01:23:17 -05:00
										 |  |  | ] rc-relative rt-xt 17 rex-length 6 * + jit-2dip jit-define | 
					
						
							| 
									
										
										
										
											2008-11-23 03:44:56 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | [ | 
					
						
							|  |  |  |     jit-3>r                                     | 
					
						
							| 
									
										
										
										
											2008-11-24 01:23:17 -05:00
										 |  |  |     f CALL | 
					
						
							| 
									
										
										
										
											2008-11-23 03:44:56 -05:00
										 |  |  |     jit-3r> | 
					
						
							| 
									
										
										
										
											2008-11-24 01:23:17 -05:00
										 |  |  | ] rc-relative rt-xt 23 rex-length 8 * + jit-3dip jit-define | 
					
						
							| 
									
										
										
										
											2008-11-23 03:44:56 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-11 18:25:46 -04:00
										 |  |  | [ | 
					
						
							|  |  |  |     stack-reg stack-frame-size bootstrap-cell - ADD ! unwind stack frame | 
					
						
							|  |  |  | ] f f f jit-epilog jit-define | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ 0 RET ] f f f jit-return jit-define | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ! Sub-primitives | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ! Quotations and words | 
					
						
							|  |  |  | [ | 
					
						
							|  |  |  |     arg0 ds-reg [] MOV                         ! load from stack | 
					
						
							|  |  |  |     ds-reg bootstrap-cell SUB                  ! pop stack | 
					
						
							|  |  |  |     arg0 quot-xt-offset [+] JMP                ! call quotation | 
					
						
							|  |  |  | ] f f f \ (call) define-sub-primitive | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ | 
					
						
							|  |  |  |     arg0 ds-reg [] MOV                         ! load from stack | 
					
						
							|  |  |  |     ds-reg bootstrap-cell SUB                  ! pop stack | 
					
						
							|  |  |  |     arg0 word-xt-offset [+] JMP                ! execute word | 
					
						
							|  |  |  | ] f f f \ (execute) define-sub-primitive | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ! Objects | 
					
						
							| 
									
										
										
										
											2008-07-07 11:39:04 -04:00
										 |  |  | [ | 
					
						
							|  |  |  |     arg1 ds-reg [] MOV                         ! load from stack | 
					
						
							|  |  |  |     arg1 tag-mask get AND                      ! compute tag | 
					
						
							|  |  |  |     arg1 tag-bits get SHL                      ! tag the tag | 
					
						
							|  |  |  |     ds-reg [] arg1 MOV                         ! push to stack | 
					
						
							| 
									
										
										
										
											2008-07-11 18:25:46 -04:00
										 |  |  | ] f f f \ tag define-sub-primitive | 
					
						
							| 
									
										
										
										
											2008-07-07 11:39:04 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | [ | 
					
						
							|  |  |  |     arg0 ds-reg [] MOV                         ! load slot number | 
					
						
							|  |  |  |     ds-reg bootstrap-cell SUB                  ! adjust stack pointer | 
					
						
							|  |  |  |     arg1 ds-reg [] MOV                         ! load object | 
					
						
							|  |  |  |     fixnum>slot@                               ! turn slot number into offset | 
					
						
							|  |  |  |     arg1 tag-bits get SHR                      ! mask off tag | 
					
						
							|  |  |  |     arg1 tag-bits get SHL | 
					
						
							|  |  |  |     arg0 arg1 arg0 [+] MOV                     ! load slot value | 
					
						
							|  |  |  |     ds-reg [] arg0 MOV                         ! push to stack | 
					
						
							| 
									
										
										
										
											2008-07-11 18:25:46 -04:00
										 |  |  | ] f f f \ slot define-sub-primitive | 
					
						
							| 
									
										
										
										
											2008-07-07 11:39:04 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-11 18:25:46 -04:00
										 |  |  | ! Shufflers | 
					
						
							| 
									
										
										
										
											2008-07-07 11:39:04 -04:00
										 |  |  | [ | 
					
						
							|  |  |  |     ds-reg bootstrap-cell SUB | 
					
						
							| 
									
										
										
										
											2008-07-11 18:25:46 -04:00
										 |  |  | ] f f f \ drop define-sub-primitive | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ | 
					
						
							|  |  |  |     ds-reg 2 bootstrap-cells SUB | 
					
						
							|  |  |  | ] f f f \ 2drop define-sub-primitive | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ | 
					
						
							|  |  |  |     ds-reg 3 bootstrap-cells SUB | 
					
						
							|  |  |  | ] f f f \ 3drop define-sub-primitive | 
					
						
							| 
									
										
										
										
											2008-07-07 11:39:04 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | [ | 
					
						
							|  |  |  |     arg0 ds-reg [] MOV | 
					
						
							|  |  |  |     ds-reg bootstrap-cell ADD | 
					
						
							|  |  |  |     ds-reg [] arg0 MOV | 
					
						
							| 
									
										
										
										
											2008-07-11 18:25:46 -04:00
										 |  |  | ] f f f \ dup define-sub-primitive | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ | 
					
						
							|  |  |  |     arg0 ds-reg [] MOV | 
					
						
							|  |  |  |     arg1 ds-reg bootstrap-cell neg [+] MOV | 
					
						
							|  |  |  |     ds-reg 2 bootstrap-cells ADD | 
					
						
							|  |  |  |     ds-reg [] arg0 MOV | 
					
						
							|  |  |  |     ds-reg bootstrap-cell neg [+] arg1 MOV | 
					
						
							|  |  |  | ] f f f \ 2dup define-sub-primitive | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ | 
					
						
							|  |  |  |     arg0 ds-reg [] MOV | 
					
						
							|  |  |  |     arg1 ds-reg -1 bootstrap-cells [+] MOV | 
					
						
							|  |  |  |     temp-reg ds-reg -2 bootstrap-cells [+] MOV | 
					
						
							|  |  |  |     ds-reg 3 bootstrap-cells ADD | 
					
						
							|  |  |  |     ds-reg [] arg0 MOV | 
					
						
							|  |  |  |     ds-reg -1 bootstrap-cells [+] arg1 MOV | 
					
						
							|  |  |  |     ds-reg -2 bootstrap-cells [+] temp-reg MOV | 
					
						
							|  |  |  | ] f f f \ 3dup define-sub-primitive | 
					
						
							| 
									
										
										
										
											2008-07-07 11:39:04 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | [ | 
					
						
							|  |  |  |     arg0 ds-reg [] MOV | 
					
						
							|  |  |  |     ds-reg bootstrap-cell SUB | 
					
						
							| 
									
										
										
										
											2008-07-11 18:25:46 -04:00
										 |  |  |     ds-reg [] arg0 MOV | 
					
						
							|  |  |  | ] f f f \ nip define-sub-primitive | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ | 
					
						
							|  |  |  |     arg0 ds-reg [] MOV | 
					
						
							|  |  |  |     ds-reg 2 bootstrap-cells SUB | 
					
						
							|  |  |  |     ds-reg [] arg0 MOV | 
					
						
							|  |  |  | ] f f f \ 2nip define-sub-primitive | 
					
						
							| 
									
										
										
										
											2008-07-07 11:39:04 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | [ | 
					
						
							| 
									
										
										
										
											2008-07-11 18:25:46 -04:00
										 |  |  |     arg0 ds-reg -1 bootstrap-cells [+] MOV | 
					
						
							|  |  |  |     ds-reg bootstrap-cell ADD | 
					
						
							|  |  |  |     ds-reg [] arg0 MOV | 
					
						
							|  |  |  | ] f f f \ over define-sub-primitive | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ | 
					
						
							|  |  |  |     arg0 ds-reg -2 bootstrap-cells [+] MOV | 
					
						
							| 
									
										
										
										
											2008-07-07 11:39:04 -04:00
										 |  |  |     ds-reg bootstrap-cell ADD | 
					
						
							|  |  |  |     ds-reg [] arg0 MOV | 
					
						
							| 
									
										
										
										
											2008-07-11 18:25:46 -04:00
										 |  |  | ] f f f \ pick define-sub-primitive | 
					
						
							| 
									
										
										
										
											2008-07-07 11:39:04 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | [ | 
					
						
							|  |  |  |     arg0 ds-reg [] MOV | 
					
						
							| 
									
										
										
										
											2008-07-11 18:25:46 -04:00
										 |  |  |     arg1 ds-reg -1 bootstrap-cells [+] MOV | 
					
						
							| 
									
										
										
										
											2008-07-07 11:39:04 -04:00
										 |  |  |     ds-reg [] arg1 MOV | 
					
						
							| 
									
										
										
										
											2008-07-11 18:25:46 -04:00
										 |  |  |     ds-reg bootstrap-cell ADD | 
					
						
							|  |  |  |     ds-reg [] arg0 MOV | 
					
						
							|  |  |  | ] f f f \ dupd define-sub-primitive | 
					
						
							| 
									
										
										
										
											2008-07-07 11:39:04 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | [ | 
					
						
							| 
									
										
										
										
											2008-07-11 18:25:46 -04:00
										 |  |  |     arg0 ds-reg [] MOV | 
					
						
							|  |  |  |     arg1 ds-reg -1 bootstrap-cells [+] MOV | 
					
						
							| 
									
										
										
										
											2008-07-07 11:39:04 -04:00
										 |  |  |     ds-reg bootstrap-cell ADD | 
					
						
							|  |  |  |     ds-reg [] arg0 MOV | 
					
						
							| 
									
										
										
										
											2008-07-11 18:25:46 -04:00
										 |  |  |     ds-reg -1 bootstrap-cells [+] arg1 MOV | 
					
						
							|  |  |  |     ds-reg -2 bootstrap-cells [+] arg0 MOV | 
					
						
							|  |  |  | ] f f f \ tuck define-sub-primitive | 
					
						
							| 
									
										
										
										
											2008-07-07 11:39:04 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | [ | 
					
						
							|  |  |  |     arg0 ds-reg [] MOV | 
					
						
							| 
									
										
										
										
											2008-07-11 18:25:46 -04:00
										 |  |  |     arg1 ds-reg bootstrap-cell neg [+] MOV | 
					
						
							|  |  |  |     ds-reg bootstrap-cell neg [+] arg0 MOV | 
					
						
							|  |  |  |     ds-reg [] arg1 MOV | 
					
						
							|  |  |  | ] f f f \ swap define-sub-primitive | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ | 
					
						
							|  |  |  |     arg0 ds-reg -1 bootstrap-cells [+] MOV | 
					
						
							|  |  |  |     arg1 ds-reg -2 bootstrap-cells [+] MOV | 
					
						
							|  |  |  |     ds-reg -2 bootstrap-cells [+] arg0 MOV | 
					
						
							|  |  |  |     ds-reg -1 bootstrap-cells [+] arg1 MOV | 
					
						
							|  |  |  | ] f f f \ swapd define-sub-primitive | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ | 
					
						
							|  |  |  |     arg0 ds-reg [] MOV | 
					
						
							|  |  |  |     arg1 ds-reg -1 bootstrap-cells [+] MOV | 
					
						
							|  |  |  |     temp-reg ds-reg -2 bootstrap-cells [+] MOV | 
					
						
							|  |  |  |     ds-reg -2 bootstrap-cells [+] arg1 MOV | 
					
						
							|  |  |  |     ds-reg -1 bootstrap-cells [+] arg0 MOV | 
					
						
							|  |  |  |     ds-reg [] temp-reg MOV | 
					
						
							|  |  |  | ] f f f \ rot define-sub-primitive | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ | 
					
						
							|  |  |  |     arg0 ds-reg [] MOV | 
					
						
							|  |  |  |     arg1 ds-reg -1 bootstrap-cells [+] MOV | 
					
						
							|  |  |  |     temp-reg ds-reg -2 bootstrap-cells [+] MOV | 
					
						
							|  |  |  |     ds-reg -2 bootstrap-cells [+] arg0 MOV | 
					
						
							|  |  |  |     ds-reg -1 bootstrap-cells [+] temp-reg MOV | 
					
						
							| 
									
										
										
										
											2008-07-07 11:39:04 -04:00
										 |  |  |     ds-reg [] arg1 MOV | 
					
						
							| 
									
										
										
										
											2008-07-11 18:25:46 -04:00
										 |  |  | ] f f f \ -rot define-sub-primitive | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-23 03:44:56 -05:00
										 |  |  | [ jit->r ] f f f \ >r define-sub-primitive | 
					
						
							| 
									
										
										
										
											2008-07-07 11:39:04 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-23 03:44:56 -05:00
										 |  |  | [ jit-r> ] f f f \ r> define-sub-primitive | 
					
						
							| 
									
										
										
										
											2008-07-11 18:25:46 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | ! Comparisons | 
					
						
							|  |  |  | : jit-compare ( insn -- )
 | 
					
						
							| 
									
										
										
										
											2008-11-24 09:16:14 -05:00
										 |  |  |     temp-reg 0 MOV                             ! load t | 
					
						
							|  |  |  |     arg1 \ f tag-number MOV                    ! load f | 
					
						
							| 
									
										
										
										
											2008-07-11 18:25:46 -04:00
										 |  |  |     arg0 ds-reg [] MOV                         ! load first value | 
					
						
							|  |  |  |     ds-reg bootstrap-cell SUB                  ! adjust stack pointer | 
					
						
							|  |  |  |     ds-reg [] arg0 CMP                         ! compare with second value | 
					
						
							|  |  |  |     [ arg1 temp-reg ] dip execute              ! move t if true | 
					
						
							| 
									
										
										
										
											2008-07-07 11:39:04 -04:00
										 |  |  |     ds-reg [] arg1 MOV                         ! store | 
					
						
							| 
									
										
										
										
											2008-07-11 18:25:46 -04:00
										 |  |  |     ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : define-jit-compare ( insn word -- )
 | 
					
						
							| 
									
										
										
										
											2008-11-24 09:16:14 -05:00
										 |  |  |     [ [ jit-compare ] curry rc-absolute-cell rt-immediate 1 rex-length + ] dip
 | 
					
						
							| 
									
										
										
										
											2008-07-11 18:25:46 -04:00
										 |  |  |     define-sub-primitive ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-24 09:16:14 -05:00
										 |  |  | \ CMOVE \ eq? define-jit-compare | 
					
						
							|  |  |  | \ CMOVGE \ fixnum>= define-jit-compare | 
					
						
							|  |  |  | \ CMOVLE \ fixnum<= define-jit-compare | 
					
						
							|  |  |  | \ CMOVG \ fixnum> define-jit-compare | 
					
						
							|  |  |  | \ CMOVL \ fixnum< define-jit-compare | 
					
						
							| 
									
										
										
										
											2008-07-11 18:25:46 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | ! Math | 
					
						
							|  |  |  | : jit-math ( insn -- )
 | 
					
						
							|  |  |  |     arg0 ds-reg [] MOV                         ! load second input | 
					
						
							|  |  |  |     ds-reg bootstrap-cell SUB                  ! pop stack | 
					
						
							| 
									
										
										
										
											2008-11-05 05:15:48 -05:00
										 |  |  |     [ ds-reg [] arg0 ] dip execute             ! compute result | 
					
						
							| 
									
										
										
										
											2008-07-11 18:25:46 -04:00
										 |  |  |     ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ \ ADD jit-math ] f f f \ fixnum+fast define-sub-primitive | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ \ SUB jit-math ] f f f \ fixnum-fast define-sub-primitive | 
					
						
							| 
									
										
										
										
											2008-07-07 11:39:04 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-21 23:29:38 -04:00
										 |  |  | [ | 
					
						
							| 
									
										
										
										
											2008-07-11 18:25:46 -04:00
										 |  |  |     arg0 ds-reg [] MOV                         ! load second input | 
					
						
							|  |  |  |     ds-reg bootstrap-cell SUB                  ! pop stack | 
					
						
							|  |  |  |     arg1 ds-reg [] MOV                         ! load first input | 
					
						
							|  |  |  |     arg0 tag-bits get SAR                      ! untag second input | 
					
						
							|  |  |  |     arg0 arg1 IMUL2                            ! multiply | 
					
						
							|  |  |  |     ds-reg [] arg1 MOV                         ! push result | 
					
						
							|  |  |  | ] f f f \ fixnum*fast define-sub-primitive | 
					
						
							| 
									
										
										
										
											2007-09-21 23:29:38 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-11 18:25:46 -04:00
										 |  |  | [ \ AND jit-math ] f f f \ fixnum-bitand define-sub-primitive | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ \ OR jit-math ] f f f \ fixnum-bitor define-sub-primitive | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ \ XOR jit-math ] f f f \ fixnum-bitxor define-sub-primitive | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ | 
					
						
							| 
									
										
										
										
											2008-11-05 05:15:48 -05:00
										 |  |  |     ds-reg [] NOT                              ! complement | 
					
						
							|  |  |  |     ds-reg [] tag-mask get XOR                 ! clear tag bits | 
					
						
							| 
									
										
										
										
											2008-07-11 18:25:46 -04:00
										 |  |  | ] f f f \ fixnum-bitnot define-sub-primitive | 
					
						
							| 
									
										
										
										
											2007-09-21 23:29:38 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-03 01:03:39 -05:00
										 |  |  | [ | 
					
						
							| 
									
										
										
										
											2008-11-03 02:18:35 -05:00
										 |  |  |     shift-arg ds-reg [] MOV                    ! load shift count | 
					
						
							|  |  |  |     shift-arg tag-bits get SAR                 ! untag shift count | 
					
						
							| 
									
										
										
										
											2008-11-03 01:03:39 -05:00
										 |  |  |     ds-reg bootstrap-cell SUB                  ! adjust stack pointer | 
					
						
							| 
									
										
										
										
											2008-11-07 21:33:32 -05:00
										 |  |  |     temp-reg ds-reg [] MOV                     ! load value | 
					
						
							|  |  |  |     arg1 temp-reg MOV                          ! make a copy | 
					
						
							| 
									
										
										
										
											2008-11-03 01:03:39 -05:00
										 |  |  |     arg1 CL SHL                                ! compute positive shift value in arg1 | 
					
						
							| 
									
										
										
										
											2008-11-03 02:18:35 -05:00
										 |  |  |     shift-arg NEG                              ! compute negative shift value in arg0 | 
					
						
							| 
									
										
										
										
											2008-11-07 21:33:32 -05:00
										 |  |  |     temp-reg CL SAR | 
					
						
							|  |  |  |     temp-reg tag-mask get bitnot AND | 
					
						
							| 
									
										
										
										
											2008-11-03 02:18:35 -05:00
										 |  |  |     shift-arg 0 CMP                            ! if shift count was negative, move arg0 to arg1 | 
					
						
							| 
									
										
										
										
											2008-11-07 21:33:32 -05:00
										 |  |  |     arg1 temp-reg CMOVGE | 
					
						
							| 
									
										
										
										
											2008-11-03 01:03:39 -05:00
										 |  |  |     ds-reg [] arg1 MOV                         ! push to stack | 
					
						
							|  |  |  | ] f f f \ fixnum-shift-fast define-sub-primitive | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-23 01:09:23 -05:00
										 |  |  | : jit-fixnum-/mod ( -- )
 | 
					
						
							| 
									
										
										
										
											2008-11-03 02:18:35 -05:00
										 |  |  |     temp-reg ds-reg [] MOV                     ! load second parameter | 
					
						
							| 
									
										
										
										
											2008-11-21 03:11:36 -05:00
										 |  |  |     div-arg ds-reg bootstrap-cell neg [+] MOV  ! load first parameter | 
					
						
							| 
									
										
										
										
											2008-11-03 02:18:35 -05:00
										 |  |  |     mod-arg div-arg MOV                        ! make a copy | 
					
						
							|  |  |  |     mod-arg bootstrap-cell-bits 1- SAR         ! sign-extend | 
					
						
							| 
									
										
										
										
											2008-11-21 03:11:36 -05:00
										 |  |  |     temp-reg IDIV ;                            ! divide | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ | 
					
						
							|  |  |  |     jit-fixnum-/mod | 
					
						
							|  |  |  |     ds-reg bootstrap-cell SUB                  ! adjust stack pointer | 
					
						
							| 
									
										
										
										
											2008-11-03 02:18:35 -05:00
										 |  |  |     ds-reg [] mod-arg MOV                      ! push to stack | 
					
						
							|  |  |  | ] f f f \ fixnum-mod define-sub-primitive | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-21 03:11:36 -05:00
										 |  |  | [ | 
					
						
							|  |  |  |     jit-fixnum-/mod | 
					
						
							|  |  |  |     ds-reg bootstrap-cell SUB                  ! adjust stack pointer | 
					
						
							|  |  |  |     div-arg tag-bits get SHL                   ! tag it | 
					
						
							|  |  |  |     ds-reg [] div-arg MOV                      ! push to stack | 
					
						
							|  |  |  | ] f f f \ fixnum/i-fast define-sub-primitive | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ | 
					
						
							|  |  |  |     jit-fixnum-/mod | 
					
						
							|  |  |  |     div-arg tag-bits get SHL                   ! tag it | 
					
						
							|  |  |  |     ds-reg [] mod-arg MOV                      ! push to stack | 
					
						
							|  |  |  |     ds-reg bootstrap-cell neg [+] div-arg MOV | 
					
						
							|  |  |  | ] f f f \ fixnum/mod-fast define-sub-primitive | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-28 09:35:02 -05:00
										 |  |  | [ | 
					
						
							|  |  |  |     arg0 ds-reg [] MOV | 
					
						
							|  |  |  |     arg0 ds-reg bootstrap-cell neg [+] OR | 
					
						
							|  |  |  |     ds-reg bootstrap-cell ADD | 
					
						
							|  |  |  |     arg0 tag-mask get AND | 
					
						
							|  |  |  |     arg0 \ f tag-number MOV | 
					
						
							|  |  |  |     arg1 1 tag-fixnum MOV | 
					
						
							|  |  |  |     arg0 arg1 CMOVE | 
					
						
							|  |  |  |     ds-reg [] arg0 MOV | 
					
						
							|  |  |  | ] f f f \ both-fixnums? define-sub-primitive | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-23 06:49:32 -04:00
										 |  |  | [ | 
					
						
							|  |  |  |     arg0 ds-reg [] MOV                         ! load local number | 
					
						
							|  |  |  |     fixnum>slot@                               ! turn local number into offset | 
					
						
							| 
									
										
										
										
											2008-11-27 23:30:29 -05:00
										 |  |  |     arg0 rs-reg arg0 [+] MOV                   ! load local value | 
					
						
							| 
									
										
										
										
											2008-10-23 06:49:32 -04:00
										 |  |  |     ds-reg [] arg0 MOV                         ! push to stack | 
					
						
							|  |  |  | ] f f f \ get-local define-sub-primitive | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ | 
					
						
							|  |  |  |     arg0 ds-reg [] MOV                         ! load local count | 
					
						
							|  |  |  |     ds-reg bootstrap-cell SUB                  ! adjust stack pointer | 
					
						
							|  |  |  |     fixnum>slot@                               ! turn local number into offset | 
					
						
							|  |  |  |     rs-reg arg0 SUB                            ! decrement retain stack pointer | 
					
						
							|  |  |  | ] f f f \ drop-locals define-sub-primitive | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-09 04:52:08 -05:00
										 |  |  | [ "bootstrap.x86" forget-vocab ] with-compilation-unit |