Home | History | Annotate | Line # | Download | only in xtensa
xtensa.cc revision 1.1.1.1
      1 /* Subroutines for insn-output.cc for Tensilica's Xtensa architecture.
      2    Copyright (C) 2001-2022 Free Software Foundation, Inc.
      3    Contributed by Bob Wilson (bwilson (at) tensilica.com) at Tensilica.
      4 
      5 This file is part of GCC.
      6 
      7 GCC is free software; you can redistribute it and/or modify it under
      8 the terms of the GNU General Public License as published by the Free
      9 Software Foundation; either version 3, or (at your option) any later
     10 version.
     11 
     12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
     13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
     14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     15 for more details.
     16 
     17 You should have received a copy of the GNU General Public License
     18 along with GCC; see the file COPYING3.  If not see
     19 <http://www.gnu.org/licenses/>.  */
     20 
     21 #define IN_TARGET_CODE 1
     22 
     23 #include "config.h"
     24 #include "system.h"
     25 #include "coretypes.h"
     26 #include "backend.h"
     27 #include "target.h"
     28 #include "rtl.h"
     29 #include "tree.h"
     30 #include "gimple.h"
     31 #include "cfghooks.h"
     32 #include "df.h"
     33 #include "memmodel.h"
     34 #include "tm_p.h"
     35 #include "stringpool.h"
     36 #include "attribs.h"
     37 #include "optabs.h"
     38 #include "regs.h"
     39 #include "emit-rtl.h"
     40 #include "recog.h"
     41 #include "diagnostic-core.h"
     42 #include "cfgrtl.h"
     43 #include "output.h"
     44 #include "fold-const.h"
     45 #include "stor-layout.h"
     46 #include "calls.h"
     47 #include "varasm.h"
     48 #include "alias.h"
     49 #include "explow.h"
     50 #include "expr.h"
     51 #include "reload.h"
     52 #include "langhooks.h"
     53 #include "gimplify.h"
     54 #include "builtins.h"
     55 #include "dumpfile.h"
     56 #include "hw-doloop.h"
     57 #include "rtl-iter.h"
     58 
     59 /* This file should be included last.  */
     60 #include "target-def.h"
     61 
     62 /* Enumeration for all of the relational tests, so that we can build
     63    arrays indexed by the test type, and not worry about the order
     64    of EQ, NE, etc.  */
     65 
     66 enum internal_test
     67 {
     68   ITEST_EQ,
     69   ITEST_NE,
     70   ITEST_GT,
     71   ITEST_GE,
     72   ITEST_LT,
     73   ITEST_LE,
     74   ITEST_GTU,
     75   ITEST_GEU,
     76   ITEST_LTU,
     77   ITEST_LEU,
     78   ITEST_MAX
     79 };
     80 
     81 /* Array giving truth value on whether or not a given hard register
     82    can support a given mode.  */
     83 static char xtensa_hard_regno_mode_ok_p
     84   [(int) MAX_MACHINE_MODE][FIRST_PSEUDO_REGISTER];
     85 
     86 /* Largest block move to handle in-line.  */
     87 #define LARGEST_MOVE_RATIO 15
     88 
     89 /* Define the structure for the machine field in struct function.  */
     90 struct GTY(()) machine_function
     91 {
     92   int accesses_prev_frame;
     93   bool need_a7_copy;
     94   bool vararg_a7;
     95   rtx vararg_a7_copy;
     96   rtx_insn *set_frame_ptr_insn;
     97   /* Current frame size calculated by compute_frame_size.  */
     98   unsigned current_frame_size;
     99   /* Callee-save area size in the current frame calculated by
    100      compute_frame_size.  */
    101   int callee_save_size;
    102   bool frame_laid_out;
    103   bool epilogue_done;
    104 };
    105 
    106 /* Vector, indexed by hard register number, which contains 1 for a
    107    register that is allowable in a candidate for leaf function
    108    treatment.  */
    109 
    110 const char xtensa_leaf_regs[FIRST_PSEUDO_REGISTER] =
    111 {
    112   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    113   1, 1, 1,
    114   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    115   1
    116 };
    117 
    118 static void xtensa_option_override (void);
    119 static enum internal_test map_test_to_internal_test (enum rtx_code);
    120 static rtx gen_int_relational (enum rtx_code, rtx, rtx, int *);
    121 static rtx gen_float_relational (enum rtx_code, rtx, rtx);
    122 static rtx gen_conditional_move (enum rtx_code, machine_mode, rtx, rtx);
    123 static rtx fixup_subreg_mem (rtx);
    124 static struct machine_function * xtensa_init_machine_status (void);
    125 static rtx xtensa_legitimize_tls_address (rtx);
    126 static rtx xtensa_legitimize_address (rtx, rtx, machine_mode);
    127 static bool xtensa_mode_dependent_address_p (const_rtx, addr_space_t);
    128 static bool xtensa_return_in_msb (const_tree);
    129 static void printx (FILE *, signed int);
    130 static rtx xtensa_builtin_saveregs (void);
    131 static bool xtensa_legitimate_address_p (machine_mode, rtx, bool);
    132 static unsigned int xtensa_multibss_section_type_flags (tree, const char *,
    133 							int) ATTRIBUTE_UNUSED;
    134 static section *xtensa_select_rtx_section (machine_mode, rtx,
    135 					   unsigned HOST_WIDE_INT);
    136 static bool xtensa_rtx_costs (rtx, machine_mode, int, int, int *, bool);
    137 static int xtensa_register_move_cost (machine_mode, reg_class_t,
    138 				      reg_class_t);
    139 static int xtensa_memory_move_cost (machine_mode, reg_class_t, bool);
    140 static tree xtensa_build_builtin_va_list (void);
    141 static bool xtensa_return_in_memory (const_tree, const_tree);
    142 static tree xtensa_gimplify_va_arg_expr (tree, tree, gimple_seq *,
    143 					 gimple_seq *);
    144 static void xtensa_function_arg_advance (cumulative_args_t,
    145 					 const function_arg_info &);
    146 static rtx xtensa_function_arg (cumulative_args_t, const function_arg_info &);
    147 static rtx xtensa_function_incoming_arg (cumulative_args_t,
    148 					 const function_arg_info &);
    149 static rtx xtensa_function_value (const_tree, const_tree, bool);
    150 static rtx xtensa_libcall_value (machine_mode, const_rtx);
    151 static bool xtensa_function_value_regno_p (const unsigned int);
    152 static unsigned int xtensa_function_arg_boundary (machine_mode,
    153 						  const_tree);
    154 static void xtensa_init_builtins (void);
    155 static tree xtensa_fold_builtin (tree, int, tree *, bool);
    156 static rtx xtensa_expand_builtin (tree, rtx, rtx, machine_mode, int);
    157 static void xtensa_va_start (tree, rtx);
    158 static bool xtensa_frame_pointer_required (void);
    159 static rtx xtensa_static_chain (const_tree, bool);
    160 static void xtensa_asm_trampoline_template (FILE *);
    161 static void xtensa_trampoline_init (rtx, tree, rtx);
    162 static bool xtensa_output_addr_const_extra (FILE *, rtx);
    163 static bool xtensa_cannot_force_const_mem (machine_mode, rtx);
    164 
    165 static reg_class_t xtensa_preferred_reload_class (rtx, reg_class_t);
    166 static reg_class_t xtensa_preferred_output_reload_class (rtx, reg_class_t);
    167 static reg_class_t xtensa_secondary_reload (bool, rtx, reg_class_t,
    168 					    machine_mode,
    169 					    struct secondary_reload_info *);
    170 
    171 static bool constantpool_address_p (const_rtx addr);
    172 static bool xtensa_legitimate_constant_p (machine_mode, rtx);
    173 static void xtensa_reorg (void);
    174 static bool xtensa_can_use_doloop_p (const widest_int &, const widest_int &,
    175                                      unsigned int, bool);
    176 static const char *xtensa_invalid_within_doloop (const rtx_insn *);
    177 
    178 static bool xtensa_member_type_forces_blk (const_tree,
    179 					   machine_mode mode);
    180 
    181 static void xtensa_conditional_register_usage (void);
    182 static unsigned int xtensa_hard_regno_nregs (unsigned int, machine_mode);
    183 static bool xtensa_hard_regno_mode_ok (unsigned int, machine_mode);
    184 static bool xtensa_modes_tieable_p (machine_mode, machine_mode);
    185 static HOST_WIDE_INT xtensa_constant_alignment (const_tree, HOST_WIDE_INT);
    186 static bool xtensa_can_eliminate (const int from ATTRIBUTE_UNUSED,
    187 				  const int to);
    188 static HOST_WIDE_INT xtensa_starting_frame_offset (void);
    189 static unsigned HOST_WIDE_INT xtensa_asan_shadow_offset (void);
    190 
    191 static rtx xtensa_delegitimize_address (rtx);
    192 
    193 
    194 
    196 /* These hooks specify assembly directives for creating certain kinds
    197    of integer object.  */
    198 
    199 #undef TARGET_ASM_ALIGNED_SI_OP
    200 #define TARGET_ASM_ALIGNED_SI_OP "\t.word\t"
    201 
    202 #undef TARGET_ASM_SELECT_RTX_SECTION
    203 #define TARGET_ASM_SELECT_RTX_SECTION  xtensa_select_rtx_section
    204 
    205 #undef TARGET_LEGITIMIZE_ADDRESS
    206 #define TARGET_LEGITIMIZE_ADDRESS xtensa_legitimize_address
    207 #undef TARGET_MODE_DEPENDENT_ADDRESS_P
    208 #define TARGET_MODE_DEPENDENT_ADDRESS_P xtensa_mode_dependent_address_p
    209 
    210 #undef TARGET_REGISTER_MOVE_COST
    211 #define TARGET_REGISTER_MOVE_COST xtensa_register_move_cost
    212 #undef TARGET_MEMORY_MOVE_COST
    213 #define TARGET_MEMORY_MOVE_COST xtensa_memory_move_cost
    214 #undef TARGET_RTX_COSTS
    215 #define TARGET_RTX_COSTS xtensa_rtx_costs
    216 #undef TARGET_ADDRESS_COST
    217 #define TARGET_ADDRESS_COST hook_int_rtx_mode_as_bool_0
    218 
    219 #undef TARGET_MEMBER_TYPE_FORCES_BLK
    220 #define TARGET_MEMBER_TYPE_FORCES_BLK xtensa_member_type_forces_blk
    221 
    222 #undef TARGET_BUILD_BUILTIN_VA_LIST
    223 #define TARGET_BUILD_BUILTIN_VA_LIST xtensa_build_builtin_va_list
    224 
    225 #undef TARGET_EXPAND_BUILTIN_VA_START
    226 #define TARGET_EXPAND_BUILTIN_VA_START xtensa_va_start
    227 
    228 #undef TARGET_PROMOTE_FUNCTION_MODE
    229 #define TARGET_PROMOTE_FUNCTION_MODE default_promote_function_mode_always_promote
    230 #undef TARGET_PROMOTE_PROTOTYPES
    231 #define TARGET_PROMOTE_PROTOTYPES hook_bool_const_tree_true
    232 
    233 #undef TARGET_RETURN_IN_MEMORY
    234 #define TARGET_RETURN_IN_MEMORY xtensa_return_in_memory
    235 #undef TARGET_FUNCTION_VALUE
    236 #define TARGET_FUNCTION_VALUE xtensa_function_value
    237 #undef TARGET_LIBCALL_VALUE
    238 #define TARGET_LIBCALL_VALUE xtensa_libcall_value
    239 #undef TARGET_FUNCTION_VALUE_REGNO_P
    240 #define TARGET_FUNCTION_VALUE_REGNO_P xtensa_function_value_regno_p
    241 
    242 #undef TARGET_SPLIT_COMPLEX_ARG
    243 #define TARGET_SPLIT_COMPLEX_ARG hook_bool_const_tree_true
    244 #undef TARGET_MUST_PASS_IN_STACK
    245 #define TARGET_MUST_PASS_IN_STACK must_pass_in_stack_var_size
    246 #undef TARGET_FUNCTION_ARG_ADVANCE
    247 #define TARGET_FUNCTION_ARG_ADVANCE xtensa_function_arg_advance
    248 #undef TARGET_FUNCTION_ARG
    249 #define TARGET_FUNCTION_ARG xtensa_function_arg
    250 #undef TARGET_FUNCTION_INCOMING_ARG
    251 #define TARGET_FUNCTION_INCOMING_ARG xtensa_function_incoming_arg
    252 #undef TARGET_FUNCTION_ARG_BOUNDARY
    253 #define TARGET_FUNCTION_ARG_BOUNDARY xtensa_function_arg_boundary
    254 
    255 #undef TARGET_EXPAND_BUILTIN_SAVEREGS
    256 #define TARGET_EXPAND_BUILTIN_SAVEREGS xtensa_builtin_saveregs
    257 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
    258 #define TARGET_GIMPLIFY_VA_ARG_EXPR xtensa_gimplify_va_arg_expr
    259 
    260 #undef TARGET_RETURN_IN_MSB
    261 #define TARGET_RETURN_IN_MSB xtensa_return_in_msb
    262 
    263 #undef  TARGET_INIT_BUILTINS
    264 #define TARGET_INIT_BUILTINS xtensa_init_builtins
    265 #undef  TARGET_FOLD_BUILTIN
    266 #define TARGET_FOLD_BUILTIN xtensa_fold_builtin
    267 #undef  TARGET_EXPAND_BUILTIN
    268 #define TARGET_EXPAND_BUILTIN xtensa_expand_builtin
    269 
    270 #undef  TARGET_PREFERRED_RELOAD_CLASS
    271 #define TARGET_PREFERRED_RELOAD_CLASS xtensa_preferred_reload_class
    272 #undef  TARGET_PREFERRED_OUTPUT_RELOAD_CLASS
    273 #define TARGET_PREFERRED_OUTPUT_RELOAD_CLASS xtensa_preferred_output_reload_class
    274 
    275 #undef TARGET_SECONDARY_RELOAD
    276 #define TARGET_SECONDARY_RELOAD xtensa_secondary_reload
    277 
    278 #undef TARGET_HAVE_TLS
    279 #define TARGET_HAVE_TLS HAVE_AS_TLS
    280 
    281 #undef TARGET_CANNOT_FORCE_CONST_MEM
    282 #define TARGET_CANNOT_FORCE_CONST_MEM xtensa_cannot_force_const_mem
    283 
    284 #undef TARGET_LRA_P
    285 #define TARGET_LRA_P hook_bool_void_false
    286 
    287 #undef TARGET_LEGITIMATE_ADDRESS_P
    288 #define TARGET_LEGITIMATE_ADDRESS_P	xtensa_legitimate_address_p
    289 
    290 #undef TARGET_FRAME_POINTER_REQUIRED
    291 #define TARGET_FRAME_POINTER_REQUIRED xtensa_frame_pointer_required
    292 
    293 #undef TARGET_STATIC_CHAIN
    294 #define TARGET_STATIC_CHAIN xtensa_static_chain
    295 #undef TARGET_ASM_TRAMPOLINE_TEMPLATE
    296 #define TARGET_ASM_TRAMPOLINE_TEMPLATE xtensa_asm_trampoline_template
    297 #undef TARGET_TRAMPOLINE_INIT
    298 #define TARGET_TRAMPOLINE_INIT xtensa_trampoline_init
    299 
    300 #undef TARGET_OPTION_OVERRIDE
    301 #define TARGET_OPTION_OVERRIDE xtensa_option_override
    302 
    303 #undef TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA
    304 #define TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA xtensa_output_addr_const_extra
    305 
    306 #undef TARGET_LEGITIMATE_CONSTANT_P
    307 #define TARGET_LEGITIMATE_CONSTANT_P xtensa_legitimate_constant_p
    308 
    309 #undef TARGET_MACHINE_DEPENDENT_REORG
    310 #define TARGET_MACHINE_DEPENDENT_REORG xtensa_reorg
    311 
    312 #undef TARGET_CAN_USE_DOLOOP_P
    313 #define TARGET_CAN_USE_DOLOOP_P xtensa_can_use_doloop_p
    314 
    315 #undef TARGET_INVALID_WITHIN_DOLOOP
    316 #define TARGET_INVALID_WITHIN_DOLOOP xtensa_invalid_within_doloop
    317 
    318 #undef TARGET_CONDITIONAL_REGISTER_USAGE
    319 #define TARGET_CONDITIONAL_REGISTER_USAGE xtensa_conditional_register_usage
    320 
    321 #undef TARGET_HARD_REGNO_NREGS
    322 #define TARGET_HARD_REGNO_NREGS xtensa_hard_regno_nregs
    323 #undef TARGET_HARD_REGNO_MODE_OK
    324 #define TARGET_HARD_REGNO_MODE_OK xtensa_hard_regno_mode_ok
    325 
    326 #undef TARGET_MODES_TIEABLE_P
    327 #define TARGET_MODES_TIEABLE_P xtensa_modes_tieable_p
    328 
    329 #undef TARGET_CONSTANT_ALIGNMENT
    330 #define TARGET_CONSTANT_ALIGNMENT xtensa_constant_alignment
    331 
    332 #undef TARGET_CAN_ELIMINATE
    333 #define TARGET_CAN_ELIMINATE xtensa_can_eliminate
    334 
    335 #undef TARGET_STARTING_FRAME_OFFSET
    336 #define TARGET_STARTING_FRAME_OFFSET xtensa_starting_frame_offset
    337 
    338 #undef TARGET_ASAN_SHADOW_OFFSET
    339 #define TARGET_ASAN_SHADOW_OFFSET xtensa_asan_shadow_offset
    340 
    341 #undef TARGET_HAVE_SPECULATION_SAFE_VALUE
    342 #define TARGET_HAVE_SPECULATION_SAFE_VALUE speculation_safe_value_not_needed
    343 
    344 #undef TARGET_DELEGITIMIZE_ADDRESS
    345 #define TARGET_DELEGITIMIZE_ADDRESS xtensa_delegitimize_address
    346 
    347 struct gcc_target targetm = TARGET_INITIALIZER;
    348 
    349 
    350 /* Functions to test Xtensa immediate operand validity.  */
    352 
    353 bool
    354 xtensa_simm8 (HOST_WIDE_INT v)
    355 {
    356   return v >= -128 && v <= 127;
    357 }
    358 
    359 
    360 bool
    361 xtensa_simm8x256 (HOST_WIDE_INT v)
    362 {
    363   return (v & 255) == 0 && (v >= -32768 && v <= 32512);
    364 }
    365 
    366 
    367 bool
    368 xtensa_simm12b (HOST_WIDE_INT v)
    369 {
    370   return v >= -2048 && v <= 2047;
    371 }
    372 
    373 
    374 static bool
    375 xtensa_uimm8 (HOST_WIDE_INT v)
    376 {
    377   return v >= 0 && v <= 255;
    378 }
    379 
    380 
    381 static bool
    382 xtensa_uimm8x2 (HOST_WIDE_INT v)
    383 {
    384   return (v & 1) == 0 && (v >= 0 && v <= 510);
    385 }
    386 
    387 
    388 static bool
    389 xtensa_uimm8x4 (HOST_WIDE_INT v)
    390 {
    391   return (v & 3) == 0 && (v >= 0 && v <= 1020);
    392 }
    393 
    394 
    395 static bool
    396 xtensa_b4const (HOST_WIDE_INT v)
    397 {
    398   switch (v)
    399     {
    400     case -1:
    401     case 1:
    402     case 2:
    403     case 3:
    404     case 4:
    405     case 5:
    406     case 6:
    407     case 7:
    408     case 8:
    409     case 10:
    410     case 12:
    411     case 16:
    412     case 32:
    413     case 64:
    414     case 128:
    415     case 256:
    416       return true;
    417     }
    418   return false;
    419 }
    420 
    421 
    422 bool
    423 xtensa_b4const_or_zero (HOST_WIDE_INT v)
    424 {
    425   if (v == 0)
    426     return true;
    427   return xtensa_b4const (v);
    428 }
    429 
    430 
    431 bool
    432 xtensa_b4constu (HOST_WIDE_INT v)
    433 {
    434   switch (v)
    435     {
    436     case 32768:
    437     case 65536:
    438     case 2:
    439     case 3:
    440     case 4:
    441     case 5:
    442     case 6:
    443     case 7:
    444     case 8:
    445     case 10:
    446     case 12:
    447     case 16:
    448     case 32:
    449     case 64:
    450     case 128:
    451     case 256:
    452       return true;
    453     }
    454   return false;
    455 }
    456 
    457 
    458 bool
    459 xtensa_mask_immediate (HOST_WIDE_INT v)
    460 {
    461 #define MAX_MASK_SIZE 16
    462   int mask_size;
    463 
    464   for (mask_size = 1; mask_size <= MAX_MASK_SIZE; mask_size++)
    465     {
    466       if ((v & 1) == 0)
    467 	return false;
    468       v = v >> 1;
    469       if (v == 0)
    470 	return true;
    471     }
    472 
    473   return false;
    474 }
    475 
    476 
    477 /* This is just like the standard true_regnum() function except that it
    478    works even when reg_renumber is not initialized.  */
    479 
    480 int
    481 xt_true_regnum (rtx x)
    482 {
    483   if (GET_CODE (x) == REG)
    484     {
    485       if (reg_renumber
    486 	  && REGNO (x) >= FIRST_PSEUDO_REGISTER
    487 	  && reg_renumber[REGNO (x)] >= 0)
    488 	return reg_renumber[REGNO (x)];
    489       return REGNO (x);
    490     }
    491   if (GET_CODE (x) == SUBREG)
    492     {
    493       int base = xt_true_regnum (SUBREG_REG (x));
    494       if (base >= 0 && base < FIRST_PSEUDO_REGISTER)
    495         return base + subreg_regno_offset (REGNO (SUBREG_REG (x)),
    496                                            GET_MODE (SUBREG_REG (x)),
    497                                            SUBREG_BYTE (x), GET_MODE (x));
    498     }
    499   return -1;
    500 }
    501 
    502 
    503 int
    504 xtensa_valid_move (machine_mode mode, rtx *operands)
    505 {
    506   /* Either the destination or source must be a register, and the
    507      MAC16 accumulator doesn't count.  */
    508 
    509   if (register_operand (operands[0], mode))
    510     {
    511       int dst_regnum = xt_true_regnum (operands[0]);
    512 
    513       if (xtensa_tls_referenced_p (operands[1]))
    514 	return FALSE;
    515 
    516       /* The stack pointer can only be assigned with a MOVSP opcode.  */
    517       if (dst_regnum == STACK_POINTER_REGNUM)
    518 	return !TARGET_WINDOWED_ABI
    519 	  || (mode == SImode
    520 	      && register_operand (operands[1], mode)
    521 	      && !ACC_REG_P (xt_true_regnum (operands[1])));
    522 
    523       if (!ACC_REG_P (dst_regnum))
    524 	return true;
    525     }
    526   if (register_operand (operands[1], mode))
    527     {
    528       int src_regnum = xt_true_regnum (operands[1]);
    529       if (!ACC_REG_P (src_regnum))
    530 	return true;
    531     }
    532   return FALSE;
    533 }
    534 
    535 
    536 int
    537 smalloffset_mem_p (rtx op)
    538 {
    539   if (GET_CODE (op) == MEM)
    540     {
    541       rtx addr = XEXP (op, 0);
    542       if (GET_CODE (addr) == REG)
    543 	return BASE_REG_P (addr, 0);
    544       if (GET_CODE (addr) == PLUS)
    545 	{
    546 	  rtx offset = XEXP (addr, 0);
    547 	  HOST_WIDE_INT val;
    548 	  if (GET_CODE (offset) != CONST_INT)
    549 	    offset = XEXP (addr, 1);
    550 	  if (GET_CODE (offset) != CONST_INT)
    551 	    return FALSE;
    552 
    553 	  val = INTVAL (offset);
    554 	  return (val & 3) == 0 && (val >= 0 && val <= 60);
    555 	}
    556     }
    557   return FALSE;
    558 }
    559 
    560 
    561 static bool
    562 constantpool_address_p (const_rtx addr)
    563 {
    564   const_rtx sym = addr;
    565 
    566   if (GET_CODE (addr) == CONST)
    567     {
    568       rtx offset;
    569 
    570       /* Only handle (PLUS (SYM, OFFSET)) form.  */
    571       addr = XEXP (addr, 0);
    572       if (GET_CODE (addr) != PLUS)
    573 	return false;
    574 
    575       /* Make sure the address is word aligned.  */
    576       offset = XEXP (addr, 1);
    577       if ((!CONST_INT_P (offset))
    578 	  || ((INTVAL (offset) & 3) != 0))
    579 	return false;
    580 
    581       sym = XEXP (addr, 0);
    582     }
    583 
    584   if ((GET_CODE (sym) == SYMBOL_REF)
    585       && CONSTANT_POOL_ADDRESS_P (sym))
    586     return true;
    587   return false;
    588 }
    589 
    590 
    591 int
    592 constantpool_mem_p (rtx op)
    593 {
    594   if (GET_CODE (op) == SUBREG)
    595     op = SUBREG_REG (op);
    596   if (GET_CODE (op) == MEM)
    597     return constantpool_address_p (XEXP (op, 0));
    598   return FALSE;
    599 }
    600 
    601 
    602 /* Return TRUE if X is a thread-local symbol.  */
    603 
    604 static bool
    605 xtensa_tls_symbol_p (rtx x)
    606 {
    607   if (! targetm.have_tls)
    608     return false;
    609 
    610   return GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (x) != 0;
    611 }
    612 
    613 
    614 void
    615 xtensa_extend_reg (rtx dst, rtx src)
    616 {
    617   rtx temp = gen_reg_rtx (SImode);
    618   rtx shift = GEN_INT (BITS_PER_WORD - GET_MODE_BITSIZE (GET_MODE (src)));
    619 
    620   /* Generate paradoxical subregs as needed so that the modes match.  */
    621   src = simplify_gen_subreg (SImode, src, GET_MODE (src), 0);
    622   dst = simplify_gen_subreg (SImode, dst, GET_MODE (dst), 0);
    623 
    624   emit_insn (gen_ashlsi3 (temp, src, shift));
    625   emit_insn (gen_ashrsi3 (dst, temp, shift));
    626 }
    627 
    628 
    629 bool
    630 xtensa_mem_offset (unsigned v, machine_mode mode)
    631 {
    632   switch (mode)
    633     {
    634     case E_BLKmode:
    635       /* Handle the worst case for block moves.  See xtensa_expand_block_move
    636 	 where we emit an optimized block move operation if the block can be
    637 	 moved in < "move_ratio" pieces.  The worst case is when the block is
    638 	 aligned but has a size of (3 mod 4) (does this happen?) so that the
    639 	 last piece requires a byte load/store.  */
    640       return (xtensa_uimm8 (v)
    641 	      && xtensa_uimm8 (v + MOVE_MAX * LARGEST_MOVE_RATIO));
    642 
    643     case E_QImode:
    644       return xtensa_uimm8 (v);
    645 
    646     case E_HImode:
    647       return xtensa_uimm8x2 (v);
    648 
    649     case E_DImode:
    650     case E_DFmode:
    651       return (xtensa_uimm8x4 (v) && xtensa_uimm8x4 (v + 4));
    652 
    653     default:
    654       break;
    655     }
    656 
    657   return xtensa_uimm8x4 (v);
    658 }
    659 
    660 
    661 /* Make normal rtx_code into something we can index from an array.  */
    662 
    663 static enum internal_test
    664 map_test_to_internal_test (enum rtx_code test_code)
    665 {
    666   enum internal_test test = ITEST_MAX;
    667 
    668   switch (test_code)
    669     {
    670     default:			break;
    671     case EQ:  test = ITEST_EQ;  break;
    672     case NE:  test = ITEST_NE;  break;
    673     case GT:  test = ITEST_GT;  break;
    674     case GE:  test = ITEST_GE;  break;
    675     case LT:  test = ITEST_LT;  break;
    676     case LE:  test = ITEST_LE;  break;
    677     case GTU: test = ITEST_GTU; break;
    678     case GEU: test = ITEST_GEU; break;
    679     case LTU: test = ITEST_LTU; break;
    680     case LEU: test = ITEST_LEU; break;
    681     }
    682 
    683   return test;
    684 }
    685 
    686 
    687 /* Generate the code to compare two integer values.  The return value is
    688    the comparison expression.  */
    689 
    690 static rtx
    691 gen_int_relational (enum rtx_code test_code, /* relational test (EQ, etc) */
    692 		    rtx cmp0, /* first operand to compare */
    693 		    rtx cmp1, /* second operand to compare */
    694 		    int *p_invert /* whether branch needs to reverse test */)
    695 {
    696   struct cmp_info
    697   {
    698     enum rtx_code test_code;	/* test code to use in insn */
    699     bool (*const_range_p) (HOST_WIDE_INT); /* range check function */
    700     int const_add;		/* constant to add (convert LE -> LT) */
    701     int reverse_regs;		/* reverse registers in test */
    702     int invert_const;		/* != 0 if invert value if cmp1 is constant */
    703     int invert_reg;		/* != 0 if invert value if cmp1 is register */
    704     int unsignedp;		/* != 0 for unsigned comparisons.  */
    705   };
    706 
    707   static struct cmp_info info[ (int)ITEST_MAX ] = {
    708 
    709     { EQ,	xtensa_b4const_or_zero,	0, 0, 0, 0, 0 },	/* EQ  */
    710     { NE,	xtensa_b4const_or_zero,	0, 0, 0, 0, 0 },	/* NE  */
    711 
    712     { LT,	xtensa_b4const_or_zero,	1, 1, 1, 0, 0 },	/* GT  */
    713     { GE,	xtensa_b4const_or_zero,	0, 0, 0, 0, 0 },	/* GE  */
    714     { LT,	xtensa_b4const_or_zero,	0, 0, 0, 0, 0 },	/* LT  */
    715     { GE,	xtensa_b4const_or_zero,	1, 1, 1, 0, 0 },	/* LE  */
    716 
    717     { LTU,	xtensa_b4constu,	1, 1, 1, 0, 1 },	/* GTU */
    718     { GEU,	xtensa_b4constu,	0, 0, 0, 0, 1 },	/* GEU */
    719     { LTU,	xtensa_b4constu,	0, 0, 0, 0, 1 },	/* LTU */
    720     { GEU,	xtensa_b4constu,	1, 1, 1, 0, 1 },	/* LEU */
    721   };
    722 
    723   enum internal_test test;
    724   machine_mode mode;
    725   struct cmp_info *p_info;
    726 
    727   test = map_test_to_internal_test (test_code);
    728   gcc_assert (test != ITEST_MAX);
    729 
    730   p_info = &info[ (int)test ];
    731 
    732   mode = GET_MODE (cmp0);
    733   if (mode == VOIDmode)
    734     mode = GET_MODE (cmp1);
    735 
    736   /* Make sure we can handle any constants given to us.  */
    737   if (GET_CODE (cmp1) == CONST_INT)
    738     {
    739       HOST_WIDE_INT value = INTVAL (cmp1);
    740       unsigned HOST_WIDE_INT uvalue = (unsigned HOST_WIDE_INT)value;
    741 
    742       /* if the immediate overflows or does not fit in the immediate field,
    743 	 spill it to a register */
    744 
    745       if ((p_info->unsignedp ?
    746 	   (uvalue + p_info->const_add > uvalue) :
    747 	   (value + p_info->const_add > value)) != (p_info->const_add > 0))
    748 	{
    749 	  cmp1 = force_reg (mode, cmp1);
    750 	}
    751       else if (!(p_info->const_range_p) (value + p_info->const_add))
    752 	{
    753 	  cmp1 = force_reg (mode, cmp1);
    754 	}
    755     }
    756   else if ((GET_CODE (cmp1) != REG) && (GET_CODE (cmp1) != SUBREG))
    757     {
    758       cmp1 = force_reg (mode, cmp1);
    759     }
    760 
    761   /* See if we need to invert the result.  */
    762   *p_invert = ((GET_CODE (cmp1) == CONST_INT)
    763 	       ? p_info->invert_const
    764 	       : p_info->invert_reg);
    765 
    766   /* Comparison to constants, may involve adding 1 to change a LT into LE.
    767      Comparison between two registers, may involve switching operands.  */
    768   if (GET_CODE (cmp1) == CONST_INT)
    769     {
    770       if (p_info->const_add != 0)
    771 	cmp1 = GEN_INT (INTVAL (cmp1) + p_info->const_add);
    772 
    773     }
    774   else if (p_info->reverse_regs)
    775     {
    776       rtx temp = cmp0;
    777       cmp0 = cmp1;
    778       cmp1 = temp;
    779     }
    780 
    781   return gen_rtx_fmt_ee (p_info->test_code, VOIDmode, cmp0, cmp1);
    782 }
    783 
    784 
    785 /* Generate the code to compare two float values.  The return value is
    786    the comparison expression.  */
    787 
    788 static rtx
    789 gen_float_relational (enum rtx_code test_code, /* relational test (EQ, etc) */
    790 		      rtx cmp0, /* first operand to compare */
    791 		      rtx cmp1 /* second operand to compare */)
    792 {
    793   rtx (*gen_fn) (rtx, rtx, rtx);
    794   rtx brtmp;
    795   int reverse_regs, invert;
    796 
    797   switch (test_code)
    798     {
    799     case EQ: reverse_regs = 0; invert = 0; gen_fn = gen_seq_sf; break;
    800     case NE: reverse_regs = 0; invert = 1; gen_fn = gen_seq_sf; break;
    801     case LE: reverse_regs = 0; invert = 0; gen_fn = gen_sle_sf; break;
    802     case GT: reverse_regs = 1; invert = 0; gen_fn = gen_slt_sf; break;
    803     case LT: reverse_regs = 0; invert = 0; gen_fn = gen_slt_sf; break;
    804     case GE: reverse_regs = 1; invert = 0; gen_fn = gen_sle_sf; break;
    805     case UNEQ: reverse_regs = 0; invert = 0; gen_fn = gen_suneq_sf; break;
    806     case LTGT: reverse_regs = 0; invert = 1; gen_fn = gen_suneq_sf; break;
    807     case UNLE: reverse_regs = 0; invert = 0; gen_fn = gen_sunle_sf; break;
    808     case UNGT: reverse_regs = 1; invert = 0; gen_fn = gen_sunlt_sf; break;
    809     case UNLT: reverse_regs = 0; invert = 0; gen_fn = gen_sunlt_sf; break;
    810     case UNGE: reverse_regs = 1; invert = 0; gen_fn = gen_sunle_sf; break;
    811     case UNORDERED:
    812       reverse_regs = 0; invert = 0; gen_fn = gen_sunordered_sf; break;
    813     case ORDERED:
    814       reverse_regs = 0; invert = 1; gen_fn = gen_sunordered_sf; break;
    815     default:
    816       fatal_insn ("bad test", gen_rtx_fmt_ee (test_code, VOIDmode, cmp0, cmp1));
    817       reverse_regs = 0; invert = 0; gen_fn = 0; /* avoid compiler warnings */
    818     }
    819 
    820   if (reverse_regs)
    821     {
    822       rtx temp = cmp0;
    823       cmp0 = cmp1;
    824       cmp1 = temp;
    825     }
    826 
    827   brtmp = gen_rtx_REG (CCmode, FPCC_REGNUM);
    828   emit_insn (gen_fn (brtmp, cmp0, cmp1));
    829 
    830   return gen_rtx_fmt_ee (invert ? EQ : NE, VOIDmode, brtmp, const0_rtx);
    831 }
    832 
    833 
    834 void
    835 xtensa_expand_conditional_branch (rtx *operands, machine_mode mode)
    836 {
    837   enum rtx_code test_code = GET_CODE (operands[0]);
    838   rtx cmp0 = operands[1];
    839   rtx cmp1 = operands[2];
    840   rtx cmp;
    841   int invert;
    842   rtx label1, label2;
    843 
    844   switch (mode)
    845     {
    846     case E_DFmode:
    847     default:
    848       fatal_insn ("bad test", gen_rtx_fmt_ee (test_code, VOIDmode, cmp0, cmp1));
    849 
    850     case E_SImode:
    851       invert = FALSE;
    852       cmp = gen_int_relational (test_code, cmp0, cmp1, &invert);
    853       break;
    854 
    855     case E_SFmode:
    856       if (!TARGET_HARD_FLOAT)
    857 	fatal_insn ("bad test", gen_rtx_fmt_ee (test_code, VOIDmode,
    858 						cmp0, cmp1));
    859       invert = FALSE;
    860       cmp = gen_float_relational (test_code, cmp0, cmp1);
    861       break;
    862     }
    863 
    864   /* Generate the branch.  */
    865 
    866   label1 = gen_rtx_LABEL_REF (VOIDmode, operands[3]);
    867   label2 = pc_rtx;
    868 
    869   if (invert)
    870     {
    871       label2 = label1;
    872       label1 = pc_rtx;
    873     }
    874 
    875   emit_jump_insn (gen_rtx_SET (pc_rtx,
    876 			       gen_rtx_IF_THEN_ELSE (VOIDmode, cmp,
    877 						     label1,
    878 						     label2)));
    879 }
    880 
    881 
    882 static rtx
    883 gen_conditional_move (enum rtx_code code, machine_mode mode,
    884 		      rtx op0, rtx op1)
    885 {
    886   if (mode == SImode)
    887     {
    888       rtx cmp;
    889 
    890       /* Jump optimization calls get_condition() which canonicalizes
    891 	 comparisons like (GE x <const>) to (GT x <const-1>).
    892 	 Transform those comparisons back to GE, since that is the
    893 	 comparison supported in Xtensa.  We shouldn't have to
    894 	 transform <LE x const> comparisons, because neither
    895 	 xtensa_expand_conditional_branch() nor get_condition() will
    896 	 produce them.  */
    897 
    898       if ((code == GT) && (op1 == constm1_rtx))
    899 	{
    900 	  code = GE;
    901 	  op1 = const0_rtx;
    902 	}
    903       cmp = gen_rtx_fmt_ee (code, VOIDmode, pc_rtx, const0_rtx);
    904 
    905       if (boolean_operator (cmp, VOIDmode))
    906 	{
    907 	  /* Swap the operands to make const0 second.  */
    908 	  if (op0 == const0_rtx)
    909 	    {
    910 	      op0 = op1;
    911 	      op1 = const0_rtx;
    912 	    }
    913 
    914 	  /* If not comparing against zero, emit a comparison (subtract).  */
    915 	  if (op1 != const0_rtx)
    916 	    {
    917 	      op0 = expand_binop (SImode, sub_optab, op0, op1,
    918 				  0, 0, OPTAB_LIB_WIDEN);
    919 	      op1 = const0_rtx;
    920 	    }
    921 	}
    922       else if (branch_operator (cmp, VOIDmode))
    923 	{
    924 	  /* Swap the operands to make const0 second.  */
    925 	  if (op0 == const0_rtx)
    926 	    {
    927 	      op0 = op1;
    928 	      op1 = const0_rtx;
    929 
    930 	      switch (code)
    931 		{
    932 		case LT: code = GE; break;
    933 		case GE: code = LT; break;
    934 		default: gcc_unreachable ();
    935 		}
    936 	    }
    937 
    938 	  if (op1 != const0_rtx)
    939 	    return 0;
    940 	}
    941       else
    942 	return 0;
    943 
    944       return gen_rtx_fmt_ee (code, VOIDmode, op0, op1);
    945     }
    946 
    947   if (TARGET_HARD_FLOAT && mode == SFmode)
    948     return gen_float_relational (code, op0, op1);
    949 
    950   return 0;
    951 }
    952 
    953 
    954 int
    955 xtensa_expand_conditional_move (rtx *operands, int isflt)
    956 {
    957   rtx dest = operands[0];
    958   rtx cmp = operands[1];
    959   machine_mode cmp_mode = GET_MODE (XEXP (cmp, 0));
    960   rtx (*gen_fn) (rtx, rtx, rtx, rtx, rtx);
    961 
    962   if (!(cmp = gen_conditional_move (GET_CODE (cmp), cmp_mode,
    963 				    XEXP (cmp, 0), XEXP (cmp, 1))))
    964     return 0;
    965 
    966   if (isflt)
    967     gen_fn = (cmp_mode == SImode
    968 	      ? gen_movsfcc_internal0
    969 	      : gen_movsfcc_internal1);
    970   else
    971     gen_fn = (cmp_mode == SImode
    972 	      ? gen_movsicc_internal0
    973 	      : gen_movsicc_internal1);
    974 
    975   emit_insn (gen_fn (dest, XEXP (cmp, 0), operands[2], operands[3], cmp));
    976   return 1;
    977 }
    978 
    979 
    980 int
    981 xtensa_expand_scc (rtx operands[4], machine_mode cmp_mode)
    982 {
    983   rtx dest = operands[0];
    984   rtx cmp;
    985   rtx one_tmp, zero_tmp;
    986   rtx (*gen_fn) (rtx, rtx, rtx, rtx, rtx);
    987 
    988   if (!(cmp = gen_conditional_move (GET_CODE (operands[1]), cmp_mode,
    989 				    operands[2], operands[3])))
    990     return 0;
    991 
    992   one_tmp = gen_reg_rtx (SImode);
    993   zero_tmp = gen_reg_rtx (SImode);
    994   emit_insn (gen_movsi (one_tmp, const_true_rtx));
    995   emit_insn (gen_movsi (zero_tmp, const0_rtx));
    996 
    997   gen_fn = (cmp_mode == SImode
    998 	    ? gen_movsicc_internal0
    999 	    : gen_movsicc_internal1);
   1000   emit_insn (gen_fn (dest, XEXP (cmp, 0), one_tmp, zero_tmp, cmp));
   1001   return 1;
   1002 }
   1003 
   1004 
   1005 /* Split OP[1] into OP[2,3] and likewise for OP[0] into OP[0,1].  MODE is
   1006    for the output, i.e., the input operands are twice as big as MODE.  */
   1007 
   1008 void
   1009 xtensa_split_operand_pair (rtx operands[4], machine_mode mode)
   1010 {
   1011   switch (GET_CODE (operands[1]))
   1012     {
   1013     case REG:
   1014       operands[3] = gen_rtx_REG (mode, REGNO (operands[1]) + 1);
   1015       operands[2] = gen_rtx_REG (mode, REGNO (operands[1]));
   1016       break;
   1017 
   1018     case MEM:
   1019       operands[3] = adjust_address (operands[1], mode, GET_MODE_SIZE (mode));
   1020       operands[2] = adjust_address (operands[1], mode, 0);
   1021       break;
   1022 
   1023     case CONST_INT:
   1024     case CONST_DOUBLE:
   1025       split_double (operands[1], &operands[2], &operands[3]);
   1026       break;
   1027 
   1028     default:
   1029       gcc_unreachable ();
   1030     }
   1031 
   1032   switch (GET_CODE (operands[0]))
   1033     {
   1034     case REG:
   1035       operands[1] = gen_rtx_REG (mode, REGNO (operands[0]) + 1);
   1036       operands[0] = gen_rtx_REG (mode, REGNO (operands[0]));
   1037       break;
   1038 
   1039     case MEM:
   1040       operands[1] = adjust_address (operands[0], mode, GET_MODE_SIZE (mode));
   1041       operands[0] = adjust_address (operands[0], mode, 0);
   1042       break;
   1043 
   1044     default:
   1045       gcc_unreachable ();
   1046     }
   1047 }
   1048 
   1049 
   1050 /* Emit insns to move operands[1] into operands[0].
   1051    Return 1 if we have written out everything that needs to be done to
   1052    do the move.  Otherwise, return 0 and the caller will emit the move
   1053    normally.  */
   1054 
   1055 int
   1056 xtensa_emit_move_sequence (rtx *operands, machine_mode mode)
   1057 {
   1058   rtx src = operands[1];
   1059 
   1060   if (CONSTANT_P (src)
   1061       && (GET_CODE (src) != CONST_INT || ! xtensa_simm12b (INTVAL (src))))
   1062     {
   1063       rtx dst = operands[0];
   1064 
   1065       if (xtensa_tls_referenced_p (src))
   1066 	{
   1067 	  rtx addend = NULL;
   1068 
   1069 	  if (GET_CODE (src) == CONST && GET_CODE (XEXP (src, 0)) == PLUS)
   1070 	    {
   1071 	      addend = XEXP (XEXP (src, 0), 1);
   1072 	      src = XEXP (XEXP (src, 0), 0);
   1073 	    }
   1074 
   1075 	  src = xtensa_legitimize_tls_address (src);
   1076 	  if (addend)
   1077 	    {
   1078 	      src = gen_rtx_PLUS (mode, src, addend);
   1079 	      src = force_operand (src, dst);
   1080 	    }
   1081 	  emit_move_insn (dst, src);
   1082 	  return 1;
   1083 	}
   1084 
   1085       if (! TARGET_AUTO_LITPOOLS && ! TARGET_CONST16)
   1086 	{
   1087 	  /* Try to emit MOVI + SLLI sequence, that is smaller
   1088 	     than L32R + literal.  */
   1089 	  if (optimize_size && mode == SImode && CONST_INT_P (src)
   1090 	      && register_operand (dst, mode))
   1091 	    {
   1092 	      HOST_WIDE_INT srcval = INTVAL (src);
   1093 	      int shift = ctz_hwi (srcval);
   1094 
   1095 	      if (xtensa_simm12b (srcval >> shift))
   1096 		{
   1097 		  emit_move_insn (dst, GEN_INT (srcval >> shift));
   1098 		  emit_insn (gen_ashlsi3_internal (dst, dst, GEN_INT (shift)));
   1099 		  return 1;
   1100 		}
   1101 	    }
   1102 
   1103 	  src = force_const_mem (SImode, src);
   1104 	  operands[1] = src;
   1105 	}
   1106 
   1107       /* PC-relative loads are always SImode, and CONST16 is only
   1108 	 supported in the movsi pattern, so add a SUBREG for any other
   1109 	 (smaller) mode.  */
   1110 
   1111       if (mode != SImode)
   1112 	{
   1113 	  if (register_operand (dst, mode))
   1114 	    {
   1115 	      emit_move_insn (simplify_gen_subreg (SImode, dst, mode, 0), src);
   1116 	      return 1;
   1117 	    }
   1118 	  else
   1119 	    {
   1120 	      src = force_reg (SImode, src);
   1121 	      src = gen_lowpart_SUBREG (mode, src);
   1122 	      operands[1] = src;
   1123 	    }
   1124 	}
   1125     }
   1126 
   1127   if (!(reload_in_progress | reload_completed)
   1128       && !xtensa_valid_move (mode, operands))
   1129     operands[1] = force_reg (mode, operands[1]);
   1130 
   1131   operands[1] = xtensa_copy_incoming_a7 (operands[1]);
   1132 
   1133   /* During reload we don't want to emit (subreg:X (mem:Y)) since that
   1134      instruction won't be recognized after reload, so we remove the
   1135      subreg and adjust mem accordingly.  */
   1136   if (reload_in_progress)
   1137     {
   1138       operands[0] = fixup_subreg_mem (operands[0]);
   1139       operands[1] = fixup_subreg_mem (operands[1]);
   1140     }
   1141   return 0;
   1142 }
   1143 
   1144 
   1145 static rtx
   1146 fixup_subreg_mem (rtx x)
   1147 {
   1148   if (GET_CODE (x) == SUBREG
   1149       && GET_CODE (SUBREG_REG (x)) == REG
   1150       && REGNO (SUBREG_REG (x)) >= FIRST_PSEUDO_REGISTER)
   1151     {
   1152       rtx temp =
   1153 	gen_rtx_SUBREG (GET_MODE (x),
   1154 			reg_equiv_mem (REGNO (SUBREG_REG (x))),
   1155 			SUBREG_BYTE (x));
   1156       x = alter_subreg (&temp, true);
   1157     }
   1158   return x;
   1159 }
   1160 
   1161 
   1162 /* Check if an incoming argument in a7 is expected to be used soon and
   1163    if OPND is a register or register pair that includes a7.  If so,
   1164    create a new pseudo and copy a7 into that pseudo at the very
   1165    beginning of the function, followed by the special "set_frame_ptr"
   1166    unspec_volatile insn.  The return value is either the original
   1167    operand, if it is not a7, or the new pseudo containing a copy of
   1168    the incoming argument.  This is necessary because the register
   1169    allocator will ignore conflicts with a7 and may either assign some
   1170    other pseudo to a7 or use a7 as the hard_frame_pointer, clobbering
   1171    the incoming argument in a7.  By copying the argument out of a7 as
   1172    the very first thing, and then immediately following that with an
   1173    unspec_volatile to keep the scheduler away, we should avoid any
   1174    problems.  Putting the set_frame_ptr insn at the beginning, with
   1175    only the a7 copy before it, also makes it easier for the prologue
   1176    expander to initialize the frame pointer after the a7 copy and to
   1177    fix up the a7 copy to use the stack pointer instead of the frame
   1178    pointer.  */
   1179 
   1180 rtx
   1181 xtensa_copy_incoming_a7 (rtx opnd)
   1182 {
   1183   rtx entry_insns = 0;
   1184   rtx reg, tmp;
   1185   machine_mode mode;
   1186 
   1187   if (!cfun->machine->need_a7_copy)
   1188     return opnd;
   1189 
   1190   /* This function should never be called again once a7 has been copied.  */
   1191   gcc_assert (!cfun->machine->set_frame_ptr_insn);
   1192 
   1193   mode = GET_MODE (opnd);
   1194 
   1195   /* The operand using a7 may come in a later instruction, so just return
   1196      the original operand if it doesn't use a7.  */
   1197   reg = opnd;
   1198   if (GET_CODE (reg) == SUBREG)
   1199     {
   1200       gcc_assert (SUBREG_BYTE (reg) == 0);
   1201       reg = SUBREG_REG (reg);
   1202     }
   1203   if (GET_CODE (reg) != REG
   1204       || REGNO (reg) > A7_REG
   1205       || REGNO (reg) + hard_regno_nregs (A7_REG, mode) <= A7_REG)
   1206     return opnd;
   1207 
   1208   /* 1-word args will always be in a7; 2-word args in a6/a7.  */
   1209   gcc_assert (REGNO (reg) + hard_regno_nregs (A7_REG, mode) - 1 == A7_REG);
   1210 
   1211   cfun->machine->need_a7_copy = false;
   1212 
   1213   /* Copy a7 to a new pseudo at the function entry.  Use gen_raw_REG to
   1214      create the REG for a7 so that hard_frame_pointer_rtx is not used.  */
   1215 
   1216   start_sequence ();
   1217   tmp = gen_reg_rtx (mode);
   1218 
   1219   switch (mode)
   1220     {
   1221     case E_DFmode:
   1222     case E_DImode:
   1223       /* Copy the value out of A7 here but keep the first word in A6 until
   1224 	 after the set_frame_ptr insn.  Otherwise, the register allocator
   1225 	 may decide to put "subreg (tmp, 0)" in A7 and clobber the incoming
   1226 	 value.  */
   1227       emit_insn (gen_movsi_internal (gen_rtx_SUBREG (SImode, tmp, 4),
   1228 				     gen_raw_REG (SImode, A7_REG)));
   1229       break;
   1230     case E_SFmode:
   1231       emit_insn (gen_movsf_internal (tmp, gen_raw_REG (mode, A7_REG)));
   1232       break;
   1233     case E_SImode:
   1234       emit_insn (gen_movsi_internal (tmp, gen_raw_REG (mode, A7_REG)));
   1235       break;
   1236     case E_HImode:
   1237       emit_insn (gen_movhi_internal (tmp, gen_raw_REG (mode, A7_REG)));
   1238       break;
   1239     case E_QImode:
   1240       emit_insn (gen_movqi_internal (tmp, gen_raw_REG (mode, A7_REG)));
   1241       break;
   1242     default:
   1243       gcc_unreachable ();
   1244     }
   1245 
   1246   cfun->machine->set_frame_ptr_insn = emit_insn (gen_set_frame_ptr ());
   1247 
   1248   /* For DF and DI mode arguments, copy the incoming value in A6 now.  */
   1249   if (mode == DFmode || mode == DImode)
   1250     emit_insn (gen_movsi_internal (gen_rtx_SUBREG (SImode, tmp, 0),
   1251 				   gen_rtx_REG (SImode, A7_REG - 1)));
   1252   entry_insns = get_insns ();
   1253   end_sequence ();
   1254 
   1255   if (cfun->machine->vararg_a7)
   1256     {
   1257       /* This is called from within builtin_saveregs, which will insert the
   1258 	 saveregs code at the function entry, ahead of anything placed at
   1259 	 the function entry now.  Instead, save the sequence to be inserted
   1260 	 at the beginning of the saveregs code.  */
   1261       cfun->machine->vararg_a7_copy = entry_insns;
   1262     }
   1263   else
   1264     {
   1265       /* Put entry_insns after the NOTE that starts the function.  If
   1266 	 this is inside a start_sequence, make the outer-level insn
   1267 	 chain current, so the code is placed at the start of the
   1268 	 function.  */
   1269       push_topmost_sequence ();
   1270       /* Do not use entry_of_function() here.  This is called from within
   1271 	 expand_function_start, when the CFG still holds GIMPLE.  */
   1272       emit_insn_after (entry_insns, get_insns ());
   1273       pop_topmost_sequence ();
   1274     }
   1275 
   1276   return tmp;
   1277 }
   1278 
   1279 
   1280 /* Try to expand a block move operation to a sequence of RTL move
   1281    instructions.  If not optimizing, or if the block size is not a
   1282    constant, or if the block is too large, the expansion fails and GCC
   1283    falls back to calling memcpy().
   1284 
   1285    operands[0] is the destination
   1286    operands[1] is the source
   1287    operands[2] is the length
   1288    operands[3] is the alignment */
   1289 
   1290 int
   1291 xtensa_expand_block_move (rtx *operands)
   1292 {
   1293   static const machine_mode mode_from_align[] =
   1294   {
   1295     VOIDmode, QImode, HImode, VOIDmode, SImode,
   1296   };
   1297 
   1298   rtx dst_mem = operands[0];
   1299   rtx src_mem = operands[1];
   1300   HOST_WIDE_INT bytes, align;
   1301   int num_pieces, move_ratio;
   1302   rtx temp[2];
   1303   machine_mode mode[2];
   1304   int amount[2];
   1305   bool active[2];
   1306   int phase = 0;
   1307   int next;
   1308   int offset_ld = 0;
   1309   int offset_st = 0;
   1310   rtx x;
   1311 
   1312   /* If this is not a fixed size move, just call memcpy.  */
   1313   if (!optimize || (GET_CODE (operands[2]) != CONST_INT))
   1314     return 0;
   1315 
   1316   bytes = INTVAL (operands[2]);
   1317   align = INTVAL (operands[3]);
   1318 
   1319   /* Anything to move?  */
   1320   if (bytes <= 0)
   1321     return 0;
   1322 
   1323   if (align > MOVE_MAX)
   1324     align = MOVE_MAX;
   1325 
   1326   /* Decide whether to expand inline based on the optimization level.  */
   1327   move_ratio = 4;
   1328   if (optimize > 2)
   1329     move_ratio = LARGEST_MOVE_RATIO;
   1330   num_pieces = (bytes / align) + (bytes % align); /* Close enough anyway.  */
   1331   if (num_pieces > move_ratio)
   1332     return 0;
   1333 
   1334   x = XEXP (dst_mem, 0);
   1335   if (!REG_P (x))
   1336     {
   1337       x = force_reg (Pmode, x);
   1338       dst_mem = replace_equiv_address (dst_mem, x);
   1339     }
   1340 
   1341   x = XEXP (src_mem, 0);
   1342   if (!REG_P (x))
   1343     {
   1344       x = force_reg (Pmode, x);
   1345       src_mem = replace_equiv_address (src_mem, x);
   1346     }
   1347 
   1348   active[0] = active[1] = false;
   1349 
   1350   do
   1351     {
   1352       next = phase;
   1353       phase ^= 1;
   1354 
   1355       if (bytes > 0)
   1356 	{
   1357 	  int next_amount;
   1358 
   1359 	  next_amount = (bytes >= 4 ? 4 : (bytes >= 2 ? 2 : 1));
   1360 	  next_amount = MIN (next_amount, align);
   1361 
   1362 	  amount[next] = next_amount;
   1363 	  mode[next] = mode_from_align[next_amount];
   1364 	  temp[next] = gen_reg_rtx (mode[next]);
   1365 
   1366 	  x = adjust_address (src_mem, mode[next], offset_ld);
   1367 	  emit_insn (gen_rtx_SET (temp[next], x));
   1368 
   1369 	  offset_ld += next_amount;
   1370 	  bytes -= next_amount;
   1371 	  active[next] = true;
   1372 	}
   1373 
   1374       if (active[phase])
   1375 	{
   1376 	  active[phase] = false;
   1377 
   1378 	  x = adjust_address (dst_mem, mode[phase], offset_st);
   1379 	  emit_insn (gen_rtx_SET (x, temp[phase]));
   1380 
   1381 	  offset_st += amount[phase];
   1382 	}
   1383     }
   1384   while (active[next]);
   1385 
   1386   return 1;
   1387 }
   1388 
   1389 
   1390 void
   1391 xtensa_expand_nonlocal_goto (rtx *operands)
   1392 {
   1393   rtx goto_handler = operands[1];
   1394   rtx containing_fp = operands[3];
   1395 
   1396   /* Generate a call to "__xtensa_nonlocal_goto" (in libgcc); the code
   1397      is too big to generate in-line.  */
   1398 
   1399   if (GET_CODE (containing_fp) != REG)
   1400     containing_fp = force_reg (Pmode, containing_fp);
   1401 
   1402   emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__xtensa_nonlocal_goto"),
   1403 		     LCT_NORMAL, VOIDmode,
   1404 		     containing_fp, Pmode,
   1405 		     goto_handler, Pmode);
   1406 }
   1407 
   1408 
   1409 static struct machine_function *
   1410 xtensa_init_machine_status (void)
   1411 {
   1412   return ggc_cleared_alloc<machine_function> ();
   1413 }
   1414 
   1415 
   1416 /* Shift VAL of mode MODE left by COUNT bits.  */
   1417 
   1418 static inline rtx
   1419 xtensa_expand_mask_and_shift (rtx val, machine_mode mode, rtx count)
   1420 {
   1421   val = expand_simple_binop (SImode, AND, val, GEN_INT (GET_MODE_MASK (mode)),
   1422 			     NULL_RTX, 1, OPTAB_DIRECT);
   1423   return expand_simple_binop (SImode, ASHIFT, val, count,
   1424 			      NULL_RTX, 1, OPTAB_DIRECT);
   1425 }
   1426 
   1427 
   1428 /* Structure to hold the initial parameters for a compare_and_swap operation
   1429    in HImode and QImode.  */
   1430 
   1431 struct alignment_context
   1432 {
   1433   rtx memsi;	  /* SI aligned memory location.  */
   1434   rtx shift;	  /* Bit offset with regard to lsb.  */
   1435   rtx modemask;	  /* Mask of the HQImode shifted by SHIFT bits.  */
   1436   rtx modemaski;  /* ~modemask */
   1437 };
   1438 
   1439 
   1440 /* Initialize structure AC for word access to HI and QI mode memory.  */
   1441 
   1442 static void
   1443 init_alignment_context (struct alignment_context *ac, rtx mem)
   1444 {
   1445   machine_mode mode = GET_MODE (mem);
   1446   rtx byteoffset = NULL_RTX;
   1447   bool aligned = (MEM_ALIGN (mem) >= GET_MODE_BITSIZE (SImode));
   1448 
   1449   if (aligned)
   1450     ac->memsi = adjust_address (mem, SImode, 0); /* Memory is aligned.  */
   1451   else
   1452     {
   1453       /* Alignment is unknown.  */
   1454       rtx addr, align;
   1455 
   1456       /* Force the address into a register.  */
   1457       addr = force_reg (Pmode, XEXP (mem, 0));
   1458 
   1459       /* Align it to SImode.  */
   1460       align = expand_simple_binop (Pmode, AND, addr,
   1461 				   GEN_INT (-GET_MODE_SIZE (SImode)),
   1462 				   NULL_RTX, 1, OPTAB_DIRECT);
   1463       /* Generate MEM.  */
   1464       ac->memsi = gen_rtx_MEM (SImode, align);
   1465       MEM_VOLATILE_P (ac->memsi) = MEM_VOLATILE_P (mem);
   1466       set_mem_alias_set (ac->memsi, ALIAS_SET_MEMORY_BARRIER);
   1467       set_mem_align (ac->memsi, GET_MODE_BITSIZE (SImode));
   1468 
   1469       byteoffset = expand_simple_binop (Pmode, AND, addr,
   1470 					GEN_INT (GET_MODE_SIZE (SImode) - 1),
   1471 					NULL_RTX, 1, OPTAB_DIRECT);
   1472     }
   1473 
   1474   /* Calculate shiftcount.  */
   1475   if (TARGET_BIG_ENDIAN)
   1476     {
   1477       ac->shift = GEN_INT (GET_MODE_SIZE (SImode) - GET_MODE_SIZE (mode));
   1478       if (!aligned)
   1479 	ac->shift = expand_simple_binop (SImode, MINUS, ac->shift, byteoffset,
   1480 					 NULL_RTX, 1, OPTAB_DIRECT);
   1481     }
   1482   else
   1483     {
   1484       if (aligned)
   1485 	ac->shift = NULL_RTX;
   1486       else
   1487 	ac->shift = byteoffset;
   1488     }
   1489 
   1490   if (ac->shift != NULL_RTX)
   1491     {
   1492       /* Shift is the byte count, but we need the bitcount.  */
   1493       gcc_assert (exact_log2 (BITS_PER_UNIT) >= 0);
   1494       ac->shift = expand_simple_binop (SImode, ASHIFT, ac->shift,
   1495 				       GEN_INT (exact_log2 (BITS_PER_UNIT)),
   1496 				       NULL_RTX, 1, OPTAB_DIRECT);
   1497       ac->modemask = expand_simple_binop (SImode, ASHIFT,
   1498 					  GEN_INT (GET_MODE_MASK (mode)),
   1499 					  ac->shift,
   1500 					  NULL_RTX, 1, OPTAB_DIRECT);
   1501     }
   1502   else
   1503     ac->modemask = GEN_INT (GET_MODE_MASK (mode));
   1504 
   1505   ac->modemaski = expand_simple_unop (SImode, NOT, ac->modemask, NULL_RTX, 1);
   1506 }
   1507 
   1508 
   1509 /* Expand an atomic compare and swap operation for HImode and QImode.
   1510    MEM is the memory location, CMP the old value to compare MEM with
   1511    and NEW_RTX the value to set if CMP == MEM.  */
   1512 
   1513 void
   1514 xtensa_expand_compare_and_swap (rtx target, rtx mem, rtx cmp, rtx new_rtx)
   1515 {
   1516   machine_mode mode = GET_MODE (mem);
   1517   struct alignment_context ac;
   1518   rtx tmp, cmpv, newv, val;
   1519   rtx oldval = gen_reg_rtx (SImode);
   1520   rtx res = gen_reg_rtx (SImode);
   1521   rtx_code_label *csloop = gen_label_rtx ();
   1522   rtx_code_label *csend = gen_label_rtx ();
   1523 
   1524   init_alignment_context (&ac, mem);
   1525 
   1526   if (ac.shift != NULL_RTX)
   1527     {
   1528       cmp = xtensa_expand_mask_and_shift (cmp, mode, ac.shift);
   1529       new_rtx = xtensa_expand_mask_and_shift (new_rtx, mode, ac.shift);
   1530     }
   1531 
   1532   /* Load the surrounding word into VAL with the MEM value masked out.  */
   1533   val = force_reg (SImode, expand_simple_binop (SImode, AND, ac.memsi,
   1534 						ac.modemaski, NULL_RTX, 1,
   1535 						OPTAB_DIRECT));
   1536   emit_label (csloop);
   1537 
   1538   /* Patch CMP and NEW_RTX into VAL at correct position.  */
   1539   cmpv = force_reg (SImode, expand_simple_binop (SImode, IOR, cmp, val,
   1540 						 NULL_RTX, 1, OPTAB_DIRECT));
   1541   newv = force_reg (SImode, expand_simple_binop (SImode, IOR, new_rtx, val,
   1542 						 NULL_RTX, 1, OPTAB_DIRECT));
   1543 
   1544   /* Jump to end if we're done.  */
   1545   emit_insn (gen_sync_compare_and_swapsi (res, ac.memsi, cmpv, newv));
   1546   emit_cmp_and_jump_insns (res, cmpv, EQ, const0_rtx, SImode, true, csend);
   1547 
   1548   /* Check for changes outside mode.  */
   1549   emit_move_insn (oldval, val);
   1550   tmp = expand_simple_binop (SImode, AND, res, ac.modemaski,
   1551 			     val, 1, OPTAB_DIRECT);
   1552   if (tmp != val)
   1553     emit_move_insn (val, tmp);
   1554 
   1555   /* Loop internal if so.  */
   1556   emit_cmp_and_jump_insns (oldval, val, NE, const0_rtx, SImode, true, csloop);
   1557 
   1558   emit_label (csend);
   1559 
   1560   /* Return the correct part of the bitfield.  */
   1561   convert_move (target,
   1562 		(ac.shift == NULL_RTX ? res
   1563 		 : expand_simple_binop (SImode, LSHIFTRT, res, ac.shift,
   1564 					NULL_RTX, 1, OPTAB_DIRECT)),
   1565 		1);
   1566 }
   1567 
   1568 
   1569 /* Expand an atomic operation CODE of mode MODE (either HImode or QImode --
   1570    the default expansion works fine for SImode).  MEM is the memory location
   1571    and VAL the value to play with.  If AFTER is true then store the value
   1572    MEM holds after the operation, if AFTER is false then store the value MEM
   1573    holds before the operation.  If TARGET is zero then discard that value, else
   1574    store it to TARGET.  */
   1575 
   1576 void
   1577 xtensa_expand_atomic (enum rtx_code code, rtx target, rtx mem, rtx val,
   1578 		      bool after)
   1579 {
   1580   machine_mode mode = GET_MODE (mem);
   1581   struct alignment_context ac;
   1582   rtx_code_label *csloop = gen_label_rtx ();
   1583   rtx cmp, tmp;
   1584   rtx old = gen_reg_rtx (SImode);
   1585   rtx new_rtx = gen_reg_rtx (SImode);
   1586   rtx orig = NULL_RTX;
   1587 
   1588   init_alignment_context (&ac, mem);
   1589 
   1590   /* Prepare values before the compare-and-swap loop.  */
   1591   if (ac.shift != NULL_RTX)
   1592     val = xtensa_expand_mask_and_shift (val, mode, ac.shift);
   1593   switch (code)
   1594     {
   1595     case PLUS:
   1596     case MINUS:
   1597       orig = gen_reg_rtx (SImode);
   1598       convert_move (orig, val, 1);
   1599       break;
   1600 
   1601     case SET:
   1602     case IOR:
   1603     case XOR:
   1604       break;
   1605 
   1606     case MULT: /* NAND */
   1607     case AND:
   1608       /* val = "11..1<val>11..1" */
   1609       val = expand_simple_binop (SImode, XOR, val, ac.modemaski,
   1610 				 NULL_RTX, 1, OPTAB_DIRECT);
   1611       break;
   1612 
   1613     default:
   1614       gcc_unreachable ();
   1615     }
   1616 
   1617   /* Load full word.  Subsequent loads are performed by S32C1I.  */
   1618   cmp = force_reg (SImode, ac.memsi);
   1619 
   1620   emit_label (csloop);
   1621   emit_move_insn (old, cmp);
   1622 
   1623   switch (code)
   1624     {
   1625     case PLUS:
   1626     case MINUS:
   1627       val = expand_simple_binop (SImode, code, old, orig,
   1628 				 NULL_RTX, 1, OPTAB_DIRECT);
   1629       val = expand_simple_binop (SImode, AND, val, ac.modemask,
   1630 				 NULL_RTX, 1, OPTAB_DIRECT);
   1631       /* FALLTHRU */
   1632     case SET:
   1633       tmp = expand_simple_binop (SImode, AND, old, ac.modemaski,
   1634 				 NULL_RTX, 1, OPTAB_DIRECT);
   1635       tmp = expand_simple_binop (SImode, IOR, tmp, val,
   1636 				 new_rtx, 1, OPTAB_DIRECT);
   1637       break;
   1638 
   1639     case AND:
   1640     case IOR:
   1641     case XOR:
   1642       tmp = expand_simple_binop (SImode, code, old, val,
   1643 				 new_rtx, 1, OPTAB_DIRECT);
   1644       break;
   1645 
   1646     case MULT: /* NAND */
   1647       tmp = expand_simple_binop (SImode, AND, old, val,
   1648 				 NULL_RTX, 1, OPTAB_DIRECT);
   1649       tmp = expand_simple_binop (SImode, XOR, tmp, ac.modemask,
   1650 				 new_rtx, 1, OPTAB_DIRECT);
   1651       break;
   1652 
   1653     default:
   1654       gcc_unreachable ();
   1655     }
   1656 
   1657   if (tmp != new_rtx)
   1658     emit_move_insn (new_rtx, tmp);
   1659   emit_insn (gen_sync_compare_and_swapsi (cmp, ac.memsi, old, new_rtx));
   1660   emit_cmp_and_jump_insns (cmp, old, NE, const0_rtx, SImode, true, csloop);
   1661 
   1662   if (target)
   1663     {
   1664       tmp = (after ? new_rtx : cmp);
   1665       convert_move (target,
   1666 		    (ac.shift == NULL_RTX ? tmp
   1667 		     : expand_simple_binop (SImode, LSHIFTRT, tmp, ac.shift,
   1668 					    NULL_RTX, 1, OPTAB_DIRECT)),
   1669 		    1);
   1670     }
   1671 }
   1672 
   1673 
   1674 void
   1675 xtensa_setup_frame_addresses (void)
   1676 {
   1677   /* Set flag to cause TARGET_FRAME_POINTER_REQUIRED to return true.  */
   1678   cfun->machine->accesses_prev_frame = 1;
   1679 
   1680   if (TARGET_WINDOWED_ABI)
   1681     emit_library_call
   1682       (gen_rtx_SYMBOL_REF (Pmode, "__xtensa_libgcc_window_spill"),
   1683        LCT_NORMAL, VOIDmode);
   1684 }
   1685 
   1686 
   1687 /* Emit the assembly for the end of a zero-cost loop.  Normally we just emit
   1688    a comment showing where the end of the loop is.  However, if there is a
   1689    label or a branch at the end of the loop then we need to place a nop
   1690    there.  If the loop ends with a label we need the nop so that branches
   1691    targeting that label will target the nop (and thus remain in the loop),
   1692    instead of targeting the instruction after the loop (and thus exiting
   1693    the loop).  If the loop ends with a branch, we need the nop in case the
   1694    branch is targeting a location inside the loop.  When the branch
   1695    executes it will cause the loop count to be decremented even if it is
   1696    taken (because it is the last instruction in the loop), so we need to
   1697    nop after the branch to prevent the loop count from being decremented
   1698    when the branch is taken.  */
   1699 
   1700 void
   1701 xtensa_emit_loop_end (rtx_insn *insn, rtx *operands)
   1702 {
   1703   char done = 0;
   1704 
   1705   for (insn = PREV_INSN (insn); insn && !done; insn = PREV_INSN (insn))
   1706     {
   1707       switch (GET_CODE (insn))
   1708 	{
   1709 	case NOTE:
   1710 	case BARRIER:
   1711 	  break;
   1712 
   1713 	case CODE_LABEL:
   1714 	  output_asm_insn (TARGET_DENSITY ? "nop.n" : "nop", operands);
   1715 	  done = 1;
   1716 	  break;
   1717 
   1718 	default:
   1719 	  {
   1720 	    rtx body = PATTERN (insn);
   1721 
   1722 	    if (JUMP_P (body))
   1723 	      {
   1724 		output_asm_insn (TARGET_DENSITY ? "nop.n" : "nop", operands);
   1725 		done = 1;
   1726 	      }
   1727 	    else if ((GET_CODE (body) != USE)
   1728 		     && (GET_CODE (body) != CLOBBER))
   1729 	      done = 1;
   1730 	  }
   1731 	  break;
   1732         }
   1733     }
   1734 
   1735   output_asm_insn ("%1_LEND:", operands);
   1736 }
   1737 
   1738 
   1739 char *
   1740 xtensa_emit_branch (bool inverted, bool immed, rtx *operands)
   1741 {
   1742   static char result[64];
   1743   enum rtx_code code;
   1744   const char *op;
   1745 
   1746   code = GET_CODE (operands[3]);
   1747   switch (code)
   1748     {
   1749     case EQ:	op = inverted ? "ne" : "eq"; break;
   1750     case NE:	op = inverted ? "eq" : "ne"; break;
   1751     case LT:	op = inverted ? "ge" : "lt"; break;
   1752     case GE:	op = inverted ? "lt" : "ge"; break;
   1753     case LTU:	op = inverted ? "geu" : "ltu"; break;
   1754     case GEU:	op = inverted ? "ltu" : "geu"; break;
   1755     default:	gcc_unreachable ();
   1756     }
   1757 
   1758   if (immed)
   1759     {
   1760       if (INTVAL (operands[1]) == 0)
   1761 	sprintf (result, "b%sz%s\t%%0, %%2", op,
   1762 		 (TARGET_DENSITY && (code == EQ || code == NE)) ? ".n" : "");
   1763       else
   1764 	sprintf (result, "b%si\t%%0, %%d1, %%2", op);
   1765     }
   1766   else
   1767     sprintf (result, "b%s\t%%0, %%1, %%2", op);
   1768 
   1769   return result;
   1770 }
   1771 
   1772 
   1773 char *
   1774 xtensa_emit_bit_branch (bool inverted, bool immed, rtx *operands)
   1775 {
   1776   static char result[64];
   1777   const char *op;
   1778 
   1779   switch (GET_CODE (operands[3]))
   1780     {
   1781     case EQ:	op = inverted ? "bs" : "bc"; break;
   1782     case NE:	op = inverted ? "bc" : "bs"; break;
   1783     default:	gcc_unreachable ();
   1784     }
   1785 
   1786   if (immed)
   1787     {
   1788       unsigned bitnum = INTVAL (operands[1]) & 0x1f;
   1789       operands[1] = GEN_INT (bitnum);
   1790       sprintf (result, "b%si\t%%0, %%d1, %%2", op);
   1791     }
   1792   else
   1793     sprintf (result, "b%s\t%%0, %%1, %%2", op);
   1794 
   1795   return result;
   1796 }
   1797 
   1798 
   1799 char *
   1800 xtensa_emit_movcc (bool inverted, bool isfp, bool isbool, rtx *operands)
   1801 {
   1802   static char result[64];
   1803   enum rtx_code code;
   1804   const char *op;
   1805 
   1806   code = GET_CODE (operands[4]);
   1807   if (isbool)
   1808     {
   1809       switch (code)
   1810 	{
   1811 	case EQ:	op = inverted ? "t" : "f"; break;
   1812 	case NE:	op = inverted ? "f" : "t"; break;
   1813 	default:	gcc_unreachable ();
   1814 	}
   1815     }
   1816   else
   1817     {
   1818       switch (code)
   1819 	{
   1820 	case EQ:	op = inverted ? "nez" : "eqz"; break;
   1821 	case NE:	op = inverted ? "eqz" : "nez"; break;
   1822 	case LT:	op = inverted ? "gez" : "ltz"; break;
   1823 	case GE:	op = inverted ? "ltz" : "gez"; break;
   1824 	default:	gcc_unreachable ();
   1825 	}
   1826     }
   1827 
   1828   sprintf (result, "mov%s%s\t%%0, %%%d, %%1",
   1829 	   op, isfp ? ".s" : "", inverted ? 3 : 2);
   1830   return result;
   1831 }
   1832 
   1833 
   1834 char *
   1835 xtensa_emit_call (int callop, rtx *operands)
   1836 {
   1837   static char result[64];
   1838   rtx tgt = operands[callop];
   1839 
   1840   if (GET_CODE (tgt) == CONST_INT)
   1841     sprintf (result, "call%d\t" HOST_WIDE_INT_PRINT_HEX,
   1842 	     WINDOW_SIZE, INTVAL (tgt));
   1843   else if (register_operand (tgt, VOIDmode))
   1844     sprintf (result, "callx%d\t%%%d", WINDOW_SIZE, callop);
   1845   else
   1846     sprintf (result, "call%d\t%%%d", WINDOW_SIZE, callop);
   1847 
   1848   return result;
   1849 }
   1850 
   1851 
   1852 bool
   1853 xtensa_legitimate_address_p (machine_mode mode, rtx addr, bool strict)
   1854 {
   1855   /* Allow constant pool addresses.  */
   1856   if (mode != BLKmode && GET_MODE_SIZE (mode) >= UNITS_PER_WORD
   1857       && ! TARGET_CONST16 && constantpool_address_p (addr)
   1858       && ! xtensa_tls_referenced_p (addr))
   1859     return true;
   1860 
   1861   while (GET_CODE (addr) == SUBREG)
   1862     addr = SUBREG_REG (addr);
   1863 
   1864   /* Allow base registers.  */
   1865   if (GET_CODE (addr) == REG && BASE_REG_P (addr, strict))
   1866     return true;
   1867 
   1868   /* Check for "register + offset" addressing.  */
   1869   if (GET_CODE (addr) == PLUS)
   1870     {
   1871       rtx xplus0 = XEXP (addr, 0);
   1872       rtx xplus1 = XEXP (addr, 1);
   1873       enum rtx_code code0;
   1874       enum rtx_code code1;
   1875 
   1876       while (GET_CODE (xplus0) == SUBREG)
   1877 	xplus0 = SUBREG_REG (xplus0);
   1878       code0 = GET_CODE (xplus0);
   1879 
   1880       while (GET_CODE (xplus1) == SUBREG)
   1881 	xplus1 = SUBREG_REG (xplus1);
   1882       code1 = GET_CODE (xplus1);
   1883 
   1884       /* Swap operands if necessary so the register is first.  */
   1885       if (code0 != REG && code1 == REG)
   1886 	{
   1887 	  xplus0 = XEXP (addr, 1);
   1888 	  xplus1 = XEXP (addr, 0);
   1889 	  code0 = GET_CODE (xplus0);
   1890 	  code1 = GET_CODE (xplus1);
   1891 	}
   1892 
   1893       if (code0 == REG && BASE_REG_P (xplus0, strict)
   1894 	  && code1 == CONST_INT
   1895 	  && xtensa_mem_offset (INTVAL (xplus1), mode))
   1896 	return true;
   1897     }
   1898 
   1899   return false;
   1900 }
   1901 
   1902 
   1903 /* Construct the SYMBOL_REF for the _TLS_MODULE_BASE_ symbol.  */
   1904 
   1905 static GTY(()) rtx xtensa_tls_module_base_symbol;
   1906 
   1907 static rtx
   1908 xtensa_tls_module_base (void)
   1909 {
   1910   if (! xtensa_tls_module_base_symbol)
   1911     {
   1912       xtensa_tls_module_base_symbol =
   1913 	gen_rtx_SYMBOL_REF (Pmode, "_TLS_MODULE_BASE_");
   1914       SYMBOL_REF_FLAGS (xtensa_tls_module_base_symbol)
   1915         |= TLS_MODEL_GLOBAL_DYNAMIC << SYMBOL_FLAG_TLS_SHIFT;
   1916     }
   1917 
   1918   return xtensa_tls_module_base_symbol;
   1919 }
   1920 
   1921 
   1922 static rtx_insn *
   1923 xtensa_call_tls_desc (rtx sym, rtx *retp)
   1924 {
   1925   rtx fn, arg, a_io;
   1926   rtx_insn *call_insn, *insns;
   1927 
   1928   start_sequence ();
   1929   fn = gen_reg_rtx (Pmode);
   1930   arg = gen_reg_rtx (Pmode);
   1931   a_io = gen_rtx_REG (Pmode, WINDOW_SIZE + 2);
   1932 
   1933   emit_insn (gen_tls_func (fn, sym));
   1934   emit_insn (gen_tls_arg (arg, sym));
   1935   emit_move_insn (a_io, arg);
   1936   call_insn = emit_call_insn (gen_tls_call (a_io, fn, sym, const1_rtx));
   1937   use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn), a_io);
   1938   insns = get_insns ();
   1939   end_sequence ();
   1940 
   1941   *retp = a_io;
   1942   return insns;
   1943 }
   1944 
   1945 
   1946 static rtx
   1947 xtensa_legitimize_tls_address (rtx x)
   1948 {
   1949   unsigned int model = SYMBOL_REF_TLS_MODEL (x);
   1950   rtx dest, tp, ret, modbase, base, addend;
   1951   rtx_insn *insns;
   1952 
   1953   dest = gen_reg_rtx (Pmode);
   1954   switch (model)
   1955     {
   1956     case TLS_MODEL_GLOBAL_DYNAMIC:
   1957       insns = xtensa_call_tls_desc (x, &ret);
   1958       emit_libcall_block (insns, dest, ret, x);
   1959       break;
   1960 
   1961     case TLS_MODEL_LOCAL_DYNAMIC:
   1962       base = gen_reg_rtx (Pmode);
   1963       modbase = xtensa_tls_module_base ();
   1964       insns = xtensa_call_tls_desc (modbase, &ret);
   1965       emit_libcall_block (insns, base, ret, modbase);
   1966       addend = force_reg (SImode, gen_sym_DTPOFF (x));
   1967       emit_insn (gen_addsi3 (dest, base, addend));
   1968       break;
   1969 
   1970     case TLS_MODEL_INITIAL_EXEC:
   1971     case TLS_MODEL_LOCAL_EXEC:
   1972       tp = gen_reg_rtx (SImode);
   1973       emit_insn (gen_get_thread_pointersi (tp));
   1974       addend = force_reg (SImode, gen_sym_TPOFF (x));
   1975       emit_insn (gen_addsi3 (dest, tp, addend));
   1976       break;
   1977 
   1978     default:
   1979       gcc_unreachable ();
   1980     }
   1981 
   1982   return dest;
   1983 }
   1984 
   1985 
   1986 rtx
   1987 xtensa_legitimize_address (rtx x,
   1988 			   rtx oldx ATTRIBUTE_UNUSED,
   1989 			   machine_mode mode)
   1990 {
   1991   if (xtensa_tls_symbol_p (x))
   1992     return xtensa_legitimize_tls_address (x);
   1993 
   1994   if (GET_CODE (x) == PLUS)
   1995     {
   1996       rtx plus0 = XEXP (x, 0);
   1997       rtx plus1 = XEXP (x, 1);
   1998 
   1999       if (GET_CODE (plus0) != REG && GET_CODE (plus1) == REG)
   2000 	{
   2001 	  plus0 = XEXP (x, 1);
   2002 	  plus1 = XEXP (x, 0);
   2003 	}
   2004 
   2005       /* Try to split up the offset to use an ADDMI instruction.  */
   2006       if (GET_CODE (plus0) == REG
   2007 	  && GET_CODE (plus1) == CONST_INT
   2008 	  && !xtensa_mem_offset (INTVAL (plus1), mode)
   2009 	  && !xtensa_simm8 (INTVAL (plus1))
   2010 	  && xtensa_mem_offset (INTVAL (plus1) & 0xff, mode)
   2011 	  && xtensa_simm8x256 (INTVAL (plus1) & ~0xff))
   2012 	{
   2013 	  rtx temp = gen_reg_rtx (Pmode);
   2014 	  rtx addmi_offset = GEN_INT (INTVAL (plus1) & ~0xff);
   2015 	  emit_insn (gen_rtx_SET (temp, gen_rtx_PLUS (Pmode, plus0,
   2016 						      addmi_offset)));
   2017 	  return gen_rtx_PLUS (Pmode, temp, GEN_INT (INTVAL (plus1) & 0xff));
   2018 	}
   2019     }
   2020 
   2021   return x;
   2022 }
   2023 
   2024 /* Worker function for TARGET_MODE_DEPENDENT_ADDRESS_P.
   2025 
   2026    Treat constant-pool references as "mode dependent" since they can
   2027    only be accessed with SImode loads.  This works around a bug in the
   2028    combiner where a constant pool reference is temporarily converted
   2029    to an HImode load, which is then assumed to zero-extend based on
   2030    our definition of LOAD_EXTEND_OP.  This is wrong because the high
   2031    bits of a 16-bit value in the constant pool are now sign-extended
   2032    by default.  */
   2033 
   2034 static bool
   2035 xtensa_mode_dependent_address_p (const_rtx addr,
   2036 				 addr_space_t as ATTRIBUTE_UNUSED)
   2037 {
   2038   return constantpool_address_p (addr);
   2039 }
   2040 
   2041 /* Return TRUE if X contains any TLS symbol references.  */
   2042 
   2043 bool
   2044 xtensa_tls_referenced_p (rtx x)
   2045 {
   2046   if (! targetm.have_tls)
   2047     return false;
   2048 
   2049   subrtx_iterator::array_type array;
   2050   FOR_EACH_SUBRTX (iter, array, x, ALL)
   2051     {
   2052       const_rtx x = *iter;
   2053       if (GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (x) != 0)
   2054 	return true;
   2055 
   2056       /* Ignore TLS references that have already been legitimized.  */
   2057       if (GET_CODE (x) == UNSPEC)
   2058 	switch (XINT (x, 1))
   2059 	  {
   2060 	  case UNSPEC_TPOFF:
   2061 	  case UNSPEC_DTPOFF:
   2062 	  case UNSPEC_TLS_FUNC:
   2063 	  case UNSPEC_TLS_ARG:
   2064 	  case UNSPEC_TLS_CALL:
   2065 	    iter.skip_subrtxes ();
   2066 	    break;
   2067 	  default:
   2068 	    break;
   2069 	  }
   2070     }
   2071   return false;
   2072 }
   2073 
   2074 
   2075 /* Implement TARGET_CANNOT_FORCE_CONST_MEM.  */
   2076 
   2077 static bool
   2078 xtensa_cannot_force_const_mem (machine_mode mode ATTRIBUTE_UNUSED, rtx x)
   2079 {
   2080   return xtensa_tls_referenced_p (x);
   2081 }
   2082 
   2083 
   2084 /* Return the debugger register number to use for 'regno'.  */
   2085 
   2086 int
   2087 xtensa_dbx_register_number (int regno)
   2088 {
   2089   int first = -1;
   2090 
   2091   if (GP_REG_P (regno))
   2092     {
   2093       regno -= GP_REG_FIRST;
   2094       first = 0;
   2095     }
   2096   else if (BR_REG_P (regno))
   2097     {
   2098       regno -= BR_REG_FIRST;
   2099       first = 16;
   2100     }
   2101   else if (FP_REG_P (regno))
   2102     {
   2103       regno -= FP_REG_FIRST;
   2104       first = 48;
   2105     }
   2106   else if (ACC_REG_P (regno))
   2107     {
   2108       first = 0x200;	/* Start of Xtensa special registers.  */
   2109       regno = 16;	/* ACCLO is special register 16.  */
   2110     }
   2111 
   2112   /* When optimizing, we sometimes get asked about pseudo-registers
   2113      that don't represent hard registers.  Return 0 for these.  */
   2114   if (first == -1)
   2115     return 0;
   2116 
   2117   return first + regno;
   2118 }
   2119 
   2120 
   2121 /* Argument support functions.  */
   2122 
   2123 /* Initialize CUMULATIVE_ARGS for a function.  */
   2124 
   2125 void
   2126 init_cumulative_args (CUMULATIVE_ARGS *cum, int incoming)
   2127 {
   2128   cum->arg_words = 0;
   2129   cum->incoming = incoming;
   2130 }
   2131 
   2132 
   2133 /* Advance the argument to the next argument position.  */
   2134 
   2135 static void
   2136 xtensa_function_arg_advance (cumulative_args_t cum,
   2137 			     const function_arg_info &arg)
   2138 {
   2139   int words, max;
   2140   int *arg_words;
   2141 
   2142   arg_words = &get_cumulative_args (cum)->arg_words;
   2143   max = MAX_ARGS_IN_REGISTERS;
   2144 
   2145   words = ((arg.promoted_size_in_bytes () + UNITS_PER_WORD - 1)
   2146 	   / UNITS_PER_WORD);
   2147 
   2148   if (*arg_words < max
   2149       && (targetm.calls.must_pass_in_stack (arg)
   2150 	  || *arg_words + words > max))
   2151     *arg_words = max;
   2152 
   2153   *arg_words += words;
   2154 }
   2155 
   2156 
   2157 /* Return an RTL expression containing the register for the given argument,
   2158    or 0 if the argument is to be passed on the stack.  INCOMING_P is nonzero
   2159    if this is an incoming argument to the current function.  */
   2160 
   2161 static rtx
   2162 xtensa_function_arg_1 (cumulative_args_t cum_v, const function_arg_info &arg,
   2163 		       bool incoming_p)
   2164 {
   2165   CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
   2166   int regbase, words, max;
   2167   int *arg_words;
   2168   int regno;
   2169 
   2170   arg_words = &cum->arg_words;
   2171   regbase = (incoming_p ? GP_ARG_FIRST : GP_OUTGOING_ARG_FIRST);
   2172   max = MAX_ARGS_IN_REGISTERS;
   2173 
   2174   words = ((arg.promoted_size_in_bytes () + UNITS_PER_WORD - 1)
   2175 	   / UNITS_PER_WORD);
   2176 
   2177   if (arg.type && (TYPE_ALIGN (arg.type) > BITS_PER_WORD))
   2178     {
   2179       int align = MIN (TYPE_ALIGN (arg.type), STACK_BOUNDARY) / BITS_PER_WORD;
   2180       *arg_words = (*arg_words + align - 1) & -align;
   2181     }
   2182 
   2183   if (*arg_words + words > max)
   2184     return (rtx)0;
   2185 
   2186   regno = regbase + *arg_words;
   2187 
   2188   if (cum->incoming && regno <= A7_REG && regno + words > A7_REG)
   2189     cfun->machine->need_a7_copy = TARGET_WINDOWED_ABI;
   2190 
   2191   return gen_rtx_REG (arg.mode, regno);
   2192 }
   2193 
   2194 /* Implement TARGET_FUNCTION_ARG.  */
   2195 
   2196 static rtx
   2197 xtensa_function_arg (cumulative_args_t cum, const function_arg_info &arg)
   2198 {
   2199   return xtensa_function_arg_1 (cum, arg, false);
   2200 }
   2201 
   2202 /* Implement TARGET_FUNCTION_INCOMING_ARG.  */
   2203 
   2204 static rtx
   2205 xtensa_function_incoming_arg (cumulative_args_t cum,
   2206 			      const function_arg_info &arg)
   2207 {
   2208   return xtensa_function_arg_1 (cum, arg, true);
   2209 }
   2210 
   2211 static unsigned int
   2212 xtensa_function_arg_boundary (machine_mode mode, const_tree type)
   2213 {
   2214   unsigned int alignment;
   2215 
   2216   alignment = type ? TYPE_ALIGN (type) : GET_MODE_ALIGNMENT (mode);
   2217   if (alignment < PARM_BOUNDARY)
   2218     alignment = PARM_BOUNDARY;
   2219   if (alignment > STACK_BOUNDARY)
   2220     alignment = STACK_BOUNDARY;
   2221   return alignment;
   2222 }
   2223 
   2224 
   2225 static bool
   2226 xtensa_return_in_msb (const_tree valtype)
   2227 {
   2228   return (TARGET_BIG_ENDIAN
   2229 	  && AGGREGATE_TYPE_P (valtype)
   2230 	  && int_size_in_bytes (valtype) >= UNITS_PER_WORD);
   2231 }
   2232 
   2233 
   2234 static void
   2235 xtensa_option_override (void)
   2236 {
   2237   int regno;
   2238   machine_mode mode;
   2239 
   2240   if (xtensa_windowed_abi == -1)
   2241     xtensa_windowed_abi = TARGET_WINDOWED_ABI_DEFAULT;
   2242 
   2243   if (! TARGET_THREADPTR)
   2244     targetm.have_tls = false;
   2245 
   2246   /* Use CONST16 in the absence of L32R.
   2247      Set it in the TARGET_OPTION_OVERRIDE to avoid dependency on xtensa
   2248      configuration in the xtensa-common.cc  */
   2249 
   2250   if (!TARGET_L32R)
   2251     target_flags |= MASK_CONST16;
   2252 
   2253   if (!TARGET_BOOLEANS && TARGET_HARD_FLOAT)
   2254     error ("boolean registers required for the floating-point option");
   2255 
   2256   /* Set up array giving whether a given register can hold a given mode.  */
   2257   for (mode = VOIDmode;
   2258        mode != MAX_MACHINE_MODE;
   2259        mode = (machine_mode) ((int) mode + 1))
   2260     {
   2261       int size = GET_MODE_SIZE (mode);
   2262       enum mode_class mclass = GET_MODE_CLASS (mode);
   2263 
   2264       for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
   2265 	{
   2266 	  int temp;
   2267 
   2268 	  if (ACC_REG_P (regno))
   2269 	    temp = (TARGET_MAC16
   2270 		    && (mclass == MODE_INT) && (size <= UNITS_PER_WORD));
   2271 	  else if (GP_REG_P (regno))
   2272 	    temp = ((regno & 1) == 0 || (size <= UNITS_PER_WORD));
   2273 	  else if (FP_REG_P (regno))
   2274 	    temp = (TARGET_HARD_FLOAT && (mode == SFmode));
   2275 	  else if (BR_REG_P (regno))
   2276 	    temp = (TARGET_BOOLEANS && (mode == CCmode));
   2277 	  else
   2278 	    temp = FALSE;
   2279 
   2280 	  xtensa_hard_regno_mode_ok_p[(int) mode][regno] = temp;
   2281 	}
   2282     }
   2283 
   2284   init_machine_status = xtensa_init_machine_status;
   2285 
   2286   /* Check PIC settings.  PIC is only supported when using L32R
   2287      instructions, and some targets need to always use PIC.  */
   2288   if (flag_pic && TARGET_CONST16)
   2289     error ("%<-f%s%> is not supported with CONST16 instructions",
   2290 	   (flag_pic > 1 ? "PIC" : "pic"));
   2291   else if (TARGET_FORCE_NO_PIC)
   2292     flag_pic = 0;
   2293   else if (XTENSA_ALWAYS_PIC)
   2294     {
   2295       if (TARGET_CONST16)
   2296 	error ("PIC is required but not supported with CONST16 instructions");
   2297       flag_pic = 1;
   2298     }
   2299   /* There's no need for -fPIC (as opposed to -fpic) on Xtensa.  */
   2300   if (flag_pic > 1)
   2301     flag_pic = 1;
   2302   if (flag_pic && !flag_pie)
   2303     flag_shlib = 1;
   2304 
   2305   /* Hot/cold partitioning does not work on this architecture, because of
   2306      constant pools (the load instruction cannot necessarily reach that far).
   2307      Therefore disable it on this architecture.  */
   2308   if (flag_reorder_blocks_and_partition)
   2309     {
   2310       flag_reorder_blocks_and_partition = 0;
   2311       flag_reorder_blocks = 1;
   2312     }
   2313 }
   2314 
   2315 /* Implement TARGET_HARD_REGNO_NREGS.  */
   2316 
   2317 static unsigned int
   2318 xtensa_hard_regno_nregs (unsigned int regno, machine_mode mode)
   2319 {
   2320   if (FP_REG_P (regno))
   2321     return CEIL (GET_MODE_SIZE (mode), UNITS_PER_FPREG);
   2322   return CEIL (GET_MODE_SIZE (mode), UNITS_PER_WORD);
   2323 }
   2324 
   2325 /* Implement TARGET_HARD_REGNO_MODE_OK.  */
   2326 
   2327 static bool
   2328 xtensa_hard_regno_mode_ok (unsigned int regno, machine_mode mode)
   2329 {
   2330   return xtensa_hard_regno_mode_ok_p[mode][regno];
   2331 }
   2332 
   2333 /* Implement TARGET_MODES_TIEABLE_P.  */
   2334 
   2335 static bool
   2336 xtensa_modes_tieable_p (machine_mode mode1, machine_mode mode2)
   2337 {
   2338   return ((GET_MODE_CLASS (mode1) == MODE_FLOAT
   2339 	   || GET_MODE_CLASS (mode1) == MODE_COMPLEX_FLOAT)
   2340 	  == (GET_MODE_CLASS (mode2) == MODE_FLOAT
   2341 	      || GET_MODE_CLASS (mode2) == MODE_COMPLEX_FLOAT));
   2342 }
   2343 
   2344 /* A C compound statement to output to stdio stream STREAM the
   2345    assembler syntax for an instruction operand X.  X is an RTL
   2346    expression.
   2347 
   2348    CODE is a value that can be used to specify one of several ways
   2349    of printing the operand.  It is used when identical operands
   2350    must be printed differently depending on the context.  CODE
   2351    comes from the '%' specification that was used to request
   2352    printing of the operand.  If the specification was just '%DIGIT'
   2353    then CODE is 0; if the specification was '%LTR DIGIT' then CODE
   2354    is the ASCII code for LTR.
   2355 
   2356    If X is a register, this macro should print the register's name.
   2357    The names can be found in an array 'reg_names' whose type is
   2358    'char *[]'.  'reg_names' is initialized from 'REGISTER_NAMES'.
   2359 
   2360    When the machine description has a specification '%PUNCT' (a '%'
   2361    followed by a punctuation character), this macro is called with
   2362    a null pointer for X and the punctuation character for CODE.
   2363 
   2364    'a', 'c', 'l', and 'n' are reserved.
   2365 
   2366    The Xtensa specific codes are:
   2367 
   2368    'd'  CONST_INT, print as signed decimal
   2369    'x'  CONST_INT, print as signed hexadecimal
   2370    'K'  CONST_INT, print number of bits in mask for EXTUI
   2371    'R'  CONST_INT, print (X & 0x1f)
   2372    'L'  CONST_INT, print ((32 - X) & 0x1f)
   2373    'D'  REG, print second register of double-word register operand
   2374    'N'  MEM, print address of next word following a memory operand
   2375    'v'  MEM, if memory reference is volatile, output a MEMW before it
   2376    't'  any constant, add "@h" suffix for top 16 bits
   2377    'b'  any constant, add "@l" suffix for bottom 16 bits
   2378 */
   2379 
   2380 static void
   2381 printx (FILE *file, signed int val)
   2382 {
   2383   /* Print a hexadecimal value in a nice way.  */
   2384   if ((val > -0xa) && (val < 0xa))
   2385     fprintf (file, "%d", val);
   2386   else if (val < 0)
   2387     fprintf (file, "-0x%x", -val);
   2388   else
   2389     fprintf (file, "0x%x", val);
   2390 }
   2391 
   2392 
   2393 void
   2394 print_operand (FILE *file, rtx x, int letter)
   2395 {
   2396   if (!x)
   2397     error ("%<PRINT_OPERAND%> null pointer");
   2398 
   2399   switch (letter)
   2400     {
   2401     case 'D':
   2402       if (GET_CODE (x) == REG || GET_CODE (x) == SUBREG)
   2403 	fprintf (file, "%s", reg_names[xt_true_regnum (x) + 1]);
   2404       else
   2405 	output_operand_lossage ("invalid %%D value");
   2406       break;
   2407 
   2408     case 'v':
   2409       if (GET_CODE (x) == MEM)
   2410 	{
   2411 	  /* For a volatile memory reference, emit a MEMW before the
   2412 	     load or store.  */
   2413 	  if (MEM_VOLATILE_P (x) && TARGET_SERIALIZE_VOLATILE)
   2414 	    fprintf (file, "memw\n\t");
   2415 	}
   2416       else
   2417 	output_operand_lossage ("invalid %%v value");
   2418       break;
   2419 
   2420     case 'N':
   2421       if (GET_CODE (x) == MEM
   2422 	  && (GET_MODE (x) == DFmode || GET_MODE (x) == DImode))
   2423 	{
   2424 	  x = adjust_address (x, GET_MODE (x) == DFmode ? E_SFmode : E_SImode,
   2425 			      4);
   2426 	  output_address (GET_MODE (x), XEXP (x, 0));
   2427 	}
   2428       else
   2429 	output_operand_lossage ("invalid %%N value");
   2430       break;
   2431 
   2432     case 'K':
   2433       if (GET_CODE (x) == CONST_INT)
   2434 	{
   2435 	  int num_bits = 0;
   2436 	  unsigned val = INTVAL (x);
   2437 	  while (val & 1)
   2438 	    {
   2439 	      num_bits += 1;
   2440 	      val = val >> 1;
   2441 	    }
   2442 	  if ((val != 0) || (num_bits == 0) || (num_bits > 16))
   2443 	    fatal_insn ("invalid mask", x);
   2444 
   2445 	  fprintf (file, "%d", num_bits);
   2446 	}
   2447       else
   2448 	output_operand_lossage ("invalid %%K value");
   2449       break;
   2450 
   2451     case 'L':
   2452       if (GET_CODE (x) == CONST_INT)
   2453 	fprintf (file, HOST_WIDE_INT_PRINT_DEC, (32 - INTVAL (x)) & 0x1f);
   2454       else
   2455 	output_operand_lossage ("invalid %%L value");
   2456       break;
   2457 
   2458     case 'R':
   2459       if (GET_CODE (x) == CONST_INT)
   2460 	fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (x) & 0x1f);
   2461       else
   2462 	output_operand_lossage ("invalid %%R value");
   2463       break;
   2464 
   2465     case 'x':
   2466       if (GET_CODE (x) == CONST_INT)
   2467 	printx (file, INTVAL (x));
   2468       else
   2469 	output_operand_lossage ("invalid %%x value");
   2470       break;
   2471 
   2472     case 'd':
   2473       if (GET_CODE (x) == CONST_INT)
   2474 	fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (x));
   2475       else
   2476 	output_operand_lossage ("invalid %%d value");
   2477       break;
   2478 
   2479     case 't':
   2480     case 'b':
   2481       if (GET_CODE (x) == CONST_INT)
   2482 	{
   2483 	  printx (file, INTVAL (x));
   2484 	  fputs (letter == 't' ? "@h" : "@l", file);
   2485 	}
   2486       else if (GET_CODE (x) == CONST_DOUBLE)
   2487 	{
   2488 	  if (GET_MODE (x) == SFmode)
   2489 	    {
   2490 	      long l;
   2491 	      REAL_VALUE_TO_TARGET_SINGLE (*CONST_DOUBLE_REAL_VALUE (x), l);
   2492 	      fprintf (file, "0x%08lx@%c", l, letter == 't' ? 'h' : 'l');
   2493 	    }
   2494 	  else
   2495 	    output_operand_lossage ("invalid %%t/%%b value");
   2496 	}
   2497       else if (GET_CODE (x) == CONST)
   2498 	{
   2499 	  /* X must be a symbolic constant on ELF.  Write an expression
   2500 	     suitable for 'const16' that sets the high or low 16 bits.  */
   2501 	  if (GET_CODE (XEXP (x, 0)) != PLUS
   2502 	      || (GET_CODE (XEXP (XEXP (x, 0), 0)) != SYMBOL_REF
   2503 		  && GET_CODE (XEXP (XEXP (x, 0), 0)) != LABEL_REF)
   2504 	      || GET_CODE (XEXP (XEXP (x, 0), 1)) != CONST_INT)
   2505 	    output_operand_lossage ("invalid %%t/%%b value");
   2506 	  print_operand (file, XEXP (XEXP (x, 0), 0), 0);
   2507 	  fputs (letter == 't' ? "@h" : "@l", file);
   2508 	  /* There must be a non-alphanumeric character between 'h' or 'l'
   2509 	     and the number.  The '-' is added by print_operand() already.  */
   2510 	  if (INTVAL (XEXP (XEXP (x, 0), 1)) >= 0)
   2511 	    fputs ("+", file);
   2512 	  print_operand (file, XEXP (XEXP (x, 0), 1), 0);
   2513 	}
   2514       else
   2515 	{
   2516 	  output_addr_const (file, x);
   2517 	  fputs (letter == 't' ? "@h" : "@l", file);
   2518 	}
   2519       break;
   2520 
   2521     case 'y':
   2522       if (GET_CODE (x) == CONST_DOUBLE &&
   2523 	  GET_MODE (x) == SFmode)
   2524 	{
   2525 	  long l;
   2526 	  REAL_VALUE_TO_TARGET_SINGLE (*CONST_DOUBLE_REAL_VALUE (x), l);
   2527 	  fprintf (file, "0x%08lx", l);
   2528 	  break;
   2529 	}
   2530 
   2531       /* fall through */
   2532 
   2533     default:
   2534       if (GET_CODE (x) == REG || GET_CODE (x) == SUBREG)
   2535 	fprintf (file, "%s", reg_names[xt_true_regnum (x)]);
   2536       else if (GET_CODE (x) == MEM)
   2537 	output_address (GET_MODE (x), XEXP (x, 0));
   2538       else if (GET_CODE (x) == CONST_INT)
   2539 	fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (x));
   2540       else
   2541 	output_addr_const (file, x);
   2542     }
   2543 }
   2544 
   2545 
   2546 /* A C compound statement to output to stdio stream STREAM the
   2547    assembler syntax for an instruction operand that is a memory
   2548    reference whose address is ADDR.  ADDR is an RTL expression.  */
   2549 
   2550 void
   2551 print_operand_address (FILE *file, rtx addr)
   2552 {
   2553   if (!addr)
   2554     error ("%<PRINT_OPERAND_ADDRESS%>, null pointer");
   2555 
   2556   switch (GET_CODE (addr))
   2557     {
   2558     default:
   2559       fatal_insn ("invalid address", addr);
   2560       break;
   2561 
   2562     case REG:
   2563       fprintf (file, "%s, 0", reg_names [REGNO (addr)]);
   2564       break;
   2565 
   2566     case PLUS:
   2567       {
   2568 	rtx reg = (rtx)0;
   2569 	rtx offset = (rtx)0;
   2570 	rtx arg0 = XEXP (addr, 0);
   2571 	rtx arg1 = XEXP (addr, 1);
   2572 
   2573 	if (GET_CODE (arg0) == REG)
   2574 	  {
   2575 	    reg = arg0;
   2576 	    offset = arg1;
   2577 	  }
   2578 	else if (GET_CODE (arg1) == REG)
   2579 	  {
   2580 	    reg = arg1;
   2581 	    offset = arg0;
   2582 	  }
   2583 	else
   2584 	  fatal_insn ("no register in address", addr);
   2585 
   2586 	if (CONSTANT_P (offset))
   2587 	  {
   2588 	    fprintf (file, "%s, ", reg_names [REGNO (reg)]);
   2589 	    output_addr_const (file, offset);
   2590 	  }
   2591 	else
   2592 	  fatal_insn ("address offset not a constant", addr);
   2593       }
   2594       break;
   2595 
   2596     case LABEL_REF:
   2597     case SYMBOL_REF:
   2598     case CONST_INT:
   2599     case CONST:
   2600       output_addr_const (file, addr);
   2601       break;
   2602     }
   2603 }
   2604 
   2605 /* Implement TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA.  */
   2606 
   2607 static bool
   2608 xtensa_output_addr_const_extra (FILE *fp, rtx x)
   2609 {
   2610   if (GET_CODE (x) == UNSPEC && XVECLEN (x, 0) == 1)
   2611     {
   2612       switch (XINT (x, 1))
   2613 	{
   2614 	case UNSPEC_TPOFF:
   2615 	  output_addr_const (fp, XVECEXP (x, 0, 0));
   2616 	  fputs ("@TPOFF", fp);
   2617 	  return true;
   2618 	case UNSPEC_DTPOFF:
   2619 	  output_addr_const (fp, XVECEXP (x, 0, 0));
   2620 	  fputs ("@DTPOFF", fp);
   2621 	  return true;
   2622 	case UNSPEC_PLT:
   2623 	  if (flag_pic)
   2624 	    {
   2625 	      output_addr_const (fp, XVECEXP (x, 0, 0));
   2626 	      fputs ("@PLT", fp);
   2627 	      return true;
   2628 	    }
   2629 	  break;
   2630 	default:
   2631 	  break;
   2632 	}
   2633     }
   2634   return false;
   2635 }
   2636 
   2637 static void
   2638 xtensa_output_integer_literal_parts (FILE *file, rtx x, int size)
   2639 {
   2640   if (size > 4 && !(size & (size - 1)))
   2641     {
   2642       rtx first, second;
   2643 
   2644       split_double (x, &first, &second);
   2645       xtensa_output_integer_literal_parts (file, first, size / 2);
   2646       fputs (", ", file);
   2647       xtensa_output_integer_literal_parts (file, second, size / 2);
   2648     }
   2649   else if (size == 4)
   2650     {
   2651       output_addr_const (file, x);
   2652     }
   2653   else
   2654     {
   2655       gcc_unreachable();
   2656     }
   2657 }
   2658 
   2659 void
   2660 xtensa_output_literal (FILE *file, rtx x, machine_mode mode, int labelno)
   2661 {
   2662   long value_long[2];
   2663 
   2664   fprintf (file, "\t.literal .LC%u, ", (unsigned) labelno);
   2665 
   2666   switch (GET_MODE_CLASS (mode))
   2667     {
   2668     case MODE_FLOAT:
   2669       gcc_assert (GET_CODE (x) == CONST_DOUBLE);
   2670 
   2671       switch (mode)
   2672 	{
   2673 	case E_SFmode:
   2674 	  REAL_VALUE_TO_TARGET_SINGLE (*CONST_DOUBLE_REAL_VALUE (x),
   2675 				       value_long[0]);
   2676 	  if (HOST_BITS_PER_LONG > 32)
   2677 	    value_long[0] &= 0xffffffff;
   2678 	  fprintf (file, "0x%08lx\n", value_long[0]);
   2679 	  break;
   2680 
   2681 	case E_DFmode:
   2682 	  REAL_VALUE_TO_TARGET_DOUBLE (*CONST_DOUBLE_REAL_VALUE (x),
   2683 				       value_long);
   2684 	  if (HOST_BITS_PER_LONG > 32)
   2685 	    {
   2686 	      value_long[0] &= 0xffffffff;
   2687 	      value_long[1] &= 0xffffffff;
   2688 	    }
   2689 	  fprintf (file, "0x%08lx, 0x%08lx\n",
   2690 		   value_long[0], value_long[1]);
   2691 	  break;
   2692 
   2693 	default:
   2694 	  gcc_unreachable ();
   2695 	}
   2696 
   2697       break;
   2698 
   2699     case MODE_INT:
   2700     case MODE_PARTIAL_INT:
   2701       xtensa_output_integer_literal_parts (file, x, GET_MODE_SIZE (mode));
   2702       fputs ("\n", file);
   2703       break;
   2704 
   2705     default:
   2706       gcc_unreachable ();
   2707     }
   2708 }
   2709 
   2710 static bool
   2711 xtensa_call_save_reg(int regno)
   2712 {
   2713   if (TARGET_WINDOWED_ABI)
   2714     return false;
   2715 
   2716   if (regno == A0_REG)
   2717     return crtl->profile || !crtl->is_leaf || crtl->calls_eh_return ||
   2718       df_regs_ever_live_p (regno);
   2719 
   2720   if (crtl->calls_eh_return && regno >= 2 && regno < 4)
   2721     return true;
   2722 
   2723   return !call_used_or_fixed_reg_p (regno) && df_regs_ever_live_p (regno);
   2724 }
   2725 
   2726 /* Return the bytes needed to compute the frame pointer from the current
   2727    stack pointer.  */
   2728 
   2729 #define STACK_BYTES (STACK_BOUNDARY / BITS_PER_UNIT)
   2730 #define XTENSA_STACK_ALIGN(LOC) (((LOC) + STACK_BYTES-1) & ~(STACK_BYTES-1))
   2731 
   2732 long
   2733 compute_frame_size (poly_int64 size)
   2734 {
   2735   int regno;
   2736 
   2737   if (reload_completed && cfun->machine->frame_laid_out)
   2738     return cfun->machine->current_frame_size;
   2739 
   2740   /* Add space for the incoming static chain value.  */
   2741   if (cfun->static_chain_decl != NULL)
   2742     size += (1 * UNITS_PER_WORD);
   2743 
   2744   cfun->machine->callee_save_size = 0;
   2745   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; ++regno)
   2746     {
   2747       if (xtensa_call_save_reg(regno))
   2748 	cfun->machine->callee_save_size += UNITS_PER_WORD;
   2749     }
   2750 
   2751   cfun->machine->current_frame_size =
   2752     XTENSA_STACK_ALIGN (size
   2753 			+ cfun->machine->callee_save_size
   2754 			+ crtl->outgoing_args_size
   2755 			+ (WINDOW_SIZE * UNITS_PER_WORD));
   2756   cfun->machine->callee_save_size =
   2757     XTENSA_STACK_ALIGN (cfun->machine->callee_save_size);
   2758   cfun->machine->frame_laid_out = true;
   2759   return cfun->machine->current_frame_size;
   2760 }
   2761 
   2762 
   2763 bool
   2764 xtensa_frame_pointer_required (void)
   2765 {
   2766   /* The code to expand builtin_frame_addr and builtin_return_addr
   2767      currently uses the hard_frame_pointer instead of frame_pointer.
   2768      This seems wrong but maybe it's necessary for other architectures.
   2769      This function is derived from the i386 code.  */
   2770 
   2771   if (cfun->machine->accesses_prev_frame || cfun->has_nonlocal_label)
   2772     return true;
   2773 
   2774   return false;
   2775 }
   2776 
   2777 HOST_WIDE_INT
   2778 xtensa_initial_elimination_offset (int from, int to ATTRIBUTE_UNUSED)
   2779 {
   2780   long frame_size = compute_frame_size (get_frame_size ());
   2781   HOST_WIDE_INT offset;
   2782 
   2783   switch (from)
   2784     {
   2785     case FRAME_POINTER_REGNUM:
   2786       if (FRAME_GROWS_DOWNWARD)
   2787 	offset = frame_size - (WINDOW_SIZE * UNITS_PER_WORD)
   2788 	  - cfun->machine->callee_save_size;
   2789       else
   2790 	offset = 0;
   2791       break;
   2792     case ARG_POINTER_REGNUM:
   2793       offset = frame_size;
   2794       break;
   2795     default:
   2796       gcc_unreachable ();
   2797     }
   2798 
   2799   return offset;
   2800 }
   2801 
   2802 /* minimum frame = reg save area (4 words) plus static chain (1 word)
   2803    and the total number of words must be a multiple of 128 bits.  */
   2804 #define MIN_FRAME_SIZE (8 * UNITS_PER_WORD)
   2805 
   2806 void
   2807 xtensa_expand_prologue (void)
   2808 {
   2809   HOST_WIDE_INT total_size;
   2810   rtx_insn *insn = NULL;
   2811   rtx note_rtx;
   2812 
   2813 
   2814   total_size = compute_frame_size (get_frame_size ());
   2815 
   2816   if (flag_stack_usage_info)
   2817     current_function_static_stack_size = total_size;
   2818 
   2819   if (TARGET_WINDOWED_ABI)
   2820     {
   2821       if (total_size < (1 << (12+3)))
   2822 	insn = emit_insn (gen_entry (GEN_INT (total_size)));
   2823       else
   2824 	{
   2825 	  /* Use a8 as a temporary since a0-a7 may be live.  */
   2826 	  rtx tmp_reg = gen_rtx_REG (Pmode, A8_REG);
   2827 	  emit_insn (gen_entry (GEN_INT (MIN_FRAME_SIZE)));
   2828 	  emit_move_insn (tmp_reg, GEN_INT (total_size - MIN_FRAME_SIZE));
   2829 	  emit_insn (gen_subsi3 (tmp_reg, stack_pointer_rtx, tmp_reg));
   2830 	  insn = emit_insn (gen_movsi (stack_pointer_rtx, tmp_reg));
   2831 	}
   2832     }
   2833   else
   2834     {
   2835       int regno;
   2836       HOST_WIDE_INT offset = 0;
   2837       int callee_save_size = cfun->machine->callee_save_size;
   2838 
   2839       /* -128 is a limit of single addi instruction. */
   2840       if (total_size > 0 && total_size <= 128)
   2841 	{
   2842 	  insn = emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx,
   2843 					GEN_INT (-total_size)));
   2844 	  RTX_FRAME_RELATED_P (insn) = 1;
   2845 	  note_rtx = gen_rtx_SET (stack_pointer_rtx,
   2846 				  plus_constant (Pmode, stack_pointer_rtx,
   2847 						 -total_size));
   2848 	  add_reg_note (insn, REG_FRAME_RELATED_EXPR, note_rtx);
   2849 	  offset = total_size - UNITS_PER_WORD;
   2850 	}
   2851       else if (callee_save_size)
   2852 	{
   2853 	  /* 1020 is maximal s32i offset, if the frame is bigger than that
   2854 	   * we move sp to the end of callee-saved save area, save and then
   2855 	   * move it to its final location. */
   2856 	  if (total_size > 1024)
   2857 	    {
   2858 	      insn = emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx,
   2859 					    GEN_INT (-callee_save_size)));
   2860 	      RTX_FRAME_RELATED_P (insn) = 1;
   2861 	      note_rtx = gen_rtx_SET (stack_pointer_rtx,
   2862 				      plus_constant (Pmode, stack_pointer_rtx,
   2863 						     -callee_save_size));
   2864 	      add_reg_note (insn, REG_FRAME_RELATED_EXPR, note_rtx);
   2865 	      offset = callee_save_size - UNITS_PER_WORD;
   2866 	    }
   2867 	  else
   2868 	    {
   2869 	      rtx tmp_reg = gen_rtx_REG (Pmode, A9_REG);
   2870 	      emit_move_insn (tmp_reg, GEN_INT (total_size));
   2871 	      insn = emit_insn (gen_subsi3 (stack_pointer_rtx,
   2872 					    stack_pointer_rtx, tmp_reg));
   2873 	      RTX_FRAME_RELATED_P (insn) = 1;
   2874 	      note_rtx = gen_rtx_SET (stack_pointer_rtx,
   2875 				      plus_constant (Pmode, stack_pointer_rtx,
   2876 						     -total_size));
   2877 	      add_reg_note (insn, REG_FRAME_RELATED_EXPR, note_rtx);
   2878 	      offset = total_size - UNITS_PER_WORD;
   2879 	    }
   2880 	}
   2881 
   2882       for (regno = 0; regno < FIRST_PSEUDO_REGISTER; ++regno)
   2883 	{
   2884 	  if (xtensa_call_save_reg(regno))
   2885 	    {
   2886 	      rtx x = gen_rtx_PLUS (Pmode, stack_pointer_rtx, GEN_INT (offset));
   2887 	      rtx mem = gen_frame_mem (SImode, x);
   2888 	      rtx reg = gen_rtx_REG (SImode, regno);
   2889 
   2890 	      offset -= UNITS_PER_WORD;
   2891 	      insn = emit_move_insn (mem, reg);
   2892 	      RTX_FRAME_RELATED_P (insn) = 1;
   2893 	      add_reg_note (insn, REG_FRAME_RELATED_EXPR,
   2894 			    gen_rtx_SET (mem, reg));
   2895 	    }
   2896 	}
   2897       if (total_size > 1024
   2898 	  || (!callee_save_size && total_size > 128))
   2899 	{
   2900 	  rtx tmp_reg = gen_rtx_REG (Pmode, A9_REG);
   2901 	  emit_move_insn (tmp_reg, GEN_INT (total_size -
   2902 					    callee_save_size));
   2903 	  insn = emit_insn (gen_subsi3 (stack_pointer_rtx,
   2904 					stack_pointer_rtx, tmp_reg));
   2905 	  RTX_FRAME_RELATED_P (insn) = 1;
   2906 	  note_rtx = gen_rtx_SET (stack_pointer_rtx,
   2907 				  plus_constant (Pmode, stack_pointer_rtx,
   2908 						 callee_save_size -
   2909 						 total_size));
   2910 	  add_reg_note (insn, REG_FRAME_RELATED_EXPR, note_rtx);
   2911 	}
   2912     }
   2913 
   2914   if (frame_pointer_needed)
   2915     {
   2916       if (cfun->machine->set_frame_ptr_insn)
   2917 	{
   2918 	  rtx_insn *first;
   2919 
   2920 	  push_topmost_sequence ();
   2921 	  first = get_insns ();
   2922 	  pop_topmost_sequence ();
   2923 
   2924 	  /* For all instructions prior to set_frame_ptr_insn, replace
   2925 	     hard_frame_pointer references with stack_pointer.  */
   2926 	  for (insn = first;
   2927 	       insn != cfun->machine->set_frame_ptr_insn;
   2928 	       insn = NEXT_INSN (insn))
   2929 	    {
   2930 	      if (INSN_P (insn))
   2931 		{
   2932 		  PATTERN (insn) = replace_rtx (copy_rtx (PATTERN (insn)),
   2933 						hard_frame_pointer_rtx,
   2934 						stack_pointer_rtx);
   2935 		  df_insn_rescan (insn);
   2936 		}
   2937 	    }
   2938 	}
   2939       else
   2940         {
   2941 	  insn = emit_insn (gen_movsi (hard_frame_pointer_rtx,
   2942 				       stack_pointer_rtx));
   2943 	  if (!TARGET_WINDOWED_ABI)
   2944 	    {
   2945 	      note_rtx = gen_rtx_SET (hard_frame_pointer_rtx,
   2946 				      stack_pointer_rtx);
   2947 	      RTX_FRAME_RELATED_P (insn) = 1;
   2948 	      add_reg_note (insn, REG_FRAME_RELATED_EXPR, note_rtx);
   2949 	    }
   2950 	}
   2951     }
   2952 
   2953   if (TARGET_WINDOWED_ABI)
   2954     {
   2955       /* Create a note to describe the CFA.  Because this is only used to set
   2956 	 DW_AT_frame_base for debug info, don't bother tracking changes through
   2957 	 each instruction in the prologue.  It just takes up space.  */
   2958       note_rtx = gen_rtx_SET ((frame_pointer_needed
   2959 			       ? hard_frame_pointer_rtx
   2960 			       : stack_pointer_rtx),
   2961 			      plus_constant (Pmode, stack_pointer_rtx,
   2962 					     -total_size));
   2963       RTX_FRAME_RELATED_P (insn) = 1;
   2964       add_reg_note (insn, REG_FRAME_RELATED_EXPR, note_rtx);
   2965     }
   2966 }
   2967 
   2968 void
   2969 xtensa_expand_epilogue (void)
   2970 {
   2971   if (!TARGET_WINDOWED_ABI)
   2972     {
   2973       int regno;
   2974       HOST_WIDE_INT offset;
   2975 
   2976       if (cfun->machine->current_frame_size > (frame_pointer_needed ? 127 : 1024))
   2977 	{
   2978 	  rtx tmp_reg = gen_rtx_REG (Pmode, A9_REG);
   2979 	  emit_move_insn (tmp_reg, GEN_INT (cfun->machine->current_frame_size -
   2980 					    cfun->machine->callee_save_size));
   2981 	  emit_insn (gen_addsi3 (stack_pointer_rtx, frame_pointer_needed ?
   2982 				 hard_frame_pointer_rtx : stack_pointer_rtx,
   2983 				 tmp_reg));
   2984 	  offset = cfun->machine->callee_save_size - UNITS_PER_WORD;
   2985 	}
   2986       else
   2987 	{
   2988 	  if (frame_pointer_needed)
   2989 	    emit_move_insn (stack_pointer_rtx, hard_frame_pointer_rtx);
   2990 	  offset = cfun->machine->current_frame_size - UNITS_PER_WORD;
   2991 	}
   2992 
   2993       /* Prevent reordering of saved a0 update and loading it back from
   2994 	 the save area.  */
   2995       if (crtl->calls_eh_return)
   2996 	emit_insn (gen_blockage ());
   2997 
   2998       for (regno = 0; regno < FIRST_PSEUDO_REGISTER; ++regno)
   2999 	{
   3000 	  if (xtensa_call_save_reg(regno))
   3001 	    {
   3002 	      rtx x = gen_rtx_PLUS (Pmode, stack_pointer_rtx, GEN_INT (offset));
   3003 
   3004 	      offset -= UNITS_PER_WORD;
   3005 	      emit_move_insn (gen_rtx_REG (SImode, regno),
   3006 			      gen_frame_mem (SImode, x));
   3007 	    }
   3008 	}
   3009 
   3010       if (cfun->machine->current_frame_size > 0)
   3011 	{
   3012 	  if (frame_pointer_needed || /* always reachable with addi */
   3013 	      cfun->machine->current_frame_size > 1024 ||
   3014 	      cfun->machine->current_frame_size <= 127)
   3015 	    {
   3016 	      if (cfun->machine->current_frame_size <= 127)
   3017 		offset = cfun->machine->current_frame_size;
   3018 	      else
   3019 		offset = cfun->machine->callee_save_size;
   3020 
   3021 	      emit_insn (gen_addsi3 (stack_pointer_rtx,
   3022 				     stack_pointer_rtx,
   3023 				     GEN_INT (offset)));
   3024 	    }
   3025 	  else
   3026 	    {
   3027 	      rtx tmp_reg = gen_rtx_REG (Pmode, A9_REG);
   3028 	      emit_move_insn (tmp_reg,
   3029 			      GEN_INT (cfun->machine->current_frame_size));
   3030 	      emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx,
   3031 				     tmp_reg));
   3032 	    }
   3033 	}
   3034 
   3035       if (crtl->calls_eh_return)
   3036 	emit_insn (gen_add3_insn (stack_pointer_rtx,
   3037 				  stack_pointer_rtx,
   3038 				  EH_RETURN_STACKADJ_RTX));
   3039     }
   3040   cfun->machine->epilogue_done = true;
   3041   emit_jump_insn (gen_return ());
   3042 }
   3043 
   3044 bool
   3045 xtensa_use_return_instruction_p (void)
   3046 {
   3047   if (!reload_completed)
   3048     return false;
   3049   if (TARGET_WINDOWED_ABI)
   3050     return true;
   3051   if (compute_frame_size (get_frame_size ()) == 0)
   3052     return true;
   3053   return cfun->machine->epilogue_done;
   3054 }
   3055 
   3056 void
   3057 xtensa_set_return_address (rtx address, rtx scratch)
   3058 {
   3059   HOST_WIDE_INT total_size = compute_frame_size (get_frame_size ());
   3060   rtx frame = frame_pointer_needed ?
   3061     hard_frame_pointer_rtx : stack_pointer_rtx;
   3062   rtx a0_addr = plus_constant (Pmode, frame,
   3063 			       total_size - UNITS_PER_WORD);
   3064   rtx note = gen_rtx_SET (gen_frame_mem (SImode, a0_addr),
   3065 			  gen_rtx_REG (SImode, A0_REG));
   3066   rtx insn;
   3067 
   3068   if (total_size > 1024) {
   3069     emit_move_insn (scratch, GEN_INT (total_size - UNITS_PER_WORD));
   3070     emit_insn (gen_addsi3 (scratch, frame, scratch));
   3071     a0_addr = scratch;
   3072   }
   3073 
   3074   insn = emit_move_insn (gen_frame_mem (SImode, a0_addr), address);
   3075   RTX_FRAME_RELATED_P (insn) = 1;
   3076   add_reg_note (insn, REG_FRAME_RELATED_EXPR, note);
   3077 }
   3078 
   3079 rtx
   3080 xtensa_return_addr (int count, rtx frame)
   3081 {
   3082   rtx result, retaddr, curaddr, label;
   3083 
   3084   if (!TARGET_WINDOWED_ABI)
   3085     {
   3086       if (count != 0)
   3087 	return const0_rtx;
   3088 
   3089       return get_hard_reg_initial_val (Pmode, A0_REG);
   3090     }
   3091 
   3092   if (count == -1)
   3093     retaddr = gen_rtx_REG (Pmode, A0_REG);
   3094   else
   3095     {
   3096       rtx addr = plus_constant (Pmode, frame, -4 * UNITS_PER_WORD);
   3097       addr = memory_address (Pmode, addr);
   3098       retaddr = gen_reg_rtx (Pmode);
   3099       emit_move_insn (retaddr, gen_rtx_MEM (Pmode, addr));
   3100     }
   3101 
   3102   /* The 2 most-significant bits of the return address on Xtensa hold
   3103      the register window size.  To get the real return address, these
   3104      bits must be replaced with the high bits from some address in the
   3105      code.  */
   3106 
   3107   /* Get the 2 high bits of a local label in the code.  */
   3108   curaddr = gen_reg_rtx (Pmode);
   3109   label = gen_label_rtx ();
   3110   emit_label (label);
   3111   LABEL_PRESERVE_P (label) = 1;
   3112   emit_move_insn (curaddr, gen_rtx_LABEL_REF (Pmode, label));
   3113   emit_insn (gen_lshrsi3 (curaddr, curaddr, GEN_INT (30)));
   3114   emit_insn (gen_ashlsi3 (curaddr, curaddr, GEN_INT (30)));
   3115 
   3116   /* Clear the 2 high bits of the return address.  */
   3117   result = gen_reg_rtx (Pmode);
   3118   emit_insn (gen_ashlsi3 (result, retaddr, GEN_INT (2)));
   3119   emit_insn (gen_lshrsi3 (result, result, GEN_INT (2)));
   3120 
   3121   /* Combine them to get the result.  */
   3122   emit_insn (gen_iorsi3 (result, result, curaddr));
   3123   return result;
   3124 }
   3125 
   3126 /* Disable the use of word-sized or smaller complex modes for structures,
   3127    and for function arguments in particular, where they cause problems with
   3128    register a7.  The xtensa_copy_incoming_a7 function assumes that there is
   3129    a single reference to an argument in a7, but with small complex modes the
   3130    real and imaginary components may be extracted separately, leading to two
   3131    uses of the register, only one of which would be replaced.  */
   3132 
   3133 static bool
   3134 xtensa_member_type_forces_blk (const_tree, machine_mode mode)
   3135 {
   3136   return mode == CQImode || mode == CHImode;
   3137 }
   3138 
   3139 /* Create the va_list data type.
   3140 
   3141    This structure is set up by __builtin_saveregs.  The __va_reg field
   3142    points to a stack-allocated region holding the contents of the
   3143    incoming argument registers.  The __va_ndx field is an index
   3144    initialized to the position of the first unnamed (variable)
   3145    argument.  This same index is also used to address the arguments
   3146    passed in memory.  Thus, the __va_stk field is initialized to point
   3147    to the position of the first argument in memory offset to account
   3148    for the arguments passed in registers and to account for the size
   3149    of the argument registers not being 16-byte aligned.  E.G., there
   3150    are 6 argument registers of 4 bytes each, but we want the __va_ndx
   3151    for the first stack argument to have the maximal alignment of 16
   3152    bytes, so we offset the __va_stk address by 32 bytes so that
   3153    __va_stk[32] references the first argument on the stack.  */
   3154 
   3155 static tree
   3156 xtensa_build_builtin_va_list (void)
   3157 {
   3158   tree f_stk, f_reg, f_ndx, record, type_decl;
   3159 
   3160   record = (*lang_hooks.types.make_type) (RECORD_TYPE);
   3161   type_decl = build_decl (BUILTINS_LOCATION,
   3162 			  TYPE_DECL, get_identifier ("__va_list_tag"), record);
   3163 
   3164   f_stk = build_decl (BUILTINS_LOCATION,
   3165 		      FIELD_DECL, get_identifier ("__va_stk"),
   3166 		      ptr_type_node);
   3167   f_reg = build_decl (BUILTINS_LOCATION,
   3168 		      FIELD_DECL, get_identifier ("__va_reg"),
   3169 		      ptr_type_node);
   3170   f_ndx = build_decl (BUILTINS_LOCATION,
   3171 		      FIELD_DECL, get_identifier ("__va_ndx"),
   3172 		      integer_type_node);
   3173 
   3174   DECL_FIELD_CONTEXT (f_stk) = record;
   3175   DECL_FIELD_CONTEXT (f_reg) = record;
   3176   DECL_FIELD_CONTEXT (f_ndx) = record;
   3177 
   3178   TYPE_STUB_DECL (record) = type_decl;
   3179   TYPE_NAME (record) = type_decl;
   3180   TYPE_FIELDS (record) = f_stk;
   3181   DECL_CHAIN (f_stk) = f_reg;
   3182   DECL_CHAIN (f_reg) = f_ndx;
   3183 
   3184   layout_type (record);
   3185   return record;
   3186 }
   3187 
   3188 
   3189 /* Save the incoming argument registers on the stack.  Returns the
   3190    address of the saved registers.  */
   3191 
   3192 static rtx
   3193 xtensa_builtin_saveregs (void)
   3194 {
   3195   rtx gp_regs;
   3196   int arg_words = crtl->args.info.arg_words;
   3197   int gp_left = MAX_ARGS_IN_REGISTERS - arg_words;
   3198 
   3199   if (gp_left <= 0)
   3200     return const0_rtx;
   3201 
   3202   /* Allocate the general-purpose register space.  */
   3203   gp_regs = assign_stack_local
   3204     (BLKmode, MAX_ARGS_IN_REGISTERS * UNITS_PER_WORD, -1);
   3205   set_mem_alias_set (gp_regs, get_varargs_alias_set ());
   3206 
   3207   /* Now store the incoming registers.  */
   3208   cfun->machine->need_a7_copy = TARGET_WINDOWED_ABI;
   3209   cfun->machine->vararg_a7 = true;
   3210   move_block_from_reg (GP_ARG_FIRST + arg_words,
   3211 		       adjust_address (gp_regs, BLKmode,
   3212 				       arg_words * UNITS_PER_WORD),
   3213 		       gp_left);
   3214   if (cfun->machine->vararg_a7_copy != 0)
   3215     emit_insn_before (cfun->machine->vararg_a7_copy, get_insns ());
   3216 
   3217   return XEXP (gp_regs, 0);
   3218 }
   3219 
   3220 
   3221 /* Implement `va_start' for varargs and stdarg.  We look at the
   3222    current function to fill in an initial va_list.  */
   3223 
   3224 static void
   3225 xtensa_va_start (tree valist, rtx nextarg ATTRIBUTE_UNUSED)
   3226 {
   3227   tree f_stk, stk;
   3228   tree f_reg, reg;
   3229   tree f_ndx, ndx;
   3230   tree t, u;
   3231   int arg_words;
   3232 
   3233   arg_words = crtl->args.info.arg_words;
   3234 
   3235   f_stk = TYPE_FIELDS (va_list_type_node);
   3236   f_reg = DECL_CHAIN (f_stk);
   3237   f_ndx = DECL_CHAIN (f_reg);
   3238 
   3239   stk = build3 (COMPONENT_REF, TREE_TYPE (f_stk), valist, f_stk, NULL_TREE);
   3240   reg = build3 (COMPONENT_REF, TREE_TYPE (f_reg), unshare_expr (valist),
   3241 		f_reg, NULL_TREE);
   3242   ndx = build3 (COMPONENT_REF, TREE_TYPE (f_ndx), unshare_expr (valist),
   3243 		f_ndx, NULL_TREE);
   3244 
   3245   /* Call __builtin_saveregs; save the result in __va_reg */
   3246   u = make_tree (sizetype, expand_builtin_saveregs ());
   3247   u = fold_convert (ptr_type_node, u);
   3248   t = build2 (MODIFY_EXPR, ptr_type_node, reg, u);
   3249   TREE_SIDE_EFFECTS (t) = 1;
   3250   expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
   3251 
   3252   /* Set the __va_stk member to ($arg_ptr - 32).  */
   3253   u = make_tree (ptr_type_node, virtual_incoming_args_rtx);
   3254   u = fold_build_pointer_plus_hwi (u, -32);
   3255   t = build2 (MODIFY_EXPR, ptr_type_node, stk, u);
   3256   TREE_SIDE_EFFECTS (t) = 1;
   3257   expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
   3258 
   3259   /* Set the __va_ndx member.  If the first variable argument is on
   3260      the stack, adjust __va_ndx by 2 words to account for the extra
   3261      alignment offset for __va_stk.  */
   3262   if (arg_words >= MAX_ARGS_IN_REGISTERS)
   3263     arg_words += 2;
   3264   t = build2 (MODIFY_EXPR, integer_type_node, ndx,
   3265 	      build_int_cst (integer_type_node, arg_words * UNITS_PER_WORD));
   3266   TREE_SIDE_EFFECTS (t) = 1;
   3267   expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
   3268 }
   3269 
   3270 
   3271 /* Implement `va_arg'.  */
   3272 
   3273 static tree
   3274 xtensa_gimplify_va_arg_expr (tree valist, tree type, gimple_seq *pre_p,
   3275 			     gimple_seq *post_p ATTRIBUTE_UNUSED)
   3276 {
   3277   tree f_stk, stk;
   3278   tree f_reg, reg;
   3279   tree f_ndx, ndx;
   3280   tree type_size, array, orig_ndx, addr, size, va_size, t;
   3281   tree lab_false, lab_over, lab_false2;
   3282   bool indirect;
   3283 
   3284   indirect = pass_va_arg_by_reference (type);
   3285   if (indirect)
   3286     type = build_pointer_type (type);
   3287 
   3288   /* Handle complex values as separate real and imaginary parts.  */
   3289   if (TREE_CODE (type) == COMPLEX_TYPE)
   3290     {
   3291       tree real_part, imag_part;
   3292 
   3293       real_part = xtensa_gimplify_va_arg_expr (valist, TREE_TYPE (type),
   3294 					       pre_p, NULL);
   3295       real_part = get_initialized_tmp_var (real_part, pre_p, NULL);
   3296 
   3297       imag_part = xtensa_gimplify_va_arg_expr (unshare_expr (valist),
   3298 					       TREE_TYPE (type),
   3299 					       pre_p, NULL);
   3300       imag_part = get_initialized_tmp_var (imag_part, pre_p, NULL);
   3301 
   3302       return build2 (COMPLEX_EXPR, type, real_part, imag_part);
   3303     }
   3304 
   3305   f_stk = TYPE_FIELDS (va_list_type_node);
   3306   f_reg = DECL_CHAIN (f_stk);
   3307   f_ndx = DECL_CHAIN (f_reg);
   3308 
   3309   stk = build3 (COMPONENT_REF, TREE_TYPE (f_stk), valist,
   3310 		f_stk, NULL_TREE);
   3311   reg = build3 (COMPONENT_REF, TREE_TYPE (f_reg), unshare_expr (valist),
   3312 		f_reg, NULL_TREE);
   3313   ndx = build3 (COMPONENT_REF, TREE_TYPE (f_ndx), unshare_expr (valist),
   3314 		f_ndx, NULL_TREE);
   3315 
   3316   type_size = size_in_bytes (type);
   3317   va_size = round_up (type_size, UNITS_PER_WORD);
   3318   gimplify_expr (&va_size, pre_p, NULL, is_gimple_val, fb_rvalue);
   3319 
   3320 
   3321   /* First align __va_ndx if necessary for this arg:
   3322 
   3323      orig_ndx = (AP).__va_ndx;
   3324      if (__alignof__ (TYPE) > 4 )
   3325        orig_ndx = ((orig_ndx + __alignof__ (TYPE) - 1)
   3326 			& -__alignof__ (TYPE)); */
   3327 
   3328   orig_ndx = get_initialized_tmp_var (ndx, pre_p, NULL);
   3329 
   3330   if (TYPE_ALIGN (type) > BITS_PER_WORD)
   3331     {
   3332       int align = MIN (TYPE_ALIGN (type), STACK_BOUNDARY) / BITS_PER_UNIT;
   3333 
   3334       t = build2 (PLUS_EXPR, integer_type_node, unshare_expr (orig_ndx),
   3335 		  build_int_cst (integer_type_node, align - 1));
   3336       t = build2 (BIT_AND_EXPR, integer_type_node, t,
   3337 		  build_int_cst (integer_type_node, -align));
   3338       gimplify_assign (unshare_expr (orig_ndx), t, pre_p);
   3339     }
   3340 
   3341 
   3342   /* Increment __va_ndx to point past the argument:
   3343 
   3344      (AP).__va_ndx = orig_ndx + __va_size (TYPE); */
   3345 
   3346   t = fold_convert (integer_type_node, va_size);
   3347   t = build2 (PLUS_EXPR, integer_type_node, orig_ndx, t);
   3348   gimplify_assign (unshare_expr (ndx), t, pre_p);
   3349 
   3350 
   3351   /* Check if the argument is in registers:
   3352 
   3353      if ((AP).__va_ndx <= __MAX_ARGS_IN_REGISTERS * 4
   3354          && !must_pass_in_stack (type))
   3355         __array = (AP).__va_reg; */
   3356 
   3357   array = create_tmp_var (ptr_type_node);
   3358 
   3359   lab_over = NULL;
   3360   if (!must_pass_va_arg_in_stack (type))
   3361     {
   3362       lab_false = create_artificial_label (UNKNOWN_LOCATION);
   3363       lab_over = create_artificial_label (UNKNOWN_LOCATION);
   3364 
   3365       t = build2 (GT_EXPR, boolean_type_node, unshare_expr (ndx),
   3366 		  build_int_cst (integer_type_node,
   3367 				 MAX_ARGS_IN_REGISTERS * UNITS_PER_WORD));
   3368       t = build3 (COND_EXPR, void_type_node, t,
   3369 		  build1 (GOTO_EXPR, void_type_node, lab_false),
   3370 		  NULL_TREE);
   3371       gimplify_and_add (t, pre_p);
   3372 
   3373       gimplify_assign (unshare_expr (array), reg, pre_p);
   3374 
   3375       t = build1 (GOTO_EXPR, void_type_node, lab_over);
   3376       gimplify_and_add (t, pre_p);
   3377 
   3378       t = build1 (LABEL_EXPR, void_type_node, lab_false);
   3379       gimplify_and_add (t, pre_p);
   3380     }
   3381 
   3382 
   3383   /* ...otherwise, the argument is on the stack (never split between
   3384      registers and the stack -- change __va_ndx if necessary):
   3385 
   3386      else
   3387        {
   3388 	 if (orig_ndx <= __MAX_ARGS_IN_REGISTERS * 4)
   3389 	     (AP).__va_ndx = 32 + __va_size (TYPE);
   3390 	 __array = (AP).__va_stk;
   3391        } */
   3392 
   3393   lab_false2 = create_artificial_label (UNKNOWN_LOCATION);
   3394 
   3395   t = build2 (GT_EXPR, boolean_type_node, unshare_expr (orig_ndx),
   3396 	      build_int_cst (integer_type_node,
   3397 			     MAX_ARGS_IN_REGISTERS * UNITS_PER_WORD));
   3398   t = build3 (COND_EXPR, void_type_node, t,
   3399 	      build1 (GOTO_EXPR, void_type_node, lab_false2),
   3400 	      NULL_TREE);
   3401   gimplify_and_add (t, pre_p);
   3402 
   3403   t = size_binop (PLUS_EXPR, unshare_expr (va_size), size_int (32));
   3404   t = fold_convert (integer_type_node, t);
   3405   gimplify_assign (unshare_expr (ndx), t, pre_p);
   3406 
   3407   t = build1 (LABEL_EXPR, void_type_node, lab_false2);
   3408   gimplify_and_add (t, pre_p);
   3409 
   3410   gimplify_assign (array, stk, pre_p);
   3411 
   3412   if (lab_over)
   3413     {
   3414       t = build1 (LABEL_EXPR, void_type_node, lab_over);
   3415       gimplify_and_add (t, pre_p);
   3416     }
   3417 
   3418 
   3419   /* Given the base array pointer (__array) and index to the subsequent
   3420      argument (__va_ndx), find the address:
   3421 
   3422      __array + (AP).__va_ndx - (BYTES_BIG_ENDIAN && sizeof (TYPE) < 4
   3423 				? sizeof (TYPE)
   3424 				: __va_size (TYPE))
   3425 
   3426      The results are endian-dependent because values smaller than one word
   3427      are aligned differently.  */
   3428 
   3429 
   3430   if (BYTES_BIG_ENDIAN && TREE_CODE (type_size) == INTEGER_CST)
   3431     {
   3432       t = fold_build2 (GE_EXPR, boolean_type_node, unshare_expr (type_size),
   3433 		       size_int (PARM_BOUNDARY / BITS_PER_UNIT));
   3434       t = fold_build3 (COND_EXPR, sizetype, t, unshare_expr (va_size),
   3435 		       unshare_expr (type_size));
   3436       size = t;
   3437     }
   3438   else
   3439     size = unshare_expr (va_size);
   3440 
   3441   t = fold_convert (sizetype, unshare_expr (ndx));
   3442   t = build2 (MINUS_EXPR, sizetype, t, size);
   3443   addr = fold_build_pointer_plus (unshare_expr (array), t);
   3444 
   3445   addr = fold_convert (build_pointer_type (type), addr);
   3446   if (indirect)
   3447     addr = build_va_arg_indirect_ref (addr);
   3448   return build_va_arg_indirect_ref (addr);
   3449 }
   3450 
   3451 
   3452 /* Builtins.  */
   3453 
   3454 enum xtensa_builtin
   3455 {
   3456   XTENSA_BUILTIN_UMULSIDI3,
   3457   XTENSA_BUILTIN_max
   3458 };
   3459 
   3460 
   3461 static void
   3462 xtensa_init_builtins (void)
   3463 {
   3464   tree ftype, decl;
   3465 
   3466   ftype = build_function_type_list (unsigned_intDI_type_node,
   3467 				    unsigned_intSI_type_node,
   3468 				    unsigned_intSI_type_node, NULL_TREE);
   3469 
   3470   decl = add_builtin_function ("__builtin_umulsidi3", ftype,
   3471 			       XTENSA_BUILTIN_UMULSIDI3, BUILT_IN_MD,
   3472 			       "__umulsidi3", NULL_TREE);
   3473   TREE_NOTHROW (decl) = 1;
   3474   TREE_READONLY (decl) = 1;
   3475 }
   3476 
   3477 
   3478 static tree
   3479 xtensa_fold_builtin (tree fndecl, int n_args ATTRIBUTE_UNUSED, tree *args,
   3480 		     bool ignore ATTRIBUTE_UNUSED)
   3481 {
   3482   unsigned int fcode = DECL_MD_FUNCTION_CODE (fndecl);
   3483   tree arg0, arg1;
   3484 
   3485   switch (fcode)
   3486     {
   3487     case XTENSA_BUILTIN_UMULSIDI3:
   3488       arg0 = args[0];
   3489       arg1 = args[1];
   3490       if ((TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == INTEGER_CST)
   3491 	  || TARGET_MUL32_HIGH)
   3492 	return fold_build2 (MULT_EXPR, unsigned_intDI_type_node,
   3493 			    fold_convert (unsigned_intDI_type_node, arg0),
   3494 			    fold_convert (unsigned_intDI_type_node, arg1));
   3495       break;
   3496 
   3497     default:
   3498       internal_error ("bad builtin code");
   3499       break;
   3500     }
   3501 
   3502   return NULL;
   3503 }
   3504 
   3505 
   3506 static rtx
   3507 xtensa_expand_builtin (tree exp, rtx target,
   3508 		       rtx subtarget ATTRIBUTE_UNUSED,
   3509 		       machine_mode mode ATTRIBUTE_UNUSED,
   3510 		       int ignore)
   3511 {
   3512   tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
   3513   unsigned int fcode = DECL_MD_FUNCTION_CODE (fndecl);
   3514 
   3515   switch (fcode)
   3516     {
   3517     case XTENSA_BUILTIN_UMULSIDI3:
   3518       /* The umulsidi3 builtin is just a mechanism to avoid calling the real
   3519 	 __umulsidi3 function when the Xtensa configuration can directly
   3520 	 implement it.  If not, just call the function.  */
   3521       return expand_call (exp, target, ignore);
   3522 
   3523     default:
   3524       internal_error ("bad builtin code");
   3525     }
   3526   return NULL_RTX;
   3527 }
   3528 
   3529 /* Worker function for TARGET_PREFERRED_RELOAD_CLASS.  */
   3530 
   3531 static reg_class_t
   3532 xtensa_preferred_reload_class (rtx x, reg_class_t rclass)
   3533 {
   3534   if (CONSTANT_P (x) && CONST_DOUBLE_P (x))
   3535     return NO_REGS;
   3536 
   3537   /* Don't use the stack pointer or hard frame pointer for reloads!
   3538      The hard frame pointer would normally be OK except that it may
   3539      briefly hold an incoming argument in the prologue, and reload
   3540      won't know that it is live because the hard frame pointer is
   3541      treated specially.  */
   3542 
   3543   if (rclass == AR_REGS || rclass == GR_REGS)
   3544     return RL_REGS;
   3545 
   3546   return rclass;
   3547 }
   3548 
   3549 /* Worker function for TARGET_PREFERRED_OUTPUT_RELOAD_CLASS.  */
   3550 
   3551 static reg_class_t
   3552 xtensa_preferred_output_reload_class (rtx x ATTRIBUTE_UNUSED,
   3553 				      reg_class_t rclass)
   3554 {
   3555   /* Don't use the stack pointer or hard frame pointer for reloads!
   3556      The hard frame pointer would normally be OK except that it may
   3557      briefly hold an incoming argument in the prologue, and reload
   3558      won't know that it is live because the hard frame pointer is
   3559      treated specially.  */
   3560 
   3561   if (rclass == AR_REGS || rclass == GR_REGS)
   3562     return RL_REGS;
   3563 
   3564   return rclass;
   3565 }
   3566 
   3567 /* Worker function for TARGET_SECONDARY_RELOAD.  */
   3568 
   3569 static reg_class_t
   3570 xtensa_secondary_reload (bool in_p, rtx x, reg_class_t rclass,
   3571 			 machine_mode mode, secondary_reload_info *sri)
   3572 {
   3573   int regno;
   3574 
   3575   if (in_p && constantpool_mem_p (x))
   3576     {
   3577       if (rclass == FP_REGS)
   3578 	return RL_REGS;
   3579 
   3580       if (mode == QImode)
   3581 	sri->icode = CODE_FOR_reloadqi_literal;
   3582       else if (mode == HImode)
   3583 	sri->icode = CODE_FOR_reloadhi_literal;
   3584     }
   3585 
   3586   regno = xt_true_regnum (x);
   3587   if (ACC_REG_P (regno))
   3588     return ((rclass == GR_REGS || rclass == RL_REGS) ? NO_REGS : RL_REGS);
   3589   if (rclass == ACC_REG)
   3590     return (GP_REG_P (regno) ? NO_REGS : RL_REGS);
   3591 
   3592   return NO_REGS;
   3593 }
   3594 
   3595 
   3596 void
   3597 order_regs_for_local_alloc (void)
   3598 {
   3599   if (!leaf_function_p ())
   3600     {
   3601       static const int reg_nonleaf_alloc_order[FIRST_PSEUDO_REGISTER] =
   3602 	REG_ALLOC_ORDER;
   3603       static const int reg_nonleaf_alloc_order_call0[FIRST_PSEUDO_REGISTER] =
   3604 	{
   3605 	  11, 10,  9,  8,  7,  6,  5,  4,  3,  2, 12, 13, 14, 15,
   3606 	  18,
   3607 	  19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
   3608 	  0,  1, 16, 17,
   3609 	  35,
   3610 	};
   3611 
   3612       memcpy (reg_alloc_order, TARGET_WINDOWED_ABI ?
   3613 	      reg_nonleaf_alloc_order : reg_nonleaf_alloc_order_call0,
   3614 	      FIRST_PSEUDO_REGISTER * sizeof (int));
   3615     }
   3616   else
   3617     {
   3618       int i, num_arg_regs;
   3619       int nxt = 0;
   3620 
   3621       /* Use the AR registers in increasing order (skipping a0 and a1)
   3622 	 but save the incoming argument registers for a last resort.  */
   3623       num_arg_regs = crtl->args.info.arg_words;
   3624       if (num_arg_regs > MAX_ARGS_IN_REGISTERS)
   3625 	num_arg_regs = MAX_ARGS_IN_REGISTERS;
   3626       for (i = GP_ARG_FIRST; i < 16 - num_arg_regs; i++)
   3627 	reg_alloc_order[nxt++] = i + num_arg_regs;
   3628       for (i = 0; i < num_arg_regs; i++)
   3629 	reg_alloc_order[nxt++] = GP_ARG_FIRST + i;
   3630 
   3631       /* List the coprocessor registers in order.  */
   3632       for (i = 0; i < BR_REG_NUM; i++)
   3633 	reg_alloc_order[nxt++] = BR_REG_FIRST + i;
   3634 
   3635       /* List the FP registers in order for now.  */
   3636       for (i = 0; i < 16; i++)
   3637 	reg_alloc_order[nxt++] = FP_REG_FIRST + i;
   3638 
   3639       /* GCC requires that we list *all* the registers....  */
   3640       reg_alloc_order[nxt++] = 0;	/* a0 = return address */
   3641       reg_alloc_order[nxt++] = 1;	/* a1 = stack pointer */
   3642       reg_alloc_order[nxt++] = 16;	/* pseudo frame pointer */
   3643       reg_alloc_order[nxt++] = 17;	/* pseudo arg pointer */
   3644 
   3645       reg_alloc_order[nxt++] = ACC_REG_FIRST;	/* MAC16 accumulator */
   3646     }
   3647 }
   3648 
   3649 
   3650 /* Some Xtensa targets support multiple bss sections.  If the section
   3651    name ends with ".bss", add SECTION_BSS to the flags.  */
   3652 
   3653 static unsigned int
   3654 xtensa_multibss_section_type_flags (tree decl, const char *name, int reloc)
   3655 {
   3656   unsigned int flags = default_section_type_flags (decl, name, reloc);
   3657   const char *suffix;
   3658 
   3659   suffix = strrchr (name, '.');
   3660   if (suffix && strcmp (suffix, ".bss") == 0)
   3661     {
   3662       if (!decl || (TREE_CODE (decl) == VAR_DECL
   3663 		    && DECL_INITIAL (decl) == NULL_TREE))
   3664 	flags |= SECTION_BSS;  /* @nobits */
   3665       else
   3666 	warning (0, "only uninitialized variables can be placed in a "
   3667 		 "%<.bss%> section");
   3668     }
   3669 
   3670   return flags;
   3671 }
   3672 
   3673 
   3674 /* The literal pool stays with the function.  */
   3675 
   3676 static section *
   3677 xtensa_select_rtx_section (machine_mode mode ATTRIBUTE_UNUSED,
   3678 			   rtx x ATTRIBUTE_UNUSED,
   3679 			   unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
   3680 {
   3681   return function_section (current_function_decl);
   3682 }
   3683 
   3684 /* Worker function for TARGET_REGISTER_MOVE_COST.  */
   3685 
   3686 static int
   3687 xtensa_register_move_cost (machine_mode mode ATTRIBUTE_UNUSED,
   3688 			   reg_class_t from, reg_class_t to)
   3689 {
   3690   if (from == to && from != BR_REGS && to != BR_REGS)
   3691     return 2;
   3692   else if (reg_class_subset_p (from, AR_REGS)
   3693 	   && reg_class_subset_p (to, AR_REGS))
   3694     return 2;
   3695   else if (reg_class_subset_p (from, AR_REGS) && to == ACC_REG)
   3696     return 3;
   3697   else if (from == ACC_REG && reg_class_subset_p (to, AR_REGS))
   3698     return 3;
   3699   else
   3700     return 10;
   3701 }
   3702 
   3703 /* Worker function for TARGET_MEMORY_MOVE_COST.  */
   3704 
   3705 static int
   3706 xtensa_memory_move_cost (machine_mode mode ATTRIBUTE_UNUSED,
   3707 			 reg_class_t rclass ATTRIBUTE_UNUSED,
   3708 			 bool in ATTRIBUTE_UNUSED)
   3709 {
   3710   return 4;
   3711 }
   3712 
   3713 /* Compute a (partial) cost for rtx X.  Return true if the complete
   3714    cost has been computed, and false if subexpressions should be
   3715    scanned.  In either case, *TOTAL contains the cost result.  */
   3716 
   3717 static bool
   3718 xtensa_rtx_costs (rtx x, machine_mode mode, int outer_code,
   3719 		  int opno ATTRIBUTE_UNUSED,
   3720 		  int *total, bool speed ATTRIBUTE_UNUSED)
   3721 {
   3722   int code = GET_CODE (x);
   3723 
   3724   switch (code)
   3725     {
   3726     case CONST_INT:
   3727       switch (outer_code)
   3728 	{
   3729 	case SET:
   3730 	  if (xtensa_simm12b (INTVAL (x)))
   3731 	    {
   3732 	      *total = 4;
   3733 	      return true;
   3734 	    }
   3735 	  break;
   3736 	case PLUS:
   3737 	  if (xtensa_simm8 (INTVAL (x))
   3738 	      || xtensa_simm8x256 (INTVAL (x)))
   3739 	    {
   3740 	      *total = 0;
   3741 	      return true;
   3742 	    }
   3743 	  break;
   3744 	case AND:
   3745 	  if (xtensa_mask_immediate (INTVAL (x)))
   3746 	    {
   3747 	      *total = 0;
   3748 	      return true;
   3749 	    }
   3750 	  break;
   3751 	case COMPARE:
   3752 	  if ((INTVAL (x) == 0) || xtensa_b4const (INTVAL (x)))
   3753 	    {
   3754 	      *total = 0;
   3755 	      return true;
   3756 	    }
   3757 	  break;
   3758 	case ASHIFT:
   3759 	case ASHIFTRT:
   3760 	case LSHIFTRT:
   3761 	case ROTATE:
   3762 	case ROTATERT:
   3763 	  /* No way to tell if X is the 2nd operand so be conservative.  */
   3764 	default: break;
   3765 	}
   3766       if (xtensa_simm12b (INTVAL (x)))
   3767 	*total = 5;
   3768       else if (TARGET_CONST16)
   3769 	*total = COSTS_N_INSNS (2);
   3770       else
   3771 	*total = 6;
   3772       return true;
   3773 
   3774     case CONST:
   3775     case LABEL_REF:
   3776     case SYMBOL_REF:
   3777       if (TARGET_CONST16)
   3778 	*total = COSTS_N_INSNS (2);
   3779       else
   3780 	*total = 5;
   3781       return true;
   3782 
   3783     case CONST_DOUBLE:
   3784       if (TARGET_CONST16)
   3785 	*total = COSTS_N_INSNS (4);
   3786       else
   3787 	*total = 7;
   3788       return true;
   3789 
   3790     case MEM:
   3791       {
   3792 	int num_words =
   3793 	  (GET_MODE_SIZE (mode) > UNITS_PER_WORD) ?  2 : 1;
   3794 
   3795 	if (memory_address_p (mode, XEXP ((x), 0)))
   3796 	  *total = COSTS_N_INSNS (num_words);
   3797 	else
   3798 	  *total = COSTS_N_INSNS (2*num_words);
   3799 	return true;
   3800       }
   3801 
   3802     case FFS:
   3803     case CTZ:
   3804       *total = COSTS_N_INSNS (TARGET_NSA ? 5 : 50);
   3805       return true;
   3806 
   3807     case CLZ:
   3808       *total = COSTS_N_INSNS (TARGET_NSA ? 1 : 50);
   3809       return true;
   3810 
   3811     case NOT:
   3812       *total = COSTS_N_INSNS (mode == DImode ? 3 : 2);
   3813       return true;
   3814 
   3815     case AND:
   3816     case IOR:
   3817     case XOR:
   3818       if (mode == DImode)
   3819 	*total = COSTS_N_INSNS (2);
   3820       else
   3821 	*total = COSTS_N_INSNS (1);
   3822       return true;
   3823 
   3824     case ASHIFT:
   3825     case ASHIFTRT:
   3826     case LSHIFTRT:
   3827       if (mode == DImode)
   3828 	*total = COSTS_N_INSNS (50);
   3829       else
   3830 	*total = COSTS_N_INSNS (1);
   3831       return true;
   3832 
   3833     case ABS:
   3834       {
   3835 	if (mode == SFmode)
   3836 	  *total = COSTS_N_INSNS (TARGET_HARD_FLOAT ? 1 : 50);
   3837 	else if (mode == DFmode)
   3838 	  *total = COSTS_N_INSNS (50);
   3839 	else
   3840 	  *total = COSTS_N_INSNS (4);
   3841 	return true;
   3842       }
   3843 
   3844     case PLUS:
   3845     case MINUS:
   3846       {
   3847 	if (mode == SFmode)
   3848 	  *total = COSTS_N_INSNS (TARGET_HARD_FLOAT ? 1 : 50);
   3849 	else if (mode == DFmode || mode == DImode)
   3850 	  *total = COSTS_N_INSNS (50);
   3851 	else
   3852 	  *total = COSTS_N_INSNS (1);
   3853 	return true;
   3854       }
   3855 
   3856     case NEG:
   3857       *total = COSTS_N_INSNS (mode == DImode ? 4 : 2);
   3858       return true;
   3859 
   3860     case MULT:
   3861       {
   3862 	if (mode == SFmode)
   3863 	  *total = COSTS_N_INSNS (TARGET_HARD_FLOAT ? 4 : 50);
   3864 	else if (mode == DFmode)
   3865 	  *total = COSTS_N_INSNS (50);
   3866 	else if (mode == DImode)
   3867 	  *total = COSTS_N_INSNS (TARGET_MUL32_HIGH ? 10 : 50);
   3868 	else if (TARGET_MUL32)
   3869 	  *total = COSTS_N_INSNS (4);
   3870 	else if (TARGET_MAC16)
   3871 	  *total = COSTS_N_INSNS (16);
   3872 	else if (TARGET_MUL16)
   3873 	  *total = COSTS_N_INSNS (12);
   3874 	else
   3875 	  *total = COSTS_N_INSNS (50);
   3876 	return true;
   3877       }
   3878 
   3879     case DIV:
   3880     case MOD:
   3881       {
   3882 	if (mode == SFmode)
   3883 	  {
   3884 	    *total = COSTS_N_INSNS (TARGET_HARD_FLOAT_DIV ? 8 : 50);
   3885 	    return true;
   3886 	  }
   3887 	else if (mode == DFmode)
   3888 	  {
   3889 	    *total = COSTS_N_INSNS (50);
   3890 	    return true;
   3891 	  }
   3892       }
   3893       /* Fall through.  */
   3894 
   3895     case UDIV:
   3896     case UMOD:
   3897       {
   3898 	if (mode == DImode)
   3899 	  *total = COSTS_N_INSNS (50);
   3900 	else if (TARGET_DIV32)
   3901 	  *total = COSTS_N_INSNS (32);
   3902 	else
   3903 	  *total = COSTS_N_INSNS (50);
   3904 	return true;
   3905       }
   3906 
   3907     case SQRT:
   3908       if (mode == SFmode)
   3909 	*total = COSTS_N_INSNS (TARGET_HARD_FLOAT_SQRT ? 8 : 50);
   3910       else
   3911 	*total = COSTS_N_INSNS (50);
   3912       return true;
   3913 
   3914     case SMIN:
   3915     case UMIN:
   3916     case SMAX:
   3917     case UMAX:
   3918       *total = COSTS_N_INSNS (TARGET_MINMAX ? 1 : 50);
   3919       return true;
   3920 
   3921     case SIGN_EXTRACT:
   3922     case SIGN_EXTEND:
   3923       *total = COSTS_N_INSNS (TARGET_SEXT ? 1 : 2);
   3924       return true;
   3925 
   3926     case ZERO_EXTRACT:
   3927     case ZERO_EXTEND:
   3928       *total = COSTS_N_INSNS (1);
   3929       return true;
   3930 
   3931     default:
   3932       return false;
   3933     }
   3934 }
   3935 
   3936 /* Worker function for TARGET_RETURN_IN_MEMORY.  */
   3937 
   3938 static bool
   3939 xtensa_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
   3940 {
   3941   return ((unsigned HOST_WIDE_INT) int_size_in_bytes (type)
   3942 	  > 4 * UNITS_PER_WORD);
   3943 }
   3944 
   3945 /* Worker function for TARGET_FUNCTION_VALUE.  */
   3946 
   3947 rtx
   3948 xtensa_function_value (const_tree valtype, const_tree func ATTRIBUTE_UNUSED,
   3949                       bool outgoing)
   3950 {
   3951   return gen_rtx_REG ((INTEGRAL_TYPE_P (valtype)
   3952                       && TYPE_PRECISION (valtype) < BITS_PER_WORD)
   3953                      ? SImode : TYPE_MODE (valtype),
   3954                      outgoing ? GP_OUTGOING_RETURN : GP_RETURN);
   3955 }
   3956 
   3957 /* Worker function for TARGET_LIBCALL_VALUE.  */
   3958 
   3959 static rtx
   3960 xtensa_libcall_value (machine_mode mode, const_rtx fun ATTRIBUTE_UNUSED)
   3961 {
   3962   return gen_rtx_REG ((GET_MODE_CLASS (mode) == MODE_INT
   3963 		       && GET_MODE_SIZE (mode) < UNITS_PER_WORD)
   3964 		      ? SImode : mode, GP_RETURN);
   3965 }
   3966 
   3967 /* Worker function TARGET_FUNCTION_VALUE_REGNO_P.  */
   3968 
   3969 static bool
   3970 xtensa_function_value_regno_p (const unsigned int regno)
   3971 {
   3972   return (regno == GP_RETURN);
   3973 }
   3974 
   3975 /* The static chain is passed in memory.  Provide rtx giving 'mem'
   3976    expressions that denote where they are stored.  */
   3977 
   3978 static rtx
   3979 xtensa_static_chain (const_tree ARG_UNUSED (fndecl_or_type), bool incoming_p)
   3980 {
   3981   if (TARGET_WINDOWED_ABI)
   3982     {
   3983       rtx base = incoming_p ? arg_pointer_rtx : stack_pointer_rtx;
   3984       return gen_frame_mem (Pmode, plus_constant (Pmode, base,
   3985 						  -5 * UNITS_PER_WORD));
   3986     }
   3987   else
   3988     return gen_rtx_REG (Pmode, A8_REG);
   3989 }
   3990 
   3991 
   3992 /* TRAMPOLINE_TEMPLATE: For Xtensa, the trampoline must perform an ENTRY
   3993    instruction with a minimal stack frame in order to get some free
   3994    registers.  Once the actual call target is known, the proper stack frame
   3995    size is extracted from the ENTRY instruction at the target and the
   3996    current frame is adjusted to match.  The trampoline then transfers
   3997    control to the instruction following the ENTRY at the target.  Note:
   3998    this assumes that the target begins with an ENTRY instruction.  */
   3999 
   4000 static void
   4001 xtensa_asm_trampoline_template (FILE *stream)
   4002 {
   4003   bool use_call0 = (TARGET_CONST16 || TARGET_ABSOLUTE_LITERALS);
   4004 
   4005   fprintf (stream, "\t.begin no-transform\n");
   4006 
   4007   if (TARGET_WINDOWED_ABI)
   4008     {
   4009       fprintf (stream, "\tentry\tsp, %d\n", MIN_FRAME_SIZE);
   4010 
   4011       if (use_call0)
   4012 	{
   4013 	  /* Save the return address.  */
   4014 	  fprintf (stream, "\tmov\ta10, a0\n");
   4015 
   4016 	  /* Use a CALL0 instruction to skip past the constants and in the
   4017 	     process get the PC into A0.  This allows PC-relative access to
   4018 	     the constants without relying on L32R.  */
   4019 	  fprintf (stream, "\tcall0\t.Lskipconsts\n");
   4020 	}
   4021       else
   4022 	fprintf (stream, "\tj\t.Lskipconsts\n");
   4023 
   4024       fprintf (stream, "\t.align\t4\n");
   4025       fprintf (stream, ".Lchainval:%s0\n", integer_asm_op (4, TRUE));
   4026       fprintf (stream, ".Lfnaddr:%s0\n", integer_asm_op (4, TRUE));
   4027       fprintf (stream, ".Lskipconsts:\n");
   4028 
   4029       /* Load the static chain and function address from the trampoline.  */
   4030       if (use_call0)
   4031 	{
   4032 	  fprintf (stream, "\taddi\ta0, a0, 3\n");
   4033 	  fprintf (stream, "\tl32i\ta9, a0, 0\n");
   4034 	  fprintf (stream, "\tl32i\ta8, a0, 4\n");
   4035 	}
   4036       else
   4037 	{
   4038 	  fprintf (stream, "\tl32r\ta9, .Lchainval\n");
   4039 	  fprintf (stream, "\tl32r\ta8, .Lfnaddr\n");
   4040 	}
   4041 
   4042       /* Store the static chain.  */
   4043       fprintf (stream, "\ts32i\ta9, sp, %d\n", MIN_FRAME_SIZE - 20);
   4044 
   4045       /* Set the proper stack pointer value.  */
   4046       fprintf (stream, "\tl32i\ta9, a8, 0\n");
   4047       fprintf (stream, "\textui\ta9, a9, %d, 12\n",
   4048 	       TARGET_BIG_ENDIAN ? 8 : 12);
   4049       fprintf (stream, "\tslli\ta9, a9, 3\n");
   4050       fprintf (stream, "\taddi\ta9, a9, %d\n", -MIN_FRAME_SIZE);
   4051       fprintf (stream, "\tsub\ta9, sp, a9\n");
   4052       fprintf (stream, "\tmovsp\tsp, a9\n");
   4053 
   4054       if (use_call0)
   4055 	/* Restore the return address.  */
   4056 	fprintf (stream, "\tmov\ta0, a10\n");
   4057 
   4058       /* Jump to the instruction following the ENTRY.  */
   4059       fprintf (stream, "\taddi\ta8, a8, 3\n");
   4060       fprintf (stream, "\tjx\ta8\n");
   4061 
   4062       /* Pad size to a multiple of TRAMPOLINE_ALIGNMENT.  */
   4063       if (use_call0)
   4064 	fprintf (stream, "\t.byte\t0\n");
   4065       else
   4066 	fprintf (stream, "\tnop\n");
   4067     }
   4068   else
   4069     {
   4070       if (use_call0)
   4071 	{
   4072 	  /* Save the return address.  */
   4073 	  fprintf (stream, "\tmov\ta10, a0\n");
   4074 
   4075 	  /* Use a CALL0 instruction to skip past the constants and in the
   4076 	     process get the PC into A0.  This allows PC-relative access to
   4077 	     the constants without relying on L32R.  */
   4078 	  fprintf (stream, "\tcall0\t.Lskipconsts\n");
   4079 	}
   4080       else
   4081 	fprintf (stream, "\tj\t.Lskipconsts\n");
   4082 
   4083       fprintf (stream, "\t.align\t4\n");
   4084       fprintf (stream, ".Lchainval:%s0\n", integer_asm_op (4, TRUE));
   4085       fprintf (stream, ".Lfnaddr:%s0\n", integer_asm_op (4, TRUE));
   4086       fprintf (stream, ".Lskipconsts:\n");
   4087 
   4088       /* Load the static chain and function address from the trampoline.  */
   4089       if (use_call0)
   4090 	{
   4091 	  fprintf (stream, "\taddi\ta0, a0, 3\n");
   4092 	  fprintf (stream, "\tl32i\ta8, a0, 0\n");
   4093 	  fprintf (stream, "\tl32i\ta9, a0, 4\n");
   4094 	  fprintf (stream, "\tmov\ta0, a10\n");
   4095 	}
   4096       else
   4097 	{
   4098 	  fprintf (stream, "\tl32r\ta8, .Lchainval\n");
   4099 	  fprintf (stream, "\tl32r\ta9, .Lfnaddr\n");
   4100 	}
   4101       fprintf (stream, "\tjx\ta9\n");
   4102 
   4103       /* Pad size to a multiple of TRAMPOLINE_ALIGNMENT.  */
   4104       if (use_call0)
   4105 	fprintf (stream, "\t.byte\t0\n");
   4106       else
   4107 	fprintf (stream, "\tnop\n");
   4108     }
   4109   fprintf (stream, "\t.end no-transform\n");
   4110 }
   4111 
   4112 static void
   4113 xtensa_trampoline_init (rtx m_tramp, tree fndecl, rtx chain)
   4114 {
   4115   rtx func = XEXP (DECL_RTL (fndecl), 0);
   4116   bool use_call0 = (TARGET_CONST16 || TARGET_ABSOLUTE_LITERALS);
   4117   int chain_off;
   4118   int func_off;
   4119 
   4120   if (TARGET_WINDOWED_ABI)
   4121     {
   4122       chain_off = use_call0 ? 12 : 8;
   4123       func_off = use_call0 ? 16 : 12;
   4124     }
   4125   else
   4126     {
   4127       chain_off = use_call0 ? 8 : 4;
   4128       func_off = use_call0 ? 12 : 8;
   4129     }
   4130 
   4131   emit_block_move (m_tramp, assemble_trampoline_template (),
   4132 		   GEN_INT (TRAMPOLINE_SIZE), BLOCK_OP_NORMAL);
   4133 
   4134   emit_move_insn (adjust_address (m_tramp, SImode, chain_off), chain);
   4135   emit_move_insn (adjust_address (m_tramp, SImode, func_off), func);
   4136   emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__xtensa_sync_caches"),
   4137 		     LCT_NORMAL, VOIDmode, XEXP (m_tramp, 0), Pmode);
   4138 }
   4139 
   4140 /* Implement TARGET_LEGITIMATE_CONSTANT_P.  */
   4141 
   4142 static bool
   4143 xtensa_legitimate_constant_p (machine_mode mode ATTRIBUTE_UNUSED, rtx x)
   4144 {
   4145   return !xtensa_tls_referenced_p (x);
   4146 }
   4147 
   4148 /* Implement TARGET_CAN_USE_DOLOOP_P.  */
   4149 
   4150 static bool
   4151 xtensa_can_use_doloop_p (const widest_int &, const widest_int &,
   4152                          unsigned int loop_depth, bool entered_at_top)
   4153 {
   4154   /* Considering limitations in the hardware, only use doloop
   4155      for innermost loops which must be entered from the top.  */
   4156   if (loop_depth > 1 || !entered_at_top)
   4157     return false;
   4158 
   4159   return true;
   4160 }
   4161 
   4162 /* NULL if INSN insn is valid within a low-overhead loop.
   4163    Otherwise return why doloop cannot be applied.  */
   4164 
   4165 static const char *
   4166 xtensa_invalid_within_doloop (const rtx_insn *insn)
   4167 {
   4168   if (CALL_P (insn))
   4169     return "Function call in the loop.";
   4170 
   4171   if (JUMP_P (insn) && INSN_CODE (insn) == CODE_FOR_return)
   4172     return "Return from a call instruction in the loop.";
   4173 
   4174   return NULL;
   4175 }
   4176 
   4177 /* Optimize LOOP.  */
   4178 
   4179 static bool
   4180 hwloop_optimize (hwloop_info loop)
   4181 {
   4182   int i;
   4183   edge entry_edge;
   4184   basic_block entry_bb;
   4185   rtx iter_reg;
   4186   rtx_insn *insn, *seq, *entry_after;
   4187 
   4188   if (loop->depth > 1)
   4189     {
   4190       if (dump_file)
   4191         fprintf (dump_file, ";; loop %d is not innermost\n",
   4192                  loop->loop_no);
   4193       return false;
   4194     }
   4195 
   4196   if (!loop->incoming_dest)
   4197     {
   4198       if (dump_file)
   4199         fprintf (dump_file, ";; loop %d has more than one entry\n",
   4200                  loop->loop_no);
   4201       return false;
   4202     }
   4203 
   4204   if (loop->incoming_dest != loop->head)
   4205     {
   4206       if (dump_file)
   4207         fprintf (dump_file, ";; loop %d is not entered from head\n",
   4208                  loop->loop_no);
   4209       return false;
   4210     }
   4211 
   4212   if (loop->has_call || loop->has_asm)
   4213     {
   4214       if (dump_file)
   4215         fprintf (dump_file, ";; loop %d has invalid insn\n",
   4216                  loop->loop_no);
   4217       return false;
   4218     }
   4219 
   4220   /* Scan all the blocks to make sure they don't use iter_reg.  */
   4221   if (loop->iter_reg_used || loop->iter_reg_used_outside)
   4222     {
   4223       if (dump_file)
   4224         fprintf (dump_file, ";; loop %d uses iterator\n",
   4225                  loop->loop_no);
   4226       return false;
   4227     }
   4228 
   4229   /* Check if start_label appears before doloop_end.  */
   4230   insn = loop->start_label;
   4231   while (insn && insn != loop->loop_end)
   4232     insn = NEXT_INSN (insn);
   4233 
   4234   if (!insn)
   4235     {
   4236       if (dump_file)
   4237         fprintf (dump_file, ";; loop %d start_label not before loop_end\n",
   4238                  loop->loop_no);
   4239       return false;
   4240     }
   4241 
   4242   /* Get the loop iteration register.  */
   4243   iter_reg = loop->iter_reg;
   4244 
   4245   gcc_assert (REG_P (iter_reg));
   4246 
   4247   entry_edge = NULL;
   4248 
   4249   FOR_EACH_VEC_SAFE_ELT (loop->incoming, i, entry_edge)
   4250     if (entry_edge->flags & EDGE_FALLTHRU)
   4251       break;
   4252 
   4253   if (entry_edge == NULL)
   4254     return false;
   4255 
   4256   /* Place the zero_cost_loop_start instruction before the loop.  */
   4257   entry_bb = entry_edge->src;
   4258 
   4259   start_sequence ();
   4260 
   4261   insn = emit_insn (gen_zero_cost_loop_start (loop->iter_reg,
   4262                                               loop->start_label,
   4263                                               loop->iter_reg));
   4264 
   4265   seq = get_insns ();
   4266 
   4267   entry_after = BB_END (entry_bb);
   4268   if (!single_succ_p (entry_bb) || vec_safe_length (loop->incoming) > 1
   4269       || !entry_after)
   4270     {
   4271       basic_block new_bb;
   4272       edge e;
   4273       edge_iterator ei;
   4274 
   4275       emit_insn_before (seq, BB_HEAD (loop->head));
   4276       seq = emit_label_before (gen_label_rtx (), seq);
   4277       new_bb = create_basic_block (seq, insn, entry_bb);
   4278       FOR_EACH_EDGE (e, ei, loop->incoming)
   4279         {
   4280           if (!(e->flags & EDGE_FALLTHRU))
   4281             redirect_edge_and_branch_force (e, new_bb);
   4282           else
   4283             redirect_edge_succ (e, new_bb);
   4284         }
   4285 
   4286       make_edge (new_bb, loop->head, 0);
   4287     }
   4288   else
   4289     {
   4290       while (DEBUG_INSN_P (entry_after)
   4291              || (NOTE_P (entry_after)
   4292 		 && NOTE_KIND (entry_after) != NOTE_INSN_BASIC_BLOCK))
   4293         entry_after = PREV_INSN (entry_after);
   4294 
   4295       emit_insn_after (seq, entry_after);
   4296     }
   4297 
   4298   end_sequence ();
   4299 
   4300   return true;
   4301 }
   4302 
   4303 /* A callback for the hw-doloop pass.  Called when a loop we have discovered
   4304    turns out not to be optimizable; we have to split the loop_end pattern into
   4305    a subtract and a test.  */
   4306 
   4307 static void
   4308 hwloop_fail (hwloop_info loop)
   4309 {
   4310   rtx test;
   4311   rtx_insn *insn = loop->loop_end;
   4312 
   4313   emit_insn_before (gen_addsi3 (loop->iter_reg,
   4314                                 loop->iter_reg,
   4315                                 constm1_rtx),
   4316                     loop->loop_end);
   4317 
   4318   test = gen_rtx_NE (VOIDmode, loop->iter_reg, const0_rtx);
   4319   insn = emit_jump_insn_before (gen_cbranchsi4 (test,
   4320                                                 loop->iter_reg, const0_rtx,
   4321                                                 loop->start_label),
   4322                                 loop->loop_end);
   4323 
   4324   JUMP_LABEL (insn) = loop->start_label;
   4325   LABEL_NUSES (loop->start_label)++;
   4326   delete_insn (loop->loop_end);
   4327 }
   4328 
   4329 /* A callback for the hw-doloop pass.  This function examines INSN; if
   4330    it is a doloop_end pattern we recognize, return the reg rtx for the
   4331    loop counter.  Otherwise, return NULL_RTX.  */
   4332 
   4333 static rtx
   4334 hwloop_pattern_reg (rtx_insn *insn)
   4335 {
   4336   rtx reg;
   4337 
   4338   if (!JUMP_P (insn) || recog_memoized (insn) != CODE_FOR_loop_end)
   4339     return NULL_RTX;
   4340 
   4341   reg = SET_DEST (XVECEXP (PATTERN (insn), 0, 1));
   4342   if (!REG_P (reg))
   4343     return NULL_RTX;
   4344 
   4345   return reg;
   4346 }
   4347 
   4348 
   4349 static struct hw_doloop_hooks xtensa_doloop_hooks =
   4350 {
   4351   hwloop_pattern_reg,
   4352   hwloop_optimize,
   4353   hwloop_fail
   4354 };
   4355 
   4356 /* Run from machine_dependent_reorg, this pass looks for doloop_end insns
   4357    and tries to rewrite the RTL of these loops so that proper Xtensa
   4358    hardware loops are generated.  */
   4359 
   4360 static void
   4361 xtensa_reorg_loops (void)
   4362 {
   4363   if (TARGET_LOOPS)
   4364     reorg_loops (false, &xtensa_doloop_hooks);
   4365 }
   4366 
   4367 /* Implement the TARGET_MACHINE_DEPENDENT_REORG pass.  */
   4368 
   4369 static void
   4370 xtensa_reorg (void)
   4371 {
   4372   /* We are freeing block_for_insn in the toplev to keep compatibility
   4373      with old MDEP_REORGS that are not CFG based.  Recompute it now.  */
   4374   compute_bb_for_insn ();
   4375 
   4376   df_analyze ();
   4377 
   4378   /* Doloop optimization.  */
   4379   xtensa_reorg_loops ();
   4380 }
   4381 
   4382 /* Update register usage after having seen the compiler flags.  */
   4383 
   4384 static void
   4385 xtensa_conditional_register_usage (void)
   4386 {
   4387   unsigned i, c_mask;
   4388 
   4389   c_mask = TARGET_WINDOWED_ABI ? (1 << 1) : (1 << 2);
   4390 
   4391   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
   4392     {
   4393       /* Set/reset conditionally defined registers from
   4394 	 CALL_USED_REGISTERS initializer.  */
   4395       if (call_used_regs[i] > 1)
   4396 	call_used_regs[i] = !!(call_used_regs[i] & c_mask);
   4397     }
   4398 
   4399   /* Remove hard FP register from the preferred reload registers set.  */
   4400   CLEAR_HARD_REG_BIT (reg_class_contents[(int)RL_REGS],
   4401 		      HARD_FRAME_POINTER_REGNUM);
   4402 }
   4403 
   4404 /* Map hard register number to register class */
   4405 
   4406 enum reg_class xtensa_regno_to_class (int regno)
   4407 {
   4408   static const enum reg_class regno_to_class[FIRST_PSEUDO_REGISTER] =
   4409     {
   4410       RL_REGS,	SP_REG,		RL_REGS,	RL_REGS,
   4411       RL_REGS,	RL_REGS,	RL_REGS,	RL_REGS,
   4412       RL_REGS,	RL_REGS,	RL_REGS,	RL_REGS,
   4413       RL_REGS,	RL_REGS,	RL_REGS,	RL_REGS,
   4414       AR_REGS,	AR_REGS,	BR_REGS,
   4415       FP_REGS,	FP_REGS,	FP_REGS,	FP_REGS,
   4416       FP_REGS,	FP_REGS,	FP_REGS,	FP_REGS,
   4417       FP_REGS,	FP_REGS,	FP_REGS,	FP_REGS,
   4418       FP_REGS,	FP_REGS,	FP_REGS,	FP_REGS,
   4419       ACC_REG,
   4420     };
   4421 
   4422   if (regno == HARD_FRAME_POINTER_REGNUM)
   4423     return GR_REGS;
   4424   else
   4425     return regno_to_class[regno];
   4426 }
   4427 
   4428 /* Implement TARGET_CONSTANT_ALIGNMENT.  Align string constants and
   4429    constructors to at least a word boundary.  The typical use of this
   4430    macro is to increase alignment for string constants to be word
   4431    aligned so that 'strcpy' calls that copy constants can be done
   4432    inline.  */
   4433 
   4434 static HOST_WIDE_INT
   4435 xtensa_constant_alignment (const_tree exp, HOST_WIDE_INT align)
   4436 {
   4437   if ((TREE_CODE (exp) == STRING_CST || TREE_CODE (exp) == CONSTRUCTOR)
   4438       && !optimize_size)
   4439     return MAX (align, BITS_PER_WORD);
   4440   return align;
   4441 }
   4442 
   4443 static bool
   4444 xtensa_can_eliminate (const int from ATTRIBUTE_UNUSED, const int to)
   4445 {
   4446   gcc_assert (from == ARG_POINTER_REGNUM || from == FRAME_POINTER_REGNUM);
   4447 
   4448   /* If we need a frame pointer, ARG_POINTER_REGNUM and FRAME_POINTER_REGNUM
   4449      can only eliminate to HARD_FRAME_POINTER_REGNUM.  */
   4450   return to == HARD_FRAME_POINTER_REGNUM
   4451     || (!frame_pointer_needed && to == STACK_POINTER_REGNUM);
   4452 }
   4453 
   4454 /* Implement TARGET_STARTING_FRAME_OFFSET.  */
   4455 
   4456 static HOST_WIDE_INT
   4457 xtensa_starting_frame_offset (void)
   4458 {
   4459   if (FRAME_GROWS_DOWNWARD)
   4460     return 0;
   4461   return crtl->outgoing_args_size;
   4462 }
   4463 
   4464 /* Implement TARGET_ASAN_SHADOW_OFFSET.  */
   4465 
   4466 static unsigned HOST_WIDE_INT
   4467 xtensa_asan_shadow_offset (void)
   4468 {
   4469   return HOST_WIDE_INT_UC (0x10000000);
   4470 }
   4471 
   4472 static rtx
   4473 xtensa_delegitimize_address (rtx op)
   4474 {
   4475   switch (GET_CODE (op))
   4476     {
   4477     case CONST:
   4478       return xtensa_delegitimize_address (XEXP (op, 0));
   4479 
   4480     case UNSPEC:
   4481       if (XINT (op, 1) == UNSPEC_PLT)
   4482 	return XVECEXP(op, 0, 0);
   4483       break;
   4484 
   4485     default:
   4486       break;
   4487     }
   4488   return op;
   4489 }
   4490 
   4491 #include "gt-xtensa.h"
   4492