Browse Source

avxtestgenerator: working on new tests for compressed disp8*N

git-svn-id: branches/tg74/avx512-0037785@48682 -
tg74 4 years ago
parent
commit
cdd2832ea7
2 changed files with 93 additions and 40 deletions
  1. 86 38
      tests/utils/avx/asmtestgenerator.pas
  2. 7 2
      tests/utils/avx/avxopcodes.pas

+ 86 - 38
tests/utils/avx/asmtestgenerator.pas

@@ -34,8 +34,11 @@ type
 
 
   TOpMemType = Set of TOpType;
   TOpMemType = Set of TOpType;
 
 
+  TAsmCompareMode = (cmKORTESTNC, cmXORTestNZ);
+
   TOpMode = (omUnknown,
   TOpMode = (omUnknown,
              omKXM, omKYM, omKZM,
              omKXM, omKYM, omKZM,
+             omKXB32, omKXB64, omKYB32, omKYB64, omKZB32, omKZB64,
              omXXM, omXXB32, omXXB64, omXMI, omXB32I, omXB64I,
              omXXM, omXXB32, omXXB64, omXMI, omXB32I, omXB64I,
              omYYM, omYYB32, omYYB64, omYMI, omYB32I, omYB64I,
              omYYM, omYYB32, omYYB64, omYMI, omYB32I, omYB64I,
              omZZM, omZZB32, omZZB64, omZMI, omZB32I, omZB64I);
              omZZM, omZZB32, omZZB64, omZMI, omZB32I, omZB64I);
@@ -3741,7 +3744,7 @@ var
     end;
     end;
   end;
   end;
 
 
-  function AsmCodeBlockCompare(aAsmCounter: integer; aIsKortestQ: boolean = false): String;
+  function AsmCodeBlockCompare(aAsmCounter: integer; aCompareMode: TAsmCompareMode): String;
   var
   var
     sReg: string;
     sReg: string;
   begin
   begin
@@ -3758,10 +3761,17 @@ var
       Add(format('%20s%6s,%s',            ['     mov', sReg, inttostr(aAsmCounter)]));
       Add(format('%20s%6s,%s',            ['     mov', sReg, inttostr(aAsmCounter)]));
       Add(format('%20s%6s,%s',            ['   kmovd', 'K7', 'EAX']));
       Add(format('%20s%6s,%s',            ['   kmovd', 'K7', 'EAX']));
       Add(format('%20s%6s',               ['     pop', sReg]));
       Add(format('%20s%6s',               ['     pop', sReg]));
-      if aIsKortestQ then Add(format('%20s%6s, %s',           ['kortestq', 'K1', 'K2']))
-       else Add(format('%20s%6s, %s',           ['kortestb', 'K1', 'K2']));
 
 
-      Add(format('%20s  %6s',             ['     jnc', '@@CHECKRESULT']));
+      case aComparemode of
+        cmKORTESTNC: begin
+                       Add(format('%20s%6s, %s',           ['kortestb', 'K1', 'K2']));
+                       Add(format('%20s  %6s',             ['     jnc', '@@CHECKRESULT']));
+                     end;
+        cmXORTestNZ: begin
+                       Add(format('%20s%6s, %s',           ['kortestq', 'K2', 'K2']));
+                       Add(format('%20s  %6s',             ['     jnz', '@@CHECKRESULT']));
+                     end;
+      end;
 
 
       result := Text;
       result := Text;
     finally
     finally
@@ -3993,8 +4003,8 @@ begin
             else if (AnsiSameText(sl_Operand, 'ZMMRM')) or
             else if (AnsiSameText(sl_Operand, 'ZMMRM')) or
                     (AnsiSameText(sl_Operand, 'ZMMRM_M')) or
                     (AnsiSameText(sl_Operand, 'ZMMRM_M')) or
                     (AnsiSameText(sl_Operand, 'ZMMRM_MZ')) or
                     (AnsiSameText(sl_Operand, 'ZMMRM_MZ')) or
-                    (AnsiSameText(sl_Operand, 'XMMRM_ER')) or
-                    (AnsiSameText(sl_Operand, 'XMMRM_SAE'))
+                    (AnsiSameText(sl_Operand, 'ZMMRM_ER')) or
+                    (AnsiSameText(sl_Operand, 'ZMMRM_SAE'))
                     then
                     then
             begin
             begin
               Item.OpNumber := il_Op;
               Item.OpNumber := il_Op;
