/[gxemul]/upstream/0.3.5/src/cpu_arm_instr_loadstore.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Contents of /upstream/0.3.5/src/cpu_arm_instr_loadstore.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 13 - (show annotations)
Mon Oct 8 16:18:43 2007 UTC (16 years, 8 months ago) by dpavlin
File MIME type: text/plain
File size: 6447 byte(s)
0.3.5
1 /*
2 * Copyright (C) 2005 Anders Gavare. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 *
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * 3. The name of the author may not be used to endorse or promote products
13 * derived from this software without specific prior written permission.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
26 *
27 *
28 * $Id: cpu_arm_instr_loadstore.c,v 1.7 2005/08/16 05:37:10 debug Exp $
29 *
30 *
31 * TODO: Native load/store if the endianness is the same as the host's
32 * (and check for alignment?)
33 */
34
35 #ifdef A__REG
36 void A__NAME__general(struct cpu *cpu, struct arm_instr_call *ic) { }
37 void A__NAME(struct cpu *cpu, struct arm_instr_call *ic)
38 {fatal("TODO: blah...\n");}
39
40
41 #else /* !A__REG */
42
43
44 void A__NAME__general(struct cpu *cpu, struct arm_instr_call *ic)
45 {
46 #ifdef A__B
47 unsigned char data[1];
48 #else
49 unsigned char data[4];
50 #endif
51 uint32_t addr;
52
53 addr = *((uint32_t *)ic->arg[0])
54 #ifdef A__P
55 #ifdef A__U
56 +
57 #else
58 -
59 #endif
60 #ifdef A__FIXINC
61 A__FIXINC;
62 #else
63 ic->arg[1];
64 #endif
65 #endif
66 ;
67
68 #ifdef A__L
69 if (!cpu->memory_rw(cpu, cpu->mem, addr, data, sizeof(data),
70 MEM_READ, CACHE_DATA)) {
71 fatal("load failed: TODO\n");
72 exit(1);
73 }
74 #ifdef A__B
75 *((uint32_t *)ic->arg[2]) = data[0];
76 #else
77 *((uint32_t *)ic->arg[2]) = data[0] + (data[1] << 8) +
78 (data[2] << 16) + (data[3] << 24);
79 #endif
80 #else
81 #ifdef A__B
82 data[0] = *((uint32_t *)ic->arg[2]);
83 #else
84 data[0] = (*((uint32_t *)ic->arg[2]));
85 data[1] = (*((uint32_t *)ic->arg[2])) >> 8;
86 data[2] = (*((uint32_t *)ic->arg[2])) >> 16;
87 data[3] = (*((uint32_t *)ic->arg[2])) >> 24;
88 #endif
89 if (!cpu->memory_rw(cpu, cpu->mem, addr, data, sizeof(data),
90 MEM_WRITE, CACHE_DATA)) {
91 fatal("store failed: TODO\n");
92 exit(1);
93 }
94 #endif
95
96 #ifdef A__P
97 #ifdef A__W
98 *((uint32_t *)ic->arg[0]) = addr;
99 #endif
100 #else /* post-index writeback */
101 *((uint32_t *)ic->arg[0]) = addr
102 #ifdef A__U
103 +
104 #else
105 -
106 #endif
107 #ifdef A__FIXINC
108 A__FIXINC;
109 #else
110 ic->arg[1];
111 #endif
112 #endif
113 }
114
115 void A__NAME(struct cpu *cpu, struct arm_instr_call *ic)
116 {
117 uint32_t addr = *((uint32_t *)ic->arg[0])
118 #ifdef A__P
119 #ifdef A__U
120 +
121 #else
122 -
123 #endif
124 #ifdef A__FIXINC
125 A__FIXINC
126 #else
127 ic->arg[1]
128 #endif
129 #endif
130 ;
131 unsigned char *page = cpu->cd.arm.
132 #ifdef A__L
133 host_load
134 #else
135 host_store
136 #endif
137 [addr >> 12];
138
139 if (page == NULL) {
140 A__NAME__general(cpu, ic);
141 } else {
142 #ifdef A__P
143 #ifdef A__W
144 *((uint32_t *)ic->arg[0]) = addr;
145 #endif
146 #else /* post-index writeback */
147 *((uint32_t *)ic->arg[0]) = addr
148 #ifdef A__U
149 +
150 #else
151 -
152 #endif
153 #ifdef A__FIXINC
154 A__FIXINC;
155 #else
156 ic->arg[1];
157 #endif
158 #endif
159
160 #ifdef A__L
161 #ifdef A__B
162 *((uint32_t *)ic->arg[2]) = page[addr & 4095];
163 #else
164 addr &= 4095;
165 *((uint32_t *)ic->arg[2]) = page[addr] +
166 (page[addr + 1] << 8) +
167 (page[addr + 2] << 16) +
168 (page[addr + 3] << 24);
169 #endif
170 #else
171 #ifdef A__B
172 page[addr & 4095] = *((uint32_t *)ic->arg[2]);
173 #else
174 addr &= 4095;
175 page[addr] = *((uint32_t *)ic->arg[2]);
176 page[addr+1] = (*((uint32_t *)ic->arg[2])) >> 8;
177 page[addr+2] = (*((uint32_t *)ic->arg[2])) >> 16;
178 page[addr+3] = (*((uint32_t *)ic->arg[2])) >> 24;
179 #endif
180 #endif
181 }
182 }
183 #endif
184
185 #ifndef A__NOCONDITIONS
186 void A__NAME__eq(struct cpu *cpu, struct arm_instr_call *ic)
187 { if (cpu->cd.arm.flags & ARM_FLAG_Z) A__NAME(cpu, ic); }
188 void A__NAME__ne(struct cpu *cpu, struct arm_instr_call *ic)
189 { if (!(cpu->cd.arm.flags & ARM_FLAG_Z)) A__NAME(cpu, ic); }
190 void A__NAME__cs(struct cpu *cpu, struct arm_instr_call *ic)
191 { if (cpu->cd.arm.flags & ARM_FLAG_C) A__NAME(cpu, ic); }
192 void A__NAME__cc(struct cpu *cpu, struct arm_instr_call *ic)
193 { if (!(cpu->cd.arm.flags & ARM_FLAG_C)) A__NAME(cpu, ic); }
194 void A__NAME__mi(struct cpu *cpu, struct arm_instr_call *ic)
195 { if (cpu->cd.arm.flags & ARM_FLAG_N) A__NAME(cpu, ic); }
196 void A__NAME__pl(struct cpu *cpu, struct arm_instr_call *ic)
197 { if (!(cpu->cd.arm.flags & ARM_FLAG_N)) A__NAME(cpu, ic); }
198 void A__NAME__vs(struct cpu *cpu, struct arm_instr_call *ic)
199 { if (cpu->cd.arm.flags & ARM_FLAG_V) A__NAME(cpu, ic); }
200 void A__NAME__vc(struct cpu *cpu, struct arm_instr_call *ic)
201 { if (!(cpu->cd.arm.flags & ARM_FLAG_V)) A__NAME(cpu, ic); }
202
203 void A__NAME__hi(struct cpu *cpu, struct arm_instr_call *ic)
204 { if (cpu->cd.arm.flags & ARM_FLAG_C &&
205 !(cpu->cd.arm.flags & ARM_FLAG_Z)) A__NAME(cpu, ic); }
206 void A__NAME__ls(struct cpu *cpu, struct arm_instr_call *ic)
207 { if (cpu->cd.arm.flags & ARM_FLAG_Z &&
208 !(cpu->cd.arm.flags & ARM_FLAG_C)) A__NAME(cpu, ic); }
209 void A__NAME__ge(struct cpu *cpu, struct arm_instr_call *ic)
210 { if (((cpu->cd.arm.flags & ARM_FLAG_N)?1:0) ==
211 ((cpu->cd.arm.flags & ARM_FLAG_V)?1:0)) A__NAME(cpu, ic); }
212 void A__NAME__lt(struct cpu *cpu, struct arm_instr_call *ic)
213 { if (((cpu->cd.arm.flags & ARM_FLAG_N)?1:0) !=
214 ((cpu->cd.arm.flags & ARM_FLAG_V)?1:0)) A__NAME(cpu, ic); }
215 void A__NAME__gt(struct cpu *cpu, struct arm_instr_call *ic)
216 { if (((cpu->cd.arm.flags & ARM_FLAG_N)?1:0) ==
217 ((cpu->cd.arm.flags & ARM_FLAG_V)?1:0) &&
218 !(cpu->cd.arm.flags & ARM_FLAG_Z)) A__NAME(cpu, ic); }
219 void A__NAME__le(struct cpu *cpu, struct arm_instr_call *ic)
220 { if (((cpu->cd.arm.flags & ARM_FLAG_N)?1:0) !=
221 ((cpu->cd.arm.flags & ARM_FLAG_V)?1:0) ||
222 (cpu->cd.arm.flags & ARM_FLAG_Z)) A__NAME(cpu, ic); }
223 #endif

  ViewVC Help
Powered by ViewVC 1.1.26