Przeglądaj źródła

Merged revisions 7613,7615,7619-7620,7622-7623,7626,7628,7631,7633,7646,7663,7677,7681-7683,7689,7697,7704-7712,7725,7736,7738,7740,7744-7746,7751,7753,7764,7767,7769-7770,7776-7777,7788,7830,7836-7839,7846,7849,7862,7864-7865,7869,7872,7877,7882,7927-7929,7953,7961,7967,7971,7986-7987,7990-7994,7998-8000,8004-8006,8008-8012,8016,8027,8034,8036-8037,8039,8044,8046,8048,8051,8060,8071,8075-8076,8082-8083,8087-8089,8095-8096,8099-8100,8133-8135 via svnmerge from
http://svn.freepascal.org/svn/fpc/trunk

........
r7613 | florian | 2007-06-09 21:45:06 +0200 (Sa, 09 Jun 2007) | 2 lines

+ some sse4 instructions supported, resolves #9046
........
r8133 | florian | 2007-07-22 18:40:44 +0200 (So, 22 Jul 2007) | 3 lines

* Jcc reads the flags, this was not in the dat yet, resolves #9278
* disabled 4 ops variant of insertq for now
........
r8134 | florian | 2007-07-22 18:42:41 +0200 (So, 22 Jul 2007) | 2 lines

+ test for previous fix
........
r8135 | florian | 2007-07-22 19:00:51 +0200 (So, 22 Jul 2007) | 2 lines

* reverted wrong commit in r8133
........

git-svn-id: branches/fixes_2_2@8136 -

florian 18 lat temu
rodzic
commit
bd233aa551

+ 7 - 1
compiler/i386/i386att.inc

@@ -594,5 +594,11 @@
 'movabs',
 'movslq',
 'cqto',
-'cmpxchg16b'
+'cmpxchg16b',
+'movntss',
+'movntsd',
+'insertq',
+'extrq',
+'lzcnt',
+'popcnt'
 );

+ 7 - 1
compiler/i386/i386atts.inc

@@ -594,5 +594,11 @@ attsufNONE,
 attsufNONE,
 attsufNONE,
 attsufNONE,
-attsufINT
+attsufINT,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE
 );

+ 7 - 1
compiler/i386/i386int.inc

@@ -594,5 +594,11 @@
 'movabs',
 'movsxd',
 'cqo',
-'cmpxchg16b'
+'cmpxchg16b',
+'movntss',
+'movntsd',
+'insertq',
+'extrq',
+'lzcnt',
+'popcnt'
 );

+ 1 - 1
compiler/i386/i386nop.inc

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

+ 7 - 1
compiler/i386/i386op.inc

@@ -594,5 +594,11 @@ A_RDM,
 A_MOVABS,
 A_MOVSXD,
 A_CQO,
-A_CMPXCHG16B
+A_CMPXCHG16B,
+A_MOVNTSS,
+A_MOVNTSD,
+A_INSERTQ,
+A_EXTRQ,
+A_LZCNT,
+A_POPCNT
 );

+ 7 - 1
compiler/i386/i386prop.inc

@@ -386,7 +386,7 @@
 (Ch: (Ch_All, Ch_None, Ch_None)),
 (Ch: (Ch_All, Ch_None, Ch_None)),
 (Ch: (Ch_ROp1, Ch_WOp2, Ch_RFLAGS)),
-(Ch: (Ch_None, Ch_None, Ch_None)),
+(Ch: (Ch_RFLAGS, Ch_None, Ch_None)),
 (Ch: (Ch_RFLAGS, Ch_WOp1, Ch_None)),
 (Ch: (Ch_Mop2, Ch_Rop1, Ch_None)),
 (Ch: (Ch_Mop2, Ch_Rop1, Ch_None)),
@@ -594,5 +594,11 @@
 (Ch: (Ch_Wop2, Ch_Rop1, Ch_None)),
 (Ch: (Ch_Wop2, Ch_Rop1, Ch_None)),
 (Ch: (Ch_MRAX, Ch_WRDX, 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_All, Ch_None, Ch_None)),
+(Ch: (Ch_All, Ch_None, Ch_None)),
 (Ch: (Ch_All, Ch_None, Ch_None))
 );

+ 63 - 0
compiler/i386/i386tab.inc

@@ -9589,5 +9589,68 @@
     optypes : (ot_none,ot_none,ot_none);
     code    : #2#15#58;
     flags   : if_p6 or if_cyrix
