Annotation of qemu/target-sparc/op.c, revision 1.1.1.6

1.1       root        1: /*
                      2:    SPARC micro operations
                      3: 
                      4:    Copyright (C) 2003 Thomas M. Ogrisegg <[email protected]>
                      5: 
                      6:    This library is free software; you can redistribute it and/or
                      7:    modify it under the terms of the GNU Lesser General Public
                      8:    License as published by the Free Software Foundation; either
                      9:    version 2 of the License, or (at your option) any later version.
                     10: 
                     11:    This library is distributed in the hope that it will be useful,
                     12:    but WITHOUT ANY WARRANTY; without even the implied warranty of
                     13:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
                     14:    Lesser General Public License for more details.
                     15: 
                     16:    You should have received a copy of the GNU Lesser General Public
                     17:    License along with this library; if not, write to the Free Software
                     18:    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
                     19: */
                     20: 
                     21: #include "exec.h"
                     22: 
                     23:  /*XXX*/
                     24: #define REGNAME g0
                     25: #define REG (env->gregs[0])
                     26: #include "op_template.h"
                     27: #define REGNAME g1
                     28: #define REG (env->gregs[1])
                     29: #include "op_template.h"
                     30: #define REGNAME g2
                     31: #define REG (env->gregs[2])
                     32: #include "op_template.h"
                     33: #define REGNAME g3
                     34: #define REG (env->gregs[3])
                     35: #include "op_template.h"
                     36: #define REGNAME g4
                     37: #define REG (env->gregs[4])
                     38: #include "op_template.h"
                     39: #define REGNAME g5
                     40: #define REG (env->gregs[5])
                     41: #include "op_template.h"
                     42: #define REGNAME g6
                     43: #define REG (env->gregs[6])
                     44: #include "op_template.h"
                     45: #define REGNAME g7
                     46: #define REG (env->gregs[7])
                     47: #include "op_template.h"
                     48: #define REGNAME i0
                     49: #define REG (REGWPTR[16])
                     50: #include "op_template.h"
                     51: #define REGNAME i1
                     52: #define REG (REGWPTR[17])
                     53: #include "op_template.h"
                     54: #define REGNAME i2
                     55: #define REG (REGWPTR[18])
                     56: #include "op_template.h"
                     57: #define REGNAME i3
                     58: #define REG (REGWPTR[19])
                     59: #include "op_template.h"
                     60: #define REGNAME i4
                     61: #define REG (REGWPTR[20])
                     62: #include "op_template.h"
                     63: #define REGNAME i5
                     64: #define REG (REGWPTR[21])
                     65: #include "op_template.h"
                     66: #define REGNAME i6
                     67: #define REG (REGWPTR[22])
                     68: #include "op_template.h"
                     69: #define REGNAME i7
                     70: #define REG (REGWPTR[23])
                     71: #include "op_template.h"
                     72: #define REGNAME l0
                     73: #define REG (REGWPTR[8])
                     74: #include "op_template.h"
                     75: #define REGNAME l1
                     76: #define REG (REGWPTR[9])
                     77: #include "op_template.h"
                     78: #define REGNAME l2
                     79: #define REG (REGWPTR[10])
                     80: #include "op_template.h"
                     81: #define REGNAME l3
                     82: #define REG (REGWPTR[11])
                     83: #include "op_template.h"
                     84: #define REGNAME l4
                     85: #define REG (REGWPTR[12])
                     86: #include "op_template.h"
                     87: #define REGNAME l5
                     88: #define REG (REGWPTR[13])
                     89: #include "op_template.h"
                     90: #define REGNAME l6
                     91: #define REG (REGWPTR[14])
                     92: #include "op_template.h"
                     93: #define REGNAME l7
                     94: #define REG (REGWPTR[15])
                     95: #include "op_template.h"
                     96: #define REGNAME o0
                     97: #define REG (REGWPTR[0])
                     98: #include "op_template.h"
                     99: #define REGNAME o1
                    100: #define REG (REGWPTR[1])
                    101: #include "op_template.h"
                    102: #define REGNAME o2
                    103: #define REG (REGWPTR[2])
                    104: #include "op_template.h"
                    105: #define REGNAME o3
                    106: #define REG (REGWPTR[3])
                    107: #include "op_template.h"
                    108: #define REGNAME o4
                    109: #define REG (REGWPTR[4])
                    110: #include "op_template.h"
                    111: #define REGNAME o5
                    112: #define REG (REGWPTR[5])
                    113: #include "op_template.h"
                    114: #define REGNAME o6
                    115: #define REG (REGWPTR[6])
                    116: #include "op_template.h"
                    117: #define REGNAME o7
                    118: #define REG (REGWPTR[7])
                    119: #include "op_template.h"
                    120: 
                    121: #define REGNAME f0
                    122: #define REG (env->fpr[0])
                    123: #include "fop_template.h"
                    124: #define REGNAME f1
                    125: #define REG (env->fpr[1])
                    126: #include "fop_template.h"
                    127: #define REGNAME f2
                    128: #define REG (env->fpr[2])
                    129: #include "fop_template.h"
                    130: #define REGNAME f3
                    131: #define REG (env->fpr[3])
                    132: #include "fop_template.h"
                    133: #define REGNAME f4
                    134: #define REG (env->fpr[4])
                    135: #include "fop_template.h"
                    136: #define REGNAME f5
                    137: #define REG (env->fpr[5])
                    138: #include "fop_template.h"
                    139: #define REGNAME f6
                    140: #define REG (env->fpr[6])
                    141: #include "fop_template.h"
                    142: #define REGNAME f7
                    143: #define REG (env->fpr[7])
                    144: #include "fop_template.h"
                    145: #define REGNAME f8
                    146: #define REG (env->fpr[8])
                    147: #include "fop_template.h"
                    148: #define REGNAME f9
                    149: #define REG (env->fpr[9])
                    150: #include "fop_template.h"
                    151: #define REGNAME f10
                    152: #define REG (env->fpr[10])
                    153: #include "fop_template.h"
                    154: #define REGNAME f11
                    155: #define REG (env->fpr[11])
                    156: #include "fop_template.h"
                    157: #define REGNAME f12
                    158: #define REG (env->fpr[12])
                    159: #include "fop_template.h"
                    160: #define REGNAME f13
                    161: #define REG (env->fpr[13])
                    162: #include "fop_template.h"
                    163: #define REGNAME f14
                    164: #define REG (env->fpr[14])
                    165: #include "fop_template.h"
                    166: #define REGNAME f15
                    167: #define REG (env->fpr[15])
                    168: #include "fop_template.h"
                    169: #define REGNAME f16
                    170: #define REG (env->fpr[16])
                    171: #include "fop_template.h"
                    172: #define REGNAME f17
                    173: #define REG (env->fpr[17])
                    174: #include "fop_template.h"
                    175: #define REGNAME f18
                    176: #define REG (env->fpr[18])
                    177: #include "fop_template.h"
                    178: #define REGNAME f19
                    179: #define REG (env->fpr[19])
                    180: #include "fop_template.h"
                    181: #define REGNAME f20
                    182: #define REG (env->fpr[20])
                    183: #include "fop_template.h"
                    184: #define REGNAME f21
                    185: #define REG (env->fpr[21])
                    186: #include "fop_template.h"
                    187: #define REGNAME f22
                    188: #define REG (env->fpr[22])
                    189: #include "fop_template.h"
                    190: #define REGNAME f23
                    191: #define REG (env->fpr[23])
                    192: #include "fop_template.h"
                    193: #define REGNAME f24
                    194: #define REG (env->fpr[24])
                    195: #include "fop_template.h"
                    196: #define REGNAME f25
                    197: #define REG (env->fpr[25])
                    198: #include "fop_template.h"
                    199: #define REGNAME f26
                    200: #define REG (env->fpr[26])
                    201: #include "fop_template.h"
                    202: #define REGNAME f27
                    203: #define REG (env->fpr[27])
                    204: #include "fop_template.h"
                    205: #define REGNAME f28
                    206: #define REG (env->fpr[28])
                    207: #include "fop_template.h"
                    208: #define REGNAME f29
                    209: #define REG (env->fpr[29])
                    210: #include "fop_template.h"
                    211: #define REGNAME f30
                    212: #define REG (env->fpr[30])
                    213: #include "fop_template.h"
                    214: #define REGNAME f31
                    215: #define REG (env->fpr[31])
                    216: #include "fop_template.h"
                    217: 
                    218: #ifdef TARGET_SPARC64
                    219: #define REGNAME f32
                    220: #define REG (env->fpr[32])
                    221: #include "fop_template.h"
                    222: #define REGNAME f34
                    223: #define REG (env->fpr[34])
                    224: #include "fop_template.h"
                    225: #define REGNAME f36
                    226: #define REG (env->fpr[36])
                    227: #include "fop_template.h"
                    228: #define REGNAME f38
                    229: #define REG (env->fpr[38])
                    230: #include "fop_template.h"
                    231: #define REGNAME f40
                    232: #define REG (env->fpr[40])
                    233: #include "fop_template.h"
                    234: #define REGNAME f42
                    235: #define REG (env->fpr[42])
                    236: #include "fop_template.h"
                    237: #define REGNAME f44
                    238: #define REG (env->fpr[44])
                    239: #include "fop_template.h"
                    240: #define REGNAME f46
                    241: #define REG (env->fpr[46])
                    242: #include "fop_template.h"
                    243: #define REGNAME f48
                    244: #define REG (env->fpr[47])
                    245: #include "fop_template.h"
                    246: #define REGNAME f50
                    247: #define REG (env->fpr[50])
                    248: #include "fop_template.h"
                    249: #define REGNAME f52
                    250: #define REG (env->fpr[52])
                    251: #include "fop_template.h"
                    252: #define REGNAME f54
                    253: #define REG (env->fpr[54])
                    254: #include "fop_template.h"
                    255: #define REGNAME f56
                    256: #define REG (env->fpr[56])
                    257: #include "fop_template.h"
                    258: #define REGNAME f58
                    259: #define REG (env->fpr[58])
                    260: #include "fop_template.h"
                    261: #define REGNAME f60
                    262: #define REG (env->fpr[60])
                    263: #include "fop_template.h"
                    264: #define REGNAME f62
                    265: #define REG (env->fpr[62])
                    266: #include "fop_template.h"
                    267: #endif
                    268: 
                    269: #ifdef TARGET_SPARC64
                    270: #ifdef WORDS_BIGENDIAN
                    271: typedef union UREG64 {
                    272:     struct { uint16_t v3, v2, v1, v0; } w;
                    273:     struct { uint32_t v1, v0; } l;
                    274:     uint64_t q;
                    275: } UREG64;
                    276: #else
                    277: typedef union UREG64 {
                    278:     struct { uint16_t v0, v1, v2, v3; } w;
                    279:     struct { uint32_t v0, v1; } l;
                    280:     uint64_t q;
                    281: } UREG64;
                    282: #endif
                    283: 
                    284: #define PARAMQ1 \
                    285: ({\
                    286:     UREG64 __p;\
                    287:     __p.l.v1 = PARAM1;\
                    288:     __p.l.v0 = PARAM2;\
                    289:     __p.q;\
1.1.1.6 ! root      290: })
1.1       root      291: 
                    292: void OPPROTO op_movq_T0_im64(void)
                    293: {
                    294:     T0 = PARAMQ1;
                    295: }
                    296: 
                    297: void OPPROTO op_movq_T1_im64(void)
                    298: {
                    299:     T1 = PARAMQ1;
                    300: }
                    301: 
                    302: #define XFLAG_SET(x) ((env->xcc&x)?1:0)
                    303: 
                    304: #else
                    305: #define EIP (env->pc)
                    306: #endif
                    307: 
                    308: #define FLAG_SET(x) ((env->psr&x)?1:0)
                    309: 
                    310: void OPPROTO op_movl_T0_0(void)
                    311: {
                    312:     T0 = 0;
                    313: }
                    314: 
                    315: void OPPROTO op_movl_T0_im(void)
                    316: {
                    317:     T0 = (uint32_t)PARAM1;
                    318: }
                    319: 
                    320: void OPPROTO op_movl_T1_im(void)
                    321: {
                    322:     T1 = (uint32_t)PARAM1;
                    323: }
                    324: 
                    325: void OPPROTO op_movl_T2_im(void)
                    326: {
                    327:     T2 = (uint32_t)PARAM1;
                    328: }
                    329: 
                    330: void OPPROTO op_movl_T0_sim(void)
                    331: {
                    332:     T0 = (int32_t)PARAM1;
                    333: }
                    334: 
                    335: void OPPROTO op_movl_T1_sim(void)
                    336: {
                    337:     T1 = (int32_t)PARAM1;
                    338: }
                    339: 
                    340: void OPPROTO op_movl_T2_sim(void)
                    341: {
                    342:     T2 = (int32_t)PARAM1;
                    343: }
                    344: 
                    345: void OPPROTO op_movl_T0_env(void)
                    346: {
                    347:     T0 = *(uint32_t *)((char *)env + PARAM1);
                    348: }
                    349: 
                    350: void OPPROTO op_movl_env_T0(void)
                    351: {
                    352:     *(uint32_t *)((char *)env + PARAM1) = T0;
                    353: }
                    354: 
                    355: void OPPROTO op_movtl_T0_env(void)
                    356: {
                    357:     T0 = *(target_ulong *)((char *)env + PARAM1);
                    358: }
                    359: 
                    360: void OPPROTO op_movtl_env_T0(void)
                    361: {
                    362:     *(target_ulong *)((char *)env + PARAM1) = T0;
                    363: }
                    364: 
                    365: void OPPROTO op_add_T1_T0(void)
                    366: {
                    367:     T0 += T1;
                    368: }
                    369: 
                    370: void OPPROTO op_add_T1_T0_cc(void)
                    371: {
                    372:     target_ulong src1;
                    373: 
                    374:     src1 = T0;
                    375:     T0 += T1;
                    376:     env->psr = 0;
                    377: #ifdef TARGET_SPARC64
                    378:     if (!(T0 & 0xffffffff))
1.1.1.6 ! root      379:         env->psr |= PSR_ZERO;
1.1       root      380:     if ((int32_t) T0 < 0)
1.1.1.6 ! root      381:         env->psr |= PSR_NEG;
1.1.1.2   root      382:     if ((T0 & 0xffffffff) < (src1 & 0xffffffff))
1.1.1.6 ! root      383:         env->psr |= PSR_CARRY;
1.1       root      384:     if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff) ^ -1) &
1.1.1.6 ! root      385:          ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))
        !           386:         env->psr |= PSR_OVF;
