VirtualBox

Changeset 46957 in vbox for trunk/src/VBox/VMM/VMMAll


Ignore:
Timestamp:
Jul 4, 2013 2:05:41 AM (12 years ago)
Author:
vboxsync
Message:

check for DIV overflow, fixing DIV/0 checks. IDIV overflow/underflow is still on the todo.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImpl.asm

    r42720 r46957  
    13221322; @param        2       The modified flags.
    13231323; @param        3       The undefined flags.
     1324; @param        4       1 if signed, 0 if unsigned.
    13241325;
    13251326; Makes ASSUMPTIONS about A0, A1, A2, A3, T0 and T1 assignments.
    13261327;
    1327 %macro IEMIMPL_DIV_OP 3
     1328%macro IEMIMPL_DIV_OP 4
    13281329BEGINCODE
    13291330BEGINPROC_FASTCALL iemAImpl_ %+ %1 %+ _u8, 12
     
    13321333        test    A1_8, A1_8
    13331334        jz      .div_zero
    1334         ;; @todo test for overflow
     1335 %if %4 == 0
     1336        mov     ax, [A0]
     1337        cmp     ah, A1_8
     1338        jae     .div_overflow
     1339 %else
     1340        js      .divisor_negative
     1341.divisor_positive:
     1342        mov     ax, [A0]
     1343        test    ax, ax
     1344        js      .divisor_positive_dividend_negative
     1345
     1346.both_positive:
     1347        shl     ax, 1
     1348        cmp     ah, A1_8
     1349        jae     .div_overflow
     1350        jmp     .div_no_overflow
     1351.both_negative:
     1352        neg     ax
     1353        shl     ax, 1
     1354        mov     al, A1_8
     1355        neg     al
     1356        cmp     ah, al
     1357        jae     .div_overflow
     1358        jmp     .div_no_overflow
     1359
     1360.divisor_positive_dividend_negative:
     1361        jmp     .div_no_overflow
     1362.divisor_negative:
     1363        test    ax, ax
     1364        js      .both_negative
     1365.divisor_negative_dividend_positive:
     1366        jmp     .div_no_overflow
     1367.div_no_overflow:
     1368 %endif
    13351369
    13361370        IEM_MAYBE_LOAD_FLAGS A2, %2, %3
     
    13451379
    13461380.div_zero:
     1381.div_overflow:
    13471382        mov     eax, -1
    13481383        jmp     .return
     
    13521387        PROLOGUE_4_ARGS
    13531388
    1354         test    A1_16, A1_16
     1389        test    A2_16, A2_16
    13551390        jz      .div_zero
    1356         ;; @todo test for overflow
     1391 %if %4 == 0
     1392        cmp     [A1], A2_16
     1393        jae     .div_overflow
     1394 %else
     1395 ;; @todo idiv  overflow checking.
     1396 %endif
    13571397
    13581398        IEM_MAYBE_LOAD_FLAGS A3, %2, %3
     
    13791419
    13801420.div_zero:
     1421.div_overflow:
    13811422        mov     eax, -1
    13821423        jmp     .return
     
    13861427        PROLOGUE_4_ARGS
    13871428
    1388         test    A1_32, A1_32
     1429        test    A2_32, A2_32
    13891430        jz      .div_zero
    1390         ;; @todo test for overflow
     1431 %if %4 == 0
     1432        cmp     [A1], A2_32
     1433        jae     .div_overflow
     1434 %else
     1435  ;; @todo idiv  overflow checking.
     1436 %endif
    13911437
    13921438        IEM_MAYBE_LOAD_FLAGS A3, %2, %3
     
    14141460
    14151461.div_zero:
     1462.div_overflow:
    14161463        mov     eax, -1
    14171464        jmp     .return
     
    14221469        PROLOGUE_4_ARGS
    14231470
    1424         test    A1, A1
     1471        test    A2, A2
    14251472        jz      .div_zero
    1426         ;; @todo test for overflow
     1473 %if %4 == 0
     1474        cmp     [A1], A2
     1475        jae     .div_overflow
     1476 %else
     1477  ;; @todo idiv  overflow checking.
     1478 %endif
    14271479
    14281480        IEM_MAYBE_LOAD_FLAGS A3, %2, %3
     
    14501502
    14511503.div_zero:
     1504.div_overflow:
    14521505        mov     eax, -1
    14531506        jmp     .return
     
    14621515%endmacro
    14631516
    1464 IEMIMPL_DIV_OP div,  0, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF)
    1465 IEMIMPL_DIV_OP idiv, 0, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF)
     1517IEMIMPL_DIV_OP div,  0, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 0
     1518IEMIMPL_DIV_OP idiv, 0, (X86_EFL_OF | X86_EFL_SF | X86_EFL_ZF | X86_EFL_AF | X86_EFL_PF | X86_EFL_CF), 1
    14661519
    14671520
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette