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