Help with generating library call
Rohit Arul Raj
rohitarulraj at gmail.com
Wed Aug 2 15:32:23 UTC 2017
On Mon, Jul 31, 2017 at 1:48 PM, Andrew Haley <aph at redhat.com> wrote:
> On 31/07/17 05:33, Rohit Arul Raj wrote:
>> Can any one point me in the right direction? Any reference to similar
>> implementation of any other C or Math library function will be
>> helpful?
>>
>> I ended up doing the following, but not sure if this is the right way
>> to go about it.
>> push (c_rarg2);
>> push (c_rarg1);
>> push (c_rarg0);
>> call_VM_leaf(CAST_FROM_FN_PTR(address, memset),3);
>
> This doesn't look totally wrong.
>
> There are many examples in the source. For example, look at any calls
> to MacroAssembler::call_VM and call_VM_leaf. Be aware, however, that
> if you're calling this from compiled code most registers are live so
> you're going to have to be extremely careful to save and restore them.
> One of the advantages of using HotSpot's builtins for zeroing is that
> we can know exactly which registers are used.
>
> --
> Andrew Haley
> Java Platform Lead Engineer
> Red Hat UK Ltd. <https://www.redhat.com>
> EAC8 43EB D3EF DB98 CC77 2FAD A5CD 6035 332F A671
Thanks Andrew, I managed to generate the required instructions. But
while generating the code (from the interpreter), the instructions are
getting re-ordered. Is there a way to generate a sequence of
instructions without breaking the chain?
Any suggestions?
push (base_ptr);
push (c_rarg0);
push (c_rarg1);
push (c_rarg2);
if (base_ptr != c_rarg0)
{
if (base_ptr != c_rarg2) {
movq(c_rarg0, base_ptr);
if (cnt_dwords != c_rarg2)
movq(c_rarg2, cnt_dwords);
}
else {
if (cnt_dwords != c_rarg2)
movq(c_rarg2, cnt_dwords);
movq(c_rarg0, base_ptr);
}
}
else {
if (cnt_dwords != c_rarg2)
movq(c_rarg2, cnt_dwords);
}
addq(c_rarg0, disp);
xorl (c_rarg1, c_rarg1);
call_VM_leaf(CAST_FROM_FN_PTR(address, memset), c_rarg0, c_rarg1, c_rarg2);
pop (c_rarg2);
pop (c_rarg1);
pop (c_rarg0);
pop (base_ptr);
Regards,
Rohit
More information about the hotspot-dev
mailing list