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

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

unix.superglobalmegacorp.com

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