1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project%default {"srcdouble":"1","tgtlong":"1"} 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* On fp to int conversions, Java requires that 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if the result > maxint, it should be clamped to maxint. If it is less 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * than minint, it should be clamped to minint. If it is a nan, the result 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * should be zero. Further, the rounding mode is to truncate. This model 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * differs from what is delivered normally via the x86 fpu, so we have 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to play some games. 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* float/double to int/long vA, vB */ 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movzbl rINST_HI,%ecx # ecx<- A+ 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sarl $$12,rINST_FULL # rINST_FULL<- B 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if $srcdouble 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fldl (rFP,rINST_FULL,4) # %st0<- vB 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .else 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project flds (rFP,rINST_FULL,4) # %st0<- vB 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ftst 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fnstcw LOCAL0_OFFSET(%ebp) # remember original rounding mode 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movzwl LOCAL0_OFFSET(%ebp),%eax 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movb $$0xc,%ah 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movw %ax,LOCAL0_OFFSET+2(%ebp) 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fldcw LOCAL0_OFFSET+2(%ebp) # set "to zero" rounding mode 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_INST_WORD(1) 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project andb $$0xf,%cl # ecx<- A 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if $tgtlong 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fistpll (rFP,%ecx,4) # convert and store 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .else 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fistpl (rFP,%ecx,4) # convert and store 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fldcw LOCAL0_OFFSET(%ebp) # restore previous rounding mode 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jmp .L${opcode}_continue 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project%break 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L${opcode}_continue: 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if $tgtlong 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl $$0x80000000,%eax 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project xorl 4(rFP,%ecx,4),%eax 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orl (rFP,%ecx,4),%eax 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .else 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmpl $$0x80000000,(rFP,%ecx,4) 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project je .L${opcode}_special_case # fix up result 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L${opcode}_finish: 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ADVANCE_PC(1) 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_NEXT 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L${opcode}_special_case: 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fnstsw %ax 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sahf 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jp .L${opcode}_isNaN 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project adcl $$-1,(rFP,%ecx,4) 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if $tgtlong 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project adcl $$-1,4(rFP,%ecx,4) 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jmp .L${opcode}_finish 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L${opcode}_isNaN: 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl $$0,(rFP,%ecx,4) 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if $tgtlong 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl $$0,4(rFP,%ecx,4) 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jmp .L${opcode}_finish 64