1.1       root      387: 
                    388:     env->xcc = 0;
                    389:     if (!T0)
1.1.1.6 ! root      390:         env->xcc |= PSR_ZERO;
1.1       root      391:     if ((int64_t) T0 < 0)
1.1.1.6 ! root      392:         env->xcc |= PSR_NEG;
1.1       root      393:     if (T0 < src1)
1.1.1.6 ! root      394:         env->xcc |= PSR_CARRY;
1.1       root      395:     if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1ULL << 63))
1.1.1.6 ! root      396:         env->xcc |= PSR_OVF;
1.1       root      397: #else
                    398:     if (!T0)
1.1.1.6 ! root      399:         env->psr |= PSR_ZERO;
1.1       root      400:     if ((int32_t) T0 < 0)
1.1.1.6 ! root      401:         env->psr |= PSR_NEG;
1.1       root      402:     if (T0 < src1)
1.1.1.6 ! root      403:         env->psr |= PSR_CARRY;
1.1       root      404:     if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1 << 31))
1.1.1.6 ! root      405:         env->psr |= PSR_OVF;
1.1       root      406: #endif
                    407:     FORCE_RET();
                    408: }
                    409: 
                    410: void OPPROTO op_addx_T1_T0(void)
                    411: {
                    412:     T0 += T1 + FLAG_SET(PSR_CARRY);
                    413: }
                    414: 
                    415: void OPPROTO op_addx_T1_T0_cc(void)
                    416: {
                    417:     target_ulong src1;
                    418:     src1 = T0;
1.1.1.3   root      419:     if (FLAG_SET(PSR_CARRY))
                    420:     {
                    421:       T0 += T1 + 1;
                    422:       env->psr = 0;
                    423: #ifdef TARGET_SPARC64
                    424:       if ((T0 & 0xffffffff) <= (src1 & 0xffffffff))
                    425:         env->psr |= PSR_CARRY;
                    426:       env->xcc = 0;
                    427:       if (T0 <= src1)
                    428:         env->xcc |= PSR_CARRY;
                    429: #else
                    430:       if (T0 <= src1)
                    431:         env->psr |= PSR_CARRY;
                    432: #endif
                    433:     }
                    434:     else
                    435:     {
                    436:       T0 += T1;
                    437:       env->psr = 0;
                    438: #ifdef TARGET_SPARC64
                    439:       if ((T0 & 0xffffffff) < (src1 & 0xffffffff))
                    440:         env->psr |= PSR_CARRY;
                    441:       env->xcc = 0;
                    442:       if (T0 < src1)
                    443:         env->xcc |= PSR_CARRY;
                    444: #else
                    445:       if (T0 < src1)
                    446:         env->psr |= PSR_CARRY;
                    447: #endif
                    448:     }
1.1       root      449: #ifdef TARGET_SPARC64
                    450:     if (!(T0 & 0xffffffff))
1.1.1.6 ! root      451:         env->psr |= PSR_ZERO;
1.1       root      452:     if ((int32_t) T0 < 0)
1.1.1.6 ! root      453:         env->psr |= PSR_NEG;
1.1       root      454:     if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff) ^ -1) &
1.1.1.6 ! root      455:          ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))
        !           456:         env->psr |= PSR_OVF;
1.1       root      457: 
                    458:     if (!T0)
1.1.1.6 ! root      459:         env->xcc |= PSR_ZERO;
1.1       root      460:     if ((int64_t) T0 < 0)
1.1.1.6 ! root      461:         env->xcc |= PSR_NEG;
1.1       root      462:     if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1ULL << 63))
1.1.1.6 ! root      463:         env->xcc |= PSR_OVF;
1.1       root      464: #else
                    465:     if (!T0)
1.1.1.6 ! root      466:         env->psr |= PSR_ZERO;
1.1       root      467:     if ((int32_t) T0 < 0)
1.1.1.6 ! root      468:         env->psr |= PSR_NEG;
1.1       root      469:     if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1 << 31))
1.1.1.6 ! root      470:         env->psr |= PSR_OVF;
        !           471: #endif
        !           472:     FORCE_RET();
        !           473: }
        !           474: 
        !           475: void OPPROTO op_tadd_T1_T0_cc(void)
        !           476: {
        !           477:     target_ulong src1;
        !           478: 
        !           479:     src1 = T0;
        !           480:     T0 += T1;
        !           481:     env->psr = 0;
        !           482: #ifdef TARGET_SPARC64
        !           483:     if (!(T0 & 0xffffffff))
        !           484:         env->psr |= PSR_ZERO;
        !           485:     if ((int32_t) T0 < 0)
        !           486:         env->psr |= PSR_NEG;
        !           487:     if ((T0 & 0xffffffff) < (src1 & 0xffffffff))
        !           488:         env->psr |= PSR_CARRY;
        !           489:     if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff) ^ -1) &
        !           490:          ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))
        !           491:         env->psr |= PSR_OVF;
        !           492:     if ((src1 & 0x03) || (T1 & 0x03))
        !           493:         env->psr |= PSR_OVF;
        !           494: 
        !           495:     env->xcc = 0;
        !           496:     if (!T0)
        !           497:         env->xcc |= PSR_ZERO;
        !           498:     if ((int64_t) T0 < 0)
        !           499:         env->xcc |= PSR_NEG;
        !           500:     if (T0 < src1)
        !           501:         env->xcc |= PSR_CARRY;
        !           502:     if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1ULL << 63))
        !           503:         env->xcc |= PSR_OVF;
        !           504: #else
        !           505:     if (!T0)
        !           506:         env->psr |= PSR_ZERO;
        !           507:     if ((int32_t) T0 < 0)
        !           508:         env->psr |= PSR_NEG;
        !           509:     if (T0 < src1)
        !           510:         env->psr |= PSR_CARRY;
        !           511:     if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1 << 31))
        !           512:         env->psr |= PSR_OVF;
        !           513:     if ((src1 & 0x03) || (T1 & 0x03))
        !           514:         env->psr |= PSR_OVF;
        !           515: #endif
        !           516:     FORCE_RET();
        !           517: }
        !           518: 
        !           519: void OPPROTO op_tadd_T1_T0_ccTV(void)
        !           520: {
        !           521:     target_ulong src1;
        !           522: 
        !           523:     if ((T0 & 0x03) || (T1 & 0x03)) {
        !           524:         raise_exception(TT_TOVF);
        !           525:         FORCE_RET();
        !           526:         return;
        !           527:     }
        !           528: 
        !           529:     src1 = T0;
        !           530:     T0 += T1;
        !           531: 
        !           532: #ifdef TARGET_SPARC64
        !           533:     if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff) ^ -1) &
        !           534:          ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))
        !           535:         raise_exception(TT_TOVF);
        !           536: #else
        !           537:     if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1 << 31))
        !           538:         raise_exception(TT_TOVF);
        !           539: #endif
        !           540: 
        !           541:     env->psr = 0;
        !           542: #ifdef TARGET_SPARC64
        !           543:     if (!(T0 & 0xffffffff))
        !           544:         env->psr |= PSR_ZERO;
        !           545:     if ((int32_t) T0 < 0)
        !           546:         env->psr |= PSR_NEG;
        !           547:     if ((T0 & 0xffffffff) < (src1 & 0xffffffff))
        !           548:         env->psr |= PSR_CARRY;
        !           549: 
        !           550:     env->xcc = 0;
        !           551:     if (!T0)
        !           552:         env->xcc |= PSR_ZERO;
        !           553:     if ((int64_t) T0 < 0)
        !           554:         env->xcc |= PSR_NEG;
        !           555:     if (T0 < src1)
        !           556:         env->xcc |= PSR_CARRY;
        !           557: #else
        !           558:     if (!T0)
        !           559:         env->psr |= PSR_ZERO;
        !           560:     if ((int32_t) T0 < 0)
        !           561:         env->psr |= PSR_NEG;
        !           562:     if (T0 < src1)
        !           563:         env->psr |= PSR_CARRY;
1.1       root      564: #endif
                    565:     FORCE_RET();
                    566: }
                    567: 
                    568: void OPPROTO op_sub_T1_T0(void)
                    569: {
                    570:     T0 -= T1;
                    571: }
                    572: 
                    573: void OPPROTO op_sub_T1_T0_cc(void)
                    574: {
                    575:     target_ulong src1;
                    576: 
                    577:     src1 = T0;
                    578:     T0 -= T1;
                    579:     env->psr = 0;
                    580: #ifdef TARGET_SPARC64
                    581:     if (!(T0 & 0xffffffff))
1.1.1.6 ! root      582:         env->psr |= PSR_ZERO;
1.1       root      583:     if ((int32_t) T0 < 0)
1.1.1.6 ! root      584:         env->psr |= PSR_NEG;
1.1       root      585:     if ((src1 & 0xffffffff) < (T1 & 0xffffffff))
1.1.1.6 ! root      586:         env->psr |= PSR_CARRY;
1.1       root      587:     if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff)) &
1.1.1.6 ! root      588:          ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))
        !           589:         env->psr |= PSR_OVF;
1.1       root      590: 
                    591:     env->xcc = 0;
                    592:     if (!T0)
1.1.1.6 ! root      593:         env->xcc |= PSR_ZERO;
1.1       root      594:     if ((int64_t) T0 < 0)
1.1.1.6 ! root      595:         env->xcc |= PSR_NEG;
1.1.1.2   root      596:     if (src1 < T1)
1.1.1.6 ! root      597:         env->xcc |= PSR_CARRY;
1.1       root      598:     if (((src1 ^ T1) & (src1 ^ T0)) & (1ULL << 63))
1.1.1.6 ! root      599:         env->xcc |= PSR_OVF;
1.1       root      600: #else
                    601:     if (!T0)
1.1.1.6 ! root      602:         env->psr |= PSR_ZERO;
1.1       root      603:     if ((int32_t) T0 < 0)
1.1.1.6 ! root      604:         env->psr |= PSR_NEG;
1.1       root      605:     if (src1 < T1)
1.1.1.6 ! root      606:         env->psr |= PSR_CARRY;
1.1       root      607:     if (((src1 ^ T1) & (src1 ^ T0)) & (1 << 31))
1.1.1.6 ! root      608:         env->psr |= PSR_OVF;
1.1       root      609: #endif
                    610:     FORCE_RET();
                    611: }
                    612: 
                    613: void OPPROTO op_subx_T1_T0(void)
                    614: {
                    615:     T0 -= T1 + FLAG_SET(PSR_CARRY);
                    616: }
                    617: 
                    618: void OPPROTO op_subx_T1_T0_cc(void)
                    619: {
                    620:     target_ulong src1;
                    621:     src1 = T0;
1.1.1.3   root      622:     if (FLAG_SET(PSR_CARRY))
                    623:     {
                    624:       T0 -= T1 + 1;
                    625:       env->psr = 0;
                    626: #ifdef TARGET_SPARC64
                    627:       if ((src1 & 0xffffffff) <= (T1 & 0xffffffff))
                    628:         env->psr |= PSR_CARRY;
                    629:       env->xcc = 0;
                    630:       if (src1 <= T1)
                    631:         env->xcc |= PSR_CARRY;
                    632: #else
                    633:       if (src1 <= T1)
                    634:         env->psr |= PSR_CARRY;
                    635: #endif
                    636:     }
                    637:     else
                    638:     {
                    639:       T0 -= T1;
                    640:       env->psr = 0;
                    641: #ifdef TARGET_SPARC64
                    642:       if ((src1 & 0xffffffff) < (T1 & 0xffffffff))
                    643:         env->psr |= PSR_CARRY;
                    644:       env->xcc = 0;
                    645:       if (src1 < T1)
                    646:         env->xcc |= PSR_CARRY;
                    647: #else
                    648:       if (src1 < T1)
                    649:         env->psr |= PSR_CARRY;
                    650: #endif
                    651:     }
1.1       root      652: #ifdef TARGET_SPARC64
                    653:     if (!(T0 & 0xffffffff))
1.1.1.6 ! root      654:         env->psr |= PSR_ZERO;
1.1       root      655:     if ((int32_t) T0 < 0)
1.1.1.6 ! root      656:         env->psr |= PSR_NEG;
1.1       root      657:     if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff)) &
1.1.1.6 ! root      658:          ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))
        !           659:         env->psr |= PSR_OVF;
1.1       root      660: 
                    661:     if (!T0)
1.1.1.6 ! root      662:         env->xcc |= PSR_ZERO;
1.1       root      663:     if ((int64_t) T0 < 0)
1.1.1.6 ! root      664:         env->xcc |= PSR_NEG;
1.1       root      665:     if (((src1 ^ T1) & (src1 ^ T0)) & (1ULL << 63))
1.1.1.6 ! root      666:         env->xcc |= PSR_OVF;
1.1       root      667: #else
                    668:     if (!T0)