@@ -4010,8 +4020,8 @@ begin
               //if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
               //if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
               // else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
               // else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
 
 
-              if x64 then MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values)
-               else MemRegBaseIndexCombi(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
+              if x64 then MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values)
+               else MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
             end
             end
             else if AnsiSameText(sl_Operand, 'MEM8') then
             else if AnsiSameText(sl_Operand, 'MEM8') then
             begin
             begin
@@ -4781,6 +4791,26 @@ begin
                             (OItem2.OpTyp = otZMMReg) and
                             (OItem2.OpTyp = otZMMReg) and
                             (OItem3.OpTyp in MEMTYPES) then OpMode := omKZM
                             (OItem3.OpTyp in MEMTYPES) then OpMode := omKZM
 
 
+                    else if (OItem1.OpTyp = otKReg) and
+                            (OItem2.OpTyp = otXMMReg) and
+                            (OItem3.OpTyp = otB32) then OpMode := omKXB32
+                    else if (OItem1.OpTyp = otKReg) and
+                            (OItem2.OpTyp = otXMMReg) and
+                            (OItem3.OpTyp = otB64) then OpMode := omKXB64
+                    else if (OItem1.OpTyp = otKReg) and
+                            (OItem2.OpTyp = otYMMReg) and
+                            (OItem3.OpTyp = otB32) then OpMode := omKYB32
+                    else if (OItem1.OpTyp = otKReg) and
+                            (OItem2.OpTyp = otYMMReg) and
+                            (OItem3.OpTyp = otB64) then OpMode := omKYB64
+                    else if (OItem1.OpTyp = otKReg) and
+                            (OItem2.OpTyp = otZMMReg) and
+                            (OItem3.OpTyp = otB32) then OpMode := omKZB32
+                    else if (OItem1.OpTyp = otKReg) and
+                            (OItem2.OpTyp = otZMMReg) and
+                            (OItem3.OpTyp = otB64) then OpMode := omKZB64
+
+
                     else if (OItem1.OpTyp = otXMMReg) and
                     else if (OItem1.OpTyp = otXMMReg) and
                             (OItem2.OpTyp = otXMMReg) and
                             (OItem2.OpTyp = otXMMReg) and
                             (OItem3.OpTyp in MEMTYPES) then OpMode := omXXM
                             (OItem3.OpTyp in MEMTYPES) then OpMode := omXXM
@@ -4866,7 +4896,7 @@ begin
 
 
                           (sLogMsg <> 'XXR') then
                           (sLogMsg <> 'XXR') then
 
 
-                       writeln('offen: ' + sLogMsg);
+                       writeln('offen : ' + sLogMsg + ' (' + aInst + ')');
                       end;
                       end;
                     end;
                     end;
               else;
               else;
@@ -4938,53 +4968,71 @@ begin
                             omKYM,
                             omKYM,
                             omKZM: begin
                             omKZM: begin
                                      result.Add(format('%20s%6s,%6s, %s + $2000', [aInst, 'K2', OItem2.Values[il_Op2], OItem3.Values[il_Op3] ]));
                                      result.Add(format('%20s%6s,%6s, %s + $2000', [aInst, 'K2', OItem2.Values[il_Op2], OItem3.Values[il_Op3] ]));
+                                     result.Add(format('%20s%6s,%6s, %s', ['kxorq', 'K2', OItem1.Values[il_Op1], 'K2']));
+
+                                     result.Add(AsmCodeBlockCompare(iAsmCounter, cmXORTestNZ));
+                                   end;
+                          omKXB32,
+                          omKXB64,
+                          omKYB32,
+                          omKYB64,
+                          omKZB32,
+                          omKZB64: begin
+                                     sMREF := OItem3.Values[il_Op3];
+                                     //if Pos('{1to4}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to4}', '{1to2}', [])
+                                     // else if Pos('{1to8}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to8}', '{1to4}', [])
+                                     // else if Pos('{1to16}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to16}', '{1to8}', []);
+
+                                     result.Add(format('%20s%6s,%6s, %s + $2000', [aInst, 'K2', OItem2.Values[il_Op2], sMREF]));
+                                     result.Add(format('%20s%6s,%6s, %s',         ['kxorq', 'K2', OItem1.Values[il_Op1], 'K2']));
 
 
-                                     result.Add(AsmCodeBlockCompare(iAsmCounter, true));
+                                     result.Add(AsmCodeBlockCompare(iAsmCounter, cmXORTestNZ));
                                    end;
                                    end;
