/* Target machine subroutines for TI PRU.
   Copyright (C) 2014-2021 Free Software Foundation, Inc.
   Dimitar Dimitrov <dimitar@dinux.eu>

   This file is part of GCC.

   GCC is free software; you can redistribute it and/or modify it
   under the terms of the GNU General Public License as published
   by the Free Software Foundation; either version 3, or (at your
   option) any later version.

   GCC is distributed in the hope that it will be useful, but WITHOUT
   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
   License for more details.

   You should have received a copy of the GNU General Public License
   along with GCC; see the file COPYING3.  If not see
   <http://www.gnu.org/licenses/>.  */

#define IN_TARGET_CODE 1

#include "config.h"
#include "system.h"
#include "coretypes.h"
#include "backend.h"
#include "target.h"
#include "rtl.h"
#include "tree.h"
#include "stringpool.h"
#include "attribs.h"
#include "df.h"
#include "memmodel.h"
#include "tm_p.h"
#include "optabs.h"
#include "regs.h"
#include "emit-rtl.h"
#include "recog.h"
#include "diagnostic-core.h"
#include "output.h"
#include "insn-attr.h"
#include "flags.h"
#include "explow.h"
#include "calls.h"
#include "varasm.h"
#include "expr.h"
#include "toplev.h"
#include "langhooks.h"
#include "cfgrtl.h"
#include "stor-layout.h"
#include "dumpfile.h"
#include "builtins.h"
#include "pru-protos.h"

/* This file should be included last.  */
#include "target-def.h"

#define INIT_ARRAY_ENTRY_BYTES	2

/* Global PRU CTABLE entries, filled in by pragmas, and used for fast
   addressing via LBCO/SBCO instructions.  */
struct pru_ctable_entry pru_ctable[32];

/* Forward function declarations.  */
static bool prologue_saved_reg_p (int);
static void pru_reorg_loop (rtx_insn *);

struct GTY (()) machine_function
{
  /* Current frame information, to be filled in by pru_compute_frame_layout
     with register save masks, and offsets for the current function.  */

  /* Mask of registers to save.  */
  HARD_REG_SET save_mask;
  /* Number of bytes that the entire frame takes up.  */
  int total_size;
  /* Number of bytes that variables take up.  */
  int var_size;
  /* Number of bytes that outgoing arguments take up.  */
  int out_args_size;
  /* Number of bytes needed to store registers in frame.  */
  int save_reg_size;
  /* Offset from new stack pointer to store registers.  */
  int save_regs_offset;
  /* True if final frame layout is already calculated.  */
  bool initialized;
  /* Number of doloop tags used so far.  */
  int doloop_tags;
  /* True if the last tag was allocated to a doloop_end.  */
  bool doloop_tag_from_end;
};

/* Stack layout and calling conventions.

   The PRU ABI defines r4 as Argument Pointer.  GCC implements the same
   semantics, but represents it with HARD_FRAME_POINTER_REGNUM and
   names it FP.  The stack layout is shown below:

       ---------------------- high address
	| incoming args
       ------call-boundary---
	| pretend_args	    ^
    FP ----------------     | total
	| save_regs	    | frame
	---------------	    | size
	| local vars	    |
	---------------	    |
	| outgoing args     V
    SP ---------------------- low address

 */

#define PRU_STACK_ALIGN(LOC)  ROUND_UP ((LOC), STACK_BOUNDARY / BITS_PER_UNIT)

/* Implement TARGET_COMPUTE_FRAME_LAYOUT.  */
static void
pru_compute_frame_layout (void)
{
  int regno;
  HARD_REG_SET *save_mask;
  int total_size;
  int var_size;
  int out_args_size;
  int save_reg_size;

  gcc_assert (!cfun->machine->initialized);

  save_mask = &cfun->machine->save_mask;
  CLEAR_HARD_REG_SET (*save_mask);

  var_size = PRU_STACK_ALIGN ((HOST_WIDE_INT) get_frame_size ());
  out_args_size = PRU_STACK_ALIGN ((HOST_WIDE_INT) crtl->outgoing_args_size);
  total_size = var_size + out_args_size;

  /* Calculate space needed for gp registers.  */
  save_reg_size = 0;
  for (regno = 0; regno <= LAST_GP_REGNUM; regno++)
    if (prologue_saved_reg_p (regno))
      {
	SET_HARD_REG_BIT (*save_mask, regno);
	save_reg_size += 1;
      }

  save_reg_size = PRU_STACK_ALIGN (save_reg_size);
  total_size += save_reg_size;
  total_size += PRU_STACK_ALIGN (crtl->args.pretend_args_size);

  /* Save other computed information.  */
  cfun->machine->total_size = total_size;
  cfun->machine->var_size = var_size;
  cfun->machine->out_args_size = out_args_size;
  cfun->machine->save_reg_size = save_reg_size;
  cfun->machine->initialized = reload_completed;
  cfun->machine->save_regs_offset = out_args_size + var_size;
}

/* Emit efficient RTL equivalent of ADD3 with the given const_int for
   frame-related registers.
     op0	  - Destination register.
     op1	  - First addendum operand (a register).
     addendum	  - Second addendum operand (a constant).
     kind	  - Note kind.  REG_NOTE_MAX if no note must be added.
 */
static rtx
pru_add3_frame_adjust (rtx op0, rtx op1, int addendum,
		       const enum reg_note kind)
{
  rtx insn;

  rtx op0_adjust = gen_rtx_SET (op0, plus_constant (Pmode, op1, addendum));

  if (UBYTE_INT (addendum) || UBYTE_INT (-addendum))
    insn = emit_insn (op0_adjust);
  else
    {
      /* Help the compiler to cope with an arbitrary integer constant.
	 Reload has finished so we can't expect the compiler to
	 auto-allocate a temporary register.  But we know that call-saved
	 registers are not live yet, so we utilize them.  */
      rtx tmpreg = gen_rtx_REG (Pmode, PROLOGUE_TEMP_REGNUM);
      if (addendum < 0)
	{
	  emit_insn (gen_rtx_SET (tmpreg, gen_int_mode (-addendum, Pmode)));
	  insn = emit_insn (gen_sub3_insn (op0, op1, tmpreg));
	}
      else
	{
	  emit_insn (gen_rtx_SET (tmpreg, gen_int_mode (addendum, Pmode)));
	  insn = emit_insn (gen_add3_insn (op0, op1, tmpreg));
	}
    }

  /* Attach a note indicating what happened.  */
  if (kind != REG_NOTE_MAX)
    add_reg_note (insn, kind, copy_rtx (op0_adjust));

  RTX_FRAME_RELATED_P (insn) = 1;

  return insn;
}

/* Add a const_int to the stack pointer register.  */
static rtx
pru_add_to_sp (int addendum, const enum reg_note kind)
{
  return pru_add3_frame_adjust (stack_pointer_rtx, stack_pointer_rtx,
				addendum, kind);
}

/* Helper function used during prologue/epilogue.  Emits a single LBBO/SBBO
   instruction for load/store of the next group of consecutive registers.  */
static int
xbbo_next_reg_cluster (int regno_start, int *sp_offset, bool do_store)
{
  int regno, nregs, i;
  rtx addr;
  rtx_insn *insn;

  nregs = 0;

  /* Skip the empty slots.  */
  for (; regno_start <= LAST_GP_REGNUM;)
    if (TEST_HARD_REG_BIT (cfun->machine->save_mask, regno_start))
      break;
    else
      regno_start++;

  /* Find the largest consecutive group of registers to save.  */
  for (regno = regno_start; regno <= LAST_GP_REGNUM;)
    if (TEST_HARD_REG_BIT (cfun->machine->save_mask, regno))
      {
	regno++;
	nregs++;
      }
    else
      break;

  if (!nregs)
    return -1;

  gcc_assert (UBYTE_INT (*sp_offset));

  /* Ok, save this bunch.  */
  addr = plus_constant (Pmode, stack_pointer_rtx, *sp_offset);

  if (do_store)
    insn = targetm.gen_store_multiple (gen_frame_mem (BLKmode, addr),
				       gen_rtx_REG (QImode, regno_start),
				       GEN_INT (nregs));
  else
    insn = targetm.gen_load_multiple (gen_rtx_REG (QImode, regno_start),
				      gen_frame_mem (BLKmode, addr),
				      GEN_INT (nregs));

  gcc_assert (reload_completed);
  gcc_assert (insn);
  emit_insn (insn);

  /* Tag as frame-related.  */
  RTX_FRAME_RELATED_P (insn) = 1;

  if (!do_store)
    {
      /* Tag epilogue unwind notes.  */
      for (i = regno_start; i < (regno_start + nregs); i++)
	add_reg_note (insn, REG_CFA_RESTORE, gen_rtx_REG (QImode, i));
    }

  /* Increment and save offset in anticipation of the next register group.  */
  *sp_offset += nregs * UNITS_PER_WORD;

  return regno_start + nregs;
}

/* Emit function prologue.  */
void
pru_expand_prologue (void)
{
  int regno_start;
  int total_frame_size;
  int sp_offset;      /* Offset from base_reg to final stack value.  */
  int save_regs_base; /* Offset from base_reg to register save area.  */
  int save_offset;    /* Temporary offset to currently saved register group.  */

  total_frame_size = cfun->machine->total_size;

  if (flag_stack_usage_info)
    current_function_static_stack_size = total_frame_size;

  /* Decrement the stack pointer.  */
  if (!UBYTE_INT (total_frame_size))
    {
      /* We need an intermediary point, this will point at the spill block.  */
      pru_add_to_sp (cfun->machine->save_regs_offset - total_frame_size,
		     REG_NOTE_MAX);
      save_regs_base = 0;
      sp_offset = -cfun->machine->save_regs_offset;
    }
  else if (total_frame_size)
    {
      pru_add_to_sp (- total_frame_size, REG_NOTE_MAX);
      save_regs_base = cfun->machine->save_regs_offset;
      sp_offset = 0;
    }
  else
    save_regs_base = sp_offset = 0;

  regno_start = 0;
  save_offset = save_regs_base;
  do
    regno_start = xbbo_next_reg_cluster (regno_start, &save_offset, true);
  while (regno_start >= 0);

  /* Set FP before adjusting SP.  This way fp_offset has
     better chance to fit in UBYTE.  */
  if (frame_pointer_needed)
    {
      int fp_offset = total_frame_size
	- crtl->args.pretend_args_size
	+ sp_offset;

      pru_add3_frame_adjust (hard_frame_pointer_rtx, stack_pointer_rtx,
			     fp_offset, REG_NOTE_MAX);
    }

  if (sp_offset)
    pru_add_to_sp (sp_offset, REG_FRAME_RELATED_EXPR);

  /* If we are profiling, make sure no instructions are scheduled before
     the call to mcount.  */
  if (crtl->profile)
    emit_insn (gen_blockage ());
}

/* Emit function epilogue.  */
void
pru_expand_epilogue (bool sibcall_p)
{
  int total_frame_size;
  int sp_adjust, save_offset;
  int regno_start;

  if (!sibcall_p && pru_can_use_return_insn ())
    {
      emit_jump_insn (gen_return ());
      return;
    }

  emit_insn (gen_blockage ());

  total_frame_size = cfun->machine->total_size;

  if (frame_pointer_needed)
    {
      /* Recover the stack pointer.  */
      pru_add3_frame_adjust (stack_pointer_rtx, hard_frame_pointer_rtx,
			     - cfun->machine->save_reg_size,
			     REG_CFA_ADJUST_CFA);

      save_offset = 0;
      sp_adjust = total_frame_size - cfun->machine->save_regs_offset;
    }
  else if (!UBYTE_INT (total_frame_size))
    {
      pru_add_to_sp (cfun->machine->save_regs_offset, REG_CFA_ADJUST_CFA);
      save_offset = 0;
      sp_adjust = total_frame_size - cfun->machine->save_regs_offset;
    }
  else
    {
      save_offset = cfun->machine->save_regs_offset;
      sp_adjust = total_frame_size;
    }

  regno_start = 0;
  do
    regno_start = xbbo_next_reg_cluster (regno_start, &save_offset, false);
  while (regno_start >= 0);

  /* Emit a blockage insn here to keep these insns from being moved to
     an earlier spot in the epilogue.

     This is necessary as we must not cut the stack back before all the
     restores are finished.  */
  emit_insn (gen_blockage ());

  if (sp_adjust)
    pru_add_to_sp (sp_adjust, REG_CFA_ADJUST_CFA);

  if (!sibcall_p)
    emit_jump_insn (gen_simple_return ());
}

/* Implement RETURN_ADDR_RTX.  Note, we do not support moving
   back to a previous frame.  */
rtx
pru_get_return_address (int count)
{
  if (count != 0)
    return NULL_RTX;

  /* Return r3.w2.  */
  return get_hard_reg_initial_val (HImode, RA_REGNUM);
}

/* Implement FUNCTION_PROFILER macro.  */
void
pru_function_profiler (FILE *file, int labelno ATTRIBUTE_UNUSED)
{
  fprintf (file, "\tmov\tr1, ra\n");
  fprintf (file, "\tcall\t_mcount\n");
  fprintf (file, "\tmov\tra, r1\n");
}

