Statistics
| Branch: | Revision:

root / target-mips / op_helper_mem.c @ 6af0bf9c

History | View | Annotate | Download (3 kB)

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
}