| 
									
										
										
										
											2011-09-14 03:44:35 -04:00
										 |  |  | ! Copyright (C) 2007, 2011 Slava Pestov. | 
					
						
							| 
									
										
										
										
											2007-09-21 23:29:38 -04:00
										 |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							| 
									
										
										
										
											2015-07-27 00:20:55 -04:00
										 |  |  | USING: bootstrap.image.private compiler.codegen.relocation | 
					
						
							|  |  |  | compiler.constants compiler.units cpu.x86.assembler | 
					
						
							|  |  |  | cpu.x86.assembler.operands kernel kernel.private layouts locals | 
					
						
							| 
									
										
										
										
											2016-03-27 11:07:27 -04:00
										 |  |  | locals.backend math math.private memory namespaces sequences | 
					
						
							| 
									
										
										
										
											2012-09-21 13:43:48 -04:00
										 |  |  | slots.private strings.private vocabs ;
 | 
					
						
							| 
									
										
										
										
											2007-09-21 23:29:38 -04:00
										 |  |  | IN: bootstrap.x86 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-29 20:39:06 -04:00
										 |  |  | : temp0/32 ( -- reg )
 | 
					
						
							|  |  |  |     temp0 32-bit-version-of ;
 | 
					
						
							|  |  |  | : temp1/32 ( -- reg )
 | 
					
						
							|  |  |  |     temp1 32-bit-version-of ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-21 23:29:38 -04:00
										 |  |  | big-endian off
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-02 07:03:30 -05:00
										 |  |  | ! C to Factor entry point | 
					
						
							|  |  |  | [ | 
					
						
							|  |  |  |     ! Optimizing compiler's side of callback accesses | 
					
						
							|  |  |  |     ! arguments that are on the stack via the frame pointer. | 
					
						
							| 
									
										
										
										
											2010-04-10 00:13:48 -04:00
										 |  |  |     ! On x86-32 fastcall, and x86-64, some arguments are passed | 
					
						
							|  |  |  |     ! in registers, and so the only registers that are safe for | 
					
						
							|  |  |  |     ! use here are frame-reg, nv-reg and vm-reg. | 
					
						
							| 
									
										
										
										
											2010-01-02 07:03:30 -05:00
										 |  |  |     frame-reg PUSH | 
					
						
							|  |  |  |     frame-reg stack-reg MOV | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ! Save all non-volatile registers | 
					
						
							|  |  |  |     nv-regs [ PUSH ] each
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-03 20:24:33 -04:00
										 |  |  |     jit-save-tib | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-10 07:20:32 -05:00
										 |  |  |     ! Load VM into vm-reg | 
					
						
							| 
									
										
										
										
											2011-09-14 03:44:35 -04:00
										 |  |  |     vm-reg 0 MOV 0 rc-absolute-cell rel-vm | 
					
						
							| 
									
										
										
										
											2010-01-10 07:20:32 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-26 22:44:43 -04:00
										 |  |  |     ! Save old context | 
					
						
							|  |  |  |     nv-reg vm-reg vm-context-offset [+] MOV | 
					
						
							|  |  |  |     nv-reg PUSH | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ! Switch over to the spare context | 
					
						
							|  |  |  |     nv-reg vm-reg vm-spare-context-offset [+] MOV | 
					
						
							|  |  |  |     vm-reg vm-context-offset [+] nv-reg MOV | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ! Save C callstack pointer | 
					
						
							|  |  |  |     nv-reg context-callstack-save-offset [+] stack-reg MOV | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-02 15:44:12 -04:00
										 |  |  |     ! Load Factor stack pointers | 
					
						
							| 
									
										
										
										
											2010-03-26 22:44:43 -04:00
										 |  |  |     stack-reg nv-reg context-callstack-bottom-offset [+] MOV | 
					
						
							| 
									
										
										
										
											2010-04-03 20:24:33 -04:00
										 |  |  |     nv-reg jit-update-tib | 
					
						
							|  |  |  |     jit-install-seh | 
					
						
							| 
									
										
										
										
											2010-03-26 22:44:43 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-02 15:44:12 -04:00
										 |  |  |     rs-reg nv-reg context-retainstack-offset [+] MOV | 
					
						
							|  |  |  |     ds-reg nv-reg context-datastack-offset [+] MOV | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-02 07:03:30 -05:00
										 |  |  |     ! Call into Factor code | 
					
						
							| 
									
										
										
										
											2011-09-14 03:44:35 -04:00
										 |  |  |     link-reg 0 MOV f rc-absolute-cell rel-word | 
					
						
							| 
									
										
										
										
											2010-07-02 15:44:12 -04:00
										 |  |  |     link-reg CALL | 
					
						
							| 
									
										
										
										
											2010-01-02 07:03:30 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-27 02:55:49 -04:00
										 |  |  |     ! Load VM into vm-reg; only needed on x86-32, but doesn't | 
					
						
							|  |  |  |     ! hurt on x86-64 | 
					
						
							| 
									
										
										
										
											2011-09-14 03:44:35 -04:00
										 |  |  |     vm-reg 0 MOV 0 rc-absolute-cell rel-vm | 
					
						
							| 
									
										
										
										
											2010-01-02 07:03:30 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-26 22:44:43 -04:00
										 |  |  |     ! Load C callstack pointer | 
					
						
							|  |  |  |     nv-reg vm-reg vm-context-offset [+] MOV | 
					
						
							|  |  |  |     stack-reg nv-reg context-callstack-save-offset [+] MOV | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ! Load old context | 
					
						
							|  |  |  |     nv-reg POP | 
					
						
							|  |  |  |     vm-reg vm-context-offset [+] nv-reg MOV | 
					
						
							| 
									
										
										
										
											2010-01-02 07:03:30 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     ! Restore non-volatile registers | 
					
						
							| 
									
										
										
										
											2010-04-03 20:24:33 -04:00
										 |  |  |     jit-restore-tib | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-02 07:03:30 -05:00
										 |  |  |     nv-regs <reversed> [ POP ] each
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     frame-reg POP | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-10 19:54:17 -04:00
										 |  |  |     ! Callbacks which return structs, or use stdcall/fastcall/thiscall, | 
					
						
							|  |  |  |     ! need a parameter here. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ! See the comment for M\ x86.32 stack-cleanup in cpu.x86.32 | 
					
						
							| 
									
										
										
										
											2011-11-23 21:49:33 -05:00
										 |  |  |     0xffff RET f rc-absolute-2 rel-untagged | 
					
						
							| 
									
										
										
										
											2015-08-10 08:40:56 -04:00
										 |  |  | ] CALLBACK-STUB jit-define | 
					
						
							| 
									
										
										
										
											2010-01-02 07:03:30 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-12 23:27:28 -04:00
										 |  |  | [ | 
					
						
							| 
									
										
										
										
											2008-12-09 18:14:17 -05:00
										 |  |  |     ! load literal | 
					
						
							| 
									
										
										
										
											2011-09-14 03:44:35 -04:00
										 |  |  |     temp0 0 MOV f rc-absolute-cell rel-literal | 
					
						
							| 
									
										
										
										
											2008-12-09 18:14:17 -05:00
										 |  |  |     ! increment datastack pointer | 
					
						
							|  |  |  |     ds-reg bootstrap-cell ADD | 
					
						
							|  |  |  |     ! store literal on datastack | 
					
						
							|  |  |  |     ds-reg [] temp0 MOV | 
					
						
							| 
									
										
										
										
											2016-06-07 08:54:23 -04:00
										 |  |  | ] JIT-PUSH-LITERAL jit-define | 
					
						
							| 
									
										
										
										
											2008-07-12 23:27:28 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-12-25 23:40:36 -05:00
										 |  |  | [ | 
					
						
							| 
									
										
										
										
											2011-09-14 03:44:35 -04:00
										 |  |  |     0 CALL f rc-relative rel-word-pic | 
					
						
							| 
									
										
										
										
											2015-08-10 08:40:56 -04:00
										 |  |  | ] JIT-WORD-CALL jit-define | 
					
						
							| 
									
										
										
										
											2007-12-25 23:40:36 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-03 14:57:23 -04:00
										 |  |  | ! The *-signal-handler subprimitives are special-cased in vm/quotations.cpp | 
					
						
							|  |  |  | ! not to trigger generation of a stack frame, so they can | 
					
						
							| 
									
										
										
										
											2011-10-26 02:25:19 -04:00
										 |  |  | ! peform their own prolog/epilog preserving registers. | 
					
						
							| 
									
										
										
										
											2015-08-26 12:17:33 -04:00
										 |  |  | !
 | 
					
						
							|  |  |  | ! It is important that the total is 192/64 and that it matches the | 
					
						
							|  |  |  | ! constants in vm/cpu-x86.*.hpp | 
					
						
							| 
									
										
										
										
											2011-12-13 22:31:59 -05:00
										 |  |  | : jit-signal-handler-prolog ( -- )
 | 
					
						
							| 
									
										
										
										
											2015-08-26 12:17:33 -04:00
										 |  |  |     ! Return address already on stack -> 8/4 bytes. | 
					
						
							| 
									
										
										
										
											2011-12-13 22:31:59 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-26 12:17:33 -04:00
										 |  |  |     ! Push all registers. 15 regs/120 bytes on 64bit, 7 regs/28 bytes | 
					
						
							|  |  |  |     ! on 32bit -> 128/32 bytes. | 
					
						
							|  |  |  |     signal-handler-save-regs [ PUSH ] each
 | 
					
						
							| 
									
										
										
										
											2011-12-13 22:31:59 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-26 12:17:33 -04:00
										 |  |  |     ! Push flags -> 136/36 bytes | 
					
						
							| 
									
										
										
										
											2011-12-13 23:09:07 -05:00
										 |  |  |     PUSHF | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-26 12:17:33 -04:00
										 |  |  |     ! Register parameter area 32 bytes, unused on platforms other than | 
					
						
							|  |  |  |     ! windows 64 bit, but including it doesn't hurt. Plus | 
					
						
							|  |  |  |     ! alignment. LEA used so we don't dirty flags -> 192/64 bytes. | 
					
						
							|  |  |  |     stack-reg stack-reg 7 bootstrap-cells neg [+] LEA | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-14 14:33:05 -05:00
										 |  |  |     jit-load-vm ;
 | 
					
						
							| 
									
										
										
										
											2011-12-13 22:31:59 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : jit-signal-handler-epilog ( -- )
 | 
					
						
							| 
									
										
										
										
											2015-08-26 12:17:33 -04:00
										 |  |  |     stack-reg stack-reg 7 bootstrap-cells [+] LEA | 
					
						
							| 
									
										
										
										
											2011-12-13 22:31:59 -05:00
										 |  |  |     POPF | 
					
						
							| 
									
										
										
										
											2015-08-26 12:17:33 -04:00
										 |  |  |     signal-handler-save-regs reverse [ POP ] each ;
 | 
					
						
							| 
									
										
										
										
											2011-12-13 22:31:59 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-12-26 01:45:16 -05:00
										 |  |  | [ | 
					
						
							| 
									
										
										
										
											2008-12-09 18:14:17 -05:00
										 |  |  |     ! load boolean | 
					
						
							|  |  |  |     temp0 ds-reg [] MOV | 
					
						
							|  |  |  |     ! pop boolean | 
					
						
							|  |  |  |     ds-reg bootstrap-cell SUB | 
					
						
							|  |  |  |     ! compare boolean with f | 
					
						
							| 
									
										
										
										
											2009-11-02 04:25:39 -05:00
										 |  |  |     temp0 \ f type-number CMP | 
					
						
							| 
									
										
										
										
											2008-12-09 18:14:17 -05:00
										 |  |  |     ! jump to true branch if not equal | 
					
						
							| 
									
										
										
										
											2011-09-14 03:44:35 -04:00
										 |  |  |     0 JNE f rc-relative rel-word | 
					
						
							| 
									
										
										
										
											2008-12-09 18:14:17 -05:00
										 |  |  |     ! jump to false branch if equal | 
					
						
							| 
									
										
										
										
											2011-09-14 03:44:35 -04:00
										 |  |  |     0 JMP f rc-relative rel-word | 
					
						
							| 
									
										
										
										
											2015-08-10 08:40:56 -04:00
										 |  |  | ] JIT-IF 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-12-09 18:14:17 -05:00
										 |  |  |     temp0 ds-reg [] MOV | 
					
						
							| 
									
										
										
										
											2008-11-23 03:44:56 -05:00
										 |  |  |     ds-reg bootstrap-cell SUB | 
					
						
							| 
									
										
										
										
											2008-12-09 18:14:17 -05:00
										 |  |  |     rs-reg [] temp0 MOV ;
 | 
					
						
							| 
									
										
										
										
											2008-11-23 03:44:56 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : jit-2>r ( -- )
 | 
					
						
							|  |  |  |     rs-reg 2 bootstrap-cells ADD | 
					
						
							| 
									
										
										
										
											2008-12-09 18:14:17 -05:00
										 |  |  |     temp0 ds-reg [] MOV | 
					
						
							|  |  |  |     temp1 ds-reg -1 bootstrap-cells [+] MOV | 
					
						
							| 
									
										
										
										
											2008-11-23 03:44:56 -05:00
										 |  |  |     ds-reg 2 bootstrap-cells SUB | 
					
						
							| 
									
										
										
										
											2008-12-09 18:14:17 -05:00
										 |  |  |     rs-reg [] temp0 MOV | 
					
						
							|  |  |  |     rs-reg -1 bootstrap-cells [+] temp1 MOV ;
 | 
					
						
							| 
									
										
										
										
											2008-11-23 03:44:56 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : jit-3>r ( -- )
 | 
					
						
							|  |  |  |     rs-reg 3 bootstrap-cells ADD | 
					
						
							| 
									
										
										
										
											2008-12-09 18:14:17 -05:00
										 |  |  |     temp0 ds-reg [] MOV | 
					
						
							|  |  |  |     temp1 ds-reg -1 bootstrap-cells [+] MOV | 
					
						
							|  |  |  |     temp2 ds-reg -2 bootstrap-cells [+] MOV | 
					
						
							| 
									
										
										
										
											2008-11-23 03:44:56 -05:00
										 |  |  |     ds-reg 3 bootstrap-cells SUB | 
					
						
							| 
									
										
										
										
											2008-12-09 18:14:17 -05:00
										 |  |  |     rs-reg [] temp0 MOV | 
					
						
							|  |  |  |     rs-reg -1 bootstrap-cells [+] temp1 MOV | 
					
						
							|  |  |  |     rs-reg -2 bootstrap-cells [+] temp2 MOV ;
 | 
					
						
							| 
									
										
										
										
											2008-11-23 03:44:56 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : jit-r> ( -- )
 | 
					
						
							|  |  |  |     ds-reg bootstrap-cell ADD | 
					
						
							| 
									
										
										
										
											2008-12-09 18:14:17 -05:00
										 |  |  |     temp0 rs-reg [] MOV | 
					
						
							| 
									
										
										
										
											2008-11-23 03:44:56 -05:00
										 |  |  |     rs-reg bootstrap-cell SUB | 
					
						
							| 
									
										
										
										
											2008-12-09 18:14:17 -05:00
										 |  |  |     ds-reg [] temp0 MOV ;
 | 
					
						
							| 
									
										
										
										
											2008-11-23 03:44:56 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : jit-2r> ( -- )
 | 
					
						
							|  |  |  |     ds-reg 2 bootstrap-cells ADD | 
					
						
							| 
									
										
										
										
											2008-12-09 18:14:17 -05:00
										 |  |  |     temp0 rs-reg [] MOV | 
					
						
							|  |  |  |     temp1 rs-reg -1 bootstrap-cells [+] MOV | 
					
						
							| 
									
										
										
										
											2008-11-23 03:44:56 -05:00
										 |  |  |     rs-reg 2 bootstrap-cells SUB | 
					
						
							| 
									
										
										
										
											2008-12-09 18:14:17 -05:00
										 |  |  |     ds-reg [] temp0 MOV | 
					
						
							|  |  |  |     ds-reg -1 bootstrap-cells [+] temp1 MOV ;
 | 
					
						
							| 
									
										
										
										
											2008-11-23 03:44:56 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : jit-3r> ( -- )
 | 
					
						
							|  |  |  |     ds-reg 3 bootstrap-cells ADD | 
					
						
							| 
									
										
										
										
											2008-12-09 18:14:17 -05:00
										 |  |  |     temp0 rs-reg [] MOV | 
					
						
							|  |  |  |     temp1 rs-reg -1 bootstrap-cells [+] MOV | 
					
						
							|  |  |  |     temp2 rs-reg -2 bootstrap-cells [+] MOV | 
					
						
							| 
									
										
										
										
											2008-11-23 03:44:56 -05:00
										 |  |  |     rs-reg 3 bootstrap-cells SUB | 
					
						
							| 
									
										
										
										
											2008-12-09 18:14:17 -05:00
										 |  |  |     ds-reg [] temp0 MOV | 
					
						
							|  |  |  |     ds-reg -1 bootstrap-cells [+] temp1 MOV | 
					
						
							|  |  |  |     ds-reg -2 bootstrap-cells [+] temp2 MOV ;
 | 
					
						
							| 
									
										
										
										
											2008-11-23 03:44:56 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | [ | 
					
						
							|  |  |  |     jit->r | 
					
						
							| 
									
										
										
										
											2011-09-14 03:44:35 -04:00
										 |  |  |     0 CALL f rc-relative rel-word | 
					
						
							| 
									
										
										
										
											2008-11-23 03:44:56 -05:00
										 |  |  |     jit-r> | 
					
						
							| 
									
										
										
										
											2015-08-10 08:40:56 -04:00
										 |  |  | ] JIT-DIP jit-define | 
					
						
							| 
									
										
										
										
											2008-11-23 03:44:56 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | [ | 
					
						
							|  |  |  |     jit-2>r | 
					
						
							| 
									
										
										
										
											2011-09-14 03:44:35 -04:00
										 |  |  |     0 CALL f rc-relative rel-word | 
					
						
							| 
									
										
										
										
											2008-11-23 03:44:56 -05:00
										 |  |  |     jit-2r> | 
					
						
							| 
									
										
										
										
											2015-08-10 08:40:56 -04:00
										 |  |  | ] JIT-2DIP jit-define | 
					
						
							| 
									
										
										
										
											2008-11-23 03:44:56 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | [ | 
					
						
							| 
									
										
										
										
											2008-12-09 18:14:17 -05:00
										 |  |  |     jit-3>r | 
					
						
							| 
									
										
										
										
											2011-09-14 03:44:35 -04:00
										 |  |  |     0 CALL f rc-relative rel-word | 
					
						
							| 
									
										
										
										
											2008-11-23 03:44:56 -05:00
										 |  |  |     jit-3r> | 
					
						
							| 
									
										
										
										
											2015-08-10 08:40:56 -04:00
										 |  |  | ] JIT-3DIP jit-define | 
					
						
							| 
									
										
										
										
											2008-11-23 03:44:56 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-15 07:20:09 -05:00
										 |  |  | [ | 
					
						
							| 
									
										
										
										
											2009-04-25 22:14:59 -04:00
										 |  |  |     ! load from stack | 
					
						
							| 
									
										
										
										
											2009-12-23 07:37:24 -05:00
										 |  |  |     temp0 ds-reg [] MOV | 
					
						
							| 
									
										
										
										
											2009-12-15 07:20:09 -05:00
										 |  |  |     ! pop stack | 
					
						
							|  |  |  |     ds-reg bootstrap-cell SUB | 
					
						
							|  |  |  | ] | 
					
						
							| 
									
										
										
										
											2010-01-18 02:51:27 -05:00
										 |  |  | [ temp0 word-entry-point-offset [+] CALL ] | 
					
						
							|  |  |  | [ temp0 word-entry-point-offset [+] JMP ] | 
					
						
							| 
									
										
										
										
											2010-01-05 21:47:36 -05:00
										 |  |  | \ (execute) define-combinator-primitive | 
					
						
							| 
									
										
										
										
											2009-04-25 22:14:59 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-15 07:20:09 -05:00
										 |  |  | [ | 
					
						
							| 
									
										
										
										
											2009-12-23 07:37:24 -05:00
										 |  |  |     temp0 ds-reg [] MOV | 
					
						
							| 
									
										
										
										
											2009-12-15 07:20:09 -05:00
										 |  |  |     ds-reg bootstrap-cell SUB | 
					
						
							| 
									
										
										
										
											2010-01-18 02:51:27 -05:00
										 |  |  |     temp0 word-entry-point-offset [+] JMP | 
					
						
							| 
									
										
										
										
											2015-08-10 08:40:56 -04:00
										 |  |  | ] JIT-EXECUTE jit-define | 
					
						
							| 
									
										
										
										
											2009-04-25 22:14:59 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-13 18:13:32 -05:00
										 |  |  | [ | 
					
						
							|  |  |  |     stack-reg stack-frame-size bootstrap-cell - SUB | 
					
						
							| 
									
										
										
										
											2015-08-10 08:40:56 -04:00
										 |  |  | ] JIT-PROLOG jit-define | 
					
						
							| 
									
										
										
										
											2011-12-13 18:13:32 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-11 18:25:46 -04:00
										 |  |  | [ | 
					
						
							| 
									
										
										
										
											2008-12-09 18:14:17 -05:00
										 |  |  |     stack-reg stack-frame-size bootstrap-cell - ADD | 
					
						
							| 
									
										
										
										
											2015-08-10 08:40:56 -04:00
										 |  |  | ] JIT-EPILOG jit-define | 
					
						
							| 
									
										
										
										
											2008-07-11 18:25:46 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-10 08:40:56 -04:00
										 |  |  | [ 0 RET ] JIT-RETURN jit-define | 
					
						
							| 
									
										
										
										
											2008-07-11 18:25:46 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-28 04:48:37 -04:00
										 |  |  | ! ! ! Polymorphic inline caches | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-10 00:13:48 -04:00
										 |  |  | ! The PIC stubs are not permitted to touch pic-tail-reg. | 
					
						
							| 
									
										
										
										
											2009-05-06 20:22:22 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-29 22:32:05 -04:00
										 |  |  | ! Load a value from a stack position | 
					
						
							|  |  |  | [ | 
					
						
							| 
									
										
										
										
											2011-11-23 21:49:33 -05:00
										 |  |  |     temp1 ds-reg 0x7f [+] MOV f rc-absolute-1 rel-untagged | 
					
						
							| 
									
										
										
										
											2015-08-10 08:40:56 -04:00
										 |  |  | ] PIC-LOAD jit-define | 
					
						
							| 
									
										
										
										
											2009-04-28 04:48:37 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-29 20:39:06 -04:00
										 |  |  | [ temp1/32 tag-mask get AND ] PIC-TAG jit-define | 
					
						
							| 
									
										
										
										
											2009-04-29 00:05:18 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-28 04:48:37 -04:00
										 |  |  | [ | 
					
						
							| 
									
										
										
										
											2009-04-29 23:24:28 -04:00
										 |  |  |     temp0 temp1 MOV | 
					
						
							| 
									
										
										
										
											2016-05-29 20:39:06 -04:00
										 |  |  |     temp1/32 tag-mask get AND | 
					
						
							|  |  |  |     temp1/32 tuple type-number CMP | 
					
						
							| 
									
										
										
										
											2009-12-15 07:20:09 -05:00
										 |  |  |     [ JNE ] | 
					
						
							| 
									
										
										
										
											2010-04-12 17:22:41 -04:00
										 |  |  |     [ temp1 temp0 tuple-class-offset [+] MOV ] | 
					
						
							| 
									
										
										
										
											2009-12-15 07:20:09 -05:00
										 |  |  |     jit-conditional | 
					
						
							| 
									
										
										
										
											2015-08-10 08:40:56 -04:00
										 |  |  | ] PIC-TUPLE jit-define | 
					
						
							| 
									
										
										
										
											2009-04-28 04:48:37 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-29 23:24:28 -04:00
										 |  |  | [ | 
					
						
							| 
									
										
										
										
											2016-05-29 20:39:06 -04:00
										 |  |  |     temp1/32 0x7f CMP f rc-absolute-1 rel-untagged | 
					
						
							| 
									
										
										
										
											2015-08-10 08:40:56 -04:00
										 |  |  | ] PIC-CHECK-TAG jit-define | 
					
						
							| 
									
										
										
										
											2009-04-29 23:24:28 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-10 08:40:56 -04:00
										 |  |  | [ 0 JE f rc-relative rel-word ] PIC-HIT jit-define | 
					
						
							| 
									
										
										
										
											2009-04-28 04:48:37 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-30 04:37:07 -04:00
										 |  |  | ! ! ! Megamorphic caches | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ | 
					
						
							| 
									
										
										
										
											2010-04-12 17:22:41 -04:00
										 |  |  |     ! class = ... | 
					
						
							|  |  |  |     temp0 temp1 MOV | 
					
						
							| 
									
										
										
										
											2016-05-29 20:39:06 -04:00
										 |  |  |     temp1/32 tag-mask get AND | 
					
						
							|  |  |  |     temp1/32 tag-bits get SHL | 
					
						
							|  |  |  |     temp1/32 tuple type-number tag-fixnum CMP | 
					
						
							| 
									
										
										
										
											2010-04-12 17:22:41 -04:00
										 |  |  |     [ JNE ] | 
					
						
							|  |  |  |     [ temp1 temp0 tuple-class-offset [+] MOV ] | 
					
						
							|  |  |  |     jit-conditional | 
					
						
							| 
									
										
										
										
											2009-04-30 04:37:07 -04:00
										 |  |  |     ! cache = ... | 
					
						
							| 
									
										
										
										
											2011-09-14 03:44:35 -04:00
										 |  |  |     temp0 0 MOV f rc-absolute-cell rel-literal | 
					
						
							| 
									
										
										
										
											2009-11-02 02:37:58 -05:00
										 |  |  |     ! key = hashcode(class) | 
					
						
							| 
									
										
										
										
											2009-04-30 04:37:07 -04:00
										 |  |  |     temp2 temp1 MOV | 
					
						
							| 
									
										
										
										
											2009-11-02 04:25:39 -05:00
										 |  |  |     bootstrap-cell 4 = [ temp2 1 SHR ] when
 | 
					
						
							| 
									
										
										
										
											2009-04-30 04:37:07 -04:00
										 |  |  |     ! key &= cache.length - 1 | 
					
						
							| 
									
										
										
										
											2009-08-13 20:21:44 -04:00
										 |  |  |     temp2 mega-cache-size get 1 - bootstrap-cell * AND | 
					
						
							| 
									
										
										
										
											2009-04-30 04:37:07 -04:00
										 |  |  |     ! cache += array-start-offset | 
					
						
							|  |  |  |     temp0 array-start-offset ADD | 
					
						
							|  |  |  |     ! cache += key | 
					
						
							|  |  |  |     temp0 temp2 ADD | 
					
						
							|  |  |  |     ! if(get(cache) == class) | 
					
						
							|  |  |  |     temp0 [] temp1 CMP | 
					
						
							| 
									
										
										
										
											2010-04-12 17:22:41 -04:00
										 |  |  |     [ JNE ] | 
					
						
							|  |  |  |     [ | 
					
						
							|  |  |  |         ! megamorphic_cache_hits++ | 
					
						
							| 
									
										
										
										
											2011-09-14 03:44:35 -04:00
										 |  |  |         temp1 0 MOV rc-absolute-cell rel-megamorphic-cache-hits | 
					
						
							| 
									
										
										
										
											2010-04-12 17:22:41 -04:00
										 |  |  |         temp1 [] 1 ADD | 
					
						
							|  |  |  |         ! goto get(cache + bootstrap-cell) | 
					
						
							|  |  |  |         temp0 temp0 bootstrap-cell [+] MOV | 
					
						
							|  |  |  |         temp0 word-entry-point-offset [+] JMP | 
					
						
							|  |  |  |         ! fall-through on miss | 
					
						
							|  |  |  |     ] jit-conditional | 
					
						
							| 
									
										
										
										
											2015-08-10 08:40:56 -04:00
										 |  |  | ] MEGA-LOOKUP jit-define | 
					
						
							| 
									
										
										
										
											2009-04-30 04:37:07 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-11 18:25:46 -04:00
										 |  |  | ! Comparisons | 
					
						
							|  |  |  | : jit-compare ( insn -- )
 | 
					
						
							| 
									
										
										
										
											2008-12-09 18:14:17 -05:00
										 |  |  |     ! load t | 
					
						
							| 
									
										
										
										
											2011-09-14 03:44:35 -04:00
										 |  |  |     temp3 0 MOV t rc-absolute-cell rel-literal | 
					
						
							| 
									
										
										
										
											2008-12-09 18:14:17 -05:00
										 |  |  |     ! load f | 
					
						
							| 
									
										
										
										
											2009-11-02 04:25:39 -05:00
										 |  |  |     temp1 \ f type-number MOV | 
					
						
							| 
									
										
										
										
											2008-12-09 18:14:17 -05:00
										 |  |  |     ! load first value | 
					
						
							|  |  |  |     temp0 ds-reg [] MOV | 
					
						
							|  |  |  |     ! adjust stack pointer | 
					
						
							|  |  |  |     ds-reg bootstrap-cell SUB | 
					
						
							|  |  |  |     ! compare with second value | 
					
						
							|  |  |  |     ds-reg [] temp0 CMP | 
					
						
							|  |  |  |     ! move t if true | 
					
						
							| 
									
										
										
										
											2009-04-17 18:53:26 -04:00
										 |  |  |     [ temp1 temp3 ] dip execute( dst src -- ) | 
					
						
							| 
									
										
										
										
											2008-12-09 18:14:17 -05:00
										 |  |  |     ! store | 
					
						
							|  |  |  |     ds-reg [] temp1 MOV ;
 | 
					
						
							| 
									
										
										
										
											2008-07-11 18:25:46 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | ! Math | 
					
						
							|  |  |  | : jit-math ( insn -- )
 | 
					
						
							| 
									
										
										
										
											2008-12-09 18:14:17 -05:00
										 |  |  |     ! load second input | 
					
						
							|  |  |  |     temp0 ds-reg [] MOV | 
					
						
							|  |  |  |     ! pop stack | 
					
						
							|  |  |  |     ds-reg bootstrap-cell SUB | 
					
						
							|  |  |  |     ! compute result | 
					
						
							| 
									
										
										
										
											2009-04-17 18:53:26 -04:00
										 |  |  |     [ ds-reg [] temp0 ] dip execute( dst src -- ) ;
 | 
					
						
							| 
									
										
										
										
											2008-07-11 18:25:46 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-23 01:09:23 -05:00
										 |  |  | : jit-fixnum-/mod ( -- )
 | 
					
						
							| 
									
										
										
										
											2008-12-09 18:14:17 -05:00
										 |  |  |     ! load second parameter | 
					
						
							| 
									
										
										
										
											2010-04-10 00:13:48 -04:00
										 |  |  |     temp1 ds-reg [] MOV | 
					
						
							| 
									
										
										
										
											2008-12-09 18:14:17 -05:00
										 |  |  |     ! load first parameter | 
					
						
							|  |  |  |     div-arg ds-reg bootstrap-cell neg [+] MOV | 
					
						
							|  |  |  |     ! make a copy | 
					
						
							|  |  |  |     mod-arg div-arg MOV | 
					
						
							|  |  |  |     ! sign-extend | 
					
						
							| 
									
										
										
										
											2009-08-13 20:21:44 -04:00
										 |  |  |     mod-arg bootstrap-cell-bits 1 - SAR | 
					
						
							| 
									
										
										
										
											2008-12-09 18:14:17 -05:00
										 |  |  |     ! divide | 
					
						
							| 
									
										
										
										
											2010-04-10 00:13:48 -04:00
										 |  |  |     temp1 IDIV ;
 | 
					
						
							| 
									
										
										
										
											2008-11-21 03:11:36 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-27 11:07:27 -04:00
										 |  |  | ! # All x86 subprimitives | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     ! ## Fixnums | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ! ### Add | 
					
						
							|  |  |  |     { fixnum+fast [ \ ADD jit-math ] } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ! ### Bit stuff | 
					
						
							|  |  |  |     { fixnum-bitand [ \ AND jit-math ] } | 
					
						
							|  |  |  |     { fixnum-bitnot [ | 
					
						
							|  |  |  |         ! complement | 
					
						
							|  |  |  |         ds-reg [] NOT | 
					
						
							|  |  |  |         ! clear tag bits | 
					
						
							|  |  |  |         ds-reg [] tag-mask get XOR | 
					
						
							|  |  |  |     ] } | 
					
						
							|  |  |  |     { fixnum-bitor [ \ OR jit-math ] } | 
					
						
							|  |  |  |     { fixnum-bitxor [ \ XOR jit-math ] } | 
					
						
							|  |  |  |     { fixnum-shift-fast [ | 
					
						
							|  |  |  |         ! load shift count | 
					
						
							|  |  |  |         shift-arg ds-reg [] MOV | 
					
						
							|  |  |  |         ! untag shift count | 
					
						
							|  |  |  |         shift-arg tag-bits get SAR | 
					
						
							|  |  |  |         ! adjust stack pointer | 
					
						
							|  |  |  |         ds-reg bootstrap-cell SUB | 
					
						
							|  |  |  |         ! load value | 
					
						
							|  |  |  |         temp3 ds-reg [] MOV | 
					
						
							|  |  |  |         ! make a copy | 
					
						
							|  |  |  |         temp2 temp3 MOV | 
					
						
							|  |  |  |         ! compute positive shift value in temp2 | 
					
						
							|  |  |  |         temp2 CL SHL | 
					
						
							|  |  |  |         shift-arg NEG | 
					
						
							|  |  |  |         ! compute negative shift value in temp3 | 
					
						
							|  |  |  |         temp3 CL SAR | 
					
						
							|  |  |  |         temp3 tag-mask get bitnot AND | 
					
						
							|  |  |  |         shift-arg 0 CMP | 
					
						
							|  |  |  |         ! if shift count was negative, move temp0 to temp2 | 
					
						
							|  |  |  |         temp2 temp3 CMOVGE | 
					
						
							|  |  |  |         ! push to stack | 
					
						
							|  |  |  |         ds-reg [] temp2 MOV | 
					
						
							|  |  |  |     ] } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ! ### Comparisons | 
					
						
							|  |  |  |     { both-fixnums? [ | 
					
						
							|  |  |  |         temp0 ds-reg [] MOV | 
					
						
							|  |  |  |         ds-reg bootstrap-cell SUB | 
					
						
							|  |  |  |         temp0 ds-reg [] OR | 
					
						
							|  |  |  |         temp0 tag-mask get TEST | 
					
						
							|  |  |  |         temp0 \ f type-number MOV | 
					
						
							|  |  |  |         temp1 1 tag-fixnum MOV | 
					
						
							|  |  |  |         temp0 temp1 CMOVE | 
					
						
							|  |  |  |         ds-reg [] temp0 MOV | 
					
						
							|  |  |  |     ] } | 
					
						
							|  |  |  |     { eq? [ \ CMOVE jit-compare ] } | 
					
						
							|  |  |  |     { fixnum> [ \ CMOVG jit-compare ] } | 
					
						
							|  |  |  |     { fixnum>= [ \ CMOVGE jit-compare ] } | 
					
						
							|  |  |  |     { fixnum< [ \ CMOVL jit-compare ] } | 
					
						
							|  |  |  |     { fixnum<= [ \ CMOVLE jit-compare ] } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ! ### Div/mod | 
					
						
							|  |  |  |     { fixnum-mod [ | 
					
						
							|  |  |  |         jit-fixnum-/mod | 
					
						
							|  |  |  |         ! adjust stack pointer | 
					
						
							|  |  |  |         ds-reg bootstrap-cell SUB | 
					
						
							|  |  |  |         ! push to stack | 
					
						
							|  |  |  |         ds-reg [] mod-arg MOV | 
					
						
							|  |  |  |     ] } | 
					
						
							|  |  |  |     { fixnum/i-fast [ | 
					
						
							|  |  |  |         jit-fixnum-/mod | 
					
						
							|  |  |  |         ! adjust stack pointer | 
					
						
							|  |  |  |         ds-reg bootstrap-cell SUB | 
					
						
							|  |  |  |         ! tag it | 
					
						
							|  |  |  |         div-arg tag-bits get SHL | 
					
						
							|  |  |  |         ! push to stack | 
					
						
							|  |  |  |         ds-reg [] div-arg MOV | 
					
						
							|  |  |  |     ] } | 
					
						
							|  |  |  |     { fixnum/mod-fast [ | 
					
						
							|  |  |  |         jit-fixnum-/mod | 
					
						
							|  |  |  |         ! tag it | 
					
						
							|  |  |  |         div-arg tag-bits get SHL | 
					
						
							|  |  |  |         ! push to stack | 
					
						
							|  |  |  |         ds-reg [] mod-arg MOV | 
					
						
							|  |  |  |         ds-reg bootstrap-cell neg [+] div-arg MOV | 
					
						
							|  |  |  |     ] } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ! ### Mul | 
					
						
							|  |  |  |     { fixnum*fast [ | 
					
						
							|  |  |  |         ! load second input | 
					
						
							|  |  |  |         temp0 ds-reg [] MOV | 
					
						
							|  |  |  |         ! pop stack | 
					
						
							|  |  |  |         ds-reg bootstrap-cell SUB | 
					
						
							|  |  |  |         ! load first input | 
					
						
							|  |  |  |         temp1 ds-reg [] MOV | 
					
						
							|  |  |  |         ! untag second input | 
					
						
							|  |  |  |         temp0 tag-bits get SAR | 
					
						
							|  |  |  |         ! multiply | 
					
						
							|  |  |  |         temp0 temp1 IMUL2 | 
					
						
							|  |  |  |         ! push result | 
					
						
							|  |  |  |         ds-reg [] temp0 MOV | 
					
						
							|  |  |  |     ] } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ! ### Sub | 
					
						
							|  |  |  |     { fixnum-fast [ \ SUB jit-math ] } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ! ## Locals | 
					
						
							|  |  |  |     { drop-locals [ | 
					
						
							|  |  |  |         ! load local count | 
					
						
							|  |  |  |         temp0 ds-reg [] MOV | 
					
						
							|  |  |  |         ! adjust stack pointer | 
					
						
							|  |  |  |         ds-reg bootstrap-cell SUB | 
					
						
							|  |  |  |         ! turn local number into offset | 
					
						
							|  |  |  |         fixnum>slot@ | 
					
						
							|  |  |  |         ! decrement retain stack pointer | 
					
						
							|  |  |  |         rs-reg temp0 SUB | 
					
						
							|  |  |  |     ] } | 
					
						
							|  |  |  |     { get-local [ | 
					
						
							|  |  |  |         ! load local number | 
					
						
							|  |  |  |         temp0 ds-reg [] MOV | 
					
						
							|  |  |  |         ! turn local number into offset | 
					
						
							|  |  |  |         fixnum>slot@ | 
					
						
							|  |  |  |         ! load local value | 
					
						
							|  |  |  |         temp0 rs-reg temp0 [+] MOV | 
					
						
							|  |  |  |         ! push to stack | 
					
						
							|  |  |  |         ds-reg [] temp0 MOV | 
					
						
							|  |  |  |     ] } | 
					
						
							|  |  |  |     { load-local [ jit->r ] } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ! ## Objects | 
					
						
							|  |  |  |     { slot [ | 
					
						
							|  |  |  |         ! load slot number | 
					
						
							|  |  |  |         temp0 ds-reg [] MOV | 
					
						
							|  |  |  |         ! adjust stack pointer | 
					
						
							|  |  |  |         ds-reg bootstrap-cell SUB | 
					
						
							|  |  |  |         ! load object | 
					
						
							|  |  |  |         temp1 ds-reg [] MOV | 
					
						
							|  |  |  |         ! turn slot number into offset | 
					
						
							|  |  |  |         fixnum>slot@ | 
					
						
							|  |  |  |         ! mask off tag | 
					
						
							|  |  |  |         temp1 tag-bits get SHR | 
					
						
							|  |  |  |         temp1 tag-bits get SHL | 
					
						
							|  |  |  |         ! load slot value | 
					
						
							|  |  |  |         temp0 temp1 temp0 [+] MOV | 
					
						
							|  |  |  |         ! push to stack | 
					
						
							|  |  |  |         ds-reg [] temp0 MOV | 
					
						
							|  |  |  |     ] } | 
					
						
							|  |  |  |     { string-nth-fast [ | 
					
						
							|  |  |  |         ! load string index from stack | 
					
						
							|  |  |  |         temp0 ds-reg bootstrap-cell neg [+] MOV | 
					
						
							|  |  |  |         temp0 tag-bits get SHR | 
					
						
							|  |  |  |         ! load string from stack | 
					
						
							|  |  |  |         temp1 ds-reg [] MOV | 
					
						
							|  |  |  |         ! load character | 
					
						
							|  |  |  |         temp0 8-bit-version-of temp0 temp1 string-offset [++] MOV | 
					
						
							|  |  |  |         temp0 temp0 8-bit-version-of MOVZX | 
					
						
							|  |  |  |         temp0 tag-bits get SHL | 
					
						
							|  |  |  |         ! store character to stack | 
					
						
							|  |  |  |         ds-reg bootstrap-cell SUB | 
					
						
							|  |  |  |         ds-reg [] temp0 MOV | 
					
						
							|  |  |  |     ] } | 
					
						
							|  |  |  |     { tag [ | 
					
						
							|  |  |  |         ! load from stack | 
					
						
							|  |  |  |         temp0 ds-reg [] MOV | 
					
						
							|  |  |  |         ! compute tag | 
					
						
							| 
									
										
										
										
											2016-05-29 20:39:06 -04:00
										 |  |  |         temp0/32 tag-mask get AND | 
					
						
							| 
									
										
										
										
											2016-03-27 11:07:27 -04:00
										 |  |  |         ! tag the tag | 
					
						
							| 
									
										
										
										
											2016-05-29 20:39:06 -04:00
										 |  |  |         temp0/32 tag-bits get SHL | 
					
						
							| 
									
										
										
										
											2016-03-27 11:07:27 -04:00
										 |  |  |         ! push to stack | 
					
						
							|  |  |  |         ds-reg [] temp0 MOV | 
					
						
							|  |  |  |     ] } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ! ## Shufflers | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ! ### Drops | 
					
						
							|  |  |  |     { drop [ ds-reg bootstrap-cell SUB ] } | 
					
						
							|  |  |  |     { 2drop [ ds-reg 2 bootstrap-cells SUB ] } | 
					
						
							|  |  |  |     { 3drop [ ds-reg 3 bootstrap-cells SUB ] } | 
					
						
							|  |  |  |     { 4drop [ ds-reg 4 bootstrap-cells SUB ] } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ! ### Dups | 
					
						
							|  |  |  |     { dup [ | 
					
						
							|  |  |  |         temp0 ds-reg [] MOV | 
					
						
							|  |  |  |         ds-reg bootstrap-cell ADD | 
					
						
							|  |  |  |         ds-reg [] temp0 MOV | 
					
						
							|  |  |  |     ] } | 
					
						
							|  |  |  |     { 2dup [ | 
					
						
							|  |  |  |         temp0 ds-reg [] MOV | 
					
						
							|  |  |  |         temp1 ds-reg bootstrap-cell neg [+] MOV | 
					
						
							|  |  |  |         ds-reg 2 bootstrap-cells ADD | 
					
						
							|  |  |  |         ds-reg [] temp0 MOV | 
					
						
							|  |  |  |         ds-reg bootstrap-cell neg [+] temp1 MOV | 
					
						
							|  |  |  |     ] } | 
					
						
							|  |  |  |     { 3dup [ | 
					
						
							|  |  |  |         temp0 ds-reg [] MOV | 
					
						
							|  |  |  |         temp1 ds-reg -1 bootstrap-cells [+] MOV | 
					
						
							|  |  |  |         temp3 ds-reg -2 bootstrap-cells [+] MOV | 
					
						
							|  |  |  |         ds-reg 3 bootstrap-cells ADD | 
					
						
							|  |  |  |         ds-reg [] temp0 MOV | 
					
						
							|  |  |  |         ds-reg -1 bootstrap-cells [+] temp1 MOV | 
					
						
							|  |  |  |         ds-reg -2 bootstrap-cells [+] temp3 MOV | 
					
						
							|  |  |  |     ] } | 
					
						
							|  |  |  |     { 4dup [ | 
					
						
							|  |  |  |         temp0 ds-reg [] MOV | 
					
						
							|  |  |  |         temp1 ds-reg -1 bootstrap-cells [+] MOV | 
					
						
							|  |  |  |         temp2 ds-reg -2 bootstrap-cells [+] MOV | 
					
						
							|  |  |  |         temp3 ds-reg -3 bootstrap-cells [+] MOV | 
					
						
							|  |  |  |         ds-reg 4 bootstrap-cells ADD | 
					
						
							|  |  |  |         ds-reg [] temp0 MOV | 
					
						
							|  |  |  |         ds-reg -1 bootstrap-cells [+] temp1 MOV | 
					
						
							|  |  |  |         ds-reg -2 bootstrap-cells [+] temp2 MOV | 
					
						
							|  |  |  |         ds-reg -3 bootstrap-cells [+] temp3 MOV | 
					
						
							|  |  |  |     ] } | 
					
						
							|  |  |  |     { dupd [ | 
					
						
							|  |  |  |         temp0 ds-reg [] MOV | 
					
						
							|  |  |  |         temp1 ds-reg -1 bootstrap-cells [+] MOV | 
					
						
							|  |  |  |         ds-reg [] temp1 MOV | 
					
						
							|  |  |  |         ds-reg bootstrap-cell ADD | 
					
						
							|  |  |  |         ds-reg [] temp0 MOV | 
					
						
							|  |  |  |     ] } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ! ### Misc shufflers | 
					
						
							|  |  |  |     { over [ | 
					
						
							|  |  |  |         temp0 ds-reg -1 bootstrap-cells [+] MOV | 
					
						
							|  |  |  |         ds-reg bootstrap-cell ADD | 
					
						
							|  |  |  |         ds-reg [] temp0 MOV | 
					
						
							|  |  |  |     ] } | 
					
						
							|  |  |  |     { pick [ | 
					
						
							|  |  |  |         temp0 ds-reg -2 bootstrap-cells [+] MOV | 
					
						
							|  |  |  |         ds-reg bootstrap-cell ADD | 
					
						
							|  |  |  |         ds-reg [] temp0 MOV | 
					
						
							|  |  |  |     ] } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ! ### Nips | 
					
						
							|  |  |  |     { nip [ | 
					
						
							|  |  |  |         temp0 ds-reg [] MOV | 
					
						
							|  |  |  |         ds-reg bootstrap-cell SUB | 
					
						
							|  |  |  |         ds-reg [] temp0 MOV | 
					
						
							|  |  |  |     ] } | 
					
						
							|  |  |  |     { 2nip [ | 
					
						
							|  |  |  |         temp0 ds-reg [] MOV | 
					
						
							|  |  |  |         ds-reg 2 bootstrap-cells SUB | 
					
						
							|  |  |  |         ds-reg [] temp0 MOV | 
					
						
							|  |  |  |     ] } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ! ### Swaps | 
					
						
							|  |  |  |     { -rot [ | 
					
						
							|  |  |  |         temp0 ds-reg [] MOV | 
					
						
							|  |  |  |         temp1 ds-reg -1 bootstrap-cells [+] MOV | 
					
						
							|  |  |  |         temp3 ds-reg -2 bootstrap-cells [+] MOV | 
					
						
							|  |  |  |         ds-reg -2 bootstrap-cells [+] temp0 MOV | 
					
						
							|  |  |  |         ds-reg -1 bootstrap-cells [+] temp3 MOV | 
					
						
							|  |  |  |         ds-reg [] temp1 MOV | 
					
						
							|  |  |  |     ] } | 
					
						
							|  |  |  |     { rot [ | 
					
						
							|  |  |  |         temp0 ds-reg [] MOV | 
					
						
							|  |  |  |         temp1 ds-reg -1 bootstrap-cells [+] MOV | 
					
						
							|  |  |  |         temp3 ds-reg -2 bootstrap-cells [+] MOV | 
					
						
							|  |  |  |         ds-reg -2 bootstrap-cells [+] temp1 MOV | 
					
						
							|  |  |  |         ds-reg -1 bootstrap-cells [+] temp0 MOV | 
					
						
							|  |  |  |         ds-reg [] temp3 MOV | 
					
						
							|  |  |  |     ] } | 
					
						
							|  |  |  |     { swap [ | 
					
						
							|  |  |  |         temp0 ds-reg [] MOV | 
					
						
							|  |  |  |         temp1 ds-reg bootstrap-cell neg [+] MOV | 
					
						
							|  |  |  |         ds-reg bootstrap-cell neg [+] temp0 MOV | 
					
						
							|  |  |  |         ds-reg [] temp1 MOV | 
					
						
							|  |  |  |     ] } | 
					
						
							|  |  |  |     { swapd [ | 
					
						
							|  |  |  |         temp0 ds-reg -1 bootstrap-cells [+] MOV | 
					
						
							|  |  |  |         temp1 ds-reg -2 bootstrap-cells [+] MOV | 
					
						
							|  |  |  |         ds-reg -2 bootstrap-cells [+] temp0 MOV | 
					
						
							|  |  |  |         ds-reg -1 bootstrap-cells [+] temp1 MOV | 
					
						
							|  |  |  |     ] } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ! ## Signal handling | 
					
						
							|  |  |  |     { leaf-signal-handler [ | 
					
						
							|  |  |  |         jit-signal-handler-prolog | 
					
						
							|  |  |  |         jit-save-context | 
					
						
							|  |  |  |         temp0 vm-reg vm-signal-handler-addr-offset [+] MOV | 
					
						
							|  |  |  |         temp0 CALL | 
					
						
							|  |  |  |         jit-signal-handler-epilog | 
					
						
							|  |  |  |         ! Pop the fake leaf frame along with our return address | 
					
						
							|  |  |  |         leaf-stack-frame-size bootstrap-cell - RET | 
					
						
							|  |  |  |     ] } | 
					
						
							|  |  |  |     { signal-handler [ | 
					
						
							|  |  |  |         jit-signal-handler-prolog | 
					
						
							|  |  |  |         jit-save-context | 
					
						
							|  |  |  |         temp0 vm-reg vm-signal-handler-addr-offset [+] MOV | 
					
						
							|  |  |  |         temp0 CALL | 
					
						
							|  |  |  |         jit-signal-handler-epilog | 
					
						
							|  |  |  |         0 RET | 
					
						
							|  |  |  |     ] } | 
					
						
							|  |  |  | } define-sub-primitives | 
					
						
							| 
									
										
										
										
											2008-10-23 06:49:32 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-09 04:52:08 -05:00
										 |  |  | [ "bootstrap.x86" forget-vocab ] with-compilation-unit |