/* Dump stack layout.  */
static void
pru_dump_frame_layout (FILE *file)
{
  fprintf (file, "\t%s Current Frame Info\n", ASM_COMMENT_START);
  fprintf (file, "\t%s total_size = %d\n", ASM_COMMENT_START,
	   cfun->machine->total_size);
  fprintf (file, "\t%s var_size = %d\n", ASM_COMMENT_START,
	   cfun->machine->var_size);
  fprintf (file, "\t%s out_args_size = %d\n", ASM_COMMENT_START,
	   cfun->machine->out_args_size);
  fprintf (file, "\t%s save_reg_size = %d\n", ASM_COMMENT_START,
	   cfun->machine->save_reg_size);
  fprintf (file, "\t%s initialized = %d\n", ASM_COMMENT_START,
	   cfun->machine->initialized);
  fprintf (file, "\t%s save_regs_offset = %d\n", ASM_COMMENT_START,
	   cfun->machine->save_regs_offset);
  fprintf (file, "\t%s is_leaf = %d\n", ASM_COMMENT_START,
	   crtl->is_leaf);
  fprintf (file, "\t%s frame_pointer_needed = %d\n", ASM_COMMENT_START,
	   frame_pointer_needed);
  fprintf (file, "\t%s pretend_args_size = %d\n", ASM_COMMENT_START,
	   crtl->args.pretend_args_size);
}

/* Return true if REGNO should be saved in the prologue.  */
static bool
prologue_saved_reg_p (int regno)
{
  gcc_assert (GP_REG_P (regno));

  if (df_regs_ever_live_p (regno) && !call_used_or_fixed_reg_p (regno))
    return true;

  /* 32-bit FP.  */
  if (frame_pointer_needed
      && regno >= HARD_FRAME_POINTER_REGNUM
      && regno < HARD_FRAME_POINTER_REGNUM + GET_MODE_SIZE (Pmode))
    return true;

  /* 16-bit RA.  */
  if (regno == RA_REGNUM && df_regs_ever_live_p (RA_REGNUM))
    return true;
  if (regno == RA_REGNUM + 1 && df_regs_ever_live_p (RA_REGNUM + 1))
    return true;

  return false;
}

/* Implement TARGET_CAN_ELIMINATE.  */
static bool
pru_can_eliminate (const int from ATTRIBUTE_UNUSED, const int to)
{
  if (to == STACK_POINTER_REGNUM)
    return !frame_pointer_needed;
  return true;
}

/* Implement INITIAL_ELIMINATION_OFFSET macro.  */
int
pru_initial_elimination_offset (int from, int to)
{
  int offset;

  /* Set OFFSET to the offset from the stack pointer.  */
  switch (from)
    {
    case FRAME_POINTER_REGNUM:
      offset = cfun->machine->out_args_size;
      break;

    case ARG_POINTER_REGNUM:
      offset = cfun->machine->total_size;
      offset -= crtl->args.pretend_args_size;
      break;

    default:
      gcc_unreachable ();
    }

  /* If we are asked for the frame pointer offset, then adjust OFFSET
     by the offset from the frame pointer to the stack pointer.  */
  if (to == HARD_FRAME_POINTER_REGNUM)
    offset -= cfun->machine->total_size - crtl->args.pretend_args_size;


  return offset;
}

/* Return nonzero if this function is known to have a null epilogue.
   This allows the optimizer to omit jumps to jumps if no stack
   was created.  */
int
pru_can_use_return_insn (void)
{
  if (!reload_completed || crtl->profile)
    return 0;

  return cfun->machine->total_size == 0;
}

/* Implement TARGET_HARD_REGNO_MODE_OK.  */

static bool
pru_hard_regno_mode_ok (unsigned int regno, machine_mode mode)
{
  switch (GET_MODE_SIZE (mode))
    {
    case 1: return true;
    case 2: return (regno % 4) <= 2;
    case 4: return (regno % 4) == 0;
    case 8: return (regno % 4) == 0;
    case 16: return (regno % 4) == 0; /* Not sure why TImode is used.  */
    case 32: return (regno % 4) == 0; /* Not sure why CTImode is used.  */
    default:
      /* TODO: Find out why VOIDmode and BLKmode are passed.  */
      gcc_assert (mode == BLKmode || mode == VOIDmode);
      return (regno % 4) == 0;
    }
}

/* Implement `TARGET_HARD_REGNO_SCRATCH_OK'.
   Returns true if REGNO is safe to be allocated as a scratch
   register (for a define_peephole2) in the current function.  */

static bool
pru_hard_regno_scratch_ok (unsigned int regno)
{
  /* Don't allow hard registers that might be part of the frame pointer.
     Some places in the compiler just test for [HARD_]FRAME_POINTER_REGNUM
     and don't handle a frame pointer that spans more than one register.
     TODO: Fix those faulty places.  */

  if ((!reload_completed || frame_pointer_needed)
      && (IN_RANGE (regno, HARD_FRAME_POINTER_REGNUM,
		    HARD_FRAME_POINTER_REGNUM + 3)
	  || IN_RANGE (regno, FRAME_POINTER_REGNUM,
		       FRAME_POINTER_REGNUM + 3)))
    return false;

  return true;
}


/* Worker function for `HARD_REGNO_RENAME_OK'.
   Return nonzero if register OLD_REG can be renamed to register NEW_REG.  */

int
pru_hard_regno_rename_ok (unsigned int old_reg,
			  unsigned int new_reg)
{
  /* Don't allow hard registers that might be part of the frame pointer.
     Some places in the compiler just test for [HARD_]FRAME_POINTER_REGNUM
     and don't care for a frame pointer that spans more than one register.
     TODO: Fix those faulty places.  */
  if ((!reload_completed || frame_pointer_needed)
      && (IN_RANGE (old_reg, HARD_FRAME_POINTER_REGNUM,
		    HARD_FRAME_POINTER_REGNUM + 3)
	  || IN_RANGE (old_reg, FRAME_POINTER_REGNUM,
		       FRAME_POINTER_REGNUM + 3)
	  || IN_RANGE (new_reg, HARD_FRAME_POINTER_REGNUM,
		       HARD_FRAME_POINTER_REGNUM + 3)
	  || IN_RANGE (new_reg, FRAME_POINTER_REGNUM,
		       FRAME_POINTER_REGNUM + 3)))
    return 0;

  return 1;
}

/* Allocate a chunk of memory for per-function machine-dependent data.  */
static struct machine_function *
pru_init_machine_status (void)
{
  return ggc_cleared_alloc<machine_function> ();
}

/* Implement TARGET_OPTION_OVERRIDE.  */
static void
pru_option_override (void)
{
#ifdef SUBTARGET_OVERRIDE_OPTIONS
  SUBTARGET_OVERRIDE_OPTIONS;
#endif

  /* Check for unsupported options.  */
  if (flag_pic == 1)
    warning (OPT_fpic, "%<-fpic%> is not supported");
  if (flag_pic == 2)
    warning (OPT_fPIC, "%<-fPIC%> is not supported");
  if (flag_pie == 1)
    warning (OPT_fpie, "%<-fpie%> is not supported");
  if (flag_pie == 2)
    warning (OPT_fPIE, "%<-fPIE%> is not supported");

  /* QBxx conditional branching cannot cope with block reordering.  */
  if (flag_reorder_blocks_and_partition)
    {
      inform (input_location, "%<-freorder-blocks-and-partition%> "
			      "not supported on this architecture");
      flag_reorder_blocks_and_partition = 0;
      flag_reorder_blocks = 1;
    }

  /* Function to allocate machine-dependent function status.  */
  init_machine_status = &pru_init_machine_status;

  /* Save the initial options in case the user does function specific
     options.  */
  target_option_default_node = target_option_current_node
    = build_target_option_node (&global_options, &global_options_set);

  /* Due to difficulties in implementing the TI ABI with GCC,
     at least check and error-out if GCC cannot compile a
     compliant output.  */
  pru_register_abicheck_pass ();
}

/* Compute a (partial) cost for rtx X.  Return true if the complete
   cost has been computed, and false if subexpressions should be
   scanned.  In either case, *TOTAL contains the cost result.  */
static bool
pru_rtx_costs (rtx x, machine_mode mode,
	       int outer_code, int opno ATTRIBUTE_UNUSED,
	       int *total, bool speed ATTRIBUTE_UNUSED)
{
  const int code = GET_CODE (x);

  switch (code)
    {
    case CONST_INT:
      if ((mode == VOIDmode && UBYTE_INT (INTVAL (x)))
	  || (mode != VOIDmode && const_ubyte_operand (x, mode)))
	{
	  *total = COSTS_N_INSNS (0);
	  return true;
	}
      else if ((mode == VOIDmode && UHWORD_INT (INTVAL (x)))
	       || (mode != VOIDmode && const_uhword_operand (x, mode)))
	{
	  *total = COSTS_N_INSNS (1);
	  return true;
	}
      else if (outer_code == MEM && ctable_addr_operand (x, VOIDmode))
	{
	  *total = COSTS_N_INSNS (0);
	  return true;
	}
      else
	{
	  *total = COSTS_N_INSNS (2);
	  return true;
	}

    case LABEL_REF:
    case SYMBOL_REF:
    case CONST:
      {
	*total = COSTS_N_INSNS (1);
	return true;
      }
    case CONST_DOUBLE:
      {
	*total = COSTS_N_INSNS (2);
	return true;
      }
    case CONST_WIDE_INT:
      {
	/* PRU declares no vector or very large integer types.  */
	gcc_unreachable ();
	return true;
      }
    case SET:
      {
	int factor;

	/* A SET doesn't have a mode, so let's look at the SET_DEST to get
	   the mode for the factor.  */
	mode = GET_MODE (SET_DEST (x));

	/* SI move has the same cost as a QI move.  Moves larger than
	   64 bits are costly.  */
	factor = CEIL (GET_MODE_SIZE (mode), GET_MODE_SIZE (SImode));
	*total = factor * COSTS_N_INSNS (1);

	return false;
      }

    case MULT:
      {
	/* Factor in that "mul" requires fixed registers, which
	   would likely require register moves.  */
	*total = COSTS_N_INSNS (7);
	return false;
      }
    case PLUS:
      {
	rtx op0 = XEXP (x, 0);
	rtx op1 = XEXP (x, 1);
	machine_mode op1_mode = GET_MODE (op1);

	/* Generic RTL address expressions do not enforce mode for
	   offsets, yet our UBYTE constraint requires it.  Fix it here.  */
	if (op1_mode == VOIDmode && CONST_INT_P (op1) && outer_code == MEM)
	  op1_mode = Pmode;
	if (outer_code == MEM
	    && ((REG_P (op0) && reg_or_ubyte_operand (op1, op1_mode))
		|| ctable_addr_operand (op0, VOIDmode)
		|| ctable_addr_operand (op1, VOIDmode)
		|| (ctable_base_operand (op0, VOIDmode) && REG_P (op1))
		|| (ctable_base_operand (op1, VOIDmode) && REG_P (op0))))
	  {
	    /* CTABLE or REG base addressing - PLUS comes for free.  */
	    *total = COSTS_N_INSNS (0);
	    return true;
	  }
	else
	  {
	    *total = COSTS_N_INSNS (1);
	    return false;
	  }
	}
    case SIGN_EXTEND:
      {
	*total = COSTS_N_INSNS (3);
	return false;
      }
    case ASHIFTRT:
      {
	rtx op1 = XEXP (x, 1);
	if (const_1_operand (op1, VOIDmode))
	  *total = COSTS_N_INSNS (3);
	else
	  *total = COSTS_N_INSNS (7);
	return false;
      }
    case ZERO_EXTRACT:
      {
	rtx op2 = XEXP (x, 2);
	if ((outer_code == EQ || outer_code == NE)
	    && CONST_INT_P (op2)
	    && INTVAL (op2) == 1)
	  {
	    /* Branch if bit is set/clear is a single instruction.  */
	    *total = COSTS_N_INSNS (0);
	    return true;
	  }
	else
	  {
	    *total = COSTS_N_INSNS (2);
	    return false;
	  }
      }
    case ZERO_EXTEND:
      {
	*total = COSTS_N_INSNS (0);
	return false;
      }

    default:
      {
	/* PRU ALU is 32 bit, despite GCC's UNITS_PER_WORD=1.  */
	int factor = CEIL (GET_MODE_SIZE (mode), GET_MODE_SIZE (SImode));
	*total = factor * COSTS_N_INSNS (1);
	return false;
      }
    }
}

static GTY(()) rtx eqdf_libfunc;
static GTY(()) rtx nedf_libfunc;
static GTY(()) rtx ledf_libfunc;
static GTY(()) rtx ltdf_libfunc;
static GTY(()) rtx gedf_libfunc;
static GTY(()) rtx gtdf_libfunc;
static GTY(()) rtx eqsf_libfunc;
static GTY(()) rtx nesf_libfunc;
static GTY(()) rtx lesf_libfunc;
static GTY(()) rtx ltsf_libfunc;
static GTY(()) rtx gesf_libfunc;
static GTY(()) rtx gtsf_libfunc;

/* Implement the TARGET_INIT_LIBFUNCS macro.  We use this to rename library
   functions to match the PRU ABI.  */

static void
pru_init_libfuncs (void)
{
  /* Double-precision floating-point arithmetic.  */
  set_optab_libfunc (add_optab, DFmode, "__pruabi_addd");
  set_optab_libfunc (sdiv_optab, DFmode, "__pruabi_divd");
  set_optab_libfunc (smul_optab, DFmode, "__pruabi_mpyd");
  set_optab_libfunc (neg_optab, DFmode, "__pruabi_negd");
  set_optab_libfunc (sub_optab, DFmode, "__pruabi_subd");

  /* Single-precision floating-point arithmetic.  */
  set_optab_libfunc (add_optab, SFmode, "__pruabi_addf");
  set_optab_libfunc (sdiv_optab, SFmode, "__pruabi_divf");
  set_optab_libfunc (smul_optab, SFmode, "__pruabi_mpyf");
  set_optab_libfunc (neg_optab, SFmode, "__pruabi_negf");
  set_optab_libfunc (sub_optab, SFmode, "__pruabi_subf");

  /* Floating-point comparisons.  */
  eqsf_libfunc = init_one_libfunc ("__pruabi_eqf");
  nesf_libfunc = init_one_libfunc ("__pruabi_neqf");
  lesf_libfunc = init_one_libfunc ("__pruabi_lef");
  ltsf_libfunc = init_one_libfunc ("__pruabi_ltf");
  gesf_libfunc = init_one_libfunc ("__pruabi_gef");
  gtsf_libfunc = init_one_libfunc ("__pruabi_gtf");
  eqdf_libfunc = init_one_libfunc ("__pruabi_eqd");
  nedf_libfunc = init_one_libfunc ("__pruabi_neqd");
  ledf_libfunc = init_one_libfunc ("__pruabi_led");
  ltdf_libfunc = init_one_libfunc ("__pruabi_ltd");
  gedf_libfunc = init_one_libfunc ("__pruabi_ged");
  gtdf_libfunc = init_one_libfunc ("__pruabi_gtd");

  /* In PRU ABI, much like other TI processors, floating point
     comparisons return non-standard values.  This quirk is handled
     by disabling the optab library functions, and handling the
     comparison during RTL expansion.  */
  set_optab_libfunc (eq_optab, SFmode, NULL);
  set_optab_libfunc (ne_optab, SFmode, NULL);
  set_optab_libfunc (gt_optab, SFmode, NULL);
  set_optab_libfunc (ge_optab, SFmode, NULL);
  set_optab_libfunc (lt_optab, SFmode, NULL);
  set_optab_libfunc (le_optab, SFmode, NULL);
  set_optab_libfunc (eq_optab, DFmode, NULL);
  set_optab_libfunc (ne_optab, DFmode, NULL);
  set_optab_libfunc (gt_optab, DFmode, NULL);
  set_optab_libfunc (ge_optab, DFmode, NULL);
  set_optab_libfunc (lt_optab, DFmode, NULL);
  set_optab_libfunc (le_optab, DFmode, NULL);

  /* The isunordered function appears to be supported only by GCC.  */
  set_optab_libfunc (unord_optab, SFmode, "__pruabi_unordf");
  set_optab_libfunc (unord_optab, DFmode, "__pruabi_unordd");

  /* Floating-point to integer conversions.  */
  set_conv_libfunc (sfix_optab, SImode, DFmode, "__pruabi_fixdi");
  set_conv_libfunc (ufix_optab, SImode, DFmode, "__pruabi_fixdu");
  set_conv_libfunc (sfix_optab, DImode, DFmode, "__pruabi_fixdlli");
  set_conv_libfunc (ufix_optab, DImode, DFmode, "__pruabi_fixdull");
  set_conv_libfunc (sfix_optab, SImode, SFmode, "__pruabi_fixfi");
  set_conv_libfunc (ufix_optab, SImode, SFmode, "__pruabi_fixfu");
  set_conv_libfunc (sfix_optab, DImode, SFmode, "__pruabi_fixflli");
  set_conv_libfunc (ufix_optab, DImode, SFmode, "__pruabi_fixfull");

  /* Conversions between floating types.  */
  set_conv_libfunc (trunc_optab, SFmode, DFmode, "__pruabi_cvtdf");
  set_conv_libfunc (sext_optab, DFmode, SFmode, "__pruabi_cvtfd");

  /* Integer to floating-point conversions.  */
  set_conv_libfunc (sfloat_optab, DFmode, SImode, "__pruabi_fltid");
  set_conv_libfunc (ufloat_optab, DFmode, SImode, "__pruabi_fltud");
  set_conv_libfunc (sfloat_optab, DFmode, DImode, "__pruabi_fltllid");
  set_conv_libfunc (ufloat_optab, DFmode, DImode, "__pruabi_fltulld");
  set_conv_libfunc (sfloat_optab, SFmode, SImode, "__pruabi_fltif");
  set_conv_libfunc (ufloat_optab, SFmode, SImode, "__pruabi_fltuf");
  set_conv_libfunc (sfloat_optab, SFmode, DImode, "__pruabi_fltllif");
  set_conv_libfunc (ufloat_optab, SFmode, DImode, "__pruabi_fltullf");

  /* Long long.  */
  set_optab_libfunc (ashr_optab, DImode, "__pruabi_asrll");
  set_optab_libfunc (smul_optab, DImode, "__pruabi_mpyll");
  set_optab_libfunc (ashl_optab, DImode, "__pruabi_lslll");
  set_optab_libfunc (lshr_optab, DImode, "__pruabi_lsrll");

  set_optab_libfunc (sdiv_optab, SImode, "__pruabi_divi");
  set_optab_libfunc (udiv_optab, SImode, "__pruabi_divu");
  set_optab_libfunc (smod_optab, SImode, "__pruabi_remi");
  set_optab_libfunc (umod_optab, SImode, "__pruabi_remu");
  set_optab_libfunc (sdivmod_optab, SImode, "__pruabi_divremi");
  set_optab_libfunc (udivmod_optab, SImode, "__pruabi_divremu");
  set_optab_libfunc (sdiv_optab, DImode, "__pruabi_divlli");
  set_optab_libfunc (udiv_optab, DImode, "__pruabi_divull");
  set_optab_libfunc (smod_optab, DImode, "__pruabi_remlli");
  set_optab_libfunc (umod_optab, DImode, "__pruabi_remull");
  set_optab_libfunc (udivmod_optab, DImode, "__pruabi_divremull");
}


/* Emit comparison instruction if necessary, returning the expression
   that holds the compare result in the proper mode.  Return the comparison
   that should be used in the jump insn.  */

rtx
pru_expand_fp_compare (rtx comparison, machine_mode mode)
{
  enum rtx_code code = GET_CODE (comparison);
  rtx op0 = XEXP (comparison, 0);
  rtx op1 = XEXP (comparison, 1);
  rtx cmp;
  enum rtx_code jump_code = code;
  machine_mode op_mode = GET_MODE (op0);
  rtx_insn *insns;
  rtx libfunc;

  gcc_assert (op_mode == DFmode || op_mode == SFmode);

  /* FP exceptions are not raised by PRU's softfp implementation.  So the
     following transformations are safe.  */
  if (code == UNGE)
    {
      code = LT;
      jump_code = EQ;
    }
  else if (code == UNLE)
    {
      code = GT;
      jump_code = EQ;
    }
  else
    jump_code = NE;

  switch (code)
    {
    case EQ:
      libfunc = op_mode == DFmode ? eqdf_libfunc : eqsf_libfunc;
      break;
    case NE:
      libfunc = op_mode == DFmode ? nedf_libfunc : nesf_libfunc;
      break;
    case GT:
      libfunc = op_mode == DFmode ? gtdf_libfunc : gtsf_libfunc;
      break;
    case GE:
      libfunc = op_mode == DFmode ? gedf_libfunc : gesf_libfunc;
      break;
    case LT:
      libfunc = op_mode == DFmode ? ltdf_libfunc : ltsf_libfunc;
      break;
    case LE:
      libfunc = op_mode == DFmode ? ledf_libfunc : lesf_libfunc;
      break;
    default:
      gcc_unreachable ();
    }
  start_sequence ();

  cmp = emit_library_call_value (libfunc, 0, LCT_CONST, SImode,
				 op0, op_mode, op1, op_mode);
  insns = get_insns ();
  end_sequence ();

  emit_libcall_block (insns, cmp, cmp,
		      gen_rtx_fmt_ee (code, SImode, op0, op1));

  return gen_rtx_fmt_ee (jump_code, mode, cmp, const0_rtx);
}

/* Return the sign bit position for given OP's mode.  */
static int
sign_bit_position (const rtx op)
{
  const int sz = GET_MODE_SIZE (GET_MODE (op));

  return sz * 8 - 1;
}

/* Output asm code for sign_extend operation.  */
const char *
pru_output_sign_extend (rtx *operands)
{
  static char buf[512];
  int bufi;
  const int dst_sz = GET_MODE_SIZE (GET_MODE (operands[0]));
  const int src_sz = GET_MODE_SIZE (GET_MODE (operands[1]));
  char ext_start;

  switch (src_sz)
    {
    case 1: ext_start = 'y'; break;
    case 2: ext_start = 'z'; break;
    default: gcc_unreachable ();
    }

  gcc_assert (dst_sz > src_sz);

  /* Note that src and dst can be different parts of the same
     register, e.g. "r7, r7.w1".  */
  bufi = snprintf (buf, sizeof (buf),
	  "mov\t%%0, %%1\n\t"		      /* Copy AND make positive.  */
	  "qbbc\t.+8, %%0, %d\n\t"	      /* Check sign bit.  */
	  "fill\t%%%c0, %d",		      /* Make negative.  */
	  sign_bit_position (operands[1]),
	  ext_start,
	  dst_sz - src_sz);

  gcc_assert (bufi > 0);
  gcc_assert ((unsigned int) bufi < sizeof (buf));

  return buf;
}

/* Branches and compares.  */

/* PRU's ALU does not support signed comparison operations.  That's why we
   emulate them.  By first checking the sign bit and handling every possible
   operand sign combination, we can simulate signed comparisons in just
   5 instructions.  See table below.

.-------------------.---------------------------------------------------.
| Operand sign bit  | Mapping the signed comparison to an unsigned one  |
|---------+---------+------------+------------+------------+------------|
| OP1.b31 | OP2.b31 | OP1 < OP2  | OP1 <= OP2 | OP1 > OP2  | OP1 >= OP2 |
|---------+---------+------------+------------+------------+------------|
| 0       | 0       | OP1 < OP2  | OP1 <= OP2 | OP1 > OP2  | OP1 >= OP2 |
|---------+---------+------------+------------+------------+------------|
| 0       | 1       | false      | false      | true       | true       |
|---------+---------+------------+------------+------------+------------|
| 1       | 0       | true       | true       | false      | false      |
|---------+---------+------------+------------+------------+------------|
| 1       | 1       | OP1 < OP2  | OP1 <= OP2 | OP1 > OP2  | OP1 >= OP2 |
`---------'---------'------------'------------'------------+------------'


Given the table above, here is an example for a concrete op:
  LT:
		    qbbc OP1_POS, OP1, 31
  OP1_NEG:	    qbbc BRANCH_TAKEN_LABEL, OP2, 31
  OP1_NEG_OP2_NEG:  qblt BRANCH_TAKEN_LABEL, OP2, OP1
		    ; jmp OUT -> can be eliminated because we'll take the
		    ; following branch.  OP2.b31 is guaranteed to be 1
		    ; by the time we get here.
  OP1_POS:	    qbbs OUT, OP2, 31
  OP1_POS_OP2_POS:  qblt BRANCH_TAKEN_LABEL, OP2, OP1
#if FAR_JUMP
		    jmp OUT
BRANCH_TAKEN_LABEL: jmp REAL_BRANCH_TAKEN_LABEL
#endif
  OUT:

*/

/* Output asm code for a signed-compare LT/LE conditional branch.  */
static const char *
pru_output_ltle_signed_cbranch (rtx *operands, bool is_near)
{
  static char buf[1024];
  enum rtx_code code = GET_CODE (operands[0]);
  rtx op1;
  rtx op2;
  const char *cmp_opstr;
  int bufi = 0;

  op1 = operands[1];
  op2 = operands[2];

  gcc_assert (GET_CODE (op1) == REG && GET_CODE (op2) == REG);

  /* Determine the comparison operators for positive and negative operands.  */
  if (code == LT)
    cmp_opstr = "qblt";
  else if (code == LE)
    cmp_opstr = "qble";
  else
    gcc_unreachable ();

  if (is_near)
    bufi = snprintf (buf, sizeof (buf),
		     "qbbc\t.+12, %%1, %d\n\t"
		     "qbbc\t%%l3, %%2, %d\n\t"  /* OP1_NEG.  */
		     "%s\t%%l3, %%2, %%1\n\t"   /* OP1_NEG_OP2_NEG.  */
		     "qbbs\t.+8, %%2, %d\n\t"   /* OP1_POS.  */
		     "%s\t%%l3, %%2, %%1",	/* OP1_POS_OP2_POS.  */
		     sign_bit_position (op1),
		     sign_bit_position (op2),
		     cmp_opstr,
		     sign_bit_position (op2),
		     cmp_opstr);
  else
    bufi = snprintf (buf, sizeof (buf),
		     "qbbc\t.+12, %%1, %d\n\t"
		     "qbbc\t.+20, %%2, %d\n\t"  /* OP1_NEG.  */
		     "%s\t.+16, %%2, %%1\n\t"   /* OP1_NEG_OP2_NEG.  */
		     "qbbs\t.+16, %%2, %d\n\t"  /* OP1_POS.  */
		     "%s\t.+8, %%2, %%1\n\t"    /* OP1_POS_OP2_POS.  */
		     "jmp\t.+8\n\t"		/* jmp OUT.  */
		     "jmp\t%%%%label(%%l3)",	/* BRANCH_TAKEN_LABEL.  */
		     sign_bit_position (op1),
		     sign_bit_position (op2),
		     cmp_opstr,
		     sign_bit_position (op2),
		     cmp_opstr);

  gcc_assert (bufi > 0);
  gcc_assert ((unsigned int) bufi < sizeof (buf));

  return buf;
}

/* Output asm code for a signed-compare GT/GE conditional branch.  */
static const char *
pru_output_gtge_signed_cbranch (rtx *operands, bool is_near)
{
  static char buf[1024];
  enum rtx_code code = GET_CODE (operands[0]);
  rtx op1;
  rtx op2;
  const char *cmp_opstr;
  int bufi = 0;

  op1 = operands[1];
  op2 = operands[2];

  gcc_assert (GET_CODE (op1) == REG && GET_CODE (op2) == REG);

  /* Determine the comparison operators for positive and negative operands.  */
  if (code == GT)
    cmp_opstr = "qbgt";
  else if (code == GE)
    cmp_opstr = "qbge";
  else
    gcc_unreachable ();

  if (is_near)
    bufi = snprintf (buf, sizeof (buf),
		     "qbbs\t.+12, %%1, %d\n\t"
		     "qbbs\t%%l3, %%2, %d\n\t"  /* OP1_POS.  */
		     "%s\t%%l3, %%2, %%1\n\t"   /* OP1_POS_OP2_POS.  */
		     "qbbc\t.+8, %%2, %d\n\t"   /* OP1_NEG.  */
		     "%s\t%%l3, %%2, %%1",      /* OP1_NEG_OP2_NEG.  */
		     sign_bit_position (op1),
		     sign_bit_position (op2),
		     cmp_opstr,
		     sign_bit_position (op2),
		     cmp_opstr);
  else
    bufi = snprintf (buf, sizeof (buf),
		     "qbbs\t.+12, %%1, %d\n\t"
		     "qbbs\t.+20, %%2, %d\n\t"  /* OP1_POS.  */
		     "%s\t.+16, %%2, %%1\n\t"   /* OP1_POS_OP2_POS.  */
		     "qbbc\t.+16, %%2, %d\n\t"  /* OP1_NEG.  */
		     "%s\t.+8, %%2, %%1\n\t"    /* OP1_NEG_OP2_NEG.  */
		     "jmp\t.+8\n\t"		/* jmp OUT.  */
		     "jmp\t%%%%label(%%l3)",	/* BRANCH_TAKEN_LABEL.  */
		     sign_bit_position (op1),
		     sign_bit_position (op2),
		     cmp_opstr,
		     sign_bit_position (op2),
		     cmp_opstr);

  gcc_assert (bufi > 0);
  gcc_assert ((unsigned int) bufi < sizeof (buf));

  return buf;
}

/* Output asm code for a signed-compare conditional branch.

   If IS_NEAR is true, then QBBx instructions may be used for reaching
   the destination label.  Otherwise JMP is used, at the expense of
   increased code size.  */
const char *
pru_output_signed_cbranch (rtx *operands, bool is_near)
{
  enum rtx_code code = GET_CODE (operands[0]);

  if (code == LT || code == LE)
    return pru_output_ltle_signed_cbranch (operands, is_near);
  else if (code == GT || code == GE)
    return pru_output_gtge_signed_cbranch (operands, is_near);
  else
    gcc_unreachable ();
}

/* Optimized version of pru_output_signed_cbranch for constant second
   operand.  */

const char *
pru_output_signed_cbranch_ubyteop2 (rtx *operands, bool is_near)
{
  static char buf[1024];
  enum rtx_code code = GET_CODE (operands[0]);
  int regop_sign_bit_pos = sign_bit_position (operands[1]);
  const char *cmp_opstr;
  const char *rcmp_opstr;

  /* We must swap operands due to PRU's demand OP1 to be the immediate.  */
  code = swap_condition (code);

  /* Determine normal and reversed comparison operators for both positive
     operands.  This enables us to go completely unsigned.

     NOTE: We cannot use the R print modifier because we convert signed
     comparison operators to unsigned ones.  */
  switch (code)
    {
    case LT: cmp_opstr = "qblt"; rcmp_opstr = "qbge"; break;
    case LE: cmp_opstr = "qble"; rcmp_opstr = "qbgt"; break;
    case GT: cmp_opstr = "qbgt"; rcmp_opstr = "qble"; break;
    case GE: cmp_opstr = "qbge"; rcmp_opstr = "qblt"; break;
    default: gcc_unreachable ();
    }

  /* OP2 is a constant unsigned byte - utilize this info to generate
     optimized code.  We can "remove half" of the op table above because
     we know that OP2.b31 = 0 (remember that 0 <= OP2 <= 255).  */
  if (code == LT || code == LE)
    {
      if (is_near)
	snprintf (buf, sizeof (buf),
		  "qbbs\t.+8, %%1, %d\n\t"
		  "%s\t%%l3, %%1, %%u2",
		  regop_sign_bit_pos,
		  cmp_opstr);
      else
	snprintf (buf, sizeof (buf),
		  "qbbs\t.+12, %%1, %d\n\t"
		  "%s\t.+8, %%1, %%u2\n\t"
		  "jmp\t%%%%label(%%l3)",
		  regop_sign_bit_pos,
		  rcmp_opstr);
    }
  else if (code == GT || code == GE)
    {
      if (is_near)
	snprintf (buf, sizeof (buf),
		  "qbbs\t%%l3, %%1, %d\n\t"
		  "%s\t%%l3, %%1, %%u2",
		  regop_sign_bit_pos,
		  cmp_opstr);
      else
	snprintf (buf, sizeof (buf),
		  "qbbs\t.+8, %%1, %d\n\t"
		  "%s\t.+8, %%1, %%u2\n\t"
		  "jmp\t%%%%label(%%l3)",
		  regop_sign_bit_pos,
		  rcmp_opstr);
    }
  else
    gcc_unreachable ();

  return buf;
}

/* Optimized version of pru_output_signed_cbranch_ubyteop2 for constant
   zero second operand.  */

const char *
pru_output_signed_cbranch_zeroop2 (rtx *operands, bool is_near)
{
  static char buf[1024];
  enum rtx_code code = GET_CODE (operands[0]);
  int regop_sign_bit_pos = sign_bit_position (operands[1]);

  /* OP2 is a constant zero - utilize this info to simply check the
     OP1 sign bit when comparing for LT or GE.  */
  if (code == LT)
    {
      if (is_near)
	snprintf (buf, sizeof (buf),
		  "qbbs\t%%l3, %%1, %d\n\t",
		  regop_sign_bit_pos);
      else
	snprintf (buf, sizeof (buf),
		  "qbbc\t.+8, %%1, %d\n\t"
		  "jmp\t%%%%label(%%l3)",
		  regop_sign_bit_pos);
    }
  else if (code == GE)
    {
      if (is_near)
	snprintf (buf, sizeof (buf),
		  "qbbc\t%%l3, %%1, %d\n\t",
		  regop_sign_bit_pos);
      else
	snprintf (buf, sizeof (buf),
		  "qbbs\t.+8, %%1, %d\n\t"
		  "jmp\t%%%%label(%%l3)",
		  regop_sign_bit_pos);
    }
  else
    gcc_unreachable ();

  return buf;
}

/* Addressing Modes.  */

/* Return true if register REGNO is a valid base register.
   STRICT_P is true if REG_OK_STRICT is in effect.  */

bool
pru_regno_ok_for_base_p (int regno, bool strict_p)
{
  if (!HARD_REGISTER_NUM_P (regno) && !strict_p)
    return true;

  /* The fake registers will be eliminated to either the stack or
     hard frame pointer, both of which are usually valid base registers.
     Reload deals with the cases where the eliminated form isn't valid.  */
  return (GP_REG_P (regno)
	  || regno == FRAME_POINTER_REGNUM
	  || regno == ARG_POINTER_REGNUM);
}

/* Return true if given xbbo constant OFFSET is valid.  */
static bool
pru_valid_const_ubyte_offset (machine_mode mode, HOST_WIDE_INT offset)
{
  bool valid = UBYTE_INT (offset);

  /* Reload can split multi word accesses, so make sure we can address
     the second word in a DI.  */
  if (valid && GET_MODE_SIZE (mode) > GET_MODE_SIZE (SImode))
    valid = UBYTE_INT (offset + GET_MODE_SIZE (mode) - 1);

  return valid;
}

/* Recognize a CTABLE base address.  Return CTABLE entry index, or -1 if
   base was not found in the pragma-filled pru_ctable.  */
int
pru_get_ctable_exact_base_index (unsigned HOST_WIDE_INT caddr)
{
  unsigned int i;

  for (i = 0; i < ARRAY_SIZE (pru_ctable); i++)
    {
      if (pru_ctable[i].valid && pru_ctable[i].base == caddr)
	return i;
    }
  return -1;
}


/* Check if the given address can be addressed via CTABLE_BASE + UBYTE_OFFS,
   and return the base CTABLE index if possible.  */
int
pru_get_ctable_base_index (unsigned HOST_WIDE_INT caddr)
{
  unsigned int i;

  for (i = 0; i < ARRAY_SIZE (pru_ctable); i++)
    {
      if (pru_ctable[i].valid && IN_RANGE (caddr,
					   pru_ctable[i].base,
					   pru_ctable[i].base + 0xff))
	return i;
    }
  return -1;
}


/* Return the offset from some CTABLE base for this address.  */
int
pru_get_ctable_base_offset (unsigned HOST_WIDE_INT caddr)
{
  int i;

  i = pru_get_ctable_base_index (caddr);
  gcc_assert (i >= 0);

  return caddr - pru_ctable[i].base;
}

/* Return true if the address expression formed by BASE + OFFSET is
   valid.

   Note that the following address is not handled here:
	  base CTABLE constant base + UBYTE constant offset
   The constants will be folded.  The ctable_addr_operand predicate will take
   care of the validation.  The CTABLE base+offset split will happen during
   operand printing.  */
static bool
pru_valid_addr_expr_p (machine_mode mode, rtx base, rtx offset, bool strict_p)
{
  if (!strict_p && GET_CODE (base) == SUBREG)
    base = SUBREG_REG (base);
  if (!strict_p && GET_CODE (offset) == SUBREG)
    offset = SUBREG_REG (offset);

  if (REG_P (base)
      && pru_regno_ok_for_base_p (REGNO (base), strict_p)
      && ((CONST_INT_P (offset)
	      && pru_valid_const_ubyte_offset (mode, INTVAL (offset)))
	  || (REG_P (offset)
	      && pru_regno_ok_for_index_p (REGNO (offset), strict_p))))
    /*     base register + register offset
     * OR  base register + UBYTE constant offset.  */
    return true;
  else if (REG_P (base)
	   && pru_regno_ok_for_index_p (REGNO (base), strict_p)
	   && ctable_base_operand (offset, VOIDmode))
    /*     base CTABLE constant base + register offset
     * Note: GCC always puts the register as a first operand of PLUS.  */
    return true;
  else
    return false;
}

/* Return register number (either for r30 or r31) which maps to the
   corresponding symbol OP's name in the __regio_symbol address namespace.

   If no mapping can be established (i.e. symbol name is invalid), then
   return -1.  */
int pru_symref2ioregno (rtx op)
{
  if (!SYMBOL_REF_P (op))
    return -1;

  const char *name = XSTR (op, 0);
  if (!strcmp (name, "__R30"))
    return R30_REGNUM;
  else if (!strcmp (name, "__R31"))
    return R31_REGNUM;
  else
    return -1;
}

/* Implement TARGET_ADDR_SPACE_LEGITIMATE_ADDRESS_P.  */
static bool
pru_addr_space_legitimate_address_p (machine_mode mode, rtx operand,
				     bool strict_p, addr_space_t as)
{
  if (as == ADDR_SPACE_REGIO)
    {
      /*  Address space constraints for __regio_symbol have been checked in
	  TARGET_INSERT_ATTRIBUTES, and some more checks will be done
	  during RTL expansion of "mov<mode>".  */
      return true;
    }
  else if (as != ADDR_SPACE_GENERIC)
    {
      gcc_unreachable ();
    }

  switch (GET_CODE (operand))
    {
    /* Direct.  */
    case SYMBOL_REF:
    case LABEL_REF:
    case CONST:
    case CONST_WIDE_INT:
      return false;

    case CONST_INT:
      return ctable_addr_operand (operand, VOIDmode);

      /* Register indirect.  */
    case REG:
      return pru_regno_ok_for_base_p (REGNO (operand), strict_p);

      /* Register indirect with displacement.  */
    case PLUS:
      {
	rtx op0 = XEXP (operand, 0);
	rtx op1 = XEXP (operand, 1);

	return pru_valid_addr_expr_p (mode, op0, op1, strict_p);
      }

    default:
      break;
    }
  return false;
}

/* Output assembly language related definitions.  */

/* Implement TARGET_ASM_CONSTRUCTOR.  */
static void
pru_elf_asm_constructor (rtx symbol, int priority)
{
  char buf[23];
  section *s;

  if (priority == DEFAULT_INIT_PRIORITY)
    snprintf (buf, sizeof (buf), ".init_array");
  else
    {
      /* While priority is known to be in range [0, 65535], so 18 bytes
	 would be enough, the compiler might not know that.  To avoid
	 -Wformat-truncation false positive, use a larger size.  */
      snprintf (buf, sizeof (buf), ".init_array.%.5u", priority);
    }
  s = get_section (buf, SECTION_WRITE | SECTION_NOTYPE, NULL);
  switch_to_section (s);
  assemble_aligned_integer (INIT_ARRAY_ENTRY_BYTES, symbol);
}

/* Implement TARGET_ASM_DESTRUCTOR.  */
static void
pru_elf_asm_destructor (rtx symbol, int priority)
{
  char buf[23];
  section *s;

  if (priority == DEFAULT_INIT_PRIORITY)
    snprintf (buf, sizeof (buf), ".fini_array");
  else
    {
      /* While priority is known to be in range [0, 65535], so 18 bytes
	 would be enough, the compiler might not know that.  To avoid
	 -Wformat-truncation false positive, use a larger size.  */
      snprintf (buf, sizeof (buf), ".fini_array.%.5u", priority);
    }
  s = get_section (buf, SECTION_WRITE | SECTION_NOTYPE, NULL);
  switch_to_section (s);
  assemble_aligned_integer (INIT_ARRAY_ENTRY_BYTES, symbol);
}

/* Map rtx_code to unsigned PRU branch op suffix.  Callers must
   handle sign comparison themselves for signed operations.  */
static const char *
pru_comparison_str (enum rtx_code cond)
{
  switch (cond)
    {
    case NE:  return "ne";
    case EQ:  return "eq";
    case GEU: return "ge";
    case GTU: return "gt";
    case LEU: return "le";
    case LTU: return "lt";
    default: gcc_unreachable ();
    }
}

/* Access some RTX as INT_MODE.  If X is a CONST_FIXED we can get
   the bit representation of X by "casting" it to CONST_INT.  */

static rtx
pru_to_int_mode (rtx x)
{
  machine_mode mode = GET_MODE (x);

  return VOIDmode == mode
    ? x
    : simplify_gen_subreg (int_mode_for_mode (mode).require (), x, mode, 0);
}

/* Translate between the MachineDescription notion
   of 8-bit consecutive registers, to the PRU
   assembler syntax of REGWORD[.SUBREG].  */
static const char *
pru_asm_regname (rtx op)
{
  static char canon_reg_names[3][LAST_GP_REGNUM][8];
  int speci, regi;

  gcc_assert (REG_P (op));

  if (!canon_reg_names[0][0][0])
    {
      for (regi = 0; regi < LAST_GP_REGNUM; regi++)
	for (speci = 0; speci < 3; speci++)
	  {
	    const int sz = (speci == 0) ? 1 : ((speci == 1) ? 2 : 4);
	    if ((regi + sz) > (32 * 4))
	      continue;	/* Invalid entry.  */

	    /* Construct the lookup table.  */
	    const char *suffix = "";

	    switch ((sz << 8) | (regi % 4))
	      {
	      case (1 << 8) | 0: suffix = ".b0"; break;
	      case (1 << 8) | 1: suffix = ".b1"; break;
	      case (1 << 8) | 2: suffix = ".b2"; break;
	      case (1 << 8) | 3: suffix = ".b3"; break;
	      case (2 << 8) | 0: suffix = ".w0"; break;
	      case (2 << 8) | 1: suffix = ".w1"; break;
	      case (2 << 8) | 2: suffix = ".w2"; break;
	      case (4 << 8) | 0: suffix = ""; break;
	      default:
		/* Invalid entry.  */
		continue;
	      }
	    sprintf (&canon_reg_names[speci][regi][0],
		     "r%d%s", regi / 4, suffix);
	  }
    }

  switch (GET_MODE_SIZE (GET_MODE (op)))
    {
    case 1: speci = 0; break;
    case 2: speci = 1; break;
    case 4: speci = 2; break;
    case 8: speci = 2; break; /* Existing GCC test cases are not using %F.  */
    default: gcc_unreachable ();
    }
  regi = REGNO (op);
  gcc_assert (regi < LAST_GP_REGNUM);
  gcc_assert (canon_reg_names[speci][regi][0]);

  return &canon_reg_names[speci][regi][0];
}

/* Print the operand OP to file stream FILE modified by LETTER.
   LETTER can be one of:

     b: prints the register byte start (used by LBBO/SBBO).
     B: prints 'c' or 'b' for CTABLE or REG base in a memory address.
     F: Full 32-bit register.
     H: Higher 16-bits of a const_int operand.
     L: Lower 16-bits of a const_int operand.
     N: prints next 32-bit register (upper 32bits of a 64bit REG couple).
     P: prints swapped condition.
     Q: prints swapped and reversed condition.
     R: prints reversed condition.
     S: print operand mode size (but do not print the operand itself).
     T: print exact_log2 () for const_int operands.
     u: print QI constant integer as unsigned.  No transformation for regs.
     V: print exact_log2 () of negated const_int operands.
     w: Lower 32-bits of a const_int operand.
     W: Upper 32-bits of a const_int operand.
     y: print the next 8-bit register (regardless of op size).
     z: print the second next 8-bit register (regardless of op size).
*/
static void
pru_print_operand (FILE *file, rtx op, int letter)
{
  switch (letter)
    {
    case 'S':
      fprintf (file, "%d", GET_MODE_SIZE (GET_MODE (op)));
      return;

    default:
      break;
    }

  if (comparison_operator (op, VOIDmode))
    {
      enum rtx_code cond = GET_CODE (op);
      gcc_assert (!pru_signed_cmp_operator (op, VOIDmode));

      switch (letter)
	{
	case 0:
	  fprintf (file, "%s", pru_comparison_str (cond));
	  return;
	case 'P':
	  fprintf (file, "%s", pru_comparison_str (swap_condition (cond)));
	  return;
	case 'Q':
	  cond = swap_condition (cond);
	  /* Fall through.  */
	case 'R':
	  fprintf (file, "%s", pru_comparison_str (reverse_condition (cond)));
	  return;
	}
    }

  switch (GET_CODE (op))
    {
    case REG:
      if (letter == 0 || letter == 'u')
	{
	  fprintf (file, "%s", pru_asm_regname (op));
	  return;
	}
      else if (letter == 'b')
	{
	  if (REGNO (op) > LAST_NONIO_GP_REGNUM)
	    {
	      output_operand_lossage ("I/O register operand for '%%%c'",
				      letter);
	      return;
	    }
	  fprintf (file, "r%d.b%d", REGNO (op) / 4, REGNO (op) % 4);
	  return;
	}
      else if (letter == 'F' || letter == 'N')
	{
	  if (REGNO (op) > LAST_NONIO_GP_REGNUM - 1)
	    {
	      output_operand_lossage ("I/O register operand for '%%%c'",
				      letter);
	      return;
	    }
	  if (REGNO (op) % 4 != 0)
	    {
	      output_operand_lossage ("non 32 bit register operand for '%%%c'",
				      letter);
	      return;
	    }
	  fprintf (file, "r%d", REGNO (op) / 4 + (letter == 'N' ? 1 : 0));
	  return;
	}
      else if (letter == 'y')
	{
	  if (REGNO (op) > LAST_NONIO_GP_REGNUM - 1)
	    {
	      output_operand_lossage ("invalid operand for '%%%c'", letter);
	      return;
	    }
	  fprintf (file, "%s", reg_names[REGNO (op) + 1]);
	  return;
	}
      else if (letter == 'z')
	{
	  if (REGNO (op) > LAST_NONIO_GP_REGNUM - 2)
	    {
	      output_operand_lossage ("invalid operand for '%%%c'", letter);
	      return;
	    }
	  fprintf (file, "%s", reg_names[REGNO (op) + 2]);
	  return;
	}
      break;

    case CONST_INT:
      if (letter == 'H')
	{
	  HOST_WIDE_INT val = INTVAL (op);
	  val = (val >> 16) & 0xFFFF;
	  output_addr_const (file, gen_int_mode (val, SImode));
	  return;
	}
      else if (letter == 'L')
	{
	  HOST_WIDE_INT val = INTVAL (op);
	  val &= 0xFFFF;
	  output_addr_const (file, gen_int_mode (val, SImode));
	  return;
	}
      else if (letter == 'T')
	{
	  /* The predicate should have already validated the 1-high-bit
	     requirement.  Use CTZ here to deal with constant's sign
	     extension.  */
	  HOST_WIDE_INT val = wi::ctz (INTVAL (op));
	  if (val < 0 || val > 31)
	    {
	      output_operand_lossage ("invalid operand for '%%%c'", letter);
	      return;
	    }
	  output_addr_const (file, gen_int_mode (val, SImode));
	  return;
	}
      else if (letter == 'V')
	{
	  HOST_WIDE_INT val = wi::ctz (~INTVAL (op));
	  if (val < 0 || val > 31)
	    {
	      output_operand_lossage ("invalid operand for '%%%c'", letter);
	      return;
	    }
	  output_addr_const (file, gen_int_mode (val, SImode));
	  return;
	}
      else if (letter == 'w')
	{
	  HOST_WIDE_INT val = INTVAL (op) & 0xffffffff;
	  output_addr_const (file, gen_int_mode (val, SImode));
	  return;
	}
      else if (letter == 'W')
	{
	  HOST_WIDE_INT val = (INTVAL (op) >> 32) & 0xffffffff;
	  output_addr_const (file, gen_int_mode (val, SImode));
	  return;
	}
      else if (letter == 'u')
	{
	  /* Workaround GCC's representation of QI constants in sign-extended
	     form, and PRU's assembler insistence on unsigned constant
	     integers.  See the notes about O constraint.  */
	  fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (op) & 0xff);
	  return;
	}
      /* Else, fall through.  */

    case CONST:
    case LABEL_REF:
    case SYMBOL_REF:
      if (letter == 0)
	{
	  output_addr_const (file, op);
	  return;
	}
      break;

    case CONST_FIXED:
	{
	  HOST_WIDE_INT ival = INTVAL (pru_to_int_mode (op));
	  if (letter != 0)
	    output_operand_lossage ("unsupported code '%c' for fixed-point:",
				    letter);
	  fprintf (file, HOST_WIDE_INT_PRINT_DEC, ival);
	  return;
	}
      break;

    case CONST_DOUBLE:
      if (letter == 0)
	{
	  long val;

	  if (GET_MODE (op) != SFmode)
	    {
	      output_operand_lossage ("double constants not supported");
	      return;
	    }
	  REAL_VALUE_TO_TARGET_SINGLE (*CONST_DOUBLE_REAL_VALUE (op), val);
	  fprintf (file, "0x%lx", val);
	  return;
	}
      else if (letter == 'w' || letter == 'W')
	{
	  long t[2];
	  REAL_VALUE_TO_TARGET_DOUBLE (*CONST_DOUBLE_REAL_VALUE (op), t);
	  fprintf (file, "0x%lx", t[letter == 'w' ? 0 : 1]);
	  return;
	}
      else
	{
	  output_operand_lossage ("invalid operand for '%%%c'", letter);
	  return;
	}
      break;

    case SUBREG:
      /* Subregs should not appear at so late stage.  */
      gcc_unreachable ();
      break;

    case MEM:
      if (letter == 0)
	{
	  output_address (VOIDmode, op);
	  return;
	}
      else if (letter == 'B')
	{
	  rtx base = XEXP (op, 0);
	  if (GET_CODE (base) == PLUS)
	    {
	      rtx op0 = XEXP (base, 0);
	      rtx op1 = XEXP (base, 1);

	      /* PLUS cannot have two constant operands, so first one
		 of them must be a REG, hence we must check for an
		 exact base address.  */
	      if (ctable_base_operand (op1, VOIDmode))
		{
		  fprintf (file, "c");
		  return;
		}
	      else if (REG_P (op0))
		{
		  fprintf (file, "b");
		  return;
		}
	      else
		gcc_unreachable ();
	    }
	  else if (REG_P (base))
	    {
	      fprintf (file, "b");
	      return;
	    }
	  else if (ctable_addr_operand (base, VOIDmode))
	    {
	      fprintf (file, "c");
	      return;
	    }
	  else
	    gcc_unreachable ();
	}
      break;

    case CODE_LABEL:
      if (letter == 0)
	{
	  output_addr_const (file, op);
	  return;
	}
      break;

    default:
      break;
    }

  output_operand_lossage ("unsupported operand %s for code '%c'",
			  GET_RTX_NAME (GET_CODE (op)), letter);
}

/* Implement TARGET_PRINT_OPERAND_ADDRESS.  */
static void
pru_print_operand_address (FILE *file, machine_mode mode, rtx op)
{
  if (CONSTANT_ADDRESS_P (op) && text_segment_operand (op, VOIDmode))
    {
      output_operand_lossage ("unexpected text address:");
      return;
    }

  switch (GET_CODE (op))
    {
    case CONST:
    case LABEL_REF:
    case CONST_WIDE_INT:
    case SYMBOL_REF:
      break;

    case CONST_INT:
      {
	unsigned HOST_WIDE_INT caddr = INTVAL (op);
	int base = pru_get_ctable_base_index (caddr);
	int offs = pru_get_ctable_base_offset (caddr);
	if (base < 0)
	  {
	    output_operand_lossage ("unsupported constant address:");
	    return;
	  }
	fprintf (file, "%d, %d", base, offs);
	return;
      }
      break;

    case PLUS:
      {
	int base;
	rtx op0 = XEXP (op, 0);
	rtx op1 = XEXP (op, 1);

	if (REG_P (op0) && CONST_INT_P (op1)
	    && pru_get_ctable_exact_base_index (INTVAL (op1)) >= 0)
	  {
	    base = pru_get_ctable_exact_base_index (INTVAL (op1));
	    fprintf (file, "%d, %s", base, pru_asm_regname (op0));
	    return;
	  }
	else if (REG_P (op1) && CONST_INT_P (op0)
		 && pru_get_ctable_exact_base_index (INTVAL (op0)) >= 0)
	  {
	    /* Not a valid RTL.  */
	    gcc_unreachable ();
	  }
	else if (REG_P (op0) && CONSTANT_P (op1))
	  {
	    fprintf (file, "%s, ", pru_asm_regname (op0));
	    output_addr_const (file, op1);
	    return;
	  }
	else if (REG_P (op1) && CONSTANT_P (op0))
	  {
	    /* Not a valid RTL.  */
	    gcc_unreachable ();
	  }
	else if (REG_P (op1) && REG_P (op0))
	  {
	    fprintf (file, "%s, %s", pru_asm_regname (op0),
				     pru_asm_regname (op1));
	    return;
	  }
      }
      break;

    case REG:
      fprintf (file, "%s, 0", pru_asm_regname (op));
      return;

    case MEM:
      {
	rtx base = XEXP (op, 0);
	pru_print_operand_address (file, mode, base);
	return;
      }
    default:
      break;
    }

  output_operand_lossage ("unsupported memory expression:");
}

/* Implement TARGET_ASM_FUNCTION_PROLOGUE.  */
static void
pru_asm_function_prologue (FILE *file)
{
  if (flag_verbose_asm || flag_debug_asm)
    pru_dump_frame_layout (file);
}

/* Implement `TARGET_ASM_INTEGER'.
   Target hook for assembling integer objects.  PRU version needs
   special handling for references to pmem.  Code copied from AVR.  */

static bool
pru_assemble_integer (rtx x, unsigned int size, int aligned_p)
{
  if (size == POINTER_SIZE / BITS_PER_UNIT
      && aligned_p
      && text_segment_operand (x, VOIDmode))
    {
      fputs ("\t.4byte\t%pmem(", asm_out_file);
      output_addr_const (asm_out_file, x);
      fputs (")\n", asm_out_file);

      return true;
    }
  else if (size == INIT_ARRAY_ENTRY_BYTES
	   && aligned_p
	   && text_segment_operand (x, VOIDmode))
    {
      fputs ("\t.2byte\t%pmem(", asm_out_file);
      output_addr_const (asm_out_file, x);
      fputs (")\n", asm_out_file);

      return true;
    }
  else
    {
      return default_assemble_integer (x, size, aligned_p);
    }
}

/* Implement TARGET_ASM_FILE_START.  */

static void
pru_file_start (void)
{
  default_file_start ();

  /* Compiler will take care of placing %label, so there is no
     need to confuse users with this warning.  */
  fprintf (asm_out_file, "\t.set no_warn_regname_label\n");
}

/* Scan type TYP for pointer references to address space other than
   ADDR_SPACE_GENERIC.  Return true if such reference is found.
   Much of this code was taken from the avr port.  */

static bool
pru_nongeneric_pointer_addrspace (tree typ)
{
  while (ARRAY_TYPE == TREE_CODE (typ))
    typ = TREE_TYPE (typ);

  if (POINTER_TYPE_P (typ))
    {
      addr_space_t as;
      tree target = TREE_TYPE (typ);

      /* Pointer to function: Test the function's return type.  */
      if (FUNCTION_TYPE == TREE_CODE (target))
	return pru_nongeneric_pointer_addrspace (TREE_TYPE (target));

      /* "Ordinary" pointers... */

      while (TREE_CODE (target) == ARRAY_TYPE)
	target = TREE_TYPE (target);

      as = TYPE_ADDR_SPACE (target);

      if (!ADDR_SPACE_GENERIC_P (as))
	return true;

      /* Scan pointer's target type.  */
      return pru_nongeneric_pointer_addrspace (target);
    }

  return false;
}

/* Implement `TARGET_INSERT_ATTRIBUTES'.  For PRU it's used as a hook to
   provide better diagnostics for some invalid usages of the __regio_symbol
   address space.

   Any escapes of the following checks are supposed to be caught
   during the "mov<mode>" pattern expansion.  */

static void
pru_insert_attributes (tree node, tree *attributes ATTRIBUTE_UNUSED)
{

  /* Validate __regio_symbol variable declarations.  */
  if (VAR_P (node))
    {
      const char *name = DECL_NAME (node)
			  ? IDENTIFIER_POINTER (DECL_NAME (node))
			  : "<unknown>";
      tree typ = TREE_TYPE (node);
      addr_space_t as = TYPE_ADDR_SPACE (typ);

      if (as == ADDR_SPACE_GENERIC)
	return;

      if (AGGREGATE_TYPE_P (typ))
	{
	  error ("aggregate types are prohibited in "
		 "%<__regio_symbol%> address space");
	  /* Don't bother anymore.  Below checks would pile
	     meaningless errors, which would confuse user.  */
	  return;
	}
      if (DECL_INITIAL (node) != NULL_TREE)
	error ("variables in %<__regio_symbol%> address space "
	       "cannot have initial value");
      if (DECL_REGISTER (node))
	error ("variables in %<__regio_symbol%> address space "
	       "cannot be declared %<register%>");
      if (!TYPE_VOLATILE (typ))
	error ("variables in %<__regio_symbol%> address space "
	       "must be declared %<volatile%>");
      if (!DECL_EXTERNAL (node))
	error ("variables in %<__regio_symbol%> address space "
	       "must be declared %<extern%>");
      if (TYPE_MODE (typ) != SImode)
	error ("only 32-bit access is supported "
	       "for %<__regio_symbol%> address space");
      if (strcmp (name, "__R30") != 0 && strcmp (name, "__R31") != 0)
	error ("register name %<%s%> not recognized "
	       "in %<__regio_symbol%> address space", name);
    }

  tree typ = NULL_TREE;

  switch (TREE_CODE (node))
    {
    case FUNCTION_DECL:
      typ = TREE_TYPE (TREE_TYPE (node));
      break;
    case TYPE_DECL:
    case RESULT_DECL:
    case VAR_DECL:
    case FIELD_DECL:
    case PARM_DECL:
      typ = TREE_TYPE (node);
      break;
    case POINTER_TYPE:
      typ = node;
      break;
    default:
      break;
    }
  if (typ != NULL_TREE && pru_nongeneric_pointer_addrspace (typ))
    error ("pointers to %<__regio_symbol%> address space are prohibited");
}

/* Function argument related.  */

/* Return the number of bytes needed for storing an argument with
   the given MODE and TYPE.  */
static int
pru_function_arg_size (machine_mode mode, const_tree type)
{
  HOST_WIDE_INT param_size;

  if (mode == BLKmode)
    param_size = int_size_in_bytes (type);
  else
    param_size = GET_MODE_SIZE (mode);

  /* Convert to words (round up).  */
  param_size = (UNITS_PER_WORD - 1 + param_size) / UNITS_PER_WORD;
  gcc_assert (param_size >= 0);

  return param_size;
}

/* Check if argument with the given size must be
   passed/returned in a register.

   Reference:
   https://e2e.ti.com/support/development_tools/compiler/f/343/p/650176/2393029

   Arguments other than 8/16/24/32/64bits are passed on stack.  */
static bool
pru_arg_in_reg_bysize (size_t sz)
{
  return sz == 1 || sz == 2 || sz == 3 || sz == 4 || sz == 8;
}

/* Helper function to get the starting storage HW register for an argument,
   or -1 if it must be passed on stack.  The cum_v state is not changed.  */
static int
pru_function_arg_regi (cumulative_args_t cum_v,
		       machine_mode mode, const_tree type,
		       bool named)
{
  CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
  size_t argsize = pru_function_arg_size (mode, type);
  size_t i, bi;
  int regi = -1;

  if (!pru_arg_in_reg_bysize (argsize))
    return -1;

  if (!named)
    return -1;

  /* Find the first available slot that fits.  Yes, that's the PRU ABI.  */
  for (i = 0; regi < 0 && i < ARRAY_SIZE (cum->regs_used); i++)
    {
      /* VLAs and vector types are not defined in the PRU ABI.  Let's
	 handle them the same as their same-sized counterparts.  This way
	 we do not need to treat BLKmode differently, and need only to check
	 the size.  */
      gcc_assert (argsize == 1 || argsize == 2 || argsize == 3
		  || argsize == 4 || argsize == 8);

      /* Ensure SI and DI arguments are stored in full registers only.  */
      if ((argsize >= 4) && (i % 4) != 0)
	continue;

      /* Structures with size 24 bits are passed starting at a full
	 register boundary.  */
      if (argsize == 3 && (i % 4) != 0)
	continue;

      /* rX.w0/w1/w2 are OK.  But avoid spreading the second byte
	 into a different full register.  */
      if (argsize == 2 && (i % 4) == 3)
	continue;

      for (bi = 0;
	   bi < argsize && (bi + i) < ARRAY_SIZE (cum->regs_used);
	   bi++)
	{
	  if (cum->regs_used[bi + i])
	    break;
	}
      if (bi == argsize)
	regi = FIRST_ARG_REGNUM + i;
    }

  return regi;
}

/* Mark CUM_V that a function argument will occupy HW register slot starting
   at REGI.  The number of consecutive 8-bit HW registers marked as occupied
   depends on the MODE and TYPE of the argument.  */
static void
pru_function_arg_regi_mark_slot (int regi,
				 cumulative_args_t cum_v,
				 machine_mode mode, const_tree type,
				 bool named)
{
  CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
  HOST_WIDE_INT param_size = pru_function_arg_size (mode, type);

  gcc_assert (named);

  /* Mark all byte sub-registers occupied by argument as used.  */
  while (param_size--)
    {
      gcc_assert (regi >= FIRST_ARG_REGNUM && regi <= LAST_ARG_REGNUM);
      gcc_assert (!cum->regs_used[regi - FIRST_ARG_REGNUM]);
      cum->regs_used[regi - FIRST_ARG_REGNUM] = true;
      regi++;
    }
}

/* Define where to put the arguments to a function.  Value is zero to
   push the argument on the stack, or a hard register in which to
   store the argument.

   CUM is a variable of type CUMULATIVE_ARGS which gives info about
   the preceding args and about the function being called.
   ARG is a description of the argument.  */

static rtx
pru_function_arg (cumulative_args_t cum_v, const function_arg_info &arg)
{
  rtx return_rtx = NULL_RTX;
  int regi = pru_function_arg_regi (cum_v, arg.mode, arg.type, arg.named);

  if (regi >= 0)
    return_rtx = gen_rtx_REG (arg.mode, regi);

  return return_rtx;
}

/* Implement TARGET_ARG_PARTIAL_BYTES.  PRU never splits any arguments
   between registers and memory, so we can return 0.  */

static int
pru_arg_partial_bytes (cumulative_args_t, const function_arg_info &)
{
  return 0;
}

/* Update the data in CUM to advance over argument ARG.  */

static void
pru_function_arg_advance (cumulative_args_t cum_v,
			  const function_arg_info &arg)
{
  int regi = pru_function_arg_regi (cum_v, arg.mode, arg.type, arg.named);

  if (regi >= 0)
    pru_function_arg_regi_mark_slot (regi, cum_v, arg.mode,
				     arg.type, arg.named);
}

/* Implement TARGET_FUNCTION_VALUE.  */
static rtx
pru_function_value (const_tree ret_type, const_tree fn ATTRIBUTE_UNUSED,
		      bool outgoing ATTRIBUTE_UNUSED)
{
  return gen_rtx_REG (TYPE_MODE (ret_type), FIRST_RETVAL_REGNUM);
}

/* Implement TARGET_LIBCALL_VALUE.  */
static rtx
pru_libcall_value (machine_mode mode, const_rtx fun ATTRIBUTE_UNUSED)
{
  return gen_rtx_REG (mode, FIRST_RETVAL_REGNUM);
}

/* Implement TARGET_FUNCTION_VALUE_REGNO_P.  */
static bool
pru_function_value_regno_p (const unsigned int regno)
{
  return regno == FIRST_RETVAL_REGNUM;
}

/* Implement TARGET_RETURN_IN_MEMORY.  */
bool
pru_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
{
  bool in_memory = (!pru_arg_in_reg_bysize (int_size_in_bytes (type))
		    || int_size_in_bytes (type) == -1);

  return in_memory;
}

/* Implement TARGET_CAN_USE_DOLOOP_P.  */

static bool
pru_can_use_doloop_p (const widest_int &, const widest_int &iterations_max,
		      unsigned int loop_depth, bool)
{
  /* Considering limitations in the hardware, only use doloop
     for innermost loops which must be entered from the top.  */
  if (loop_depth > 1)
    return false;
  /* PRU internal loop counter is 16bits wide.  Remember that iterations_max
     holds the maximum number of loop latch executions, while PRU loop
     instruction needs the count of loop body executions.  */
  if (iterations_max == 0 || wi::geu_p (iterations_max, 0xffff))
    return false;

  return true;
}

/* NULL if INSN insn is valid within a low-overhead loop.
   Otherwise return why doloop cannot be applied.  */

static const char *
pru_invalid_within_doloop (const rtx_insn *insn)
{
  if (CALL_P (insn))
    return "Function call in the loop.";

  if (JUMP_P (insn) && INSN_CODE (insn) == CODE_FOR_return)
    return "Return from a call instruction in the loop.";

  if (NONDEBUG_INSN_P (insn)
      && INSN_CODE (insn) < 0
      && (GET_CODE (PATTERN (insn)) == ASM_INPUT
	  || asm_noperands (PATTERN (insn)) >= 0))
    return "Loop contains asm statement.";

  return NULL;
}


/* Figure out where to put LABEL, which is the label for a repeat loop.
   The loop ends just before LAST_INSN.  If SHARED, insns other than the
   "repeat" might use LABEL to jump to the loop's continuation point.

   Return the last instruction in the adjusted loop.  */

static rtx_insn *
pru_insert_loop_label_last (rtx_insn *last_insn, rtx_code_label *label,
			    bool shared)
{
  rtx_insn *next, *prev;
  int count = 0, code, icode;

  if (dump_file)
    fprintf (dump_file, "considering end of repeat loop at insn %d\n",
	     INSN_UID (last_insn));

  /* Set PREV to the last insn in the loop.  */
  prev = PREV_INSN (last_insn);

  /* Set NEXT to the next insn after the loop label.  */
  next = last_insn;
  if (!shared)
    while (prev != 0)
      {
	code = GET_CODE (prev);
	if (code == CALL_INSN || code == CODE_LABEL || code == BARRIER)
	  break;

	if (INSN_P (prev))
	  {
	    if (GET_CODE (PATTERN (prev)) == SEQUENCE)
	      prev = as_a <rtx_insn *> (XVECEXP (PATTERN (prev), 0, 1));

	    /* Other insns that should not be in the last two opcodes.  */
	    icode = recog_memoized (prev);
	    if (icode < 0
		|| icode == CODE_FOR_pruloophi
		|| icode == CODE_FOR_pruloopsi)
	      break;

	    count++;
	    next = prev;
	    if (dump_file)
	      print_rtl_single (dump_file, next);
	    if (count == 2)
	      break;
	  }
	prev = PREV_INSN (prev);
      }

  /* Insert the nops.  */
  if (dump_file && count < 2)
    fprintf (dump_file, "Adding %d nop%s inside loop\n\n",
	     2 - count, count == 1 ? "" : "s");

  for (; count < 2; count++)
    emit_insn_before (gen_nop (), last_insn);

  /* Insert the label.  */
  emit_label_before (label, last_insn);

  return last_insn;
}

/* If IS_END is false, expand a canonical doloop_begin RTL into the
   PRU-specific doloop_begin_internal.  Otherwise expand doloop_end to
   doloop_end_internal.  */
void
pru_emit_doloop (rtx *operands, int is_end)
{
  rtx tag;

  if (cfun->machine->doloop_tags == 0
      || cfun->machine->doloop_tag_from_end == is_end)
    {
      cfun->machine->doloop_tags++;
      cfun->machine->doloop_tag_from_end = is_end;
    }

  tag = GEN_INT (cfun->machine->doloop_tags - 1);
  machine_mode opmode = GET_MODE (operands[0]);
  gcc_assert (opmode == HImode || opmode == SImode);

  if (is_end)
    emit_jump_insn (gen_doloop_end_internal (opmode, operands[0],
					     operands[1], tag));
  else
    emit_insn (gen_doloop_begin_internal (opmode, operands[0],
					  operands[0], tag));
}


/* Code for converting doloop_begins and doloop_ends into valid
   PRU instructions.  Idea and code snippets borrowed from mep port.

   A doloop_begin is just a placeholder:

	$count = unspec ($count)

   where $count is initially the number of iterations.
   doloop_end has the form:

	if (--$count == 0) goto label

   The counter variable is private to the doloop insns, nothing else
   relies on its value.

   There are three cases, in decreasing order of preference:

      1.  A loop has exactly one doloop_begin and one doloop_end.
	 The doloop_end branches to the first instruction after
	 the doloop_begin.

	 In this case we can replace the doloop_begin with a LOOP
	 instruction and remove the doloop_end.  I.e.:

		$count1 = unspec ($count1)
	    label:
		...
		if (--$count2 != 0) goto label

	  becomes:

		LOOP end_label,$count1
	    label:
		...
	    end_label:
		# end loop

      2.  As for (1), except there are several doloop_ends.  One of them
	 (call it X) falls through to a label L.  All the others fall
	 through to branches to L.

	 In this case, we remove X and replace the other doloop_ends
	 with branches to the LOOP label.  For example:

		$count1 = unspec ($count1)
	    label:
		...
		if (--$count1 != 0) goto label
	    end_label:
		...
		if (--$count2 != 0) goto label
		goto end_label

	 becomes:

		LOOP end_label,$count1
	    label:
		...
	    end_label:
		# end repeat
		...
		goto end_label

      3.  The fallback case.  Replace doloop_begins with:

		$count = $count

	 Replace doloop_ends with the equivalent of:

		$count = $count - 1
		if ($count != 0) goto loop_label

	 */

/* A structure describing one doloop_begin.  */
struct pru_doloop_begin {
  /* The next doloop_begin with the same tag.  */
  struct pru_doloop_begin *next;

  /* The instruction itself.  */
  rtx_insn *insn;

  /* The initial counter value.  */
  rtx loop_count;

  /* The counter register.  */
  rtx counter;
};

/* A structure describing a doloop_end.  */
struct pru_doloop_end {
  /* The next doloop_end with the same loop tag.  */
  struct pru_doloop_end *next;

  /* The instruction itself.  */
  rtx_insn *insn;

  /* The first instruction after INSN when the branch isn't taken.  */
  rtx_insn *fallthrough;

  /* The location of the counter value.  Since doloop_end_internal is a
     jump instruction, it has to allow the counter to be stored anywhere
     (any non-fixed register).  */
  rtx counter;

  /* The target label (the place where the insn branches when the counter
     isn't zero).  */
  rtx label;

  /* A scratch register.  Only available when COUNTER isn't stored
     in a general register.  */
  rtx scratch;
};


/* One do-while loop.  */
struct pru_doloop {
  /* All the doloop_begins for this loop (in no particular order).  */
  struct pru_doloop_begin *begin;

  /* All the doloop_ends.  When there is more than one, arrange things
     so that the first one is the most likely to be X in case (2) above.  */
  struct pru_doloop_end *end;
};


/* Return true if LOOP can be converted into LOOP form
   (that is, if it matches cases (1) or (2) above).  */

static bool
pru_repeat_loop_p (struct pru_doloop *loop)
{
  struct pru_doloop_end *end;
  rtx_insn *fallthrough;

  /* There must be exactly one doloop_begin and at least one doloop_end.  */
  if (loop->begin == 0 || loop->end == 0 || loop->begin->next != 0)
    return false;

  /* The first doloop_end (X) must branch back to the insn after
     the doloop_begin.  */
  if (prev_real_insn (as_a<rtx_insn *> (loop->end->label)) != loop->begin->insn)
    return false;

  /* Check that the first doloop_end (X) can actually reach
     doloop_begin () with U8_PCREL relocation for LOOP instruction.  */
  if (get_attr_length (loop->end->insn) != 4)
    return false;

  /* All the other doloop_ends must branch to the same place as X.
     When the branch isn't taken, they must jump to the instruction
     after X.  */
  fallthrough = loop->end->fallthrough;
  for (end = loop->end->next; end != 0; end = end->next)
    if (end->label != loop->end->label
	|| !simplejump_p (end->fallthrough)
	|| fallthrough
	   != next_real_insn (JUMP_LABEL_AS_INSN (end->fallthrough)))
      return false;

  return true;
}


/* The main repeat reorg function.  See comment above for details.  */

static void
pru_reorg_loop (rtx_insn *insns)
{
  rtx_insn *insn;
  struct pru_doloop *loops, *loop;
  struct pru_doloop_begin *begin;
  struct pru_doloop_end *end;
  size_t tmpsz;

  /* Quick exit if we haven't created any loops.  */
  if (cfun->machine->doloop_tags == 0)
    return;

  /* Create an array of pru_doloop structures.  */
  tmpsz = sizeof (loops[0]) * cfun->machine->doloop_tags;
  loops = (struct pru_doloop *) alloca (tmpsz);
  memset (loops, 0, sizeof (loops[0]) * cfun->machine->doloop_tags);

  /* Search the function for do-while insns and group them by loop tag.  */
  for (insn = insns; insn; insn = NEXT_INSN (insn))
    if (INSN_P (insn))
      switch (recog_memoized (insn))
	{
	case CODE_FOR_doloop_begin_internalhi:
	case CODE_FOR_doloop_begin_internalsi:
	  insn_extract (insn);
	  loop = &loops[INTVAL (recog_data.operand[2])];

	  tmpsz = sizeof (struct pru_doloop_begin);
	  begin = (struct pru_doloop_begin *) alloca (tmpsz);
	  begin->next = loop->begin;
	  begin->insn = insn;
	  begin->loop_count = recog_data.operand[1];
	  begin->counter = recog_data.operand[0];

	  loop->begin = begin;
	  break;

	case CODE_FOR_doloop_end_internalhi:
	case CODE_FOR_doloop_end_internalsi:
	  insn_extract (insn);
	  loop = &loops[INTVAL (recog_data.operand[2])];

	  tmpsz = sizeof (struct pru_doloop_end);
	  end = (struct pru_doloop_end *) alloca (tmpsz);
	  end->insn = insn;
	  end->fallthrough = next_real_insn (insn);
	  end->counter = recog_data.operand[0];
	  end->label = recog_data.operand[1];
	  end->scratch = recog_data.operand[3];

	  /* If this insn falls through to an unconditional jump,
	     give it a lower priority than the others.  */
	  if (loop->end != 0 && simplejump_p (end->fallthrough))
	    {
	      end->next = loop->end->next;
	      loop->end->next = end;
	    }
	  else
	    {
	      end->next = loop->end;
	      loop->end = end;
	    }
	  break;
	}

  /* Convert the insns for each loop in turn.  */
  for (loop = loops; loop < loops + cfun->machine->doloop_tags; loop++)
    if (pru_repeat_loop_p (loop))
      {
	/* Case (1) or (2).  */
	rtx_code_label *repeat_label;
	rtx label_ref;
	rtx loop_rtx;

	/* Create a new label for the repeat insn.  */
	repeat_label = gen_label_rtx ();

	/* Replace the doloop_begin with a repeat.  We get rid
	   of the iteration register because LOOP instruction
	   will utilize an internal for the PRU core LOOP register.  */
	label_ref = gen_rtx_LABEL_REF (VOIDmode, repeat_label);
	machine_mode loop_mode = GET_MODE (loop->begin->loop_count);
	if (loop_mode == VOIDmode)
	  {
	    gcc_assert (CONST_INT_P (loop->begin->loop_count));
	    gcc_assert (UBYTE_INT ( INTVAL (loop->begin->loop_count)));
	    loop_mode = SImode;
	  }
	gcc_assert (loop_mode == HImode || loop_mode == SImode);
	loop_rtx = gen_pruloop (loop_mode, loop->begin->loop_count, label_ref);
	emit_insn_before (loop_rtx, loop->begin->insn);

	delete_insn (loop->begin->insn);

	/* Insert the repeat label before the first doloop_end.
	   Fill the gap with nops if LOOP insn is less than 2
	   instructions away than loop->end.  */
	pru_insert_loop_label_last (loop->end->insn, repeat_label,
				    loop->end->next != 0);

	/* Emit a pruloop_end (to improve the readability of the output).  */
	emit_insn_before (gen_pruloop_end (), loop->end->insn);

	/* HACK: TODO: This is usually not needed, but is required for
	   a few rare cases where a JUMP that breaks the loop
	   references the LOOP_END address.  In other words, since
	   we're missing a real "loop_end" instruction, a loop "break"
	   may accidentally reference the loop end itself, and thus
	   continuing the cycle.  */
	for (insn = NEXT_INSN (loop->end->insn);
	     insn != next_real_insn (loop->end->insn);
	     insn = NEXT_INSN (insn))
	  {
	    if (LABEL_P (insn) && LABEL_NUSES (insn) > 0)
	      emit_insn_before (gen_nop_loop_guard (), loop->end->insn);
	  }

	/* Delete the first doloop_end.  */
	delete_insn (loop->end->insn);

	/* Replace the others with branches to REPEAT_LABEL.  */
	for (end = loop->end->next; end != 0; end = end->next)
	  {
	    rtx_insn *newjmp;
	    newjmp = emit_jump_insn_before (gen_jump (repeat_label), end->insn);
	    JUMP_LABEL (newjmp) = repeat_label;
	    delete_insn (end->insn);
	    delete_insn (end->fallthrough);
	  }
      }
    else
      {
	/* Case (3).  First replace all the doloop_begins with setting
	   the HW register used for loop counter.  */
	for (begin = loop->begin; begin != 0; begin = begin->next)
	  {
	    insn = gen_move_insn (copy_rtx (begin->counter),
				  copy_rtx (begin->loop_count));
	    emit_insn_before (insn, begin->insn);
	    delete_insn (begin->insn);
	  }

	/* Replace all the doloop_ends with decrement-and-branch sequences.  */
	for (end = loop->end; end != 0; end = end->next)
	  {
	    rtx reg;

	    start_sequence ();

	    /* Load the counter value into a general register.  */
	    reg = end->counter;
	    if (!REG_P (reg) || REGNO (reg) > LAST_NONIO_GP_REGNUM)
	      {
		reg = end->scratch;
		emit_move_insn (copy_rtx (reg), copy_rtx (end->counter));
	      }

	    /* Decrement the counter.  */
	    emit_insn (gen_add3_insn (copy_rtx (reg), copy_rtx (reg),
				      constm1_rtx));

	    /* Copy it back to its original location.  */
	    if (reg != end->counter)
	      emit_move_insn (copy_rtx (end->counter), copy_rtx (reg));

	    /* Jump back to the start label.  */
	    insn = emit_jump_insn (gen_cbranchsi4 (gen_rtx_NE (VOIDmode, reg,
							       const0_rtx),
						   reg,
						   const0_rtx,
						   end->label));

	    JUMP_LABEL (insn) = end->label;
	    LABEL_NUSES (end->label)++;

	    /* Emit the whole sequence before the doloop_end.  */
	    insn = get_insns ();
	    end_sequence ();
	    emit_insn_before (insn, end->insn);

	    /* Delete the doloop_end.  */
	    delete_insn (end->insn);
	  }
      }
}

/* Implement TARGET_MACHINE_DEPENDENT_REORG.  */
static void
pru_reorg (void)
{
  rtx_insn *insns = get_insns ();

  compute_bb_for_insn ();
  df_analyze ();

  /* Need correct insn lengths for allowing LOOP instruction
     emitting due to U8_PCREL limitations.  */
  shorten_branches (get_insns ());

  /* The generic reorg_loops () is not suitable for PRU because
     it doesn't handle doloop_begin/end tying.  And we need our
     doloop_begin emitted before reload.  It is difficult to coalesce
     UBYTE constant initial loop values into the LOOP insn during
     machine reorg phase.  */
  pru_reorg_loop (insns);

  df_finish_pass (false);
}

/* Enumerate all PRU-specific builtins.  */
enum pru_builtin
{
  PRU_BUILTIN_DELAY_CYCLES,
  PRU_BUILTIN_HALT,
  PRU_BUILTIN_LMBD,
  PRU_BUILTIN_max
};

static GTY(()) tree pru_builtins [(int) PRU_BUILTIN_max];

/* Implement TARGET_INIT_BUILTINS.  */

static void
pru_init_builtins (void)
{
  tree void_ftype_longlong
    = build_function_type_list (void_type_node,
				long_long_integer_type_node,
				NULL);
  tree uint_ftype_uint_uint
    = build_function_type_list (unsigned_type_node,
				unsigned_type_node,
				unsigned_type_node,
				NULL);

  tree void_ftype_void
    = build_function_type_list (void_type_node,
				void_type_node,
				NULL);

  pru_builtins[PRU_BUILTIN_DELAY_CYCLES]
    = add_builtin_function ("__delay_cycles", void_ftype_longlong,
			    PRU_BUILTIN_DELAY_CYCLES, BUILT_IN_MD, NULL,
			    NULL_TREE);

  pru_builtins[PRU_BUILTIN_HALT]
    = add_builtin_function ("__halt", void_ftype_void,
			    PRU_BUILTIN_HALT, BUILT_IN_MD, NULL,
			    NULL_TREE);

  pru_builtins[PRU_BUILTIN_LMBD]
    = add_builtin_function ("__lmbd", uint_ftype_uint_uint,
			    PRU_BUILTIN_LMBD, BUILT_IN_MD, NULL,
			    NULL_TREE);
}

/* Implement TARGET_BUILTIN_DECL.  */

static tree
pru_builtin_decl (unsigned code, bool initialize_p ATTRIBUTE_UNUSED)
{
  switch (code)
    {
    case PRU_BUILTIN_DELAY_CYCLES:
    case PRU_BUILTIN_HALT:
    case PRU_BUILTIN_LMBD:
      return pru_builtins[code];
    default:
      return error_mark_node;
    }
}

/* Emit a sequence of one or more delay_cycles_X insns, in order to generate
   code that delays exactly ARG cycles.  */

static rtx
pru_expand_delay_cycles (rtx arg)
{
  HOST_WIDE_INT c, n;

  if (GET_CODE (arg) != CONST_INT)
    {
      error ("%<__delay_cycles%> only takes constant arguments");
      return NULL_RTX;
    }

  c = INTVAL (arg);

  gcc_assert (HOST_BITS_PER_WIDE_INT > 32);
  if (c < 0)
    {
      error ("%<__delay_cycles%> only takes non-negative cycle counts");
      return NULL_RTX;
    }

  emit_insn (gen_delay_cycles_start (arg));

  /* For 32-bit loops, there's 2 + 2x cycles.  */
  if (c > 2 * 0xffff + 1)
    {
      n = (c - 2) / 2;
      c -= (n * 2) + 2;
      if ((unsigned long long) n > 0xffffffffULL)
	{
	  error ("%<__delay_cycles%> is limited to 32-bit loop counts");
	  return NULL_RTX;
	}
      emit_insn (gen_delay_cycles_2x_plus2_si (GEN_INT (n)));
    }

  /* For 16-bit loops, there's 1 + 2x cycles.  */
  if (c > 2)
    {
      n = (c - 1) / 2;
      c -= (n * 2) + 1;

      emit_insn (gen_delay_cycles_2x_plus1_hi (GEN_INT (n)));
    }

  while (c > 0)
    {
      emit_insn (gen_delay_cycles_1 ());
      c -= 1;
    }

  emit_insn (gen_delay_cycles_end (arg));

  return NULL_RTX;
}


/* Implement TARGET_EXPAND_BUILTIN.  Expand an expression EXP that calls
   a built-in function, with result going to TARGET if that's convenient
   (and in mode MODE if that's convenient).
   SUBTARGET may be used as the target for computing one of EXP's operands.
   IGNORE is nonzero if the value is to be ignored.  */

static rtx
pru_expand_builtin (tree exp, rtx target,
		    rtx subtarget ATTRIBUTE_UNUSED,
		    machine_mode mode,
		    int ignore ATTRIBUTE_UNUSED)
{
  tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
  unsigned int fcode = DECL_MD_FUNCTION_CODE (fndecl);

  switch (fcode)
    {
    case PRU_BUILTIN_DELAY_CYCLES:
	{
	  rtx arg1 = expand_normal (CALL_EXPR_ARG (exp, 0));
	  return pru_expand_delay_cycles (arg1);
	}
      break;
    case PRU_BUILTIN_HALT:
	{
	  emit_insn (gen_pru_halt ());
	  return NULL_RTX;
	}
      break;
    case PRU_BUILTIN_LMBD:
	{
	  rtx arg1 = expand_normal (CALL_EXPR_ARG (exp, 0));
	  rtx arg2 = expand_normal (CALL_EXPR_ARG (exp, 1));

	  if (target == NULL_RTX || GET_MODE (target) != mode)
	    {
	      target = gen_reg_rtx (mode);
	    }

	  emit_insn (gen_pru_lmbd (mode, target, arg1, arg2));
	  return target;
	}
      break;
    default:
      internal_error ("bad builtin code");
    }

  return NULL_RTX;
}

/* Remember the last target of pru_set_current_function.  */
static GTY(()) tree pru_previous_fndecl;

/* Establish appropriate back-end context for processing the function
   FNDECL.  The argument might be NULL to indicate processing at top
   level, outside of any function scope.  */
static void
pru_set_current_function (tree fndecl)
{
  tree old_tree = (pru_previous_fndecl
		   ? DECL_FUNCTION_SPECIFIC_TARGET (pru_previous_fndecl)
		   : NULL_TREE);

  tree new_tree = (fndecl
		   ? DECL_FUNCTION_SPECIFIC_TARGET (fndecl)
		   : NULL_TREE);

  if (fndecl && fndecl != pru_previous_fndecl)
    {
      pru_previous_fndecl = fndecl;
      if (old_tree == new_tree)
	;

      else if (new_tree)
	{
	  cl_target_option_restore (&global_options, &global_options_set,
				    TREE_TARGET_OPTION (new_tree));
	  target_reinit ();
	}

      else if (old_tree)
	{
	  struct cl_target_option *def
	    = TREE_TARGET_OPTION (target_option_current_node);

	  cl_target_option_restore (&global_options, &global_options_set, def);
	  target_reinit ();
	}
    }
}

/* Implement TARGET_UNWIND_WORD_MODE.

   Since PRU is really a 32-bit CPU, the default word_mode is not suitable.  */
static scalar_int_mode
pru_unwind_word_mode (void)
{
  return SImode;
}


/* Initialize the GCC target structure.  */
#undef TARGET_ASM_FUNCTION_PROLOGUE
#define TARGET_ASM_FUNCTION_PROLOGUE pru_asm_function_prologue
#undef TARGET_ASM_INTEGER
#define TARGET_ASM_INTEGER pru_assemble_integer

#undef TARGET_ASM_FILE_START
#define TARGET_ASM_FILE_START pru_file_start

#undef  TARGET_INSERT_ATTRIBUTES
#define TARGET_INSERT_ATTRIBUTES pru_insert_attributes

#undef TARGET_INIT_BUILTINS
#define TARGET_INIT_BUILTINS pru_init_builtins
#undef TARGET_EXPAND_BUILTIN
#define TARGET_EXPAND_BUILTIN pru_expand_builtin
#undef TARGET_BUILTIN_DECL
#define TARGET_BUILTIN_DECL pru_builtin_decl

#undef TARGET_COMPUTE_FRAME_LAYOUT
#define TARGET_COMPUTE_FRAME_LAYOUT pru_compute_frame_layout

#undef TARGET_FUNCTION_OK_FOR_SIBCALL
#define TARGET_FUNCTION_OK_FOR_SIBCALL hook_bool_tree_tree_true

#undef TARGET_CAN_ELIMINATE
#define TARGET_CAN_ELIMINATE pru_can_eliminate

#undef TARGET_HARD_REGNO_MODE_OK
#define TARGET_HARD_REGNO_MODE_OK pru_hard_regno_mode_ok

#undef  TARGET_HARD_REGNO_SCRATCH_OK
#define TARGET_HARD_REGNO_SCRATCH_OK pru_hard_regno_scratch_ok

#undef TARGET_FUNCTION_ARG
#define TARGET_FUNCTION_ARG pru_function_arg

#undef TARGET_FUNCTION_ARG_ADVANCE
#define TARGET_FUNCTION_ARG_ADVANCE pru_function_arg_advance

#undef TARGET_ARG_PARTIAL_BYTES
#define TARGET_ARG_PARTIAL_BYTES pru_arg_partial_bytes

#undef TARGET_FUNCTION_VALUE
#define TARGET_FUNCTION_VALUE pru_function_value

#undef TARGET_LIBCALL_VALUE
#define TARGET_LIBCALL_VALUE pru_libcall_value

#undef TARGET_FUNCTION_VALUE_REGNO_P
#define TARGET_FUNCTION_VALUE_REGNO_P pru_function_value_regno_p

#undef TARGET_RETURN_IN_MEMORY
#define TARGET_RETURN_IN_MEMORY pru_return_in_memory

#undef TARGET_MUST_PASS_IN_STACK
#define TARGET_MUST_PASS_IN_STACK must_pass_in_stack_var_size

#undef TARGET_ADDR_SPACE_LEGITIMATE_ADDRESS_P
#define TARGET_ADDR_SPACE_LEGITIMATE_ADDRESS_P \
  pru_addr_space_legitimate_address_p

#undef TARGET_INIT_LIBFUNCS
#define TARGET_INIT_LIBFUNCS pru_init_libfuncs
#undef TARGET_LIBFUNC_GNU_PREFIX
#define TARGET_LIBFUNC_GNU_PREFIX true

#undef TARGET_RTX_COSTS
#define TARGET_RTX_COSTS pru_rtx_costs

#undef TARGET_PRINT_OPERAND
#define TARGET_PRINT_OPERAND pru_print_operand

#undef TARGET_PRINT_OPERAND_ADDRESS
#define TARGET_PRINT_OPERAND_ADDRESS pru_print_operand_address

#undef TARGET_OPTION_OVERRIDE
#define TARGET_OPTION_OVERRIDE pru_option_override

#undef TARGET_SET_CURRENT_FUNCTION
#define TARGET_SET_CURRENT_FUNCTION pru_set_current_function

#undef  TARGET_MACHINE_DEPENDENT_REORG
#define TARGET_MACHINE_DEPENDENT_REORG  pru_reorg

#undef  TARGET_CAN_USE_DOLOOP_P
#define TARGET_CAN_USE_DOLOOP_P		pru_can_use_doloop_p

#undef TARGET_INVALID_WITHIN_DOLOOP
#define TARGET_INVALID_WITHIN_DOLOOP  pru_invalid_within_doloop

#undef  TARGET_UNWIND_WORD_MODE
#define TARGET_UNWIND_WORD_MODE pru_unwind_word_mode

#undef TARGET_HAVE_SPECULATION_SAFE_VALUE
#define TARGET_HAVE_SPECULATION_SAFE_VALUE speculation_safe_value_not_needed

struct gcc_target targetm = TARGET_INITIALIZER;

#include "gt-pru.h"
