summaryrefslogtreecommitdiff
path: root/compiler/i8086/cgcpu.pas
diff options
context:
space:
mode:
authornickysn <nickysn@3ad0048d-3df7-0310-abae-a5850022a9f2>2013-10-06 23:56:25 +0000
committernickysn <nickysn@3ad0048d-3df7-0310-abae-a5850022a9f2>2013-10-06 23:56:25 +0000
commit9e729827a3b1bba9a13f989c0deafed9a5e0716f (patch)
tree250bad65dc8121325213c52af7168fec17442e60 /compiler/i8086/cgcpu.pas
parentfeff48136a8683ac738e41d792bb646c05b46e3c (diff)
downloadfpc-9e729827a3b1bba9a13f989c0deafed9a5e0716f.tar.gz
+ implemented tcg64f8086.a_op64_const_ref
git-svn-id: http://svn.freepascal.org/svn/fpc/trunk@25706 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'compiler/i8086/cgcpu.pas')
-rw-r--r--compiler/i8086/cgcpu.pas40
1 files changed, 34 insertions, 6 deletions
diff --git a/compiler/i8086/cgcpu.pas b/compiler/i8086/cgcpu.pas
index d286c89747..96db911ef6 100644
--- a/compiler/i8086/cgcpu.pas
+++ b/compiler/i8086/cgcpu.pas
@@ -95,7 +95,7 @@ unit cgcpu;
{ procedure a_op64_ref_reg(list : TAsmList;op:TOpCG;size : tcgsize;const ref : treference;reg : tregister64);override;}
procedure a_op64_reg_reg(list : TAsmList;op:TOpCG;size : tcgsize;regsrc,regdst : tregister64);override;
procedure a_op64_const_reg(list : TAsmList;op:TOpCG;size : tcgsize;value : int64;reg : tregister64);override;
-{ procedure a_op64_const_ref(list : TAsmList;op:TOpCG;size : tcgsize;value : int64;const ref : treference);override;}
+ procedure a_op64_const_ref(list : TAsmList;op:TOpCG;size : tcgsize;value : int64;const ref : treference);override;
private
procedure get_64bit_ops(op:TOpCG;var op1,op2:TAsmOp);
end;
@@ -1953,7 +1953,7 @@ unit cgcpu;
end;
-(* procedure tcg64f8086.a_op64_const_ref(list : TAsmList;op:TOpCG;size : tcgsize;value : int64;const ref : treference);
+ procedure tcg64f8086.a_op64_const_ref(list : TAsmList;op:TOpCG;size : tcgsize;value : int64;const ref : treference);
var
op1,op2 : TAsmOp;
tempref : treference;
@@ -1971,14 +1971,42 @@ unit cgcpu;
begin
get_64bit_ops(op,op1,op2);
// can't use a_op_const_ref because this may use dec/inc
- list.concat(taicpu.op_const_ref(op1,S_L,aint(lo(value)),tempref));
- inc(tempref.offset,4);
- list.concat(taicpu.op_const_ref(op2,S_L,aint(hi(value)),tempref));
+ if (value and $ffffffffffff) = 0 then
+ begin
+ inc(tempref.offset,6);
+ list.concat(taicpu.op_const_ref(op1,S_W,aint((value shr 48) and $ffff),tempref));
+ end
+ else if (value and $ffffffff) = 0 then
+ begin
+ inc(tempref.offset,4);
+ list.concat(taicpu.op_const_ref(op1,S_W,aint((value shr 32) and $ffff),tempref));
+ inc(tempref.offset,2);
+ list.concat(taicpu.op_const_ref(op2,S_W,aint((value shr 48) and $ffff),tempref));
+ end
+ else if (value and $ffff) = 0 then
+ begin
+ inc(tempref.offset,2);
+ list.concat(taicpu.op_const_ref(op1,S_W,aint((value shr 16) and $ffff),tempref));
+ inc(tempref.offset,2);
+ list.concat(taicpu.op_const_ref(op2,S_W,aint((value shr 32) and $ffff),tempref));
+ inc(tempref.offset,2);
+ list.concat(taicpu.op_const_ref(op2,S_W,aint((value shr 48) and $ffff),tempref));
+ end
+ else
+ begin
+ list.concat(taicpu.op_const_ref(op1,S_W,aint(value and $ffff),tempref));
+ inc(tempref.offset,2);
+ list.concat(taicpu.op_const_ref(op2,S_W,aint((value shr 16) and $ffff),tempref));
+ inc(tempref.offset,2);
+ list.concat(taicpu.op_const_ref(op2,S_W,aint((value shr 32) and $ffff),tempref));
+ inc(tempref.offset,2);
+ list.concat(taicpu.op_const_ref(op2,S_W,aint((value shr 48) and $ffff),tempref));
+ end;
end;
else
internalerror(200204022);
end;
- end;*)
+ end;
procedure create_codegen;
begin