1.1.1.6 ! root      669:         env->psr |= PSR_ZERO;
1.1       root      670:     if ((int32_t) T0 < 0)
1.1.1.6 ! root      671:         env->psr |= PSR_NEG;
1.1       root      672:     if (((src1 ^ T1) & (src1 ^ T0)) & (1 << 31))
1.1.1.6 ! root      673:         env->psr |= PSR_OVF;
        !           674: #endif
        !           675:     FORCE_RET();
        !           676: }
        !           677: 
        !           678: void OPPROTO op_tsub_T1_T0_cc(void)
        !           679: {
        !           680:     target_ulong src1;
        !           681: 
        !           682:     src1 = T0;
        !           683:     T0 -= T1;
        !           684:     env->psr = 0;
        !           685: #ifdef TARGET_SPARC64
        !           686:     if (!(T0 & 0xffffffff))
        !           687:         env->psr |= PSR_ZERO;
        !           688:     if ((int32_t) T0 < 0)
        !           689:         env->psr |= PSR_NEG;
        !           690:     if ((src1 & 0xffffffff) < (T1 & 0xffffffff))
        !           691:         env->psr |= PSR_CARRY;
        !           692:     if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff)) &
        !           693:          ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))
        !           694:         env->psr |= PSR_OVF;
        !           695:     if ((src1 & 0x03) || (T1 & 0x03))
        !           696:         env->psr |= PSR_OVF;
        !           697: 
        !           698:     env->xcc = 0;
        !           699:     if (!T0)
        !           700:         env->xcc |= PSR_ZERO;
        !           701:     if ((int64_t) T0 < 0)
        !           702:         env->xcc |= PSR_NEG;
        !           703:     if (src1 < T1)
        !           704:         env->xcc |= PSR_CARRY;
        !           705:     if (((src1 ^ T1) & (src1 ^ T0)) & (1ULL << 63))
        !           706:         env->xcc |= PSR_OVF;
        !           707: #else
        !           708:     if (!T0)
        !           709:         env->psr |= PSR_ZERO;
        !           710:     if ((int32_t) T0 < 0)
        !           711:         env->psr |= PSR_NEG;
        !           712:     if (src1 < T1)
        !           713:         env->psr |= PSR_CARRY;
        !           714:     if (((src1 ^ T1) & (src1 ^ T0)) & (1 << 31))
        !           715:         env->psr |= PSR_OVF;
        !           716:     if ((src1 & 0x03) || (T1 & 0x03))
        !           717:         env->psr |= PSR_OVF;
        !           718: #endif
        !           719:     FORCE_RET();
        !           720: }
        !           721: 
        !           722: void OPPROTO op_tsub_T1_T0_ccTV(void)
        !           723: {
        !           724:     target_ulong src1;
        !           725: 
        !           726:     if ((T0 & 0x03) || (T1 & 0x03))
        !           727:         raise_exception(TT_TOVF);
        !           728: 
        !           729:     src1 = T0;
        !           730:     T0 -= T1;
        !           731: 
        !           732: #ifdef TARGET_SPARC64
        !           733:     if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff)) &
        !           734:          ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))
        !           735:         raise_exception(TT_TOVF);
        !           736: #else
        !           737:     if (((src1 ^ T1) & (src1 ^ T0)) & (1 << 31))
        !           738:         raise_exception(TT_TOVF);
        !           739: #endif
        !           740: 
        !           741:     env->psr = 0;
        !           742: #ifdef TARGET_SPARC64
        !           743:     if (!(T0 & 0xffffffff))
        !           744:         env->psr |= PSR_ZERO;
        !           745:     if ((int32_t) T0 < 0)
        !           746:         env->psr |= PSR_NEG;
        !           747:     if ((src1 & 0xffffffff) < (T1 & 0xffffffff))
        !           748:         env->psr |= PSR_CARRY;
        !           749: 
        !           750:     env->xcc = 0;
        !           751:     if (!T0)
        !           752:         env->xcc |= PSR_ZERO;
        !           753:     if ((int64_t) T0 < 0)
        !           754:         env->xcc |= PSR_NEG;
        !           755:     if (src1 < T1)
        !           756:         env->xcc |= PSR_CARRY;
        !           757: #else
        !           758:     if (!T0)
        !           759:         env->psr |= PSR_ZERO;
        !           760:     if ((int32_t) T0 < 0)
        !           761:         env->psr |= PSR_NEG;
        !           762:     if (src1 < T1)
        !           763:         env->psr |= PSR_CARRY;
1.1       root      764: #endif
                    765:     FORCE_RET();
                    766: }
                    767: 
                    768: void OPPROTO op_and_T1_T0(void)
                    769: {
                    770:     T0 &= T1;
                    771: }
                    772: 
                    773: void OPPROTO op_or_T1_T0(void)
                    774: {
                    775:     T0 |= T1;
                    776: }
                    777: 
                    778: void OPPROTO op_xor_T1_T0(void)
                    779: {
                    780:     T0 ^= T1;
                    781: }
                    782: 
                    783: void OPPROTO op_andn_T1_T0(void)
                    784: {
                    785:     T0 &= ~T1;
                    786: }
                    787: 
                    788: void OPPROTO op_orn_T1_T0(void)
                    789: {
                    790:     T0 |= ~T1;
                    791: }
                    792: 
                    793: void OPPROTO op_xnor_T1_T0(void)
                    794: {
                    795:     T0 ^= ~T1;
                    796: }
                    797: 
                    798: void OPPROTO op_umul_T1_T0(void)
                    799: {
                    800:     uint64_t res;
                    801:     res = (uint64_t) T0 * (uint64_t) T1;
                    802: #ifdef TARGET_SPARC64
                    803:     T0 = res;
                    804: #else
                    805:     T0 = res & 0xffffffff;
                    806: #endif
                    807:     env->y = res >> 32;
                    808: }
                    809: 
                    810: void OPPROTO op_smul_T1_T0(void)
                    811: {
                    812:     uint64_t res;
                    813:     res = (int64_t) ((int32_t) T0) * (int64_t) ((int32_t) T1);
                    814: #ifdef TARGET_SPARC64
                    815:     T0 = res;
                    816: #else
                    817:     T0 = res & 0xffffffff;
                    818: #endif
                    819:     env->y = res >> 32;
                    820: }
                    821: 
                    822: void OPPROTO op_mulscc_T1_T0(void)
                    823: {
                    824:     unsigned int b1, N, V, b2;
                    825:     target_ulong src1;
                    826: 
                    827:     N = FLAG_SET(PSR_NEG);
                    828:     V = FLAG_SET(PSR_OVF);
                    829:     b1 = N ^ V;
                    830:     b2 = T0 & 1;
                    831:     T0 = (b1 << 31) | (T0 >> 1);
                    832:     if (!(env->y & 1))
                    833:         T1 = 0;
                    834:     /* do addition and update flags */
                    835:     src1 = T0;
                    836:     T0 += T1;
                    837:     env->psr = 0;
                    838:     if (!T0)
1.1.1.6 ! root      839:         env->psr |= PSR_ZERO;
1.1       root      840:     if ((int32_t) T0 < 0)
1.1.1.6 ! root      841:         env->psr |= PSR_NEG;
1.1       root      842:     if (T0 < src1)
1.1.1.6 ! root      843:         env->psr |= PSR_CARRY;
1.1       root      844:     if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1 << 31))
1.1.1.6 ! root      845:         env->psr |= PSR_OVF;
1.1       root      846:     env->y = (b2 << 31) | (env->y >> 1);
                    847:     FORCE_RET();
                    848: }
                    849: 
                    850: void OPPROTO op_udiv_T1_T0(void)
                    851: {
                    852:     uint64_t x0;
                    853:     uint32_t x1;
                    854: 
                    855:     x0 = T0 | ((uint64_t) (env->y) << 32);
                    856:     x1 = T1;
1.1.1.6 ! root      857: 
        !           858:     if (x1 == 0) {
        !           859:         raise_exception(TT_DIV_ZERO);
        !           860:     }
        !           861: 
1.1       root      862:     x0 = x0 / x1;
                    863:     if (x0 > 0xffffffff) {
1.1.1.6 ! root      864:         T0 = 0xffffffff;
        !           865:         T1 = 1;
1.1       root      866:     } else {
1.1.1.6 ! root      867:         T0 = x0;
        !           868:         T1 = 0;
1.1       root      869:     }
                    870:     FORCE_RET();
                    871: }
                    872: 
                    873: void OPPROTO op_sdiv_T1_T0(void)
                    874: {
                    875:     int64_t x0;
                    876:     int32_t x1;
                    877: 
                    878:     x0 = T0 | ((int64_t) (env->y) << 32);
                    879:     x1 = T1;
1.1.1.6 ! root      880: 
        !           881:     if (x1 == 0) {
        !           882:         raise_exception(TT_DIV_ZERO);
        !           883:     }
        !           884: 
1.1       root      885:     x0 = x0 / x1;
                    886:     if ((int32_t) x0 != x0) {
1.1.1.6 ! root      887:         T0 = x0 < 0? 0x80000000: 0x7fffffff;
        !           888:         T1 = 1;
1.1       root      889:     } else {
1.1.1.6 ! root      890:         T0 = x0;
        !           891:         T1 = 0;
1.1       root      892:     }
                    893:     FORCE_RET();
                    894: }
                    895: 
                    896: void OPPROTO op_div_cc(void)
                    897: {
                    898:     env->psr = 0;
                    899: #ifdef TARGET_SPARC64
                    900:     if (!T0)
1.1.1.6 ! root      901:         env->psr |= PSR_ZERO;
1.1       root      902:     if ((int32_t) T0 < 0)
1.1.1.6 ! root      903:         env->psr |= PSR_NEG;
1.1       root      904:     if (T1)
1.1.1.6 ! root      905:         env->psr |= PSR_OVF;
1.1       root      906: 
                    907:     env->xcc = 0;
                    908:     if (!T0)
1.1.1.6 ! root      909:         env->xcc |= PSR_ZERO;
1.1       root      910:     if ((int64_t) T0 < 0)
1.1.1.6 ! root      911:         env->xcc |= PSR_NEG;
1.1       root      912: #else
                    913:     if (!T0)
1.1.1.6 ! root      914:         env->psr |= PSR_ZERO;
1.1       root      915:     if ((int32_t) T0 < 0)
1.1.1.6 ! root      916:         env->psr |= PSR_NEG;
1.1       root      917:     if (T1)
1.1.1.6 ! root      918:         env->psr |= PSR_OVF;
1.1       root      919: #endif
                    920:     FORCE_RET();
                    921: }
                    922: 
                    923: #ifdef TARGET_SPARC64
                    924: void OPPROTO op_mulx_T1_T0(void)
                    925: {
                    926:     T0 *= T1;
                    927:     FORCE_RET();
                    928: }
                    929: 
                    930: void OPPROTO op_udivx_T1_T0(void)
                    931: {
1.1.1.6 ! root      932:     if (T1 == 0) {
        !           933:         raise_exception(TT_DIV_ZERO);
        !           934:     }
1.1       root      935:     T0 /= T1;
                    936:     FORCE_RET();
                    937: }
                    938: 
                    939: void OPPROTO op_sdivx_T1_T0(void)
                    940: {
1.1.1.6 ! root      941:     if (T1 == 0) {
        !           942:         raise_exception(TT_DIV_ZERO);
        !           943:     }
1.1       root      944:     if (T0 == INT64_MIN && T1 == -1)
1.1.1.6 ! root      945:         T0 = INT64_MIN;
1.1       root      946:     else
1.1.1.6 ! root      947:         T0 /= (target_long) T1;
1.1       root      948:     FORCE_RET();
                    949: }
                    950: #endif
                    951: 
                    952: void OPPROTO op_logic_T0_cc(void)
                    953: {
                    954:     env->psr = 0;
                    955: #ifdef TARGET_SPARC64
                    956:     if (!(T0 & 0xffffffff))
1.1.1.6 ! root      957:         env->psr |= PSR_ZERO;
1.1       root      958:     if ((int32_t) T0 < 0)
1.1.1.6 ! root      959:         env->psr |= PSR_NEG;
1.1       root      960: 
                    961:     env->xcc = 0;
                    962:     if (!T0)
1.1.1.6 ! root      963:         env->xcc |= PSR_ZERO;
1.1       root      964:     if ((int64_t) T0 < 0)
1.1.1.6 ! root      965:         env->xcc |= PSR_NEG;
1.1       root      966: #else
                    967:     if (!T0)
1.1.1.6 ! root      968:         env->psr |= PSR_ZERO;
1.1       root      969:     if ((int32_t) T0 < 0)
1.1.1.6 ! root      970:         env->psr |= PSR_NEG;
1.1       root      971: #endif
                    972:     FORCE_RET();
                    973: }
                    974: 
                    975: void OPPROTO op_sll(void)
                    976: {
1.1.1.6 ! root      977:     T0 <<= (T1 & 0x1f);
1.1       root      978: }
                    979: 
                    980: #ifdef TARGET_SPARC64
1.1.1.6 ! root      981: void OPPROTO op_sllx(void)
        !           982: {
        !           983:     T0 <<= (T1 & 0x3f);
        !           984: }
        !           985: 
1.1       root      986: void OPPROTO op_srl(void)
                    987: {
1.1.1.6 ! root      988:     T0 = (T0 & 0xffffffff) >> (T1 & 0x1f);
1.1       root      989: }
                    990: 
                    991: void OPPROTO op_srlx(void)
                    992: {
1.1.1.6 ! root      993:     T0 >>= (T1 & 0x3f);
1.1       root      994: }
                    995: 
                    996: void OPPROTO op_sra(void)
                    997: {
1.1.1.6 ! root      998:     T0 = ((int32_t) (T0 & 0xffffffff)) >> (T1 & 0x1f);
1.1       root      999: }
                   1000: 
                   1001: void OPPROTO op_srax(void)
                   1002: {
1.1.1.6 ! root     1003:     T0 = ((int64_t) T0) >> (T1 & 0x3f);
1.1       root     1004: }
                   1005: #else
                   1006: void OPPROTO op_srl(void)
                   1007: {
1.1.1.6 ! root     1008:     T0 >>= (T1 & 0x1f);
1.1       root     1009: }
                   1010: 
                   1011: void OPPROTO op_sra(void)
                   1012: {
1.1.1.6 ! root     1013:     T0 = ((int32_t) T0) >> (T1 & 0x1f);
1.1       root     1014: }
                   1015: #endif
                   1016: 
                   1017: /* Load and store */
                   1018: #define MEMSUFFIX _raw
                   1019: #include "op_mem.h"
                   1020: #if !defined(CONFIG_USER_ONLY)
                   1021: #define MEMSUFFIX _user
                   1022: #include "op_mem.h"
                   1023: 
                   1024: #define MEMSUFFIX _kernel
                   1025: #include "op_mem.h"
1.1.1.6 ! root     1026: 
        !          1027: #ifdef TARGET_SPARC64
        !          1028: #define MEMSUFFIX _hypv
        !          1029: #include "op_mem.h"
        !          1030: #endif
1.1       root     1031: #endif
                   1032: 
                   1033: void OPPROTO op_ldfsr(void)
                   1034: {
                   1035:     PUT_FSR32(env, *((uint32_t *) &FT0));
                   1036:     helper_ldfsr();
                   1037: }
                   1038: 
                   1039: void OPPROTO op_stfsr(void)
                   1040: {
                   1041:     *((uint32_t *) &FT0) = GET_FSR32(env);
                   1042: }
                   1043: 
                   1044: #ifndef TARGET_SPARC64
                   1045: void OPPROTO op_rdpsr(void)
                   1046: {
                   1047:     do_rdpsr();
                   1048: }
                   1049: 
                   1050: void OPPROTO op_wrpsr(void)
                   1051: {
                   1052:     do_wrpsr();
                   1053:     FORCE_RET();
                   1054: }
                   1055: 
1.1.1.5   root     1056: void OPPROTO op_wrwim(void)
                   1057: {
                   1058: #if NWINDOWS == 32
                   1059:     env->wim = T0;
                   1060: #else
                   1061:     env->wim = T0 & ((1 << NWINDOWS) - 1);
                   1062: #endif
                   1063: }
                   1064: 
