mips-protos.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370
  1. /* Prototypes of target machine for GNU compiler. MIPS version.
  2. Copyright (C) 1989-2015 Free Software Foundation, Inc.
  3. Contributed by A. Lichnewsky (lich@inria.inria.fr).
  4. Changed by Michael Meissner (meissner@osf.org).
  5. 64-bit r4000 support by Ian Lance Taylor (ian@cygnus.com) and
  6. Brendan Eich (brendan@microunity.com).
  7. This file is part of GCC.
  8. GCC is free software; you can redistribute it and/or modify
  9. it under the terms of the GNU General Public License as published by
  10. the Free Software Foundation; either version 3, or (at your option)
  11. any later version.
  12. GCC is distributed in the hope that it will be useful,
  13. but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. GNU General Public License for more details.
  16. You should have received a copy of the GNU General Public License
  17. along with GCC; see the file COPYING3. If not see
  18. <http://www.gnu.org/licenses/>. */
  19. #ifndef GCC_MIPS_PROTOS_H
  20. #define GCC_MIPS_PROTOS_H
  21. /* Describes how a symbol is used.
  22. SYMBOL_CONTEXT_CALL
  23. The symbol is used as the target of a call instruction.
  24. SYMBOL_CONTEXT_LEA
  25. The symbol is used in a load-address operation.
  26. SYMBOL_CONTEXT_MEM
  27. The symbol is used as the address in a MEM. */
  28. enum mips_symbol_context {
  29. SYMBOL_CONTEXT_CALL,
  30. SYMBOL_CONTEXT_LEA,
  31. SYMBOL_CONTEXT_MEM
  32. };
  33. /* Classifies a SYMBOL_REF, LABEL_REF or UNSPEC address.
  34. SYMBOL_ABSOLUTE
  35. The symbol's value will be calculated using absolute relocations,
  36. such as %hi and %lo.
  37. SYMBOL_GP_RELATIVE
  38. The symbol's value will be calculated by adding a 16-bit offset
  39. from $gp.
  40. SYMBOL_PC_RELATIVE
  41. The symbol's value will be calculated using a MIPS16 PC-relative
  42. calculation.
  43. SYMBOL_GOT_PAGE_OFST
  44. The symbol's value will be calculated by loading an address
  45. from the GOT and then applying a 16-bit offset.
  46. SYMBOL_GOT_DISP
  47. The symbol's value will be loaded directly from the GOT.
  48. SYMBOL_GOTOFF_PAGE
  49. An UNSPEC wrapper around a SYMBOL_GOT_PAGE_OFST. It represents the
  50. offset from _gp of the GOT entry.
  51. SYMBOL_GOTOFF_DISP
  52. An UNSPEC wrapper around a SYMBOL_GOT_DISP. It represents the
  53. offset from _gp of the symbol's GOT entry.
  54. SYMBOL_GOTOFF_CALL
  55. Like SYMBOL_GOTOFF_DISP, but used when calling a global function.
  56. The GOT entry is allowed to point to a stub rather than to the
  57. function itself.
  58. SYMBOL_GOTOFF_LOADGP
  59. An UNSPEC wrapper around a function's address. It represents the
  60. offset of _gp from the start of the function.
  61. SYMBOL_TLS
  62. A thread-local symbol.
  63. SYMBOL_TLSGD
  64. SYMBOL_TLSLDM
  65. SYMBOL_DTPREL
  66. SYMBOL_GOTTPREL
  67. SYMBOL_TPREL
  68. UNSPEC wrappers around SYMBOL_TLS, corresponding to the
  69. thread-local storage relocation operators.
  70. SYMBOL_64_HIGH
  71. For a 64-bit symbolic address X, this is the value of
  72. (%highest(X) << 16) + %higher(X).
  73. SYMBOL_64_MID
  74. For a 64-bit symbolic address X, this is the value of
  75. (%higher(X) << 16) + %hi(X).
  76. SYMBOL_64_LOW
  77. For a 64-bit symbolic address X, this is the value of
  78. (%hi(X) << 16) + %lo(X).
  79. SYMBOL_HALF
  80. An UNSPEC wrapper around any kind of address. It represents the
  81. low 16 bits of that address. */
  82. enum mips_symbol_type {
  83. SYMBOL_ABSOLUTE,
  84. SYMBOL_GP_RELATIVE,
  85. SYMBOL_PC_RELATIVE,
  86. SYMBOL_GOT_PAGE_OFST,
  87. SYMBOL_GOT_DISP,
  88. SYMBOL_GOTOFF_PAGE,
  89. SYMBOL_GOTOFF_DISP,
  90. SYMBOL_GOTOFF_CALL,
  91. SYMBOL_GOTOFF_LOADGP,
  92. SYMBOL_TLS,
  93. SYMBOL_TLSGD,
  94. SYMBOL_TLSLDM,
  95. SYMBOL_DTPREL,
  96. SYMBOL_GOTTPREL,
  97. SYMBOL_TPREL,
  98. SYMBOL_64_HIGH,
  99. SYMBOL_64_MID,
  100. SYMBOL_64_LOW,
  101. SYMBOL_HALF
  102. };
  103. #define NUM_SYMBOL_TYPES (SYMBOL_HALF + 1)
  104. /* Identifiers a style of $gp initialization sequence.
  105. LOADGP_NONE
  106. No initialization sequence is needed.
  107. LOADGP_OLDABI
  108. The o32 and o64 PIC sequence (the kind traditionally generated
  109. by .cpload).
  110. LOADGP_NEWABI
  111. The n32 and n64 PIC sequence (the kind traditionally generated
  112. by .cpsetup).
  113. LOADGP_ABSOLUTE
  114. The GNU absolute sequence, as generated by loadgp_absolute.
  115. LOADGP_RTP
  116. The VxWorks RTP PIC sequence, as generated by loadgp_rtp. */
  117. enum mips_loadgp_style {
  118. LOADGP_NONE,
  119. LOADGP_OLDABI,
  120. LOADGP_NEWABI,
  121. LOADGP_ABSOLUTE,
  122. LOADGP_RTP
  123. };
  124. struct mips16e_save_restore_info;
  125. /* Classifies a type of call.
  126. MIPS_CALL_NORMAL
  127. A normal call or call_value pattern.
  128. MIPS_CALL_SIBCALL
  129. A sibcall or sibcall_value pattern.
  130. MIPS_CALL_EPILOGUE
  131. A call inserted in the epilogue. */
  132. enum mips_call_type {
  133. MIPS_CALL_NORMAL,
  134. MIPS_CALL_SIBCALL,
  135. MIPS_CALL_EPILOGUE
  136. };
  137. /* Controls the conditions under which certain instructions are split.
  138. SPLIT_IF_NECESSARY
  139. Only perform splits that are necessary for correctness
  140. (because no unsplit version exists).
  141. SPLIT_FOR_SPEED
  142. Perform splits that are necessary for correctness or
  143. beneficial for code speed.
  144. SPLIT_FOR_SIZE
  145. Perform splits that are necessary for correctness or
  146. beneficial for code size. */
  147. enum mips_split_type {
  148. SPLIT_IF_NECESSARY,
  149. SPLIT_FOR_SPEED,
  150. SPLIT_FOR_SIZE
  151. };
  152. extern bool mips_symbolic_constant_p (rtx, enum mips_symbol_context,
  153. enum mips_symbol_type *);
  154. extern int mips_regno_mode_ok_for_base_p (int, machine_mode, bool);
  155. extern bool mips_stack_address_p (rtx, machine_mode);
  156. extern int mips_address_insns (rtx, machine_mode, bool);
  157. extern int mips_const_insns (rtx);
  158. extern int mips_split_const_insns (rtx);
  159. extern int mips_load_store_insns (rtx, rtx_insn *);
  160. extern int mips_idiv_insns (void);
  161. extern rtx_insn *mips_emit_move (rtx, rtx);
  162. #ifdef RTX_CODE
  163. extern void mips_emit_binary (enum rtx_code, rtx, rtx, rtx);
  164. #endif
  165. extern rtx mips_pic_base_register (rtx);
  166. extern rtx mips_got_load (rtx, rtx, enum mips_symbol_type);
  167. extern bool mips_split_symbol (rtx, rtx, machine_mode, rtx *);
  168. extern rtx mips_unspec_address (rtx, enum mips_symbol_type);
  169. extern rtx mips_strip_unspec_address (rtx);
  170. extern void mips_move_integer (rtx, rtx, unsigned HOST_WIDE_INT);
  171. extern bool mips_legitimize_move (machine_mode, rtx, rtx);
  172. extern rtx mips_subword (rtx, bool);
  173. extern bool mips_split_move_p (rtx, rtx, enum mips_split_type);
  174. extern void mips_split_move (rtx, rtx, enum mips_split_type);
  175. extern bool mips_split_move_insn_p (rtx, rtx, rtx);
  176. extern void mips_split_move_insn (rtx, rtx, rtx);
  177. extern const char *mips_output_move (rtx, rtx);
  178. extern bool mips_cfun_has_cprestore_slot_p (void);
  179. extern bool mips_cprestore_address_p (rtx, bool);
  180. extern void mips_save_gp_to_cprestore_slot (rtx, rtx, rtx, rtx);
  181. extern void mips_restore_gp_from_cprestore_slot (rtx);
  182. #ifdef RTX_CODE
  183. extern void mips_expand_scc (rtx *);
  184. extern void mips_expand_conditional_branch (rtx *);
  185. extern void mips_expand_vcondv2sf (rtx, rtx, rtx, enum rtx_code, rtx, rtx);
  186. extern void mips_expand_conditional_move (rtx *);
  187. extern void mips_expand_conditional_trap (rtx);
  188. #endif
  189. extern bool mips_use_pic_fn_addr_reg_p (const_rtx);
  190. extern rtx_insn *mips_expand_call (enum mips_call_type, rtx, rtx, rtx, rtx,
  191. bool);
  192. extern void mips_split_call (rtx, rtx);
  193. extern bool mips_get_pic_call_symbol (rtx *, int);
  194. extern void mips_set_return_address (rtx, rtx);
  195. extern bool mips_move_by_pieces_p (unsigned HOST_WIDE_INT, unsigned int);
  196. extern bool mips_store_by_pieces_p (unsigned HOST_WIDE_INT, unsigned int);
  197. extern bool mips_expand_block_move (rtx, rtx, rtx);
  198. extern void mips_expand_synci_loop (rtx, rtx);
  199. extern void mips_init_cumulative_args (CUMULATIVE_ARGS *, tree);
  200. extern bool mips_pad_arg_upward (machine_mode, const_tree);
  201. extern bool mips_pad_reg_upward (machine_mode, tree);
  202. extern bool mips_expand_ext_as_unaligned_load (rtx, rtx, HOST_WIDE_INT,
  203. HOST_WIDE_INT, bool);
  204. extern bool mips_expand_ins_as_unaligned_store (rtx, rtx, HOST_WIDE_INT,
  205. HOST_WIDE_INT);
  206. extern bool mips_mem_fits_mode_p (machine_mode mode, rtx x);
  207. extern HOST_WIDE_INT mips_debugger_offset (rtx, HOST_WIDE_INT);
  208. extern void mips_push_asm_switch (struct mips_asm_switch *);
  209. extern void mips_pop_asm_switch (struct mips_asm_switch *);
  210. extern void mips_output_external (FILE *, tree, const char *);
  211. extern void mips_output_ascii (FILE *, const char *, size_t);
  212. extern const char *mips_output_tls_reloc_directive (rtx *);
  213. extern void mips_output_aligned_decl_common (FILE *, tree, const char *,
  214. unsigned HOST_WIDE_INT,
  215. unsigned int);
  216. extern void mips_declare_common_object (FILE *, const char *,
  217. const char *, unsigned HOST_WIDE_INT,
  218. unsigned int, bool);
  219. extern void mips_declare_object (FILE *, const char *, const char *,
  220. const char *, ...) ATTRIBUTE_PRINTF_4;
  221. extern void mips_declare_object_name (FILE *, const char *, tree);
  222. extern void mips_finish_declare_object (FILE *, tree, int, int);
  223. extern bool mips_small_data_pattern_p (rtx);
  224. extern rtx mips_rewrite_small_data (rtx);
  225. extern HOST_WIDE_INT mips_initial_elimination_offset (int, int);
  226. extern rtx mips_return_addr (int, rtx);
  227. extern bool mips_must_initialize_gp_p (void);
  228. extern enum mips_loadgp_style mips_current_loadgp_style (void);
  229. extern void mips_emit_save_slot_move (rtx, rtx, rtx);
  230. extern void mips_expand_prologue (void);
  231. extern void mips_expand_before_return (void);
  232. extern void mips_expand_epilogue (bool);
  233. extern bool mips_can_use_return_insn (void);
  234. extern bool mips_secondary_memory_needed (enum reg_class, enum reg_class,
  235. machine_mode);
  236. extern bool mips_cannot_change_mode_class (machine_mode,
  237. machine_mode, enum reg_class);
  238. extern bool mips_dangerous_for_la25_p (rtx);
  239. extern bool mips_modes_tieable_p (machine_mode, machine_mode);
  240. extern enum reg_class mips_secondary_reload_class (enum reg_class,
  241. machine_mode,
  242. rtx, bool);
  243. extern int mips_class_max_nregs (enum reg_class, machine_mode);
  244. extern machine_mode mips_hard_regno_caller_save_mode (unsigned int,
  245. unsigned int,
  246. machine_mode);
  247. extern int mips_adjust_insn_length (rtx_insn *, int);
  248. extern void mips_output_load_label (rtx);
  249. extern const char *mips_output_conditional_branch (rtx_insn *, rtx *,
  250. const char *, const char *);
  251. extern const char *mips_output_order_conditional_branch (rtx_insn *, rtx *,
  252. bool);
  253. extern const char *mips_output_sync (void);
  254. extern const char *mips_output_sync_loop (rtx_insn *, rtx *);
  255. extern unsigned int mips_sync_loop_insns (rtx_insn *, rtx *);
  256. extern const char *mips_output_division (const char *, rtx *);
  257. extern const char *mips_output_probe_stack_range (rtx, rtx);
  258. extern unsigned int mips_hard_regno_nregs (int, machine_mode);
  259. extern bool mips_linked_madd_p (rtx_insn *, rtx_insn *);
  260. extern bool mips_store_data_bypass_p (rtx_insn *, rtx_insn *);
  261. extern int mips_dspalu_bypass_p (rtx, rtx);
  262. extern rtx mips_prefetch_cookie (rtx, rtx);
  263. extern const char *current_section_name (void);
  264. extern unsigned int current_section_flags (void);
  265. extern bool mips_use_ins_ext_p (rtx, HOST_WIDE_INT, HOST_WIDE_INT);
  266. extern const char *mips16e_output_save_restore (rtx, HOST_WIDE_INT);
  267. extern bool mips16e_save_restore_pattern_p (rtx, HOST_WIDE_INT,
  268. struct mips16e_save_restore_info *);
  269. extern bool mask_low_and_shift_p (machine_mode, rtx, rtx, int);
  270. extern int mask_low_and_shift_len (machine_mode, rtx, rtx);
  271. extern bool and_operands_ok (machine_mode, rtx, rtx);
  272. extern bool mips_fmadd_bypass (rtx_insn *, rtx_insn *);
  273. union mips_gen_fn_ptrs
  274. {
  275. rtx (*fn_6) (rtx, rtx, rtx, rtx, rtx, rtx);
  276. rtx (*fn_5) (rtx, rtx, rtx, rtx, rtx);
  277. rtx (*fn_4) (rtx, rtx, rtx, rtx);
  278. };
  279. extern void mips_expand_atomic_qihi (union mips_gen_fn_ptrs,
  280. rtx, rtx, rtx, rtx);
  281. extern void mips_expand_vector_init (rtx, rtx);
  282. extern bool mips_expand_vec_perm_const (rtx op[4]);
  283. extern void mips_expand_vec_unpack (rtx op[2], bool, bool);
  284. extern void mips_expand_vec_reduc (rtx, rtx, rtx (*)(rtx, rtx, rtx));
  285. extern void mips_expand_vec_minmax (rtx, rtx, rtx,
  286. rtx (*) (rtx, rtx, rtx), bool);
  287. extern bool mips_signed_immediate_p (unsigned HOST_WIDE_INT, int, int);
  288. extern bool mips_unsigned_immediate_p (unsigned HOST_WIDE_INT, int, int);
  289. extern const char *umips_output_save_restore (bool, rtx);
  290. extern bool umips_save_restore_pattern_p (bool, rtx);
  291. extern bool umips_load_store_pair_p (bool, rtx *);
  292. extern void umips_output_load_store_pair (bool, rtx *);
  293. extern bool umips_movep_target_p (rtx, rtx);
  294. extern bool umips_12bit_offset_address_p (rtx, machine_mode);
  295. extern bool mips_9bit_offset_address_p (rtx, machine_mode);
  296. extern bool lwsp_swsp_address_p (rtx, machine_mode);
  297. extern bool m16_based_address_p (rtx, machine_mode,
  298. int (*)(rtx_def*, machine_mode));
  299. extern rtx mips_expand_thread_pointer (rtx);
  300. extern void mips16_expand_get_fcsr (rtx);
  301. extern void mips16_expand_set_fcsr (rtx);
  302. extern bool mips_eh_uses (unsigned int);
  303. extern bool mips_epilogue_uses (unsigned int);
  304. extern void mips_final_prescan_insn (rtx_insn *, rtx *, int);
  305. extern int mips_trampoline_code_size (void);
  306. extern void mips_function_profiler (FILE *);
  307. typedef rtx (*mulsidi3_gen_fn) (rtx, rtx, rtx);
  308. #ifdef RTX_CODE
  309. extern mulsidi3_gen_fn mips_mulsidi3_gen_fn (enum rtx_code);
  310. #endif
  311. #endif /* ! GCC_MIPS_PROTOS_H */