ARC: cleanup & modify _st32_huge_offset as it becomes widely used
As we start to use _st32_huge_offset in other places (i.e DSP code) introduce optimized version with address shifted instruction which doesn't produce extra instruction. Signed-off-by: Eugeniy Paltsev <Eugeniy.Paltsev@synopsys.com> Signed-off-by: Evgeniy Paltsev <PaltsevEvgeniy@gmail.com>
This commit is contained in:
parent
ae79de1930
commit
d9b3efa550
1 changed files with 19 additions and 5 deletions
|
@ -543,16 +543,30 @@
|
||||||
#endif
|
#endif
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
|
||||||
|
#define __arc_u9_max (255)
|
||||||
|
#define __arc_u9_min (-256)
|
||||||
|
#define __arc_ldst32_as_shift 2
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* When we accessing bloated struct member we can exceed u9 operand in store
|
* When we accessing bloated struct member we can exceed u9 operand in store
|
||||||
* instruction. So we can use _st32_huge_offset macro instead
|
* instruction. So we can use _st32_huge_offset macro instead
|
||||||
*/
|
*/
|
||||||
.macro _st32_huge_offset, d, s, off, temp
|
.macro _st32_huge_offset, d, s, offset, temp
|
||||||
.if MACRO_ARG(off) > 255 || MACRO_ARG(off) < -256
|
off = MACRO_ARG(offset)
|
||||||
ADDR MACRO_ARG(temp), MACRO_ARG(s), MACRO_ARG(off)
|
u9_max_shifted = __arc_u9_max << __arc_ldst32_as_shift
|
||||||
st MACRO_ARG(d), [MACRO_ARG(temp)]
|
|
||||||
|
.if off <= __arc_u9_max && off >= __arc_u9_min
|
||||||
|
st MACRO_ARG(d), [MACRO_ARG(s), off]
|
||||||
|
/* Technically we can optimize with .as both big positive and negative offsets here, but
|
||||||
|
* as we use only positive offsets in hand-written assembly code we keep only
|
||||||
|
* positive offset case here for simplicity.
|
||||||
|
*/
|
||||||
|
.elseif !(off % (1 << __arc_ldst32_as_shift)) && off <= u9_max_shifted && off >= 0
|
||||||
|
st.as MACRO_ARG(d), [MACRO_ARG(s), off >> __arc_ldst32_as_shift]
|
||||||
.else
|
.else
|
||||||
st MACRO_ARG(d), [MACRO_ARG(s), MACRO_ARG(off)]
|
ADDR MACRO_ARG(temp), MACRO_ARG(s), off
|
||||||
|
st MACRO_ARG(d), [MACRO_ARG(temp)]
|
||||||
.endif
|
.endif
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue