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

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;\
                    290: }) 
                    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))
                    379:        env->psr |= PSR_ZERO;
                    380:     if ((int32_t) T0 < 0)
                    381:        env->psr |= PSR_NEG;
1.1.1.2   root      382:     if ((T0 & 0xffffffff) < (src1 & 0xffffffff))
1.1       root      383:        env->psr |= PSR_CARRY;
                    384:     if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff) ^ -1) &
                    385:         ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))
                    386:        env->psr |= PSR_OVF;
                    387: 
                    388:     env->xcc = 0;
                    389:     if (!T0)
                    390:        env->xcc |= PSR_ZERO;
                    391:     if ((int64_t) T0 < 0)
                    392:        env->xcc |= PSR_NEG;
                    393:     if (T0 < src1)
                    394:        env->xcc |= PSR_CARRY;
                    395:     if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1ULL << 63))
                    396:        env->xcc |= PSR_OVF;
                    397: #else
                    398:     if (!T0)
                    399:        env->psr |= PSR_ZERO;
                    400:     if ((int32_t) T0 < 0)
                    401:        env->psr |= PSR_NEG;
                    402:     if (T0 < src1)
                    403:        env->psr |= PSR_CARRY;
                    404:     if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1 << 31))
                    405:        env->psr |= PSR_OVF;
                    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))
                    451:        env->psr |= PSR_ZERO;
                    452:     if ((int32_t) T0 < 0)
                    453:        env->psr |= PSR_NEG;
                    454:     if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff) ^ -1) &
                    455:         ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))
                    456:        env->psr |= PSR_OVF;
                    457: 
                    458:     if (!T0)
                    459:        env->xcc |= PSR_ZERO;
                    460:     if ((int64_t) T0 < 0)
                    461:        env->xcc |= PSR_NEG;
                    462:     if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1ULL << 63))
                    463:        env->xcc |= PSR_OVF;
                    464: #else
                    465:     if (!T0)
                    466:        env->psr |= PSR_ZERO;
                    467:     if ((int32_t) T0 < 0)
                    468:        env->psr |= PSR_NEG;
                    469:     if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1 << 31))
                    470:        env->psr |= PSR_OVF;
                    471: #endif
                    472:     FORCE_RET();
                    473: }
                    474: 
                    475: void OPPROTO op_sub_T1_T0(void)
                    476: {
                    477:     T0 -= T1;
                    478: }
                    479: 
                    480: void OPPROTO op_sub_T1_T0_cc(void)
                    481: {
                    482:     target_ulong src1;
                    483: 
                    484:     src1 = T0;
                    485:     T0 -= T1;
                    486:     env->psr = 0;
                    487: #ifdef TARGET_SPARC64
                    488:     if (!(T0 & 0xffffffff))
                    489:        env->psr |= PSR_ZERO;
                    490:     if ((int32_t) T0 < 0)
                    491:        env->psr |= PSR_NEG;
                    492:     if ((src1 & 0xffffffff) < (T1 & 0xffffffff))
                    493:        env->psr |= PSR_CARRY;
                    494:     if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff)) &
                    495:         ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))
                    496:        env->psr |= PSR_OVF;
                    497: 
                    498:     env->xcc = 0;
                    499:     if (!T0)
                    500:        env->xcc |= PSR_ZERO;
                    501:     if ((int64_t) T0 < 0)
                    502:        env->xcc |= PSR_NEG;
1.1.1.2   root      503:     if (src1 < T1)
1.1       root      504:        env->xcc |= PSR_CARRY;
                    505:     if (((src1 ^ T1) & (src1 ^ T0)) & (1ULL << 63))
                    506:        env->xcc |= PSR_OVF;
                    507: #else
                    508:     if (!T0)
                    509:        env->psr |= PSR_ZERO;
                    510:     if ((int32_t) T0 < 0)
                    511:        env->psr |= PSR_NEG;
                    512:     if (src1 < T1)
                    513:        env->psr |= PSR_CARRY;
                    514:     if (((src1 ^ T1) & (src1 ^ T0)) & (1 << 31))
                    515:        env->psr |= PSR_OVF;
                    516: #endif
                    517:     FORCE_RET();
                    518: }
                    519: 
                    520: void OPPROTO op_subx_T1_T0(void)
                    521: {
                    522:     T0 -= T1 + FLAG_SET(PSR_CARRY);
                    523: }
                    524: 
                    525: void OPPROTO op_subx_T1_T0_cc(void)
                    526: {
                    527:     target_ulong src1;
                    528:     src1 = T0;
1.1.1.3   root      529:     if (FLAG_SET(PSR_CARRY))
                    530:     {
                    531:       T0 -= T1 + 1;
                    532:       env->psr = 0;
                    533: #ifdef TARGET_SPARC64
                    534:       if ((src1 & 0xffffffff) <= (T1 & 0xffffffff))
                    535:         env->psr |= PSR_CARRY;
                    536:       env->xcc = 0;
                    537:       if (src1 <= T1)
                    538:         env->xcc |= PSR_CARRY;
                    539: #else
                    540:       if (src1 <= T1)
                    541:         env->psr |= PSR_CARRY;
                    542: #endif
                    543:     }
                    544:     else
                    545:     {
                    546:       T0 -= T1;
                    547:       env->psr = 0;
                    548: #ifdef TARGET_SPARC64
                    549:       if ((src1 & 0xffffffff) < (T1 & 0xffffffff))
                    550:         env->psr |= PSR_CARRY;
                    551:       env->xcc = 0;
                    552:       if (src1 < T1)
                    553:         env->xcc |= PSR_CARRY;
                    554: #else
                    555:       if (src1 < T1)
                    556:         env->psr |= PSR_CARRY;
                    557: #endif
                    558:     }
1.1       root      559: #ifdef TARGET_SPARC64
                    560:     if (!(T0 & 0xffffffff))
                    561:        env->psr |= PSR_ZERO;
                    562:     if ((int32_t) T0 < 0)
                    563:        env->psr |= PSR_NEG;
                    564:     if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff)) &
                    565:         ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31))
                    566:        env->psr |= PSR_OVF;
                    567: 
                    568:     if (!T0)
                    569:        env->xcc |= PSR_ZERO;
                    570:     if ((int64_t) T0 < 0)
                    571:        env->xcc |= PSR_NEG;
                    572:     if (((src1 ^ T1) & (src1 ^ T0)) & (1ULL << 63))
                    573:        env->xcc |= PSR_OVF;
                    574: #else
                    575:     if (!T0)
                    576:        env->psr |= PSR_ZERO;
                    577:     if ((int32_t) T0 < 0)
                    578:        env->psr |= PSR_NEG;
                    579:     if (((src1 ^ T1) & (src1 ^ T0)) & (1 << 31))
                    580:        env->psr |= PSR_OVF;
                    581: #endif
                    582:     FORCE_RET();
                    583: }
                    584: 
                    585: void OPPROTO op_and_T1_T0(void)
                    586: {
                    587:     T0 &= T1;
                    588: }
                    589: 
                    590: void OPPROTO op_or_T1_T0(void)
                    591: {
                    592:     T0 |= T1;
                    593: }
                    594: 
                    595: void OPPROTO op_xor_T1_T0(void)
                    596: {
                    597:     T0 ^= T1;
                    598: }
                    599: 
                    600: void OPPROTO op_andn_T1_T0(void)
                    601: {
                    602:     T0 &= ~T1;
                    603: }
                    604: 
                    605: void OPPROTO op_orn_T1_T0(void)
                    606: {
                    607:     T0 |= ~T1;
                    608: }
                    609: 
                    610: void OPPROTO op_xnor_T1_T0(void)
                    611: {
                    612:     T0 ^= ~T1;
                    613: }
                    614: 
                    615: void OPPROTO op_umul_T1_T0(void)
                    616: {
                    617:     uint64_t res;
                    618:     res = (uint64_t) T0 * (uint64_t) T1;
                    619: #ifdef TARGET_SPARC64
                    620:     T0 = res;
                    621: #else
                    622:     T0 = res & 0xffffffff;
                    623: #endif
                    624:     env->y = res >> 32;
                    625: }
                    626: 
                    627: void OPPROTO op_smul_T1_T0(void)
                    628: {
                    629:     uint64_t res;
                    630:     res = (int64_t) ((int32_t) T0) * (int64_t) ((int32_t) T1);
                    631: #ifdef TARGET_SPARC64
                    632:     T0 = res;
                    633: #else
                    634:     T0 = res & 0xffffffff;
                    635: #endif
                    636:     env->y = res >> 32;
                    637: }
                    638: 
                    639: void OPPROTO op_mulscc_T1_T0(void)
                    640: {
                    641:     unsigned int b1, N, V, b2;
                    642:     target_ulong src1;
                    643: 
                    644:     N = FLAG_SET(PSR_NEG);
                    645:     V = FLAG_SET(PSR_OVF);
                    646:     b1 = N ^ V;
                    647:     b2 = T0 & 1;
                    648:     T0 = (b1 << 31) | (T0 >> 1);
                    649:     if (!(env->y & 1))
                    650:         T1 = 0;
                    651:     /* do addition and update flags */
                    652:     src1 = T0;
                    653:     T0 += T1;
                    654:     env->psr = 0;
                    655:     if (!T0)
                    656:        env->psr |= PSR_ZERO;
                    657:     if ((int32_t) T0 < 0)
                    658:        env->psr |= PSR_NEG;
                    659:     if (T0 < src1)
                    660:        env->psr |= PSR_CARRY;
                    661:     if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1 << 31))
                    662:        env->psr |= PSR_OVF;
                    663:     env->y = (b2 << 31) | (env->y >> 1);
                    664:     FORCE_RET();
                    665: }
                    666: 
                    667: void OPPROTO op_udiv_T1_T0(void)
                    668: {
                    669:     uint64_t x0;
                    670:     uint32_t x1;
                    671: 
                    672:     x0 = T0 | ((uint64_t) (env->y) << 32);
                    673:     x1 = T1;
                    674:     x0 = x0 / x1;
                    675:     if (x0 > 0xffffffff) {
                    676:        T0 = 0xffffffff;
                    677:        T1 = 1;
                    678:     } else {
                    679:        T0 = x0;
                    680:        T1 = 0;
                    681:     }
                    682:     FORCE_RET();
                    683: }
                    684: 
                    685: void OPPROTO op_sdiv_T1_T0(void)
                    686: {
                    687:     int64_t x0;
                    688:     int32_t x1;
                    689: 
                    690:     x0 = T0 | ((int64_t) (env->y) << 32);
                    691:     x1 = T1;
                    692:     x0 = x0 / x1;
                    693:     if ((int32_t) x0 != x0) {
                    694:        T0 = x0 < 0? 0x80000000: 0x7fffffff;
                    695:        T1 = 1;
                    696:     } else {
                    697:        T0 = x0;
                    698:        T1 = 0;
                    699:     }
                    700:     FORCE_RET();
                    701: }
                    702: 
                    703: void OPPROTO op_div_cc(void)
                    704: {
                    705:     env->psr = 0;
                    706: #ifdef TARGET_SPARC64
                    707:     if (!T0)
                    708:        env->psr |= PSR_ZERO;
                    709:     if ((int32_t) T0 < 0)
                    710:        env->psr |= PSR_NEG;
                    711:     if (T1)
                    712:        env->psr |= PSR_OVF;
                    713: 
                    714:     env->xcc = 0;
                    715:     if (!T0)
                    716:        env->xcc |= PSR_ZERO;
                    717:     if ((int64_t) T0 < 0)
                    718:        env->xcc |= PSR_NEG;
                    719: #else
                    720:     if (!T0)
                    721:        env->psr |= PSR_ZERO;
                    722:     if ((int32_t) T0 < 0)
                    723:        env->psr |= PSR_NEG;
                    724:     if (T1)
                    725:        env->psr |= PSR_OVF;
                    726: #endif
                    727:     FORCE_RET();
                    728: }
                    729: 
                    730: #ifdef TARGET_SPARC64
                    731: void OPPROTO op_mulx_T1_T0(void)
                    732: {
                    733:     T0 *= T1;
                    734:     FORCE_RET();
                    735: }
                    736: 
                    737: void OPPROTO op_udivx_T1_T0(void)
                    738: {
                    739:     T0 /= T1;
                    740:     FORCE_RET();
                    741: }
                    742: 
                    743: void OPPROTO op_sdivx_T1_T0(void)
                    744: {
                    745:     if (T0 == INT64_MIN && T1 == -1)
                    746:        T0 = INT64_MIN;
                    747:     else
                    748:        T0 /= (target_long) T1;
                    749:     FORCE_RET();
                    750: }
                    751: #endif
                    752: 
                    753: void OPPROTO op_logic_T0_cc(void)
                    754: {
                    755:     env->psr = 0;
                    756: #ifdef TARGET_SPARC64
                    757:     if (!(T0 & 0xffffffff))
                    758:        env->psr |= PSR_ZERO;
                    759:     if ((int32_t) T0 < 0)
                    760:        env->psr |= PSR_NEG;
                    761: 
                    762:     env->xcc = 0;
                    763:     if (!T0)
                    764:        env->xcc |= PSR_ZERO;
                    765:     if ((int64_t) T0 < 0)
                    766:        env->xcc |= PSR_NEG;
                    767: #else
                    768:     if (!T0)
                    769:        env->psr |= PSR_ZERO;
                    770:     if ((int32_t) T0 < 0)
                    771:        env->psr |= PSR_NEG;
                    772: #endif
                    773:     FORCE_RET();
                    774: }
                    775: 
                    776: void OPPROTO op_sll(void)
                    777: {
                    778:     T0 <<= T1;
                    779: }
                    780: 
                    781: #ifdef TARGET_SPARC64
                    782: void OPPROTO op_srl(void)
                    783: {
                    784:     T0 = (T0 & 0xffffffff) >> T1;
                    785: }
                    786: 
                    787: void OPPROTO op_srlx(void)
                    788: {
                    789:     T0 >>= T1;
                    790: }
                    791: 
                    792: void OPPROTO op_sra(void)
                    793: {
                    794:     T0 = ((int32_t) (T0 & 0xffffffff)) >> T1;
                    795: }
                    796: 
                    797: void OPPROTO op_srax(void)
                    798: {
                    799:     T0 = ((int64_t) T0) >> T1;
                    800: }
                    801: #else
                    802: void OPPROTO op_srl(void)
                    803: {
                    804:     T0 >>= T1;
                    805: }
                    806: 
                    807: void OPPROTO op_sra(void)
                    808: {
                    809:     T0 = ((int32_t) T0) >> T1;
                    810: }
                    811: #endif
                    812: 
                    813: /* Load and store */
                    814: #define MEMSUFFIX _raw
                    815: #include "op_mem.h"
                    816: #if !defined(CONFIG_USER_ONLY)
                    817: #define MEMSUFFIX _user
                    818: #include "op_mem.h"
                    819: 
                    820: #define MEMSUFFIX _kernel
                    821: #include "op_mem.h"
                    822: #endif
                    823: 
                    824: void OPPROTO op_ldfsr(void)
                    825: {
                    826:     PUT_FSR32(env, *((uint32_t *) &FT0));
                    827:     helper_ldfsr();
                    828: }
                    829: 
                    830: void OPPROTO op_stfsr(void)
                    831: {
                    832:     *((uint32_t *) &FT0) = GET_FSR32(env);
                    833: }
                    834: 
                    835: #ifndef TARGET_SPARC64
                    836: void OPPROTO op_rdpsr(void)
                    837: {
                    838:     do_rdpsr();
                    839: }
                    840: 
                    841: void OPPROTO op_wrpsr(void)
                    842: {
                    843:     do_wrpsr();
                    844:     FORCE_RET();
                    845: }
                    846: 
                    847: void OPPROTO op_rett(void)
                    848: {
                    849:     helper_rett();
                    850:     FORCE_RET();
                    851: }
                    852: 
                    853: /* XXX: use another pointer for %iN registers to avoid slow wrapping
                    854:    handling ? */
                    855: void OPPROTO op_save(void)
                    856: {
                    857:     uint32_t cwp;
                    858:     cwp = (env->cwp - 1) & (NWINDOWS - 1); 
                    859:     if (env->wim & (1 << cwp)) {
                    860:         raise_exception(TT_WIN_OVF);
                    861:     }
                    862:     set_cwp(cwp);
                    863:     FORCE_RET();
                    864: }
                    865: 
                    866: void OPPROTO op_restore(void)
                    867: {
                    868:     uint32_t cwp;
                    869:     cwp = (env->cwp + 1) & (NWINDOWS - 1); 
                    870:     if (env->wim & (1 << cwp)) {
                    871:         raise_exception(TT_WIN_UNF);
                    872:     }
                    873:     set_cwp(cwp);
                    874:     FORCE_RET();
                    875: }
                    876: #else
                    877: void OPPROTO op_rdccr(void)
                    878: {
                    879:     T0 = GET_CCR(env);
                    880: }
                    881: 
                    882: void OPPROTO op_wrccr(void)
                    883: {
                    884:     PUT_CCR(env, T0);
                    885: }
                    886: 
                    887: void OPPROTO op_rdtick(void)
                    888: {
                    889:     T0 = 0; // XXX read cycle counter and bit 31
                    890: }
                    891: 
                    892: void OPPROTO op_wrtick(void)
                    893: {
                    894:     // XXX write cycle counter and bit 31
                    895: }
                    896: 
                    897: void OPPROTO op_rdtpc(void)
                    898: {
                    899:     T0 = env->tpc[env->tl];
                    900: }
                    901: 
                    902: void OPPROTO op_wrtpc(void)
                    903: {
                    904:     env->tpc[env->tl] = T0;
                    905: }
                    906: 
                    907: void OPPROTO op_rdtnpc(void)
                    908: {
                    909:     T0 = env->tnpc[env->tl];
                    910: }
                    911: 
                    912: void OPPROTO op_wrtnpc(void)
                    913: {
                    914:     env->tnpc[env->tl] = T0;
                    915: }
                    916: 
                    917: void OPPROTO op_rdtstate(void)
                    918: {
                    919:     T0 = env->tstate[env->tl];
                    920: }
                    921: 
                    922: void OPPROTO op_wrtstate(void)
                    923: {
                    924:     env->tstate[env->tl] = T0;
                    925: }
                    926: 
                    927: void OPPROTO op_rdtt(void)
                    928: {
                    929:     T0 = env->tt[env->tl];
                    930: }
                    931: 
                    932: void OPPROTO op_wrtt(void)
                    933: {
                    934:     env->tt[env->tl] = T0;
                    935: }
                    936: 
                    937: void OPPROTO op_rdpstate(void)
                    938: {
                    939:     T0 = env->pstate;
                    940: }
                    941: 
                    942: void OPPROTO op_wrpstate(void)
                    943: {
                    944:     do_wrpstate();
                    945: }
                    946: 
                    947: // CWP handling is reversed in V9, but we still use the V8 register
                    948: // order.
                    949: void OPPROTO op_rdcwp(void)
                    950: {
                    951:     T0 = NWINDOWS - 1 - env->cwp;
                    952: }
                    953: 
                    954: void OPPROTO op_wrcwp(void)
                    955: {
                    956:     env->cwp = NWINDOWS - 1 - T0;
                    957: }
                    958: 
                    959: /* XXX: use another pointer for %iN registers to avoid slow wrapping
                    960:    handling ? */
                    961: void OPPROTO op_save(void)
                    962: {
                    963:     uint32_t cwp;
                    964:     cwp = (env->cwp - 1) & (NWINDOWS - 1); 
                    965:     if (env->cansave == 0) {
                    966:         raise_exception(TT_SPILL | (env->otherwin != 0 ? 
                    967:                                    (TT_WOTHER | ((env->wstate & 0x38) >> 1)):
                    968:                                    ((env->wstate & 0x7) << 2)));
                    969:     } else {
                    970:        if (env->cleanwin - env->canrestore == 0) {
                    971:            // XXX Clean windows without trap
                    972:            raise_exception(TT_CLRWIN);
                    973:        } else {
                    974:            env->cansave--;
                    975:            env->canrestore++;
                    976:            set_cwp(cwp);
                    977:        }
                    978:     }
                    979:     FORCE_RET();
                    980: }
                    981: 
                    982: void OPPROTO op_restore(void)
                    983: {
                    984:     uint32_t cwp;
                    985:     cwp = (env->cwp + 1) & (NWINDOWS - 1); 
                    986:     if (env->canrestore == 0) {
                    987:         raise_exception(TT_FILL | (env->otherwin != 0 ? 
                    988:                                   (TT_WOTHER | ((env->wstate & 0x38) >> 1)):
                    989:                                   ((env->wstate & 0x7) << 2)));
                    990:     } else {
                    991:        env->cansave++;
                    992:        env->canrestore--;
                    993:        set_cwp(cwp);
                    994:     }
                    995:     FORCE_RET();
                    996: }
                    997: #endif
                    998: 
                    999: void OPPROTO op_exception(void)
                   1000: {
                   1001:     env->exception_index = PARAM1;
                   1002:     cpu_loop_exit();
                   1003: }
                   1004: 
                   1005: void OPPROTO op_trap_T0(void)
                   1006: {
                   1007:     env->exception_index = TT_TRAP + (T0 & 0x7f);
                   1008:     cpu_loop_exit();
                   1009: }
                   1010: 
                   1011: void OPPROTO op_trapcc_T0(void)
                   1012: {
                   1013:     if (T2) {
                   1014:         env->exception_index = TT_TRAP + (T0 & 0x7f);
                   1015:         cpu_loop_exit();
                   1016:     }
                   1017:     FORCE_RET();
                   1018: }
                   1019: 
                   1020: void OPPROTO op_fpexception_im(void)
                   1021: {
                   1022:     env->exception_index = TT_FP_EXCP;
                   1023:     env->fsr &= ~FSR_FTT_MASK;
                   1024:     env->fsr |= PARAM1;
                   1025:     cpu_loop_exit();
                   1026:     FORCE_RET();
                   1027: }
                   1028: 
                   1029: void OPPROTO op_debug(void)
                   1030: {
                   1031:     helper_debug();
                   1032: }
                   1033: 
                   1034: void OPPROTO op_exit_tb(void)
                   1035: {
                   1036:     EXIT_TB();
                   1037: }
                   1038: 
                   1039: void OPPROTO op_eval_ba(void)
                   1040: {
                   1041:     T2 = 1;
                   1042: }
                   1043: 
                   1044: void OPPROTO op_eval_be(void)
                   1045: {
                   1046:     T2 = FLAG_SET(PSR_ZERO);
                   1047: }
                   1048: 
                   1049: void OPPROTO op_eval_ble(void)
                   1050: {
                   1051:     target_ulong Z = FLAG_SET(PSR_ZERO), N = FLAG_SET(PSR_NEG), V = FLAG_SET(PSR_OVF);
                   1052:     
                   1053:     T2 = Z | (N ^ V);
                   1054: }
                   1055: 
                   1056: void OPPROTO op_eval_bl(void)
                   1057: {
                   1058:     target_ulong N = FLAG_SET(PSR_NEG), V = FLAG_SET(PSR_OVF);
                   1059: 
                   1060:     T2 = N ^ V;
                   1061: }
                   1062: 
                   1063: void OPPROTO op_eval_bleu(void)
                   1064: {
                   1065:     target_ulong Z = FLAG_SET(PSR_ZERO), C = FLAG_SET(PSR_CARRY);
                   1066: 
                   1067:     T2 = C | Z;
                   1068: }
                   1069: 
                   1070: void OPPROTO op_eval_bcs(void)
                   1071: {
                   1072:     T2 = FLAG_SET(PSR_CARRY);
                   1073: }
                   1074: 
                   1075: void OPPROTO op_eval_bvs(void)
                   1076: {
                   1077:     T2 = FLAG_SET(PSR_OVF);
                   1078: }
                   1079: 
                   1080: void OPPROTO op_eval_bn(void)
                   1081: {
                   1082:     T2 = 0;
                   1083: }
                   1084: 
                   1085: void OPPROTO op_eval_bneg(void)
                   1086: {
                   1087:     T2 = FLAG_SET(PSR_NEG);
                   1088: }
                   1089: 
                   1090: void OPPROTO op_eval_bne(void)
                   1091: {
                   1092:     T2 = !FLAG_SET(PSR_ZERO);
                   1093: }
                   1094: 
                   1095: void OPPROTO op_eval_bg(void)
                   1096: {
                   1097:     target_ulong Z = FLAG_SET(PSR_ZERO), N = FLAG_SET(PSR_NEG), V = FLAG_SET(PSR_OVF);
                   1098: 
                   1099:     T2 = !(Z | (N ^ V));
                   1100: }
                   1101: 
                   1102: void OPPROTO op_eval_bge(void)
                   1103: {
                   1104:     target_ulong N = FLAG_SET(PSR_NEG), V = FLAG_SET(PSR_OVF);
                   1105: 
                   1106:     T2 = !(N ^ V);
                   1107: }
                   1108: 
                   1109: void OPPROTO op_eval_bgu(void)
                   1110: {
                   1111:     target_ulong Z = FLAG_SET(PSR_ZERO), C = FLAG_SET(PSR_CARRY);
                   1112: 
                   1113:     T2 = !(C | Z);
                   1114: }
                   1115: 
                   1116: void OPPROTO op_eval_bcc(void)
                   1117: {
                   1118:     T2 = !FLAG_SET(PSR_CARRY);
                   1119: }
                   1120: 
                   1121: void OPPROTO op_eval_bpos(void)
                   1122: {
                   1123:     T2 = !FLAG_SET(PSR_NEG);
                   1124: }
                   1125: 
                   1126: void OPPROTO op_eval_bvc(void)
                   1127: {
                   1128:     T2 = !FLAG_SET(PSR_OVF);
                   1129: }
                   1130: 
                   1131: #ifdef TARGET_SPARC64
                   1132: void OPPROTO op_eval_xbe(void)
                   1133: {
                   1134:     T2 = XFLAG_SET(PSR_ZERO);
                   1135: }
                   1136: 
                   1137: void OPPROTO op_eval_xble(void)
                   1138: {
                   1139:     target_ulong Z = XFLAG_SET(PSR_ZERO), N = XFLAG_SET(PSR_NEG), V = XFLAG_SET(PSR_OVF);
                   1140:     
                   1141:     T2 = Z | (N ^ V);
                   1142: }
                   1143: 
                   1144: void OPPROTO op_eval_xbl(void)
                   1145: {
                   1146:     target_ulong N = XFLAG_SET(PSR_NEG), V = XFLAG_SET(PSR_OVF);
                   1147: 
                   1148:     T2 = N ^ V;
                   1149: }
                   1150: 
                   1151: void OPPROTO op_eval_xbleu(void)
                   1152: {
                   1153:     target_ulong Z = XFLAG_SET(PSR_ZERO), C = XFLAG_SET(PSR_CARRY);
                   1154: 
                   1155:     T2 = C | Z;
                   1156: }
                   1157: 
                   1158: void OPPROTO op_eval_xbcs(void)
                   1159: {
                   1160:     T2 = XFLAG_SET(PSR_CARRY);
                   1161: }
                   1162: 
                   1163: void OPPROTO op_eval_xbvs(void)
                   1164: {
                   1165:     T2 = XFLAG_SET(PSR_OVF);
                   1166: }
                   1167: 
                   1168: void OPPROTO op_eval_xbneg(void)
                   1169: {
                   1170:     T2 = XFLAG_SET(PSR_NEG);
                   1171: }
                   1172: 
                   1173: void OPPROTO op_eval_xbne(void)
                   1174: {
                   1175:     T2 = !XFLAG_SET(PSR_ZERO);
                   1176: }
                   1177: 
                   1178: void OPPROTO op_eval_xbg(void)
                   1179: {
                   1180:     target_ulong Z = XFLAG_SET(PSR_ZERO), N = XFLAG_SET(PSR_NEG), V = XFLAG_SET(PSR_OVF);
                   1181: 
                   1182:     T2 = !(Z | (N ^ V));
                   1183: }
                   1184: 
                   1185: void OPPROTO op_eval_xbge(void)
                   1186: {
                   1187:     target_ulong N = XFLAG_SET(PSR_NEG), V = XFLAG_SET(PSR_OVF);
                   1188: 
                   1189:     T2 = !(N ^ V);
                   1190: }
                   1191: 
                   1192: void OPPROTO op_eval_xbgu(void)
                   1193: {
                   1194:     target_ulong Z = XFLAG_SET(PSR_ZERO), C = XFLAG_SET(PSR_CARRY);
                   1195: 
                   1196:     T2 = !(C | Z);
                   1197: }
                   1198: 
                   1199: void OPPROTO op_eval_xbcc(void)
                   1200: {
                   1201:     T2 = !XFLAG_SET(PSR_CARRY);
                   1202: }
                   1203: 
                   1204: void OPPROTO op_eval_xbpos(void)
                   1205: {
                   1206:     T2 = !XFLAG_SET(PSR_NEG);
                   1207: }
                   1208: 
                   1209: void OPPROTO op_eval_xbvc(void)
                   1210: {
                   1211:     T2 = !XFLAG_SET(PSR_OVF);
                   1212: }
                   1213: #endif
                   1214: 
                   1215: #define FCC
                   1216: #define FFLAG_SET(x) (env->fsr & x? 1: 0)
                   1217: #include "fbranch_template.h"
                   1218: 
                   1219: #ifdef TARGET_SPARC64
                   1220: #define FCC _fcc1
                   1221: #define FFLAG_SET(x) ((env->fsr & ((uint64_t)x >> 32))? 1: 0)
                   1222: #include "fbranch_template.h"
                   1223: #define FCC _fcc2
                   1224: #define FFLAG_SET(x) ((env->fsr & ((uint64_t)x >> 34))? 1: 0)
                   1225: #include "fbranch_template.h"
                   1226: #define FCC _fcc3
                   1227: #define FFLAG_SET(x) ((env->fsr & ((uint64_t)x >> 36))? 1: 0)
                   1228: #include "fbranch_template.h"
                   1229: #endif
                   1230: 
                   1231: #ifdef TARGET_SPARC64
                   1232: void OPPROTO op_eval_brz(void)
                   1233: {
                   1234:     T2 = (T0 == 0);
                   1235: }
                   1236: 
                   1237: void OPPROTO op_eval_brnz(void)
                   1238: {
                   1239:     T2 = (T0 != 0);
                   1240: }
                   1241: 
                   1242: void OPPROTO op_eval_brlz(void)
                   1243: {
                   1244:     T2 = ((int64_t)T0 < 0);
                   1245: }
                   1246: 
                   1247: void OPPROTO op_eval_brlez(void)
                   1248: {
                   1249:     T2 = ((int64_t)T0 <= 0);
                   1250: }
                   1251: 
                   1252: void OPPROTO op_eval_brgz(void)
                   1253: {
                   1254:     T2 = ((int64_t)T0 > 0);
                   1255: }
                   1256: 
                   1257: void OPPROTO op_eval_brgez(void)
                   1258: {
                   1259:     T2 = ((int64_t)T0 >= 0);
                   1260: }
                   1261: 
                   1262: void OPPROTO op_jmp_im64(void)
                   1263: {
                   1264:     env->pc = PARAMQ1;
                   1265: }
                   1266: 
                   1267: void OPPROTO op_movq_npc_im64(void)
                   1268: {
                   1269:     env->npc = PARAMQ1;
                   1270: }
                   1271: #endif
                   1272: 
                   1273: void OPPROTO op_jmp_im(void)
                   1274: {
                   1275:     env->pc = (uint32_t)PARAM1;
                   1276: }
                   1277: 
                   1278: void OPPROTO op_movl_npc_im(void)
                   1279: {
                   1280:     env->npc = (uint32_t)PARAM1;
                   1281: }
                   1282: 
                   1283: void OPPROTO op_movl_npc_T0(void)
                   1284: {
                   1285:     env->npc = T0;
                   1286: }
                   1287: 
                   1288: void OPPROTO op_mov_pc_npc(void)
                   1289: {
                   1290:     env->pc = env->npc;
                   1291: }
                   1292: 
                   1293: void OPPROTO op_next_insn(void)
                   1294: {
                   1295:     env->pc = env->npc;
                   1296:     env->npc = env->npc + 4;
                   1297: }
                   1298: 
                   1299: void OPPROTO op_goto_tb0(void)
                   1300: {
                   1301:     GOTO_TB(op_goto_tb0, PARAM1, 0);
                   1302: }
                   1303: 
                   1304: void OPPROTO op_goto_tb1(void)
                   1305: {
                   1306:     GOTO_TB(op_goto_tb1, PARAM1, 1);
                   1307: }
                   1308: 
                   1309: void OPPROTO op_jmp_label(void)
                   1310: {
                   1311:     GOTO_LABEL_PARAM(1);
                   1312: }
                   1313: 
                   1314: void OPPROTO op_jnz_T2_label(void)
                   1315: {
                   1316:     if (T2)
                   1317:         GOTO_LABEL_PARAM(1);
                   1318:     FORCE_RET();
                   1319: }
                   1320: 
                   1321: void OPPROTO op_jz_T2_label(void)
                   1322: {
                   1323:     if (!T2)
                   1324:         GOTO_LABEL_PARAM(1);
                   1325:     FORCE_RET();
                   1326: }
                   1327: 
                   1328: void OPPROTO op_flush_T0(void)
                   1329: {
                   1330:     helper_flush(T0);
                   1331: }
                   1332: 
