mirror of
https://github.com/autc04/Retro68.git
synced 2024-07-06 22:29:13 +00:00
Fix some merge problems
This commit is contained in:
parent
aebd1e06ff
commit
715265c205
@ -231,9 +231,9 @@ prepare_call_address (tree fndecl_or_type, rtx funexp, rtx static_chain_value,
|
|||||||
#ifndef NO_FUNCTION_CSE
|
#ifndef NO_FUNCTION_CSE
|
||||||
int is_magic = 0;
|
int is_magic = 0;
|
||||||
|
|
||||||
if (fndecl)
|
if (fndecl_or_type)
|
||||||
{
|
{
|
||||||
tree fntype = TREE_TYPE(fndecl);
|
tree fntype = TREE_TYPE(fndecl_or_type);
|
||||||
if(fntype && lookup_attribute ("raw_inline", TYPE_ATTRIBUTES (fntype)))
|
if(fntype && lookup_attribute ("raw_inline", TYPE_ATTRIBUTES (fntype)))
|
||||||
is_magic = 1;
|
is_magic = 1;
|
||||||
}
|
}
|
||||||
@ -1199,7 +1199,7 @@ initialize_argument_information (int num_actuals ATTRIBUTE_UNUSED,
|
|||||||
/* Count arg position in order args appear. */
|
/* Count arg position in order args appear. */
|
||||||
int argpos;
|
int argpos;
|
||||||
|
|
||||||
int i;
|
int i, inc;
|
||||||
|
|
||||||
args_size->constant = 0;
|
args_size->constant = 0;
|
||||||
args_size->var = 0;
|
args_size->var = 0;
|
||||||
@ -1209,7 +1209,7 @@ initialize_argument_information (int num_actuals ATTRIBUTE_UNUSED,
|
|||||||
/* In this loop, we consider args in the order they are written.
|
/* In this loop, we consider args in the order they are written.
|
||||||
We fill up ARGS from the back. */
|
We fill up ARGS from the back. */
|
||||||
|
|
||||||
if (PUSH_ARGS_REVERSED != reverse_args)
|
if (!reverse_args)
|
||||||
{
|
{
|
||||||
i = num_actuals - 1, inc = -1;
|
i = num_actuals - 1, inc = -1;
|
||||||
/* In this case, must reverse order of args
|
/* In this case, must reverse order of args
|
||||||
@ -1231,7 +1231,7 @@ initialize_argument_information (int num_actuals ATTRIBUTE_UNUSED,
|
|||||||
if (struct_value_addr_value)
|
if (struct_value_addr_value)
|
||||||
{
|
{
|
||||||
args[j].tree_value = struct_value_addr_value;
|
args[j].tree_value = struct_value_addr_value;
|
||||||
j--;
|
j += inc;
|
||||||
|
|
||||||
/* If we pass structure address then we need to
|
/* If we pass structure address then we need to
|
||||||
create bounds for it. Since created bounds is
|
create bounds for it. Since created bounds is
|
||||||
@ -1244,8 +1244,8 @@ initialize_argument_information (int num_actuals ATTRIBUTE_UNUSED,
|
|||||||
= chkp_make_bounds_for_struct_addr (struct_value_addr_value);
|
= chkp_make_bounds_for_struct_addr (struct_value_addr_value);
|
||||||
expand_expr_real (args[j].tree_value, args[j].value, VOIDmode,
|
expand_expr_real (args[j].tree_value, args[j].value, VOIDmode,
|
||||||
EXPAND_NORMAL, 0, false);
|
EXPAND_NORMAL, 0, false);
|
||||||
args[j].pointer_arg = j + 1;
|
args[j].pointer_arg = j + 1; // ### ???
|
||||||
j--;
|
j += inc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
FOR_EACH_CALL_EXPR_ARG (arg, iter, exp)
|
FOR_EACH_CALL_EXPR_ARG (arg, iter, exp)
|
||||||
@ -1303,12 +1303,12 @@ initialize_argument_information (int num_actuals ATTRIBUTE_UNUSED,
|
|||||||
{
|
{
|
||||||
tree subtype = TREE_TYPE (argtype);
|
tree subtype = TREE_TYPE (argtype);
|
||||||
args[j].tree_value = build1 (REALPART_EXPR, subtype, arg);
|
args[j].tree_value = build1 (REALPART_EXPR, subtype, arg);
|
||||||
j--;
|
j += inc;
|
||||||
args[j].tree_value = build1 (IMAGPART_EXPR, subtype, arg);
|
args[j].tree_value = build1 (IMAGPART_EXPR, subtype, arg);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
args[j].tree_value = arg;
|
args[j].tree_value = arg;
|
||||||
j--;
|
j += inc;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (slots)
|
if (slots)
|
||||||
@ -1318,7 +1318,7 @@ initialize_argument_information (int num_actuals ATTRIBUTE_UNUSED,
|
|||||||
bitmap_obstack_release (NULL);
|
bitmap_obstack_release (NULL);
|
||||||
|
|
||||||
/* I counts args in order (to be) pushed; ARGPOS counts in order written. */
|
/* I counts args in order (to be) pushed; ARGPOS counts in order written. */
|
||||||
for (argpos = 0; argpos < num_actuals; i--, argpos++)
|
for (argpos = 0; argpos < num_actuals; i += inc, argpos++)
|
||||||
{
|
{
|
||||||
tree type = TREE_TYPE (args[i].tree_value);
|
tree type = TREE_TYPE (args[i].tree_value);
|
||||||
int unsignedp;
|
int unsignedp;
|
||||||
|
@ -6,6 +6,13 @@
|
|||||||
#include "system.h"
|
#include "system.h"
|
||||||
#include "coretypes.h"
|
#include "coretypes.h"
|
||||||
#include "tm.h"
|
#include "tm.h"
|
||||||
|
#include "hash-set.h"
|
||||||
|
#include "vec.h"
|
||||||
|
#include "double-int.h"
|
||||||
|
#include "input.h"
|
||||||
|
#include "alias.h"
|
||||||
|
#include "symtab.h"
|
||||||
|
#include "inchash.h"
|
||||||
#include "tree.h"
|
#include "tree.h"
|
||||||
|
|
||||||
#include "c-family/c-pragma.h"
|
#include "c-family/c-pragma.h"
|
||||||
|
@ -63,7 +63,7 @@ extern rtx m68k_legitimize_tls_address (rtx);
|
|||||||
extern bool m68k_tls_reference_p (rtx, bool);
|
extern bool m68k_tls_reference_p (rtx, bool);
|
||||||
extern int valid_dbcc_comparison_p_2 (rtx, machine_mode);
|
extern int valid_dbcc_comparison_p_2 (rtx, machine_mode);
|
||||||
extern rtx m68k_libcall_value (machine_mode);
|
extern rtx m68k_libcall_value (machine_mode);
|
||||||
extern rtx m68k_function_value (const_tree, const_tree);
|
extern rtx m68k_function_value (const_tree, const_tree, bool);
|
||||||
extern int emit_move_sequence (rtx *, machine_mode, rtx);
|
extern int emit_move_sequence (rtx *, machine_mode, rtx);
|
||||||
extern bool m68k_movem_pattern_p (rtx, rtx, HOST_WIDE_INT, bool);
|
extern bool m68k_movem_pattern_p (rtx, rtx, HOST_WIDE_INT, bool);
|
||||||
extern const char *m68k_output_movem (rtx *, rtx, HOST_WIDE_INT, bool);
|
extern const char *m68k_output_movem (rtx *, rtx, HOST_WIDE_INT, bool);
|
||||||
|
@ -205,7 +205,6 @@ static rtx m68k_function_arg (cumulative_args_t, machine_mode,
|
|||||||
static bool m68k_cannot_force_const_mem (machine_mode mode, rtx x);
|
static bool m68k_cannot_force_const_mem (machine_mode mode, rtx x);
|
||||||
static bool m68k_output_addr_const_extra (FILE *, rtx);
|
static bool m68k_output_addr_const_extra (FILE *, rtx);
|
||||||
static void m68k_init_sync_libfuncs (void) ATTRIBUTE_UNUSED;
|
static void m68k_init_sync_libfuncs (void) ATTRIBUTE_UNUSED;
|
||||||
static rtx m68k_function_value (const_tree, const_tree, bool);
|
|
||||||
|
|
||||||
|
|
||||||
/* Initialize the GCC target structure. */
|
/* Initialize the GCC target structure. */
|
||||||
@ -1585,114 +1584,6 @@ m68k_function_arg_advance (cumulative_args_t cum_v, machine_mode mode,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Return libcall result in A0 instead of usual D0. */
|
|
||||||
static bool m68k_libcall_value_in_a0_p = false;
|
|
||||||
|
|
||||||
/* Return floating point values in a 68881 register. This makes 68881 code
|
|
||||||
a little bit faster. It also makes -msoft-float code incompatible with
|
|
||||||
hard-float code, so people have to be careful not to mix the two.
|
|
||||||
For ColdFire it was decided the ABI incompatibility is undesirable.
|
|
||||||
If there is need for a hard-float ABI it is probably worth doing it
|
|
||||||
properly and also passing function arguments in FP registers. */
|
|
||||||
rtx
|
|
||||||
m68k_libcall_value (enum machine_mode mode)
|
|
||||||
{
|
|
||||||
switch (mode) {
|
|
||||||
case SFmode:
|
|
||||||
case DFmode:
|
|
||||||
case XFmode:
|
|
||||||
if (TARGET_68881)
|
|
||||||
return gen_rtx_REG (mode, FP0_REG);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return gen_rtx_REG (mode, m68k_libcall_value_in_a0_p ? A0_REG : D0_REG);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Location in which function value is returned. */
|
|
||||||
rtx
|
|
||||||
m68k_function_value (const_tree valtype, const_tree func_decl_or_type, bool outgoing)
|
|
||||||
{
|
|
||||||
enum machine_mode mode;
|
|
||||||
|
|
||||||
mode = TYPE_MODE (valtype);
|
|
||||||
|
|
||||||
if(func_decl_or_type)
|
|
||||||
{
|
|
||||||
CUMULATIVE_ARGS cum;
|
|
||||||
const_tree decl = func_decl_or_type;
|
|
||||||
const_tree type = func_decl_or_type;
|
|
||||||
if(TREE_CODE(type) == FUNCTION_DECL)
|
|
||||||
type = TREE_TYPE(type);
|
|
||||||
else
|
|
||||||
decl = NULL;
|
|
||||||
m68k_init_cumulative_args(&cum, type, NULL, decl, -1);
|
|
||||||
if(cum.regparam)
|
|
||||||
return gen_rtx_REG (mode, cum.arg_regs[0]);
|
|
||||||
}
|
|
||||||
return gen_rtx_REG (mode, D0_REG);
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
switch (mode) {
|
|
||||||
case SFmode:
|
|
||||||
case DFmode:
|
|
||||||
case XFmode:
|
|
||||||
if (TARGET_68881)
|
|
||||||
return gen_rtx_REG (mode, FP0_REG);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If the function returns a pointer, push that into %a0. */
|
|
||||||
if (func && POINTER_TYPE_P (TREE_TYPE (TREE_TYPE (func))))
|
|
||||||
/* For compatibility with the large body of existing code which
|
|
||||||
does not always properly declare external functions returning
|
|
||||||
pointer types, the m68k/SVR4 convention is to copy the value
|
|
||||||
returned for pointer functions from a0 to d0 in the function
|
|
||||||
epilogue, so that callers that have neglected to properly
|
|
||||||
declare the callee can still find the correct return value in
|
|
||||||
d0. */
|
|
||||||
return gen_rtx_PARALLEL
|
|
||||||
(mode,
|
|
||||||
gen_rtvec (2,
|
|
||||||
gen_rtx_EXPR_LIST (VOIDmode,
|
|
||||||
gen_rtx_REG (mode, A0_REG),
|
|
||||||
const0_rtx),
|
|
||||||
gen_rtx_EXPR_LIST (VOIDmode,
|
|
||||||
gen_rtx_REG (mode, D0_REG),
|
|
||||||
const0_rtx)));
|
|
||||||
else if (POINTER_TYPE_P (valtype))
|
|
||||||
return gen_rtx_REG (mode, A0_REG);
|
|
||||||
else
|
|
||||||
return gen_rtx_REG (mode, D0_REG);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Worker function for TARGET_RETURN_IN_MEMORY. */
|
|
||||||
#if M68K_HONOR_TARGET_STRICT_ALIGNMENT
|
|
||||||
static bool
|
|
||||||
m68k_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
|
|
||||||
{
|
|
||||||
enum machine_mode mode = TYPE_MODE (type);
|
|
||||||
|
|
||||||
if (mode == BLKmode)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
/* If TYPE's known alignment is less than the alignment of MODE that
|
|
||||||
would contain the structure, then return in memory. We need to
|
|
||||||
do so to maintain the compatibility between code compiled with
|
|
||||||
-mstrict-align and that compiled with -mno-strict-align. */
|
|
||||||
if (AGGREGATE_TYPE_P (type)
|
|
||||||
&& TYPE_ALIGN (type) < GET_MODE_ALIGNMENT (mode))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Convert X to a legitimate function call memory reference and return the
|
/* Convert X to a legitimate function call memory reference and return the
|
||||||
result. */
|
result. */
|
||||||
|
|
||||||
@ -2738,6 +2629,9 @@ m68k_get_tls_get_addr (void)
|
|||||||
return m68k_tls_get_addr;
|
return m68k_tls_get_addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Return libcall result in A0 instead of usual D0. */
|
||||||
|
static bool m68k_libcall_value_in_a0_p = false;
|
||||||
|
|
||||||
/* Emit instruction sequence that calls __tls_get_addr. X is
|
/* Emit instruction sequence that calls __tls_get_addr. X is
|
||||||
the TLS symbol we are referencing and RELOC is the symbol type to use
|
the TLS symbol we are referencing and RELOC is the symbol type to use
|
||||||
(either TLSGD or TLSLDM). EQV is the REG_EQUAL note for the sequence
|
(either TLSGD or TLSLDM). EQV is the REG_EQUAL note for the sequence
|
||||||
@ -5561,11 +5455,27 @@ m68k_libcall_value (enum machine_mode mode)
|
|||||||
NOTE: Due to differences in ABIs, don't call this function directly,
|
NOTE: Due to differences in ABIs, don't call this function directly,
|
||||||
use FUNCTION_VALUE instead. */
|
use FUNCTION_VALUE instead. */
|
||||||
rtx
|
rtx
|
||||||
m68k_function_value (const_tree valtype, const_tree func ATTRIBUTE_UNUSED)
|
m68k_function_value (const_tree valtype, const_tree func_decl_or_type, bool outgoing)
|
||||||
{
|
{
|
||||||
enum machine_mode mode;
|
enum machine_mode mode;
|
||||||
|
|
||||||
mode = TYPE_MODE (valtype);
|
mode = TYPE_MODE (valtype);
|
||||||
|
|
||||||
|
const_tree decl = NULL, type = NULL;
|
||||||
|
if(func_decl_or_type)
|
||||||
|
{
|
||||||
|
CUMULATIVE_ARGS cum;
|
||||||
|
decl = func_decl_or_type;
|
||||||
|
type = func_decl_or_type;
|
||||||
|
if(TREE_CODE(type) == FUNCTION_DECL)
|
||||||
|
type = TREE_TYPE(type);
|
||||||
|
else
|
||||||
|
decl = NULL;
|
||||||
|
m68k_init_cumulative_args(&cum, type, NULL, decl, -1);
|
||||||
|
if(cum.regparam)
|
||||||
|
return gen_rtx_REG (mode, cum.arg_regs[0]);
|
||||||
|
}
|
||||||
|
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
case SFmode:
|
case SFmode:
|
||||||
case DFmode:
|
case DFmode:
|
||||||
@ -5578,7 +5488,7 @@ m68k_function_value (const_tree valtype, const_tree func ATTRIBUTE_UNUSED)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* If the function returns a pointer, push that into %a0. */
|
/* If the function returns a pointer, push that into %a0. */
|
||||||
if (func && POINTER_TYPE_P (TREE_TYPE (TREE_TYPE (func))))
|
if (type && POINTER_TYPE_P (TREE_TYPE (type)) && !outgoing)
|
||||||
/* For compatibility with the large body of existing code which
|
/* For compatibility with the large body of existing code which
|
||||||
does not always properly declare external functions returning
|
does not always properly declare external functions returning
|
||||||
pointer types, the m68k/SVR4 convention is to copy the value
|
pointer types, the m68k/SVR4 convention is to copy the value
|
||||||
|
Loading…
Reference in New Issue
Block a user