1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- //===------------ mulhi3.S - int8 multiplication --------------------------===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- //
- // The corresponding C code is something like:
- //
- // char __mulqi3(char A, char B) {
- // int S = 0;
- // while (A != 0) {
- // if (A & 1)
- // S += B;
- // B <<= 1;
- // A = ((unsigned char) A) >> 1;
- // }
- // return S;
- // }
- //
- // __mulqi3 has special ABI, as the implementation of libgcc, the result is
- // returned via R24, while Rtmp and R22 are clobbered.
- //
- //===----------------------------------------------------------------------===//
- .text
- .align 2
- #ifdef __AVR_TINY__
- .set __tmp_reg__, 16
- #else
- .set __tmp_reg__, 0
- #endif
- .globl __mulqi3
- .type __mulqi3, @function
- __mulqi3:
- clr __tmp_reg__ ; S = 0;
- __mulqi3_loop:
- cpi r24, 0
- breq __mulqi3_end ; while (A != 0) {
- sbrc r24, 0 ; if (A & 1)
- add __tmp_reg__, r22 ; S += B;
- add r22, r22 ; B <<= 1;
- lsr r24 ; A = ((unsigned char) A) >> 1;
- rjmp __mulqi3_loop ; }
- __mulqi3_end:
- mov r24, __tmp_reg__
- ret ; return S;
|