1 /*
2 
3     Copyright (C) 2014, The University of Texas at Austin
4 
5     This file is part of libflame and is available under the 3-Clause
6     BSD license, which can be found in the LICENSE file at the top-level
7     directory, or at http://opensource.org/licenses/BSD-3-Clause
8 
9 */
10 
11 #include "FLAME.h"
12 
FLA_Sylv_hn_blk_var17(FLA_Obj isgn,FLA_Obj A,FLA_Obj B,FLA_Obj C,FLA_Obj scale,fla_sylv_t * cntl)13 FLA_Error FLA_Sylv_hn_blk_var17( FLA_Obj isgn, FLA_Obj A, FLA_Obj B, FLA_Obj C, FLA_Obj scale, fla_sylv_t* cntl )
14 {
15   FLA_Obj BTL,   BTR,      B00, B01, B02,
16           BBL,   BBR,      B10, B11, B12,
17                            B20, B21, B22;
18 
19   FLA_Obj CL,    CR,       C0,  C1,  C2;
20 
21   dim_t b;
22 
23   FLA_Part_2x2( B,    &BTL, &BTR,
24                       &BBL, &BBR,     0, 0, FLA_TL );
25 
26   FLA_Part_1x2( C,    &CL,  &CR,      0, FLA_LEFT );
27 
28   while ( FLA_Obj_length( BTL ) < FLA_Obj_length( B ) ){
29 
30     b = FLA_Determine_blocksize( CR, FLA_RIGHT, FLA_Cntl_blocksize( cntl ) );
31 
32     FLA_Repart_2x2_to_3x3( BTL, /**/ BTR,       &B00, /**/ &B01, &B02,
33                         /* ************* */   /* ******************** */
34                                                 &B10, /**/ &B11, &B12,
35                            BBL, /**/ BBR,       &B20, /**/ &B21, &B22,
36                            b, b, FLA_BR );
37 
38     FLA_Repart_1x2_to_1x3( CL,  /**/ CR,        &C0, /**/ &C1, &C2,
39                            b, FLA_RIGHT );
40 
41     // Loop Invariant:
42     // CL =
43     // CR =
44 
45     /*------------------------------------------------------------*/
46 
47     // C1 = sylv( A', B11, C1 -/+ C0 * B01 );
48     FLA_Gemm_internal( FLA_NO_TRANSPOSE, FLA_NO_TRANSPOSE,
49                        FLA_NEGATE( isgn ), C0, B01, FLA_ONE, C1,
50                        FLA_Cntl_sub_gemm1( cntl ) );
51 
52     FLA_Sylv_internal( FLA_CONJ_TRANSPOSE, FLA_NO_TRANSPOSE,
53                        isgn, A, B11, C1, scale,
54                        FLA_Cntl_sub_sylv1( cntl ) );
55 
56     /*------------------------------------------------------------*/
57 
58     FLA_Cont_with_3x3_to_2x2( &BTL, /**/ &BTR,       B00, B01, /**/ B02,
59                                                      B10, B11, /**/ B12,
60                             /* ************** */  /* ****************** */
61                               &BBL, /**/ &BBR,       B20, B21, /**/ B22,
62                               FLA_TL );
63 
64     FLA_Cont_with_1x3_to_1x2( &CL,  /**/ &CR,        C0, C1, /**/ C2,
65                               FLA_LEFT );
66   }
67 
68   return FLA_SUCCESS;
69 }
70