Ver Fonte

+ added x86 compiler intrinsics fpc_x86_sti and fpc_x86_cli, which generate the
'sti' and 'cli' instructions

git-svn-id: trunk@39388 -

nickysn há 7 anos atrás
pai
commit
ff2fff365f

+ 3 - 1
compiler/x86/cx86innr.inc

@@ -17,4 +17,6 @@
   in_x86_inportl = fpc_in_cpu_first+2,
   in_x86_outportb = fpc_in_cpu_first+3,
   in_x86_outportw = fpc_in_cpu_first+4,
-  in_x86_outportl = fpc_in_cpu_first+5
+  in_x86_outportl = fpc_in_cpu_first+5,
+  in_x86_cli      = fpc_in_cpu_first+6,
+  in_x86_sti      = fpc_in_cpu_first+7

+ 10 - 1
compiler/x86/nx86inl.pas

@@ -136,6 +136,9 @@ implementation
                CheckParameters(2);
                resultdef:=voidtype;
              end;
+           in_x86_cli,
+           in_x86_sti:
+             resultdef:=voidtype;
            else
              Result:=inherited pass_typecheck_cpu;
          end;
@@ -152,7 +155,9 @@ implementation
              expectloc:=LOC_REGISTER;
            in_x86_outportb,
            in_x86_outportw,
-           in_x86_outportl:
+           in_x86_outportl,
+           in_x86_cli,
+           in_x86_sti:
              expectloc:=LOC_VOID;
            else
              Result:=inherited first_cpu;
@@ -457,6 +462,10 @@ implementation
              outport(NR_AX,S_W,u16inttype);
            in_x86_outportl:
              outport(NR_EAX,S_L,s32inttype);
+           in_x86_cli:
+             current_asmdata.CurrAsmList.concat(taicpu.op_none(A_CLI));
+           in_x86_sti:
+             current_asmdata.CurrAsmList.concat(taicpu.op_none(A_STI));
            else
              inherited pass_generate_code_cpu;
          end;

+ 2 - 0
rtl/i386/cpuh.inc

@@ -32,3 +32,5 @@ function fpc_x86_inportl(port : word) : longint;[internproc:fpc_in_x86_inportl];
 procedure fpc_x86_outportb(port : word;data : byte);[internproc:fpc_in_x86_outportb];
 procedure fpc_x86_outportw(port : word;data : word);[internproc:fpc_in_x86_outportw];
 procedure fpc_x86_outportl(port : word;data : longint);[internproc:fpc_in_x86_outportl];
+procedure fpc_x86_cli;[internproc:fpc_in_x86_cli];
+procedure fpc_x86_sti;[internproc:fpc_in_x86_sti];

+ 2 - 0
rtl/i386/cpuinnr.inc

@@ -18,3 +18,5 @@
   fpc_in_x86_outportb = fpc_in_cpu_first+3;
   fpc_in_x86_outportw = fpc_in_cpu_first+4;
   fpc_in_x86_outportl = fpc_in_cpu_first+5;
+  fpc_in_x86_cli      = fpc_in_cpu_first+6;
+  fpc_in_x86_sti      = fpc_in_cpu_first+7;

+ 2 - 0
rtl/i8086/cpuh.inc

@@ -32,3 +32,5 @@ function fpc_x86_inportw(port : word) : word;[internproc:fpc_in_x86_inportw];
 procedure fpc_x86_outportb(port : word;data : byte);[internproc:fpc_in_x86_outportb];
 procedure fpc_x86_outportw(port : word;data : word);[internproc:fpc_in_x86_outportw];
 //procedure fpc_x86_outportl(port : word;data : longint);[internproc:fpc_in_x86_outportl];
+procedure fpc_x86_cli;[internproc:fpc_in_x86_cli];
+procedure fpc_x86_sti;[internproc:fpc_in_x86_sti];

+ 2 - 0
rtl/i8086/cpuinnr.inc

@@ -18,3 +18,5 @@
   fpc_in_x86_outportb = fpc_in_cpu_first+3;
   fpc_in_x86_outportw = fpc_in_cpu_first+4;
 //  fpc_in_x86_outportl = fpc_in_cpu_first+5;
+  fpc_in_x86_cli      = fpc_in_cpu_first+6;
+  fpc_in_x86_sti      = fpc_in_cpu_first+7;

+ 2 - 0
rtl/x86_64/cpuh.inc

@@ -23,3 +23,5 @@ function fpc_x86_inportl(port : word) : longint;[internproc:fpc_in_x86_inportl];
 procedure fpc_x86_outportb(port : word;data : byte);[internproc:fpc_in_x86_outportb];
 procedure fpc_x86_outportw(port : word;data : word);[internproc:fpc_in_x86_outportw];
 procedure fpc_x86_outportl(port : word;data : longint);[internproc:fpc_in_x86_outportl];
+procedure fpc_x86_cli;[internproc:fpc_in_x86_cli];
+procedure fpc_x86_sti;[internproc:fpc_in_x86_sti];

+ 2 - 0
rtl/x86_64/cpuinnr.inc

@@ -18,3 +18,5 @@
   fpc_in_x86_outportb = fpc_in_cpu_first+3;
   fpc_in_x86_outportw = fpc_in_cpu_first+4;
   fpc_in_x86_outportl = fpc_in_cpu_first+5;
+  fpc_in_x86_cli      = fpc_in_cpu_first+6;
+  fpc_in_x86_sti      = fpc_in_cpu_first+7;