| 
									
										
										
										
											2010-01-14 10:10:13 -05:00
										 |  |  | ! Copyright (C) 2008, 2010 Slava Pestov. | 
					
						
							| 
									
										
										
										
											2008-09-10 23:11:03 -04:00
										 |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							| 
									
										
										
										
											2016-03-15 19:09:55 -04:00
										 |  |  | USING: accessors biassocs compiler.cfg.registers | 
					
						
							| 
									
										
										
										
											2014-12-13 19:10:21 -05:00
										 |  |  | compiler.cfg.stacks.finalize compiler.cfg.stacks.global | 
					
						
							| 
									
										
										
										
											2016-03-15 19:09:55 -04:00
										 |  |  | compiler.cfg.stacks.height compiler.cfg.stacks.local | 
					
						
							|  |  |  | compiler.cfg.utilities kernel math namespaces sequences ;
 | 
					
						
							| 
									
										
										
										
											2008-10-20 21:40:15 -04:00
										 |  |  | IN: compiler.cfg.stacks | 
					
						
							| 
									
										
										
										
											2008-09-10 23:11:03 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-23 21:54:38 -04:00
										 |  |  | : begin-stack-analysis ( -- )
 | 
					
						
							| 
									
										
										
										
											2009-07-24 04:37:18 -04:00
										 |  |  |     <bihash> locs>vregs set
 | 
					
						
							| 
									
										
										
										
											2009-07-23 21:54:38 -04:00
										 |  |  |     H{ } clone peek-sets set
 | 
					
						
							|  |  |  |     H{ } clone replace-sets set
 | 
					
						
							| 
									
										
										
										
											2009-08-01 07:12:43 -04:00
										 |  |  |     H{ } clone kill-sets set
 | 
					
						
							| 
									
										
										
										
											2015-03-15 19:14:41 -04:00
										 |  |  |     initial-height-state height-state set ;
 | 
					
						
							| 
									
										
										
										
											2008-09-17 19:52:11 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-15 19:09:55 -04:00
										 |  |  | : end-stack-analysis ( cfg -- )
 | 
					
						
							| 
									
										
										
										
											2014-12-30 20:44:48 -05:00
										 |  |  |     { | 
					
						
							|  |  |  |         compute-anticip-sets | 
					
						
							|  |  |  |         compute-live-sets | 
					
						
							|  |  |  |         compute-pending-sets | 
					
						
							|  |  |  |         compute-dead-sets | 
					
						
							|  |  |  |         compute-avail-sets | 
					
						
							|  |  |  |         finalize-stack-shuffling | 
					
						
							|  |  |  |     } apply-passes ;
 | 
					
						
							| 
									
										
										
										
											2008-09-10 23:11:03 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-02 18:14:14 -04:00
										 |  |  | : create-locs ( loc-class seq -- locs )
 | 
					
						
							|  |  |  |     [ swap new swap >>n ] with map <reversed> ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-24 10:23:58 -04:00
										 |  |  | : stack-locs ( loc-class n -- locs )
 | 
					
						
							| 
									
										
										
										
											2015-05-02 18:14:14 -04:00
										 |  |  |     iota create-locs ;
 | 
					
						
							| 
									
										
										
										
											2009-07-23 21:54:38 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-24 10:23:58 -04:00
										 |  |  | : (load-vregs) ( n loc-class -- vregs )
 | 
					
						
							|  |  |  |     swap stack-locs [ peek-loc ] map ;
 | 
					
						
							| 
									
										
										
										
											2009-07-23 21:54:38 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-24 10:23:58 -04:00
										 |  |  | : load-vregs ( n loc-class -- vregs )
 | 
					
						
							|  |  |  |     [ (load-vregs) ] [ new swap neg >>n inc-stack ] 2bi ;
 | 
					
						
							| 
									
										
										
										
											2009-07-23 21:54:38 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-24 10:23:58 -04:00
										 |  |  | : store-vregs ( vregs loc-class -- )
 | 
					
						
							|  |  |  |     over length stack-locs [ replace-loc ] 2each ;
 | 
					
						
							| 
									
										
										
										
											2015-03-19 13:03:49 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-24 10:23:58 -04:00
										 |  |  | ! Utility | 
					
						
							| 
									
										
										
										
											2015-08-13 18:23:10 -04:00
										 |  |  | : ds-drop ( -- ) D: -1 inc-stack ;
 | 
					
						
							| 
									
										
										
										
											2015-03-19 13:03:49 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-13 18:23:10 -04:00
										 |  |  | : ds-peek ( -- vreg ) D: 0 peek-loc ;
 | 
					
						
							| 
									
										
										
										
											2008-09-10 23:11:03 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-24 10:23:58 -04:00
										 |  |  | : ds-pop ( -- vreg ) ds-peek ds-drop ;
 | 
					
						
							| 
									
										
										
										
											2015-03-19 13:03:49 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-24 10:23:58 -04:00
										 |  |  | : ds-push ( vreg -- )
 | 
					
						
							| 
									
										
										
										
											2015-08-13 18:23:10 -04:00
										 |  |  |     D: 1 inc-stack D: 0 replace-loc ;
 | 
					
						
							| 
									
										
										
										
											2008-09-10 23:11:03 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-23 21:54:38 -04:00
										 |  |  | : (2inputs) ( -- vreg1 vreg2 )
 | 
					
						
							| 
									
										
										
										
											2015-03-24 10:23:58 -04:00
										 |  |  |     2 ds-loc (load-vregs) first2 ;
 | 
					
						
							| 
									
										
										
										
											2009-07-23 21:54:38 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-21 04:20:48 -04:00
										 |  |  | : 2inputs ( -- vreg1 vreg2 )
 | 
					
						
							| 
									
										
										
										
											2015-03-24 10:23:58 -04:00
										 |  |  |     2 ds-loc load-vregs first2 ;
 | 
					
						
							| 
									
										
										
										
											2008-09-10 23:11:03 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-21 04:20:48 -04:00
										 |  |  | : 3inputs ( -- vreg1 vreg2 vreg3 )
 | 
					
						
							| 
									
										
										
										
											2015-03-24 10:23:58 -04:00
										 |  |  |     3 ds-loc load-vregs first3 ;
 | 
					
						
							| 
									
										
										
										
											2009-07-23 21:54:38 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-22 04:21:23 -04:00
										 |  |  | : binary-op ( quot -- )
 | 
					
						
							|  |  |  |     [ 2inputs ] dip call ds-push ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : unary-op ( quot -- )
 | 
					
						
							|  |  |  |     [ ds-pop ] dip call ds-push ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-15 19:14:41 -04:00
										 |  |  | : adjust-d ( n -- )
 | 
					
						
							|  |  |  |     <ds-loc> height-state get swap adjust ;
 |