Function multiversioning is compatible with Arm streaming mode as long as the same calling convention is used across all function versions.

Use a text editor to create a file named streaming.c with the code below:

    

        
        
__attribute__((target_clones("sve", "simd")))
void ok_arm_streaming(void) __arm_streaming {}

__arm_locally_streaming __attribute__((target_version("sme2")))
void ok_arm_streaming(void) __arm_streaming {}

__attribute__((target_version("default")))
void ok_arm_streaming(void) __arm_streaming {}


__attribute__((target_clones("sve", "simd")))
void ok_arm_streaming_compatible(void) __arm_streaming_compatible {}

__arm_locally_streaming __attribute__((target_version("sme2")))
void ok_arm_streaming_compatible(void) __arm_streaming_compatible {}

__attribute__((target_version("default")))
void ok_arm_streaming_compatible(void) __arm_streaming_compatible {}


__arm_locally_streaming __attribute__((target_clones("sve", "simd")))
void ok_no_streaming(void) {}

__attribute__((target_version("sme2")))
void ok_no_streaming(void) {}

__attribute__((target_version("default")))
void ok_no_streaming(void) {}


__attribute__((target_clones("sve", "simd")))
void bad_mixed_streaming(void) {}

__attribute__((target_version("sme2")))
void bad_mixed_streaming(void) __arm_streaming {} // expected-error: declaration has a different calling convention

__attribute__((target_version("default")))
void bad_mixed_streaming(void) __arm_streaming_compatible {} // expected-error: declaration has a different calling convention

__arm_locally_streaming __attribute__((target_version("dotprod")))
void bad_mixed_streaming(void) __arm_streaming {} // expected-error: declaration has a different calling convention


void n_caller(void) {
  ok_arm_streaming();
  ok_arm_streaming_compatible();
  ok_no_streaming();
  bad_mixed_streaming();
}

void s_caller(void) __arm_streaming {
  ok_arm_streaming();
  ok_arm_streaming_compatible();
  ok_no_streaming();
  bad_mixed_streaming();
}

void sc_caller(void) __arm_streaming_compatible {
  ok_arm_streaming();
  ok_arm_streaming_compatible();
  ok_no_streaming();
  bad_mixed_streaming();
}

    

To compile with Clang, run:

    

        
        
clang --target=aarch64-linux-gnu -march=armv8-a+sme --rtlib=compiler-rt -c streaming.c

    
Back
Next