0.7.1-alt1
[qemu] / qemu / target-mips / op_helper_mem.c
1 void glue(do_lwl, MEMSUFFIX) (void)
2 {
3 #if defined (DEBUG_OP)
4     target_ulong sav = T0;
5 #endif
6     uint32_t tmp;
7
8     tmp = glue(ldl, MEMSUFFIX)(T0 & ~3);
9     /* XXX: this is valid only in big-endian mode
10      *      should be reverted for little-endian...
11      */
12     switch (T0 & 3) {
13     case 0:
14         T0 = tmp;
15         break;
16     case 1:
17         T0 = (tmp << 8) | (T1 & 0x000000FF);
18         break;
19     case 2:
20         T0 = (tmp << 16) | (T1 & 0x0000FFFF);
21         break;
22     case 3:
23         T0 = (tmp << 24) | (T1 & 0x00FFFFFF);
24         break;
25     }
26 #if defined (DEBUG_OP)
27     if (logfile) {
28         fprintf(logfile, "%s: %08x - %08x %08x => %08x\n",
29                 __func__, sav, tmp, T1, T0);
30     }
31 #endif
32     RETURN();
33 }
34
35 void glue(do_lwr, MEMSUFFIX) (void)
36 {
37 #if defined (DEBUG_OP)
38     target_ulong sav = T0;
39 #endif
40     uint32_t tmp;
41
42     tmp = glue(ldl, MEMSUFFIX)(T0 & ~3);
43     /* XXX: this is valid only in big-endian mode
44      *      should be reverted for little-endian...
45      */
46     switch (T0 & 3) {
47     case 0:
48         T0 = (tmp >> 24) | (T1 & 0xFFFFFF00);
49         break;
50     case 1:
51         T0 = (tmp >> 16) | (T1 & 0xFFFF0000);
52         break;
53     case 2:
54         T0 = (tmp >> 8) | (T1 & 0xFF000000);
55         break;
56     case 3:
57         T0 = tmp;
58         break;
59     }
60 #if defined (DEBUG_OP)
61     if (logfile) {
62         fprintf(logfile, "%s: %08x - %08x %08x => %08x\n",
63                 __func__, sav, tmp, T1, T0);
64     }
65 #endif
66     RETURN();
67 }
68
69 void glue(do_swl, MEMSUFFIX) (void)
70 {
71 #if defined (DEBUG_OP)
72     target_ulong sav;
73 #endif
74     uint32_t tmp;
75
76     tmp = glue(ldl, MEMSUFFIX)(T0 & ~3);
77 #if defined (DEBUG_OP)
78     sav = tmp;
79 #endif
80     /* XXX: this is valid only in big-endian mode
81      *      should be reverted for little-endian...
82      */
83     switch (T0 & 3) {
84     case 0:
85         tmp = T1;
86         break;
87     case 1:
88         tmp = (tmp & 0xFF000000) | (T1 >> 8);
89         break;
90     case 2:
91         tmp = (tmp & 0xFFFF0000) | (T1 >> 16);
92         break;
93     case 3:
94         tmp = (tmp & 0xFFFFFF00) | (T1 >> 24);
95         break;
96     }
97     glue(stl, MEMSUFFIX)(T0 & ~3, tmp);
98 #if defined (DEBUG_OP)
99     if (logfile) {
100         fprintf(logfile, "%s: %08x - %08x %08x => %08x\n",
101                 __func__, T0, sav, T1, tmp);
102     }
103 #endif
104     RETURN();
105 }
106
107 void glue(do_swr, MEMSUFFIX) (void)
108 {
109 #if defined (DEBUG_OP)
110     target_ulong sav;
111 #endif
112     uint32_t tmp;
113
114     tmp = glue(ldl, MEMSUFFIX)(T0 & ~3);
115 #if defined (DEBUG_OP)
116     sav = tmp;
117 #endif
118     /* XXX: this is valid only in big-endian mode
119      *      should be reverted for little-endian...
120      */
121     switch (T0 & 3) {
122     case 0:
123         tmp = (tmp & 0x00FFFFFF) | (T1 << 24);
124         break;
125     case 1:
126         tmp = (tmp & 0x0000FFFF) | (T1 << 16);
127         break;
128     case 2:
129         tmp = (tmp & 0x000000FF) | (T1 << 8);
130         break;
131     case 3:
132         tmp = T1;
133         break;
134     }
135     glue(stl, MEMSUFFIX)(T0 & ~3, tmp);
136 #if defined (DEBUG_OP)
137     if (logfile) {
138         fprintf(logfile, "%s: %08x - %08x %08x => %08x\n",
139                 __func__, T0, sav, T1, tmp);
140     }
141 #endif
142     RETURN();
143 }