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

_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel

Reply via email to