cpu.x86: remove use of with-scope in favor of locals.
							parent
							
								
									aeaed40d9c
								
							
						
					
					
						commit
						255b60ef8d
					
				| 
						 | 
				
			
			@ -193,40 +193,36 @@ M: x86 %unbox-alien ( dst src -- )
 | 
			
		|||
    alien-offset [+] MOV ;
 | 
			
		||||
 | 
			
		||||
M:: x86 %unbox-any-c-ptr ( dst src -- )
 | 
			
		||||
    [
 | 
			
		||||
        "end" define-label
 | 
			
		||||
        dst dst XOR
 | 
			
		||||
        ! Is the object f?
 | 
			
		||||
        src \ f type-number CMP
 | 
			
		||||
        "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
 | 
			
		||||
        dst src byte-array-offset [+] LEA
 | 
			
		||||
        "end" get JNE
 | 
			
		||||
        ! If so, load the offset and add it to the address
 | 
			
		||||
        dst src alien-offset [+] MOV
 | 
			
		||||
        "end" resolve-label
 | 
			
		||||
    ] with-scope ;
 | 
			
		||||
    <label> :> end
 | 
			
		||||
    dst dst XOR
 | 
			
		||||
    ! Is the object f?
 | 
			
		||||
    src \ f type-number CMP
 | 
			
		||||
    end 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
 | 
			
		||||
    dst src byte-array-offset [+] LEA
 | 
			
		||||
    end JNE
 | 
			
		||||
    ! If so, load the offset and add it to the address
 | 
			
		||||
    dst src alien-offset [+] MOV
 | 
			
		||||
    end resolve-label ;
 | 
			
		||||
 | 
			
		||||
: alien@ ( reg n -- op ) cells alien type-number - [+] ;
 | 
			
		||||
 | 
			
		||||
M:: x86 %box-alien ( dst src temp -- )
 | 
			
		||||
    [
 | 
			
		||||
        "end" define-label
 | 
			
		||||
        dst \ f type-number MOV
 | 
			
		||||
        src src TEST
 | 
			
		||||
        "end" get JE
 | 
			
		||||
        dst 5 cells alien temp %allot
 | 
			
		||||
        dst 1 alien@ \ f type-number MOV ! base
 | 
			
		||||
        dst 2 alien@ \ f type-number MOV ! expired
 | 
			
		||||
        dst 3 alien@ src MOV ! displacement
 | 
			
		||||
        dst 4 alien@ src MOV ! address
 | 
			
		||||
        "end" resolve-label
 | 
			
		||||
    ] with-scope ;
 | 
			
		||||
    <label> :> end
 | 
			
		||||
    dst \ f type-number MOV
 | 
			
		||||
    src src TEST
 | 
			
		||||
    end JE
 | 
			
		||||
    dst 5 cells alien temp %allot
 | 
			
		||||
    dst 1 alien@ \ f type-number MOV ! base
 | 
			
		||||
    dst 2 alien@ \ f type-number MOV ! expired
 | 
			
		||||
    dst 3 alien@ src MOV ! displacement
 | 
			
		||||
    dst 4 alien@ src MOV ! address
 | 
			
		||||
    end resolve-label ;
 | 
			
		||||
 | 
			
		||||
:: %box-displaced-alien/f ( dst displacement -- )
 | 
			
		||||
    dst 1 alien@ \ f type-number MOV
 | 
			
		||||
| 
						 | 
				
			
			@ -254,9 +250,9 @@ M:: x86 %box-alien ( dst src temp -- )
 | 
			
		|||
    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
 | 
			
		||||
:: %box-displaced-alien/dynamic ( dst displacement base temp end -- )
 | 
			
		||||
    <label> :> not-f
 | 
			
		||||
    <label> :> not-alien
 | 
			
		||||
 | 
			
		||||
    ! Check base type
 | 
			
		||||
    temp base MOV
 | 
			
		||||
