⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test.asm

📁 这是一个JPEG解码器,里面使用了MMX,SSE等汇编指令集
💻 ASM
📖 第 1 页 / 共 2 页
字号:
.686P
.MODEL FLAT, STDCALL
OPTION CASEMAP:NONE
OPTION PROLOGUE:NONE
OPTION EPILOGUE:NONE
.XMM

INCLUDE jpeg.inc

.DATA

ALIGN 4

BUFFSIZE = 259
;//BUFFSIZE = 256
;//BUFFSIZE = 8
;//BUFFSIZE = 1
;//BUFFSIZE = 0
;//Dummy byte 1 DUP (?)
TEST_Buffer byte BUFFSIZE DUP (?)

nrandom_seed dword ?
randinit byte 0

.CODE

;//=========================================================================
;// Park Miller random number algorithm.
;// Written by Jaymeson Trudgen (NaN)
;// Optimized by Rickey Bowers Jr. (bitRAKE)
;//=========================================================================

nrandom PROC

          cmp randinit, 0
          jne @F
          rdtsc
          mov nrandom_seed, eax
          mov randinit, 1
@@:
          xor edx, edx
          mov ecx, 127773
          div ecx
          mov ecx, eax
          mov eax, 16807
          mul edx
          mov edx, ecx
          mov ecx, eax
          mov eax, 2836
          mul edx
          sub ecx, eax
          xor edx, edx
          mov eax, ecx
          mov nrandom_seed, ecx
          mov eax, ecx
          ret

nrandom ENDP

;//=========================================================================
;// Test bitstream
;//=========================================================================

IF 0
          TEST_Bitstream PROTO
          call      TEST_Bitstream
          ret

ENDIF

TEST_Bitstream PROC

          pushad

          DBGSTART

          call      JPG_InitDecoder

          ;// fill with random values
          mov       ebx, BUFFSIZE
          lea       edi, TEST_Buffer
          jmp       z
SetLoop:
          rdtsc
          call      nrandom
          stosb
          mov       ecx, 8
          shl       eax, 24
@@:
          sub       edx, edx
          shl       eax, 1
          adc       edx, 0
          DBG       "%d", edx
          loop      @B
z:
          dec       ebx
          jge       SetLoop

          ;// read using random value
          call      JPG_InitDecoder
          lea       esi, TEST_Buffer
          mov       ecx, BUFFSIZE
          call      BS_Init

          IF 0
          mov       eax, 32
          call      BS_GetBits
          jc        Ok
          int       3
          Ok:
          ENDIF
          DBG       "--------"

          ;// number of bits
          mov       ebx, BUFFSIZE * 8
          ;//jmp       Next
ByteLoop:
          rdtsc
          call      nrandom
          and       eax, 31
          inc       eax
          IF BUFFSIZE NE 0
          cmp       ebx, eax
          cmovl     eax, ebx
          ENDIF
          mov       esi, eax  
          call      BS_GetBits
          jc        Err
          sub       ebx, esi
          mov       ecx, 32
          sub       ecx, esi
          shl       eax, cl
@@:
          sub       edx, edx
          shl       eax, 1
          adc       edx, 0
          DBG       "%d", edx
          dec       esi
          jnz       @B

Next:
          test      ebx, ebx
          jnz       ByteLoop

Done:
          DBGSTOP
          popad

          push      Ctx
          call      JPEG_Free

          ret

Err:
          int       3
          jmp       Done

          

TEST_Bitstream ENDP

;//=========================================================================
;// Test bitstream ECS
;//=========================================================================

IF 0
          TEST_BitstreamECS PROTO
          call      TEST_BitstreamECS
          ret
ENDIF

TEST_BitstreamECS PROC

.DATA

A = 1

ALIGN A

ECS0  byte 00h, 01h, 02h, 003h, 004h, 005h, 006h, 007h
ECS00 byte 00h, 01h, 02h, 003h, 004h, 005h, 006h, 007h

ALIGN A

ECS1  byte 0FFh, 00h, 00h, 01h, 02h, 003h, 004h, 005h, 006h, 007h
ECS10 byte 0FFh, 00h, 01h, 02h, 003h, 004h, 005h, 006h, 007h

ALIGN A