+
                           omXB32I,
                           omXB32I,
                           omXB64I: begin
                           omXB64I: begin
                                      sMREF := OItem2.Values[il_Op2];
                                      sMREF := OItem2.Values[il_Op2];
-                                     if Pos('{1to4}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to4}', '{1to2}', [])
-                                      else if Pos('{1to8}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to8}', '{1to4}', [])
-                                      else if Pos('{1to16}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to16}', '{1to8}', []);
+                                     //if Pos('{1to4}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to4}', '{1to2}', [])
+                                     // else if Pos('{1to8}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to8}', '{1to4}', [])
+                                     // else if Pos('{1to16}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to16}', '{1to8}', []);
 
 
                                      result.Add(format('%20s%6s,%6s + $2000, %s', [aInst, 'XMM1', sMREF, OItem3.Values[il_Op3]]));
                                      result.Add(format('%20s%6s,%6s + $2000, %s', [aInst, 'XMM1', sMREF, OItem3.Values[il_Op3]]));
                                      result.Add(format('%20s%6s,%6s, %s',         ['vpcmpeqw', 'K2', OItem1.Values[il_Op1], 'XMM1']));
                                      result.Add(format('%20s%6s,%6s, %s',         ['vpcmpeqw', 'K2', OItem1.Values[il_Op1], 'XMM1']));
 
 
-                                     result.Add(AsmCodeBlockCompare(iAsmCounter));
+                                     result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
                                    end;
                                    end;
                             omXXM: begin
                             omXXM: begin
 
 
                                      result.Add(format('%20s%6s,%6s, %s + $2000', [aInst, 'XMM1', 'XMM1', OItem3.Values[il_Op3] ]));
                                      result.Add(format('%20s%6s,%6s, %s + $2000', [aInst, 'XMM1', 'XMM1', OItem3.Values[il_Op3] ]));
                                      result.Add(format('%20s%6s,%6s, %s',         ['vpcmpeqw', 'K2', OItem1.Values[il_Op1], 'XMM1']));
                                      result.Add(format('%20s%6s,%6s, %s',         ['vpcmpeqw', 'K2', OItem1.Values[il_Op1], 'XMM1']));
 
 
-                                     result.Add(AsmCodeBlockCompare(iAsmCounter));
+                                     result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
                                    end;
                                    end;
                           omXXB32,
                           omXXB32,
                           omXXB64: begin
                           omXXB64: begin
                                      sMREF := OItem3.Values[il_Op3];
                                      sMREF := OItem3.Values[il_Op3];
-                                     if Pos('{1to4}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to4}', '{1to2}', [])
-                                      else if Pos('{1to8}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to8}', '{1to4}', [])
-                                      else if Pos('{1to16}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to16}', '{1to8}', []);
+                                     //if Pos('{1to4}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to4}', '{1to2}', [])
+                                     // else if Pos('{1to8}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to8}', '{1to4}', [])
+                                     // else if Pos('{1to16}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to16}', '{1to8}', []);
 
 
                                      result.Add(format('%20s%6s,%6s, %s + $2000', [aInst, 'XMM1', 'XMM1', sMREF]));
                                      result.Add(format('%20s%6s,%6s, %s + $2000', [aInst, 'XMM1', 'XMM1', sMREF]));
                                      result.Add(format('%20s%6s,%6s, %s',         ['vpcmpeqw', 'K2', OItem1.Values[il_Op1], 'XMM1']));
                                      result.Add(format('%20s%6s,%6s, %s',         ['vpcmpeqw', 'K2', OItem1.Values[il_Op1], 'XMM1']));
 
 
-                                     result.Add(AsmCodeBlockCompare(iAsmCounter));
+                                     result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
                                    end;
                                    end;
                             omXMI: begin
                             omXMI: begin
                                      result.Add(format('%20s%6s,%6s + $2000, %s', [aInst, 'XMM1', OItem2.Values[il_Op2], OItem3.Values[il_Op3]]));
                                      result.Add(format('%20s%6s,%6s + $2000, %s', [aInst, 'XMM1', OItem2.Values[il_Op2], OItem3.Values[il_Op3]]));
                                      result.Add(format('%20s%6s,%6s, %s',       ['vpcmpeqw', 'K2', OItem1.Values[il_Op1], 'XMM1']));
                                      result.Add(format('%20s%6s,%6s, %s',       ['vpcmpeqw', 'K2', OItem1.Values[il_Op1], 'XMM1']));
 
 
-                                     result.Add(AsmCodeBlockCompare(iAsmCounter));
+                                     result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
                                    end;
                                    end;
 
 
                             omYB32I,
                             omYB32I,
                             omYB64I: begin
                             omYB64I: begin
                                        sMREF := OItem2.Values[il_Op2];
                                        sMREF := OItem2.Values[il_Op2];
-                                       if Pos('{1to4}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to4}', '{1to2}', [])
-                                        else if Pos('{1to8}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to8}', '{1to4}', [])
-                                        else if Pos('{1to16}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to16}', '{1to8}', []);
+                                       //if Pos('{1to4}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to4}', '{1to2}', [])
+                                       // else if Pos('{1to8}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to8}', '{1to4}', [])
+                                       // else if Pos('{1to16}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to16}', '{1to8}', []);
 
 
                                        //result.Add(format('%20s%6s,%6s + $00, %s', [aInst, 'XMM1', sMREF, OItem3.Values[il_Op3]]));
                                        //result.Add(format('%20s%6s,%6s + $00, %s', [aInst, 'XMM1', sMREF, OItem3.Values[il_Op3]]));
                                        //result.Add(format('%20s%6s,%6s + $10, %s', [aInst, 'XMM2', sMREF, OItem3.Values[il_Op3]]));
                                        //result.Add(format('%20s%6s,%6s + $10, %s', [aInst, 'XMM2', sMREF, OItem3.Values[il_Op3]]));
@@ -4996,7 +5044,7 @@ begin
                                        result.Add(format('%20s%6s,%6s + $2000, %s', [aInst, 'YMM1', sMREF, OItem3.Values[il_Op3]]));
                                        result.Add(format('%20s%6s,%6s + $2000, %s', [aInst, 'YMM1', sMREF, OItem3.Values[il_Op3]]));
                                        result.Add(format('%20s%6s,%6s, %s',         ['vpcmpeqd', 'K2', OItem1.Values[il_Op1], 'YMM1']));
                                        result.Add(format('%20s%6s,%6s, %s',         ['vpcmpeqd', 'K2', OItem1.Values[il_Op1], 'YMM1']));
 
 
-                                       result.Add(AsmCodeBlockCompare(iAsmCounter));
+                                       result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
 
 
                                      end;
                                      end;
 
 
@@ -5012,14 +5060,14 @@ begin
                                      result.Add(format('%20s%6s,%6s, %s + $2000', [aInst, 'YMM1', 'YMM1', OItem3.Values[il_Op3] ]));
                                      result.Add(format('%20s%6s,%6s, %s + $2000', [aInst, 'YMM1', 'YMM1', OItem3.Values[il_Op3] ]));
                                      result.Add(format('%20s%6s,%6s, %s',         ['vpcmpeqd', 'K2', OItem1.Values[il_Op1], 'YMM1']));
                                      result.Add(format('%20s%6s,%6s, %s',         ['vpcmpeqd', 'K2', OItem1.Values[il_Op1], 'YMM1']));
 
 
-                                     result.Add(AsmCodeBlockCompare(iAsmCounter));
+                                     result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
                                    end;
                                    end;
                           omYYB32,
                           omYYB32,
                           omYYB64: begin
                           omYYB64: begin
                                      sMREF := OItem3.Values[il_Op3];
                                      sMREF := OItem3.Values[il_Op3];
-                                     if Pos('{1to4}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to4}', '{1to2}', [])
-                                      else if Pos('{1to8}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to8}', '{1to4}', [])
-                                      else if Pos('{1to16}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to16}', '{1to8}', []);
+                                     //if Pos('{1to4}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to4}', '{1to2}', [])
+                                     // else if Pos('{1to8}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to8}', '{1to4}', [])
+                                     // else if Pos('{1to16}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to16}', '{1to8}', []);
 
 
                                      //result.Add(format('%20s%6s,%6s, %s + $00', [aInst, 'XMM1', 'XMM1', sMREF]));
                                      //result.Add(format('%20s%6s,%6s, %s + $00', [aInst, 'XMM1', 'XMM1', sMREF]));
                                      //result.Add(format('%20s%6s,%6s, %s + $10', [aInst, 'XMM2', 'XMM2', sMREF]));
                                      //result.Add(format('%20s%6s,%6s, %s + $10', [aInst, 'XMM2', 'XMM2', sMREF]));
