diff options
author | nickysn <nickysn@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2013-06-09 10:54:30 +0000 |
---|---|---|
committer | nickysn <nickysn@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2013-06-09 10:54:30 +0000 |
commit | f36f7530150e1624e085087d749519113a8343a9 (patch) | |
tree | 0e1f570b21f87942c058124d71ea2fa636e11119 /compiler | |
parent | 6bc874c34d22ac5714d07d931c35a23367fb619d (diff) | |
download | fpc-f36f7530150e1624e085087d749519113a8343a9.tar.gz |
+ added tcg8086.a_call_name_far and .a_call_name_static_far; a_call_name and a_call_name_static overriden and call near or far depending on the memory model
git-svn-id: http://svn.freepascal.org/svn/fpc/trunk@24828 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/i8086/cgcpu.pas | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/compiler/i8086/cgcpu.pas b/compiler/i8086/cgcpu.pas index d6921e7f2f..5aa82447f0 100644 --- a/compiler/i8086/cgcpu.pas +++ b/compiler/i8086/cgcpu.pas @@ -43,6 +43,11 @@ unit cgcpu; function getintregister(list:TAsmList;size:Tcgsize):Tregister;override; + procedure a_call_name(list : TAsmList;const s : string; weak: boolean);override; + procedure a_call_name_far(list : TAsmList;const s : string; weak: boolean); + procedure a_call_name_static(list : TAsmList;const s : string);override; + procedure a_call_name_static_far(list : TAsmList;const s : string); + procedure a_op_const_reg(list : TAsmList; Op: TOpCG; size: TCGSize; a: tcgint; reg: TRegister); override; procedure a_op_const_ref(list : TAsmList; Op: TOpCG; size: TCGSize; a: tcgint; const ref: TReference); override; procedure a_op_reg_reg(list : TAsmList; Op: TOpCG; size: TCGSize; src, dst: TRegister); override; @@ -157,6 +162,52 @@ unit cgcpu; end; + procedure tcg8086.a_call_name(list: TAsmList; const s: string; weak: boolean); + begin + if current_settings.x86memorymodel in x86_far_code_models then + a_call_name_far(list,s,weak) + else + a_call_name_near(list,s,weak); + end; + + + procedure tcg8086.a_call_name_far(list: TAsmList; const s: string; + weak: boolean); + var + sym : tasmsymbol; + r : treference; + begin + if not(weak) then + sym:=current_asmdata.RefAsmSymbol(s) + else + sym:=current_asmdata.WeakRefAsmSymbol(s); + reference_reset_symbol(r,sym,0,sizeof(pint)); + r.refaddr:=addr_far; + list.concat(taicpu.op_ref(A_CALL,S_NO,r)); + end; + + + procedure tcg8086.a_call_name_static(list: TAsmList; const s: string); + begin + if current_settings.x86memorymodel in x86_far_code_models then + a_call_name_static_far(list,s) + else + a_call_name_static_near(list,s); + end; + + + procedure tcg8086.a_call_name_static_far(list: TAsmList; const s: string); + var + sym : tasmsymbol; + r : treference; + begin + sym:=current_asmdata.RefAsmSymbol(s); + reference_reset_symbol(r,sym,0,sizeof(pint)); + r.refaddr:=addr_far; + list.concat(taicpu.op_ref(A_CALL,S_NO,r)); + end; + + procedure tcg8086.a_op_const_reg(list: TAsmList; Op: TOpCG; size: TCGSize; a: tcgint; reg: TRegister); var |