Reduce register pressure by reusing registers, allocated for argument preparation instruction sequence.
JerryScript-DCO-1.0-Signed-off-by: Ruben Ayrapetyan r.ayrapetyan@samsung.com
This commit is contained in:
committed by
Evgeny Gavrin
parent
dc095bb902
commit
6e2733dbfd
@@ -755,6 +755,41 @@ dumper_finish_scope (void)
|
|||||||
STACK_DROP (temp_names, 1);
|
STACK_DROP (temp_names, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle start of argument preparation instruction sequence generation
|
||||||
|
*
|
||||||
|
* Note:
|
||||||
|
* Values of registers, allocated for the code sequence, are not used outside of the sequence,
|
||||||
|
* so they can be reused, reducing register pressure.
|
||||||
|
*
|
||||||
|
* To reuse the registers, counter of register allocator is saved, and restored then,
|
||||||
|
* after finishing generation of the code sequence, using dumper_finish_varg_code_sequence.
|
||||||
|
*
|
||||||
|
* FIXME:
|
||||||
|
* Implement general register allocation mechanism
|
||||||
|
*
|
||||||
|
* See also:
|
||||||
|
* dumper_finish_varg_code_sequence
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
dumper_start_varg_code_sequence (void)
|
||||||
|
{
|
||||||
|
STACK_PUSH (temp_names, temp_name);
|
||||||
|
} /* dumper_start_varg_code_sequence */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle finish of argument preparation instruction sequence generation
|
||||||
|
*
|
||||||
|
* See also:
|
||||||
|
* dumper_start_varg_code_sequence
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
dumper_finish_varg_code_sequence (void)
|
||||||
|
{
|
||||||
|
temp_name = STACK_TOP (temp_names);
|
||||||
|
STACK_DROP (temp_names, 1);
|
||||||
|
} /* dumper_finish_varg_code_sequence */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check that byte-code operand refers to 'eval' string
|
* Check that byte-code operand refers to 'eval' string
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -58,6 +58,8 @@ void dumper_free (void);
|
|||||||
void dumper_new_statement (void);
|
void dumper_new_statement (void);
|
||||||
void dumper_new_scope (void);
|
void dumper_new_scope (void);
|
||||||
void dumper_finish_scope (void);
|
void dumper_finish_scope (void);
|
||||||
|
void dumper_start_varg_code_sequence (void);
|
||||||
|
void dumper_finish_varg_code_sequence (void);
|
||||||
|
|
||||||
extern bool dumper_is_eval_literal (operand);
|
extern bool dumper_is_eval_literal (operand);
|
||||||
|
|
||||||
|
|||||||
@@ -521,6 +521,8 @@ parse_argument_list (varg_list_type vlt, operand obj, uint8_t *args_count, opera
|
|||||||
skip_newlines ();
|
skip_newlines ();
|
||||||
while (!token_is (close_tt))
|
while (!token_is (close_tt))
|
||||||
{
|
{
|
||||||
|
dumper_start_varg_code_sequence ();
|
||||||
|
|
||||||
operand op;
|
operand op;
|
||||||
|
|
||||||
if (vlt == VARG_FUNC_DECL
|
if (vlt == VARG_FUNC_DECL
|
||||||
@@ -572,6 +574,8 @@ parse_argument_list (varg_list_type vlt, operand obj, uint8_t *args_count, opera
|
|||||||
}
|
}
|
||||||
|
|
||||||
args_num++;
|
args_num++;
|
||||||
|
|
||||||
|
dumper_finish_varg_code_sequence ();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (args_count != NULL)
|
if (args_count != NULL)
|
||||||
|
|||||||
Reference in New Issue
Block a user