1.1.1.4 ! root     1333: #define F_OP(name, p) void OPPROTO op_f##name##p(void)
1.1       root     1334: 
1.1.1.4 ! root     1335: #define F_BINOP(name)                                           \
        !          1336:     F_OP(name, s)                                               \
        !          1337:     {                                                           \
        !          1338:         FT0 = float32_ ## name (FT0, FT1, &env->fp_status);     \
        !          1339:     }                                                           \
        !          1340:     F_OP(name, d)                                               \
        !          1341:     {                                                           \
        !          1342:         DT0 = float64_ ## name (DT0, DT1, &env->fp_status);     \
        !          1343:     }
1.1       root     1344: 
1.1.1.4 ! root     1345: F_BINOP(add);
        !          1346: F_BINOP(sub);
        !          1347: F_BINOP(mul);
        !          1348: F_BINOP(div);
        !          1349: #undef F_BINOP
1.1       root     1350: 
                   1351: void OPPROTO op_fsmuld(void)
                   1352: {
1.1.1.4 ! root     1353:     DT0 = float64_mul(float32_to_float64(FT0, &env->fp_status),
        !          1354:                       float32_to_float64(FT1, &env->fp_status),
        !          1355:                       &env->fp_status);
1.1       root     1356: }
                   1357: 
