root / target-arm / helper-a64.c @ 82e14b02
History | View | Annotate | Download (1.8 kB)
1 |
/*
|
---|---|
2 |
* AArch64 specific helpers
|
3 |
*
|
4 |
* Copyright (c) 2013 Alexander Graf <agraf@suse.de>
|
5 |
*
|
6 |
* This library is free software; you can redistribute it and/or
|
7 |
* modify it under the terms of the GNU Lesser General Public
|
8 |
* License as published by the Free Software Foundation; either
|
9 |
* version 2 of the License, or (at your option) any later version.
|
10 |
*
|
11 |
* This library is distributed in the hope that it will be useful,
|
12 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
14 |
* Lesser General Public License for more details.
|
15 |
*
|
16 |
* You should have received a copy of the GNU Lesser General Public
|
17 |
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
18 |
*/
|
19 |
|
20 |
#include "cpu.h" |
21 |
#include "exec/gdbstub.h" |
22 |
#include "helper.h" |
23 |
#include "qemu/host-utils.h" |
24 |
#include "sysemu/sysemu.h" |
25 |
#include "qemu/bitops.h" |
26 |
|
27 |
/* C2.4.7 Multiply and divide */
|
28 |
/* special cases for 0 and LLONG_MIN are mandated by the standard */
|
29 |
uint64_t HELPER(udiv64)(uint64_t num, uint64_t den) |
30 |
{ |
31 |
if (den == 0) { |
32 |
return 0; |
33 |
} |
34 |
return num / den;
|
35 |
} |
36 |
|
37 |
int64_t HELPER(sdiv64)(int64_t num, int64_t den) |
38 |
{ |
39 |
if (den == 0) { |
40 |
return 0; |
41 |
} |
42 |
if (num == LLONG_MIN && den == -1) { |
43 |
return LLONG_MIN;
|
44 |
} |
45 |
return num / den;
|
46 |
} |
47 |
|
48 |
uint64_t HELPER(clz64)(uint64_t x) |
49 |
{ |
50 |
return clz64(x);
|
51 |
} |
52 |
|
53 |
uint64_t HELPER(rbit64)(uint64_t x) |
54 |
{ |
55 |
/* assign the correct byte position */
|
56 |
x = bswap64(x); |
57 |
|
58 |
/* assign the correct nibble position */
|
59 |
x = ((x & 0xf0f0f0f0f0f0f0f0ULL) >> 4) |
60 |
| ((x & 0x0f0f0f0f0f0f0f0fULL) << 4); |
61 |
|
62 |
/* assign the correct bit position */
|
63 |
x = ((x & 0x8888888888888888ULL) >> 3) |
64 |
| ((x & 0x4444444444444444ULL) >> 1) |
65 |
| ((x & 0x2222222222222222ULL) << 1) |
66 |
| ((x & 0x1111111111111111ULL) << 3); |
67 |
|
68 |
return x;
|
69 |
} |