* @file
* @brief Generic backend types and interfaces.
* @author Sebastian Hack
- * @version $Id$
*/
#ifndef FIRM_BE_MAIN_H
#define FIRM_BE_MAIN_H
#include "iroptimize.h"
#include "begin.h"
+/**
+ * @defgroup be Code Generation
+ *
+ * Code Generation (backend) produces machine-code.
+ * @{
+ */
+
typedef enum {
ASM_CONSTRAINT_FLAG_NONE = 0,
ASM_CONSTRAINT_FLAG_SUPPORTS_REGISTER = 1u << 0,
*/
typedef ir_node *(create_trampoline_fkt)(ir_node *block, ir_node *mem, ir_node *trampoline, ir_node *env, ir_node *callee);
-/** callback where the backend performs required lowering for the target
- * architecture. Typical examples are transforming doubleword operations into
- * sequences of word operations. The callback should be invoked before the
- * frontend, because it is usually a good idea to perform other optimisations
- * after the lowering
- */
-typedef void (*lower_for_target_func)(void);
-
/**
* This structure contains parameters that should be
* propagated to the libFirm parameter set.
unsigned support_rotl:1;
/** the backend uses big-endian byte ordering if set, else little endian */
unsigned byte_order_big_endian:1;
+ /** whether the architecure can natively handle modulo shift modes.
+ * If this is true, then you can assume that shifting in modes with
+ * module_shift==machine_size (if mode size is <= machine_size) is efficient
+ */
+ unsigned modulo_shift_efficient:1;
+ /** whether the architecure can natively handle modulo shift modes.
+ * If this is true, then you can assume that shifting without modulo shift
+ * is efficient
+ */
+ unsigned non_modulo_shift_efficient:1;
/** Settings for architecture dependent optimizations. */
const ir_settings_arch_dep_t *dep_param;
/** Backend settings for if-conversion. */
arch_allow_ifconv_func allow_ifconv;
+ /** size of machine words. This is usually the size of the general purpose
+ * integer registers. */
+ unsigned machine_size;
+
/**
* some backends like x87 can only do arithmetic in a specific float
- * mode (but convert to/from other float modes).
+ * mode (load/store are still done in the "normal" float/double modes).
*/
ir_mode *mode_float_arithmetic;
+ /**
+ * type used for long long or NULL if none available.
+ */
+ ir_type *type_long_long;
+
+ /**
+ * type used for unsigned long long or NULL if none available
+ */
+ ir_type *type_unsigned_long_long;
+
+ /**
+ * type used for long double or NULL if none available.
+ */
+ ir_type *type_long_double;
+
/** Size of the trampoline code. */
unsigned trampoline_size;
unsigned stack_param_align;
} backend_params;
-/**
- * Register the Firm backend command line options.
- */
-FIRM_API void be_opt_register(void);
-
/**
* Parse one backend argument.
*/
*/
FIRM_API int be_is_valid_clobber(const char *clobber);
+/** @} */
+
#include "end.h"
#endif