Correcting typo in my previous email. On Sat, Apr 25, 2020 at 3:21 PM William Tambe <tambewilliam@xxxxxxxxx> 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); > if (GET_CODE (op0) == MEM) > arg0 = gen_rtx_MEM (SImode, arg0); > operands[0] = arg0; > } > emit_insn (gen__movsi (operands[0], operands[1])); > DONE; > })