| 
									
										
										
										
											2009-01-13 18:12:43 -05:00
										 |  |  | ! Copyright (C) 2008, 2009 Slava Pestov. | 
					
						
							| 
									
										
										
										
											2008-09-10 23:11:03 -04:00
										 |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							| 
									
										
										
										
											2008-11-08 22:40:47 -05:00
										 |  |  | USING: namespaces make math math.order math.parser sequences accessors | 
					
						
							| 
									
										
										
										
											2008-09-17 01:46:38 -04:00
										 |  |  | kernel kernel.private layouts assocs words summary arrays | 
					
						
							| 
									
										
										
										
											2008-09-17 19:52:11 -04:00
										 |  |  | combinators classes.algebra alien alien.c-types alien.structs | 
					
						
							| 
									
										
										
										
											2009-02-06 05:02:00 -05:00
										 |  |  | alien.strings alien.arrays alien.complex sets libc | 
					
						
							|  |  |  | continuations.private fry cpu.architecture | 
					
						
							| 
									
										
										
										
											2008-09-17 01:46:38 -04:00
										 |  |  | compiler.errors | 
					
						
							|  |  |  | compiler.alien | 
					
						
							|  |  |  | compiler.cfg | 
					
						
							|  |  |  | compiler.cfg.instructions | 
					
						
							| 
									
										
										
										
											2008-10-07 17:13:29 -04:00
										 |  |  | compiler.cfg.registers | 
					
						
							| 
									
										
										
										
											2008-10-20 02:56:28 -04:00
										 |  |  | compiler.cfg.builder | 
					
						
							| 
									
										
										
										
											2009-01-13 18:12:43 -05:00
										 |  |  | compiler.codegen.fixup | 
					
						
							|  |  |  | compiler.utilities ;
 | 
					
						
							| 
									
										
										
										
											2008-09-17 01:46:38 -04:00
										 |  |  | IN: compiler.codegen | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | GENERIC: generate-insn ( insn -- )
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-09-17 19:52:11 -04:00
										 |  |  | SYMBOL: registers | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-20 02:56:28 -04:00
										 |  |  | : register ( vreg -- operand )
 | 
					
						
							| 
									
										
										
										
											2008-10-17 16:35:04 -04:00
										 |  |  |     registers get at [ "Bad value" throw ] unless* ;
 | 
					
						
							| 
									
										
										
										
											2008-09-17 19:52:11 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-21 04:21:29 -04:00
										 |  |  | : ?register ( obj -- operand )
 | 
					
						
							|  |  |  |     dup vreg? [ register ] when ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-09-17 01:46:38 -04:00
										 |  |  | : generate-insns ( insns -- code )
 | 
					
						
							|  |  |  |     [ | 
					
						
							|  |  |  |         [ | 
					
						
							|  |  |  |             dup regs>> registers set
 | 
					
						
							|  |  |  |             generate-insn | 
					
						
							|  |  |  |         ] each
 | 
					
						
							|  |  |  |     ] { } make fixup ;
 | 
					
						
							| 
									
										
										
										
											2008-09-10 23:11:03 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-09-17 01:46:38 -04:00
										 |  |  | TUPLE: asm label code calls ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SYMBOL: calls | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : add-call ( word -- )
 | 
					
						
							|  |  |  |     #! Compile this word later. | 
					
						
							|  |  |  |     calls get push ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SYMBOL: compiling-word | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : compiled-stack-traces? ( -- ? ) 59 getenv ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ! Mapping _label IDs to label instances | 
					
						
							|  |  |  | SYMBOL: labels | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : init-generator ( word -- )
 | 
					
						
							|  |  |  |     H{ } clone labels set
 | 
					
						
							|  |  |  |     V{ } clone literal-table set
 | 
					
						
							|  |  |  |     V{ } clone calls set
 | 
					
						
							|  |  |  |     compiling-word set
 | 
					
						
							|  |  |  |     compiled-stack-traces? compiling-word get f ? add-literal drop ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : generate ( mr -- asm )
 | 
					
						
							|  |  |  |     [ | 
					
						
							|  |  |  |         [ label>> ] | 
					
						
							|  |  |  |         [ word>> init-generator ] | 
					
						
							|  |  |  |         [ instructions>> generate-insns ] tri
 | 
					
						
							|  |  |  |         calls get
 | 
					
						
							|  |  |  |         asm boa
 | 
					
						
							|  |  |  |     ] with-scope ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : lookup-label ( id -- label )
 | 
					
						
							|  |  |  |     labels get [ drop <label> ] cache ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-20 02:56:28 -04:00
										 |  |  | M: ##load-immediate generate-insn | 
					
						
							| 
									
										
										
										
											2008-10-21 04:21:29 -04:00
										 |  |  |     [ dst>> register ] [ val>> ] bi %load-immediate ;
 | 
					
						
							| 
									
										
										
										
											2008-09-17 01:46:38 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-29 02:44:58 -05:00
										 |  |  | M: ##load-reference generate-insn | 
					
						
							|  |  |  |     [ dst>> register ] [ obj>> ] bi %load-reference ;
 | 
					
						
							| 
									
										
										
										
											2008-09-17 01:46:38 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-09-17 19:52:11 -04:00
										 |  |  | M: ##peek generate-insn | 
					
						
							| 
									
										
										
										
											2008-10-20 02:56:28 -04:00
										 |  |  |     [ dst>> register ] [ loc>> ] bi %peek ;
 | 
					
						
							| 
									
										
										
										
											2008-09-17 01:46:38 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-09-17 19:52:11 -04:00
										 |  |  | M: ##replace generate-insn | 
					
						
							| 
									
										
										
										
											2008-10-20 02:56:28 -04:00
										 |  |  |     [ src>> register ] [ loc>> ] bi %replace ;
 | 
					
						
							| 
									
										
										
										
											2008-09-17 01:46:38 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | M: ##inc-d generate-insn n>> %inc-d ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: ##inc-r generate-insn n>> %inc-r ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-03 02:18:54 -05:00
										 |  |  | M: ##call generate-insn | 
					
						
							|  |  |  |     word>> dup sub-primitive>> | 
					
						
							|  |  |  |     [ first % ] [ [ add-call ] [ %call ] bi ] ?if ;
 | 
					
						
							| 
									
										
										
										
											2008-09-10 23:11:03 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-09-17 01:46:38 -04:00
										 |  |  | M: ##jump generate-insn word>> [ add-call ] [ %jump-label ] bi ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-20 02:56:28 -04:00
										 |  |  | M: ##return generate-insn drop %return ;
 | 
					
						
							| 
									
										
										
										
											2008-09-17 19:52:11 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-20 02:56:28 -04:00
										 |  |  | M: ##dispatch-label generate-insn label>> %dispatch-label ;
 | 
					
						
							| 
									
										
										
										
											2008-09-17 19:52:11 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-20 02:56:28 -04:00
										 |  |  | M: ##dispatch generate-insn | 
					
						
							| 
									
										
										
										
											2008-11-13 05:16:08 -05:00
										 |  |  |     [ src>> register ] [ temp>> register ] [ offset>> ] tri %dispatch ;
 | 
					
						
							| 
									
										
										
										
											2008-09-17 19:52:11 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-15 23:21:56 -05:00
										 |  |  | : >slot< ( insn -- dst obj slot tag )
 | 
					
						
							| 
									
										
										
										
											2008-10-20 02:56:28 -04:00
										 |  |  |     { | 
					
						
							|  |  |  |         [ dst>> register ] | 
					
						
							|  |  |  |         [ obj>> register ] | 
					
						
							| 
									
										
										
										
											2008-10-21 04:21:29 -04:00
										 |  |  |         [ slot>> ?register ] | 
					
						
							| 
									
										
										
										
											2008-10-20 02:56:28 -04:00
										 |  |  |         [ tag>> ] | 
					
						
							|  |  |  |     } cleave ; inline
 | 
					
						
							| 
									
										
										
										
											2008-09-17 01:46:38 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-20 06:55:20 -04:00
										 |  |  | M: ##slot generate-insn | 
					
						
							|  |  |  |     [ >slot< ] [ temp>> register ] bi %slot ;
 | 
					
						
							| 
									
										
										
										
											2008-09-17 01:46:38 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-20 06:55:20 -04:00
										 |  |  | M: ##slot-imm generate-insn | 
					
						
							|  |  |  |     >slot< %slot-imm ;
 | 
					
						
							| 
									
										
										
										
											2008-09-17 01:46:38 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-15 20:44:56 -05:00
										 |  |  | : >set-slot< ( insn -- src obj slot tag )
 | 
					
						
							| 
									
										
										
										
											2008-10-20 02:56:28 -04:00
										 |  |  |     { | 
					
						
							|  |  |  |         [ src>> register ] | 
					
						
							|  |  |  |         [ obj>> register ] | 
					
						
							| 
									
										
										
										
											2008-10-21 04:21:29 -04:00
										 |  |  |         [ slot>> ?register ] | 
					
						
							| 
									
										
										
										
											2008-10-20 02:56:28 -04:00
										 |  |  |         [ tag>> ] | 
					
						
							|  |  |  |     } cleave ; inline
 | 
					
						
							| 
									
										
										
										
											2008-09-17 01:46:38 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-20 06:55:20 -04:00
										 |  |  | M: ##set-slot generate-insn | 
					
						
							|  |  |  |     [ >set-slot< ] [ temp>> register ] bi %set-slot ;
 | 
					
						
							| 
									
										
										
										
											2008-09-17 01:46:38 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-20 06:55:20 -04:00
										 |  |  | M: ##set-slot-imm generate-insn | 
					
						
							|  |  |  |     >set-slot< %set-slot-imm ;
 | 
					
						
							| 
									
										
										
										
											2008-09-17 01:46:38 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-06 02:11:28 -05:00
										 |  |  | M: ##string-nth generate-insn | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         [ dst>> register ] | 
					
						
							|  |  |  |         [ obj>> register ] | 
					
						
							|  |  |  |         [ index>> register ] | 
					
						
							|  |  |  |         [ temp>> register ] | 
					
						
							|  |  |  |     } cleave %string-nth ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-05 07:38:51 -05:00
										 |  |  | M: ##set-string-nth-fast generate-insn | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         [ src>> register ] | 
					
						
							|  |  |  |         [ obj>> register ] | 
					
						
							|  |  |  |         [ index>> register ] | 
					
						
							|  |  |  |         [ temp>> register ] | 
					
						
							|  |  |  |     } cleave %set-string-nth-fast ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-09-17 19:52:11 -04:00
										 |  |  | : dst/src ( insn -- dst src )
 | 
					
						
							| 
									
										
										
										
											2008-10-20 02:56:28 -04:00
										 |  |  |     [ dst>> register ] [ src>> register ] bi ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : dst/src1/src2 ( insn -- dst src1 src2 )
 | 
					
						
							| 
									
										
										
										
											2008-10-21 04:21:29 -04:00
										 |  |  |     [ dst>> register ] | 
					
						
							|  |  |  |     [ src1>> register ] | 
					
						
							|  |  |  |     [ src2>> ?register ] tri ; inline
 | 
					
						
							| 
									
										
										
										
											2008-10-20 02:56:28 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | M: ##add     generate-insn dst/src1/src2 %add     ;
 | 
					
						
							|  |  |  | M: ##add-imm generate-insn dst/src1/src2 %add-imm ;
 | 
					
						
							|  |  |  | M: ##sub     generate-insn dst/src1/src2 %sub     ;
 | 
					
						
							|  |  |  | M: ##sub-imm generate-insn dst/src1/src2 %sub-imm ;
 | 
					
						
							|  |  |  | M: ##mul     generate-insn dst/src1/src2 %mul     ;
 | 
					
						
							|  |  |  | M: ##mul-imm generate-insn dst/src1/src2 %mul-imm ;
 | 
					
						
							|  |  |  | M: ##and     generate-insn dst/src1/src2 %and     ;
 | 
					
						
							|  |  |  | M: ##and-imm generate-insn dst/src1/src2 %and-imm ;
 | 
					
						
							|  |  |  | M: ##or      generate-insn dst/src1/src2 %or      ;
 | 
					
						
							|  |  |  | M: ##or-imm  generate-insn dst/src1/src2 %or-imm  ;
 | 
					
						
							|  |  |  | M: ##xor     generate-insn dst/src1/src2 %xor     ;
 | 
					
						
							|  |  |  | M: ##xor-imm generate-insn dst/src1/src2 %xor-imm ;
 | 
					
						
							|  |  |  | M: ##shl-imm generate-insn dst/src1/src2 %shl-imm ;
 | 
					
						
							|  |  |  | M: ##shr-imm generate-insn dst/src1/src2 %shr-imm ;
 | 
					
						
							|  |  |  | M: ##sar-imm generate-insn dst/src1/src2 %sar-imm ;
 | 
					
						
							|  |  |  | M: ##not     generate-insn dst/src       %not     ;
 | 
					
						
							| 
									
										
										
										
											2008-12-06 16:31:17 -05:00
										 |  |  | M: ##log2    generate-insn dst/src       %log2    ;
 | 
					
						
							| 
									
										
										
										
											2008-09-17 19:52:11 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-28 07:36:30 -05:00
										 |  |  | : src1/src2 ( insn -- src1 src2 )
 | 
					
						
							|  |  |  |     [ src1>> register ] [ src2>> register ] bi ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-30 08:26:49 -05:00
										 |  |  | : src1/src2/temp1/temp2 ( insn -- src1 src2 temp1 temp2 )
 | 
					
						
							|  |  |  |     [ src1/src2 ] [ temp1>> register ] [ temp2>> register ] tri ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-28 07:36:30 -05:00
										 |  |  | M: ##fixnum-add generate-insn src1/src2 %fixnum-add ;
 | 
					
						
							|  |  |  | M: ##fixnum-add-tail generate-insn src1/src2 %fixnum-add-tail ;
 | 
					
						
							|  |  |  | M: ##fixnum-sub generate-insn src1/src2 %fixnum-sub ;
 | 
					
						
							|  |  |  | M: ##fixnum-sub-tail generate-insn src1/src2 %fixnum-sub-tail ;
 | 
					
						
							| 
									
										
										
										
											2008-11-30 08:26:49 -05:00
										 |  |  | M: ##fixnum-mul generate-insn src1/src2/temp1/temp2 %fixnum-mul ;
 | 
					
						
							|  |  |  | M: ##fixnum-mul-tail generate-insn src1/src2/temp1/temp2 %fixnum-mul-tail ;
 | 
					
						
							| 
									
										
										
										
											2008-11-28 06:33:58 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-20 02:56:28 -04:00
										 |  |  | : dst/src/temp ( insn -- dst src temp )
 | 
					
						
							|  |  |  |     [ dst/src ] [ temp>> register ] bi ; inline
 | 
					
						
							| 
									
										
										
										
											2008-09-17 19:52:11 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-20 02:56:28 -04:00
										 |  |  | M: ##integer>bignum generate-insn dst/src/temp %integer>bignum ;
 | 
					
						
							| 
									
										
										
										
											2008-11-05 05:16:08 -05:00
										 |  |  | M: ##bignum>integer generate-insn dst/src/temp %bignum>integer ;
 | 
					
						
							| 
									
										
										
										
											2008-09-17 01:46:38 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-20 02:56:28 -04:00
										 |  |  | M: ##add-float generate-insn dst/src1/src2 %add-float ;
 | 
					
						
							|  |  |  | M: ##sub-float generate-insn dst/src1/src2 %sub-float ;
 | 
					
						
							|  |  |  | M: ##mul-float generate-insn dst/src1/src2 %mul-float ;
 | 
					
						
							|  |  |  | M: ##div-float generate-insn dst/src1/src2 %div-float ;
 | 
					
						
							| 
									
										
										
										
											2008-09-17 01:46:38 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-21 04:21:29 -04:00
										 |  |  | M: ##integer>float generate-insn dst/src %integer>float ;
 | 
					
						
							| 
									
										
										
										
											2008-10-20 02:56:28 -04:00
										 |  |  | M: ##float>integer generate-insn dst/src %float>integer ;
 | 
					
						
							| 
									
										
										
										
											2008-09-17 01:46:38 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-21 04:21:29 -04:00
										 |  |  | M: ##copy             generate-insn dst/src %copy ;
 | 
					
						
							|  |  |  | M: ##copy-float       generate-insn dst/src %copy-float ;
 | 
					
						
							|  |  |  | M: ##unbox-float      generate-insn dst/src %unbox-float ;
 | 
					
						
							|  |  |  | M: ##unbox-any-c-ptr  generate-insn dst/src/temp %unbox-any-c-ptr ;
 | 
					
						
							|  |  |  | M: ##box-float        generate-insn dst/src/temp %box-float ;
 | 
					
						
							|  |  |  | M: ##box-alien        generate-insn dst/src/temp %box-alien ;
 | 
					
						
							| 
									
										
										
										
											2008-10-20 02:56:28 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | M: ##alien-unsigned-1 generate-insn dst/src %alien-unsigned-1 ;
 | 
					
						
							|  |  |  | M: ##alien-unsigned-2 generate-insn dst/src %alien-unsigned-2 ;
 | 
					
						
							|  |  |  | M: ##alien-unsigned-4 generate-insn dst/src %alien-unsigned-4 ;
 | 
					
						
							|  |  |  | M: ##alien-signed-1   generate-insn dst/src %alien-signed-1   ;
 | 
					
						
							|  |  |  | M: ##alien-signed-2   generate-insn dst/src %alien-signed-2   ;
 | 
					
						
							| 
									
										
										
										
											2008-10-20 06:55:20 -04:00
										 |  |  | M: ##alien-signed-4   generate-insn dst/src %alien-signed-4   ;
 | 
					
						
							| 
									
										
										
										
											2008-10-20 02:56:28 -04:00
										 |  |  | M: ##alien-cell       generate-insn dst/src %alien-cell       ;
 | 
					
						
							|  |  |  | M: ##alien-float      generate-insn dst/src %alien-float      ;
 | 
					
						
							|  |  |  | M: ##alien-double     generate-insn dst/src %alien-double     ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-15 20:44:56 -05:00
										 |  |  | : >alien-setter< ( insn -- src value )
 | 
					
						
							|  |  |  |     [ src>> register ] [ value>> register ] bi ; inline
 | 
					
						
							| 
									
										
										
										
											2008-10-20 02:56:28 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | M: ##set-alien-integer-1 generate-insn >alien-setter< %set-alien-integer-1 ;
 | 
					
						
							|  |  |  | M: ##set-alien-integer-2 generate-insn >alien-setter< %set-alien-integer-2 ;
 | 
					
						
							|  |  |  | M: ##set-alien-integer-4 generate-insn >alien-setter< %set-alien-integer-4 ;
 | 
					
						
							|  |  |  | M: ##set-alien-cell      generate-insn >alien-setter< %set-alien-cell      ;
 | 
					
						
							|  |  |  | M: ##set-alien-float     generate-insn >alien-setter< %set-alien-float     ;
 | 
					
						
							|  |  |  | M: ##set-alien-double    generate-insn >alien-setter< %set-alien-double    ;
 | 
					
						
							| 
									
										
										
										
											2008-09-17 01:46:38 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-09-17 19:52:11 -04:00
										 |  |  | M: ##allot generate-insn | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2008-10-20 02:56:28 -04:00
										 |  |  |         [ dst>> register ] | 
					
						
							| 
									
										
										
										
											2008-09-17 19:52:11 -04:00
										 |  |  |         [ size>> ] | 
					
						
							| 
									
										
										
										
											2008-10-20 21:40:28 -04:00
										 |  |  |         [ class>> ] | 
					
						
							| 
									
										
										
										
											2008-10-20 02:56:28 -04:00
										 |  |  |         [ temp>> register ] | 
					
						
							| 
									
										
										
										
											2008-09-17 19:52:11 -04:00
										 |  |  |     } cleave
 | 
					
						
							|  |  |  |     %allot ;
 | 
					
						
							| 
									
										
										
										
											2008-09-17 01:46:38 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-09-17 19:52:11 -04:00
										 |  |  | M: ##write-barrier generate-insn | 
					
						
							| 
									
										
										
										
											2008-10-20 02:56:28 -04:00
										 |  |  |     [ src>> register ] | 
					
						
							|  |  |  |     [ card#>> register ] | 
					
						
							|  |  |  |     [ table>> register ] | 
					
						
							| 
									
										
										
										
											2008-10-10 04:16:26 -04:00
										 |  |  |     tri %write-barrier ;
 | 
					
						
							| 
									
										
										
										
											2008-09-17 01:46:38 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-22 19:38:30 -04:00
										 |  |  | M: _gc generate-insn drop %gc ;
 | 
					
						
							| 
									
										
										
										
											2008-09-17 01:46:38 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-03 07:20:51 -05:00
										 |  |  | M: ##loop-entry generate-insn drop %loop-entry ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-06 10:16:29 -05:00
										 |  |  | M: ##alien-global generate-insn | 
					
						
							|  |  |  |     [ dst>> register ] [ symbol>> ] [ library>> ] tri
 | 
					
						
							|  |  |  |     %alien-global ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-20 02:56:28 -04:00
										 |  |  | ! ##alien-invoke | 
					
						
							| 
									
										
										
										
											2008-09-10 23:11:03 -04:00
										 |  |  | GENERIC: reg-size ( register-class -- n )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: int-regs reg-size drop cell ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: single-float-regs reg-size drop 4 ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: double-float-regs reg-size drop 8 ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-12 19:40:43 -04:00
										 |  |  | M: stack-params reg-size drop "void*" heap-size ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-09-10 23:11:03 -04:00
										 |  |  | GENERIC: reg-class-variable ( register-class -- symbol )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: reg-class reg-class-variable ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: float-regs reg-class-variable drop float-regs ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | GENERIC: inc-reg-class ( register-class -- )
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-08 22:40:47 -05:00
										 |  |  | : ?dummy-stack-params ( reg-class -- )
 | 
					
						
							| 
									
										
										
										
											2008-11-17 14:34:37 -05:00
										 |  |  |     dummy-stack-params? [ reg-size cell align stack-params +@ ] [ drop ] if ;
 | 
					
						
							| 
									
										
										
										
											2008-11-08 22:40:47 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : ?dummy-int-params ( reg-class -- )
 | 
					
						
							|  |  |  |     dummy-int-params? [ reg-size cell /i 1 max int-regs +@ ] [ drop ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : ?dummy-fp-params ( reg-class -- )
 | 
					
						
							|  |  |  |     drop dummy-fp-params? [ float-regs inc ] when ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: int-regs inc-reg-class | 
					
						
							|  |  |  |     [ reg-class-variable inc ] | 
					
						
							|  |  |  |     [ ?dummy-stack-params ] | 
					
						
							|  |  |  |     [ ?dummy-fp-params ] | 
					
						
							|  |  |  |     tri ;
 | 
					
						
							| 
									
										
										
										
											2008-09-10 23:11:03 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | M: float-regs inc-reg-class | 
					
						
							| 
									
										
										
										
											2008-11-08 22:40:47 -05:00
										 |  |  |     [ reg-class-variable inc ] | 
					
						
							|  |  |  |     [ ?dummy-stack-params ] | 
					
						
							|  |  |  |     [ ?dummy-int-params ] | 
					
						
							|  |  |  |     tri ;
 | 
					
						
							| 
									
										
										
										
											2008-09-10 23:11:03 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | GENERIC: reg-class-full? ( class -- ? )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: stack-params reg-class-full? drop t ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: object reg-class-full? | 
					
						
							|  |  |  |     [ reg-class-variable get ] [ param-regs length ] bi >= ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : spill-param ( reg-class -- n reg-class )
 | 
					
						
							|  |  |  |     stack-params get
 | 
					
						
							| 
									
										
										
										
											2008-11-30 19:28:15 -05:00
										 |  |  |     [ reg-size cell align stack-params +@ ] dip
 | 
					
						
							| 
									
										
										
										
											2008-09-10 23:11:03 -04:00
										 |  |  |     stack-params ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : fastcall-param ( reg-class -- n reg-class )
 | 
					
						
							|  |  |  |     [ reg-class-variable get ] [ inc-reg-class ] [ ] tri ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : alloc-parameter ( parameter -- reg reg-class )
 | 
					
						
							|  |  |  |     c-type-reg-class dup reg-class-full? | 
					
						
							|  |  |  |     [ spill-param ] [ fastcall-param ] if
 | 
					
						
							|  |  |  |     [ param-reg ] keep ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-09-17 01:46:38 -04:00
										 |  |  | : (flatten-int-type) ( size -- seq )
 | 
					
						
							|  |  |  |     cell /i "void*" c-type <repetition> ;
 | 
					
						
							| 
									
										
										
										
											2008-09-10 23:11:03 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-09-17 01:46:38 -04:00
										 |  |  | GENERIC: flatten-value-type ( type -- types )
 | 
					
						
							| 
									
										
										
										
											2008-09-10 23:11:03 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-09-17 01:46:38 -04:00
										 |  |  | M: object flatten-value-type 1array ;
 | 
					
						
							| 
									
										
										
										
											2008-09-10 23:11:03 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-09-17 01:46:38 -04:00
										 |  |  | M: struct-type flatten-value-type ( type -- types )
 | 
					
						
							| 
									
										
										
										
											2008-09-10 23:11:03 -04:00
										 |  |  |     stack-size cell align (flatten-int-type) ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-09-17 01:46:38 -04:00
										 |  |  | M: long-long-type flatten-value-type ( type -- types )
 | 
					
						
							| 
									
										
										
										
											2008-09-10 23:11:03 -04:00
										 |  |  |     stack-size cell align (flatten-int-type) ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : flatten-value-types ( params -- params )
 | 
					
						
							|  |  |  |     #! Convert value type structs to consecutive void*s. | 
					
						
							|  |  |  |     [ | 
					
						
							|  |  |  |         0 [ | 
					
						
							|  |  |  |             c-type | 
					
						
							| 
									
										
										
										
											2008-09-17 01:46:38 -04:00
										 |  |  |             [ parameter-align (flatten-int-type) % ] keep
 | 
					
						
							| 
									
										
										
										
											2008-09-10 23:11:03 -04:00
										 |  |  |             [ stack-size cell align + ] keep
 | 
					
						
							| 
									
										
										
										
											2008-09-17 01:46:38 -04:00
										 |  |  |             flatten-value-type % | 
					
						
							| 
									
										
										
										
											2008-09-10 23:11:03 -04:00
										 |  |  |         ] reduce drop
 | 
					
						
							|  |  |  |     ] { } make ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : each-parameter ( parameters quot -- )
 | 
					
						
							| 
									
										
										
										
											2008-11-30 19:28:15 -05:00
										 |  |  |     [ [ parameter-sizes nip ] keep ] dip 2each ; inline
 | 
					
						
							| 
									
										
										
										
											2008-09-10 23:11:03 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : reverse-each-parameter ( parameters quot -- )
 | 
					
						
							| 
									
										
										
										
											2008-11-30 19:28:15 -05:00
										 |  |  |     [ [ parameter-sizes nip ] keep ] dip 2reverse-each ; inline
 | 
					
						
							| 
									
										
										
										
											2008-09-10 23:11:03 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : reset-freg-counts ( -- )
 | 
					
						
							|  |  |  |     { int-regs float-regs stack-params } [ 0 swap set ] each ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : with-param-regs ( quot -- )
 | 
					
						
							|  |  |  |     #! In quot you can call alloc-parameter | 
					
						
							|  |  |  |     [ reset-freg-counts call ] with-scope ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : move-parameters ( node word -- )
 | 
					
						
							|  |  |  |     #! Moves values from C stack to registers (if word is | 
					
						
							|  |  |  |     #! %load-param-reg) and registers to C stack (if word is | 
					
						
							|  |  |  |     #! %save-param-reg). | 
					
						
							| 
									
										
										
										
											2008-11-30 19:28:15 -05:00
										 |  |  |     [ alien-parameters flatten-value-types ] | 
					
						
							|  |  |  |     [ '[ alloc-parameter _ execute ] ] | 
					
						
							|  |  |  |     bi* each-parameter ; inline
 | 
					
						
							| 
									
										
										
										
											2008-09-10 23:11:03 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : unbox-parameters ( offset node -- )
 | 
					
						
							|  |  |  |     parameters>> [ | 
					
						
							| 
									
										
										
										
											2008-11-30 19:28:15 -05:00
										 |  |  |         %prepare-unbox [ over + ] dip unbox-parameter | 
					
						
							| 
									
										
										
										
											2008-09-10 23:11:03 -04:00
										 |  |  |     ] reverse-each-parameter drop ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : prepare-box-struct ( node -- offset )
 | 
					
						
							|  |  |  |     #! Return offset on C stack where to store unboxed | 
					
						
							|  |  |  |     #! parameters. If the C function is returning a structure, | 
					
						
							|  |  |  |     #! the first parameter is an implicit target area pointer, | 
					
						
							|  |  |  |     #! so we need to use a different offset. | 
					
						
							| 
									
										
										
										
											2008-10-07 17:13:29 -04:00
										 |  |  |     return>> large-struct? | 
					
						
							|  |  |  |     [ %prepare-box-struct cell ] [ 0 ] if ;
 | 
					
						
							| 
									
										
										
										
											2008-09-10 23:11:03 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : objects>registers ( params -- )
 | 
					
						
							|  |  |  |     #! Generate code for unboxing a list of C types, then | 
					
						
							|  |  |  |     #! generate code for moving these parameters to register on | 
					
						
							|  |  |  |     #! architectures where parameters are passed in registers. | 
					
						
							|  |  |  |     [ | 
					
						
							|  |  |  |         [ prepare-box-struct ] keep
 | 
					
						
							|  |  |  |         [ unbox-parameters ] keep
 | 
					
						
							|  |  |  |         \ %load-param-reg move-parameters | 
					
						
							|  |  |  |     ] with-param-regs ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : box-return* ( node -- )
 | 
					
						
							|  |  |  |     return>> [ ] [ box-return ] if-void ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TUPLE: no-such-library name ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: no-such-library summary | 
					
						
							|  |  |  |     drop "Library not found" ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: no-such-library compiler-error-type | 
					
						
							|  |  |  |     drop +linkage+ ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : no-such-library ( name -- )
 | 
					
						
							|  |  |  |     \ no-such-library boa
 | 
					
						
							|  |  |  |     compiling-word get compiler-error ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TUPLE: no-such-symbol name ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: no-such-symbol summary | 
					
						
							|  |  |  |     drop "Symbol not found" ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: no-such-symbol compiler-error-type | 
					
						
							|  |  |  |     drop +linkage+ ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : no-such-symbol ( name -- )
 | 
					
						
							|  |  |  |     \ no-such-symbol boa
 | 
					
						
							|  |  |  |     compiling-word get compiler-error ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : check-dlsym ( symbols dll -- )
 | 
					
						
							|  |  |  |     dup dll-valid? [ | 
					
						
							| 
									
										
										
										
											2009-01-29 23:19:07 -05:00
										 |  |  |         dupd '[ _ dlsym ] any?
 | 
					
						
							| 
									
										
										
										
											2008-09-10 23:11:03 -04:00
										 |  |  |         [ drop ] [ no-such-symbol ] if
 | 
					
						
							|  |  |  |     ] [ | 
					
						
							|  |  |  |         dll-path no-such-library drop
 | 
					
						
							|  |  |  |     ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : stdcall-mangle ( symbol node -- symbol )
 | 
					
						
							|  |  |  |     "@" | 
					
						
							|  |  |  |     swap parameters>> parameter-sizes drop
 | 
					
						
							|  |  |  |     number>string 3append ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : alien-invoke-dlsym ( params -- symbols dll )
 | 
					
						
							|  |  |  |     dup function>> dup pick stdcall-mangle 2array
 | 
					
						
							|  |  |  |     swap library>> library dup [ dll>> ] when
 | 
					
						
							|  |  |  |     2dup check-dlsym ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-09-17 01:46:38 -04:00
										 |  |  | M: ##alien-invoke generate-insn | 
					
						
							| 
									
										
										
										
											2008-09-10 23:11:03 -04:00
										 |  |  |     params>> | 
					
						
							| 
									
										
										
										
											2008-09-17 01:46:38 -04:00
										 |  |  |     ! Save registers for GC | 
					
						
							|  |  |  |     %prepare-alien-invoke | 
					
						
							|  |  |  |     ! Unbox parameters | 
					
						
							|  |  |  |     dup objects>registers | 
					
						
							|  |  |  |     %prepare-var-args | 
					
						
							|  |  |  |     ! Call function | 
					
						
							|  |  |  |     dup alien-invoke-dlsym %alien-invoke | 
					
						
							|  |  |  |     ! Box return value | 
					
						
							|  |  |  |     dup %cleanup | 
					
						
							|  |  |  |     box-return* ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ! ##alien-indirect | 
					
						
							|  |  |  | M: ##alien-indirect generate-insn | 
					
						
							| 
									
										
										
										
											2008-09-10 23:11:03 -04:00
										 |  |  |     params>> | 
					
						
							| 
									
										
										
										
											2008-09-17 01:46:38 -04:00
										 |  |  |     ! Save registers for GC | 
					
						
							|  |  |  |     %prepare-alien-invoke | 
					
						
							|  |  |  |     ! Save alien at top of stack to temporary storage | 
					
						
							|  |  |  |     %prepare-alien-indirect | 
					
						
							|  |  |  |     ! Unbox parameters | 
					
						
							|  |  |  |     dup objects>registers | 
					
						
							|  |  |  |     %prepare-var-args | 
					
						
							|  |  |  |     ! Call alien in temporary storage | 
					
						
							|  |  |  |     %alien-indirect | 
					
						
							|  |  |  |     ! Box return value | 
					
						
							|  |  |  |     dup %cleanup | 
					
						
							|  |  |  |     box-return* ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ! ##alien-callback | 
					
						
							| 
									
										
										
										
											2008-09-10 23:11:03 -04:00
										 |  |  | : box-parameters ( params -- )
 | 
					
						
							|  |  |  |     alien-parameters [ box-parameter ] each-parameter ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : registers>objects ( node -- )
 | 
					
						
							|  |  |  |     [ | 
					
						
							|  |  |  |         dup \ %save-param-reg move-parameters | 
					
						
							|  |  |  |         "nest_stacks" f %alien-invoke | 
					
						
							|  |  |  |         box-parameters | 
					
						
							|  |  |  |     ] with-param-regs ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TUPLE: callback-context ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-06 00:51:34 -05:00
										 |  |  | : current-callback ( -- id ) 2 getenv ;
 | 
					
						
							| 
									
										
										
										
											2008-09-10 23:11:03 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : wait-to-return ( token -- )
 | 
					
						
							|  |  |  |     dup current-callback eq? [ | 
					
						
							|  |  |  |         drop
 | 
					
						
							|  |  |  |     ] [ | 
					
						
							| 
									
										
										
										
											2009-01-13 18:12:43 -05:00
										 |  |  |         yield-hook get call wait-to-return | 
					
						
							| 
									
										
										
										
											2008-09-10 23:11:03 -04:00
										 |  |  |     ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : do-callback ( quot token -- )
 | 
					
						
							|  |  |  |     init-catchstack | 
					
						
							|  |  |  |     dup 2 setenv | 
					
						
							|  |  |  |     slip | 
					
						
							|  |  |  |     wait-to-return ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : callback-return-quot ( ctype -- quot )
 | 
					
						
							|  |  |  |     return>> { | 
					
						
							|  |  |  |         { [ dup "void" = ] [ drop [ ] ] } | 
					
						
							| 
									
										
										
										
											2008-10-20 02:56:28 -04:00
										 |  |  |         { [ dup large-struct? ] [ heap-size '[ _ memcpy ] ] } | 
					
						
							| 
									
										
										
										
											2008-09-10 23:11:03 -04:00
										 |  |  |         [ c-type c-type-unboxer-quot ] | 
					
						
							|  |  |  |     } cond ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : callback-prep-quot ( params -- quot )
 | 
					
						
							|  |  |  |     parameters>> [ c-type c-type-boxer-quot ] map spread>quot ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : wrap-callback-quot ( params -- quot )
 | 
					
						
							|  |  |  |     [ | 
					
						
							|  |  |  |         [ callback-prep-quot ] | 
					
						
							|  |  |  |         [ quot>> ] | 
					
						
							|  |  |  |         [ callback-return-quot ] tri 3append , | 
					
						
							|  |  |  |         [ callback-context new do-callback ] % | 
					
						
							|  |  |  |     ] [ ] make ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : %unnest-stacks ( -- ) "unnest_stacks" f %alien-invoke ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-13 00:32:14 -04:00
										 |  |  | M: ##callback-return generate-insn | 
					
						
							| 
									
										
										
										
											2008-09-10 23:11:03 -04:00
										 |  |  |     #! All the extra book-keeping for %unwind is only for x86. | 
					
						
							|  |  |  |     #! On other platforms its an alias for %return. | 
					
						
							| 
									
										
										
										
											2008-10-13 00:32:14 -04:00
										 |  |  |     params>> %callback-return ;
 | 
					
						
							| 
									
										
										
										
											2008-09-10 23:11:03 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-09-17 01:46:38 -04:00
										 |  |  | M: ##alien-callback generate-insn | 
					
						
							|  |  |  |     params>> | 
					
						
							|  |  |  |     [ registers>objects ] | 
					
						
							|  |  |  |     [ wrap-callback-quot %alien-callback ] | 
					
						
							| 
									
										
										
										
											2008-10-13 00:32:14 -04:00
										 |  |  |     [ alien-return [ %unnest-stacks ] [ %callback-value ] if-void ] | 
					
						
							| 
									
										
										
										
											2008-09-17 01:46:38 -04:00
										 |  |  |     tri ;
 | 
					
						
							| 
									
										
										
										
											2008-10-19 02:10:21 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-20 02:56:28 -04:00
										 |  |  | M: _prologue generate-insn | 
					
						
							|  |  |  |     stack-frame>> [ stack-frame set ] [ total-size>> %prologue ] bi ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: _epilogue generate-insn | 
					
						
							|  |  |  |     stack-frame>> total-size>> %epilogue ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: _label generate-insn | 
					
						
							|  |  |  |     id>> lookup-label , ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: _branch generate-insn | 
					
						
							|  |  |  |     label>> lookup-label %jump-label ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-24 09:16:14 -05:00
										 |  |  | : >compare< ( insn -- dst temp cc src1 src2 )
 | 
					
						
							| 
									
										
										
										
											2008-10-21 04:21:29 -04:00
										 |  |  |     { | 
					
						
							|  |  |  |         [ dst>> register ] | 
					
						
							| 
									
										
										
										
											2008-11-24 09:16:14 -05:00
										 |  |  |         [ temp>> register ] | 
					
						
							| 
									
										
										
										
											2008-10-21 04:21:29 -04:00
										 |  |  |         [ cc>> ] | 
					
						
							|  |  |  |         [ src1>> register ] | 
					
						
							|  |  |  |         [ src2>> ?register ] | 
					
						
							|  |  |  |     } cleave ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: ##compare generate-insn >compare< %compare ;
 | 
					
						
							|  |  |  | M: ##compare-imm generate-insn >compare< %compare-imm ;
 | 
					
						
							|  |  |  | M: ##compare-float generate-insn >compare< %compare-float ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-20 06:55:20 -04:00
										 |  |  | : >binary-branch< ( insn -- label cc src1 src2 )
 | 
					
						
							| 
									
										
										
										
											2008-10-20 02:56:28 -04:00
										 |  |  |     { | 
					
						
							|  |  |  |         [ label>> lookup-label ] | 
					
						
							| 
									
										
										
										
											2008-10-20 06:55:20 -04:00
										 |  |  |         [ cc>> ] | 
					
						
							| 
									
										
										
										
											2008-10-20 02:56:28 -04:00
										 |  |  |         [ src1>> register ] | 
					
						
							| 
									
										
										
										
											2008-10-21 04:21:29 -04:00
										 |  |  |         [ src2>> ?register ] | 
					
						
							|  |  |  |     } cleave ; inline
 | 
					
						
							| 
									
										
										
										
											2008-10-20 02:56:28 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-20 06:55:20 -04:00
										 |  |  | M: _compare-branch generate-insn | 
					
						
							|  |  |  |     >binary-branch< %compare-branch ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: _compare-imm-branch generate-insn | 
					
						
							|  |  |  |     >binary-branch< %compare-imm-branch ;
 | 
					
						
							| 
									
										
										
										
											2008-10-20 02:56:28 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-20 06:55:20 -04:00
										 |  |  | M: _compare-float-branch generate-insn | 
					
						
							|  |  |  |     >binary-branch< %compare-float-branch ;
 | 
					
						
							| 
									
										
										
										
											2008-10-20 02:56:28 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-19 02:10:21 -04:00
										 |  |  | M: _spill generate-insn | 
					
						
							|  |  |  |     [ src>> ] [ n>> ] [ class>> ] tri { | 
					
						
							|  |  |  |         { int-regs [ %spill-integer ] } | 
					
						
							|  |  |  |         { double-float-regs [ %spill-float ] } | 
					
						
							|  |  |  |     } case ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: _reload generate-insn | 
					
						
							|  |  |  |     [ dst>> ] [ n>> ] [ class>> ] tri { | 
					
						
							|  |  |  |         { int-regs [ %reload-integer ] } | 
					
						
							|  |  |  |         { double-float-regs [ %reload-float ] } | 
					
						
							|  |  |  |     } case ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: _spill-counts generate-insn drop ;
 |