+  ),
+  (
+    opcode  : A_MOVNTSS;
+    ops     : 2;
+    optypes : (ot_memory,ot_xmmreg,ot_none);
+    code    : #65#192#219#62#2#15#43#63;
+    flags   : if_sse4 or if_sd
+  ),
+  (
+    opcode  : A_MOVNTSD;
+    ops     : 2;
+    optypes : (ot_memory,ot_xmmreg,ot_none);
+    code    : #65#192#220#213#62#2#15#43#63;
+    flags   : if_sse4
+  ),
+  (
+    opcode  : A_INSERTQ;
+    ops     : 2;
+    optypes : (ot_xmmreg,ot_xmmreg,ot_none);
+    code    : #72#220#62#2#15#121#63;
+    flags   : if_sse4
+  ),
+  (
+    opcode  : A_EXTRQ;
+    ops     : 3;
+    optypes : (ot_xmmreg,ot_immediate,ot_immediate);
+    code    : #128#222#62#2#15#120#63#253#17#253#18;
+    flags   : if_sse4 or if_sb
+  ),
+  (
+    opcode  : A_EXTRQ;
+    ops     : 2;
+    optypes : (ot_xmmreg,ot_xmmreg,ot_none);
+    code    : #72#222#62#2#15#121#63;
+    flags   : if_sse4
+  ),
+  (
+    opcode  : A_LZCNT;
+    ops     : 2;
+    optypes : (ot_reg16,ot_regmem,ot_none);
+    code    : #72#208#193#219#62#2#15#189#63;
+    flags   : if_386 or if_sm or if_sse4
+  ),
+  (
+    opcode  : A_LZCNT;
+    ops     : 2;
+    optypes : (ot_reg32 or ot_bits64,ot_regmem,ot_none);
+    code    : #72#209#193#219#62#2#15#189#63;
+    flags   : if_386 or if_sm or if_sse4
+  ),
+  (
+    opcode  : A_POPCNT;
+    ops     : 2;
+    optypes : (ot_reg16,ot_regmem,ot_none);
+    code    : #72#208#193#219#62#2#15#184#63;
+    flags   : if_386 or if_sm or if_sse4
+  ),
+  (
+    opcode  : A_POPCNT;
+    ops     : 2;
+    optypes : (ot_reg32 or ot_bits64,ot_regmem,ot_none);
+    code    : #72#209#193#219#62#2#15#184#63;
+    flags   : if_386 or if_sm or if_sse4
   )
 );

+ 2 - 0
compiler/x86/aasmcpu.pas

@@ -316,6 +316,8 @@ implementation
        {IF_PFMASK = longint($F001FF00);}
        { SVM instructions  }
        IF_SVM    = $00100000;
+       { SSE4 instructions  }
+       IF_SSE4   = $00200000;
 
        IF_8086   = $00000000;  { 8086 instruction  }
        IF_186    = $01000000;  { 186+ instruction  }

+ 37 - 1
compiler/x86/x86ins.dat

@@ -2151,7 +2151,7 @@ void                  \333\3\x0F\xA7\xE8              P6,CYRIX
 reg16|32|64,regmem    \301\320\1\x0F\13\x40\110      P6,SM
 
 [Jcc]
-(Ch_None, Ch_None, Ch_None)
+(Ch_RFLAGS, Ch_None, Ch_None)
 imm8                  \13\x70\50                     8086
 imm16|32              \320\1\x0F\13\x80\64           386,PASS2
 imm|short             \13\x70\50                     8086
@@ -3244,3 +3244,39 @@ void                  \326\1\x99                      X86_64
 [CMPXCHG16B,cmpxchg16bX]
 (Ch_All, Ch_None, Ch_None)
 mem                   \320\323\2\x0F\xC7\201          X86_64
+
+;
+; SSE4
+;
+
+
+; note: \333=F3h, \334=F2h, \336=66h, \76=REX, \77=EA, \325=no REX.W=1 for qword, \375=unsigned
+
+[MOVNTSS]
+(Ch_All, Ch_None, Ch_None)
+mem,xmmreg              \101\300\333\76\2\x0F\x2B\77                    SSE4,SD
+
+[MOVNTSD]
+(Ch_All, Ch_None, Ch_None)
+mem,xmmreg              \101\300\334\325\76\2\x0F\x2B\77                SSE4 ;,SQ
+
+[INSERTQ]
+(Ch_All, Ch_None, Ch_None)
+xmmreg,xmmreg           \110\334\76\2\x0F\x79\77                        SSE4
+; four operands are not possible yet
+; xmmreg,xmmreg,imm,imm   \110\334\76\2\x0F\x78\77\375\22\375\23          SSE4,SB
+
+[EXTRQ]
+(Ch_All, Ch_None, Ch_None)
+xmmreg,imm,imm          \200\336\76\2\x0F\x78\77\375\21\375\22          SSE4,SB
+xmmreg,xmmreg           \110\336\76\2\x0F\x79\77                        SSE4
+
+[LZCNT]
+(Ch_All, Ch_None, Ch_None)
+reg16,regmem            \110\320\301\333\76\2\x0F\xBD\77                386,SM,SSE4
+reg32|64,regmem         \110\321\301\333\76\2\x0F\xBD\77                386,SM,SSE4
+
+[POPCNT]
+(Ch_All, Ch_None, Ch_None)
+reg16,regmem            \110\320\301\333\76\2\x0F\xB8\77                386,SM,SSE4
+reg32|64,regmem         \110\321\301\333\76\2\x0F\xB8\77                386,SM,SSE4

+ 7 - 1
compiler/x86_64/x8664ats.inc

@@ -594,5 +594,11 @@ attsufNONE,
 attsufNONE,
 attsufNONE,
 attsufNONE,
-attsufINT
+attsufINT,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE
 );

