move iterator/fourcc to private API
[libfirm] / include / libfirm / be.h
index 2d71276..a97ec1b 100644 (file)
@@ -21,7 +21,6 @@
  * @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,
@@ -71,6 +77,16 @@ typedef struct backend_params {
        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;
@@ -78,12 +94,31 @@ typedef struct backend_params {
        /** 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;
 
@@ -97,11 +132,6 @@ typedef struct backend_params {
        unsigned stack_param_align;
 } backend_params;
 
-/**
- * Register the Firm backend command line options.
- */
-FIRM_API void be_opt_register(void);
-
 /**
  * Parse one backend argument.
  */
@@ -148,6 +178,8 @@ FIRM_API asm_constraint_flags_t be_parse_asm_constraints(const char *constraints
  */
 FIRM_API int be_is_valid_clobber(const char *clobber);
 
+/** @} */
+
 #include "end.h"
 
 #endif