| /* Copyright 2019 Google LLC. All Rights Reserved. |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| ==============================================================================*/ |
| |
| #include "context.h" |
| |
| #include "check_macros.h" |
| #include "detect_dotprod.h" |
| |
| namespace ruy { |
| |
| void Context::SetRuntimeEnabledPaths(Path paths) { |
| runtime_enabled_paths_ = paths; |
| } |
| |
| Path Context::GetRuntimeEnabledPaths() { |
| // This function should always return the same value on a given machine. |
| // When runtime_enabled_paths_ has its initial value kNone, it performs |
| // some platform detection to resolve it to specific Path values. |
| |
| // Fast path: already resolved. |
| if (runtime_enabled_paths_ != Path::kNone) { |
| return runtime_enabled_paths_; |
| } |
| |
| // Need to resolve now. Start by considering all paths enabled. |
| runtime_enabled_paths_ = kAllPaths; |
| |
| // Now selectively disable paths that aren't supported on this machine. |
| if ((runtime_enabled_paths_ & Path::kNeonDotprod) != Path::kNone) { |
| if (!DetectDotprod()) { |
| runtime_enabled_paths_ = runtime_enabled_paths_ ^ Path::kNeonDotprod; |
| // Sanity check. |
| RUY_DCHECK((runtime_enabled_paths_ & Path::kNeonDotprod) == Path::kNone); |
| } |
| } |
| |
| // Sanity check. We can't possibly have disabled all paths, as some paths |
| // are universally available (kReference, kStandardCpp). |
| RUY_DCHECK(runtime_enabled_paths_ != Path::kNone); |
| return runtime_enabled_paths_; |
| } |
| |
| } // namespace ruy |