VirtualBox

Changeset 103264 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Feb 8, 2024 5:20:09 AM (12 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
161555
Message:

VMM/IEM: Fix psra[wd] instruction emulation (high bit must shift in 1s). bugref:9898

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImplC.cpp

    r103186 r103264  
    1014110141    RTUINT64U uSrc2 = { *puSrc };
    1014210142    RTUINT64U uDst;
    10143 
    10144     if (uSrc2.au64[0] <= 15)
    10145     {
    10146         uDst.ai16[0] = uSrc1.ai16[0] >> uSrc2.au8[0];
    10147         uDst.ai16[1] = uSrc1.ai16[1] >> uSrc2.au8[0];
    10148         uDst.ai16[2] = uSrc1.ai16[2] >> uSrc2.au8[0];
    10149         uDst.ai16[3] = uSrc1.ai16[3] >> uSrc2.au8[0];
    10150     }
    10151     else
    10152     {
    10153         uDst.au64[0] = 0;
    10154     }
     10143    uint8_t uShift;
     10144
     10145    uShift = RT_MIN(15, uSrc2.au64[0]);
     10146
     10147    uDst.ai16[0] = uSrc1.ai16[0] >> uShift;
     10148    uDst.ai16[1] = uSrc1.ai16[1] >> uShift;
     10149    uDst.ai16[2] = uSrc1.ai16[2] >> uShift;
     10150    uDst.ai16[3] = uSrc1.ai16[3] >> uShift;
     10151
    1015510152    *puDst = uDst.u;
    1015610153}
     
    1016210159    RTUINT64U uDst;
    1016310160
    10164     if (uShift <= 15)
    10165     {
    10166         uDst.ai16[0] = uSrc1.ai16[0] >> uShift;
    10167         uDst.ai16[1] = uSrc1.ai16[1] >> uShift;
    10168         uDst.ai16[2] = uSrc1.ai16[2] >> uShift;
    10169         uDst.ai16[3] = uSrc1.ai16[3] >> uShift;
    10170     }
    10171     else
    10172     {
    10173         uDst.au64[0] = 0;
    10174     }
     10161    uShift = RT_MIN(15, uShift);
     10162
     10163    uDst.ai16[0] = uSrc1.ai16[0] >> uShift;
     10164    uDst.ai16[1] = uSrc1.ai16[1] >> uShift;
     10165    uDst.ai16[2] = uSrc1.ai16[2] >> uShift;
     10166    uDst.ai16[3] = uSrc1.ai16[3] >> uShift;
     10167
    1017510168    *puDst = uDst.u;
    1017610169}
     
    1018010173{
    1018110174    RTUINT128U uSrc1 = *puDst;
    10182 
    10183     if (puSrc->au64[0] <= 15)
    10184     {
    10185         puDst->ai16[0] = uSrc1.ai16[0] >> puSrc->au8[0];
    10186         puDst->ai16[1] = uSrc1.ai16[1] >> puSrc->au8[0];
    10187         puDst->ai16[2] = uSrc1.ai16[2] >> puSrc->au8[0];
    10188         puDst->ai16[3] = uSrc1.ai16[3] >> puSrc->au8[0];
    10189         puDst->ai16[4] = uSrc1.ai16[4] >> puSrc->au8[0];
    10190         puDst->ai16[5] = uSrc1.ai16[5] >> puSrc->au8[0];
    10191         puDst->ai16[6] = uSrc1.ai16[6] >> puSrc->au8[0];
    10192         puDst->ai16[7] = uSrc1.ai16[7] >> puSrc->au8[0];
    10193     }
    10194     else
    10195     {
    10196         puDst->au64[0] = 0;
    10197         puDst->au64[1] = 0;
    10198     }
     10175    uint8_t uShift;
     10176
     10177    uShift = RT_MIN(15, puSrc->au64[0]);
     10178
     10179    puDst->ai16[0] = uSrc1.ai16[0] >> uShift;
     10180    puDst->ai16[1] = uSrc1.ai16[1] >> uShift;
     10181    puDst->ai16[2] = uSrc1.ai16[2] >> uShift;
     10182    puDst->ai16[3] = uSrc1.ai16[3] >> uShift;
     10183    puDst->ai16[4] = uSrc1.ai16[4] >> uShift;
     10184    puDst->ai16[5] = uSrc1.ai16[5] >> uShift;
     10185    puDst->ai16[6] = uSrc1.ai16[6] >> uShift;
     10186    puDst->ai16[7] = uSrc1.ai16[7] >> uShift;
    1019910187}
    1020010188
     
    1020310191    RTUINT128U uSrc1 = *puDst;
    1020410192
    10205     if (uShift <= 15)
    10206     {
    10207         puDst->ai16[0] = uSrc1.ai16[0] >> uShift;
    10208         puDst->ai16[1] = uSrc1.ai16[1] >> uShift;
    10209         puDst->ai16[2] = uSrc1.ai16[2] >> uShift;
    10210         puDst->ai16[3] = uSrc1.ai16[3] >> uShift;
    10211         puDst->ai16[4] = uSrc1.ai16[4] >> uShift;
    10212         puDst->ai16[5] = uSrc1.ai16[5] >> uShift;
    10213         puDst->ai16[6] = uSrc1.ai16[6] >> uShift;
    10214         puDst->ai16[7] = uSrc1.ai16[7] >> uShift;
    10215     }
    10216     else
    10217     {
    10218         puDst->au64[0] = 0;
    10219         puDst->au64[1] = 0;
    10220     }
     10193    uShift = RT_MIN(15, uShift);
     10194
     10195    puDst->ai16[0] = uSrc1.ai16[0] >> uShift;
     10196    puDst->ai16[1] = uSrc1.ai16[1] >> uShift;
     10197    puDst->ai16[2] = uSrc1.ai16[2] >> uShift;
     10198    puDst->ai16[3] = uSrc1.ai16[3] >> uShift;
     10199    puDst->ai16[4] = uSrc1.ai16[4] >> uShift;
     10200    puDst->ai16[5] = uSrc1.ai16[5] >> uShift;
     10201    puDst->ai16[6] = uSrc1.ai16[6] >> uShift;
     10202    puDst->ai16[7] = uSrc1.ai16[7] >> uShift;
    1022110203}
    1022210204
     
    1048110463    RTUINT64U uSrc2 = { *puSrc };
    1048210464    RTUINT64U uDst;
    10483 
    10484     if (uSrc2.au64[0] <= 31)
    10485     {
    10486         uDst.ai32[0] = uSrc1.ai32[0] >> uSrc2.au8[0];
    10487         uDst.ai32[1] = uSrc1.ai32[1] >> uSrc2.au8[0];
    10488     }
    10489     else
    10490     {
    10491         uDst.au64[0] = 0;
    10492     }
     10465    uint8_t uShift;
     10466
     10467    uShift = RT_MIN(31, uSrc2.au64[0]);
     10468
     10469    uDst.ai32[0] = uSrc1.ai32[0] >> uShift;
     10470    uDst.ai32[1] = uSrc1.ai32[1] >> uShift;
     10471
    1049310472    *puDst = uDst.u;
    1049410473}
     
    1050010479    RTUINT64U uDst;
    1050110480
    10502     if (uShift <= 31)
    10503     {
    10504         uDst.ai32[0] = uSrc1.ai32[0] >> uShift;
    10505         uDst.ai32[1] = uSrc1.ai32[1] >> uShift;
    10506     }
    10507     else
    10508     {
    10509         uDst.au64[0] = 0;
    10510     }
     10481    uShift = RT_MIN(31, uShift);
     10482
     10483    uDst.ai32[0] = uSrc1.ai32[0] >> uShift;
     10484    uDst.ai32[1] = uSrc1.ai32[1] >> uShift;
     10485
    1051110486    *puDst = uDst.u;
    1051210487}
     
    1051610491{
    1051710492    RTUINT128U uSrc1 = *puDst;
    10518 
    10519     if (puSrc->au64[0] <= 31)
    10520     {
    10521         puDst->ai32[0] = uSrc1.ai32[0] >> puSrc->au8[0];
    10522         puDst->ai32[1] = uSrc1.ai32[1] >> puSrc->au8[0];
    10523         puDst->ai32[2] = uSrc1.ai32[2] >> puSrc->au8[0];
    10524         puDst->ai32[3] = uSrc1.ai32[3] >> puSrc->au8[0];
    10525     }
    10526     else
    10527     {
    10528         puDst->au64[0] = 0;
    10529         puDst->au64[1] = 0;
    10530     }
     10493    uint8_t uShift;
     10494
     10495    uShift = RT_MIN(31, puSrc->au64[0]);
     10496
     10497    puDst->ai32[0] = uSrc1.ai32[0] >> uShift;
     10498    puDst->ai32[1] = uSrc1.ai32[1] >> uShift;
     10499    puDst->ai32[2] = uSrc1.ai32[2] >> uShift;
     10500    puDst->ai32[3] = uSrc1.ai32[3] >> uShift;
    1053110501}
    1053210502
     
    1053510505    RTUINT128U uSrc1 = *puDst;
    1053610506
    10537     if (uShift <= 31)
    10538     {
    10539         puDst->ai32[0] = uSrc1.ai32[0] >> uShift;
    10540         puDst->ai32[1] = uSrc1.ai32[1] >> uShift;
    10541         puDst->ai32[2] = uSrc1.ai32[2] >> uShift;
    10542         puDst->ai32[3] = uSrc1.ai32[3] >> uShift;
    10543     }
    10544     else
    10545     {
    10546         puDst->au64[0] = 0;
    10547         puDst->au64[1] = 0;
    10548     }
     10507    uShift = RT_MIN(31, uShift);
     10508
     10509    puDst->ai32[0] = uSrc1.ai32[0] >> uShift;
     10510    puDst->ai32[1] = uSrc1.ai32[1] >> uShift;
     10511    puDst->ai32[2] = uSrc1.ai32[2] >> uShift;
     10512    puDst->ai32[3] = uSrc1.ai32[3] >> uShift;
    1054910513}
    1055010514
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