More SCSI commands (Blue Swirl).
[qemu] / target-mips / op_helper_mem.c
1 #ifdef TARGET_WORDS_BIGENDIAN
2 #define GET_LMASK(v) ((v) & 3)
3 #else
4 #define GET_LMASK(v) (((v) & 3) ^ 3)
5 #endif
6
7 void glue(do_lwl, MEMSUFFIX) (uint32_t tmp)
8 {
9 #if defined (DEBUG_OP)
10     target_ulong sav = T0;
11 #endif
12
13     /* XXX: this is valid only in big-endian mode
14      *      should be reverted for little-endian...
15      */
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;
29     }
30 #if defined (DEBUG_OP)
31     if (logfile) {
32         fprintf(logfile, "%s: %08x - %08x %08x => %08x\n",
33                 __func__, sav, tmp, T1, T0);
34     }
35 #endif
36     RETURN();
37 }
38
39 void glue(do_lwr, MEMSUFFIX) (uint32_t tmp)
40 {
41 #if defined (DEBUG_OP)
42     target_ulong sav = T0;
43 #endif
44
45     /* XXX: this is valid only in big-endian mode
46      *      should be reverted for little-endian...
47      */
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;
61     }
62 #if defined (DEBUG_OP)
63     if (logfile) {
64         fprintf(logfile, "%s: %08x - %08x %08x => %08x\n",
65                 __func__, sav, tmp, T1, T0);
66     }
67 #endif
68     RETURN();
69 }
70
71 uint32_t glue(do_swl, MEMSUFFIX) (uint32_t tmp)
72 {
73 #if defined (DEBUG_OP)
74     target_ulong sav;
75 #endif
76
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 (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;
96     }
97 #if defined (DEBUG_OP)
98     if (logfile) {
99         fprintf(logfile, "%s: %08x - %08x %08x => %08x\n",
100                 __func__, T0, sav, T1, tmp);
101     }
102 #endif
103     RETURN();
104     return tmp;
105 }
106
107 uint32_t glue(do_swr, MEMSUFFIX) (uint32_t tmp)
108 {
109 #if defined (DEBUG_OP)
110     target_ulong sav;
111 #endif
112
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...
118      */
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;
132     }
133 #if defined (DEBUG_OP)
134     if (logfile) {
135         fprintf(logfile, "%s: %08x - %08x %08x => %08x\n",
136                 __func__, T0, sav, T1, tmp);
137     }
138 #endif
139     RETURN();
140     return tmp;
141 }