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