[docs] Update HowToReleaseLLVM documentation.
[llvm-project.git] / compiler-rt / lib / builtins / avr / divmodhi4.S
blob37171331f4b325e54607eceb945eb86d221dd119
1 //===------------- divmodhi4.S - sint16 div & mod -------------------------===//
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 // As described at
10 // https://gcc.gnu.org/wiki/avr-gcc#Exceptions_to_the_Calling_Convention, the
11 // prototype is `struct {sint16, sint16}  __divmodhi4(sint16, sint16)`.
12 // The sint16 quotient is returned via R23:R22, and the sint16 remainder is
13 // returned via R25:R24, while registers R21/R26/27/Rtmp and bit T in SREG
14 // are clobbered.
16 //===----------------------------------------------------------------------===//
18         .text
19         .align 2
21 #ifdef __AVR_TINY__
22         .set __tmp_reg__, 16
23 #else
24         .set __tmp_reg__, 0
25 #endif
27         .globl __divmodhi4
28         .type  __divmodhi4, @function
30 __divmodhi4:
31         bst     r25, 7
32         mov     __tmp_reg__, r23
33         brtc    __divmodhi4_a
34         com     __tmp_reg__
35         rcall   __divmodhi4_b
37 __divmodhi4_a:
38         sbrc    r23, 7
39         rcall   __divmodhi4_c
40         rcall   __udivmodhi4 ; Call __udivmodhi4 to do real calculation.
41         sbrc    __tmp_reg__, 7
42         rcall   __divmodhi4_c
43         brtc    __divmodhi4_exit
45 __divmodhi4_b:
46         com     r25
47         neg     r24
48         sbci    r25, 255
49         ret                  ; Return quotient via R23:R22 and remainder via R25:R24.
51 __divmodhi4_c:
52         com     r23
53         neg     r22
54         sbci    r23, 255
56 __divmodhi4_exit:
57         ret                  ; Return quotient via R23:R22 and remainder via R25:r24.