From 4f0da5fcc3d4c0dc053cd88b1b00775b22eac668 Mon Sep 17 00:00:00 2001 From: florian Date: Sun, 20 Jan 2019 18:50:12 +0000 Subject: [PATCH] =?UTF-8?q?+=20patch=20by=20Mar=C4=A3ers=20to=20support=20?= =?UTF-8?q?the=20x86=20assembler=20instructions=20blsi,=20blsr,=20blsmsk,?= =?UTF-8?q?=20adcx,=20adox,=20movbe,=20pclmulqdq,=20resolves=20#34815=20an?= =?UTF-8?q?d=20#34799=20+=20avxopcodes=20tests=20also=20movbe=20and=20pclm?= =?UTF-8?q?ulqdq?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: trunk@40951 - --- compiler/i386/i386att.inc | 7 +++ compiler/i386/i386atts.inc | 7 +++ compiler/i386/i386int.inc | 7 +++ compiler/i386/i386nop.inc | 2 +- compiler/i386/i386op.inc | 7 +++ compiler/i386/i386prop.inc | 7 +++ compiler/i386/i386tab.inc | 56 +++++++++++++++++++++ compiler/i8086/i8086att.inc | 7 +++ compiler/i8086/i8086atts.inc | 7 +++ compiler/i8086/i8086int.inc | 7 +++ compiler/i8086/i8086nop.inc | 2 +- compiler/i8086/i8086op.inc | 7 +++ compiler/i8086/i8086prop.inc | 7 +++ compiler/i8086/i8086tab.inc | 56 +++++++++++++++++++++ compiler/x86/aasmcpu.pas | 4 ++ compiler/x86/x86ins.dat | 43 ++++++++++++++++ compiler/x86_64/x8664ats.inc | 7 +++ compiler/x86_64/x8664att.inc | 7 +++ compiler/x86_64/x8664int.inc | 7 +++ compiler/x86_64/x8664nop.inc | 2 +- compiler/x86_64/x8664op.inc | 7 +++ compiler/x86_64/x8664pro.inc | 7 +++ compiler/x86_64/x8664tab.inc | 91 ++++++++++++++++++++++++++++++++++ tests/utils/avx/avxopcodes.pas | 24 ++++++++- 24 files changed, 380 insertions(+), 5 deletions(-) diff --git a/compiler/i386/i386att.inc b/compiler/i386/i386att.inc index 79bafb9fc7..857d483b10 100644 --- a/compiler/i386/i386att.inc +++ b/compiler/i386/i386att.inc @@ -684,6 +684,8 @@ 'aesimc', 'aeskeygenassist', 'rdtscp', +'movbe', +'pclmulqdq', 'vaddpd', 'vaddps', 'vaddsd', @@ -1009,6 +1011,9 @@ 'vzeroupper', 'andn', 'bextr', +'blsi', +'blsmsk', +'blsr', 'tzcnt', 'bzhi', 'mulx', @@ -1018,6 +1023,8 @@ 'sarx', 'shlx', 'shrx', +'adcx', +'adox', 'vbroadcasti128', 'vextracti128', 'vinserti128', diff --git a/compiler/i386/i386atts.inc b/compiler/i386/i386atts.inc index aa47900ea6..8b16a8fb89 100644 --- a/compiler/i386/i386atts.inc +++ b/compiler/i386/i386atts.inc @@ -684,6 +684,8 @@ attsufNONE, attsufNONE, attsufNONE, attsufNONE, +attsufINT, +attsufNONE, attsufNONE, attsufNONE, attsufNONE, @@ -1021,6 +1023,11 @@ attsufNONE, attsufNONE, attsufNONE, attsufNONE, +attsufINT, +attsufINT, +attsufNONE, +attsufNONE, +attsufNONE, attsufNONE, attsufNONE, attsufNONE, diff --git a/compiler/i386/i386int.inc b/compiler/i386/i386int.inc index ba72938643..0d5c3b02a8 100644 --- a/compiler/i386/i386int.inc +++ b/compiler/i386/i386int.inc @@ -684,6 +684,8 @@ 'aesimc', 'aeskeygenassist', 'rdtscp', +'movbe', +'pclmulqdq', 'vaddpd', 'vaddps', 'vaddsd', @@ -1009,6 +1011,9 @@ 'vzeroupper', 'andn', 'bextr', +'blsi', +'blsmsk', +'blsr', 'tzcnt', 'bzhi', 'mulx', @@ -1018,6 +1023,8 @@ 'sarx', 'shlx', 'shrx', +'adcx', +'adox', 'vbroadcasti128', 'vextracti128', 'vinserti128', diff --git a/compiler/i386/i386nop.inc b/compiler/i386/i386nop.inc index d5a1b188d1..c0a0208994 100644 --- a/compiler/i386/i386nop.inc +++ b/compiler/i386/i386nop.inc @@ -1,2 +1,2 @@ { don't edit, this file is generated from x86ins.dat } -2121; +2129; diff --git a/compiler/i386/i386op.inc b/compiler/i386/i386op.inc index 49a42e9e3c..5c5e4f19bd 100644 --- a/compiler/i386/i386op.inc +++ b/compiler/i386/i386op.inc @@ -684,6 +684,8 @@ A_AESDECLAST, A_AESIMC, A_AESKEYGENASSIST, A_RDTSCP, +A_MOVBE, +A_PCLMULQDQ, A_VADDPD, A_VADDPS, A_VADDSD, @@ -1009,6 +1011,9 @@ A_VZEROALL, A_VZEROUPPER, A_ANDN, A_BEXTR, +A_BLSI, +A_BLSMSK, +A_BLSR, A_TZCNT, A_BZHI, A_MULX, @@ -1018,6 +1023,8 @@ A_RORX, A_SARX, A_SHLX, A_SHRX, +A_ADCX, +A_ADOX, A_VBROADCASTI128, A_VEXTRACTI128, A_VINSERTI128, diff --git a/compiler/i386/i386prop.inc b/compiler/i386/i386prop.inc index 5d10a8251a..c91097744f 100644 --- a/compiler/i386/i386prop.inc +++ b/compiler/i386/i386prop.inc @@ -684,6 +684,8 @@ (Ch: [Ch_All]), (Ch: [Ch_All]), (Ch: [Ch_WEAX, Ch_WEDX]), +(Ch: [Ch_Rop1, Ch_Wop2]), +(Ch: [Ch_All]), (Ch: [Ch_Wop3, Ch_Rop2, Ch_Rop1]), (Ch: [Ch_Wop3, Ch_Rop2, Ch_Rop1]), (Ch: [Ch_Wop3, Ch_Rop2, Ch_Rop1]), @@ -1009,6 +1011,9 @@ (Ch: [Ch_All]), (Ch: [Ch_Rop1, Ch_Rop2, Ch_Wop3]), (Ch: [Ch_Rop1, Ch_Rop2, Ch_Wop3]), +(Ch: [Ch_Rop1, Ch_Wop2, Ch_W0OverflowFlag, Ch_WCarryFlag, Ch_WSignFlag, Ch_WZeroFlag, Ch_WUParityFlag, Ch_WUAuxiliaryFlag]), +(Ch: [Ch_Rop1, Ch_Wop2, Ch_W0OverflowFlag, Ch_WCarryFlag, Ch_WSignFlag, Ch_W0ZeroFlag, Ch_WUParityFlag, Ch_WUAuxiliaryFlag]), +(Ch: [Ch_Rop1, Ch_Wop2, Ch_W0OverflowFlag, Ch_WCarryFlag, Ch_WSignFlag, Ch_WZeroFlag, Ch_WUParityFlag, Ch_WUAuxiliaryFlag]), (Ch: [Ch_Wop2, Ch_WFlags, Ch_Rop1]), (Ch: [Ch_Rop1, Ch_Rop2, Ch_Wop3]), (Ch: [Ch_REDX, Ch_Rop1, Ch_Wop2, Ch_Wop3]), @@ -1018,6 +1023,8 @@ (Ch: [Ch_Rop1, Ch_Rop2, Ch_Wop3]), (Ch: [Ch_Rop1, Ch_Rop2, Ch_Wop3]), (Ch: [Ch_Rop1, Ch_Rop2, Ch_Wop3]), +(Ch: [Ch_Rop1, Ch_Mop2, Ch_RWCarryFlag]), +(Ch: [Ch_Rop1, Ch_Mop2, Ch_RWOverflowFlag]), (Ch: [Ch_All]), (Ch: [Ch_All]), (Ch: [Ch_All]), diff --git a/compiler/i386/i386tab.inc b/compiler/i386/i386tab.inc index 4eff319554..0d499b0344 100644 --- a/compiler/i386/i386tab.inc +++ b/compiler/i386/i386tab.inc @@ -8708,6 +8708,27 @@ code : #3#15#1#249; flags : [if_sse4,if_sm] ), + ( + opcode : A_MOVBE; + ops : 2; + optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_memory or ot_bits16 or ot_bits32 or ot_bits64,ot_none,ot_none); + code : #208#3#15#56#240#72; + flags : [if_movbe,if_sm] + ), + ( + opcode : A_MOVBE; + ops : 2; + optypes : (ot_memory or ot_bits16 or ot_bits32 or ot_bits64,ot_reg16 or ot_bits32 or ot_bits64,ot_none,ot_none); + code : #209#3#15#56#241#65; + flags : [if_movbe,if_sm] + ), + ( + opcode : A_PCLMULQDQ; + ops : 3; + optypes : (ot_xmmreg,ot_xmmrm,ot_immediate or ot_bits8,ot_none); + code : #241#3#15#58#68#72#22; + flags : [if_clmul,if_sandybridge] + ), ( opcode : A_VADDPD; ops : 3; @@ -13608,6 +13629,27 @@ code : #242#249#1#247#62#72; flags : [if_bmi1,if_prot] ), + ( + opcode : A_BLSI; + ops : 2; + optypes : (ot_reg32,ot_rm_gpr or ot_bits32,ot_none,ot_none); + code : #242#249#1#243#60#139; + flags : [if_bmi1,if_prot] + ), + ( + opcode : A_BLSMSK; + ops : 2; + optypes : (ot_reg32,ot_rm_gpr or ot_bits32,ot_none,ot_none); + code : #242#249#1#243#60#138; + flags : [if_bmi1,if_prot] + ), + ( + opcode : A_BLSR; + ops : 2; + optypes : (ot_reg32,ot_rm_gpr or ot_bits32,ot_none,ot_none); + code : #242#249#1#243#60#137; + flags : [if_bmi1,if_prot] + ), ( opcode : A_TZCNT; ops : 2; @@ -13671,6 +13713,20 @@ code : #220#242#249#1#247#62#72; flags : [if_bmi2,if_prot] ), + ( + opcode : A_ADCX; + ops : 2; + optypes : (ot_reg32,ot_rm_gpr or ot_bits32,ot_none,ot_none); + code : #241#3#15#56#246#72; + flags : [if_adx] + ), + ( + opcode : A_ADOX; + ops : 2; + optypes : (ot_reg32,ot_rm_gpr or ot_bits32,ot_none,ot_none); + code : #219#3#15#56#246#72; + flags : [if_adx] + ), ( opcode : A_VBROADCASTI128; ops : 2; diff --git a/compiler/i8086/i8086att.inc b/compiler/i8086/i8086att.inc index b108001543..e4a558db7e 100644 --- a/compiler/i8086/i8086att.inc +++ b/compiler/i8086/i8086att.inc @@ -684,6 +684,8 @@ 'aesimc', 'aeskeygenassist', 'rdtscp', +'movbe', +'pclmulqdq', 'vaddpd', 'vaddps', 'vaddsd', @@ -1009,6 +1011,9 @@ 'vzeroupper', 'andn', 'bextr', +'blsi', +'blsmsk', +'blsr', 'tzcnt', 'bzhi', 'mulx', @@ -1018,6 +1023,8 @@ 'sarx', 'shlx', 'shrx', +'adcx', +'adox', 'vbroadcasti128', 'vextracti128', 'vinserti128', diff --git a/compiler/i8086/i8086atts.inc b/compiler/i8086/i8086atts.inc index de6aa3124a..a385a22bfa 100644 --- a/compiler/i8086/i8086atts.inc +++ b/compiler/i8086/i8086atts.inc @@ -684,6 +684,8 @@ attsufNONE, attsufNONE, attsufNONE, attsufNONE, +attsufINT, +attsufNONE, attsufNONE, attsufNONE, attsufNONE, @@ -1021,6 +1023,11 @@ attsufNONE, attsufNONE, attsufNONE, attsufNONE, +attsufINT, +attsufINT, +attsufNONE, +attsufNONE, +attsufNONE, attsufNONE, attsufNONE, attsufNONE, diff --git a/compiler/i8086/i8086int.inc b/compiler/i8086/i8086int.inc index 1116021c57..5c88388a9c 100644 --- a/compiler/i8086/i8086int.inc +++ b/compiler/i8086/i8086int.inc @@ -684,6 +684,8 @@ 'aesimc', 'aeskeygenassist', 'rdtscp', +'movbe', +'pclmulqdq', 'vaddpd', 'vaddps', 'vaddsd', @@ -1009,6 +1011,9 @@ 'vzeroupper', 'andn', 'bextr', +'blsi', +'blsmsk', +'blsr', 'tzcnt', 'bzhi', 'mulx', @@ -1018,6 +1023,8 @@ 'sarx', 'shlx', 'shrx', +'adcx', +'adox', 'vbroadcasti128', 'vextracti128', 'vinserti128', diff --git a/compiler/i8086/i8086nop.inc b/compiler/i8086/i8086nop.inc index a9d73c00ea..f28d4148bf 100644 --- a/compiler/i8086/i8086nop.inc +++ b/compiler/i8086/i8086nop.inc @@ -1,2 +1,2 @@ { don't edit, this file is generated from x86ins.dat } -2153; +2161; diff --git a/compiler/i8086/i8086op.inc b/compiler/i8086/i8086op.inc index e0c758f193..ffb3e99899 100644 --- a/compiler/i8086/i8086op.inc +++ b/compiler/i8086/i8086op.inc @@ -684,6 +684,8 @@ A_AESDECLAST, A_AESIMC, A_AESKEYGENASSIST, A_RDTSCP, +A_MOVBE, +A_PCLMULQDQ, A_VADDPD, A_VADDPS, A_VADDSD, @@ -1009,6 +1011,9 @@ A_VZEROALL, A_VZEROUPPER, A_ANDN, A_BEXTR, +A_BLSI, +A_BLSMSK, +A_BLSR, A_TZCNT, A_BZHI, A_MULX, @@ -1018,6 +1023,8 @@ A_RORX, A_SARX, A_SHLX, A_SHRX, +A_ADCX, +A_ADOX, A_VBROADCASTI128, A_VEXTRACTI128, A_VINSERTI128, diff --git a/compiler/i8086/i8086prop.inc b/compiler/i8086/i8086prop.inc index 45d4712c17..e813e0155e 100644 --- a/compiler/i8086/i8086prop.inc +++ b/compiler/i8086/i8086prop.inc @@ -684,6 +684,8 @@ (Ch: [Ch_All]), (Ch: [Ch_All]), (Ch: [Ch_WEAX, Ch_WEDX]), +(Ch: [Ch_Rop1, Ch_Wop2]), +(Ch: [Ch_All]), (Ch: [Ch_Wop3, Ch_Rop2, Ch_Rop1]), (Ch: [Ch_Wop3, Ch_Rop2, Ch_Rop1]), (Ch: [Ch_Wop3, Ch_Rop2, Ch_Rop1]), @@ -1009,6 +1011,9 @@ (Ch: [Ch_All]), (Ch: [Ch_Rop1, Ch_Rop2, Ch_Wop3]), (Ch: [Ch_Rop1, Ch_Rop2, Ch_Wop3]), +(Ch: [Ch_Rop1, Ch_Wop2, Ch_W0OverflowFlag, Ch_WCarryFlag, Ch_WSignFlag, Ch_WZeroFlag, Ch_WUParityFlag, Ch_WUAuxiliaryFlag]), +(Ch: [Ch_Rop1, Ch_Wop2, Ch_W0OverflowFlag, Ch_WCarryFlag, Ch_WSignFlag, Ch_W0ZeroFlag, Ch_WUParityFlag, Ch_WUAuxiliaryFlag]), +(Ch: [Ch_Rop1, Ch_Wop2, Ch_W0OverflowFlag, Ch_WCarryFlag, Ch_WSignFlag, Ch_WZeroFlag, Ch_WUParityFlag, Ch_WUAuxiliaryFlag]), (Ch: [Ch_Wop2, Ch_WFlags, Ch_Rop1]), (Ch: [Ch_Rop1, Ch_Rop2, Ch_Wop3]), (Ch: [Ch_REDX, Ch_Rop1, Ch_Wop2, Ch_Wop3]), @@ -1018,6 +1023,8 @@ (Ch: [Ch_Rop1, Ch_Rop2, Ch_Wop3]), (Ch: [Ch_Rop1, Ch_Rop2, Ch_Wop3]), (Ch: [Ch_Rop1, Ch_Rop2, Ch_Wop3]), +(Ch: [Ch_Rop1, Ch_Mop2, Ch_RWCarryFlag]), +(Ch: [Ch_Rop1, Ch_Mop2, Ch_RWOverflowFlag]), (Ch: [Ch_All]), (Ch: [Ch_All]), (Ch: [Ch_All]), diff --git a/compiler/i8086/i8086tab.inc b/compiler/i8086/i8086tab.inc index fddf12a7f6..17cee9e248 100644 --- a/compiler/i8086/i8086tab.inc +++ b/compiler/i8086/i8086tab.inc @@ -8736,6 +8736,27 @@ code : #3#15#1#249; flags : [if_sse4,if_sm] ), + ( + opcode : A_MOVBE; + ops : 2; + optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_memory or ot_bits16 or ot_bits32 or ot_bits64,ot_none,ot_none); + code : #208#3#15#56#240#72; + flags : [if_movbe,if_sm] + ), + ( + opcode : A_MOVBE; + ops : 2; + optypes : (ot_memory or ot_bits16 or ot_bits32 or ot_bits64,ot_reg16 or ot_bits32 or ot_bits64,ot_none,ot_none); + code : #209#3#15#56#241#65; + flags : [if_movbe,if_sm] + ), + ( + opcode : A_PCLMULQDQ; + ops : 3; + optypes : (ot_xmmreg,ot_xmmrm,ot_immediate or ot_bits8,ot_none); + code : #241#3#15#58#68#72#22; + flags : [if_clmul,if_sandybridge] + ), ( opcode : A_VADDPD; ops : 3; @@ -13636,6 +13657,27 @@ code : #242#249#1#247#62#72; flags : [if_bmi1,if_prot] ), + ( + opcode : A_BLSI; + ops : 2; + optypes : (ot_reg32,ot_rm_gpr or ot_bits32,ot_none,ot_none); + code : #242#249#1#243#60#139; + flags : [if_bmi1,if_prot] + ), + ( + opcode : A_BLSMSK; + ops : 2; + optypes : (ot_reg32,ot_rm_gpr or ot_bits32,ot_none,ot_none); + code : #242#249#1#243#60#138; + flags : [if_bmi1,if_prot] + ), + ( + opcode : A_BLSR; + ops : 2; + optypes : (ot_reg32,ot_rm_gpr or ot_bits32,ot_none,ot_none); + code : #242#249#1#243#60#137; + flags : [if_bmi1,if_prot] + ), ( opcode : A_TZCNT; ops : 2; @@ -13699,6 +13741,20 @@ code : #220#242#249#1#247#62#72; flags : [if_bmi2,if_prot] ), + ( + opcode : A_ADCX; + ops : 2; + optypes : (ot_reg32,ot_rm_gpr or ot_bits32,ot_none,ot_none); + code : #241#3#15#56#246#72; + flags : [if_adx] + ), + ( + opcode : A_ADOX; + ops : 2; + optypes : (ot_reg32,ot_rm_gpr or ot_bits32,ot_none,ot_none); + code : #219#3#15#56#246#72; + flags : [if_adx] + ), ( opcode : A_VBROADCASTI128; ops : 2; diff --git a/compiler/x86/aasmcpu.pas b/compiler/x86/aasmcpu.pas index 761f869a00..7399522f6b 100644 --- a/compiler/x86/aasmcpu.pas +++ b/compiler/x86/aasmcpu.pas @@ -331,10 +331,14 @@ interface IF_SSSE3, IF_SSE41, IF_SSE42, + IF_MOVBE, + IF_CLMUL, IF_AVX, IF_AVX2, IF_BMI1, IF_BMI2, + { Intel ADX (Multi-Precision Add-Carry Instruction Extensions) } + IF_ADX, IF_16BITONLY, IF_FMA, IF_FMA4, diff --git a/compiler/x86/x86ins.dat b/compiler/x86/x86ins.dat index 254249f610..602100450d 100644 --- a/compiler/x86/x86ins.dat +++ b/compiler/x86/x86ins.dat @@ -3582,6 +3582,21 @@ void \326\1\xAD X86_64 (Ch_RWRSI, Ch_RMemEDI, Ch_RWRDI, Ch_RDirFlag, Ch_WOverflowFlag, Ch_WSignFlag, Ch_WZeroFlag, Ch_WAuxiliaryFlag, Ch_WCarryFlag, Ch_WParityFlag) void \326\1\xA7 X86_64 +[MOVBE,movbeX] +(Ch_Rop1, Ch_Wop2) +reg16|32|64,mem16|32|64 \320\3\xf\x38\xf0\110 MOVBE,SM +mem16|32|64,reg16|32|64 \321\3\xf\x38\xf1\101 MOVBE,SM + + +;******************************************************************************* +;********* CLMUL *************************************************************** +;******************************************************************************* + +[PCLMULQDQ] +(Ch_All) +xmmreg,xmmrm,imm8 \361\3\xf\x3A\x44\110\26 CLMUL,SANDYBRIDGE + + ;******************************************************************************* ;****** AVX I ****************************************************************** ;******************************************************************************* @@ -5285,6 +5300,21 @@ reg64,reg64,rm64 \362\363\371\1\xf2\75\120 BMI1,P reg32,rm32,reg32 \362\371\1\xf7\76\110 BMI1,PROT reg64,rm64,reg64 \362\363\371\1\xf7\76\110 BMI1,PROT,X86_64 +[BLSI] +(Ch_Rop1, Ch_Wop2, Ch_W0OverflowFlag, Ch_WCarryFlag, Ch_WSignFlag, Ch_WZeroFlag, Ch_WUParityFlag, Ch_WUAuxiliaryFlag) +reg32,rm32 \362\371\1\xf3\74\213 BMI1,PROT +reg64,rm64 \362\363\371\1\xf3\74\213 BMI1,PROT,X86_64 + +[BLSMSK] +(Ch_Rop1, Ch_Wop2, Ch_W0OverflowFlag, Ch_WCarryFlag, Ch_WSignFlag, Ch_W0ZeroFlag, Ch_WUParityFlag, Ch_WUAuxiliaryFlag) +reg32,rm32 \362\371\1\xf3\74\212 BMI1,PROT +reg64,rm64 \362\363\371\1\xf3\74\212 BMI1,PROT,X86_64 + +[BLSR] +(Ch_Rop1, Ch_Wop2, Ch_W0OverflowFlag, Ch_WCarryFlag, Ch_WSignFlag, Ch_WZeroFlag, Ch_WUParityFlag, Ch_WUAuxiliaryFlag) +reg32,rm32 \362\371\1\xf3\74\211 BMI1,PROT +reg64,rm64 \362\363\371\1\xf3\74\211 BMI1,PROT,X86_64 + [TZCNT] (Ch_Wop2, Ch_WFlags, Ch_Rop1) reg16|32|64,regmem \320\333\2\x0F\xBC\110 BMI1,SM @@ -5333,6 +5363,19 @@ reg64,rm64,reg64 \361\362\363\371\1\xf7\76\110 BMI2,P reg32,rm32,reg32 \334\362\371\1\xf7\76\110 BMI2,PROT reg64,rm64,reg64 \334\362\363\371\1\xf7\76\110 BMI2,PROT,X86_64 +;******************************************************************************* +;********** ADX **************************************************************** +;******************************************************************************* + +[ADCX,adcxX] +(Ch_Rop1, Ch_Mop2, Ch_RWCarryFlag) +reg32,rm32 \361\3\xf\x38\xf6\110 ADX +reg64,rm64 \361\326\3\xf\x38\xf6\110 ADX,X86_64 + +[ADOX,adoxX] +(Ch_Rop1, Ch_Mop2, Ch_RWOverflowFlag) +reg32,rm32 \333\3\xf\x38\xf6\110 ADX +reg64,rm64 \333\326\3\xf\x38\xf6\110 ADX,X86_64 ;******************************************************************************* ;********** AVX2 *************************************************************** diff --git a/compiler/x86_64/x8664ats.inc b/compiler/x86_64/x8664ats.inc index 6b345b5313..66480db0a4 100644 --- a/compiler/x86_64/x8664ats.inc +++ b/compiler/x86_64/x8664ats.inc @@ -680,6 +680,8 @@ attsufNONE, attsufNONE, attsufNONE, attsufNONE, +attsufINT, +attsufNONE, attsufNONE, attsufNONE, attsufNONE, @@ -1017,6 +1019,11 @@ attsufNONE, attsufNONE, attsufNONE, attsufNONE, +attsufINT, +attsufINT, +attsufNONE, +attsufNONE, +attsufNONE, attsufNONE, attsufNONE, attsufNONE, diff --git a/compiler/x86_64/x8664att.inc b/compiler/x86_64/x8664att.inc index ec07326414..a12456dd19 100644 --- a/compiler/x86_64/x8664att.inc +++ b/compiler/x86_64/x8664att.inc @@ -680,6 +680,8 @@ 'stosq', 'lodsq', 'cmpsq', +'movbe', +'pclmulqdq', 'vaddpd', 'vaddps', 'vaddsd', @@ -1005,6 +1007,9 @@ 'vzeroupper', 'andn', 'bextr', +'blsi', +'blsmsk', +'blsr', 'tzcnt', 'bzhi', 'mulx', @@ -1014,6 +1019,8 @@ 'sarx', 'shlx', 'shrx', +'adcx', +'adox', 'vbroadcasti128', 'vextracti128', 'vinserti128', diff --git a/compiler/x86_64/x8664int.inc b/compiler/x86_64/x8664int.inc index 6cb5600fa1..b251e8f145 100644 --- a/compiler/x86_64/x8664int.inc +++ b/compiler/x86_64/x8664int.inc @@ -680,6 +680,8 @@ 'stosq', 'lodsq', 'cmpsq', +'movbe', +'pclmulqdq', 'vaddpd', 'vaddps', 'vaddsd', @@ -1005,6 +1007,9 @@ 'vzeroupper', 'andn', 'bextr', +'blsi', +'blsmsk', +'blsr', 'tzcnt', 'bzhi', 'mulx', @@ -1014,6 +1019,8 @@ 'sarx', 'shlx', 'shrx', +'adcx', +'adox', 'vbroadcasti128', 'vextracti128', 'vinserti128', diff --git a/compiler/x86_64/x8664nop.inc b/compiler/x86_64/x8664nop.inc index 01643f02f6..b87615cd0e 100644 --- a/compiler/x86_64/x8664nop.inc +++ b/compiler/x86_64/x8664nop.inc @@ -1,2 +1,2 @@ { don't edit, this file is generated from x86ins.dat } -2178; +2191; diff --git a/compiler/x86_64/x8664op.inc b/compiler/x86_64/x8664op.inc index 900cc53f1e..91f9c2e5b7 100644 --- a/compiler/x86_64/x8664op.inc +++ b/compiler/x86_64/x8664op.inc @@ -680,6 +680,8 @@ A_RDTSCP, A_STOSQ, A_LODSQ, A_CMPSQ, +A_MOVBE, +A_PCLMULQDQ, A_VADDPD, A_VADDPS, A_VADDSD, @@ -1005,6 +1007,9 @@ A_VZEROALL, A_VZEROUPPER, A_ANDN, A_BEXTR, +A_BLSI, +A_BLSMSK, +A_BLSR, A_TZCNT, A_BZHI, A_MULX, @@ -1014,6 +1019,8 @@ A_RORX, A_SARX, A_SHLX, A_SHRX, +A_ADCX, +A_ADOX, A_VBROADCASTI128, A_VEXTRACTI128, A_VINSERTI128, diff --git a/compiler/x86_64/x8664pro.inc b/compiler/x86_64/x8664pro.inc index 4a021d7f6d..2611ff18d0 100644 --- a/compiler/x86_64/x8664pro.inc +++ b/compiler/x86_64/x8664pro.inc @@ -680,6 +680,8 @@ (Ch: [Ch_RRAX, Ch_WMemEDI, Ch_RWRDI, Ch_RDirFlag]), (Ch: [Ch_WRAX, Ch_RWRSI, Ch_RDirFlag]), (Ch: [Ch_RWRSI, Ch_RMemEDI, Ch_RWRDI, Ch_RDirFlag, Ch_WOverflowFlag, Ch_WSignFlag, Ch_WZeroFlag, Ch_WAuxiliaryFlag, Ch_WCarryFlag, Ch_WParityFlag]), +(Ch: [Ch_Rop1, Ch_Wop2]), +(Ch: [Ch_All]), (Ch: [Ch_Wop3, Ch_Rop2, Ch_Rop1]), (Ch: [Ch_Wop3, Ch_Rop2, Ch_Rop1]), (Ch: [Ch_Wop3, Ch_Rop2, Ch_Rop1]), @@ -1005,6 +1007,9 @@ (Ch: [Ch_All]), (Ch: [Ch_Rop1, Ch_Rop2, Ch_Wop3]), (Ch: [Ch_Rop1, Ch_Rop2, Ch_Wop3]), +(Ch: [Ch_Rop1, Ch_Wop2, Ch_W0OverflowFlag, Ch_WCarryFlag, Ch_WSignFlag, Ch_WZeroFlag, Ch_WUParityFlag, Ch_WUAuxiliaryFlag]), +(Ch: [Ch_Rop1, Ch_Wop2, Ch_W0OverflowFlag, Ch_WCarryFlag, Ch_WSignFlag, Ch_W0ZeroFlag, Ch_WUParityFlag, Ch_WUAuxiliaryFlag]), +(Ch: [Ch_Rop1, Ch_Wop2, Ch_W0OverflowFlag, Ch_WCarryFlag, Ch_WSignFlag, Ch_WZeroFlag, Ch_WUParityFlag, Ch_WUAuxiliaryFlag]), (Ch: [Ch_Wop2, Ch_WFlags, Ch_Rop1]), (Ch: [Ch_Rop1, Ch_Rop2, Ch_Wop3]), (Ch: [Ch_REDX, Ch_Rop1, Ch_Wop2, Ch_Wop3]), @@ -1014,6 +1019,8 @@ (Ch: [Ch_Rop1, Ch_Rop2, Ch_Wop3]), (Ch: [Ch_Rop1, Ch_Rop2, Ch_Wop3]), (Ch: [Ch_Rop1, Ch_Rop2, Ch_Wop3]), +(Ch: [Ch_Rop1, Ch_Mop2, Ch_RWCarryFlag]), +(Ch: [Ch_Rop1, Ch_Mop2, Ch_RWOverflowFlag]), (Ch: [Ch_All]), (Ch: [Ch_All]), (Ch: [Ch_All]), diff --git a/compiler/x86_64/x8664tab.inc b/compiler/x86_64/x8664tab.inc index 70497214bd..5019f3849d 100644 --- a/compiler/x86_64/x8664tab.inc +++ b/compiler/x86_64/x8664tab.inc @@ -9009,6 +9009,27 @@ code : #214#1#167; flags : [if_x86_64] ), + ( + opcode : A_MOVBE; + ops : 2; + optypes : (ot_reg16 or ot_bits32 or ot_bits64,ot_memory or ot_bits16 or ot_bits32 or ot_bits64,ot_none,ot_none); + code : #208#3#15#56#240#72; + flags : [if_movbe,if_sm] + ), + ( + opcode : A_MOVBE; + ops : 2; + optypes : (ot_memory or ot_bits16 or ot_bits32 or ot_bits64,ot_reg16 or ot_bits32 or ot_bits64,ot_none,ot_none); + code : #209#3#15#56#241#65; + flags : [if_movbe,if_sm] + ), + ( + opcode : A_PCLMULQDQ; + ops : 3; + optypes : (ot_xmmreg,ot_xmmrm,ot_immediate or ot_bits8,ot_none); + code : #241#3#15#58#68#72#22; + flags : [if_clmul,if_sandybridge] + ), ( opcode : A_VADDPD; ops : 3; @@ -13951,6 +13972,48 @@ code : #242#243#249#1#247#62#72; flags : [if_bmi1,if_prot,if_x86_64] ), + ( + opcode : A_BLSI; + ops : 2; + optypes : (ot_reg32,ot_rm_gpr or ot_bits32,ot_none,ot_none); + code : #242#249#1#243#60#139; + flags : [if_bmi1,if_prot] + ), + ( + opcode : A_BLSI; + ops : 2; + optypes : (ot_reg64,ot_rm_gpr or ot_bits64,ot_none,ot_none); + code : #242#243#249#1#243#60#139; + flags : [if_bmi1,if_prot,if_x86_64] + ), + ( + opcode : A_BLSMSK; + ops : 2; + optypes : (ot_reg32,ot_rm_gpr or ot_bits32,ot_none,ot_none); + code : #242#249#1#243#60#138; + flags : [if_bmi1,if_prot] + ), + ( + opcode : A_BLSMSK; + ops : 2; + optypes : (ot_reg64,ot_rm_gpr or ot_bits64,ot_none,ot_none); + code : #242#243#249#1#243#60#138; + flags : [if_bmi1,if_prot,if_x86_64] + ), + ( + opcode : A_BLSR; + ops : 2; + optypes : (ot_reg32,ot_rm_gpr or ot_bits32,ot_none,ot_none); + code : #242#249#1#243#60#137; + flags : [if_bmi1,if_prot] + ), + ( + opcode : A_BLSR; + ops : 2; + optypes : (ot_reg64,ot_rm_gpr or ot_bits64,ot_none,ot_none); + code : #242#243#249#1#243#60#137; + flags : [if_bmi1,if_prot,if_x86_64] + ), ( opcode : A_TZCNT; ops : 2; @@ -14070,6 +14133,34 @@ code : #220#242#243#249#1#247#62#72; flags : [if_bmi2,if_prot,if_x86_64] ), + ( + opcode : A_ADCX; + ops : 2; + optypes : (ot_reg32,ot_rm_gpr or ot_bits32,ot_none,ot_none); + code : #241#3#15#56#246#72; + flags : [if_adx] + ), + ( + opcode : A_ADCX; + ops : 2; + optypes : (ot_reg64,ot_rm_gpr or ot_bits64,ot_none,ot_none); + code : #241#214#3#15#56#246#72; + flags : [if_adx,if_x86_64] + ), + ( + opcode : A_ADOX; + ops : 2; + optypes : (ot_reg32,ot_rm_gpr or ot_bits32,ot_none,ot_none); + code : #219#3#15#56#246#72; + flags : [if_adx] + ), + ( + opcode : A_ADOX; + ops : 2; + optypes : (ot_reg64,ot_rm_gpr or ot_bits64,ot_none,ot_none); + code : #219#214#3#15#56#246#72; + flags : [if_adx,if_x86_64] + ), ( opcode : A_VBROADCASTI128; ops : 2; diff --git a/tests/utils/avx/avxopcodes.pas b/tests/utils/avx/avxopcodes.pas index e5a44e5c64..d21c335375 100644 --- a/tests/utils/avx/avxopcodes.pas +++ b/tests/utils/avx/avxopcodes.pas @@ -51,6 +51,17 @@ end; procedure TAVXTestGenerator.Init; begin + FOpCodeList.Add('ADCX,1,1,REG32,RM32,,,'); + FOpCodeList.Add('ADCX,1,1,REG64,RM64,,,'); + FOpCodeList.Add('ADOX,1,1,REG32,RM32,,,'); + FOpCodeList.Add('ADOX,1,1,REG64,RM64,,,'); + + FOpCodeList.Add('BLSI,1,1,REG32,RM32,,,'); + FOpCodeList.Add('BLSI,1,1,REG64,RM64,,,'); + FOpCodeList.Add('BLSR,1,1,REG32,RM32,,,'); + FOpCodeList.Add('BLSR,1,1,REG64,RM64,,,'); + FOpCodeList.Add('BLSMSK,1,1,REG32,RM32,,,'); + FOpCodeList.Add('BLSMSK,1,1,REG64,RM64,,,'); FOpCodeList.Add('BZHI,1,1,REG32,RM32,REG32,,'); FOpCodeList.Add('BZHI,1,1,REG64,RM64,REG64,,'); FOpCodeList.Add('MULX,1,1,REG32,REG32,RM32,,'); @@ -58,8 +69,18 @@ begin FOpCodeList.Add('PDEP,1,1,REG32,REG32,RM32,,'); FOpCodeList.Add('PDEP,1,1,REG64,REG64,RM64,,'); FOpCodeList.Add('PEXT,1,1,REG32,REG32,RM32,,'); - FOpCodeList.Add('PEXT,1,1,REG64,REG64,RM64,,'); + FOpCodeList.Add('PEXT,1,1,REG64,REG64,RM64,,'); + + FOpCodeList.Add('MOVBE,1,1,REG16,MEM16,,,'); + FOpCodeList.Add('MOVBE,1,1,MEM16,REG16,,,'); + FOpCodeList.Add('MOVBE,1,1,REG32,MEM32,,,'); + FOpCodeList.Add('MOVBE,1,1,MEM32,REG32,,,'); + FOpCodeList.Add('MOVBE,1,1,REG64,MEM64,,,'); + FOpCodeList.Add('MOVBE,1,1,MEM64,REG64,,,'); + FOpCodeList.Add('PCLMULQDQ,1,1,XMMREG,XMMRM,IMM8,'); + FOpCodeList.Add('VPCLMULQDQ,1,1,XMMREG,XMMREG,XMMRM,IMM8'); + FOpCodeList.Add('VADDPD,1,1,XMMREG,XMMREG,XMMRM,'); FOpCodeList.Add('VADDPD,1,1,YMMREG,YMMREG,YMMRM,'); FOpCodeList.Add('VADDPS,1,1,XMMREG,XMMREG,XMMRM,'); @@ -811,7 +832,6 @@ begin FOpCodeList.Add('VPGATHERQQ,1,1,XMMREG,XMEM64,XMMREG,'); FOpCodeList.Add('VPGATHERQQ,1,1,YMMREG,YMEM64,YMMREG,'); - end; function TAVXTestGenerator.InternalMakeTestFiles(aX64: boolean; aDestPath, aFileExt: String;