| 
									
										
										
										
											2007-10-13 00:57:24 -04:00
										 |  |  | ! Copyright (C) 2007 Slava Pestov. | 
					
						
							|  |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							|  |  |  | USING: bootstrap.image.private kernel namespaces system | 
					
						
							| 
									
										
										
										
											2007-10-18 02:37:52 -04:00
										 |  |  | cpu.arm.assembler math layouts words vocabs ;
 | 
					
						
							| 
									
										
										
										
											2007-10-13 00:57:24 -04:00
										 |  |  | IN: bootstrap.arm | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-18 02:37:52 -04:00
										 |  |  | ! We generate ARM3 code | 
					
						
							|  |  |  | f have-BX? set
 | 
					
						
							| 
									
										
										
										
											2007-10-15 19:59:03 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 4 \ cell set
 | 
					
						
							|  |  |  | big-endian off
 | 
					
						
							| 
									
										
										
										
											2007-10-13 00:57:24 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 4 jit-code-format set
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : ds-reg R5 ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : word-reg R0 ;
 | 
					
						
							|  |  |  | : quot-reg R0 ;
 | 
					
						
							|  |  |  | : scan-reg R2 ;
 | 
					
						
							|  |  |  | : temp-reg R3 ;
 | 
					
						
							|  |  |  | : xt-reg R12 ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-15 19:59:03 -04:00
										 |  |  | : stack-frame 16 bootstrap-cells ;
 | 
					
						
							| 
									
										
										
										
											2007-10-13 00:57:24 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-13 17:57:29 -04:00
										 |  |  | : next-save stack-frame 2 bootstrap-cells - ;
 | 
					
						
							|  |  |  | : xt-save stack-frame 3 bootstrap-cells - ;
 | 
					
						
							|  |  |  | : array-save stack-frame 4 bootstrap-cells - ;
 | 
					
						
							|  |  |  | : scan-save stack-frame 5 bootstrap-cells - ;
 | 
					
						
							| 
									
										
										
										
											2007-10-13 00:57:24 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | [ | 
					
						
							|  |  |  |     temp-reg quot-reg quot-array@ <+> LDR      ! load array | 
					
						
							|  |  |  |     scan-reg temp-reg scan@ ADD                ! initialize scan pointer | 
					
						
							|  |  |  | ] { } make jit-setup set
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ | 
					
						
							| 
									
										
										
										
											2007-10-13 17:57:29 -04:00
										 |  |  |     LR SP 4 <-> STR                            ! save return address | 
					
						
							| 
									
										
										
										
											2007-10-13 00:57:24 -04:00
										 |  |  |     SP SP stack-frame SUB | 
					
						
							|  |  |  |     xt-reg SP xt-save <+> STR                  ! save XT | 
					
						
							|  |  |  |     xt-reg stack-frame MOV | 
					
						
							|  |  |  |     xt-reg SP next-save <+> STR                ! save frame size | 
					
						
							|  |  |  |     temp-reg SP array-save <+> STR             ! save array | 
					
						
							|  |  |  | ] { } make jit-prolog set
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ | 
					
						
							|  |  |  |     temp-reg scan-reg 4 <!+> LDR               ! load literal and advance | 
					
						
							|  |  |  |     temp-reg ds-reg 4 <!+> STR                 ! push literal | 
					
						
							|  |  |  | ] { } make jit-push-literal set
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ | 
					
						
							|  |  |  |     temp-reg scan-reg 4 <!+> LDR               ! load wrapper and advance | 
					
						
							|  |  |  |     temp-reg dup wrapper@ <+> LDR              ! load wrapped object | 
					
						
							|  |  |  |     temp-reg ds-reg 4 <!+> STR                 ! push wrapped object | 
					
						
							|  |  |  | ] { } make jit-push-wrapper set
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ | 
					
						
							| 
									
										
										
										
											2007-10-13 17:57:29 -04:00
										 |  |  |     R1 SP 4 SUB                                ! pass stack pointer to primitive | 
					
						
							| 
									
										
										
										
											2007-10-13 00:57:24 -04:00
										 |  |  | ] { } make jit-word-primitive-jump set
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ | 
					
						
							| 
									
										
										
										
											2007-10-13 17:57:29 -04:00
										 |  |  |     R1 SP 4 SUB                                ! pass stack pointer to primitive | 
					
						
							| 
									
										
										
										
											2007-10-13 00:57:24 -04:00
										 |  |  | ] { } make jit-word-primitive-call set
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : load-word-xt ( -- )
 | 
					
						
							|  |  |  |     word-reg scan-reg 4 <!+> LDR               ! load word and advance | 
					
						
							|  |  |  |     xt-reg word-reg word-xt@ <+> LDR ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : jit-call | 
					
						
							|  |  |  |     scan-reg SP scan-save <+> STR              ! save scan pointer | 
					
						
							|  |  |  |     LR PC MOV                                  ! save return address | 
					
						
							| 
									
										
										
										
											2007-10-18 02:37:52 -04:00
										 |  |  |     xt-reg BX                                  ! call | 
					
						
							| 
									
										
										
										
											2007-10-13 00:57:24 -04:00
										 |  |  |     scan-reg SP scan-save <+> LDR              ! restore scan pointer | 
					
						
							|  |  |  |     ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : jit-jump | 
					
						
							| 
									
										
										
										
											2007-10-18 02:37:52 -04:00
										 |  |  |     xt-reg BX ;
 | 
					
						
							| 
									
										
										
										
											2007-10-13 00:57:24 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | [ load-word-xt jit-call ] { } make jit-word-call set
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ load-word-xt jit-jump ] { } make jit-word-jump set
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : load-quot-xt | 
					
						
							|  |  |  |     xt-reg quot-reg quot-xt@ <+> LDR ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : load-branch | 
					
						
							| 
									
										
										
										
											2007-10-13 17:57:29 -04:00
										 |  |  |     temp-reg ds-reg 4 <-!> LDR                 ! pop boolean | 
					
						
							| 
									
										
										
										
											2007-10-13 00:57:24 -04:00
										 |  |  |     temp-reg \ f tag-number CMP                ! compare it with f | 
					
						
							| 
									
										
										
										
											2007-10-13 17:57:29 -04:00
										 |  |  |     quot-reg scan-reg MOV                      ! point quot-reg at false branch | 
					
						
							|  |  |  |     quot-reg dup 4 EQ ADD                      ! point quot-reg at true branch | 
					
						
							| 
									
										
										
										
											2007-10-13 00:57:24 -04:00
										 |  |  |     quot-reg dup 4 <+> LDR                     ! load the branch | 
					
						
							|  |  |  |     scan-reg dup 12 ADD                        ! advance scan pointer | 
					
						
							|  |  |  |     load-quot-xt | 
					
						
							|  |  |  |     ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ | 
					
						
							|  |  |  |     load-branch jit-jump | 
					
						
							|  |  |  | ] { } make jit-if-jump set
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ | 
					
						
							|  |  |  |     load-branch jit-call | 
					
						
							|  |  |  | ] { } make jit-if-call set
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ | 
					
						
							|  |  |  |     temp-reg ds-reg 4 <-!> LDR                 ! pop index | 
					
						
							|  |  |  |     temp-reg dup 1 <LSR> MOV                   ! turn it into an array offset | 
					
						
							|  |  |  |     scan-reg dup 4 <+> LDR                     ! load array | 
					
						
							|  |  |  |     temp-reg dup scan-reg ADD                  ! compute quotation location | 
					
						
							|  |  |  |     quot-reg temp-reg array-start <+> LDR      ! load quotation | 
					
						
							|  |  |  |     load-quot-xt | 
					
						
							|  |  |  |     jit-jump | 
					
						
							|  |  |  | ] { } make jit-dispatch set
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ | 
					
						
							|  |  |  |     SP SP stack-frame ADD                      ! pop stack frame | 
					
						
							| 
									
										
										
										
											2007-10-13 17:57:29 -04:00
										 |  |  |     LR SP 4 <-> LDR                            ! load return address | 
					
						
							| 
									
										
										
										
											2007-10-13 00:57:24 -04:00
										 |  |  | ] { } make jit-epilog set
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-18 02:37:52 -04:00
										 |  |  | [ LR BX ] { } make jit-return set
 | 
					
						
							| 
									
										
										
										
											2007-10-13 00:57:24 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | "bootstrap.arm" forget-vocab |