Преглед изворни кода

Merge branch source:main into main

Curtis Hamilton пре 2 недеља
родитељ
комит
9fa5783de4

+ 11 - 4
compiler/powerpc64/hlcgcpu.pas

@@ -56,17 +56,24 @@ implementation
   procedure thlcgcpu.a_load_subsetreg_reg(list: TAsmList; subsetsize, tosize: tdef; const sreg: tsubsetregister; destreg: tregister);
     var
       subsetcgsize: tcgsize;
+      tocgsize: tcgsize;
+      bitlen, ssbitlen, tobitlen: word;
     begin
       subsetcgsize:=def_cgsize(subsetsize);
+      tocgsize:=def_cgsize(tosize);
+      bitlen:=sreg.bitlen;
+      tobitlen:=tcgsize2size[tocgsize]*8;
+      ssbitlen:=tcgsize2size[subsetcgsize]*8;
 {$ifdef extdebug}
-      list.concat(tai_comment.create(strpnew('a_load_subsetreg_reg subsetregsize = ' + tcgsize2str(sreg.subsetregsize) + ' subsetsize = ' + tcgsize2str(subsetcgsize) + ' startbit = ' + ToStr(sreg.startbit) + ' tosize = ' + tcgsize2str(def_cgsize(tosize)))));
+      list.concat(tai_comment.create(strpnew('a_load_subsetreg_reg subsetregsize = ' + tcgsize2str(sreg.subsetregsize) + ' subsetsize = ' + tcgsize2str(subsetcgsize) + ' startbit = ' + ToStr(sreg.startbit) + ' tosize = ' + tcgsize2str(tocgsize))));
 {$endif}
       { do the extraction if required and then extend the sign correctly. (The latter is actually required only for signed subsets
       and if that subset is not >= the tosize). }
-      if (sreg.startbit<>0) or
-         (sreg.bitlen<>tcgsize2size[subsetcgsize]*8) then
+      if (sreg.startbit<>0) or (bitlen<>ssbitlen) or (bitlen<>ssbitlen) then
         begin
-          list.concat(taicpu.op_reg_reg_const_const(A_RLDICL,destreg,sreg.subsetreg,(64-sreg.startbit) and 63,64-sreg.bitlen));
+          if (subsetcgsize in [OS_8..OS_128]) and (bitlen>tobitlen) then
+            bitlen:=tobitlen;
+          list.concat(taicpu.op_reg_reg_const_const(A_RLDICL,destreg,sreg.subsetreg,(64-sreg.startbit) and 63,64-bitlen));
           if subsetcgsize in [OS_S8..OS_S128] then
             if (sreg.bitlen mod 8)=0 then
               begin

BIN
tests/test/cg/obj/solaris/i386/tcext7.o


BIN
tests/test/cg/obj/solaris/x86_64/tcext7.o


+ 75 - 0
tests/test/cg/tbytetypecast.pp

@@ -0,0 +1,75 @@
+{ Test to check code generation problem for powerpc64 CPU } 
+{ Related to commit 35604b0926 PM }
+
+var
+  HasError : boolean;
+  ErrorCount : longint;
+
+procedure error(i : longint);
+
+begin
+  writeln('Error at pos ',i);
+  HasError:=true;
+  inc(ErrorCount);
+end;
+
+type
+  TRecord = record
+    w1,w2,w3,w4 : word;
+  end;
+
+var
+  w1, w2 : word;
+  b1, b2 : byte;
+  rec : TRecord;
+
+function getrec : TRecord;
+  begin
+    getrec:=rec;
+  end;
+
+begin
+  HasError:=false;
+  ErrorCount:=0;
+  b1:=$57;
+  w1:=$2D57;
+  b2:=$E3;
+  w2:=$ABE3;
+  if (byte(w1)<>b1) then
+    error(1);
+  if (byte(w2)<>b2) then
+    error(2);
+  rec.w1:=w1;
+
+  if (byte(rec.w1)<>b1) then
+    error(3);
+  if (rec.w1=b1) then
+    error(4);
+  if (byte(getrec.w1)<>b1) then
+    error(5);
+  if (getrec.w1<>w1) then
+    error(6);
+  rec.w1:=$1234;
+  rec.w2:=w2;
+  rec.w3:=w1;
+  if (byte(rec.w2)<>b2) then
+    error(7);
+  if (rec.w2=b2) then
+    error(8);
+  if (byte(getrec.w2)<>b2) then
+    error(9);
+  if (getrec.w2<>w2) then
+    error(10);
+  if (byte(rec.w3)<>b1) then
+    error(11);
+  if (rec.w3=b1) then
+    error(12);
+  if (byte(getrec.w3)<>b1) then
+    error(13);
+  if (getrec.w3<>w1) then
+    error(14);
+  if ErrorCount=0 then
+    writeln('Test completed without error')
+  else
+    halt(ErrorCount);
+end.

+ 4 - 0
utils/fpdoc/fpmake.pp

@@ -46,6 +46,10 @@ begin
 
     P.Options.Add('-S2h');
 
+    { powerpc64-aix compiled IDE needs -CTsmalltoc option }
+    if (Defaults.OS=aix) and (Defaults.CPU=powerpc64) then
+      P.Options.Add('-CTsmalltoc');
+
     T:=P.Targets.AddProgram('fpdoc.pp');
     T.Dependencies.AddUnit('fpdocstrs');
     T.Dependencies.AddUnit('dglobals');