compiler.cfg: add ##load-float instruction for single precision floating point constants
							parent
							
								
									982e704626
								
							
						
					
					
						commit
						f988dad79c
					
				|  | @ -34,6 +34,10 @@ INSN: ##load-tagged | |||
| def: dst/tagged-rep | ||||
| literal: val ; | ||||
| 
 | ||||
| INSN: ##load-float | ||||
| def: dst/float-rep | ||||
| literal: val ; | ||||
| 
 | ||||
| INSN: ##load-double | ||||
| def: dst/double-rep | ||||
| literal: val ; | ||||
|  |  | |||
|  | @ -42,8 +42,16 @@ M: ##load-integer optimize-insn | |||
|         [ call-next-method ] | ||||
|     } cond ; | ||||
| 
 | ||||
| ! When a float is unboxed, we replace the ##load-reference with a ##load-double | ||||
| ! if the architecture supports it | ||||
| ! When a constant float is unboxed, we replace the | ||||
| ! ##load-reference with a ##load-float or ##load-double if the | ||||
| ! architecture supports it | ||||
| : convert-to-load-float? ( insn -- ? ) | ||||
|     { | ||||
|         [ drop fused-unboxing? ] | ||||
|         [ dst>> rep-of float-rep? ] | ||||
|         [ obj>> float? ] | ||||
|     } 1&& ; | ||||
| 
 | ||||
| : convert-to-load-double? ( insn -- ? ) | ||||
|     { | ||||
|         [ drop fused-unboxing? ] | ||||
|  | @ -74,6 +82,10 @@ M: ##load-integer optimize-insn | |||
| 
 | ||||
| M: ##load-reference optimize-insn | ||||
|     { | ||||
|         { | ||||
|             [ dup convert-to-load-float? ] | ||||
|             [ [ dst>> ] [ obj>> ] bi ##load-float here ] | ||||
|         } | ||||
|         { | ||||
|             [ dup convert-to-load-double? ] | ||||
|             [ [ dst>> ] [ obj>> ] bi ##load-double here ] | ||||
|  |  | |||
|  | @ -122,6 +122,7 @@ SYNTAX: CODEGEN: | |||
| CODEGEN: ##load-integer %load-immediate | ||||
| CODEGEN: ##load-tagged %load-immediate | ||||
| CODEGEN: ##load-reference %load-reference | ||||
| CODEGEN: ##load-float %load-float | ||||
| CODEGEN: ##load-double %load-double | ||||
| CODEGEN: ##load-vector %load-vector | ||||
| CODEGEN: ##peek %peek | ||||
|  |  | |||
|  | @ -12,10 +12,6 @@ IN: compiler.codegen.fixup | |||
|     [ length ] [ B{ 0 0 0 0 } swap push-all ] [ underlying>> ] tri | ||||
|     swap set-alien-unsigned-4 ; | ||||
| 
 | ||||
| : push-double ( value vector -- ) | ||||
|     [ length ] [ B{ 0 0 0 0 0 0 0 0 } swap push-all ] [ underlying>> ] tri | ||||
|     swap set-alien-double ; | ||||
| 
 | ||||
| ! Owner | ||||
| SYMBOL: compiling-word | ||||
| 
 | ||||
|  | @ -136,15 +132,8 @@ MEMO: cached-string>symbol ( symbol -- obj ) string>symbol ; | |||
| : align-code ( n -- ) | ||||
|     alignment (align-code) ; | ||||
| 
 | ||||
| GENERIC# emit-data 1 ( obj label -- ) | ||||
| 
 | ||||
| M: float emit-data | ||||
|     8 align-code | ||||
|     resolve-label | ||||
|     building get push-double ; | ||||
| 
 | ||||
| M: byte-array emit-data | ||||
|     16 align-code | ||||
| : emit-data ( obj label -- ) | ||||
|     over length align-code | ||||
|     resolve-label | ||||
|     building get push-all ; | ||||
| 
 | ||||
|  |  | |||
|  | @ -224,6 +224,7 @@ HOOK: complex-addressing? cpu ( -- ? ) | |||
| 
 | ||||
| HOOK: %load-immediate cpu ( reg val -- ) | ||||
| HOOK: %load-reference cpu ( reg obj -- ) | ||||
| HOOK: %load-float cpu ( reg val -- ) | ||||
| HOOK: %load-double cpu ( reg val -- ) | ||||
| HOOK: %load-vector cpu ( reg val rep -- ) | ||||
| 
 | ||||
|  | @ -504,8 +505,8 @@ M: reg-class param-reg param-regs nth ; | |||
| 
 | ||||
| M: stack-params param-reg 2drop ; | ||||
| 
 | ||||
| ! Does this architecture support %load-double, %load-vector and | ||||
| ! objects in %compare-imm? | ||||
| ! Does this architecture support %load-float, %load-double, | ||||
| ! and %load-vector? | ||||
| HOOK: fused-unboxing? cpu ( -- ? ) | ||||
| 
 | ||||
| ! Can this value be an immediate operand for %add-imm, %sub-imm, | ||||
|  |  | |||
|  | @ -27,12 +27,15 @@ M: x86.32 temp-reg ECX ; | |||
| 
 | ||||
| M: x86.32 immediate-comparand? ( obj -- ? ) drop t ; | ||||
| 
 | ||||
| M: x86.32 %load-double ( dst val -- ) | ||||
|     [ 0 [] MOVSD ] dip rc-absolute rel-binary-literal ; | ||||
| 
 | ||||
| M:: x86.32 %load-vector ( dst val rep -- ) | ||||
|     dst 0 [] rep copy-memory* val rc-absolute rel-binary-literal ; | ||||
| 
 | ||||
| M: x86.32 %load-float ( dst val -- ) | ||||
|     <float> float-rep %load-vector ; | ||||
| 
 | ||||
| M: x86.32 %load-double ( dst val -- ) | ||||
|     <double> double-rep %load-vector ; | ||||
| 
 | ||||
| M: x86.32 %mov-vm-ptr ( reg -- ) | ||||
|     0 MOV 0 rc-absolute-cell rel-vm ; | ||||
| 
 | ||||
|  |  | |||
|  | @ -46,12 +46,15 @@ M: x86.64 %mov-vm-ptr ( reg -- ) | |||
| M: x86.64 %vm-field ( dst offset -- ) | ||||
|     [ vm-reg ] dip [+] MOV ; | ||||
| 
 | ||||
| M: x86.64 %load-double ( dst val -- ) | ||||
|     [ 0 [RIP+] MOVSD ] dip rc-relative rel-binary-literal ; | ||||
| 
 | ||||
| M:: x86.64 %load-vector ( dst val rep -- ) | ||||
|     dst 0 [RIP+] rep copy-memory* val rc-relative rel-binary-literal ; | ||||
| 
 | ||||
| M: x86.64 %load-float ( dst val -- ) | ||||
|     <float> float-rep %load-vector ; | ||||
| 
 | ||||
| M: x86.64 %load-double ( dst val -- ) | ||||
|     <double> double-rep %load-vector ; | ||||
| 
 | ||||
| M: x86.64 %set-vm-field ( src offset -- ) | ||||
|     [ vm-reg ] dip [+] swap MOV ; | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue