| 
									
										
										
										
											2009-06-02 19:23:47 -04:00
										 |  |  | ! Copyright (C) 2009 Slava Pestov. | 
					
						
							| 
									
										
										
										
											2008-09-17 20:31:35 -04:00
										 |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							| 
									
										
										
										
											2009-06-02 19:23:47 -04:00
										 |  |  | USING: math math.order namespaces accessors kernel layouts combinators | 
					
						
							|  |  |  | combinators.smart assocs sequences cpu.architecture ;
 | 
					
						
							| 
									
										
										
										
											2008-09-17 20:31:35 -04:00
										 |  |  | IN: compiler.cfg.stack-frame | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-02 19:23:47 -04:00
										 |  |  | TUPLE: stack-frame | 
					
						
							|  |  |  | { params integer } | 
					
						
							|  |  |  | { return integer } | 
					
						
							|  |  |  | { total-size integer } | 
					
						
							|  |  |  | { gc-root-size integer } | 
					
						
							|  |  |  | spill-counts ;
 | 
					
						
							| 
									
										
										
										
											2008-09-17 20:31:35 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-02 19:23:47 -04:00
										 |  |  | ! Stack frame utilities | 
					
						
							|  |  |  | : param-base ( -- n )
 | 
					
						
							|  |  |  |     stack-frame get [ params>> ] [ return>> ] bi + ;
 | 
					
						
							| 
									
										
										
										
											2008-09-17 20:31:35 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-02 19:23:47 -04:00
										 |  |  | : spill-float-offset ( n -- offset )
 | 
					
						
							|  |  |  |     double-float-regs reg-size * ;
 | 
					
						
							| 
									
										
										
										
											2008-09-17 20:31:35 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-02 19:23:47 -04:00
										 |  |  | : spill-integer-base ( -- n )
 | 
					
						
							|  |  |  |     stack-frame get spill-counts>> double-float-regs [ swap at ] keep reg-size *
 | 
					
						
							|  |  |  |     param-base + ;
 | 
					
						
							| 
									
										
										
										
											2008-11-06 20:00:56 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-02 19:23:47 -04:00
										 |  |  | : spill-integer-offset ( n -- offset )
 | 
					
						
							|  |  |  |     cells spill-integer-base + ;
 | 
					
						
							| 
									
										
										
										
											2008-09-17 20:31:35 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-02 19:23:47 -04:00
										 |  |  | : spill-area-size ( stack-frame -- n )
 | 
					
						
							|  |  |  |     spill-counts>> [ swap reg-size * ] { } assoc>map sum ;
 | 
					
						
							| 
									
										
										
										
											2008-09-17 20:31:35 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-02 19:23:47 -04:00
										 |  |  | : gc-root-base ( -- n )
 | 
					
						
							|  |  |  |     stack-frame get spill-area-size | 
					
						
							|  |  |  |     param-base + ;
 | 
					
						
							| 
									
										
										
										
											2008-09-17 20:31:35 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-02 19:23:47 -04:00
										 |  |  | : gc-root-offset ( n -- n' ) gc-root-base + ;
 | 
					
						
							| 
									
										
										
										
											2008-09-17 20:31:35 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-04 00:11:23 -04:00
										 |  |  | : gc-roots-size ( live-values -- n )
 | 
					
						
							|  |  |  |     keys [ reg-class>> reg-size ] sigma ;
 | 
					
						
							| 
									
										
										
										
											2008-09-17 20:31:35 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-02 19:23:47 -04:00
										 |  |  | : (stack-frame-size) ( stack-frame -- n )
 | 
					
						
							| 
									
										
										
										
											2008-09-17 20:31:35 -04:00
										 |  |  |     [ | 
					
						
							| 
									
										
										
										
											2009-06-02 19:23:47 -04:00
										 |  |  |         { | 
					
						
							|  |  |  |             [ spill-area-size ] | 
					
						
							|  |  |  |             [ gc-root-size>> ] | 
					
						
							|  |  |  |             [ params>> ] | 
					
						
							|  |  |  |             [ return>> ] | 
					
						
							|  |  |  |         } cleave
 | 
					
						
							|  |  |  |     ] sum-outputs ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : max-stack-frame ( frame1 frame2 -- frame3 )
 | 
					
						
							|  |  |  |     [ stack-frame new ] 2dip
 | 
					
						
							|  |  |  |         [ [ params>> ] bi@ max >>params ] | 
					
						
							|  |  |  |         [ [ return>> ] bi@ max >>return ] | 
					
						
							|  |  |  |         [ [ gc-root-size>> ] bi@ max >>gc-root-size ] | 
					
						
							|  |  |  |         2tri ;
 |