Browse Source

+ support of SHA extension in the internal assembler

florian 3 years ago
parent
commit
6c7e6191f6

+ 8 - 1
compiler/i386/i386att.inc

@@ -1435,5 +1435,12 @@
 'vpshrdvq',
 'vpshrdvw',
 'vpshrdw',
-'vpshufbitqmb'
+'vpshufbitqmb',
+'sha1rnds4',
+'sha1nexte',
+'sha1msg1',
+'sha1msg2',
+'sha256rnds2',
+'sha256msg1',
+'sha256msg2'
 );

+ 7 - 0
compiler/i386/i386atts.inc

@@ -1435,5 +1435,12 @@ attsufNONE,
 attsufNONE,
 attsufNONE,
 attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
 attsufNONE
 );

+ 8 - 1
compiler/i386/i386int.inc

@@ -1435,5 +1435,12 @@
 'vpshrdvq',
 'vpshrdvw',
 'vpshrdw',
-'vpshufbitqmb'
+'vpshufbitqmb',
+'sha1rnds4',
+'sha1nexte',
+'sha1msg1',
+'sha1msg2',
+'sha256rnds2',
+'sha256msg1',
+'sha256msg2'
 );

+ 1 - 1
compiler/i386/i386nop.inc

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

+ 8 - 1
compiler/i386/i386op.inc

@@ -1435,5 +1435,12 @@ A_VPSHRDVD,
 A_VPSHRDVQ,
 A_VPSHRDVW,
 A_VPSHRDW,
-A_VPSHUFBITQMB
+A_VPSHUFBITQMB,
+A_SHA1RNDS4,
+A_SHA1NEXTE,
+A_SHA1MSG1,
+A_SHA1MSG2,
+A_SHA256RNDS2,
+A_SHA256MSG1,
+A_SHA256MSG2
 );

+ 8 - 1
compiler/i386/i386prop.inc

@@ -1435,5 +1435,12 @@
 (Ch: [Ch_All]),
 (Ch: [Ch_All]),
 (Ch: [Ch_All]),
-(Ch: [Ch_All])
+(Ch: [Ch_All]),
+(Ch: [Ch_Mop2, Ch_Rop1]),
+(Ch: [Ch_Mop2, Ch_Rop1]),
+(Ch: [Ch_Mop2, Ch_Rop1]),
+(Ch: [Ch_Mop2, Ch_Rop1]),
+(Ch: [Ch_Mop2, Ch_Rop1]),
+(Ch: [Ch_Mop2, Ch_Rop1]),
+(Ch: [Ch_Mop2, Ch_Rop1])
 );

+ 49 - 0
compiler/i386/i386tab.inc

@@ -29147,5 +29147,54 @@
     optypes : (ot_kreg_m,ot_zmmreg,ot_zmmrm,ot_none);
     code    : #232#233#241#249#1#143#61#80;
     flags   : [if_avx512,if_tfvm]
+  ),
+  (
+    opcode  : A_SHA1RNDS4;
+    ops     : 3;
+    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate,ot_none);
+    code    : #3#15#58#204#72#22;
+    flags   : [if_sha]
+  ),
+  (
+    opcode  : A_SHA1NEXTE;
+    ops     : 2;
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
+    code    : #3#15#56#200#72;
+    flags   : [if_sha]
+  ),
+  (
+    opcode  : A_SHA1MSG1;
+    ops     : 2;
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
+    code    : #3#15#56#201#72;
+    flags   : [if_sha]
+  ),
+  (
+    opcode  : A_SHA1MSG2;
+    ops     : 2;
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
+    code    : #3#15#56#12#72;
+    flags   : [if_sha]
+  ),
+  (
+    opcode  : A_SHA256RNDS2;
+    ops     : 2;
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
+    code    : #3#15#56#203#72;
+    flags   : [if_sha]
+  ),
+  (
+    opcode  : A_SHA256MSG1;
+    ops     : 2;
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
+    code    : #3#15#56#204#72;
+    flags   : [if_sha]
+  ),
+  (
+    opcode  : A_SHA256MSG2;
+    ops     : 2;
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
+    code    : #3#15#56#205#72;
+    flags   : [if_sha]
   )
 );

+ 8 - 1
compiler/i8086/i8086att.inc

@@ -1449,5 +1449,12 @@
 'vpshrdvq',
 'vpshrdvw',
 'vpshrdw',