+ 7 - 1
compiler/x86_64/x8664att.inc

@@ -594,5 +594,11 @@
 'movabs',
 'movslq',
 'cqto',
-'cmpxchg16b'
+'cmpxchg16b',
+'movntss',
+'movntsd',
+'insertq',
+'extrq',
+'lzcnt',
+'popcnt'
 );

+ 7 - 1
compiler/x86_64/x8664int.inc

@@ -594,5 +594,11 @@
 'movabs',
 'movsxd',
 'cqo',
-'cmpxchg16b'
+'cmpxchg16b',
+'movntss',
+'movntsd',
+'insertq',
+'extrq',
+'lzcnt',
+'popcnt'
 );

+ 1 - 1
compiler/x86_64/x8664nop.inc

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

+ 7 - 1
compiler/x86_64/x8664op.inc

@@ -594,5 +594,11 @@ A_RDM,
 A_MOVABS,
 A_MOVSXD,
 A_CQO,
-A_CMPXCHG16B
+A_CMPXCHG16B,
+A_MOVNTSS,
+A_MOVNTSD,
+A_INSERTQ,
+A_EXTRQ,
+A_LZCNT,
+A_POPCNT
 );

+ 7 - 1
compiler/x86_64/x8664pro.inc

@@ -386,7 +386,7 @@
 (Ch: (Ch_All, Ch_None, Ch_None)),
 (Ch: (Ch_All, Ch_None, Ch_None)),
 (Ch: (Ch_ROp1, Ch_WOp2, Ch_RFLAGS)),
-(Ch: (Ch_None, Ch_None, Ch_None)),
+(Ch: (Ch_RFLAGS, Ch_None, Ch_None)),
 (Ch: (Ch_RFLAGS, Ch_WOp1, Ch_None)),
 (Ch: (Ch_Mop2, Ch_Rop1, Ch_None)),
 (Ch: (Ch_Mop2, Ch_Rop1, Ch_None)),
@@ -594,5 +594,11 @@
 (Ch: (Ch_Wop2, Ch_Rop1, Ch_None)),
 (Ch: (Ch_Wop2, Ch_Rop1, Ch_None)),
 (Ch: (Ch_MRAX, Ch_WRDX, 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_All, Ch_None, Ch_None)),
+(Ch: (Ch_All, Ch_None, Ch_None)),
 (Ch: (Ch_All, Ch_None, Ch_None))
 );

+ 63 - 0
compiler/x86_64/x8664tab.inc

@@ -9582,5 +9582,68 @@
     optypes : (ot_memory,ot_none,ot_none);
     code    : #208#211#2#15#199#129;
     flags   : if_x86_64
+  ),
+  (
+    opcode  : A_MOVNTSS;
+    ops     : 2;
+    optypes : (ot_memory,ot_xmmreg,ot_none);
+    code    : #65#192#219#62#2#15#43#63;
+    flags   : if_sse4 or if_sd
+  ),
+  (
+    opcode  : A_MOVNTSD;
+    ops     : 2;
+    optypes : (ot_memory,ot_xmmreg,ot_none);
+    code    : #65#192#220#213#62#2#15#43#63;
+    flags   : if_sse4
+  ),
+  (
+    opcode  : A_INSERTQ;
+    ops     : 2;
+    optypes : (ot_xmmreg,ot_xmmreg,ot_none);
+    code    : #72#220#62#2#15#121#63;
+    flags   : if_sse4
+  ),
+  (
+    opcode  : A_EXTRQ;
+    ops     : 3;
+    optypes : (ot_xmmreg,ot_immediate,ot_immediate);
+    code    : #128#222#62#2#15#120#63#253#17#253#18;
+    flags   : if_sse4 or if_sb
+  ),
+  (
+    opcode  : A_EXTRQ;
+    ops     : 2;
+    optypes : (ot_xmmreg,ot_xmmreg,ot_none);
+    code    : #72#222#62#2#15#121#63;
+    flags   : if_sse4
+  ),
+  (
+    opcode  : A_LZCNT;
+    ops     : 2;
+    optypes : (ot_reg16,ot_regmem,ot_none);
+    code    : #72#208#193#219#62#2#15#189#63;
+    flags   : if_386 or if_sm or if_sse4
+  ),
+  (
+    opcode  : A_LZCNT;
+    ops     : 2;
+    optypes : (ot_reg32 or ot_bits64,ot_regmem,ot_none);
+    code    : #72#209#193#219#62#2#15#189#63;
+    flags   : if_386 or if_sm or if_sse4
+  ),
+  (
+    opcode  : A_POPCNT;
+    ops     : 2;
+    optypes : (ot_reg16,ot_regmem,ot_none);
+    code    : #72#208#193#219#62#2#15#184#63;
+    flags   : if_386 or if_sm or if_sse4
+  ),
+  (
+    opcode  : A_POPCNT;
+    ops     : 2;
+    optypes : (ot_reg32 or ot_bits64,ot_regmem,ot_none);
+    code    : #72#209#193#219#62#2#15#184#63;
+    flags   : if_386 or if_sm or if_sse4
   )
 );