2 * Copyright (C) 1995-2007 University of Karlsruhe. All right reserved.
4 * This file is part of libFirm.
6 * This file may be distributed and/or modified under the terms of the
7 * GNU General Public License version 2 as published by the Free Software
8 * Foundation and appearing in the file LICENSE.GPL included in the
9 * packaging of this file.
11 * Licensees holding valid libFirm Professional Edition licenses may use
12 * this file in accordance with the libFirm Commercial License.
13 * Agreement provided with the Software.
15 * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
16 * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * @brief This file implements the IR transformation from firm into ia32-Firm.
23 * @author Christian Wuerdig, Matthias Braun
26 #ifndef FIRM_BE_IA32_IA32_TRANSFORM_H
27 #define FIRM_BE_IA32_IA32_TRANSFORM_H
29 #include "firm_config.h"
30 #include "bearch_ia32_t.h"
33 /** use inc, dec instead of add ,1 and add, -1 */
35 /** use sse2 instructions */
37 /** use ffreep instead of fpop */
39 /** use ftst instead of compare */
41 /** use femms to pop all float registers */
43 /** use the fucomi instruction */
48 * Transform firm nodes to x86 assembler nodes
50 void ia32_transform_graph(ia32_code_gen_t *cg);
54 * Prints the old node name on cg obst and returns a pointer to it.
56 const char *ia32_get_old_node_name(ia32_code_gen_t *cg, ir_node *irn);
60 * Some constants needed for code generation.
61 * Generated on demand.
64 ia32_SSIGN, /**< SSE2 single precision sign */
65 ia32_DSIGN, /**< SSE2 double precision sign */
66 ia32_SABS, /**< SSE2 single precision ABS mask */
67 ia32_DABS, /**< SSE2 double precision ABS mask */
68 ia32_INTMAX, /**< x87 single precision INTMAX */
69 ia32_known_const_max /**< last constant */
73 * Generate a known floating point constant
75 ir_entity *ia32_gen_fp_known_const(ia32_known_const_t kct);
77 void ia32_add_missing_keeps(ia32_code_gen_t *cg);
80 * return true if the node is a Proj(Load) and could be used in source address
81 * mode for another node. Will return only true if the @p other node is not
82 * dependent on the memory of the Load (for binary operations use the other
83 * input here, for unary operations use NULL).
85 int use_source_address_mode(ir_node *block, ir_node *node, ir_node *other);
87 #endif /* FIRM_BE_IA32_IA32_TRANSFORM_H */