blob: 1472bd26bd5f13ee9cab83fd374aaa87be6edf36 [file] [log] [blame]
%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