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