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 */ 10f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee movzbl rINSTbl,%ecx # ecx<- A+ 11f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee sarl $$4,rINST # rINST<- B 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if $srcdouble 13f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee fldl (rFP,rINST,4) # %st0<- vB 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .else 15f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee flds (rFP,rINST,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) 22f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee fldcw LOCAL0_OFFSET+2(%ebp) # set "to zero" rounding mode 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project andb $$0xf,%cl # ecx<- A 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if $tgtlong 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fistpll (rFP,%ecx,4) # convert and store 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .else 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fistpl (rFP,%ecx,4) # convert and store 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fldcw LOCAL0_OFFSET(%ebp) # restore previous rounding mode 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if $tgtlong 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl $$0x80000000,%eax 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project xorl 4(rFP,%ecx,4),%eax 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project orl (rFP,%ecx,4),%eax 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .else 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmpl $$0x80000000,(rFP,%ecx,4) 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project je .L${opcode}_special_case # fix up result 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L${opcode}_finish: 40a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee FETCH_INST_OPCODE 1 %ecx 41f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee ADVANCE_PC 1 42a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee GOTO_NEXT_R %ecx 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L${opcode}_special_case: 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project fnstsw %ax 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project sahf 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jp .L${opcode}_isNaN 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project adcl $$-1,(rFP,%ecx,4) 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if $tgtlong 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project adcl $$-1,4(rFP,%ecx,4) 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jmp .L${opcode}_finish 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L${opcode}_isNaN: 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl $$0,(rFP,%ecx,4) 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .if $tgtlong 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project movl $$0,4(rFP,%ecx,4) 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .endif 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project jmp .L${opcode}_finish 59