Commit d40f3c40 by Chung-Ju Wu Committed by Chung-Ju Wu

[NDS32] No need to take padding into consideration in Andes ABI2 because we can...

[NDS32] No need to take padding into consideration in Andes ABI2 because
        we can pass arguments in registers for variadic function.

  -- By default GCC uses must_pass_in_stack_var_size_or_pad for TARGET_MUST_PASS_IN_STACK.
     For Andes ABI2, the data layout in memory will be incorrect when calling variadic function
     under big-endian configuration.

	* config/nds32/nds32.c (nds32_must_pass_in_stack): New implementation
	for TARGET_MUST_PASS_IN_STACK.

From-SVN: r214869
parent 650fc469
2014-09-03 Chung-Ju Wu <jasonwucj@gmail.com> 2014-09-03 Chung-Ju Wu <jasonwucj@gmail.com>
* config/nds32/nds32.c (nds32_must_pass_in_stack): New implementation
for TARGET_MUST_PASS_IN_STACK.
2014-09-03 Chung-Ju Wu <jasonwucj@gmail.com>
* config/nds32/nds32.c (nds32_arg_partial_bytes): New implementation * config/nds32/nds32.c (nds32_arg_partial_bytes): New implementation
for TARGET_ARG_PARTIAL_BYTES. for TARGET_ARG_PARTIAL_BYTES.
...@@ -1352,6 +1352,19 @@ nds32_function_arg (cumulative_args_t ca, enum machine_mode mode, ...@@ -1352,6 +1352,19 @@ nds32_function_arg (cumulative_args_t ca, enum machine_mode mode,
return NULL_RTX; return NULL_RTX;
} }
static bool
nds32_must_pass_in_stack (enum machine_mode mode, const_tree type)
{
/* Return true if a type must be passed in memory.
If it is NOT using hard float abi, small aggregates can be
passed in a register even we are calling a variadic function.
So there is no need to take padding into consideration. */
if (TARGET_HARD_FLOAT)
return must_pass_in_stack_var_size_or_pad (mode, type);
else
return must_pass_in_stack_var_size (mode, type);
}
static int static int
nds32_arg_partial_bytes (cumulative_args_t ca, enum machine_mode mode, nds32_arg_partial_bytes (cumulative_args_t ca, enum machine_mode mode,
tree type, bool named ATTRIBUTE_UNUSED) tree type, bool named ATTRIBUTE_UNUSED)
...@@ -3498,6 +3511,9 @@ nds32_target_alignment (rtx label) ...@@ -3498,6 +3511,9 @@ nds32_target_alignment (rtx label)
#undef TARGET_FUNCTION_ARG #undef TARGET_FUNCTION_ARG
#define TARGET_FUNCTION_ARG nds32_function_arg #define TARGET_FUNCTION_ARG nds32_function_arg
#undef TARGET_MUST_PASS_IN_STACK
#define TARGET_MUST_PASS_IN_STACK nds32_must_pass_in_stack
#undef TARGET_ARG_PARTIAL_BYTES #undef TARGET_ARG_PARTIAL_BYTES
#define TARGET_ARG_PARTIAL_BYTES nds32_arg_partial_bytes #define TARGET_ARG_PARTIAL_BYTES nds32_arg_partial_bytes
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment