| 488 | |
| 489 | |
| 490 | template<typename T, typename WT> static void |
| 491 | GEMMStore( const T* c_data, size_t c_step, |
| 492 | const WT* d_buf, size_t d_buf_step, |
| 493 | T* d_data, size_t d_step, Size d_size, |
| 494 | double alpha, double beta, int flags ) |
| 495 | { |
| 496 | const T* _c_data = c_data; |
| 497 | int j; |
| 498 | size_t c_step0, c_step1; |
| 499 | |
| 500 | c_step /= sizeof(c_data[0]); |
| 501 | d_buf_step /= sizeof(d_buf[0]); |
| 502 | d_step /= sizeof(d_data[0]); |
| 503 | |
| 504 | if( !c_data ) |
| 505 | c_step0 = c_step1 = 0; |
| 506 | else if( !(flags & GEMM_3_T) ) |
| 507 | c_step0 = c_step, c_step1 = 1; |
| 508 | else |
| 509 | c_step0 = 1, c_step1 = c_step; |
| 510 | |
| 511 | for( ; d_size.height--; _c_data += c_step0, d_buf += d_buf_step, d_data += d_step ) |
| 512 | { |
| 513 | if( _c_data ) |
| 514 | { |
| 515 | c_data = _c_data; |
| 516 | j=0; |
| 517 | #if CV_ENABLE_UNROLLED |
| 518 | for(; j <= d_size.width - 4; j += 4, c_data += 4*c_step1 ) |
| 519 | { |
| 520 | WT t0 = alpha*d_buf[j]; |
| 521 | WT t1 = alpha*d_buf[j+1]; |
| 522 | t0 += beta*WT(c_data[0]); |
| 523 | t1 += beta*WT(c_data[c_step1]); |
| 524 | d_data[j] = T(t0); |
| 525 | d_data[j+1] = T(t1); |
| 526 | t0 = alpha*d_buf[j+2]; |
| 527 | t1 = alpha*d_buf[j+3]; |
| 528 | t0 += beta*WT(c_data[c_step1*2]); |
| 529 | t1 += beta*WT(c_data[c_step1*3]); |
| 530 | d_data[j+2] = T(t0); |
| 531 | d_data[j+3] = T(t1); |
| 532 | } |
| 533 | #endif |
| 534 | for( ; j < d_size.width; j++, c_data += c_step1 ) |
| 535 | { |
| 536 | WT t0 = alpha*d_buf[j]; |
| 537 | d_data[j] = T(t0 + WT(c_data[0])*beta); |
| 538 | } |
| 539 | } |
| 540 | else |
| 541 | { |
| 542 | j = 0; |
| 543 | #if CV_ENABLE_UNROLLED |
| 544 | for( ; j <= d_size.width - 4; j += 4 ) |
| 545 | { |
| 546 | WT t0 = alpha*d_buf[j]; |
| 547 | WT t1 = alpha*d_buf[j+1]; |
no outgoing calls
no test coverage detected