@@ -5031,7 +5079,7 @@ begin
                                      result.Add(format('%20s%6s,%6s, %s + $2000', [aInst, 'YMM1', 'YMM1', sMREF]));
                                      result.Add(format('%20s%6s,%6s, %s + $2000', [aInst, 'YMM1', 'YMM1', sMREF]));
                                      result.Add(format('%20s%6s,%6s, %s',         ['vpcmpeqd', 'K2', OItem1.Values[il_Op1], 'YMM1']));
                                      result.Add(format('%20s%6s,%6s, %s',         ['vpcmpeqd', 'K2', OItem1.Values[il_Op1], 'YMM1']));
 
 
-                                     result.Add(AsmCodeBlockCompare(iAsmCounter));
+                                     result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
 
 
                                    end;
                                    end;
                             omYMI: begin
                             omYMI: begin
@@ -5045,14 +5093,14 @@ begin
                                      result.Add(format('%20s%6s,%6s + $2000, %s', [aInst, 'YMM1', OItem2.Values[il_Op2], OItem3.Values[il_Op3]]));
                                      result.Add(format('%20s%6s,%6s + $2000, %s', [aInst, 'YMM1', OItem2.Values[il_Op2], OItem3.Values[il_Op3]]));
                                      result.Add(format('%20s%6s,%6s, %s',       ['vpcmpeqd', 'K2', OItem1.Values[il_Op1], 'YMM1']));
                                      result.Add(format('%20s%6s,%6s, %s',       ['vpcmpeqd', 'K2', OItem1.Values[il_Op1], 'YMM1']));
 
 
-                                     result.Add(AsmCodeBlockCompare(iAsmCounter));
+                                     result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
                                    end;
                                    end;
                             omZB32I,
                             omZB32I,
                             omZB64I:
                             omZB64I:
                                     begin
                                     begin
                                       sMREF := OItem2.Values[il_Op2];
                                       sMREF := OItem2.Values[il_Op2];
-                                       if Pos('{1to8}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to8}', '{1to2}', [])
-                                        else if Pos('{1to16}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to16}', '{1to4}', []);
+                                       //if Pos('{1to8}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to8}', '{1to2}', [])
+                                       // else if Pos('{1to16}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to16}', '{1to4}', []);
 
 
                                        //result.Add(format('%20s%6s,%6s + $00, %s', [aInst, 'XMM1', sMREF, OItem3.Values[il_Op3]]));
                                        //result.Add(format('%20s%6s,%6s + $00, %s', [aInst, 'XMM1', sMREF, OItem3.Values[il_Op3]]));
                                        //result.Add(format('%20s%6s,%6s + $10, %s', [aInst, 'XMM2', sMREF, OItem3.Values[il_Op3]]));
                                        //result.Add(format('%20s%6s,%6s + $10, %s', [aInst, 'XMM2', sMREF, OItem3.Values[il_Op3]]));
@@ -5069,7 +5117,7 @@ begin
                                        result.Add(format('%20s%6s,%6s + $2000, %s', [aInst, 'ZMM1', sMREF, OItem3.Values[il_Op3]]));
                                        result.Add(format('%20s%6s,%6s + $2000, %s', [aInst, 'ZMM1', sMREF, OItem3.Values[il_Op3]]));
                                        result.Add(format('%20s%6s,%6s, %s',         ['vpcmpeqq', 'K2', OItem1.Values[il_Op1], 'ZMM1']));
                                        result.Add(format('%20s%6s,%6s, %s',         ['vpcmpeqq', 'K2', OItem1.Values[il_Op1], 'ZMM1']));
 
 
-                                       result.Add(AsmCodeBlockCompare(iAsmCounter));
+                                       result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
 
 
                                      end;
                                      end;
 
 
@@ -5090,13 +5138,13 @@ begin
                                      result.Add(format('%20s%6s,%6s, %s + $2000', [aInst, 'ZMM1', 'ZMM1', OItem3.Values[il_Op3] ]));
                                      result.Add(format('%20s%6s,%6s, %s + $2000', [aInst, 'ZMM1', 'ZMM1', OItem3.Values[il_Op3] ]));
                                      result.Add(format('%20s%6s,%6s, %s',         ['vpcmpeqq', 'K2', OItem1.Values[il_Op1], 'ZMM1']));
                                      result.Add(format('%20s%6s,%6s, %s',         ['vpcmpeqq', 'K2', OItem1.Values[il_Op1], 'ZMM1']));
 
 
