@@ -86,7 +86,13 @@ cfg_if! {
86
86
ao_impl( scene, nsubsamples, img) ;
87
87
}
88
88
89
- #[ target_feature( enable = "avx2" ) ]
89
+ #[ target_feature( enable = "avx,fma" ) ]
90
+ unsafe fn ao_avx_fma<S : Scene >( scene: & mut S , nsubsamples: usize ,
91
+ img: & mut :: Image ) {
92
+ ao_impl( scene, nsubsamples, img) ;
93
+ }
94
+
95
+ #[ target_feature( enable = "avx2,fma" ) ]
90
96
unsafe fn ao_avx2<S : Scene >( scene: & mut S , nsubsamples: usize ,
91
97
img: & mut :: Image ) {
92
98
ao_impl( scene, nsubsamples, img) ;
@@ -95,10 +101,14 @@ cfg_if! {
95
101
pub fn ao<S : Scene >( scene: & mut S , nsubsamples: usize ,
96
102
img: & mut :: Image ) {
97
103
unsafe {
98
- if is_x86_feature_detected!( "avx2" ) {
104
+ if is_x86_feature_detected!( "avx2" ) && is_x86_feature_detected! ( "fma" ) {
99
105
ao_avx2( scene, nsubsamples, img) ;
100
106
} else if is_x86_feature_detected!( "avx" ) {
101
- ao_avx( scene, nsubsamples, img) ;
107
+ if is_x86_feature_detected!( "fma" ) {
108
+ ao_avx_fma( scene, nsubsamples, img) ;
109
+ } else {
110
+ ao_avx( scene, nsubsamples, img) ;
111
+ }
102
112
} else if is_x86_feature_detected!( "sse4.2" ) {
103
113
ao_sse42( scene, nsubsamples, img) ;
104
114
} else {
0 commit comments