From 0a3d980f7e883862dec13db1745e75646c5f6f09 Mon Sep 17 00:00:00 2001 From: tg74 Date: Mon, 30 Nov 2020 13:53:25 +0000 Subject: [PATCH] working on new testmethods (memref-operands) git-svn-id: branches/tg74/avx512-0037785@47640 - --- compiler/ppcx64.lpi | 23 ++-- tests/utils/avx/asmtestgenerator.pas | 191 ++++++++------------------- tests/utils/avx/avxopcodes.pas | 29 +++- 3 files changed, 91 insertions(+), 152 deletions(-) diff --git a/compiler/ppcx64.lpi b/compiler/ppcx64.lpi index a28f04cf21..d10e934a3e 100644 --- a/compiler/ppcx64.lpi +++ b/compiler/ppcx64.lpi @@ -1,7 +1,7 @@ - + - + @@ -19,26 +19,30 @@ - - - - - + + + + + + + + + + + - - @@ -71,7 +75,6 @@ - diff --git a/tests/utils/avx/asmtestgenerator.pas b/tests/utils/avx/asmtestgenerator.pas index c3bf728b03..f9072a868e 100644 --- a/tests/utils/avx/asmtestgenerator.pas +++ b/tests/utils/avx/asmtestgenerator.pas @@ -88,13 +88,13 @@ type procedure VectorMemRegBaseIndexCombi(const aPrefix, aSuffix: String; aSLBaseReg, aSLIndexReg, aRList: TStringList); function InternalCalcTestData(const aInst, aOp1, aOp2, aOp3, aOp4: String): TStringList; - function InternalCalcTestDataMREF(const aInst, aOp1, aOp2, aOp3, aOp4: String; var aDatatyp: string): TStringList; + function InternalCalcTestDataMREF(const aInst, aOp1, aOp2, aOp3, aOp4: String): TStringList; public constructor Create; destructor Destroy; override; class procedure CalcTestData(aX64, aAVX512, aSAE: boolean; const aInst, aOp1, aOp2, aOp3, aOp4: String; aSL: TStringList); - class procedure CalcTestDataMREF(aX64, aAVX512, aSAE: boolean; const aInst, aOp1, aOp2, aOp3, aOp4: String; aSL: TStringList; var aLocalVarDataTyp: string); + class procedure CalcTestDataMREF(aX64, aAVX512, aSAE: boolean; const aInst, aOp1, aOp2, aOp3, aOp4: String; aSL: TStringList); class procedure CalcTestInstFile; @@ -1864,7 +1864,7 @@ end; function TAsmTestGenerator.InternalCalcTestDataMREF(const aInst, aOp1, aOp2, aOp3, - aOp4: String; var aDatatyp: string): TStringList; + aOp4: String): TStringList; var i: integer; Item: TOperandListItem; @@ -1904,8 +1904,6 @@ var begin result := TStringList.Create; - aDatatyp := ''; - OItem1 := TOperandListItem.Create; try OItem2 := TOperandListItem.Create; @@ -1985,11 +1983,12 @@ begin if UsePrefix then sl_Prefix := 'oword '; - aDatatyp := 'array[0..15] of byte'; - - Item.Values.Add('v1'); - Item.Values.Add(sl_Prefix + ' v1'); - Item.Values.Add(sl_Prefix + ' [v1]'); + Item.Values.Add(' lOWord'); + Item.Values.Add(' gOWord'); + + Item.Values.Add(' oword lOWord'); + Item.Values.Add(' oword gOWord'); + end else if (AnsiSameText(sl_Operand, 'XMMRM8')) or (AnsiSameText(sl_Operand, 'XMMRM8_M')) or @@ -2003,12 +2002,8 @@ begin if UsePrefix then sl_Prefix := 'byte '; - aDatatyp := 'byte'; - - Item.Values.Add('v1'); - Item.Values.Add(sl_Prefix + ' v1'); - Item.Values.Add(sl_Prefix + ' [v1]'); - + Item.Values.Add('lbyte'); + Item.Values.Add('gbyte'); end else if (AnsiSameText(sl_Operand, 'XMMRM16')) or (AnsiSameText(sl_Operand, 'XMMRM16_M')) or @@ -2021,14 +2016,8 @@ begin Item.OpTyp := otXMMRM16; Item.OpActive := true; - if UsePrefix then sl_Prefix := 'word '; - - aDataTyp := 'word'; - - Item.Values.Add('v1'); - Item.Values.Add(sl_Prefix + ' v1'); - Item.Values.Add(sl_Prefix + ' [v1]'); - + Item.Values.Add('lword'); + Item.Values.Add('gword'); end else if (AnsiSameText(sl_Operand, 'YMMREG')) or (AnsiSameText(sl_Operand, 'YMMREG_M')) or @@ -2054,12 +2043,8 @@ begin Item.OpTyp := otYMMRM; Item.OpActive := true; - if UsePrefix then sl_Prefix := 'yword '; - aDatatyp := 'array [0..31] of byte'; - - Item.Values.Add('v1'); - Item.Values.Add(sl_Prefix + ' v1'); - Item.Values.Add(sl_Prefix + ' [v1]'); + Item.Values.Add('lYWord'); + Item.Values.Add('gYWord'); end else if (AnsiSameText(sl_Operand, 'ZMMREG')) or (AnsiSameText(sl_Operand, 'ZMMREG_M')) or @@ -2085,13 +2070,8 @@ begin Item.OpTyp := otZMMRM; Item.OpActive := true; - if UsePrefix then sl_Prefix := 'zword '; - - aDatatyp := 'array[0..63] of byte'; - - Item.Values.Add('v1'); - Item.Values.Add(sl_Prefix + ' v1'); - Item.Values.Add(sl_Prefix + ' [v1]'); + Item.Values.Add('lZWord'); + Item.Values.Add('gZWord'); end else if AnsiSameText(sl_Operand, 'MEM8') then begin @@ -2099,16 +2079,8 @@ begin Item.OpTyp := otMEM8; Item.OpActive := true; - if UsePrefix then - begin - sl_Prefix := 'byte '; - end; - - aDatatyp := 'byte'; - - Item.Values.Add('v1'); - Item.Values.Add(sl_Prefix + ' v1'); - Item.Values.Add(sl_Prefix + ' [v1]'); + Item.Values.Add('lByte'); + Item.Values.Add('gByte'); end else if AnsiSameText(sl_Operand, 'MEM16') or AnsiSameText(sl_Operand, 'MEM16_M') then @@ -2117,16 +2089,8 @@ begin Item.OpTyp := otMEM16; Item.OpActive := true; - if UsePrefix then - begin - sl_Prefix := 'word '; - end; - - aDataTyp := 'word'; - - Item.Values.Add('v1'); - Item.Values.Add(sl_Prefix + ' v1'); - Item.Values.Add(sl_Prefix + ' [v1]'); + Item.Values.Add('lWord'); + Item.Values.Add('gWord'); end else if AnsiSameText(sl_Operand, 'MEM32') or AnsiSameText(sl_Operand, 'MEM32_M') or @@ -2136,13 +2100,8 @@ begin Item.OpTyp := otMEM32; Item.OpActive := true; - if UsePrefix then sl_Prefix := 'dword '; - aDataTyp := 'dword'; - - - Item.Values.Add('v1'); - Item.Values.Add(sl_Prefix + ' v1'); - Item.Values.Add(sl_Prefix + ' [v1]'); + Item.Values.Add('lDWord'); + Item.Values.Add('gDWord'); end else if (AnsiSameText(sl_Operand, 'MEM64')) or (AnsiSameText(sl_Operand, 'MEM64_M')) or @@ -2152,13 +2111,8 @@ begin Item.OpTyp := otMEM64; Item.OpActive := true; - if UsePrefix then sl_Prefix := 'qword '; - - aDataTyp := 'qword'; - - Item.Values.Add('v1'); - Item.Values.Add(sl_Prefix + ' v1'); - Item.Values.Add(sl_Prefix + ' [v1]'); + Item.Values.Add('lQWord'); + Item.Values.Add('gQWord'); end else if (AnsiSameText(sl_Operand, 'MEM128')) or (AnsiSameText(sl_Operand, 'MEM128_M')) or @@ -2168,13 +2122,8 @@ begin Item.OpTyp := otMEM128; Item.OpActive := true; - if UsePrefix then sl_Prefix := 'oword '; - - aDatatyp := 'oword'; - - Item.Values.Add('v1'); - Item.Values.Add(sl_Prefix + ' v1'); - Item.Values.Add(sl_Prefix + ' [v1]'); + Item.Values.Add('lOWord'); + Item.Values.Add('gOWord'); end else if (AnsiSameText(sl_Operand, 'MEM256')) or (AnsiSameText(sl_Operand, 'MEM256_M')) or @@ -2184,13 +2133,8 @@ begin Item.OpTyp := otMEM256; Item.OpActive := true; - if UsePrefix then sl_Prefix := 'yword '; - - aDatatyp := 'yword'; - - Item.Values.Add('v1'); - Item.Values.Add(sl_Prefix + ' v1'); - Item.Values.Add(sl_Prefix + ' [v1]'); + Item.Values.Add('lYWord'); + Item.Values.Add('gYWord'); end else if (AnsiSameText(sl_Operand, 'MEM512')) or (AnsiSameText(sl_Operand, 'MEM512_M')) or @@ -2200,13 +2144,8 @@ begin Item.OpTyp := otMEM512; Item.OpActive := true; - if UsePrefix then sl_Prefix := 'zword '; - - aDatatyp := 'zword'; - - Item.Values.Add('v1'); - Item.Values.Add(sl_Prefix + ' v1'); - Item.Values.Add(sl_Prefix + ' [v1]'); + Item.Values.Add('lZWord'); + Item.Values.Add('gZWord'); end else if AnsiSameText(sl_Operand, 'REG8') then begin @@ -2246,15 +2185,8 @@ begin Item.OpTyp := otRM32; Item.OpActive := true; - Item.Values.AddStrings(FReg32Base); - - if UsePrefix then sl_Prefix := 'dword '; - - aDatatyp := 'dword'; - - Item.Values.Add('v1'); - Item.Values.Add(sl_Prefix + ' v1'); - Item.Values.Add(sl_Prefix + ' [v1]'); + Item.Values.Add('lDWord'); + Item.Values.Add('gDWord'); end else if AnsiSameText(sl_Operand, 'RM64') then begin @@ -2262,13 +2194,8 @@ begin Item.OpTyp := otRM64; Item.OpActive := true; - if UsePrefix then sl_Prefix := 'qword '; - - aDatatyp := 'qword'; - - Item.Values.Add('v1'); - Item.Values.Add(sl_Prefix + ' v1'); - Item.Values.Add(sl_Prefix + ' [v1]'); + Item.Values.Add('lQWord'); + Item.Values.Add('gQWord'); end else if AnsiSameText(sl_Operand, 'IMM8') then begin @@ -2284,10 +2211,6 @@ begin Item.OpNumber := il_Op; Item.OpTyp := otXMEM32; Item.OpActive := true; - - if UsePrefix then sl_Prefix := 'oword '; - - aDatatyp := 'array[0.15] of byte'; end else if AnsiSameText(sl_Operand, 'XMEM64') or AnsiSameText(sl_Operand, 'XMEM64_M') then @@ -2295,11 +2218,6 @@ begin Item.OpNumber := il_Op; Item.OpTyp := otXMEM64; Item.OpActive := true; - - if UsePrefix then sl_Prefix := 'oword '; - - - end else if AnsiSameText(sl_Operand, 'YMEM32') or AnsiSameText(sl_Operand, 'YMEM32_M') then @@ -2307,9 +2225,6 @@ begin Item.OpNumber := il_Op; Item.OpTyp := otYMEM32; Item.OpActive := true; - - if UsePrefix then sl_Prefix := 'yword '; - end else if AnsiSameText(sl_Operand, 'YMEM64') or AnsiSameText(sl_Operand, 'YMEM64_M') then @@ -2347,8 +2262,8 @@ begin Item.OpTyp := otB32; Item.OpActive := true; - Item.Values.Add('v1 {1to2}'); - Item.Values.Add('dword v1 {1to2}'); + Item.Values.Add('lDWord {1to2}'); + Item.Values.Add('gDWord {1to2}'); end else if AnsiSameText(sl_Operand, '4B32') then begin @@ -2356,8 +2271,8 @@ begin Item.OpTyp := otB32; Item.OpActive := true; - Item.Values.Add('v1 {1to4}'); - Item.Values.Add('dword v1 {1to4}'); + Item.Values.Add('lDWord {1to4}'); + Item.Values.Add('gDWord {1to4}'); end else if AnsiSameText(sl_Operand, '8B32') then begin @@ -2365,8 +2280,8 @@ begin Item.OpTyp := otB32; Item.OpActive := true; - Item.Values.Add('v1 {1to8}'); - Item.Values.Add('dword v1 {1to8}'); + Item.Values.Add('lDWord {1to8}'); + Item.Values.Add('gDWord {1to8}'); end else if AnsiSameText(sl_Operand, '16B32') then begin @@ -2374,8 +2289,8 @@ begin Item.OpTyp := otB32; Item.OpActive := true; - Item.Values.Add('v1 {1to16}'); - Item.Values.Add('dword v1 {1to16}'); + Item.Values.Add('lDWord {1to16}'); + Item.Values.Add('gDWord {1to16}'); end else if AnsiSameText(sl_Operand, '2B64') then begin @@ -2383,8 +2298,8 @@ begin Item.OpTyp := otB64; Item.OpActive := true; - Item.Values.Add('v1 {1to2}'); - Item.Values.Add('qword v1 {1to2}'); + Item.Values.Add('lQWord {1to2}'); + Item.Values.Add('gQWord {1to2}'); end else if AnsiSameText(sl_Operand, '4B64') then begin @@ -2392,8 +2307,8 @@ begin Item.OpTyp := otB64; Item.OpActive := true; - Item.Values.Add('v1 {1to4}'); - Item.Values.Add('qword v1 {1to4}'); + Item.Values.Add('lQWord {1to4}'); + Item.Values.Add('gQWord {1to4}'); end else if AnsiSameText(sl_Operand, '8B64') then begin @@ -2401,8 +2316,8 @@ begin Item.OpTyp := otB64; Item.OpActive := true; - Item.Values.Add('v1 {1to8}'); - Item.Values.Add('qword v1 {1to8}'); + Item.Values.Add('lQWord {1to8}'); + Item.Values.Add('gQWord {1to8}'); end else if AnsiSameText(sl_Operand, '16B64') then begin @@ -2410,8 +2325,8 @@ begin Item.OpTyp := otB64; Item.OpActive := true; - Item.Values.Add('v1 {1to16}'); - Item.Values.Add('qword v1 {1to16}'); + Item.Values.Add('lQWord {1to16}'); + Item.Values.Add('gQWord {1to16}'); end else if AnsiSameText(sl_Operand, 'KREG') or AnsiSameText(sl_Operand, 'KREG_M') then @@ -2943,7 +2858,7 @@ begin end; class procedure TAsmTestGenerator.CalcTestDataMREF(aX64, aAVX512, aSAE: boolean; const aInst, aOp1, aOp2, aOp3, - aOp4: String; aSL: TStringList; var aLocalVarDataTyp: string); + aOp4: String; aSL: TStringList); var sl: TStringList; begin @@ -2953,7 +2868,7 @@ begin FAVX512 := aAVX512; FSAE := aSAE; - sl := InternalCalcTestDataMREF(aInst, aOp1, aOp2, aOp3, aOp4, aLocalVarDataTyp); + sl := InternalCalcTestDataMREF(aInst, aOp1, aOp2, aOp3, aOp4); try aSL.AddStrings(sl); finally diff --git a/tests/utils/avx/avxopcodes.pas b/tests/utils/avx/avxopcodes.pas index 481a2e156f..4ef598c02d 100644 --- a/tests/utils/avx/avxopcodes.pas +++ b/tests/utils/avx/avxopcodes.pas @@ -602,9 +602,9 @@ begin FOpCodeList.Add('vminpd,1,1,1,XMMREG_MZ,XMMREG,XMMRM,'); FOpCodeList.Add('vminpd,1,1,1,XMMREG_MZ,XMMREG,2B64,'); FOpCodeList.Add('vminpd,1,1,1,YMMREG_MZ,YMMREG,YMMRM,'); - FOpCodeList.Add('vminpd,1,1,1,YMMREG_MZ,YMMREG,4B32,'); + FOpCodeList.Add('vminpd,1,1,1,YMMREG_MZ,YMMREG,4B64,'); FOpCodeList.Add('vminpd,1,1,1,ZMMREG_MZ,ZMMREG,MEM512,'); - FOpCodeList.Add('vminpd,1,1,1,ZMMREG_MZ,ZMMREG,8B32,'); + FOpCodeList.Add('vminpd,1,1,1,ZMMREG_MZ,ZMMREG,8B64,'); FOpCodeList.Add('vminpd,1,1,1,ZMMREG_MZ,ZMMREG,ZMMREG_SAE,'); FOpCodeList.Add('vminps,1,1,1,XMMREG_MZ,XMMREG,XMMRM,'); FOpCodeList.Add('vminps,1,1,1,XMMREG_MZ,XMMREG,4B32,'); @@ -3326,7 +3326,7 @@ begin if aMREF then begin sLocalVarDataTyp := ''; - TAsmTestGenerator.CalcTestDataMREF(aX64, aAVX512 and (sl[3] = '1'), aSAE, sl[0], sl[4], sl[5], sl[6], sl[7], slAsm, sLocalVarDataTyp); + TAsmTestGenerator.CalcTestDataMREF(aX64, aAVX512 and (sl[3] = '1'), aSAE, sl[0], sl[4], sl[5], sl[6], sl[7], slAsm); sDestFile := 'MREF_' + sDestFile; if trim(sLocalVarDataTyp) = '' then @@ -3402,9 +3402,30 @@ begin slHeader.Add('Program $$$OPCODE$$$;'); slHeader.Add('{$asmmode intel}'); + + + slHeader.Add('var'); + slHeader.Add(' gByte: byte;'); + slHeader.Add(' gWord: word;'); + slHeader.Add(' gDWord: dword;'); + slHeader.Add(' gQWord: qword;'); + slHeader.Add(' gOWord: array[0..15] of byte;'); + slHeader.Add(' gYWord: array[0..31] of byte;'); + slHeader.Add(' gZWord: array[0..63] of byte;'); + slHeader.Add(' procedure dummyproc;'); slHeader.Add(' var'); - slHeader.Add(' v1: $$$LOCALVARDATATYP$$$;'); + slHeader.Add(' lByte: byte;'); + slHeader.Add(' lWord: word;'); + slHeader.Add(' lDWord: dword;'); + slHeader.Add(' lQWord: qword;'); + slHeader.Add(' lOWord: array[0..15] of byte;'); + slHeader.Add(' lYWord: array[0..31] of byte;'); + slHeader.Add(' lZWord: array[0..63] of byte;'); + + slHeader.Add(' lSingle: single;'); + slHeader.Add(' lDouble: double;'); + slHeader.Add(' begin'); slHeader.Add(' asm'); for i := 1 to 10 do