| 
									
										
										
										
											2020-10-10 14:16:11 +02:00
										 |  |  | # typed: false | 
					
						
							| 
									
										
										
										
											2019-04-19 15:38:03 +09:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-25 18:00:01 +01:00
										 |  |  | module Hardware | 
					
						
							|  |  |  |   class CPU | 
					
						
							| 
									
										
										
										
											2016-05-09 09:41:30 +02:00
										 |  |  |     class << self | 
					
						
							| 
									
										
										
										
											2019-05-06 14:34:35 +09:00
										 |  |  |       def optimization_flags | 
					
						
							| 
									
										
										
										
											2020-04-30 16:50:13 +10:00
										 |  |  |         @optimization_flags ||= begin | 
					
						
							|  |  |  |           flags = generic_optimization_flags.dup | 
					
						
							|  |  |  |           flags[:native] = arch_flag(Homebrew::EnvConfig.arch) | 
					
						
							|  |  |  |           flags | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2019-05-06 14:34:35 +09:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-09 09:41:30 +02:00
										 |  |  |       def family | 
					
						
							| 
									
										
										
										
											2016-07-29 20:02:26 -06:00
										 |  |  |         return :arm if arm? | 
					
						
							| 
									
										
										
										
											2017-11-29 11:44:59 -08:00
										 |  |  |         return :ppc if ppc? | 
					
						
							| 
									
										
										
										
											2016-07-29 20:02:26 -06:00
										 |  |  |         return :dunno unless intel? | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-29 20:02:26 -06:00
										 |  |  |         # See https://software.intel.com/en-us/articles/intel-architecture-and-processor-identification-with-cpuid-model-and-family-numbers | 
					
						
							| 
									
										
										
										
											2020-06-25 11:20:57 +01:00
										 |  |  |         # and https://github.com/llvm-mirror/llvm/blob/HEAD/lib/Support/Host.cpp | 
					
						
							| 
									
										
										
										
											2018-10-01 09:44:59 -07:00
										 |  |  |         # and https://en.wikipedia.org/wiki/List_of_Intel_CPU_microarchitectures#Roadmap | 
					
						
							| 
									
										
										
										
											2016-07-29 20:02:26 -06:00
										 |  |  |         cpu_family = cpuinfo[/^cpu family\s*: ([0-9]+)/, 1].to_i | 
					
						
							|  |  |  |         cpu_model = cpuinfo[/^model\s*: ([0-9]+)/, 1].to_i | 
					
						
							| 
									
										
										
										
											2018-10-01 09:44:59 -07:00
										 |  |  |         unknown = :"unknown_0x#{cpu_family.to_s(16)}_0x#{cpu_model.to_s(16)}" | 
					
						
							| 
									
										
										
										
											2016-07-29 20:02:26 -06:00
										 |  |  |         case cpu_family | 
					
						
							|  |  |  |         when 0x06
 | 
					
						
							|  |  |  |           case cpu_model | 
					
						
							|  |  |  |           when 0x3a, 0x3e
 | 
					
						
							|  |  |  |             :ivybridge | 
					
						
							|  |  |  |           when 0x2a, 0x2d
 | 
					
						
							|  |  |  |             :sandybridge | 
					
						
							|  |  |  |           when 0x25, 0x2c, 0x2f
 | 
					
						
							|  |  |  |             :westmere | 
					
						
							|  |  |  |           when 0x1e, 0x1a, 0x2e
 | 
					
						
							|  |  |  |             :nehalem | 
					
						
							|  |  |  |           when 0x17, 0x1d
 | 
					
						
							|  |  |  |             :penryn | 
					
						
							|  |  |  |           when 0x0f, 0x16
 | 
					
						
							|  |  |  |             :merom | 
					
						
							|  |  |  |           when 0x0d
 | 
					
						
							|  |  |  |             :dothan | 
					
						
							| 
									
										
										
										
											2020-02-11 12:14:14 +11:00
										 |  |  |           when 0x1c, 0x26, 0x27, 0x35, 0x36
 | 
					
						
							| 
									
										
										
										
											2016-07-29 20:02:26 -06:00
										 |  |  |             :atom | 
					
						
							| 
									
										
										
										
											2020-02-11 12:14:14 +11:00
										 |  |  |           when 0x3c, 0x3f, 0x45, 0x46
 | 
					
						
							| 
									
										
										
										
											2016-07-29 20:02:26 -06:00
										 |  |  |             :haswell | 
					
						
							|  |  |  |           when 0x3d, 0x47, 0x4f, 0x56
 | 
					
						
							|  |  |  |             :broadwell | 
					
						
							| 
									
										
										
										
											2018-10-01 09:44:59 -07:00
										 |  |  |           when 0x4e, 0x55, 0x5e, 0x8e, 0x9e
 | 
					
						
							| 
									
										
										
										
											2017-03-10 16:32:41 -06:00
										 |  |  |             :skylake | 
					
						
							| 
									
										
										
										
											2020-02-11 12:14:14 +11:00
										 |  |  |           when 0x66
 | 
					
						
							|  |  |  |             :cannonlake | 
					
						
							|  |  |  |           when 0x6a, 0x6c, 0x7d, 0x7e
 | 
					
						
							|  |  |  |             :icelake | 
					
						
							| 
									
										
										
										
											2016-07-29 20:02:26 -06:00
										 |  |  |           else | 
					
						
							| 
									
										
										
										
											2018-10-01 09:44:59 -07:00
										 |  |  |             unknown | 
					
						
							| 
									
										
										
										
											2016-07-29 20:02:26 -06:00
										 |  |  |           end | 
					
						
							|  |  |  |         when 0x0f
 | 
					
						
							|  |  |  |           case cpu_model | 
					
						
							|  |  |  |           when 0x06
 | 
					
						
							|  |  |  |             :presler | 
					
						
							|  |  |  |           when 0x03, 0x04
 | 
					
						
							|  |  |  |             :prescott | 
					
						
							|  |  |  |           else | 
					
						
							| 
									
										
										
										
											2018-10-01 09:44:59 -07:00
										 |  |  |             unknown | 
					
						
							| 
									
										
										
										
											2016-07-29 20:02:26 -06:00
										 |  |  |           end | 
					
						
							|  |  |  |         else | 
					
						
							| 
									
										
										
										
											2018-10-01 09:44:59 -07:00
										 |  |  |           unknown | 
					
						
							| 
									
										
										
										
											2016-07-29 20:02:26 -06:00
										 |  |  |         end | 
					
						
							| 
									
										
										
										
											2016-05-09 09:41:30 +02:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2016-04-25 18:00:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-09 09:41:30 +02:00
										 |  |  |       def flags | 
					
						
							| 
									
										
										
										
											2017-11-29 11:44:59 -08:00
										 |  |  |         @flags ||= cpuinfo[/^(flags|Features).*/, 0]&.split | 
					
						
							|  |  |  |         @flags ||= [] | 
					
						
							| 
									
										
										
										
											2016-05-09 09:41:30 +02:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2016-04-25 18:00:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-09 09:41:30 +02:00
										 |  |  |       # Compatibility with Mac method, which returns lowercase symbols | 
					
						
							| 
									
										
										
										
											2020-11-05 17:17:03 -05:00
										 |  |  |       # instead of strings. | 
					
						
							| 
									
										
										
										
											2016-05-09 09:41:30 +02:00
										 |  |  |       def features | 
					
						
							| 
									
										
										
										
											2020-05-12 08:32:27 +01:00
										 |  |  |         @features ||= flags[1..].map(&:intern) | 
					
						
							| 
									
										
										
										
											2016-05-09 09:41:30 +02:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2016-04-25 18:00:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-22 11:19:24 +02:00
										 |  |  |       %w[aes altivec avx avx2 lm ssse3 sse4_2].each do |flag| | 
					
						
							| 
									
										
										
										
											2020-08-19 17:12:32 +01:00
										 |  |  |         define_method("#{flag}?") { flags.include? flag } | 
					
						
							| 
									
										
										
										
											2016-05-09 09:41:30 +02:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2017-07-05 12:36:39 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |       def sse3? | 
					
						
							|  |  |  |         flags.include?("pni") || flags.include?("sse3") | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-22 11:19:24 +02:00
										 |  |  |       def sse4? | 
					
						
							|  |  |  |         flags.include? "sse4_1" | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2020-08-09 03:23:53 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |       private | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       def cpuinfo | 
					
						
							|  |  |  |         @cpuinfo ||= File.read("/proc/cpuinfo") | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2016-04-25 18:00:01 +01:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |