From 447276c5bb2ff36378780eb50aedbf9e2e1c8fb2 Mon Sep 17 00:00:00 2001 From: florian <florian@freepascal.org> Date: Sun, 22 Jul 2007 16:40:44 +0000 Subject: [PATCH] * Jcc reads the flags, this was not in the dat yet, resolves #9278 * disabled 4 ops variant of insertq for now git-svn-id: trunk@8133 - --- compiler/i386/i386nop.inc | 2 +- compiler/i386/i386prop.inc | 2 +- compiler/i386/i386tab.inc | 7 ------- compiler/x86/x86ins.dat | 5 +++-- compiler/x86_64/cpupara.pas | 10 ++++++++-- compiler/x86_64/x8664nop.inc | 2 +- compiler/x86_64/x8664pro.inc | 2 +- compiler/x86_64/x8664tab.inc | 7 ------- 8 files changed, 15 insertions(+), 22 deletions(-) diff --git a/compiler/i386/i386nop.inc b/compiler/i386/i386nop.inc index 5fe2125afc..73abfe3e57 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 } -1380; +1379; diff --git a/compiler/i386/i386prop.inc b/compiler/i386/i386prop.inc index 3c6a6f683f..c4c573a7af 100644 --- a/compiler/i386/i386prop.inc +++ b/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)), diff --git a/compiler/i386/i386tab.inc b/compiler/i386/i386tab.inc index 0d0c470aa5..63f9627fdf 100644 --- a/compiler/i386/i386tab.inc +++ b/compiler/i386/i386tab.inc @@ -9604,13 +9604,6 @@ code : #65#192#220#213#62#2#15#43#63; flags : if_sse4 ), - ( - opcode : A_INSERTQ; - ops : 4; - optypes : (ot_xmmreg,ot_xmmreg,ot_immediate); - code : #76#2#15#120#63#253#18#253#19; - flags : if_sse4 or if_sb - ), ( opcode : A_INSERTQ; ops : 2; diff --git a/compiler/x86/x86ins.dat b/compiler/x86/x86ins.dat index d6034f87fb..ce6d0da1d3 100644 --- a/compiler/x86/x86ins.dat +++ b/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 @@ -3262,8 +3262,9 @@ mem,xmmreg \101\300\334\325\76\2\x0F\x2B\77 SSE4 ;,S [INSERTQ] (Ch_All, Ch_None, Ch_None) -xmmreg,xmmreg,imm,imm \110\334\76\2\x0F\x78\77\375\22\375\23 SSE4,SB 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) diff --git a/compiler/x86_64/cpupara.pas b/compiler/x86_64/cpupara.pas index a1ce279880..f7e86b545e 100644 --- a/compiler/x86_64/cpupara.pas +++ b/compiler/x86_64/cpupara.pas @@ -178,12 +178,18 @@ unit cpupara; function tx86_64paramanager.ret_in_param(def : tdef;calloption : tproccalloption) : boolean; + var + loc1,loc2:tcgloc; begin if target_info.system=system_x86_64_win64 then result:=(calloption=pocall_safecall) or (def.size>8) or not(def.size in [1,2,4,8]) else - result:=inherited ret_in_param(def,calloption); + begin + { get memory class } + getvalueparaloc(p,loc1,loc2); + result:=loc1=LOC_REFERENCE; + end; end; @@ -224,7 +230,7 @@ unit cpupara; formaldef : result:=true; recorddef : - result:=((varspez=vs_const) and ((def.size>16) or (calloption<>pocall_register))) or + result:=((varspez=vs_const) and ((def.size>16) or (calloption<>pocall_register))) or ((target_info.system=system_x86_64_win64) and (def.size>8)); arraydef : begin diff --git a/compiler/x86_64/x8664nop.inc b/compiler/x86_64/x8664nop.inc index 73abfe3e57..38b54b54d2 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 } -1379; +1378; diff --git a/compiler/x86_64/x8664pro.inc b/compiler/x86_64/x8664pro.inc index 3c6a6f683f..c4c573a7af 100644 --- a/compiler/x86_64/x8664pro.inc +++ b/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)), diff --git a/compiler/x86_64/x8664tab.inc b/compiler/x86_64/x8664tab.inc index 0d49854a73..63390aaf98 100644 --- a/compiler/x86_64/x8664tab.inc +++ b/compiler/x86_64/x8664tab.inc @@ -9597,13 +9597,6 @@ code : #65#192#220#213#62#2#15#43#63; flags : if_sse4 ), - ( - opcode : A_INSERTQ; - ops : 4; - optypes : (ot_xmmreg,ot_xmmreg,ot_immediate); - code : #76#2#15#120#63#253#18#253#19; - flags : if_sse4 or if_sb - ), ( opcode : A_INSERTQ; ops : 2;