瀏覽代碼

+ Added a test for a bug fixed in b96057ad.

Yuriy Sydorov 3 年之前
父節點
當前提交
16d17de1ff
共有 1 個文件被更改,包括 88 次插入0 次删除
  1. 88 0
      tests/tbs/tb0684.pp

+ 88 - 0
tests/tbs/tb0684.pp

@@ -0,0 +1,88 @@
+{$mode objfpc}
+
+type
+  TAsmList = ptruint;
+  tdef = ptruint;
+  tregister = ptruint;
+
+  treference = record
+    one,two,three,four: ptruint;
+  end;
+
+  tcg = class
+  public
+    function getintregister(list:TAsmList;size:tdef):Tregister;virtual;
+    procedure a_load_ref_reg(list : TAsmList;fromsize, tosize : tdef;const ref : treference;register : tregister);virtual;
+    procedure a_load_reg_ref(list : TAsmList;fromsize, tosize : tdef;register : tregister;const ref : treference);virtual;
+    procedure a_load_ref_ref(list : TAsmList;fromsize, tosize : tdef;const sref : treference;const dref : treference);virtual;
+  end;
+
+procedure error(code: integer);
+begin
+  writeln('ERROR: ', code);
+  halt(code);
+end;
+
+function references_equal(const sref,dref : treference):boolean; inline;
+  begin
+    references_equal:=CompareByte(sref,dref,sizeof(treference))=0;
+  end;
+
+function tcg.getintregister(list:TAsmList;size:tdef):Tregister;
+begin
+  if list<>40 then
+    error(1);
+  result:=10;
+end;
+
+procedure tcg.a_load_ref_reg(list : TAsmList;fromsize, tosize : tdef;const ref : treference;register : tregister);
+begin
+  if list<>40 then
+    error(2);
+  if fromsize<>50 then
+    error(3);
+  if tosize<>60 then
+    error(4);
+  if ref.one<>20 then
+    error(5);
+  if register<>10 then
+    error(6);
+end;
+
+procedure tcg.a_load_reg_ref(list : TAsmList;fromsize, tosize : tdef;register : tregister;const ref : treference);
+begin
+  if list<>40 then
+    error(10);
+  if fromsize<>60 then
+    error(11);
+  if tosize<>60 then
+    error(12);
+  if ref.one<>30 then
+    error(13);
+  if register<>10 then
+    error(14);
+end;
+
+procedure tcg.a_load_ref_ref(list: TAsmList; fromsize, tosize: tdef; const sref: treference; const dref: treference);
+  var
+    tmpreg: tregister;
+  begin
+    if references_equal(sref,dref) then
+      exit;
+    tmpreg:=getintregister(list,tosize);
+    a_load_ref_reg(list,fromsize,tosize,sref,tmpreg);
+    a_load_reg_ref(list,tosize,tosize,tmpreg,dref);
+  end;
+
+var
+  cg: tcg;
+  ref1: treference;
+  ref2: treference;
+begin
+  cg:=tcg.create;
+  ref1.one:=20;
+  ref2.one:=30;
+  cg.a_load_ref_ref(40,50,60,ref1,ref2);
+  cg.Free;
+  writeln('OK');
+end.