%default {"fp_suffix":"","i_suffix":"","max_const":"","result_reg":"","wide":""}
/* On fp to int conversions, Java requires that
 * if the result > maxint, it should be clamped to maxint.  If it is less
 * than minint, it should be clamped to minint.  If it is a nan, the result
 * should be zero.  Further, the rounding mode is to truncate.
 */
    /* float/double to int/long vA, vB */
    movl    rINST, %ecx                     # rcx <- A+
    sarl    $$4, rINST                      # rINST <- B
    andb    $$0xf, %cl                      # ecx <- A
    movs${fp_suffix}   VREG_ADDRESS(rINSTq), %xmm0
    mov${i_suffix}  ${max_const}, ${result_reg}
    cvtsi2s${fp_suffix}${i_suffix} ${result_reg}, %xmm1
    comis${fp_suffix}    %xmm1, %xmm0
    jae     1f
    jp      2f
    cvtts${fp_suffix}2si${i_suffix}  %xmm0, ${result_reg}
    jmp     1f
2:
    xor${i_suffix}    ${result_reg}, ${result_reg}
1:
    .if $wide
    SET_WIDE_VREG ${result_reg}, %rcx
    .else
    SET_VREG ${result_reg}, %rcx
    .endif
    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1