|
|
1.1 root 1: /*
2: * PowerPC emulation micro-operations for qemu.
3: *
4: * Copyright (c) 2003-2005 Jocelyn Mayer
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, write to the Free Software
18: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19: */
20:
21: /* General purpose registers moves */
22: void OPPROTO glue(op_load_gpr_T0_gpr, REG)(void)
23: {
24: T0 = regs->gpr[REG];
25: RETURN();
26: }
27:
28: void OPPROTO glue(op_load_gpr_T1_gpr, REG)(void)
29: {
30: T1 = regs->gpr[REG];
31: RETURN();
32: }
33:
34: void OPPROTO glue(op_load_gpr_T2_gpr, REG)(void)
35: {
36: T2 = regs->gpr[REG];
37: RETURN();
38: }
39:
40: void OPPROTO glue(op_store_T0_gpr_gpr, REG)(void)
41: {
42: regs->gpr[REG] = T0;
43: RETURN();
44: }
45:
46: void OPPROTO glue(op_store_T1_gpr_gpr, REG)(void)
47: {
48: regs->gpr[REG] = T1;
49: RETURN();
50: }
51:
52: void OPPROTO glue(op_store_T2_gpr_gpr, REG)(void)
53: {
54: regs->gpr[REG] = T2;
55: RETURN();
56: }
57:
58: #if REG <= 7
59: /* Condition register moves */
60: void OPPROTO glue(op_load_crf_T0_crf, REG)(void)
61: {
62: T0 = regs->crf[REG];
63: RETURN();
64: }
65:
66: void OPPROTO glue(op_load_crf_T1_crf, REG)(void)
67: {
68: T1 = regs->crf[REG];
69: RETURN();
70: }
71:
72: void OPPROTO glue(op_store_T0_crf_crf, REG)(void)
73: {
74: regs->crf[REG] = T0;
75: RETURN();
76: }
77:
78: void OPPROTO glue(op_store_T1_crf_crf, REG)(void)
79: {
80: regs->crf[REG] = T1;
81: RETURN();
82: }
83:
84: /* Floating point condition and status register moves */
85: void OPPROTO glue(op_load_fpscr_T0_fpscr, REG)(void)
86: {
87: T0 = regs->fpscr[REG];
88: RETURN();
89: }
90:
91: #if REG == 0
92: void OPPROTO glue(op_store_T0_fpscr_fpscr, REG)(void)
93: {
94: regs->fpscr[REG] = (regs->fpscr[REG] & 0x9) | (T0 & ~0x9);
95: RETURN();
96: }
97:
98: void OPPROTO glue(op_store_T0_fpscri_fpscr, REG)(void)
99: {
100: regs->fpscr[REG] = (regs->fpscr[REG] & ~0x9) | (PARAM(1) & 0x9);
101: RETURN();
102: }
103:
104: void OPPROTO glue(op_clear_fpscr_fpscr, REG)(void)
105: {
106: regs->fpscr[REG] = (regs->fpscr[REG] & 0x9);
107: RETURN();
108: }
109: #else
110: void OPPROTO glue(op_store_T0_fpscr_fpscr, REG)(void)
111: {
112: regs->fpscr[REG] = T0;
113: RETURN();
114: }
115:
116: void OPPROTO glue(op_store_T0_fpscri_fpscr, REG)(void)
117: {
118: regs->fpscr[REG] = PARAM(1);
119: RETURN();
120: }
121:
122: void OPPROTO glue(op_clear_fpscr_fpscr, REG)(void)
123: {
124: regs->fpscr[REG] = 0x0;
125: RETURN();
126: }
127: #endif
128:
129: #endif /* REG <= 7 */
130:
131: /* floating point registers moves */
132: void OPPROTO glue(op_load_fpr_FT0_fpr, REG)(void)
133: {
134: FT0 = env->fpr[REG];
135: RETURN();
136: }
137:
138: void OPPROTO glue(op_store_FT0_fpr_fpr, REG)(void)
139: {
140: env->fpr[REG] = FT0;
141: RETURN();
142: }
143:
144: void OPPROTO glue(op_load_fpr_FT1_fpr, REG)(void)
145: {
146: FT1 = env->fpr[REG];
147: RETURN();
148: }
149:
150: void OPPROTO glue(op_store_FT1_fpr_fpr, REG)(void)
151: {
152: env->fpr[REG] = FT1;
153: RETURN();
154: }
155:
156: void OPPROTO glue(op_load_fpr_FT2_fpr, REG)(void)
157: {
158: FT2 = env->fpr[REG];
159: RETURN();
160: }
161:
162: void OPPROTO glue(op_store_FT2_fpr_fpr, REG)(void)
163: {
164: env->fpr[REG] = FT2;
165: RETURN();
166: }
167:
168: #if REG <= 15
169: /* Segment register moves */
170: void OPPROTO glue(op_load_sr, REG)(void)
171: {
172: T0 = env->sr[REG];
173: RETURN();
174: }
175:
176: void OPPROTO glue(op_store_sr, REG)(void)
177: {
178: do_store_sr(env, REG, T0);
179: RETURN();
180: }
181: #endif
182:
183: #undef REG
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.