Commit 879c2e5f authored by Matthias Braun's avatar Matthias Braun
Browse files

remove unmaintained mips backend

[r27697]
parent 6e848d7e
......@@ -157,7 +157,7 @@ AC_CONFIG_FILES([
BACKENDS=""
if test "$enable_backend" = yes; then
BACKENDS="arm ia32 mips sparc amd64"
BACKENDS="arm ia32 sparc amd64"
fi
AC_SUBST([BACKENDS])
......
......@@ -517,56 +517,6 @@ $(srcdir)/be/arm/gen_arm_regalloc_if.c $(srcdir)/be/arm/gen_arm_regalloc_if.h: \
be/arm/arm_spec.pl be/scripts/generate_machine.pl
$(PERL) $(srcdir)/be/scripts/generate_regalloc_if.pl $(srcdir)/be/arm/arm_spec.pl $(srcdir)/be/arm
# mips backend
mips_sources = \
be/mips/bearch_mips.c \
be/mips/mips_emitter.c \
be/mips/mips_map_regs.c \
be/mips/mips_new_nodes.c \
be/mips/mips_scheduler.c \
be/mips/mips_transform.c
mips_built_sources = \
be/mips/gen_mips_emitter.c \
be/mips/gen_mips_emitter.h \
be/mips/gen_mips_machine.c \
be/mips/gen_mips_machine.h \
be/mips/gen_mips_new_nodes.c.inl \
be/mips/gen_mips_new_nodes.h \
be/mips/gen_mips_regalloc_if.c \
be/mips/gen_mips_regalloc_if.h
MAINTAINERCLEANFILES += $(mips_built_sources)
BUILT_SOURCES += $(mips_built_sources)
libfirm_la_SOURCES += $(mips_sources) $(mips_built_sources)
EXTRA_DIST += \
be/mips/bearch_mips.h \
be/mips/bearch_mips_t.h \
be/mips/mips_emitter.h \
be/mips/mips_map_regs.h \
be/mips/mips_new_nodes.h \
be/mips/mips_nodes_attr.h \
be/mips/mips_scheduler.h \
be/mips/mips_spec.pl \
be/mips/mips_transform.h \
be/mips/mips_util.h
$(srcdir)/be/mips/gen_mips_new_nodes.c.inl $(srcdir)/be/mips/gen_mips_new_nodes.h: \
be/mips/mips_spec.pl be/scripts/generate_new_opcodes.pl
$(PERL) $(srcdir)/be/scripts/generate_new_opcodes.pl $(srcdir)/be/mips/mips_spec.pl $(srcdir)/be/mips
$(srcdir)/be/mips/gen_mips_emitter.c $(srcdir)/be/mips/gen_mips_emitter.h: \
be/mips/mips_spec.pl be/scripts/generate_emitter.pl
$(PERL) $(srcdir)/be/scripts/generate_emitter.pl $(srcdir)/be/mips/mips_spec.pl $(srcdir)/be/mips
$(srcdir)/be/mips/gen_mips_machine.c $(srcdir)/be/mips/gen_mips_machine.h: \
be/mips/mips_spec.pl be/scripts/generate_machine.pl
$(PERL) $(srcdir)/be/scripts/generate_machine.pl $(srcdir)/be/mips/mips_spec.pl $(srcdir)/be/mips
$(srcdir)/be/mips/gen_mips_regalloc_if.c $(srcdir)/be/mips/gen_mips_regalloc_if.h: \
be/mips/mips_spec.pl be/scripts/generate_machine.pl
$(PERL) $(srcdir)/be/scripts/generate_regalloc_if.pl $(srcdir)/be/mips/mips_spec.pl $(srcdir)/be/mips
# sparc backend
sparc_sources = \
......
......@@ -54,7 +54,6 @@ void be_init_copystat(void);
void be_init_daemelspill(void);
void be_init_dbgout(void);
void be_init_arch_ia32(void);
void be_init_arch_mips(void);
void be_init_arch_arm(void);
void be_init_arch_sparc(void);
void be_init_arch_amd64(void);
......@@ -131,7 +130,6 @@ void be_init_modules(void)
be_init_stabs();
be_init_arch_ia32();
be_init_arch_mips();
be_init_arch_arm();
be_init_arch_sparc();
be_init_arch_amd64();
......
This diff is collapsed.
/*
* Copyright (C) 1995-2008 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 declarations for the mips backend
* @author Matthias Braun, Mehdi
* @version $Id$
*/
#ifndef FIRM_BE_MIPS_BEARCH_MIPS_H
#define FIRM_BE_MIPS_BEARCH_MIPS_H
#include "../bearch.h"
typedef struct mips_code_gen_t mips_code_gen_t;
extern const arch_isa_if_t mips_isa_if;
int mips_is_Load(const ir_node *node);
int mips_is_Store(const ir_node *node);
#endif
/*
* Copyright (C) 1995-2008 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 datastructures and declarations for the mips backend
* @author Matthias Braun, Mehdi
* @version $Id$
*/
#ifndef FIRM_BE_MIPS_BEARCH_MIPS_T_H
#define FIRM_BE_MIPS_BEARCH_MIPS_T_H
#include "debug.h"
#include "irgopt.h"
#include "bearch_mips.h"
#include "mips_nodes_attr.h"
#include "be.h"
#include "../beemitter.h"
#include "set.h"
typedef struct mips_isa_t mips_isa_t;
typedef struct mips_transform_env_t mips_transform_env_t;
struct mips_code_gen_t {
const arch_code_generator_if_t *impl; /**< implementation */
ir_graph *irg; /**< current irg */
set *reg_set; /**< set to memorize registers for FIRM nodes (e.g. phi) */
mips_isa_t *isa; /**< the isa instance */
ir_node **block_schedule;
};
struct mips_isa_t {
arch_env_t arch_env; /**< must be derived from arch_env_t */
mips_code_gen_t *cg;
};
/**
* this is a struct to minimize the number of parameters
* for transformation walker
*/
struct mips_transform_env_t {
dbg_info *dbg; /**< The node debug info */
ir_graph *irg; /**< The irg, the node should be created in */
ir_node *block; /**< The block, the node should belong to */
ir_node *irn; /**< The irn, to be transformed */
ir_mode *mode; /**< The mode of the irn */
mips_code_gen_t *cg; /**< The code generator */
};
#endif
This diff is collapsed.
/*
* Copyright (C) 1995-2008 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 declarations for the mips assembler emitter
* @author Matthias Braun, Mehdi
* @version $Id$
*/
#ifndef FIRM_BE_MIPS_MIPS_EMITTER_H
#define FIRM_BE_MIPS_MIPS_EMITTER_H
#include "irnode.h"
#include "../bearch.h"
#include "../beemitter.h"
#include "bearch_mips_t.h"
void mips_emit_source_register(const ir_node *node, int pos);
void mips_emit_dest_register(const ir_node *node, int pos);
void mips_emit_source_register_or_immediate(const ir_node *node, int pos);
void mips_emit_immediate(const ir_node *node);
void mips_emit_immediate_suffix(const ir_node *node, int pos);
void mips_emit_load_store_address(const ir_node *node, int pos);
void mips_emit_jump_target(const ir_node *node);
void mips_emit_jump_target_proj(const ir_node *node, long pn);
void mips_emit_jump_or_fallthrough(const ir_node *node, long pn);
void mips_register_emitters(void);
ir_node *mips_get_jump_block(const ir_node* node, long projn);
/** returns the label used for a block */
const char* mips_get_block_label(const ir_node* block);
/** returns the label for the jumptable */
const char* mips_get_jumptbl_label(const ir_node* switchjmp);
void mips_gen_routine(mips_code_gen_t *cg, ir_graph *irg);
#endif
/*
* Copyright (C) 1995-2008 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 Register mapping for firm nodes. Stolen from bearch_firm :)
* @author Matthias Braun, Mehdi
* @version $Id$
*/
#include "config.h"
#include <stdlib.h>
#include "mips_map_regs.h"
#include "mips_new_nodes.h"
/* Mapping to store registers in firm nodes */
struct mips_irn_reg_assoc {
const ir_node *irn;
const arch_register_t *reg;
};
int mips_cmp_irn_reg_assoc(const void *a, const void *b, size_t size)
{
const struct mips_irn_reg_assoc *x = a;
const struct mips_irn_reg_assoc *y = b;
(void) size;
return x->irn != y->irn;
}
static struct mips_irn_reg_assoc *get_irn_reg_assoc(const ir_node *irn, set *reg_set)
{
struct mips_irn_reg_assoc templ;
unsigned int hash;
templ.irn = irn;
templ.reg = NULL;
hash = HASH_PTR(irn);
return set_insert(reg_set, &templ, sizeof(templ), hash);
}
void mips_set_firm_reg(ir_node *irn, const arch_register_t *reg, set *reg_set)
{
struct mips_irn_reg_assoc *assoc = get_irn_reg_assoc(irn, reg_set);
assoc->reg = reg;
}
const arch_register_t *mips_get_firm_reg(const ir_node *irn, set *reg_set)
{
struct mips_irn_reg_assoc *assoc = get_irn_reg_assoc(irn, reg_set);
return assoc->reg;
}
/**
* Translates the projnum into a "real" argument position for register
* requirements dependend on the predecessor.
*/
long mips_translate_proj_pos(const ir_node *proj)
{
return get_Proj_proj(proj);
}
/*
* Copyright (C) 1995-2008 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 mips register allocation interface
* @author Matthias Braun, Mehdi
* @version $Id$
*/
#ifndef FIRM_BE_MIPS_MIPS_MAP_REGS_H
#define FIRM_BE_MIPS_MIPS_MAP_REGS_H
#include "irnode.h"
#include "set.h"
#include "../bearch.h"
#include "mips_nodes_attr.h"
int mips_cmp_irn_reg_assoc(const void *a, const void *b, size_t len);
void mips_set_firm_reg(ir_node *irn, const arch_register_t *reg, set *reg_set);
const arch_register_t *mips_get_firm_reg(const ir_node *irn, set *reg_set);
long mips_translate_proj_pos(const ir_node *proj);
#endif
/*
* Copyright (C) 1995-2008 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 This file implements the creation of the architecture specific firm
* opcodes and the corresponding node constructors for the MIPS
* assembler irg.
* @author Matthias Braun, Mehdi
* @version $Id$
*/
#include "config.h"
#include <stdlib.h>
#include "irprog_t.h"
#include "irgraph_t.h"
#include "irnode_t.h"
#include "irmode_t.h"
#include "ircons_t.h"
#include "iropt_t.h"
#include "irop.h"
#include "irvrfy_t.h"
#include "irprintf.h"
#include "xmalloc.h"
#include "../bearch.h"
#include "mips_nodes_attr.h"
#include "mips_new_nodes.h"
#include "gen_mips_regalloc_if.h"
/***********************************************************************************
* _ _ _ __
* | | (_) | | / _|
* __| |_ _ _ __ ___ _ __ ___ _ __ _ _ __ | |_ ___ _ __| |_ __ _ ___ ___
* / _` | | | | '_ ` _ \| '_ \ / _ \ '__| | | '_ \| __/ _ \ '__| _/ _` |/ __/ _ \
* | (_| | |_| | | | | | | |_) | __/ | | | | | | || __/ | | || (_| | (_| __/
* \__,_|\__,_|_| |_| |_| .__/ \___|_| |_|_| |_|\__\___|_| |_| \__,_|\___\___|
* | |
* |_|
***********************************************************************************/
/**
* Dumper interface for dumping mips nodes in vcg.
* @param F the output file
* @param n the node to dump
* @param reason indicates which kind of information should be dumped
*/
static void mips_dump_node(FILE *F, ir_node *n, dump_reason_t reason)
{
switch (reason) {
case dump_node_opcode_txt:
fprintf(F, "%s", get_irn_opname(n));
break;
case dump_node_mode_txt:
break;
case dump_node_nodeattr_txt:
if (is_mips_Immediate(n)) {
const mips_immediate_attr_t *attr
= get_mips_immediate_attr_const(n);
switch (attr->imm_type) {
case MIPS_IMM_CONST:
fprintf(F, " %ld ", attr->val);
break;
case MIPS_IMM_SYMCONST_LO:
fprintf(F, " lo(%s", get_entity_ld_name(attr->entity));
if (attr->val != 0) {
fprintf(F, "%+ld", attr->val);
}
fprintf(F, ") ");
break;
case MIPS_IMM_SYMCONST_HI:
fprintf(F, " hi(%s", get_entity_ld_name(attr->entity));
if (attr->val != 0) {
fprintf(F, "%+ld", attr->val);
}
fprintf(F, ") ");
break;
default:
fprintf(F, " INVALID ");
break;
}
}
break;
case dump_node_info_txt:
arch_dump_reqs_and_registers(F, n);
break;
}
}
/***************************************************************************************************
* _ _ _ __ _ _ _ _
* | | | | | | / / | | | | | | | |
* __ _| |_| |_ _ __ ___ ___| |_ / /_ _ ___| |_ _ __ ___ ___| |_| |__ ___ __| |___
* / _` | __| __| '__| / __|/ _ \ __| / / _` |/ _ \ __| | '_ ` _ \ / _ \ __| '_ \ / _ \ / _` / __|
* | (_| | |_| |_| | \__ \ __/ |_ / / (_| | __/ |_ | | | | | | __/ |_| | | | (_) | (_| \__ \
* \__,_|\__|\__|_| |___/\___|\__/_/ \__, |\___|\__| |_| |_| |_|\___|\__|_| |_|\___/ \__,_|___/
* __/ |
* |___/
***************************************************************************************************/
mips_attr_t *get_mips_attr(ir_node *node)
{
assert(is_mips_irn(node) && "need mips node to get attributes");
return (mips_attr_t *) get_irn_generic_attr(node);
}
const mips_attr_t *get_mips_attr_const(const ir_node *node)
{
assert(is_mips_irn(node) && "need mips node to get attributes");
return get_irn_generic_attr_const(node);
}
const mips_immediate_attr_t *get_mips_immediate_attr_const(const ir_node *node)
{
assert(is_mips_irn(node) && "need mips node to get attributes");
return get_irn_generic_attr_const(node);
}
const mips_load_store_attr_t *get_mips_load_store_attr_const(
const ir_node *node)
{
assert(is_mips_irn(node) && "need mips node to get attributes");
return get_irn_generic_attr_const(node);
}
/**
* Returns the argument register requirements of a mips node.
*/
const arch_register_req_t **get_mips_in_req_all(const ir_node *node)
{
const mips_attr_t *attr = get_mips_attr_const(node);
return attr->in_req;
}
/**
* Returns the argument register requirement at position pos of an mips node.
*/
const arch_register_req_t *get_mips_in_req(const ir_node *node, int pos)
{
const mips_attr_t *attr = get_mips_attr_const(node);
return attr->in_req[pos];
}
/**
* Sets the IN register requirements at position pos.
*/
void set_mips_req_in(ir_node *node, const arch_register_req_t *req, int pos)
{
mips_attr_t *attr = get_mips_attr(node);
attr->in_req[pos] = req;
}
/**
* Initializes the nodes attributes.
*/
static void init_mips_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);
mips_attr_t *attr = get_mips_attr(node);
backend_info_t *info;
(void) execution_units;
arch_irn_set_flags(node, flags);
attr->in_req = 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]));
}
static void init_mips_immediate_attributes(ir_node *node,
mips_immediate_type_t type,
ir_entity *entity, long val)
{
mips_immediate_attr_t *attr = get_irn_generic_attr(node);
attr->imm_type = type;
attr->entity = entity;
attr->val = val;
}
static void init_mips_load_store_attributes(ir_node *node, ir_entity *entity,
long offset)
{
mips_load_store_attr_t *attr = get_irn_generic_attr(node);
attr->stack_entity = entity;
attr->offset = offset;
}
static int mips_compare_nodes_attr(ir_node *node_a, ir_node *node_b)
{
const mips_attr_t *a = get_mips_attr_const(node_a);
const mips_attr_t *b = get_mips_attr_const(node_b);
if (a->switch_default_pn != b->switch_default_pn)
return 1;
return 0;
}
static int mips_compare_immediate_attr(ir_node *node_a, ir_node *node_b)
{
const mips_immediate_attr_t *a = get_mips_immediate_attr_const(node_a);
const mips_immediate_attr_t *b = get_mips_immediate_attr_const(node_b);
if (a->val != b->val)
return 1;
return 0;
}
static int mips_compare_load_store_attr(ir_node *node_a, ir_node *node_b)
{
const mips_load_store_attr_t *a = get_mips_load_store_attr_const(node_a);
const mips_load_store_attr_t *b = get_mips_load_store_attr_const(node_b);
if (mips_compare_nodes_attr(node_a, node_b))
return 1;
if (a->stack_entity != b->stack_entity)
return 1;
if (a->offset !=