public inbox for gcc-help@gcc.gnu.org
 help / color / mirror / Atom feed
From: Richard Sandiford <richard.sandiford@arm.com>
To: William Tambe via Gcc-help <gcc-help@gcc.gnu.org>
Subject: Re: how to use emit_clobber () ?
Date: Mon, 27 Apr 2020 08:46:21 +0100	[thread overview]
Message-ID: <mpty2qh1icy.fsf@arm.com> (raw)
In-Reply-To: <CAF8i9mO_f5A_U+oFO1bqJEtpS3YJAqt7ThOKvzo5+CvSXMS8AA@mail.gmail.com> (William Tambe via Gcc-help's message of "Sat, 25 Apr 2020 15:52:59 -0400")

William Tambe via Gcc-help <gcc-help@gcc.gnu.org> writes:
> Correcting typo in my previous email.
>
> On Sat, Apr 25, 2020 at 3:21 PM William Tambe <tambewilliam@gmail.com> wrote:
>>
>> The following define_expand is used to generate a call to
>> __tls_get_addr() when the first operand of movsi is detected as a TLS
>> symbol by tls_symbol_operand().
>>
>> I am trying to accomplish generating a call to __tls_get_addr()
>> passing two arguments in two registers where I would like to clobber
>> the first register argument.
>>
>> However the use of emit_clobber() has no effect.
>>
>> Any idea, how emit_clobber should be used below ?
>>
>> (define_expand "movsi"
>>  [(set (match_operand:SI 0 "nonimmediate_operand" "")
>>        (match_operand:SI 1 "general_operand"      ""))]
>>  ""
>>  {
>>    rtx op0 = operands[0];
>>    rtx op1 = operands[1];
>>    if (tls_symbolic_operand (op0, VOIDmode)) {
>>      rtx arg0 = gen_rtx_REG (SImode, ARCH_FIRST_ARG_REGNUM);
>>      rtx arg1 = gen_rtx_REG (SImode, ARCH_FIRST_ARG_REGNUM+1);
>>      emit_insn (arg1);
>>      emit_clobber (gen__movsi (arg0, op0));
>
> Above is incorrect; what I am using is below:
>      emit_clobber (arg1);
>      emit_insn (gen__movsi (arg0, op0));
>
> Question remain the same; any idea how emit_clobber should be used in
> order to have an effect ?
>
>>      rtx fn = gen_rtx_MEM (FUNCTION_MODE, gen_arch_tga());
>>      rtx_insn *insn = emit_call_insn (gen_call_value (arg0, fn, const0_rtx));
>>      RTL_CONST_CALL_P (insn) = 1;
>>      use_reg (&CALL_INSN_FUNCTION_USAGE (insn), arg0);
>>      use_reg (&CALL_INSN_FUNCTION_USAGE (insn), arg1);

The last line says that the call uses the current value of arg1, but
nothing in the above seems to set arg1 to a real value.

What is the clobber of arg1 meant to model?  I.e. what actually clobbers
arg1?  Is it the call itself?  If so, is arg1 normally preserved by
calls on this target?  If arg1 is normally preserved by calls, you can
make an exception for this call by adding a CLOBBER (rather than a USE)
to the CALL_INSN_FUNCTION_USAGE.  If arg1 is normally clobbered by calls,
you shouldn't need to do anything special.

On most targets, the __tls_get_addr function preserves many more
registers than the normal ABI, so it is often better not to represent
it as a call_insn.  E.g. arm.md has:

;; tls descriptor call
(define_insn "tlscall"
  [(set (reg:SI R0_REGNUM)
        (unspec:SI [(reg:SI R0_REGNUM)
                    (match_operand:SI 0 "" "X")
	            (match_operand 1 "" "")] UNSPEC_TLS))
   (clobber (reg:SI R1_REGNUM))
   (clobber (reg:SI LR_REGNUM))
   (clobber (reg:SI CC_REGNUM))]
  "TARGET_GNU2_TLS"
  {
    targetm.asm_out.internal_label (asm_out_file, "LPIC",
				    INTVAL (operands[1]));
    return "bl\\t%c0(tlscall)";
  }
  [(set_attr "conds" "clob")
   (set_attr "length" "4")
   (set_attr "type" "branch")]
)

which says that only R0, R1, LR and CC are clobbered by the call.

Thanks,
Richard

      reply	other threads:[~2020-04-27  7:46 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-04-25 19:21 William Tambe
2020-04-25 19:52 ` William Tambe
2020-04-27  7:46   ` Richard Sandiford [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=mpty2qh1icy.fsf@arm.com \
    --to=richard.sandiford@arm.com \
    --cc=gcc-help@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).