Fix SCSI off-by-one device size.
[qemu/mini2440.git] / target-mips / op_helper_mem.c
blob4711f7a6cdf0e1c396bc88831def4939ff5aaca2
1 #ifdef TARGET_WORDS_BIGENDIAN
2 #define GET_LMASK(v) ((v) & 3)
3 #else
4 #define GET_LMASK(v) (((v) & 3) ^ 3)
5 #endif
7 void glue(do_lwl, MEMSUFFIX) (uint32_t tmp)
9 #if defined (DEBUG_OP)
10 target_ulong sav = T0;
11 #endif
13 /* XXX: this is valid only in big-endian mode
14 * should be reverted for little-endian...
16 switch (GET_LMASK(T0)) {
17 case 0:
18 T0 = tmp;
19 break;
20 case 1:
21 T0 = (tmp << 8) | (T1 & 0x000000FF);
22 break;
23 case 2:
24 T0 = (tmp << 16) | (T1 & 0x0000FFFF);
25 break;
26 case 3:
27 T0 = (tmp << 24) | (T1 & 0x00FFFFFF);
28 break;
30 #if defined (DEBUG_OP)
31 if (logfile) {
32 fprintf(logfile, "%s: %08x - %08x %08x => %08x\n",
33 __func__, sav, tmp, T1, T0);
35 #endif
36 RETURN();
39 void glue(do_lwr, MEMSUFFIX) (uint32_t tmp)
41 #if defined (DEBUG_OP)
42 target_ulong sav = T0;
43 #endif
45 /* XXX: this is valid only in big-endian mode
46 * should be reverted for little-endian...
48 switch (GET_LMASK(T0)) {
49 case 0:
50 T0 = (tmp >> 24) | (T1 & 0xFFFFFF00);
51 break;
52 case 1:
53 T0 = (tmp >> 16) | (T1 & 0xFFFF0000);
54 break;
55 case 2:
56 T0 = (tmp >> 8) | (T1 & 0xFF000000);
57 break;
58 case 3:
59 T0 = tmp;
60 break;
62 #if defined (DEBUG_OP)
63 if (logfile) {
64 fprintf(logfile, "%s: %08x - %08x %08x => %08x\n",
65 __func__, sav, tmp, T1, T0);
67 #endif
68 RETURN();
71 uint32_t glue(do_swl, MEMSUFFIX) (uint32_t tmp)
73 #if defined (DEBUG_OP)
74 target_ulong sav;
75 #endif
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...
83 switch (GET_LMASK(T0)) {
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;
97 #if defined (DEBUG_OP)
98 if (logfile) {
99 fprintf(logfile, "%s: %08x - %08x %08x => %08x\n",
100 __func__, T0, sav, T1, tmp);
102 #endif
103 RETURN();
104 return tmp;
107 uint32_t glue(do_swr, MEMSUFFIX) (uint32_t tmp)
109 #if defined (DEBUG_OP)
110 target_ulong sav;
111 #endif
113 #if defined (DEBUG_OP)
114 sav = tmp;
115 #endif
116 /* XXX: this is valid only in big-endian mode
117 * should be reverted for little-endian...
119 switch (GET_LMASK(T0)) {
120 case 0:
121 tmp = (tmp & 0x00FFFFFF) | (T1 << 24);
122 break;
123 case 1:
124 tmp = (tmp & 0x0000FFFF) | (T1 << 16);
125 break;
126 case 2:
127 tmp = (tmp & 0x000000FF) | (T1 << 8);
128 break;
129 case 3:
130 tmp = T1;
131 break;
133 #if defined (DEBUG_OP)
134 if (logfile) {
135 fprintf(logfile, "%s: %08x - %08x %08x => %08x\n",
136 __func__, T0, sav, T1, tmp);
138 #endif
139 RETURN();
140 return tmp;