| 
						 | 
				
			
			@ -264,55 +260,53 @@ M:: x86 %box-alien ( dst src temp -- )
 | 
			
		|||
 | 
			
		||||
    ! Is base f?
 | 
			
		||||
    temp \ f type-number CMP
 | 
			
		||||
    "not-f" get JNE
 | 
			
		||||
    not-f JNE
 | 
			
		||||
 | 
			
		||||
    ! Yes, it is f. Fill in new object
 | 
			
		||||
    dst displacement %box-displaced-alien/f
 | 
			
		||||
 | 
			
		||||
    "end" get JMP
 | 
			
		||||
    end JMP
 | 
			
		||||
 | 
			
		||||
    "not-f" resolve-label
 | 
			
		||||
    not-f resolve-label
 | 
			
		||||
 | 
			
		||||
    ! Is base an alien?
 | 
			
		||||
    temp alien type-number CMP
 | 
			
		||||
    "not-alien" get JNE
 | 
			
		||||
    not-alien JNE
 | 
			
		||||
 | 
			
		||||
    dst displacement base temp %box-displaced-alien/alien
 | 
			
		||||
 | 
			
		||||
    ! We are done
 | 
			
		||||
    "end" get JMP
 | 
			
		||||
    end JMP
 | 
			
		||||
 | 
			
		||||
    ! Is base a byte array? It has to be, by now...
 | 
			
		||||
    "not-alien" resolve-label
 | 
			
		||||
    not-alien resolve-label
 | 
			
		||||
 | 
			
		||||
    dst displacement base temp %box-displaced-alien/byte-array ;
 | 
			
		||||
 | 
			
		||||
M:: x86 %box-displaced-alien ( dst displacement base temp base-class -- )
 | 
			
		||||
    [
 | 
			
		||||
        "end" define-label
 | 
			
		||||
    <label> :> end
 | 
			
		||||
 | 
			
		||||
        ! If displacement is zero, return the base
 | 
			
		||||
        dst base MOV
 | 
			
		||||
        displacement displacement TEST
 | 
			
		||||
        "end" get JE
 | 
			
		||||
    ! If displacement is zero, return the base
 | 
			
		||||
    dst base MOV
 | 
			
		||||
    displacement displacement TEST
 | 
			
		||||
    end JE
 | 
			
		||||
 | 
			
		||||
        ! Displacement is non-zero, we're going to be allocating a new
 | 
			
		||||
        ! object
 | 
			
		||||
        dst 5 cells alien temp %allot
 | 
			
		||||
    ! Displacement is non-zero, we're going to be allocating a new
 | 
			
		||||
    ! object
 | 
			
		||||
    dst 5 cells alien temp %allot
 | 
			
		||||
 | 
			
		||||
        ! Set expired to f
 | 
			
		||||
        dst 2 alien@ \ f type-number MOV
 | 
			
		||||
    ! Set expired to f
 | 
			
		||||
    dst 2 alien@ \ f type-number MOV
 | 
			
		||||
 | 
			
		||||
        dst displacement base temp
 | 
			
		||||
        {
 | 
			
		||||
            { [ base-class \ f class<= ] [ 2drop %box-displaced-alien/f ] }
 | 
			
		||||
            { [ base-class \ alien class<= ] [ %box-displaced-alien/alien ] }
 | 
			
		||||
            { [ base-class \ byte-array class<= ] [ %box-displaced-alien/byte-array ] }
 | 
			
		||||
            [ %box-displaced-alien/dynamic ]
 | 
			
		||||
        } cond
 | 
			
		||||
    dst displacement base temp
 | 
			
		||||
    {
 | 
			
		||||
        { [ base-class \ f class<= ] [ 2drop %box-displaced-alien/f ] }
 | 
			
		||||
        { [ base-class \ alien class<= ] [ %box-displaced-alien/alien ] }
 | 
			
		||||
        { [ base-class \ byte-array class<= ] [ %box-displaced-alien/byte-array ] }
 | 
			
		||||
        [ end %box-displaced-alien/dynamic ]
 | 
			
		||||
    } cond
 | 
			
		||||
 | 
			
		||||
        "end" resolve-label
 | 
			
		||||
    ] with-scope ;
 | 
			
		||||
    end resolve-label ;
 | 
			
		||||
 | 
			
		||||
