#include "ia32_new_nodes.h"
#include "bearch_ia32_t.h"
#include "gen_ia32_regalloc_if.h"
+#include "begnuas.h"
/** The array of all intrinsics that must be mapped. */
static i_record *intrinsics;
if (is_Const(cnt)) {
/* the shift count is a const, create better code */
- tarval *tv = get_Const_tarval(cnt);
+ ir_tarval *tv = get_Const_tarval(cnt);
if (tarval_cmp(tv, new_tarval_from_long(32, l_mode)) & (pn_Cmp_Gt|pn_Cmp_Eq)) {
/* simplest case: shift only the lower bits. Note that there is no
if (is_Const(cnt)) {
/* the shift count is a const, create better code */
- tarval *tv = get_Const_tarval(cnt);
+ ir_tarval *tv = get_Const_tarval(cnt);
if (tarval_cmp(tv, new_tarval_from_long(32, l_mode)) & (pn_Cmp_Gt|pn_Cmp_Eq)) {
/* simplest case: shift only the higher bits. Note that there is no
if (is_Const(cnt)) {
/* the shift count is a const, create better code */
- tarval *tv = get_Const_tarval(cnt);
+ ir_tarval *tv = get_Const_tarval(cnt);
if (tarval_cmp(tv, new_tarval_from_long(32, l_mode)) & (pn_Cmp_Gt|pn_Cmp_Eq)) {
/* simplest case: shift only the higher bits. Note that there is no
static int is_sign_extend(ir_node *low, ir_node *high)
{
if (is_Shrs(high)) {
- ir_node *high_l;
- ir_node *high_r;
- tarval *shift_count;
+ ir_node *high_l;
+ ir_node *high_r;
+ ir_tarval *shift_count;
high_r = get_Shrs_right(high);
if (!is_Const(high_r)) return 0;
if (is_Conv(low) && get_Conv_op(low) == high_l) return 1;
if (is_Conv(high_l) && get_Conv_op(high_l) == low) return 1;
} else if (is_Const(low) && is_Const(high)) {
- tarval *tl = get_Const_tarval(low);
- tarval *th = get_Const_tarval(high);
+ ir_tarval *tl = get_Const_tarval(low);
+ ir_tarval *th = get_Const_tarval(high);
if (tarval_is_long(th) && tarval_is_long(tl)) {
long l = get_tarval_long(tl);
*/
/* TODO: give a hint to the backend somehow to not create a cltd here... */
- sign = new_rd_Shrs(dbg, block, a_h, new_Const_long(l_mode, 31), h_mode);
+ sign = new_rd_Shrs(dbg, block, a_h, new_r_Const_long(irg, l_mode, 31), h_mode);
sign_l = new_rd_Conv(dbg, block, sign, l_mode);
sub_l = new_rd_Eor(dbg, block, a_l, sign_l, l_mode);
sub_h = new_rd_Eor(dbg, block, a_h, sign, h_mode);
#define ID(x) new_id_from_chars(x, sizeof(x)-1)
+static ir_entity *create_compiler_lib_entity(const char *name, ir_type *type)
+{
+ ir_type *glob = get_glob_type();
+ ident *id = new_id_from_str(name);
+ ir_entity *entity;
+
+ /* Hack: we need to know the type of runtime library we use. Strictly
+ speaking it's not the same as the object-file-format. But in practice
+ the following should be enough */
+ if (be_gas_object_file_format == OBJECT_FILE_FORMAT_MACH_O
+ || be_gas_object_file_format == OBJECT_FILE_FORMAT_COFF) {
+ id = id_mangle3("___", id, "");
+ } else {
+ id = id_mangle3("__", id, "");
+ }
+ entity = new_entity(glob, id, type);
+ set_entity_visibility(entity, ir_visibility_local);
+ set_entity_ld_ident(entity, id);
+ return entity;
+}
+
/**
* Maps a Div. Change into a library call.
*/
/* 64bit signed Division */
ent = env->divdi3;
if (ent == NULL) {
- /* create library entity */
- ent = env->divdi3 = new_entity(get_glob_type(), ID("__divdi3"), method);
- set_entity_visibility(ent, ir_visibility_external);
- set_entity_ld_ident(ent, ID("__divdi3"));
+ ent = env->divdi3 = create_compiler_lib_entity("divdi3", method);
}
} else {
/* 64bit unsigned Division */
ent = env->udivdi3;
if (ent == NULL) {
/* create library entity */
- ent = env->udivdi3 = new_entity(get_glob_type(), ID("__udivdi3"), method);
- set_entity_visibility(ent, ir_visibility_external);
- set_entity_ld_ident(ent, ID("__udivdi3"));
+ ent = env->udivdi3 = create_compiler_lib_entity("udivdi3", method);
}
}
ent = env->moddi3;
if (ent == NULL) {
/* create library entity */
- ent = env->moddi3 = new_entity(get_glob_type(), ID("__moddi3"), method);
- set_entity_visibility(ent, ir_visibility_external);
- set_entity_ld_ident(ent, ID("__moddi3"));
+ ent = env->moddi3 = create_compiler_lib_entity("moddi3", method);
}
} else {
/* 64bit signed Modulo */
ent = env->umoddi3;
if (ent == NULL) {
/* create library entity */
- ent = env->umoddi3 = new_entity(get_glob_type(), ID("__umoddi3"), method);
- set_entity_visibility(ent, ir_visibility_external);
- set_entity_ld_ident(ent, ID("__umoddi3"));
+ ent = env->umoddi3 = create_compiler_lib_entity("umoddi3", method);
}
}
pn_ia32_l_FloattoLL_res_high);
} else {
/* convert from float to signed 64bit */
- ir_mode *flt_mode = get_irn_mode(a_f);
- tarval *flt_tv = new_tarval_from_str("9223372036854775808", 19, flt_mode);
- ir_node *flt_corr = new_Const(flt_tv);
- ir_node *lower_blk = block;
- ir_node *upper_blk;
- ir_node *cmp, *proj, *cond, *blk, *int_phi, *flt_phi;
- ir_node *in[2];
+ ir_mode *flt_mode = get_irn_mode(a_f);
+ ir_tarval *flt_tv = new_tarval_from_str("9223372036854775808", 19, flt_mode);
+ ir_node *flt_corr = new_r_Const(irg, flt_tv);
+ ir_node *lower_blk = block;
+ ir_node *upper_blk;
+ ir_node *cmp, *proj, *cond, *blk, *int_phi, *flt_phi;
+ ir_node *in[2];
part_block(call);
upper_blk = get_nodes_block(call);
set_irn_in(lower_blk, 2, in);
/* create to Phis */
- in[0] = new_Const(get_mode_null(h_res_mode));
- in[1] = new_Const_long(h_res_mode, 0x80000000);
+ in[0] = new_r_Const(irg, get_mode_null(h_res_mode));
+ in[1] = new_r_Const_long(irg, h_res_mode, 0x80000000);
int_phi = new_r_Phi(lower_blk, 2, in, h_res_mode);