1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project%verify "executed"
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Signed 64-bit integer multiply, 2-addr version
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * We could definately use more free registers for
6a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee     * this code.  We must spill %edx (rIBASE) because it
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * is used by imul.  We'll also spill rINST (ebx),
8a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee     * giving us eax, ebc, ecx and rIBASE as computational
9f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee     * temps.  On top of that, we'll spill %esi (edi)
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * for use as the vA pointer and rFP (esi) for use
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * as the vB pointer.  Yuck.
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* mul-long/2addr vA, vB */
14f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    movzbl    rINSTbl,%eax             # eax<- BA
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    andb      $$0xf,%al                # eax<- A
16f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    sarl      $$4,rINST                # rINST<- B
17f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    SPILL_TMP2(%esi)
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    SPILL(rFP)
19a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    SPILL(rIBASE)
20f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    leal      (rFP,%eax,4),%esi        # %esi<- &v[A]
21f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    leal      (rFP,rINST,4),rFP        # rFP<- &v[B]
22f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    movl      4(%esi),%ecx             # ecx<- Amsw
23f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    imull     (rFP),%ecx               # ecx<- (Amsw*Blsw)
24f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    movl      4(rFP),%eax              # eax<- Bmsw
25f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    imull     (%esi),%eax              # eax<- (Bmsw*Alsw)
26f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    addl      %eax,%ecx                # ecx<- (Amsw*Blsw)+(Bmsw*Alsw)
27f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    movl      (rFP),%eax               # eax<- Blsw
28f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    mull      (%esi)                   # eax<- (Blsw*Alsw)
29a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    leal      (%ecx,rIBASE),rIBASE     # full result now in %edx:%eax
30a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    movl      rIBASE,4(%esi)           # v[A+1]<- rIBASE
31f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    movl      %eax,(%esi)              # v[A]<- %eax
32f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    UNSPILL_TMP2(%esi)
33f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    FETCH_INST_OPCODE 1 %ecx
34a7d59bbafea5430fe81fc21ba94ddf6f6a63b0b3buzbee    UNSPILL(rIBASE)
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    UNSPILL(rFP)
36f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    ADVANCE_PC 1
37f3e177289ac078f18401cfd8eebafe584dd0d01fbuzbee    GOTO_NEXT_R %ecx
38