瀏覽代碼

+ support all XSAVE instructions, resolves #37864

git-svn-id: trunk@47042 -
florian 4 年之前
父節點
當前提交
963fe73d19

+ 7 - 0
compiler/i386/i386att.inc

@@ -1125,6 +1125,13 @@
 'rdrand',
 'rdseed',
 'xgetbv',
+'xsetbv',
+'xsave',
+'xsave64',
+'xrstor',
+'xrstor64',
+'xsaveopt',
+'xsaveopt64',
 'prefetchwt1',
 'kaddb',
 'kaddd',

+ 7 - 0
compiler/i386/i386atts.inc

@@ -1125,6 +1125,13 @@ attsufNONE,
 attsufNONE,
 attsufNONE,
 attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
 attsufINT,
 attsufNONE,
 attsufNONE,

+ 7 - 0
compiler/i386/i386int.inc

@@ -1125,6 +1125,13 @@
 'rdrand',
 'rdseed',
 'xgetbv',
+'xsetbv',
+'xsave',
+'xsave64',
+'xrstor',
+'xrstor64',
+'xsaveopt',
+'xsaveopt64',
 'prefetchwt1',
 'kaddb',
 'kaddd',

+ 1 - 1
compiler/i386/i386nop.inc

@@ -1,2 +1,2 @@
 { don't edit, this file is generated from x86ins.dat }
-4143;
+4150;

+ 7 - 0
compiler/i386/i386op.inc

@@ -1125,6 +1125,13 @@ A_XTEST,
 A_RDRAND,
 A_RDSEED,
 A_XGETBV,
+A_XSETBV,
+A_XSAVE,
+A_XSAVE64,
+A_XRSTOR,
+A_XRSTOR64,
+A_XSAVEOPT,
+A_XSAVEOPT64,
 A_PREFETCHWT1,
 A_KADDB,
 A_KADDD,

+ 7 - 0
compiler/i386/i386prop.inc

@@ -1125,6 +1125,13 @@
 (Ch: [Ch_Wop1, Ch_WFlags]),
 (Ch: [Ch_Wop1, Ch_WFlags]),
 (Ch: [Ch_WEAX, Ch_WEDX, Ch_RECX]),
+(Ch: [Ch_REAX, Ch_REDX, Ch_RECX]),
+(Ch: [Ch_All]),
+(Ch: [Ch_All]),
+(Ch: [Ch_All]),
+(Ch: [Ch_All]),
+(Ch: [Ch_All]),
+(Ch: [Ch_All]),
 (Ch: [Ch_All]),
 (Ch: [Ch_All]),
 (Ch: [Ch_All]),

+ 49 - 0
compiler/i386/i386tab.inc

@@ -20223,6 +20223,55 @@
     code    : #3#15#1#208;
     flags   : [if_xsave]
   ),
