Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/llvm-project/compiler-rt/lib/builtins/avr/mulqi3.S
35290 views
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:
10
//
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
// }
21
//
22
// __mulqi3 has special ABI, as the implementation of libgcc, the result is
23
// returned via R24, while Rtmp and R22 are clobbered.
24
//
25
//===----------------------------------------------------------------------===//
26
27
.text
28
.align 2
29
30
#ifdef __AVR_TINY__
31
.set __tmp_reg__, 16
32
#else
33
.set __tmp_reg__, 0
34
#endif
35
36
.globl __mulqi3
37
.type __mulqi3, @function
38
39
__mulqi3:
40
clr __tmp_reg__ ; S = 0;
41
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 ; }
50
51
__mulqi3_end:
52
mov r24, __tmp_reg__
53
ret ; return S;
54
55