Statistics
| Branch: | Revision:

root / target-mips / op_helper_mem.c @ 4aa42531

History | View | Annotate | Download (2.9 kB)

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
}