-'vpshufbitqmb'
+'vpshufbitqmb',
+'sha1rnds4',
+'sha1nexte',
+'sha1msg1',
+'sha1msg2',
+'sha256rnds2',
+'sha256msg1',
+'sha256msg2'
 );

+ 7 - 0
compiler/i8086/i8086atts.inc

@@ -1449,5 +1449,12 @@ attsufNONE,
 attsufNONE,
 attsufNONE,
 attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
 attsufNONE
 );

+ 8 - 1
compiler/i8086/i8086int.inc

@@ -1449,5 +1449,12 @@
 'vpshrdvq',
 'vpshrdvw',
 'vpshrdw',
-'vpshufbitqmb'
+'vpshufbitqmb',
+'sha1rnds4',
+'sha1nexte',
+'sha1msg1',
+'sha1msg2',
+'sha256rnds2',
+'sha256msg1',
+'sha256msg2'
 );

+ 1 - 1
compiler/i8086/i8086nop.inc

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

+ 8 - 1
compiler/i8086/i8086op.inc

@@ -1449,5 +1449,12 @@ A_VPSHRDVD,
 A_VPSHRDVQ,
 A_VPSHRDVW,
 A_VPSHRDW,
-A_VPSHUFBITQMB
+A_VPSHUFBITQMB,
+A_SHA1RNDS4,
+A_SHA1NEXTE,
+A_SHA1MSG1,
+A_SHA1MSG2,
+A_SHA256RNDS2,
+A_SHA256MSG1,
+A_SHA256MSG2
 );

+ 8 - 1
compiler/i8086/i8086prop.inc

@@ -1449,5 +1449,12 @@
 (Ch: [Ch_All]),
 (Ch: [Ch_All]),
 (Ch: [Ch_All]),
-(Ch: [Ch_All])
+(Ch: [Ch_All]),
+(Ch: [Ch_Mop2, Ch_Rop1]),
+(Ch: [Ch_Mop2, Ch_Rop1]),
+(Ch: [Ch_Mop2, Ch_Rop1]),
+(Ch: [Ch_Mop2, Ch_Rop1]),
+(Ch: [Ch_Mop2, Ch_Rop1]),
+(Ch: [Ch_Mop2, Ch_Rop1]),
+(Ch: [Ch_Mop2, Ch_Rop1])
 );

+ 49 - 0
compiler/i8086/i8086tab.inc

@@ -29371,5 +29371,54 @@
     optypes : (ot_kreg_m,ot_zmmreg,ot_zmmrm,ot_none);
     code    : #232#233#241#249#1#143#61#80;
     flags   : [if_avx512,if_tfvm]
+  ),
+  (
+    opcode  : A_SHA1RNDS4;
+    ops     : 3;
+    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate,ot_none);
+    code    : #3#15#58#204#72#22;
+    flags   : [if_sha]
+  ),
+  (
+    opcode  : A_SHA1NEXTE;
+    ops     : 2;
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
+    code    : #3#15#56#200#72;
+    flags   : [if_sha]
+  ),
+  (
+    opcode  : A_SHA1MSG1;
+    ops     : 2;
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
+    code    : #3#15#56#201#72;
+    flags   : [if_sha]
+  ),
+  (
+    opcode  : A_SHA1MSG2;
+    ops     : 2;
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
+    code    : #3#15#56#12#72;
+    flags   : [if_sha]
+  ),
+  (
+    opcode  : A_SHA256RNDS2;
+    ops     : 2;
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
+    code    : #3#15#56#203#72;
+    flags   : [if_sha]
+  ),
+  (
+    opcode  : A_SHA256MSG1;
+    ops     : 2;
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
+    code    : #3#15#56#204#72;
+    flags   : [if_sha]
+  ),
+  (
+    opcode  : A_SHA256MSG2;
+    ops     : 2;
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
+    code    : #3#15#56#205#72;
+    flags   : [if_sha]
   )
 );

+ 1 - 2
compiler/x86/aasmcpu.pas

@@ -463,6 +463,7 @@ interface
         IF_RAND,
         IF_XSAVE,
         IF_PREFETCHWT1,
+        IF_SHA,
 
         { mask for processor level }
         { please keep these in order and in sync with IF_PLEVEL }
@@ -3523,8 +3524,6 @@ implementation
        * \370          - VEX 0F-FLAG
        * \371          - VEX 0F38-FLAG
        * \372          - VEX 0F3A-FLAG
-
-
       }
 
       var

+ 30 - 0
compiler/x86/x86ins.dat

@@ -9136,5 +9136,35 @@ kreg_m,xmmreg,xmmrm                       \350\361\371\1\x8F\75\120
 kreg_m,ymmreg,ymmrm                       \350\361\364\371\1\x8F\75\120             AVX512,TFVM
 kreg_m,zmmreg,zmmrm                       \350\351\361\371\1\x8F\75\120             AVX512,TFVM
 
+;*******************************************************************************
+;********* SHA *****************************************************************
+;*******************************************************************************
+
+[SHA1RNDS4]
+(Ch_Mop2, Ch_Rop1)
+xmmreg,xmmrm,imm                          \3\x0F\x3A\xCC\110\26                     SHA
+
+[SHA1NEXTE]
+(Ch_Mop2, Ch_Rop1)
+xmmreg,xmmrm                              \3\x0F\x38\xC8\110                        SHA
+
+[SHA1MSG1]
+(Ch_Mop2, Ch_Rop1)
+xmmreg,xmmrm                              \3\x0F\x38\xC9\110                        SHA
+
+[SHA1MSG2]
+(Ch_Mop2, Ch_Rop1)
+xmmreg,xmmrm                              \3\x0F\x38\xC\110                        SHA
 
+[SHA256RNDS2]
+; reads also xmm0 !
+(Ch_Mop2, Ch_Rop1)
+xmmreg,xmmrm                              \3\x0F\x38\xCB\110                        SHA
 
+[SHA256MSG1]
+(Ch_Mop2, Ch_Rop1)
+xmmreg,xmmrm                              \3\x0F\x38\xCC\110                        SHA
+
+[SHA256MSG2]
+(Ch_Mop2, Ch_Rop1)
+xmmreg,xmmrm                              \3\x0F\x38\xCD\110                        SHA

+ 7 - 0
compiler/x86_64/x8664ats.inc

@@ -1431,5 +1431,12 @@ attsufNONE,
 attsufNONE,
 attsufNONE,
 attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
 attsufNONE
 );

+ 8 - 1
compiler/x86_64/x8664att.inc

@@ -1431,5 +1431,12 @@
 'vpshrdvq',
 'vpshrdvw',
 'vpshrdw',
-'vpshufbitqmb'
+'vpshufbitqmb',
+'sha1rnds4',
+'sha1nexte',
+'sha1msg1',
+'sha1msg2',
+'sha256rnds2',
+'sha256msg1',
+'sha256msg2'
 );

+ 8 - 1
compiler/x86_64/x8664int.inc

@@ -1431,5 +1431,12 @@
 'vpshrdvq',
 'vpshrdvw',
 'vpshrdw',
-'vpshufbitqmb'
+'vpshufbitqmb',
+'sha1rnds4',
+'sha1nexte',
+'sha1msg1',
+'sha1msg2',
+'sha256rnds2',
+'sha256msg1',
+'sha256msg2'
 );

+ 1 - 1
compiler/x86_64/x8664nop.inc

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

+ 8 - 1
compiler/x86_64/x8664op.inc

@@ -1431,5 +1431,12 @@ A_VPSHRDVD,
 A_VPSHRDVQ,
 A_VPSHRDVW,
 A_VPSHRDW,
-A_VPSHUFBITQMB
+A_VPSHUFBITQMB,
+A_SHA1RNDS4,
+A_SHA1NEXTE,
+A_SHA1MSG1,
+A_SHA1MSG2,
+A_SHA256RNDS2,
+A_SHA256MSG1,
+A_SHA256MSG2
 );

+ 8 - 1
compiler/x86_64/x8664pro.inc

@@ -1431,5 +1431,12 @@
 (Ch: [Ch_All]),
 (Ch: [Ch_All]),
 (Ch: [Ch_All]),
-(Ch: [Ch_All])
+(Ch: [Ch_All]),
+(Ch: [Ch_Mop2, Ch_Rop1]),
+(Ch: [Ch_Mop2, Ch_Rop1]),
+(Ch: [Ch_Mop2, Ch_Rop1]),
+(Ch: [Ch_Mop2, Ch_Rop1]),
+(Ch: [Ch_Mop2, Ch_Rop1]),
+(Ch: [Ch_Mop2, Ch_Rop1]),
+(Ch: [Ch_Mop2, Ch_Rop1])
 );

+ 49 - 0
compiler/x86_64/x8664tab.inc

@@ -29595,5 +29595,54 @@
     optypes : (ot_kreg_m,ot_zmmreg,ot_zmmrm,ot_none);
     code    : #232#233#241#249#1#143#61#80;
     flags   : [if_avx512,if_tfvm]
+  ),
+  (
+    opcode  : A_SHA1RNDS4;
+    ops     : 3;
+    optypes : (ot_xmmreg,ot_xmmrm,ot_immediate,ot_none);
+    code    : #3#15#58#204#72#22;
+    flags   : [if_sha]
+  ),
+  (
+    opcode  : A_SHA1NEXTE;
+    ops     : 2;
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
+    code    : #3#15#56#200#72;
+    flags   : [if_sha]
+  ),
+  (
+    opcode  : A_SHA1MSG1;
+    ops     : 2;
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
+    code    : #3#15#56#201#72;
+    flags   : [if_sha]
+  ),
+  (
+    opcode  : A_SHA1MSG2;
+    ops     : 2;
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
+    code    : #3#15#56#12#72;
+    flags   : [if_sha]
+  ),
+  (
+    opcode  : A_SHA256RNDS2;
+    ops     : 2;
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
+    code    : #3#15#56#203#72;
+    flags   : [if_sha]
+  ),
+  (
+    opcode  : A_SHA256MSG1;
+    ops     : 2;
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
+    code    : #3#15#56#204#72;
+    flags   : [if_sha]
+  ),
+  (
+    opcode  : A_SHA256MSG2;
+    ops     : 2;
+    optypes : (ot_xmmreg,ot_xmmrm,ot_none,ot_none);
+    code    : #3#15#56#205#72;
+    flags   : [if_sha]
   )
 );

+ 1 - 0
tests/utils/avx/asmtestgenerator.pas

@@ -259,6 +259,7 @@ type
       IF_RAND,
       IF_XSAVE,
       IF_PREFETCHWT1,
+      IF_SHA,
 
       { mask for processor level }
       { please keep these in order and in sync with IF_PLEVEL }

+ 19 - 1
tests/utils/avx/avxopcodes.pas

@@ -65,10 +65,25 @@ begin
   inherited;
 end;
 
+{$define TEST_SHA}
+{$define TEST_XSAVE}
+{$define TEST_ALL}
+
 procedure TAVXTestGenerator.Init;
 begin
   // Opcode, i386, x8664, AVX512, Parameter
-
+{$if defined(TEST_SHA) or defined(TEST_ALL)}
+  { SHA opcodes }
+  FOpCodeList.Add('SHA1RNDS4,1,1,0,XMMREG,XMMRM,IMM8,');
+  FOpCodeList.Add('SHA1NEXTE,1,1,0,XMMREG,XMMRM,,');  
+  FOpCodeList.Add('SHA1MSG1,1,1,0,XMMREG,XMMRM,,');  
+  FOpCodeList.Add('SHA1MSG2,1,1,0,XMMREG,XMMRM,,');  
+  FOpCodeList.Add('SHA256RNDS2,1,1,0,XMMREG,XMMRM,,');  
+  FOpCodeList.Add('SHA256MSG1,1,1,0,XMMREG,XMMRM,,');  
+  FOpCodeList.Add('SHA256MSG2,1,1,0,XMMREG,XMMRM,,');  
+{$endif defined(TEST_SHA) or defined(TEST_ALL)}
+
+{$if defined(TEST_XSAVE) or defined(TEST_ALL)}
   { XSAVE opcodes }
   FOpCodeList.Add('XGETBV,1,1,0,,,,,');
   FOpCodeList.Add('XSETBV,1,1,0,,,,,');
@@ -78,7 +93,9 @@ begin
   FOpCodeList.Add('XRSTOR64,1,1,0,MEM64,,,,');
   FOpCodeList.Add('XSAVEOPT,1,1,0,MEM64,,,,');
   FOpCodeList.Add('XSAVEOPT64,1,1,0,MEM64,,,,');
+{$endif defined(TEST_XSAVE) or defined(TEST_ALL)}
 
+{$ifdef TEST_ALL}
   FOpCodeList.Add('ADDSS,1,1,0,XMMREG,XMMREG,,,');
   FOpCodeList.Add('ADDSS,1,1,0,XMMREG,MEM32,,,');
 
@@ -3278,6 +3295,7 @@ 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,');
+{$endif TEST_ALL}  
 end;
 
 function TAVXTestGenerator.SaveFile(aAsmList: TStringList; aOpcode, aDestPath,