1.1       root     1065: void OPPROTO op_rett(void)
                   1066: {
                   1067:     helper_rett();
                   1068:     FORCE_RET();
                   1069: }
                   1070: 
                   1071: /* XXX: use another pointer for %iN registers to avoid slow wrapping
                   1072:    handling ? */
                   1073: void OPPROTO op_save(void)
                   1074: {
                   1075:     uint32_t cwp;
1.1.1.6 ! root     1076:     cwp = (env->cwp - 1) & (NWINDOWS - 1);
1.1       root     1077:     if (env->wim & (1 << cwp)) {
                   1078:         raise_exception(TT_WIN_OVF);
                   1079:     }
                   1080:     set_cwp(cwp);
                   1081:     FORCE_RET();
                   1082: }
                   1083: 
                   1084: void OPPROTO op_restore(void)
                   1085: {
                   1086:     uint32_t cwp;
1.1.1.6 ! root     1087:     cwp = (env->cwp + 1) & (NWINDOWS - 1);
1.1       root     1088:     if (env->wim & (1 << cwp)) {
                   1089:         raise_exception(TT_WIN_UNF);
                   1090:     }
                   1091:     set_cwp(cwp);
                   1092:     FORCE_RET();
                   1093: }
                   1094: #else
                   1095: void OPPROTO op_rdccr(void)
                   1096: {
                   1097:     T0 = GET_CCR(env);
                   1098: }
                   1099: 
                   1100: void OPPROTO op_wrccr(void)
                   1101: {
                   1102:     PUT_CCR(env, T0);
                   1103: }
                   1104: 
                   1105: void OPPROTO op_rdtick(void)
                   1106: {
1.1.1.6 ! root     1107:     T0 = do_tick_get_count(env->tick);
1.1       root     1108: }
                   1109: 
                   1110: void OPPROTO op_wrtick(void)
                   1111: {
1.1.1.6 ! root     1112:     do_tick_set_count(env->tick, T0);
        !          1113: }
        !          1114: 
        !          1115: void OPPROTO op_wrtick_cmpr(void)
        !          1116: {
        !          1117:     do_tick_set_limit(env->tick, T0);
        !          1118: }
        !          1119: 
        !          1120: void OPPROTO op_rdstick(void)
        !          1121: {
        !          1122:     T0 = do_tick_get_count(env->stick);
        !          1123: }
        !          1124: 
        !          1125: void OPPROTO op_wrstick(void)
        !          1126: {
        !          1127:     do_tick_set_count(env->stick, T0);
        !          1128:     do_tick_set_count(env->hstick, T0);
        !          1129: }
        !          1130: 
        !          1131: void OPPROTO op_wrstick_cmpr(void)
        !          1132: {
        !          1133:     do_tick_set_limit(env->stick, T0);
        !          1134: }
        !          1135: 
        !          1136: void OPPROTO op_wrhstick_cmpr(void)
        !          1137: {
        !          1138:     do_tick_set_limit(env->hstick, T0);
1.1       root     1139: }
                   1140: 
                   1141: void OPPROTO op_rdtpc(void)
                   1142: {
                   1143:     T0 = env->tpc[env->tl];
                   1144: }
                   1145: 
                   1146: void OPPROTO op_wrtpc(void)
                   1147: {
                   1148:     env->tpc[env->tl] = T0;
                   1149: }
                   1150: 
                   1151: void OPPROTO op_rdtnpc(void)
                   1152: {
                   1153:     T0 = env->tnpc[env->tl];
                   1154: }
                   1155: 
                   1156: void OPPROTO op_wrtnpc(void)
                   1157: {
                   1158:     env->tnpc[env->tl] = T0;
                   1159: }
                   1160: 
                   1161: void OPPROTO op_rdtstate(void)
                   1162: {
                   1163:     T0 = env->tstate[env->tl];
                   1164: }
                   1165: 
                   1166: void OPPROTO op_wrtstate(void)
                   1167: {
                   1168:     env->tstate[env->tl] = T0;
                   1169: }
                   1170: 
                   1171: void OPPROTO op_rdtt(void)
                   1172: {
                   1173:     T0 = env->tt[env->tl];
                   1174: }
                   1175: 
                   1176: void OPPROTO op_wrtt(void)
                   1177: {
                   1178:     env->tt[env->tl] = T0;
                   1179: }
                   1180: 
                   1181: void OPPROTO op_rdpstate(void)
                   1182: {
                   1183:     T0 = env->pstate;
                   1184: }
                   1185: 
                   1186: void OPPROTO op_wrpstate(void)
                   1187: {
                   1188:     do_wrpstate();
                   1189: }
                   1190: 
                   1191: // CWP handling is reversed in V9, but we still use the V8 register
                   1192: // order.
                   1193: void OPPROTO op_rdcwp(void)
                   1194: {
1.1.1.6 ! root     1195:     T0 = GET_CWP64(env);
1.1       root     1196: }
                   1197: 
                   1198: void OPPROTO op_wrcwp(void)
                   1199: {
1.1.1.6 ! root     1200:     PUT_CWP64(env, T0);
1.1       root     1201: }
                   1202: 
                   1203: /* XXX: use another pointer for %iN registers to avoid slow wrapping
                   1204:    handling ? */
                   1205: void OPPROTO op_save(void)
                   1206: {
                   1207:     uint32_t cwp;
1.1.1.6 ! root     1208:     cwp = (env->cwp - 1) & (NWINDOWS - 1);
1.1       root     1209:     if (env->cansave == 0) {
1.1.1.6 ! root     1210:         raise_exception(TT_SPILL | (env->otherwin != 0 ?
        !          1211:                                     (TT_WOTHER | ((env->wstate & 0x38) >> 1)):
        !          1212:                                     ((env->wstate & 0x7) << 2)));
1.1       root     1213:     } else {
1.1.1.6 ! root     1214:         if (env->cleanwin - env->canrestore == 0) {
        !          1215:             // XXX Clean windows without trap
        !          1216:             raise_exception(TT_CLRWIN);
        !          1217:         } else {
        !          1218:             env->cansave--;
        !          1219:             env->canrestore++;
        !          1220:             set_cwp(cwp);
        !          1221:         }
1.1       root     1222:     }
                   1223:     FORCE_RET();
                   1224: }
                   1225: 
                   1226: void OPPROTO op_restore(void)
                   1227: {
                   1228:     uint32_t cwp;
1.1.1.6 ! root     1229:     cwp = (env->cwp + 1) & (NWINDOWS - 1);
1.1       root     1230:     if (env->canrestore == 0) {
1.1.1.6 ! root     1231:         raise_exception(TT_FILL | (env->otherwin != 0 ?
        !          1232:                                    (TT_WOTHER | ((env->wstate & 0x38) >> 1)):
        !          1233:                                    ((env->wstate & 0x7) << 2)));
1.1       root     1234:     } else {
1.1.1.6 ! root     1235:         env->cansave++;
        !          1236:         env->canrestore--;
        !          1237:         set_cwp(cwp);
1.1       root     1238:     }
                   1239:     FORCE_RET();
                   1240: }
                   1241: #endif
                   1242: 
                   1243: void OPPROTO op_exception(void)
                   1244: {
                   1245:     env->exception_index = PARAM1;
                   1246:     cpu_loop_exit();
1.1.1.6 ! root     1247:     FORCE_RET();
1.1       root     1248: }
                   1249: 
                   1250: void OPPROTO op_trap_T0(void)
                   1251: {
                   1252:     env->exception_index = TT_TRAP + (T0 & 0x7f);
                   1253:     cpu_loop_exit();
1.1.1.6 ! root     1254:     FORCE_RET();
1.1       root     1255: }
                   1256: 
                   1257: void OPPROTO op_trapcc_T0(void)
                   1258: {
                   1259:     if (T2) {
                   1260:         env->exception_index = TT_TRAP + (T0 & 0x7f);
                   1261:         cpu_loop_exit();
                   1262:     }
                   1263:     FORCE_RET();
                   1264: }
                   1265: 
                   1266: void OPPROTO op_fpexception_im(void)
                   1267: {
                   1268:     env->exception_index = TT_FP_EXCP;
                   1269:     env->fsr &= ~FSR_FTT_MASK;
                   1270:     env->fsr |= PARAM1;
                   1271:     cpu_loop_exit();
                   1272:     FORCE_RET();
                   1273: }
                   1274: 
                   1275: void OPPROTO op_debug(void)
                   1276: {
                   1277:     helper_debug();
                   1278: }
                   1279: 
                   1280: void OPPROTO op_exit_tb(void)
                   1281: {
                   1282:     EXIT_TB();
                   1283: }
                   1284: 
                   1285: void OPPROTO op_eval_ba(void)
                   1286: {
                   1287:     T2 = 1;
                   1288: }
                   1289: 
                   1290: void OPPROTO op_eval_be(void)
                   1291: {
                   1292:     T2 = FLAG_SET(PSR_ZERO);
                   1293: }
                   1294: 
                   1295: void OPPROTO op_eval_ble(void)
                   1296: {
                   1297:     target_ulong Z = FLAG_SET(PSR_ZERO), N = FLAG_SET(PSR_NEG), V = FLAG_SET(PSR_OVF);
1.1.1.6 ! root     1298: 
1.1       root     1299:     T2 = Z | (N ^ V);
                   1300: }
                   1301: 
                   1302: void OPPROTO op_eval_bl(void)
                   1303: {
                   1304:     target_ulong N = FLAG_SET(PSR_NEG), V = FLAG_SET(PSR_OVF);
                   1305: 
                   1306:     T2 = N ^ V;
                   1307: }
                   1308: 
                   1309: void OPPROTO op_eval_bleu(void)
                   1310: {
                   1311:     target_ulong Z = FLAG_SET(PSR_ZERO), C = FLAG_SET(PSR_CARRY);
                   1312: 
                   1313:     T2 = C | Z;
                   1314: }
                   1315: 
                   1316: void OPPROTO op_eval_bcs(void)
                   1317: {
                   1318:     T2 = FLAG_SET(PSR_CARRY);
                   1319: }
                   1320: 
                   1321: void OPPROTO op_eval_bvs(void)
                   1322: {
                   1323:     T2 = FLAG_SET(PSR_OVF);
                   1324: }
                   1325: 
                   1326: void OPPROTO op_eval_bn(void)
                   1327: {
                   1328:     T2 = 0;
                   1329: }
                   1330: 
                   1331: void OPPROTO op_eval_bneg(void)
                   1332: {
                   1333:     T2 = FLAG_SET(PSR_NEG);
                   1334: }
                   1335: 
                   1336: void OPPROTO op_eval_bne(void)
                   1337: {
                   1338:     T2 = !FLAG_SET(PSR_ZERO);
                   1339: }
                   1340: 
                   1341: void OPPROTO op_eval_bg(void)
                   1342: {
                   1343:     target_ulong Z = FLAG_SET(PSR_ZERO), N = FLAG_SET(PSR_NEG), V = FLAG_SET(PSR_OVF);
                   1344: 
                   1345:     T2 = !(Z | (N ^ V));
                   1346: }
                   1347: 
                   1348: void OPPROTO op_eval_bge(void)
                   1349: {
                   1350:     target_ulong N = FLAG_SET(PSR_NEG), V = FLAG_SET(PSR_OVF);
                   1351: 
                   1352:     T2 = !(N ^ V);
                   1353: }
                   1354: 
                   1355: void OPPROTO op_eval_bgu(void)
                   1356: {
                   1357:     target_ulong Z = FLAG_SET(PSR_ZERO), C = FLAG_SET(PSR_CARRY);
                   1358: 
                   1359:     T2 = !(C | Z);
                   1360: }
                   1361: 
                   1362: void OPPROTO op_eval_bcc(void)
                   1363: {
                   1364:     T2 = !FLAG_SET(PSR_CARRY);
                   1365: }
                   1366: 
                   1367: void OPPROTO op_eval_bpos(void)
                   1368: {
                   1369:     T2 = !FLAG_SET(PSR_NEG);
                   1370: }
                   1371: 
                   1372: void OPPROTO op_eval_bvc(void)
                   1373: {
                   1374:     T2 = !FLAG_SET(PSR_OVF);
                   1375: }
                   1376: 
                   1377: #ifdef TARGET_SPARC64
                   1378: void OPPROTO op_eval_xbe(void)
                   1379: {
                   1380:     T2 = XFLAG_SET(PSR_ZERO);
                   1381: }
                   1382: 
                   1383: void OPPROTO op_eval_xble(void)
                   1384: {
                   1385:     target_ulong Z = XFLAG_SET(PSR_ZERO), N = XFLAG_SET(PSR_NEG), V = XFLAG_SET(PSR_OVF);
1.1.1.6 ! root     1386: 
1.1       root     1387:     T2 = Z | (N ^ V);
                   1388: }
                   1389: 
                   1390: void OPPROTO op_eval_xbl(void)
                   1391: {
                   1392:     target_ulong N = XFLAG_SET(PSR_NEG), V = XFLAG_SET(PSR_OVF);
                   1393: 
                   1394:     T2 = N ^ V;
                   1395: }
                   1396: 
                   1397: void OPPROTO op_eval_xbleu(void)
                   1398: {
                   1399:     target_ulong Z = XFLAG_SET(PSR_ZERO), C = XFLAG_SET(PSR_CARRY);
                   1400: 
                   1401:     T2 = C | Z;
                   1402: }
                   1403: 
                   1404: void OPPROTO op_eval_xbcs(void)
                   1405: {
                   1406:     T2 = XFLAG_SET(PSR_CARRY);
                   1407: }
                   1408: 
                   1409: void OPPROTO op_eval_xbvs(void)
                   1410: {
                   1411:     T2 = XFLAG_SET(PSR_OVF);
                   1412: }
                   1413: 
                   1414: void OPPROTO op_eval_xbneg(void)
                   1415: {
                   1416:     T2 = XFLAG_SET(PSR_NEG);
                   1417: }
                   1418: 
                   1419: void OPPROTO op_eval_xbne(void)
                   1420: {
                   1421:     T2 = !XFLAG_SET(PSR_ZERO);
                   1422: }
                   1423: 
                   1424: void OPPROTO op_eval_xbg(void)
                   1425: {
                   1426:     target_ulong Z = XFLAG_SET(PSR_ZERO), N = XFLAG_SET(PSR_NEG), V = XFLAG_SET(PSR_OVF);
                   1427: 
                   1428:     T2 = !(Z | (N ^ V));
                   1429: }
                   1430: 
                   1431: void OPPROTO op_eval_xbge(void)
                   1432: {
                   1433:     target_ulong N = XFLAG_SET(PSR_NEG), V = XFLAG_SET(PSR_OVF);
                   1434: 
                   1435:     T2 = !(N ^ V);
                   1436: }
                   1437: 
                   1438: void OPPROTO op_eval_xbgu(void)
                   1439: {
                   1440:     target_ulong Z = XFLAG_SET(PSR_ZERO), C = XFLAG_SET(PSR_CARRY);
                   1441: 
                   1442:     T2 = !(C | Z);
                   1443: }
                   1444: 
                   1445: void OPPROTO op_eval_xbcc(void)
                   1446: {
                   1447:     T2 = !XFLAG_SET(PSR_CARRY);
                   1448: }
                   1449: 
                   1450: void OPPROTO op_eval_xbpos(void)
                   1451: {
                   1452:     T2 = !XFLAG_SET(PSR_NEG);
                   1453: }
                   1454: 
                   1455: void OPPROTO op_eval_xbvc(void)
                   1456: {
                   1457:     T2 = !XFLAG_SET(PSR_OVF);
                   1458: }
                   1459: #endif
                   1460: 
                   1461: #define FCC
                   1462: #define FFLAG_SET(x) (env->fsr & x? 1: 0)
                   1463: #include "fbranch_template.h"
                   1464: 
                   1465: #ifdef TARGET_SPARC64
                   1466: #define FCC _fcc1
                   1467: #define FFLAG_SET(x) ((env->fsr & ((uint64_t)x >> 32))? 1: 0)
                   1468: #include "fbranch_template.h"
                   1469: #define FCC _fcc2
                   1470: #define FFLAG_SET(x) ((env->fsr & ((uint64_t)x >> 34))? 1: 0)
                   1471: #include "fbranch_template.h"
                   1472: #define FCC _fcc3
                   1473: #define FFLAG_SET(x) ((env->fsr & ((uint64_t)x >> 36))? 1: 0)
                   1474: #include "fbranch_template.h"
                   1475: #endif
                   1476: 
                   1477: #ifdef TARGET_SPARC64
                   1478: void OPPROTO op_eval_brz(void)
                   1479: {
                   1480:     T2 = (T0 == 0);
                   1481: }
                   1482: 
                   1483: void OPPROTO op_eval_brnz(void)
                   1484: {
                   1485:     T2 = (T0 != 0);
                   1486: }
                   1487: 
                   1488: void OPPROTO op_eval_brlz(void)
                   1489: {
                   1490:     T2 = ((int64_t)T0 < 0);
                   1491: }
                   1492: 
                   1493: void OPPROTO op_eval_brlez(void)
                   1494: {
                   1495:     T2 = ((int64_t)T0 <= 0);
                   1496: }
                   1497: 
                   1498: void OPPROTO op_eval_brgz(void)
                   1499: {
                   1500:     T2 = ((int64_t)T0 > 0);
                   1501: }
                   1502: 
                   1503: void OPPROTO op_eval_brgez(void)
                   1504: {
                   1505:     T2 = ((int64_t)T0 >= 0);
                   1506: }
                   1507: 
                   1508: void OPPROTO op_jmp_im64(void)
                   1509: {
                   1510:     env->pc = PARAMQ1;
                   1511: }
                   1512: 
                   1513: void OPPROTO op_movq_npc_im64(void)
                   1514: {
                   1515:     env->npc = PARAMQ1;
                   1516: }
                   1517: #endif
                   1518: 
                   1519: void OPPROTO op_jmp_im(void)
                   1520: {
                   1521:     env->pc = (uint32_t)PARAM1;
                   1522: }
                   1523: 
                   1524: void OPPROTO op_movl_npc_im(void)
                   1525: {
                   1526:     env->npc = (uint32_t)PARAM1;
                   1527: }
                   1528: 
                   1529: void OPPROTO op_movl_npc_T0(void)
                   1530: {
                   1531:     env->npc = T0;
                   1532: }
                   1533: 
                   1534: void OPPROTO op_mov_pc_npc(void)
                   1535: {
                   1536:     env->pc = env->npc;
                   1537: }
                   1538: 
                   1539: void OPPROTO op_next_insn(void)
                   1540: {
                   1541:     env->pc = env->npc;
                   1542:     env->npc = env->npc + 4;
                   1543: }
                   1544: 
                   1545: void OPPROTO op_goto_tb0(void)
                   1546: {
                   1547:     GOTO_TB(op_goto_tb0, PARAM1, 0);
                   1548: }
                   1549: 
                   1550: void OPPROTO op_goto_tb1(void)
                   1551: {
                   1552:     GOTO_TB(op_goto_tb1, PARAM1, 1);
                   1553: }
                   1554: 
                   1555: void OPPROTO op_jmp_label(void)
                   1556: {
                   1557:     GOTO_LABEL_PARAM(1);
                   1558: }
                   1559: 
                   1560: void OPPROTO op_jnz_T2_label(void)
                   1561: {
                   1562:     if (T2)
                   1563:         GOTO_LABEL_PARAM(1);
                   1564:     FORCE_RET();
                   1565: }
                   1566: 
                   1567: void OPPROTO op_jz_T2_label(void)
                   1568: {
                   1569:     if (!T2)
                   1570:         GOTO_LABEL_PARAM(1);
                   1571:     FORCE_RET();
                   1572: }
                   1573: 
                   1574: void OPPROTO op_flush_T0(void)
                   1575: {
                   1576:     helper_flush(T0);
                   1577: }
                   1578: 
