be_abi_put_ignore_regs returns now number of ignore registers as unsigned
[libfirm] / ir / be / ppc32 / ppc32_transform.c
index 3023f3f..a0437e5 100644 (file)
@@ -1,6 +1,28 @@
-/* The codegenerator (transform FIRM into ppc FIRM) */
-/* $Id$ */
+/*
+ * 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   The codegenerator (transform FIRM into ppc FIRM)
+ * @author  Moritz Kroll, Jens Mueller
+ * @version $Id$
+ */
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
 
 #include "gen_ppc32_regalloc_if.h"
 
-extern pset *symbol_pset;
 extern ir_op *get_op_Mulh(void);
 
-int is_direct_entity(entity *ent);
+int is_direct_entity(ir_entity *ent);
 
 ir_mode* ppc32_mode_Cond = NULL;
 
@@ -964,7 +985,7 @@ static ir_node *ldst_insert_const(ir_node *ptr, tarval **ptv, ident **pid, ppc32
        }
        else if(is_ppc32_SymConst(ptr))
        {
-               entity *ent = get_ppc32_frame_entity(ptr);
+               ir_entity *ent = get_ppc32_frame_entity(ptr);
                if(is_direct_entity(ent))
                {
                        id_symconst = get_entity_ident(ent);
@@ -993,13 +1014,13 @@ static ir_node *gen_Load(ppc32_transform_env_t *env) {
        loadptr = ldst_insert_const(loadptr, &tv_const, &id_symconst, env);
        switch(get_nice_modecode(mode)){
                case irm_Bu:
-                       load = new_rd_ppc32_Lbz(env->dbg, env->irg, env->block, loadptr, get_Load_mem(node), env->mode);
+                       load = new_rd_ppc32_Lbz(env->dbg, env->irg, env->block, loadptr, get_Load_mem(node));
                        break;
 
                case irm_Bs:
                {
                        ir_node *proj_load, *extsb_node;
-                       load =  new_rd_ppc32_Lbz(env->dbg, env->irg, env->block, loadptr, get_Load_mem(node), env->mode);
+                       load =  new_rd_ppc32_Lbz(env->dbg, env->irg, env->block, loadptr, get_Load_mem(node));
                        proj_load = new_rd_Proj(env->dbg, env->irg, env->block, load, mode, pn_Load_res);
                        extsb_node = new_rd_ppc32_Extsb(env->dbg, env->irg, env->block, proj_load, mode);
                        exchange(get_succ_Proj(env->irn, pn_Load_res), extsb_node);
@@ -1008,22 +1029,22 @@ static ir_node *gen_Load(ppc32_transform_env_t *env) {
 
 
                case irm_Hu:
-                       load = new_rd_ppc32_Lhz(env->dbg, env->irg, env->block, loadptr, get_Load_mem(node), env->mode);
+                       load = new_rd_ppc32_Lhz(env->dbg, env->irg, env->block, loadptr, get_Load_mem(node));
                        break;
                case irm_Hs:
-                       load =new_rd_ppc32_Lha(env->dbg, env->irg, env->block, loadptr, get_Load_mem(node), env->mode);
+                       load =new_rd_ppc32_Lha(env->dbg, env->irg, env->block, loadptr, get_Load_mem(node));
                        break;
                case irm_Is:
                case irm_Iu:
                case irm_P:
-                       load = new_rd_ppc32_Lwz(env->dbg, env->irg, env->block, loadptr, get_Load_mem(node), env->mode);
+                       load = new_rd_ppc32_Lwz(env->dbg, env->irg, env->block, loadptr, get_Load_mem(node));
                        break;
 
                case irm_D:
-                       load = new_rd_ppc32_Lfd(env->dbg, env->irg, env->block, loadptr, get_Load_mem(node), env->mode);
+                       load = new_rd_ppc32_Lfd(env->dbg, env->irg, env->block, loadptr, get_Load_mem(node));
                        break;
                case irm_F:
-                       load = new_rd_ppc32_Lfs(env->dbg, env->irg, env->block, loadptr, get_Load_mem(node), env->mode);
+                       load = new_rd_ppc32_Lfs(env->dbg, env->irg, env->block, loadptr, get_Load_mem(node));
                        break;
 
                default:
@@ -1067,24 +1088,24 @@ static ir_node *gen_Store(ppc32_transform_env_t *env) {
        switch(get_nice_modecode(mode)){
                case irm_Bu:
                case irm_Bs:
-                       store = new_rd_ppc32_Stb(env->dbg, env->irg, env->block, storeptr, get_Store_value(node), get_Store_mem(node), env->mode);
+                       store = new_rd_ppc32_Stb(env->dbg, env->irg, env->block, storeptr, get_Store_value(node), get_Store_mem(node));
                        break;
 
                case irm_Hu:
                case irm_Hs:
-                       store = new_rd_ppc32_Sth(env->dbg, env->irg, env->block, storeptr, get_Store_value(node), get_Store_mem(node), env->mode);
+                       store = new_rd_ppc32_Sth(env->dbg, env->irg, env->block, storeptr, get_Store_value(node), get_Store_mem(node));
                        break;
                case irm_Is:
                case irm_Iu:
                case irm_P:
-                       store = new_rd_ppc32_Stw(env->dbg, env->irg, env->block, storeptr, get_Store_value(node), get_Store_mem(node), env->mode);
+                       store = new_rd_ppc32_Stw(env->dbg, env->irg, env->block, storeptr, get_Store_value(node), get_Store_mem(node));
                        break;
 
                case irm_D:
-                       store = new_rd_ppc32_Stfd(env->dbg, env->irg, env->block, storeptr, get_Store_value(node), get_Store_mem(node), env->mode);
+                       store = new_rd_ppc32_Stfd(env->dbg, env->irg, env->block, storeptr, get_Store_value(node), get_Store_mem(node));
                        break;
                case irm_F:
-                       store = new_rd_ppc32_Stfs(env->dbg, env->irg, env->block, storeptr, get_Store_value(node), get_Store_mem(node), env->mode);
+                       store = new_rd_ppc32_Stfs(env->dbg, env->irg, env->block, storeptr, get_Store_value(node), get_Store_mem(node));
                        break;
 
                default:
@@ -1119,34 +1140,34 @@ static ir_node *gen_CopyB(ppc32_transform_env_t *env) {
        int size = get_type_size_bytes(type);
        int offset = 0;
 
-       ir_node *load, *store;
+       ir_node *load, *store = NULL;
 
-       if(size/4>=1)
+       if(size/4 >= 1)
        {
                ir_node *res;
                tarval *offset0 = new_tarval_from_long(0, mode_Is);
                tarval *offset4 = new_tarval_from_long(4, mode_Is);
 
-               load = new_rd_ppc32_Lwz(env->dbg, env->irg, env->block, src, mem, mode_T);
+               load = new_rd_ppc32_Lwz(env->dbg, env->irg, env->block, src, mem);
                set_ppc32_constant_tarval(load, offset0);
                set_ppc32_offset_mode(load, ppc32_ao_None);
                mem = new_rd_Proj(env->dbg, env->irg, env->block, load, mode_M, pn_Load_M);
                res = new_rd_Proj(env->dbg, env->irg, env->block, load, mode_Is, pn_Load_res);
 
-               store = new_rd_ppc32_Stw(env->dbg, env->irg, env->block, dest, res, mem, mode_T);
+               store = new_rd_ppc32_Stw(env->dbg, env->irg, env->block, dest, res, mem);
                set_ppc32_constant_tarval(store, offset0);
                set_ppc32_offset_mode(store, ppc32_ao_None);
                mem = new_rd_Proj(env->dbg, env->irg, env->block, store, mode_M, pn_Store_M);
 
                if(size/4==2)
                {
-                       load = new_rd_ppc32_Lwz(env->dbg, env->irg, env->block, src, mem, mode_T);
+                       load = new_rd_ppc32_Lwz(env->dbg, env->irg, env->block, src, mem);
                        set_ppc32_constant_tarval(load, offset4);
                        set_ppc32_offset_mode(load, ppc32_ao_None);
                        mem = new_rd_Proj(env->dbg, env->irg, env->block, load, mode_M, pn_Load_M);
                        res = new_rd_Proj(env->dbg, env->irg, env->block, load, mode_Is, pn_Load_res);
 
-                       store = new_rd_ppc32_Stw(env->dbg, env->irg, env->block, dest, res, mem, mode_T);
+                       store = new_rd_ppc32_Stw(env->dbg, env->irg, env->block, dest, res, mem);
                        set_ppc32_constant_tarval(store, offset4);
                        set_ppc32_offset_mode(store, ppc32_ao_None);
                        mem = new_rd_Proj(env->dbg, env->irg, env->block, store, mode_M, pn_Store_M);
@@ -1179,7 +1200,7 @@ static ir_node *gen_CopyB(ppc32_transform_env_t *env) {
                        in[0] = new_rd_Proj(env->dbg, env->irg, env->block, store, mode_Is, 1); // src
                        in[1] = new_rd_Proj(env->dbg, env->irg, env->block, store, mode_Is, 2); // dest
                        in[2] = new_rd_Proj(env->dbg, env->irg, env->block, store, mode_Is, 4); // temp
-                       be_new_Keep(&ppc32_reg_classes[CLASS_ppc32_general_purpose], env->irg, env->block, 3, in);
+                       be_new_Keep(&ppc32_reg_classes[CLASS_ppc32_gp], env->irg, env->block, 3, in);
                        in[0] = new_rd_Proj(env->dbg, env->irg, env->block, store, mode_Is, 3); // ctr
                        be_new_Keep(&ppc32_reg_classes[CLASS_ppc32_count], env->irg, env->block, 1, in);
 
@@ -1193,13 +1214,13 @@ static ir_node *gen_CopyB(ppc32_transform_env_t *env) {
        {
                ir_node *res;
                tarval* offset_tarval = new_tarval_from_long(offset, mode_Is);
-               load = new_rd_ppc32_Lhz(env->dbg, env->irg, env->block, src, mem, mode_T);
+               load = new_rd_ppc32_Lhz(env->dbg, env->irg, env->block, src, mem);
                set_ppc32_constant_tarval(load, offset_tarval);
                set_ppc32_offset_mode(load, ppc32_ao_None);
                mem = new_rd_Proj(env->dbg, env->irg, env->block, load, mode_M, pn_Load_M);
                res = new_rd_Proj(env->dbg, env->irg, env->block, load, mode_Is, pn_Load_res);
 
-               store = new_rd_ppc32_Sth(env->dbg, env->irg, env->block, dest, res, mem, mode_T);
+               store = new_rd_ppc32_Sth(env->dbg, env->irg, env->block, dest, res, mem);
                set_ppc32_constant_tarval(store, offset_tarval);
                set_ppc32_offset_mode(store, ppc32_ao_None);
                mem = new_rd_Proj(env->dbg, env->irg, env->block, store, mode_M, pn_Store_M);
@@ -1211,13 +1232,13 @@ static ir_node *gen_CopyB(ppc32_transform_env_t *env) {
        {
                ir_node *res;
                tarval* offset_tarval = new_tarval_from_long(offset, mode_Is);
-               load = new_rd_ppc32_Lbz(env->dbg, env->irg, env->block, src, mem, mode_T);
+               load = new_rd_ppc32_Lbz(env->dbg, env->irg, env->block, src, mem);
                set_ppc32_constant_tarval(load, offset_tarval);
                set_ppc32_offset_mode(load, ppc32_ao_None);
                mem = new_rd_Proj(env->dbg, env->irg, env->block, load, mode_M, pn_Load_M);
                res = new_rd_Proj(env->dbg, env->irg, env->block, load, mode_Is, pn_Load_res);
 
-               store = new_rd_ppc32_Stb(env->dbg, env->irg, env->block, dest, res, mem, mode_T);
+               store = new_rd_ppc32_Stb(env->dbg, env->irg, env->block, dest, res, mem);
                set_ppc32_constant_tarval(store, offset_tarval);
                set_ppc32_offset_mode(store, ppc32_ao_None);
                // mem = new_rd_Proj(env->dbg, env->irg, env->block, store, mode_M, pn_Store_M);
@@ -1244,7 +1265,7 @@ static ir_node *gen_be_FrameAddr(ppc32_transform_env_t *env) {
  * @param env   The transformation environment
  */
 static ir_node *gen_be_StackParam(ppc32_transform_env_t *env) {
-       ir_node *load = new_rd_ppc32_Lwz(env->dbg, env->irg, env->block, get_irn_n(env->irn, 0), new_NoMem(), mode_T);
+       ir_node *load = new_rd_ppc32_Lwz(env->dbg, env->irg, env->block, get_irn_n(env->irn, 0), new_NoMem());
        ir_node *proj = new_rd_Proj(env->dbg, env->irg, env->block, load, env->mode, pn_Load_res);
        set_ppc32_frame_entity(load, be_get_frame_entity(env->irn));
        return proj;
@@ -1404,7 +1425,7 @@ void ppc32_transform_node(ir_node *node, void *env) {
  */
 
 struct tv_ent {
-       entity *ent;
+       ir_entity *ent;
        tarval *tv;
 };
 
@@ -1424,7 +1445,7 @@ static ir_node *gen_fp_known_symconst(ppc32_transform_env_t *env, tarval *known_
        struct tv_ent *entry;
        ir_node       *cnst,*symcnst;
        ir_graph      *rem;
-       entity        *ent;
+       ir_entity     *ent = NULL;
 
        if(!const_set)
                const_set = new_set(cmp_tv_ent, 10);
@@ -1564,7 +1585,7 @@ static ir_node *gen_ppc32_fConst(ppc32_transform_env_t *env) {
                {
                        ir_node *addr, *load;
                        ir_mode *mode = env->mode;
-                       entity *ent;
+                       ir_entity *ent;
                        env->irn = gen_fp_known_symconst(env, tv_const);
                        env->mode = mode_P;
                        ent = get_ppc32_frame_entity(env->irn);
@@ -1574,9 +1595,9 @@ static ir_node *gen_ppc32_fConst(ppc32_transform_env_t *env) {
                                ir_node *node_addis = new_rd_ppc32_Addis_zero(env->dbg, env->irg, env->block, env->mode, ppc32_ao_Ha16, NULL, id_symconst);
 
                                if(mode==mode_D)
-                                       load = new_rd_ppc32_Lfd(env->dbg, env->irg, env->block, node_addis, new_NoMem(), mode_T);
+                                       load = new_rd_ppc32_Lfd(env->dbg, env->irg, env->block, node_addis, new_NoMem());
                                else // mode_F
-                                       load = new_rd_ppc32_Lfs(env->dbg, env->irg, env->block, node_addis, new_NoMem(), mode_T);
+                                       load = new_rd_ppc32_Lfs(env->dbg, env->irg, env->block, node_addis, new_NoMem());
 
                                set_ppc32_symconst_ident(load, id_symconst);
                                set_ppc32_offset_mode(load, ppc32_ao_Lo16);
@@ -1585,9 +1606,9 @@ static ir_node *gen_ppc32_fConst(ppc32_transform_env_t *env) {
                        {
                                addr = gen_ppc32_SymConst (env);
                                if(mode==mode_D)
-                                       load = new_rd_ppc32_Lfd(env->dbg, env->irg, env->block, addr, new_NoMem(), mode_T);
+                                       load = new_rd_ppc32_Lfd(env->dbg, env->irg, env->block, addr, new_NoMem());
                                else // mode_F
-                                       load = new_rd_ppc32_Lfs(env->dbg, env->irg, env->block, addr, new_NoMem(), mode_T);
+                                       load = new_rd_ppc32_Lfs(env->dbg, env->irg, env->block, addr, new_NoMem());
                        }
                        return new_rd_Proj(env->dbg, env->irg, env->block, load, mode, pn_Load_res);
                }
@@ -1605,8 +1626,8 @@ static ir_node *gen_ppc32_fConst(ppc32_transform_env_t *env) {
  * Returns true, if the entity can be accessed directly,
  * or false, if the address must be loaded first
  */
-int is_direct_entity(entity *ent) {
-       return get_entity_visibility(ent)!=visibility_external_allocated;
+int is_direct_entity(ir_entity *ent) {
+       return get_entity_visibility(ent) != visibility_external_allocated;
 /*     visibility vis = get_entity_visibility(ent);
        if(is_Method_type(get_entity_type(ent)))
        {
@@ -1628,7 +1649,7 @@ int is_direct_entity(entity *ent) {
  * @return the created ppc Load immediate node
  */
 static ir_node *gen_ppc32_SymConst(ppc32_transform_env_t *env) {
-       entity *ent = get_ppc32_frame_entity(env->irn);
+       ir_entity *ent = get_ppc32_frame_entity(env->irn);
        ident *id_symconst = get_entity_ident(ent);
        ir_node *node;
        switch(get_nice_modecode(env->mode)){
@@ -1644,11 +1665,10 @@ static ir_node *gen_ppc32_SymConst(ppc32_transform_env_t *env) {
                        else
                        {
                                ir_node *node_addis = new_rd_ppc32_Addis_zero(env->dbg, env->irg, env->block, env->mode, ppc32_ao_Ha16, NULL, id_symconst);
-                               node = new_rd_ppc32_Lwz(env->dbg, env->irg, env->block, node_addis, new_NoMem(), mode_T);
+                               node = new_rd_ppc32_Lwz(env->dbg, env->irg, env->block, node_addis, new_NoMem());
                                set_ppc32_symconst_ident(node, id_symconst);
                                set_ppc32_offset_mode(node, ppc32_ao_Lo16);
                                node = new_rd_Proj(env->dbg, env->irg, env->block, node, env->mode, pn_Load_res);
-//                             pset_insert_ptr(symbol_pset, ent);
                        }
                        break;
                }