1.1.1.4 ! root     1358: #define F_HELPER(name)    \
        !          1359:     F_OP(name, s)         \
        !          1360:     {                     \
        !          1361:         do_f##name##s();  \
        !          1362:     }                     \
        !          1363:     F_OP(name, d)         \
        !          1364:     {                     \
        !          1365:         do_f##name##d();  \
        !          1366:     }
1.1       root     1367: 
1.1.1.4 ! root     1368: F_HELPER(sqrt);
1.1       root     1369: 
1.1.1.4 ! root     1370: F_OP(neg, s)
1.1       root     1371: {
1.1.1.4 ! root     1372:     FT0 = float32_chs(FT1);
1.1       root     1373: }
                   1374: 
1.1.1.4 ! root     1375: F_OP(abs, s)
1.1       root     1376: {
1.1.1.4 ! root     1377:     do_fabss();
1.1       root     1378: }
                   1379: 
1.1.1.4 ! root     1380: F_HELPER(cmp);
1.1       root     1381: 
1.1.1.4 ! root     1382: #ifdef TARGET_SPARC64
        !          1383: F_OP(neg, d)
1.1       root     1384: {
1.1.1.4 ! root     1385:     DT0 = float64_chs(DT1);
1.1       root     1386: }
                   1387: 
1.1.1.4 ! root     1388: F_OP(abs, d)
1.1       root     1389: {
1.1.1.4 ! root     1390:     do_fabsd();
1.1       root     1391: }
                   1392: 
                   1393: void OPPROTO op_fcmps_fcc1(void)
                   1394: {
                   1395:     do_fcmps_fcc1();
                   1396: }
                   1397: 
                   1398: void OPPROTO op_fcmpd_fcc1(void)
                   1399: {
                   1400:     do_fcmpd_fcc1();
                   1401: }
                   1402: 
                   1403: void OPPROTO op_fcmps_fcc2(void)
                   1404: {
                   1405:     do_fcmps_fcc2();
                   1406: }
                   1407: 
                   1408: void OPPROTO op_fcmpd_fcc2(void)
                   1409: {
                   1410:     do_fcmpd_fcc2();
                   1411: }
                   1412: 
                   1413: void OPPROTO op_fcmps_fcc3(void)
                   1414: {
                   1415:     do_fcmps_fcc3();
                   1416: }
                   1417: 
                   1418: void OPPROTO op_fcmpd_fcc3(void)
                   1419: {
                   1420:     do_fcmpd_fcc3();
                   1421: }
                   1422: #endif
                   1423: 
