Optimizing Jumps

Turbo Pascal tries to convert all near jumps to short. This is only possible if jump displacement can be stored in a byte. This procedure is called just before the target code is generated. Since all changes reduce code size and therefore provide new opportunities for optimizations, the function is called in a loop until there are no more changes. 
  Function ConvertNearJumpsToShort: Boolean;
  Var JumpRecord: PIntermediateCodeRecord;
      JumpRecordOfs: Word absolute JumpRecord;
      LabelRecord: PIntermediateCodeRecord;
      LabelRecordOfs: Word absolute LabelRecord;
      JumpDisplacement: Integer;
      NumberOfConvertedJumps: Word;
  begin
    NumberOfConvertedJumps := 0;
    JumpRecord := Ptr (SymbolTable [stIntermediateCode].Segment, Last_icJumpNear);
    LabelRecord := Ptr (SymbolTable [stIntermediateCode].Segment, 0);
    While JumpRecordOfs <> 0 do
      With JumpRecord^ do
        begin
          LabelRecordOfs := LabelRecordOffset - 1;
          JumpDisplacement := LabelRecord^.LabelAddress - JumpCodeOffset;
          If (JumpDisplacement <= 129) and (JumpDisplacement >= - 126) then
            begin
              RecordType := icJumpShort;
              Inc (NumberOfConvertedJumps);
            end;
          JumpRecordOfs := Previous_icJumpNear;
        end;
    ConvertNearJumpsToShort := NumberOfConvertedJumps <> 0;
  end;
 
 
 
© 2017 Turbo Pascal | Privacy Policy