! The 'small-reg' mess is pretty crappy, but its only used on x86-32.
 | 
			
		||||
! On x86-64, all registers have 8-bit versions. However, a similar
 | 
			
		||||
| 
						 | 
				
			
			@ -707,26 +701,20 @@ M: x86 immediate-arithmetic? ( n -- ? )
 | 
			
		|||
M: x86 immediate-bitwise? ( n -- ? )
 | 
			
		||||
    -0x80000000 0x7fffffff between? ;
 | 
			
		||||
 | 
			
		||||
: %cmov-float= ( dst src -- )
 | 
			
		||||
    [
 | 
			
		||||
        "no-move" define-label
 | 
			
		||||
:: %cmov-float= ( dst src -- )
 | 
			
		||||
    <label> :> no-move
 | 
			
		||||
    no-move [ JNE ] [ JP ] bi
 | 
			
		||||
    dst src MOV
 | 
			
		||||
    no-move resolve-label ;
 | 
			
		||||
 | 
			
		||||
        "no-move" get [ JNE ] [ JP ] bi
 | 
			
		||||
        MOV
 | 
			
		||||
        "no-move" resolve-label
 | 
			
		||||
    ] with-scope ;
 | 
			
		||||
 | 
			
		||||
: %cmov-float/= ( dst src -- )
 | 
			
		||||
    [
 | 
			
		||||
        "no-move" define-label
 | 
			
		||||
        "move" define-label
 | 
			
		||||
 | 
			
		||||
        "move" get JP
 | 
			
		||||
        "no-move" get JE
 | 
			
		||||
        "move" resolve-label
 | 
			
		||||
        MOV
 | 
			
		||||
        "no-move" resolve-label
 | 
			
		||||
    ] with-scope ;
 | 
			
		||||
:: %cmov-float/= ( dst src -- )
 | 
			
		||||
    <label> :> no-move
 | 
			
		||||
    <label> :> move
 | 
			
		||||
    move JP
 | 
			
		||||
    no-move JE
 | 
			
		||||
    move resolve-label
 | 
			
		||||
    dst src MOV
 | 
			
		||||
    no-move resolve-label ;
 | 
			
		||||
 | 
			
		||||
:: (%compare-float) ( dst src1 src2 cc temp compare -- )
 | 
			
		||||
    cc {
 | 
			
		||||
| 
						 | 
				
			
			@ -746,13 +734,11 @@ M: x86 immediate-bitwise? ( n -- ? )
 | 
			
		|||
        { cc/<>= [ src1 src2 compare call( a b -- ) dst temp \ CMOVP (%boolean) ] }
 | 
			
		||||
    } case ; inline
 | 
			
		||||
 | 
			
		||||
: %jump-float= ( label -- )
 | 
			
		||||
    [
 | 
			
		||||
        "no-jump" define-label
 | 
			
		||||
        "no-jump" get JP
 | 
			
		||||
        JE
 | 
			
		||||
        "no-jump" resolve-label
 | 
			
		||||
    ] with-scope ;
 | 
			
		||||
:: %jump-float= ( label -- )
 | 
			
		||||
    <label> :> no-jump
 | 
			
		||||
    no-jump JP
 | 
			
		||||
    label JE
 | 
			
		||||
    no-jump resolve-label ;
 | 
			
		||||
 | 
			
		||||
: %jump-float/= ( label -- )
 | 
			
		||||
    [ JNE ] [ JP ] bi ;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue