     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

M: x86 immediate-bitwise? ( n -- ? )
    -0x80000000 0x7fffffff between? ;

: %cmov-float= ( dst src -- )
    [
        "no-move" define-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 ;

:: (%compare-float) ( dst src1 src2 cc temp compare -- )
    cc {


    ! Is base f?
    temp \ f type-number CMP
    not-f JNE

    ! Yes, it is f. Fill in new object
    dst displacement %box-displaced-alien/f

    end JMP

    not-f resolve-label

    ! Is base an alien?
    temp alien type-number CMP
    not-alien JNE

    dst displacement base temp %box-displaced-alien/alien

    ! We are done
    end 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 -- )
    <label> :> end

    ! 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

    ! 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 ] }
        [ end %box-displaced-alien/dynamic ]
    } cond

    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
