comparison gcc/config/arm/arm-protos.h @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents 84e7813d76e9
children
comparison
equal deleted inserted replaced
131:84e7813d76e9 145:1830386684a0
1 /* Prototypes for exported functions defined in arm.c and pe.c 1 /* Prototypes for exported functions defined in arm.c and pe.c
2 Copyright (C) 1999-2018 Free Software Foundation, Inc. 2 Copyright (C) 1999-2020 Free Software Foundation, Inc.
3 Contributed by Richard Earnshaw (rearnsha@arm.com) 3 Contributed by Richard Earnshaw (rearnsha@arm.com)
4 Minor hacks by Nick Clifton (nickc@cygnus.com) 4 Minor hacks by Nick Clifton (nickc@cygnus.com)
5 5
6 This file is part of GCC. 6 This file is part of GCC.
7 7
26 26
27 extern enum unwind_info_type arm_except_unwind_info (struct gcc_options *); 27 extern enum unwind_info_type arm_except_unwind_info (struct gcc_options *);
28 extern int use_return_insn (int, rtx); 28 extern int use_return_insn (int, rtx);
29 extern bool use_simple_return_p (void); 29 extern bool use_simple_return_p (void);
30 extern enum reg_class arm_regno_class (int); 30 extern enum reg_class arm_regno_class (int);
31 extern void arm_load_pic_register (unsigned long); 31 extern bool arm_check_builtin_call (location_t , vec<location_t> , tree,
32 tree, unsigned int, tree *);
33 extern void arm_load_pic_register (unsigned long, rtx);
32 extern int arm_volatile_func (void); 34 extern int arm_volatile_func (void);
33 extern void arm_expand_prologue (void); 35 extern void arm_expand_prologue (void);
34 extern void arm_expand_epilogue (bool); 36 extern void arm_expand_epilogue (bool);
35 extern void arm_declare_function_name (FILE *, const char *, tree); 37 extern void arm_declare_function_name (FILE *, const char *, tree);
36 extern void arm_asm_declare_function_name (FILE *, const char *, tree); 38 extern void arm_asm_declare_function_name (FILE *, const char *, tree);
55 extern void arm_atomic_assign_expand_fenv (tree *hold, tree *clear, tree *update); 57 extern void arm_atomic_assign_expand_fenv (tree *hold, tree *clear, tree *update);
56 extern rtx arm_simd_vect_par_cnst_half (machine_mode mode, bool high); 58 extern rtx arm_simd_vect_par_cnst_half (machine_mode mode, bool high);
57 extern bool arm_simd_check_vect_par_cnst_half_p (rtx op, machine_mode mode, 59 extern bool arm_simd_check_vect_par_cnst_half_p (rtx op, machine_mode mode,
58 bool high); 60 bool high);
59 extern void arm_emit_speculation_barrier_function (void); 61 extern void arm_emit_speculation_barrier_function (void);
62 extern void arm_decompose_di_binop (rtx, rtx, rtx *, rtx *, rtx *, rtx *);
63 extern bool arm_q_bit_access (void);
64 extern bool arm_ge_bits_access (void);
60 65
61 #ifdef RTX_CODE 66 #ifdef RTX_CODE
62 extern void arm_gen_unlikely_cbranch (enum rtx_code, machine_mode cc_mode, 67 extern void arm_gen_unlikely_cbranch (enum rtx_code, machine_mode cc_mode,
63 rtx label_ref); 68 rtx label_ref);
64 extern bool arm_vector_mode_supported_p (machine_mode); 69 extern bool arm_vector_mode_supported_p (machine_mode);
65 extern bool arm_small_register_classes_for_mode_p (machine_mode); 70 extern bool arm_small_register_classes_for_mode_p (machine_mode);
66 extern int const_ok_for_arm (HOST_WIDE_INT); 71 extern int const_ok_for_arm (HOST_WIDE_INT);
67 extern int const_ok_for_op (HOST_WIDE_INT, enum rtx_code); 72 extern int const_ok_for_op (HOST_WIDE_INT, enum rtx_code);
68 extern int const_ok_for_dimode_op (HOST_WIDE_INT, enum rtx_code); 73 extern int const_ok_for_dimode_op (HOST_WIDE_INT, enum rtx_code);
74 extern void thumb1_gen_const_int (rtx, HOST_WIDE_INT);
69 extern int arm_split_constant (RTX_CODE, machine_mode, rtx, 75 extern int arm_split_constant (RTX_CODE, machine_mode, rtx,
70 HOST_WIDE_INT, rtx, rtx, int); 76 HOST_WIDE_INT, rtx, rtx, int);
71 extern int legitimate_pic_operand_p (rtx); 77 extern int legitimate_pic_operand_p (rtx);
72 extern rtx legitimize_pic_address (rtx, machine_mode, rtx); 78 extern rtx legitimize_pic_address (rtx, machine_mode, rtx, rtx, bool);
73 extern rtx legitimize_tls_address (rtx, rtx); 79 extern rtx legitimize_tls_address (rtx, rtx);
74 extern bool arm_legitimate_address_p (machine_mode, rtx, bool); 80 extern bool arm_legitimate_address_p (machine_mode, rtx, bool);
75 extern int arm_legitimate_address_outer_p (machine_mode, rtx, RTX_CODE, int); 81 extern int arm_legitimate_address_outer_p (machine_mode, rtx, RTX_CODE, int);
76 extern int thumb_legitimate_offset_p (machine_mode, HOST_WIDE_INT); 82 extern int thumb_legitimate_offset_p (machine_mode, HOST_WIDE_INT);
77 extern int thumb1_legitimate_address_p (machine_mode, rtx, int); 83 extern int thumb1_legitimate_address_p (machine_mode, rtx, int);
78 extern bool ldm_stm_operation_p (rtx, bool, machine_mode mode, 84 extern bool ldm_stm_operation_p (rtx, bool, machine_mode mode,
79 bool, bool); 85 bool, bool);
86 extern bool clear_operation_p (rtx, bool);
80 extern int arm_const_double_rtx (rtx); 87 extern int arm_const_double_rtx (rtx);
81 extern int vfp3_const_double_rtx (rtx); 88 extern int vfp3_const_double_rtx (rtx);
82 extern int neon_immediate_valid_for_move (rtx, machine_mode, rtx *, int *); 89 extern int neon_immediate_valid_for_move (rtx, machine_mode, rtx *, int *);
83 extern int neon_immediate_valid_for_logic (rtx, machine_mode, int, rtx *, 90 extern int neon_immediate_valid_for_logic (rtx, machine_mode, int, rtx *,
84 int *); 91 int *);
107 114
108 extern int arm_coproc_mem_operand (rtx, bool); 115 extern int arm_coproc_mem_operand (rtx, bool);
109 extern int neon_vector_mem_operand (rtx, int, bool); 116 extern int neon_vector_mem_operand (rtx, int, bool);
110 extern int neon_struct_mem_operand (rtx); 117 extern int neon_struct_mem_operand (rtx);
111 118
119 extern rtx *neon_vcmla_lane_prepare_operands (rtx *);
120
112 extern int tls_mentioned_p (rtx); 121 extern int tls_mentioned_p (rtx);
113 extern int symbol_mentioned_p (rtx); 122 extern int symbol_mentioned_p (rtx);
114 extern int label_mentioned_p (rtx); 123 extern int label_mentioned_p (rtx);
115 extern RTX_CODE minmax_code (rtx); 124 extern RTX_CODE minmax_code (rtx);
116 extern bool arm_sat_operator_match (rtx, rtx, int *, bool *); 125 extern bool arm_sat_operator_match (rtx, rtx, int *, bool *);
121 extern rtx arm_gen_load_multiple (int *, int, rtx, int, rtx, HOST_WIDE_INT *); 130 extern rtx arm_gen_load_multiple (int *, int, rtx, int, rtx, HOST_WIDE_INT *);
122 extern rtx arm_gen_store_multiple (int *, int, rtx, int, rtx, HOST_WIDE_INT *); 131 extern rtx arm_gen_store_multiple (int *, int, rtx, int, rtx, HOST_WIDE_INT *);
123 extern bool offset_ok_for_ldrd_strd (HOST_WIDE_INT); 132 extern bool offset_ok_for_ldrd_strd (HOST_WIDE_INT);
124 extern bool operands_ok_ldrd_strd (rtx, rtx, rtx, HOST_WIDE_INT, bool, bool); 133 extern bool operands_ok_ldrd_strd (rtx, rtx, rtx, HOST_WIDE_INT, bool, bool);
125 extern bool gen_operands_ldrd_strd (rtx *, bool, bool, bool); 134 extern bool gen_operands_ldrd_strd (rtx *, bool, bool, bool);
126 extern int arm_gen_movmemqi (rtx *); 135 extern bool valid_operands_ldrd_strd (rtx *, bool);
127 extern bool gen_movmem_ldrd_strd (rtx *); 136 extern int arm_gen_cpymemqi (rtx *);
137 extern bool gen_cpymem_ldrd_strd (rtx *);
128 extern machine_mode arm_select_cc_mode (RTX_CODE, rtx, rtx); 138 extern machine_mode arm_select_cc_mode (RTX_CODE, rtx, rtx);
129 extern machine_mode arm_select_dominance_cc_mode (rtx, rtx, 139 extern machine_mode arm_select_dominance_cc_mode (rtx, rtx,
130 HOST_WIDE_INT); 140 HOST_WIDE_INT);
131 extern rtx arm_gen_compare_reg (RTX_CODE, rtx, rtx, rtx); 141 extern rtx arm_gen_compare_reg (RTX_CODE, rtx, rtx, rtx);
132 extern rtx arm_gen_return_addr_mask (void); 142 extern rtx arm_gen_return_addr_mask (void);
134 extern void arm_reload_out_hi (rtx *); 144 extern void arm_reload_out_hi (rtx *);
135 extern int arm_max_const_double_inline_cost (void); 145 extern int arm_max_const_double_inline_cost (void);
136 extern int arm_const_double_inline_cost (rtx); 146 extern int arm_const_double_inline_cost (rtx);
137 extern bool arm_const_double_by_parts (rtx); 147 extern bool arm_const_double_by_parts (rtx);
138 extern bool arm_const_double_by_immediates (rtx); 148 extern bool arm_const_double_by_immediates (rtx);
149 extern rtx arm_load_function_descriptor (rtx funcdesc);
139 extern void arm_emit_call_insn (rtx, rtx, bool); 150 extern void arm_emit_call_insn (rtx, rtx, bool);
140 bool detect_cmse_nonsecure_call (tree); 151 bool detect_cmse_nonsecure_call (tree);
141 extern const char *output_call (rtx *); 152 extern const char *output_call (rtx *);
142 void arm_emit_movpair (rtx, rtx); 153 void arm_emit_movpair (rtx, rtx);
143 extern const char *output_mov_long_double_arm_from_arm (rtx *); 154 extern const char *output_mov_long_double_arm_from_arm (rtx *);
144 extern const char *output_move_double (rtx *, bool, int *count); 155 extern const char *output_move_double (rtx *, bool, int *count);
145 extern const char *output_move_quad (rtx *); 156 extern const char *output_move_quad (rtx *);
146 extern int arm_count_output_move_double_insns (rtx *); 157 extern int arm_count_output_move_double_insns (rtx *);
158 extern int arm_count_ldrdstrd_insns (rtx *, bool);
147 extern const char *output_move_vfp (rtx *operands); 159 extern const char *output_move_vfp (rtx *operands);
148 extern const char *output_move_neon (rtx *operands); 160 extern const char *output_move_neon (rtx *operands);
149 extern int arm_attr_length_move_neon (rtx_insn *); 161 extern int arm_attr_length_move_neon (rtx_insn *);
150 extern int arm_address_offset_is_imm (rtx_insn *); 162 extern int arm_address_offset_is_imm (rtx_insn *);
151 extern const char *output_add_immediate (rtx *); 163 extern const char *output_add_immediate (rtx *);
197 extern void thumb1_final_prescan_insn (rtx_insn *); 209 extern void thumb1_final_prescan_insn (rtx_insn *);
198 extern void thumb2_final_prescan_insn (rtx_insn *); 210 extern void thumb2_final_prescan_insn (rtx_insn *);
199 extern const char *thumb_load_double_from_address (rtx *); 211 extern const char *thumb_load_double_from_address (rtx *);
200 extern const char *thumb_output_move_mem_multiple (int, rtx *); 212 extern const char *thumb_output_move_mem_multiple (int, rtx *);
201 extern const char *thumb_call_via_reg (rtx); 213 extern const char *thumb_call_via_reg (rtx);
202 extern void thumb_expand_movmemqi (rtx *); 214 extern void thumb_expand_cpymemqi (rtx *);
203 extern rtx arm_return_addr (int, rtx); 215 extern rtx arm_return_addr (int, rtx);
204 extern void thumb_reload_out_hi (rtx *); 216 extern void thumb_reload_out_hi (rtx *);
205 extern void thumb_set_return_address (rtx, rtx); 217 extern void thumb_set_return_address (rtx, rtx);
206 extern const char *thumb1_output_casesi (rtx *); 218 extern const char *thumb1_output_casesi (rtx *);
207 extern const char *thumb2_output_casesi (rtx *); 219 extern const char *thumb2_output_casesi (rtx *);
321 log_op_non_short_circuit logical_op_non_short_circuit_thumb: 1; 333 log_op_non_short_circuit logical_op_non_short_circuit_thumb: 1;
322 log_op_non_short_circuit logical_op_non_short_circuit_arm: 1; 334 log_op_non_short_circuit logical_op_non_short_circuit_arm: 1;
323 /* Prefer 32-bit encoding instead of flag-setting 16-bit encoding. */ 335 /* Prefer 32-bit encoding instead of flag-setting 16-bit encoding. */
324 enum {DISPARAGE_FLAGS_NEITHER, DISPARAGE_FLAGS_PARTIAL, DISPARAGE_FLAGS_ALL} 336 enum {DISPARAGE_FLAGS_NEITHER, DISPARAGE_FLAGS_PARTIAL, DISPARAGE_FLAGS_ALL}
325 disparage_flag_setting_t16_encodings: 2; 337 disparage_flag_setting_t16_encodings: 2;
326 enum {PREF_NEON_64_FALSE, PREF_NEON_64_TRUE} prefer_neon_for_64bits: 1;
327 /* Prefer to inline string operations like memset by using Neon. */ 338 /* Prefer to inline string operations like memset by using Neon. */
328 enum {PREF_NEON_STRINGOPS_FALSE, PREF_NEON_STRINGOPS_TRUE} 339 enum {PREF_NEON_STRINGOPS_FALSE, PREF_NEON_STRINGOPS_TRUE}
329 string_ops_prefer_neon: 1; 340 string_ops_prefer_neon: 1;
330 /* Bitfield encoding the fusible pairs of instructions. Use FUSE_OPS 341 /* Bitfield encoding the fusible pairs of instructions. Use FUSE_OPS
331 in an initializer if multiple fusion operations are supported on a 342 in an initializer if multiple fusion operations are supported on a
373 /* Defined in gcc/common/config/arm-c.c. */ 384 /* Defined in gcc/common/config/arm-c.c. */
374 extern void arm_lang_object_attributes_init (void); 385 extern void arm_lang_object_attributes_init (void);
375 extern void arm_register_target_pragmas (void); 386 extern void arm_register_target_pragmas (void);
376 extern void arm_cpu_cpp_builtins (struct cpp_reader *); 387 extern void arm_cpu_cpp_builtins (struct cpp_reader *);
377 388
389 /* Defined in arm-d.c */
390 extern void arm_d_target_versions (void);
391
378 extern bool arm_is_constant_pool_ref (rtx); 392 extern bool arm_is_constant_pool_ref (rtx);
379 393
380 /* The bits in this mask specify which instruction scheduling options should 394 /* The bits in this mask specify which instruction scheduling options should
381 be used. */ 395 be used. */
382 extern unsigned int tune_flags; 396 extern unsigned int tune_flags;
462 extern int arm_arch_arm_hwdiv; 476 extern int arm_arch_arm_hwdiv;
463 extern int arm_arch_thumb_hwdiv; 477 extern int arm_arch_thumb_hwdiv;
464 478
465 /* Nonzero if chip disallows volatile memory access in IT block. */ 479 /* Nonzero if chip disallows volatile memory access in IT block. */
466 extern int arm_arch_no_volatile_ce; 480 extern int arm_arch_no_volatile_ce;
467
468 /* Nonzero if we should use Neon to handle 64-bits operations rather
469 than core registers. */
470 extern int prefer_neon_for_64bits;
471 481
472 /* Structure defining the current overall architectural target and tuning. */ 482 /* Structure defining the current overall architectural target and tuning. */
473 struct arm_build_target 483 struct arm_build_target
474 { 484 {
475 /* Name of the target CPU, if known, or NULL if the target CPU was not 485 /* Name of the target CPU, if known, or NULL if the target CPU was not
493 enum processor_type tune_core; 503 enum processor_type tune_core;
494 }; 504 };
495 505
496 extern struct arm_build_target arm_active_target; 506 extern struct arm_build_target arm_active_target;
497 507
508 /* Table entry for a CPU alias. */
509 struct cpu_alias
510 {
511 /* The alias name. */
512 const char *const name;
513 /* True if the name should be displayed in help text listing cpu names. */
514 bool visible;
515 };
516
517 /* Table entry for an architectural feature extension. */
498 struct cpu_arch_extension 518 struct cpu_arch_extension
499 { 519 {
500 /* Feature name. */ 520 /* Feature name. */
501 const char *const name; 521 const char *const name;
502 /* True if the option is negative (removes extensions). */ 522 /* True if the option is negative (removes extensions). */
506 bool alias; 526 bool alias;
507 /* The modifier bits. */ 527 /* The modifier bits. */
508 const enum isa_feature isa_bits[isa_num_bits]; 528 const enum isa_feature isa_bits[isa_num_bits];
509 }; 529 };
510 530
531 /* Common elements of both CPU and architectural options. */
511 struct cpu_arch_option 532 struct cpu_arch_option
512 { 533 {
513 /* Name for this option. */ 534 /* Name for this option. */
514 const char *name; 535 const char *name;
515 /* List of feature extensions permitted. */ 536 /* List of feature extensions permitted. */
516 const struct cpu_arch_extension *extensions; 537 const struct cpu_arch_extension *extensions;
517 /* Standard feature bits. */ 538 /* Standard feature bits. */
518 enum isa_feature isa_bits[isa_num_bits]; 539 enum isa_feature isa_bits[isa_num_bits];
519 }; 540 };
520 541
542 /* Table entry for an architecture entry. */
521 struct arch_option 543 struct arch_option
522 { 544 {
523 /* Common option fields. */ 545 /* Common option fields. */
524 cpu_arch_option common; 546 cpu_arch_option common;
525 /* Short string for this architecture. */ 547 /* Short string for this architecture. */
530 const char profile; 552 const char profile;
531 /* Default tune target (in the absence of any more specific data). */ 553 /* Default tune target (in the absence of any more specific data). */
532 enum processor_type tune_id; 554 enum processor_type tune_id;
533 }; 555 };
534 556
557 /* Table entry for a CPU entry. */
535 struct cpu_option 558 struct cpu_option
536 { 559 {
537 /* Common option fields. */ 560 /* Common option fields. */
538 cpu_arch_option common; 561 cpu_arch_option common;
562 /* List of aliases for this CPU. */
563 const struct cpu_alias *aliases;
539 /* Architecture upon which this CPU is based. */ 564 /* Architecture upon which this CPU is based. */
540 enum arch_type arch; 565 enum arch_type arch;
541 }; 566 };
542 567
543 extern const arch_option all_architectures[]; 568 extern const arch_option all_architectures[];
550 void arm_parse_option_features (sbitmap, const cpu_arch_option *, 575 void arm_parse_option_features (sbitmap, const cpu_arch_option *,
551 const char *); 576 const char *);
552 577
553 void arm_initialize_isa (sbitmap, const enum isa_feature *); 578 void arm_initialize_isa (sbitmap, const enum isa_feature *);
554 579
580 const char * arm_gen_far_branch (rtx *, int, const char * , const char *);
581
555 #endif /* ! GCC_ARM_PROTOS_H */ 582 #endif /* ! GCC_ARM_PROTOS_H */