Annotation of tme/ic/sparc/sparc-rc-cc.c, revision 1.1

1.1     ! root        1: /* $Id: sparc-rc-cc.c,v 1.2 2009/08/28 01:41:45 fredette Exp $ */
        !             2: 
        !             3: /* ic/sparc/sparc-rc-cc.c - SPARC recode condition code support: */
        !             4: 
        !             5: /*
        !             6:  * Copyright (c) 2008 Matt Fredette
        !             7:  * All rights reserved.
        !             8:  *
        !             9:  * Redistribution and use in source and binary forms, with or without
        !            10:  * modification, are permitted provided that the following conditions
        !            11:  * are met:
        !            12:  * 1. Redistributions of source code must retain the above copyright
        !            13:  *    notice, this list of conditions and the following disclaimer.
        !            14:  * 2. Redistributions in binary form must reproduce the above copyright
        !            15:  *    notice, this list of conditions and the following disclaimer in the
        !            16:  *    documentation and/or other materials provided with the distribution.
        !            17:  * 3. All advertising materials mentioning features or use of this software
        !            18:  *    must display the following acknowledgement:
        !            19:  *      This product includes software developed by Matt Fredette.
        !            20:  * 4. The name of the author may not be used to endorse or promote products
        !            21:  *    derived from this software without specific prior written permission.
        !            22:  *
        !            23:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
        !            24:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
        !            25:  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
        !            26:  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
        !            27:  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
        !            28:  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
        !            29:  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
        !            30:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
        !            31:  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
        !            32:  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
        !            33:  * POSSIBILITY OF SUCH DAMAGE.
        !            34:  */
        !            35: 
        !            36: #if TME_SPARC_RECODE_SIZE(ic) == TME_RECODE_SIZE_32
        !            37: 
        !            38: _TME_RCSID("$Id: sparc-rc-cc.c,v 1.2 2009/08/28 01:41:45 fredette Exp $");
        !            39: 
        !            40: /* macros: */
        !            41: 
        !            42: /* this converts sparc64 icc flags into the current architecture's icc
        !            43:    flags: */
        !            44: #define TME_SPARC_ICC(ccr_icc)                                 \
        !            45:   ((ccr_icc)                                                   \
        !            46:    * (((TME_SPARC_VERSION(ic) < 9)                             \
        !            47:        * (TME_SPARC32_PSR_ICC                                  \
        !            48:          / TME_SPARC64_CCR_ICC))                               \
        !            49:       + (TME_SPARC_VERSION(ic) >= 9)))
        !            50: 
        !            51: #define TME_SPARC_RECODE_CCR_NEED(insn_class, insn_size, size) \
        !            52:   ((((insn_class == TME_RECODE_INSN_CLASS_ADDITIVE)            \
        !            53:      * ((TME_SPARC64_CCR_ICC_C                                 \
        !            54:         * (TME_RECODE_FLAG_NEED(insn_class, insn_size,         \
        !            55:                                 TME_RECODE_COND_C, size)       \
        !            56:            != 0))                                              \
        !            57:        + (TME_SPARC64_CCR_ICC_V                                \
        !            58:           * (TME_RECODE_FLAG_NEED(insn_class, insn_size,       \
        !            59:                                   TME_RECODE_COND_V, size)     \
        !            60:              != 0))))                                          \
        !            61:     + (TME_SPARC64_CCR_ICC_Z                                   \
        !            62:        * (TME_RECODE_FLAG_NEED(insn_class, insn_size,          \
        !            63:                               TME_RECODE_COND_Z, size)         \
        !            64:          != 0))                                                \
        !            65:     + (TME_SPARC64_CCR_ICC_N                                   \
        !            66:        * (TME_RECODE_FLAG_NEED(insn_class, insn_size,          \
        !            67:                               TME_RECODE_COND_N, size)         \
        !            68:          != 0)))                                               \
        !            69:    * ((TME_SPARC64_CCR_XCC                                     \
        !            70:        / TME_SPARC64_CCR_ICC)                                  \
        !            71:       * (size > TME_RECODE_SIZE_32)))
        !            72: 
        !            73: /* this macro gives the %icc and %xcc N and Z flags: */
        !            74: #define TME_SPARC_RECODE_CCR_N_Z(dst, ccr_need)                        \
        !            75:   (0                                                           \
        !            76:    + ((((tme_uint32_t) (dst)) == 0)                            \
        !            77:       * ((ccr_need) & TME_SPARC64_CCR_ICC_Z))                  \
        !            78:    + ((((tme_int32_t) (dst)) < 0)                              \
        !            79:       * ((ccr_need) & TME_SPARC64_CCR_ICC_N))                  \
        !            80:    + ((((tme_sparc_ireg_t) (dst)) == 0)                                \
        !            81:       * ((ccr_need) & TME_SPARC64_CCR_XCC_Z))                  \
        !            82:    + ((((dst) & TME_SPARC_IREG_MSBIT) != 0)                    \
        !            83:       * ((ccr_need) & TME_SPARC64_CCR_XCC_N)))
        !            84: 
        !            85: /* this macro updates %icc and %xcc: */
        !            86: #define TME_SPARC_RECODE_CCR_UPDATE(ic, ccr, ccr_need)         \
        !            87:   do {                                                         \
        !            88:     if (TME_SPARC_VERSION((struct tme_sparc *) (ic)) >= 9) {   \
        !            89:       ((struct tme_sparc *) (ic))->tme_sparc64_ireg_ccr                \
        !            90:        = ((((struct tme_sparc *) (ic))->tme_sparc64_ireg_ccr   \
        !            91:            & ~ccr_need)                                        \
        !            92:           | ccr);                                              \
        !            93:     }                                                          \
        !            94:     else {                                                     \
        !            95:       ((struct tme_sparc *) (ic))->tme_sparc32_ireg_psr                \
        !            96:        = ((((struct tme_sparc *) (ic))->tme_sparc32_ireg_psr   \
        !            97:            & ~TME_SPARC_ICC(ccr_need))                         \
        !            98:           | TME_SPARC_ICC(ccr_need));                          \
        !            99:     }                                                          \
        !           100:   } while (/* CONSTCOND */ 0)
        !           101: 
        !           102: /* rename various things by the architecture size: */
        !           103: #define _tme_sparc_flags_additive _TME_SPARC_RECODE_SIZE(_tme_sparc,_flags_additive)
        !           104: #define _tme_sparc_flags_logical _TME_SPARC_RECODE_SIZE(_tme_sparc,_flags_logical)
        !           105: #define _tme_sparc_flags_func_logical _TME_SPARC_RECODE_SIZE(_tme_sparc,_flags_func_logical)
        !           106: #define _tme_sparc_flags_func_add _TME_SPARC_RECODE_SIZE(_tme_sparc,_flags_func_add)
        !           107: #define _tme_sparc_flags_func_sub _TME_SPARC_RECODE_SIZE(_tme_sparc,_flags_func_sub)
        !           108: #define _tme_sparc_recode_conds_func_icc _TME_SPARC_RECODE_SIZE(_tme_sparc,_recode_conds_func_icc)
        !           109: #define _tme_sparc_recode_cc_init _TME_SPARC_RECODE_SIZE(_tme_sparc,_recode_cc_init)
        !           110: 
        !           111: /* the sparc64 recode xcc conditions function: */
        !           112: static int
        !           113: _tme_sparc64_recode_conds_func_xcc(tme_recode_uguest_t flags, tme_uint32_t cond)
        !           114: {
        !           115:   return (_tme_sparc_conds_icc
        !           116:          [TME_FIELD_MASK_EXTRACTU(flags, TME_SPARC64_CCR_XCC)]
        !           117:          & (1 << cond));
        !           118: }
        !           119: 
        !           120: #endif /* TME_SPARC_RECODE_SIZE(ic) == TME_RECODE_SIZE_32 */
        !           121: 
        !           122: /* the additive instruction flags: */
        !           123: static const struct tme_recode_flag _tme_sparc_flags_additive[] = {
        !           124: #if TME_SPARC_VERSION(ic) >= 9
        !           125:   {
        !           126:     TME_RECODE_COND_N,
        !           127:     TME_RECODE_SIZE_64,
        !           128:     TME_SPARC64_CCR_XCC_N
        !           129:   },
        !           130:   {
        !           131:     TME_RECODE_COND_Z,
        !           132:     TME_RECODE_SIZE_64,
        !           133:     TME_SPARC64_CCR_XCC_Z
        !           134:   },
        !           135:   {
        !           136:     TME_RECODE_COND_V,
        !           137:     TME_RECODE_SIZE_64,
        !           138:     TME_SPARC64_CCR_XCC_V
        !           139:   },
        !           140:   {
        !           141:     TME_RECODE_COND_C,
        !           142:     TME_RECODE_SIZE_64,
        !           143:     TME_SPARC64_CCR_XCC_C
        !           144:   },
        !           145: #endif /* TME_SPARC_VERSION(ic) >= 9 */
        !           146:   { 
        !           147:     TME_RECODE_COND_N,
        !           148:     TME_RECODE_SIZE_32,
        !           149:     TME_SPARC_ICC(TME_SPARC64_CCR_ICC_N)
        !           150:   },
        !           151:   { 
        !           152:     TME_RECODE_COND_Z,
        !           153:     TME_RECODE_SIZE_32,
        !           154:     TME_SPARC_ICC(TME_SPARC64_CCR_ICC_Z)
        !           155:   },
        !           156:   { 
        !           157:     TME_RECODE_COND_V,
        !           158:     TME_RECODE_SIZE_32,
        !           159:     TME_SPARC_ICC(TME_SPARC64_CCR_ICC_V)
        !           160:   },
        !           161:   { 
        !           162:     TME_RECODE_COND_C,
        !           163:     TME_RECODE_SIZE_32,
        !           164:     TME_SPARC_ICC(TME_SPARC64_CCR_ICC_C)
        !           165:   },
        !           166:   {
        !           167:     0,
        !           168:     0,
        !           169:     0
        !           170:   }
        !           171: };
        !           172: 
        !           173: /* the logical instruction flags: */
        !           174: static const struct tme_recode_flag _tme_sparc_flags_logical[] = {
        !           175: #if TME_SPARC_VERSION(ic) >= 9
        !           176:   {
        !           177:     TME_RECODE_COND_N,
        !           178:     TME_RECODE_SIZE_64,
        !           179:     TME_SPARC64_CCR_XCC_N
        !           180:   },
        !           181:   {
        !           182:     TME_RECODE_COND_Z,
        !           183:     TME_RECODE_SIZE_64,
        !           184:     TME_SPARC64_CCR_XCC_Z
        !           185:   },
        !           186:   {
        !           187:     TME_RECODE_COND_FALSE,
        !           188:     0,
        !           189:     TME_SPARC64_CCR_XCC_V
        !           190:   },
        !           191:   {
        !           192:     TME_RECODE_COND_FALSE,
        !           193:     0,
        !           194:     TME_SPARC64_CCR_XCC_C
        !           195:   },
        !           196: #endif /* TME_SPARC_VERSION(ic) >= 9 */
        !           197:   { 
        !           198:     TME_RECODE_COND_N,
        !           199:     TME_RECODE_SIZE_32,
        !           200:     TME_SPARC_ICC(TME_SPARC64_CCR_ICC_N)
        !           201:   },
        !           202:   { 
        !           203:     TME_RECODE_COND_Z,
        !           204:     TME_RECODE_SIZE_32,
        !           205:     TME_SPARC_ICC(TME_SPARC64_CCR_ICC_Z)
        !           206:   },
        !           207:   { 
        !           208:     TME_RECODE_COND_FALSE,
        !           209:     0,
        !           210:     TME_SPARC_ICC(TME_SPARC64_CCR_ICC_V)
        !           211:   },
        !           212:   { 
        !           213:     TME_RECODE_COND_FALSE,
        !           214:     0,
        !           215:     TME_SPARC_ICC(TME_SPARC64_CCR_ICC_C)
        !           216:   },
        !           217:   {
        !           218:     0,
        !           219:     0,
        !           220:     0
        !           221:   }
        !           222: };
        !           223: 
        !           224: /* the logical instruction flags function: */
        !           225: static void
        !           226: _tme_sparc_flags_func_logical(struct tme_ic *ic,
        !           227:                              tme_recode_uguest_t src1,
        !           228:                              tme_recode_uguest_t src2,
        !           229:                              tme_recode_uguest_t dst)
        !           230: {
        !           231:   unsigned int ccr_need;
        !           232: 
        !           233:   ccr_need
        !           234:     = (TME_SPARC_RECODE_CCR_NEED(TME_RECODE_INSN_CLASS_LOGICAL,
        !           235:                                 TME_SPARC_RECODE_SIZE(ic),
        !           236:                                 TME_RECODE_SIZE_32)
        !           237:        | TME_SPARC_RECODE_CCR_NEED(TME_RECODE_INSN_CLASS_LOGICAL,
        !           238:                                   TME_SPARC_RECODE_SIZE(ic),
        !           239:                                   TME_SPARC_RECODE_SIZE(ic)));
        !           240: 
        !           241:   TME_SPARC_RECODE_CCR_UPDATE(ic,
        !           242:                              TME_SPARC_RECODE_CCR_N_Z(dst, ccr_need),
        !           243:                              ccr_need);
        !           244: }
        !           245: 
        !           246: /* the add instruction flags function: */
        !           247: static void
        !           248: _tme_sparc_flags_func_add(struct tme_ic *ic,
        !           249:                          tme_recode_uguest_t src1,
        !           250:                          tme_recode_uguest_t src2,
        !           251:                          tme_recode_uguest_t dst)
        !           252: {
        !           253:   unsigned int ccr_need;
        !           254:   unsigned int ccr;
        !           255: 
        !           256:   ccr_need
        !           257:     = (TME_SPARC_RECODE_CCR_NEED(TME_RECODE_INSN_CLASS_ADDITIVE,
        !           258:                                 TME_SPARC_RECODE_SIZE(ic),
        !           259:                                 TME_RECODE_SIZE_32)
        !           260:        | TME_SPARC_RECODE_CCR_NEED(TME_RECODE_INSN_CLASS_ADDITIVE,
        !           261:                                   TME_SPARC_RECODE_SIZE(ic),
        !           262:                                   TME_SPARC_RECODE_SIZE(ic)));
        !           263: 
        !           264:   /* make the %icc and %xcc N and Z flags: */
        !           265:   ccr = TME_SPARC_RECODE_CCR_N_Z(dst, ccr_need);
        !           266: 
        !           267:   /* if src1 and src2 both have bit 31 set, or if dst does not have
        !           268:      bit 31 set and either src1 or src2 does, set %icc.C: */
        !           269:   if (((tme_int32_t) ((src1 & src2) | (~dst & (src1 | src2)))) < 0) {
        !           270:     ccr += (ccr_need & TME_SPARC64_CCR_ICC_C);
        !           271:   }
        !           272: 
        !           273:   /* if src1 and src2 have the same bit 31, and dst has a different
        !           274:      bit 31, set %icc.V: */
        !           275:   if (((tme_int32_t) ((src2 ^ dst) & (src1 ^ ~src2))) < 0) {
        !           276:     ccr += (ccr_need & TME_SPARC64_CCR_ICC_V);
        !           277:   }
        !           278: 
        !           279:   /* if src1 and src2 both have the most-significant bit set, or if
        !           280:      dst does not have the most-significant bit set either src1 or
        !           281:      src2 does, set %xcc.C: */
        !           282:   if (((src1 & src2) | (~dst & (src1 | src2))) & TME_SPARC_IREG_MSBIT) {
        !           283:     ccr += (ccr_need & TME_SPARC64_CCR_XCC_C);
        !           284:   }
        !           285: 
        !           286:   /* if src1 and src2 have the same most-significant bit, and dst has
        !           287:      a different most-significant bit, set %xcc.V: */
        !           288:   if (((src2 ^ dst) & (src1 ^ ~src2)) & TME_SPARC_IREG_MSBIT) {
        !           289:     ccr += (ccr_need & TME_SPARC64_CCR_XCC_V);
        !           290:   }
        !           291: 
        !           292:   TME_SPARC_RECODE_CCR_UPDATE(ic, ccr, ccr_need);
        !           293: }
        !           294: 
        !           295: /* the sub instruction flags function: */
        !           296: static void
        !           297: _tme_sparc_flags_func_sub(struct tme_ic *ic,
        !           298:                          tme_recode_uguest_t src1,
        !           299:                          tme_recode_uguest_t src2,
        !           300:                          tme_recode_uguest_t dst)
        !           301: {
        !           302:   unsigned int ccr_need;
        !           303:   unsigned int ccr;
        !           304: 
        !           305:   ccr_need
        !           306:     = (TME_SPARC_RECODE_CCR_NEED(TME_RECODE_INSN_CLASS_ADDITIVE,
        !           307:                                 TME_SPARC_RECODE_SIZE(ic),
        !           308:                                 TME_RECODE_SIZE_32)
        !           309:        | TME_SPARC_RECODE_CCR_NEED(TME_RECODE_INSN_CLASS_ADDITIVE,
        !           310:                                   TME_SPARC_RECODE_SIZE(ic),
        !           311:                                   TME_SPARC_RECODE_SIZE(ic)));
        !           312: 
        !           313:   /* make the %icc and %xcc N and Z flags: */
        !           314:   ccr = TME_SPARC_RECODE_CCR_N_Z(dst, ccr_need);
        !           315: 
        !           316:   /* if src2 is greater than src1 in 32 bits, set %icc.C: */
        !           317:   if (((tme_uint32_t) src2) > ((tme_uint32_t) src1)) {
        !           318:     ccr += (ccr_need & TME_SPARC64_CCR_ICC_C);
        !           319:   }
        !           320: 
        !           321:   /* if src1 and src2 have different bit 31s, and dst has a different
        !           322:      bit 31 than src1, set %icc.V: */
        !           323:   if (((tme_int32_t) ((src1 ^ src2) & (src1 ^ dst))) < 0) {
        !           324:     ccr += (ccr_need & TME_SPARC64_CCR_ICC_V);
        !           325:   }
        !           326: 
        !           327:   /* if src2 is greater than src1, set %xcc.C: */
        !           328:   if (((tme_sparc_ireg_t) src2) > ((tme_sparc_ireg_t) src1)) {
        !           329:     ccr += (ccr_need & TME_SPARC64_CCR_XCC_C);
        !           330:   }
        !           331: 
        !           332:   /* if src1 and src2 have different most-significant bits, and dst
        !           333:      has a different most-significant bit than src1, set %xcc.V: */
        !           334:   if (((src1 ^ src2) & (src1 ^ dst)) & TME_SPARC_IREG_MSBIT) {
        !           335:     ccr += (ccr_need & TME_SPARC64_CCR_XCC_V);
        !           336:   }
        !           337: 
        !           338:   TME_SPARC_RECODE_CCR_UPDATE(ic, ccr, ccr_need);
        !           339: }
        !           340: 
        !           341: /* the sparc icc conditions function: */
        !           342: static int
        !           343: _tme_sparc_recode_conds_func_icc(tme_recode_uguest_t flags, tme_uint32_t cond)
        !           344: {
        !           345:   return (_tme_sparc_conds_icc
        !           346:          [TME_FIELD_MASK_EXTRACTU(flags, TME_SPARC_ICC(TME_SPARC64_CCR_ICC))]
        !           347:          & (1 << cond));
        !           348: }
        !           349: 
        !           350: /* this initializes for condition codes: */
        !           351: static void
        !           352: _tme_sparc_recode_cc_init(struct tme_sparc *ic)
        !           353: {
        !           354:   struct tme_recode_ic *recode_ic;
        !           355:   struct tme_recode_flags_group flags_group;
        !           356:   struct tme_recode_conds_group conds_group;
        !           357: 
        !           358:   /* recover the recode ic: */
        !           359:   recode_ic = ic->tme_sparc_recode_ic;
        !           360: 
        !           361:   /* make the common parts of a flags group: */
        !           362:   memset((char *) &flags_group, 0, sizeof(flags_group));
        !           363:   flags_group.tme_recode_flags_group_insn_size = TME_SPARC_RECODE_SIZE(ic);
        !           364:   if (TME_SPARC_VERSION(ic) <= 8) {
        !           365:     flags_group.tme_recode_flags_group_flags_reg_size = TME_RECODE_SIZE_32;
        !           366:     flags_group.tme_recode_flags_group_flags_reg = TME_SPARC32_IREG_PSR;
        !           367:   }
        !           368:   else {
        !           369:     flags_group.tme_recode_flags_group_flags_reg_size = TME_RECODE_SIZE_8;
        !           370:     flags_group.tme_recode_flags_group_flags_reg = TME_SPARC64_IREG_CCR << 3;
        !           371:   }
        !           372: 
        !           373:   /* make the flags thunk for addcc and addxcc: */
        !           374:   flags_group.tme_recode_flags_group_insn_class = TME_RECODE_INSN_CLASS_ADDITIVE;
        !           375:   flags_group.tme_recode_flags_group_flags = _tme_sparc_flags_additive;
        !           376:   flags_group.tme_recode_flags_group_guest_func = _tme_sparc_flags_func_add;
        !           377:   ic->tme_sparc_recode_flags_thunk_add
        !           378:     = tme_recode_flags_thunk(recode_ic,
        !           379:                             &flags_group);
        !           380: 
        !           381:   /* make the flags thunk for subcc and subxcc: */
        !           382:   flags_group.tme_recode_flags_group_insn_class = TME_RECODE_INSN_CLASS_ADDITIVE;
        !           383:   flags_group.tme_recode_flags_group_flags = _tme_sparc_flags_additive;
        !           384:   flags_group.tme_recode_flags_group_guest_func = _tme_sparc_flags_func_sub;
        !           385:   ic->tme_sparc_recode_flags_thunk_sub
        !           386:     = tme_recode_flags_thunk(recode_ic,
        !           387:                             &flags_group);
        !           388: 
        !           389:   /* make the flags thunk for the logical instructions: */
        !           390:   flags_group.tme_recode_flags_group_insn_class = TME_RECODE_INSN_CLASS_LOGICAL;
        !           391:   flags_group.tme_recode_flags_group_flags = _tme_sparc_flags_logical;
        !           392:   flags_group.tme_recode_flags_group_guest_func = _tme_sparc_flags_func_logical;
        !           393:   ic->tme_sparc_recode_flags_thunk_logical
        !           394:     = tme_recode_flags_thunk(recode_ic,
        !           395:                             &flags_group);
        !           396: 
        !           397:   /* make the common parts of a conditions group: */
        !           398:   memset((char *) &conds_group, 0, sizeof(conds_group));
        !           399:   conds_group.tme_recode_conds_group_flags_reg_size = flags_group.tme_recode_flags_group_flags_reg_size;
        !           400:   conds_group.tme_recode_conds_group_flags_reg = flags_group.tme_recode_flags_group_flags_reg;
        !           401:   conds_group.tme_recode_conds_group_cond_count = TME_SPARC_COND_NOT;
        !           402: 
        !           403:   /* make the conditions thunk for %icc: */
        !           404:   conds_group.tme_recode_conds_group_flags = TME_SPARC_ICC(TME_SPARC64_CCR_ICC);
        !           405:   conds_group.tme_recode_conds_group_guest_func = _tme_sparc_recode_conds_func_icc;
        !           406:   ic->tme_sparc_recode_conds_thunk_icc
        !           407:     = tme_recode_conds_thunk(recode_ic,
        !           408:                             &conds_group);
        !           409: 
        !           410:   /* if this is a sparc64: */
        !           411:   if (TME_SPARC_VERSION(ic) >= 9) {
        !           412: 
        !           413:     /* make the flags thunk for the sparc64 internal "rcc" flags.
        !           414:        this is identical to the flags thunk for the logical
        !           415:        instructions, except it uses the internal "rcc" register: */
        !           416:     flags_group.tme_recode_flags_group_flags_reg = TME_SPARC64_IREG_RCC << 3;
        !           417:     ic->tme_sparc_recode_flags_thunk_rcc
        !           418:       = tme_recode_flags_thunk(recode_ic,
        !           419:                               &flags_group);
        !           420: 
        !           421:     /* make the conditions thunk for %xcc: */
        !           422:     conds_group.tme_recode_conds_group_flags = TME_SPARC64_CCR_XCC;
        !           423:     conds_group.tme_recode_conds_group_guest_func = _tme_sparc64_recode_conds_func_xcc;
        !           424:     ic->tme_sparc_recode_conds_thunk_xcc
        !           425:       = tme_recode_conds_thunk(recode_ic,
        !           426:                               &conds_group);
        !           427: 
        !           428:     /* make the conditions thunk for the internal "rcc" flags.  this
        !           429:        is identical to the conditions thunk for %xcc, except it uses
        !           430:        the internal "rcc" register: */
        !           431:     conds_group.tme_recode_conds_group_flags_reg = flags_group.tme_recode_flags_group_flags_reg;
        !           432:     ic->tme_sparc_recode_conds_thunk_rcc
        !           433:       = tme_recode_conds_thunk(recode_ic,
        !           434:                               &conds_group);
        !           435:   }
        !           436: }

unix.superglobalmegacorp.com

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