/*
- * Copyright (C) 1995-2011 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.
+ * Copyright (C) 2012 University of Karlsruhe.
*/
/**
* @brief This file implements the creation of the achitecture specific firm
* opcodes and the coresponding node constructors for the sparc
* assembler irg.
- * @version $Id$
+ * @author Hannes Rapp, Matthias Braun
*/
#include "config.h"
#include "irprintf.h"
#include "xmalloc.h"
-#include "../bearch.h"
+#include "bearch.h"
+#include "bearch_sparc_t.h"
#include "sparc_nodes_attr.h"
#include "sparc_new_nodes.h"
* @param n the node to dump
* @param reason indicates which kind of information should be dumped
*/
-static void sparc_dump_node(FILE *F, ir_node *n, dump_reason_t reason)
+static void sparc_dump_node(FILE *F, const ir_node *n, dump_reason_t reason)
{
- const sparc_attr_t *attr;
+ const sparc_attr_t *sparc_attr;
switch (reason) {
case dump_node_opcode_txt:
case dump_node_info_txt:
arch_dump_reqs_and_registers(F, n);
- attr = get_sparc_attr_const(n);
- if (attr->immediate_value_entity) {
+ sparc_attr = get_sparc_attr_const(n);
+ if (sparc_attr->immediate_value_entity) {
ir_fprintf(F, "entity: %+F (offset %d)\n",
- attr->immediate_value_entity, attr->immediate_value);
+ sparc_attr->immediate_value_entity,
+ sparc_attr->immediate_value);
} else {
- ir_fprintf(F, "immediate value: %d\n", attr->immediate_value);
+ ir_fprintf(F, "immediate value: %d\n", sparc_attr->immediate_value);
}
if (sparc_has_load_store_attr(n)) {
const sparc_load_store_attr_t *attr = get_sparc_load_store_attr_const(n);
if (has_jmp_cond_attr(n)) {
const sparc_jmp_cond_attr_t *attr
= get_sparc_jmp_cond_attr_const(n);
- fprintf(F, "pnc: %d (%s)\n", attr->pnc, get_pnc_string(attr->pnc));
+ fprintf(F, "relation: %d (%s)\n", (int)attr->relation,
+ get_relation_string(attr->relation));
fprintf(F, "unsigned: %s\n", attr->is_unsigned ? "true" : "false");
}
- if (has_switch_jmp_attr(n)) {
- const sparc_switch_jmp_attr_t *attr
- = get_sparc_switch_jmp_attr_const(n);
- fprintf(F, "default proj: %ld\n", attr->default_proj_num);
- }
if (has_fp_attr(n)) {
const sparc_fp_attr_t *attr = get_sparc_fp_attr_const(n);
ir_fprintf(F, "fp_mode: %+F\n", attr->fp_mode);
sparc_attr_t *attr = (sparc_attr_t*)get_irn_generic_attr(res);
attr->immediate_value_entity = entity;
attr->immediate_value = immediate_value;
+ arch_add_irn_flags(res, (arch_irn_flags_t)sparc_arch_irn_flag_immediate_form);
}
-static void init_sparc_jmp_cond_attr(ir_node *node, pn_Cmp pnc, bool is_unsigned)
+static void init_sparc_jmp_cond_attr(ir_node *node, ir_relation relation,
+ bool is_unsigned)
{
sparc_jmp_cond_attr_t *attr = get_sparc_jmp_cond_attr(node);
- attr->pnc = pnc;
+ attr->relation = relation;
attr->is_unsigned = is_unsigned;
}
*/
static void init_sparc_attributes(ir_node *node, arch_irn_flags_t flags,
const arch_register_req_t **in_reqs,
- const be_execution_unit_t ***execution_units,
int n_res)
{
ir_graph *irg = get_irn_irg(node);
struct obstack *obst = get_irg_obstack(irg);
backend_info_t *info;
- (void) execution_units;
- arch_irn_set_flags(node, flags);
- arch_set_in_register_reqs(node, in_reqs);
+ arch_set_irn_flags(node, flags);
+ arch_set_irn_register_reqs_in(node, in_reqs);
info = be_get_info(node);
- info->out_infos = NEW_ARR_D(reg_out_info_t, obst, n_res);
- memset(info->out_infos, 0, n_res * sizeof(info->out_infos[0]));
+ info->out_infos = NEW_ARR_DZ(reg_out_info_t, obst, n_res);
}
static void init_sparc_load_store_attributes(ir_node *res, ir_mode *ls_mode,
attr->dest_mode = dest_mode;
}
-static void init_sparc_switch_jmp_attributes(ir_node *res, long default_pn,
- ir_entity *jump_table)
+static void init_sparc_switch_jmp_attributes(ir_node *node,
+ const ir_switch_table *table,
+ ir_entity *table_entity)
{
- sparc_switch_jmp_attr_t *attr = get_sparc_switch_jmp_attr(res);
- attr->default_proj_num = default_pn;
- attr->jump_table = jump_table;
+ sparc_switch_jmp_attr_t *attr = get_sparc_switch_jmp_attr(node);
+ attr->table = table;
+ attr->table_entity = table_entity;
+
+ be_foreach_out(node, o) {
+ arch_set_irn_register_req_out(node, o, arch_no_register_req);
+ }
}
/**
/* copy the attributes */
memcpy(attr_new, attr_old, get_op_attr_size(get_irn_op(old_node)));
/* copy out flags */
+ new_info->flags = old_info->flags;
new_info->out_infos =
DUP_ARR_D(reg_out_info_t, obst, old_info->out_infos);
new_info->in_reqs = old_info->in_reqs;
if (cmp_attr_sparc(a, b))
return 1;
- return attr_a->pnc != attr_b->pnc
+ return attr_a->relation != attr_b->relation
|| attr_a->is_unsigned != attr_b->is_unsigned;
}
-static int cmp_attr_sparc_switch_jmp(const ir_node *a, const ir_node *b)
-{
- const sparc_switch_jmp_attr_t *attr_a = get_sparc_switch_jmp_attr_const(a);
- const sparc_switch_jmp_attr_t *attr_b = get_sparc_switch_jmp_attr_const(b);
-
- if (cmp_attr_sparc(a, b))
- return 1;
-
- return attr_a->default_proj_num != attr_b->default_proj_num;
-}
-
static int cmp_attr_sparc_fp(const ir_node *a, const ir_node *b)
{
const sparc_fp_attr_t *attr_a = get_sparc_fp_attr_const(a);
return 1;
return attr_a->src_mode != attr_b->src_mode
- || attr_a->dest_mode != attr_b->dest_mode;;
+ || attr_a->dest_mode != attr_b->dest_mode;
}
/* Include the generated constructor functions */