1 // Copyright (c) 2015-2016 The Khronos Group Inc.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 // Assembler tests for instructions in the "Group Instrucions" section of the
16 // SPIR-V spec.
17
18 #include <string>
19 #include <vector>
20
21 #include "gmock/gmock.h"
22 #include "test/test_fixture.h"
23 #include "test/unit_spirv.h"
24
25 namespace spvtools {
26 namespace {
27
28 using spvtest::EnumCase;
29 using spvtest::MakeInstruction;
30 using ::testing::Eq;
31
32 // Test GroupOperation enum
33
34 using GroupOperationTest = spvtest::TextToBinaryTestBase<
35 ::testing::TestWithParam<EnumCase<SpvGroupOperation>>>;
36
TEST_P(GroupOperationTest,AnyGroupOperation)37 TEST_P(GroupOperationTest, AnyGroupOperation) {
38 const std::string input =
39 "%result = OpGroupIAdd %type %scope " + GetParam().name() + " %x";
40 EXPECT_THAT(
41 CompiledInstructions(input),
42 Eq(MakeInstruction(SpvOpGroupIAdd, {1, 2, 3, GetParam().value(), 4})));
43 }
44
45 // clang-format off
46 #define CASE(NAME) { SpvGroupOperation##NAME, #NAME}
47 INSTANTIATE_TEST_SUITE_P(TextToBinaryGroupOperation, GroupOperationTest,
48 ::testing::ValuesIn(std::vector<EnumCase<SpvGroupOperation>>{
49 CASE(Reduce),
50 CASE(InclusiveScan),
51 CASE(ExclusiveScan),
52 }));
53 #undef CASE
54 // clang-format on
55
TEST_F(GroupOperationTest,WrongGroupOperation)56 TEST_F(GroupOperationTest, WrongGroupOperation) {
57 EXPECT_THAT(CompileFailure("%r = OpGroupUMin %t %e xxyyzz %x"),
58 Eq("Invalid group operation 'xxyyzz'."));
59 }
60
61 // TODO(dneto): OpGroupAsyncCopy
62 // TODO(dneto): OpGroupWaitEvents
63 // TODO(dneto): OpGroupAll
64 // TODO(dneto): OpGroupAny
65 // TODO(dneto): OpGroupBroadcast
66 // TODO(dneto): OpGroupIAdd
67 // TODO(dneto): OpGroupFAdd
68 // TODO(dneto): OpGroupFMin
69 // TODO(dneto): OpGroupUMin
70 // TODO(dneto): OpGroupSMin
71 // TODO(dneto): OpGroupFMax
72 // TODO(dneto): OpGroupUMax
73 // TODO(dneto): OpGroupSMax
74
75 } // namespace
76 } // namespace spvtools
77