+  (
+    opcode  : A_XSETBV;
+    ops     : 0;
+    optypes : (ot_none,ot_none,ot_none,ot_none);
+    code    : #3#15#1#209;
+    flags   : [if_xsave]
+  ),
+  (
+    opcode  : A_XSAVE;
+    ops     : 1;
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
+    code    : #2#15#174#132;
+    flags   : [if_xsave]
+  ),
+  (
+    opcode  : A_XSAVE64;
+    ops     : 1;
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
+    code    : #214#2#15#174#132;
+    flags   : [if_xsave]
+  ),
+  (
+    opcode  : A_XRSTOR;
+    ops     : 1;
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
+    code    : #2#15#174#133;
+    flags   : [if_xsave]
+  ),
+  (
+    opcode  : A_XRSTOR64;
+    ops     : 1;
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
+    code    : #214#2#15#174#133;
+    flags   : [if_xsave]
+  ),
+  (
+    opcode  : A_XSAVEOPT;
+    ops     : 1;
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
+    code    : #2#15#174#134;
+    flags   : [if_xsave]
+  ),
+  (
+    opcode  : A_XSAVEOPT64;
+    ops     : 1;
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
+    code    : #214#2#15#174#134;
+    flags   : [if_xsave]
+  ),
   (
     opcode  : A_PREFETCHWT1;
     ops     : 1;

+ 7 - 0
compiler/i8086/i8086att.inc

@@ -1139,6 +1139,13 @@
 'rdrand',
 'rdseed',
 'xgetbv',
+'xsetbv',
+'xsave',
+'xsave64',
+'xrstor',
+'xrstor64',
+'xsaveopt',
+'xsaveopt64',
 'prefetchwt1',
 'kaddb',
 'kaddd',

+ 7 - 0
compiler/i8086/i8086atts.inc

@@ -1139,6 +1139,13 @@ attsufNONE,
 attsufNONE,
 attsufNONE,
 attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
 attsufINT,
 attsufNONE,
 attsufNONE,

+ 7 - 0
compiler/i8086/i8086int.inc

@@ -1139,6 +1139,13 @@
 'rdrand',
 'rdseed',
 'xgetbv',
+'xsetbv',
+'xsave',
+'xsave64',
+'xrstor',
+'xrstor64',
+'xsaveopt',
+'xsaveopt64',
 'prefetchwt1',
 'kaddb',
 'kaddd',

+ 1 - 1
compiler/i8086/i8086nop.inc

@@ -1,2 +1,2 @@
 { don't edit, this file is generated from x86ins.dat }
-4175;
+4182;

+ 7 - 0
compiler/i8086/i8086op.inc

@@ -1139,6 +1139,13 @@ A_XTEST,
 A_RDRAND,
 A_RDSEED,
 A_XGETBV,
+A_XSETBV,
+A_XSAVE,
+A_XSAVE64,
+A_XRSTOR,
+A_XRSTOR64,
+A_XSAVEOPT,
+A_XSAVEOPT64,
 A_PREFETCHWT1,
 A_KADDB,
 A_KADDD,

+ 7 - 0
compiler/i8086/i8086prop.inc

@@ -1139,6 +1139,13 @@
 (Ch: [Ch_Wop1, Ch_WFlags]),
 (Ch: [Ch_Wop1, Ch_WFlags]),
 (Ch: [Ch_WEAX, Ch_WEDX, Ch_RECX]),
+(Ch: [Ch_REAX, Ch_REDX, Ch_RECX]),
+(Ch: [Ch_All]),
+(Ch: [Ch_All]),
+(Ch: [Ch_All]),
+(Ch: [Ch_All]),
+(Ch: [Ch_All]),
+(Ch: [Ch_All]),
 (Ch: [Ch_All]),
 (Ch: [Ch_All]),
 (Ch: [Ch_All]),

+ 49 - 0
compiler/i8086/i8086tab.inc

@@ -20447,6 +20447,55 @@
     code    : #3#15#1#208;
     flags   : [if_xsave]
   ),
+  (
+    opcode  : A_XSETBV;
+    ops     : 0;
+    optypes : (ot_none,ot_none,ot_none,ot_none);
+    code    : #3#15#1#209;
+    flags   : [if_xsave]
+  ),
+  (
+    opcode  : A_XSAVE;
+    ops     : 1;
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
+    code    : #2#15#174#132;
+    flags   : [if_xsave]
+  ),
+  (
+    opcode  : A_XSAVE64;
+    ops     : 1;
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
+    code    : #214#2#15#174#132;
+    flags   : [if_xsave]
+  ),
+  (
+    opcode  : A_XRSTOR;
+    ops     : 1;
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
+    code    : #2#15#174#133;
+    flags   : [if_xsave]
+  ),
+  (
+    opcode  : A_XRSTOR64;
+    ops     : 1;
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
+    code    : #214#2#15#174#133;
+    flags   : [if_xsave]
+  ),
+  (
+    opcode  : A_XSAVEOPT;
+    ops     : 1;
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
+    code    : #2#15#174#134;
+    flags   : [if_xsave]
+  ),
+  (
+    opcode  : A_XSAVEOPT64;
+    ops     : 1;
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
+    code    : #214#2#15#174#134;
+    flags   : [if_xsave]
+  ),
   (
     opcode  : A_PREFETCHWT1;
     ops     : 1;

+ 31 - 3
compiler/x86/x86ins.dat

@@ -4187,7 +4187,7 @@ ymmreg_mz,zmmreg_er                       \334\350\351\352\370\1\xE6\110
 
 
 ; VCVTPD2PS xmmreg_mz,mem256 must come first - map MemRefSize 256bits correct
-;                                              map all other MemrefSize (without broasdcast MemRef) to xmmreg, xmmrm 
+;                                              map all other MemrefSize (without broasdcast MemRef) to xmmreg, xmmrm
 [VCVTPD2PS,vcvtpd2psM]
 (Ch_Wop2, Ch_Rop1)
 xmmreg_mz,mem256                          \350\352\361\362\364\370\1\x5A\110        AVX,SANDYBRIDGE,TFV
@@ -4286,7 +4286,7 @@ reg64,mem32                               \333\350\352\362\363\370\1\x2D\110
 reg64,xmmreg_er                           \333\350\352\362\363\370\1\x2D\110        AVX,SANDYBRIDGE
 
 ; VCVTTPD2DQ xmmreg_mz,mem256 must come first - map MemRefSize 256bits correct
-;                                               map all other MemrefSize (without broasdcast MemRef) to xmmreg, xmmrm 
+;                                               map all other MemrefSize (without broasdcast MemRef) to xmmreg, xmmrm
 [VCVTTPD2DQ,vcvttpd2dqM]
 (Ch_Wop2, Ch_Rop1)
 xmmreg_mz,mem256                          \350\352\361\362\364\370\1\xE6\110        AVX,SANDYBRIDGE,AVX512,TFV
@@ -6924,6 +6924,35 @@ reg16|32|64                          \320\2\x0F\xC7\207                   RAND
 (Ch_WEAX, Ch_WEDX, Ch_RECX)
 void                  \3\x0F\x01\xD0                                      XSAVE
 
+[XSETBV]
+(Ch_REAX, Ch_REDX, Ch_RECX)
+void                  \3\x0F\x01\xD1                                      XSAVE
+
+[XSAVE]
+(Ch_All)
+mem                   \2\x0F\xAE\204                                      XSAVE
+
+[XSAVE64]
+(Ch_All)
+mem                   \326\2\x0F\xAE\204                                  XSAVE
+
+[XRSTOR]
+(Ch_All)
+mem                   \2\x0F\xAE\205                                      XSAVE
+
+[XRSTOR64]
+(Ch_All)
+mem                   \326\2\x0F\xAE\205                                  XSAVE
+
+[XSAVEOPT]
+(Ch_All)
+mem                   \2\x0F\xAE\206                                      XSAVE
+
+[XSAVEOPT64]
+(Ch_All)
+mem                   \326\2\x0F\xAE\206                                  XSAVE
+
+
 ;*******************************************************************************
 ;********** PREFETCHWT1 ********************************************************
 ;*******************************************************************************
@@ -6931,7 +6960,6 @@ void                  \3\x0F\x01\xD0                                      XSAVE
 (Ch_All)
 mem                   \2\x0F\x0D\202                                      PREFETCHWT1
 
-
 ;*******************************************************************************
 ;********** AVX 512 - MASKRegister *********************************************
 ;*******************************************************************************

+ 7 - 0
compiler/x86_64/x8664ats.inc

@@ -1121,6 +1121,13 @@ attsufNONE,
 attsufNONE,
 attsufNONE,
 attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
 attsufINT,
 attsufNONE,
 attsufNONE,

+ 7 - 0
compiler/x86_64/x8664att.inc

@@ -1121,6 +1121,13 @@
 'rdrand',
 'rdseed',
 'xgetbv',
+'xsetbv',
+'xsave',
+'xsave64',
+'xrstor',
+'xrstor64',
+'xsaveopt',
+'xsaveopt64',
 'prefetchwt1',
 'kaddb',
 'kaddd',

+ 7 - 0
compiler/x86_64/x8664int.inc

@@ -1121,6 +1121,13 @@
 'rdrand',
 'rdseed',
 'xgetbv',
+'xsetbv',
+'xsave',
+'xsave64',
+'xrstor',
+'xrstor64',
+'xsaveopt',
+'xsaveopt64',
 'prefetchwt1',
 'kaddb',
 'kaddd',

+ 1 - 1
compiler/x86_64/x8664nop.inc

@@ -1,2 +1,2 @@
 { don't edit, this file is generated from x86ins.dat }
-4207;
+4214;

+ 7 - 0
compiler/x86_64/x8664op.inc

@@ -1121,6 +1121,13 @@ A_XTEST,
 A_RDRAND,
 A_RDSEED,
 A_XGETBV,
+A_XSETBV,
+A_XSAVE,
+A_XSAVE64,
+A_XRSTOR,
+A_XRSTOR64,
+A_XSAVEOPT,
+A_XSAVEOPT64,
 A_PREFETCHWT1,
 A_KADDB,
 A_KADDD,

+ 7 - 0
compiler/x86_64/x8664pro.inc

@@ -1121,6 +1121,13 @@
 (Ch: [Ch_Wop1, Ch_WFlags]),
 (Ch: [Ch_Wop1, Ch_WFlags]),
 (Ch: [Ch_WEAX, Ch_WEDX, Ch_RECX]),
+(Ch: [Ch_REAX, Ch_REDX, Ch_RECX]),
+(Ch: [Ch_All]),
+(Ch: [Ch_All]),
+(Ch: [Ch_All]),
+(Ch: [Ch_All]),
+(Ch: [Ch_All]),
+(Ch: [Ch_All]),
 (Ch: [Ch_All]),
 (Ch: [Ch_All]),
 (Ch: [Ch_All]),

+ 49 - 0
compiler/x86_64/x8664tab.inc

@@ -20671,6 +20671,55 @@
     code    : #3#15#1#208;
     flags   : [if_xsave]
   ),
+  (
+    opcode  : A_XSETBV;
+    ops     : 0;
+    optypes : (ot_none,ot_none,ot_none,ot_none);
+    code    : #3#15#1#209;
+    flags   : [if_xsave]
+  ),
+  (
+    opcode  : A_XSAVE;
+    ops     : 1;
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
+    code    : #2#15#174#132;
+    flags   : [if_xsave]
+  ),
+  (
+    opcode  : A_XSAVE64;
+    ops     : 1;
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
+    code    : #214#2#15#174#132;
+    flags   : [if_xsave]
+  ),
+  (
+    opcode  : A_XRSTOR;
+    ops     : 1;
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
+    code    : #2#15#174#133;
+    flags   : [if_xsave]
+  ),
+  (
+    opcode  : A_XRSTOR64;
+    ops     : 1;
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
+    code    : #214#2#15#174#133;
+    flags   : [if_xsave]
+  ),
+  (
+    opcode  : A_XSAVEOPT;
+    ops     : 1;
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
+    code    : #2#15#174#134;
+    flags   : [if_xsave]
+  ),
+  (
+    opcode  : A_XSAVEOPT64;
+    ops     : 1;
+    optypes : (ot_memory,ot_none,ot_none,ot_none);
+    code    : #214#2#15#174#134;
+    flags   : [if_xsave]
+  ),
   (
     opcode  : A_PREFETCHWT1;
     ops     : 1;

+ 15 - 18
tests/utils/avx/avxopcodes.pas

@@ -52,6 +52,17 @@ end;
 procedure TAVXTestGenerator.Init;
 begin
   // Opcode, i386, x8664, AVX512, Parameter
+
+  { XSAVE opcodes }
+  FOpCodeList.Add('XGETBV,1,1,0,,,,,');
+  FOpCodeList.Add('XSETBV,1,1,0,,,,,');
+  FOpCodeList.Add('XSAVE,1,1,0,MEM64,,,,');
+  FOpCodeList.Add('XSAVE64,1,1,0,MEM64,,,,');
+  FOpCodeList.Add('XRSTOR,1,1,0,MEM64,,,,');
+  FOpCodeList.Add('XRSTOR64,1,1,0,MEM64,,,,');
+  FOpCodeList.Add('XSAVEOPT,1,1,0,MEM64,,,,');
+  FOpCodeList.Add('XSAVEOPT64,1,1,0,MEM64,,,,');
+
   FOpCodeList.Add('ADDSS,1,1,0,XMMREG,XMMREG,,,');
   FOpCodeList.Add('ADDSS,1,1,0,XMMREG,MEM32,,,');
 
@@ -144,17 +155,6 @@ begin
 
 
 
-
-
-
-
-
-
-
-
-
-
-
   FOpCodeList.Add('ADCX,1,1,0,REG32,RM32,,,');
   FOpCodeList.Add('ADCX,1,1,0,REG64,RM64,,,');
   FOpCodeList.Add('ADOX,1,1,0,REG32,RM32,,,');
@@ -174,7 +174,7 @@ begin
   FOpCodeList.Add('PDEP,1,1,0,REG64,REG64,RM64,,');
   FOpCodeList.Add('PEXT,1,1,0,REG32,REG32,RM32,,');
   FOpCodeList.Add('PEXT,1,1,0,REG64,REG64,RM64,,');
-  
+
   FOpCodeList.Add('MOVBE,1,1,0,REG16,MEM16,,,');
   FOpCodeList.Add('MOVBE,1,1,0,MEM16,REG16,,,');
   FOpCodeList.Add('MOVBE,1,1,0,REG32,MEM32,,,');
@@ -425,7 +425,7 @@ begin
   FOpCodeList.Add('vcvtdq2pd,1,1,1,ZMMREG_MZ,MEM256,,');
   FOpCodeList.Add('vcvtdq2pd,1,1,1,ZMMREG_MZ,YMMREG_ER,,');
   FOpCodeList.Add('vcvtdq2pd,1,1,1,ZMMREG_MZ,8B32,,');
- 
+
   FOpCodeList.Add('vcvtdq2ps,1,1,1,XMMREG_MZ,XMMRM,,');
   FOpCodeList.Add('vcvtdq2ps,1,1,1,XMMREG_MZ,4B32,,');
   FOpCodeList.Add('vcvtdq2ps,1,1,1,YMMREG_MZ,YMMRM,,');
@@ -3134,10 +3134,10 @@ begin
   FOpCodeList.Add('vshufi64x2,1,1,1,ymmreg_mz,ymmreg,4b64,imm8');
   FOpCodeList.Add('vshufi64x2,1,1,1,zmmreg_mz,zmmreg,zmmrm,imm8');
   FOpCodeList.Add('vshufi64x2,1,1,1,zmmreg_mz,zmmreg,8b64,imm8');
-    
+
   FOpCodeList.Add('movntss,1,1,0,MEM32,XMMREG,');
   FOpCodeList.Add('movntsd,1,1,0,MEM64,XMMREG,');
-  
+
   FOpCodeList.Add('VAESDEC,1,1,1,xmmreg,xmmreg,xmmrm,');
   FOpCodeList.Add('VAESDEC,1,1,1,zmmreg,zmmreg,zmmrm,');
   FOpCodeList.Add('VAESDECLAST,1,1,1,xmmreg,xmmreg,xmmrm,');
@@ -3269,9 +3269,6 @@ begin
   FOpCodeList.Add('VPSHUFBITQMB,1,1,1,kreg_m,xmmreg,xmmrm,');
   FOpCodeList.Add('VPSHUFBITQMB,1,1,1,kreg_m,ymmreg,ymmrm,');
   FOpCodeList.Add('VPSHUFBITQMB,1,1,1,kreg_m,zmmreg,zmmrm,');
-
-  
-  
 end;
 
 function TAVXTestGenerator.InternalMakeTestFiles(aX64, aAVX512, aSAE: boolean; aDestPath, aFileExt: String;