cpu.x86: update %box-displaced-alien for introduction of address field
							parent
							
								
									91ccc30a54
								
							
						
					
					
						commit
						51e9a891a8
					
				| 
						 | 
					@ -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
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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 ;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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 ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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 -- )
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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 ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue