===================================================================
@@ -3478,7 +3478,7 @@ lower-subreg.o : lower-subreg.c $(CONFIG
$(EXPR_H) $(EXCEPT_H) $(REGS_H) $(TREE_PASS_H) $(DF_H)
target-globals.o : target-globals.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
$(TM_H) $(MACHMODE_H) $(GGC_H) $(TOPLEV_H) target-globals.h $(FLAGS_H) \
- $(REGS_H) $(RTL_H) reload.h expmed.h
+ $(FLAGS_H) $(REGS_H) $(RTL_H) reload.h expmed.h $(EXPR_H) $(OPTABS_H)
$(out_object_file): $(out_file) $(CONFIG_H) coretypes.h $(TM_H) $(TREE_H) \
$(RTL_H) $(REGS_H) hard-reg-set.h insn-config.h conditions.h \
===================================================================
@@ -371,8 +371,6 @@ enum optab_index
OTI_MAX
};
-extern struct optab_d optab_table[OTI_MAX];
-
#define ssadd_optab (&optab_table[OTI_ssadd])
#define usadd_optab (&optab_table[OTI_usadd])
#define sssub_optab (&optab_table[OTI_sssub])
@@ -574,8 +572,6 @@ enum convert_optab_index
COI_MAX
};
-extern struct convert_optab_d convert_optab_table[COI_MAX];
-
#define sext_optab (&convert_optab_table[COI_sext])
#define zext_optab (&convert_optab_table[COI_zext])
#define trunc_optab (&convert_optab_table[COI_trunc])
@@ -676,8 +672,6 @@ struct direct_optab_d
};
typedef struct direct_optab_d *direct_optab;
-extern struct direct_optab_d direct_optab_table[(int) DOI_MAX];
-
#ifdef HAVE_conditional_move
#define movcc_optab (&direct_optab_table[(int) DOI_movcc])
#endif
@@ -715,6 +709,33 @@ #define sync_lock_test_and_set_optab \
#define sync_lock_release_optab \
(&direct_optab_table[(int) DOI_sync_lock_release])
+/* Target-dependent globals. */
+struct target_optabs {
+ /* Tables of patterns that may have an associated libcall. */
+ struct optab_d x_optab_table[(int) OTI_MAX];
+
+ /* Tables of patterns for converting one mode to another. */
+ struct convert_optab_d x_convert_optab_table[(int) COI_MAX];
+
+ /* Tables of patterns for direct optabs (i.e. those which cannot be
+ implemented using a libcall). */
+ struct direct_optab_d x_direct_optab_table[(int) DOI_MAX];
+};
+
+extern struct target_optabs default_target_optabs;
+#if SWITCHABLE_TARGET
+extern struct target_optabs *this_target_optabs;
+#else
+#define this_target_optabs (&default_target_optabs)
+#endif
+
+#define optab_table \
+ (this_target_optabs->x_optab_table)
+#define convert_optab_table \
+ (this_target_optabs->x_convert_optab_table)
+#define direct_optab_table \
+ (this_target_optabs->x_direct_optab_table)
+
/* Define functions given in optabs.c. */
extern rtx expand_widen_pattern_expr (sepops ops, rtx op0, rtx op1, rtx wide_op,
===================================================================
@@ -44,26 +44,13 @@ Software Foundation; either version 3, o
#include "basic-block.h"
#include "target.h"
-/* Each optab contains info on how this target machine
- can perform a particular operation
- for all sizes and kinds of operands.
-
- The operation to be performed is often specified
- by passing one of these optabs as an argument.
-
- See expr.h for documentation of these optabs. */
-
-struct optab_d optab_table[OTI_MAX];
+struct target_optabs default_target_optabs;
+#if SWITCHABLE_TARGET
+struct target_optabs *this_target_optabs;
+#endif
rtx libfunc_table[LTI_MAX];
-/* Tables of patterns for converting one mode to another. */
-struct convert_optab_d convert_optab_table[COI_MAX];
-
-/* Tables of patterns for direct optabs (i.e. those which cannot be
- implement using a libcall). */
-struct direct_optab_d direct_optab_table[(int) DOI_MAX];
-
/* Contains the optab used for each rtx code. */
optab code_to_optab[NUM_RTX_CODE + 1];
===================================================================
@@ -27,6 +27,7 @@ #define TARGET_GLOBALS_H 1
extern struct target_hard_regs *this_target_hard_regs;
extern struct target_reload *this_target_reload;
extern struct target_expmed *this_target_expmed;
+extern struct target_optabs *this_target_optabs;
struct GTY(()) target_globals {
struct target_flag_state *GTY((skip)) flag_state;
@@ -35,6 +36,7 @@ struct GTY(()) target_globals {
struct target_hard_regs *GTY((skip)) hard_regs;
struct target_reload *GTY((skip)) reload;
struct target_expmed *GTY((skip)) expmed;
+ struct target_optabs *GTY((skip)) optabs;
};
extern struct target_globals default_target_globals;
@@ -50,6 +52,7 @@ restore_target_globals (struct target_gl
this_target_hard_regs = g->hard_regs;
this_target_reload = g->reload;
this_target_expmed = g->expmed;
+ this_target_optabs = g->optabs;
}
#endif
===================================================================
@@ -31,6 +31,8 @@ Software Foundation; either version 3, o
#include "hard-reg-set.h"
#include "reload.h"
#include "expmed.h"
+#include "expr.h"
+#include "optabs.h"
#if SWITCHABLE_TARGET
struct target_globals default_target_globals = {
@@ -39,7 +41,8 @@ struct target_globals default_target_glo
&default_target_rtl,
&default_target_hard_regs,
&default_target_reload,
- &default_target_expmed
+ &default_target_expmed,
+ &default_target_optabs
};
struct target_globals *
@@ -54,6 +57,7 @@ save_target_globals (void)
g->hard_regs = XCNEW (struct target_hard_regs);
g->reload = XCNEW (struct target_reload);
g->expmed = XCNEW (struct target_expmed);
+ g->optabs = XCNEW (struct target_optabs);
restore_target_globals (g);
target_reinit ();
return g;