/[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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 13 - (hide 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 dpavlin 12 /*
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