-                                     result.Add(AsmCodeBlockCompare(iAsmCounter));
+                                     result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
                                    end;
                                    end;
                           omZZB32,
                           omZZB32,
                           omZZB64: begin
                           omZZB64: begin
                                      sMREF := OItem3.Values[il_Op3];
                                      sMREF := OItem3.Values[il_Op3];
-                                     if Pos('{1to8}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to8}', '{1to2}', [])
-                                      else if Pos('{1to16}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to16}', '{1to4}', []);
+                                     //if Pos('{1to8}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to8}', '{1to2}', [])
+                                     // else if Pos('{1to16}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to16}', '{1to4}', []);
 
 
                                      //result.Add(format('%20s%6s,%6s, %s + $00', [aInst, 'XMM1', 'XMM1', sMREF]));
                                      //result.Add(format('%20s%6s,%6s, %s + $00', [aInst, 'XMM1', 'XMM1', sMREF]));
                                      //result.Add(format('%20s%6s,%6s, %s + $10', [aInst, 'XMM2', 'XMM2', sMREF]));
                                      //result.Add(format('%20s%6s,%6s, %s + $10', [aInst, 'XMM2', 'XMM2', sMREF]));
@@ -5114,7 +5162,7 @@ begin
                                      result.Add(format('%20s%6s,%6s, %s + $2000', [aInst, 'ZMM1', 'ZMM1', sMREF]));
                                      result.Add(format('%20s%6s,%6s, %s + $2000', [aInst, 'ZMM1', 'ZMM1', sMREF]));
                                      result.Add(format('%20s%6s,%6s, %s',         ['vpcmpeqq', 'K2', OItem1.Values[il_Op1], 'ZMM1']));
                                      result.Add(format('%20s%6s,%6s, %s',         ['vpcmpeqq', 'K2', OItem1.Values[il_Op1], 'ZMM1']));
 
 
-                                     result.Add(AsmCodeBlockCompare(iAsmCounter));
+                                     result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
 
 
                                    end;
                                    end;
                             omZMI: begin
                             omZMI: begin
@@ -5133,7 +5181,7 @@ begin
                                      result.Add(format('%20s%6s,%6s + $2000, %s', [aInst, 'ZMM1', OItem2.Values[il_Op2], OItem3.Values[il_Op3]]));
                                      result.Add(format('%20s%6s,%6s + $2000, %s', [aInst, 'ZMM1', OItem2.Values[il_Op2], OItem3.Values[il_Op3]]));
                                      result.Add(format('%20s%6s,%6s, %s',       ['vpcmpeqq', 'K2', OItem1.Values[il_Op1], 'ZMM1']));
                                      result.Add(format('%20s%6s,%6s, %s',       ['vpcmpeqq', 'K2', OItem1.Values[il_Op1], 'ZMM1']));
 
 
-                                     result.Add(AsmCodeBlockCompare(iAsmCounter));
+                                     result.Add(AsmCodeBlockCompare(iAsmCounter, cmKORTESTNC));
                                    end;
                                    end;
 
 
                         end;
                         end;

+ 7 - 2
tests/utils/avx/avxopcodes.pas

@@ -3700,9 +3700,14 @@ begin
                   slHeader.Add('  DataBlock: Array[0..$3FFF] of dword;');
                   slHeader.Add('  DataBlock: Array[0..$3FFF] of dword;');
                   slHeader.Add('  i: integer;');
                   slHeader.Add('  i: integer;');
 
 
-                  slHeader.Add('procedure writelnK7(aVal: dword);');
+                  slHeader.Add('procedure writelnK7;');
+                  slHeader.Add('var');
+                  slHeader.Add('  iK7: dword;');
                   slHeader.Add('begin');
                   slHeader.Add('begin');
-                  slHeader.Add('  writeln(''K7: '' + ' + 'inttostr(aVal));');
+                  slHeader.Add('  asm');
+                  slHeader.Add('    kmovd  iK7, k7');
+                  slHeader.Add('  end;');
+                  slHeader.Add('  writeln(''K7: '' + ' + 'inttostr(iK7));');
                   slHeader.Add('end;');
                   slHeader.Add('end;');
 
 
                   slHeader.Add('procedure writelnOK;');
                   slHeader.Add('procedure writelnOK;');