Annotation of XNU/EXTERNAL_HEADERS/architecture/ppc/pseudo_inst.h, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
        !             3:  *
        !             4:  * @APPLE_LICENSE_HEADER_START@
        !             5:  * 
        !             6:  * The contents of this file constitute Original Code as defined in and
        !             7:  * are subject to the Apple Public Source License Version 1.1 (the
        !             8:  * "License").  You may not use this file except in compliance with the
        !             9:  * License.  Please obtain a copy of the License at
        !            10:  * http://www.apple.com/publicsource and read it before using this file.
        !            11:  * 
        !            12:  * This Original Code and all software distributed under the License are
        !            13:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
        !            14:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
        !            15:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
        !            16:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
        !            17:  * License for the specific language governing rights and limitations
        !            18:  * under the License.
        !            19:  * 
        !            20:  * @APPLE_LICENSE_HEADER_END@
        !            21:  */
        !            22: /* Copyright (c) 1996 NeXT Software, Inc.  All rights reserved.
        !            23:  *
        !            24:  *     File:   architecture/ppc/pseudo_inst.h
        !            25:  *     Author: Mike DeMoney
        !            26:  *
        !            27:  *     This header file defines assembler pseudo-instruction macros for
        !            28:  *     for the ppc.
        !            29:  *
        !            30:  *     NOTE: This is obviously only useful to include in assembly
        !            31:  *     code source.
        !            32:  *
        !            33:  *     ALSO NOTE: These macros don't attempt to be 64-bit compatable
        !            34:  *
        !            35:  * HISTORY
        !            36:  * 29-Dec-96  Umesh Vaishampayan  ([email protected])
        !            37:  *     Ported from m98k.
        !            38:  * 05-Nov-92  Mike DeMoney ([email protected])
        !            39:  *     Created.
        !            40:  */
        !            41: 
        !            42: #ifndef        _ARCH_PPC_PSEUDO_INST_H_
        !            43: #define        _ARCH_PPC_PSEUDO_INST_H_
        !            44: 
        !            45: #import <architecture/ppc/reg_help.h>
        !            46: #import <architecture/ppc/asm_help.h>
        !            47: 
        !            48: #ifdef __ASSEMBLER__
        !            49: 
        !            50: /*
        !            51:  * Pseudo instruction definitions
        !            52:  */
        !            53: 
        !            54: /*
        !            55:  * Macro package initialization
        !            56:  */
        !            57:        .set    __no_at,0               /* allow at by default */
        !            58: 
        !            59: /*
        !            60:  * .at_off -- disable use of at by macros
        !            61:  * .at_on -- enable use of at by macros
        !            62:  */
        !            63: .macro .at_off
        !            64:        .set    __no_at,1
        !            65: .endmacro
        !            66: 
        !            67: .macro .at_on
        !            68:        .set    __no_at,0
        !            69: .endmacro
        !            70: 
        !            71: /*
        !            72:  * li32        rD,IMMED
        !            73:  *
        !            74:  * Load 32-bit immediate into rD
        !            75:  * FIXME: Need a way to undefine built-in macro for this.
        !            76:  */
        !            77: .macro li32                            // li32 rD,immed
        !            78: .if    $n != 2
        !            79:        .abort  "invalid operands of li32"
        !            80: .endif
        !            81: .abs   __is_abs,$1
        !            82: .if    !__is_abs
        !            83:        addis   $0,0,hi16($1)
        !            84:        ori     $0,$0,lo16($1)
        !            85: .elseif        $1 == 0
        !            86:        addi    $0,0,0
        !            87: .elseif        ($1 & 0xffff) == 0
        !            88:        addis   $0,0,hi16($1)
        !            89: .elseif        ($1 & 0xffff8000) == 0
        !            90:        addi    $0,0,$1
        !            91: .elseif ($1 & 0xffff8000) == 0xffff8000
        !            92:        addi    $0,0,$1
        !            93: .else
        !            94:        addis   $0,0,hi16($1)
        !            95:        ori     $0,$0,lo16($1)
        !            96: .endif
        !            97: .endmacro
        !            98:  
        !            99: 
        !           100: /*
        !           101:  * andi32. rD,rS1,IMMED
        !           102:  *
        !           103:  * Perform "andi." with (possibly) 32-bit immediate
        !           104:  */
        !           105: .macro andi32.                         // andi32. rD,rS1,IMMED
        !           106: .if    $n != 3
        !           107:        .abort  "invalid operands of andi."
        !           108: .endif
        !           109:        .set    __used_at,0
        !           110: .abs   __is_abs,$2
        !           111: .if    !__is_abs
        !           112:        .set    __used_at,1
        !           113:        li32    at,$2
        !           114:        and.    $0,$1,at
        !           115: .elseif        ($2 & 0xffff0000) == 0
        !           116:        andi.   $0,$1,$2
        !           117: .elseif        ($2 & 0xffff) == 0
        !           118:        andis.  $0,$1,hi16($2)
        !           119: .else
        !           120:        .set    __used_at,1
        !           121:        li32    at,$2
        !           122:        and.    $0,$1,at
        !           123: .endif
        !           124: .if    __no_at & __used_at
        !           125:        .abort  "Macro uses at while .no_at in effect"
        !           126: .endif
        !           127: .endmacro
        !           128:  
        !           129: /*
        !           130:  * ori32       rD,rS1,IMMED
        !           131:  *
        !           132:  * Perform "ori" with (possibly) 32-bit immediate
        !           133:  */
        !           134: .macro ori32                           // ori32        rD,rS1,IMMED
        !           135: .if    $n != 3
        !           136:        .abort  "invalid operands of ori"
        !           137: .endif
        !           138: .abs   __is_abs,$2
        !           139: .if    !__is_abs
        !           140:        oris    $0,$1,hi16($2)
        !           141:        ori     $0,$1,lo16($2)
        !           142: .elseif        ($2 & 0xffff0000) == 0
        !           143:        ori     $0,$1,$2
        !           144: .elseif        ($2 & 0xffff) == 0
        !           145:        oris    $0,$1,hi16($2)
        !           146: .else
        !           147:        oris    $0,$1,hi16($2)
        !           148:        ori     $0,$1,lo16($2)
        !           149: .endif
        !           150: .endmacro
        !           151:  
        !           152: /*
        !           153:  * xori32      rD,rS1,IMMED
        !           154:  *
        !           155:  * Perform "xor" with (possibly) 32-bit immediate
        !           156:  */
        !           157: .macro xori32                          // xori32       rD,rS1,IMMED
        !           158: .if    $n != 3
        !           159:        .abort  "invalid operands of xori"
        !           160: .endif
        !           161: .abs   __is_abs,$2
        !           162: .if    !__is_abs
        !           163:        xoris   $0,$1,hi16($2)
        !           164:        xori    $0,$1,lo16($2)
        !           165: .elseif        ($2 & 0xffff0000) == 0
        !           166:        xori    $0,$1,$2
        !           167: .elseif        ($2 & 0xffff) == 0
        !           168:        xoris   $0,$1,hi16($2)
        !           169: .else
        !           170:        xoris   $0,$1,hi16($2)
        !           171:        xori    $0,$1,lo16($2)
        !           172: .endif
        !           173: .endmacro
        !           174: 
        !           175: 
        !           176: /*
        !           177:  * MEMREF_INST -- macros to memory referencing instructions
        !           178:  * "capable" of dealing with 32 bit offsets.
        !           179:  *
        !           180:  * NOTE: Because the assembler doesn't have any mechanism for easily
        !           181:  * parsing the d(rS) syntax of register-displacement form instructions,
        !           182:  * these instructions do NOT mirror the normal memory reference
        !           183:  * instructions.  The following "transformation" is used:
        !           184:  *     lbz     rD,d(rS)
        !           185:  * becomes:
        !           186:  *     lbz32   rD,rS,d
        !           187:  * I.e.: "32" is appended to the instruction name and the base register
        !           188:  * and displacement become the 2'nd and 3'rd comma-separated operands.
        !           189:  *
        !           190:  * The forms:
        !           191:  *     lbz32   rD,d
        !           192:  * and:
        !           193:  *     lbz32   rD,rS
        !           194:  * are also recognized and the missing operand is assumed 0.
        !           195:  *
        !           196:  * ALSO NOTE: r0 or zt should never be used as rS in these instructions.
        !           197:  * Use "0" as rS in this case.
        !           198:  */
        !           199: #define        MEMREF_INST(op)                                         \
        !           200: .macro op ## 32                                                @\
        !           201: .set   __used_at,0                                             @\
        !           202: .if    $n == 3                                                 @\
        !           203:  .greg __is_greg,$1                                            @\
        !           204:  .abs  __is_abs,$2                                             @\
        !           205:  .if   __is_abs                                                @\
        !           206:   .if  ($2 & 0xffff8000) == 0                                  @\
        !           207:        op      $0,$2($1)                                       @\
        !           208:   .elseif ($2 & 0xffff8000) == 0xffff8000                      @\
        !           209:        op      $0,$2($1)                                       @\
        !           210:   .else                                                                @\
        !           211:    .if !__is_greg                                              @\
        !           212:        .set    __used_at,1                                     @\
        !           213:        lis     at,ha16($2)                                     @\
        !           214:        op      $0,lo16($2)(at)                                 @\
        !           215:    .else                                                       @\
        !           216:        .set    __used_at,1                                     @\
        !           217:        lis     at,ha16($2)                                     @\
        !           218:        add     at,at,$1                                        @\
        !           219:        op      $0,lo16($2)(at)                                 @\
        !           220:    .endif                                                      @\
        !           221:   .endif                                                       @\
        !           222:  .else                                                         @\
        !           223:   .if  !__is_greg                                              @\
        !           224:        .set    __used_at,1                                     @\
        !           225:        lis     at,ha16($2)                                     @\
        !           226:        op      $0,lo16($2)(at)                                 @\
        !           227:   .else                                                                @\
        !           228:        .set    __used_at,1                                     @\
        !           229:        lis     at,ha16($2)                                     @\
        !           230:        add     at,at,$1                                        @\
        !           231:        op      $0,lo16($2)(at)                                 @\
        !           232:   .endif                                                       @\
        !           233:  .endif                                                                @\
        !           234: .elseif        $n == 2                                                 @\
        !           235:  .greg __is_greg,$1                                            @\
        !           236:  .if   !__is_greg                                              @\
        !           237:   .abs __is_abs,$1                                             @\
        !           238:   .if  __is_abs                                                @\
        !           239:    .if ($1 & 0xffff8000) == 0                                  @\
        !           240:        op      $0,$1(0)                                        @\
        !           241:    .elseif ($1 & 0xffff8000) == 0xffff8000                     @\
        !           242:        op      $0,$1(0)                                        @\
        !           243:    .else                                                       @\
        !           244:        .set    __used_at,1                                     @\
        !           245:        lis     at,ha16($1)                                     @\
        !           246:        op      $0,lo16($1)(at)                                 @\
        !           247:    .endif                                                      @\
        !           248:   .else                                                                @\
        !           249:        .set    __used_at,1                                     @\
        !           250:        lis     at,ha16($1)                                     @\
        !           251:        op      $0,lo16($1)(at)                                 @\
        !           252:   .endif                                                       @\
        !           253:  .else                                                         @\
        !           254:        op      $0,0($1)                                        @\
        !           255:  .endif                                                                @\
        !           256: .else                                                          @\
        !           257:        .abort "Invalid operands of " #op "32"                  @\
        !           258: .endif                                                         @\
        !           259: .if    __no_at &  __used_at                                    @\
        !           260:        .abort  "Macro uses at while .no_at in effect"          @\
        !           261: .endif                                                         @\
        !           262: .endmacro
        !           263: 
        !           264: MEMREF_INST(lbz)
        !           265: MEMREF_INST(lhz)
        !           266: MEMREF_INST(lha)
        !           267: MEMREF_INST(lwz)
        !           268: MEMREF_INST(lwa)
        !           269: MEMREF_INST(ld)
        !           270: 
        !           271: MEMREF_INST(stb)
        !           272: MEMREF_INST(sth)
        !           273: MEMREF_INST(stw)
        !           274: MEMREF_INST(std)
        !           275: 
        !           276: MEMREF_INST(lmw)
        !           277: MEMREF_INST(lmd)
        !           278: MEMREF_INST(stmw)
        !           279: MEMREF_INST(stmd)
        !           280: 
        !           281: /*
        !           282:  * ARITH_INST -- define 32-bit immediate forms of arithmetic
        !           283:  * instructions
        !           284:  *
        !           285:  *     E.g.    addi32  rD,rS,IMMED
        !           286:  */
        !           287: #define        ARITH_INST(op, op3, sf)                                 \
        !           288: .macro op ## 32 ## sf                                          @\
        !           289: .if    $n != 3                                                 @\
        !           290:        .abort  "invalid operands to " #op "32"                 @\
        !           291: .endif                                                         @\
        !           292: .abs   __is_abs,$2                                             @\
        !           293: .if    __is_abs                                                @\
        !           294:  .if   ($2 & 0xffff8000) == 0                                  @\
        !           295:        op##sf  $0,$1,$2                                        @\
        !           296:  .elseif       ($2 & 0xffff8000) == 0xffff8000                 @\
        !           297:        op##sf  $0,$1,$2                                        @\
        !           298:  .elseif       __no_at                                         @\
        !           299:        .abort  "Macro uses at while .no_at in effect"          @\
        !           300:  .else                                                         @\
        !           301:        li32    at,$2                                           @\
        !           302:        op3##sf $0,$1,at                                        @\
        !           303:  .endif                                                                @\
        !           304: .elseif        __no_at                                                 @\
        !           305:        .abort  "Macro uses at while .no_at in effect"          @\
        !           306: .else                                                          @\
        !           307:        li32    at,$2                                           @\
        !           308:        op3##sf $0,$1,at                                        @\
        !           309: .endif                                                         @\
        !           310: .endmacro
        !           311: 
        !           312: ARITH_INST(addi, add, )
        !           313: ARITH_INST(subi, sub, )
        !           314: ARITH_INST(addic, addc, )
        !           315: ARITH_INST(subic, subc, )
        !           316: ARITH_INST(addic, addc, .)
        !           317: ARITH_INST(subic, subc, .)
        !           318: ARITH_INST(mulli, mull, )
        !           319: 
        !           320: /*
        !           321:  * CMPEX_INST -- define 32-bit immediate forms of extended compare
        !           322:  * instructions
        !           323:  *
        !           324:  *     E.g.    cmpwi32 cr3,rS,IMMED
        !           325:  *             cmpwi32 rS,IMMED
        !           326:  */
        !           327: #define        CMPEX_INST(op, op3)                                     \
        !           328: .macro op ## 32                                                @\
        !           329: .if    $n == 3                                                 @\
        !           330:  .abs  __is_abs,$2                                             @\
        !           331:  .if   __is_abs                                                @\
        !           332:   .if  ($2 & 0xffff8000) == 0                                  @\
        !           333:        op      $0,$1,$2                                        @\
        !           334:   .elseif      ($2 & 0xffff8000) == 0xffff8000                 @\
        !           335:        op      $0,$1,$2                                        @\
        !           336:   .elseif      __no_at                                         @\
        !           337:        .abort  "Macro uses at while .no_at in effect"          @\
        !           338:   .else                                                                @\
        !           339:        li32    at,$2                                           @\
        !           340:        op3     $0,$1,at                                        @\
        !           341:   .endif                                                       @\
        !           342:  .elseif       __no_at                                         @\
        !           343:        .abort  "Macro uses at while .no_at in effect"          @\
        !           344:  .else                                                         @\
        !           345:        li32    at,$2                                           @\
        !           346:        op3     $0,$1,at                                        @\
        !           347:  .endif                                                                @\
        !           348: .elseif        $n == 2                                                 @\
        !           349:  .abs  __is_abs,$1                                             @\
        !           350:  .if   __is_abs                                                @\
        !           351:   .if  ($1 & 0xffff8000) == 0                                  @\
        !           352:        op      $0,$1                                           @\
        !           353:   .elseif      ($1 & 0xffff8000) == 0xffff8000                 @\
        !           354:        op      $0,$1                                           @\
        !           355:   .elseif      __no_at                                         @\
        !           356:        .abort  "Macro uses at while .no_at in effect"          @\
        !           357:   .else                                                                @\
        !           358:        li32    at,$1                                           @\
        !           359:        op3     $0,at                                           @\
        !           360:   .endif                                                       @\
        !           361:  .elseif       __no_at                                         @\
        !           362:        .abort  "Macro uses at while .no_at in effect"          @\
        !           363:  .else                                                         @\
        !           364:        li32    at,$1                                           @\
        !           365:        op3     $0,at                                           @\
        !           366:  .endif                                                                @\
        !           367: .else                                                          @\
        !           368:        .abort  "invalid operands to " #op "32"                 @\
        !           369: .endif                                                         @\
        !           370: .endmacro
        !           371: 
        !           372: CMPEX_INST(cmpdi, cmpd)
        !           373: CMPEX_INST(cmpwi, cmpw)
        !           374: CMPEX_INST(cmpldi, cmpld)
        !           375: CMPEX_INST(cmplwi, cmplw)
        !           376: 
        !           377: /*
        !           378:  * CMP_INST -- define 32-bit immediate forms of standard compare
        !           379:  * instructions
        !           380:  *
        !           381:  *     E.g.    cmpi32  cr3,0,rS,IMMED
        !           382:  */
        !           383: #define        CMP_INST(op, op3)                                       \
        !           384: .macro op ## 32                                                @\
        !           385: .if    $n == 4                                                 @\
        !           386:  .abs  __is_abs,$3                                             @\
        !           387:  .if   __is_abs                                                @\
        !           388:   .if  ($3 & 0xffff8000) == 0                                  @\
        !           389:        op      $0,$1,$2,$3                                     @\
        !           390:   .elseif      ($3 & 0xffff8000) == 0xffff8000                 @\
        !           391:        op      $0,$1,$2,$3                                     @\
        !           392:   .elseif      __no_at                                         @\
        !           393:        .abort  "Macro uses at while .no_at in effect"          @\
        !           394:   .else                                                                @\
        !           395:        li32    at,$3                                           @\
        !           396:        op3     $0,$1,$2,at                                     @\
        !           397:   .endif                                                       @\
        !           398:  .elseif       __no_at                                         @\
        !           399:        .abort  "Macro uses at while .no_at in effect"          @\
        !           400:  .else                                                         @\
        !           401:        li32    at,$3                                           @\
        !           402:        op3     $0,$1,$2,at                                     @\
        !           403:  .endif                                                                @\
        !           404: .else                                                          @\
        !           405:        .abort  "invalid operands to " #op "32"                 @\
        !           406: .endif                                                         @\
        !           407: .endmacro
        !           408: 
        !           409: CMP_INST(cmpi, cmp)
        !           410: CMP_INST(cmpli, cmpl)
        !           411: 
        !           412: #endif /* __ASSEMBLER__ */
        !           413: 
        !           414: #endif /* _ARCH_PPC_PSEUDO_INST_H_ */

unix.superglobalmegacorp.com

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