Browse Source

* optimized get_caller_addr and get_caller_frame on i8086 by eliminating the stack frame and using si, instead of bp

git-svn-id: trunk@25801 -
nickysn 12 years ago
parent
commit
9bf3d1edff
1 changed files with 4 additions and 8 deletions
  1. 4 8
      rtl/i8086/i8086.inc

+ 4 - 8
rtl/i8086/i8086.inc

@@ -71,12 +71,11 @@ end;
 {$define FPC_SYSTEM_HAS_GET_CALLER_ADDR}
 {$define FPC_SYSTEM_HAS_GET_CALLER_ADDR}
 function get_caller_addr(framebp:pointer;addr:codepointer=nil):codepointer;nostackframe;assembler;
 function get_caller_addr(framebp:pointer;addr:codepointer=nil):codepointer;nostackframe;assembler;
 asm
 asm
-  push bp
-  mov bp, sp
+  mov si, sp
 {$ifdef FPC_X86_CODE_FAR}
 {$ifdef FPC_X86_CODE_FAR}
   xor dx, dx
   xor dx, dx
 {$endif FPC_X86_CODE_FAR}
 {$endif FPC_X86_CODE_FAR}
-  mov ax, ss:[bp + 6 + extra_param_offset + extra_param_offset]  // framebp
+  mov ax, ss:[si + 6 + extra_param_offset + extra_param_offset]  // framebp
   or ax, ax
   or ax, ax
   jz @@Lg_a_null
   jz @@Lg_a_null
   xchg ax, bx
   xchg ax, bx
@@ -86,22 +85,19 @@ asm
 {$endif FPC_X86_CODE_FAR}
 {$endif FPC_X86_CODE_FAR}
   xchg ax, bx
   xchg ax, bx
 @@Lg_a_null:
 @@Lg_a_null:
-  pop bp
 end;
 end;
 
 
 {$define FPC_SYSTEM_HAS_GET_CALLER_FRAME}
 {$define FPC_SYSTEM_HAS_GET_CALLER_FRAME}
 function get_caller_frame(framebp:pointer;addr:codepointer=nil):pointer;nostackframe;assembler;
 function get_caller_frame(framebp:pointer;addr:codepointer=nil):pointer;nostackframe;assembler;
 asm
 asm
-  push bp
-  mov bp, sp
-  mov ax, ss:[bp + 6 + extra_param_offset + extra_param_offset]  // framebp
+  mov si, sp
+  mov ax, ss:[si + 6 + extra_param_offset + extra_param_offset]  // framebp
   or ax, ax
   or ax, ax
   jz @@Lgnf_null
   jz @@Lgnf_null
   xchg ax, bx
   xchg ax, bx
   mov bx, [bx]
   mov bx, [bx]
   xchg ax, bx
   xchg ax, bx
 @@Lgnf_null:
 @@Lgnf_null:
-  pop bp
 end;
 end;
 
 
 {TODO: fix, use smallint?}
 {TODO: fix, use smallint?}