procedure rsum(var x1,x2,x3: hreal);
var
  n,dex,j,k: integer;

%include 'reps/rsum1';
%include 'reps/rsum2';
%include 'reps/rsum3';

begin { rsum }
  trunc:=false;
  dex:=x1.ex-x2.ex;
  if x1.si=0 then x3:=x2
  else if x2.si=0 then x3:=x1
  else if abs(dex)>hdim then begin
    if dex>0 then x3:=x1 else x3:=x2;
    if x1.si<>x2.si then rtowzero(x3);
    trunc:=true;
  end
  else begin
    if x1.si=x2.si then begin                              { same sign }
      if dex>0 then rsum1(dex,x1,x2)                     { x1.ex>x2.ex }
      else if dex<0 then rsum1(-dex,x2,x1)               { x1.ex<x2.ex }
      else with x3 do begin                              { x1.ex=x2.ex }
        si:=x1.si;
        j:=0;
        for n:=hdim downto 0 do begin
          j:=x1.ma[n]+x2.ma[n]+j;
          if j<10000 then begin
            ma[n]:=j;
            j:=0;
          end
          else begin
            ma[n]:=j-10000;
            j:=1;
          end;
        end;
        if j=0 then ex:=x1.ex
        else begin
          ex:=x1.ex+1;
          if ex>exmax then overflow:=true;
          if ma[hdim]>0 then trunc:=true;
          for n:=hdim downto 1 do ma[n]:=ma[n-1];
          ma[0]:=1;
        end;
      end;
    end
    else begin                                         { different sign }
      if dex>0 then rsum2(dex,x1,x2)                      { x1.ex>x2.ex }
      else if dex<0 then rsum2(-dex,x2,x1)                { x1.ex<x2.ex }
      else with x3 do begin                               { x1.ex=x2.ex }
        k:=-1;
        repeat
          k:=k+1;
          ma[k]:=x1.ma[k]-x2.ma[k];
        until (ma[k]<>0) or (k=hdim);
        if ma[k]>0 then rsum3(x1,x2)                      { x1.ma>x2.ma }
        else if ma[k]<0 then rsum3(x2,x1)                 { x1.ma<x2.ma }
        else si:=0;                                       { x1.ma=x2.ma }
      end;
    end;
  end;
end { rsum };

