1d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers/* 2d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers * Copyright (C) 2014 The Android Open Source Project 3d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers * 4d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers * Licensed under the Apache License, Version 2.0 (the "License"); 5d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers * you may not use this file except in compliance with the License. 6d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers * You may obtain a copy of the License at 7d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers * 8d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers * http://www.apache.org/licenses/LICENSE-2.0 9d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers * 10d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers * Unless required by applicable law or agreed to in writing, software 11d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers * distributed under the License is distributed on an "AS IS" BASIS, 12d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers * See the License for the specific language governing permissions and 14d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers * limitations under the License. 15d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers */ 16d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers 17d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers#include "instruction_set_features_x86.h" 18d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers 19d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers#include <gtest/gtest.h> 20d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers 21d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogersnamespace art { 22d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers 23d582fa4ea62083a7598dded5b82dc2198b3daac7Ian RogersTEST(X86InstructionSetFeaturesTest, X86FeaturesFromDefaultVariant) { 24d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers std::string error_msg; 25d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers std::unique_ptr<const InstructionSetFeatures> x86_features( 26d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers InstructionSetFeatures::FromVariant(kX86, "default", &error_msg)); 27d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers ASSERT_TRUE(x86_features.get() != nullptr) << error_msg; 28d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers EXPECT_EQ(x86_features->GetInstructionSet(), kX86); 29d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers EXPECT_TRUE(x86_features->Equals(x86_features.get())); 303f67e692860d281858485d48a4f1f81b907f1444Aart Bik EXPECT_STREQ("smp,-ssse3,-sse4.1,-sse4.2,-avx,-avx2,-lock_add,-popcnt", 3117077d888a6752a2e5f8161eee1b2c3285783d12Mark P Mendell x86_features->GetFeatureString().c_str()); 32d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers EXPECT_EQ(x86_features->AsBitmap(), 1U); 33d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers} 34d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers 35d582fa4ea62083a7598dded5b82dc2198b3daac7Ian RogersTEST(X86InstructionSetFeaturesTest, X86FeaturesFromAtomVariant) { 36d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers // Build features for a 32-bit x86 atom processor. 37d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers std::string error_msg; 38d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers std::unique_ptr<const InstructionSetFeatures> x86_features( 39d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers InstructionSetFeatures::FromVariant(kX86, "atom", &error_msg)); 40d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers ASSERT_TRUE(x86_features.get() != nullptr) << error_msg; 41d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers EXPECT_EQ(x86_features->GetInstructionSet(), kX86); 42d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers EXPECT_TRUE(x86_features->Equals(x86_features.get())); 433f67e692860d281858485d48a4f1f81b907f1444Aart Bik EXPECT_STREQ("smp,ssse3,-sse4.1,-sse4.2,-avx,-avx2,lock_add,-popcnt", 4417077d888a6752a2e5f8161eee1b2c3285783d12Mark P Mendell x86_features->GetFeatureString().c_str()); 4517077d888a6752a2e5f8161eee1b2c3285783d12Mark P Mendell EXPECT_EQ(x86_features->AsBitmap(), 67U); 46d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers 47d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers // Build features for a 32-bit x86 default processor. 48d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers std::unique_ptr<const InstructionSetFeatures> x86_default_features( 49d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers InstructionSetFeatures::FromVariant(kX86, "default", &error_msg)); 50d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers ASSERT_TRUE(x86_default_features.get() != nullptr) << error_msg; 51d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers EXPECT_EQ(x86_default_features->GetInstructionSet(), kX86); 52d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers EXPECT_TRUE(x86_default_features->Equals(x86_default_features.get())); 533f67e692860d281858485d48a4f1f81b907f1444Aart Bik EXPECT_STREQ("smp,-ssse3,-sse4.1,-sse4.2,-avx,-avx2,-lock_add,-popcnt", 54d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers x86_default_features->GetFeatureString().c_str()); 55d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers EXPECT_EQ(x86_default_features->AsBitmap(), 1U); 56d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers 57d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers // Build features for a 64-bit x86-64 atom processor. 58d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers std::unique_ptr<const InstructionSetFeatures> x86_64_features( 59d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers InstructionSetFeatures::FromVariant(kX86_64, "atom", &error_msg)); 60d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers ASSERT_TRUE(x86_64_features.get() != nullptr) << error_msg; 61d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers EXPECT_EQ(x86_64_features->GetInstructionSet(), kX86_64); 62d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers EXPECT_TRUE(x86_64_features->Equals(x86_64_features.get())); 633f67e692860d281858485d48a4f1f81b907f1444Aart Bik EXPECT_STREQ("smp,ssse3,-sse4.1,-sse4.2,-avx,-avx2,lock_add,-popcnt", 64d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers x86_64_features->GetFeatureString().c_str()); 6517077d888a6752a2e5f8161eee1b2c3285783d12Mark P Mendell EXPECT_EQ(x86_64_features->AsBitmap(), 67U); 66d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers 67d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers EXPECT_FALSE(x86_64_features->Equals(x86_features.get())); 68d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers EXPECT_FALSE(x86_64_features->Equals(x86_default_features.get())); 69d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers EXPECT_FALSE(x86_features->Equals(x86_default_features.get())); 70d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers} 71d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers 7224a05f449a6b4b0e4944c2055f0c7490d6a09861Andreas GampeTEST(X86InstructionSetFeaturesTest, X86FeaturesFromSilvermontVariant) { 7324a05f449a6b4b0e4944c2055f0c7490d6a09861Andreas Gampe // Build features for a 32-bit x86 silvermont processor. 7424a05f449a6b4b0e4944c2055f0c7490d6a09861Andreas Gampe std::string error_msg; 7524a05f449a6b4b0e4944c2055f0c7490d6a09861Andreas Gampe std::unique_ptr<const InstructionSetFeatures> x86_features( 7624a05f449a6b4b0e4944c2055f0c7490d6a09861Andreas Gampe InstructionSetFeatures::FromVariant(kX86, "silvermont", &error_msg)); 7724a05f449a6b4b0e4944c2055f0c7490d6a09861Andreas Gampe ASSERT_TRUE(x86_features.get() != nullptr) << error_msg; 7824a05f449a6b4b0e4944c2055f0c7490d6a09861Andreas Gampe EXPECT_EQ(x86_features->GetInstructionSet(), kX86); 7924a05f449a6b4b0e4944c2055f0c7490d6a09861Andreas Gampe EXPECT_TRUE(x86_features->Equals(x86_features.get())); 803f67e692860d281858485d48a4f1f81b907f1444Aart Bik EXPECT_STREQ("smp,ssse3,sse4.1,sse4.2,-avx,-avx2,lock_add,popcnt", 8117077d888a6752a2e5f8161eee1b2c3285783d12Mark P Mendell x86_features->GetFeatureString().c_str()); 823f67e692860d281858485d48a4f1f81b907f1444Aart Bik EXPECT_EQ(x86_features->AsBitmap(), 207U); 8324a05f449a6b4b0e4944c2055f0c7490d6a09861Andreas Gampe 8424a05f449a6b4b0e4944c2055f0c7490d6a09861Andreas Gampe // Build features for a 32-bit x86 default processor. 8524a05f449a6b4b0e4944c2055f0c7490d6a09861Andreas Gampe std::unique_ptr<const InstructionSetFeatures> x86_default_features( 8624a05f449a6b4b0e4944c2055f0c7490d6a09861Andreas Gampe InstructionSetFeatures::FromVariant(kX86, "default", &error_msg)); 8724a05f449a6b4b0e4944c2055f0c7490d6a09861Andreas Gampe ASSERT_TRUE(x86_default_features.get() != nullptr) << error_msg; 8824a05f449a6b4b0e4944c2055f0c7490d6a09861Andreas Gampe EXPECT_EQ(x86_default_features->GetInstructionSet(), kX86); 8924a05f449a6b4b0e4944c2055f0c7490d6a09861Andreas Gampe EXPECT_TRUE(x86_default_features->Equals(x86_default_features.get())); 903f67e692860d281858485d48a4f1f81b907f1444Aart Bik EXPECT_STREQ("smp,-ssse3,-sse4.1,-sse4.2,-avx,-avx2,-lock_add,-popcnt", 9124a05f449a6b4b0e4944c2055f0c7490d6a09861Andreas Gampe x86_default_features->GetFeatureString().c_str()); 9224a05f449a6b4b0e4944c2055f0c7490d6a09861Andreas Gampe EXPECT_EQ(x86_default_features->AsBitmap(), 1U); 9324a05f449a6b4b0e4944c2055f0c7490d6a09861Andreas Gampe 9424a05f449a6b4b0e4944c2055f0c7490d6a09861Andreas Gampe // Build features for a 64-bit x86-64 silvermont processor. 9524a05f449a6b4b0e4944c2055f0c7490d6a09861Andreas Gampe std::unique_ptr<const InstructionSetFeatures> x86_64_features( 9624a05f449a6b4b0e4944c2055f0c7490d6a09861Andreas Gampe InstructionSetFeatures::FromVariant(kX86_64, "silvermont", &error_msg)); 9724a05f449a6b4b0e4944c2055f0c7490d6a09861Andreas Gampe ASSERT_TRUE(x86_64_features.get() != nullptr) << error_msg; 9824a05f449a6b4b0e4944c2055f0c7490d6a09861Andreas Gampe EXPECT_EQ(x86_64_features->GetInstructionSet(), kX86_64); 9924a05f449a6b4b0e4944c2055f0c7490d6a09861Andreas Gampe EXPECT_TRUE(x86_64_features->Equals(x86_64_features.get())); 1003f67e692860d281858485d48a4f1f81b907f1444Aart Bik EXPECT_STREQ("smp,ssse3,sse4.1,sse4.2,-avx,-avx2,lock_add,popcnt", 10124a05f449a6b4b0e4944c2055f0c7490d6a09861Andreas Gampe x86_64_features->GetFeatureString().c_str()); 1023f67e692860d281858485d48a4f1f81b907f1444Aart Bik EXPECT_EQ(x86_64_features->AsBitmap(), 207U); 10324a05f449a6b4b0e4944c2055f0c7490d6a09861Andreas Gampe 10424a05f449a6b4b0e4944c2055f0c7490d6a09861Andreas Gampe EXPECT_FALSE(x86_64_features->Equals(x86_features.get())); 10524a05f449a6b4b0e4944c2055f0c7490d6a09861Andreas Gampe EXPECT_FALSE(x86_64_features->Equals(x86_default_features.get())); 10624a05f449a6b4b0e4944c2055f0c7490d6a09861Andreas Gampe EXPECT_FALSE(x86_features->Equals(x86_default_features.get())); 10724a05f449a6b4b0e4944c2055f0c7490d6a09861Andreas Gampe} 10824a05f449a6b4b0e4944c2055f0c7490d6a09861Andreas Gampe 109d582fa4ea62083a7598dded5b82dc2198b3daac7Ian Rogers} // namespace art 110