Browse Source

+ added a few BMI instructions to see if they can be encoded

git-svn-id: trunk@24907 -
florian 12 years ago
parent
commit
9b6094a58c

+ 7 - 1
compiler/i386/i386att.inc

@@ -943,5 +943,11 @@
 'vxorpd',
 'vxorps',
 'vzeroall',
-'vzeroupper'
+'vzeroupper',
+'andn',
+'bextr',
+'rorx',
+'sarx',
+'shlx',
+'shrx'
 );

+ 6 - 0
compiler/i386/i386atts.inc

@@ -943,5 +943,11 @@ attsufNONE,
 attsufNONE,
 attsufNONE,
 attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
 attsufNONE
 );

+ 7 - 1
compiler/i386/i386int.inc

@@ -943,5 +943,11 @@
 'vxorpd',
 'vxorps',
 'vzeroall',
-'vzeroupper'
+'vzeroupper',
+'andn',
+'bextr',
+'rorx',
+'sarx',
+'shlx',
+'shrx'
 );

+ 1 - 1
compiler/i386/i386nop.inc

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

+ 7 - 1
compiler/i386/i386op.inc

@@ -943,5 +943,11 @@ A_VUNPCKLPS,
 A_VXORPD,
 A_VXORPS,
 A_VZEROALL,
-A_VZEROUPPER
+A_VZEROUPPER,
+A_ANDN,
+A_BEXTR,
+A_RORX,
+A_SARX,
+A_SHLX,
+A_SHRX
 );

+ 7 - 1
compiler/i386/i386prop.inc

@@ -943,5 +943,11 @@
 (Ch: (Ch_All, Ch_None, Ch_None)),
 (Ch: (Ch_All, Ch_None, Ch_None)),
 (Ch: (Ch_All, Ch_None, Ch_None)),
-(Ch: (Ch_All, Ch_None, Ch_None))
+(Ch: (Ch_All, Ch_None, Ch_None)),
+(Ch: (Ch_Wop1, Ch_Rop2, Ch_Rop3)),
+(Ch: (Ch_Wop1, Ch_Rop2, Ch_Rop3)),
+(Ch: (Ch_Wop1, Ch_Rop2, Ch_None)),
+(Ch: (Ch_Wop1, Ch_Rop2, Ch_Rop3)),
+(Ch: (Ch_Wop1, Ch_Rop2, Ch_Rop3)),
+(Ch: (Ch_Wop1, Ch_Rop2, Ch_Rop3))
 );

+ 42 - 0
compiler/i386/i386tab.inc

@@ -11563,5 +11563,47 @@
     optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #242#248#1#119;
     flags   : if_avx or if_sandybridge
+  ),
+  (
+    opcode  : A_ANDN;
+    ops     : 3;
+    optypes : (ot_reg32,ot_reg32,ot_rm_gpr or ot_bits32,ot_none);
+    code    : #242#249#1#242#61#80;
+    flags   : if_bmi1
+  ),
+  (
+    opcode  : A_BEXTR;
+    ops     : 3;
+    optypes : (ot_reg32,ot_rm_gpr or ot_bits32,ot_reg32,ot_none);
+    code    : #242#249#1#247#62#72;
+    flags   : if_bmi1
+  ),
+  (
+    opcode  : A_RORX;
+    ops     : 3;
+    optypes : (ot_reg32,ot_rm_gpr or ot_bits32,ot_immediate or ot_bits8,ot_none);
+    code    : #220#242#250#1#240#72#22;
+    flags   : if_bmi2
+  ),
+  (
+    opcode  : A_SARX;
+    ops     : 3;
+    optypes : (ot_reg32,ot_rm_gpr or ot_bits32,ot_reg32,ot_none);
+    code    : #219#242#249#1#247#62#72;
+    flags   : if_bmi2
+  ),
+  (
+    opcode  : A_SHLX;
+    ops     : 3;
+    optypes : (ot_reg32,ot_rm_gpr or ot_bits32,ot_reg32,ot_none);
+    code    : #241#242#249#1#247#62#72;
+    flags   : if_bmi2
+  ),
+  (
+    opcode  : A_SHRX;
+    ops     : 3;
+    optypes : (ot_reg32,ot_rm_gpr or ot_bits32,ot_reg32,ot_none);
+    code    : #220#242#249#1#247#62#72;
+    flags   : if_bmi2
   )
 );

+ 2 - 0
compiler/x86/aasmcpu.pas

