| OLD | NEW |
| (Empty) |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include <list> | |
| 6 | |
| 7 #include "test/cctest/compiler/instruction-selector-tester.h" | |
| 8 | |
| 9 using namespace v8::internal; | |
| 10 using namespace v8::internal::compiler; | |
| 11 | |
| 12 namespace { | |
| 13 | |
| 14 struct DPI { | |
| 15 Operator* op; | |
| 16 ArchOpcode arch_opcode; | |
| 17 }; | |
| 18 | |
| 19 | |
| 20 // ARM64 Logical instructions. | |
| 21 class LogicalInstructions V8_FINAL : public std::list<DPI>, | |
| 22 private HandleAndZoneScope { | |
| 23 public: | |
| 24 LogicalInstructions() { | |
| 25 MachineOperatorBuilder machine(main_zone()); | |
| 26 DPI and32 = {machine.Word32And(), kArm64And32}; | |
| 27 push_back(and32); | |
| 28 DPI and64 = {machine.Word64And(), kArm64And}; | |
| 29 push_back(and64); | |
| 30 DPI or32 = {machine.Word32Or(), kArm64Or32}; | |
| 31 push_back(or32); | |
| 32 DPI or64 = {machine.Word64Or(), kArm64Or}; | |
| 33 push_back(or64); | |
| 34 DPI xor32 = {machine.Word32Xor(), kArm64Xor32}; | |
| 35 push_back(xor32); | |
| 36 DPI xor64 = {machine.Word64Xor(), kArm64Xor}; | |
| 37 push_back(xor64); | |
| 38 } | |
| 39 }; | |
| 40 | |
| 41 | |
| 42 // ARM64 Arithmetic instructions. | |
| 43 class AddSubInstructions V8_FINAL : public std::list<DPI>, | |
| 44 private HandleAndZoneScope { | |
| 45 public: | |
| 46 AddSubInstructions() { | |
| 47 MachineOperatorBuilder machine(main_zone()); | |
| 48 DPI add32 = {machine.Int32Add(), kArm64Add32}; | |
| 49 push_back(add32); | |
| 50 DPI add64 = {machine.Int64Add(), kArm64Add}; | |
| 51 push_back(add64); | |
| 52 DPI sub32 = {machine.Int32Sub(), kArm64Sub32}; | |
| 53 push_back(sub32); | |
| 54 DPI sub64 = {machine.Int64Sub(), kArm64Sub}; | |
| 55 push_back(sub64); | |
| 56 } | |
| 57 }; | |
| 58 | |
| 59 | |
| 60 // ARM64 Add/Sub immediates. | |
| 61 class AddSubImmediates V8_FINAL : public std::list<int32_t> { | |
| 62 public: | |
| 63 AddSubImmediates() { | |
| 64 for (int32_t imm12 = 0; imm12 < 4096; ++imm12) { | |
| 65 CHECK(Assembler::IsImmAddSub(imm12)); | |
| 66 CHECK(Assembler::IsImmAddSub(imm12 << 12)); | |
| 67 push_back(imm12); | |
| 68 push_back(imm12 << 12); | |
| 69 } | |
| 70 } | |
| 71 }; | |
| 72 | |
| 73 | |
| 74 // ARM64 Arithmetic instructions. | |
| 75 class MulDivInstructions V8_FINAL : public std::list<DPI>, | |
| 76 private HandleAndZoneScope { | |
| 77 public: | |
| 78 MulDivInstructions() { | |
| 79 MachineOperatorBuilder machine(main_zone()); | |
| 80 DPI mul32 = {machine.Int32Mul(), kArm64Mul32}; | |
| 81 push_back(mul32); | |
| 82 DPI mul64 = {machine.Int64Mul(), kArm64Mul}; | |
| 83 push_back(mul64); | |
| 84 DPI sdiv32 = {machine.Int32Div(), kArm64Idiv32}; | |
| 85 push_back(sdiv32); | |
| 86 DPI sdiv64 = {machine.Int64Div(), kArm64Idiv}; | |
| 87 push_back(sdiv64); | |
| 88 DPI udiv32 = {machine.Int32UDiv(), kArm64Udiv32}; | |
| 89 push_back(udiv32); | |
| 90 DPI udiv64 = {machine.Int64UDiv(), kArm64Udiv}; | |
| 91 push_back(udiv64); | |
| 92 } | |
| 93 }; | |
| 94 | |
| 95 } // namespace | |
| 96 | |
| 97 | |
| 98 TEST(InstructionSelectorLogicalP) { | |
| 99 LogicalInstructions instructions; | |
| 100 for (LogicalInstructions::const_iterator i = instructions.begin(); | |
| 101 i != instructions.end(); ++i) { | |
| 102 DPI dpi = *i; | |
| 103 InstructionSelectorTester m; | |
| 104 m.Return(m.NewNode(dpi.op, m.Parameter(0), m.Parameter(1))); | |
| 105 m.SelectInstructions(); | |
| 106 CHECK_EQ(1, m.code.size()); | |
| 107 CHECK_EQ(dpi.arch_opcode, m.code[0]->arch_opcode()); | |
| 108 } | |
| 109 } | |
| 110 | |
| 111 | |
| 112 TEST(InstructionSelectorAddSubP) { | |
| 113 AddSubInstructions instructions; | |
| 114 for (AddSubInstructions::const_iterator i = instructions.begin(); | |
| 115 i != instructions.end(); ++i) { | |
| 116 DPI dpi = *i; | |
| 117 InstructionSelectorTester m; | |
| 118 m.Return(m.NewNode(dpi.op, m.Parameter(0), m.Parameter(1))); | |
| 119 m.SelectInstructions(); | |
| 120 CHECK_EQ(1, m.code.size()); | |
| 121 CHECK_EQ(dpi.arch_opcode, m.code[0]->arch_opcode()); | |
| 122 } | |
| 123 } | |
| 124 | |
| 125 | |
| 126 TEST(InstructionSelectorAddSubImm) { | |
| 127 AddSubInstructions instructions; | |
| 128 AddSubImmediates immediates; | |
| 129 for (AddSubInstructions::const_iterator i = instructions.begin(); | |
| 130 i != instructions.end(); ++i) { | |
| 131 DPI dpi = *i; | |
| 132 for (AddSubImmediates::const_iterator j = immediates.begin(); | |
| 133 j != immediates.end(); ++j) { | |
| 134 int32_t imm = *j; | |
| 135 InstructionSelectorTester m; | |
| 136 m.Return(m.NewNode(dpi.op, m.Parameter(0), m.Int32Constant(imm))); | |
| 137 m.SelectInstructions(); | |
| 138 CHECK_EQ(1, m.code.size()); | |
| 139 CHECK_EQ(dpi.arch_opcode, m.code[0]->arch_opcode()); | |
| 140 CHECK(m.code[0]->InputAt(1)->IsImmediate()); | |
| 141 } | |
| 142 } | |
| 143 } | |
| 144 | |
| 145 | |
| 146 TEST(InstructionSelectorMulDivP) { | |
| 147 MulDivInstructions instructions; | |
| 148 for (MulDivInstructions::const_iterator i = instructions.begin(); | |
| 149 i != instructions.end(); ++i) { | |
| 150 DPI dpi = *i; | |
| 151 InstructionSelectorTester m; | |
| 152 m.Return(m.NewNode(dpi.op, m.Parameter(0), m.Parameter(1))); | |
| 153 m.SelectInstructions(); | |
| 154 CHECK_EQ(1, m.code.size()); | |
| 155 CHECK_EQ(dpi.arch_opcode, m.code[0]->arch_opcode()); | |
| 156 } | |
| 157 } | |
| OLD | NEW |