ECS2  byte 00h, 0FFh, 00h, 01h, 02h, 003h, 004h, 005h, 006h, 007h
ECS20 byte 00h, 0FFh, 01h, 02h, 003h, 004h, 005h, 006h, 007h

ALIGN A

ECS3  byte 00h, 01h, 0FFh, 00h, 02h, 003h, 004h, 005h, 006h, 007h
ECS30 byte 00h, 01h, 0FFh, 02h, 003h, 004h, 005h, 006h, 007h

ALIGN A

ECS4  byte 00h, 01h, 02h, 0FFh, 00h, 003h, 004h, 005h, 006h, 007h
ECS40 byte 00h, 01h, 02h, 0FFh, 003h, 004h, 005h, 006h, 007h

ALIGN A

ECS5  byte 00h, 01h, 02h, 003h, 0FFh, 00h, 004h, 005h, 006h, 007h
ECS50 byte 00h, 01h, 02h, 003h, 0FFh, 004h, 005h, 006h, 007h

ALIGN A

ECS6  byte 00h, 01h, 02h, 003h, 004h, 0FFh, 00h, 005h, 006h, 007h
ECS60 byte 00h, 01h, 02h, 003h, 004h, 0FFh, 005h, 006h, 007h

ALIGN A

ECS7  byte 00h, 01h, 02h, 003h, 004h, 005h, 0FFh, 000h, 006h, 007h
ECS70 byte 00h, 01h, 02h, 003h, 004h, 005h, 0FFh, 006h, 007h

ALIGN A

ECS8  byte 00h, 01h, 02h, 003h, 004h, 005h, 006h, 0FFh, 00h, 007h
ECS80 byte 00h, 01h, 02h, 003h, 004h, 005h, 006h, 0FFh, 007h

ALIGN A

ECS9  byte 00h, 01h, 02h, 003h, 004h, 005h, 006h, 0FFh, 00h, 0FFh
ECS90 byte 00h, 01h, 02h, 003h, 004h, 005h, 006h, 0FFh, 007h

TabECS dword ECS0, ECS1, ECS2, ECS3, ECS4, ECS5, ECS6, ECS7, ECS8, ECS9
SizECS dword sizeof ECS0, sizeof ECS1, sizeof ECS2, sizeof ECS3, sizeof ECS4, sizeof ECS5, sizeof ECS6, sizeof ECS7, sizeof ECS8, sizeof ECS9
SizECS0 dword sizeof ECS00, sizeof ECS10, sizeof ECS20, sizeof ECS30, sizeof ECS40, sizeof ECS50, sizeof ECS60, sizeof ECS70, sizeof ECS80, sizeof ECS90

.CODE

          pushad
          sub         esp, 4
I TEXTEQU <DPTR [esp]>

          DBGSTART

          call        JPG_InitDecoder

          sub         ebx, ebx
TLoop:

          mov         esi, TabECS[4*ebx]
          mov         ecx, SizECS[4*ebx]
          lea         edi, [esi][ecx]

          call        BS_Init
          call        BS_GetPtr

          mov         eax, SizECS0[4*ebx]
          mov         I, eax
@@:
          mov         eax, 8
          call        BS_GetBitsECS
          jc          Err
          scasb
          jne         Err0
          dec         I
          jnz         @B

          inc         ebx
          cmp         ebx, LENGTHOF TabECS
          jb          TLoop

Done:
          add         esp, 4
          DBGSTOP
          popad

          push      Ctx
          call      JPEG_Free

          ret

Err0:
          int       3
Err:
          int       3
          jmp       Done

TEST_BitstreamECS ENDP

;//=========================================================================
;// Test IDCT
;//=========================================================================

.DATA

ALIGN 16

 
In8x8     dword 6750 , 28811 , 46 , 28613 , 27442 , 29854 , 6440 , 20346
          dword 24059 , 5706 , 23840 , 3889 , 4215 , 9549 , 20201 , 15494
          dword 5640 , 3974 , 23380 , 2709 , 17889 , 25204 , 22114 , 28345
          dword 6730 , 13889 , 29519 , 5587 , 16756 , 1366 , 23326 , 10024
          dword 6241 , 11606 , 10994 , 23276 , 5240 , 25957 , 9383 , 23077
          dword 7711 , 25671 , 22004 , 22529 , 9546 , 2937 , 2447 , 16286
          dword 29474 , 2026 , 28240 , 17294 , 7258 , 28851 , 2866 , 29552
          dword 14919 , 19094 , 1180 , 3566 , 30823 , 19006 , 22822 , 8013
          
Quant     real4 51.0, 167.0, 214.0, 117.0, 20.0, 154.0, 57.0, 158.0
          real4 243.0, 247.0, 226.0, 97.0, 175.0, 150.0, 33.0, 28.0
          real4 96.0, 117.0, 237.0, 210.0, 50.0, 44.0, 79.0, 78.0
          real4 147.0, 48.0, 99.0, 77.0, 157.0, 227.0, 93.0, 73.0
          real4 76.0, 115.0, 44.0, 155.0, 137.0, 16.0, 155.0, 167.0
          real4 252.0, 53.0, 211.0, 122.0, 242.0, 162.0, 94.0, 131.0
          real4 169.0, 140.0, 60.0, 82.0, 62.0, 151.0, 55.0, 120.0
          real4 43.0, 128.0, 63.0, 205.0, 250.0, 8.0, 98.0, 204.0

OutRef8x8 real4 12996638.71, -1515747.313, 2104118.988, -2874427.058, 625755.514, -1367282.426, 3009623.351, 2219209.274
          real4 -2770526.608, 2282276.638, 421852.567, 704530.2941, -3269913.042, 547708.2844, -28271.3284, -830504.8428
          real4 4853183.670, -506173.7389, 1494843.332, 2901514.394, 1513145.906, -1054465.212, 2082220.807, -687542.5017
          real4 -202193.6234, 1548101.447, 25635.4192, -1165761.071, 262903.6128, 1202631.069, 2037055.112, -4062162.782
          real4 803410.6922, -2670995.900, 140406.5582, 1932917.187, 2758966.863, -871584.0054, -3850392.968, -3058166.795
          real4 -367386.3162, -326892.6243, 1339150.221, 1013610.957, -1101620.689, 442798.1391, 2678721.226, -2105032.760
          real4 1344461.076, -1417005.547, -2071111.442, -681459.3677, -171310.3151, -2245939.700, -3561763.620, -943361.8538
          real4 -443645.2060, -2241107.648, 1000200.811, -1504940.145, 419218.819, -569571.4046, 1122600.912, -4537151.985

OutRow16x16 real4 1378576.373, 535041.7096, -210355.3275, -212921.1994, 168193.7226, 280566.1987, 94225.4252, 5596.2436, 71409.9541, -2852.6888, -211986.1815, -179087.1058, 130603.5782, 153580.2935, -466094.4292, -1190246.566
            real4 1743591.249, 1280047.575, 740016.0976, 462356.8506, 416624.1714, 352765.3116, 152618.2874, -73956.46000, -180596.3854, -136075.8758, 23466.25950, 272977.6168, 565982.9244, 800332.6534, 900907.9622, 907098.3037
            real4 1445504.808, 596301.0340, -135050.0574, -133185.4661, 137023.5950, -39978.80144, -575261.4929, -818629.2950, -573583.7742, -293040.4549, -284770.3678, -272845.3891, 51514.12642, 479691.8566, 627607.7106, 539700.8215
            real4 1161988.366, 515462.6861, -134096.3182, -272540.2748, -49529.73361, 58868.89978, -92843.59926, -229371.6327, -139040.8175, 20980.25184, -11770.01048, -212627.5234, -293483.9392, -59976.37452, 372799.9802, 704031.0706
            real4 1248203.658, 290857.2937, -412886.0427, -199803.1805, 203885.2565, -41656.5671, -565329.5132, -444688.7474, 286457.1119, 678882.0671, 323056.8163, -114780.0526, -40745.54764, 159512.2694, -122574.4637, -628666.6390
            real4 1577118.030, 899575.9469, 209867.3171, -52075.62662, -122809.8905, -334758.7775, -517596.7456, -334054.2463, 61414.40329, 174214.0708, -76182.75372, -216340.9463, 55984.56704, 417136.4817, 439530.8213, 242550.0696
            real4 1450240.303, 519550.0668, -232321.8636, -95737.05178, 421686.3972, 527857.6990, 260918.5578, 162665.0630, 283212.3436, 220562.5916, 4950.2728, 173530.5266, 791971.9232, 1092212.112, 534851.0714, -258988.9969
            real4 1356136.542, 490364.1979, -396382.7366, -612054.6450, -284959.9335, 63059.26979, 254229.1810, 454363.8237, 635632.2821, 475686.4921, -129337.5196, -765851.6853, -913408.9394, -501763.0260, 94797.93248, 480796.3458
            real4 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.
            real4 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.
            real4 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.
            real4 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.
            real4 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.
            real4 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.
            real4 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.
            real4 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.

