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