Skip to content

Optimisation 02: The operations and the moves #111

@shahab-vahedi

Description

@shahab-vahedi

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        /

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions