- do not use imul mem, imm32 on newer AMD cpu's
[libfirm] / ir / be / ia32 / ia32_architecture.h
1 /*
2  * Copyright (C) 1995-2008 University of Karlsruhe.  All right reserved.
3  *
4  * This file is part of libFirm.
5  *
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.
10  *
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.
14  *
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
17  * PURPOSE.
18  */
19
20 /**
21  * @file
22  * @brief       ia32 architecture variants
23  * @author      Michael Beck, Matthias Braun
24  * @version     $Id: bearch_ia32_t.h 16363 2007-10-25 23:27:07Z beck $
25  */
26 #ifndef FIRM_BE_IA32_ARCHITECTURE_H
27 #define FIRM_BE_IA32_ARCHITECTURE_H
28
29 typedef struct {
30         /** use leave in function epilogue */
31         unsigned use_leave:1;
32         /** use inc, dec instead of add ,1 and add, -1 */
33         unsigned use_incdec:1;
34         /** use sse2 instructions (instead of x87) */
35         unsigned use_sse2:1;
36         /** use ffreep instead of fpop */
37         unsigned use_ffreep:1;
38         /** use ftst where possible */
39         unsigned use_ftst:1;
40         /** use femms to pop all float registers */
41         unsigned use_femms:1;
42         /** use emms to pop all float registers */
43         unsigned use_emms:1;
44         /** use the fucomi instruction */
45         unsigned use_fucomi:1;
46         /** use cmovXX instructions */
47         unsigned use_cmov:1;
48         /** use add esp, 4 instead of pop */
49         unsigned use_add_esp_4:1;
50         /** use add esp, 8 instead of 2 pop's */
51         unsigned use_add_esp_8:1;
52         /** use sub esp, 4 instead of push */
53         unsigned use_sub_esp_4:1;
54         /** use sub esp, 8 instead of 2 push's */
55         unsigned use_sub_esp_8:1;
56         /** use imul mem, imm32 instruction (slow on some cpu's */
57         unsigned use_imul_mem_imm32:1;
58         /** optimize calling convention where possible */
59         unsigned optimize_cc:1;
60         /**
61          * disrespect current floating  point rounding mode at entry and exit of
62          * functions (this is ok for programs that don't explicitly change the
63          * rounding mode
64          */
65         unsigned use_unsafe_floatconv:1;
66         /** function alignment (a power of two in bytes) */
67         unsigned function_alignment;
68         /** alignment for labels (which are expected to be frequent jump targets) */
69         unsigned label_alignment;
70         /** if a blocks execfreq is factor higher than it's predecessor then align
71          *  the blocks label (0 switches of label alignment) */
72         double label_alignment_factor;
73 } ia32_code_gen_config_t;
74
75 extern ia32_code_gen_config_t  ia32_cg_config;
76
77 void ia32_init_architecture(void);
78 void ia32_setup_cg_config(void);
79
80 int ia32_evaluate_insn(insn_kind kind, tarval *tv);
81
82 #endif