Annotation of qemu/target-ppc/op_mem.h, revision 1.1.1.1

1.1       root        1: /* External helpers */
                      2: void glue(do_lsw, MEMSUFFIX) (int dst);
                      3: void glue(do_stsw, MEMSUFFIX) (int src);
                      4: 
                      5: static inline uint16_t glue(ld16r, MEMSUFFIX) (target_ulong EA)
                      6: {
                      7:     uint16_t tmp = glue(lduw, MEMSUFFIX)(EA);
                      8:     return ((tmp & 0xFF00) >> 8) | ((tmp & 0x00FF) << 8);
                      9: }
                     10: 
                     11: static inline int32_t glue(ld16rs, MEMSUFFIX) (target_ulong EA)
                     12: {
                     13:     int16_t tmp = glue(lduw, MEMSUFFIX)(EA);
                     14:     return ((tmp & 0xFF00) >> 8) | ((tmp & 0x00FF) << 8);
                     15: }
                     16: 
                     17: static inline uint32_t glue(ld32r, MEMSUFFIX) (target_ulong EA)
                     18: {
                     19:     uint32_t tmp = glue(ldl, MEMSUFFIX)(EA);
                     20:     return ((tmp & 0xFF000000) >> 24) | ((tmp & 0x00FF0000) >> 8) |
                     21:         ((tmp & 0x0000FF00) << 8) | ((tmp & 0x000000FF) << 24);
                     22: }
                     23: 
                     24: static inline void glue(st16r, MEMSUFFIX) (target_ulong EA, uint16_t data)
                     25: {
                     26:     uint16_t tmp = ((data & 0xFF00) >> 8) | ((data & 0x00FF) << 8);
                     27:     glue(stw, MEMSUFFIX)(EA, tmp);
                     28: }
                     29: 
                     30: static inline void glue(st32r, MEMSUFFIX) (target_ulong EA, uint32_t data)
                     31: {
                     32:     uint32_t tmp = ((data & 0xFF000000) >> 24) | ((data & 0x00FF0000) >> 8) |
                     33:         ((data & 0x0000FF00) << 8) | ((data & 0x000000FF) << 24);
                     34:     glue(stl, MEMSUFFIX)(EA, tmp);
                     35: }
                     36: 
                     37: /***                             Integer load                              ***/
                     38: #define PPC_LD_OP(name, op)                                                   \
                     39: PPC_OP(glue(glue(l, name), MEMSUFFIX))                                        \
                     40: {                                                                             \
                     41:     T1 = glue(op, MEMSUFFIX)(T0);                                             \
                     42:     RETURN();                                                                 \
                     43: }
                     44: 
                     45: #define PPC_ST_OP(name, op)                                                   \
                     46: PPC_OP(glue(glue(st, name), MEMSUFFIX))                                       \
                     47: {                                                                             \
                     48:     glue(op, MEMSUFFIX)(T0, T1);                                              \
                     49:     RETURN();                                                                 \
                     50: }
                     51: 
                     52: PPC_LD_OP(bz, ldub);
                     53: PPC_LD_OP(ha, ldsw);
                     54: PPC_LD_OP(hz, lduw);
                     55: PPC_LD_OP(wz, ldl);
                     56: 
                     57: PPC_LD_OP(ha_le, ld16rs);
                     58: PPC_LD_OP(hz_le, ld16r);
                     59: PPC_LD_OP(wz_le, ld32r);
                     60: 
                     61: /***                              Integer store                            ***/
                     62: PPC_ST_OP(b, stb);
                     63: PPC_ST_OP(h, stw);
                     64: PPC_ST_OP(w, stl);
                     65: 
                     66: PPC_ST_OP(h_le, st16r);
                     67: PPC_ST_OP(w_le, st32r);
                     68: 
                     69: /***                Integer load and store with byte reverse               ***/
                     70: PPC_LD_OP(hbr, ld16r);
                     71: PPC_LD_OP(wbr, ld32r);
                     72: PPC_ST_OP(hbr, st16r);
                     73: PPC_ST_OP(wbr, st32r);
                     74: 
                     75: PPC_LD_OP(hbr_le, lduw);
                     76: PPC_LD_OP(wbr_le, ldl);
                     77: PPC_ST_OP(hbr_le, stw);
                     78: PPC_ST_OP(wbr_le, stl);
                     79: 
                     80: /***                    Integer load and store multiple                    ***/
                     81: PPC_OP(glue(lmw, MEMSUFFIX))
                     82: {
                     83:     int dst = PARAM(1);
                     84: 
                     85:     for (; dst < 32; dst++, T0 += 4) {
                     86:         ugpr(dst) = glue(ldl, MEMSUFFIX)(T0);
                     87:     }
                     88:     RETURN();
                     89: }
                     90: 
                     91: PPC_OP(glue(stmw, MEMSUFFIX))
                     92: {
                     93:     int src = PARAM(1);
                     94: 
                     95:     for (; src < 32; src++, T0 += 4) {
                     96:         glue(stl, MEMSUFFIX)(T0, ugpr(src));
                     97:     }
                     98:     RETURN();
                     99: }
                    100: 
                    101: PPC_OP(glue(lmw_le, MEMSUFFIX))
                    102: {
                    103:     int dst = PARAM(1);
                    104: 
                    105:     for (; dst < 32; dst++, T0 += 4) {
                    106:         ugpr(dst) = glue(ld32r, MEMSUFFIX)(T0);
                    107:     }
                    108:     RETURN();
                    109: }
                    110: 
                    111: PPC_OP(glue(stmw_le, MEMSUFFIX))
                    112: {
                    113:     int src = PARAM(1);
                    114: 
                    115:     for (; src < 32; src++, T0 += 4) {
                    116:         glue(st32r, MEMSUFFIX)(T0, ugpr(src));
                    117:     }
                    118:     RETURN();
                    119: }
                    120: 
                    121: /***                    Integer load and store strings                     ***/
                    122: PPC_OP(glue(lswi, MEMSUFFIX))
                    123: {
                    124:     glue(do_lsw, MEMSUFFIX)(PARAM(1));
                    125:     RETURN();
                    126: }
                    127: 
                    128: void glue(do_lsw_le, MEMSUFFIX) (int dst);
                    129: PPC_OP(glue(lswi_le, MEMSUFFIX))
                    130: {
                    131:     glue(do_lsw_le, MEMSUFFIX)(PARAM(1));
                    132:     RETURN();
                    133: }
                    134: 
                    135: /* PPC32 specification says we must generate an exception if
                    136:  * rA is in the range of registers to be loaded.
                    137:  * In an other hand, IBM says this is valid, but rA won't be loaded.
                    138:  * For now, I'll follow the spec...
                    139:  */
                    140: PPC_OP(glue(lswx, MEMSUFFIX))
                    141: {
                    142:     if (T1 > 0) {
                    143:         if ((PARAM(1) < PARAM(2) && (PARAM(1) + T1) > PARAM(2)) ||
                    144:             (PARAM(1) < PARAM(3) && (PARAM(1) + T1) > PARAM(3))) {
                    145:             do_raise_exception_err(EXCP_PROGRAM, EXCP_INVAL | EXCP_INVAL_LSWX);
                    146:         } else {
                    147:             glue(do_lsw, MEMSUFFIX)(PARAM(1));
                    148:         }
                    149:     }
                    150:     RETURN();
                    151: }
                    152: 
                    153: PPC_OP(glue(lswx_le, MEMSUFFIX))
                    154: {
                    155:     if (T1 > 0) {
                    156:         if ((PARAM(1) < PARAM(2) && (PARAM(1) + T1) > PARAM(2)) ||
                    157:             (PARAM(1) < PARAM(3) && (PARAM(1) + T1) > PARAM(3))) {
                    158:             do_raise_exception_err(EXCP_PROGRAM, EXCP_INVAL | EXCP_INVAL_LSWX);
                    159:         } else {
                    160:             glue(do_lsw_le, MEMSUFFIX)(PARAM(1));
                    161:         }
                    162:     }
                    163:     RETURN();
                    164: }
                    165: 
                    166: PPC_OP(glue(stsw, MEMSUFFIX))
                    167: {
                    168:     glue(do_stsw, MEMSUFFIX)(PARAM(1));
                    169:     RETURN();
                    170: }
                    171: 
                    172: void glue(do_stsw_le, MEMSUFFIX) (int src);
                    173: PPC_OP(glue(stsw_le, MEMSUFFIX))
                    174: {
                    175:     glue(do_stsw_le, MEMSUFFIX)(PARAM(1));
                    176:     RETURN();
                    177: }
                    178: 
                    179: /***                         Floating-point store                          ***/
                    180: #define PPC_STF_OP(name, op)                                                  \
                    181: PPC_OP(glue(glue(st, name), MEMSUFFIX))                                       \
                    182: {                                                                             \
                    183:     glue(op, MEMSUFFIX)(T0, FT1);                                     \
                    184:     RETURN();                                                                 \
                    185: }
                    186: 
                    187: PPC_STF_OP(fd, stfq);
                    188: PPC_STF_OP(fs, stfl);
                    189: 
                    190: static inline void glue(stfqr, MEMSUFFIX) (target_ulong EA, double d)
                    191: {
                    192:     union {
                    193:         double d;
                    194:         uint64_t u;
                    195:     } u;
                    196: 
                    197:     u.d = d;
                    198:     u.u = ((u.u & 0xFF00000000000000ULL) >> 56) |
                    199:         ((u.u & 0x00FF000000000000ULL) >> 40) |
                    200:         ((u.u & 0x0000FF0000000000ULL) >> 24) |
                    201:         ((u.u & 0x000000FF00000000ULL) >> 8) |
                    202:         ((u.u & 0x00000000FF000000ULL) << 8) |
                    203:         ((u.u & 0x0000000000FF0000ULL) << 24) |
                    204:         ((u.u & 0x000000000000FF00ULL) << 40) |
                    205:         ((u.u & 0x00000000000000FFULL) << 56);
                    206:     glue(stfq, MEMSUFFIX)(EA, u.d);
                    207: }
                    208: 
                    209: static inline void glue(stflr, MEMSUFFIX) (target_ulong EA, float f)
                    210: {
                    211:     union {
                    212:         float f;
                    213:         uint32_t u;
                    214:     } u;
                    215: 
                    216:     u.f = f;
                    217:     u.u = ((u.u & 0xFF000000UL) >> 24) |
                    218:         ((u.u & 0x00FF0000ULL) >> 8) |
                    219:         ((u.u & 0x0000FF00UL) << 8) |
                    220:         ((u.u & 0x000000FFULL) << 24);
                    221:     glue(stfl, MEMSUFFIX)(EA, u.f);
                    222: }
                    223: 
                    224: PPC_STF_OP(fd_le, stfqr);
                    225: PPC_STF_OP(fs_le, stflr);
                    226: 
                    227: /***                         Floating-point load                           ***/
                    228: #define PPC_LDF_OP(name, op)                                                  \
                    229: PPC_OP(glue(glue(l, name), MEMSUFFIX))                                        \
                    230: {                                                                             \
                    231:     FT1 = glue(op, MEMSUFFIX)(T0);                                    \
                    232:     RETURN();                                                                 \
                    233: }
                    234: 
                    235: PPC_LDF_OP(fd, ldfq);
                    236: PPC_LDF_OP(fs, ldfl);
                    237: 
                    238: static inline double glue(ldfqr, MEMSUFFIX) (target_ulong EA)
                    239: {
                    240:     union {
                    241:         double d;
                    242:         uint64_t u;
                    243:     } u;
                    244: 
                    245:     u.d = glue(ldfq, MEMSUFFIX)(EA);
                    246:     u.u = ((u.u & 0xFF00000000000000ULL) >> 56) |
                    247:         ((u.u & 0x00FF000000000000ULL) >> 40) |
                    248:         ((u.u & 0x0000FF0000000000ULL) >> 24) |
                    249:         ((u.u & 0x000000FF00000000ULL) >> 8) |
                    250:         ((u.u & 0x00000000FF000000ULL) << 8) |
                    251:         ((u.u & 0x0000000000FF0000ULL) << 24) |
                    252:         ((u.u & 0x000000000000FF00ULL) << 40) |
                    253:         ((u.u & 0x00000000000000FFULL) << 56);
                    254: 
                    255:     return u.d;
                    256: }
                    257: 
                    258: static inline float glue(ldflr, MEMSUFFIX) (target_ulong EA)
                    259: {
                    260:     union {
                    261:         float f;
                    262:         uint32_t u;
                    263:     } u;
                    264: 
                    265:     u.f = glue(ldfl, MEMSUFFIX)(EA);
                    266:     u.u = ((u.u & 0xFF000000UL) >> 24) |
                    267:         ((u.u & 0x00FF0000ULL) >> 8) |
                    268:         ((u.u & 0x0000FF00UL) << 8) |
                    269:         ((u.u & 0x000000FFULL) << 24);
                    270: 
                    271:     return u.f;
                    272: }
                    273: 
                    274: PPC_LDF_OP(fd_le, ldfqr);
                    275: PPC_LDF_OP(fs_le, ldflr);
                    276: 
                    277: /* Load and set reservation */
                    278: PPC_OP(glue(lwarx, MEMSUFFIX))
                    279: {
                    280:     if (T0 & 0x03) {
                    281:         do_raise_exception(EXCP_ALIGN);
                    282:     } else {
                    283:        T1 = glue(ldl, MEMSUFFIX)(T0);
                    284:        regs->reserve = T0;
                    285:     }
                    286:     RETURN();
                    287: }
                    288: 
                    289: PPC_OP(glue(lwarx_le, MEMSUFFIX))
                    290: {
                    291:     if (T0 & 0x03) {
                    292:         do_raise_exception(EXCP_ALIGN);
                    293:     } else {
                    294:        T1 = glue(ld32r, MEMSUFFIX)(T0);
                    295:        regs->reserve = T0;
                    296:     }
                    297:     RETURN();
                    298: }
                    299: 
                    300: /* Store with reservation */
                    301: PPC_OP(glue(stwcx, MEMSUFFIX))
                    302: {
                    303:     if (T0 & 0x03) {
                    304:         do_raise_exception(EXCP_ALIGN);
                    305:     } else {
                    306:         if (regs->reserve != T0) {
                    307:             env->crf[0] = xer_ov;
                    308:         } else {
                    309:             glue(stl, MEMSUFFIX)(T0, T1);
                    310:             env->crf[0] = xer_ov | 0x02;
                    311:         }
                    312:     }
                    313:     regs->reserve = 0;
                    314:     RETURN();
                    315: }
                    316: 
                    317: PPC_OP(glue(stwcx_le, MEMSUFFIX))
                    318: {
                    319:     if (T0 & 0x03) {
                    320:         do_raise_exception(EXCP_ALIGN);
                    321:     } else {
                    322:         if (regs->reserve != T0) {
                    323:             env->crf[0] = xer_ov;
                    324:         } else {
                    325:             glue(st32r, MEMSUFFIX)(T0, T1);
                    326:             env->crf[0] = xer_ov | 0x02;
                    327:         }
                    328:     }
                    329:     regs->reserve = 0;
                    330:     RETURN();
                    331: }
                    332: 
                    333: PPC_OP(glue(dcbz, MEMSUFFIX))
                    334: {
                    335:     glue(stl, MEMSUFFIX)(T0 + 0x00, 0);
                    336:     glue(stl, MEMSUFFIX)(T0 + 0x04, 0);
                    337:     glue(stl, MEMSUFFIX)(T0 + 0x08, 0);
                    338:     glue(stl, MEMSUFFIX)(T0 + 0x0C, 0);
                    339:     glue(stl, MEMSUFFIX)(T0 + 0x10, 0);
                    340:     glue(stl, MEMSUFFIX)(T0 + 0x14, 0);
                    341:     glue(stl, MEMSUFFIX)(T0 + 0x18, 0);
                    342:     glue(stl, MEMSUFFIX)(T0 + 0x1C, 0);
                    343:     RETURN();
                    344: }
                    345: 
                    346: /* External access */
                    347: PPC_OP(glue(eciwx, MEMSUFFIX))
                    348: {
                    349:     T1 = glue(ldl, MEMSUFFIX)(T0);
                    350:     RETURN();
                    351: }
                    352: 
                    353: PPC_OP(glue(ecowx, MEMSUFFIX))
                    354: {
                    355:     glue(stl, MEMSUFFIX)(T0, T1);
                    356:     RETURN();
                    357: }
                    358: 
                    359: PPC_OP(glue(eciwx_le, MEMSUFFIX))
                    360: {
                    361:     T1 = glue(ld32r, MEMSUFFIX)(T0);
                    362:     RETURN();
                    363: }
                    364: 
                    365: PPC_OP(glue(ecowx_le, MEMSUFFIX))
                    366: {
                    367:     glue(st32r, MEMSUFFIX)(T0, T1);
                    368:     RETURN();
                    369: }
                    370: 
                    371: #undef MEMSUFFIX

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.