fixed lea->add conversion
[libfirm] / ir / be / bearch.h
index 9742429..30404e9 100644 (file)
@@ -19,7 +19,7 @@
 struct _be_node_factory_t;
 
 typedef enum _arch_register_type_t {
-  arch_register_type_none = 0,
+  arch_register_type_none         = 0,
   arch_register_type_caller_save  = 1, /**< The register must be saved by the caller
                                             upon a function call. It thus can be overwritten
                                             in the called function. */
@@ -183,9 +183,23 @@ typedef enum _arch_irn_class_t {
   arch_irn_class_copy,
   arch_irn_class_perm,
   arch_irn_class_branch,
-  arch_irn_class_call
+  arch_irn_class_call,
+  arch_irn_class_const,
 } arch_irn_class_t;
 
+/**
+ * An inverse operation returned by the backend
+ */
+typedef struct _arch_inverse_t {
+       int      n;       /**< count of nodes returned in nodes array */
+       int      costs;   /**< costs of this remat */
+
+       /**< nodes for this inverse operation. shall be in
+        *  schedule order. last element is the target value
+        */
+       ir_node  **nodes;
+} arch_inverse_t;
+
 /**
  * Some flags describing a node in more detail.
  */
@@ -194,7 +208,8 @@ typedef enum _arch_irn_flags_t {
        arch_irn_flags_dont_spill       = 1, /**< This must not be spilled. */
        arch_irn_flags_rematerializable = 2, /**< This should be replicated instead of spilled/reloaded. */
        arch_irn_flags_ignore           = 4, /**< Ignore node during register allocation. */
-       arch_irn_flags_last             = arch_irn_flags_ignore
+       arch_irn_flags_modify_sp        = 8, /**< I modify the stack pointer. */
+       arch_irn_flags_last             = arch_irn_flags_modify_sp
 } arch_irn_flags_t;
 
 /**
@@ -269,6 +284,19 @@ struct _arch_irn_ops_if_t {
    * @param offset The offset of the node's stack frame entity.
    */
   void (*set_frame_offset)(const void *self, ir_node *irn, int offset);
+
+  /**
+   * Returns an inverse operation which yields the i-th argument
+   * of the given node as result.
+   *
+   * @param irn       The original operation
+   * @param i         Index of the argument we want the inverse operation to yield
+   * @param inverse   struct to be filled with the resulting inverse op
+   * @param obstack   The obstack to use for allocation of the returned nodes array
+   * @return          The inverse operation or NULL if operation invertible
+   */
+  arch_inverse_t *(*get_inverse)(const void *self, const ir_node *irn, int i, arch_inverse_t *inverse, struct obstack *obstack);
+
 };
 
 /**
@@ -282,6 +310,8 @@ extern void arch_set_frame_offset(const arch_env_t *env, ir_node *irn, int bias)
 
 extern entity *arch_get_frame_entity(const arch_env_t *env, ir_node *irn);
 
+extern arch_inverse_t *arch_get_inverse(const arch_env_t *env, const ir_node *irn, int i, arch_inverse_t *inverse, struct obstack *obstack);
+
 /**
  * Get the register requirements for a node.
  * @param env The architecture environment.
@@ -346,7 +376,7 @@ extern int arch_reg_is_allocatable(const arch_env_t *env,
  * Get the register class of an operand of a node.
  * @param env The architecture environment.
  * @param irn The node.
- * @param pos The position of the operand.
+ * @param pos The position of the operand, -1 for the output.
  * @return    The register class of the operand or NULL, if
  *            operand is a non-register operand.
  */
@@ -417,11 +447,10 @@ struct _arch_irn_handler_t {
 struct _arch_code_generator_if_t {
        /**
         * Initialize the code generator.
-        * @param file The file to dump to.
         * @param birg A backend IRG session.
         * @return     A newly created code generator.
         */
-       void *(*init)(FILE *file, const be_irg_t *birg);
+       void *(*init)(const be_irg_t *birg);
 
        /**
         * Called before abi introduce.
@@ -498,14 +527,12 @@ struct _arch_isa_t {
  */
 struct _arch_isa_if_t {
 
-#ifdef WITH_LIBCORE
-  void (*register_options)(lc_opt_entry_t *grp);
-#endif
-
   /**
    * Initialize the isa interface.
+        * @param file_handle  the file handle to write the output to
+        * @return a new isa instance
    */
-  void *(*init)(void);
+  void *(*init)(FILE *file_handle);
 
   /**
    * Free the isa instance.
@@ -570,6 +597,20 @@ struct _arch_isa_if_t {
    * @return      The alignment in bytes.
    */
   int (*get_reg_class_alignment)(const void *self, const arch_register_class_t *cls);
+
+  /**
+   * A "static" function, returns the frontend settings
+   * needed for this backend.
+   */
+  const backend_params *(*get_params)(void);
+
+#ifdef WITH_LIBCORE
+  /**
+   * Register command line options for this backend.
+   * @param grp  The root group.
+   */
+  void (*register_options)(lc_opt_entry_t *grp);
+#endif
 };
 
 #define arch_isa_get_n_reg_class(isa)                ((isa)->impl->get_n_reg_class(isa))
@@ -606,10 +647,11 @@ struct _arch_env_t {
 
 /**
  * Initialize the architecture environment struct.
- * @param isa The isa which shall be put into the environment.
+ * @param isa           The isa which shall be put into the environment.
+ * @param file_handle   The file handle
  * @return The environment.
  */
-extern arch_env_t *arch_env_init(arch_env_t *env, const arch_isa_if_t *isa);
+extern arch_env_t *arch_env_init(arch_env_t *env, const arch_isa_if_t *isa, FILE *file_handle);
 
 /**
  * Add a node handler to the environment.