Annotation of objc/objc-msg-ppc.s, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
                      3:  *
                      4:  * @APPLE_LICENSE_HEADER_START@
                      5:  * 
                      6:  * "Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
                      7:  * Reserved.  This file contains Original Code and/or Modifications of
                      8:  * Original Code as defined in and that are subject to the Apple Public
                      9:  * Source License Version 1.0 (the 'License').  You may not use this file
                     10:  * except in compliance with the License.  Please obtain a copy of the
                     11:  * License at http://www.apple.com/publicsource and read it before using
                     12:  * this file.
                     13:  * 
                     14:  * The Original Code and all software distributed under the License are
                     15:  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
                     16:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
                     17:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
                     18:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
                     19:  * License for the specific language governing rights and limitations
                     20:  * under the License."
                     21:  * 
                     22:  * @APPLE_LICENSE_HEADER_END@
                     23:  */
                     24: /*
                     25:  *     Copyright 1988-1996 NeXT Software, Inc.
                     26:  *
                     27:  *     objc-msg-ppc.s
                     28:  *
                     29:  *  1-May-97  Umesh Vaishampayan  ([email protected])
                     30:  *             Incorporated locking code fixes from David Harrison ([email protected])
                     31:  *
                     32:  *     2-Apr-97   Umesh Vaishampayan  ([email protected])
                     33:  *             Incarporated changes for messanger with struct return
                     34:  *             Cleaned up the labels to use local labels
                     35:  *             Fixed bug in the msgSendSuper that did not do the locking.
                     36:  *
                     37:  *     31-Dec-96  Umesh Vaishampayan  ([email protected])
                     38:  *             Created from m98k.
                     39:  *
                     40:  */
                     41: 
                     42: #define STACK_ALIGN_MASK   0xfff0
                     43: 
                     44: #ifndef KERNEL
                     45: ; _objc_entryPoints and _objc_exitPoints are used by moninitobjc() to setup
                     46: ; objective-C messages for profiling.  The are made private_externs when in
                     47: ; a shared library.
                     48:        .reference _moninitobjc
                     49:        .const
                     50:        .align 2
                     51: .globl _objc_entryPoints
                     52: _objc_entryPoints:
                     53:        .long _objc_msgSend
                     54:        .long _objc_msgSendSuper
                     55:        .long _objc_msgSendv
                     56:        .long _objc_msgSend_stret
                     57:        .long _objc_msgSendSuper_stret
                     58:        .long 0
                     59: 
                     60: .globl _objc_exitPoints
                     61: _objc_exitPoints:
                     62:        .long Lexit1
                     63:        .long Lexit2
                     64:        .long Lexit3
                     65:        .long Lexit4
                     66:        .long Lexit5
                     67:        .long Lexit6
                     68:        .long Lexit7
                     69:        .long Lexit8
                     70:        .long LRexit1
                     71:        .long LRexit2
                     72:        .long LRexit3
                     73:        .long LRexit4
                     74:        .long LRexit5
                     75:        .long LRexit6
                     76:        .long LRexit7
                     77:        .long LRexit8
                     78:        .long 0
                     79: #endif /* ! KERNEL */
                     80: 
                     81:        isa = 0
                     82:        cache = 32
                     83:        mask = 0
                     84:        buckets = 8
                     85:        method_name = 0
                     86:        method_imp = 8
                     87: 
                     88:        .text
                     89:        .align 2
                     90:        .globl   _objc_msgSend
                     91: _objc_msgSend:
                     92:        stw      r7, 40(r1)             ; save r7 through r10 for use as temps
                     93:        stw      r8, 44(r1)
                     94:        stw      r9, 48(r1)
                     95:        stw      r10,52(r1)
                     96: 
                     97:        addis    r7,0,hi16(__objc_multithread_mask)
                     98:        ori      r7,r7,lo16(__objc_multithread_mask)
                     99:        lwz      r7,0(r7)
                    100:        and.     r7,r3,r7
                    101:        bne      cr0,L0                 ; branch to the "normal" case,
                    102:                                        ; no locking, id != nil
                    103: 
                    104:        cmplwi   cr0,r3,0               ; if id == nil
                    105:        bne      cr0,LL0                ; LL0 is the "locking" case
                    106:        b        L3                     ; L3 is the return nil case
                    107: L0:
                    108:        lwz      r10,isa(r3)            ; class = self->isa;
                    109:        lwz      r10,cache(r10)         ; cache = class->cache
                    110:        lwz      r11,mask(r10)          ; mask = cache->mask
                    111:        addi     r9,r10,buckets         ; buckets = cache->buckets
                    112:        and      r10,r4,r11             ; index = selector & mask;
                    113: L1:            
                    114:        slwi     r0,r10,2               ;
                    115:        lwzx     r7,r9,r0               ; method = cache->buckets[index];
                    116:        cmplwi   cr0,r7,0               ; if (method == NULL)
                    117:        beq      cr0,L2                 ;
                    118:        addi     r10,r10,1              ; index++;
                    119:        lwz      r8,method_name(r7)     ; name = method->method_name;
                    120:        and      r10,r10,r11            ; index &= mask
                    121:        lwz      r7,method_imp(r7)      ; imp = method->method_imp;
                    122:        cmpw     r4,r8                  ; if (name != selector)
                    123:        bne      cr0,L1                 ; goto loop;
                    124:        mtspr    ctr,r7                 ;
                    125:        lwz      r7, 40(r1)             ; restore r7 through r10
                    126:        lwz      r8, 44(r1)
                    127:        lwz      r9, 48(r1)             ;
                    128:        lwz      r10,52(r1)             ;
                    129: Lexit1:
                    130:        bctr                            ; goto *imp;
                    131:        .space 112                      ; /* area for moninitobjc to write */
                    132: L2:                                    ;
                    133:        lwz      r10,isa(r3)            ; class = self->isa;
                    134: 
                    135:        stw      r3, 24(r1)             ; save the other register parameters
                    136:        stw      r4, 28(r1)             ;
                    137:        stw      r5, 32(r1)             ;
                    138:        stw      r6, 36(r1)             ;
                    139: 
                    140:        mflr     r0                     ; save LR
                    141:        stw      r0,8(r1)               ;
                    142:        stwu     r1,-64(r1)             ; grow the stack
                    143: 
                    144:        ori      r3,r10,0               ; first arg is the isa pointer
                    145:        bl       __class_lookupMethodAndLoadCache
                    146:        mtspr    ctr,r3
                    147:        lwz      r1,0(r1)               ; restore the stack pointer
                    148: 
                    149:        lwz      r0,8(r1)               ;
                    150:        mtlr     r0                     ; restore return pc
                    151:        lwz      r3, 24(r1)             ;
                    152:        lwz      r4, 28(r1)             ;
                    153:        lwz      r5, 32(r1)             ;
                    154:        lwz      r6, 36(r1)             ;
                    155:        lwz      r7, 40(r1)             ;
                    156:        lwz      r8, 44(r1)             ;
                    157:        lwz      r9, 48(r1)             ;
                    158:        lwz      r10,52(r1)             ;
                    159: Lexit2:
                    160:        bctr                            ; goto *imp;
                    161:        .space 112                      ; /* area for moninitobjc to write */
                    162: L3:                                    ;
                    163:        addi     r3,0,0                 ;     (return value is nil)
                    164:        blr                             ;     (return)
                    165: 
                    166: LL0:   
                    167:        stw      r6, 36(r1)             ; save r6
                    168:        addis    r6,0,hi16(_messageLock)
                    169:        ori      r6,r6,lo16(_messageLock)
                    170: 
                    171: Lgetit:
                    172:        lwarx    r0,0,r6                ; try to get the lock
                    173:        cmpwi    cr0,r0,0
                    174:        bne-     Lgetit
                    175:        addi     r0,0,1
                    176:        sync                                    ; Bugfix for 3.2 and older cpus
                    177:        stwcx.   r0,0,r6
                    178:        bne-     Lgetit
                    179:        isync
                    180: 
                    181:        lwz      r10,isa(r3)            ; class = self->isa;
                    182:        lwz      r10,cache(r10)         ; cache = class->cache
                    183:        lwz      r11,mask(r10)          ; mask = cache->mask
                    184:        addi     r9,r10,buckets         ; buckets = cache->buckets
                    185:        and      r10,r4,r11             ; index = selector & mask;
                    186: LL1:           
                    187:        slwi     r0,r10,2               ;
                    188:        lwzx     r7,r9,r0               ; method = cache->buckets[index];
                    189:        cmplwi   cr0,r7,0               ; if (method == NULL)
                    190:        beq      cr0,LL2                ;
                    191:        addi     r10,r10,1              ; index++;
                    192:        lwz      r8,method_name(r7)     ; name = method->method_name;
                    193:        and      r10,r10,r11            ; index &= mask
                    194:        lwz      r7,method_imp(r7)      ; imp = method->method_imp;
                    195:        cmpw     r4,r8                  ; if (name != selector)
                    196:        bne      cr0,LL1                ; goto loop;
                    197:        mtspr    ctr,r7                 ;
                    198:        lwz      r7, 40(r1)             ; restore r7 through r10
                    199:        lwz      r8, 44(r1)
                    200:        lwz      r9, 48(r1)             ;
                    201:        lwz      r10,52(r1)             ;
                    202: 
                    203:        sync                            ; release the lock
                    204:        addi     r0,0,0
                    205:        stw      r0,0(r6)
                    206:        lwz      r6,36(r1);             ; restore r6
                    207: 
                    208: Lexit3:
                    209:        bctr                            ; goto *imp;
                    210:        .space 112                      ; /* area for moninitobjc to write */
                    211: LL2:                                   ;
                    212:        lwz      r10,isa(r3)            ; class = self->isa;
                    213: 
                    214:        stw      r3, 24(r1)             ; save the other register parameters
                    215:        stw      r4, 28(r1)             ;
                    216:        stw      r5, 32(r1)             ;
                    217: 
                    218:        mflr     r0                     ; move LR to r0
                    219:        stw      r0,8(r1)               ; save LR
                    220:        stwu     r1,-64(r1)             ; grow the stack
                    221: 
                    222:        ori      r3,r10,0               ; first arg is the isa pointer
                    223:        bl       __class_lookupMethodAndLoadCache
                    224:        mtspr    ctr,r3
                    225:        lwz      r1,0(r1)               ; restore the stack pointer
                    226: 
                    227:        lwz      r0,8(r1)               ;
                    228:        mtlr     r0                     ; restore return pc
                    229:        lwz      r3, 24(r1)             ;
                    230:        lwz      r4, 28(r1)             ;
                    231:        lwz      r5, 32(r1)             ;
                    232: 
                    233:        sync                            ; release the lock
                    234:        addis    r6,0,hi16(_messageLock)
                    235:        ori      r6,r6,lo16(_messageLock)
                    236:        addi     r0,0,0
                    237:        stw      r0,0(r6)
                    238: 
                    239:        lwz      r6, 36(r1)             ;
                    240:        lwz      r7, 40(r1)             ;
                    241:        lwz      r8, 44(r1)             ;
                    242:        lwz      r9, 48(r1)             ;
                    243:        lwz      r10,52(r1)             ;
                    244: Lexit4:
                    245:        bctr                            ; goto *imp;
                    246:        .space 112                      ; /* area for moninitobjc to write */
                    247: 
                    248: 
                    249:        receiver = 0
                    250:        class = 4
                    251: 
                    252:        .text
                    253:        .align 2
                    254:        .globl   _objc_msgSendSuper
                    255: _objc_msgSendSuper:
                    256:        stw      r7, 40(r1)             ; save r7 through r10 for use as temps
                    257:        stw      r8, 44(r1)
                    258:        stw      r9, 48(r1)
                    259:        stw      r10,52(r1)
                    260: 
                    261:        addis    r7,0,hi16(__objc_multithread_mask)
                    262:        ori      r7,r7,lo16(__objc_multithread_mask)
                    263:        lwz      r7,0(r7)
                    264:        cmplwi   cr0,r7,0
                    265:        beq      cr0,LSL0               ; branch to the "locking" case,
                    266: ; normal case, id != nil
                    267:        lwz      r10,class(r3)          ; class = super->class;
                    268:        lwz      r10,cache(r10)         ; cache = class->cache
                    269:        lwz      r11,mask(r10)          ; mask = cache->mask
                    270:        addi     r9,r10,buckets         ; buckets = cache->buckets
                    271:        and      r10,r4,r11             ; index = selector & mask;
                    272: LS1:                                   ;
                    273:        slwi     r0,r10,2
                    274:        lwzx     r7,r9,r0               ; method = cache->buckets[index];
                    275:        cmplwi   cr0,r7,0               ; if (method == NULL)
                    276:        beq      cr0,LS2                ;
                    277:        addi     r10,r10,1              ; index++;
                    278:        lwz      r8,method_name(r7)     ; name = method->method_name;
                    279:        and      r10,r10,r11            ; index &= mask
                    280:        lwz      r7,method_imp(r7)      ; imp = method->method_imp;
                    281:        cmpw     r4,r8                  ; if (name != selector)
                    282:        bne      cr0,LS1                ; goto loop;
                    283:        mtspr    ctr,r7                 ;
                    284:        lwz      r7, 40(r1)             ; restore r7 through r10
                    285:        lwz      r8, 44(r1)
                    286:        lwz      r9, 48(r1)             ;
                    287:        lwz      r10,52(r1)             ;
                    288:        lwz      r3,receiver(r3)        ; restore the receiver
                    289: Lexit5:        bctr                            ; goto *imp;
                    290:        .space 112                      ; /* area for moninitobjc to write */
                    291: LS2:                                   ;
                    292:        lwz      r10,class(r3)          ; class = self->class;
                    293:        lwz      r3,receiver(r3)        ; restore the receiver
                    294: 
                    295:        stw      r3, 24(r1)             ; save the other register parameters
                    296:        stw      r4, 28(r1)             ;
                    297:        stw      r5, 32(r1)             ;
                    298:        stw      r6, 36(r1)             ;
                    299: 
                    300:        mflr     r0                     ; save LR
                    301:        stw      r0,8(r1)               ;
                    302:        stwu     r1,-64(r1)             ; grow the stack
                    303: 
                    304:        ori      r3,r10,0               ; first arg is the isa pointer
                    305:        bl       __class_lookupMethodAndLoadCache
                    306:        mtspr    ctr,r3
                    307:        lwz      r1,0(r1)               ; restore the stack pointer
                    308: 
                    309:        lwz      r0,8(r1)               ;
                    310:        mtlr     r0                     ; restore return pc
                    311:        lwz      r3, 24(r1)             ;
                    312:        lwz      r4, 28(r1)             ;
                    313:        lwz      r5, 32(r1)             ;
                    314:        lwz      r6, 36(r1)             ;
                    315:        lwz      r7, 40(r1)             ;
                    316:        lwz      r8, 44(r1)             ;
                    317:        lwz      r9, 48(r1)             ;
                    318:        lwz      r10,52(r1)             ;
                    319: Lexit6:
                    320:        bctr                            ; goto *imp;
                    321:        .space 112                      ; /* area for moninitobjc to write */
                    322: 
                    323: LSL0:                                  ; Locking case for _objc_msgSendSuper
                    324:        stw      r6,36(r1)              ; save r6
                    325:        addis    r6,0,hi16(_messageLock)
                    326:        ori      r6,r6,lo16(_messageLock)
                    327: 
                    328: LSgetit:
                    329:        lwarx    r0,0,r6                ; try to get the lock
                    330:        cmpwi    cr0,r0,0
                    331:        bne-     LSgetit
                    332:        addi     r0,0,1
                    333:        sync                                    ; Bugfix for 3.2 and older cpus
                    334:        stwcx.   r0,0,r6
                    335:        bne-     LSgetit
                    336:        isync
                    337: 
                    338:        lwz      r10,class(r3)          ; class = super->class;
                    339:        lwz      r10,cache(r10)         ; cache = class->cache
                    340:        lwz      r11,mask(r10)          ; mask = cache->mask
                    341:        addi     r9,r10,buckets         ; buckets = cache->buckets
                    342:        and      r10,r4,r11             ; index = selector & mask;
                    343: LSL1:                                  ;
                    344:        slwi     r0,r10,2
                    345:        lwzx     r7,r9,r0               ; method = cache->buckets[index];
                    346:        cmplwi   cr0,r7,0               ; if (method == NULL)
                    347:        beq      cr0,LSL2               ;
                    348:        addi     r10,r10,1              ; index++;
                    349:        lwz      r8,method_name(r7)     ; name = method->method_name;
                    350:        and      r10,r10,r11            ; index &= mask
                    351:        lwz      r7,method_imp(r7)      ; imp = method->method_imp;
                    352:        cmpw     r4,r8                  ; if (name != selector)
                    353:        bne      cr0,LSL1               ; goto loop;
                    354:        mtspr    ctr,r7                 ;
                    355:        lwz      r7, 40(r1)             ; restore r7 through r10
                    356:        lwz      r8, 44(r1)             ;
                    357:        lwz      r9, 48(r1)             ;
                    358:        lwz      r10,52(r1)             ;
                    359: 
                    360:        sync                            ; release the lock
                    361:        addi     r0,0,0
                    362:        stw      r0,0(r6)
                    363:        lwz      r6,36(r1);             ; restore r6
                    364:        lwz      r3,receiver(r3)        ; r3 = self
                    365: 
                    366: Lexit7:
                    367:        bctr                            ; goto *imp;
                    368:        .space 112                      ; /* area for moninitobjc to write */
                    369: LSL2:                                  ;
                    370:        lwz      r10,class(r3)          ; class = self->class;
                    371:        lwz      r3,receiver(r3)        ; r3 = self for implementation
                    372: 
                    373:        stw      r3, 24(r1)             ; save the other register parameters
                    374:        stw      r4, 28(r1)             ;
                    375:        stw      r5, 32(r1)             ;
                    376: 
                    377:        mflr     r0                     ; save LR
                    378:        stw      r0,8(r1)               ;
                    379:        stwu     r1,-64(r1)             ; grow the stack
                    380: 
                    381:        ori      r3,r10,0               ; first arg is the isa pointer
                    382:        bl       __class_lookupMethodAndLoadCache
                    383:        mtspr    ctr,r3
                    384:        lwz      r1,0(r1)               ; restore the stack pointer
                    385: 
                    386:        lwz      r0,8(r1)               ;
                    387:        mtlr     r0                     ; restore return pc
                    388:        lwz      r3, 24(r1)             ;
                    389:        lwz      r4, 28(r1)             ;
                    390:        lwz      r5, 32(r1)             ;
                    391: 
                    392:        sync                            ; release the lock
                    393:        addis    r6,0,hi16(_messageLock)
                    394:        ori      r6,r6,lo16(_messageLock)
                    395:        addi     r0,0,0
                    396:        stw      r0,0(r6)
                    397: 
                    398:        lwz      r6, 36(r1)             ;
                    399:        lwz      r7, 40(r1)             ;
                    400:        lwz      r8, 44(r1)             ;
                    401:        lwz      r9, 48(r1)             ;
                    402:        lwz      r10,52(r1)             ;
                    403: Lexit8:
                    404:        bctr                            ; goto *imp;
                    405:        .space 112                      ; /* area for moninitobjc to write */
                    406: 
                    407: 
                    408: ;--------------------------------------------------------------------
                    409: ;
                    410: ; _objc_msgSend_stret is the [Apple/Rhapsody] PowerPC struct-return
                    411: ;  version.  The ABI calls for r3 to be used as the address of
                    412: ;  the structure being returned; and the other args are in the
                    413: ;  next couple of registers.
                    414: ;
                    415: ; This is a pasted copy of _objc_msgSend above, mutatis mutandis.
                    416: ;
                    417: ;
                    418: ; On entry:    r3 is the address in which the returned struct is put,
                    419: ;              r4 is the message receiver,
                    420: ;              r5 is the selector
                    421: ;
                    422:        .text
                    423:        .align 2
                    424:        .globl   _objc_msgSend_stret
                    425: _objc_msgSend_stret:
                    426:        stw      r7, 40(r1)             ; save r7 through r10 for use as temps
                    427:        stw      r8, 44(r1)
                    428:        stw      r9, 48(r1)
                    429:        stw      r10,52(r1)
                    430: 
                    431:        addis    r7,0,hi16(__objc_multithread_mask)
                    432:        ori      r7,r7,lo16(__objc_multithread_mask)
                    433:        lwz      r7,0(r7)
                    434:        and.     r7,r4,r7
                    435:        bne      cr0,LR0                ; branch to the "normal" case,
                    436:                                        ; no locking, id != nil
                    437: 
                    438:        cmplwi   cr0,r4,0               ; if id == nil
                    439:        bne      cr0,LRL0               ; LRL0 is the "locking" case
                    440:        b        LR3                    ; LR3 is the return nil case
                    441: LR0:
                    442:        lwz      r10,isa(r4)            ; class = self->isa;
                    443:        lwz      r10,cache(r10)         ; cache = class->cache
                    444:        lwz      r11,mask(r10)          ; mask = cache->mask
                    445:        addi     r9,r10,buckets         ; buckets = cache->buckets
                    446:        and      r10,r5,r11             ; index = selector & mask;
                    447: LR1:           
                    448:        slwi     r0,r10,2               ;
                    449:        lwzx     r7,r9,r0               ; method = cache->buckets[index];
                    450:        cmplwi   cr0,r7,0               ; if (method == NULL)
                    451:        beq      cr0,LR2                ;
                    452:        addi     r10,r10,1              ; index++;
                    453:        lwz      r8,method_name(r7)     ; name = method->method_name;
                    454:        and      r10,r10,r11            ; index &= mask
                    455:        lwz      r7,method_imp(r7)      ; imp = method->method_imp;
                    456:        cmpw     r5,r8                  ; if (name != selector)
                    457:        bne      cr0,LR1                ; goto loop;
                    458:        mtspr    ctr,r7                 ;
                    459:        lwz      r7, 40(r1)             ; restore r7 through r10
                    460:        lwz      r8, 44(r1)
                    461:        lwz      r9, 48(r1)             ;
                    462:        lwz      r10,52(r1)             ;
                    463: LRexit1:
                    464:        bctr                            ; goto *imp;
                    465:        .space 112                      ; /* area for moninitobjc to write */
                    466: LR2:                                   ;
                    467:        lwz      r10,isa(r4)            ; class = self->isa;
                    468: 
                    469:        stw      r3, 24(r1)             ; save the other register parameters
                    470:        stw      r4, 28(r1)             ;
                    471:        stw      r5, 32(r1)             ;
                    472:        stw      r6, 36(r1)             ;
                    473: 
                    474:        mflr     r0                     ; save LR
                    475:        stw      r0,8(r1)               ;
                    476:        stwu     r1,-64(r1)             ; grow the stack
                    477: 
                    478:        ori      r3,r10,0               ; first arg is the isa pointer
                    479:        ori      r4,r5,0                ; second arg is the selector 
                    480:        bl       __class_lookupMethodAndLoadCache
                    481:        mtspr    ctr,r3
                    482:        lwz      r1,0(r1)               ; restore the stack pointer
                    483: 
                    484:        lwz      r0,8(r1)               ;
                    485:        mtlr     r0                     ; restore return pc
                    486:        lwz      r3, 24(r1)             ;
                    487:        lwz      r4, 28(r1)             ;
                    488:        lwz      r5, 32(r1)             ;
                    489:        lwz      r6, 36(r1)             ;
                    490:        lwz      r7, 40(r1)             ;
                    491:        lwz      r8, 44(r1)             ;
                    492:        lwz      r9, 48(r1)             ;
                    493:        lwz      r10,52(r1)             ;
                    494: LRexit2:
                    495:        bctr                            ; goto *imp;
                    496:        .space 112                      ; /* area for moninitobjc to write */
                    497: LR3:                                   ;
                    498:        addi     r3,0,0                 ;     (return value is nil)
                    499:        blr                             ;     (return)
                    500: 
                    501: LRL0:
                    502:        stw      r6, 36(r1)             ; save r6
                    503:        addis    r6,0,hi16(_messageLock)
                    504:        ori      r6,r6,lo16(_messageLock)
                    505: 
                    506: LRgetit:
                    507:        lwarx    r0,0,r6                ; try to get the lock
                    508:        cmpwi    cr0,r0,0
                    509:        bne-     LRgetit
                    510:        addi     r0,0,1
                    511:        sync                                    ; Bugfix for 3.2 and older cpus
                    512:        stwcx.   r0,0,r6
                    513:        bne-     LRgetit
                    514:        isync
                    515: 
                    516:        lwz      r10,isa(r4)            ; class = self->isa;
                    517:        lwz      r10,cache(r10)         ; cache = class->cache
                    518:        lwz      r11,mask(r10)          ; mask = cache->mask
                    519:        addi     r9,r10,buckets         ; buckets = cache->buckets
                    520:        and      r10,r5,r11             ; index = selector & mask;
                    521: LRL1:          
                    522:        slwi     r0,r10,2               ;
                    523:        lwzx     r7,r9,r0               ; method = cache->buckets[index];
                    524:        cmplwi   cr0,r7,0               ; if (method == NULL)
                    525:        beq      cr0,LRL2               ;
                    526:        addi     r10,r10,1              ; index++;
                    527:        lwz      r8,method_name(r7)     ; name = method->method_name;
                    528:        and      r10,r10,r11            ; index &= mask
                    529:        lwz      r7,method_imp(r7)      ; imp = method->method_imp;
                    530:        cmpw     r5,r8                  ; if (name != selector)
                    531:        bne      cr0,LRL1               ; goto loop;
                    532:        mtspr    ctr,r7                 ;
                    533:        lwz      r7, 40(r1)             ; restore r7 through r10
                    534:        lwz      r8, 44(r1)
                    535:        lwz      r9, 48(r1)             ;
                    536:        lwz      r10,52(r1)             ;
                    537: 
                    538:        sync                            ; release the lock
                    539:        addi     r0,0,0
                    540:        stw      r0,0(r6)
                    541:        lwz      r6,36(r1);             ; restore r6
                    542: 
                    543: LRexit3:
                    544:        bctr                            ; goto *imp;
                    545:        .space 112                      ; /* area for moninitobjc to write */
                    546: LRL2:                                  ;
                    547:        lwz      r10,isa(r4)            ; class = self->isa;
                    548: 
                    549:        stw      r3, 24(r1)             ; save the other register parameters
                    550:        stw      r4, 28(r1)             ;
                    551:        stw      r5, 32(r1)             ;
                    552: 
                    553:        mflr     r0                     ; save LR
                    554:        stw      r0,8(r1)               ;
                    555:        stwu     r1,-64(r1)             ; grow the stack
                    556: 
                    557:        ori      r3,r10,0               ; first arg is the isa pointer
                    558:        ori      r4,r5,0                ; second arg is the selector 
                    559:        bl       __class_lookupMethodAndLoadCache
                    560:        mtspr    ctr,r3
                    561:        lwz      r1,0(r1)               ; restore the stack pointer
                    562: 
                    563:        lwz      r0,8(r1)               ;
                    564:        mtlr     r0                     ; restore return pc
                    565:        lwz      r3, 24(r1)             ;
                    566:        lwz      r4, 28(r1)             ;
                    567:        lwz      r5, 32(r1)             ;
                    568: 
                    569:        sync                            ; release the lock
                    570:        addis    r6,0,hi16(_messageLock)
                    571:        ori      r6,r6,lo16(_messageLock)
                    572:        addi     r0,0,0
                    573:        stw      r0,0(r6)
                    574: 
                    575:        lwz      r6, 36(r1)             ;
                    576:        lwz      r7, 40(r1)             ;
                    577:        lwz      r8, 44(r1)             ;
                    578:        lwz      r9, 48(r1)             ;
                    579:        lwz      r10,52(r1)             ;
                    580: LRexit4:
                    581:        bctr                            ; goto *imp;
                    582:        .space 112                      ; /* area for moninitobjc to write */
                    583: 
                    584: 
                    585:        .text
                    586:        .align 2
                    587:        .globl   _objc_msgSendSuper_stret
                    588: _objc_msgSendSuper_stret:
                    589:        stw      r7, 40(r1)             ; save r7 through r10 for use as temps
                    590:        stw      r8, 44(r1)
                    591:        stw      r9, 48(r1)
                    592:        stw      r10,52(r1)
                    593: 
                    594:        addis    r7,0,hi16(__objc_multithread_mask)
                    595:        ori      r7,r7,lo16(__objc_multithread_mask)
                    596:        lwz      r7,0(r7)
                    597:        cmplwi   cr0,r7,0
                    598:        beq      cr0,LRSL0              ; branch to the "locking" case
                    599: ; "normal" case, no locking, id != nil
                    600:        lwz      r10,class(r4)          ; class = super->class;
                    601:        lwz      r10,cache(r10)         ; cache = class->cache
                    602:        lwz      r11,mask(r10)          ; mask = cache->mask
                    603:        addi     r9,r10,buckets         ; buckets = cache->buckets
                    604:        and      r10,r5,r11             ; index = selector & mask;
                    605: LRS1:                                  ;
                    606:        slwi     r0,r10,2
                    607:        lwzx     r7,r9,r0               ; method = cache->buckets[index];
                    608:        cmplwi   cr0,r7,0               ; if (method == NULL)
                    609:        beq      cr0,LRS2               ;
                    610:        addi     r10,r10,1              ; index++;
                    611:        lwz      r8,method_name(r7)     ; name = method->method_name;
                    612:        and      r10,r10,r11            ; index &= mask
                    613:        lwz      r7,method_imp(r7)      ; imp = method->method_imp;
                    614:        cmpw     r5,r8                  ; if (name != selector)
                    615:        bne      cr0,LRS1               ; goto loop;
                    616:        mtspr    ctr,r7                 ;
                    617:        lwz      r7, 40(r1)             ; restore r7 through r10
                    618:        lwz      r8, 44(r1)
                    619:        lwz      r9, 48(r1)             ;
                    620:        lwz      r10,52(r1)             ;
                    621:        lwz      r4,receiver(r4)        ; restore the receiver
                    622: LRexit5:
                    623:        bctr                            ; goto *imp;
                    624:        .space 112                      ; /* area for moninitobjc to write */
                    625: LRS2:                                  ;
                    626:        lwz      r10,class(r4)          ; class = self->class;
                    627:        lwz      r4,receiver(r4)        ; restore the receiver
                    628: 
                    629:        stw      r3, 24(r1)             ; save the other register parameters
                    630:        stw      r4, 28(r1)             ;
                    631:        stw      r5, 32(r1)             ;
                    632:        stw      r6, 36(r1)             ;
                    633: 
                    634:        mflr     r0                     ; save LR
                    635:        stw      r0,8(r1)               ;
                    636:        stwu     r1,-64(r1)             ; grow the stack
                    637: 
                    638:        ori      r3,r10,0               ; first arg is the isa pointer
                    639:        ori      r4,r5,0                ; second arg is the selector 
                    640:        bl       __class_lookupMethodAndLoadCache
                    641:        mtspr    ctr,r3
                    642:        lwz      r1,0(r1)               ; restore the stack pointer
                    643: 
                    644:        lwz      r0,8(r1)               ;
                    645:        mtlr     r0                     ; restore return pc
                    646:        lwz      r3, 24(r1)             ;
                    647:        lwz      r4, 28(r1)             ;
                    648:        lwz      r5, 32(r1)             ;
                    649:        lwz      r6, 36(r1)             ;
                    650:        lwz      r7, 40(r1)             ;
                    651:        lwz      r8, 44(r1)             ;
                    652:        lwz      r9, 48(r1)             ;
                    653:        lwz      r10,52(r1)             ;
                    654: LRexit6:
                    655:        bctr                            ; goto *imp;
                    656:        .space 112                      ; /* area for moninitobjc to write */
                    657: 
                    658: LRSL0:                                 ; Locking case _objc_msgSendSuper_stret
                    659:        stw      r6,36(r1)              ; save r6
                    660:        addis    r6,0,hi16(_messageLock)
                    661:        ori      r6,r6,lo16(_messageLock)
                    662: 
                    663: LRSgetit:
                    664:        lwarx    r0,0,r6                ; try to get the lock
                    665:        cmpwi    cr0,r0,0
                    666:        bne-     LRSgetit
                    667:        addi     r0,0,1
                    668:        sync                                    ; Bugfix for 3.2 and older cpus
                    669:        stwcx.   r0,0,r6
                    670:        bne-     LRSgetit
                    671:        isync
                    672: 
                    673:        lwz      r10,class(r4)          ; class = super->class;
                    674:        lwz      r10,cache(r10)         ; cache = class->cache
                    675:        lwz      r11,mask(r10)          ; mask = cache->mask
                    676:        addi     r9,r10,buckets         ; buckets = cache->buckets
                    677:        and      r10,r5,r11             ; index = selector & mask;
                    678: LRSL1:                                 ;
                    679:        slwi     r0,r10,2
                    680:        lwzx     r7,r9,r0               ; method = cache->buckets[index];
                    681:        cmplwi   cr0,r7,0               ; if (method == NULL)
                    682:        beq      cr0,LRSL2              ;
                    683:        addi     r10,r10,1              ; index++;
                    684:        lwz      r8,method_name(r7)     ; name = method->method_name;
                    685:        and      r10,r10,r11            ; index &= mask
                    686:        lwz      r7,method_imp(r7)      ; imp = method->method_imp;
                    687:        cmpw     r5,r8                  ; if (name != selector)
                    688:        bne      cr0,LRSL1              ; goto loop;
                    689:        mtspr    ctr,r7                 ;
                    690:        lwz      r7, 40(r1)             ; restore r7 through r10
                    691:        lwz      r8, 44(r1)             ;
                    692:        lwz      r9, 48(r1)             ;
                    693:        lwz      r10,52(r1)             ;
                    694: 
                    695:        sync                            ; release the lock
                    696:        addi     r0,0,0
                    697:        stw      r0,0(r6)
                    698:        lwz      r6,36(r1);             ; restore r6
                    699:        lwz      r4,receiver(r4)        ; r4 = self for implementation
                    700: 
                    701: LRexit7:
                    702:        bctr                            ; goto *imp;
                    703:        .space 112                      ; /* area for moninitobjc to write */
                    704: LRSL2:                                 ;
                    705:        lwz      r10,class(r4)          ; class = super->class;
                    706:        lwz      r4,receiver(r4)        ; r4 = self for implementation
                    707: 
                    708:        stw      r3, 24(r1)             ; save the other register parameters
                    709:        stw      r4, 28(r1)             ;
                    710:        stw      r5, 32(r1)             ;
                    711: 
                    712:        mflr     r0                     ; save LR
                    713:        stw      r0,8(r1)               ;
                    714:        stwu     r1,-64(r1)             ; grow the stack
                    715: 
                    716:        ori      r3,r10,0               ; first arg is the isa pointer
                    717:        ori      r4,r5,0                ; second arg is the selector 
                    718:        bl       __class_lookupMethodAndLoadCache
                    719:        mtspr    ctr,r3
                    720:        lwz      r1,0(r1)               ; restore the stack pointer
                    721: 
                    722:        lwz      r0,8(r1)               ;
                    723:        lwz      r3, 24(r1)             ;
                    724:        lwz      r4, 28(r1)             ;
                    725:        lwz      r5, 32(r1)             ;
                    726: 
                    727:        sync                            ; release the lock
                    728:        addis    r6,0,hi16(_messageLock)
                    729:        ori      r6,r6,lo16(_messageLock)
                    730:        addi     r0,0,0
                    731:        stw      r0,0(r6)
                    732: 
                    733:        lwz      r6, 36(r1)             ;
                    734:        lwz      r7, 40(r1)             ;
                    735:        lwz      r8, 44(r1)             ;
                    736:        lwz      r9, 48(r1)             ;
                    737:        lwz      r10,52(r1)             ;
                    738: LRexit8:
                    739:        bctr                            ; goto *imp;
                    740:        .space 112                      ; /* area for moninitobjc to write */
                    741: 
                    742: ;
                    743: ; End of code duplicated for struct-returns
                    744: ;--------------------------------------------------------------------
                    745: 
                    746: # Location L30 contains the string forward::
                    747: # Location L31 contains a pointer to L30, that can be changed
                    748: # to point to another forward:: string for selector uniquing
                    749: # purposes.  ALWAYS dereference L31 to get to forward:: !!
                    750:        .objc_meth_var_names
                    751:        .align 1
                    752: L30:   .ascii "forward::\0"
                    753: 
                    754:        .objc_message_refs
                    755:        .align 2
                    756: L31:   .long L30
                    757: 
                    758:        .cstring
                    759:        .align 1
                    760: L32:   .ascii "Does not recognize selector %s\0"
                    761: 
                    762:        .text
                    763:        .align 2
                    764:        .globl __objc_msgForward
                    765: __objc_msgForward:
                    766: #if defined(KERNEL)
                    767:        trap                            ;  this code isnt ready yet!!!!!!!!!!!
                    768: #else
                    769:        addis    r11,0,hi16(L31)        ;
                    770:        addi     r11,r11,lo16(L31)      ;
                    771:        cmpw     cr0,r11,r4             ;  if (sel == @selector (forward::))
                    772:        bne      L_error                ;
                    773:        
                    774:        stw      r3, 24(r1)             ;  home the register arguments, is there a "float" problem?
                    775:        stw      r4, 28(r1)
                    776:        stw      r5, 32(r1)
                    777:        stw      r6, 36(r1)
                    778:        stw      r7, 40(r1)
                    779:        stw      r8, 44(r1)
                    780:        stw      r9, 48(r1)
                    781:        stw      r10,52(r1)
                    782:                                        ;  (first arg remains self)
                    783:        addis    r4,0,hi16(L30)         ;  (second arg is "forward:")
                    784:        addi     r4,r4,lo16(L30)
                    785:        andi.    r5,r4,0                ;  (third arg is previous selector)
                    786:        addi     r6,r1,24               ;  (forth arg is &self)
                    787: 
                    788:        addi     r1,r1,64               ;  (grow the stack)
                    789:        bl       _objc_msgSend          ;  [self forward: sel : &self]
                    790:        addi     r1,r1,-64              ;  (deallocate storage)
                    791:        blr                             ;  return
                    792: L_error:
                    793:        addis    r4,0,hi16(L32)
                    794:        addi     r4,r4,lo16(L32)
                    795:        addis    r5,0,hi16(L30)
                    796:        addi     r5,r5,lo16(L30)
                    797:        bl       ___objc_error          ;  
                    798: #endif /* ! KERNEL */
                    799: 
                    800:        .text
                    801:        .align 2
                    802:        .globl _objc_msgSendv
                    803: _objc_msgSendv:
                    804: #if defined(KERNEL)
                    805:        trap                            ;  this code isnt ready yet!!!!!!!!!!!
                    806: #else
                    807:        mflr     r0
                    808:        stw      r0,8(r1)               ;  (save return pc)
                    809:        addi     r1,r1,32               ;  (allocate storage)
                    810: 
                    811:        cmpwi    cr0,r5,0
                    812:        bgt      cr0,L34                ;  if (size > 0) ...
                    813: 
                    814:        lwz      r10,28(r6)             ;  (restore some of the args)
                    815:        lwz      r9, 24(r6)
                    816:        lwz      r8, 20(r6)
                    817:        lwz      r7, 16(r6)
                    818:        lwz      r1,0(r1)               ; restore stack pointer
                    819:        lwz      r0,8(r1)               ; restore return pc
                    820: 
                    821:        bl       _objc_msgSend          ;  objc_msgSend (self, selector, ...)
                    822: 
                    823:        subi     r31,r30,32             ;  (deallocate variable storage)
                    824:        addi     r31,r31,16             ;  (deallocate storage)
                    825:        lwz      r0,8(r1)
                    826:        mtlr     r0
                    827:        blr                             ; return
                    828: #endif /* ! KERNEL */

unix.superglobalmegacorp.com

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