Press enter to see results or esc to cancel.

Extending Integers

This procedure extends integers to the new integer type.

Procedure TExpression.ExtendInteger (NewIntegerType: TIntegerTypeSet);
Var upCode: LongRec;
    TempValue: LongRec absolute upCode;
begin
  TempValue := Value.LongRec;
  Case Location of
    elConstant: begin
                  If not (it16Bit in NewIntegerType) then
                    begin
                      Integer (TempValue.WordL) := ShortInt (Lo (TempValue.WordL));
                      If itUnsigned in NewIntegerType then TempValue.Byte1 := 0;
                    end;
                  If not (it32Bit in NewIntegerType)then
                    begin
                      TempValue.Long := Integer (TempValue.WordL);
                      If itUnsigned in NewIntegerType then TempValue.WordH := 0;
                    end;
                  Value.LongRec := TempValue;
                end;
    else begin
           upCode.Long := 0;
           If (it16Bit in NewIntegerType) and not (it16Bit in DataType) then
             begin
               upCode.Byte0 := CBW;
               If itUnsigned in DataType then upCode.WordL := XOR_AH_AH;
             end;
           If (it32Bit in NewIntegerType) and not (it32Bit in DataType) then
             begin
               Include (UsedRegisters, urDX);
               upCode.Byte2 := CWD;
               If itUnsigned in DataType then upCode.WordH := XOR_DX_DX;
             end;
           If (upCode.Long <> 0) or ((Location = elPointerToMemory) and not (it16Bit in NewIntegerType)) then
             begin
               Calculate;
               LoadExpressionToRegisters (urAX);
               If upCode.WordL <> 0 then
                 begin
                   If upCode.Byte1 = 0 then GenerateInstruction_Byte (upCode.Byte0)
                     else GenerateInstruction_TwoBytes (upCode.Byte0, upCode.Byte1);
                 end;
               If upCode.WordH <> 0 then
                 begin
                   If upCode.Byte3 = 0 then GenerateInstruction_Byte (upCode.Byte2)
                     else GenerateInstruction_TwoBytes (upCode.Byte2, upCode.Byte3);
                 end;
               EndIntermediateCodeSubroutine;
             end;
         end;
  end;
  DataType := NewIntegerType;
end;