1.1.1.6 ! root     1579: void OPPROTO op_clear_ieee_excp_and_FTT(void)
        !          1580: {
        !          1581:     env->fsr &= ~(FSR_FTT_MASK | FSR_CEXC_MASK);;
        !          1582: }
        !          1583: 
1.1.1.4   root     1584: #define F_OP(name, p) void OPPROTO op_f##name##p(void)
1.1       root     1585: 
1.1.1.6 ! root     1586: #if defined(CONFIG_USER_ONLY)
1.1.1.4   root     1587: #define F_BINOP(name)                                           \
                   1588:     F_OP(name, s)                                               \
                   1589:     {                                                           \
1.1.1.6 ! root     1590:         set_float_exception_flags(0, &env->fp_status);          \
1.1.1.4   root     1591:         FT0 = float32_ ## name (FT0, FT1, &env->fp_status);     \
1.1.1.6 ! root     1592:         check_ieee_exceptions();                                \
1.1.1.4   root     1593:     }                                                           \
                   1594:     F_OP(name, d)                                               \
                   1595:     {                                                           \
1.1.1.6 ! root     1596:         set_float_exception_flags(0, &env->fp_status);          \
1.1.1.4   root     1597:         DT0 = float64_ ## name (DT0, DT1, &env->fp_status);     \
1.1.1.6 ! root     1598:         check_ieee_exceptions();                                \
        !          1599:     }                                                           \
        !          1600:     F_OP(name, q)                                               \
        !          1601:     {                                                           \
        !          1602:         set_float_exception_flags(0, &env->fp_status);          \
        !          1603:         QT0 = float128_ ## name (QT0, QT1, &env->fp_status);    \
        !          1604:         check_ieee_exceptions();                                \
1.1.1.4   root     1605:     }
1.1.1.6 ! root     1606: #else
        !          1607: #define F_BINOP(name)                                           \
        !          1608:     F_OP(name, s)                                               \
        !          1609:     {                                                           \
        !          1610:         set_float_exception_flags(0, &env->fp_status);          \
        !          1611:         FT0 = float32_ ## name (FT0, FT1, &env->fp_status);     \
        !          1612:         check_ieee_exceptions();                                \
        !          1613:     }                                                           \
        !          1614:     F_OP(name, d)                                               \
        !          1615:     {                                                           \
        !          1616:         set_float_exception_flags(0, &env->fp_status);          \
        !          1617:         DT0 = float64_ ## name (DT0, DT1, &env->fp_status);     \
        !          1618:         check_ieee_exceptions();                                \
        !          1619:     }
        !          1620: #endif
1.1       root     1621: 
1.1.1.4   root     1622: F_BINOP(add);
                   1623: F_BINOP(sub);
                   1624: F_BINOP(mul);
                   1625: F_BINOP(div);
                   1626: #undef F_BINOP
1.1       root     1627: 
                   1628: void OPPROTO op_fsmuld(void)
                   1629: {
1.1.1.6 ! root     1630:     set_float_exception_flags(0, &env->fp_status);
1.1.1.4   root     1631:     DT0 = float64_mul(float32_to_float64(FT0, &env->fp_status),
                   1632:                       float32_to_float64(FT1, &env->fp_status),
                   1633:                       &env->fp_status);
1.1.1.6 ! root     1634:     check_ieee_exceptions();
1.1       root     1635: }
                   1636: 
1.1.1.6 ! root     1637: #if defined(CONFIG_USER_ONLY)
        !          1638: void OPPROTO op_fdmulq(void)
        !          1639: {
        !          1640:     set_float_exception_flags(0, &env->fp_status);
        !          1641:     QT0 = float128_mul(float64_to_float128(DT0, &env->fp_status),
        !          1642:                        float64_to_float128(DT1, &env->fp_status),
        !          1643:                        &env->fp_status);
        !          1644:     check_ieee_exceptions();
        !          1645: }
        !          1646: #endif
        !          1647: 
        !          1648: #if defined(CONFIG_USER_ONLY)
        !          1649: #define F_HELPER(name)    \
        !          1650:     F_OP(name, s)         \
        !          1651:     {                     \
        !          1652:         do_f##name##s();  \
        !          1653:     }                     \
        !          1654:     F_OP(name, d)         \
        !          1655:     {                     \
        !          1656:         do_f##name##d();  \
        !          1657:     }                     \
        !          1658:     F_OP(name, q)         \
        !          1659:     {                     \
        !          1660:         do_f##name##q();  \
        !          1661:     }
        !          1662: #else
1.1.1.4   root     1663: #define F_HELPER(name)    \
                   1664:     F_OP(name, s)         \
                   1665:     {                     \
                   1666:         do_f##name##s();  \
                   1667:     }                     \
                   1668:     F_OP(name, d)         \
                   1669:     {                     \
                   1670:         do_f##name##d();  \
                   1671:     }
1.1.1.6 ! root     1672: #endif
1.1       root     1673: 
1.1.1.4   root     1674: F_HELPER(sqrt);
1.1       root     1675: 
1.1.1.4   root     1676: F_OP(neg, s)
1.1       root     1677: {
1.1.1.4   root     1678:     FT0 = float32_chs(FT1);
1.1       root     1679: }
                   1680: 
1.1.1.4   root     1681: F_OP(abs, s)
1.1       root     1682: {
1.1.1.4   root     1683:     do_fabss();
1.1       root     1684: }
                   1685: 
1.1.1.4   root     1686: F_HELPER(cmp);
1.1.1.6 ! root     1687: F_HELPER(cmpe);
1.1       root     1688: 
1.1.1.4   root     1689: #ifdef TARGET_SPARC64
                   1690: F_OP(neg, d)
1.1       root     1691: {
1.1.1.4   root     1692:     DT0 = float64_chs(DT1);
1.1       root     1693: }
                   1694: 
1.1.1.4   root     1695: F_OP(abs, d)
1.1       root     1696: {
1.1.1.4   root     1697:     do_fabsd();
1.1       root     1698: }
                   1699: 
1.1.1.6 ! root     1700: #if defined(CONFIG_USER_ONLY)
        !          1701: F_OP(neg, q)
        !          1702: {
        !          1703:     QT0 = float128_chs(QT1);
        !          1704: }
        !          1705: 
        !          1706: F_OP(abs, q)
        !          1707: {
        !          1708:     do_fabsd();
        !          1709: }
        !          1710: #endif
        !          1711: 
1.1       root     1712: void OPPROTO op_fcmps_fcc1(void)
                   1713: {
                   1714:     do_fcmps_fcc1();
                   1715: }
                   1716: 
                   1717: void OPPROTO op_fcmpd_fcc1(void)
                   1718: {
                   1719:     do_fcmpd_fcc1();
                   1720: }
                   1721: 
                   1722: void OPPROTO op_fcmps_fcc2(void)
                   1723: {
                   1724:     do_fcmps_fcc2();
                   1725: }
                   1726: 
                   1727: void OPPROTO op_fcmpd_fcc2(void)
                   1728: {
                   1729:     do_fcmpd_fcc2();
                   1730: }
                   1731: 
                   1732: void OPPROTO op_fcmps_fcc3(void)
                   1733: {
                   1734:     do_fcmps_fcc3();
                   1735: }
                   1736: 
                   1737: void OPPROTO op_fcmpd_fcc3(void)
                   1738: {
                   1739:     do_fcmpd_fcc3();
                   1740: }
1.1.1.6 ! root     1741: 
        !          1742: void OPPROTO op_fcmpes_fcc1(void)
        !          1743: {
        !          1744:     do_fcmpes_fcc1();
        !          1745: }
        !          1746: 
        !          1747: void OPPROTO op_fcmped_fcc1(void)
        !          1748: {
        !          1749:     do_fcmped_fcc1();
        !          1750: }
        !          1751: 
        !          1752: void OPPROTO op_fcmpes_fcc2(void)
        !          1753: {
        !          1754:     do_fcmpes_fcc2();
        !          1755: }
        !          1756: 
        !          1757: void OPPROTO op_fcmped_fcc2(void)
        !          1758: {
        !          1759:     do_fcmped_fcc2();
        !          1760: }
        !          1761: 
        !          1762: void OPPROTO op_fcmpes_fcc3(void)
        !          1763: {
        !          1764:     do_fcmpes_fcc3();
        !          1765: }
        !          1766: 
        !          1767: void OPPROTO op_fcmped_fcc3(void)
        !          1768: {
        !          1769:     do_fcmped_fcc3();
        !          1770: }
        !          1771: 
        !          1772: #if defined(CONFIG_USER_ONLY)
        !          1773: void OPPROTO op_fcmpq_fcc1(void)
        !          1774: {
        !          1775:     do_fcmpq_fcc1();
        !          1776: }
        !          1777: 
        !          1778: void OPPROTO op_fcmpq_fcc2(void)
        !          1779: {
        !          1780:     do_fcmpq_fcc2();
        !          1781: }
        !          1782: 
        !          1783: void OPPROTO op_fcmpq_fcc3(void)
        !          1784: {
        !          1785:     do_fcmpq_fcc3();
        !          1786: }
        !          1787: 
        !          1788: void OPPROTO op_fcmpeq_fcc1(void)
        !          1789: {
        !          1790:     do_fcmpeq_fcc1();
        !          1791: }
        !          1792: 
        !          1793: void OPPROTO op_fcmpeq_fcc2(void)
        !          1794: {
        !          1795:     do_fcmpeq_fcc2();
        !          1796: }
        !          1797: 
        !          1798: void OPPROTO op_fcmpeq_fcc3(void)
        !          1799: {
        !          1800:     do_fcmpeq_fcc3();
        !          1801: }
        !          1802: #endif
        !          1803: 
