         { 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 ;

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 {

    alien-offset [+] MOV ;

M:: x86 %unbox-any-c-ptr ( dst src -- )
    <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 -- )
    <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
