| 
					
				 | 
			
			
				@@ -4,11 +4,20 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include <arm_neon.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #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; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     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; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     const MandelViewport& view = info.view; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -82,8 +92,8 @@ void CpuGeneratorNeonDouble::generate(const mnd::MandelInfo& info, float* data) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         long i = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         for (i; i < info.bWidth; i += 2) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             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); 
			 |