root / target-openrisc / int_helper.c @ 216db403
History | View | Annotate | Download (2.1 kB)
1 | e54a5aff | Jia Liu | /*
|
---|---|---|---|
2 | e54a5aff | Jia Liu | * OpenRISC int helper routines
|
3 | e54a5aff | Jia Liu | *
|
4 | e54a5aff | Jia Liu | * Copyright (c) 2011-2012 Jia Liu <proljc@gmail.com>
|
5 | e54a5aff | Jia Liu | * Feng Gao <gf91597@gmail.com>
|
6 | e54a5aff | Jia Liu | *
|
7 | e54a5aff | Jia Liu | * This library is free software; you can redistribute it and/or
|
8 | e54a5aff | Jia Liu | * modify it under the terms of the GNU Lesser General Public
|
9 | e54a5aff | Jia Liu | * License as published by the Free Software Foundation; either
|
10 | e54a5aff | Jia Liu | * version 2 of the License, or (at your option) any later version.
|
11 | e54a5aff | Jia Liu | *
|
12 | e54a5aff | Jia Liu | * This library is distributed in the hope that it will be useful,
|
13 | e54a5aff | Jia Liu | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14 | e54a5aff | Jia Liu | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
15 | e54a5aff | Jia Liu | * Lesser General Public License for more details.
|
16 | e54a5aff | Jia Liu | *
|
17 | e54a5aff | Jia Liu | * You should have received a copy of the GNU Lesser General Public
|
18 | e54a5aff | Jia Liu | * License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
19 | e54a5aff | Jia Liu | */
|
20 | e54a5aff | Jia Liu | |
21 | e54a5aff | Jia Liu | #include "cpu.h" |
22 | e54a5aff | Jia Liu | #include "helper.h" |
23 | e54a5aff | Jia Liu | #include "exception.h" |
24 | 1de7afc9 | Paolo Bonzini | #include "qemu/host-utils.h" |
25 | e54a5aff | Jia Liu | |
26 | e54a5aff | Jia Liu | target_ulong HELPER(ff1)(target_ulong x) |
27 | e54a5aff | Jia Liu | { |
28 | e54a5aff | Jia Liu | /*#ifdef TARGET_OPENRISC64
|
29 | e54a5aff | Jia Liu | return x ? ctz64(x) + 1 : 0;
|
30 | e54a5aff | Jia Liu | #else*/
|
31 | e54a5aff | Jia Liu | return x ? ctz32(x) + 1 : 0; |
32 | e54a5aff | Jia Liu | /*#endif*/
|
33 | e54a5aff | Jia Liu | } |
34 | e54a5aff | Jia Liu | |
35 | e54a5aff | Jia Liu | target_ulong HELPER(fl1)(target_ulong x) |
36 | e54a5aff | Jia Liu | { |
37 | e54a5aff | Jia Liu | /* not used yet, open it when we need or64. */
|
38 | e54a5aff | Jia Liu | /*#ifdef TARGET_OPENRISC64
|
39 | e54a5aff | Jia Liu | return 64 - clz64(x);
|
40 | e54a5aff | Jia Liu | #else*/
|
41 | e54a5aff | Jia Liu | return 32 - clz32(x); |
42 | e54a5aff | Jia Liu | /*#endif*/
|
43 | e54a5aff | Jia Liu | } |
44 | e54a5aff | Jia Liu | |
45 | e54a5aff | Jia Liu | uint32_t HELPER(mul32)(CPUOpenRISCState *env, |
46 | e54a5aff | Jia Liu | uint32_t ra, uint32_t rb) |
47 | e54a5aff | Jia Liu | { |
48 | e54a5aff | Jia Liu | uint64_t result; |
49 | e54a5aff | Jia Liu | uint32_t high, cy; |
50 | e54a5aff | Jia Liu | |
51 | dd51dc52 | Andreas Färber | OpenRISCCPU *cpu = openrisc_env_get_cpu(env); |
52 | e54a5aff | Jia Liu | |
53 | e54a5aff | Jia Liu | result = (uint64_t)ra * rb; |
54 | e54a5aff | Jia Liu | /* regisiers in or32 is 32bit, so 32 is NOT a magic number.
|
55 | e54a5aff | Jia Liu | or64 is not handled in this function, and not implement yet,
|
56 | e54a5aff | Jia Liu | TARGET_LONG_BITS for or64 is 64, it will break this function,
|
57 | e54a5aff | Jia Liu | so, we didn't use TARGET_LONG_BITS here. */
|
58 | e54a5aff | Jia Liu | high = result >> 32;
|
59 | e54a5aff | Jia Liu | cy = result >> (32 - 1); |
60 | e54a5aff | Jia Liu | |
61 | e54a5aff | Jia Liu | if ((cy & 0x1) == 0x0) { |
62 | e54a5aff | Jia Liu | if (high == 0x0) { |
63 | e54a5aff | Jia Liu | return result;
|
64 | e54a5aff | Jia Liu | } |
65 | e54a5aff | Jia Liu | } |
66 | e54a5aff | Jia Liu | |
67 | e54a5aff | Jia Liu | if ((cy & 0x1) == 0x1) { |
68 | e54a5aff | Jia Liu | if (high == 0xffffffff) { |
69 | e54a5aff | Jia Liu | return result;
|
70 | e54a5aff | Jia Liu | } |
71 | e54a5aff | Jia Liu | } |
72 | e54a5aff | Jia Liu | |
73 | e54a5aff | Jia Liu | cpu->env.sr |= (SR_OV | SR_CY); |
74 | e54a5aff | Jia Liu | if (cpu->env.sr & SR_OVE) {
|
75 | e54a5aff | Jia Liu | raise_exception(cpu, EXCP_RANGE); |
76 | e54a5aff | Jia Liu | } |
77 | e54a5aff | Jia Liu | |
78 | e54a5aff | Jia Liu | return result;
|
79 | e54a5aff | Jia Liu | } |