VirtualBox

Ignore:
Timestamp:
Feb 19, 2016 11:18:18 PM (9 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
105617
Message:

iprt/asm.h: Cleaned up the ASMMemIsAll8/U32 mess and implmeneted the former in assembly. (Found inverted usage due to bad naming in copyUtf8Block, but it is fortunately an unused method.) Replaces the complicated ASMBitFirstSet based scanning in RTSgBufIsZero with a simple call to the new ASMMemIsZero function.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/testcase/tstRTInlineAsm.cpp

    r59527 r59747  
    4747# include <iprt/time.h>
    4848#endif
     49#include <iprt/rand.h>
    4950#include <iprt/stream.h>
    5051#include <iprt/string.h>
     
    13221323        RTTESTI_CHECK(!ASMMemIsZeroPage(pvPage2));
    13231324        ((uint8_t *)pvPage2)[off] = 0;
     1325    }
     1326
     1327    RTTestSubDone(hTest);
     1328}
     1329
     1330
     1331void tstASMMemFirstMismatchingU8(RTTEST hTest)
     1332{
     1333    RTTestSub(hTest, "ASMMemFirstMismatchingU8");
     1334
     1335    uint8_t *pbPage1 = (uint8_t *)RTTestGuardedAllocHead(hTest, PAGE_SIZE);
     1336    uint8_t *pbPage2 = (uint8_t *)RTTestGuardedAllocTail(hTest, PAGE_SIZE);
     1337    RTTESTI_CHECK_RETV(pbPage1 && pbPage2);
     1338
     1339    memset(pbPage1, 0, PAGE_SIZE);
     1340    memset(pbPage2, 0, PAGE_SIZE);
     1341    RTTESTI_CHECK(ASMMemFirstMismatchingU8(pbPage1, PAGE_SIZE, 0) == NULL);
     1342    RTTESTI_CHECK(ASMMemFirstMismatchingU8(pbPage2, PAGE_SIZE, 0) == NULL);
     1343    RTTESTI_CHECK(ASMMemFirstMismatchingU8(pbPage1, PAGE_SIZE, 1) == pbPage1);
     1344    RTTESTI_CHECK(ASMMemFirstMismatchingU8(pbPage2, PAGE_SIZE, 1) == pbPage2);
     1345    RTTESTI_CHECK(ASMMemFirstMismatchingU8(pbPage1, PAGE_SIZE, 0x87) == pbPage1);
     1346    RTTESTI_CHECK(ASMMemFirstMismatchingU8(pbPage2, PAGE_SIZE, 0x87) == pbPage2);
     1347    RTTESTI_CHECK(ASMMemIsZero(pbPage1, PAGE_SIZE));
     1348    RTTESTI_CHECK(ASMMemIsZero(pbPage2, PAGE_SIZE));
     1349    RTTESTI_CHECK(ASMMemIsAllU8(pbPage1, PAGE_SIZE, 0));
     1350    RTTESTI_CHECK(ASMMemIsAllU8(pbPage2, PAGE_SIZE, 0));
     1351    RTTESTI_CHECK(!ASMMemIsAllU8(pbPage1, PAGE_SIZE, 0x34));
     1352    RTTESTI_CHECK(!ASMMemIsAllU8(pbPage2, PAGE_SIZE, 0x88));
     1353    unsigned cbSub = 32;
     1354    while (cbSub-- > 0)
     1355    {
     1356        RTTESTI_CHECK(ASMMemFirstMismatchingU8(&pbPage1[PAGE_SIZE - cbSub], cbSub, 0) == NULL);
     1357        RTTESTI_CHECK(ASMMemFirstMismatchingU8(&pbPage2[PAGE_SIZE - cbSub], cbSub, 0) == NULL);
     1358        RTTESTI_CHECK(ASMMemFirstMismatchingU8(pbPage1, cbSub, 0) == NULL);
     1359        RTTESTI_CHECK(ASMMemFirstMismatchingU8(pbPage2, cbSub, 0) == NULL);
     1360
     1361        RTTESTI_CHECK(ASMMemFirstMismatchingU8(&pbPage1[PAGE_SIZE - cbSub], cbSub, 0x34) == &pbPage1[PAGE_SIZE - cbSub] || !cbSub);
     1362        RTTESTI_CHECK(ASMMemFirstMismatchingU8(&pbPage2[PAGE_SIZE - cbSub], cbSub, 0x99) == &pbPage2[PAGE_SIZE - cbSub] || !cbSub);
     1363        RTTESTI_CHECK(ASMMemFirstMismatchingU8(pbPage1, cbSub, 0x42) == pbPage1 || !cbSub);
     1364        RTTESTI_CHECK(ASMMemFirstMismatchingU8(pbPage2, cbSub, 0x88) == pbPage2 || !cbSub);
     1365    }
     1366
     1367    memset(pbPage1, 0xff, PAGE_SIZE);
     1368    memset(pbPage2, 0xff, PAGE_SIZE);
     1369    RTTESTI_CHECK(ASMMemFirstMismatchingU8(pbPage1, PAGE_SIZE, 0xff) == NULL);
     1370    RTTESTI_CHECK(ASMMemFirstMismatchingU8(pbPage2, PAGE_SIZE, 0xff) == NULL);
     1371    RTTESTI_CHECK(ASMMemFirstMismatchingU8(pbPage1, PAGE_SIZE, 0xfe) == pbPage1);
     1372    RTTESTI_CHECK(ASMMemFirstMismatchingU8(pbPage2, PAGE_SIZE, 0xfe) == pbPage2);
     1373    RTTESTI_CHECK(!ASMMemIsZero(pbPage1, PAGE_SIZE));
     1374    RTTESTI_CHECK(!ASMMemIsZero(pbPage2, PAGE_SIZE));
     1375    RTTESTI_CHECK(ASMMemIsAllU8(pbPage1, PAGE_SIZE, 0xff));
     1376    RTTESTI_CHECK(ASMMemIsAllU8(pbPage2, PAGE_SIZE, 0xff));
     1377    RTTESTI_CHECK(!ASMMemIsAllU8(pbPage1, PAGE_SIZE, 0));
     1378    RTTESTI_CHECK(!ASMMemIsAllU8(pbPage2, PAGE_SIZE, 0));
     1379    cbSub = 32;
     1380    while (cbSub-- > 0)
     1381    {
     1382        RTTESTI_CHECK(ASMMemFirstMismatchingU8(&pbPage1[PAGE_SIZE - cbSub], cbSub, 0xff) == NULL);
     1383        RTTESTI_CHECK(ASMMemFirstMismatchingU8(&pbPage2[PAGE_SIZE - cbSub], cbSub, 0xff) == NULL);
     1384        RTTESTI_CHECK(ASMMemFirstMismatchingU8(pbPage1, cbSub, 0xff) == NULL);
     1385        RTTESTI_CHECK(ASMMemFirstMismatchingU8(pbPage2, cbSub, 0xff) == NULL);
     1386
     1387        RTTESTI_CHECK(ASMMemFirstMismatchingU8(&pbPage1[PAGE_SIZE - cbSub], cbSub, 0xfe) == &pbPage1[PAGE_SIZE - cbSub] || !cbSub);
     1388        RTTESTI_CHECK(ASMMemFirstMismatchingU8(&pbPage2[PAGE_SIZE - cbSub], cbSub, 0xfe) == &pbPage2[PAGE_SIZE - cbSub] || !cbSub);
     1389        RTTESTI_CHECK(ASMMemFirstMismatchingU8(pbPage1, cbSub, 0xfe) == pbPage1 || !cbSub);
     1390        RTTESTI_CHECK(ASMMemFirstMismatchingU8(pbPage2, cbSub, 0xfe) == pbPage2 || !cbSub);
     1391    }
     1392
     1393
     1394    /*
     1395     * Various alignments and sizes.
     1396     */
     1397    uint8_t const  bFiller1 = 0x00;
     1398    uint8_t const  bFiller2 = 0xf6;
     1399    size_t const   cbBuf    = 128;
     1400    uint8_t       *pbBuf1   = pbPage1;
     1401    uint8_t       *pbBuf2   = &pbPage2[PAGE_SIZE - cbBuf]; /* Put it up against the tail guard */
     1402    memset(pbPage1, ~bFiller1, PAGE_SIZE);
     1403    memset(pbPage2, ~bFiller2, PAGE_SIZE);
     1404    memset(pbBuf1, bFiller1, cbBuf);
     1405    memset(pbBuf2, bFiller2, cbBuf);
     1406    for (size_t offNonZero = 0; offNonZero < cbBuf; offNonZero++)
     1407    {
     1408        uint8_t bRand = (uint8_t)RTRandU32();
     1409        pbBuf1[offNonZero] = bRand | 1;
     1410        pbBuf2[offNonZero] = (0x80 | bRand) ^ 0xf6;
     1411
     1412        for (size_t offStart = 0; offStart < 32; offStart++)
     1413        {
     1414            size_t const  cbMax = cbBuf - offStart;
     1415            for (size_t cb = 0; cb < cbMax; cb++)
     1416            {
     1417                size_t const offEnd = offStart + cb;
     1418                uint8_t bSaved1, bSaved2;
     1419                if (offEnd < PAGE_SIZE)
     1420                {
     1421                    bSaved1 = pbBuf1[offEnd];
     1422                    bSaved2 = pbBuf2[offEnd];
     1423                    pbBuf1[offEnd] = 0xff;
     1424                    pbBuf2[offEnd] = 0xff;
     1425                }
     1426
     1427                uint8_t *pbRet = (uint8_t *)ASMMemFirstMismatchingU8(pbBuf1 + offStart, cb, bFiller1);
     1428                RTTESTI_CHECK(offNonZero - offStart < cb ? pbRet == &pbBuf1[offNonZero] : pbRet == NULL);
     1429
     1430                pbRet = (uint8_t *)ASMMemFirstMismatchingU8(pbBuf2 + offStart, cb, bFiller2);
     1431                if (!(offNonZero - offStart < cb ? pbRet == &pbBuf2[offNonZero] : pbRet == NULL))
     1432                    __debugbreak();
     1433                RTTESTI_CHECK(offNonZero - offStart < cb ? pbRet == &pbBuf2[offNonZero] : pbRet == NULL);
     1434
     1435                if (offEnd < PAGE_SIZE)
     1436                {
     1437                    pbBuf1[offEnd] = bSaved1;
     1438                    pbBuf2[offEnd] = bSaved2;
     1439                }
     1440            }
     1441        }
     1442
     1443        pbBuf1[offNonZero] = 0;
     1444        pbBuf2[offNonZero] = 0xf6;
    13241445    }
    13251446
     
    17911912    tstASMMemZeroPage();
    17921913    tstASMMemIsZeroPage(g_hTest);
     1914    tstASMMemFirstMismatchingU8(g_hTest);
    17931915    tstASMMemZero32();
    17941916    tstASMMemFill32();
Note: See TracChangeset for help on using the changeset viewer.

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