OutRef16x16 real4 11361359.33, 5127200.510, -571208.931, -1115960.593, 890113.584, 866723.2332, -989039.8991, -1278075.250, 444905.1187, 1138356.455, -362573.4822, -1315024.556, 348418.6926, 2540726.264, 2381826.586, 796274.410
            real4 4575961.633, 2412656.900, 446368.7730, 245237.6700, 797770.4240, 408141.4174, -816201.2401, -1448147.491, -1009274.492, -409488.0457, -235582.6262, 65861.3396, 884482.0370, 1452207.581, 994170.2577, 140381.8942
            real4 -1427309.433, -68874.1659, 1107016.558, 1092477.120, 488487.6195, 186525.4464, -40545.5422, -824507.8008, -1721213.993, -1570231.275, -266472.6480, 867041.9672, 795647.7739, 29511.2771, -356757.8791, -250451.4831
            real4 -1308503.126, -157918.4773, 693784.7490, 496648.0928, 154937.9864, 577808.9601, 1128931.262, 654387.7806, -576203.0345, -1132148.014, -504706.3683, 219883.0662, 60051.10963, -505346.9396, -524818.9667, -125615.6708
            real4 2079244.223, 1148860.821, 90091.2670, -275512.5720, 203605.3306, 1044868.541, 1628840.838, 1580963.973, 899406.9834, -27086.01592, -590720.2072, -438873.3372, 127187.3938, 410623.5372, 97110.57960, -373432.6348
            real4 3014621.364, 1591141.769, 255222.1157, 67493.08622, 557041.3144, 831871.0863, 854018.4655, 979221.5030, 953662.5705, 359785.4227, -258666.2259, 134915.5649, 1323065.290, 1657244.265, 250874.2472, -1488529.548
            real4 812832.9755, 684545.6403, 691828.0595, 789309.0802, 583485.2804, 26705.6877, -345641.5337, -178056.3137, 146528.6029, 175770.1263, 242352.4402, 926405.1118, 1763318.438, 1394321.266, -573968.3801, -2547909.866
            real4 -719686.9970, -241840.4482, 295172.7702, 418875.7643, 37644.88600, -462766.2998, -598867.4862, -272275.6906, 183805.6260, 431474.1932, 462196.3762, 409715.0964, 170683.5305, -527041.5178, -1618348.157, -2488782.784
            real4 181756.8383, -338063.7459, -806911.6685, -786479.4886, -410906.9120, -35172.23088, 285345.1809, 706019.1465, 1112671.365, 1065540.288, 319585.0811, -798819.6882, -1677939.568, -1990581.293, -1883907.193, -1710467.274
            real4 1208034.788, -140740.0414, -1334625.705, -1199781.651, -112636.5439, 815407.8765, 1163564.650, 1285190.620, 1339023.834, 981286.8037, 86460.54270, -835619.9067, -1251563.423, -1255804.324, -1272897.173, -1389995.092
            real4 492210.3668, -211865.0470, -728971.9939, -402785.2027, 450032.8326, 1054364.305, 1070034.456, 711548.7448, 269810.1880, -75564.3196, -98637.76571, 320492.5526, 781924.9248, 551028.8713, -530741.8040, -1593587.705
            real4 -455517.1800, -203410.7790, 58231.40415, 174322.1012, 234023.9116, 320888.0234, 267802.7036, -137344.3688, -722842.6101, -925054.3298, -359461.7593, 650702.6560, 1253374.705, 846264.8266, -319076.2614, -1310535.387
            real4 206266.9429, 189206.0976, -31984.5599, -447929.6988, -735333.3635, -654674.4610, -387355.0482, -296867.4211, -460549.9691, -642650.6624, -685283.6562, -688940.5993, -755216.7054, -775269.3287, -627295.2148, -436736.0193
            real4 1366691.659, 347856.1394, -790595.9951, -1277825.054, -1160595.030, -881477.1838, -569937.0706, -107093.0324, 308763.3678, 149790.7784, -759426.1460, -1848624.690, -2310714.241, -1887751.823, -1024664.259, -386808.5371
            real4 985567.6306, -334387.5172, -1329084.430, -1017494.646, -258036.1156, -197009.0461, -561488.7802, -373386.2802, 283979.5526, 365828.9968, -405917.0245, -1063168.786, -941332.1724, -712114.7692, -1214770.442, -2005072.196
            real4 -316309.0480, -1243700.302, -1410017.650, -167333.2016, 971464.3568, 586853.8256, -581854.1462, -912038.2199, -309913.8475, 68746.5754, 25074.5648, 528660.5178, 1518269.466, 1229266.795, -1234246.808, -3872677.170