1.1.1.4 ! root     1424: /* Integer to float conversion.  */
1.1       root     1425: #ifdef USE_INT_TO_FLOAT_HELPERS
1.1.1.4 ! root     1426: F_HELPER(ito);
1.1       root     1427: #else
1.1.1.4 ! root     1428: F_OP(ito, s)
1.1       root     1429: {
1.1.1.4 ! root     1430:     FT0 = int32_to_float32(*((int32_t *)&FT1), &env->fp_status);
1.1       root     1431: }
                   1432: 
1.1.1.4 ! root     1433: F_OP(ito, d)
1.1       root     1434: {
1.1.1.4 ! root     1435:     DT0 = int32_to_float64(*((int32_t *)&FT1), &env->fp_status);
1.1       root     1436: }
                   1437: 
                   1438: #ifdef TARGET_SPARC64
1.1.1.4 ! root     1439: F_OP(xto, s)
1.1       root     1440: {
1.1.1.4 ! root     1441:     FT0 = int64_to_float32(*((int64_t *)&DT1), &env->fp_status);
1.1       root     1442: }
                   1443: 
1.1.1.4 ! root     1444: F_OP(xto, d)
1.1       root     1445: {
1.1.1.4 ! root     1446:     DT0 = int64_to_float64(*((int64_t *)&DT1), &env->fp_status);
1.1       root     1447: }
                   1448: #endif
                   1449: #endif
1.1.1.4 ! root     1450: #undef F_HELPER
1.1       root     1451: 
1.1.1.4 ! root     1452: /* floating point conversion */
1.1       root     1453: void OPPROTO op_fdtos(void)
                   1454: {
1.1.1.4 ! root     1455:     FT0 = float64_to_float32(DT1, &env->fp_status);
1.1       root     1456: }
                   1457: 
                   1458: void OPPROTO op_fstod(void)
                   1459: {
1.1.1.4 ! root     1460:     DT0 = float32_to_float64(FT1, &env->fp_status);
1.1       root     1461: }
                   1462: 
1.1.1.4 ! root     1463: /* Float to integer conversion.  */
1.1       root     1464: void OPPROTO op_fstoi(void)
                   1465: {
1.1.1.4 ! root     1466:     *((int32_t *)&FT0) = float32_to_int32(FT1, &env->fp_status);
1.1       root     1467: }
                   1468: 
                   1469: void OPPROTO op_fdtoi(void)
                   1470: {
1.1.1.4 ! root     1471:     *((int32_t *)&FT0) = float64_to_int32(DT1, &env->fp_status);
1.1       root     1472: }
                   1473: 
                   1474: #ifdef TARGET_SPARC64
                   1475: void OPPROTO op_fstox(void)
                   1476: {
1.1.1.4 ! root     1477:     *((int64_t *)&DT0) = float32_to_int64(FT1, &env->fp_status);
1.1       root     1478: }
                   1479: 
                   1480: void OPPROTO op_fdtox(void)
                   1481: {
1.1.1.4 ! root     1482:     *((int64_t *)&DT0) = float64_to_int64(DT1, &env->fp_status);
1.1       root     1483: }
                   1484: 
                   1485: void OPPROTO op_fmovs_cc(void)
                   1486: {
                   1487:     if (T2)
                   1488:        FT0 = FT1;
                   1489: }
                   1490: 
                   1491: void OPPROTO op_fmovd_cc(void)
                   1492: {
                   1493:     if (T2)
                   1494:        DT0 = DT1;
                   1495: }
                   1496: 
                   1497: void OPPROTO op_mov_cc(void)
                   1498: {
                   1499:     if (T2)
                   1500:        T0 = T1;
                   1501: }
                   1502: 
                   1503: void OPPROTO op_flushw(void)
                   1504: {
                   1505:     if (env->cansave != NWINDOWS - 2) {
                   1506:         raise_exception(TT_SPILL | (env->otherwin != 0 ? 
                   1507:                                    (TT_WOTHER | ((env->wstate & 0x38) >> 1)):
                   1508:                                    ((env->wstate & 0x7) << 2)));
                   1509:     }
                   1510: }
                   1511: 
                   1512: void OPPROTO op_saved(void)
                   1513: {
                   1514:     env->cansave++;
                   1515:     if (env->otherwin == 0)
                   1516:        env->canrestore--;
1.1.1.4 ! root     1517:     else
        !          1518:        env->otherwin--;
        !          1519:     FORCE_RET();
1.1       root     1520: }
                   1521: 
                   1522: void OPPROTO op_restored(void)
                   1523: {
                   1524:     env->canrestore++;
                   1525:     if (env->cleanwin < NWINDOWS - 1)
                   1526:        env->cleanwin++;
                   1527:     if (env->otherwin == 0)
                   1528:        env->cansave--;
                   1529:     else
                   1530:        env->otherwin--;
1.1.1.4 ! root     1531:     FORCE_RET();
1.1       root     1532: }
                   1533: 
                   1534: void OPPROTO op_popc(void)
                   1535: {
                   1536:     do_popc();
                   1537: }
                   1538: 
                   1539: void OPPROTO op_done(void)
                   1540: {
                   1541:     do_done();
                   1542: }
                   1543: 
                   1544: void OPPROTO op_retry(void)
                   1545: {
                   1546:     do_retry();
                   1547: }
                   1548: 
                   1549: void OPPROTO op_sir(void)
                   1550: {
                   1551:     // XXX
                   1552: 
                   1553: }
                   1554: 
                   1555: void OPPROTO op_ld_asi_reg()
                   1556: {
                   1557:     T0 += PARAM1;
                   1558:     helper_ld_asi(env->asi, PARAM2, PARAM3);
                   1559: }
                   1560: 
                   1561: void OPPROTO op_st_asi_reg()
                   1562: {
                   1563:     T0 += PARAM1;
                   1564:     helper_st_asi(env->asi, PARAM2, PARAM3);
                   1565: }
                   1566: #endif
                   1567: 
                   1568: void OPPROTO op_ld_asi()
                   1569: {
                   1570:     helper_ld_asi(PARAM1, PARAM2, PARAM3);
                   1571: }
                   1572: 
                   1573: void OPPROTO op_st_asi()
                   1574: {
                   1575:     helper_st_asi(PARAM1, PARAM2, PARAM3);
                   1576: }
                   1577: 
1.1.1.4 ! root     1578: #ifdef TARGET_SPARC64
        !          1579: void OPPROTO op_alignaddr()
        !          1580: {
        !          1581:     uint64_t tmp;
        !          1582: 
        !          1583:     tmp = T0 + T1;
        !          1584:     env->gsr &= ~7ULL;
        !          1585:     env->gsr |= tmp & 7ULL;
        !          1586:     T0 = tmp & ~7ULL;
        !          1587: }
        !          1588: 
        !          1589: void OPPROTO op_faligndata()
        !          1590: {
        !          1591:     uint64_t tmp;
        !          1592: 
        !          1593:     tmp = (*((uint64_t *)&DT0)) << ((env->gsr & 7) * 8);
        !          1594:     tmp |= (*((uint64_t *)&DT1)) >> (64 - (env->gsr & 7) * 8);
        !          1595:     (*((uint64_t *)&DT0)) = tmp;
        !          1596: }
        !          1597: #endif

unix.superglobalmegacorp.com

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