* @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"
-typedef enum {
- ASM_CONSTRAINT_FLAG_NONE = 0,
+/**
+ * @defgroup be Code Generation
+ *
+ * Code Generation (backend) produces machine-code.
+ * @{
+ */
+
+/**
+ * flags categorizing assembler constraint specifications
+ */
+typedef enum asm_constraint_flags_t {
+ ASM_CONSTRAINT_FLAG_NONE = 0, /**< no constraints */
+ /** input/output can be in a register */
ASM_CONSTRAINT_FLAG_SUPPORTS_REGISTER = 1u << 0,
+ /** input/output can be read/written to/from a memory address */
ASM_CONSTRAINT_FLAG_SUPPORTS_MEMOP = 1u << 1,
+ /** input can be encoded as an immediate number */
ASM_CONSTRAINT_FLAG_SUPPORTS_IMMEDIATE = 1u << 2,
+ /** the constraint is not supported yet by libFirm */
ASM_CONSTRAINT_FLAG_NO_SUPPORT = 1u << 3,
+ /** The input is also written to */
ASM_CONSTRAINT_FLAG_MODIFIER_WRITE = 1u << 4,
+ /** the input is not written to */
ASM_CONSTRAINT_FLAG_MODIFIER_NO_WRITE = 1u << 5,
+ /** the input is read */
ASM_CONSTRAINT_FLAG_MODIFIER_READ = 1u << 6,
+ /** the input is not read */
ASM_CONSTRAINT_FLAG_MODIFIER_NO_READ = 1u << 7,
+ /** the value is modified before all inputs to the asm block
+ * are handled. */
ASM_CONSTRAINT_FLAG_MODIFIER_EARLYCLOBBER = 1u << 8,
+ /** This operand and the following operand are commutative */
ASM_CONSTRAINT_FLAG_MODIFIER_COMMUTATIVE = 1u << 9,
+ /** invalid constraint (due to parse error) */
ASM_CONSTRAINT_FLAG_INVALID = 1u << 10
} asm_constraint_flags_t;
ENUM_BITSET(asm_constraint_flags_t)
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;
*/
ir_mode *mode_float_arithmetic;
- /** size of a long double floating mode in bits (or 0 if not supported) */
- unsigned long_double_size;
+ /**
+ * 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_parse_arg(const char *arg);
/**
- * Return the backend configuration parameter.
+ * Returns the backend configuration parameter.
*
* @return libFirm configuration parameters for the selected
* backend
*/
FIRM_API int be_is_valid_clobber(const char *clobber);
+/** @} */
+
#include "end.h"
#endif