source: mainline/uspace/lib/softint/generic/shift.c@ 8348846

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 8348846 was 8348846, checked in by Jiří Zárevúcky <zarevucky.jiri@…>, 7 years ago

Fix symbols in libsoftint.

  • Property mode set to 100644
File size: 3.4 KB
Line 
1/*
2 * Copyright (c) 2011 Petr Koupy
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/** @addtogroup softint
30 * @{
31 */
32/**
33 * @file Logical and arithmetic shifts.
34 */
35
36#include <alias.h>
37#include <shift.h>
38#include <lltype.h>
39
40long long __ashlti3 (long long val, int shift)
41{
42 union lltype ll;
43
44 ll.s_whole = val;
45
46 if (shift <= 0) {
47 return ll.s_whole;
48 }
49
50 if (shift >= (int) WHOLE_BIT_CNT) {
51 ll.u_half[HI] = 0;
52 ll.u_half[LO] = 0;
53 return ll.s_whole;
54 }
55
56 if (shift >= (int) HALF_BIT_CNT) {
57 ll.u_half[HI] = ll.u_half[LO] << (shift - HALF_BIT_CNT);
58 ll.u_half[LO] = 0;
59 } else {
60 ll.u_half[HI] <<= shift;
61 ll.u_half[HI] |= ll.u_half[LO] >> (HALF_BIT_CNT - shift);
62 ll.u_half[LO] <<= shift;
63 }
64
65 return ll.s_whole;
66}
67
68long long __ashrti3 (long long val, int shift)
69{
70 union lltype ll;
71
72 ll.s_whole = val;
73
74 if (shift <= 0) {
75 return ll.s_whole;
76 }
77
78 long fill = ll.s_half[HI] >> (HALF_BIT_CNT - 1);
79
80 if (shift >= (int) WHOLE_BIT_CNT) {
81 ll.s_half[HI] = fill;
82 ll.s_half[LO] = fill;
83 return ll.s_whole;
84 }
85
86 if (shift >= (int) HALF_BIT_CNT) {
87 ll.s_half[LO] = ll.s_half[HI] >> (shift - HALF_BIT_CNT);
88 ll.s_half[HI] = fill;
89 } else {
90 ll.u_half[LO] >>= shift;
91 ll.u_half[LO] |= ll.u_half[HI] << (HALF_BIT_CNT - shift);
92 ll.s_half[HI] >>= shift;
93 }
94
95 return ll.s_whole;
96}
97
98long long __lshrti3 (long long val, int shift)
99{
100 union lltype ll;
101
102 ll.s_whole = val;
103
104 if (shift <= 0) {
105 return ll.s_whole;
106 }
107
108 if (shift >= (int) WHOLE_BIT_CNT) {
109 ll.u_half[HI] = 0;
110 ll.u_half[LO] = 0;
111 return ll.s_whole;
112 }
113
114 if (shift >= (int) HALF_BIT_CNT) {
115 ll.u_half[LO] = ll.u_half[HI] >> (shift - HALF_BIT_CNT);
116 ll.u_half[HI] = 0;
117 } else {
118 ll.u_half[LO] >>= shift;
119 ll.u_half[LO] |= ll.u_half[HI] << (HALF_BIT_CNT - shift);
120 ll.u_half[HI] >>= shift;
121 }
122
123 return ll.s_whole;
124}
125
126long long __aeabi_llsl(long long val, int shift)
127{
128 return __ashldi3(val, shift);
129}
130
131long long __aeabi_llsr(long long val, int shift)
132{
133 return __lshrdi3(val, shift);
134}
135
136#if LONG_MAX == LLONG_MAX
137long ALIAS(__ashl, i3);
138long ALIAS(__ashr, i3);
139long ALIAS(__lshr, i3);
140#endif
141
142/** @}
143 */
Note: See TracBrowser for help on using the repository browser.