root / target-mips / op_mem.c @ cd7dd10f
History | View | Annotate | Download (2.7 kB)
1 | 6af0bf9c | bellard | /*
|
---|---|---|---|
2 | 6af0bf9c | bellard | * MIPS emulation memory micro-operations for qemu.
|
3 | 6af0bf9c | bellard | *
|
4 | 6af0bf9c | bellard | * Copyright (c) 2004-2005 Jocelyn Mayer
|
5 | 6af0bf9c | bellard | *
|
6 | 6af0bf9c | bellard | * This library is free software; you can redistribute it and/or
|
7 | 6af0bf9c | bellard | * modify it under the terms of the GNU Lesser General Public
|
8 | 6af0bf9c | bellard | * License as published by the Free Software Foundation; either
|
9 | 6af0bf9c | bellard | * version 2 of the License, or (at your option) any later version.
|
10 | 6af0bf9c | bellard | *
|
11 | 6af0bf9c | bellard | * This library is distributed in the hope that it will be useful,
|
12 | 6af0bf9c | bellard | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13 | 6af0bf9c | bellard | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
14 | 6af0bf9c | bellard | * Lesser General Public License for more details.
|
15 | 6af0bf9c | bellard | *
|
16 | 6af0bf9c | bellard | * You should have received a copy of the GNU Lesser General Public
|
17 | 6af0bf9c | bellard | * License along with this library; if not, write to the Free Software
|
18 | 6af0bf9c | bellard | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
19 | 6af0bf9c | bellard | */
|
20 | 6af0bf9c | bellard | |
21 | 6af0bf9c | bellard | /* Standard loads and stores */
|
22 | 6af0bf9c | bellard | void glue(op_lb, MEMSUFFIX) (void) |
23 | 6af0bf9c | bellard | { |
24 | 6af0bf9c | bellard | T0 = glue(ldsb, MEMSUFFIX)(T0); |
25 | 6af0bf9c | bellard | RETURN(); |
26 | 6af0bf9c | bellard | } |
27 | 6af0bf9c | bellard | |
28 | 6af0bf9c | bellard | void glue(op_lbu, MEMSUFFIX) (void) |
29 | 6af0bf9c | bellard | { |
30 | 6af0bf9c | bellard | T0 = glue(ldub, MEMSUFFIX)(T0); |
31 | 6af0bf9c | bellard | RETURN(); |
32 | 6af0bf9c | bellard | } |
33 | 6af0bf9c | bellard | |
34 | 6af0bf9c | bellard | void glue(op_sb, MEMSUFFIX) (void) |
35 | 6af0bf9c | bellard | { |
36 | 6af0bf9c | bellard | glue(stb, MEMSUFFIX)(T0, T1); |
37 | 6af0bf9c | bellard | RETURN(); |
38 | 6af0bf9c | bellard | } |
39 | 6af0bf9c | bellard | |
40 | 6af0bf9c | bellard | void glue(op_lh, MEMSUFFIX) (void) |
41 | 6af0bf9c | bellard | { |
42 | 6af0bf9c | bellard | T0 = glue(ldsw, MEMSUFFIX)(T0); |
43 | 6af0bf9c | bellard | RETURN(); |
44 | 6af0bf9c | bellard | } |
45 | 6af0bf9c | bellard | |
46 | 6af0bf9c | bellard | void glue(op_lhu, MEMSUFFIX) (void) |
47 | 6af0bf9c | bellard | { |
48 | 6af0bf9c | bellard | T0 = glue(lduw, MEMSUFFIX)(T0); |
49 | 6af0bf9c | bellard | RETURN(); |
50 | 6af0bf9c | bellard | } |
51 | 6af0bf9c | bellard | |
52 | 6af0bf9c | bellard | void glue(op_sh, MEMSUFFIX) (void) |
53 | 6af0bf9c | bellard | { |
54 | 6af0bf9c | bellard | glue(stw, MEMSUFFIX)(T0, T1); |
55 | 6af0bf9c | bellard | RETURN(); |
56 | 6af0bf9c | bellard | } |
57 | 6af0bf9c | bellard | |
58 | 6af0bf9c | bellard | void glue(op_lw, MEMSUFFIX) (void) |
59 | 6af0bf9c | bellard | { |
60 | 6af0bf9c | bellard | T0 = glue(ldl, MEMSUFFIX)(T0); |
61 | 6af0bf9c | bellard | RETURN(); |
62 | 6af0bf9c | bellard | } |
63 | 6af0bf9c | bellard | |
64 | 6af0bf9c | bellard | void glue(op_sw, MEMSUFFIX) (void) |
65 | 6af0bf9c | bellard | { |
66 | 6af0bf9c | bellard | glue(stl, MEMSUFFIX)(T0, T1); |
67 | 6af0bf9c | bellard | RETURN(); |
68 | 6af0bf9c | bellard | } |
69 | 6af0bf9c | bellard | |
70 | 4ad40f36 | bellard | /* "half" load and stores. We must do the memory access inline,
|
71 | 4ad40f36 | bellard | or fault handling won't work. */
|
72 | 6af0bf9c | bellard | void glue(op_lwl, MEMSUFFIX) (void) |
73 | 6af0bf9c | bellard | { |
74 | 4ad40f36 | bellard | uint32_t tmp = glue(ldl, MEMSUFFIX)(T0 & ~3);
|
75 | 4ad40f36 | bellard | CALL_FROM_TB1(glue(do_lwl, MEMSUFFIX), tmp); |
76 | 6af0bf9c | bellard | RETURN(); |
77 | 6af0bf9c | bellard | } |
78 | 6af0bf9c | bellard | |
79 | 6af0bf9c | bellard | void glue(op_lwr, MEMSUFFIX) (void) |
80 | 6af0bf9c | bellard | { |
81 | 4ad40f36 | bellard | uint32_t tmp = glue(ldl, MEMSUFFIX)(T0 & ~3);
|
82 | 4ad40f36 | bellard | CALL_FROM_TB1(glue(do_lwr, MEMSUFFIX), tmp); |
83 | 6af0bf9c | bellard | RETURN(); |
84 | 6af0bf9c | bellard | } |
85 | 6af0bf9c | bellard | |
86 | 6af0bf9c | bellard | void glue(op_swl, MEMSUFFIX) (void) |
87 | 6af0bf9c | bellard | { |
88 | 4ad40f36 | bellard | uint32_t tmp = glue(ldl, MEMSUFFIX)(T0 & ~3);
|
89 | 4ad40f36 | bellard | tmp = CALL_FROM_TB1(glue(do_swl, MEMSUFFIX), tmp); |
90 | 4ad40f36 | bellard | glue(stl, MEMSUFFIX)(T0 & ~3, tmp);
|
91 | 6af0bf9c | bellard | RETURN(); |
92 | 6af0bf9c | bellard | } |
93 | 6af0bf9c | bellard | |
94 | 6af0bf9c | bellard | void glue(op_swr, MEMSUFFIX) (void) |
95 | 6af0bf9c | bellard | { |
96 | 4ad40f36 | bellard | uint32_t tmp = glue(ldl, MEMSUFFIX)(T0 & ~3);
|
97 | 4ad40f36 | bellard | tmp = CALL_FROM_TB1(glue(do_swr, MEMSUFFIX), tmp); |
98 | 4ad40f36 | bellard | glue(stl, MEMSUFFIX)(T0 & ~3, tmp);
|
99 | 6af0bf9c | bellard | RETURN(); |
100 | 6af0bf9c | bellard | } |
101 | 6af0bf9c | bellard | |
102 | 6af0bf9c | bellard | void glue(op_ll, MEMSUFFIX) (void) |
103 | 6af0bf9c | bellard | { |
104 | 6af0bf9c | bellard | T1 = T0; |
105 | 6af0bf9c | bellard | T0 = glue(ldl, MEMSUFFIX)(T0); |
106 | 6af0bf9c | bellard | env->CP0_LLAddr = T1; |
107 | 6af0bf9c | bellard | RETURN(); |
108 | 6af0bf9c | bellard | } |
109 | 6af0bf9c | bellard | |
110 | 6af0bf9c | bellard | void glue(op_sc, MEMSUFFIX) (void) |
111 | 6af0bf9c | bellard | { |
112 | 6af0bf9c | bellard | CALL_FROM_TB0(dump_sc); |
113 | 6af0bf9c | bellard | if (T0 == env->CP0_LLAddr) {
|
114 | 6af0bf9c | bellard | glue(stl, MEMSUFFIX)(T0, T1); |
115 | 6af0bf9c | bellard | T0 = 1;
|
116 | 6af0bf9c | bellard | } else {
|
117 | 6af0bf9c | bellard | T0 = 0;
|
118 | 6af0bf9c | bellard | } |
119 | 6af0bf9c | bellard | RETURN(); |
120 | 6af0bf9c | bellard | } |