1.1       root     1804: #endif
                   1805: 
1.1.1.4   root     1806: /* Integer to float conversion.  */
1.1       root     1807: #ifdef USE_INT_TO_FLOAT_HELPERS
1.1.1.4   root     1808: F_HELPER(ito);
1.1.1.6 ! root     1809: #ifdef TARGET_SPARC64
        !          1810: F_HELPER(xto);
        !          1811: #endif
1.1       root     1812: #else
1.1.1.4   root     1813: F_OP(ito, s)
1.1       root     1814: {
1.1.1.6 ! root     1815:     set_float_exception_flags(0, &env->fp_status);
1.1.1.4   root     1816:     FT0 = int32_to_float32(*((int32_t *)&FT1), &env->fp_status);
1.1.1.6 ! root     1817:     check_ieee_exceptions();
1.1       root     1818: }
                   1819: 
1.1.1.4   root     1820: F_OP(ito, d)
1.1       root     1821: {
1.1.1.6 ! root     1822:     set_float_exception_flags(0, &env->fp_status);
1.1.1.4   root     1823:     DT0 = int32_to_float64(*((int32_t *)&FT1), &env->fp_status);
1.1.1.6 ! root     1824:     check_ieee_exceptions();
        !          1825: }
        !          1826: 
        !          1827: #if defined(CONFIG_USER_ONLY)
        !          1828: F_OP(ito, q)
        !          1829: {
        !          1830:     set_float_exception_flags(0, &env->fp_status);
        !          1831:     QT0 = int32_to_float128(*((int32_t *)&FT1), &env->fp_status);
        !          1832:     check_ieee_exceptions();
1.1       root     1833: }
1.1.1.6 ! root     1834: #endif
1.1       root     1835: 
                   1836: #ifdef TARGET_SPARC64
1.1.1.4   root     1837: F_OP(xto, s)
1.1       root     1838: {
1.1.1.6 ! root     1839:     set_float_exception_flags(0, &env->fp_status);
1.1.1.4   root     1840:     FT0 = int64_to_float32(*((int64_t *)&DT1), &env->fp_status);
1.1.1.6 ! root     1841:     check_ieee_exceptions();
1.1       root     1842: }
                   1843: 
1.1.1.4   root     1844: F_OP(xto, d)
1.1       root     1845: {
1.1.1.6 ! root     1846:     set_float_exception_flags(0, &env->fp_status);
1.1.1.4   root     1847:     DT0 = int64_to_float64(*((int64_t *)&DT1), &env->fp_status);
1.1.1.6 ! root     1848:     check_ieee_exceptions();
        !          1849: }
        !          1850: #if defined(CONFIG_USER_ONLY)
        !          1851: F_OP(xto, q)
        !          1852: {
        !          1853:     set_float_exception_flags(0, &env->fp_status);
        !          1854:     QT0 = int64_to_float128(*((int64_t *)&DT1), &env->fp_status);
        !          1855:     check_ieee_exceptions();
1.1       root     1856: }
                   1857: #endif
                   1858: #endif
1.1.1.6 ! root     1859: #endif
1.1.1.4   root     1860: #undef F_HELPER
1.1       root     1861: 
1.1.1.4   root     1862: /* floating point conversion */
1.1       root     1863: void OPPROTO op_fdtos(void)
                   1864: {
1.1.1.6 ! root     1865:     set_float_exception_flags(0, &env->fp_status);
1.1.1.4   root     1866:     FT0 = float64_to_float32(DT1, &env->fp_status);
1.1.1.6 ! root     1867:     check_ieee_exceptions();
1.1       root     1868: }
                   1869: 
                   1870: void OPPROTO op_fstod(void)
                   1871: {
1.1.1.6 ! root     1872:     set_float_exception_flags(0, &env->fp_status);
1.1.1.4   root     1873:     DT0 = float32_to_float64(FT1, &env->fp_status);
1.1.1.6 ! root     1874:     check_ieee_exceptions();
        !          1875: }
        !          1876: 
        !          1877: #if defined(CONFIG_USER_ONLY)
        !          1878: void OPPROTO op_fqtos(void)
        !          1879: {
        !          1880:     set_float_exception_flags(0, &env->fp_status);
        !          1881:     FT0 = float128_to_float32(QT1, &env->fp_status);
        !          1882:     check_ieee_exceptions();
1.1       root     1883: }
                   1884: 
1.1.1.6 ! root     1885: void OPPROTO op_fstoq(void)
        !          1886: {
        !          1887:     set_float_exception_flags(0, &env->fp_status);
        !          1888:     QT0 = float32_to_float128(FT1, &env->fp_status);
        !          1889:     check_ieee_exceptions();
        !          1890: }
        !          1891: 
        !          1892: void OPPROTO op_fqtod(void)
        !          1893: {
        !          1894:     set_float_exception_flags(0, &env->fp_status);
        !          1895:     DT0 = float128_to_float64(QT1, &env->fp_status);
        !          1896:     check_ieee_exceptions();
        !          1897: }
        !          1898: 
        !          1899: void OPPROTO op_fdtoq(void)
        !          1900: {
        !          1901:     set_float_exception_flags(0, &env->fp_status);
        !          1902:     QT0 = float64_to_float128(DT1, &env->fp_status);
        !          1903:     check_ieee_exceptions();
        !          1904: }
        !          1905: #endif
        !          1906: 
1.1.1.4   root     1907: /* Float to integer conversion.  */
1.1       root     1908: void OPPROTO op_fstoi(void)
                   1909: {
1.1.1.6 ! root     1910:     set_float_exception_flags(0, &env->fp_status);
        !          1911:     *((int32_t *)&FT0) = float32_to_int32_round_to_zero(FT1, &env->fp_status);
        !          1912:     check_ieee_exceptions();
1.1       root     1913: }
                   1914: 
                   1915: void OPPROTO op_fdtoi(void)
                   1916: {
1.1.1.6 ! root     1917:     set_float_exception_flags(0, &env->fp_status);
        !          1918:     *((int32_t *)&FT0) = float64_to_int32_round_to_zero(DT1, &env->fp_status);
        !          1919:     check_ieee_exceptions();
1.1       root     1920: }
                   1921: 
1.1.1.6 ! root     1922: #if defined(CONFIG_USER_ONLY)
        !          1923: void OPPROTO op_fqtoi(void)
        !          1924: {
        !          1925:     set_float_exception_flags(0, &env->fp_status);
        !          1926:     *((int32_t *)&FT0) = float128_to_int32_round_to_zero(QT1, &env->fp_status);
        !          1927:     check_ieee_exceptions();
        !          1928: }
        !          1929: #endif
        !          1930: 
1.1       root     1931: #ifdef TARGET_SPARC64
                   1932: void OPPROTO op_fstox(void)
                   1933: {
1.1.1.6 ! root     1934:     set_float_exception_flags(0, &env->fp_status);
        !          1935:     *((int64_t *)&DT0) = float32_to_int64_round_to_zero(FT1, &env->fp_status);
        !          1936:     check_ieee_exceptions();
1.1       root     1937: }
                   1938: 
                   1939: void OPPROTO op_fdtox(void)
                   1940: {
1.1.1.6 ! root     1941:     set_float_exception_flags(0, &env->fp_status);
        !          1942:     *((int64_t *)&DT0) = float64_to_int64_round_to_zero(DT1, &env->fp_status);
        !          1943:     check_ieee_exceptions();
1.1       root     1944: }
                   1945: 
1.1.1.6 ! root     1946: #if defined(CONFIG_USER_ONLY)
        !          1947: void OPPROTO op_fqtox(void)
        !          1948: {
        !          1949:     set_float_exception_flags(0, &env->fp_status);
        !          1950:     *((int64_t *)&DT0) = float128_to_int64_round_to_zero(QT1, &env->fp_status);
        !          1951:     check_ieee_exceptions();
        !          1952: }
        !          1953: #endif
        !          1954: 
1.1       root     1955: void OPPROTO op_fmovs_cc(void)
                   1956: {
                   1957:     if (T2)
1.1.1.6 ! root     1958:         FT0 = FT1;
1.1       root     1959: }
                   1960: 
                   1961: void OPPROTO op_fmovd_cc(void)
                   1962: {
                   1963:     if (T2)
1.1.1.6 ! root     1964:         DT0 = DT1;
        !          1965: }
        !          1966: 
        !          1967: #if defined(CONFIG_USER_ONLY)
        !          1968: void OPPROTO op_fmovq_cc(void)
        !          1969: {
        !          1970:     if (T2)
        !          1971:         QT0 = QT1;
1.1       root     1972: }
1.1.1.6 ! root     1973: #endif
1.1       root     1974: 
                   1975: void OPPROTO op_mov_cc(void)
                   1976: {
                   1977:     if (T2)
1.1.1.6 ! root     1978:         T0 = T1;
1.1       root     1979: }
                   1980: 
                   1981: void OPPROTO op_flushw(void)
                   1982: {
                   1983:     if (env->cansave != NWINDOWS - 2) {
1.1.1.6 ! root     1984:         raise_exception(TT_SPILL | (env->otherwin != 0 ?
        !          1985:                                     (TT_WOTHER | ((env->wstate & 0x38) >> 1)):
        !          1986:                                     ((env->wstate & 0x7) << 2)));
1.1       root     1987:     }
                   1988: }
                   1989: 
                   1990: void OPPROTO op_saved(void)
                   1991: {
                   1992:     env->cansave++;
                   1993:     if (env->otherwin == 0)
1.1.1.6 ! root     1994:         env->canrestore--;
1.1.1.4   root     1995:     else
1.1.1.6 ! root     1996:         env->otherwin--;
1.1.1.4   root     1997:     FORCE_RET();
1.1       root     1998: }
                   1999: 
                   2000: void OPPROTO op_restored(void)
                   2001: {
                   2002:     env->canrestore++;
                   2003:     if (env->cleanwin < NWINDOWS - 1)
1.1.1.6 ! root     2004:         env->cleanwin++;
1.1       root     2005:     if (env->otherwin == 0)
1.1.1.6 ! root     2006:         env->cansave--;
1.1       root     2007:     else
1.1.1.6 ! root     2008:         env->otherwin--;
1.1.1.4   root     2009:     FORCE_RET();
1.1       root     2010: }
                   2011: 
                   2012: void OPPROTO op_popc(void)
                   2013: {
                   2014:     do_popc();
                   2015: }
                   2016: 
                   2017: void OPPROTO op_done(void)
                   2018: {
                   2019:     do_done();
                   2020: }
                   2021: 
                   2022: void OPPROTO op_retry(void)
                   2023: {
                   2024:     do_retry();
                   2025: }
                   2026: 
                   2027: void OPPROTO op_sir(void)
                   2028: {
1.1.1.6 ! root     2029:     T0 = 0;  // XXX
1.1       root     2030: }
                   2031: 
                   2032: void OPPROTO op_ld_asi_reg()
                   2033: {
                   2034:     T0 += PARAM1;
                   2035:     helper_ld_asi(env->asi, PARAM2, PARAM3);
                   2036: }
                   2037: 
                   2038: void OPPROTO op_st_asi_reg()
                   2039: {
                   2040:     T0 += PARAM1;
1.1.1.6 ! root     2041:     helper_st_asi(env->asi, PARAM2);
        !          2042: }
        !          2043: 
        !          2044: void OPPROTO op_ldf_asi_reg()
        !          2045: {
        !          2046:     T0 += PARAM1;
        !          2047:     helper_ldf_asi(env->asi, PARAM2, PARAM3);
        !          2048: }
        !          2049: 
        !          2050: void OPPROTO op_stf_asi_reg()
        !          2051: {
        !          2052:     T0 += PARAM1;
        !          2053:     helper_stf_asi(env->asi, PARAM2, PARAM3);
        !          2054: }
        !          2055: 
        !          2056: void OPPROTO op_ldf_asi()
        !          2057: {
        !          2058:     helper_ldf_asi(PARAM1, PARAM2, PARAM3);
        !          2059: }
        !          2060: 
        !          2061: void OPPROTO op_stf_asi()
        !          2062: {
        !          2063:     helper_stf_asi(PARAM1, PARAM2, PARAM3);
        !          2064: }
        !          2065: 
        !          2066: void OPPROTO op_ldstub_asi_reg()             /* XXX: should be atomically */
        !          2067: {
        !          2068:     target_ulong tmp;
        !          2069: 
        !          2070:     T0 += PARAM1;
        !          2071:     helper_ld_asi(env->asi, 1, 0);
        !          2072:     tmp = T1;
        !          2073:     T1 = 0xff;
        !          2074:     helper_st_asi(env->asi, 1);
        !          2075:     T1 = tmp;
        !          2076: }
        !          2077: 
        !          2078: void OPPROTO op_swap_asi_reg()               /* XXX: should be atomically */
        !          2079: {
        !          2080:     target_ulong tmp1, tmp2;
        !          2081: 
        !          2082:     T0 += PARAM1;
        !          2083:     tmp1 = T1;
        !          2084:     helper_ld_asi(env->asi, 4, 0);
        !          2085:     tmp2 = T1;
        !          2086:     T1 = tmp1;
        !          2087:     helper_st_asi(env->asi, 4);
        !          2088:     T1 = tmp2;
        !          2089: }
        !          2090: 
        !          2091: void OPPROTO op_ldda_asi()
        !          2092: {
        !          2093:     helper_ld_asi(PARAM1, 8, 0);
        !          2094:     T0 = T1 & 0xffffffffUL;
        !          2095:     T1 >>= 32;
        !          2096: }
        !          2097: 
        !          2098: void OPPROTO op_ldda_asi_reg()
        !          2099: {
        !          2100:     T0 += PARAM1;
        !          2101:     helper_ld_asi(env->asi, 8, 0);
        !          2102:     T0 = T1 & 0xffffffffUL;
        !          2103:     T1 >>= 32;
        !          2104: }
        !          2105: 
        !          2106: void OPPROTO op_stda_asi()
        !          2107: {
        !          2108:     T1 <<= 32;
        !          2109:     T1 += T2 & 0xffffffffUL;
        !          2110:     helper_st_asi(PARAM1, 8);
        !          2111: }
        !          2112: 
        !          2113: void OPPROTO op_stda_asi_reg()
        !          2114: {
        !          2115:     T0 += PARAM1;
        !          2116:     T1 <<= 32;
        !          2117:     T1 += T2 & 0xffffffffUL;
        !          2118:     helper_st_asi(env->asi, 8);
        !          2119: }
        !          2120: 
        !          2121: void OPPROTO op_cas_asi()                    /* XXX: should be atomically */
        !          2122: {
        !          2123:     target_ulong tmp;
        !          2124: 
        !          2125:     tmp = T1 & 0xffffffffUL;
        !          2126:     helper_ld_asi(PARAM1, 4, 0);
        !          2127:     if (tmp == T1) {
        !          2128:         tmp = T1;
        !          2129:         T1 = T2 & 0xffffffffUL;
        !          2130:         helper_st_asi(PARAM1, 4);
        !          2131:         T1 = tmp;
        !          2132:     }
        !          2133:     T1 &= 0xffffffffUL;
        !          2134: }
        !          2135: 
        !          2136: void OPPROTO op_cas_asi_reg()                /* XXX: should be atomically */
        !          2137: {
        !          2138:     target_ulong tmp;
        !          2139: 
        !          2140:     T0 += PARAM1;
        !          2141:     tmp = T1 & 0xffffffffUL;
        !          2142:     helper_ld_asi(env->asi, 4, 0);
        !          2143:     if (tmp == T1) {
        !          2144:         tmp = T1;
        !          2145:         T1 = T2 & 0xffffffffUL;
        !          2146:         helper_st_asi(env->asi, 4);
        !          2147:         T1 = tmp;
        !          2148:     }
        !          2149:     T1 &= 0xffffffffUL;
        !          2150: }
        !          2151: 
        !          2152: void OPPROTO op_casx_asi()                   /* XXX: should be atomically */
        !          2153: {
        !          2154:     target_ulong tmp;
        !          2155: 
        !          2156:     tmp = T1;
        !          2157:     helper_ld_asi(PARAM1, 8, 0);
        !          2158:     if (tmp == T1) {
        !          2159:         tmp = T1;
        !          2160:         T1 = T2;
        !          2161:         helper_st_asi(PARAM1, 8);
        !          2162:         T1 = tmp;
        !          2163:     }
        !          2164: }
        !          2165: 
        !          2166: void OPPROTO op_casx_asi_reg()               /* XXX: should be atomically */
        !          2167: {
        !          2168:     target_ulong tmp;
        !          2169: 
        !          2170:     T0 += PARAM1;
        !          2171:     tmp = T1;
        !          2172:     helper_ld_asi(env->asi, 8, 0);
        !          2173:     if (tmp == T1) {
        !          2174:         tmp = T1;
        !          2175:         T1 = T2;
        !          2176:         helper_st_asi(env->asi, 8);
        !          2177:         T1 = tmp;
        !          2178:     }
1.1       root     2179: }
                   2180: #endif
                   2181: 
1.1.1.6 ! root     2182: #if !defined(CONFIG_USER_ONLY) || defined(TARGET_SPARC64)
1.1       root     2183: void OPPROTO op_ld_asi()
                   2184: {
                   2185:     helper_ld_asi(PARAM1, PARAM2, PARAM3);
                   2186: }
                   2187: 
                   2188: void OPPROTO op_st_asi()
                   2189: {
1.1.1.6 ! root     2190:     helper_st_asi(PARAM1, PARAM2);
        !          2191: }
        !          2192: 
        !          2193: void OPPROTO op_ldstub_asi()                 /* XXX: should be atomically */
        !          2194: {
        !          2195:     target_ulong tmp;
        !          2196: 
        !          2197:     helper_ld_asi(PARAM1, 1, 0);
        !          2198:     tmp = T1;
        !          2199:     T1 = 0xff;
        !          2200:     helper_st_asi(PARAM1, 1);
        !          2201:     T1 = tmp;
        !          2202: }
        !          2203: 
        !          2204: void OPPROTO op_swap_asi()                   /* XXX: should be atomically */
        !          2205: {
        !          2206:     target_ulong tmp1, tmp2;
        !          2207: 
        !          2208:     tmp1 = T1;
        !          2209:     helper_ld_asi(PARAM1, 4, 0);
        !          2210:     tmp2 = T1;
        !          2211:     T1 = tmp1;
        !          2212:     helper_st_asi(PARAM1, 4);
        !          2213:     T1 = tmp2;
1.1       root     2214: }
1.1.1.6 ! root     2215: #endif
1.1       root     2216: 
1.1.1.4   root     2217: #ifdef TARGET_SPARC64
1.1.1.6 ! root     2218: // This function uses non-native bit order
        !          2219: #define GET_FIELD(X, FROM, TO)                                  \
        !          2220:     ((X) >> (63 - (TO)) & ((1ULL << ((TO) - (FROM) + 1)) - 1))
        !          2221: 
        !          2222: // This function uses the order in the manuals, i.e. bit 0 is 2^0
        !          2223: #define GET_FIELD_SP(X, FROM, TO)               \
        !          2224:     GET_FIELD(X, 63 - (TO), 63 - (FROM))
        !          2225: 
        !          2226: void OPPROTO op_array8()
        !          2227: {
        !          2228:     T0 = (GET_FIELD_SP(T0, 60, 63) << (17 + 2 * T1)) |
        !          2229:         (GET_FIELD_SP(T0, 39, 39 + T1 - 1) << (17 + T1)) |
        !          2230:         (GET_FIELD_SP(T0, 17 + T1 - 1, 17) << 17) |
        !          2231:         (GET_FIELD_SP(T0, 56, 59) << 13) | (GET_FIELD_SP(T0, 35, 38) << 9) |
        !          2232:         (GET_FIELD_SP(T0, 13, 16) << 5) | (((T0 >> 55) & 1) << 4) |
        !          2233:         (GET_FIELD_SP(T0, 33, 34) << 2) | GET_FIELD_SP(T0, 11, 12);
        !          2234: }
        !          2235: 
        !          2236: void OPPROTO op_array16()
        !          2237: {
        !          2238:     T0 = ((GET_FIELD_SP(T0, 60, 63) << (17 + 2 * T1)) |
        !          2239:           (GET_FIELD_SP(T0, 39, 39 + T1 - 1) << (17 + T1)) |
        !          2240:           (GET_FIELD_SP(T0, 17 + T1 - 1, 17) << 17) |
        !          2241:           (GET_FIELD_SP(T0, 56, 59) << 13) | (GET_FIELD_SP(T0, 35, 38) << 9) |
        !          2242:           (GET_FIELD_SP(T0, 13, 16) << 5) | (((T0 >> 55) & 1) << 4) |
        !          2243:           (GET_FIELD_SP(T0, 33, 34) << 2) | GET_FIELD_SP(T0, 11, 12)) << 1;
        !          2244: }
        !          2245: 
        !          2246: void OPPROTO op_array32()
        !          2247: {
        !          2248:     T0 = ((GET_FIELD_SP(T0, 60, 63) << (17 + 2 * T1)) |
        !          2249:           (GET_FIELD_SP(T0, 39, 39 + T1 - 1) << (17 + T1)) |
        !          2250:           (GET_FIELD_SP(T0, 17 + T1 - 1, 17) << 17) |
        !          2251:           (GET_FIELD_SP(T0, 56, 59) << 13) | (GET_FIELD_SP(T0, 35, 38) << 9) |
        !          2252:           (GET_FIELD_SP(T0, 13, 16) << 5) | (((T0 >> 55) & 1) << 4) |
        !          2253:           (GET_FIELD_SP(T0, 33, 34) << 2) | GET_FIELD_SP(T0, 11, 12)) << 2;
        !          2254: }
        !          2255: 