Out8x8    real4 8*8 dup (?)
Out16x16  real4 16*16 dup (?)

cpu dword ?
espsav dword ?

.CODE

IF 0
          TEST_IDCT PROTO
          call      TEST_IDCT
          ret 4*4
ENDIF

TEST_8x8_SSE = 0
TEST_8x8_SSE2 = 1
TEST_16x16_SSE = 0
TEST_16x16_SSE2 = 1
TEST_ROWONLY = 0

TEST_IDCT PROC

          pushad
          mov       espsav, esp

          sub       esp, 16*16*4+16
          and       esp, NOT(15)

          DBGSTART
          
          mov       eax, 1
          cpuid
          DBG_CPUID
          mov       cpu, edx
          
          mov       eax, sizeof(DECODER)
          call      MEM_Alloc
          mov       Ctx, eax

ITST=0
IF TEST_8x8_SSE
ITST=ITST+1

          bt        cpu, 25
          jnc       @CatStr(Next,%ITST)
          DBG "8x8 SSE"
          mov       [Ctx].RetIdct, @CatStr(RetIdct,%ITST)
          
          mov       ebx, 100
@CatStr(T,%ITST):
          lea       esi, In8x8
          mov       edi, esp
          mov       ecx, 8*8
          rep       movsd
          lea       eax, Quant
          lea       edi, Out8x8
          jmp       IDCT_8x8_SSE
@CatStr(RetIdct,%ITST):
          mov       ecx, -8*8
          lea       edi, Out8x8
          emms
@@:
          fld       OutRef8x8[4*ecx+4*8*8]
          fsub      DPTR [edi][4*ecx+4*8*8]
          fabs
          fstp      DPTR [edi][4*ecx+4*8*8]
          inc       ecx
          jnz       @B
          DBG "Diff :"
          pushad
          mov       ecx, 8
          mov       edx, 8
          call      DBG_DumpNxMFloats
          popad
          dec       ebx
          jnz       @CatStr(T,%ITST)
@CatStr(Next,%ITST):
ENDIF

IF TEST_16x16_SSE
ITST = ITST+1
          bt        cpu, 25
          jnc       @CatStr(Next,%ITST)
          DBG "16x16 SSE"
          mov       [Ctx].RetIdct, @CatStr(RetIdct,%ITST)
          
          mov       ebx, 100
@CatStr(T,%ITST):
          lea       esi, In8x8
          mov       edi, esp
          mov       ecx, 8*8
          rep       movsd
          lea       eax, Quant
          lea       edi, Out16x16
          jmp       IDCT_16x16_SSE
@CatStr(RetIdct,%ITST):
          mov       ecx, -16*16*4
          lea       edi, Out16x16
          emms
@@:
IF TEST_ROWONLY EQ 0
          fld       OutRef16x16[ecx+16*16*4]
ELSE
          fld       OutRow16x16[ecx+16*16*4]
ENDIF          
          fsub      DPTR [edi][ecx+16*16*4]
          fabs
          fstp      DPTR [edi][ecx+16*16*4]
          add       ecx, 4
          jnz       @B
          DBG "Diff :"
          pushad
          mov       ecx, 16
          mov       edx, 16
          call      DBG_DumpNxMFloats
          popad
          dec       ebx
          jnz       @CatStr(T,%ITST)
@CatStr(Next,%ITST):
ENDIF

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -