"Fossies" - the Fresh Open Source Software Archive

Member "pytorch-1.8.2/aten/src/ATen/native/quantized/cpu/qnnpack/src/q8gemm/4x8c2-xzp-aarch32-neon.S" (23 Jul 2021, 11694 Bytes) of package /linux/misc/pytorch-1.8.2.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) PowerPC Assembler source code syntax highlighting (style: standard) with prefixed line numbers. Alternatively you can here view or download the uninterpreted source code file.

    1 /*
    2  * Copyright (c) Facebook, Inc. and its affiliates.
    3  * All rights reserved.
    4  *
    5  * This source code is licensed under the BSD-style license found in the
    6  * LICENSE file in the root directory of this source tree.
    7  */
    8 
    9 #include <qnnpack/assembly.h>
   10 
   11 .syntax unified
   12 
   13 # void pytorch_q8gemm_xzp_ukernel_4x8c2__neon(
   14 #     size_t mr,
   15 #     size_t nr,
   16 #     size_t k,
   17 #     const uint8_t* restrict a,
   18 #     size_t a_stride,
   19 #     const int32_t* restrict a_sum,
   20 #     const void* restrict w,
   21 #     uint8_t* restrict c,
   22 #     size_t c_stride,
   23 #     const union pytorch_qnnp_q31_requantization_params requantization_params[restrict static 1])
   24 BEGIN_FUNCTION pytorch_q8gemm_xzp_ukernel_4x8c2__aarch32_neon
   25     .arm
   26 #ifndef __APPLE__
   27     .arch armv7-a
   28     .fpu neon
   29 #endif
   30 
   31     # Load w
   32     # - ip = w
   33     LDR ip, [sp, 8]
   34 
   35     # Load bias0123(q8), bias4567(q9)
   36     # q8 := vacc0x0123
   37     # q9 := vacc0x4567
   38     VLD1.8 {d16-d19}, [ip]!
   39 
   40     # q10 := vacc1x0123
   41     VMOV.I32 q10, q8
   42     # q11 := vacc1x4567
   43     VMOV.I32 q11, q9
   44     # q12 := vacc2x0123
   45     VMOV.I32 q12, q8
   46     # q13 := vacc2x4567
   47     VMOV.I32 q13, q9
   48     # q14 := vacc3x0123
   49     VMOV.I32 q14, q8
   50     # q15 := vacc3x4567
   51     VMOV.I32 q15, q9
   52 
   53     PUSH {r4, r5, r6, r7, r8, r9, r10, r11}
   54     VPUSH {d8-d15}
   55 
   56     # r3 := a0
   57     # r4 := a1
   58     # r5 := a2
   59     # r6 := a3
   60 
   61     # r7 := a_sum0
   62     # r8 := a_sum1
   63     # r9 := a_sum2
   64     # r10 := a_sum3
   65 
   66     # a_sum0 := a_sum
   67     LDR r7, [sp, 100]
   68 
   69     # Load a_stride
   70     # - ip = a_stride
   71     LDR r10, [sp, 96]
   72 
   73     # compare mr to 2
   74     CMP r0, 2
   75 
   76     # a1 += a_stride
   77     ADD r4, r3, r10
   78 
   79     # mr < 2, a1 := a0
   80     MOVLO r4, r3
   81 
   82     # r8 := a_sum1
   83     ADD r8, r7, 4
   84 
   85     # mr < 2, a_sum1 := a_sum0
   86     MOVLO r8, r7
   87 
   88     # r5 := a2
   89     ADD r5, r4, r10
   90     # mr <= 2, a2 := a1
   91     MOVLS r5, r4
   92 
   93     # r9 := a_sum2
   94     ADD r9, r8, 4
   95     # mr <= 2, a_sum2 := a_sum1
   96     MOVLS r9, r8
   97 
   98     # compare mr to 4
   99     CMP r0, 4
  100 
  101     # r6 := a3
  102     ADD r6, r5, r10
  103     # mr != 4, a3 := a2
  104     MOVNE r6, r5
  105 
  106     # a_sum3 := a_sum2 + 1
  107     # r10 := a_sum3
  108     ADD r10, r9, 4
  109     # mr != 4, a_sum3 := a_sum2
  110     MOVNE r10, r9
  111 
  112     # load a_sum
  113     # q0: va_sum0
  114     VLD1.32 {d0[], d1[]}, [r7]
  115     # q1: va_sum1
  116     VLD1.32 {d2[], d3[]}, [r8]
  117     # q2: va_sum2
  118     VLD1.32 {d4[], d5[]}, [r9]
  119     # q3: va_sum3
  120     VLD1.32 {d6[], d7[]}, [r10]
  121 
  122     # accumulate a_sum into vacc
  123     # vacc0x0123 = vaddq_s32(vacc0x0123, va_sum0)
  124     VADD.I32 q8, q8, q0
  125     # vacc0x4567 = vaddq_s32(vacc0x4567, va_sum0)
  126     VADD.I32 q9, q9, q0
  127     # vacc1x0123 = vaddq_s32(vacc1x0123, va_sum1)
  128     VADD.I32 q10, q10, q1
  129     # vacc1x4567 = vaddq_s32(vacc1x4567, va_sum1)
  130     VADD.I32 q11, q11, q1
  131     # vacc2x0123 = vaddq_s32(vacc2x0123, va_sum2)
  132     VADD.I32 q12, q12, q2
  133     # vacc2x4567 = vaddq_s32(vacc2x4567, va_sum2)
  134     VADD.I32 q13, q13, q2
  135     # vacc3x0123 = vaddq_s32(vacc3x0123, va_sum3)
  136     VADD.I32 q14, q14, q3
  137     # vacc3x4567 = vaddq_s32(vacc3x4567, va_sum3)
  138     VADD.I32 q15, q15, q3
  139 
  140     # k -= 8
  141     SUBS r2, r2, 8
  142 
  143     BLO 1f
  144 
  145 .p2align 5
  146 0:
  147     # load a
  148     # d0 := va0x01234567
  149     VLD1.8 {d0}, [r3]!
  150 
  151     # d1 := va1x01234567
  152     VLD1.8 {d1}, [r4]!
  153 
  154     # d2 := va1x01234567
  155     VLD1.8 {d2}, [r5]!
  156 
  157     # d3 := va2x01234567
  158     VLD1.8 {d3}, [r6]!
  159 
  160     ##### k = 0, 1 #####
  161     # load b
  162     # q2 := vb01234567x01
  163     VLD1.8 {d4, d5}, [ip]!
  164 
  165     VMULL.U8 q4, d0, d4
  166     VPADAL.U16 q8, q4
  167 
  168     VMULL.U8 q5, d0, d5
  169     VPADAL.U16 q9, q5
  170 
  171     VMULL.U8 q6, d1, d4
  172     VPADAL.U16 q10, q6
  173 
  174     VMULL.U8 q7, d1, d5
  175     VPADAL.U16 q11, q7
  176 
  177     VMULL.U8 q4, d2, d4
  178     VPADAL.U16 q12, q4
  179 
  180     VMULL.U8 q5, d2, d5
  181     VPADAL.U16 q13, q5
  182 
  183     VMULL.U8 q6, d3, d4
  184     VPADAL.U16 q14, q6
  185 
  186     VMULL.U8 q7, d3, d5
  187     VPADAL.U16 q15, q7
  188 
  189     ##### k = 2, 3 #####
  190     # load b
  191     # q2 := vb01234567x01
  192     VLD1.8 {d4, d5}, [ip]!
  193 
  194     # rotate a
  195     VEXT.8 d0, d0, d0, 2
  196     VEXT.8 d1, d1, d1, 2
  197     VEXT.8 d2, d2, d2, 2
  198     VEXT.8 d3, d3, d3, 2
  199 
  200     VMULL.U8 q4, d0, d4
  201     VPADAL.U16 q8, q4
  202 
  203     VMULL.U8 q5, d0, d5
  204     VPADAL.U16 q9, q5
  205 
  206     VMULL.U8 q6, d1, d4
  207     VPADAL.U16 q10, q6
  208 
  209     VMULL.U8 q7, d1, d5
  210     VPADAL.U16 q11, q7
  211 
  212     VMULL.U8 q4, d2, d4
  213     VPADAL.U16 q12, q4
  214 
  215     VMULL.U8 q5, d2, d5
  216     VPADAL.U16 q13, q5
  217 
  218     VMULL.U8 q6, d3, d4
  219     VPADAL.U16 q14, q6
  220 
  221     VMULL.U8 q7, d3, d5
  222     VPADAL.U16 q15, q7
  223 
  224     ##### k = 4, 5 #####
  225     # load b
  226     # q2 := vb01234567x01
  227     VLD1.8 {d4, d5}, [ip]!
  228 
  229     # rotate a
  230     VEXT.8 d0, d0, d0, 2
  231     VEXT.8 d1, d1, d1, 2
  232     VEXT.8 d2, d2, d2, 2
  233     VEXT.8 d3, d3, d3, 2
  234 
  235     VMULL.U8 q4, d0, d4
  236     VPADAL.U16 q8, q4
  237 
  238     VMULL.U8 q5, d0, d5
  239     VPADAL.U16 q9, q5
  240 
  241     VMULL.U8 q6, d1, d4
  242     VPADAL.U16 q10, q6
  243 
  244     VMULL.U8 q7, d1, d5
  245     VPADAL.U16 q11, q7
  246 
  247     VMULL.U8 q4, d2, d4
  248     VPADAL.U16 q12, q4
  249 
  250     VMULL.U8 q5, d2, d5
  251     VPADAL.U16 q13, q5
  252 
  253     VMULL.U8 q6, d3, d4
  254     VPADAL.U16 q14, q6
  255 
  256     VMULL.U8 q7, d3, d5
  257     VPADAL.U16 q15, q7
  258 
  259     ##### k = 6, 7 #####
  260     # load b
  261     # q2 := vb01234567x01
  262     VLD1.8 {d4, d5}, [ip]!
  263 
  264     # rotate a
  265     VEXT.8 d0, d0, d0, 2
  266     VEXT.8 d1, d1, d1, 2
  267     VEXT.8 d2, d2, d2, 2
  268     VEXT.8 d3, d3, d3, 2
  269 
  270     VMULL.U8 q4, d0, d4
  271     VPADAL.U16 q8, q4
  272 
  273     VMULL.U8 q5, d0, d5
  274     VPADAL.U16 q9, q5
  275 
  276     VMULL.U8 q6, d1, d4
  277     VPADAL.U16 q10, q6
  278 
  279     VMULL.U8 q7, d1, d5
  280     VPADAL.U16 q11, q7
  281 
  282     VMULL.U8 q4, d2, d4
  283     VPADAL.U16 q12, q4
  284 
  285     VMULL.U8 q5, d2, d5
  286     VPADAL.U16 q13, q5
  287 
  288     VMULL.U8 q6, d3, d4
  289     VPADAL.U16 q14, q6
  290 
  291     VMULL.U8 q7, d3, d5
  292     VPADAL.U16 q15, q7
  293 
  294     # k -= 8
  295     SUBS r2, r2, 8
  296 
  297     # k >= 0, loop
  298     BHS 0b
  299 
  300 1:
  301     # k >= 4
  302     ADDS r2, 8
  303     CMP r2, 4
  304 
  305     # branch to 2f when k < 4
  306     BLO 2f
  307     SUB r2, r2, 4
  308 
  309     ##### k = 0, 1 #####
  310     # d0 := va0x01010101
  311     VLD1.16 {d0[]}, [r3]!
  312     # d1 := va1x01010101
  313     VLD1.16 {d1[]}, [r4]!
  314     # d2 := va2x01010101
  315     VLD1.16 {d2[]}, [r5]!
  316     # d3 := va3x01010101
  317     VLD1.16 {d3[]}, [r6]!
  318 
  319     # q7 := vb01234567x01
  320     VLD1.8 {d14, d15}, [ip]!
  321 
  322     # row 0
  323     VMULL.U8 q2, d0, d14
  324     VPADAL.U16 q8, q2
  325     VMULL.U8 q3, d0, d15
  326     VPADAL.U16 q9, q3
  327     # row 1
  328     VMULL.U8 q4, d1, d14
  329     VPADAL.U16 q10, q4
  330     VMULL.U8 q5, d1, d15
  331     VPADAL.U16 q11, q5
  332     # row 2
  333     VMULL.U8 q2, d2, d14
  334     VPADAL.U16 q12, q2
  335     VMULL.U8 q3, d2, d15
  336     VPADAL.U16 q13, q3
  337     # row 3
  338     VMULL.U8 q4, d3, d14
  339     VPADAL.U16 q14, q4
  340     VMULL.U8 q5, d3, d15
  341     VPADAL.U16 q15, q5
  342 
  343     ##### k = 2, 3 #####
  344     # d0 := va0x01010101
  345     VLD1.16 {d0[]}, [r3]!
  346     # d1 := va1x01010101
  347     VLD1.16 {d1[]}, [r4]!
  348     # d2 := va2x01010101
  349     VLD1.16 {d2[]}, [r5]!
  350     # d3 := va3x01010101
  351     VLD1.16 {d3[]}, [r6]!
  352 
  353     # q7 := vb01234567x01
  354     VLD1.8 {d14, d15}, [ip]!
  355 
  356     # row 0
  357     VMULL.U8 q2, d0, d14
  358     VPADAL.U16 q8, q2
  359     VMULL.U8 q3, d0, d15
  360     VPADAL.U16 q9, q3
  361     # row 1
  362     VMULL.U8 q4, d1, d14
  363     VPADAL.U16 q10, q4
  364     VMULL.U8 q5, d1, d15
  365     VPADAL.U16 q11, q5
  366     # row 2
  367     VMULL.U8 q2, d2, d14
  368     VPADAL.U16 q12, q2
  369     VMULL.U8 q3, d2, d15
  370     VPADAL.U16 q13, q3
  371     # row 3
  372     VMULL.U8 q4, d3, d14
  373     VPADAL.U16 q14, q4
  374     VMULL.U8 q5, d3, d15
  375     VPADAL.U16 q15, q5
  376 
  377 2:
  378     # k >= 2
  379     CMP r2, 2
  380     BLO 3f
  381     SUB r2, r2, 2
  382 
  383     ##### k = 0, 1 #####
  384     # d0 := va0x01010101
  385     VLD1.16 {d0[]}, [r3]!
  386     # d1 := va1x01010101
  387     VLD1.16 {d1[]}, [r4]!
  388     # d2 := va2x01010101
  389     VLD1.16 {d2[]}, [r5]!
  390     # d3 := va3x01010101
  391     VLD1.16 {d3[]}, [r6]!
  392 
  393     # q7 := vb01234567x01
  394     VLD1.8 {d14, d15}, [ip]!
  395 
  396     # row 0
  397     VMULL.U8 q2, d0, d14
  398     VPADAL.U16 q8, q2
  399     VMULL.U8 q3, d0, d15
  400     VPADAL.U16 q9, q3
  401     # row 1
  402     VMULL.U8 q4, d1, d14
  403     VPADAL.U16 q10, q4
  404     VMULL.U8 q5, d1, d15
  405     VPADAL.U16 q11, q5
  406     # row 2
  407     VMULL.U8 q2, d2, d14
  408     VPADAL.U16 q12, q2
  409     VMULL.U8 q3, d2, d15
  410     VPADAL.U16 q13, q3
  411     # row 3
  412     VMULL.U8 q4, d3, d14
  413     VPADAL.U16 q14, q4
  414     VMULL.U8 q5, d3, d15
  415     VPADAL.U16 q15, q5
  416 
  417 3:
  418     # k == 1
  419     CMP r2, 1
  420     BLO 4f
  421 
  422     # d0 := va0x01010101
  423     VLD1.8 {d0[]}, [r3]
  424     # d1 := va1x01010101
  425     VLD1.8 {d1[]}, [r4]
  426     # d2 := va2x01010101
  427     VLD1.8 {d2[]}, [r5]
  428     # d3 := va3x01010101
  429     VLD1.8 {d3[]}, [r6]
  430 
  431     # q7 := vb01234567x01
  432     VLD1.8 {d14, d15}, [ip]
  433 
  434     # row 0
  435     VMULL.U8 q2, d0, d14
  436     VPADAL.U16 q8, q2
  437     VMULL.U8 q3, d0, d15
  438     VPADAL.U16 q9, q3
  439     # row 1
  440     VMULL.U8 q4, d1, d14
  441     VPADAL.U16 q10, q4
  442     VMULL.U8 q5, d1, d15
  443     VPADAL.U16 q11, q5
  444     # row 2
  445     VMULL.U8 q2, d2, d14
  446     VPADAL.U16 q12, q2
  447     VMULL.U8 q3, d2, d15
  448     VPADAL.U16 q13, q3
  449     # row 3
  450     VMULL.U8 q4, d3, d14
  451     VPADAL.U16 q14, q4
  452     VMULL.U8 q5, d3, d15
  453     VPADAL.U16 q15, q5
  454 
  455     .p2align 4
  456 4:
  457     # Load params:
  458     # - ip = params
  459     LDR ip, [sp, 116]
  460 
  461     # Load multiplier:
  462     # - d12 = vmultiplier
  463     VLD1.32 {d12[]}, [ip]!
  464 
  465     # Load right_shift
  466     # - q4 = d8:d9 = vright_shift
  467     VLD1.32 {d8[], d9[]}, [ip]!
  468 
  469     VQRDMULH.S32  q8, q8, d12[0]
  470     VQRDMULH.S32  q9, q9, d12[0]
  471     VQRDMULH.S32 q10, q10, d12[0]
  472     VQRDMULH.S32 q11, q11, d12[0]
  473 
  474     # Compute vzero_shift_mask
  475     # - q5 = vzero_shift_mask
  476     VCEQ.S32 q5, q4, 0
  477 
  478     VQRDMULH.S32 q12, q12, d12[0]
  479     VQRDMULH.S32 q13, q13, d12[0]
  480     VQRDMULH.S32 q14, q14, d12[0]
  481     VQRDMULH.S32 q15, q15, d12[0]
  482 
  483     VBIC q0,  q8, q5
  484     VBIC q1,  q9, q5
  485     VBIC q2, q10, q5
  486     VBIC q3, q11, q5
  487 
  488     VSRA.S32  q8, q0, 31
  489     VSRA.S32  q9, q1, 31
  490     VSRA.S32 q10, q2, 31
  491     VSRA.S32 q11, q3, 31
  492 
  493     # Load zero_point
  494     # - q7 = d14:d15 = vzero_point
  495     VLD1.16 {d14[], d15[]}, [ip]!
  496 
  497     VBIC q0, q12, q5
  498     VBIC q1, q13, q5
  499     VBIC q2, q14, q5
  500     VBIC q3, q15, q5
  501 
  502     VSRA.S32 q12, q0, 31
  503     VSRA.S32 q13, q1, 31
  504     VSRA.S32 q14, q2, 31
  505     VSRA.S32 q15, q3, 31
  506 
  507     # Load max:
  508     # - q5 = d10:d11 = vmax
  509     VLD1.8 {d10[], d11[]}, [ip]!
  510 
  511     VRSHL.S32  q8,  q8, q4
  512     VRSHL.S32  q9,  q9, q4
  513     VRSHL.S32 q10, q10, q4
  514     VRSHL.S32 q11, q11, q4
  515     VRSHL.S32 q12, q12, q4
  516     VRSHL.S32 q13, q13, q4
  517     VRSHL.S32 q14, q14, q4
  518     VRSHL.S32 q15, q15, q4
  519 
  520     # Load c, c_stride:
  521     # - r2 = c
  522     # - r3 = c_stride
  523     LDRD r2, r3, [sp, 108]
  524 
  525     VQMOVN.S32 d16,  q8
  526     VQMOVN.S32 d17,  q9
  527     VQMOVN.S32 d18, q10
  528     VQMOVN.S32 d19, q11
  529     VQMOVN.S32 d20, q12
  530     VQMOVN.S32 d21, q13
  531     VQMOVN.S32 d22, q14
  532     VQMOVN.S32 d23, q15
  533 
  534     # Load min:
  535     # - q4 = q8:q9 = vmin
  536     VLD1.8 {d8[], d9[]}, [ip]!
  537     ADD r4, r2, r3
  538 
  539     VQADD.S16  q8,  q8, q7
  540     VQADD.S16  q9,  q9, q7
  541     CMP r0, 2
  542     VQADD.S16 q10, q10, q7
  543     VQADD.S16 q11, q11, q7
  544     MOVLO r4, r2
  545 
  546     VQMOVUN.S16 d16,  q8
  547     VQMOVUN.S16 d17,  q9
  548     ADD r5, r4, r3
  549     VQMOVUN.S16 d18, q10
  550     VQMOVUN.S16 d19, q11
  551     MOVLS r5, r4
  552 
  553     VMIN.U8 q8, q8, q5
  554     CMP r0, 4
  555     VMIN.U8 q9, q9, q5
  556     ADD r3, r5, r3
  557 
  558     VMAX.U8 q8, q8, q4
  559     MOVNE r3, r5
  560     CMP r1, 8
  561     VMAX.U8 q9, q9, q4
  562 
  563     BNE 5f
  564 
  565     VST1.8 {d16}, [r2]
  566     VST1.8 {d17}, [r4]
  567     VST1.8 {d18}, [r5]
  568     VST1.8 {d19}, [r3]
  569 
  570     VPOP {d8-d15}
  571     POP {r4, r5, r6, r7, r8, r9, r10, r11}
  572     BX lr
  573 
  574     .p2align 3
  575 5:
  576     CMP r1, 4
  577     BLO 6f
  578 
  579     VST1.32 {d16[0]}, [r2]!
  580     VST1.32 {d17[0]}, [r4]!
  581     VST1.32 {d18[0]}, [r5]!
  582     VST1.32 {d19[0]}, [r3]!
  583 
  584     SUB r1, 4
  585     VEXT.8 q8, q8, q8, 4
  586     VEXT.8 q9, q9, q9, 4
  587 
  588 6:
  589     CMP r1, 2
  590     BLO 7f
  591 
  592     VST1.16 {d16[0]}, [r2]!
  593     VST1.16 {d17[0]}, [r4]!
  594     VST1.16 {d18[0]}, [r5]!
  595     VST1.16 {d19[0]}, [r3]!
  596 
  597     SUB r1, 2
  598     VEXT.8 q8, q8, q8, 2
  599     VEXT.8 q9, q9, q9, 2
  600 
  601 7:
  602     TEQ r1, 0
  603     BEQ 8f
  604 
  605     VST1.8 {d16[0]}, [r2]
  606     VST1.8 {d17[0]}, [r4]
  607     VST1.8 {d18[0]}, [r5]
  608     VST1.8 {d19[0]}, [r3]
  609 8:
  610     VPOP {d8-d15}
  611     POP {r4, r5, r6, r7, r8, r9, r10, r11}
  612     BX lr
  613 
  614 END_FUNCTION pytorch_q8gemm_xzp_ukernel_4x8c2__aarch32_neon
  615 
  616 #ifdef __ELF__
  617 .section ".note.GNU-stack","",%progbits
  618 #endif