[BACK]Return to mul_1.asm CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / gmp / mpn / alpha / ev6 / nails

Annotation of OpenXM_contrib/gmp/mpn/alpha/ev6/nails/mul_1.asm, Revision 1.1.1.1

1.1       ohara       1: dnl  Alpha ev6 nails mpn_mul_1.
                      2:
                      3: dnl  Copyright 2002 Free Software Foundation, Inc.
                      4: dnl
                      5: dnl  This file is part of the GNU MP Library.
                      6: dnl
                      7: dnl  The GNU MP Library is free software; you can redistribute it and/or
                      8: dnl  modify it under the terms of the GNU Lesser General Public License as
                      9: dnl  published by the Free Software Foundation; either version 2.1 of the
                     10: dnl  License, or (at your option) any later version.
                     11: dnl
                     12: dnl  The GNU MP Library is distributed in the hope that it will be useful,
                     13: dnl  but WITHOUT ANY WARRANTY; without even the implied warranty of
                     14: dnl  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
                     15: dnl  Lesser General Public License for more details.
                     16: dnl
                     17: dnl  You should have received a copy of the GNU Lesser General Public
                     18: dnl  License along with the GNU MP Library; see the file COPYING.LIB.  If
                     19: dnl  not, write to the Free Software Foundation, Inc., 59 Temple Place -
                     20: dnl  Suite 330, Boston, MA 02111-1307, USA.
                     21:
                     22: include(`../config.m4')
                     23:
                     24: dnl  INPUT PARAMETERS
                     25: define(`rp',`r16')
                     26: define(`up',`r17')
                     27: define(`n',`r18')
                     28: define(`vl0',`r19')
                     29:
                     30: define(`numb_mask',`r24')
                     31:
                     32: define(`m0a',`r0')
                     33: define(`m0b',`r1')
                     34: define(`m1a',`r2')
                     35: define(`m1b',`r3')
                     36: define(`m2a',`r20')
                     37: define(`m2b',`r21')
                     38: define(`m3a',`r22')
                     39: define(`m3b',`r23')
                     40:
                     41: define(`acc0',`r27')
                     42: define(`acc1',`r25')
                     43:
                     44: define(`ul0',`r4')
                     45: define(`ul1',`r5')
                     46: define(`ul2',`r6')
                     47: define(`ul3',`r7')
                     48:
                     49: C unused scratch
                     50: C unused saved   r10 r11
                     51:
                     52: define(`NAIL_BITS',`GMP_NAIL_BITS')
                     53: define(`NUMB_BITS',`GMP_NUMB_BITS')
                     54:
                     55: dnl  This declaration is munged by configure
                     56: NAILS_SUPPORT(1-63)
                     57:
                     58: dnl  Runs at 3.5 cycles/limb.  Naively made from addmul_1.asm.  A better
                     59: dnl  implementation could bring speed to 2.75 cycles/limb.
                     60:
                     61: dnl Register usage:
                     62: dnl callee-saves:      r9 r10 r11 r12 r13 r14 r15
                     63: dnl scratch: r0 r1 r2 r3 r4 r5 r6 r7 r8
                     64: dnl         r16 r17 r18 r19 r20 r21 r22 r23 r24 r25 r27 r28
                     65: dnl return address: 26
                     66: dnl global pointer: 29
                     67: dnl stack pointer: 30
                     68:
                     69: ASM_START()
                     70: PROLOGUE(mpn_mul_1)
                     71:        lda     r30,    -240(r30)
                     72: C      stq     r9,     8(r30)
                     73: C      stq     r10,    16(r30)
                     74: C      stq     r11,    24(r30)
                     75: C      stq     r12,    32(r30)
                     76: C      stq     r13,    40(r30)
                     77: C      stq     r14,    48(r30)
                     78:        stq     r15,    56(r30)
                     79:
                     80:        sll     vl0, NAIL_BITS, vl0
                     81:        lda     numb_mask, -1(r31)
                     82:        srl     numb_mask, NAIL_BITS, numb_mask
                     83:
                     84:        bic     r31, r31, r15
                     85:        bic     r31, r31, m3b
                     86:
                     87:        and     n,      3,      r25
                     88:        beq     r25,    L4
                     89: Loop0:
                     90:        ldq     ul0,    0(up)
                     91:        mulq    vl0,    ul0,    m0a             C U1
                     92:        srl     m0a,NAIL_BITS,  r8
                     93:        addq    r8,     m3b,    acc0
                     94:        addq    r15,    acc0,   acc0
                     95:        umulh   vl0,    ul0,    m3b             C U1
                     96:        srl     acc0,NUMB_BITS, r15
                     97:        and     acc0,numb_mask, r28
                     98:        stq     r28,    0(rp)
                     99:        lda     rp,     8(rp)
                    100:        lda     up,     8(up)
                    101:        lda     r25,    -1(r25)
                    102:        bne     r25,    Loop0
                    103:
                    104: L4:
                    105:        lda     n,      -4(n)
                    106:        bge     n,      L_4_or_more
                    107: L_0_to_3:
                    108:        addq    m3b,    r15,    r0
                    109:        br      r31,    Lret
                    110:
                    111: L_4_or_more:
                    112:        ldq     ul0,    0(up)
                    113:        ldq     ul1,    8(up)
                    114:        ldq     ul2,    16(up)
                    115:        ldq     ul3,    24(up)
                    116:        lda     n,      -4(n)
                    117:        lda     up,     32(up)
                    118:        bge     n,      L_8_or_more
                    119: L_4_to_8:
                    120:        mulq    vl0,    ul0,    m0a             C U1
                    121:        umulh   vl0,    ul0,    m0b             C U1
                    122:        mulq    vl0,    ul1,    m1a             C U1
                    123:        umulh   vl0,    ul1,    m1b             C U1
                    124:        mulq    vl0,    ul2,    m2a             C U1
                    125:        umulh   vl0,    ul2,    m2b             C U1
                    126:        srl     m0a,NAIL_BITS,  r8
                    127:        mulq    vl0,    ul3,    m3a             C U1
                    128:        addq    r8,     m3b,    acc0
                    129:        umulh   vl0,    ul3,    m3b             C U1
                    130:        srl     m1a,NAIL_BITS,  r8
                    131:        addq    r15,    acc0,   acc0
                    132:
                    133:        addq    r8,     m0b,    acc1
                    134:        srl     acc0,NUMB_BITS, r15
                    135:        and     acc0,numb_mask, r28
                    136:        srl     m2a,NAIL_BITS,  r8
                    137:        addq    r15,    acc1,   acc1
                    138:        bis     r31,    r31,    r31             C       nop
                    139:        addq    r8,     m1b,    acc0
                    140:        srl     acc1,NUMB_BITS, r15
                    141:        stq     r28,    0(rp)
                    142:        and     acc1,numb_mask, r28
                    143:        srl     m3a,NAIL_BITS,  r8
                    144:        addq    r15,    acc0,   acc0
                    145:        bis     r31,    r31,    r31             C       nop
                    146:        addq    r8,     m2b,    acc1
                    147:        srl     acc0,NUMB_BITS, r15
                    148:        stq     r28,    8(rp)
                    149:        and     acc0,numb_mask, r28
                    150:        addq    r15,    acc1,   acc1
                    151:        bis     r31,    r31,    r31             C       nop
                    152:        srl     acc1,NUMB_BITS, r15
                    153:        stq     r28,    16(rp)
                    154:        and     acc1,numb_mask, r28
                    155:        addq    m3b,    r15,    acc0
                    156:        stq     r28,    24(rp)
                    157:        and     acc0,numb_mask, r0
                    158:
                    159:        br      r31,    Lret
                    160:
                    161: L_8_or_more:
                    162:        mulq    vl0,    ul0,    m0a             C U1
                    163:        umulh   vl0,    ul0,    m0b             C U1
                    164:        ldq     ul0,    0(up)
                    165:        mulq    vl0,    ul1,    m1a             C U1
                    166:        umulh   vl0,    ul1,    m1b             C U1
                    167:        ldq     ul1,    8(up)
                    168:        mulq    vl0,    ul2,    m2a             C U1
                    169:        umulh   vl0,    ul2,    m2b             C U1
                    170:        ldq     ul2,    16(up)
                    171:        srl     m0a,NAIL_BITS,  r8
                    172:        mulq    vl0,    ul3,    m3a             C U1
                    173:        addq    r8,     m3b,    acc0
                    174:        umulh   vl0,    ul3,    m3b             C U1
                    175:        ldq     ul3,    24(up)
                    176:        srl     m1a,NAIL_BITS,  r8
                    177:        addq    r15,    acc0,   acc0
                    178:        lda     n,      -4(n)
                    179:        lda     up,     32(up)
                    180:        lda     rp,     32(rp)
                    181:        bge     n,      L_12_or_more                    C U0
                    182: L_8_to_11:
                    183:        mulq    vl0,    ul0,    m0a             C U1
                    184:        addq    r8,     m0b,    acc1
                    185:        srl     acc0,NUMB_BITS, r15
                    186:        umulh   vl0,    ul0,    m0b             C U1
                    187:        and     acc0,numb_mask, r28
                    188:        srl     m2a,NAIL_BITS,  r8
                    189:        addq    r15,    acc1,   acc1
                    190:        bis     r31,    r31,    r31             C       nop
                    191:        mulq    vl0,    ul1,    m1a             C U1
                    192:        addq    r8,     m1b,    acc0
                    193:        srl     acc1,NUMB_BITS, r15
                    194:        stq     r28,    -32(rp)
                    195:        umulh   vl0,    ul1,    m1b             C U1
                    196:        and     acc1,numb_mask, r28
                    197:        srl     m3a,NAIL_BITS,  r8
                    198:        addq    r15,    acc0,   acc0
                    199:        bis     r31,    r31,    r31             C       nop
                    200:        mulq    vl0,    ul2,    m2a             C U1
                    201:        addq    r8,     m2b,    acc1
                    202:        srl     acc0,NUMB_BITS, r15
                    203:        stq     r28,    -24(rp)
                    204:        umulh   vl0,    ul2,    m2b             C U1
                    205:        and     acc0,numb_mask, r28
                    206:        srl     m0a,NAIL_BITS,  r8
                    207:        addq    r15,    acc1,   acc1
                    208:        bis     r31,    r31,    r31             C       nop
                    209:        mulq    vl0,    ul3,    m3a             C U1
                    210:        addq    r8,     m3b,    acc0
                    211:        srl     acc1,NUMB_BITS, r15
                    212:        stq     r28,    -16(rp)
                    213:        umulh   vl0,    ul3,    m3b             C U1
                    214:        and     acc1,numb_mask, r28
                    215:        srl     m1a,NAIL_BITS,  r8
                    216:        addq    r15,    acc0,   acc0
                    217:
                    218:        addq    r8,     m0b,    acc1
                    219:        srl     acc0,NUMB_BITS, r15
                    220:        stq     r28,    -8(rp)
                    221:        and     acc0,numb_mask, r28
                    222:        srl     m2a,NAIL_BITS,  r8
                    223:        addq    r15,    acc1,   acc1
                    224:        bis     r31,    r31,    r31             C       nop
                    225:        addq    r8,     m1b,    acc0
                    226:        srl     acc1,NUMB_BITS, r15
                    227:        stq     r28,    0(rp)
                    228:        and     acc1,numb_mask, r28
                    229:        srl     m3a,NAIL_BITS,  r8
                    230:        addq    r15,    acc0,   acc0
                    231:        bis     r31,    r31,    r31             C       nop
                    232:        addq    r8,     m2b,    acc1
                    233:        srl     acc0,NUMB_BITS, r15
                    234:        stq     r28,    8(rp)
                    235:        and     acc0,numb_mask, r28
                    236:        addq    r15,    acc1,   acc1
                    237:        bis     r31,    r31,    r31             C       nop
                    238:        srl     acc1,NUMB_BITS, r15
                    239:        stq     r28,    16(rp)
                    240:        and     acc1,numb_mask, r28
                    241:        addq    m3b,    r15,    acc0
                    242:        stq     r28,    24(rp)
                    243:        and     acc0,numb_mask, r0
                    244:
                    245:        br      r31,    Lret
                    246:
                    247: L_12_or_more:
                    248:        mulq    vl0,    ul0,    m0a             C U1
                    249:        addq    r8,     m0b,    acc1
                    250:        srl     acc0,NUMB_BITS, r15
                    251:        umulh   vl0,    ul0,    m0b             C U1
                    252:        ldq     ul0,    0(up)
                    253:        and     acc0,numb_mask, r28
                    254:        srl     m2a,NAIL_BITS,  r8
                    255:        addq    r15,    acc1,   acc1
                    256:        bis     r31,    r31,    r31             C       nop
                    257:        mulq    vl0,    ul1,    m1a             C U1
                    258:        addq    r8,     m1b,    acc0
                    259:        srl     acc1,NUMB_BITS, r15
                    260:        stq     r28,    -32(rp)
                    261:        umulh   vl0,    ul1,    m1b             C U1
                    262:        ldq     ul1,    8(up)
                    263:        and     acc1,numb_mask, r28
                    264:        srl     m3a,NAIL_BITS,  r8
                    265:        addq    r15,    acc0,   acc0
                    266:        bis     r31,    r31,    r31             C       nop
                    267:        mulq    vl0,    ul2,    m2a             C U1
                    268:        addq    r8,     m2b,    acc1
                    269:        srl     acc0,NUMB_BITS, r15
                    270:        stq     r28,    -24(rp)
                    271:        umulh   vl0,    ul2,    m2b             C U1
                    272:        ldq     ul2,    16(up)
                    273:        and     acc0,numb_mask, r28
                    274:        srl     m0a,NAIL_BITS,  r8
                    275:        addq    r15,    acc1,   acc1
                    276:        bis     r31,    r31,    r31             C       nop
                    277:        mulq    vl0,    ul3,    m3a             C U1
                    278:        addq    r8,     m3b,    acc0
                    279:        srl     acc1,NUMB_BITS, r15
                    280:        stq     r28,    -16(rp)
                    281:        umulh   vl0,    ul3,    m3b             C U1
                    282:        ldq     ul3,    24(up)
                    283:        and     acc1,numb_mask, r28
                    284:        srl     m1a,NAIL_BITS,  r8
                    285:        addq    r15,    acc0,   acc0
                    286:        bis     r31,    r31,    r31             C       nop
                    287:        bis     r31,    r31,    r31             C       nop
                    288:        bis     r31,    r31,    r31             C       nop
                    289:        bis     r31,    r31,    r31             C       nop
                    290:        bis     r31,    r31,    r31             C       nop
                    291:        lda     n,      -4(n)
                    292:        lda     up,     32(up)
                    293:        lda     rp,     32(rp)
                    294:        blt     n,      L_end                   C U0
                    295:
                    296: Loop:
                    297: C
                    298:        mulq    vl0,    ul0,    m0a             C U1
                    299:        addq    r8,     m0b,    acc1
                    300:        srl     acc0,NUMB_BITS, r15
                    301:        stq     r28,    -40(rp)
                    302: C
                    303:        umulh   vl0,    ul0,    m0b             C U1
                    304:        ldq     ul0,    0(up)
                    305:        bis     r31,    r31,    r31             C       nop
                    306:        and     acc0,numb_mask, r28
                    307: C
                    308:        srl     m2a,NAIL_BITS,  r8
                    309:        bis     r31,    r31,    r31             C       nop
                    310:        addq    r15,    acc1,   acc1
                    311:        bis     r31,    r31,    r31             C       nop
                    312: C
                    313:        mulq    vl0,    ul1,    m1a             C U1
                    314:        addq    r8,     m1b,    acc0
                    315:        srl     acc1,NUMB_BITS, r15
                    316:        stq     r28,    -32(rp)
                    317: C
                    318:        umulh   vl0,    ul1,    m1b             C U1
                    319:        ldq     ul1,    8(up)
                    320:        bis     r31,    r31,    r31             C       nop
                    321:        and     acc1,numb_mask, r28
                    322: C
                    323:        srl     m3a,NAIL_BITS,  r8
                    324:        bis     r31,    r31,    r31             C       nop
                    325:        addq    r15,    acc0,   acc0
                    326:        bis     r31,    r31,    r31             C       nop
                    327: C
                    328:        mulq    vl0,    ul2,    m2a             C U1
                    329:        addq    r8,     m2b,    acc1
                    330:        srl     acc0,NUMB_BITS, r15
                    331:        stq     r28,    -24(rp)
                    332: C
                    333:        umulh   vl0,    ul2,    m2b             C U1
                    334:        ldq     ul2,    16(up)
                    335:        bis     r31,    r31,    r31             C       nop
                    336:        and     acc0,numb_mask, r28
                    337: C
                    338:        srl     m0a,NAIL_BITS,  r8
                    339:        bis     r31,    r31,    r31             C       nop
                    340:        addq    r15,    acc1,   acc1
                    341:        bis     r31,    r31,    r31             C       nop
                    342: C
                    343:        mulq    vl0,    ul3,    m3a             C U1
                    344:        addq    r8,     m3b,    acc0
                    345:        srl     acc1,NUMB_BITS, r15
                    346:        stq     r28,    -16(rp)
                    347: C
                    348:        umulh   vl0,    ul3,    m3b             C U1
                    349:        ldq     ul3,    24(up)
                    350:        bis     r31,    r31,    r31             C       nop
                    351:        and     acc1,numb_mask, r28
                    352: C
                    353:        srl     m1a,NAIL_BITS,  r8
                    354:        bis     r31,    r31,    r31             C       nop
                    355:        addq    r15,    acc0,   acc0
                    356:        bis     r31,    r31,    r31             C       nop
                    357: C
                    358:        lda     n,      -4(n)
                    359:        lda     up,     32(up)
                    360:        lda     rp,     32(rp)
                    361:        bge     n,      Loop                    C U0
                    362:
                    363: L_end:
                    364:        mulq    vl0,    ul0,    m0a             C U1
                    365:        addq    r8,     m0b,    acc1
                    366:        srl     acc0,NUMB_BITS, r15
                    367:        stq     r28,    -40(rp)
                    368:        umulh   vl0,    ul0,    m0b             C U1
                    369:        and     acc0,numb_mask, r28
                    370:        srl     m2a,NAIL_BITS,  r8
                    371:        addq    r15,    acc1,   acc1
                    372:        bis     r31,    r31,    r31             C       nop
                    373:        mulq    vl0,    ul1,    m1a             C U1
                    374:        addq    r8,     m1b,    acc0
                    375:        srl     acc1,NUMB_BITS, r15
                    376:        stq     r28,    -32(rp)
                    377:        umulh   vl0,    ul1,    m1b             C U1
                    378:        and     acc1,numb_mask, r28
                    379:        srl     m3a,NAIL_BITS,  r8
                    380:        addq    r15,    acc0,   acc0
                    381:        bis     r31,    r31,    r31             C       nop
                    382:        mulq    vl0,    ul2,    m2a             C U1
                    383:        addq    r8,     m2b,    acc1
                    384:        srl     acc0,NUMB_BITS, r15
                    385:        stq     r28,    -24(rp)
                    386:        umulh   vl0,    ul2,    m2b             C U1
                    387:        and     acc0,numb_mask, r28
                    388:        srl     m0a,NAIL_BITS,  r8
                    389:        addq    r15,    acc1,   acc1
                    390:        bis     r31,    r31,    r31             C       nop
                    391:        mulq    vl0,    ul3,    m3a             C U1
                    392:        addq    r8,     m3b,    acc0
                    393:        srl     acc1,NUMB_BITS, r15
                    394:        stq     r28,    -16(rp)
                    395:        umulh   vl0,    ul3,    m3b             C U1
                    396:        and     acc1,numb_mask, r28
                    397:        srl     m1a,NAIL_BITS,  r8
                    398:        addq    r15,    acc0,   acc0
                    399:        bis     r31,    r31,    r31             C       nop
                    400:        bis     r31,    r31,    r31             C       nop
                    401:        bis     r31,    r31,    r31             C       nop
                    402:        bis     r31,    r31,    r31             C       nop
                    403:        bis     r31,    r31,    r31             C       nop
                    404:        lda     rp,     32(rp)
                    405:
                    406:        addq    r8,     m0b,    acc1
                    407:        srl     acc0,NUMB_BITS, r15
                    408:        stq     r28,    -40(rp)
                    409:        and     acc0,numb_mask, r28
                    410:        srl     m2a,NAIL_BITS,  r8
                    411:        addq    r15,    acc1,   acc1
                    412:        bis     r31,    r31,    r31             C       nop
                    413:        addq    r8,     m1b,    acc0
                    414:        srl     acc1,NUMB_BITS, r15
                    415:        stq     r28,    -32(rp)
                    416:        and     acc1,numb_mask, r28
                    417:        srl     m3a,NAIL_BITS,  r8
                    418:        addq    r15,    acc0,   acc0
                    419:        bis     r31,    r31,    r31             C       nop
                    420:        addq    r8,     m2b,    acc1
                    421:        srl     acc0,NUMB_BITS, r15
                    422:        stq     r28,    -24(rp)
                    423:        and     acc0,numb_mask, r28
                    424:        addq    r15,    acc1,   acc1
                    425:        bis     r31,    r31,    r31             C       nop
                    426:        srl     acc1,NUMB_BITS, r15
                    427:        stq     r28,    -16(rp)
                    428:        and     acc1,numb_mask, r28
                    429:        addq    m3b,    r15,    acc0
                    430:        stq     r28,    -8(rp)
                    431:        and     acc0,numb_mask, r0
                    432: Lret:
                    433: C      ldq     r9,     8(r30)
                    434: C      ldq     r10,    16(r30)
                    435: C      ldq     r11,    24(r30)
                    436: C      ldq     r12,    32(r30)
                    437: C      ldq     r13,    40(r30)
                    438: C      ldq     r14,    48(r30)
                    439:        ldq     r15,    56(r30)
                    440:        lda     r30,    240(r30)
                    441:        ret     r31,    (r26),  1
                    442: EPILOGUE(mpn_mul_1)
                    443: ASM_END()

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>