Request for review (L): 6797305: Add LoadUB and LoadUI opcode class
Tom Rodriguez
Thomas.Rodriguez at Sun.COM
Wed Mar 11 19:16:47 PDT 2009
> The current class Address for sparc is designed to support manually
> specified helper instructions (sethi, etc.), unless the disp is
> simm13. For that reason, it provides much control, and is awkward
> to use when you don't want that much control.
>
> Adding in scale and index is a stretch away from what sparc does
> natively. If we want to make that truly work, we'll need an
> Address::_temp to specify the temp register (e.g., O7) to use for
> intermediate calculations. The AD file can use O7 uniformly.
I don't think we want to support magic in the Address form for use by
the AD file since we can properly control the offset ranges we want to
handle. Building a more general code generation facility to make it
less error prone to write sparc assembler with unknown offsets is a
separate activity and I wouldn't want to merge the two together. I
think an Address form that handles only either reg/reg or reg/simm13
is all we should support.
tom
> We already emit extra helper instructions behind the scenes in the
> AD file: see the role of O7 for non-simm13 offsets due to large
> stack frames.
>
> Here are some more thoughts about pseudo-addressing for sparc:
>
> If a function is named 'lduw' or some other sparc opcode, it should
> *not* emit helpers behind the scenes. That includes cases where
> scale>0, disp is not simm13, and (disp != 0 && index != noreg).
>
> We have a few automagic "helperized" pseudos, like 'load_contents'.
> (I don't like that name, because 'contents' is not descriptive
> enough. It is a pre-LP64 name choice, I think. Instead, I suggest
> 'load_uw' or some such.) If we want to use such pseudos more
> widely, we should name them more regularly, as 'load_sb',
> 'load_ptr', 'load_x' or some such.
>
> If we go that way, I hope the _hi, _hi32, _low32 can be persuaded to
> vanish. Address::_disp should be intptr_t not int.
>
> In that case, _scale>0 could make sense, as would reg+reg+disp
> modes. They would be mainly useful in hand-written code, since the
> C2 compiler will continue to control the formation of addresses in
> detail.
>
>> The only problem I see when using MacroAssembler instructions in
>> sparc.ad is the VerifyOops check in emit_form3_mem_reg. Is that
>> still
>> used/necessary or can it be moved somewhere else?
>
> Go ahead and nuke that code for now.
>
> On Mar 10, 2009, at 10:46 AM, Christian Thalinger wrote:
>
>> On Tue, 2009-03-10 at 10:26 -0700, John Rose wrote:
>>>
>>> There is something like that already in assembler_sparc.hpp:
>>> inline void lduw( const Address& a, Register d, int offset =
>>> 0 );
>>>
>>> I thought you were talking about making Address easier to use...?
>>
>> Right, and I didn't know if that is the same as on x86, is it? I
>> was a
>> bit confused because of the relocate() call.
>
> No it isn't helperized, so it only works for simm13 displacements.
> The relocate call emits a relocation for the simm13 field. If you
> supply a larger offset (or a real pointer!) you need to manually
> emit the right kind of sethi helper (for LP64 or !LP64).
>
>> And do these functions handle reg-reg loads properly too?
>>
>>> If you just want to add a +4 offset, you can use the optional offset
>>> argument above.
>>
>> Sounds good.
>>
>>> If you want to fold the offset into the Address itself, use
>>> Address::plus_disp (which is new).
>>
>> Sounds good too. I will have a try.
>
>
> Just adding Address::_index would be fine for those instructions.
> You could use the RegisterConstant overloadings to generate the code
> without adding more 'if' statements:
>
> inline void Assembler::lduw( const Address& a, Register d, int
> offset ) { relocate(a.rspec(offset)); lduw( a.base(),
> a.disp_or_index(offset), d ); }
>
> RegisterConstant Address::disp_or_index(int offset=0) {
> if (_index != noreg) { assert(_disp + offset == 0, "no reg+reg
> +disp"); return RegisterConstant(_index); }
> else return RegisterConstant(_disp + offset);
> }
>
> I hope this helps...
>
> -- John
More information about the hotspot-compiler-dev
mailing list