added new licence header
[libfirm] / ir / be / arm / arm_map_regs.c
1 /*
2  * Copyright (C) 1995-2007 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  * Register mapping for firm nodes. Stolen from bearch_firm :)
22  * $Id$
23  */
24 #ifdef HAVE_CONFIG_H
25 #include "config.h"
26 #endif
27
28 #include <stdlib.h>
29
30 #include "arm_map_regs.h"
31 #include "arm_new_nodes.h"
32
33 #include "gen_arm_regalloc_if.h"
34
35
36 static const arch_register_t *gpreg_param_reg_std[] = {
37         &arm_gp_regs[REG_R0],
38         &arm_gp_regs[REG_R1],
39         &arm_gp_regs[REG_R2],
40         &arm_gp_regs[REG_R3],
41 };
42
43 const arch_register_t *arm_get_RegParam_reg(int n) {
44         assert(n < 4 && n >=0 && "register param > 3 angefordert");
45         return gpreg_param_reg_std[n];
46 }
47
48 /* Mapping to store registers in firm nodes */
49
50 struct arm_irn_reg_assoc {
51         const ir_node *irn;
52         const arch_register_t *reg;
53 };
54
55 int arm_cmp_irn_reg_assoc(const void *a, const void *b, size_t len) {
56         const struct arm_irn_reg_assoc *x = a;
57         const struct arm_irn_reg_assoc *y = b;
58
59         return x->irn != y->irn;
60 }
61
62 static struct arm_irn_reg_assoc *get_irn_reg_assoc(const ir_node *irn, set *reg_set) {
63         struct arm_irn_reg_assoc templ;
64         unsigned int hash;
65
66         templ.irn = irn;
67         templ.reg = NULL;
68         hash = HASH_PTR(irn);
69
70         return set_insert(reg_set, &templ, sizeof(templ), hash);
71 }
72
73 void arm_set_firm_reg(ir_node *irn, const arch_register_t *reg, set *reg_set) {
74         struct arm_irn_reg_assoc *assoc = get_irn_reg_assoc(irn, reg_set);
75         assoc->reg = reg;
76 }
77
78 const arch_register_t *arm_get_firm_reg(const ir_node *irn, set *reg_set) {
79         struct arm_irn_reg_assoc *assoc = get_irn_reg_assoc(irn, reg_set);
80         return assoc->reg;
81 }
82
83
84
85 /**
86  * Translates the proj number into a "real" argument position for register
87  * requirements depended on the predecessor.
88  */
89 long arm_translate_proj_pos(const ir_node *proj) {
90         ir_node *pred = get_Proj_pred(proj);
91         long nr       = get_Proj_proj(proj);
92
93         if (is_irn_machine_op(pred)) {
94                 switch (get_arm_irn_opcode(pred)) {
95
96                 case iro_arm_Loadb:
97                 case iro_arm_Loadbs:
98                 case iro_arm_Loadh:
99                 case iro_arm_Loadhs:
100                 case iro_arm_Load:
101                 case iro_arm_fpaLdf:
102                         if (nr == pn_Load_res)
103                                 return 0;
104                         assert(0 && "unsupported Proj(Load) number");
105                         break;
106                 case iro_arm_Storeb:
107                 case iro_arm_Storebs:
108                 case iro_arm_Storeh:
109                 case iro_arm_Storehs:
110                 case iro_arm_Store:
111                 case iro_arm_fpaStf:
112                         return 0;
113                 case iro_arm_fpaDiv:
114                 case iro_arm_fpaRdv:
115                         if (nr == pn_Quot_res)
116                                 return 0;
117                         assert(0 && "there should be no more Projs for a fDiv");
118                         break;
119                 default:
120                         break;
121                 }
122         }
123
124 //      assert(0 && "unsupported Proj(X)");
125         return nr;
126 }