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;