From 9e8dda0319ea947879f30325cee51361dc7a8c1c Mon Sep 17 00:00:00 2001 From: Michael Beck Date: Fri, 1 Jun 2007 19:58:48 +0000 Subject: [PATCH 1/1] moved all lower_* header into new lowering.h [r14253] --- include/libfirm/lower_calls.h | 146 ------------ include/libfirm/lower_dw.h | 73 ------ include/libfirm/lower_hl.h | 39 ---- include/libfirm/lower_intrinsics.h | 182 --------------- include/libfirm/lowering.h | 348 +++++++++++++++++++++++++++++ 5 files changed, 348 insertions(+), 440 deletions(-) delete mode 100644 include/libfirm/lower_calls.h delete mode 100644 include/libfirm/lower_dw.h delete mode 100644 include/libfirm/lower_hl.h delete mode 100644 include/libfirm/lower_intrinsics.h create mode 100644 include/libfirm/lowering.h diff --git a/include/libfirm/lower_calls.h b/include/libfirm/lower_calls.h deleted file mode 100644 index 809742641..000000000 --- a/include/libfirm/lower_calls.h +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Copyright (C) 1995-2007 University of Karlsruhe. All right reserved. - * - * This file is part of libFirm. - * - * This file may be distributed and/or modified under the terms of the - * GNU General Public License version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * Licensees holding valid libFirm Professional Edition licenses may use - * this file in accordance with the libFirm Commercial License. - * Agreement provided with the Software. - * - * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE. - */ - -/** - * @file - * @brief Lowering of Calls with compound parameters and return types. - * @author Michael Beck - * @version $Id$ - */ -#ifndef FIRM_LOWER_LOWER_CALLS_H -#define FIRM_LOWER_LOWER_CALLS_H - -/** - * A type telling where to add hidden parameters. - */ -typedef enum add_hidden_params { - ADD_HIDDEN_ALWAYS_IN_FRONT = 0, /**< always add hidden parameters in front (default). */ - ADD_HIDDEN_ALWAYS_LAST = 1, /**< always add hidden parameters last, did not work for variadic functions. */ - ADD_HIDDEN_SMART = 2 /**< add hidden parameters last for non-variadic and first for variadic functions. */ -} add_hidden; - -/** - * Additional flags for the lowering. - */ -enum lowering_flags { - LF_NONE = 0, /**< no additional flags */ - LF_COMPOUND_PARAM = 1, /**< lower calls with compound parameters */ - LF_COMPOUND_RETURN = 2, /**< lower calls with compound returns */ - LF_RETURN_HIDDEN = 4, /**< return the hidden address instead of void */ - LF_SMALL_CMP_IN_REGS = 8 /**< return small compound values in registers */ -}; - -/** Maximum number of registers that can be used to return compound values. */ -#define MAX_REGISTER_RET_VAL 2 - -/** - * A struct containing all control parameters for - * lower_compound_ret_calls(). - */ -typedef struct { - int def_ptr_alignment; /**< Default alignment for data pointer. */ - unsigned flags; /**< A bitmask of enum lowering_flags. */ - add_hidden hidden_params; /**< Where to add hidden parameters. */ - - /** - * A function returning a pointer type for a given type. - * If this pointer is NULL, a new pointer type is always created. - */ - ir_type *(*find_pointer_type)(ir_type *e_type, ir_mode *mode, int alignment); - - /** - * If the LF_SMALL_CMP_IN_REGS flag is set, this function will be called - * to decide, whether a compound value should be returned in registers. - * This function must return the number of used registers and fill in the modes - * of the registers to use. Up to MAX_REGISTER_RET_VAL registers can be used. - */ - int (*ret_compound_in_regs)(ir_type *compound_tp, ir_mode **modes); -} lower_params_t; - -/** - * Lower calls with compound parameter and return types. - * This function does the following transformations: - * - * If LF_COMPOUND_PARAM is set: - * - * - Copy compound parameters to a new location on the callers - * stack and transmit the address of this new location - * - * If LF_COMPOUND_RETURN is set: - * - * - Adds a new (hidden) pointer parameter for - * any return compound type. The return type is replaced by void - * or if LOWERING_FLAGS_RETURN_HIDDEN is set by the address. - * - * - Use of the hidden parameters in the function code. - * - * - Change all calls to functions with compound return - * by providing space for the hidden parameter on the callers - * stack. - * - * - Replace a possible block copy after the function call. - * - * General: - * - * - Changes the types of methods and calls to the lowered ones - * - * - lower all method types of existing entities - * - * In pseudo-code, the following transformation is done: - * - @code - struct x ret = func(a, b); - @endcode - * - * is translated into - @code - struct x ret; - func(&ret, a, b); - @endcode - * - * If the function returns only one possible result, the copy-on-return - * optimization is done, ie. - @code - struct x func(a) { - struct x ret; - ret.a = a; - return ret; - } - @endcode - * - * is transformed into - * - @code - void func(struct x *ret, a) { - ret->a = a; - } - @endcode - * - * @param params A structure containing the control parameter for this - * transformation. - * - * During the transformation, pointer types must be created or reused. - * The caller can provide params->find_pointer_type for this task to - * reduce the number of created pointer types. - * If params->find_pointer_type is NULL, new pointer types - * are always created automatically. - */ -void lower_calls_with_compounds(const lower_params_t *params); - -#endif /* FIRM_LOWER_LOWER_CALLS_H */ diff --git a/include/libfirm/lower_dw.h b/include/libfirm/lower_dw.h deleted file mode 100644 index 10bd5d7ac..000000000 --- a/include/libfirm/lower_dw.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (C) 1995-2007 University of Karlsruhe. All right reserved. - * - * This file is part of libFirm. - * - * This file may be distributed and/or modified under the terms of the - * GNU General Public License version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * Licensees holding valid libFirm Professional Edition licenses may use - * this file in accordance with the libFirm Commercial License. - * Agreement provided with the Software. - * - * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE. - */ - -/** - * @file - * @brief Lower Double word operations, ie 64bit -> 32bit, 32bit -> 16bit etc. - * @date 8.10.2004 - * @author Michael Beck - * @version $Id$ - */ -#ifndef FIRM_LOWER_LOWER_DW_H -#define FIRM_LOWER_LOWER_DW_H - -#include "firm_types.h" - -/** - * A callback type for creating an intrinsic entity for a given opcode. - * - * @param method the method type of the emulation function entity - * @param op the emulated ir_op - * @param imode the input mode of the emulated opcode - * @param omode the output mode of the emulated opcode - * @param context the context parameter - */ -typedef ir_entity *(create_intrinsic_fkt)(ir_type *method, const ir_op *op, - const ir_mode *imode, const ir_mode *omode, - void *context); - -/** - * The lowering parameter description. - */ -typedef struct _lwrdw_param_t { - int enable; /**< if true lowering is enabled */ - int little_endian; /**< if true should be lowered for little endian, else big endian */ - ir_mode *high_signed; /**< the double word signed mode to be lowered, typically Ls */ - ir_mode *high_unsigned; /**< the double word unsigned mode to be lowered, typically Lu */ - ir_mode *low_signed; /**< the word signed mode to be used, typically Is */ - ir_mode *low_unsigned; /**< the word unsigned mode to be used, typically Iu */ - - /** callback that creates the intrinsic entity */ - create_intrinsic_fkt *create_intrinsic; - void *ctx; /**< context parameter for the creator function */ -} lwrdw_param_t; - -/** - * Lower all double word operations. - */ -void lower_dw_ops(const lwrdw_param_t *param); - -/** - * Default implementation. Context is unused. - */ -ir_entity *def_create_intrinsic_fkt(ir_type *method, const ir_op *op, - const ir_mode *imode, const ir_mode *omode, - void *context); - -#endif /* FIRM_LOWER_LOWER_DW_H */ diff --git a/include/libfirm/lower_hl.h b/include/libfirm/lower_hl.h deleted file mode 100644 index e95222a63..000000000 --- a/include/libfirm/lower_hl.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 1995-2007 University of Karlsruhe. All right reserved. - * - * This file is part of libFirm. - * - * This file may be distributed and/or modified under the terms of the - * GNU General Public License version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * Licensees holding valid libFirm Professional Edition licenses may use - * this file in accordance with the libFirm Commercial License. - * Agreement provided with the Software. - * - * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE. - */ - -/** - * @file - * @brief Lower some High-level constructs, moved from the firmlower. - * @author Boris Boesler, Goetz Lindenmaier, Michael Beck - * @version $Id$ - */ -#ifndef FIRM_LOWER_LOWER_HL_H -#define FIRM_LOWER_LOWER_HL_H - -/** - * Replaces SymConsts by a real constant if possible. - * Replace Sel nodes by address computation. Also resolves array access. - * Handle Bitfields by added And/Or calculations. - * - * @Note: There is NO lowering ob objects oriented types. This is highly compiler - * and ABI specific and should be placed directly in the compiler. - */ -void lower_highlevel(void); - -#endif /* FIRM_LOWER_LOWER_HL_H */ diff --git a/include/libfirm/lower_intrinsics.h b/include/libfirm/lower_intrinsics.h deleted file mode 100644 index facfc4fa1..000000000 --- a/include/libfirm/lower_intrinsics.h +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Copyright (C) 1995-2007 University of Karlsruhe. All right reserved. - * - * This file is part of libFirm. - * - * This file may be distributed and/or modified under the terms of the - * GNU General Public License version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * Licensees holding valid libFirm Professional Edition licenses may use - * this file in accordance with the libFirm Commercial License. - * Agreement provided with the Software. - * - * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE. - */ - -/** - * @file - * @brief lowering of Calls of intrinsic functions - * @author Michael Beck - * @version $Id$ - */ -#ifndef FIRM_LOWER_LOWER_INTRINSICS_H -#define FIRM_LOWER_LOWER_INTRINSICS_H - -#include "firm_types.h" - -/** - * An intrinsic mapper function. - * - * @param node the IR-node that will be mapped - * @param ctx a context - * - * @return non-zero if the call was mapped - */ -typedef int (*i_mapper_func)(ir_node *node, void *ctx); - -enum ikind { - INTRINSIC_CALL = 0, /**< the record represents an intrinsic call */ - INTRINSIC_INSTR /**< the record represents an intrinsic instruction */ -}; - -/** - * An intrinsic call record. - */ -typedef struct _i_call_record { - enum ikind kind; /**< must be INTRINSIC_CALL */ - ir_entity *i_ent; /**< the entity representing an intrinsic call */ - i_mapper_func i_mapper; /**< the mapper function to call */ - void *ctx; /**< mapper context */ - void *link; /**< used in the construction algorithm, must be NULL */ -} i_call_record; - -/** - * An intrinsic instruction record. - */ -typedef struct _i_instr_record { - enum ikind kind; /**< must be INTRINSIC_INSTR */ - ir_op *op; /**< the opcode that must be mapped. */ - i_mapper_func i_mapper; /**< the mapper function to call */ - void *ctx; /**< mapper context */ - void *link; /**< used in the construction algorithm, must be NULL */ -} i_instr_record; - -/** - * An intrinsic record. - */ -typedef union _i_record { - i_call_record i_call; - i_instr_record i_instr; -} i_record; - -/** - * Go through all graphs and map calls to intrinsic functions and instructions. - * - * Every call or instruction is reported to its mapper function, - * which is responsible for rebuilding the graph. - * - * current_ir_graph is always set. - * - * @param list an array of intrinsic map records - * @param length the length of the array - * - * @return number of found intrinsics. - */ -unsigned lower_intrinsics(i_record *list, int length); - -/** - * A mapper for the integer absolute value: inttype abs(inttype v). - * Replaces the call by a Abs node. - * - * @return always 1 - */ -int i_mapper_Abs(ir_node *call, void *ctx); - -/** - * A mapper for the alloca() function: pointer alloca(inttype size) - * Replaces the call by a Alloca(stack_alloc) node. - * - * @return always 1 - */ -int i_mapper_Alloca(ir_node *call, void *ctx); - -/** - * A runtime routine description. - */ -typedef struct _runtime_rt { - ir_entity *ent; /**< The entity representing the runtime routine. */ - ir_mode *mode; /**< The operation mode of the mapped instruction. */ - ir_mode *res_mode; /**< The result mode of the mapped instruction or NULL. */ - long mem_proj_nr; /**< if >= 0, create a memory ProjM() */ - long regular_proj_nr; /**< if >= 0, create a regular ProjX() */ - long exc_proj_nr; /**< if >= 0, create a exception ProjX() */ - long exc_mem_proj_nr; /**< if >= 0, create a exception memory ProjM() */ - long res_proj_nr; /**< if >= 0, first result projection number */ -} runtime_rt; - -/** - * A mapper for mapping unsupported instructions to runtime calls. - * Maps a op(arg_0, ..., arg_n) into a call to a runtime function - * rt(arg_0, ..., arg_n). - * - * The mapping is only done, if the modes of all arguments matches the - * modes of rt's argument. - * Further, if op has a memory input, the generated Call uses it, else - * it gets a NoMem. - * The pinned state of the Call will be set to the pinned state of op. - * - * Note that i_mapper_RuntimeCall() must be used with a i_instr_record. - * - * @return 1 if an op was mapped, 0 else - * - * Some examples: - * - * - Maps signed Div nodes to calls to rt_Div(): - @code - runtime_rt rt_Div = { - ent("int rt_Div(int, int)"), - mode_T, - mode_Is, - pn_Div_M, - pn_Div_X_regular, - pn_Div_X_except, - pn_Div_M, - pn_Div_res - }; - i_instr_record map_Div = { - INTRINSIC_INSTR, - op_Div, - i_mapper_RuntimeCall, - &rt_Div, - NULL - }; - @endcode - * - * - Maps ConvD(F) to calls to rt_Float2Div(): - @code - runtime_rt rt_Float2Double = { - ent("double rt_Float2Div(float)"), - get_type_mode("double"), - NULL, - -1, - -1, - -1, - -1, - -1 - }; - i_instr_record map_Float2Double = { - INTRINSIC_INSTR, - op_Conv, - i_mapper_RuntimeCall, - &rt_Float2Double, - NULL - }; - @endcode - */ -int i_mapper_RuntimeCall(ir_node *node, runtime_rt *rt); - -#endif /* FIRM_LOWER_LOWER_INTRINSICS_H */ diff --git a/include/libfirm/lowering.h b/include/libfirm/lowering.h new file mode 100644 index 000000000..2c8742ae7 --- /dev/null +++ b/include/libfirm/lowering.h @@ -0,0 +1,348 @@ +/* + * Copyright (C) 1995-2007 University of Karlsruhe. All right reserved. + * + * This file is part of libFirm. + * + * This file may be distributed and/or modified under the terms of the + * GNU General Public License version 2 as published by the Free Software + * Foundation and appearing in the file LICENSE.GPL included in the + * packaging of this file. + * + * Licensees holding valid libFirm Professional Edition licenses may use + * this file in accordance with the libFirm Commercial License. + * Agreement provided with the Software. + * + * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE + * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE. + */ + +/** + * @file + * @brief Lowering of high level constructs. + * @author Michael Beck + * @version $Id$ + */ +#ifndef FIRM_LOWERING_H +#define FIRM_LOWERING_H + +/** + * A type telling where to add hidden parameters. + */ +typedef enum add_hidden_params { + ADD_HIDDEN_ALWAYS_IN_FRONT = 0, /**< always add hidden parameters in front (default). */ + ADD_HIDDEN_ALWAYS_LAST = 1, /**< always add hidden parameters last, did not work for variadic functions. */ + ADD_HIDDEN_SMART = 2 /**< add hidden parameters last for non-variadic and first for variadic functions. */ +} add_hidden; + +/** + * Additional flags for the lowering. + */ +enum lowering_flags { + LF_NONE = 0, /**< no additional flags */ + LF_COMPOUND_PARAM = 1, /**< lower calls with compound parameters */ + LF_COMPOUND_RETURN = 2, /**< lower calls with compound returns */ + LF_RETURN_HIDDEN = 4, /**< return the hidden address instead of void */ + LF_SMALL_CMP_IN_REGS = 8 /**< return small compound values in registers */ +}; + +/** Maximum number of registers that can be used to return compound values. */ +#define MAX_REGISTER_RET_VAL 2 + +/** + * A struct containing all control parameters for + * lower_compound_ret_calls(). + */ +typedef struct { + int def_ptr_alignment; /**< Default alignment for data pointer. */ + unsigned flags; /**< A bitmask of enum lowering_flags. */ + add_hidden hidden_params; /**< Where to add hidden parameters. */ + + /** + * A function returning a pointer type for a given type. + * If this pointer is NULL, a new pointer type is always created. + */ + ir_type *(*find_pointer_type)(ir_type *e_type, ir_mode *mode, int alignment); + + /** + * If the LF_SMALL_CMP_IN_REGS flag is set, this function will be called + * to decide, whether a compound value should be returned in registers. + * This function must return the number of used registers and fill in the modes + * of the registers to use. Up to MAX_REGISTER_RET_VAL registers can be used. + */ + int (*ret_compound_in_regs)(ir_type *compound_tp, ir_mode **modes); +} lower_params_t; + +/** + * Lower calls with compound parameter and return types. + * This function does the following transformations: + * + * If LF_COMPOUND_PARAM is set: + * + * - Copy compound parameters to a new location on the callers + * stack and transmit the address of this new location + * + * If LF_COMPOUND_RETURN is set: + * + * - Adds a new (hidden) pointer parameter for + * any return compound type. The return type is replaced by void + * or if LOWERING_FLAGS_RETURN_HIDDEN is set by the address. + * + * - Use of the hidden parameters in the function code. + * + * - Change all calls to functions with compound return + * by providing space for the hidden parameter on the callers + * stack. + * + * - Replace a possible block copy after the function call. + * + * General: + * + * - Changes the types of methods and calls to the lowered ones + * + * - lower all method types of existing entities + * + * In pseudo-code, the following transformation is done: + * + @code + struct x ret = func(a, b); + @endcode + * + * is translated into + @code + struct x ret; + func(&ret, a, b); + @endcode + * + * If the function returns only one possible result, the copy-on-return + * optimization is done, ie. + @code + struct x func(a) { + struct x ret; + ret.a = a; + return ret; + } + @endcode + * + * is transformed into + * + @code + void func(struct x *ret, a) { + ret->a = a; + } + @endcode + * + * @param params A structure containing the control parameter for this + * transformation. + * + * During the transformation, pointer types must be created or reused. + * The caller can provide params->find_pointer_type for this task to + * reduce the number of created pointer types. + * If params->find_pointer_type is NULL, new pointer types + * are always created automatically. + */ +void lower_calls_with_compounds(const lower_params_t *params); + +/** + * A callback type for creating an intrinsic entity for a given opcode. + * + * @param method the method type of the emulation function entity + * @param op the emulated ir_op + * @param imode the input mode of the emulated opcode + * @param omode the output mode of the emulated opcode + * @param context the context parameter + */ +typedef ir_entity *(create_intrinsic_fkt)(ir_type *method, const ir_op *op, + const ir_mode *imode, const ir_mode *omode, + void *context); + +/** + * The lowering parameter description. + */ +typedef struct _lwrdw_param_t { + int enable; /**< if true lowering is enabled */ + int little_endian; /**< if true should be lowered for little endian, else big endian */ + ir_mode *high_signed; /**< the double word signed mode to be lowered, typically Ls */ + ir_mode *high_unsigned; /**< the double word unsigned mode to be lowered, typically Lu */ + ir_mode *low_signed; /**< the word signed mode to be used, typically Is */ + ir_mode *low_unsigned; /**< the word unsigned mode to be used, typically Iu */ + + /** callback that creates the intrinsic entity */ + create_intrinsic_fkt *create_intrinsic; + void *ctx; /**< context parameter for the creator function */ +} lwrdw_param_t; + +/** + * Lower all double word operations. + */ +void lower_dw_ops(const lwrdw_param_t *param); + +/** + * Default implementation. Context is unused. + */ +ir_entity *def_create_intrinsic_fkt(ir_type *method, const ir_op *op, + const ir_mode *imode, const ir_mode *omode, + void *context); + +/** + * Replaces SymConsts by a real constant if possible. + * Replace Sel nodes by address computation. Also resolves array access. + * Handle Bitfields by added And/Or calculations. + * + * @Note: There is NO lowering ob objects oriented types. This is highly compiler + * and ABI specific and should be placed directly in the compiler. + */ +void lower_highlevel(void); + +/** + * An intrinsic mapper function. + * + * @param node the IR-node that will be mapped + * @param ctx a context + * + * @return non-zero if the call was mapped + */ +typedef int (*i_mapper_func)(ir_node *node, void *ctx); + +enum ikind { + INTRINSIC_CALL = 0, /**< the record represents an intrinsic call */ + INTRINSIC_INSTR /**< the record represents an intrinsic instruction */ +}; + +/** + * An intrinsic call record. + */ +typedef struct _i_call_record { + enum ikind kind; /**< must be INTRINSIC_CALL */ + ir_entity *i_ent; /**< the entity representing an intrinsic call */ + i_mapper_func i_mapper; /**< the mapper function to call */ + void *ctx; /**< mapper context */ + void *link; /**< used in the construction algorithm, must be NULL */ +} i_call_record; + +/** + * An intrinsic instruction record. + */ +typedef struct _i_instr_record { + enum ikind kind; /**< must be INTRINSIC_INSTR */ + ir_op *op; /**< the opcode that must be mapped. */ + i_mapper_func i_mapper; /**< the mapper function to call */ + void *ctx; /**< mapper context */ + void *link; /**< used in the construction algorithm, must be NULL */ +} i_instr_record; + +/** + * An intrinsic record. + */ +typedef union _i_record { + i_call_record i_call; + i_instr_record i_instr; +} i_record; + +/** + * Go through all graphs and map calls to intrinsic functions and instructions. + * + * Every call or instruction is reported to its mapper function, + * which is responsible for rebuilding the graph. + * + * current_ir_graph is always set. + * + * @param list an array of intrinsic map records + * @param length the length of the array + * + * @return number of found intrinsics. + */ +unsigned lower_intrinsics(i_record *list, int length); + +/** + * A mapper for the integer absolute value: inttype abs(inttype v). + * Replaces the call by a Abs node. + * + * @return always 1 + */ +int i_mapper_Abs(ir_node *call, void *ctx); + +/** + * A mapper for the alloca() function: pointer alloca(inttype size) + * Replaces the call by a Alloca(stack_alloc) node. + * + * @return always 1 + */ +int i_mapper_Alloca(ir_node *call, void *ctx); + +/** + * A runtime routine description. + */ +typedef struct _runtime_rt { + ir_entity *ent; /**< The entity representing the runtime routine. */ + ir_mode *mode; /**< The operation mode of the mapped instruction. */ + ir_mode *res_mode; /**< The result mode of the mapped instruction or NULL. */ + long mem_proj_nr; /**< if >= 0, create a memory ProjM() */ + long regular_proj_nr; /**< if >= 0, create a regular ProjX() */ + long exc_proj_nr; /**< if >= 0, create a exception ProjX() */ + long exc_mem_proj_nr; /**< if >= 0, create a exception memory ProjM() */ + long res_proj_nr; /**< if >= 0, first result projection number */ +} runtime_rt; + +/** + * A mapper for mapping unsupported instructions to runtime calls. + * Maps a op(arg_0, ..., arg_n) into a call to a runtime function + * rt(arg_0, ..., arg_n). + * + * The mapping is only done, if the modes of all arguments matches the + * modes of rt's argument. + * Further, if op has a memory input, the generated Call uses it, else + * it gets a NoMem. + * The pinned state of the Call will be set to the pinned state of op. + * + * Note that i_mapper_RuntimeCall() must be used with a i_instr_record. + * + * @return 1 if an op was mapped, 0 else + * + * Some examples: + * + * - Maps signed Div nodes to calls to rt_Div(): + @code + runtime_rt rt_Div = { + ent("int rt_Div(int, int)"), + mode_T, + mode_Is, + pn_Div_M, + pn_Div_X_regular, + pn_Div_X_except, + pn_Div_M, + pn_Div_res + }; + i_instr_record map_Div = { + INTRINSIC_INSTR, + op_Div, + i_mapper_RuntimeCall, + &rt_Div, + NULL + }; + @endcode + * + * - Maps ConvD(F) to calls to rt_Float2Div(): + @code + runtime_rt rt_Float2Double = { + ent("double rt_Float2Div(float)"), + get_type_mode("double"), + NULL, + -1, + -1, + -1, + -1, + -1 + }; + i_instr_record map_Float2Double = { + INTRINSIC_INSTR, + op_Conv, + i_mapper_RuntimeCall, + &rt_Float2Double, + NULL + }; + @endcode + */ +int i_mapper_RuntimeCall(ir_node *node, runtime_rt *rt); + +#endif /* FIRM_LOWERING_H */ -- 2.20.1