cpu.x86: use available type info to generate more efficient %box-displaced-alien where possible
parent
5979fe7f41
commit
1b4b66e341
|
@ -5,7 +5,8 @@ cpu.x86.assembler cpu.x86.assembler.private cpu.x86.assembler.operands
|
||||||
cpu.x86.features cpu.x86.features.private cpu.architecture kernel
|
cpu.x86.features cpu.x86.features.private cpu.architecture kernel
|
||||||
kernel.private math memory namespaces make sequences words system
|
kernel.private math memory namespaces make sequences words system
|
||||||
layouts combinators math.order math.vectors fry locals compiler.constants
|
layouts combinators math.order math.vectors fry locals compiler.constants
|
||||||
byte-arrays io macros quotations compiler compiler.units init vm
|
byte-arrays io macros quotations classes.algebra compiler
|
||||||
|
compiler.units init vm
|
||||||
compiler.cfg.registers
|
compiler.cfg.registers
|
||||||
compiler.cfg.instructions
|
compiler.cfg.instructions
|
||||||
compiler.cfg.intrinsics
|
compiler.cfg.intrinsics
|
||||||
|
@ -232,12 +233,68 @@ M:: x86 %box-alien ( dst src temp -- )
|
||||||
"end" resolve-label
|
"end" resolve-label
|
||||||
] with-scope ;
|
] with-scope ;
|
||||||
|
|
||||||
|
:: %box-displaced-alien/f ( dst displacement -- )
|
||||||
|
dst 1 alien@ \ f type-number MOV
|
||||||
|
dst 3 alien@ displacement MOV
|
||||||
|
dst 4 alien@ displacement MOV ;
|
||||||
|
|
||||||
|
:: %box-displaced-alien/alien ( dst displacement base temp -- )
|
||||||
|
! Set new alien's base to base.base
|
||||||
|
temp base 1 alien@ MOV
|
||||||
|
dst 1 alien@ temp MOV
|
||||||
|
|
||||||
|
! Compute displacement
|
||||||
|
temp base 3 alien@ MOV
|
||||||
|
temp displacement ADD
|
||||||
|
dst 3 alien@ temp MOV
|
||||||
|
|
||||||
|
! Compute address
|
||||||
|
temp base 4 alien@ MOV
|
||||||
|
temp displacement ADD
|
||||||
|
dst 4 alien@ temp MOV ;
|
||||||
|
|
||||||
|
:: %box-displaced-alien/byte-array ( dst displacement base temp -- )
|
||||||
|
dst 1 alien@ base MOV
|
||||||
|
dst 3 alien@ displacement MOV
|
||||||
|
temp base displacement byte-array-offset [++] LEA
|
||||||
|
dst 4 alien@ temp MOV ;
|
||||||
|
|
||||||
|
:: %box-displaced-alien/dynamic ( dst displacement base temp -- )
|
||||||
|
"not-f" define-label
|
||||||
|
"not-alien" define-label
|
||||||
|
|
||||||
|
! Check base type
|
||||||
|
temp base MOV
|
||||||
|
temp tag-mask get AND
|
||||||
|
|
||||||
|
! Is base f?
|
||||||
|
temp \ f type-number CMP
|
||||||
|
"not-f" get JNE
|
||||||
|
|
||||||
|
! Yes, it is f. Fill in new object
|
||||||
|
dst displacement %box-displaced-alien/f
|
||||||
|
|
||||||
|
"end" get JMP
|
||||||
|
|
||||||
|
"not-f" resolve-label
|
||||||
|
|
||||||
|
! Is base an alien?
|
||||||
|
temp alien type-number CMP
|
||||||
|
"not-alien" get JNE
|
||||||
|
|
||||||
|
dst displacement base temp %box-displaced-alien/alien
|
||||||
|
|
||||||
|
! We are done
|
||||||
|
"end" get JMP
|
||||||
|
|
||||||
|
! Is base a byte array? It has to be, by now...
|
||||||
|
"not-alien" resolve-label
|
||||||
|
|
||||||
|
dst displacement base temp %box-displaced-alien/byte-array ;
|
||||||
|
|
||||||
M:: x86 %box-displaced-alien ( dst displacement base temp base-class -- )
|
M:: x86 %box-displaced-alien ( dst displacement base temp base-class -- )
|
||||||
! This is ridiculous
|
|
||||||
[
|
[
|
||||||
"end" define-label
|
"end" define-label
|
||||||
"not-f" define-label
|
|
||||||
"not-alien" define-label
|
|
||||||
|
|
||||||
! If displacement is zero, return the base
|
! If displacement is zero, return the base
|
||||||
dst base MOV
|
dst base MOV
|
||||||
|
@ -251,51 +308,13 @@ M:: x86 %box-displaced-alien ( dst displacement base temp base-class -- )
|
||||||
! Set expired to f
|
! Set expired to f
|
||||||
dst 2 alien@ \ f type-number MOV
|
dst 2 alien@ \ f type-number MOV
|
||||||
|
|
||||||
! Is base f?
|
dst displacement base temp
|
||||||
base \ f type-number CMP
|
{
|
||||||
"not-f" get JNE
|
{ [ base-class \ f class<= ] [ 2drop %box-displaced-alien/f ] }
|
||||||
|
{ [ base-class \ alien class<= ] [ %box-displaced-alien/alien ] }
|
||||||
! Yes, it is f. Fill in new object
|
{ [ base-class \ byte-array class<= ] [ %box-displaced-alien/byte-array ] }
|
||||||
dst 1 alien@ base MOV
|
[ %box-displaced-alien/dynamic ]
|
||||||
dst 3 alien@ displacement MOV
|
} cond
|
||||||
dst 4 alien@ displacement MOV
|
|
||||||
|
|
||||||
"end" get JMP
|
|
||||||
|
|
||||||
"not-f" resolve-label
|
|
||||||
|
|
||||||
! Check base type
|
|
||||||
temp base MOV
|
|
||||||
temp tag-mask get AND
|
|
||||||
|
|
||||||
! Is base an alien?
|
|
||||||
temp alien type-number CMP
|
|
||||||
"not-alien" get JNE
|
|
||||||
|
|
||||||
! Yes, it is an alien. Set new alien's base to base.base
|
|
||||||
temp base 1 alien@ MOV
|
|
||||||
dst 1 alien@ temp MOV
|
|
||||||
|
|
||||||
! Compute displacement
|
|
||||||
temp base 3 alien@ MOV
|
|
||||||
temp displacement ADD
|
|
||||||
dst 3 alien@ temp MOV
|
|
||||||
|
|
||||||
! Compute address
|
|
||||||
temp base 4 alien@ MOV
|
|
||||||
temp displacement ADD
|
|
||||||
dst 4 alien@ temp MOV
|
|
||||||
|
|
||||||
! We are done
|
|
||||||
"end" get JMP
|
|
||||||
|
|
||||||
! Is base a byte array? It has to be, by now...
|
|
||||||
"not-alien" resolve-label
|
|
||||||
|
|
||||||
dst 1 alien@ base MOV
|
|
||||||
dst 3 alien@ displacement MOV
|
|
||||||
temp base displacement byte-array-offset [++] LEA
|
|
||||||
dst 4 alien@ temp MOV
|
|
||||||
|
|
||||||
"end" resolve-label
|
"end" resolve-label
|
||||||
] with-scope ;
|
] with-scope ;
|
||||||
|
|
|
@ -35,8 +35,8 @@ VM_C_API char *pinned_alien_offset(cell obj, factor_vm *parent)
|
||||||
/* make an alien */
|
/* make an alien */
|
||||||
cell factor_vm::allot_alien(cell delegate_, cell displacement)
|
cell factor_vm::allot_alien(cell delegate_, cell displacement)
|
||||||
{
|
{
|
||||||
if(delegate_ == false_object && displacement == 0)
|
if(displacement == 0)
|
||||||
return false_object;
|
return delegate_;
|
||||||
|
|
||||||
data_root<object> delegate(delegate_,this);
|
data_root<object> delegate(delegate_,this);
|
||||||
data_root<alien> new_alien(allot<alien>(sizeof(alien)),this);
|
data_root<alien> new_alien(allot<alien>(sizeof(alien)),this);
|
||||||
|
|
Loading…
Reference in New Issue