blob: 914735cc6458dc6b4a97b34363dba9f24b1ef454 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
//===------------ 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;
|