RFR(XS): 8015437: SPARC cbcond offset value out of range
Vladimir Kozlov
vladimir.kozlov at oracle.com
Fri Jun 7 09:22:16 PDT 2013
On 6/7/13 9:15 AM, David Chase wrote:
> I think I'm confused. If it's a ba,a (or the newer BPA,a,pt), there's no need for a NOP, since it is never executed.
> We can save 4 whole bytes of code space/instruction cache.
ALL SPARC branch instructions, except new cbcond, HAVE delay slot
instruction. Period! You only can control execution of delayed
instruction with annulled bit.
That is why on T4 cbcond was added. Traces showed that most instructions
in delay slot are nops.
Vladimir
>
> David
>
> On 2013-06-07, at 12:08 PM, Vladimir Kozlov <vladimir.kozlov at oracle.com> wrote:
>
>> On 6/7/13 8:56 AM, David Chase wrote:
>>> Wouldn't we want to call it ba_without_delay or something like that?
>>
>> It could be misleading since it could be interpreted as without delay slot. Our case is nop in delay slot which we should not execute.
>> We can use neutral name ba_long() as opposite to ba_short().
>>
>> Vladimir
>>
>>>
>>> David
>>>
>>> On 2013-06-07, at 11:47 AM, Vladimir Kozlov <vladimir.kozlov at oracle.com> wrote:
>>>
>>>> David is right.
>>>>
>>>> We have a lot of places in sparc code where we are sloppy with annulled bit for direct branch and nop() in delay slot. I count about 10 cases which br() instruction and 15 with ba() which is not really bad.
>>>>
>>>> We need separate macroassembler instruction for such case.
>>>> ba_with_nop()?
>>>>
>>>> Good starter task :)
>>>>
>>>> Thanks,
>>>> Vladimir
>>>>
>>>> On 6/7/13 4:59 AM, David Chase wrote:
>>>>> Huh. ba,a (annulled branch -- if I recall, the sense of the annulled bit is reversed for ba) ought to get the job done without the delay-slot nop.
>>>>>
>>>>> David
>>>>>
>>>>> On 2013-06-07, at 6:54 AM, Morris Meyer <morris.meyer at oracle.com> wrote:
>>>>>
>>>>>> I needed to have the delayed()->nop() in there as ba() crashed for me.
>>>>>>
>>>>>>
>>>>>> --mm
>>>>>>
>>>>>>
>>>>>> On Jun 7, 2013, at 12:35 AM, Vladimir Kozlov <vladimir.kozlov at oracle.com> wrote:
>>>>>>
>>>>>>> Morris,
>>>>>>>
>>>>>>> Why you used br(always, false, pt, slow_case) instead of ba(slow_case)?
>>>>>>>
>>>>>>> Which is the same but simpler and it was specially added to avoid messing with parameters of br() instruction.
>>>>>>>
>>>>>>> Thanks,
>>>>>>> Vladimir
>>>>>>>
>>>>>>> On 6/6/13 9:22 PM, Morris Meyer wrote:
>>>>>>>> Folks,
>>>>>>>>
>>>>>>>> Could I get a review for this issue? The problem exists that we
>>>>>>>> optimistically assign forward branch labels and re-patch later. When we
>>>>>>>> emit a cbcond instruction - we check if the Label out of bounds. If it
>>>>>>>> is already bound the check is fine - if not bound a zero offset is
>>>>>>>> emitted and the label is patched later
>>>>>>>>
>>>>>>>> With Vladimir Kozlov's urgings I put about 4,000 lines of changes to add
>>>>>>>> __FILE__ and __LINE__ parameters to every assembler.bind() call and
>>>>>>>> checked the return of every patched branch to find out the line and
>>>>>>>> location of the offending bind. The bind distance from
>>>>>>>> NewInstanceStub::emit_code() in c1_CodeStubs_sparc.cpp was to far from
>>>>>>>> __ allocate_object macro assembler call in LIRGenerator::new_instance
>>>>>>>> which uses the short branch in MacroAssembler::eden_allocate()
>>>>>>>>
>>>>>>>> This change has been through JPRT.
>>>>>>>>
>>>>>>>> --morris
>>>>>>>>
>>>>>>>> WEBREV - http://cr.openjdk.java.net/~morris/JDK-8015437.01
>>>>>>>> JBS - https://jbs.oracle.com/bugs/browse/JDK-8015437
>>>>>>>>
>>>>>>>>
>>>>>
>>>
>
More information about the hotspot-compiler-dev
mailing list