cpu.x86: update %box-displaced-alien for introduction of address field

db4
Slava Pestov 2009-11-03 02:42:27 -06:00
parent 91ccc30a54
commit 51e9a891a8
5 changed files with 80 additions and 40 deletions

View File

@ -512,13 +512,12 @@ temp: temp/int-rep ;
PURE-INSN: ##box-displaced-alien PURE-INSN: ##box-displaced-alien
def: dst/int-rep def: dst/int-rep
use: displacement/int-rep base/int-rep use: displacement/int-rep base/int-rep
temp: temp1/int-rep temp2/int-rep temp: temp/int-rep
literal: base-class ; literal: base-class ;
PURE-INSN: ##unbox-any-c-ptr PURE-INSN: ##unbox-any-c-ptr
def: dst/int-rep def: dst/int-rep
use: src/int-rep use: src/int-rep ;
temp: temp/int-rep ;
: ##unbox-f ( dst src -- ) drop 0 ##load-immediate ; : ##unbox-f ( dst src -- ) drop 0 ##load-immediate ;
: ##unbox-byte-array ( dst src -- ) byte-array-offset ##add-imm ; : ##unbox-byte-array ( dst src -- ) byte-array-offset ##add-imm ;
@ -527,12 +526,12 @@ PURE-INSN: ##unbox-alien
def: dst/int-rep def: dst/int-rep
use: src/int-rep ; use: src/int-rep ;
: ##unbox-c-ptr ( dst src class temp -- ) : ##unbox-c-ptr ( dst src class -- )
{ {
{ [ over \ f class<= ] [ 2drop ##unbox-f ] } { [ dup \ f class<= ] [ drop ##unbox-f ] }
{ [ over alien class<= ] [ 2drop ##unbox-alien ] } { [ dup alien class<= ] [ drop ##unbox-alien ] }
{ [ over byte-array class<= ] [ 2drop ##unbox-byte-array ] } { [ dup byte-array class<= ] [ drop ##unbox-byte-array ] }
[ nip ##unbox-any-c-ptr ] [ drop ##unbox-any-c-ptr ]
} cond ; } cond ;
! Alien accessors ! Alien accessors

View File

@ -33,7 +33,7 @@ IN: compiler.cfg.intrinsics.alien
bi and ; bi and ;
: ^^unbox-c-ptr ( src class -- dst ) : ^^unbox-c-ptr ( src class -- dst )
[ next-vreg dup ] 2dip next-vreg ##unbox-c-ptr ; [ next-vreg dup ] 2dip ##unbox-c-ptr ;
: prepare-alien-accessor ( info -- ptr-vreg offset ) : prepare-alien-accessor ( info -- ptr-vreg offset )
class>> [ 2inputs ^^untag-fixnum swap ] dip ^^unbox-c-ptr ^^add 0 ; class>> [ 2inputs ^^untag-fixnum swap ] dip ^^unbox-c-ptr ^^add 0 ;

View File

@ -440,7 +440,7 @@ M: ##sar rewrite \ ##sar-imm rewrite-arithmetic ;
:: rewrite-unbox-displaced-alien ( insn expr -- insns ) :: rewrite-unbox-displaced-alien ( insn expr -- insns )
[ [
next-vreg :> temp next-vreg :> temp
temp expr base>> vn>vreg expr base-class>> insn temp>> ##unbox-c-ptr temp expr base>> vn>vreg expr base-class>> ##unbox-c-ptr
insn dst>> temp expr displacement>> vn>vreg ##add insn dst>> temp expr displacement>> vn>vreg ##add
] { } make ; ] { } make ;

View File

@ -386,9 +386,9 @@ M: object %horizontal-shl-vector-imm-reps { } ;
M: object %horizontal-shr-vector-imm-reps { } ; M: object %horizontal-shr-vector-imm-reps { } ;
HOOK: %unbox-alien cpu ( dst src -- ) HOOK: %unbox-alien cpu ( dst src -- )
HOOK: %unbox-any-c-ptr cpu ( dst src temp -- ) HOOK: %unbox-any-c-ptr cpu ( dst src -- )
HOOK: %box-alien cpu ( dst src temp -- ) HOOK: %box-alien cpu ( dst src temp -- )
HOOK: %box-displaced-alien cpu ( dst displacement base temp1 temp2 base-class -- ) HOOK: %box-displaced-alien cpu ( dst displacement base temp base-class -- )
HOOK: %alien-unsigned-1 cpu ( dst src offset -- ) HOOK: %alien-unsigned-1 cpu ( dst src offset -- )
HOOK: %alien-unsigned-2 cpu ( dst src offset -- ) HOOK: %alien-unsigned-2 cpu ( dst src offset -- )

View File

@ -177,20 +177,20 @@ M: x86 %fixnum-mul ( label dst src1 src2 -- )
M: x86 %unbox-alien ( dst src -- ) M: x86 %unbox-alien ( dst src -- )
alien-offset [+] MOV ; alien-offset [+] MOV ;
M:: x86 %unbox-any-c-ptr ( dst src temp -- ) M:: x86 %unbox-any-c-ptr ( dst src -- )
[ [
"end" define-label "end" define-label
! Compute tag in temp register dst dst XOR
temp src MOV
temp tag-mask get AND
dst 0 MOV
! Is the object f? ! Is the object f?
src \ f type-number CMP src \ f type-number CMP
"end" get JE "end" get JE
! Compute tag in dst register
dst src MOV
dst tag-mask get AND
! Is the object an alien?
dst alien type-number CMP
! Add an offset to start of byte array's data ! Add an offset to start of byte array's data
dst src byte-array-offset [+] LEA dst src byte-array-offset [+] LEA
! Is the object an alien?
temp alien type-number CMP
"end" get JNE "end" get JNE
! If so, load the offset and add it to the address ! If so, load the offset and add it to the address
dst src alien-offset [+] MOV dst src alien-offset [+] MOV
@ -203,7 +203,7 @@ M:: x86 %box-alien ( dst src temp -- )
[ [
"end" define-label "end" define-label
dst \ f type-number MOV dst \ f type-number MOV
src 0 CMP src src TEST
"end" get JE "end" get JE
dst 5 cells alien temp %allot dst 5 cells alien temp %allot
dst 1 alien@ \ f type-number MOV ! base dst 1 alien@ \ f type-number MOV ! base
@ -213,32 +213,73 @@ M:: x86 %box-alien ( dst src temp -- )
"end" resolve-label "end" resolve-label
] with-scope ; ] with-scope ;
M:: x86 %box-displaced-alien ( dst displacement base displacement' base' base-class -- ) M:: x86 %box-displaced-alien ( dst displacement base temp base-class -- )
! This is ridiculous
[ [
"end" define-label "end" define-label
"ok" 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
displacement 0 CMP displacement displacement TEST
"end" get JE "end" get JE
! Quickly use displacement' before its needed for real, as allot temporary
dst 4 cells alien displacement' %allot ! Displacement is non-zero, we're going to be allocating a new
! If base is already a displaced alien, unpack it ! object
base' base MOV dst 5 cells alien temp %allot
displacement' displacement MOV
! Set expired to f
dst 2 alien@ \ f type-number MOV
! Is base f?
base \ f type-number CMP base \ f type-number CMP
"ok" get JE "not-f" get JNE
! XXX
base 0 [+] alien type-number tag-fixnum CMP ! Yes, it is f. Fill in new object
"ok" get JNE dst 1 alien@ base MOV
! displacement += base.displacement dst 3 alien@ displacement MOV
displacement' base 3 alien@ ADD dst 4 alien@ displacement MOV
! base = base.base
base' base 1 alien@ MOV "end" get JMP
"ok" resolve-label
dst 1 alien@ base' MOV ! alien "not-f" resolve-label
dst 2 alien@ \ f type-number MOV ! expired
dst 3 alien@ displacement' MOV ! displacement ! 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 MOV
temp byte-array-offset ADD
temp displacement ADD
dst 4 alien@ temp MOV
"end" resolve-label "end" resolve-label
] with-scope ; ] with-scope ;