| 
														
															@@ -4,11 +4,20 @@ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 #include <arm_neon.h> 
														 | 
														
														 | 
														
															 #include <arm_neon.h> 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 #include <memory> 
														 | 
														
														 | 
														
															 #include <memory> 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															-using mnd::CpuGeneratorNeonFloat; 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-using mnd::CpuGeneratorNeonDouble; 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+using mnd::CpuGenerator; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+namespace mnd 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+{ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    template class CpuGenerator<float, mnd::ARM_NEON, false>; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    template class CpuGenerator<float, mnd::ARM_NEON, true>; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    template class CpuGenerator<double, mnd::ARM_NEON, false>; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    template class CpuGenerator<double, mnd::ARM_NEON, true>; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+} 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															-void CpuGeneratorNeonFloat::generate(const mnd::MandelInfo& info, float* data) 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+template<bool parallel> 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+void CpuGenerator<float, mnd::ARM_NEON, parallel>::generate(const mnd::MandelInfo& info, float* data) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 { 
														 | 
														
														 | 
														
															 { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     using T = float; 
														 | 
														
														 | 
														
															     using T = float; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     const MandelViewport& view = info.view; 
														 | 
														
														 | 
														
															     const MandelViewport& view = info.view; 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -71,7 +80,8 @@ void CpuGeneratorNeonFloat::generate(const mnd::MandelInfo& info, float* data) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 } 
														 | 
														
														 | 
														
															 } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															-void CpuGeneratorNeonDouble::generate(const mnd::MandelInfo& info, float* data) 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+template<bool parallel> 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+void CpuGenerator<double, mnd::ARM_NEON, parallel>::generate(const mnd::MandelInfo& info, float* data) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 { 
														 | 
														
														 | 
														
															 { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     using T = double; 
														 | 
														
														 | 
														
															     using T = double; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     const MandelViewport& view = info.view; 
														 | 
														
														 | 
														
															     const MandelViewport& view = info.view; 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -82,8 +92,8 @@ void CpuGeneratorNeonDouble::generate(const mnd::MandelInfo& info, float* data) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         long i = 0; 
														 | 
														
														 | 
														
															         long i = 0; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         for (i; i < info.bWidth; i += 2) { 
														 | 
														
														 | 
														
															         for (i; i < info.bWidth; i += 2) { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															             double xsvals[] = { 
														 | 
														
														 | 
														
															             double xsvals[] = { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-                (view.x + double(i) * view.width / info.bWidth), 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-                (view.x + double(i + 1) * view.width / info.bWidth), 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                double(view.x + double(i) * view.width / info.bWidth), 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                double(view.x + double(i + 1) * view.width / info.bWidth), 
														 | 
													
												
											
												
													
														| 
														 | 
														
															             }; 
														 | 
														
														 | 
														
															             }; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															             float64x2_t xs = vld1q_f64(xsvals); 
														 | 
														
														 | 
														
															             float64x2_t xs = vld1q_f64(xsvals); 
														 |