Forráskód Böngészése

+ added prefetch(const mem) support

florian 21 éve
szülő
commit
e35b683e4d
6 módosított fájl, 81 hozzáadás és 15 törlés
  1. 5 1
      compiler/compinnr.inc
  2. 35 3
      compiler/i386/n386inl.pas
  3. 4 2
      compiler/nadd.pas
  4. 15 1
      compiler/ncginl.pas
  5. 6 3
      compiler/ncgld.pas
  6. 16 5
      compiler/ninl.pas

+ 5 - 1
compiler/compinnr.inc

@@ -90,6 +90,7 @@ const
    in_ln_extended      = 126;
    in_sin_extended     = 127;
    in_const_swap_qword = 128;
+   in_prefetch_var     = 129;
 
 { MMX functions }
 { these contants are used by the mmx unit }
@@ -108,7 +109,10 @@ const
 
 {
   $Log$
-  Revision 1.11  2003-11-29 16:19:54  peter
+  Revision 1.12  2004-02-02 20:41:59  florian
+    + added prefetch(const mem) support
+
+  Revision 1.11  2003/11/29 16:19:54  peter
     * Initialize() added
 
   Revision 1.10  2002/11/18 18:35:01  peter

+ 35 - 3
compiler/i386/n386inl.pas

@@ -53,6 +53,8 @@ interface
           procedure second_ln_real; override;
           procedure second_cos_real; override;
           procedure second_sin_real; override;
+
+          procedure second_prefetch;override;
        private
           procedure load_fpu_location;
        end;
@@ -61,11 +63,12 @@ implementation
 
     uses
       systems,
+      globals,
       cutils,verbose,
       defutil,
-      aasmtai,
+      aasmtai,aasmcpu,
       cgbase,pass_2,
-      cpubase,paramgr,
+      cpuinfo,cpubase,paramgr,
       nbas,ncon,ncal,ncnv,nld,
       cga,cgx86,cgobj;
 
@@ -242,6 +245,32 @@ implementation
          emit_none(A_FSIN,S_NO)
        end;
 
+     procedure ti386inlinenode.second_prefetch;
+       var
+         ref : treference;
+         r : tregister;
+       begin
+         if aktspecificoptprocessor>=ClassPentium3 then
+           begin
+             secondpass(left);
+             case left.location.loc of
+               LOC_CREFERENCE,
+               LOC_REFERENCE:
+                 begin
+                   r:=cg.getintregister(exprasmlist,OS_ADDR);
+                   cg.a_loadaddr_ref_reg(exprasmlist,left.location.reference,r);
+                   location_release(exprasmlist,left.location);
+                   reference_reset(ref);
+                   ref.base:=r;
+                   exprasmlist.concat(taicpu.op_ref(A_PREFETCHNTA,S_NO,ref));
+                   cg.ungetregister(exprasmlist,r);
+                 end;
+               else
+                 internalerror(200402021);
+             end;
+           end;
+       end;
+
 {*****************************************************************************
                      INCLUDE/EXCLUDE GENERIC HANDLING
 *****************************************************************************}
@@ -324,7 +353,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.70  2003-10-10 17:48:14  peter
+  Revision 1.71  2004-02-02 20:41:59  florian
+    + added prefetch(const mem) support
+
+  Revision 1.70  2003/10/10 17:48:14  peter
     * old trgobj moved to x86/rgcpu and renamed to trgx86fpu
     * tregisteralloctor renamed to trgobj
     * removed rgobj from a lot of units

+ 4 - 2
compiler/nadd.pas

@@ -119,7 +119,6 @@ implementation
 
       begin
          result:=nil;
-
          { first do the two subtrees }
          resulttypepass(left);
          resulttypepass(right);
@@ -1906,7 +1905,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.107  2004-01-20 12:59:36  florian
+  Revision 1.108  2004-02-02 20:41:59  florian
+    + added prefetch(const mem) support
+
+  Revision 1.107  2004/01/20 12:59:36  florian
     * common addnode code for x86-64 and i386
 
   Revision 1.106  2004/01/14 17:19:04  peter

+ 15 - 1
compiler/ncginl.pas

@@ -48,6 +48,7 @@ interface
           procedure second_cos_real; virtual;
           procedure second_sin_real; virtual;
           procedure second_assigned; virtual;
+          procedure second_prefetch; virtual;
        end;
 
 implementation
@@ -141,6 +142,10 @@ implementation
               begin
                  second_cos_real;
               end;
+            in_prefetch_var:
+              begin
+                second_prefetch;
+              end;
             in_assigned_x:
               begin
                 second_assigned;
@@ -644,6 +649,12 @@ implementation
         internalerror(20020718);
       end;
 
+
+    procedure tcginlinenode.second_prefetch;
+      begin
+      end;
+
+
 {*****************************************************************************
                          ASSIGNED GENERIC HANDLING
 *****************************************************************************}
@@ -665,7 +676,10 @@ end.
 
 {
   $Log$
-  Revision 1.51  2004-01-31 17:45:17  peter
+  Revision 1.52  2004-02-02 20:41:59  florian
+    + added prefetch(const mem) support
+
+  Revision 1.51  2004/01/31 17:45:17  peter
     * Change several $ifdef i386 to x86
     * Change several OS_32 to OS_INT/OS_ADDR
 

+ 6 - 3
compiler/ncgld.pas

@@ -52,7 +52,7 @@ implementation
       verbose,globtype,globals,
       symconst,symtype,symdef,symsym,defutil,paramgr,
       ncnv,ncon,nmem,nbas,
-      aasmbase,aasmtai,
+      aasmbase,aasmtai,aasmcpu,
       cgbase,pass_2,
       procinfo,
       cpubase,cpuinfo,
@@ -573,7 +573,7 @@ implementation
                     LOC_CREFERENCE :
                       begin
                         cg.g_concatcopy(exprasmlist,right.location.reference,
-                                        left.location.reference,left.resulttype.def.size,true,false);
+                                    left.location.reference,left.resulttype.def.size,true,false);
                         { right.location is already released by concatcopy }
                         releaseright:=false;
                       end;
@@ -906,7 +906,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.104  2003-12-25 01:07:09  florian
+  Revision 1.105  2004-02-02 20:41:59  florian
+    + added prefetch(const mem) support
+
+  Revision 1.104  2003/12/25 01:07:09  florian
     + $fputype directive support
     + single data type operations with sse unit
     * fixed more x86-64 stuff

+ 16 - 5
compiler/ninl.pas

@@ -1958,7 +1958,10 @@ implementation
                 begin
                 end;
  {$endif SUPPORT_MMX}
-
+              in_prefetch_var:
+                begin
+                  resulttype:=voidtype;
+                end;
               in_assert_x_y :
                 begin
                   resulttype:=voidtype;
@@ -2243,9 +2246,9 @@ implementation
 {$endif SUPPORT_MMX}
             end;
 
-         in_low_x,
-         in_high_x:
-          internalerror(200104047);
+          in_low_x,
+          in_high_x:
+            internalerror(200104047);
 
           in_ord_x,
           in_chr_byte:
@@ -2274,6 +2277,11 @@ implementation
               internalerror(200108234);
             end;
 
+         in_prefetch_var:
+           begin
+             expectloc:=LOC_VOID;
+           end;
+
           else
             internalerror(8);
           end;
@@ -2366,7 +2374,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.127  2004-01-26 16:12:28  daniel
+  Revision 1.128  2004-02-02 20:41:59  florian
+    + added prefetch(const mem) support
+
+  Revision 1.127  2004/01/26 16:12:28  daniel
     * reginfo now also only allocated during register allocation
     * third round of gdb cleanups: kick out most of concatstabto