@@ -642,35 +642,46 @@ function _bibimul!(C, A, B, _add::MulAddMul)
642642end
643643function _bibimul_nonzeroalpha! (C, A, B, _add)
644644 n = size (A,1 )
645- if n <= 3
645+ if n == 1
646646 # naive multiplication
647- for I in CartesianIndices (C)
648- C[I] += _add (sum (A[I[1 ], k] * B[k, I[2 ]] for k in axes (A,2 )))
649- end
647+ @inbounds C[1 ,1 ] += _add (A[1 ,1 ] * B[1 ,1 ])
650648 return C
651649 end
652650 @inbounds begin
653651 # first column of C
654652 C[1 ,1 ] += _add (A[1 ,1 ]* B[1 ,1 ] + A[1 , 2 ]* B[2 ,1 ])
655653 C[2 ,1 ] += _add (A[2 ,1 ]* B[1 ,1 ] + A[2 ,2 ]* B[2 ,1 ])
656- C[3 ,1 ] += _add (A[3 ,2 ]* B[2 ,1 ])
654+ if n >= 3
655+ C[3 ,1 ] += _add (A[3 ,2 ]* B[2 ,1 ])
656+ end
657657 # second column of C
658658 C[1 ,2 ] += _add (A[1 ,1 ]* B[1 ,2 ] + A[1 ,2 ]* B[2 ,2 ])
659- C[2 ,2 ] += _add (A[2 ,1 ]* B[1 ,2 ] + A[2 ,2 ]* B[2 ,2 ] + A[2 ,3 ]* B[3 ,2 ])
660- C[3 ,2 ] += _add (A[3 ,2 ]* B[2 ,2 ] + A[3 ,3 ]* B[3 ,2 ])
661- C[4 ,2 ] += _add (A[4 ,3 ]* B[3 ,2 ])
659+ C22 = A[2 ,1 ]* B[1 ,2 ] + A[2 ,2 ]* B[2 ,2 ]
660+ if n >= 3
661+ C[2 ,2 ] += _add (C22 + A[2 ,3 ]* B[3 ,2 ])
662+ C[3 ,2 ] += _add (A[3 ,2 ]* B[2 ,2 ] + A[3 ,3 ]* B[3 ,2 ])
663+ if n >= 4
664+ C[4 ,2 ] += _add (A[4 ,3 ]* B[3 ,2 ])
665+ end
666+ else
667+ C[2 ,2 ] += _add (C22)
668+ end
662669 end # inbounds
663670 # middle columns
664671 __bibimul! (C, A, B, _add)
665672 @inbounds begin
666- C[n- 3 ,n- 1 ] += _add (A[n- 3 ,n- 2 ]* B[n- 2 ,n- 1 ])
667- C[n- 2 ,n- 1 ] += _add (A[n- 2 ,n- 2 ]* B[n- 2 ,n- 1 ] + A[n- 2 ,n- 1 ]* B[n- 1 ,n- 1 ])
668- C[n- 1 ,n- 1 ] += _add (A[n- 1 ,n- 2 ]* B[n- 2 ,n- 1 ] + A[n- 1 ,n- 1 ]* B[n- 1 ,n- 1 ] + A[n- 1 ,n]* B[n,n- 1 ])
669- C[n, n- 1 ] += _add (A[n,n- 1 ]* B[n- 1 ,n- 1 ] + A[n,n]* B[n,n- 1 ])
673+ if n >= 4
674+ C[n- 3 ,n- 1 ] += _add (A[n- 3 ,n- 2 ]* B[n- 2 ,n- 1 ])
675+ C[n- 2 ,n- 1 ] += _add (A[n- 2 ,n- 2 ]* B[n- 2 ,n- 1 ] + A[n- 2 ,n- 1 ]* B[n- 1 ,n- 1 ])
676+ C[n- 1 ,n- 1 ] += _add (A[n- 1 ,n- 2 ]* B[n- 2 ,n- 1 ] + A[n- 1 ,n- 1 ]* B[n- 1 ,n- 1 ] + A[n- 1 ,n]* B[n,n- 1 ])
677+ C[n, n- 1 ] += _add (A[n,n- 1 ]* B[n- 1 ,n- 1 ] + A[n,n]* B[n,n- 1 ])
678+ end
670679 # last column of C
671- C[n- 2 , n] += _add (A[n- 2 ,n- 1 ]* B[n- 1 ,n])
672- C[n- 1 , n] += _add (A[n- 1 ,n- 1 ]* B[n- 1 ,n ] + A[n- 1 ,n]* B[n,n ])
673- C[n, n] += _add (A[n,n- 1 ]* B[n- 1 ,n ] + A[n,n]* B[n,n ])
680+ if n >= 3
681+ C[n- 2 , n] += _add (A[n- 2 ,n- 1 ]* B[n- 1 ,n])
682+ C[n- 1 , n] += _add (A[n- 1 ,n- 1 ]* B[n- 1 ,n ] + A[n- 1 ,n]* B[n,n ])
683+ C[n, n] += _add (A[n,n- 1 ]* B[n- 1 ,n ] + A[n,n]* B[n,n ])
684+ end
674685 end # inbounds
675686 C
676687end
0 commit comments