@@ -6601,24 +6601,31 @@ void flexiblas_chain_scopy(void* n, void* sx, void* incx, void* sy, void* incy){
6601
6601
#endif
6602
6602
6603
6603
6604
+ #define SDOT_INTERN(ret_type) \
6605
+ ret_type (*fn) (void* n, void* sx, void* incx, void* sy, void* incy); \
6606
+ ret_type (*fn_hook) (void* n, void* sx, void* incx, void* sy, void* incy); \
6607
+ if ( current_backend->post_init != 0 ) { \
6608
+ __flexiblas_backend_init(current_backend); \
6609
+ current_backend->post_init = 0; \
6610
+ } \
6611
+ *(void **) &fn = current_backend->blas.sdot.f77_blas_function; \
6612
+ *(void **) &fn_hook = __flexiblas_hooks->sdot.f77_hook_function[0]; \
6613
+ hook_pos_sdot = 0; \
6614
+ if ( fn_hook != NULL) { \
6615
+ ret = fn_hook((void*) n, (void*) sx, (void*) incx, (void*) sy, (void*) incy); \
6616
+ } else { \
6617
+ ret = fn((void*) n, (void*) sx, (void*) incx, (void*) sy, (void*) incy); \
6618
+ }
6619
+
6604
6620
static TLS_STORE uint8_t hook_pos_sdot = 0;
6605
6621
6606
6622
float FC_GLOBAL(sdot,SDOT)(blasint* n, float* sx, blasint* incx, float* sy, blasint* incy)
6607
6623
{
6608
- float (*fn) (void* n, void* sx, void* incx, void* sy, void* incy);
6609
- float (*fn_hook) (void* n, void* sx, void* incx, void* sy, void* incy);
6610
6624
float ret;
6611
- if ( current_backend->post_init != 0 ) {
6612
- __flexiblas_backend_init(current_backend);
6613
- current_backend->post_init = 0;
6614
- }
6615
- *(void **) &fn = current_backend->blas.sdot.f77_blas_function;
6616
- *(void **) &fn_hook = __flexiblas_hooks->sdot.f77_hook_function[0];
6617
- hook_pos_sdot = 0;
6618
- if ( fn_hook != NULL) {
6619
- ret = fn_hook((void*) n, (void*) sx, (void*) incx, (void*) sy, (void*) incy);
6625
+ if (current_backend->info.float_function_defect) {
6626
+ SDOT_INTERN(double)
6620
6627
} else {
6621
- ret = fn((void*) n, (void*) sx, (void*) incx, (void*) sy, (void*) incy);
6628
+ SDOT_INTERN(float)
6622
6629
}
6623
6630
return ret;
6624
6631
}
@@ -6636,14 +6643,20 @@ float FC_GLOBAL3(sdot,SDOT)(blasint* n, float* sx, blasint* incx, float* sy, bla
6636
6643
#endif
6637
6644
6638
6645
6646
+ #define REAL_SDOT_INTERN(ret_type) \
6647
+ ret_type (*fn) (void* n, void* sx, void* incx, void* sy, void* incy); \
6648
+ \
6649
+ *(void **) &fn = current_backend->blas.sdot.f77_blas_function; \
6650
+ ret = fn((void*) n, (void*) sx, (void*) incx, (void*) sy, (void*) incy);
6639
6651
6640
6652
float flexiblas_real_sdot_(void* n, void* sx, void* incx, void* sy, void* incy)
6641
6653
{
6642
- float (*fn) (void* n, void* sx, void* incx, void* sy, void* incy);
6643
6654
float ret;
6644
-
6645
- *(void **) &fn = current_backend->blas.sdot.f77_blas_function;
6646
- ret = fn((void*) n, (void*) sx, (void*) incx, (void*) sy, (void*) incy);
6655
+ if (current_backend->info.float_function_defect) {
6656
+ REAL_SDOT_INTERN(double)
6657
+ } else {
6658
+ REAL_SDOT_INTERN(float)
6659
+ }
6647
6660
6648
6661
return ret;
6649
6662
}
@@ -6653,22 +6666,26 @@ float flexiblas_real_sdot(void* n, void* sx, void* incx, void* sy, void* incy) _
6653
6666
float flexiblas_real_sdot(void* n, void* sx, void* incx, void* sy, void* incy){return flexiblas_real_sdot_((void*) n, (void*) sx, (void*) incx, (void*) sy, (void*) incy);}
6654
6667
#endif
6655
6668
6669
+ #define CHAIN_SDOT_INTERN(ret_type) \
6670
+ ret_type (*fn) (void* n, void* sx, void* incx, void* sy, void* incy); \
6671
+ \
6672
+ hook_pos_sdot++; \
6673
+ if ( hook_pos_sdot < __flexiblas_hooks->sdot.nhook ) { \
6674
+ *(void **) &fn = __flexiblas_hooks->sdot.f77_hook_function[hook_pos_sdot]; \
6675
+ } else { \
6676
+ hook_pos_sdot = 0; \
6677
+ *(void **) &fn = current_backend->blas.sdot.f77_blas_function; \
6678
+ } \
6679
+ ret = fn((void*) n, (void*) sx, (void*) incx, (void*) sy, (void*) incy);
6656
6680
6657
6681
float flexiblas_chain_sdot_(void* n, void* sx, void* incx, void* sy, void* incy)
6658
6682
{
6659
- float (*fn) (void* n, void* sx, void* incx, void* sy, void* incy);
6660
6683
float ret;
6661
-
6662
-
6663
-
6664
- hook_pos_sdot++;
6665
- if ( hook_pos_sdot < __flexiblas_hooks->sdot.nhook ) {
6666
- *(void **) &fn = __flexiblas_hooks->sdot.f77_hook_function[hook_pos_sdot];
6684
+ if (current_backend->info.float_function_defect) {
6685
+ CHAIN_SDOT_INTERN(double)
6667
6686
} else {
6668
- hook_pos_sdot = 0;
6669
- *(void **) &fn = current_backend->blas.sdot.f77_blas_function;
6687
+ CHAIN_SDOT_INTERN(float)
6670
6688
}
6671
- ret = fn((void*) n, (void*) sx, (void*) incx, (void*) sy, (void*) incy);
6672
6689
6673
6690
return ret;
6674
6691
}
0 commit comments