On Feb 13, 2006, at 8:31 PM, Eric Fisher wrote:
Thanks. I'm working to port gcc to our chip. I use mips-elf as the start.

Most chips have this same issue, you can copy from ppc for example, or arm, if your chip is more like it (hope not).

we don't have pc-region branch instructions such as 'j target'. So I'm
confused how to solve the function call translation.

I am sorry you didn't understand my answer to your question. I'd be happy to try and help you, but I am limited in what help I can provide if you cannot answer my questions.

There are a multitude of possible questions you could be asking and I'd need help in narrowing down which answer you seek.

Also are you doing pic code or non-pic code?  Is your chip a mips clone?

Anyway, to try and answer part of your question, no, you don't have to generate:

    la reg, func
    b reg

there are other possibilities, for example, you can train as/ld to extend them by inserting code to jump to the right place, and then jump to that code, but, this is harder than just generating the above and can require that your abi reserve a register so that the code that as/ld generates can use that reserved register.

On ppc darwin, we have code to generate branch islands and then we have an instruction that will do a short jump, if it is in range otherwise it will jump to the other label which will be in range and the code there (generated by the compiler) will do the above type sequence. Statistically, this works out well, as 98% of the time, you get the nice code with a short branch and in rare cases you get a jump to an indirect jump. It looks like this:

    b func, func_stub

func_stub:
    la reg, func
    b reg

when then can dead code strip out the func_stubs is there are no surviving references to them. The only problem, we have to burn a register anyway. The _solution_ to this problem would be a link time optimizer, it's an open project for gcc at this time. The branch island code is a port feature.

Reply via email to