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