Annotation of researchv9/sys/sun3/addupc.s, revision 1.1

1.1     ! root        1:        .data
        !             2:        .asciz  "@(#)addupc.s 1.1 86/02/03 Copyr 19834Sun Micro"
        !             3:        .even
        !             4:        .text
        !             5: 
        !             6: |      Copyright (c) 1984 by Sun Microsystems, Inc.
        !             7: 
        !             8: | 
        !             9: |  Add to user profiling counters.
        !            10: |
        !            11: | struct uprof {               /* profile arguments */
        !            12: |      short   *pr_base;       /* buffer base */
        !            13: |      unsigned pr_size;       /* buffer size */
        !            14: |      unsigned pr_off;        /* pc offset */
        !            15: |      unsigned pr_scale;      /* pc scaling */
        !            16: | } ;
        !            17: | addupc( pc, pr, incr) 
        !            18: |     register int pc;
        !            19: |     register struct uprof *pr;
        !            20: |     int incr;
        !            21: | {
        !            22: |      register short *slot;
        !            23: |      short counter;
        !            24: | 
        !            25: |      slot = pr->pr_base 
        !            26: |              + (((pc - pr->pr_off) * pr->pr_scale) >> 16)/(sizeof *slot);
        !            27: |      if (slot >= pr->pr_base &&
        !            28: |          slot < (short *)(pr->pr_size + (int)pr->pr_base)) {
        !            29: |              if ((counter=fusword(slot))<0) {
        !            30: |                      pr->pr_scale = 0;               /* turn off profiling */
        !            31: |              } else {
        !            32: |                      counter += incr;
        !            33: |                      susword(slot, counter);
        !            34: |              }
        !            35: |      }
        !            36: | }
        !            37: 
        !            38: #include "../machine/asm_linkage.h"
        !            39: 
        !            40:        PR_SIZE =       4
        !            41:        PR_OFF  =       8
        !            42:        PR_SCALE=       12
        !            43:        .text
        !            44:        ENTRY(addupc)
        !            45:        link    a6,#-16
        !            46:        moveml  #0x3080,sp@
        !            47:        movl    a6@(8),d7
        !            48:        movl    a6@(12),a5
        !            49:        | compute:
        !            50:        |         pc - pr->pr_off in d7
        !            51:        |         +--------+--------+
        !            52:        |         |   a    |   b    |
        !            53:        |         +--------+--------+
        !            54:        |          31    16 15     0
        !            55:        |
        !            56:        |         pr->pr_scale at a5@(PR_SCALE)
        !            57:        |         +--------+--------+
        !            58:        |         |   c    |   d    |
        !            59:        |         +--------+--------+
        !            60:        |          31    16 15     0
        !            61:        |
        !            62:        | (pc - pr->pr_off) * pr->pr_scale >>16 
        !            63:        |   is the middle bits of a sum of 4 products:
        !            64:        |
        !            65:        |                            +--------+--------+
        !            66:        |                            |      b * d      |
        !            67:        |                            +--------+--------+
        !            68:        |                   +--------+--------+
        !            69:        |     +             |      a * d      |
        !            70:        |                   +--------+--------+
        !            71:        |                   +--------+--------+
        !            72:        |     +             |      c * b      |
        !            73:        |                   +--------+--------+
        !            74:        |          +--------+--------+
        !            75:        |     +    |      a * c      |
        !            76:        |          +--------+--------+
        !            77:        |______________________________________________________
        !            78:        |
        !            79:        |                   +--------+--------+
        !            80:        |                   |  result in d0   |
        !            81:        |                   +--------+--------+
        !            82:        |
        !            83:        |
        !            84: 
        !            85:        subl    a5@(PR_OFF),d7
        !            86:        movw    d7,d0
        !            87:        mulu    a5@(PR_SCALE+2),d0
        !            88:        clrw    d0
        !            89:        swap    d0
        !            90:        movw    d7,d1
        !            91:        beqs    1f  | short cut if product will be zero
        !            92:        mulu    a5@(PR_SCALE),d1
        !            93:        addl    d1,d0
        !            94: 1:
        !            95:        swap    d7
        !            96:        movw    a5@(PR_SCALE+2),d1
        !            97:        beqs    2f  | short cut if product will be zero
        !            98:        mulu    d7,d1
        !            99:        addl    d1,d0
        !           100: 2:
        !           101:        movw    a5@(PR_SCALE),d1
        !           102:        beqs    3f  | short cut if product will be zero
        !           103:        mulu    d7,d1
        !           104:        swap    d1
        !           105:        clrw    d1
        !           106:        addl    d1,d0
        !           107: 3:
        !           108:        andb    #0xfe,d0        | make sure address is even.
        !           109:        addl    a5@,d0
        !           110:        movl    d0,a4
        !           111:        cmpl    a5@,a4
        !           112:        jcs     LE12
        !           113:        movl    a5@(PR_SIZE),d0
        !           114:        addl    a5@,d0
        !           115:        cmpl    d0,a4
        !           116:        jcc     LE12
        !           117:        pea     a4@
        !           118:        jbsr    _fusword
        !           119:        addql   #4,sp
        !           120:        tstl    d0
        !           121:        jge     L16
        !           122:        clrl    a5@(PR_SCALE)
        !           123:        jra     LE12
        !           124: L16:
        !           125:        addw    a6@(18),d0
        !           126:        movl    d0,sp@-
        !           127:        pea     a4@
        !           128:        jbsr    _susword
        !           129:        addql   #8,sp
        !           130: LE12:
        !           131:        moveml  sp@,#0x3080
        !           132:        unlk    a6
        !           133:        rts

unix.superglobalmegacorp.com

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