diff --git a/.gitattributes b/.gitattributes index fd76923363..0ffdd6d02c 100644 --- a/.gitattributes +++ b/.gitattributes @@ -12359,7 +12359,7 @@ tests/Makefile.fpc svneol=native#text/plain tests/bench/bansi1.inc svneol=native#text/plain tests/bench/bansi1.pp svneol=native#text/plain tests/bench/bansi1mt.pp svneol=native#text/plain -tests/bench/bcase.pp -text svneol=native#text/pascal +tests/bench/bcase.pp svneol=native#text/pascal tests/bench/blists1.inc svneol=native#text/plain tests/bench/blists1.pp svneol=native#text/plain tests/bench/bmd5.pp svneol=native#text/plain diff --git a/tests/bench/bcase.pp b/tests/bench/bcase.pp index effd8b1880..c37c342f3d 100644 --- a/tests/bench/bcase.pp +++ b/tests/bench/bcase.pp @@ -1,2661 +1,2667 @@ -{$goto on} -program bcase; - -{$mode objfpc}{$H+} - -uses - SysUtils; - -{ Utility functions } -function GetRealTime(const st: TSystemTime): Real; - begin - Result := st.Hour*3600.0 + st.Minute*60.0 + st.Second + st.MilliSecond/1000.0; - end; - -{$push} -{$warn 5057 off} -function GetRealTime : Real; - var - st:TSystemTime; - begin - GetLocalTime(st); - result:=GetRealTime(st); - end; -{$pop} - -function IIf(Condition: Boolean; TrueRes, FalseRes: Integer): Integer; inline; - begin - if Condition then - Result := TrueRes - else - Result := FalseRes; - end; - -const - ITERATIONS = 33554432; - - AES_S_Box: array[Byte] of Byte = ( - $63, $7c, $77, $7b, $f2, $6b, $6f, $c5, $30, $01, $67, $2b, $fe, $d7, $ab, $76, - $ca, $82, $c9, $7d, $fa, $59, $47, $f0, $ad, $d4, $a2, $af, $9c, $a4, $72, $c0, - $b7, $fd, $93, $26, $36, $3f, $f7, $cc, $34, $a5, $e5, $f1, $71, $d8, $31, $15, - $04, $c7, $23, $c3, $18, $96, $05, $9a, $07, $12, $80, $e2, $eb, $27, $b2, $75, - $09, $83, $2c, $1a, $1b, $6e, $5a, $a0, $52, $3b, $d6, $b3, $29, $e3, $2f, $84, - $53, $d1, $00, $ed, $20, $fc, $b1, $5b, $6a, $cb, $be, $39, $4a, $4c, $58, $cf, - $d0, $ef, $aa, $fb, $43, $4d, $33, $85, $45, $f9, $02, $7f, $50, $3c, $9f, $a8, - $51, $a3, $40, $8f, $92, $9d, $38, $f5, $bc, $b6, $da, $21, $10, $ff, $f3, $d2, - $cd, $0c, $13, $ec, $5f, $97, $44, $17, $c4, $a7, $7e, $3d, $64, $5d, $19, $73, - $60, $81, $4f, $dc, $22, $2a, $90, $88, $46, $ee, $b8, $14, $de, $5e, $0b, $db, - $e0, $32, $3a, $0a, $49, $06, $24, $5c, $c2, $d3, $ac, $62, $91, $95, $e4, $79, - $e7, $c8, $37, $6d, $8d, $d5, $4e, $a9, $6c, $56, $f4, $ea, $65, $7a, $ae, $08, - $ba, $78, $25, $2e, $1c, $a6, $b4, $c6, $e8, $dd, $74, $1f, $4b, $bd, $8b, $8a, - $70, $3e, $b5, $66, $48, $03, $f6, $0e, $61, $35, $57, $b9, $86, $c1, $1d, $9e, - $e1, $f8, $98, $11, $69, $d9, $8e, $94, $9b, $1e, $87, $e9, $ce, $55, $28, $df, - $8c, $a1, $89, $0d, $bf, $e6, $42, $68, $41, $99, $2d, $0f, $b0, $54, $bb, $16 - ); - - FirstWeighted: array[0..255] of Byte = ( - $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, - $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, - $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, - $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, - $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, - $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, - $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, - $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, - $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, - $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, - $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, - $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, - $ba, $78, $25, $2e, $1c, $a6, $b4, $c6, $e8, $dd, $74, $1f, $4b, $bd, $8b, $8a, - $70, $3e, $b5, $66, $48, $03, $f6, $0e, $61, $35, $57, $b9, $86, $c1, $1d, $9e, - $e1, $f8, $98, $11, $69, $d9, $8e, $94, $9b, $1e, $87, $e9, $ce, $55, $28, $df, - $8c, $a1, $89, $0d, $bf, $e6, $42, $68, $41, $99, $2d, $0f, $b0, $54, $bb, $16 - ); - - LastWeighted: array[0..255] of Byte = ( - $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, - $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, - $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, - $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, - $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, - $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, - $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, - $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, - $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, - $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, - $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, - $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, - $ba, $78, $25, $2e, $1c, $a6, $b4, $c6, $e8, $dd, $74, $1f, $4b, $bd, $8b, $8a, - $70, $3e, $b5, $66, $48, $03, $f6, $0e, $61, $35, $57, $b9, $86, $c1, $1d, $9e, - $e1, $f8, $98, $11, $69, $d9, $8e, $94, $9b, $1e, $87, $e9, $ce, $55, $28, $df, - $8c, $a1, $89, $0d, $bf, $e6, $42, $68, $41, $99, $2d, $0f, $b0, $54, $bb, $16 - ); - - AlmostFullExpected: array[0..255] of Byte = ( - $63, $7c, $77, $7b, $f2, $6b, $6f, $c5, $30, $01, $67, $2b, $fe, $d7, $ab, $76, - $ca, $82, $c9, $7d, $fa, $59, $47, $f0, $ad, $d4, $a2, $af, $9c, $a4, $72, $c0, - $b7, $fd, $93, $26, $36, $3f, $f7, $cc, $34, $a5, $e5, $f1, $71, $d8, $31, $15, - $04, $c7, $23, $c3, $18, $96, $05, $9a, $07, $12, $80, $e2, $eb, $27, $b2, $75, - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, - $d0, $ef, $aa, $fb, $43, $4d, $33, $85, $45, $f9, $02, $7f, $50, $3c, $9f, $a8, - $51, $a3, $40, $8f, $92, $9d, $38, $f5, $bc, $b6, $da, $21, $10, $ff, $f3, $d2, - $cd, $0c, $13, $ec, $5f, $97, $44, $17, $c4, $a7, $7e, $3d, $64, $5d, $19, $73, - $60, $81, $4f, $dc, $22, $2a, $90, $88, $46, $ee, $b8, $14, $de, $5e, $0b, $db, - $e0, $32, $3a, $0a, $49, $06, $24, $5c, $c2, $d3, $ac, $62, $91, $95, $e4, $79, - $e7, $c8, $37, $6d, $8d, $d5, $4e, $a9, $6c, $56, $f4, $ea, $65, $7a, $ae, $08, - $ba, $78, $25, $2e, $1c, $a6, $b4, $c6, $e8, $dd, $74, $1f, $4b, $bd, $8b, $8a, - $70, $3e, $b5, $66, $48, $03, $f6, $0e, $61, $35, $57, $b9, $86, $c1, $1d, $9e, - $e1, $f8, $98, $11, $69, $d9, $8e, $94, $9b, $1e, $87, $e9, $ce, $55, $28, $df, - $8c, $a1, $89, $0d, $bf, $e6, $42, $68, $41, $99, $2d, $0f, $b0, $54, $bb, $16 - ); - -type - TInstructionSet = ( { Truncated to 1024 entries } - A_NONE = -512, A_ADC, A_ADD, A_AND, A_BSF, A_BSR, A_BSWAP, A_BT, A_BTC, A_BTR, A_BTS, - A_CALL, A_CBW, A_CDQ, A_CLC, A_CLD, A_CLI, A_CLTS, A_CMC, A_CMP, A_CMPSB, - A_CMPSD, A_CMPSW, A_CMPXCHG, A_CMPXCHG486, A_CMPXCHG8B, A_CPUID, A_CWD, A_CWDE, - A_DEC, A_DIV, A_EMMS, A_ENTER, A_F2XM1, A_FABS, A_FADD, A_FADDP, A_FBLD, A_FBSTP, - A_FCHS, A_FCLEX,A_FCMOVB, A_FCMOVBE, A_FCMOVE, A_FCMOVNB, A_FCMOVNBE, A_FCMOVNE, - A_FCMOVNU, A_FCMOVU, A_FCOM, A_FCOMI, A_FCOMIP, A_FCOMP, A_FCOMPP, A_FCOS, - A_FDECSTP, A_FDISI, A_FDIV, A_FDIVP, A_FDIVR, A_FDIVRP, A_FEMMS, A_FENI, A_FFREE, - A_FIADD, A_FICOM, A_FICOMP, A_FIDIV, A_FIDIVR, A_FILD, A_FIMUL, A_FINCSTP, - A_FINIT, A_FIST, A_FISTP, A_FISTTP, A_FISUB, A_FISUBR, A_FLD, A_FLD1, A_FLDCW, - A_FLDENV, A_FLDL2E, A_FLDL2T, A_FLDLG2, A_FLDLN2, A_FLDPI, A_FLDZ, A_FMUL, - A_FMULP, A_FNCLEX, A_FNDISI, A_FNENI, A_FNINIT, A_FNOP, A_FNSAVE, A_FNSTCW, - A_FNSTENV, A_FNSTSW, A_FPATAN, A_FPREM, A_FPREM1, A_FPTAN, A_FRNDINT, A_FRSTOR, - A_FSAVE, A_FSCALE, A_FSETPM, A_FSIN, A_FSINCOS, A_FSQRT, A_FST, A_FSTCW, - A_FSTENV, A_FSTP, A_FSTSW, A_FSUB, A_FSUBP, A_FSUBR, A_FSUBRP, A_FTST, A_FUCOM, - A_FUCOMI, A_FUCOMIP, A_FUCOMP, A_FUCOMPP, A_FWAIT, A_FXAM, A_FXCH, A_FXTRACT, - A_FYL2X, A_FYL2XP1, A_HLT, A_IBTS, A_ICEBP, A_IDIV, A_IMUL, A_IN, A_INC, A_INSB, - A_INSD, A_INSW, A_INT, A_INT01, A_INT1, A_INT03, A_INT3, A_INVD, A_INVLPG, - A_IRET, A_IRETD, A_IRETW, A_IRETQ, A_JECXZ, A_JRCXZ, A_JMP, A_LAHF, A_LAR, - A_LCALL, A_LEA, A_LEAVE, A_LFS, A_LGDT, A_LGS, A_LIDT, A_LJMP, A_LLDT, A_LMSW, - A_LOADALL, A_LOADALL286, A_LOCK, A_LODSB, A_LODSD, A_LODSW, A_LOOP, A_LOOPE, - A_LOOPNE, A_LOOPNZ, A_LOOPZ, A_LSL, A_LSS, A_LTR, A_MONITOR, A_MOV, A_MOVD, - A_MOVQ, A_MOVSB, A_MOVSD, A_MOVSQ, A_MOVSW, A_MOVSX, A_MOVZX, A_MUL, A_MWAIT, - A_NEG, A_NOP, A_NOT, A_OR, A_OUT, A_OUTSB, A_OUTSD, A_OUTSW, A_PACKSSDW, - A_PACKSSWB, A_PACKUSWB, A_PADDB, A_PADDD, A_PADDSB, A_PADDSIW, A_PADDSW, - A_PADDUSB, A_PADDUSW, A_PADDW, A_PAND, A_PANDN, A_PAVEB, A_PAVGUSB, A_PCMPEQB, - A_PCMPEQD, A_PCMPEQW, A_PCMPGTB, A_PCMPGTD, A_PCMPGTW, A_PDISTIB, A_PF2ID, - A_PFACC, A_PFADD, A_PFCMPEQ, A_PFCMPGE, A_PFCMPGT, A_PFMAX, A_PFMIN, A_PFMUL, - A_PFRCP, A_PFRCPIT1, A_PFRCPIT2, A_PFRSQIT1, A_PFRSQRT, A_PFSUB, A_PFSUBR, - A_PI2FD, A_PMACHRIW, A_PMADDWD, A_PMAGW, A_PMULHRIW, A_PMULHRWA, A_PMULHRWC, - A_PMULHW, A_PMULLW, A_PMVGEZB, A_PMVLZB, A_PMVNZB, A_PMVZB, A_POP, A_POPF, - A_POPFW, A_POPFQ, A_POR, A_PREFETCH, A_PREFETCHW, A_PSLLD, A_PSLLDQ, A_PSLLQ, - A_PSLLW, A_PSRAD, A_PSRAW, A_PSRLD, A_PSRLQ, A_PSRLW, A_PSUBB, A_PSUBD, A_PSUBSB, - A_PSUBSIW, A_PSUBSW, A_PSUBUSB, A_PSUBUSW, A_PSUBW, A_PUNPCKHBW, A_PUNPCKHDQ, - A_PUNPCKHWD, A_PUNPCKLBW, A_PUNPCKLDQ, A_PUNPCKLWD, A_PUSH, A_PUSHF, A_PUSHFW, - A_PUSHFQ, A_PXOR, A_RCL, A_RCR, A_RDSHR, A_RDMSR, A_RDPMC, A_RDTSC, A_REP, - A_REPE, A_REPNE, A_REPNZ, A_REPZ, A_RET, A_RETF, A_RETN, A_RETW, A_RETFW, - A_RETNW, A_RETFD, A_RETQ, A_RETFQ, A_RETNQ, A_ROL, A_ROR, A_RSDC, A_RSLDT, A_RSM, - A_SAHF, A_SAL, A_SAR, A_SBB, A_SCASB, A_SCASD, A_SCASQ, A_SCASW, A_SEGCS, - A_SEGDS, A_SEGES, A_SEGFS, A_SEGGS, A_SEGSS, A_SGDT, A_SHL, A_SHLD, A_SHR, - A_SHRD, A_SIDT, A_SLDT, A_SMI, A_SMINT, A_SMINTOLD, A_SMSW, A_STC, A_STD, A_STI, - A_STOSB, A_STOSD, A_STOSW, A_STR, A_SUB, A_SVDC, A_SVLDT, A_SVTS, A_SYSCALL, - A_SYSENTER, A_SYSEXIT, A_SYSRET, A_TEST, A_UD1, A_UD2, A_UMOV, A_VERR, A_VERW, - A_WAIT, A_WBINVD, A_WRSHR, A_WRMSR, A_XADD, A_XBTS, A_XCHG, A_XLAT, A_XLATB, - A_XOR, A_XSTORE, A_XCRYPTECB, A_XCRYPTCBC, A_XCRYPTCFB, A_XCRYPTOFB, A_CMOVcc, - A_Jcc, A_SETcc, A_MOVS, A_CMPS, A_SCAS, A_LODS, A_STOS, A_INS, A_OUTS, A_ADDPS, - A_ADDSS, A_ANDNPS, A_ANDPS, A_CMPEQPS, A_CMPEQSS, A_CMPLEPS, A_CMPLESS, - A_CMPLTPS, A_CMPLTSS, A_CMPNEQPS, A_CMPNEQSS, A_CMPNLEPS, A_CMPNLESS, - A_CMPNLTPS, A_CMPNLTSS, A_CMPORDPS, A_CMPORDSS, A_CMPUNORDPS, A_CMPUNORDSS, - A_CMPPS, A_CMPSS, A_COMISS, A_CVTPI2PS, A_CVTPS2PI, A_CVTSI2SS, A_CVTSS2SI, - A_CVTTPS2PI, A_CVTTSS2SI, A_DIVPS, A_DIVSS, A_LDMXCSR, A_MAXPS, A_MAXSS, A_MINPS, - A_MINSS, A_MOVAPS, A_MOVHPS, A_MOVLHPS, A_MOVLPS, A_MOVHLPS, A_MOVMSKPS, - A_MOVNTPS, A_MOVSS, A_MOVUPS, A_MULPS, A_MULSS, A_ORPS, A_RCPPS, A_RCPSS, - A_RSQRTPS, A_RSQRTSS, A_SHUFPS, A_SQRTPS, A_SQRTSS, A_STMXCSR, A_SUBPS, A_SUBSS, - A_UCOMISS, A_UNPCKHPS, A_UNPCKLPS, A_XORPS, A_FXRSTOR, A_FXSAVE, A_PREFETCHNTA, - A_PREFETCHT0, A_PREFETCHT1, A_PREFETCHT2, A_SFENCE, A_MASKMOVQ, A_MOVNTQ, - A_PAVGB, A_PAVGW, A_PEXTRW, A_PINSRW, A_PMAXSW, A_PMAXUB, A_PMINSW, A_PMINUB, - A_PMOVMSKB, A_PMULHUW, A_PSADBW, A_PSHUFW, A_PFNACC, A_PFPNACC, A_PI2FW, A_PF2IW, - A_PSWAPD, A_FFREEP, A_MASKMOVDQU, A_CLFLUSH, A_MOVNTDQ, A_MOVNTI, A_MOVNTPD, - A_PAUSE, A_LFENCE, A_MFENCE, A_MOVDQA, A_MOVDQU, A_MOVDQ2Q, A_MOVQ2DQ, A_PADDQ, - A_PMULUDQ, A_PSHUFD, A_PSHUFHW, A_PSHUFLW, A_PSRLDQ, A_PSUBQ, A_PUNPCKHQDQ, - A_PUNPCKLQDQ, A_ADDPD, A_ADDSD, A_ANDNPD, A_ANDPD, A_CMPEQPD, A_CMPEQSD, - A_CMPLEPD, A_CMPLESD, A_CMPLTPD, A_CMPLTSD, A_CMPNEQPD, A_CMPNEQSD, A_CMPNLEPD, - A_CMPNLESD, A_CMPNLTPD, A_CMPNLTSD, A_CMPORDPD, A_CMPORDSD, A_CMPUNORDPD, - A_CMPUNORDSD, A_CMPPD, A_COMISD, A_CVTDQ2PD, A_CVTDQ2PS, A_CVTPD2DQ, A_CVTPD2PI, - A_CVTPD2PS, A_CVTPI2PD, A_CVTPS2DQ, A_CVTPS2PD, A_CVTSD2SI, A_CVTSD2SS, - A_CVTSI2SD, A_CVTSS2SD, A_CVTTPD2PI, A_CVTTPD2DQ, A_CVTTPS2DQ, A_CVTTSD2SI, - A_DIVPD, A_DIVSD, A_MAXPD, A_MAXSD, A_MINPD, A_MINSD, A_MOVAPD, A_MOVHPD, - A_MOVLPD, A_MOVMSKPD, A_MOVUPD, A_MULPD, A_MULSD, A_ORPD, A_SHUFPD, A_SQRTPD, - A_SQRTSD, A_SUBPD, A_SUBSD, A_UCOMISD, A_UNPCKHPD, A_UNPCKLPD, A_XORPD, - A_ADDSUBPD, A_ADDSUBPS, A_HADDPD, A_HADDPS, A_HSUBPD, A_HSUBPS, A_LDDQU, - A_MOVDDUP, A_MOVSHDUP, A_MOVSLDUP, A_VMREAD, A_VMWRITE, A_VMCALL, A_VMLAUNCH, - A_VMRESUME, A_VMXOFF, A_VMXON, A_VMCLEAR, A_VMPTRLD, A_VMPTRST, A_VMRUN, - A_VMMCALL, A_VMLOAD, A_VMSAVE, A_STGI, A_CLGI, A_SKINIT, A_INVLPGA, A_MONTMUL, - A_XSHA1, A_XSHA256, A_DMINT, A_RDM, A_MOVABS, A_MOVSXD, A_CQO, A_CDQE, - A_CMPXCHG16B, A_MOVNTSS, A_MOVNTSD, A_INSERTQ, A_EXTRQ, A_LZCNT, A_PABSB, - A_PABSW, A_PABSD, A_PALIGNR, A_PHADDW, A_PHADDD, A_PHADDSW, A_PHSUBW, A_PHSUBD, - A_PHSUBSW, A_PMADDUBSW, A_PMULHRSW, A_PSHUFB, A_PSIGNB, A_PSIGNW, A_PSIGND, - A_BLENDPS, A_BLENDPD, A_BLENDVPS, A_BLENDVPD, A_DPPS, A_DPPD, A_EXTRACTPS, - A_INSERTPS, A_MOVNTDQA, A_MPSADBW, A_PACKUSDW, A_PBLENDVB, A_PBLENDW, A_PCMPEQQ, - A_PEXTRB, A_PEXTRD, A_PEXTRQ, A_PHMINPOSUW, A_PINSRB, A_PINSRD, A_PINSRQ, A_PMAXSB, - A_PMAXSD, A_PMAXUD, A_PMAXUW, A_PMINSB, A_PMINSD, A_PMINUW, A_PMINUD, A_PMOVSXBW, - A_PMOVSXBD, A_PMOVSXBQ, A_PMOVSXWD, A_PMOVSXWQ, A_PMOVSXDQ, A_PMOVZXBW, A_PMOVZXBD, - A_PMOVZXBQ, A_PMOVZXWD, A_PMOVZXWQ, A_PMOVZXDQ, A_PMULDQ, A_PMULLD, A_PTEST, - A_ROUNDPS, A_ROUNDPD, A_ROUNDSS, A_ROUNDSD, A_CRC32, A_PCMPESTRI, A_PCMPESTRM, - A_PCMPISTRI, A_PCMPISTRM, A_PCMPGTQ, A_POPCNT, A_AESENC, A_AESENCLAST, A_AESDEC, - A_AESDECLAST, A_AESIMC, A_AESKEYGENASSIST, A_RDTSCP, A_STOSQ, A_LODSQ, A_CMPSQ, - A_VADDPD, A_VADDPS, A_VADDSD, A_VADDSS, A_VADDSUBPD, A_VADDSUBPS, A_VAESDEC, - A_VAESDECLAST, A_VAESENC, A_VAESENCLAST, A_VAESIMC, A_VAESKEYGENASSIST, A_VANDNPD, - A_VANDNPS, A_VANDPD, A_VANDPS, A_VBLENDPD, A_VBLENDPS, A_VBLENDVPD, A_VBLENDVPS, - A_VBROADCASTF128, A_VBROADCASTSD, A_VBROADCASTSS, A_VCMPEQPS, A_VCMPLTPS, - A_VCMPLEPS, A_VCMPUNORDPS, A_VCMPNEQPS, A_VCMPNLTPS, A_VCMPNLEPS, A_VCMPORDPS, - A_VCMPEQ_UQPS, A_VCMPNGEPS, A_VCMPNGTPS, A_VCMPFALSEPS, A_VCMPNEQ_OQPS, - A_VCMPGEPS, A_VCMPGTPS, A_VCMPTRUEPS, A_VCMPEQ_OSPS, A_VCMPLT_OQPS, A_VCMPLE_OQPS, - A_VCMPUNORD_SPS, A_VCMPNEQ_USPS, A_VCMPNLT_UQPS, A_VCMPNLE_UQPS, A_VCMPORD_SPS, - A_VCMPEQ_USPS, A_VCMPNGE_UQPS, A_VCMPNGT_UQPS, A_VCMPFALSE_OSPS, A_VCMPNEQ_OSPS, - A_VCMPGE_OQPS, A_VCMPGT_OQPS, A_VCMPTRUE_USPS, A_VCMPEQPD, A_VCMPLTPD, A_VCMPLEPD, - A_VCMPUNORDPD, A_VCMPNEQPD, A_VCMPNLTPD, A_VCMPNLEPD, A_VCMPORDPD, A_VCMPEQ_UQPD, - A_VCMPNGEPD, A_VCMPNGTPD, A_VCMPFALSEPD, A_VCMPNEQ_OQPD, A_VCMPGEPD, A_VCMPGTPD, - A_VCMPTRUEPD, A_VCMPEQ_OSPD, A_VCMPLT_OQPD, A_VCMPLE_OQPD, A_VCMPUNORD_SPD, - A_VCMPNEQ_USPD, A_VCMPNLT_UQPD, A_VCMPNLE_UQPD, A_VCMPORD_SPD, A_VCMPEQ_USPD, - A_VCMPNGE_UQPD, A_VCMPNGT_UQPD, A_VCMPFALSE_OSPD, A_VCMPNEQ_OSPD, A_VCMPGE_OQPD, - A_VCMPGT_OQPD, A_VCMPTRUE_USPD, A_VCMPPD, A_VCMPPS, A_VCMPSD, A_VCMPSS, A_VCOMISD, - A_VCOMISS, A_VCVTDQ2PD, A_VCVTDQ2PS, A_VCVTPD2DQ, A_VCVTPD2PS, A_VCVTPS2DQ, - A_VCVTPS2PD, A_VCVTSD2SI, A_VCVTSD2SS, A_VCVTSI2SD, A_VCVTSI2SS, A_VCVTSS2SD, - A_VCVTSS2SI, A_VCVTTPD2DQ, A_VCVTTPS2DQ, A_VCVTTSD2SI, A_VCVTTSS2SI, A_VDIVPD, - A_VDIVPS, A_VDIVSD, A_VDIVSS, A_VDPPD, A_VDPPS, A_VEXTRACTF128, A_VEXTRACTPS, - A_VHADDPD, A_VHADDPS, A_VHSUBPD, A_VHSUBPS, A_VINSERTF128, A_VINSERTPS, A_VLDDQU, - A_VLDMXCSR, A_VMASKMOVDQU, A_VMASKMOVPD, A_VMASKMOVPS, A_VMAXPD, A_VMAXPS, - A_VMAXSD, A_VMAXSS, A_VMINPD, A_VMINPS, A_VMINSD, A_VMINSS, A_VMOVAPD, A_VMOVAPS, - A_VMOVD, A_VMOVDDUP, A_VMOVDQA, A_VMOVDQU, A_VMOVHLPS, A_VMOVHPD, A_VMOVHPS, - A_VMOVLHPS, A_VMOVLPD, A_VMOVLPS, A_VMOVMSKPD, A_VMOVMSKPS, A_VMOVNTDQ, - A_VMOVNTDQA, A_VMOVNTPD, A_VMOVNTPS, A_VMOVQ, A_VMOVSD, A_VMOVSHDUP, A_VMOVSLDUP, - A_VMOVSS, A_VMOVUPD, A_VMOVUPS, A_VMPSADBW, A_VMULPD, A_VMULPS, A_VMULSD, - A_VMULSS, A_VORPD, A_VORPS, A_VPABSB, A_VPABSD, A_VPABSW, A_VPACKSSDW, - A_VPACKSSWB, A_VPACKUSDW, A_VPACKUSWB, A_VPADDB, A_VPADDD, A_VPADDQ, A_VPADDSB, - A_VPADDSW, A_VPADDUSB, A_VPADDUSW, A_VPADDW, A_VPALIGNR, A_VPAND, A_VPANDN, - A_VPAVGB, A_VPAVGW, A_VPBLENDVB, A_VPBLENDW, A_VPCLMULQDQ, A_VPCMPEQB, A_VPCMPEQD, - A_VPCMPEQQ, A_VPCMPEQW, A_VPCMPESTRI, A_VPCMPESTRM, A_VPCMPGTB, A_VPCMPGTD, - A_VPCMPGTQ, A_VPCMPGTW, A_VPCMPISTRI, A_VPCMPISTRM, A_VPERM2F128, A_VPERMILPD, - A_VPERMILPS, A_VPEXTRB, A_VPEXTRD, A_VPEXTRQ, A_VPEXTRW, A_VPHADDD, A_VPHADDSW, - A_VPHADDW, A_VPHMINPOSUW, A_VPHSUBD, A_VPHSUBSW, A_VPHSUBW, A_VPINSRB, A_VPINSRD, - A_VPINSRQ, A_VPINSRW, A_VPMADDUBSW, A_VPMADDWD, A_VPMAXSB, A_VPMAXSD, A_VPMAXSW, - A_VPMAXUB, A_VPMAXUD, A_VPMAXUW, A_VPMINSB, A_VPMINSD, A_VPMINSW, A_VPMINUB, - A_VPMINUD, A_VPMINUW, A_VPMOVMSKB, A_VPMOVSXBD, A_VPMOVSXBQ, A_VPMOVSXBW, - A_VPMOVSXDQ, A_VPMOVSXWD, A_VPMOVSXWQ, A_VPMOVZXBD, A_VPMOVZXBQ, A_VPMOVZXBW, - A_VPMOVZXDQ, A_VPMOVZXWD, A_VPMOVZXWQ, A_VPMULDQ, A_VPMULHRSW, A_VPMULHUW, - A_VPMULHW, A_VPMULLD, A_VPMULLW, A_VPMULUDQ, A_VPOR, A_VPSADBW, A_VPSHUFB, - A_VPSHUFD, A_VPSHUFHW, A_VPSHUFLW, A_VPSIGNB, A_VPSIGND, A_VPSIGNW, A_VPSLLD, - A_VPSLLDQ, A_VPSLLQ, A_VPSLLW, A_VPSRAD, A_VPSRAW, A_VPSRLD, A_VPSRLDQ, A_VPSRLQ, - A_VPSRLW, A_VPSUBB, A_VPSUBD, A_VPSUBQ, A_VPSUBSB, A_VPSUBSW, A_VPSUBUSB, - A_VPSUBUSW, A_VPSUBW, A_VPTEST, A_VPUNPCKHBW, A_VPUNPCKHDQ, A_VPUNPCKHQDQ, - A_VPUNPCKHWD, A_VPUNPCKLBW, A_VPUNPCKLDQ, A_VPUNPCKLQDQ, A_VPUNPCKLWD, A_VPXOR, - A_VRCPPS, A_VRCPSS, A_VROUNDPD, A_VROUNDPS, A_VROUNDSD, A_VROUNDSS, A_VRSQRTPS, - A_VRSQRTSS, A_VSHUFPD, A_VSHUFPS, A_VSQRTPD, A_VSQRTPS, A_VSQRTSD, A_VSQRTSS, - A_VSTMXCSR, A_VSUBPD, A_VSUBPS, A_VSUBSD, A_VSUBSS, A_VTESTPD, A_VTESTPS, - A_VUCOMISD, A_VUCOMISS, A_VUNPCKHPD, A_VUNPCKHPS, A_VUNPCKLPD, A_VUNPCKLPS, - A_VXORPD, A_VXORPS, A_VZEROALL, A_VZEROUPPER, A_ANDN, A_BEXTR, A_TZCNT, A_BZHI, - A_MULX, A_PDEP, A_PEXT, A_RORX, A_SARX, A_SHLX, A_SHRX, A_VBROADCASTI128, - A_VEXTRACTI128, A_VINSERTI128, A_VPBLENDD, A_VPBROADCASTB, A_VPBROADCASTD, - A_VPBROADCASTQ, A_VPBROADCASTW, A_VPERM2I128, A_VPERMD); - -const - ExtremeRange1Expected: array[0..1023] of Byte = ( - $00, $00, $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 0 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 16 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 32 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 48 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 64 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 80 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 96 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 112 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 128 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $09, { 144 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 160 } - $00, $00, $00, $00, $00, $00, $00, $02, $00, $00, $00, $08, $00, $00, $03, $03, { 176 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 192 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 208 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 224 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 240 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 256 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 272 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 288 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $0B, $00, $00, $00, $00, { 304 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $0B, $00, $00, $00, $00, $00, $00, { 320 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $0A, $00, $00, $00, $00, $00, { 336 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 352 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $0C, $00, $00, $00, $00, $00, $00, { 368 } - $00, $00, $07, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 384 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 400 } - $00, $00, $00, $00, $00, $05, $00, $00, $00, $00, $00, $00, $08, $05, $00, $07, { 416 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 432 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 448 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 464 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 480 } - $07, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 496 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 512 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $05, $00, $00, $00, $05, { 528 } - $00, $07, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 544 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 560 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 576 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 592 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 608 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 624 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 640 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 656 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $06, $06, $00, $00, $00, $00, { 672 } - $00, $00, $00, $00, $00, $00, $06, $06, $00, $00, $00, $00, $00, $00, $00, $00, { 688 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 704 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 720 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 736 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 752 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 768 } - $00, $00, $00, $00, $00, $00, $00, $06, $06, $00, $00, $00, $00, $00, $00, $00, { 784 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 800 } - $04, $04, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 816 } - $00, $00, $00, $08, $00, $00, $08, $04, $04, $00, $00, $00, $06, $06, $06, $06, { 832 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 848 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 864 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 880 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 896 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 912 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 928 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 944 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 960 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $06, $06, $00, { 976 } - $00, $00, $00, $00, $00, $00, $00, $06, $06, $00, $00, $00, $00, $00, $00, $00, { 992 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 { 1008 } - ); - - ExtremeRange2Expected: array[0..1023] of Byte = ( - $00, $00, $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 0 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 16 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 32 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 48 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 64 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 80 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 96 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 112 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 128 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $09, { 144 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 160 } - $00, $00, $00, $00, $00, $00, $00, $02, $00, $00, $00, $26, $00, $00, $0D, $03, { 176 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 192 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 208 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 224 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 240 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 256 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 272 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 288 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $0B, $00, $00, $00, $00, { 304 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $27, $00, $00, $00, $00, $00, $00, { 320 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $0A, $00, $00, $00, $00, $00, { 336 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 352 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $0C, $00, $00, $00, $00, $00, $00, { 368 } - $00, $00, $07, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 384 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 400 } - $00, $00, $00, $00, $00, $12, $00, $00, $00, $00, $00, $00, $08, $05, $00, $22, { 416 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 432 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 448 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 464 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 480 } - $23, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 496 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 512 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $11, $00, $00, $00, $13, { 528 } - $00, $21, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 544 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 560 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 576 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 592 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 608 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 624 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 640 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 656 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $1A, $1B, $00, $00, $00, $00, { 672 } - $00, $00, $00, $00, $00, $00, $1C, $1D, $00, $00, $00, $00, $00, $00, $00, $00, { 688 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 704 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 720 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 736 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 752 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 768 } - $00, $00, $00, $00, $00, $00, $00, $14, $15, $00, $00, $00, $00, $00, $00, $00, { 784 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 800 } - $0F, $0E, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 816 } - $00, $00, $00, $24, $00, $00, $25, $04, $10, $00, $00, $00, $18, $19, $1E, $1F, { 832 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 848 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 864 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 880 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 896 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 912 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 928 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 944 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 960 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $16, $17, $00, { 976 } - $00, $00, $00, $00, $00, $00, $00, $20, $06, $00, $00, $00, $00, $00, $00, $00, { 992 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 { 1008 } - ); - - ExtremeRange3Expected: array[0..1023] of Byte = ( - $00, $00, $44, $01, $3F, $40, $00, $00, $00, $41, $42, $00, $00, $00, $00, $00, { 0 } - $00, $00, $00, $45, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 16 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 32 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 48 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 64 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 80 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 96 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 112 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 128 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $09, { 144 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 160 } - $00, $00, $00, $00, $00, $00, $00, $02, $00, $00, $00, $26, $00, $00, $0D, $03, { 176 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 192 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 208 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 224 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 240 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 256 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 272 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 288 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $0B, $00, $00, $00, $00, { 304 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $27, $00, $00, $00, $00, $00, $00, { 320 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $0A, $00, $00, $00, $00, $00, { 336 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 352 } - $00, $43, $00, $00, $00, $00, $00, $00, $00, $0C, $00, $00, $00, $00, $00, $00, { 368 } - $00, $00, $07, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 384 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 400 } - $00, $00, $00, $00, $00, $12, $00, $00, $00, $00, $00, $00, $08, $05, $00, $22, { 416 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 432 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 448 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 464 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 480 } - $23, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 496 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 512 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $11, $00, $00, $00, $13, { 528 } - $00, $21, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 544 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 560 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 576 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 592 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $33, $34, $00, $00, $00, { 608 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 624 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 640 } - $00, $00, $00, $2E, $2F, $30, $31, $32, $00, $00, $00, $00, $00, $00, $00, $00, { 656 } - $00, $00, $00, $00, $00, $00, $00, $00, $2C, $2D, $1A, $1B, $00, $00, $35, $36, { 672 } - $37, $38, $39, $3A, $00, $00, $1C, $1D, $00, $00, $00, $00, $29, $00, $00, $00, { 688 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 704 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 720 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 736 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 752 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 768 } - $00, $00, $00, $00, $00, $00, $00, $14, $15, $00, $00, $00, $00, $00, $00, $00, { 784 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 800 } - $0F, $0E, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 816 } - $00, $00, $00, $24, $00, $00, $25, $04, $10, $00, $00, $00, $18, $19, $1E, $1F, { 832 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 848 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 864 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 880 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 896 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 912 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $3B, $3C, $3D, $3E, $00, $00, $00, { 928 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 944 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 960 } - $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $16, $17, $00, { 976 } - $00, $00, $00, $00, $00, $00, $00, $20, $06, $00, $00, $00, $00, $00, $00, $28, { 992 } - $00, $00, $00, $00, $46, $47, $2A, $00, $00, $00, $00, $00, $00, $00, $00, $2B { 1008 } - ); - -{ TTestAncestor } -type - TTestAncestor = class - private - FStartTime: Real; - FEndTime: Real; - FAvgTime: Real; - procedure SetStartTime; - procedure SetEndTime; - protected - procedure DoTestIteration(Iteration: Integer); virtual; abstract; - public - constructor Create; virtual; - destructor Destroy; override; - procedure Run; - function TestTitle: shortstring; virtual; abstract; - function WriteResults: Boolean; virtual; abstract; - property RunTime: Real read FAvgTime; - end; - - TTestClass = class of TTestAncestor; - - TByteTest = class(TTestAncestor) - protected - FResultStorage: array[Byte] of Byte; - end; - - TWordTest = class(TTestAncestor) - protected - FResultStorage: array[Word] of Byte; - end; - - TMappedTest = class(TByteTest) - protected - procedure DoMapping(Index, Input: Integer); virtual; abstract; - end; - - TCompleteByteRange = class(TMappedTest) - protected - procedure DoTestIteration(Iteration: Integer); override; - procedure DoMapping(Index, Input: Integer); override; - public - function TestTitle: shortstring; override; - function WriteResults: Boolean; override; - end; - - TCompleteByteRangeFirstWeighted = class(TCompleteByteRange) - protected - procedure DoTestIteration(Iteration: Integer); override; - public - function TestTitle: shortstring; override; - function WriteResults: Boolean; override; - end; - - TCompleteByteRangeLastWeighted = class(TCompleteByteRange) - protected - procedure DoTestIteration(Iteration: Integer); override; - public - function TestTitle: shortstring; override; - function WriteResults: Boolean; override; - end; - - TAlmostFullByteRange = class(TMappedTest) - protected - procedure DoTestIteration(Iteration: Integer); override; - procedure DoMapping(Index, Input: Integer); override; - public - function TestTitle: shortstring; override; - function WriteResults: Boolean; override; - end; - - TAlmostFullByteRangeFirstWeighted = class(TAlmostFullByteRange) - protected - procedure DoTestIteration(Iteration: Integer); override; - public - function TestTitle: shortstring; override; - function WriteResults: Boolean; override; - end; - - TAlmostFullByteRangeLastWeighted = class(TAlmostFullByteRange) - protected - procedure DoTestIteration(Iteration: Integer); override; - public - function TestTitle: shortstring; override; - function WriteResults: Boolean; override; - end; - - TSingleEntryWithDefault = class(TByteTest) - protected - procedure DoTestIteration(Iteration: Integer); override; - public - function TestTitle: shortstring; override; - function WriteResults: Boolean; override; - end; - - TSingleEntryWithDefaultUnlikely = class(TByteTest) - protected - procedure DoTestIteration(Iteration: Integer); override; - public - function TestTitle: shortstring; override; - function WriteResults: Boolean; override; - end; - - TSingleEntryWithDefaultWeighted = class(TByteTest) - protected - procedure DoTestIteration(Iteration: Integer); override; - public - function TestTitle: shortstring; override; - function WriteResults: Boolean; override; - end; - - TSingleEntryWithElse = class(TSingleEntryWithDefault) - protected - procedure DoTestIteration(Iteration: Integer); override; - public - function TestTitle: shortstring; override; - end; - - TSingleEntryWithElseUnlikely = class(TSingleEntryWithDefaultUnlikely) - protected - procedure DoTestIteration(Iteration: Integer); override; - public - function TestTitle: shortstring; override; - end; - - TSingleEntryWithElseWeighted = class(TSingleEntryWithDefaultWeighted) - protected - procedure DoTestIteration(Iteration: Integer); override; - public - function TestTitle: shortstring; override; - end; - - TSingleEntryAtZeroWithElse = class(TByteTest) - protected - procedure DoTestIteration(Iteration: Integer); override; - public - function TestTitle: shortstring; override; - function WriteResults: Boolean; override; - end; - - TSingleEntryAtMinus1WithDefault = class(TByteTest) - protected - procedure DoTestIteration(Iteration: Integer); override; - public - function TestTitle: shortstring; override; - function WriteResults: Boolean; override; - end; - - TSingleEntryAtMinus4WithElse = class(TByteTest) - protected - procedure DoTestIteration(Iteration: Integer); override; - public - function TestTitle: shortstring; override; - function WriteResults: Boolean; override; - end; - - TSingleEntryWith0To5RangeWithElse = class(TByteTest) - protected - procedure DoTestIteration(Iteration: Integer); override; - public - function TestTitle: shortstring; override; - function WriteResults: Boolean; override; - end; - - TSingleEntryWith0To50RangeWithElse = class(TByteTest) - protected - procedure DoTestIteration(Iteration: Integer); override; - public - function TestTitle: shortstring; override; - function WriteResults: Boolean; override; - end; - - TSingleEntryWith1To5RangeWithElse = class(TByteTest) - protected - procedure DoTestIteration(Iteration: Integer); override; - public - function TestTitle: shortstring; override; - function WriteResults: Boolean; override; - end; - - TSingleEntryWith1To50RangeWithElse = class(TByteTest) - protected - procedure DoTestIteration(Iteration: Integer); override; - public - function TestTitle: shortstring; override; - function WriteResults: Boolean; override; - end; - - TSingleEntryWithMinus1To5RangeWithElse = class(TByteTest) - protected - procedure DoTestIteration(Iteration: Integer); override; - public - function TestTitle: shortstring; override; - function WriteResults: Boolean; override; - end; - - TSingleEntryWithMinus1To50RangeWithElse = class(TByteTest) - protected - procedure DoTestIteration(Iteration: Integer); override; - public - function TestTitle: shortstring; override; - function WriteResults: Boolean; override; - end; - - TExtremeRange1 = class(TWordTest) - protected - procedure DoTestIteration(Iteration: Integer); override; - public - function TestTitle: shortstring; override; - function WriteResults: Boolean; override; - end; - - TExtremeRange2 = class(TWordTest) - protected - procedure DoTestIteration(Iteration: Integer); override; - public - function TestTitle: shortstring; override; - function WriteResults: Boolean; override; - end; - - TExtremeRange3 = class(TWordTest) - protected - procedure DoTestIteration(Iteration: Integer); override; - public - function TestTitle: shortstring; override; - function WriteResults: Boolean; override; - end; - - TExtremeRange4 = class(TWordTest) - protected - procedure DoTestIteration(Iteration: Integer); override; - public - function TestTitle: shortstring; override; - function WriteResults: Boolean; override; - end; - - TSparseDataTest1 = class(TWordTest) - protected - procedure DoCaseBlock(Index: Integer; Input: TInstructionSet); inline; - end; - - TSparseDataEqual1 = class(TSparseDataTest1) - protected - procedure DoTestIteration(Iteration: Integer); override; - public - function TestTitle: shortstring; override; - function WriteResults: Boolean; override; - end; - - TSparseDataMOVWeighted1 = class(TSparseDataTest1) - protected - procedure DoTestIteration(Iteration: Integer); override; - public - function TestTitle: shortstring; override; - function WriteResults: Boolean; override; - end; - - TSparseDataMidpointWeighted1 = class(TSparseDataTest1) - protected - procedure DoTestIteration(Iteration: Integer); override; - public - function TestTitle: shortstring; override; - function WriteResults: Boolean; override; - end; - - TSparseDataTest2 = class(TWordTest) - protected - procedure DoCaseBlock(Index: Integer; Input: TInstructionSet); inline; - end; - - TSparseDataEqual2 = class(TSparseDataTest2) - protected - procedure DoTestIteration(Iteration: Integer); override; - public - function TestTitle: shortstring; override; - function WriteResults: Boolean; override; - end; - - TSparseDataMOVWeighted2 = class(TSparseDataTest2) - protected - procedure DoTestIteration(Iteration: Integer); override; - public - function TestTitle: shortstring; override; - function WriteResults: Boolean; override; - end; - - TSparseDataMidpointWeighted2 = class(TSparseDataTest2) - protected - procedure DoTestIteration(Iteration: Integer); override; - public - function TestTitle: shortstring; override; - function WriteResults: Boolean; override; - end; - - TSparseDataTest3 = class(TWordTest) - protected - procedure DoCaseBlock(Index: Integer; Input: TInstructionSet); inline; - end; - - TSparseDataEqual3 = class(TSparseDataTest3) - protected - procedure DoTestIteration(Iteration: Integer); override; - public - function TestTitle: shortstring; override; - function WriteResults: Boolean; override; - end; - - TSparseDataMOVWeighted3 = class(TSparseDataTest3) - protected - procedure DoTestIteration(Iteration: Integer); override; - public - function TestTitle: shortstring; override; - function WriteResults: Boolean; override; - end; - - TSparseDataMidpointWeighted3 = class(TSparseDataTest3) - protected - procedure DoTestIteration(Iteration: Integer); override; - public - function TestTitle: shortstring; override; - function WriteResults: Boolean; override; - end; - - TLinearListDependsOnInput = class(TByteTest) - protected - procedure DoTestIteration(Iteration: Integer); override; - public - function TestTitle: shortstring; override; - function WriteResults: Boolean; override; - end; - - TCStyleCascade = class(TByteTest) - protected - procedure DoTestIteration(Iteration: Integer); override; - public - function TestTitle: shortstring; override; - function WriteResults: Boolean; override; - end; - -{ TTestAncestor } -constructor TTestAncestor.Create; - begin - FStartTime := 0; - FEndTime := 0; - FAvgTime := 0; - end; - -destructor TTestAncestor.Destroy; - begin - inherited Destroy; - end; - -procedure TTestAncestor.SetStartTime; - begin - FStartTime := GetRealTime(); - end; - -procedure TTestAncestor.SetEndTime; - begin - FEndTime := GetRealTime(); - if FEndTime < FStartTime then { Happens if the test runs past midnight } - FEndTime := FEndTime + 86400.0; - end; - -procedure TTestAncestor.Run; - var - X: Integer; - begin - SetStartTime; - for X := 0 to ITERATIONS - 1 do - DoTestIteration(X); - - SetEndTime; - - FAvgTime := FEndTime - FStartTime; - end; - -{ TCompleteByteRange } -function TCompleteByteRange.TestTitle: shortstring; - begin - Result := 'Byte domain, entirely covered; equal polling'; - end; - -function TCompleteByteRange.WriteResults: Boolean; - var - X: Byte; - begin - Result := True; - - for X := 0 to 255 do - if FResultStorage[X] <> AES_S_Box[X] then - begin - WriteLn('FAIL - Index ', X, '; expected $', hexstr(AES_S_Box[X], 2), ' got $', hexstr(FResultStorage[X], 2)); - Result := False; - Exit; - end; - end; - -procedure TCompleteByteRange.DoMapping(Index, Input: Integer); - begin - case Input of - { First row of S-Box (except zero) } - $00: FResultStorage[Index] := $63; - $01: FResultStorage[Index] := $7c; - $02: FResultStorage[Index] := $77; - $03: FResultStorage[Index] := $7b; - $04: FResultStorage[Index] := $f2; - $05: FResultStorage[Index] := $6b; - $06: FResultStorage[Index] := $6f; - $07: FResultStorage[Index] := $c5; - $08: FResultStorage[Index] := $30; - $09: FResultStorage[Index] := $01; - $0A: FResultStorage[Index] := $67; - $0B: FResultStorage[Index] := $2b; - $0C: FResultStorage[Index] := $fe; - $0D: FResultStorage[Index] := $d7; - $0E: FResultStorage[Index] := $ab; - $0F: FResultStorage[Index] := $76; - {Last row of S-Box } - $F0: FResultStorage[Index] := $8c; - $F1: FResultStorage[Index] := $a1; - $F2: FResultStorage[Index] := $89; - $F3: FResultStorage[Index] := $0d; - $F4: FResultStorage[Index] := $bf; - $F5: FResultStorage[Index] := $e6; - $F6: FResultStorage[Index] := $42; - $F7: FResultStorage[Index] := $68; - $F8: FResultStorage[Index] := $41; - $F9: FResultStorage[Index] := $99; - $FA: FResultStorage[Index] := $2d; - $FB: FResultStorage[Index] := $0f; - $FC: FResultStorage[Index] := $b0; - $FD: FResultStorage[Index] := $54; - $FE: FResultStorage[Index] := $bb; - $FF: FResultStorage[Index] := $16; - { Everything else } - $10..$EF: FResultStorage[Index] := AES_S_Box[Input]; - end; - end; - -procedure TCompleteByteRange.DoTestIteration(Iteration: Integer); - var - Input: Byte; - begin - Input := Iteration and $FF; - DoMapping(Input, Input); - end; - -{ TCompleteByteRangeFirstWeighted } - -function TCompleteByteRangeFirstWeighted.TestTitle: shortstring; - begin - Result := 'Byte domain, entirely covered; first weighted'; - end; - -function TCompleteByteRangeFirstWeighted.WriteResults: Boolean; - var - X: Byte; - begin - Result := True; - - for X := 0 to 255 do - if FResultStorage[X] <> FirstWeighted[X] then - begin - WriteLn('FAIL - Index ', X, '; expected $', hexstr(FirstWeighted[X], 2), ' got $', hexstr(FResultStorage[X], 2)); - Result := False; - Exit; - end; - end; - -procedure TCompleteByteRangeFirstWeighted.DoTestIteration(Iteration: Integer); - var - Input: Byte; - begin - Input := Iteration and $FF; - if Input < $C0 then - DoMapping(Input, 0) - else - DoMapping(Input, Input); - end; - -{ TCompleteByteRangeLastWeighted } - -function TCompleteByteRangeLastWeighted.TestTitle: shortstring; - begin - Result := 'Byte domain, entirely covered; last weighted'; - end; - -function TCompleteByteRangeLastWeighted.WriteResults: Boolean; - var - X: Byte; - begin - Result := True; - - for X := 0 to 255 do - if FResultStorage[X] <> LastWeighted[X] then - begin - WriteLn('FAIL - Index ', X, '; expected $', hexstr(LastWeighted[X], 2), ' got $', hexstr(FResultStorage[X], 2)); - Result := False; - Exit; - end; - end; - -procedure TCompleteByteRangeLastWeighted.DoTestIteration(Iteration: Integer); - var - Input: Byte; - begin - Input := Iteration and $FF; - if Input < $C0 then - DoMapping(Input, $FF) - else - DoMapping(Input, Input); - end; - -{ TAlmostFullByteRange } - -function TAlmostFullByteRange.TestTitle: shortstring; - begin - Result := 'Byte domain, almost entirely covered; equal polling'; - end; - -function TAlmostFullByteRange.WriteResults: Boolean; - var - X: Byte; - begin - Result := True; - - for X := 0 to 255 do - if FResultStorage[X] <> AlmostFullExpected[X] then - begin - WriteLn('FAIL - Index ', X, '; expected $', hexstr(AlmostFullExpected[X], 2), ' got $', hexstr(FResultStorage[X], 2)); - Result := False; - Exit; - end; - end; - -procedure TAlmostFullByteRange.DoMapping(Index, Input: Integer); - begin - case Input of - { First row of S-Box } - $00: FResultStorage[Index] := $63; - $01: FResultStorage[Index] := $7c; - $02: FResultStorage[Index] := $77; - $03: FResultStorage[Index] := $7b; - $04: FResultStorage[Index] := $f2; - $05: FResultStorage[Index] := $6b; - $06: FResultStorage[Index] := $6f; - $07: FResultStorage[Index] := $c5; - $08: FResultStorage[Index] := $30; - $09: FResultStorage[Index] := $01; - $0A: FResultStorage[Index] := $67; - $0B: FResultStorage[Index] := $2b; - $0C: FResultStorage[Index] := $fe; - $0D: FResultStorage[Index] := $d7; - $0E: FResultStorage[Index] := $ab; - $0F: FResultStorage[Index] := $76; - { Other rows } - $10..$3F: FResultStorage[Index] := AES_S_Box[Input]; - $60..$FF: FResultStorage[Index] := AES_S_Box[Input]; - { Zeroed rows } - else FResultStorage[Index] := $00; - end; - end; - -procedure TAlmostFullByteRange.DoTestIteration(Iteration: Integer); - var - Input: Byte; - begin - Input := Iteration and $FF; - DoMapping(Input, Input); - end; - -{ TAlmostFullByteRangeFirstWeighted } - -function TAlmostFullByteRangeFirstWeighted.TestTitle: shortstring; - begin - Result := 'Byte domain, almost entirely covered; first weighted'; - end; - -function TAlmostFullByteRangeFirstWeighted.WriteResults: Boolean; - var - X: Byte; - begin - Result := True; - - for X := 0 to 255 do - if FResultStorage[X] <> FirstWeighted[X] then - begin - WriteLn('FAIL - Index ', X, '; expected $', hexstr(FirstWeighted[X], 2), ' got $', hexstr(FResultStorage[X], 2)); - Result := False; - Exit; - end; - end; - -procedure TAlmostFullByteRangeFirstWeighted.DoTestIteration(Iteration: Integer); - var - Input: Byte; - begin - Input := Iteration and $FF; - if Input < $C0 then - DoMapping(Input, 0) - else - DoMapping(Input, Input); - end; - -{ TAlmostFullByteRangeLastWeighted } - -function TAlmostFullByteRangeLastWeighted.TestTitle: shortstring; - begin - Result := 'Byte domain, almost entirely covered; last weighted'; - end; - -function TAlmostFullByteRangeLastWeighted.WriteResults: Boolean; - var - X: Byte; - begin - Result := True; - - for X := 0 to 255 do - if FResultStorage[X] <> LastWeighted[X] then - begin - WriteLn('FAIL - Index ', X, '; expected $', hexstr(LastWeighted[X], 2), ' got $', hexstr(FResultStorage[X], 2)); - Result := False; - Exit; - end; - end; - -procedure TAlmostFullByteRangeLastWeighted.DoTestIteration(Iteration: Integer); - var - Input: Byte; - begin - Input := Iteration and $FF; - if Input < $C0 then - DoMapping(Input, $FF) - else - DoMapping(Input, Input); - end; - -{ TSingleEntryWithDefault } -function TSingleEntryWithDefault.TestTitle: shortstring; - begin - Result := 'Single entry with default value; 1/256 match chance'; - end; - -function TSingleEntryWithDefault.WriteResults: Boolean; - var - X: Byte; - begin - Result := True; - - for X := 0 to 255 do - if FResultStorage[X] <> IIf(X = 71, 1, 0) then - begin - WriteLn('FAIL - Index ', X, '; expected $', hexstr(IIf(X = 71, 1, 0), 2), ' got $', hexstr(FResultStorage[X], 2)); - Result := False; - Exit; - end; - end; - -procedure TSingleEntryWithDefault.DoTestIteration(Iteration: Integer); - var - Index: Byte; - begin - Index := Iteration and $FF; - FResultStorage[Index] := 0; - case Index of - 71: FResultStorage[Index] := 1; - end; - end; - -{ TSingleEntryWithDefaultUnlikely } - -function TSingleEntryWithDefaultUnlikely.TestTitle: shortstring; - begin - Result := 'Single entry with default value; 75% match chance'; - end; - -function TSingleEntryWithDefaultUnlikely.WriteResults: Boolean; - var - X: Byte; - begin - Result := True; - - for X := 0 to 255 do - if FResultStorage[X] <> IIf(((X and $2) shr 1) or (X and $1) = 1, 1, 0) then - begin - WriteLn('FAIL - Index ', X, '; expected $', hexstr(IIf(((X and $2) shr 1) or (X and $1) = 1, 1, 0), 2), ' got $', hexstr(FResultStorage[X], 2)); - Result := False; - Exit; - end; - end; - -procedure TSingleEntryWithDefaultUnlikely.DoTestIteration(Iteration: Integer); - var - Index: Byte; - begin - Index := Iteration and $FF; - FResultStorage[Index] := 0; - case ((Index and $2) shr 1) or (Index and $1) of - 1: FResultStorage[Index] := 1; - end; - end; - -{ TSingleEntryWithDefaultWeighted } - -function TSingleEntryWithDefaultWeighted.TestTitle: shortstring; - begin - Result := 'Single entry with default value; 25% match chance'; - end; - -function TSingleEntryWithDefaultWeighted.WriteResults: Boolean; - var - X: Byte; - begin - Result := True; - - for X := 0 to 255 do - if FResultStorage[X] <> IIf(((X and $2) shr 1) and (X and $1) = 1, 1, 0) then - begin - WriteLn('FAIL - Index ', X, '; expected $', hexstr(IIf(((X and $2) shr 1) and (X and $1) = 1, 1, 0), 2), ' got $', hexstr(FResultStorage[X], 2)); - Result := False; - Exit; - end; - end; - -procedure TSingleEntryWithDefaultWeighted.DoTestIteration(Iteration: Integer); - var - Index: Byte; - begin - Index := Iteration and $FF; - FResultStorage[Index] := 0; - case ((Index and $2) shr 1) and (Index and $1) of - 1: FResultStorage[Index] := 1; - end; - end; - -{ TSingleEntryWithElse } -function TSingleEntryWithElse.TestTitle: shortstring; - begin - Result := 'Single entry with else block; 1/256 match chance'; - end; - -procedure TSingleEntryWithElse.DoTestIteration(Iteration: Integer); - var - Index: Byte; - begin - Index := Iteration and $FF; - { This helps catch errors where all branches, including else, are skipped } - FResultStorage[Index] := $FF; - case Index of - 71: FResultStorage[Index] := 1; - else FResultStorage[Index] := 0; - end; - end; - -{ TSingleEntryWithElseUnlikely } -function TSingleEntryWithElseUnlikely.TestTitle: shortstring; - begin - Result := 'Single entry with else block; 75% match chance'; - end; - -procedure TSingleEntryWithElseUnlikely.DoTestIteration(Iteration: Integer); - var - Index: Byte; - begin - Index := Iteration and $FF; - { This helps catch errors where all branches, including else, are skipped } - FResultStorage[Index] := $FF; - case ((Index and $2) shr 1) or (Index and $1) of - 1: FResultStorage[Index] := 1; - else FResultStorage[Index] := 0; - end; - end; - -{ TSingleEntryWithElseWeighted } - -function TSingleEntryWithElseWeighted.TestTitle: shortstring; - begin - Result := 'Single entry with else block; 25% match chance'; - end; - -procedure TSingleEntryWithElseWeighted.DoTestIteration(Iteration: Integer); - var - Index: Byte; - begin - Index := Iteration and $FF; - { This helps catch errors where all branches, including else, are skipped } - FResultStorage[Index] := $FF; - case ((Index and $2) shr 1) and (Index and $1) of - 1: FResultStorage[Index] := 1; - else FResultStorage[Index] := 0; - end; - end; - -{ TSingleEntryAtZeroWithElse } - -function TSingleEntryAtZeroWithElse.TestTitle: shortstring; - begin - Result := 'Single entry of "0:" and else block'; - end; - -function TSingleEntryAtZeroWithElse.WriteResults: Boolean; - var - X: Word; - begin - Result := True; - - if FResultStorage[0] <> 1 then - begin - WriteLn('FAIL - Index 0; expected $01 got $', hexstr(FResultStorage[0], 2)); - Result := False; - Exit; - end; - - for X := 1 to $FF do - if FResultStorage[X] <> 0 then - begin - WriteLn('FAIL - Index ', X, '; expected $00 got $', hexstr(FResultStorage[X], 2)); - Result := False; - Exit; - end; - end; - -procedure TSingleEntryAtZeroWithElse.DoTestIteration(Iteration: Integer); - var - Index: Byte; - begin - Index := Iteration and $FF; - { This helps catch errors where all branches, including else, are skipped } - FResultStorage[Index] := $FF; - case Index of - 0: FResultStorage[Index] := 1; - else FResultStorage[Index] := 0; - end; - end; - -{ TSingleEntryAtMinus1WithDefault } - -function TSingleEntryAtMinus1WithDefault.TestTitle: shortstring; - begin - Result := 'Single entry of "-1:" with default value'; - end; - -function TSingleEntryAtMinus1WithDefault.WriteResults: Boolean; - var - X: Word; - begin - Result := True; - - for X := 0 to $FE do - if FResultStorage[X] <> 0 then - begin - WriteLn('FAIL - Index ', X, '; expected $00 got $', hexstr(FResultStorage[X], 2)); - Result := False; - Exit; - end; - - if FResultStorage[255] <> 1 then - begin - WriteLn('FAIL - Index 255; expected $01 got $', hexstr(FResultStorage[0], 2)); - Result := False; - Exit; - end; - end; - -procedure TSingleEntryAtMinus1WithDefault.DoTestIteration(Iteration: Integer); - var - Index: ShortInt; - begin - Index := ShortInt(Iteration and $FF); - FResultStorage[Byte(Index)] := 0; - case Index of - -1: FResultStorage[255] := 1; - end; - end; - -{ TSingleEntryAtMinus4WithElse } - -function TSingleEntryAtMinus4WithElse.TestTitle: shortstring; - begin - Result := 'Single entry of "-4:" and else block'; - end; - -function TSingleEntryAtMinus4WithElse.WriteResults: Boolean; - var - X: Word; - begin - Result := True; - for X := 0 to 251 do - if FResultStorage[X] <> 0 then - begin - WriteLn('FAIL - Index ', X, '; expected $00 got $', hexstr(FResultStorage[X], 2)); - Result := False; - Exit; - end; - - if FResultStorage[252] <> 1 then - begin - WriteLn('FAIL - Index 0; expected $01 got $', hexstr(FResultStorage[252], 2)); - Result := False; - Exit; - end; - - for X := 253 to 255 do - if FResultStorage[X] <> 0 then - begin - WriteLn('FAIL - Index ', X, '; expected $00 got $', hexstr(FResultStorage[X], 2)); - Result := False; - Exit; - end; - end; - -procedure TSingleEntryAtMinus4WithElse.DoTestIteration(Iteration: Integer); - var - Index: ShortInt; - begin - Index := ShortInt(Iteration and $FF); - { This helps catch errors where all branches, including else, are skipped } - FResultStorage[Byte(Index)] := $FF; - case Index of - -4: FResultStorage[Index] := 1; - else FResultStorage[Index] := 0; - end; - end; - -{ TSingleEntryWith0To5RangeWithElse } - -function TSingleEntryWith0To5RangeWithElse.TestTitle: shortstring; - begin - Result := 'Single entry of "0..5" and else block'; - end; - -function TSingleEntryWith0To5RangeWithElse.WriteResults: Boolean; - var - X: Word; - begin - Result := True; - - for X := 0 to 5 do - if FResultStorage[X] <> 1 then - begin - WriteLn('FAIL - Index ', X, '; expected $01 got $', hexstr(FResultStorage[X], 2)); - Result := False; - Exit; - end; - - for X := 6 to $FF do - if FResultStorage[X] <> 0 then - begin - WriteLn('FAIL - Index ', X, '; expected $00 got $', hexstr(FResultStorage[X], 2)); - Result := False; - Exit; - end; - end; - -procedure TSingleEntryWith0To5RangeWithElse.DoTestIteration(Iteration: Integer); - var - Index: Byte; - begin - Index := Iteration and $FF; - { This helps catch errors where all branches, including else, are skipped } - FResultStorage[Index] := $FF; - case Index of - 0..5: FResultStorage[Index] := 1; - else FResultStorage[Index] := 0; - end; - end; - -{ TSingleEntryWith0To50RangeWithElse } - -function TSingleEntryWith0To50RangeWithElse.TestTitle: shortstring; - begin - Result := 'Single entry of "0..50" and else block'; - end; - -function TSingleEntryWith0To50RangeWithElse.WriteResults: Boolean; - var - X: Word; - begin - Result := True; - - for X := 0 to 50 do - if FResultStorage[X] <> 1 then - begin - WriteLn('FAIL - Index ', X, '; expected $01 got $', hexstr(FResultStorage[X], 2)); - Result := False; - Exit; - end; - - for X := 51 to $FF do - if FResultStorage[X] <> 0 then - begin - WriteLn('FAIL - Index ', X, '; expected $00 got $', hexstr(FResultStorage[X], 2)); - Result := False; - Exit; - end; - end; - -procedure TSingleEntryWith0To50RangeWithElse.DoTestIteration(Iteration: Integer); - var - Index: Byte; - begin - Index := Iteration and $FF; - { This helps catch errors where all branches, including else, are skipped } - FResultStorage[Index] := $FF; - case Index of - 0..50: FResultStorage[Index] := 1; - else FResultStorage[Index] := 0; - end; - end; - -{ TSingleEntryWith1To5RangeWithElse } - -function TSingleEntryWith1To5RangeWithElse.TestTitle: shortstring; - begin - Result := 'Single entry of "1..5" and else block'; - end; - -function TSingleEntryWith1To5RangeWithElse.WriteResults: Boolean; - var - X: Word; - begin - Result := True; - if FResultStorage[0] <> 0 then - begin - WriteLn('FAIL - Index 0; expected $00 got $', hexstr(FResultStorage[0], 2)); - Result := False; - Exit; - end; - - for X := 1 to 5 do - if FResultStorage[X] <> 1 then - begin - WriteLn('FAIL - Index ', X, '; expected $01 got $', hexstr(FResultStorage[X], 2)); - Result := False; - Exit; - end; - - for X := 6 to $FF do - if FResultStorage[X] <> 0 then - begin - WriteLn('FAIL - Index ', X, '; expected $00 got $', hexstr(FResultStorage[X], 2)); - Result := False; - Exit; - end; - end; - -procedure TSingleEntryWith1To5RangeWithElse.DoTestIteration(Iteration: Integer); - var - Index: Byte; - begin - Index := Iteration and $FF; - { This helps catch errors where all branches, including else, are skipped } - FResultStorage[Index] := $FF; - case Index of - 1..5: FResultStorage[Index] := 1; - else FResultStorage[Index] := 0; - end; - end; - -{ TSingleEntryWith1To50RangeWithElse } - -function TSingleEntryWith1To50RangeWithElse.TestTitle: shortstring; - begin - Result := 'Single entry of "1..50" and else block'; - end; - -function TSingleEntryWith1To50RangeWithElse.WriteResults: Boolean; - var - X: Word; - begin - Result := True; - if FResultStorage[0] <> 0 then - begin - WriteLn('FAIL - Index 0; expected $00 got $', hexstr(FResultStorage[0], 2)); - Result := False; - Exit; - end; - - for X := 1 to 50 do - if FResultStorage[X] <> 1 then - begin - WriteLn('FAIL - Index ', X, '; expected $01 got $', hexstr(FResultStorage[X], 2)); - Result := False; - Exit; - end; - - for X := 51 to $FF do - if FResultStorage[X] <> 0 then - begin - WriteLn('FAIL - Index ', X, '; expected $00 got $', hexstr(FResultStorage[X], 2)); - Result := False; - Exit; - end; - end; - -procedure TSingleEntryWith1To50RangeWithElse.DoTestIteration(Iteration: Integer); - var - Index: Byte; - begin - Index := Iteration and $FF; - { This helps catch errors where all branches, including else, are skipped } - FResultStorage[Index] := $FF; - case Index of - 1..50: FResultStorage[Index] := 1; - else FResultStorage[Index] := 0; - end; - end; - - -{ TSingleEntryWithMinus1To5RangeWithElse } - -function TSingleEntryWithMinus1To5RangeWithElse.TestTitle: shortstring; - begin - Result := 'Single entry of "-1..5" and else block'; - end; - -function TSingleEntryWithMinus1To5RangeWithElse.WriteResults: Boolean; - var - X: Word; - begin - Result := True; - for X := 0 to 5 do - if FResultStorage[X] <> 1 then - begin - WriteLn('FAIL - Index ', X, '; expected $01 got $', hexstr(FResultStorage[X], 2)); - Result := False; - Exit; - end; - - for X := 6 to $FE do - if FResultStorage[X] <> 0 then - begin - WriteLn('FAIL - Index ', X, '; expected $00 got $', hexstr(FResultStorage[X], 2)); - Result := False; - Exit; - end; - - if FResultStorage[$FF] <> 1 then - begin - WriteLn('FAIL - Index 255; expected $00 got $', hexstr(FResultStorage[0], 2)); - Result := False; - Exit; - end; - end; - -procedure TSingleEntryWithMinus1To5RangeWithElse.DoTestIteration(Iteration: Integer); - var - Index: ShortInt; - begin - Index := ShortInt(Iteration and $FF); - { This helps catch errors where all branches, including else, are skipped } - FResultStorage[Byte(Index)] := $FF; - case Index of - -1..5: FResultStorage[Index] := 1; - else FResultStorage[Index] := 0; - end; - end; - -{ TSingleEntryWithMinus1To50RangeWithElse } - -function TSingleEntryWithMinus1To50RangeWithElse.TestTitle: shortstring; - begin - Result := 'Single entry of "-1..50" and else block'; - end; - -function TSingleEntryWithMinus1To50RangeWithElse.WriteResults: Boolean; - var - X: Word; - begin - Result := True; - for X := 0 to 50 do - if FResultStorage[X] <> 1 then - begin - WriteLn('FAIL - Index ', X, '; expected $01 got $', hexstr(FResultStorage[X], 2)); - Result := False; - Exit; - end; - - for X := 51 to $FE do - if FResultStorage[X] <> 0 then - begin - WriteLn('FAIL - Index ', X, '; expected $00 got $', hexstr(FResultStorage[X], 2)); - Result := False; - Exit; - end; - - if FResultStorage[$FF] <> 1 then - begin - WriteLn('FAIL - Index 255; expected $00 got $', hexstr(FResultStorage[0], 2)); - Result := False; - Exit; - end; - end; - -procedure TSingleEntryWithMinus1To50RangeWithElse.DoTestIteration(Iteration: Integer); - var - Index: ShortInt; - begin - Index := ShortInt(Iteration and $FF); - { This helps catch errors where all branches, including else, are skipped } - FResultStorage[Byte(Index)] := $FF; - case Index of - -1..50: FResultStorage[Index] := 1; - else FResultStorage[Index] := 0; - end; - end; - -{ TExtremeRange1 } - -function TExtremeRange1.TestTitle: shortstring; - begin - Result := 'Two labels, one with extreme spread, equal polling'; - end; - -function TExtremeRange1.WriteResults: Boolean; - var - X: Word; - begin - Result := True; - - if FResultStorage[0] <> 1 then - begin - WriteLn('FAIL - Index 0; expected $01 got $', hexstr(FResultStorage[0], 2)); - Result := False; - Exit; - end; - - for X := 1 to $FFFE do - if FResultStorage[X] <> 2 then - begin - WriteLn('FAIL - Index ', X, '; expected $02 got $', hexstr(FResultStorage[X], 2)); - Result := False; - Exit; - end; - - if FResultStorage[65535] <> 0 then - begin - WriteLn('FAIL - Index 65535; expected $02 got $', hexstr(FResultStorage[65535], 2)); - Result := False; - Exit; - end; - end; - -procedure TExtremeRange1.DoTestIteration(Iteration: Integer); - var - Index: Word; - begin - Index := Iteration and $FFFF; - FResultStorage[Index] := 0; { Covers $FFFF } - case Index of - 0: - FResultStorage[Index] := 1; - 1..$FFFE: - FResultStorage[Index] := 2; - end; - end; - -{ TExtremeRange2 } - -function TExtremeRange2.TestTitle: shortstring; - begin - Result := 'Two labels, one with extreme spread, 50% else chance'; - end; - -function TExtremeRange2.WriteResults: Boolean; - var - X: Word; - begin - Result := True; - - for X := 0 to $FFFF do - if FResultStorage[X] <> (X and $1) then - begin - WriteLn('FAIL - Index ', X, '; expected $', hexstr(X and $1, 2), ' got $', hexstr(FResultStorage[X], 2)); - Result := False; - Exit; - end; - end; - -procedure TExtremeRange2.DoTestIteration(Iteration: Integer); - var - Index, Input: Word; - begin - Index := (Iteration and $FFFF); - Input := (Iteration and $1) - 1; - FResultStorage[Index] := 0; { Covers $FFFF } - case Input of - 0..$FFFD: - FResultStorage[Index] := 1; - $FFFE: - FResultStorage[Index] := 2; - end; - end; - -{ TExtremeRange3 } - -function TExtremeRange3.TestTitle: shortstring; - begin - Result := 'Two labels, sparse values, equal polling across range'; - end; - -function TExtremeRange3.WriteResults: Boolean; - var - X: Word; - begin - Result := True; - - if FResultStorage[0] <> 1 then - begin - WriteLn('FAIL - Index 0; expected $01 got $', hexstr(FResultStorage[0], 2)); - Result := False; - Exit; - end; - - for X := 1 to $FFFE do - if FResultStorage[X] <> 2 then - begin - WriteLn('FAIL - Index ', X, '; expected $02 got $', hexstr(FResultStorage[X], 2)); - Result := False; - Exit; - end; - - if FResultStorage[65535] <> 0 then - begin - WriteLn('FAIL - Index 65535; expected $02 got $', hexstr(FResultStorage[65535], 2)); - Result := False; - Exit; - end; - end; - -procedure TExtremeRange3.DoTestIteration(Iteration: Integer); - var - Index: Word; - begin - Index := Iteration and $FFFF; - FResultStorage[Index] := 2; { Covers 1..$FFFE } - case Index of - 0: - FResultStorage[Index] := 1; - $FFFF: - FResultStorage[Index] := 0; - end; - end; - -{ TExtremeRange4 } - -function TExtremeRange4.TestTitle: shortstring; - begin - Result := 'Two labels, sparse values, always triggered'; - end; - -function TExtremeRange4.WriteResults: Boolean; - var - X: Word; - begin - Result := True; - - for X := 0 to $FFFF do - if FResultStorage[X] <> (X and $1) then - begin - WriteLn('FAIL - Index ', X, '; expected $', hexstr(X and $1, 2), ' got $', hexstr(FResultStorage[X], 2)); - Result := False; - Exit; - end; - end; - -procedure TExtremeRange4.DoTestIteration(Iteration: Integer); - var - Index, Input: Word; - begin - Index := (Iteration and $FFFF); - Input := (Iteration and $1) - 1; - FResultStorage[Index] := 2; { Covers 1..$FFFE } - case Input of - 0: - FResultStorage[Index] := 1; - $FFFF: - FResultStorage[Index] := 0; - end; - end; - -{ TSparseDataTest1 } - -procedure TSparseDataTest1.DoCaseBlock(Index: Integer; Input: TInstructionSet); - begin - case Input of - A_AND: - FResultStorage[Index] := 1; - A_MOV: - FResultStorage[Index] := 2; - A_MOVSX, - A_MOVZX: - FResultStorage[Index] := 3; - A_VMOVAPS, - A_VMOVAPD, - A_VMOVUPS, - A_VMOVUPD: - FResultStorage[Index] := 4; - A_MOVAPD, - A_MOVAPS, - A_MOVUPD, - A_MOVUPS: - FResultStorage[Index] := 5; - A_VDIVSD, - A_VDIVSS, - A_VSUBSD, - A_VSUBSS, - A_VMULSD, - A_VMULSS, - A_VADDSD, - A_VADDSS, - A_VANDPD, - A_VANDPS, - A_VORPD, - A_VORPS, - A_VXORPD, - A_VXORPS: - FResultStorage[Index] := 6; - A_MULSD, - A_MULSS, - A_ADDSD, - A_ADDSS: - FResultStorage[Index] := 7; - A_VMOVSD, - A_VMOVSS, - A_MOVSD, - A_MOVSS: - FResultStorage[Index] := 8; - A_LEA: - FResultStorage[Index] := 9; - A_SUB: - FResultStorage[Index] := 10; - A_SHL,A_SAL: - FResultStorage[Index] := 11; - A_SETcc: - FResultStorage[Index] := 12; - else - FResultStorage[Index] := 0; - end; - end; - -{ TSparseDataEqual1 } - -function TSparseDataEqual1.TestTitle: shortstring; - begin - Result := 'Domain of 1024, 12 sparse labels, equal polling'; - end; - -function TSparseDataEqual1.WriteResults: Boolean; - var - X: Word; - begin - Result := True; - - for X := 0 to 1023 do - if FResultStorage[X] <> ExtremeRange1Expected[X] then - begin - WriteLn('FAIL - Index ', X, '; expected $', hexstr(ExtremeRange1Expected[X], 2), ' got $', hexstr(FResultStorage[X], 2)); - Result := False; - Exit; - end; - end; - -procedure TSparseDataEqual1.DoTestIteration(Iteration: Integer); - var - X: SmallInt; - begin - X := Iteration and 1023; - DoCaseBlock(X, TInstructionSet(X - 512)) - end; - -{ TSparseDataMOVWeightedl } - -function TSparseDataMOVWeighted1.TestTitle: shortstring; - begin - Result := 'Domain of 1024, 12 sparse labels, 75% particular match'; - end; - -function TSparseDataMOVWeighted1.WriteResults: Boolean; - var - X, Expected: Word; - begin - Result := True; - - for X := 0 to 1023 do - begin - Expected := IIf((X and $3) = 0, ExtremeRange1Expected[X], 2); - if FResultStorage[X] <> Expected then - begin - WriteLn('FAIL - Index ', X, '; expected $', hexstr(Expected, 2), ' got $', hexstr(FResultStorage[X], 2)); - Result := False; - Exit; - end; - end; - end; - -procedure TSparseDataMOVWeighted1.DoTestIteration(Iteration: Integer); - var - X: SmallInt; P: TInstructionSet; - begin - X := Iteration and 1023; - P := TInstructionSet(IIf((X and $3) = 0, X - 512, Ord(A_MOV))); - DoCaseBlock(X, P); - end; - -{ TSparseDataMidpointWeighted1 } - -function TSparseDataMidpointWeighted1.TestTitle: shortstring; - begin - Result := 'Domain of 1024, 12 sparse labels, 75% midpoint match'; - end; - -function TSparseDataMidpointWeighted1.WriteResults: Boolean; - var - X, Expected: Word; - begin - Result := True; - - for X := 0 to 1023 do - begin - Expected := IIf((X and $3) = 0, ExtremeRange1Expected[X], 6); - if FResultStorage[X] <> Expected then - begin - WriteLn('FAIL - Index ', X, '; expected $', hexstr(Expected, 2), ' got $', hexstr(FResultStorage[X], 2)); - Result := False; - Exit; - end; - end; - end; - -procedure TSparseDataMidpointWeighted1.DoTestIteration(Iteration: Integer); - var - X: Word; P: TInstructionSet; - begin - X := Iteration and 1023; - P := TInstructionSet(IIf((X and $3) = 0, X - 512, Ord(A_VADDSD))); - DoCaseBlock(X, P); - end; - -{ TSparseDataTest2 } - -procedure TSparseDataTest2.DoCaseBlock(Index: Integer; Input: TInstructionSet); - begin - case Input of - A_AND: - FResultStorage[Index] := 1; - A_MOV: - FResultStorage[Index] := 2; - A_MOVSX: - FResultStorage[Index] := 13; - A_MOVZX: - FResultStorage[Index] := 3; - A_VMOVAPS: - FResultStorage[Index] := 14; - A_VMOVAPD: - FResultStorage[Index] := 15; - A_VMOVUPS: - FResultStorage[Index] := 16; - A_VMOVUPD: - FResultStorage[Index] := 4; - A_MOVAPD: - FResultStorage[Index] := 17; - A_MOVAPS: - FResultStorage[Index] := 18; - A_MOVUPD: - FResultStorage[Index] := 19; - A_MOVUPS: - FResultStorage[Index] := 5; - A_VDIVSD: - FResultStorage[Index] := 20; - A_VDIVSS: - FResultStorage[Index] := 21; - A_VSUBSD: - FResultStorage[Index] := 22; - A_VSUBSS: - FResultStorage[Index] := 23; - A_VMULSD: - FResultStorage[Index] := 24; - A_VMULSS: - FResultStorage[Index] := 25; - A_VADDSD: - FResultStorage[Index] := 26; - A_VADDSS: - FResultStorage[Index] := 27; - A_VANDPD: - FResultStorage[Index] := 28; - A_VANDPS: - FResultStorage[Index] := 29; - A_VORPD: - FResultStorage[Index] := 30; - A_VORPS: - FResultStorage[Index] := 31; - A_VXORPD: - FResultStorage[Index] := 32; - A_VXORPS: - FResultStorage[Index] := 6; - A_MULSD: - FResultStorage[Index] := 33; - A_MULSS: - FResultStorage[Index] := 34; - A_ADDSD: - FResultStorage[Index] := 35; - A_ADDSS: - FResultStorage[Index] := 7; - A_VMOVSD: - FResultStorage[Index] := 36; - A_VMOVSS: - FResultStorage[Index] := 37; - A_MOVSD: - FResultStorage[Index] := 38; - A_MOVSS: - FResultStorage[Index] := 8; - A_LEA: - FResultStorage[Index] := 9; - A_SUB: - FResultStorage[Index] := 10; - A_SHL: - FResultStorage[Index] := 39; - A_SAL: - FResultStorage[Index] := 11; - A_SETcc: - FResultStorage[Index] := 12; - else - FResultStorage[Index] := 0; - end; - end; - -{ TSparseDataEqual2 } - -function TSparseDataEqual2.TestTitle: shortstring; - begin - Result := 'Domain of 1024, 39 sparse labels, equal polling'; - end; - -function TSparseDataEqual2.WriteResults: Boolean; - var - X: Word; - begin - Result := True; - - for X := 0 to 1023 do - if FResultStorage[X] <> ExtremeRange2Expected[X] then - begin - WriteLn('FAIL - Index ', X, '; expected $', hexstr(ExtremeRange2Expected[X], 2), ' got $', hexstr(FResultStorage[X], 2)); - Result := False; - Exit; - end; - end; - -procedure TSparseDataEqual2.DoTestIteration(Iteration: Integer); - var - X: SmallInt; - begin - X := Iteration and 1023; - DoCaseBlock(X, TInstructionSet(X - 512)) - end; - -{ TSparseDataMOVWeighted2 } - -function TSparseDataMOVWeighted2.TestTitle: shortstring; - begin - Result := 'Domain of 1024, 39 sparse labels, 75% particular match'; - end; - -function TSparseDataMOVWeighted2.WriteResults: Boolean; - var - X, Expected: Word; - begin - Result := True; - - for X := 0 to 1023 do - begin - Expected := IIf((X and $3) = 0, ExtremeRange2Expected[X], 2); - if FResultStorage[X] <> Expected then - begin - WriteLn('FAIL - Index ', X, '; expected $', hexstr(Expected, 2), ' got $', hexstr(FResultStorage[X], 2)); - Result := False; - Exit; - end; - end; - end; - -procedure TSparseDataMOVWeighted2.DoTestIteration(Iteration: Integer); - var - X: SmallInt; P: TInstructionSet; - begin - X := Iteration and 1023; - P := TInstructionSet(IIf((X and $3) = 0, X - 512, Ord(A_MOV))); - DoCaseBlock(X, P); - end; - -{ TSparseDataMidpointWeighted2 } - -function TSparseDataMidpointWeighted2.TestTitle: shortstring; - begin - Result := 'Domain of 1024, 39 sparse labels, 75% midpoint match'; - end; - -function TSparseDataMidpointWeighted2.WriteResults: Boolean; - var - X, Expected: Word; - begin - Result := True; - - for X := 0 to 1023 do - begin - Expected := IIf((X and $3) = 0, ExtremeRange2Expected[X], 26); - if FResultStorage[X] <> Expected then - begin - WriteLn('FAIL - Index ', X, '; expected $', hexstr(Expected, 2), ' got $', hexstr(FResultStorage[X], 2)); - Result := False; - Exit; - end; - end; - end; - -procedure TSparseDataMidpointWeighted2.DoTestIteration(Iteration: Integer); - var - X: SmallInt; P: TInstructionSet; - begin - X := Iteration and 1023; - P := TInstructionSet(IIf((X and $3) = 0, X - 512, Ord(A_VADDSD))); - DoCaseBlock(X, P); - end; - -{ TSparseDataTest3 } - -procedure TSparseDataTest3.DoCaseBlock(Index: Integer; Input: TInstructionSet); - begin - case Input of - A_AND: - FResultStorage[Index] := 1; - A_MOV: - FResultStorage[Index] := 2; - A_MOVSX: - FResultStorage[Index] := 13; - A_MOVZX: - FResultStorage[Index] := 3; - A_VMOVAPS: - FResultStorage[Index] := 14; - A_VMOVAPD: - FResultStorage[Index] := 15; - A_VMOVUPS: - FResultStorage[Index] := 16; - A_VMOVUPD: - FResultStorage[Index] := 4; - A_MOVAPD: - FResultStorage[Index] := 17; - A_MOVAPS: - FResultStorage[Index] := 18; - A_MOVUPD: - FResultStorage[Index] := 19; - A_MOVUPS: - FResultStorage[Index] := 5; - A_VDIVSD: - FResultStorage[Index] := 20; - A_VDIVSS: - FResultStorage[Index] := 21; - A_VSUBSD: - FResultStorage[Index] := 22; - A_VSUBSS: - FResultStorage[Index] := 23; - A_VMULSD: - FResultStorage[Index] := 24; - A_VMULSS: - FResultStorage[Index] := 25; - A_VADDSD: - FResultStorage[Index] := 26; - A_VADDSS: - FResultStorage[Index] := 27; - A_VANDPD: - FResultStorage[Index] := 28; - A_VANDPS: - FResultStorage[Index] := 29; - A_VORPD: - FResultStorage[Index] := 30; - A_VORPS: - FResultStorage[Index] := 31; - A_VXORPD: - FResultStorage[Index] := 32; - A_VXORPS: - FResultStorage[Index] := 6; - A_MULSD: - FResultStorage[Index] := 33; - A_MULSS: - FResultStorage[Index] := 34; - A_ADDSD: - FResultStorage[Index] := 35; - A_ADDSS: - FResultStorage[Index] := 7; - A_VMOVSD: - FResultStorage[Index] := 36; - A_VMOVSS: - FResultStorage[Index] := 37; - A_MOVSD: - FResultStorage[Index] := 38; - A_MOVSS: - FResultStorage[Index] := 8; - A_LEA: - FResultStorage[Index] := 9; - A_SUB: - FResultStorage[Index] := 10; - A_SHL: - FResultStorage[Index] := 39; - A_SAL: - FResultStorage[Index] := 11; - A_SETcc: - FResultStorage[Index] := 12; - A_MULX: - FResultStorage[Index] := 40; - A_VBROADCASTF128: - FResultStorage[Index] := 41; - A_VBROADCASTI128: - FResultStorage[Index] := 42; - A_VPERMD: - FResultStorage[Index] := 43; - A_VADDPD: - FResultStorage[Index] := 44; - A_VADDPS: - FResultStorage[Index] := 45; - A_ROUNDPS: - FResultStorage[Index] := 46; - A_ROUNDPD: - FResultStorage[Index] := 47; - A_ROUNDSS: - FResultStorage[Index] := 48; - A_ROUNDSD: - FResultStorage[Index] := 49; - A_CRC32: - FResultStorage[Index] := 50; - A_DPPS: - FResultStorage[Index] := 51; - A_DPPD: - FResultStorage[Index] := 52; - A_VAESDEC: - FResultStorage[Index] := 53; - A_VAESDECLAST: - FResultStorage[Index] := 54; - A_VAESENC: - FResultStorage[Index] := 55; - A_VAESENCLAST: - FResultStorage[Index] := 56; - A_VAESIMC: - FResultStorage[Index] := 57; - A_VAESKEYGENASSIST: - FResultStorage[Index] := 58; - A_VPSHUFB: - FResultStorage[Index] := 59; - A_VPSHUFD: - FResultStorage[Index] := 60; - A_VPSHUFHW: - FResultStorage[Index] := 61; - A_VPSHUFLW: - FResultStorage[Index] := 62; - A_BSF: - FResultStorage[Index] := 63; - A_BSR: - FResultStorage[Index] := 64; - A_BTR: - FResultStorage[Index] := 65; - A_BTS: - FResultStorage[Index] := 66; - A_XOR: - FResultStorage[Index] := 67; - A_ADD: - FResultStorage[Index] := 68; - A_CMP: - FResultStorage[Index] := 69; - A_SHLX: - FResultStorage[Index] := 70; - A_SHRX: - FResultStorage[Index] := 71; - else - FResultStorage[Index] := 0; - end; - end; - -{ TSparseDataEqual3 } - -function TSparseDataEqual3.TestTitle: shortstring; - begin - Result := 'Domain of 1024, 71 sparse labels, equal polling'; - end; - -function TSparseDataEqual3.WriteResults: Boolean; - var - X: Word; - begin - Result := True; - - for X := 0 to 1023 do - if FResultStorage[X] <> ExtremeRange3Expected[X] then - begin - WriteLn('FAIL - Index ', X, '; expected $', hexstr(ExtremeRange3Expected[X], 2), ' got $', hexstr(FResultStorage[X], 2)); - Result := False; - Exit; - end; - end; - -procedure TSparseDataEqual3.DoTestIteration(Iteration: Integer); - var - X: SmallInt; - begin - X := Iteration and 1023; - DoCaseBlock(X, TInstructionSet(X - 512)) - end; - -{ TSparseDataMOVWeightedl } - -function TSparseDataMOVWeighted3.TestTitle: shortstring; - begin - Result := 'Domain of 1024, 71 sparse labels, 75% particular match'; - end; - -function TSparseDataMOVWeighted3.WriteResults: Boolean; - var - X, Expected: Word; - begin - Result := True; - - for X := 0 to 1023 do - begin - Expected := IIf((X and $3) = 0, ExtremeRange3Expected[X], 2); - if FResultStorage[X] <> Expected then - begin - WriteLn('FAIL - Index ', X, '; expected $', hexstr(Expected, 2), ' got $', hexstr(FResultStorage[X], 2)); - Result := False; - Exit; - end; - end; - end; - -procedure TSparseDataMOVWeighted3.DoTestIteration(Iteration: Integer); - var - X: SmallInt; P: TInstructionSet; - begin - X := Iteration and 1023; - P := TInstructionSet(IIf((X and $3) = 0, X - 512, Ord(A_MOV))); - DoCaseBlock(X, P); - end; - -{ TSparseDataMidpointWeighted3 } - -function TSparseDataMidpointWeighted3.TestTitle: shortstring; - begin - Result := 'Domain of 1024, 71 sparse labels, 75% midpoint match'; - end; - -function TSparseDataMidpointWeighted3.WriteResults: Boolean; - var - X, Expected: Word; - begin - Result := True; - - for X := 0 to 1023 do - begin - Expected := IIf((X and $3) = 0, ExtremeRange3Expected[X], 26); - if FResultStorage[X] <> Expected then - begin - WriteLn('FAIL - Index ', X, '; expected $', hexstr(Expected, 2), ' got $', hexstr(FResultStorage[X], 2)); - Result := False; - Exit; - end; - end; - end; - -procedure TSparseDataMidpointWeighted3.DoTestIteration(Iteration: Integer); - var - X: SmallInt; P: TInstructionSet; - begin - X := Iteration and 1023; - P := TInstructionSet(IIf((X and $3) = 0, X - 512, Ord(A_VADDSD))); - DoCaseBlock(X, P); - end; - - -{ TLinearListDependsOnInput } - -function TLinearListDependsOnInput.TestTitle: shortstring; - begin - Result := 'Linear list depends on input'; - end; - -function TLinearListDependsOnInput.WriteResults: Boolean; - var - X: Word; - begin - Result := True; - if FResultStorage[0] <> 0 then - begin - WriteLn('FAIL - Index 0; expected $00 got $', hexstr(FResultStorage[0], 2)); - Result := False; - Exit; - end; - - for X := 1 to 7 do - if FResultStorage[X] <> (X and $3) then - begin - WriteLn('FAIL - Index ', X, '; expected $', hexstr(X and $3, 2), ' got $', hexstr(FResultStorage[X], 2)); - Result := False; - Exit; - end; - - for X := 8 to 11 do - if FResultStorage[X] <> 0 then - begin - WriteLn('FAIL - Index ', X, '; expected $00 got $', hexstr(FResultStorage[X], 2)); - Result := False; - Exit; - end; - - if FResultStorage[12] <> $10 then - begin - WriteLn('FAIL - Index 12; expected $10 got $', hexstr(FResultStorage[12], 2)); - Result := False; - Exit; - end; - - for X := 13 to $FF do - if FResultStorage[X] <> 0 then - begin - WriteLn('FAIL - Index ', X, '; expected $00 got $', hexstr(FResultStorage[X], 2)); - Result := False; - Exit; - end; - end; - -procedure TLinearListDependsOnInput.DoTestIteration(Iteration: Integer); - var - Index: Byte; - begin - Index := Iteration and $FF; - { This helps catch errors where all branches, including else, are skipped } - FResultStorage[Index] := $FF; - case Index of - 1..3: FResultStorage[Index] := Index; - 4..7: FResultStorage[Index] := Index - 4; - 12: FResultStorage[Index] := $10; - else FResultStorage[Index] := 0; - end; - end; - - -{ TCStyleCascade } - -function TCStyleCascade.TestTitle: shortstring; - begin - Result := 'C-style cascade using ''goto'''; - end; - -function TCStyleCascade.WriteResults: Boolean; - var - X: Byte; - begin - Result := True; - for X := 0 to 5 do - if FResultStorage[X] <> ((1 shl X) - 1) then - begin - WriteLn('FAIL - Index ', X, '; expected $', hexstr((1 shl X) - 1, 2), ' got $', hexstr(FResultStorage[X], 2)); - Result := False; - Exit; - end; - - for X := 6 to $FF do - if FResultStorage[X] <> 0 then - begin - WriteLn('FAIL - Index ', X, '; expected $00 got $', hexstr(FResultStorage[X], 2)); - Result := False; - Exit; - end; - end; - -procedure TCStyleCascade.DoTestIteration(Iteration: Integer); - var - X, Tmp: Byte; - label - Set1, Set2, Set3, Set4, Default; - begin - X := Iteration and $FF; - Tmp := 0; - case X of - $1: goto Set1; - $2: goto Set2; - $3: goto Set3; - $4: goto Set4; - $5: Tmp := 16; - else - goto Default; - end; - Set4: - Tmp := Tmp or $8; - Set3: - Tmp := Tmp or $4; - Set2: - Tmp := Tmp or $2; - Set1: - Tmp := Tmp or $1; - Default: - FResultStorage[X] := Tmp; - end; - - -{ Main function } -const - { TCompleteByteRange and descendants - - Entirely-covered jump tree - - 33 labels, no else block; full coverage (all 256 byte values covered) - - Root: values are polled with equal probability - - FirstWeighted: first branch is polled 3 times as often - - LastWeighted: last branch is polled 3 times as often - TAlmostFullByteRange - - Almost full jump tree - 18 labels, else block covers 32 values; 224 byte values covered - - Root: values are polled with equal probability - - FirstWeighted: first branch is polled 3 times as often - - LastWeighted: last branch is polled 3 times as often - } - - TestClasses: array[0..35] of TTestClass = ( - TCompleteByteRange, - TCompleteByteRangeFirstWeighted, - TCompleteByteRangeLastWeighted, - TAlmostFullByteRange, - TAlmostFullByteRangeFirstWeighted, - TAlmostFullByteRangeLastWeighted, - TSingleEntryWithDefault, - TSingleEntryWithDefaultUnlikely, - TSingleEntryWithDefaultWeighted, - TSingleEntryWithElse, - TSingleEntryWithElseUnlikely, - TSingleEntryWithElseWeighted, - TSingleEntryAtZeroWithElse, - TSingleEntryAtMinus1WithDefault, - TSingleEntryAtMinus4WithElse, - TSingleEntryWith0To5RangeWithElse, - TSingleEntryWith0To50RangeWithElse, - TSingleEntryWith1To5RangeWithElse, - TSingleEntryWith1To50RangeWithElse, - TSingleEntryWithMinus1To5RangeWithElse, - TSingleEntryWithMinus1To50RangeWithElse, - TExtremeRange1, - TExtremeRange2, - TExtremeRange3, - TExtremeRange4, - TSparseDataEqual1, - TSparseDataMOVWeighted1, - TSparseDataMidpointWeighted1, - TSparseDataEqual2, - TSparseDataMOVWeighted2, - TSparseDataMidpointWeighted2, - TSparseDataEqual3, - TSparseDataMOVWeighted3, - TSparseDataMidpointWeighted3, - TLinearListDependsOnInput, - TCStyleCascade - ); - -var - CurrentObject: TTestAncestor; - Failed: Boolean; - X: Integer; - SummedUpAverageDuration, AverageDuration : Double; -begin - SummedUpAverageDuration := 0.0; - Failed := False; - WriteLn('Case node compilation and timing test'); - WriteLn('-------------------------------------'); - for X := low(TestClasses) to High(TestClasses) do - begin - try - CurrentObject := TestClasses[X].Create; - try - Write(CurrentObject.TestTitle:56, ' - '); - CurrentObject.Run; - - if CurrentObject.WriteResults then - begin - AverageDuration := ((CurrentObject.RunTime * 1000000000.0) / ITERATIONS); - WriteLn('Pass - average iteration duration: ', AverageDuration:1:3, ' ns'); - SummedUpAverageDuration := SummedUpAverageDuration + AverageDuration; - end - else - { Final average isn't processed if a test failed, so there's no need - to calculate and add the average duration to it } - Failed := True; - - finally - CurrentObject.Free; - end; - except on E: Exception do - begin - WriteLn('Exception "', E.ClassName, '" raised while running test object of class "', TestClasses[X].ClassName, '"'); - Failed := True; - end; - end; - end; - - if Failed then - Halt(1); - - WriteLn(#10'ok'); - WriteLn('- Sum of average durations: ', SummedUpAverageDuration:1:3, ' ns'); - WriteLn('- Overall average duration: ', (SummedUpAverageDuration / Length(TestClasses)):1:3, ' ns'); -end. +{$goto on} +program bcase; + +{$mode objfpc}{$H+} + +uses + SysUtils; + +{ Utility functions } +function GetRealTime(const st: TSystemTime): Real; + begin + Result := st.Hour*3600.0 + st.Minute*60.0 + st.Second + st.MilliSecond/1000.0; + end; + +{$push} +{$warn 5057 off} +function GetRealTime : Real; + var + st:TSystemTime; + begin + GetLocalTime(st); + result:=GetRealTime(st); + end; +{$pop} + +function IIf(Condition: Boolean; TrueRes, FalseRes: Integer): Integer; inline; + begin + if Condition then + Result := TrueRes + else + Result := FalseRes; + end; + +const + ITERATIONS = 33554432; + + AES_S_Box: array[Byte] of Byte = ( + $63, $7c, $77, $7b, $f2, $6b, $6f, $c5, $30, $01, $67, $2b, $fe, $d7, $ab, $76, + $ca, $82, $c9, $7d, $fa, $59, $47, $f0, $ad, $d4, $a2, $af, $9c, $a4, $72, $c0, + $b7, $fd, $93, $26, $36, $3f, $f7, $cc, $34, $a5, $e5, $f1, $71, $d8, $31, $15, + $04, $c7, $23, $c3, $18, $96, $05, $9a, $07, $12, $80, $e2, $eb, $27, $b2, $75, + $09, $83, $2c, $1a, $1b, $6e, $5a, $a0, $52, $3b, $d6, $b3, $29, $e3, $2f, $84, + $53, $d1, $00, $ed, $20, $fc, $b1, $5b, $6a, $cb, $be, $39, $4a, $4c, $58, $cf, + $d0, $ef, $aa, $fb, $43, $4d, $33, $85, $45, $f9, $02, $7f, $50, $3c, $9f, $a8, + $51, $a3, $40, $8f, $92, $9d, $38, $f5, $bc, $b6, $da, $21, $10, $ff, $f3, $d2, + $cd, $0c, $13, $ec, $5f, $97, $44, $17, $c4, $a7, $7e, $3d, $64, $5d, $19, $73, + $60, $81, $4f, $dc, $22, $2a, $90, $88, $46, $ee, $b8, $14, $de, $5e, $0b, $db, + $e0, $32, $3a, $0a, $49, $06, $24, $5c, $c2, $d3, $ac, $62, $91, $95, $e4, $79, + $e7, $c8, $37, $6d, $8d, $d5, $4e, $a9, $6c, $56, $f4, $ea, $65, $7a, $ae, $08, + $ba, $78, $25, $2e, $1c, $a6, $b4, $c6, $e8, $dd, $74, $1f, $4b, $bd, $8b, $8a, + $70, $3e, $b5, $66, $48, $03, $f6, $0e, $61, $35, $57, $b9, $86, $c1, $1d, $9e, + $e1, $f8, $98, $11, $69, $d9, $8e, $94, $9b, $1e, $87, $e9, $ce, $55, $28, $df, + $8c, $a1, $89, $0d, $bf, $e6, $42, $68, $41, $99, $2d, $0f, $b0, $54, $bb, $16 + ); + + FirstWeighted: array[0..255] of Byte = ( + $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, + $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, + $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, + $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, + $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, + $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, + $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, + $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, + $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, + $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, + $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, + $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, $63, + $ba, $78, $25, $2e, $1c, $a6, $b4, $c6, $e8, $dd, $74, $1f, $4b, $bd, $8b, $8a, + $70, $3e, $b5, $66, $48, $03, $f6, $0e, $61, $35, $57, $b9, $86, $c1, $1d, $9e, + $e1, $f8, $98, $11, $69, $d9, $8e, $94, $9b, $1e, $87, $e9, $ce, $55, $28, $df, + $8c, $a1, $89, $0d, $bf, $e6, $42, $68, $41, $99, $2d, $0f, $b0, $54, $bb, $16 + ); + + LastWeighted: array[0..255] of Byte = ( + $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, + $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, + $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, + $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, + $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, + $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, + $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, + $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, + $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, + $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, + $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, + $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, + $ba, $78, $25, $2e, $1c, $a6, $b4, $c6, $e8, $dd, $74, $1f, $4b, $bd, $8b, $8a, + $70, $3e, $b5, $66, $48, $03, $f6, $0e, $61, $35, $57, $b9, $86, $c1, $1d, $9e, + $e1, $f8, $98, $11, $69, $d9, $8e, $94, $9b, $1e, $87, $e9, $ce, $55, $28, $df, + $8c, $a1, $89, $0d, $bf, $e6, $42, $68, $41, $99, $2d, $0f, $b0, $54, $bb, $16 + ); + + AlmostFullExpected: array[0..255] of Byte = ( + $63, $7c, $77, $7b, $f2, $6b, $6f, $c5, $30, $01, $67, $2b, $fe, $d7, $ab, $76, + $ca, $82, $c9, $7d, $fa, $59, $47, $f0, $ad, $d4, $a2, $af, $9c, $a4, $72, $c0, + $b7, $fd, $93, $26, $36, $3f, $f7, $cc, $34, $a5, $e5, $f1, $71, $d8, $31, $15, + $04, $c7, $23, $c3, $18, $96, $05, $9a, $07, $12, $80, $e2, $eb, $27, $b2, $75, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, + $d0, $ef, $aa, $fb, $43, $4d, $33, $85, $45, $f9, $02, $7f, $50, $3c, $9f, $a8, + $51, $a3, $40, $8f, $92, $9d, $38, $f5, $bc, $b6, $da, $21, $10, $ff, $f3, $d2, + $cd, $0c, $13, $ec, $5f, $97, $44, $17, $c4, $a7, $7e, $3d, $64, $5d, $19, $73, + $60, $81, $4f, $dc, $22, $2a, $90, $88, $46, $ee, $b8, $14, $de, $5e, $0b, $db, + $e0, $32, $3a, $0a, $49, $06, $24, $5c, $c2, $d3, $ac, $62, $91, $95, $e4, $79, + $e7, $c8, $37, $6d, $8d, $d5, $4e, $a9, $6c, $56, $f4, $ea, $65, $7a, $ae, $08, + $ba, $78, $25, $2e, $1c, $a6, $b4, $c6, $e8, $dd, $74, $1f, $4b, $bd, $8b, $8a, + $70, $3e, $b5, $66, $48, $03, $f6, $0e, $61, $35, $57, $b9, $86, $c1, $1d, $9e, + $e1, $f8, $98, $11, $69, $d9, $8e, $94, $9b, $1e, $87, $e9, $ce, $55, $28, $df, + $8c, $a1, $89, $0d, $bf, $e6, $42, $68, $41, $99, $2d, $0f, $b0, $54, $bb, $16 + ); + +type + TInstructionSet = ( { Truncated to 1024 entries } + A_NONE = -512, A_ADC, A_ADD, A_AND, A_BSF, A_BSR, A_BSWAP, A_BT, A_BTC, A_BTR, A_BTS, + A_CALL, A_CBW, A_CDQ, A_CLC, A_CLD, A_CLI, A_CLTS, A_CMC, A_CMP, A_CMPSB, + A_CMPSD, A_CMPSW, A_CMPXCHG, A_CMPXCHG486, A_CMPXCHG8B, A_CPUID, A_CWD, A_CWDE, + A_DEC, A_DIV, A_EMMS, A_ENTER, A_F2XM1, A_FABS, A_FADD, A_FADDP, A_FBLD, A_FBSTP, + A_FCHS, A_FCLEX,A_FCMOVB, A_FCMOVBE, A_FCMOVE, A_FCMOVNB, A_FCMOVNBE, A_FCMOVNE, + A_FCMOVNU, A_FCMOVU, A_FCOM, A_FCOMI, A_FCOMIP, A_FCOMP, A_FCOMPP, A_FCOS, + A_FDECSTP, A_FDISI, A_FDIV, A_FDIVP, A_FDIVR, A_FDIVRP, A_FEMMS, A_FENI, A_FFREE, + A_FIADD, A_FICOM, A_FICOMP, A_FIDIV, A_FIDIVR, A_FILD, A_FIMUL, A_FINCSTP, + A_FINIT, A_FIST, A_FISTP, A_FISTTP, A_FISUB, A_FISUBR, A_FLD, A_FLD1, A_FLDCW, + A_FLDENV, A_FLDL2E, A_FLDL2T, A_FLDLG2, A_FLDLN2, A_FLDPI, A_FLDZ, A_FMUL, + A_FMULP, A_FNCLEX, A_FNDISI, A_FNENI, A_FNINIT, A_FNOP, A_FNSAVE, A_FNSTCW, + A_FNSTENV, A_FNSTSW, A_FPATAN, A_FPREM, A_FPREM1, A_FPTAN, A_FRNDINT, A_FRSTOR, + A_FSAVE, A_FSCALE, A_FSETPM, A_FSIN, A_FSINCOS, A_FSQRT, A_FST, A_FSTCW, + A_FSTENV, A_FSTP, A_FSTSW, A_FSUB, A_FSUBP, A_FSUBR, A_FSUBRP, A_FTST, A_FUCOM, + A_FUCOMI, A_FUCOMIP, A_FUCOMP, A_FUCOMPP, A_FWAIT, A_FXAM, A_FXCH, A_FXTRACT, + A_FYL2X, A_FYL2XP1, A_HLT, A_IBTS, A_ICEBP, A_IDIV, A_IMUL, A_IN, A_INC, A_INSB, + A_INSD, A_INSW, A_INT, A_INT01, A_INT1, A_INT03, A_INT3, A_INVD, A_INVLPG, + A_IRET, A_IRETD, A_IRETW, A_IRETQ, A_JECXZ, A_JRCXZ, A_JMP, A_LAHF, A_LAR, + A_LCALL, A_LEA, A_LEAVE, A_LFS, A_LGDT, A_LGS, A_LIDT, A_LJMP, A_LLDT, A_LMSW, + A_LOADALL, A_LOADALL286, A_LOCK, A_LODSB, A_LODSD, A_LODSW, A_LOOP, A_LOOPE, + A_LOOPNE, A_LOOPNZ, A_LOOPZ, A_LSL, A_LSS, A_LTR, A_MONITOR, A_MOV, A_MOVD, + A_MOVQ, A_MOVSB, A_MOVSD, A_MOVSQ, A_MOVSW, A_MOVSX, A_MOVZX, A_MUL, A_MWAIT, + A_NEG, A_NOP, A_NOT, A_OR, A_OUT, A_OUTSB, A_OUTSD, A_OUTSW, A_PACKSSDW, + A_PACKSSWB, A_PACKUSWB, A_PADDB, A_PADDD, A_PADDSB, A_PADDSIW, A_PADDSW, + A_PADDUSB, A_PADDUSW, A_PADDW, A_PAND, A_PANDN, A_PAVEB, A_PAVGUSB, A_PCMPEQB, + A_PCMPEQD, A_PCMPEQW, A_PCMPGTB, A_PCMPGTD, A_PCMPGTW, A_PDISTIB, A_PF2ID, + A_PFACC, A_PFADD, A_PFCMPEQ, A_PFCMPGE, A_PFCMPGT, A_PFMAX, A_PFMIN, A_PFMUL, + A_PFRCP, A_PFRCPIT1, A_PFRCPIT2, A_PFRSQIT1, A_PFRSQRT, A_PFSUB, A_PFSUBR, + A_PI2FD, A_PMACHRIW, A_PMADDWD, A_PMAGW, A_PMULHRIW, A_PMULHRWA, A_PMULHRWC, + A_PMULHW, A_PMULLW, A_PMVGEZB, A_PMVLZB, A_PMVNZB, A_PMVZB, A_POP, A_POPF, + A_POPFW, A_POPFQ, A_POR, A_PREFETCH, A_PREFETCHW, A_PSLLD, A_PSLLDQ, A_PSLLQ, + A_PSLLW, A_PSRAD, A_PSRAW, A_PSRLD, A_PSRLQ, A_PSRLW, A_PSUBB, A_PSUBD, A_PSUBSB, + A_PSUBSIW, A_PSUBSW, A_PSUBUSB, A_PSUBUSW, A_PSUBW, A_PUNPCKHBW, A_PUNPCKHDQ, + A_PUNPCKHWD, A_PUNPCKLBW, A_PUNPCKLDQ, A_PUNPCKLWD, A_PUSH, A_PUSHF, A_PUSHFW, + A_PUSHFQ, A_PXOR, A_RCL, A_RCR, A_RDSHR, A_RDMSR, A_RDPMC, A_RDTSC, A_REP, + A_REPE, A_REPNE, A_REPNZ, A_REPZ, A_RET, A_RETF, A_RETN, A_RETW, A_RETFW, + A_RETNW, A_RETFD, A_RETQ, A_RETFQ, A_RETNQ, A_ROL, A_ROR, A_RSDC, A_RSLDT, A_RSM, + A_SAHF, A_SAL, A_SAR, A_SBB, A_SCASB, A_SCASD, A_SCASQ, A_SCASW, A_SEGCS, + A_SEGDS, A_SEGES, A_SEGFS, A_SEGGS, A_SEGSS, A_SGDT, A_SHL, A_SHLD, A_SHR, + A_SHRD, A_SIDT, A_SLDT, A_SMI, A_SMINT, A_SMINTOLD, A_SMSW, A_STC, A_STD, A_STI, + A_STOSB, A_STOSD, A_STOSW, A_STR, A_SUB, A_SVDC, A_SVLDT, A_SVTS, A_SYSCALL, + A_SYSENTER, A_SYSEXIT, A_SYSRET, A_TEST, A_UD1, A_UD2, A_UMOV, A_VERR, A_VERW, + A_WAIT, A_WBINVD, A_WRSHR, A_WRMSR, A_XADD, A_XBTS, A_XCHG, A_XLAT, A_XLATB, + A_XOR, A_XSTORE, A_XCRYPTECB, A_XCRYPTCBC, A_XCRYPTCFB, A_XCRYPTOFB, A_CMOVcc, + A_Jcc, A_SETcc, A_MOVS, A_CMPS, A_SCAS, A_LODS, A_STOS, A_INS, A_OUTS, A_ADDPS, + A_ADDSS, A_ANDNPS, A_ANDPS, A_CMPEQPS, A_CMPEQSS, A_CMPLEPS, A_CMPLESS, + A_CMPLTPS, A_CMPLTSS, A_CMPNEQPS, A_CMPNEQSS, A_CMPNLEPS, A_CMPNLESS, + A_CMPNLTPS, A_CMPNLTSS, A_CMPORDPS, A_CMPORDSS, A_CMPUNORDPS, A_CMPUNORDSS, + A_CMPPS, A_CMPSS, A_COMISS, A_CVTPI2PS, A_CVTPS2PI, A_CVTSI2SS, A_CVTSS2SI, + A_CVTTPS2PI, A_CVTTSS2SI, A_DIVPS, A_DIVSS, A_LDMXCSR, A_MAXPS, A_MAXSS, A_MINPS, + A_MINSS, A_MOVAPS, A_MOVHPS, A_MOVLHPS, A_MOVLPS, A_MOVHLPS, A_MOVMSKPS, + A_MOVNTPS, A_MOVSS, A_MOVUPS, A_MULPS, A_MULSS, A_ORPS, A_RCPPS, A_RCPSS, + A_RSQRTPS, A_RSQRTSS, A_SHUFPS, A_SQRTPS, A_SQRTSS, A_STMXCSR, A_SUBPS, A_SUBSS, + A_UCOMISS, A_UNPCKHPS, A_UNPCKLPS, A_XORPS, A_FXRSTOR, A_FXSAVE, A_PREFETCHNTA, + A_PREFETCHT0, A_PREFETCHT1, A_PREFETCHT2, A_SFENCE, A_MASKMOVQ, A_MOVNTQ, + A_PAVGB, A_PAVGW, A_PEXTRW, A_PINSRW, A_PMAXSW, A_PMAXUB, A_PMINSW, A_PMINUB, + A_PMOVMSKB, A_PMULHUW, A_PSADBW, A_PSHUFW, A_PFNACC, A_PFPNACC, A_PI2FW, A_PF2IW, + A_PSWAPD, A_FFREEP, A_MASKMOVDQU, A_CLFLUSH, A_MOVNTDQ, A_MOVNTI, A_MOVNTPD, + A_PAUSE, A_LFENCE, A_MFENCE, A_MOVDQA, A_MOVDQU, A_MOVDQ2Q, A_MOVQ2DQ, A_PADDQ, + A_PMULUDQ, A_PSHUFD, A_PSHUFHW, A_PSHUFLW, A_PSRLDQ, A_PSUBQ, A_PUNPCKHQDQ, + A_PUNPCKLQDQ, A_ADDPD, A_ADDSD, A_ANDNPD, A_ANDPD, A_CMPEQPD, A_CMPEQSD, + A_CMPLEPD, A_CMPLESD, A_CMPLTPD, A_CMPLTSD, A_CMPNEQPD, A_CMPNEQSD, A_CMPNLEPD, + A_CMPNLESD, A_CMPNLTPD, A_CMPNLTSD, A_CMPORDPD, A_CMPORDSD, A_CMPUNORDPD, + A_CMPUNORDSD, A_CMPPD, A_COMISD, A_CVTDQ2PD, A_CVTDQ2PS, A_CVTPD2DQ, A_CVTPD2PI, + A_CVTPD2PS, A_CVTPI2PD, A_CVTPS2DQ, A_CVTPS2PD, A_CVTSD2SI, A_CVTSD2SS, + A_CVTSI2SD, A_CVTSS2SD, A_CVTTPD2PI, A_CVTTPD2DQ, A_CVTTPS2DQ, A_CVTTSD2SI, + A_DIVPD, A_DIVSD, A_MAXPD, A_MAXSD, A_MINPD, A_MINSD, A_MOVAPD, A_MOVHPD, + A_MOVLPD, A_MOVMSKPD, A_MOVUPD, A_MULPD, A_MULSD, A_ORPD, A_SHUFPD, A_SQRTPD, + A_SQRTSD, A_SUBPD, A_SUBSD, A_UCOMISD, A_UNPCKHPD, A_UNPCKLPD, A_XORPD, + A_ADDSUBPD, A_ADDSUBPS, A_HADDPD, A_HADDPS, A_HSUBPD, A_HSUBPS, A_LDDQU, + A_MOVDDUP, A_MOVSHDUP, A_MOVSLDUP, A_VMREAD, A_VMWRITE, A_VMCALL, A_VMLAUNCH, + A_VMRESUME, A_VMXOFF, A_VMXON, A_VMCLEAR, A_VMPTRLD, A_VMPTRST, A_VMRUN, + A_VMMCALL, A_VMLOAD, A_VMSAVE, A_STGI, A_CLGI, A_SKINIT, A_INVLPGA, A_MONTMUL, + A_XSHA1, A_XSHA256, A_DMINT, A_RDM, A_MOVABS, A_MOVSXD, A_CQO, A_CDQE, + A_CMPXCHG16B, A_MOVNTSS, A_MOVNTSD, A_INSERTQ, A_EXTRQ, A_LZCNT, A_PABSB, + A_PABSW, A_PABSD, A_PALIGNR, A_PHADDW, A_PHADDD, A_PHADDSW, A_PHSUBW, A_PHSUBD, + A_PHSUBSW, A_PMADDUBSW, A_PMULHRSW, A_PSHUFB, A_PSIGNB, A_PSIGNW, A_PSIGND, + A_BLENDPS, A_BLENDPD, A_BLENDVPS, A_BLENDVPD, A_DPPS, A_DPPD, A_EXTRACTPS, + A_INSERTPS, A_MOVNTDQA, A_MPSADBW, A_PACKUSDW, A_PBLENDVB, A_PBLENDW, A_PCMPEQQ, + A_PEXTRB, A_PEXTRD, A_PEXTRQ, A_PHMINPOSUW, A_PINSRB, A_PINSRD, A_PINSRQ, A_PMAXSB, + A_PMAXSD, A_PMAXUD, A_PMAXUW, A_PMINSB, A_PMINSD, A_PMINUW, A_PMINUD, A_PMOVSXBW, + A_PMOVSXBD, A_PMOVSXBQ, A_PMOVSXWD, A_PMOVSXWQ, A_PMOVSXDQ, A_PMOVZXBW, A_PMOVZXBD, + A_PMOVZXBQ, A_PMOVZXWD, A_PMOVZXWQ, A_PMOVZXDQ, A_PMULDQ, A_PMULLD, A_PTEST, + A_ROUNDPS, A_ROUNDPD, A_ROUNDSS, A_ROUNDSD, A_CRC32, A_PCMPESTRI, A_PCMPESTRM, + A_PCMPISTRI, A_PCMPISTRM, A_PCMPGTQ, A_POPCNT, A_AESENC, A_AESENCLAST, A_AESDEC, + A_AESDECLAST, A_AESIMC, A_AESKEYGENASSIST, A_RDTSCP, A_STOSQ, A_LODSQ, A_CMPSQ, + A_VADDPD, A_VADDPS, A_VADDSD, A_VADDSS, A_VADDSUBPD, A_VADDSUBPS, A_VAESDEC, + A_VAESDECLAST, A_VAESENC, A_VAESENCLAST, A_VAESIMC, A_VAESKEYGENASSIST, A_VANDNPD, + A_VANDNPS, A_VANDPD, A_VANDPS, A_VBLENDPD, A_VBLENDPS, A_VBLENDVPD, A_VBLENDVPS, + A_VBROADCASTF128, A_VBROADCASTSD, A_VBROADCASTSS, A_VCMPEQPS, A_VCMPLTPS, + A_VCMPLEPS, A_VCMPUNORDPS, A_VCMPNEQPS, A_VCMPNLTPS, A_VCMPNLEPS, A_VCMPORDPS, + A_VCMPEQ_UQPS, A_VCMPNGEPS, A_VCMPNGTPS, A_VCMPFALSEPS, A_VCMPNEQ_OQPS, + A_VCMPGEPS, A_VCMPGTPS, A_VCMPTRUEPS, A_VCMPEQ_OSPS, A_VCMPLT_OQPS, A_VCMPLE_OQPS, + A_VCMPUNORD_SPS, A_VCMPNEQ_USPS, A_VCMPNLT_UQPS, A_VCMPNLE_UQPS, A_VCMPORD_SPS, + A_VCMPEQ_USPS, A_VCMPNGE_UQPS, A_VCMPNGT_UQPS, A_VCMPFALSE_OSPS, A_VCMPNEQ_OSPS, + A_VCMPGE_OQPS, A_VCMPGT_OQPS, A_VCMPTRUE_USPS, A_VCMPEQPD, A_VCMPLTPD, A_VCMPLEPD, + A_VCMPUNORDPD, A_VCMPNEQPD, A_VCMPNLTPD, A_VCMPNLEPD, A_VCMPORDPD, A_VCMPEQ_UQPD, + A_VCMPNGEPD, A_VCMPNGTPD, A_VCMPFALSEPD, A_VCMPNEQ_OQPD, A_VCMPGEPD, A_VCMPGTPD, + A_VCMPTRUEPD, A_VCMPEQ_OSPD, A_VCMPLT_OQPD, A_VCMPLE_OQPD, A_VCMPUNORD_SPD, + A_VCMPNEQ_USPD, A_VCMPNLT_UQPD, A_VCMPNLE_UQPD, A_VCMPORD_SPD, A_VCMPEQ_USPD, + A_VCMPNGE_UQPD, A_VCMPNGT_UQPD, A_VCMPFALSE_OSPD, A_VCMPNEQ_OSPD, A_VCMPGE_OQPD, + A_VCMPGT_OQPD, A_VCMPTRUE_USPD, A_VCMPPD, A_VCMPPS, A_VCMPSD, A_VCMPSS, A_VCOMISD, + A_VCOMISS, A_VCVTDQ2PD, A_VCVTDQ2PS, A_VCVTPD2DQ, A_VCVTPD2PS, A_VCVTPS2DQ, + A_VCVTPS2PD, A_VCVTSD2SI, A_VCVTSD2SS, A_VCVTSI2SD, A_VCVTSI2SS, A_VCVTSS2SD, + A_VCVTSS2SI, A_VCVTTPD2DQ, A_VCVTTPS2DQ, A_VCVTTSD2SI, A_VCVTTSS2SI, A_VDIVPD, + A_VDIVPS, A_VDIVSD, A_VDIVSS, A_VDPPD, A_VDPPS, A_VEXTRACTF128, A_VEXTRACTPS, + A_VHADDPD, A_VHADDPS, A_VHSUBPD, A_VHSUBPS, A_VINSERTF128, A_VINSERTPS, A_VLDDQU, + A_VLDMXCSR, A_VMASKMOVDQU, A_VMASKMOVPD, A_VMASKMOVPS, A_VMAXPD, A_VMAXPS, + A_VMAXSD, A_VMAXSS, A_VMINPD, A_VMINPS, A_VMINSD, A_VMINSS, A_VMOVAPD, A_VMOVAPS, + A_VMOVD, A_VMOVDDUP, A_VMOVDQA, A_VMOVDQU, A_VMOVHLPS, A_VMOVHPD, A_VMOVHPS, + A_VMOVLHPS, A_VMOVLPD, A_VMOVLPS, A_VMOVMSKPD, A_VMOVMSKPS, A_VMOVNTDQ, + A_VMOVNTDQA, A_VMOVNTPD, A_VMOVNTPS, A_VMOVQ, A_VMOVSD, A_VMOVSHDUP, A_VMOVSLDUP, + A_VMOVSS, A_VMOVUPD, A_VMOVUPS, A_VMPSADBW, A_VMULPD, A_VMULPS, A_VMULSD, + A_VMULSS, A_VORPD, A_VORPS, A_VPABSB, A_VPABSD, A_VPABSW, A_VPACKSSDW, + A_VPACKSSWB, A_VPACKUSDW, A_VPACKUSWB, A_VPADDB, A_VPADDD, A_VPADDQ, A_VPADDSB, + A_VPADDSW, A_VPADDUSB, A_VPADDUSW, A_VPADDW, A_VPALIGNR, A_VPAND, A_VPANDN, + A_VPAVGB, A_VPAVGW, A_VPBLENDVB, A_VPBLENDW, A_VPCLMULQDQ, A_VPCMPEQB, A_VPCMPEQD, + A_VPCMPEQQ, A_VPCMPEQW, A_VPCMPESTRI, A_VPCMPESTRM, A_VPCMPGTB, A_VPCMPGTD, + A_VPCMPGTQ, A_VPCMPGTW, A_VPCMPISTRI, A_VPCMPISTRM, A_VPERM2F128, A_VPERMILPD, + A_VPERMILPS, A_VPEXTRB, A_VPEXTRD, A_VPEXTRQ, A_VPEXTRW, A_VPHADDD, A_VPHADDSW, + A_VPHADDW, A_VPHMINPOSUW, A_VPHSUBD, A_VPHSUBSW, A_VPHSUBW, A_VPINSRB, A_VPINSRD, + A_VPINSRQ, A_VPINSRW, A_VPMADDUBSW, A_VPMADDWD, A_VPMAXSB, A_VPMAXSD, A_VPMAXSW, + A_VPMAXUB, A_VPMAXUD, A_VPMAXUW, A_VPMINSB, A_VPMINSD, A_VPMINSW, A_VPMINUB, + A_VPMINUD, A_VPMINUW, A_VPMOVMSKB, A_VPMOVSXBD, A_VPMOVSXBQ, A_VPMOVSXBW, + A_VPMOVSXDQ, A_VPMOVSXWD, A_VPMOVSXWQ, A_VPMOVZXBD, A_VPMOVZXBQ, A_VPMOVZXBW, + A_VPMOVZXDQ, A_VPMOVZXWD, A_VPMOVZXWQ, A_VPMULDQ, A_VPMULHRSW, A_VPMULHUW, + A_VPMULHW, A_VPMULLD, A_VPMULLW, A_VPMULUDQ, A_VPOR, A_VPSADBW, A_VPSHUFB, + A_VPSHUFD, A_VPSHUFHW, A_VPSHUFLW, A_VPSIGNB, A_VPSIGND, A_VPSIGNW, A_VPSLLD, + A_VPSLLDQ, A_VPSLLQ, A_VPSLLW, A_VPSRAD, A_VPSRAW, A_VPSRLD, A_VPSRLDQ, A_VPSRLQ, + A_VPSRLW, A_VPSUBB, A_VPSUBD, A_VPSUBQ, A_VPSUBSB, A_VPSUBSW, A_VPSUBUSB, + A_VPSUBUSW, A_VPSUBW, A_VPTEST, A_VPUNPCKHBW, A_VPUNPCKHDQ, A_VPUNPCKHQDQ, + A_VPUNPCKHWD, A_VPUNPCKLBW, A_VPUNPCKLDQ, A_VPUNPCKLQDQ, A_VPUNPCKLWD, A_VPXOR, + A_VRCPPS, A_VRCPSS, A_VROUNDPD, A_VROUNDPS, A_VROUNDSD, A_VROUNDSS, A_VRSQRTPS, + A_VRSQRTSS, A_VSHUFPD, A_VSHUFPS, A_VSQRTPD, A_VSQRTPS, A_VSQRTSD, A_VSQRTSS, + A_VSTMXCSR, A_VSUBPD, A_VSUBPS, A_VSUBSD, A_VSUBSS, A_VTESTPD, A_VTESTPS, + A_VUCOMISD, A_VUCOMISS, A_VUNPCKHPD, A_VUNPCKHPS, A_VUNPCKLPD, A_VUNPCKLPS, + A_VXORPD, A_VXORPS, A_VZEROALL, A_VZEROUPPER, A_ANDN, A_BEXTR, A_TZCNT, A_BZHI, + A_MULX, A_PDEP, A_PEXT, A_RORX, A_SARX, A_SHLX, A_SHRX, A_VBROADCASTI128, + A_VEXTRACTI128, A_VINSERTI128, A_VPBLENDD, A_VPBROADCASTB, A_VPBROADCASTD, + A_VPBROADCASTQ, A_VPBROADCASTW, A_VPERM2I128, A_VPERMD); + +const + ExtremeRange1Expected: array[0..1023] of Byte = ( + $00, $00, $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 0 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 16 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 32 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 48 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 64 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 80 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 96 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 112 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 128 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $09, { 144 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 160 } + $00, $00, $00, $00, $00, $00, $00, $02, $00, $00, $00, $08, $00, $00, $03, $03, { 176 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 192 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 208 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 224 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 240 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 256 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 272 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 288 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $0B, $00, $00, $00, $00, { 304 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $0B, $00, $00, $00, $00, $00, $00, { 320 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $0A, $00, $00, $00, $00, $00, { 336 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 352 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $0C, $00, $00, $00, $00, $00, $00, { 368 } + $00, $00, $07, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 384 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 400 } + $00, $00, $00, $00, $00, $05, $00, $00, $00, $00, $00, $00, $08, $05, $00, $07, { 416 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 432 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 448 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 464 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 480 } + $07, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 496 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 512 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $05, $00, $00, $00, $05, { 528 } + $00, $07, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 544 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 560 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 576 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 592 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 608 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 624 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 640 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 656 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $06, $06, $00, $00, $00, $00, { 672 } + $00, $00, $00, $00, $00, $00, $06, $06, $00, $00, $00, $00, $00, $00, $00, $00, { 688 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 704 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 720 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 736 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 752 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 768 } + $00, $00, $00, $00, $00, $00, $00, $06, $06, $00, $00, $00, $00, $00, $00, $00, { 784 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 800 } + $04, $04, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 816 } + $00, $00, $00, $08, $00, $00, $08, $04, $04, $00, $00, $00, $06, $06, $06, $06, { 832 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 848 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 864 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 880 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 896 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 912 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 928 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 944 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 960 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $06, $06, $00, { 976 } + $00, $00, $00, $00, $00, $00, $00, $06, $06, $00, $00, $00, $00, $00, $00, $00, { 992 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 { 1008 } + ); + + ExtremeRange2Expected: array[0..1023] of Byte = ( + $00, $00, $00, $01, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 0 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 16 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 32 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 48 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 64 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 80 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 96 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 112 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 128 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $09, { 144 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 160 } + $00, $00, $00, $00, $00, $00, $00, $02, $00, $00, $00, $26, $00, $00, $0D, $03, { 176 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 192 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 208 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 224 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 240 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 256 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 272 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 288 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $0B, $00, $00, $00, $00, { 304 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $27, $00, $00, $00, $00, $00, $00, { 320 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $0A, $00, $00, $00, $00, $00, { 336 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 352 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $0C, $00, $00, $00, $00, $00, $00, { 368 } + $00, $00, $07, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 384 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 400 } + $00, $00, $00, $00, $00, $12, $00, $00, $00, $00, $00, $00, $08, $05, $00, $22, { 416 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 432 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 448 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 464 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 480 } + $23, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 496 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 512 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $11, $00, $00, $00, $13, { 528 } + $00, $21, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 544 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 560 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 576 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 592 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 608 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 624 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 640 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 656 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $1A, $1B, $00, $00, $00, $00, { 672 } + $00, $00, $00, $00, $00, $00, $1C, $1D, $00, $00, $00, $00, $00, $00, $00, $00, { 688 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 704 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 720 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 736 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 752 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 768 } + $00, $00, $00, $00, $00, $00, $00, $14, $15, $00, $00, $00, $00, $00, $00, $00, { 784 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 800 } + $0F, $0E, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 816 } + $00, $00, $00, $24, $00, $00, $25, $04, $10, $00, $00, $00, $18, $19, $1E, $1F, { 832 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 848 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 864 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 880 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 896 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 912 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 928 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 944 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 960 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $16, $17, $00, { 976 } + $00, $00, $00, $00, $00, $00, $00, $20, $06, $00, $00, $00, $00, $00, $00, $00, { 992 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 { 1008 } + ); + + ExtremeRange3Expected: array[0..1023] of Byte = ( + $00, $00, $44, $01, $3F, $40, $00, $00, $00, $41, $42, $00, $00, $00, $00, $00, { 0 } + $00, $00, $00, $45, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 16 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 32 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 48 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 64 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 80 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 96 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 112 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 128 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $09, { 144 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 160 } + $00, $00, $00, $00, $00, $00, $00, $02, $00, $00, $00, $26, $00, $00, $0D, $03, { 176 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 192 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 208 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 224 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 240 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 256 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 272 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 288 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $0B, $00, $00, $00, $00, { 304 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $27, $00, $00, $00, $00, $00, $00, { 320 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $0A, $00, $00, $00, $00, $00, { 336 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 352 } + $00, $43, $00, $00, $00, $00, $00, $00, $00, $0C, $00, $00, $00, $00, $00, $00, { 368 } + $00, $00, $07, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 384 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 400 } + $00, $00, $00, $00, $00, $12, $00, $00, $00, $00, $00, $00, $08, $05, $00, $22, { 416 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 432 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 448 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 464 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 480 } + $23, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 496 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 512 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $11, $00, $00, $00, $13, { 528 } + $00, $21, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 544 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 560 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 576 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 592 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $33, $34, $00, $00, $00, { 608 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 624 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 640 } + $00, $00, $00, $2E, $2F, $30, $31, $32, $00, $00, $00, $00, $00, $00, $00, $00, { 656 } + $00, $00, $00, $00, $00, $00, $00, $00, $2C, $2D, $1A, $1B, $00, $00, $35, $36, { 672 } + $37, $38, $39, $3A, $00, $00, $1C, $1D, $00, $00, $00, $00, $29, $00, $00, $00, { 688 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 704 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 720 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 736 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 752 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 768 } + $00, $00, $00, $00, $00, $00, $00, $14, $15, $00, $00, $00, $00, $00, $00, $00, { 784 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 800 } + $0F, $0E, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 816 } + $00, $00, $00, $24, $00, $00, $25, $04, $10, $00, $00, $00, $18, $19, $1E, $1F, { 832 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 848 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 864 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 880 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 896 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 912 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $3B, $3C, $3D, $3E, $00, $00, $00, { 928 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 944 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, { 960 } + $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $16, $17, $00, { 976 } + $00, $00, $00, $00, $00, $00, $00, $20, $06, $00, $00, $00, $00, $00, $00, $28, { 992 } + $00, $00, $00, $00, $46, $47, $2A, $00, $00, $00, $00, $00, $00, $00, $00, $2B { 1008 } + ); + +{ TTestAncestor } +type + TTestAncestor = class + private + FStartTime: Real; + FEndTime: Real; + FAvgTime: Real; + procedure SetStartTime; + procedure SetEndTime; + protected + procedure DoTestIteration(Iteration: Integer); virtual; abstract; + public + constructor Create; virtual; + destructor Destroy; override; + procedure Run; + function TestTitle: shortstring; virtual; abstract; + function WriteResults: Boolean; virtual; abstract; + property RunTime: Real read FAvgTime; + end; + + TTestClass = class of TTestAncestor; + + TByteTest = class(TTestAncestor) + protected + FResultStorage: array[Byte] of Byte; + end; + + TWordTest = class(TTestAncestor) + protected + FResultStorage: array[Word] of Byte; + end; + + TMappedTest = class(TByteTest) + protected + procedure DoMapping(Index, Input: Integer); virtual; abstract; + end; + + TCompleteByteRange = class(TMappedTest) + protected + procedure DoTestIteration(Iteration: Integer); override; + procedure DoMapping(Index, Input: Integer); override; + public + function TestTitle: shortstring; override; + function WriteResults: Boolean; override; + end; + + TCompleteByteRangeFirstWeighted = class(TCompleteByteRange) + protected + procedure DoTestIteration(Iteration: Integer); override; + public + function TestTitle: shortstring; override; + function WriteResults: Boolean; override; + end; + + TCompleteByteRangeLastWeighted = class(TCompleteByteRange) + protected + procedure DoTestIteration(Iteration: Integer); override; + public + function TestTitle: shortstring; override; + function WriteResults: Boolean; override; + end; + + TAlmostFullByteRange = class(TMappedTest) + protected + procedure DoTestIteration(Iteration: Integer); override; + procedure DoMapping(Index, Input: Integer); override; + public + function TestTitle: shortstring; override; + function WriteResults: Boolean; override; + end; + + TAlmostFullByteRangeFirstWeighted = class(TAlmostFullByteRange) + protected + procedure DoTestIteration(Iteration: Integer); override; + public + function TestTitle: shortstring; override; + function WriteResults: Boolean; override; + end; + + TAlmostFullByteRangeLastWeighted = class(TAlmostFullByteRange) + protected + procedure DoTestIteration(Iteration: Integer); override; + public + function TestTitle: shortstring; override; + function WriteResults: Boolean; override; + end; + + TSingleEntryWithDefault = class(TByteTest) + protected + procedure DoTestIteration(Iteration: Integer); override; + public + function TestTitle: shortstring; override; + function WriteResults: Boolean; override; + end; + + TSingleEntryWithDefaultUnlikely = class(TByteTest) + protected + procedure DoTestIteration(Iteration: Integer); override; + public + function TestTitle: shortstring; override; + function WriteResults: Boolean; override; + end; + + TSingleEntryWithDefaultWeighted = class(TByteTest) + protected + procedure DoTestIteration(Iteration: Integer); override; + public + function TestTitle: shortstring; override; + function WriteResults: Boolean; override; + end; + + TSingleEntryWithElse = class(TSingleEntryWithDefault) + protected + procedure DoTestIteration(Iteration: Integer); override; + public + function TestTitle: shortstring; override; + end; + + TSingleEntryWithElseUnlikely = class(TSingleEntryWithDefaultUnlikely) + protected + procedure DoTestIteration(Iteration: Integer); override; + public + function TestTitle: shortstring; override; + end; + + TSingleEntryWithElseWeighted = class(TSingleEntryWithDefaultWeighted) + protected + procedure DoTestIteration(Iteration: Integer); override; + public + function TestTitle: shortstring; override; + end; + + TSingleEntryAtZeroWithElse = class(TByteTest) + protected + procedure DoTestIteration(Iteration: Integer); override; + public + function TestTitle: shortstring; override; + function WriteResults: Boolean; override; + end; + + TSingleEntryAtMinus1WithDefault = class(TByteTest) + protected + procedure DoTestIteration(Iteration: Integer); override; + public + function TestTitle: shortstring; override; + function WriteResults: Boolean; override; + end; + + TSingleEntryAtMinus4WithElse = class(TByteTest) + protected + procedure DoTestIteration(Iteration: Integer); override; + public + function TestTitle: shortstring; override; + function WriteResults: Boolean; override; + end; + + TSingleEntryWith0To5RangeWithElse = class(TByteTest) + protected + procedure DoTestIteration(Iteration: Integer); override; + public + function TestTitle: shortstring; override; + function WriteResults: Boolean; override; + end; + + TSingleEntryWith0To50RangeWithElse = class(TByteTest) + protected + procedure DoTestIteration(Iteration: Integer); override; + public + function TestTitle: shortstring; override; + function WriteResults: Boolean; override; + end; + + TSingleEntryWith1To5RangeWithElse = class(TByteTest) + protected + procedure DoTestIteration(Iteration: Integer); override; + public + function TestTitle: shortstring; override; + function WriteResults: Boolean; override; + end; + + TSingleEntryWith1To50RangeWithElse = class(TByteTest) + protected + procedure DoTestIteration(Iteration: Integer); override; + public + function TestTitle: shortstring; override; + function WriteResults: Boolean; override; + end; + + TSingleEntryWithMinus1To5RangeWithElse = class(TByteTest) + protected + procedure DoTestIteration(Iteration: Integer); override; + public + function TestTitle: shortstring; override; + function WriteResults: Boolean; override; + end; + + TSingleEntryWithMinus1To50RangeWithElse = class(TByteTest) + protected + procedure DoTestIteration(Iteration: Integer); override; + public + function TestTitle: shortstring; override; + function WriteResults: Boolean; override; + end; + + TExtremeRange1 = class(TWordTest) + protected + procedure DoTestIteration(Iteration: Integer); override; + public + function TestTitle: shortstring; override; + function WriteResults: Boolean; override; + end; + + TExtremeRange2 = class(TWordTest) + protected + procedure DoTestIteration(Iteration: Integer); override; + public + function TestTitle: shortstring; override; + function WriteResults: Boolean; override; + end; + + TExtremeRange3 = class(TWordTest) + protected + procedure DoTestIteration(Iteration: Integer); override; + public + function TestTitle: shortstring; override; + function WriteResults: Boolean; override; + end; + + TExtremeRange4 = class(TWordTest) + protected + procedure DoTestIteration(Iteration: Integer); override; + public + function TestTitle: shortstring; override; + function WriteResults: Boolean; override; + end; + + TSparseDataTest1 = class(TWordTest) + protected + procedure DoCaseBlock(Index: Integer; Input: TInstructionSet); inline; + end; + + TSparseDataEqual1 = class(TSparseDataTest1) + protected + procedure DoTestIteration(Iteration: Integer); override; + public + function TestTitle: shortstring; override; + function WriteResults: Boolean; override; + end; + + TSparseDataMOVWeighted1 = class(TSparseDataTest1) + protected + procedure DoTestIteration(Iteration: Integer); override; + public + function TestTitle: shortstring; override; + function WriteResults: Boolean; override; + end; + + TSparseDataMidpointWeighted1 = class(TSparseDataTest1) + protected + procedure DoTestIteration(Iteration: Integer); override; + public + function TestTitle: shortstring; override; + function WriteResults: Boolean; override; + end; + + TSparseDataTest2 = class(TWordTest) + protected + procedure DoCaseBlock(Index: Integer; Input: TInstructionSet); inline; + end; + + TSparseDataEqual2 = class(TSparseDataTest2) + protected + procedure DoTestIteration(Iteration: Integer); override; + public + function TestTitle: shortstring; override; + function WriteResults: Boolean; override; + end; + + TSparseDataMOVWeighted2 = class(TSparseDataTest2) + protected + procedure DoTestIteration(Iteration: Integer); override; + public + function TestTitle: shortstring; override; + function WriteResults: Boolean; override; + end; + + TSparseDataMidpointWeighted2 = class(TSparseDataTest2) + protected + procedure DoTestIteration(Iteration: Integer); override; + public + function TestTitle: shortstring; override; + function WriteResults: Boolean; override; + end; + + TSparseDataTest3 = class(TWordTest) + protected + procedure DoCaseBlock(Index: Integer; Input: TInstructionSet); inline; + end; + + TSparseDataEqual3 = class(TSparseDataTest3) + protected + procedure DoTestIteration(Iteration: Integer); override; + public + function TestTitle: shortstring; override; + function WriteResults: Boolean; override; + end; + + TSparseDataMOVWeighted3 = class(TSparseDataTest3) + protected + procedure DoTestIteration(Iteration: Integer); override; + public + function TestTitle: shortstring; override; + function WriteResults: Boolean; override; + end; + + TSparseDataMidpointWeighted3 = class(TSparseDataTest3) + protected + procedure DoTestIteration(Iteration: Integer); override; + public + function TestTitle: shortstring; override; + function WriteResults: Boolean; override; + end; + + TLinearListDependsOnInput = class(TByteTest) + protected + procedure DoTestIteration(Iteration: Integer); override; + public + function TestTitle: shortstring; override; + function WriteResults: Boolean; override; + end; + + TCStyleCascade = class(TByteTest) + protected + procedure DoTestIteration(Iteration: Integer); override; + public + function TestTitle: shortstring; override; + function WriteResults: Boolean; override; + end; + +{ TTestAncestor } +constructor TTestAncestor.Create; + begin + FStartTime := 0; + FEndTime := 0; + FAvgTime := 0; + end; + +destructor TTestAncestor.Destroy; + begin + inherited Destroy; + end; + +procedure TTestAncestor.SetStartTime; + begin + FStartTime := GetRealTime(); + end; + +procedure TTestAncestor.SetEndTime; + begin + FEndTime := GetRealTime(); + if FEndTime < FStartTime then { Happens if the test runs past midnight } + FEndTime := FEndTime + 86400.0; + end; + +procedure TTestAncestor.Run; + var + X: Integer; + begin + SetStartTime; + for X := 0 to ITERATIONS - 1 do + DoTestIteration(X); + + SetEndTime; + + FAvgTime := FEndTime - FStartTime; + end; + +{ TCompleteByteRange } +function TCompleteByteRange.TestTitle: shortstring; + begin + Result := 'Byte domain, entirely covered; equal polling'; + end; + +function TCompleteByteRange.WriteResults: Boolean; + var + X: Byte; + begin + Result := True; + + for X := 0 to 255 do + if FResultStorage[X] <> AES_S_Box[X] then + begin + WriteLn('FAIL - Index ', X, '; expected $', hexstr(AES_S_Box[X], 2), ' got $', hexstr(FResultStorage[X], 2)); + Result := False; + Exit; + end; + end; + +procedure TCompleteByteRange.DoMapping(Index, Input: Integer); + begin + case Input of + { First row of S-Box (except zero) } + $00: FResultStorage[Index] := $63; + $01: FResultStorage[Index] := $7c; + $02: FResultStorage[Index] := $77; + $03: FResultStorage[Index] := $7b; + $04: FResultStorage[Index] := $f2; + $05: FResultStorage[Index] := $6b; + $06: FResultStorage[Index] := $6f; + $07: FResultStorage[Index] := $c5; + $08: FResultStorage[Index] := $30; + $09: FResultStorage[Index] := $01; + $0A: FResultStorage[Index] := $67; + $0B: FResultStorage[Index] := $2b; + $0C: FResultStorage[Index] := $fe; + $0D: FResultStorage[Index] := $d7; + $0E: FResultStorage[Index] := $ab; + $0F: FResultStorage[Index] := $76; + {Last row of S-Box } + $F0: FResultStorage[Index] := $8c; + $F1: FResultStorage[Index] := $a1; + $F2: FResultStorage[Index] := $89; + $F3: FResultStorage[Index] := $0d; + $F4: FResultStorage[Index] := $bf; + $F5: FResultStorage[Index] := $e6; + $F6: FResultStorage[Index] := $42; + $F7: FResultStorage[Index] := $68; + $F8: FResultStorage[Index] := $41; + $F9: FResultStorage[Index] := $99; + $FA: FResultStorage[Index] := $2d; + $FB: FResultStorage[Index] := $0f; + $FC: FResultStorage[Index] := $b0; + $FD: FResultStorage[Index] := $54; + $FE: FResultStorage[Index] := $bb; + $FF: FResultStorage[Index] := $16; + { Everything else } + $10..$EF: FResultStorage[Index] := AES_S_Box[Input]; + end; + end; + +procedure TCompleteByteRange.DoTestIteration(Iteration: Integer); + var + Input: Byte; + begin + Input := Iteration and $FF; + DoMapping(Input, Input); + end; + +{ TCompleteByteRangeFirstWeighted } + +function TCompleteByteRangeFirstWeighted.TestTitle: shortstring; + begin + Result := 'Byte domain, entirely covered; first weighted'; + end; + +function TCompleteByteRangeFirstWeighted.WriteResults: Boolean; + var + X: Byte; + begin + Result := True; + + for X := 0 to 255 do + if FResultStorage[X] <> FirstWeighted[X] then + begin + WriteLn('FAIL - Index ', X, '; expected $', hexstr(FirstWeighted[X], 2), ' got $', hexstr(FResultStorage[X], 2)); + Result := False; + Exit; + end; + end; + +procedure TCompleteByteRangeFirstWeighted.DoTestIteration(Iteration: Integer); + var + Input: Byte; + begin + Input := Iteration and $FF; + if Input < $C0 then + DoMapping(Input, 0) + else + DoMapping(Input, Input); + end; + +{ TCompleteByteRangeLastWeighted } + +function TCompleteByteRangeLastWeighted.TestTitle: shortstring; + begin + Result := 'Byte domain, entirely covered; last weighted'; + end; + +function TCompleteByteRangeLastWeighted.WriteResults: Boolean; + var + X: Byte; + begin + Result := True; + + for X := 0 to 255 do + if FResultStorage[X] <> LastWeighted[X] then + begin + WriteLn('FAIL - Index ', X, '; expected $', hexstr(LastWeighted[X], 2), ' got $', hexstr(FResultStorage[X], 2)); + Result := False; + Exit; + end; + end; + +procedure TCompleteByteRangeLastWeighted.DoTestIteration(Iteration: Integer); + var + Input: Byte; + begin + Input := Iteration and $FF; + if Input < $C0 then + DoMapping(Input, $FF) + else + DoMapping(Input, Input); + end; + +{ TAlmostFullByteRange } + +function TAlmostFullByteRange.TestTitle: shortstring; + begin + Result := 'Byte domain, almost entirely covered; equal polling'; + end; + +function TAlmostFullByteRange.WriteResults: Boolean; + var + X: Byte; + begin + Result := True; + + for X := 0 to 255 do + if FResultStorage[X] <> AlmostFullExpected[X] then + begin + WriteLn('FAIL - Index ', X, '; expected $', hexstr(AlmostFullExpected[X], 2), ' got $', hexstr(FResultStorage[X], 2)); + Result := False; + Exit; + end; + end; + +procedure TAlmostFullByteRange.DoMapping(Index, Input: Integer); + begin + case Input of + { First row of S-Box } + $00: FResultStorage[Index] := $63; + $01: FResultStorage[Index] := $7c; + $02: FResultStorage[Index] := $77; + $03: FResultStorage[Index] := $7b; + $04: FResultStorage[Index] := $f2; + $05: FResultStorage[Index] := $6b; + $06: FResultStorage[Index] := $6f; + $07: FResultStorage[Index] := $c5; + $08: FResultStorage[Index] := $30; + $09: FResultStorage[Index] := $01; + $0A: FResultStorage[Index] := $67; + $0B: FResultStorage[Index] := $2b; + $0C: FResultStorage[Index] := $fe; + $0D: FResultStorage[Index] := $d7; + $0E: FResultStorage[Index] := $ab; + $0F: FResultStorage[Index] := $76; + { Other rows } + $10..$3F: FResultStorage[Index] := AES_S_Box[Input]; + $60..$FF: FResultStorage[Index] := AES_S_Box[Input]; + { Zeroed rows } + else FResultStorage[Index] := $00; + end; + end; + +procedure TAlmostFullByteRange.DoTestIteration(Iteration: Integer); + var + Input: Byte; + begin + Input := Iteration and $FF; + DoMapping(Input, Input); + end; + +{ TAlmostFullByteRangeFirstWeighted } + +function TAlmostFullByteRangeFirstWeighted.TestTitle: shortstring; + begin + Result := 'Byte domain, almost entirely covered; first weighted'; + end; + +function TAlmostFullByteRangeFirstWeighted.WriteResults: Boolean; + var + X: Byte; + begin + Result := True; + + for X := 0 to 255 do + if FResultStorage[X] <> FirstWeighted[X] then + begin + WriteLn('FAIL - Index ', X, '; expected $', hexstr(FirstWeighted[X], 2), ' got $', hexstr(FResultStorage[X], 2)); + Result := False; + Exit; + end; + end; + +procedure TAlmostFullByteRangeFirstWeighted.DoTestIteration(Iteration: Integer); + var + Input: Byte; + begin + Input := Iteration and $FF; + if Input < $C0 then + DoMapping(Input, 0) + else + DoMapping(Input, Input); + end; + +{ TAlmostFullByteRangeLastWeighted } + +function TAlmostFullByteRangeLastWeighted.TestTitle: shortstring; + begin + Result := 'Byte domain, almost entirely covered; last weighted'; + end; + +function TAlmostFullByteRangeLastWeighted.WriteResults: Boolean; + var + X: Byte; + begin + Result := True; + + for X := 0 to 255 do + if FResultStorage[X] <> LastWeighted[X] then + begin + WriteLn('FAIL - Index ', X, '; expected $', hexstr(LastWeighted[X], 2), ' got $', hexstr(FResultStorage[X], 2)); + Result := False; + Exit; + end; + end; + +procedure TAlmostFullByteRangeLastWeighted.DoTestIteration(Iteration: Integer); + var + Input: Byte; + begin + Input := Iteration and $FF; + if Input < $C0 then + DoMapping(Input, $FF) + else + DoMapping(Input, Input); + end; + +{ TSingleEntryWithDefault } +function TSingleEntryWithDefault.TestTitle: shortstring; + begin + Result := 'Single entry with default value; 1/256 match chance'; + end; + +function TSingleEntryWithDefault.WriteResults: Boolean; + var + X: Byte; + begin + Result := True; + + for X := 0 to 255 do + if FResultStorage[X] <> IIf(X = 71, 1, 0) then + begin + WriteLn('FAIL - Index ', X, '; expected $', hexstr(IIf(X = 71, 1, 0), 2), ' got $', hexstr(FResultStorage[X], 2)); + Result := False; + Exit; + end; + end; + +procedure TSingleEntryWithDefault.DoTestIteration(Iteration: Integer); + var + Index: Byte; + begin + Index := Iteration and $FF; + FResultStorage[Index] := 0; + case Index of + 71: FResultStorage[Index] := 1; + end; + end; + +{ TSingleEntryWithDefaultUnlikely } + +function TSingleEntryWithDefaultUnlikely.TestTitle: shortstring; + begin + Result := 'Single entry with default value; 75% match chance'; + end; + +function TSingleEntryWithDefaultUnlikely.WriteResults: Boolean; + var + X: Byte; + begin + Result := True; + + for X := 0 to 255 do + if FResultStorage[X] <> IIf(((X and $2) shr 1) or (X and $1) = 1, 1, 0) then + begin + WriteLn('FAIL - Index ', X, '; expected $', hexstr(IIf(((X and $2) shr 1) or (X and $1) = 1, 1, 0), 2), ' got $', hexstr(FResultStorage[X], 2)); + Result := False; + Exit; + end; + end; + +procedure TSingleEntryWithDefaultUnlikely.DoTestIteration(Iteration: Integer); + var + Index: Byte; + begin + Index := Iteration and $FF; + FResultStorage[Index] := 0; + case ((Index and $2) shr 1) or (Index and $1) of + 1: FResultStorage[Index] := 1; + end; + end; + +{ TSingleEntryWithDefaultWeighted } + +function TSingleEntryWithDefaultWeighted.TestTitle: shortstring; + begin + Result := 'Single entry with default value; 25% match chance'; + end; + +function TSingleEntryWithDefaultWeighted.WriteResults: Boolean; + var + X: Byte; + begin + Result := True; + + for X := 0 to 255 do + if FResultStorage[X] <> IIf(((X and $2) shr 1) and (X and $1) = 1, 1, 0) then + begin + WriteLn('FAIL - Index ', X, '; expected $', hexstr(IIf(((X and $2) shr 1) and (X and $1) = 1, 1, 0), 2), ' got $', hexstr(FResultStorage[X], 2)); + Result := False; + Exit; + end; + end; + +procedure TSingleEntryWithDefaultWeighted.DoTestIteration(Iteration: Integer); + var + Index: Byte; + begin + Index := Iteration and $FF; + FResultStorage[Index] := 0; + case ((Index and $2) shr 1) and (Index and $1) of + 1: FResultStorage[Index] := 1; + end; + end; + +{ TSingleEntryWithElse } +function TSingleEntryWithElse.TestTitle: shortstring; + begin + Result := 'Single entry with else block; 1/256 match chance'; + end; + +procedure TSingleEntryWithElse.DoTestIteration(Iteration: Integer); + var + Index: Byte; + begin + Index := Iteration and $FF; + { This helps catch errors where all branches, including else, are skipped } + FResultStorage[Index] := $FF; + case Index of + 71: FResultStorage[Index] := 1; + else FResultStorage[Index] := 0; + end; + end; + +{ TSingleEntryWithElseUnlikely } +function TSingleEntryWithElseUnlikely.TestTitle: shortstring; + begin + Result := 'Single entry with else block; 75% match chance'; + end; + +procedure TSingleEntryWithElseUnlikely.DoTestIteration(Iteration: Integer); + var + Index: Byte; + begin + Index := Iteration and $FF; + { This helps catch errors where all branches, including else, are skipped } + FResultStorage[Index] := $FF; + case ((Index and $2) shr 1) or (Index and $1) of + 1: FResultStorage[Index] := 1; + else FResultStorage[Index] := 0; + end; + end; + +{ TSingleEntryWithElseWeighted } + +function TSingleEntryWithElseWeighted.TestTitle: shortstring; + begin + Result := 'Single entry with else block; 25% match chance'; + end; + +procedure TSingleEntryWithElseWeighted.DoTestIteration(Iteration: Integer); + var + Index: Byte; + begin + Index := Iteration and $FF; + { This helps catch errors where all branches, including else, are skipped } + FResultStorage[Index] := $FF; + case ((Index and $2) shr 1) and (Index and $1) of + 1: FResultStorage[Index] := 1; + else FResultStorage[Index] := 0; + end; + end; + +{ TSingleEntryAtZeroWithElse } + +function TSingleEntryAtZeroWithElse.TestTitle: shortstring; + begin + Result := 'Single entry of "0:" and else block'; + end; + +function TSingleEntryAtZeroWithElse.WriteResults: Boolean; + var + X: Word; + begin + Result := True; + + if FResultStorage[0] <> 1 then + begin + WriteLn('FAIL - Index 0; expected $01 got $', hexstr(FResultStorage[0], 2)); + Result := False; + Exit; + end; + + for X := 1 to $FF do + if FResultStorage[X] <> 0 then + begin + WriteLn('FAIL - Index ', X, '; expected $00 got $', hexstr(FResultStorage[X], 2)); + Result := False; + Exit; + end; + end; + +procedure TSingleEntryAtZeroWithElse.DoTestIteration(Iteration: Integer); + var + Index: Byte; + begin + Index := Iteration and $FF; + { This helps catch errors where all branches, including else, are skipped } + FResultStorage[Index] := $FF; + case Index of + 0: FResultStorage[Index] := 1; + else FResultStorage[Index] := 0; + end; + end; + +{ TSingleEntryAtMinus1WithDefault } + +function TSingleEntryAtMinus1WithDefault.TestTitle: shortstring; + begin + Result := 'Single entry of "-1:" with default value'; + end; + +function TSingleEntryAtMinus1WithDefault.WriteResults: Boolean; + var + X: Word; + begin + Result := True; + + for X := 0 to $FE do + if FResultStorage[X] <> 0 then + begin + WriteLn('FAIL - Index ', X, '; expected $00 got $', hexstr(FResultStorage[X], 2)); + Result := False; + Exit; + end; + + if FResultStorage[255] <> 1 then + begin + WriteLn('FAIL - Index 255; expected $01 got $', hexstr(FResultStorage[0], 2)); + Result := False; + Exit; + end; + end; + +procedure TSingleEntryAtMinus1WithDefault.DoTestIteration(Iteration: Integer); + var + Index: ShortInt; + begin + Index := ShortInt(Iteration and $FF); + FResultStorage[Byte(Index)] := 0; + case Index of + -1: FResultStorage[255] := 1; + end; + end; + +{ TSingleEntryAtMinus4WithElse } + +function TSingleEntryAtMinus4WithElse.TestTitle: shortstring; + begin + Result := 'Single entry of "-4:" and else block'; + end; + +function TSingleEntryAtMinus4WithElse.WriteResults: Boolean; + var + X: Word; + begin + Result := True; + for X := 0 to 251 do + if FResultStorage[X] <> 0 then + begin + WriteLn('FAIL - Index ', X, '; expected $00 got $', hexstr(FResultStorage[X], 2)); + Result := False; + Exit; + end; + + if FResultStorage[252] <> 1 then + begin + WriteLn('FAIL - Index 0; expected $01 got $', hexstr(FResultStorage[252], 2)); + Result := False; + Exit; + end; + + for X := 253 to 255 do + if FResultStorage[X] <> 0 then + begin + WriteLn('FAIL - Index ', X, '; expected $00 got $', hexstr(FResultStorage[X], 2)); + Result := False; + Exit; + end; + end; + +procedure TSingleEntryAtMinus4WithElse.DoTestIteration(Iteration: Integer); + var + Index: ShortInt; + begin + Index := ShortInt(Iteration and $FF); + { This helps catch errors where all branches, including else, are skipped } + FResultStorage[Byte(Index)] := $FF; + case Index of + -4: FResultStorage[Byte(Index)] := 1; + else FResultStorage[Byte(Index)] := 0; + end; + end; + +{ TSingleEntryWith0To5RangeWithElse } + +function TSingleEntryWith0To5RangeWithElse.TestTitle: shortstring; + begin + Result := 'Single entry of "0..5" and else block'; + end; + +function TSingleEntryWith0To5RangeWithElse.WriteResults: Boolean; + var + X: Word; + begin + Result := True; + + for X := 0 to 5 do + if FResultStorage[X] <> 1 then + begin + WriteLn('FAIL - Index ', X, '; expected $01 got $', hexstr(FResultStorage[X], 2)); + Result := False; + Exit; + end; + + for X := 6 to $FF do + if FResultStorage[X] <> 0 then + begin + WriteLn('FAIL - Index ', X, '; expected $00 got $', hexstr(FResultStorage[X], 2)); + Result := False; + Exit; + end; + end; + +procedure TSingleEntryWith0To5RangeWithElse.DoTestIteration(Iteration: Integer); + var + Index: Byte; + begin + Index := Iteration and $FF; + { This helps catch errors where all branches, including else, are skipped } + FResultStorage[Index] := $FF; + case Index of + 0..5: FResultStorage[Index] := 1; + else FResultStorage[Index] := 0; + end; + end; + +{ TSingleEntryWith0To50RangeWithElse } + +function TSingleEntryWith0To50RangeWithElse.TestTitle: shortstring; + begin + Result := 'Single entry of "0..50" and else block'; + end; + +function TSingleEntryWith0To50RangeWithElse.WriteResults: Boolean; + var + X: Word; + begin + Result := True; + + for X := 0 to 50 do + if FResultStorage[X] <> 1 then + begin + WriteLn('FAIL - Index ', X, '; expected $01 got $', hexstr(FResultStorage[X], 2)); + Result := False; + Exit; + end; + + for X := 51 to $FF do + if FResultStorage[X] <> 0 then + begin + WriteLn('FAIL - Index ', X, '; expected $00 got $', hexstr(FResultStorage[X], 2)); + Result := False; + Exit; + end; + end; + +procedure TSingleEntryWith0To50RangeWithElse.DoTestIteration(Iteration: Integer); + var + Index: Byte; + begin + Index := Iteration and $FF; + { This helps catch errors where all branches, including else, are skipped } + FResultStorage[Index] := $FF; + case Index of + 0..50: FResultStorage[Index] := 1; + else FResultStorage[Index] := 0; + end; + end; + +{ TSingleEntryWith1To5RangeWithElse } + +function TSingleEntryWith1To5RangeWithElse.TestTitle: shortstring; + begin + Result := 'Single entry of "1..5" and else block'; + end; + +function TSingleEntryWith1To5RangeWithElse.WriteResults: Boolean; + var + X: Word; + begin + Result := True; + if FResultStorage[0] <> 0 then + begin + WriteLn('FAIL - Index 0; expected $00 got $', hexstr(FResultStorage[0], 2)); + Result := False; + Exit; + end; + + for X := 1 to 5 do + if FResultStorage[X] <> 1 then + begin + WriteLn('FAIL - Index ', X, '; expected $01 got $', hexstr(FResultStorage[X], 2)); + Result := False; + Exit; + end; + + for X := 6 to $FF do + if FResultStorage[X] <> 0 then + begin + WriteLn('FAIL - Index ', X, '; expected $00 got $', hexstr(FResultStorage[X], 2)); + Result := False; + Exit; + end; + end; + +procedure TSingleEntryWith1To5RangeWithElse.DoTestIteration(Iteration: Integer); + var + Index: Byte; + begin + Index := Iteration and $FF; + { This helps catch errors where all branches, including else, are skipped } + FResultStorage[Index] := $FF; + case Index of + 1..5: FResultStorage[Index] := 1; + else FResultStorage[Index] := 0; + end; + end; + +{ TSingleEntryWith1To50RangeWithElse } + +function TSingleEntryWith1To50RangeWithElse.TestTitle: shortstring; + begin + Result := 'Single entry of "1..50" and else block'; + end; + +function TSingleEntryWith1To50RangeWithElse.WriteResults: Boolean; + var + X: Word; + begin + Result := True; + if FResultStorage[0] <> 0 then + begin + WriteLn('FAIL - Index 0; expected $00 got $', hexstr(FResultStorage[0], 2)); + Result := False; + Exit; + end; + + for X := 1 to 50 do + if FResultStorage[X] <> 1 then + begin + WriteLn('FAIL - Index ', X, '; expected $01 got $', hexstr(FResultStorage[X], 2)); + Result := False; + Exit; + end; + + for X := 51 to $FF do + if FResultStorage[X] <> 0 then + begin + WriteLn('FAIL - Index ', X, '; expected $00 got $', hexstr(FResultStorage[X], 2)); + Result := False; + Exit; + end; + end; + +procedure TSingleEntryWith1To50RangeWithElse.DoTestIteration(Iteration: Integer); + var + Index: Byte; + begin + Index := Iteration and $FF; + { This helps catch errors where all branches, including else, are skipped } + FResultStorage[Index] := $FF; + case Index of + 1..50: FResultStorage[Index] := 1; + else FResultStorage[Index] := 0; + end; + end; + + +{ TSingleEntryWithMinus1To5RangeWithElse } + +function TSingleEntryWithMinus1To5RangeWithElse.TestTitle: shortstring; + begin + Result := 'Single entry of "-1..5" and else block'; + end; + +function TSingleEntryWithMinus1To5RangeWithElse.WriteResults: Boolean; + var + X: Word; + begin + Result := True; + for X := 0 to 5 do + if FResultStorage[X] <> 1 then + begin + WriteLn('FAIL - Index ', X, '; expected $01 got $', hexstr(FResultStorage[X], 2)); + Result := False; + Exit; + end; + + for X := 6 to $FE do + if FResultStorage[X] <> 0 then + begin + WriteLn('FAIL - Index ', X, '; expected $00 got $', hexstr(FResultStorage[X], 2)); + Result := False; + Exit; + end; + + if FResultStorage[$FF] <> 1 then + begin + WriteLn('FAIL - Index 255; expected $00 got $', hexstr(FResultStorage[0], 2)); + Result := False; + Exit; + end; + end; + +procedure TSingleEntryWithMinus1To5RangeWithElse.DoTestIteration(Iteration: Integer); + var + Index: ShortInt; + begin + Index := ShortInt(Iteration and $FF); + { This helps catch errors where all branches, including else, are skipped } + FResultStorage[Byte(Index)] := $FF; + case Index of + -1..5: FResultStorage[Byte(Index)] := 1; + else FResultStorage[Byte(Index)] := 0; + end; + end; + +{ TSingleEntryWithMinus1To50RangeWithElse } + +function TSingleEntryWithMinus1To50RangeWithElse.TestTitle: shortstring; + begin + Result := 'Single entry of "-1..50" and else block'; + end; + +function TSingleEntryWithMinus1To50RangeWithElse.WriteResults: Boolean; + var + X: Word; + begin + Result := True; + for X := 0 to 50 do + if FResultStorage[X] <> 1 then + begin + WriteLn('FAIL - Index ', X, '; expected $01 got $', hexstr(FResultStorage[X], 2)); + Result := False; + Exit; + end; + + for X := 51 to $FE do + if FResultStorage[X] <> 0 then + begin + WriteLn('FAIL - Index ', X, '; expected $00 got $', hexstr(FResultStorage[X], 2)); + Result := False; + Exit; + end; + + if FResultStorage[$FF] <> 1 then + begin + WriteLn('FAIL - Index 255; expected $00 got $', hexstr(FResultStorage[0], 2)); + Result := False; + Exit; + end; + end; + +procedure TSingleEntryWithMinus1To50RangeWithElse.DoTestIteration(Iteration: Integer); + var + Index: ShortInt; + begin + Index := ShortInt(Iteration and $FF); + { This helps catch errors where all branches, including else, are skipped } + FResultStorage[Byte(Index)] := $FF; + case Index of + -1..50: FResultStorage[Byte(Index)] := 1; + else FResultStorage[Byte(Index)] := 0; + end; + end; + +{ TExtremeRange1 } + +function TExtremeRange1.TestTitle: shortstring; + begin + Result := 'Two labels, one with extreme spread, equal polling'; + end; + +function TExtremeRange1.WriteResults: Boolean; + var + X: Word; + begin + Result := True; + + if FResultStorage[0] <> 1 then + begin + WriteLn('FAIL - Index 0; expected $01 got $', hexstr(FResultStorage[0], 2)); + Result := False; + Exit; + end; + + for X := 1 to $FFFE do + if FResultStorage[X] <> 2 then + begin + WriteLn('FAIL - Index ', X, '; expected $02 got $', hexstr(FResultStorage[X], 2)); + Result := False; + Exit; + end; + + if FResultStorage[65535] <> 0 then + begin + WriteLn('FAIL - Index 65535; expected $02 got $', hexstr(FResultStorage[65535], 2)); + Result := False; + Exit; + end; + end; + +procedure TExtremeRange1.DoTestIteration(Iteration: Integer); + var + Index: Word; + begin + Index := Iteration and $FFFF; + FResultStorage[Index] := 0; { Covers $FFFF } + case Index of + 0: + FResultStorage[Index] := 1; + 1..$FFFE: + FResultStorage[Index] := 2; + end; + end; + +{ TExtremeRange2 } + +function TExtremeRange2.TestTitle: shortstring; + begin + Result := 'Two labels, one with extreme spread, 50% else chance'; + end; + +function TExtremeRange2.WriteResults: Boolean; + var + X: Word; + begin + Result := True; + + for X := 0 to $FFFF do + if FResultStorage[X] <> (X and $1) then + begin + WriteLn('FAIL - Index ', X, '; expected $', hexstr(X and $1, 2), ' got $', hexstr(FResultStorage[X], 2)); + Result := False; + Exit; + end; + end; + +procedure TExtremeRange2.DoTestIteration(Iteration: Integer); + var + Index, Input: Word; + begin +{$push} +{$r-} + Index := (Iteration and $FFFF); + Input := (Iteration and $1) - 1; +{$pop} + FResultStorage[Index] := 0; { Covers $FFFF } + case Input of + 0..$FFFD: + FResultStorage[Index] := 1; + $FFFE: + FResultStorage[Index] := 2; + end; + end; + +{ TExtremeRange3 } + +function TExtremeRange3.TestTitle: shortstring; + begin + Result := 'Two labels, sparse values, equal polling across range'; + end; + +function TExtremeRange3.WriteResults: Boolean; + var + X: Word; + begin + Result := True; + + if FResultStorage[0] <> 1 then + begin + WriteLn('FAIL - Index 0; expected $01 got $', hexstr(FResultStorage[0], 2)); + Result := False; + Exit; + end; + + for X := 1 to $FFFE do + if FResultStorage[X] <> 2 then + begin + WriteLn('FAIL - Index ', X, '; expected $02 got $', hexstr(FResultStorage[X], 2)); + Result := False; + Exit; + end; + + if FResultStorage[65535] <> 0 then + begin + WriteLn('FAIL - Index 65535; expected $02 got $', hexstr(FResultStorage[65535], 2)); + Result := False; + Exit; + end; + end; + +procedure TExtremeRange3.DoTestIteration(Iteration: Integer); + var + Index: Word; + begin + Index := Iteration and $FFFF; + FResultStorage[Index] := 2; { Covers 1..$FFFE } + case Index of + 0: + FResultStorage[Index] := 1; + $FFFF: + FResultStorage[Index] := 0; + end; + end; + +{ TExtremeRange4 } + +function TExtremeRange4.TestTitle: shortstring; + begin + Result := 'Two labels, sparse values, always triggered'; + end; + +function TExtremeRange4.WriteResults: Boolean; + var + X: Word; + begin + Result := True; + + for X := 0 to $FFFF do + if FResultStorage[X] <> (X and $1) then + begin + WriteLn('FAIL - Index ', X, '; expected $', hexstr(X and $1, 2), ' got $', hexstr(FResultStorage[X], 2)); + Result := False; + Exit; + end; + end; + +procedure TExtremeRange4.DoTestIteration(Iteration: Integer); + var + Index, Input: Word; + begin +{$push} +{$r-} + Index := (Iteration and $FFFF); + Input := (Iteration and $1) - 1; +{$pop} + FResultStorage[Index] := 2; { Covers 1..$FFFE } + case Input of + 0: + FResultStorage[Index] := 1; + $FFFF: + FResultStorage[Index] := 0; + end; + end; + +{ TSparseDataTest1 } + +procedure TSparseDataTest1.DoCaseBlock(Index: Integer; Input: TInstructionSet); + begin + case Input of + A_AND: + FResultStorage[Index] := 1; + A_MOV: + FResultStorage[Index] := 2; + A_MOVSX, + A_MOVZX: + FResultStorage[Index] := 3; + A_VMOVAPS, + A_VMOVAPD, + A_VMOVUPS, + A_VMOVUPD: + FResultStorage[Index] := 4; + A_MOVAPD, + A_MOVAPS, + A_MOVUPD, + A_MOVUPS: + FResultStorage[Index] := 5; + A_VDIVSD, + A_VDIVSS, + A_VSUBSD, + A_VSUBSS, + A_VMULSD, + A_VMULSS, + A_VADDSD, + A_VADDSS, + A_VANDPD, + A_VANDPS, + A_VORPD, + A_VORPS, + A_VXORPD, + A_VXORPS: + FResultStorage[Index] := 6; + A_MULSD, + A_MULSS, + A_ADDSD, + A_ADDSS: + FResultStorage[Index] := 7; + A_VMOVSD, + A_VMOVSS, + A_MOVSD, + A_MOVSS: + FResultStorage[Index] := 8; + A_LEA: + FResultStorage[Index] := 9; + A_SUB: + FResultStorage[Index] := 10; + A_SHL,A_SAL: + FResultStorage[Index] := 11; + A_SETcc: + FResultStorage[Index] := 12; + else + FResultStorage[Index] := 0; + end; + end; + +{ TSparseDataEqual1 } + +function TSparseDataEqual1.TestTitle: shortstring; + begin + Result := 'Domain of 1024, 12 sparse labels, equal polling'; + end; + +function TSparseDataEqual1.WriteResults: Boolean; + var + X: Word; + begin + Result := True; + + for X := 0 to 1023 do + if FResultStorage[X] <> ExtremeRange1Expected[X] then + begin + WriteLn('FAIL - Index ', X, '; expected $', hexstr(ExtremeRange1Expected[X], 2), ' got $', hexstr(FResultStorage[X], 2)); + Result := False; + Exit; + end; + end; + +procedure TSparseDataEqual1.DoTestIteration(Iteration: Integer); + var + X: SmallInt; + begin + X := Iteration and 1023; + DoCaseBlock(X, TInstructionSet(X - 512)) + end; + +{ TSparseDataMOVWeightedl } + +function TSparseDataMOVWeighted1.TestTitle: shortstring; + begin + Result := 'Domain of 1024, 12 sparse labels, 75% particular match'; + end; + +function TSparseDataMOVWeighted1.WriteResults: Boolean; + var + X, Expected: Word; + begin + Result := True; + + for X := 0 to 1023 do + begin + Expected := IIf((X and $3) = 0, ExtremeRange1Expected[X], 2); + if FResultStorage[X] <> Expected then + begin + WriteLn('FAIL - Index ', X, '; expected $', hexstr(Expected, 2), ' got $', hexstr(FResultStorage[X], 2)); + Result := False; + Exit; + end; + end; + end; + +procedure TSparseDataMOVWeighted1.DoTestIteration(Iteration: Integer); + var + X: SmallInt; P: TInstructionSet; + begin + X := Iteration and 1023; + P := TInstructionSet(IIf((X and $3) = 0, X - 512, Ord(A_MOV))); + DoCaseBlock(X, P); + end; + +{ TSparseDataMidpointWeighted1 } + +function TSparseDataMidpointWeighted1.TestTitle: shortstring; + begin + Result := 'Domain of 1024, 12 sparse labels, 75% midpoint match'; + end; + +function TSparseDataMidpointWeighted1.WriteResults: Boolean; + var + X, Expected: Word; + begin + Result := True; + + for X := 0 to 1023 do + begin + Expected := IIf((X and $3) = 0, ExtremeRange1Expected[X], 6); + if FResultStorage[X] <> Expected then + begin + WriteLn('FAIL - Index ', X, '; expected $', hexstr(Expected, 2), ' got $', hexstr(FResultStorage[X], 2)); + Result := False; + Exit; + end; + end; + end; + +procedure TSparseDataMidpointWeighted1.DoTestIteration(Iteration: Integer); + var + X: Word; P: TInstructionSet; + begin + X := Iteration and 1023; + P := TInstructionSet(IIf((X and $3) = 0, X - 512, Ord(A_VADDSD))); + DoCaseBlock(X, P); + end; + +{ TSparseDataTest2 } + +procedure TSparseDataTest2.DoCaseBlock(Index: Integer; Input: TInstructionSet); + begin + case Input of + A_AND: + FResultStorage[Index] := 1; + A_MOV: + FResultStorage[Index] := 2; + A_MOVSX: + FResultStorage[Index] := 13; + A_MOVZX: + FResultStorage[Index] := 3; + A_VMOVAPS: + FResultStorage[Index] := 14; + A_VMOVAPD: + FResultStorage[Index] := 15; + A_VMOVUPS: + FResultStorage[Index] := 16; + A_VMOVUPD: + FResultStorage[Index] := 4; + A_MOVAPD: + FResultStorage[Index] := 17; + A_MOVAPS: + FResultStorage[Index] := 18; + A_MOVUPD: + FResultStorage[Index] := 19; + A_MOVUPS: + FResultStorage[Index] := 5; + A_VDIVSD: + FResultStorage[Index] := 20; + A_VDIVSS: + FResultStorage[Index] := 21; + A_VSUBSD: + FResultStorage[Index] := 22; + A_VSUBSS: + FResultStorage[Index] := 23; + A_VMULSD: + FResultStorage[Index] := 24; + A_VMULSS: + FResultStorage[Index] := 25; + A_VADDSD: + FResultStorage[Index] := 26; + A_VADDSS: + FResultStorage[Index] := 27; + A_VANDPD: + FResultStorage[Index] := 28; + A_VANDPS: + FResultStorage[Index] := 29; + A_VORPD: + FResultStorage[Index] := 30; + A_VORPS: + FResultStorage[Index] := 31; + A_VXORPD: + FResultStorage[Index] := 32; + A_VXORPS: + FResultStorage[Index] := 6; + A_MULSD: + FResultStorage[Index] := 33; + A_MULSS: + FResultStorage[Index] := 34; + A_ADDSD: + FResultStorage[Index] := 35; + A_ADDSS: + FResultStorage[Index] := 7; + A_VMOVSD: + FResultStorage[Index] := 36; + A_VMOVSS: + FResultStorage[Index] := 37; + A_MOVSD: + FResultStorage[Index] := 38; + A_MOVSS: + FResultStorage[Index] := 8; + A_LEA: + FResultStorage[Index] := 9; + A_SUB: + FResultStorage[Index] := 10; + A_SHL: + FResultStorage[Index] := 39; + A_SAL: + FResultStorage[Index] := 11; + A_SETcc: + FResultStorage[Index] := 12; + else + FResultStorage[Index] := 0; + end; + end; + +{ TSparseDataEqual2 } + +function TSparseDataEqual2.TestTitle: shortstring; + begin + Result := 'Domain of 1024, 39 sparse labels, equal polling'; + end; + +function TSparseDataEqual2.WriteResults: Boolean; + var + X: Word; + begin + Result := True; + + for X := 0 to 1023 do + if FResultStorage[X] <> ExtremeRange2Expected[X] then + begin + WriteLn('FAIL - Index ', X, '; expected $', hexstr(ExtremeRange2Expected[X], 2), ' got $', hexstr(FResultStorage[X], 2)); + Result := False; + Exit; + end; + end; + +procedure TSparseDataEqual2.DoTestIteration(Iteration: Integer); + var + X: SmallInt; + begin + X := Iteration and 1023; + DoCaseBlock(X, TInstructionSet(X - 512)) + end; + +{ TSparseDataMOVWeighted2 } + +function TSparseDataMOVWeighted2.TestTitle: shortstring; + begin + Result := 'Domain of 1024, 39 sparse labels, 75% particular match'; + end; + +function TSparseDataMOVWeighted2.WriteResults: Boolean; + var + X, Expected: Word; + begin + Result := True; + + for X := 0 to 1023 do + begin + Expected := IIf((X and $3) = 0, ExtremeRange2Expected[X], 2); + if FResultStorage[X] <> Expected then + begin + WriteLn('FAIL - Index ', X, '; expected $', hexstr(Expected, 2), ' got $', hexstr(FResultStorage[X], 2)); + Result := False; + Exit; + end; + end; + end; + +procedure TSparseDataMOVWeighted2.DoTestIteration(Iteration: Integer); + var + X: SmallInt; P: TInstructionSet; + begin + X := Iteration and 1023; + P := TInstructionSet(IIf((X and $3) = 0, X - 512, Ord(A_MOV))); + DoCaseBlock(X, P); + end; + +{ TSparseDataMidpointWeighted2 } + +function TSparseDataMidpointWeighted2.TestTitle: shortstring; + begin + Result := 'Domain of 1024, 39 sparse labels, 75% midpoint match'; + end; + +function TSparseDataMidpointWeighted2.WriteResults: Boolean; + var + X, Expected: Word; + begin + Result := True; + + for X := 0 to 1023 do + begin + Expected := IIf((X and $3) = 0, ExtremeRange2Expected[X], 26); + if FResultStorage[X] <> Expected then + begin + WriteLn('FAIL - Index ', X, '; expected $', hexstr(Expected, 2), ' got $', hexstr(FResultStorage[X], 2)); + Result := False; + Exit; + end; + end; + end; + +procedure TSparseDataMidpointWeighted2.DoTestIteration(Iteration: Integer); + var + X: SmallInt; P: TInstructionSet; + begin + X := Iteration and 1023; + P := TInstructionSet(IIf((X and $3) = 0, X - 512, Ord(A_VADDSD))); + DoCaseBlock(X, P); + end; + +{ TSparseDataTest3 } + +procedure TSparseDataTest3.DoCaseBlock(Index: Integer; Input: TInstructionSet); + begin + case Input of + A_AND: + FResultStorage[Index] := 1; + A_MOV: + FResultStorage[Index] := 2; + A_MOVSX: + FResultStorage[Index] := 13; + A_MOVZX: + FResultStorage[Index] := 3; + A_VMOVAPS: + FResultStorage[Index] := 14; + A_VMOVAPD: + FResultStorage[Index] := 15; + A_VMOVUPS: + FResultStorage[Index] := 16; + A_VMOVUPD: + FResultStorage[Index] := 4; + A_MOVAPD: + FResultStorage[Index] := 17; + A_MOVAPS: + FResultStorage[Index] := 18; + A_MOVUPD: + FResultStorage[Index] := 19; + A_MOVUPS: + FResultStorage[Index] := 5; + A_VDIVSD: + FResultStorage[Index] := 20; + A_VDIVSS: + FResultStorage[Index] := 21; + A_VSUBSD: + FResultStorage[Index] := 22; + A_VSUBSS: + FResultStorage[Index] := 23; + A_VMULSD: + FResultStorage[Index] := 24; + A_VMULSS: + FResultStorage[Index] := 25; + A_VADDSD: + FResultStorage[Index] := 26; + A_VADDSS: + FResultStorage[Index] := 27; + A_VANDPD: + FResultStorage[Index] := 28; + A_VANDPS: + FResultStorage[Index] := 29; + A_VORPD: + FResultStorage[Index] := 30; + A_VORPS: + FResultStorage[Index] := 31; + A_VXORPD: + FResultStorage[Index] := 32; + A_VXORPS: + FResultStorage[Index] := 6; + A_MULSD: + FResultStorage[Index] := 33; + A_MULSS: + FResultStorage[Index] := 34; + A_ADDSD: + FResultStorage[Index] := 35; + A_ADDSS: + FResultStorage[Index] := 7; + A_VMOVSD: + FResultStorage[Index] := 36; + A_VMOVSS: + FResultStorage[Index] := 37; + A_MOVSD: + FResultStorage[Index] := 38; + A_MOVSS: + FResultStorage[Index] := 8; + A_LEA: + FResultStorage[Index] := 9; + A_SUB: + FResultStorage[Index] := 10; + A_SHL: + FResultStorage[Index] := 39; + A_SAL: + FResultStorage[Index] := 11; + A_SETcc: + FResultStorage[Index] := 12; + A_MULX: + FResultStorage[Index] := 40; + A_VBROADCASTF128: + FResultStorage[Index] := 41; + A_VBROADCASTI128: + FResultStorage[Index] := 42; + A_VPERMD: + FResultStorage[Index] := 43; + A_VADDPD: + FResultStorage[Index] := 44; + A_VADDPS: + FResultStorage[Index] := 45; + A_ROUNDPS: + FResultStorage[Index] := 46; + A_ROUNDPD: + FResultStorage[Index] := 47; + A_ROUNDSS: + FResultStorage[Index] := 48; + A_ROUNDSD: + FResultStorage[Index] := 49; + A_CRC32: + FResultStorage[Index] := 50; + A_DPPS: + FResultStorage[Index] := 51; + A_DPPD: + FResultStorage[Index] := 52; + A_VAESDEC: + FResultStorage[Index] := 53; + A_VAESDECLAST: + FResultStorage[Index] := 54; + A_VAESENC: + FResultStorage[Index] := 55; + A_VAESENCLAST: + FResultStorage[Index] := 56; + A_VAESIMC: + FResultStorage[Index] := 57; + A_VAESKEYGENASSIST: + FResultStorage[Index] := 58; + A_VPSHUFB: + FResultStorage[Index] := 59; + A_VPSHUFD: + FResultStorage[Index] := 60; + A_VPSHUFHW: + FResultStorage[Index] := 61; + A_VPSHUFLW: + FResultStorage[Index] := 62; + A_BSF: + FResultStorage[Index] := 63; + A_BSR: + FResultStorage[Index] := 64; + A_BTR: + FResultStorage[Index] := 65; + A_BTS: + FResultStorage[Index] := 66; + A_XOR: + FResultStorage[Index] := 67; + A_ADD: + FResultStorage[Index] := 68; + A_CMP: + FResultStorage[Index] := 69; + A_SHLX: + FResultStorage[Index] := 70; + A_SHRX: + FResultStorage[Index] := 71; + else + FResultStorage[Index] := 0; + end; + end; + +{ TSparseDataEqual3 } + +function TSparseDataEqual3.TestTitle: shortstring; + begin + Result := 'Domain of 1024, 71 sparse labels, equal polling'; + end; + +function TSparseDataEqual3.WriteResults: Boolean; + var + X: Word; + begin + Result := True; + + for X := 0 to 1023 do + if FResultStorage[X] <> ExtremeRange3Expected[X] then + begin + WriteLn('FAIL - Index ', X, '; expected $', hexstr(ExtremeRange3Expected[X], 2), ' got $', hexstr(FResultStorage[X], 2)); + Result := False; + Exit; + end; + end; + +procedure TSparseDataEqual3.DoTestIteration(Iteration: Integer); + var + X: SmallInt; + begin + X := Iteration and 1023; + DoCaseBlock(X, TInstructionSet(X - 512)) + end; + +{ TSparseDataMOVWeightedl } + +function TSparseDataMOVWeighted3.TestTitle: shortstring; + begin + Result := 'Domain of 1024, 71 sparse labels, 75% particular match'; + end; + +function TSparseDataMOVWeighted3.WriteResults: Boolean; + var + X, Expected: Word; + begin + Result := True; + + for X := 0 to 1023 do + begin + Expected := IIf((X and $3) = 0, ExtremeRange3Expected[X], 2); + if FResultStorage[X] <> Expected then + begin + WriteLn('FAIL - Index ', X, '; expected $', hexstr(Expected, 2), ' got $', hexstr(FResultStorage[X], 2)); + Result := False; + Exit; + end; + end; + end; + +procedure TSparseDataMOVWeighted3.DoTestIteration(Iteration: Integer); + var + X: SmallInt; P: TInstructionSet; + begin + X := Iteration and 1023; + P := TInstructionSet(IIf((X and $3) = 0, X - 512, Ord(A_MOV))); + DoCaseBlock(X, P); + end; + +{ TSparseDataMidpointWeighted3 } + +function TSparseDataMidpointWeighted3.TestTitle: shortstring; + begin + Result := 'Domain of 1024, 71 sparse labels, 75% midpoint match'; + end; + +function TSparseDataMidpointWeighted3.WriteResults: Boolean; + var + X, Expected: Word; + begin + Result := True; + + for X := 0 to 1023 do + begin + Expected := IIf((X and $3) = 0, ExtremeRange3Expected[X], 26); + if FResultStorage[X] <> Expected then + begin + WriteLn('FAIL - Index ', X, '; expected $', hexstr(Expected, 2), ' got $', hexstr(FResultStorage[X], 2)); + Result := False; + Exit; + end; + end; + end; + +procedure TSparseDataMidpointWeighted3.DoTestIteration(Iteration: Integer); + var + X: SmallInt; P: TInstructionSet; + begin + X := Iteration and 1023; + P := TInstructionSet(IIf((X and $3) = 0, X - 512, Ord(A_VADDSD))); + DoCaseBlock(X, P); + end; + + +{ TLinearListDependsOnInput } + +function TLinearListDependsOnInput.TestTitle: shortstring; + begin + Result := 'Linear list depends on input'; + end; + +function TLinearListDependsOnInput.WriteResults: Boolean; + var + X: Word; + begin + Result := True; + if FResultStorage[0] <> 0 then + begin + WriteLn('FAIL - Index 0; expected $00 got $', hexstr(FResultStorage[0], 2)); + Result := False; + Exit; + end; + + for X := 1 to 7 do + if FResultStorage[X] <> (X and $3) then + begin + WriteLn('FAIL - Index ', X, '; expected $', hexstr(X and $3, 2), ' got $', hexstr(FResultStorage[X], 2)); + Result := False; + Exit; + end; + + for X := 8 to 11 do + if FResultStorage[X] <> 0 then + begin + WriteLn('FAIL - Index ', X, '; expected $00 got $', hexstr(FResultStorage[X], 2)); + Result := False; + Exit; + end; + + if FResultStorage[12] <> $10 then + begin + WriteLn('FAIL - Index 12; expected $10 got $', hexstr(FResultStorage[12], 2)); + Result := False; + Exit; + end; + + for X := 13 to $FF do + if FResultStorage[X] <> 0 then + begin + WriteLn('FAIL - Index ', X, '; expected $00 got $', hexstr(FResultStorage[X], 2)); + Result := False; + Exit; + end; + end; + +procedure TLinearListDependsOnInput.DoTestIteration(Iteration: Integer); + var + Index: Byte; + begin + Index := Iteration and $FF; + { This helps catch errors where all branches, including else, are skipped } + FResultStorage[Index] := $FF; + case Index of + 1..3: FResultStorage[Index] := Index; + 4..7: FResultStorage[Index] := Index - 4; + 12: FResultStorage[Index] := $10; + else FResultStorage[Index] := 0; + end; + end; + + +{ TCStyleCascade } + +function TCStyleCascade.TestTitle: shortstring; + begin + Result := 'C-style cascade using ''goto'''; + end; + +function TCStyleCascade.WriteResults: Boolean; + var + X: Byte; + begin + Result := True; + for X := 0 to 5 do + if FResultStorage[X] <> ((1 shl X) - 1) then + begin + WriteLn('FAIL - Index ', X, '; expected $', hexstr((1 shl X) - 1, 2), ' got $', hexstr(FResultStorage[X], 2)); + Result := False; + Exit; + end; + + for X := 6 to $FF do + if FResultStorage[X] <> 0 then + begin + WriteLn('FAIL - Index ', X, '; expected $00 got $', hexstr(FResultStorage[X], 2)); + Result := False; + Exit; + end; + end; + +procedure TCStyleCascade.DoTestIteration(Iteration: Integer); + var + X, Tmp: Byte; + label + Set1, Set2, Set3, Set4, Default; + begin + X := Iteration and $FF; + Tmp := 0; + case X of + $1: goto Set1; + $2: goto Set2; + $3: goto Set3; + $4: goto Set4; + $5: Tmp := 16; + else + goto Default; + end; + Set4: + Tmp := Tmp or $8; + Set3: + Tmp := Tmp or $4; + Set2: + Tmp := Tmp or $2; + Set1: + Tmp := Tmp or $1; + Default: + FResultStorage[X] := Tmp; + end; + + +{ Main function } +const + { TCompleteByteRange and descendants + - Entirely-covered jump tree + - 33 labels, no else block; full coverage (all 256 byte values covered) + - Root: values are polled with equal probability + - FirstWeighted: first branch is polled 3 times as often + - LastWeighted: last branch is polled 3 times as often + TAlmostFullByteRange + - Almost full jump tree - 18 labels, else block covers 32 values; 224 byte values covered + - Root: values are polled with equal probability + - FirstWeighted: first branch is polled 3 times as often + - LastWeighted: last branch is polled 3 times as often + } + + TestClasses: array[0..35] of TTestClass = ( + TCompleteByteRange, + TCompleteByteRangeFirstWeighted, + TCompleteByteRangeLastWeighted, + TAlmostFullByteRange, + TAlmostFullByteRangeFirstWeighted, + TAlmostFullByteRangeLastWeighted, + TSingleEntryWithDefault, + TSingleEntryWithDefaultUnlikely, + TSingleEntryWithDefaultWeighted, + TSingleEntryWithElse, + TSingleEntryWithElseUnlikely, + TSingleEntryWithElseWeighted, + TSingleEntryAtZeroWithElse, + TSingleEntryAtMinus1WithDefault, + TSingleEntryAtMinus4WithElse, + TSingleEntryWith0To5RangeWithElse, + TSingleEntryWith0To50RangeWithElse, + TSingleEntryWith1To5RangeWithElse, + TSingleEntryWith1To50RangeWithElse, + TSingleEntryWithMinus1To5RangeWithElse, + TSingleEntryWithMinus1To50RangeWithElse, + TExtremeRange1, + TExtremeRange2, + TExtremeRange3, + TExtremeRange4, + TSparseDataEqual1, + TSparseDataMOVWeighted1, + TSparseDataMidpointWeighted1, + TSparseDataEqual2, + TSparseDataMOVWeighted2, + TSparseDataMidpointWeighted2, + TSparseDataEqual3, + TSparseDataMOVWeighted3, + TSparseDataMidpointWeighted3, + TLinearListDependsOnInput, + TCStyleCascade + ); + +var + CurrentObject: TTestAncestor; + Failed: Boolean; + X: Integer; + SummedUpAverageDuration, AverageDuration : Double; +begin + SummedUpAverageDuration := 0.0; + Failed := False; + WriteLn('Case node compilation and timing test'); + WriteLn('-------------------------------------'); + for X := low(TestClasses) to High(TestClasses) do + begin + try + CurrentObject := TestClasses[X].Create; + try + Write(CurrentObject.TestTitle:56, ' - '); + CurrentObject.Run; + + if CurrentObject.WriteResults then + begin + AverageDuration := ((CurrentObject.RunTime * 1000000000.0) / ITERATIONS); + WriteLn('Pass - average iteration duration: ', AverageDuration:1:3, ' ns'); + SummedUpAverageDuration := SummedUpAverageDuration + AverageDuration; + end + else + { Final average isn't processed if a test failed, so there's no need + to calculate and add the average duration to it } + Failed := True; + + finally + CurrentObject.Free; + end; + except on E: Exception do + begin + WriteLn('Exception "', E.ClassName, '" raised while running test object of class "', TestClasses[X].ClassName, '"'); + Failed := True; + end; + end; + end; + + if Failed then + Halt(1); + + WriteLn(#10'ok'); + WriteLn('- Sum of average durations: ', SummedUpAverageDuration:1:3, ' ns'); + WriteLn('- Overall average duration: ', (SummedUpAverageDuration / Length(TestClasses)):1:3, ' ns'); +end.