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

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;
        !           382:     if ((src1 & 0xffffffff) < (T1 & 0xffffffff))
        !           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;
        !           427:     if ((src1 & 0xffffffff) < (T1 & 0xffffffff))
        !           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;
        !           483:     if (T0 < src1)
        !           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;
        !           528:     if (T0 < src1)
        !           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.