[docs] Update HowToReleaseLLVM documentation.
[llvm-project.git] / compiler-rt / lib / builtins / avr / mulqi3.S
blob914735cc6458dc6b4a97b34363dba9f24b1ef454
1 //===------------ mulhi3.S - int8 multiplication --------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // The corresponding C code is something like:
11 // char __mulqi3(char A, char B) {
12 //   int S = 0;
13 //   while (A != 0) {
14 //     if (A & 1)
15 //       S += B;
16 //     B <<= 1;
17 //     A = ((unsigned char) A) >> 1;
18 //   }
19 //   return S;
20 // }
22 // __mulqi3 has special ABI, as the implementation of libgcc, the result is
23 // returned via R24, while Rtmp and R22 are clobbered.
25 //===----------------------------------------------------------------------===//
27         .text
28         .align 2
30 #ifdef __AVR_TINY__
31         .set __tmp_reg__, 16
32 #else
33         .set __tmp_reg__, 0
34 #endif
36         .globl __mulqi3
37         .type  __mulqi3, @function
39 __mulqi3:
40         clr   __tmp_reg__              ; S = 0;
42 __mulqi3_loop:
43         cpi   r24, 0
44         breq  __mulqi3_end             ; while (A != 0) {
45         sbrc  r24, 0                   ;   if (A & 1)
46         add   __tmp_reg__, r22         ;     S += B;
47         add   r22, r22                 ;   B <<= 1;
48         lsr   r24                      ;   A = ((unsigned char) A) >> 1;
49         rjmp  __mulqi3_loop            ; }
51 __mulqi3_end:
52         mov   r24, __tmp_reg__
53         ret                            ; return S;