-
Notifications
You must be signed in to change notification settings - Fork 15
Open
Labels
Description
Having the following code:
long long func(long long m, long long n)
{
return m * n;
}
results in an assembly like:
$ arc-elf32-gcc -O3 func.c -S -o -
.file "func.c"
.cpu HS
.arc_attribute Tag_ARC_PCS_config, 2
.arc_attribute Tag_ARC_ABI_rf16, 0
.arc_attribute Tag_ARC_ABI_pic, 0
.arc_attribute Tag_ARC_ABI_tls, 0
.arc_attribute Tag_ARC_ABI_sda, 2
.arc_attribute Tag_ARC_ABI_exceptions, 0
.arc_attribute Tag_ARC_CPU_variation, 2
.section .text
.align 4
.global func
.type func, @function
func:
std.a r14,[sp,-8]
mpy_s r3,r3,r0
mpy_s r1,r1,r2
add_s r1,r1,r3
mpymu r15,r0,r2
mpy r14,r0,r2
add_s r15,r1,r15
mov_s r0,r14
mov_s r1,r15
j_s.d [blink]
ldd.ab r14,[sp,8]
.size func, .-func
.ident "GCC: (ARCompact/ARCv2 ISA elf32 toolchain) 10.2.0"
.section .note.GNU-stack,"",@progbits
But there are rooms for improvement:
mpymu r15,r0,r2 \
mpy r14,r0,r2 | mpymu r15,r0,r2
add_s r15,r1,r15 |========> mpy_s r0,r0,r2
mov_s r0,r14 | add_s r1,r1,r15
mov_s r1,r15 /