@@ -428,6 +428,8 @@ implementation
        IF_SSE42  = $00200000;
        IF_AVX    = $00200000;
        IF_SANDYBRIDGE = $00200000;
+       IF_BMI1 = $00200000;
+       IF_BMI2 = $00200000;
 
        IF_8086   = $00000000;  { 8086 instruction  }
        IF_186    = $01000000;  { 186+ instruction  }

+ 39 - 0
compiler/x86/x86ins.dat

@@ -4673,3 +4673,42 @@ void                                 \362\364\370\1\x77                   AVX,SA
 [VZEROUPPER]
 (Ch_All, Ch_None, Ch_None)
 void                                 \362\370\1\x77                       AVX,SANDYBRIDGE
+
+;*******************************************************************************
+;********** BMI1 ***************************************************************
+;*******************************************************************************
+
+[ANDN]
+(Ch_Wop1, Ch_Rop2, Ch_Rop3)
+reg32,reg32,rm32                      \362\371\1\xf2\75\120               BMI1
+reg64,reg64,rm64                      \362\363\371\1\xf2\75\120           BMI1,X86_64
+
+[BEXTR]
+(Ch_Wop1, Ch_Rop2, Ch_Rop3)
+reg32,rm32,reg32                      \362\371\1\xf7\76\110               BMI1
+reg64,rm64,reg64                      \362\363\371\1\xf7\76\110           BMI1,X86_64
+
+;*******************************************************************************
+;********** BMI2 ***************************************************************
+;*******************************************************************************
+
+[RORX]
+(Ch_Wop1, Ch_Rop2, Ch_None)
+reg32,rm32,imm8                      \334\362\372\1\xf0\110\26            BMI2
+reg64,rm64,imm8                      \334\362\363\372\1\xf0\110\26        BMI2,X86_64
+
+[SARX]
+(Ch_Wop1, Ch_Rop2, Ch_Rop3)
+reg32,rm32,reg32                      \333\362\371\1\xf7\76\110           BMI2
+reg64,rm64,reg64                      \333\362\363\371\1\xf7\76\110       BMI2,X86_64
+
+[SHLX]
+(Ch_Wop1, Ch_Rop2, Ch_Rop3)
+reg32,rm32,reg32                      \361\362\371\1\xf7\76\110           BMI2
+reg64,rm64,reg64                      \361\362\363\371\1\xf7\76\110       BMI2,X86_64
+
+[SHRX]
+(Ch_Wop1, Ch_Rop2, Ch_Rop3)
+reg32,rm32,reg32                      \334\362\371\1\xf7\76\110           BMI2
+reg64,rm64,reg64                      \334\362\363\371\1\xf7\76\110       BMI2,X86_64
+

+ 6 - 0
compiler/x86_64/x8664ats.inc

@@ -943,5 +943,11 @@ attsufNONE,
 attsufNONE,
 attsufNONE,
 attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
 attsufNONE
 );

+ 7 - 1
compiler/x86_64/x8664att.inc

@@ -943,5 +943,11 @@
 'vxorpd',
 'vxorps',
 'vzeroall',
-'vzeroupper'
+'vzeroupper',
+'andn',
+'bextr',
+'rorx',
+'sarx',
+'shlx',
+'shrx'
 );

+ 7 - 1
compiler/x86_64/x8664int.inc

@@ -943,5 +943,11 @@
 'vxorpd',
 'vxorps',
 'vzeroall',
-'vzeroupper'
+'vzeroupper',
+'andn',
+'bextr',
+'rorx',
+'sarx',
+'shlx',
+'shrx'
 );

+ 1 - 1
compiler/x86_64/x8664nop.inc

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

+ 7 - 1
compiler/x86_64/x8664op.inc

@@ -943,5 +943,11 @@ A_VUNPCKLPS,
 A_VXORPD,
 A_VXORPS,
 A_VZEROALL,
-A_VZEROUPPER
+A_VZEROUPPER,
+A_ANDN,
+A_BEXTR,
+A_RORX,
+A_SARX,
+A_SHLX,
+A_SHRX
 );

+ 7 - 1
compiler/x86_64/x8664pro.inc

@@ -943,5 +943,11 @@
 (Ch: (Ch_All, Ch_None, Ch_None)),
 (Ch: (Ch_All, Ch_None, Ch_None)),
 (Ch: (Ch_All, Ch_None, Ch_None)),
-(Ch: (Ch_All, Ch_None, Ch_None))
+(Ch: (Ch_All, Ch_None, Ch_None)),
+(Ch: (Ch_Wop1, Ch_Rop2, Ch_Rop3)),
+(Ch: (Ch_Wop1, Ch_Rop2, Ch_Rop3)),
+(Ch: (Ch_Wop1, Ch_Rop2, Ch_None)),
+(Ch: (Ch_Wop1, Ch_Rop2, Ch_Rop3)),
+(Ch: (Ch_Wop1, Ch_Rop2, Ch_Rop3)),
+(Ch: (Ch_Wop1, Ch_Rop2, Ch_Rop3))
 );

+ 84 - 0
compiler/x86_64/x8664tab.inc

@@ -11668,5 +11668,89 @@
     optypes : (ot_none,ot_none,ot_none,ot_none);
     code    : #242#248#1#119;
     flags   : if_avx or if_sandybridge
+  ),
+  (
+    opcode  : A_ANDN;
+    ops     : 3;
+    optypes : (ot_reg32,ot_reg32,ot_rm_gpr or ot_bits32,ot_none);
+    code    : #242#249#1#242#61#80;
+    flags   : if_bmi1
+  ),
+  (
+    opcode  : A_ANDN;
+    ops     : 3;
+    optypes : (ot_reg64,ot_reg64,ot_rm_gpr or ot_bits64,ot_none);
+    code    : #242#243#249#1#242#61#80;
+    flags   : if_bmi1 or if_x86_64
+  ),
+  (
+    opcode  : A_BEXTR;
+    ops     : 3;
+    optypes : (ot_reg32,ot_rm_gpr or ot_bits32,ot_reg32,ot_none);
+    code    : #242#249#1#247#62#72;
+    flags   : if_bmi1
+  ),
+  (
+    opcode  : A_BEXTR;
+    ops     : 3;
+    optypes : (ot_reg64,ot_rm_gpr or ot_bits64,ot_reg64,ot_none);
+    code    : #242#243#249#1#247#62#72;
+    flags   : if_bmi1 or if_x86_64
+  ),
+  (
+    opcode  : A_RORX;
+    ops     : 3;
+    optypes : (ot_reg32,ot_rm_gpr or ot_bits32,ot_immediate or ot_bits8,ot_none);
+    code    : #220#242#250#1#240#72#22;
+    flags   : if_bmi2
+  ),
+  (
+    opcode  : A_RORX;
+    ops     : 3;
+    optypes : (ot_reg64,ot_rm_gpr or ot_bits64,ot_immediate or ot_bits8,ot_none);
+    code    : #220#242#243#250#1#240#72#22;
+    flags   : if_bmi2 or if_x86_64
+  ),
+  (
+    opcode  : A_SARX;
+    ops     : 3;
+    optypes : (ot_reg32,ot_rm_gpr or ot_bits32,ot_reg32,ot_none);
+    code    : #219#242#249#1#247#62#72;
+    flags   : if_bmi2
+  ),
+  (
+    opcode  : A_SARX;
+    ops     : 3;
+    optypes : (ot_reg64,ot_rm_gpr or ot_bits64,ot_reg64,ot_none);
+    code    : #219#242#243#249#1#247#62#72;
+    flags   : if_bmi2 or if_x86_64
+  ),
+  (
+    opcode  : A_SHLX;
+    ops     : 3;
+    optypes : (ot_reg32,ot_rm_gpr or ot_bits32,ot_reg32,ot_none);
+    code    : #241#242#249#1#247#62#72;
+    flags   : if_bmi2
+  ),
+  (
+    opcode  : A_SHLX;
+    ops     : 3;
+    optypes : (ot_reg64,ot_rm_gpr or ot_bits64,ot_reg64,ot_none);
+    code    : #241#242#243#249#1#247#62#72;
+    flags   : if_bmi2 or if_x86_64
+  ),
+  (
+    opcode  : A_SHRX;
+    ops     : 3;
+    optypes : (ot_reg32,ot_rm_gpr or ot_bits32,ot_reg32,ot_none);
+    code    : #220#242#249#1#247#62#72;
+    flags   : if_bmi2
+  ),
+  (
+    opcode  : A_SHRX;
+    ops     : 3;
+    optypes : (ot_reg64,ot_rm_gpr or ot_bits64,ot_reg64,ot_none);
+    code    : #220#242#243#249#1#247#62#72;
+    flags   : if_bmi2 or if_x86_64
   )
 );