1.1.1.4   root     2256: void OPPROTO op_alignaddr()
                   2257: {
                   2258:     uint64_t tmp;
                   2259: 
                   2260:     tmp = T0 + T1;
                   2261:     env->gsr &= ~7ULL;
                   2262:     env->gsr |= tmp & 7ULL;
                   2263:     T0 = tmp & ~7ULL;
                   2264: }
                   2265: 
                   2266: void OPPROTO op_faligndata()
                   2267: {
                   2268:     uint64_t tmp;
                   2269: 
                   2270:     tmp = (*((uint64_t *)&DT0)) << ((env->gsr & 7) * 8);
                   2271:     tmp |= (*((uint64_t *)&DT1)) >> (64 - (env->gsr & 7) * 8);
1.1.1.6 ! root     2272:     *((uint64_t *)&DT0) = tmp;
        !          2273: }
        !          2274: 
        !          2275: void OPPROTO op_movl_FT0_0(void)
        !          2276: {
        !          2277:     *((uint32_t *)&FT0) = 0;
        !          2278: }
        !          2279: 
        !          2280: void OPPROTO op_movl_DT0_0(void)
        !          2281: {
        !          2282:     *((uint64_t *)&DT0) = 0;
        !          2283: }
        !          2284: 
        !          2285: void OPPROTO op_movl_FT0_1(void)
        !          2286: {
        !          2287:     *((uint32_t *)&FT0) = 0xffffffff;
1.1.1.4   root     2288: }
1.1.1.6 ! root     2289: 
        !          2290: void OPPROTO op_movl_DT0_1(void)
        !          2291: {
        !          2292:     *((uint64_t *)&DT0) = 0xffffffffffffffffULL;
        !          2293: }
        !          2294: 
        !          2295: void OPPROTO op_fnot(void)
        !          2296: {
        !          2297:     *(uint64_t *)&DT0 = ~*(uint64_t *)&DT1;
        !          2298: }
        !          2299: 
        !          2300: void OPPROTO op_fnots(void)
        !          2301: {
        !          2302:     *(uint32_t *)&FT0 = ~*(uint32_t *)&FT1;
        !          2303: }
        !          2304: 
        !          2305: void OPPROTO op_fnor(void)
        !          2306: {
        !          2307:     *(uint64_t *)&DT0 = ~(*(uint64_t *)&DT0 | *(uint64_t *)&DT1);
        !          2308: }
        !          2309: 
        !          2310: void OPPROTO op_fnors(void)
        !          2311: {
        !          2312:     *(uint32_t *)&FT0 = ~(*(uint32_t *)&FT0 | *(uint32_t *)&FT1);
        !          2313: }
        !          2314: 
        !          2315: void OPPROTO op_for(void)
        !          2316: {
        !          2317:     *(uint64_t *)&DT0 |= *(uint64_t *)&DT1;
        !          2318: }
        !          2319: 
        !          2320: void OPPROTO op_fors(void)
        !          2321: {
        !          2322:     *(uint32_t *)&FT0 |= *(uint32_t *)&FT1;
        !          2323: }
        !          2324: 
        !          2325: void OPPROTO op_fxor(void)
        !          2326: {
        !          2327:     *(uint64_t *)&DT0 ^= *(uint64_t *)&DT1;
        !          2328: }
        !          2329: 
        !          2330: void OPPROTO op_fxors(void)
        !          2331: {
        !          2332:     *(uint32_t *)&FT0 ^= *(uint32_t *)&FT1;
        !          2333: }
        !          2334: 
        !          2335: void OPPROTO op_fand(void)
        !          2336: {
        !          2337:     *(uint64_t *)&DT0 &= *(uint64_t *)&DT1;
        !          2338: }
        !          2339: 
        !          2340: void OPPROTO op_fands(void)
        !          2341: {
        !          2342:     *(uint32_t *)&FT0 &= *(uint32_t *)&FT1;
        !          2343: }
        !          2344: 
        !          2345: void OPPROTO op_fornot(void)
        !          2346: {
        !          2347:     *(uint64_t *)&DT0 = *(uint64_t *)&DT0 | ~*(uint64_t *)&DT1;
        !          2348: }
        !          2349: 
        !          2350: void OPPROTO op_fornots(void)
        !          2351: {
        !          2352:     *(uint32_t *)&FT0 = *(uint32_t *)&FT0 | ~*(uint32_t *)&FT1;
        !          2353: }
        !          2354: 
        !          2355: void OPPROTO op_fandnot(void)
        !          2356: {
        !          2357:     *(uint64_t *)&DT0 = *(uint64_t *)&DT0 & ~*(uint64_t *)&DT1;
        !          2358: }
        !          2359: 
        !          2360: void OPPROTO op_fandnots(void)
        !          2361: {
        !          2362:     *(uint32_t *)&FT0 = *(uint32_t *)&FT0 & ~*(uint32_t *)&FT1;
        !          2363: }
        !          2364: 
        !          2365: void OPPROTO op_fnand(void)
        !          2366: {
        !          2367:     *(uint64_t *)&DT0 = ~(*(uint64_t *)&DT0 & *(uint64_t *)&DT1);
        !          2368: }
        !          2369: 
        !          2370: void OPPROTO op_fnands(void)
        !          2371: {
        !          2372:     *(uint32_t *)&FT0 = ~(*(uint32_t *)&FT0 & *(uint32_t *)&FT1);
        !          2373: }
        !          2374: 
        !          2375: void OPPROTO op_fxnor(void)
        !          2376: {
        !          2377:     *(uint64_t *)&DT0 ^= ~*(uint64_t *)&DT1;
        !          2378: }
        !          2379: 
        !          2380: void OPPROTO op_fxnors(void)
        !          2381: {
        !          2382:     *(uint32_t *)&FT0 ^= ~*(uint32_t *)&FT1;
        !          2383: }
        !          2384: 
        !          2385: #ifdef WORDS_BIGENDIAN
        !          2386: #define VIS_B64(n) b[7 - (n)]
        !          2387: #define VIS_W64(n) w[3 - (n)]
        !          2388: #define VIS_SW64(n) sw[3 - (n)]
        !          2389: #define VIS_L64(n) l[1 - (n)]
        !          2390: #define VIS_B32(n) b[3 - (n)]
        !          2391: #define VIS_W32(n) w[1 - (n)]
        !          2392: #else
        !          2393: #define VIS_B64(n) b[n]
        !          2394: #define VIS_W64(n) w[n]
        !          2395: #define VIS_SW64(n) sw[n]
        !          2396: #define VIS_L64(n) l[n]
        !          2397: #define VIS_B32(n) b[n]
        !          2398: #define VIS_W32(n) w[n]
        !          2399: #endif
        !          2400: 
        !          2401: typedef union {
        !          2402:     uint8_t b[8];
        !          2403:     uint16_t w[4];
        !          2404:     int16_t sw[4];
        !          2405:     uint32_t l[2];
        !          2406:     float64 d;
        !          2407: } vis64;
        !          2408: 
        !          2409: typedef union {
        !          2410:     uint8_t b[4];
        !          2411:     uint16_t w[2];
        !          2412:     uint32_t l;
        !          2413:     float32 f;
        !          2414: } vis32;
        !          2415: 
        !          2416: void OPPROTO op_fpmerge(void)
        !          2417: {
        !          2418:     vis64 s, d;
        !          2419: 
        !          2420:     s.d = DT0;
        !          2421:     d.d = DT1;
        !          2422: 
        !          2423:     // Reverse calculation order to handle overlap
        !          2424:     d.VIS_B64(7) = s.VIS_B64(3);
        !          2425:     d.VIS_B64(6) = d.VIS_B64(3);
        !          2426:     d.VIS_B64(5) = s.VIS_B64(2);
        !          2427:     d.VIS_B64(4) = d.VIS_B64(2);
        !          2428:     d.VIS_B64(3) = s.VIS_B64(1);
        !          2429:     d.VIS_B64(2) = d.VIS_B64(1);
        !          2430:     d.VIS_B64(1) = s.VIS_B64(0);
        !          2431:     //d.VIS_B64(0) = d.VIS_B64(0);
        !          2432: 
        !          2433:     DT0 = d.d;
        !          2434: }
        !          2435: 
        !          2436: void OPPROTO op_fmul8x16(void)
        !          2437: {
        !          2438:     vis64 s, d;
        !          2439:     uint32_t tmp;
        !          2440: 
        !          2441:     s.d = DT0;
        !          2442:     d.d = DT1;
        !          2443: 
        !          2444: #define PMUL(r)                                                 \
        !          2445:     tmp = (int32_t)d.VIS_SW64(r) * (int32_t)s.VIS_B64(r);       \
        !          2446:     if ((tmp & 0xff) > 0x7f)                                    \
        !          2447:         tmp += 0x100;                                           \
        !          2448:     d.VIS_W64(r) = tmp >> 8;
        !          2449: 
        !          2450:     PMUL(0);
        !          2451:     PMUL(1);
        !          2452:     PMUL(2);
        !          2453:     PMUL(3);
        !          2454: #undef PMUL
        !          2455: 
        !          2456:     DT0 = d.d;
        !          2457: }
        !          2458: 
        !          2459: void OPPROTO op_fmul8x16al(void)
        !          2460: {
        !          2461:     vis64 s, d;
        !          2462:     uint32_t tmp;
        !          2463: 
        !          2464:     s.d = DT0;
        !          2465:     d.d = DT1;
        !          2466: 
        !          2467: #define PMUL(r)                                                 \
        !          2468:     tmp = (int32_t)d.VIS_SW64(1) * (int32_t)s.VIS_B64(r);       \
        !          2469:     if ((tmp & 0xff) > 0x7f)                                    \
        !          2470:         tmp += 0x100;                                           \
        !          2471:     d.VIS_W64(r) = tmp >> 8;
        !          2472: 
        !          2473:     PMUL(0);
        !          2474:     PMUL(1);
        !          2475:     PMUL(2);
        !          2476:     PMUL(3);
        !          2477: #undef PMUL
        !          2478: 
        !          2479:     DT0 = d.d;
        !          2480: }
        !          2481: 
        !          2482: void OPPROTO op_fmul8x16au(void)
        !          2483: {
        !          2484:     vis64 s, d;
        !          2485:     uint32_t tmp;
        !          2486: 
        !          2487:     s.d = DT0;
        !          2488:     d.d = DT1;
        !          2489: 
        !          2490: #define PMUL(r)                                                 \
        !          2491:     tmp = (int32_t)d.VIS_SW64(0) * (int32_t)s.VIS_B64(r);       \
        !          2492:     if ((tmp & 0xff) > 0x7f)                                    \
        !          2493:         tmp += 0x100;                                           \
        !          2494:     d.VIS_W64(r) = tmp >> 8;
        !          2495: 
        !          2496:     PMUL(0);
        !          2497:     PMUL(1);
        !          2498:     PMUL(2);
        !          2499:     PMUL(3);
        !          2500: #undef PMUL
        !          2501: 
        !          2502:     DT0 = d.d;
        !          2503: }
        !          2504: 
        !          2505: void OPPROTO op_fmul8sux16(void)
        !          2506: {
        !          2507:     vis64 s, d;
        !          2508:     uint32_t tmp;
        !          2509: 
        !          2510:     s.d = DT0;
        !          2511:     d.d = DT1;
        !          2512: 
        !          2513: #define PMUL(r)                                                         \
        !          2514:     tmp = (int32_t)d.VIS_SW64(r) * ((int32_t)s.VIS_SW64(r) >> 8);       \
        !          2515:     if ((tmp & 0xff) > 0x7f)                                            \
        !          2516:         tmp += 0x100;                                                   \
        !          2517:     d.VIS_W64(r) = tmp >> 8;
        !          2518: 
        !          2519:     PMUL(0);
        !          2520:     PMUL(1);
        !          2521:     PMUL(2);
        !          2522:     PMUL(3);
        !          2523: #undef PMUL
        !          2524: 
        !          2525:     DT0 = d.d;
        !          2526: }
        !          2527: 
        !          2528: void OPPROTO op_fmul8ulx16(void)
        !          2529: {
        !          2530:     vis64 s, d;
        !          2531:     uint32_t tmp;
        !          2532: 
        !          2533:     s.d = DT0;
        !          2534:     d.d = DT1;
        !          2535: 
        !          2536: #define PMUL(r)                                                         \
        !          2537:     tmp = (int32_t)d.VIS_SW64(r) * ((uint32_t)s.VIS_B64(r * 2));        \
        !          2538:     if ((tmp & 0xff) > 0x7f)                                            \
        !          2539:         tmp += 0x100;                                                   \
        !          2540:     d.VIS_W64(r) = tmp >> 8;
        !          2541: 
        !          2542:     PMUL(0);
        !          2543:     PMUL(1);
        !          2544:     PMUL(2);
        !          2545:     PMUL(3);
        !          2546: #undef PMUL
        !          2547: 
        !          2548:     DT0 = d.d;
        !          2549: }
        !          2550: 
        !          2551: void OPPROTO op_fmuld8sux16(void)
        !          2552: {
        !          2553:     vis64 s, d;
        !          2554:     uint32_t tmp;
        !          2555: 
        !          2556:     s.d = DT0;
        !          2557:     d.d = DT1;
        !          2558: 
        !          2559: #define PMUL(r)                                                         \
        !          2560:     tmp = (int32_t)d.VIS_SW64(r) * ((int32_t)s.VIS_SW64(r) >> 8);       \
        !          2561:     if ((tmp & 0xff) > 0x7f)                                            \
        !          2562:         tmp += 0x100;                                                   \
        !          2563:     d.VIS_L64(r) = tmp;
        !          2564: 
        !          2565:     // Reverse calculation order to handle overlap
        !          2566:     PMUL(1);
        !          2567:     PMUL(0);
        !          2568: #undef PMUL
        !          2569: 
        !          2570:     DT0 = d.d;
        !          2571: }
        !          2572: 
        !          2573: void OPPROTO op_fmuld8ulx16(void)
        !          2574: {
        !          2575:     vis64 s, d;
        !          2576:     uint32_t tmp;
        !          2577: 
        !          2578:     s.d = DT0;
        !          2579:     d.d = DT1;
        !          2580: 
        !          2581: #define PMUL(r)                                                         \
        !          2582:     tmp = (int32_t)d.VIS_SW64(r) * ((uint32_t)s.VIS_B64(r * 2));        \
        !          2583:     if ((tmp & 0xff) > 0x7f)                                            \
        !          2584:         tmp += 0x100;                                                   \
        !          2585:     d.VIS_L64(r) = tmp;
        !          2586: 
        !          2587:     // Reverse calculation order to handle overlap
        !          2588:     PMUL(1);
        !          2589:     PMUL(0);
        !          2590: #undef PMUL
        !          2591: 
        !          2592:     DT0 = d.d;
        !          2593: }
        !          2594: 
        !          2595: void OPPROTO op_fexpand(void)
        !          2596: {
        !          2597:     vis32 s;
        !          2598:     vis64 d;
        !          2599: 
        !          2600:     s.l = (uint32_t)(*(uint64_t *)&DT0 & 0xffffffff);
        !          2601:     d.d = DT1;
        !          2602:     d.VIS_L64(0) = s.VIS_W32(0) << 4;
        !          2603:     d.VIS_L64(1) = s.VIS_W32(1) << 4;
        !          2604:     d.VIS_L64(2) = s.VIS_W32(2) << 4;
        !          2605:     d.VIS_L64(3) = s.VIS_W32(3) << 4;
        !          2606: 
        !          2607:     DT0 = d.d;
        !          2608: }
        !          2609: 
        !          2610: #define VIS_OP(name, F)                                 \
        !          2611:     void OPPROTO name##16(void)                         \
        !          2612:     {                                                   \
        !          2613:         vis64 s, d;                                     \
        !          2614:                                                         \
        !          2615:         s.d = DT0;                                      \
        !          2616:         d.d = DT1;                                      \
        !          2617:                                                         \
        !          2618:         d.VIS_W64(0) = F(d.VIS_W64(0), s.VIS_W64(0));   \
        !          2619:         d.VIS_W64(1) = F(d.VIS_W64(1), s.VIS_W64(1));   \
        !          2620:         d.VIS_W64(2) = F(d.VIS_W64(2), s.VIS_W64(2));   \
        !          2621:         d.VIS_W64(3) = F(d.VIS_W64(3), s.VIS_W64(3));   \
        !          2622:                                                         \
        !          2623:         DT0 = d.d;                                      \
        !          2624:     }                                                   \
        !          2625:                                                         \
        !          2626:     void OPPROTO name##16s(void)                        \
        !          2627:     {                                                   \
        !          2628:         vis32 s, d;                                     \
        !          2629:                                                         \
        !          2630:         s.f = FT0;                                      \
        !          2631:         d.f = FT1;                                      \
        !          2632:                                                         \
        !          2633:         d.VIS_W32(0) = F(d.VIS_W32(0), s.VIS_W32(0));   \
        !          2634:         d.VIS_W32(1) = F(d.VIS_W32(1), s.VIS_W32(1));   \
        !          2635:                                                         \
        !          2636:         FT0 = d.f;                                      \
        !          2637:     }                                                   \
        !          2638:                                                         \
        !          2639:     void OPPROTO name##32(void)                         \
        !          2640:     {                                                   \
        !          2641:         vis64 s, d;                                     \
        !          2642:                                                         \
        !          2643:         s.d = DT0;                                      \
        !          2644:         d.d = DT1;                                      \
        !          2645:                                                         \
        !          2646:         d.VIS_L64(0) = F(d.VIS_L64(0), s.VIS_L64(0));   \
        !          2647:         d.VIS_L64(1) = F(d.VIS_L64(1), s.VIS_L64(1));   \
        !          2648:                                                         \
        !          2649:         DT0 = d.d;                                      \
        !          2650:     }                                                   \
        !          2651:                                                         \
        !          2652:     void OPPROTO name##32s(void)                        \
        !          2653:     {                                                   \
        !          2654:         vis32 s, d;                                     \
        !          2655:                                                         \
        !          2656:         s.f = FT0;                                      \
        !          2657:         d.f = FT1;                                      \
        !          2658:                                                         \
        !          2659:         d.l = F(d.l, s.l);                              \
        !          2660:                                                         \
        !          2661:         FT0 = d.f;                                      \
        !          2662:     }
        !          2663: 
        !          2664: #define FADD(a, b) ((a) + (b))
        !          2665: #define FSUB(a, b) ((a) - (b))
        !          2666: VIS_OP(op_fpadd, FADD)
        !          2667: VIS_OP(op_fpsub, FSUB)
        !          2668: 
        !          2669: #define VIS_CMPOP(name, F)                                        \
        !          2670:     void OPPROTO name##16(void)                                   \
        !          2671:     {                                                             \
        !          2672:         vis64 s, d;                                               \
        !          2673:                                                                   \
        !          2674:         s.d = DT0;                                                \
        !          2675:         d.d = DT1;                                                \
        !          2676:                                                                   \
        !          2677:         d.VIS_W64(0) = F(d.VIS_W64(0), s.VIS_W64(0))? 1: 0;       \
        !          2678:         d.VIS_W64(0) |= F(d.VIS_W64(1), s.VIS_W64(1))? 2: 0;      \
        !          2679:         d.VIS_W64(0) |= F(d.VIS_W64(2), s.VIS_W64(2))? 4: 0;      \
        !          2680:         d.VIS_W64(0) |= F(d.VIS_W64(3), s.VIS_W64(3))? 8: 0;      \
        !          2681:                                                                   \
        !          2682:         DT0 = d.d;                                                \
        !          2683:     }                                                             \
        !          2684:                                                                   \
        !          2685:     void OPPROTO name##32(void)                                   \
        !          2686:     {                                                             \
        !          2687:         vis64 s, d;                                               \
        !          2688:                                                                   \
        !          2689:         s.d = DT0;                                                \
        !          2690:         d.d = DT1;                                                \
        !          2691:                                                                   \
        !          2692:         d.VIS_L64(0) = F(d.VIS_L64(0), s.VIS_L64(0))? 1: 0;       \
        !          2693:         d.VIS_L64(0) |= F(d.VIS_L64(1), s.VIS_L64(1))? 2: 0;      \
        !          2694:                                                                   \
        !          2695:         DT0 = d.d;                                                \
        !          2696:     }
        !          2697: 
        !          2698: #define FCMPGT(a, b) ((a) > (b))
        !          2699: #define FCMPEQ(a, b) ((a) == (b))
        !          2700: #define FCMPLE(a, b) ((a) <= (b))
        !          2701: #define FCMPNE(a, b) ((a) != (b))
        !          2702: 
        !          2703: VIS_CMPOP(op_fcmpgt, FCMPGT)
        !          2704: VIS_CMPOP(op_fcmpeq, FCMPEQ)
        !          2705: VIS_CMPOP(op_fcmple, FCMPLE)
        !          2706: VIS_CMPOP(op_fcmpne, FCMPNE)
        !          2707: 
1.1.1.4   root     2708: #endif
1.1.1.6 ! root     2709: 
        !          2710: #define CHECK_ALIGN_OP(align)                           \
        !          2711:     void OPPROTO op_check_align_T0_ ## align (void)     \
        !          2712:     {                                                   \
        !          2713:         if (T0 & align)                                 \
        !          2714:             raise_exception(TT_UNALIGNED);              \
        !          2715:         FORCE_RET();                                    \
        !          2716:     }
        !          2717: 
        !          2718: CHECK_ALIGN_OP(1)
        !          2719: CHECK_ALIGN_OP(3)
        !          2720: CHECK_ALIGN_OP(7)

unix.superglobalmegacorp.com

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