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 */
34 unsigned use_incdec:1;
35 /** use sse2 instructions */
37 /** use ffreep instead of fpop */
38 unsigned use_ffreep:1;
39 /** use ftst where possible */
41 /** use femms to pop all float registers */
43 /** use the fucomi instruction */
44 unsigned use_fucomi:1;
45 /** use cmovXX instructions */
50 * Transform firm nodes to x86 assembler nodes
52 void ia32_transform_graph(ia32_code_gen_t *cg);
56 * Prints the old node name on cg obst and returns a pointer to it.
58 const char *ia32_get_old_node_name(ia32_code_gen_t *cg, ir_node *irn);
62 * Some constants needed for code generation.
63 * Generated on demand.
66 ia32_SSIGN, /**< SSE2 single precision sign */
67 ia32_DSIGN, /**< SSE2 double precision sign */
68 ia32_SABS, /**< SSE2 single precision ABS mask */
69 ia32_DABS, /**< SSE2 double precision ABS mask */
70 ia32_INTMAX, /**< x87 single precision INTMAX */
71 ia32_known_const_max /**< last constant */
75 * Generate a known floating point constant
77 ir_entity *ia32_gen_fp_known_const(ia32_known_const_t kct);
79 void ia32_add_missing_keeps(ia32_code_gen_t *cg);
82 * return true if the node is a Proj(Load) and could be used in source address
83 * mode for another node. Will return only true if the @p other node is not
84 * dependent on the memory of the Load (for binary operations use the other
85 * input here, for unary operations use NULL).
87 int ia32_use_source_address_mode(ir_node *block, ir_node *node, ir_node *other);
90 * Skip all Down-Conv's on a given node and return the resulting node.
92 ir_node *ia32_skip_downconv(ir_node *node);
94 #endif /* FIRM_BE_IA32_IA32_TRANSFORM_H */