Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / fpc-devel / 2023-11

Quirk is "IsJumpToLabel"

1 message · 1 person ·

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

J. Gareth Moreton

Hi everyone,

I've been developing a new optimisation for x86, and in one situation a JMP becomes a Jcc.  To make sure it's valid, I ensure that "IsJumpToLabel" returns True before the change is made.  All was well in x86_64-win64 and x86_64-linux, but on i386-linux, I came across a bit of an anomaly:

    jmp _$RTTI$_Ld3(,%eax,4)

It turns out that "IsJumpToLabel" returns true for this construct, which is not valid for Jcc.  _$RTTI$_Ld3 is a jump table stored as a data structure.  The question is though... should this be treated as a jump to a label?

Currently, my optimisation fails on i386-linux because of "IsJumpToLabel" returning True on this.  I can modify my code so it makes sure there's no index register, but this feels a bit hacky and there may be other, unrelated blocks of code that could fall foul of a similar situation, and I personally feel that "IsJumpToLabel" should return True only for pure labels.  However, such a change will affect other platforms and I don't yet know what effect that will have.

As a side-node, because of the principle of relocation under x86_64, jump table access is more complex.  The equivalent code for "jmp _$RTTI$_Ld3(,%eax,4)" on x86_64-win64 is:

    leaq    .Ld3(%rip),%rdx
    movslq    (%rdx,%rax,4),%rax
    addq    %rdx,%rax
    jmp    *%rax

(The jump table contains relative addresses rather than absolute addresses, hence the need for "addq %rdx,%rax")

And of course, the JMP instruction is not considered a jump to a label.

Kit

Reply by email