Annotation of cci/d/fpevent/pack_inst.s, revision 1.1.1.1

1.1       root        1: 
                      2: /***************************************************************************
                      3: *
                      4: *              INSTRUCTION CODE PACKING ROUTINE
                      5: *
                      6: *  This routine will take the various parts that make up an instruction and
                      7: *  pack them together into a buffer of code that can be inserted into the
                      8: *  test sequence. This routine will assume longword lengths for the operand
                      9: *  addresses.
                     10: *  The test instruction data will initially be in 5 locations:
                     11: *      op_code      : This is the instruction's op. code
                     12: *      addr_code    : This is the code for the addressing mode to use
                     13: *      addr_code2   : This is the code for the 2nd operand's addressing mode.
                     14: *      addr_codeB   : This is the 2nd addressing mode for indexed addressing
                     15: *      addr_1       : This is the 1st address operand
                     16: *      addr_2       : This is the 2nd address operand
                     17: *
                     18: *  In addition, the test code may be pipelined with another instruction in
                     19: *  front of it. The data for the pipeline instruction will be:
                     20: *      pipe_inst1   : This is instruction goes before the test instruction.
                     21: *      addr_code_p1 : This is the 1st instruction's addressing mode.
                     22: *  
                     23: *  The data will be concatinated to 4 longwords:
                     24: *      inst_buf:  < op-code > <addr_code> < addr_1.a > <addr_1.b >
                     25: *                 <addr_1.c > <addr_1.d > <addr_code2> <addr_2.a >
                     26: *                 <addr_2.b > <addr_2.c > < addr_2.d > <  "NOP"  >
                     27: *                  <  "NOP"  > <  "NOP"  > <   "NOP"  > <  "NOP"  >
                     28: * end_of_inst_buf:
                     29: *
                     30: *  or, for indexed adddressing:
                     31: *      inst_buf:  <  op-code > <addr_code > <addr_codeB> < addr_1.b >
                     32: *                 < addr_1.b > < addr_1.c > < addr_1.d > <addr_code2>
                     33: *                 <addr_codeB> < addr_2.a > < addr_2.b > < addr_2.c >
                     34: *                  < addr_2.d > <  "NOP"   > <  "NOP"  >  <  "NOP"   >
                     35: * end_of_inst_buf:
                     36: *
                     37: *  The instruction may have 0 or 1 operand(s). There may be 0, 1, 2, or 4
                     38: *  bytes to each operand address. For a 2 operand instruction with 0 bytes
                     39: *  in the operand address fields and not indexed, the buffer would look like:
                     40: *      inst_buf:  < op-code > <addr_code> <addr_code> <  "NOP"  >
                     41: *                 <  "NOP"  > <  "NOP"  > <  "NOP"  > <  "NOP"  >
                     42: *                 <  "NOP"  > <  "NOP"  > <  "NOP"  > <  "NOP"  >
                     43: *                 <  "NOP"  > <  "NOP"  > <  "NOP"  > <  "NOP"  >
                     44: * end_of_inst_buf:
                     45: *
                     46: *
                     47: *  If the test is a pipelined test then there will be an extra instruction
                     48: *  added at the begining of the buffer. For a 1 operand instruction with
                     49: *  register addressing the buffer would look like this:
                     50: *      inst_buf:  <pipe_inst> <pipe_addr> < op-code > <addr_code> 
                     51: *                 <  "NOP"  > <  "NOP"  > <  "NOP"  > <  "NOP"  >
                     52: *                 <  "NOP"  > <  "NOP"  > <  "NOP"  > <  "NOP"  >
                     53: *                 <  "NOP"  > <  "NOP"  > <  "NOP"  > <  "NOP"  >
                     54: * end_of_inst_buf:
                     55: *
                     56: *  After the last byte of the instruction the buffer will be padded with NOPs.
                     57: *
                     58: *  30-May-85  Added pipelined instruction.
                     59: *****************************************************************************/
                     60: 
                     61:        .text
                     62:        .align 1
                     63:        .globl _pack_inst
                     64: _pack_inst:
                     65:        .word 0x4                       /* save r4 */
                     66:        moval   _inst_buf,r1            /* get the instruction buf's addr */
                     67:   
                     68: ##########################################################################
                     69: #  for "pipelined" tests start the code with the PIPE_INST1 instruction 
                     70: ##########################################################################
                     71:        tstl    _pipe_test              /* is the pipe test flag set?   */
                     72:        beql    1f                      /* skip this section if not     */
                     73:        movl    _pipe_inst1,r0          /* get the initial pipeline inst */
                     74:        movb    r0,(r1)                 /*    and put it in the buffer  */
                     75:        incl    r1
                     76:        movl    _addr_code_p1,r0        /* get the piped instruction's  */
                     77:        movb    r0,(r1)                 /*    addressing mode           */
                     78:        incl    r1
                     79: 1:
                     80: ##########################################################################
                     81: #  put the op-code into the buffer
                     82: ##########################################################################
                     83:        movl    _op_code,r0
                     84:        movb    r0,(r1)                 /* put the op-code in the buffer */
                     85:        incl    r1
                     86:        tstl    _no_ops                 /* get the # of operands */
                     87:        bneq    1f
                     88:        jmp     4f                      /*  ... no operands */
                     89: 1:
                     90: ##########################################################################
                     91: #  save the 1st addressing mode
                     92: ##########################################################################
                     93:        movl    _addr_code,r0
                     94:        movb    r0,(r1)                 /* put addressing mode in the buffer */
                     95:        incl    r1
                     96:        cmpl    r0,$0x40                /* check for indexed addressing */
                     97:        blss    1f
                     98:        cmpl    r0,$0x4f
                     99:        bgtr    1f
                    100:        movl    _addr_codeB,r0          /* indexed - put in 2nd addr mode */
                    101:        movb    r0,(r1)
                    102:        incl    r1
                    103: 1:
                    104:        tstl    _addr_size              /* check # bytes in addr field */
                    105:        bneq    1f
                    106:        jmp     3f                      /*  no address field */
                    107: 1:
                    108: ##########################################################################
                    109: #  save the 1st address field 
                    110: ##########################################################################
                    111:        movl    _addr_1,r0              /* get the address field */
                    112:        cmpl    _addr_size,$1
                    113:        beql    2f                      /* jump if 1 byte address field */
                    114:        cmpl    _addr_size,$2
                    115:        beql    1f                      /* jump if 2 byte address field */
                    116:        shrl    $24,r0,r2               /* 4 byte field  -get the M.S. byte */
                    117:        movb    r2,(r1)                 /* put the addr's MSB in the buffer */
                    118:        incl    r1
                    119:        shrl    $16,r0,r2               /* get the next byte of the field */
                    120:        movb    r2,(r1)                 /* put the addr's MSW in the buffer */
                    121:        incl    r1
                    122: 1:
                    123:        shrl    $8,r0,r2                /* get byte #1 of the field */
                    124:        movb    r2,(r1)                 
                    125:        incl    r1
                    126: 2:
                    127:        movb    r0,(r1)                 /* save the L.S. byte of the field */
                    128:        incl    r1
                    129: 3:
                    130:        cmpl    _no_ops,$2              /* check the # of operands */
                    131:        bgeq    1f
                    132:        jmp     4f                      /* only 1 operand */
                    133: 1:
                    134: ##########################################################################
                    135: #  save the 2nd addressing mode
                    136: ##########################################################################
                    137:        movl    _addr_code2,r0
                    138:        movb    r0,(r1)                 /* put addressing mode in the buffer */
                    139:        incl    r1
                    140:        cmpl    r0,$0x40                /* check for indexed addressing */
                    141:        blss    1f
                    142:        cmpl    r0,$0x4f
                    143:        bgtr    1f
                    144:        movl    _addr_codeB,r0          /* indexed - put in 2nd addr mode */
                    145:        movb    r0,(r1)
                    146:        incl    r1
                    147: 1:
                    148:        tstl    _addr_size              /* check # bytes in addr field */
                    149:        bneq    1f
                    150:        jmp     3f                      /*  no address field */
                    151: 1:
                    152: ##########################################################################
                    153: #  save the 2nd address field 
                    154: ##########################################################################
                    155:        movl    _addr_2,r0              /* get the address field */
                    156:        cmpl    _addr_size,$1
                    157:        beql    2f                      /* jump if 1 byte address field */
                    158:        cmpl    _addr_size,$2
                    159:        beql    1f                      /* jump if 2 byte address field */
                    160:        shrl    $24,r0,r2               /* 4 byte field  -get the M.S. byte */
                    161:        movb    r2,(r1)                 /* put the addr's MSB in the buffer */
                    162:        incl    r1
                    163:        shrl    $16,r0,r2               /* get the next byte of the field */
                    164:        movb    r2,(r1)                 /* put the addr's MSW in the buffer */
                    165:        incl    r1
                    166: 1:
                    167:        shrl    $8,r0,r2                /* get byte #1 of the field */
                    168:        movb    r2,(r1)                 
                    169:        incl    r1
                    170: 2:
                    171:        movb    r0,(r1)                 /* save the L.S. byte of the field */
                    172:        incl    r1
                    173: 3:
                    174:        cmpl    _no_ops,$3              /* check the # of operands */
                    175:        bgeq    1f
                    176:        jmp     4f                      /* only 2 operands */
                    177: 1:
                    178: ##########################################################################
                    179: #  save the 3rd addressing mode
                    180: ##########################################################################
                    181:        movl    _addr_code3,r0
                    182:        movb    r0,(r1)                 /* put addressing mode in the buffer */
                    183:        incl    r1
                    184:        cmpl    r0,$0x40                /* check for indexed addressing */
                    185:        blss    1f
                    186:        cmpl    r0,$0x4f
                    187:        bgtr    1f
                    188:        movl    _addr_codeB,r0          /* indexed - put in 2nd addr mode */
                    189:        movb    r0,(r1)
                    190:        incl    r1
                    191: 1:
                    192:        tstl    _addr_size              /* check # bytes in addr field */
                    193:        bneq    1f
                    194:        jmp     4f                      /*  no address field */
                    195: 1:
                    196: ##########################################################################
                    197: #  save the 3rd address field 
                    198: ##########################################################################
                    199:        movl    _addr_3,r0              /* get the address field */
                    200:        cmpl    _addr_size,$1
                    201:        beql    2f                      /* jump if 1 byte address field */
                    202:        cmpl    _addr_size,$2
                    203:        beql    1f                      /* jump if 2 byte address field */
                    204:        shrl    $24,r0,r2               /* 4 byte field  -get the M.S. byte */
                    205:        movb    r2,(r1)                 /* put the addr's MSB in the buffer */
                    206:        incl    r1
                    207:        shrl    $16,r0,r2               /* get the next byte of the field */
                    208:        movb    r2,(r1)                 /* put the addr's MSW in the buffer */
                    209:        incl    r1
                    210: 1:
                    211:        shrl    $8,r0,r2                /* get byte #1 of the field */
                    212:        movb    r2,(r1)                 
                    213:        incl    r1
                    214: 2:
                    215:        movb    r0,(r1)                 /* save the L.S. byte of the field */
                    216:        incl    r1
                    217: 4:
                    218: ##########################################################################
                    219: #  Now pad the rest of the buffer with NOPs
                    220: ##########################################################################
                    221:        subl3   $_inst_buf,r1,_inst_size /* save the size of the instr. */
                    222:        movl    $0x10,r0                /* get a "NOP" instruction  and */
                    223: 1:     movb    r0,(r1)                 /*   pad the instruction buffer */
                    224:        aoblss  $_end_of_inst_buf,r1,1b
                    225:        ret                             /* return */
                    226: 
                    227: 
                    228: 

unix.superglobalmegacorp.com

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