| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "test/compiler-unittests/instruction-selector-unittest.h" | 5 #include "test/compiler-unittests/instruction-selector-unittest.h" |
| 6 | 6 |
| 7 namespace v8 { | 7 namespace v8 { |
| 8 namespace internal { | 8 namespace internal { |
| 9 namespace compiler { | 9 namespace compiler { |
| 10 | 10 |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 111 1073741855, 1073741861, 1073741884, 1157627904, 1476395008, | 111 1073741855, 1073741861, 1073741884, 1157627904, 1476395008, |
| 112 1476395010, 1610612741, 2030043136, 2080374785, 2097152000}; | 112 1476395010, 1610612741, 2030043136, 2080374785, 2097152000}; |
| 113 | 113 |
| 114 } // namespace | 114 } // namespace |
| 115 | 115 |
| 116 | 116 |
| 117 // ----------------------------------------------------------------------------- | 117 // ----------------------------------------------------------------------------- |
| 118 // Data processing instructions. | 118 // Data processing instructions. |
| 119 | 119 |
| 120 | 120 |
| 121 namespace { | 121 typedef InstructionSelectorTestWithParam<DPI> InstructionSelectorDPITest; |
| 122 | |
| 123 class DPITest : public InstructionSelectorTestWithParam<DPI> {}; | |
| 124 | 122 |
| 125 | 123 |
| 126 TEST_P(DPITest, Parameters) { | 124 TEST_P(InstructionSelectorDPITest, Parameters) { |
| 127 const DPI dpi = GetParam(); | 125 const DPI dpi = GetParam(); |
| 128 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); | 126 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); |
| 129 m.Return((m.*dpi.constructor)(m.Parameter(0), m.Parameter(1))); | 127 m.Return((m.*dpi.constructor)(m.Parameter(0), m.Parameter(1))); |
| 130 Stream s = m.Build(); | 128 Stream s = m.Build(); |
| 131 ASSERT_EQ(1U, s.size()); | 129 ASSERT_EQ(1U, s.size()); |
| 132 EXPECT_EQ(dpi.arch_opcode, s[0]->arch_opcode()); | 130 EXPECT_EQ(dpi.arch_opcode, s[0]->arch_opcode()); |
| 133 EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode()); | 131 EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode()); |
| 134 EXPECT_EQ(2U, s[0]->InputCount()); | 132 EXPECT_EQ(2U, s[0]->InputCount()); |
| 135 EXPECT_EQ(1U, s[0]->OutputCount()); | 133 EXPECT_EQ(1U, s[0]->OutputCount()); |
| 136 } | 134 } |
| 137 | 135 |
| 138 | 136 |
| 139 TEST_P(DPITest, Immediate) { | 137 TEST_P(InstructionSelectorDPITest, Immediate) { |
| 140 const DPI dpi = GetParam(); | 138 const DPI dpi = GetParam(); |
| 141 TRACED_FOREACH(int32_t, imm, kImmediates) { | 139 TRACED_FOREACH(int32_t, imm, kImmediates) { |
| 142 StreamBuilder m(this, kMachInt32, kMachInt32); | 140 StreamBuilder m(this, kMachInt32, kMachInt32); |
| 143 m.Return((m.*dpi.constructor)(m.Parameter(0), m.Int32Constant(imm))); | 141 m.Return((m.*dpi.constructor)(m.Parameter(0), m.Int32Constant(imm))); |
| 144 Stream s = m.Build(); | 142 Stream s = m.Build(); |
| 145 ASSERT_EQ(1U, s.size()); | 143 ASSERT_EQ(1U, s.size()); |
| 146 EXPECT_EQ(dpi.arch_opcode, s[0]->arch_opcode()); | 144 EXPECT_EQ(dpi.arch_opcode, s[0]->arch_opcode()); |
| 147 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode()); | 145 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode()); |
| 148 ASSERT_EQ(2U, s[0]->InputCount()); | 146 ASSERT_EQ(2U, s[0]->InputCount()); |
| 149 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1))); | 147 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1))); |
| 150 EXPECT_EQ(1U, s[0]->OutputCount()); | 148 EXPECT_EQ(1U, s[0]->OutputCount()); |
| 151 } | 149 } |
| 152 TRACED_FOREACH(int32_t, imm, kImmediates) { | 150 TRACED_FOREACH(int32_t, imm, kImmediates) { |
| 153 StreamBuilder m(this, kMachInt32, kMachInt32); | 151 StreamBuilder m(this, kMachInt32, kMachInt32); |
| 154 m.Return((m.*dpi.constructor)(m.Int32Constant(imm), m.Parameter(0))); | 152 m.Return((m.*dpi.constructor)(m.Int32Constant(imm), m.Parameter(0))); |
| 155 Stream s = m.Build(); | 153 Stream s = m.Build(); |
| 156 ASSERT_EQ(1U, s.size()); | 154 ASSERT_EQ(1U, s.size()); |
| 157 EXPECT_EQ(dpi.reverse_arch_opcode, s[0]->arch_opcode()); | 155 EXPECT_EQ(dpi.reverse_arch_opcode, s[0]->arch_opcode()); |
| 158 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode()); | 156 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode()); |
| 159 ASSERT_EQ(2U, s[0]->InputCount()); | 157 ASSERT_EQ(2U, s[0]->InputCount()); |
| 160 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1))); | 158 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1))); |
| 161 EXPECT_EQ(1U, s[0]->OutputCount()); | 159 EXPECT_EQ(1U, s[0]->OutputCount()); |
| 162 } | 160 } |
| 163 } | 161 } |
| 164 | 162 |
| 165 | 163 |
| 166 TEST_P(DPITest, ShiftByParameter) { | 164 TEST_P(InstructionSelectorDPITest, ShiftByParameter) { |
| 167 const DPI dpi = GetParam(); | 165 const DPI dpi = GetParam(); |
| 168 TRACED_FOREACH(Shift, shift, kShifts) { | 166 TRACED_FOREACH(Shift, shift, kShifts) { |
| 169 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32); | 167 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32); |
| 170 m.Return((m.*dpi.constructor)( | 168 m.Return((m.*dpi.constructor)( |
| 171 m.Parameter(0), | 169 m.Parameter(0), |
| 172 (m.*shift.constructor)(m.Parameter(1), m.Parameter(2)))); | 170 (m.*shift.constructor)(m.Parameter(1), m.Parameter(2)))); |
| 173 Stream s = m.Build(); | 171 Stream s = m.Build(); |
| 174 ASSERT_EQ(1U, s.size()); | 172 ASSERT_EQ(1U, s.size()); |
| 175 EXPECT_EQ(dpi.arch_opcode, s[0]->arch_opcode()); | 173 EXPECT_EQ(dpi.arch_opcode, s[0]->arch_opcode()); |
| 176 EXPECT_EQ(shift.r_mode, s[0]->addressing_mode()); | 174 EXPECT_EQ(shift.r_mode, s[0]->addressing_mode()); |
| 177 EXPECT_EQ(3U, s[0]->InputCount()); | 175 EXPECT_EQ(3U, s[0]->InputCount()); |
| 178 EXPECT_EQ(1U, s[0]->OutputCount()); | 176 EXPECT_EQ(1U, s[0]->OutputCount()); |
| 179 } | 177 } |
| 180 TRACED_FOREACH(Shift, shift, kShifts) { | 178 TRACED_FOREACH(Shift, shift, kShifts) { |
| 181 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32); | 179 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32); |
| 182 m.Return((m.*dpi.constructor)( | 180 m.Return((m.*dpi.constructor)( |
| 183 (m.*shift.constructor)(m.Parameter(0), m.Parameter(1)), | 181 (m.*shift.constructor)(m.Parameter(0), m.Parameter(1)), |
| 184 m.Parameter(2))); | 182 m.Parameter(2))); |
| 185 Stream s = m.Build(); | 183 Stream s = m.Build(); |
| 186 ASSERT_EQ(1U, s.size()); | 184 ASSERT_EQ(1U, s.size()); |
| 187 EXPECT_EQ(dpi.reverse_arch_opcode, s[0]->arch_opcode()); | 185 EXPECT_EQ(dpi.reverse_arch_opcode, s[0]->arch_opcode()); |
| 188 EXPECT_EQ(shift.r_mode, s[0]->addressing_mode()); | 186 EXPECT_EQ(shift.r_mode, s[0]->addressing_mode()); |
| 189 EXPECT_EQ(3U, s[0]->InputCount()); | 187 EXPECT_EQ(3U, s[0]->InputCount()); |
| 190 EXPECT_EQ(1U, s[0]->OutputCount()); | 188 EXPECT_EQ(1U, s[0]->OutputCount()); |
| 191 } | 189 } |
| 192 } | 190 } |
| 193 | 191 |
| 194 | 192 |
| 195 TEST_P(DPITest, ShiftByImmediate) { | 193 TEST_P(InstructionSelectorDPITest, ShiftByImmediate) { |
| 196 const DPI dpi = GetParam(); | 194 const DPI dpi = GetParam(); |
| 197 TRACED_FOREACH(Shift, shift, kShifts) { | 195 TRACED_FOREACH(Shift, shift, kShifts) { |
| 198 TRACED_FORRANGE(int32_t, imm, shift.i_low, shift.i_high) { | 196 TRACED_FORRANGE(int32_t, imm, shift.i_low, shift.i_high) { |
| 199 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); | 197 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); |
| 200 m.Return((m.*dpi.constructor)( | 198 m.Return((m.*dpi.constructor)( |
| 201 m.Parameter(0), | 199 m.Parameter(0), |
| 202 (m.*shift.constructor)(m.Parameter(1), m.Int32Constant(imm)))); | 200 (m.*shift.constructor)(m.Parameter(1), m.Int32Constant(imm)))); |
| 203 Stream s = m.Build(); | 201 Stream s = m.Build(); |
| 204 ASSERT_EQ(1U, s.size()); | 202 ASSERT_EQ(1U, s.size()); |
| 205 EXPECT_EQ(dpi.arch_opcode, s[0]->arch_opcode()); | 203 EXPECT_EQ(dpi.arch_opcode, s[0]->arch_opcode()); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 220 EXPECT_EQ(dpi.reverse_arch_opcode, s[0]->arch_opcode()); | 218 EXPECT_EQ(dpi.reverse_arch_opcode, s[0]->arch_opcode()); |
| 221 EXPECT_EQ(shift.i_mode, s[0]->addressing_mode()); | 219 EXPECT_EQ(shift.i_mode, s[0]->addressing_mode()); |
| 222 ASSERT_EQ(3U, s[0]->InputCount()); | 220 ASSERT_EQ(3U, s[0]->InputCount()); |
| 223 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2))); | 221 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2))); |
| 224 EXPECT_EQ(1U, s[0]->OutputCount()); | 222 EXPECT_EQ(1U, s[0]->OutputCount()); |
| 225 } | 223 } |
| 226 } | 224 } |
| 227 } | 225 } |
| 228 | 226 |
| 229 | 227 |
| 230 TEST_P(DPITest, BranchWithParameters) { | 228 TEST_P(InstructionSelectorDPITest, BranchWithParameters) { |
| 231 const DPI dpi = GetParam(); | 229 const DPI dpi = GetParam(); |
| 232 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); | 230 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); |
| 233 MLabel a, b; | 231 MLabel a, b; |
| 234 m.Branch((m.*dpi.constructor)(m.Parameter(0), m.Parameter(1)), &a, &b); | 232 m.Branch((m.*dpi.constructor)(m.Parameter(0), m.Parameter(1)), &a, &b); |
| 235 m.Bind(&a); | 233 m.Bind(&a); |
| 236 m.Return(m.Int32Constant(1)); | 234 m.Return(m.Int32Constant(1)); |
| 237 m.Bind(&b); | 235 m.Bind(&b); |
| 238 m.Return(m.Int32Constant(0)); | 236 m.Return(m.Int32Constant(0)); |
| 239 Stream s = m.Build(); | 237 Stream s = m.Build(); |
| 240 ASSERT_EQ(1U, s.size()); | 238 ASSERT_EQ(1U, s.size()); |
| 241 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode()); | 239 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode()); |
| 242 EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode()); | 240 EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode()); |
| 243 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); | 241 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); |
| 244 EXPECT_EQ(kNotEqual, s[0]->flags_condition()); | 242 EXPECT_EQ(kNotEqual, s[0]->flags_condition()); |
| 245 } | 243 } |
| 246 | 244 |
| 247 | 245 |
| 248 TEST_P(DPITest, BranchWithImmediate) { | 246 TEST_P(InstructionSelectorDPITest, BranchWithImmediate) { |
| 249 const DPI dpi = GetParam(); | 247 const DPI dpi = GetParam(); |
| 250 TRACED_FOREACH(int32_t, imm, kImmediates) { | 248 TRACED_FOREACH(int32_t, imm, kImmediates) { |
| 251 StreamBuilder m(this, kMachInt32, kMachInt32); | 249 StreamBuilder m(this, kMachInt32, kMachInt32); |
| 252 MLabel a, b; | 250 MLabel a, b; |
| 253 m.Branch((m.*dpi.constructor)(m.Parameter(0), m.Int32Constant(imm)), &a, | 251 m.Branch((m.*dpi.constructor)(m.Parameter(0), m.Int32Constant(imm)), &a, |
| 254 &b); | 252 &b); |
| 255 m.Bind(&a); | 253 m.Bind(&a); |
| 256 m.Return(m.Int32Constant(1)); | 254 m.Return(m.Int32Constant(1)); |
| 257 m.Bind(&b); | 255 m.Bind(&b); |
| 258 m.Return(m.Int32Constant(0)); | 256 m.Return(m.Int32Constant(0)); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 275 Stream s = m.Build(); | 273 Stream s = m.Build(); |
| 276 ASSERT_EQ(1U, s.size()); | 274 ASSERT_EQ(1U, s.size()); |
| 277 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode()); | 275 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode()); |
| 278 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode()); | 276 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode()); |
| 279 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); | 277 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); |
| 280 EXPECT_EQ(kNotEqual, s[0]->flags_condition()); | 278 EXPECT_EQ(kNotEqual, s[0]->flags_condition()); |
| 281 } | 279 } |
| 282 } | 280 } |
| 283 | 281 |
| 284 | 282 |
| 285 TEST_P(DPITest, BranchWithShiftByParameter) { | 283 TEST_P(InstructionSelectorDPITest, BranchWithShiftByParameter) { |
| 286 const DPI dpi = GetParam(); | 284 const DPI dpi = GetParam(); |
| 287 TRACED_FOREACH(Shift, shift, kShifts) { | 285 TRACED_FOREACH(Shift, shift, kShifts) { |
| 288 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32); | 286 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32); |
| 289 MLabel a, b; | 287 MLabel a, b; |
| 290 m.Branch((m.*dpi.constructor)( | 288 m.Branch((m.*dpi.constructor)( |
| 291 m.Parameter(0), | 289 m.Parameter(0), |
| 292 (m.*shift.constructor)(m.Parameter(1), m.Parameter(2))), | 290 (m.*shift.constructor)(m.Parameter(1), m.Parameter(2))), |
| 293 &a, &b); | 291 &a, &b); |
| 294 m.Bind(&a); | 292 m.Bind(&a); |
| 295 m.Return(m.Int32Constant(1)); | 293 m.Return(m.Int32Constant(1)); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 316 Stream s = m.Build(); | 314 Stream s = m.Build(); |
| 317 ASSERT_EQ(1U, s.size()); | 315 ASSERT_EQ(1U, s.size()); |
| 318 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode()); | 316 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode()); |
| 319 EXPECT_EQ(shift.r_mode, s[0]->addressing_mode()); | 317 EXPECT_EQ(shift.r_mode, s[0]->addressing_mode()); |
| 320 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); | 318 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); |
| 321 EXPECT_EQ(kNotEqual, s[0]->flags_condition()); | 319 EXPECT_EQ(kNotEqual, s[0]->flags_condition()); |
| 322 } | 320 } |
| 323 } | 321 } |
| 324 | 322 |
| 325 | 323 |
| 326 TEST_P(DPITest, BranchWithShiftByImmediate) { | 324 TEST_P(InstructionSelectorDPITest, BranchWithShiftByImmediate) { |
| 327 const DPI dpi = GetParam(); | 325 const DPI dpi = GetParam(); |
| 328 TRACED_FOREACH(Shift, shift, kShifts) { | 326 TRACED_FOREACH(Shift, shift, kShifts) { |
| 329 TRACED_FORRANGE(int32_t, imm, shift.i_low, shift.i_high) { | 327 TRACED_FORRANGE(int32_t, imm, shift.i_low, shift.i_high) { |
| 330 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); | 328 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); |
| 331 MLabel a, b; | 329 MLabel a, b; |
| 332 m.Branch((m.*dpi.constructor)(m.Parameter(0), | 330 m.Branch((m.*dpi.constructor)(m.Parameter(0), |
| 333 (m.*shift.constructor)( | 331 (m.*shift.constructor)( |
| 334 m.Parameter(1), m.Int32Constant(imm))), | 332 m.Parameter(1), m.Int32Constant(imm))), |
| 335 &a, &b); | 333 &a, &b); |
| 336 m.Bind(&a); | 334 m.Bind(&a); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 365 EXPECT_EQ(shift.i_mode, s[0]->addressing_mode()); | 363 EXPECT_EQ(shift.i_mode, s[0]->addressing_mode()); |
| 366 ASSERT_EQ(5U, s[0]->InputCount()); | 364 ASSERT_EQ(5U, s[0]->InputCount()); |
| 367 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2))); | 365 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2))); |
| 368 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); | 366 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); |
| 369 EXPECT_EQ(kNotEqual, s[0]->flags_condition()); | 367 EXPECT_EQ(kNotEqual, s[0]->flags_condition()); |
| 370 } | 368 } |
| 371 } | 369 } |
| 372 } | 370 } |
| 373 | 371 |
| 374 | 372 |
| 375 TEST_P(DPITest, BranchIfZeroWithParameters) { | 373 TEST_P(InstructionSelectorDPITest, BranchIfZeroWithParameters) { |
| 376 const DPI dpi = GetParam(); | 374 const DPI dpi = GetParam(); |
| 377 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); | 375 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); |
| 378 MLabel a, b; | 376 MLabel a, b; |
| 379 m.Branch(m.Word32Equal((m.*dpi.constructor)(m.Parameter(0), m.Parameter(1)), | 377 m.Branch(m.Word32Equal((m.*dpi.constructor)(m.Parameter(0), m.Parameter(1)), |
| 380 m.Int32Constant(0)), | 378 m.Int32Constant(0)), |
| 381 &a, &b); | 379 &a, &b); |
| 382 m.Bind(&a); | 380 m.Bind(&a); |
| 383 m.Return(m.Int32Constant(1)); | 381 m.Return(m.Int32Constant(1)); |
| 384 m.Bind(&b); | 382 m.Bind(&b); |
| 385 m.Return(m.Int32Constant(0)); | 383 m.Return(m.Int32Constant(0)); |
| 386 Stream s = m.Build(); | 384 Stream s = m.Build(); |
| 387 ASSERT_EQ(1U, s.size()); | 385 ASSERT_EQ(1U, s.size()); |
| 388 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode()); | 386 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode()); |
| 389 EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode()); | 387 EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode()); |
| 390 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); | 388 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); |
| 391 EXPECT_EQ(kEqual, s[0]->flags_condition()); | 389 EXPECT_EQ(kEqual, s[0]->flags_condition()); |
| 392 } | 390 } |
| 393 | 391 |
| 394 | 392 |
| 395 TEST_P(DPITest, BranchIfNotZeroWithParameters) { | 393 TEST_P(InstructionSelectorDPITest, BranchIfNotZeroWithParameters) { |
| 396 const DPI dpi = GetParam(); | 394 const DPI dpi = GetParam(); |
| 397 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); | 395 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); |
| 398 MLabel a, b; | 396 MLabel a, b; |
| 399 m.Branch( | 397 m.Branch( |
| 400 m.Word32NotEqual((m.*dpi.constructor)(m.Parameter(0), m.Parameter(1)), | 398 m.Word32NotEqual((m.*dpi.constructor)(m.Parameter(0), m.Parameter(1)), |
| 401 m.Int32Constant(0)), | 399 m.Int32Constant(0)), |
| 402 &a, &b); | 400 &a, &b); |
| 403 m.Bind(&a); | 401 m.Bind(&a); |
| 404 m.Return(m.Int32Constant(1)); | 402 m.Return(m.Int32Constant(1)); |
| 405 m.Bind(&b); | 403 m.Bind(&b); |
| 406 m.Return(m.Int32Constant(0)); | 404 m.Return(m.Int32Constant(0)); |
| 407 Stream s = m.Build(); | 405 Stream s = m.Build(); |
| 408 ASSERT_EQ(1U, s.size()); | 406 ASSERT_EQ(1U, s.size()); |
| 409 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode()); | 407 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode()); |
| 410 EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode()); | 408 EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode()); |
| 411 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); | 409 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); |
| 412 EXPECT_EQ(kNotEqual, s[0]->flags_condition()); | 410 EXPECT_EQ(kNotEqual, s[0]->flags_condition()); |
| 413 } | 411 } |
| 414 | 412 |
| 415 | 413 |
| 416 TEST_P(DPITest, BranchIfZeroWithImmediate) { | 414 TEST_P(InstructionSelectorDPITest, BranchIfZeroWithImmediate) { |
| 417 const DPI dpi = GetParam(); | 415 const DPI dpi = GetParam(); |
| 418 TRACED_FOREACH(int32_t, imm, kImmediates) { | 416 TRACED_FOREACH(int32_t, imm, kImmediates) { |
| 419 StreamBuilder m(this, kMachInt32, kMachInt32); | 417 StreamBuilder m(this, kMachInt32, kMachInt32); |
| 420 MLabel a, b; | 418 MLabel a, b; |
| 421 m.Branch(m.Word32Equal( | 419 m.Branch(m.Word32Equal( |
| 422 (m.*dpi.constructor)(m.Parameter(0), m.Int32Constant(imm)), | 420 (m.*dpi.constructor)(m.Parameter(0), m.Int32Constant(imm)), |
| 423 m.Int32Constant(0)), | 421 m.Int32Constant(0)), |
| 424 &a, &b); | 422 &a, &b); |
| 425 m.Bind(&a); | 423 m.Bind(&a); |
| 426 m.Return(m.Int32Constant(1)); | 424 m.Return(m.Int32Constant(1)); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 447 Stream s = m.Build(); | 445 Stream s = m.Build(); |
| 448 ASSERT_EQ(1U, s.size()); | 446 ASSERT_EQ(1U, s.size()); |
| 449 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode()); | 447 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode()); |
| 450 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode()); | 448 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode()); |
| 451 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); | 449 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); |
| 452 EXPECT_EQ(kEqual, s[0]->flags_condition()); | 450 EXPECT_EQ(kEqual, s[0]->flags_condition()); |
| 453 } | 451 } |
| 454 } | 452 } |
| 455 | 453 |
| 456 | 454 |
| 457 TEST_P(DPITest, BranchIfNotZeroWithImmediate) { | 455 TEST_P(InstructionSelectorDPITest, BranchIfNotZeroWithImmediate) { |
| 458 const DPI dpi = GetParam(); | 456 const DPI dpi = GetParam(); |
| 459 TRACED_FOREACH(int32_t, imm, kImmediates) { | 457 TRACED_FOREACH(int32_t, imm, kImmediates) { |
| 460 StreamBuilder m(this, kMachInt32, kMachInt32); | 458 StreamBuilder m(this, kMachInt32, kMachInt32); |
| 461 MLabel a, b; | 459 MLabel a, b; |
| 462 m.Branch(m.Word32NotEqual( | 460 m.Branch(m.Word32NotEqual( |
| 463 (m.*dpi.constructor)(m.Parameter(0), m.Int32Constant(imm)), | 461 (m.*dpi.constructor)(m.Parameter(0), m.Int32Constant(imm)), |
| 464 m.Int32Constant(0)), | 462 m.Int32Constant(0)), |
| 465 &a, &b); | 463 &a, &b); |
| 466 m.Bind(&a); | 464 m.Bind(&a); |
| 467 m.Return(m.Int32Constant(1)); | 465 m.Return(m.Int32Constant(1)); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 487 m.Return(m.Int32Constant(0)); | 485 m.Return(m.Int32Constant(0)); |
| 488 Stream s = m.Build(); | 486 Stream s = m.Build(); |
| 489 ASSERT_EQ(1U, s.size()); | 487 ASSERT_EQ(1U, s.size()); |
| 490 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode()); | 488 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode()); |
| 491 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode()); | 489 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode()); |
| 492 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); | 490 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); |
| 493 EXPECT_EQ(kNotEqual, s[0]->flags_condition()); | 491 EXPECT_EQ(kNotEqual, s[0]->flags_condition()); |
| 494 } | 492 } |
| 495 } | 493 } |
| 496 | 494 |
| 497 } // namespace | |
| 498 | 495 |
| 499 | 496 INSTANTIATE_TEST_CASE_P(InstructionSelectorTest, InstructionSelectorDPITest, |
| 500 INSTANTIATE_TEST_CASE_P(InstructionSelectorTest, DPITest, | |
| 501 ::testing::ValuesIn(kDPIs)); | 497 ::testing::ValuesIn(kDPIs)); |
| 502 | 498 |
| 503 | 499 |
| 504 // ----------------------------------------------------------------------------- | 500 // ----------------------------------------------------------------------------- |
| 505 // Data processing instructions with overflow. | 501 // Data processing instructions with overflow. |
| 506 | 502 |
| 507 | 503 |
| 508 namespace { | 504 typedef InstructionSelectorTestWithParam<ODPI> InstructionSelectorODPITest; |
| 509 | |
| 510 class ODPITest : public InstructionSelectorTestWithParam<ODPI> {}; | |
| 511 | 505 |
| 512 | 506 |
| 513 TEST_P(ODPITest, OvfWithParameters) { | 507 TEST_P(InstructionSelectorODPITest, OvfWithParameters) { |
| 514 const ODPI odpi = GetParam(); | 508 const ODPI odpi = GetParam(); |
| 515 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); | 509 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); |
| 516 m.Return( | 510 m.Return( |
| 517 m.Projection(1, (m.*odpi.constructor)(m.Parameter(0), m.Parameter(1)))); | 511 m.Projection(1, (m.*odpi.constructor)(m.Parameter(0), m.Parameter(1)))); |
| 518 Stream s = m.Build(); | 512 Stream s = m.Build(); |
| 519 ASSERT_EQ(1U, s.size()); | 513 ASSERT_EQ(1U, s.size()); |
| 520 EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode()); | 514 EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode()); |
| 521 EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode()); | 515 EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode()); |
| 522 EXPECT_EQ(2U, s[0]->InputCount()); | 516 EXPECT_EQ(2U, s[0]->InputCount()); |
| 523 EXPECT_LE(1U, s[0]->OutputCount()); | 517 EXPECT_LE(1U, s[0]->OutputCount()); |
| 524 EXPECT_EQ(kFlags_set, s[0]->flags_mode()); | 518 EXPECT_EQ(kFlags_set, s[0]->flags_mode()); |
| 525 EXPECT_EQ(kOverflow, s[0]->flags_condition()); | 519 EXPECT_EQ(kOverflow, s[0]->flags_condition()); |
| 526 } | 520 } |
| 527 | 521 |
| 528 | 522 |
| 529 TEST_P(ODPITest, OvfWithImmediate) { | 523 TEST_P(InstructionSelectorODPITest, OvfWithImmediate) { |
| 530 const ODPI odpi = GetParam(); | 524 const ODPI odpi = GetParam(); |
| 531 TRACED_FOREACH(int32_t, imm, kImmediates) { | 525 TRACED_FOREACH(int32_t, imm, kImmediates) { |
| 532 StreamBuilder m(this, kMachInt32, kMachInt32); | 526 StreamBuilder m(this, kMachInt32, kMachInt32); |
| 533 m.Return(m.Projection( | 527 m.Return(m.Projection( |
| 534 1, (m.*odpi.constructor)(m.Parameter(0), m.Int32Constant(imm)))); | 528 1, (m.*odpi.constructor)(m.Parameter(0), m.Int32Constant(imm)))); |
| 535 Stream s = m.Build(); | 529 Stream s = m.Build(); |
| 536 ASSERT_EQ(1U, s.size()); | 530 ASSERT_EQ(1U, s.size()); |
| 537 EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode()); | 531 EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode()); |
| 538 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode()); | 532 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode()); |
| 539 ASSERT_EQ(2U, s[0]->InputCount()); | 533 ASSERT_EQ(2U, s[0]->InputCount()); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 552 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode()); | 546 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode()); |
| 553 ASSERT_EQ(2U, s[0]->InputCount()); | 547 ASSERT_EQ(2U, s[0]->InputCount()); |
| 554 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1))); | 548 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1))); |
| 555 EXPECT_LE(1U, s[0]->OutputCount()); | 549 EXPECT_LE(1U, s[0]->OutputCount()); |
| 556 EXPECT_EQ(kFlags_set, s[0]->flags_mode()); | 550 EXPECT_EQ(kFlags_set, s[0]->flags_mode()); |
| 557 EXPECT_EQ(kOverflow, s[0]->flags_condition()); | 551 EXPECT_EQ(kOverflow, s[0]->flags_condition()); |
| 558 } | 552 } |
| 559 } | 553 } |
| 560 | 554 |
| 561 | 555 |
| 562 TEST_P(ODPITest, OvfWithShiftByParameter) { | 556 TEST_P(InstructionSelectorODPITest, OvfWithShiftByParameter) { |
| 563 const ODPI odpi = GetParam(); | 557 const ODPI odpi = GetParam(); |
| 564 TRACED_FOREACH(Shift, shift, kShifts) { | 558 TRACED_FOREACH(Shift, shift, kShifts) { |
| 565 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32); | 559 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32); |
| 566 m.Return(m.Projection( | 560 m.Return(m.Projection( |
| 567 1, (m.*odpi.constructor)( | 561 1, (m.*odpi.constructor)( |
| 568 m.Parameter(0), | 562 m.Parameter(0), |
| 569 (m.*shift.constructor)(m.Parameter(1), m.Parameter(2))))); | 563 (m.*shift.constructor)(m.Parameter(1), m.Parameter(2))))); |
| 570 Stream s = m.Build(); | 564 Stream s = m.Build(); |
| 571 ASSERT_EQ(1U, s.size()); | 565 ASSERT_EQ(1U, s.size()); |
| 572 EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode()); | 566 EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode()); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 587 EXPECT_EQ(odpi.reverse_arch_opcode, s[0]->arch_opcode()); | 581 EXPECT_EQ(odpi.reverse_arch_opcode, s[0]->arch_opcode()); |
| 588 EXPECT_EQ(shift.r_mode, s[0]->addressing_mode()); | 582 EXPECT_EQ(shift.r_mode, s[0]->addressing_mode()); |
| 589 EXPECT_EQ(3U, s[0]->InputCount()); | 583 EXPECT_EQ(3U, s[0]->InputCount()); |
| 590 EXPECT_LE(1U, s[0]->OutputCount()); | 584 EXPECT_LE(1U, s[0]->OutputCount()); |
| 591 EXPECT_EQ(kFlags_set, s[0]->flags_mode()); | 585 EXPECT_EQ(kFlags_set, s[0]->flags_mode()); |
| 592 EXPECT_EQ(kOverflow, s[0]->flags_condition()); | 586 EXPECT_EQ(kOverflow, s[0]->flags_condition()); |
| 593 } | 587 } |
| 594 } | 588 } |
| 595 | 589 |
| 596 | 590 |
| 597 TEST_P(ODPITest, OvfWithShiftByImmediate) { | 591 TEST_P(InstructionSelectorODPITest, OvfWithShiftByImmediate) { |
| 598 const ODPI odpi = GetParam(); | 592 const ODPI odpi = GetParam(); |
| 599 TRACED_FOREACH(Shift, shift, kShifts) { | 593 TRACED_FOREACH(Shift, shift, kShifts) { |
| 600 TRACED_FORRANGE(int32_t, imm, shift.i_low, shift.i_high) { | 594 TRACED_FORRANGE(int32_t, imm, shift.i_low, shift.i_high) { |
| 601 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); | 595 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); |
| 602 m.Return(m.Projection( | 596 m.Return(m.Projection( |
| 603 1, (m.*odpi.constructor)(m.Parameter(0), | 597 1, (m.*odpi.constructor)(m.Parameter(0), |
| 604 (m.*shift.constructor)( | 598 (m.*shift.constructor)( |
| 605 m.Parameter(1), m.Int32Constant(imm))))); | 599 m.Parameter(1), m.Int32Constant(imm))))); |
| 606 Stream s = m.Build(); | 600 Stream s = m.Build(); |
| 607 ASSERT_EQ(1U, s.size()); | 601 ASSERT_EQ(1U, s.size()); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 628 ASSERT_EQ(3U, s[0]->InputCount()); | 622 ASSERT_EQ(3U, s[0]->InputCount()); |
| 629 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2))); | 623 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2))); |
| 630 EXPECT_LE(1U, s[0]->OutputCount()); | 624 EXPECT_LE(1U, s[0]->OutputCount()); |
| 631 EXPECT_EQ(kFlags_set, s[0]->flags_mode()); | 625 EXPECT_EQ(kFlags_set, s[0]->flags_mode()); |
| 632 EXPECT_EQ(kOverflow, s[0]->flags_condition()); | 626 EXPECT_EQ(kOverflow, s[0]->flags_condition()); |
| 633 } | 627 } |
| 634 } | 628 } |
| 635 } | 629 } |
| 636 | 630 |
| 637 | 631 |
| 638 TEST_P(ODPITest, ValWithParameters) { | 632 TEST_P(InstructionSelectorODPITest, ValWithParameters) { |
| 639 const ODPI odpi = GetParam(); | 633 const ODPI odpi = GetParam(); |
| 640 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); | 634 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); |
| 641 m.Return( | 635 m.Return( |
| 642 m.Projection(0, (m.*odpi.constructor)(m.Parameter(0), m.Parameter(1)))); | 636 m.Projection(0, (m.*odpi.constructor)(m.Parameter(0), m.Parameter(1)))); |
| 643 Stream s = m.Build(); | 637 Stream s = m.Build(); |
| 644 ASSERT_EQ(1U, s.size()); | 638 ASSERT_EQ(1U, s.size()); |
| 645 EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode()); | 639 EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode()); |
| 646 EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode()); | 640 EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode()); |
| 647 EXPECT_EQ(2U, s[0]->InputCount()); | 641 EXPECT_EQ(2U, s[0]->InputCount()); |
| 648 EXPECT_LE(1U, s[0]->OutputCount()); | 642 EXPECT_LE(1U, s[0]->OutputCount()); |
| 649 EXPECT_EQ(kFlags_none, s[0]->flags_mode()); | 643 EXPECT_EQ(kFlags_none, s[0]->flags_mode()); |
| 650 } | 644 } |
| 651 | 645 |
| 652 | 646 |
| 653 TEST_P(ODPITest, ValWithImmediate) { | 647 TEST_P(InstructionSelectorODPITest, ValWithImmediate) { |
| 654 const ODPI odpi = GetParam(); | 648 const ODPI odpi = GetParam(); |
| 655 TRACED_FOREACH(int32_t, imm, kImmediates) { | 649 TRACED_FOREACH(int32_t, imm, kImmediates) { |
| 656 StreamBuilder m(this, kMachInt32, kMachInt32); | 650 StreamBuilder m(this, kMachInt32, kMachInt32); |
| 657 m.Return(m.Projection( | 651 m.Return(m.Projection( |
| 658 0, (m.*odpi.constructor)(m.Parameter(0), m.Int32Constant(imm)))); | 652 0, (m.*odpi.constructor)(m.Parameter(0), m.Int32Constant(imm)))); |
| 659 Stream s = m.Build(); | 653 Stream s = m.Build(); |
| 660 ASSERT_EQ(1U, s.size()); | 654 ASSERT_EQ(1U, s.size()); |
| 661 EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode()); | 655 EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode()); |
| 662 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode()); | 656 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode()); |
| 663 ASSERT_EQ(2U, s[0]->InputCount()); | 657 ASSERT_EQ(2U, s[0]->InputCount()); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 674 EXPECT_EQ(odpi.reverse_arch_opcode, s[0]->arch_opcode()); | 668 EXPECT_EQ(odpi.reverse_arch_opcode, s[0]->arch_opcode()); |
| 675 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode()); | 669 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode()); |
| 676 ASSERT_EQ(2U, s[0]->InputCount()); | 670 ASSERT_EQ(2U, s[0]->InputCount()); |
| 677 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1))); | 671 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1))); |
| 678 EXPECT_LE(1U, s[0]->OutputCount()); | 672 EXPECT_LE(1U, s[0]->OutputCount()); |
| 679 EXPECT_EQ(kFlags_none, s[0]->flags_mode()); | 673 EXPECT_EQ(kFlags_none, s[0]->flags_mode()); |
| 680 } | 674 } |
| 681 } | 675 } |
| 682 | 676 |
| 683 | 677 |
| 684 TEST_P(ODPITest, ValWithShiftByParameter) { | 678 TEST_P(InstructionSelectorODPITest, ValWithShiftByParameter) { |
| 685 const ODPI odpi = GetParam(); | 679 const ODPI odpi = GetParam(); |
| 686 TRACED_FOREACH(Shift, shift, kShifts) { | 680 TRACED_FOREACH(Shift, shift, kShifts) { |
| 687 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32); | 681 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32); |
| 688 m.Return(m.Projection( | 682 m.Return(m.Projection( |
| 689 0, (m.*odpi.constructor)( | 683 0, (m.*odpi.constructor)( |
| 690 m.Parameter(0), | 684 m.Parameter(0), |
| 691 (m.*shift.constructor)(m.Parameter(1), m.Parameter(2))))); | 685 (m.*shift.constructor)(m.Parameter(1), m.Parameter(2))))); |
| 692 Stream s = m.Build(); | 686 Stream s = m.Build(); |
| 693 ASSERT_EQ(1U, s.size()); | 687 ASSERT_EQ(1U, s.size()); |
| 694 EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode()); | 688 EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode()); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 707 ASSERT_EQ(1U, s.size()); | 701 ASSERT_EQ(1U, s.size()); |
| 708 EXPECT_EQ(odpi.reverse_arch_opcode, s[0]->arch_opcode()); | 702 EXPECT_EQ(odpi.reverse_arch_opcode, s[0]->arch_opcode()); |
| 709 EXPECT_EQ(shift.r_mode, s[0]->addressing_mode()); | 703 EXPECT_EQ(shift.r_mode, s[0]->addressing_mode()); |
| 710 EXPECT_EQ(3U, s[0]->InputCount()); | 704 EXPECT_EQ(3U, s[0]->InputCount()); |
| 711 EXPECT_LE(1U, s[0]->OutputCount()); | 705 EXPECT_LE(1U, s[0]->OutputCount()); |
| 712 EXPECT_EQ(kFlags_none, s[0]->flags_mode()); | 706 EXPECT_EQ(kFlags_none, s[0]->flags_mode()); |
| 713 } | 707 } |
| 714 } | 708 } |
| 715 | 709 |
| 716 | 710 |
| 717 TEST_P(ODPITest, ValWithShiftByImmediate) { | 711 TEST_P(InstructionSelectorODPITest, ValWithShiftByImmediate) { |
| 718 const ODPI odpi = GetParam(); | 712 const ODPI odpi = GetParam(); |
| 719 TRACED_FOREACH(Shift, shift, kShifts) { | 713 TRACED_FOREACH(Shift, shift, kShifts) { |
| 720 TRACED_FORRANGE(int32_t, imm, shift.i_low, shift.i_high) { | 714 TRACED_FORRANGE(int32_t, imm, shift.i_low, shift.i_high) { |
| 721 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); | 715 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); |
| 722 m.Return(m.Projection( | 716 m.Return(m.Projection( |
| 723 0, (m.*odpi.constructor)(m.Parameter(0), | 717 0, (m.*odpi.constructor)(m.Parameter(0), |
| 724 (m.*shift.constructor)( | 718 (m.*shift.constructor)( |
| 725 m.Parameter(1), m.Int32Constant(imm))))); | 719 m.Parameter(1), m.Int32Constant(imm))))); |
| 726 Stream s = m.Build(); | 720 Stream s = m.Build(); |
| 727 ASSERT_EQ(1U, s.size()); | 721 ASSERT_EQ(1U, s.size()); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 746 EXPECT_EQ(shift.i_mode, s[0]->addressing_mode()); | 740 EXPECT_EQ(shift.i_mode, s[0]->addressing_mode()); |
| 747 ASSERT_EQ(3U, s[0]->InputCount()); | 741 ASSERT_EQ(3U, s[0]->InputCount()); |
| 748 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2))); | 742 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2))); |
| 749 EXPECT_LE(1U, s[0]->OutputCount()); | 743 EXPECT_LE(1U, s[0]->OutputCount()); |
| 750 EXPECT_EQ(kFlags_none, s[0]->flags_mode()); | 744 EXPECT_EQ(kFlags_none, s[0]->flags_mode()); |
| 751 } | 745 } |
| 752 } | 746 } |
| 753 } | 747 } |
| 754 | 748 |
| 755 | 749 |
| 756 TEST_P(ODPITest, BothWithParameters) { | 750 TEST_P(InstructionSelectorODPITest, BothWithParameters) { |
| 757 const ODPI odpi = GetParam(); | 751 const ODPI odpi = GetParam(); |
| 758 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); | 752 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); |
| 759 Node* n = (m.*odpi.constructor)(m.Parameter(0), m.Parameter(1)); | 753 Node* n = (m.*odpi.constructor)(m.Parameter(0), m.Parameter(1)); |
| 760 m.Return(m.Word32Equal(m.Projection(0, n), m.Projection(1, n))); | 754 m.Return(m.Word32Equal(m.Projection(0, n), m.Projection(1, n))); |
| 761 Stream s = m.Build(); | 755 Stream s = m.Build(); |
| 762 ASSERT_LE(1U, s.size()); | 756 ASSERT_LE(1U, s.size()); |
| 763 EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode()); | 757 EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode()); |
| 764 EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode()); | 758 EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode()); |
| 765 EXPECT_EQ(2U, s[0]->InputCount()); | 759 EXPECT_EQ(2U, s[0]->InputCount()); |
| 766 EXPECT_EQ(2U, s[0]->OutputCount()); | 760 EXPECT_EQ(2U, s[0]->OutputCount()); |
| 767 EXPECT_EQ(kFlags_set, s[0]->flags_mode()); | 761 EXPECT_EQ(kFlags_set, s[0]->flags_mode()); |
| 768 EXPECT_EQ(kOverflow, s[0]->flags_condition()); | 762 EXPECT_EQ(kOverflow, s[0]->flags_condition()); |
| 769 } | 763 } |
| 770 | 764 |
| 771 | 765 |
| 772 TEST_P(ODPITest, BothWithImmediate) { | 766 TEST_P(InstructionSelectorODPITest, BothWithImmediate) { |
| 773 const ODPI odpi = GetParam(); | 767 const ODPI odpi = GetParam(); |
| 774 TRACED_FOREACH(int32_t, imm, kImmediates) { | 768 TRACED_FOREACH(int32_t, imm, kImmediates) { |
| 775 StreamBuilder m(this, kMachInt32, kMachInt32); | 769 StreamBuilder m(this, kMachInt32, kMachInt32); |
| 776 Node* n = (m.*odpi.constructor)(m.Parameter(0), m.Int32Constant(imm)); | 770 Node* n = (m.*odpi.constructor)(m.Parameter(0), m.Int32Constant(imm)); |
| 777 m.Return(m.Word32Equal(m.Projection(0, n), m.Projection(1, n))); | 771 m.Return(m.Word32Equal(m.Projection(0, n), m.Projection(1, n))); |
| 778 Stream s = m.Build(); | 772 Stream s = m.Build(); |
| 779 ASSERT_LE(1U, s.size()); | 773 ASSERT_LE(1U, s.size()); |
| 780 EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode()); | 774 EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode()); |
| 781 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode()); | 775 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode()); |
| 782 ASSERT_EQ(2U, s[0]->InputCount()); | 776 ASSERT_EQ(2U, s[0]->InputCount()); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 795 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode()); | 789 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode()); |
| 796 ASSERT_EQ(2U, s[0]->InputCount()); | 790 ASSERT_EQ(2U, s[0]->InputCount()); |
| 797 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1))); | 791 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1))); |
| 798 EXPECT_EQ(2U, s[0]->OutputCount()); | 792 EXPECT_EQ(2U, s[0]->OutputCount()); |
| 799 EXPECT_EQ(kFlags_set, s[0]->flags_mode()); | 793 EXPECT_EQ(kFlags_set, s[0]->flags_mode()); |
| 800 EXPECT_EQ(kOverflow, s[0]->flags_condition()); | 794 EXPECT_EQ(kOverflow, s[0]->flags_condition()); |
| 801 } | 795 } |
| 802 } | 796 } |
| 803 | 797 |
| 804 | 798 |
| 805 TEST_P(ODPITest, BothWithShiftByParameter) { | 799 TEST_P(InstructionSelectorODPITest, BothWithShiftByParameter) { |
| 806 const ODPI odpi = GetParam(); | 800 const ODPI odpi = GetParam(); |
| 807 TRACED_FOREACH(Shift, shift, kShifts) { | 801 TRACED_FOREACH(Shift, shift, kShifts) { |
| 808 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32); | 802 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32); |
| 809 Node* n = (m.*odpi.constructor)( | 803 Node* n = (m.*odpi.constructor)( |
| 810 m.Parameter(0), (m.*shift.constructor)(m.Parameter(1), m.Parameter(2))); | 804 m.Parameter(0), (m.*shift.constructor)(m.Parameter(1), m.Parameter(2))); |
| 811 m.Return(m.Word32Equal(m.Projection(0, n), m.Projection(1, n))); | 805 m.Return(m.Word32Equal(m.Projection(0, n), m.Projection(1, n))); |
| 812 Stream s = m.Build(); | 806 Stream s = m.Build(); |
| 813 ASSERT_LE(1U, s.size()); | 807 ASSERT_LE(1U, s.size()); |
| 814 EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode()); | 808 EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode()); |
| 815 EXPECT_EQ(shift.r_mode, s[0]->addressing_mode()); | 809 EXPECT_EQ(shift.r_mode, s[0]->addressing_mode()); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 828 EXPECT_EQ(odpi.reverse_arch_opcode, s[0]->arch_opcode()); | 822 EXPECT_EQ(odpi.reverse_arch_opcode, s[0]->arch_opcode()); |
| 829 EXPECT_EQ(shift.r_mode, s[0]->addressing_mode()); | 823 EXPECT_EQ(shift.r_mode, s[0]->addressing_mode()); |
| 830 EXPECT_EQ(3U, s[0]->InputCount()); | 824 EXPECT_EQ(3U, s[0]->InputCount()); |
| 831 EXPECT_EQ(2U, s[0]->OutputCount()); | 825 EXPECT_EQ(2U, s[0]->OutputCount()); |
| 832 EXPECT_EQ(kFlags_set, s[0]->flags_mode()); | 826 EXPECT_EQ(kFlags_set, s[0]->flags_mode()); |
| 833 EXPECT_EQ(kOverflow, s[0]->flags_condition()); | 827 EXPECT_EQ(kOverflow, s[0]->flags_condition()); |
| 834 } | 828 } |
| 835 } | 829 } |
| 836 | 830 |
| 837 | 831 |
| 838 TEST_P(ODPITest, BothWithShiftByImmediate) { | 832 TEST_P(InstructionSelectorODPITest, BothWithShiftByImmediate) { |
| 839 const ODPI odpi = GetParam(); | 833 const ODPI odpi = GetParam(); |
| 840 TRACED_FOREACH(Shift, shift, kShifts) { | 834 TRACED_FOREACH(Shift, shift, kShifts) { |
| 841 TRACED_FORRANGE(int32_t, imm, shift.i_low, shift.i_high) { | 835 TRACED_FORRANGE(int32_t, imm, shift.i_low, shift.i_high) { |
| 842 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); | 836 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); |
| 843 Node* n = (m.*odpi.constructor)( | 837 Node* n = (m.*odpi.constructor)( |
| 844 m.Parameter(0), | 838 m.Parameter(0), |
| 845 (m.*shift.constructor)(m.Parameter(1), m.Int32Constant(imm))); | 839 (m.*shift.constructor)(m.Parameter(1), m.Int32Constant(imm))); |
| 846 m.Return(m.Word32Equal(m.Projection(0, n), m.Projection(1, n))); | 840 m.Return(m.Word32Equal(m.Projection(0, n), m.Projection(1, n))); |
| 847 Stream s = m.Build(); | 841 Stream s = m.Build(); |
| 848 ASSERT_LE(1U, s.size()); | 842 ASSERT_LE(1U, s.size()); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 869 ASSERT_EQ(3U, s[0]->InputCount()); | 863 ASSERT_EQ(3U, s[0]->InputCount()); |
| 870 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2))); | 864 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2))); |
| 871 EXPECT_EQ(2U, s[0]->OutputCount()); | 865 EXPECT_EQ(2U, s[0]->OutputCount()); |
| 872 EXPECT_EQ(kFlags_set, s[0]->flags_mode()); | 866 EXPECT_EQ(kFlags_set, s[0]->flags_mode()); |
| 873 EXPECT_EQ(kOverflow, s[0]->flags_condition()); | 867 EXPECT_EQ(kOverflow, s[0]->flags_condition()); |
| 874 } | 868 } |
| 875 } | 869 } |
| 876 } | 870 } |
| 877 | 871 |
| 878 | 872 |
| 879 TEST_P(ODPITest, BranchWithParameters) { | 873 TEST_P(InstructionSelectorODPITest, BranchWithParameters) { |
| 880 const ODPI odpi = GetParam(); | 874 const ODPI odpi = GetParam(); |
| 881 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); | 875 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); |
| 882 MLabel a, b; | 876 MLabel a, b; |
| 883 Node* n = (m.*odpi.constructor)(m.Parameter(0), m.Parameter(1)); | 877 Node* n = (m.*odpi.constructor)(m.Parameter(0), m.Parameter(1)); |
| 884 m.Branch(m.Projection(1, n), &a, &b); | 878 m.Branch(m.Projection(1, n), &a, &b); |
| 885 m.Bind(&a); | 879 m.Bind(&a); |
| 886 m.Return(m.Int32Constant(0)); | 880 m.Return(m.Int32Constant(0)); |
| 887 m.Bind(&b); | 881 m.Bind(&b); |
| 888 m.Return(m.Projection(0, n)); | 882 m.Return(m.Projection(0, n)); |
| 889 Stream s = m.Build(); | 883 Stream s = m.Build(); |
| 890 ASSERT_EQ(1U, s.size()); | 884 ASSERT_EQ(1U, s.size()); |
| 891 EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode()); | 885 EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode()); |
| 892 EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode()); | 886 EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode()); |
| 893 EXPECT_EQ(4U, s[0]->InputCount()); | 887 EXPECT_EQ(4U, s[0]->InputCount()); |
| 894 EXPECT_EQ(1U, s[0]->OutputCount()); | 888 EXPECT_EQ(1U, s[0]->OutputCount()); |
| 895 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); | 889 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); |
| 896 EXPECT_EQ(kOverflow, s[0]->flags_condition()); | 890 EXPECT_EQ(kOverflow, s[0]->flags_condition()); |
| 897 } | 891 } |
| 898 | 892 |
| 899 | 893 |
| 900 TEST_P(ODPITest, BranchWithImmediate) { | 894 TEST_P(InstructionSelectorODPITest, BranchWithImmediate) { |
| 901 const ODPI odpi = GetParam(); | 895 const ODPI odpi = GetParam(); |
| 902 TRACED_FOREACH(int32_t, imm, kImmediates) { | 896 TRACED_FOREACH(int32_t, imm, kImmediates) { |
| 903 StreamBuilder m(this, kMachInt32, kMachInt32); | 897 StreamBuilder m(this, kMachInt32, kMachInt32); |
| 904 MLabel a, b; | 898 MLabel a, b; |
| 905 Node* n = (m.*odpi.constructor)(m.Parameter(0), m.Int32Constant(imm)); | 899 Node* n = (m.*odpi.constructor)(m.Parameter(0), m.Int32Constant(imm)); |
| 906 m.Branch(m.Projection(1, n), &a, &b); | 900 m.Branch(m.Projection(1, n), &a, &b); |
| 907 m.Bind(&a); | 901 m.Bind(&a); |
| 908 m.Return(m.Int32Constant(0)); | 902 m.Return(m.Int32Constant(0)); |
| 909 m.Bind(&b); | 903 m.Bind(&b); |
| 910 m.Return(m.Projection(0, n)); | 904 m.Return(m.Projection(0, n)); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 933 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode()); | 927 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode()); |
| 934 ASSERT_EQ(4U, s[0]->InputCount()); | 928 ASSERT_EQ(4U, s[0]->InputCount()); |
| 935 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1))); | 929 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1))); |
| 936 EXPECT_EQ(1U, s[0]->OutputCount()); | 930 EXPECT_EQ(1U, s[0]->OutputCount()); |
| 937 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); | 931 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); |
| 938 EXPECT_EQ(kOverflow, s[0]->flags_condition()); | 932 EXPECT_EQ(kOverflow, s[0]->flags_condition()); |
| 939 } | 933 } |
| 940 } | 934 } |
| 941 | 935 |
| 942 | 936 |
| 943 TEST_P(ODPITest, BranchIfZeroWithParameters) { | 937 TEST_P(InstructionSelectorODPITest, BranchIfZeroWithParameters) { |
| 944 const ODPI odpi = GetParam(); | 938 const ODPI odpi = GetParam(); |
| 945 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); | 939 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); |
| 946 MLabel a, b; | 940 MLabel a, b; |
| 947 Node* n = (m.*odpi.constructor)(m.Parameter(0), m.Parameter(1)); | 941 Node* n = (m.*odpi.constructor)(m.Parameter(0), m.Parameter(1)); |
| 948 m.Branch(m.Word32Equal(m.Projection(1, n), m.Int32Constant(0)), &a, &b); | 942 m.Branch(m.Word32Equal(m.Projection(1, n), m.Int32Constant(0)), &a, &b); |
| 949 m.Bind(&a); | 943 m.Bind(&a); |
| 950 m.Return(m.Projection(0, n)); | 944 m.Return(m.Projection(0, n)); |
| 951 m.Bind(&b); | 945 m.Bind(&b); |
| 952 m.Return(m.Int32Constant(0)); | 946 m.Return(m.Int32Constant(0)); |
| 953 Stream s = m.Build(); | 947 Stream s = m.Build(); |
| 954 ASSERT_EQ(1U, s.size()); | 948 ASSERT_EQ(1U, s.size()); |
| 955 EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode()); | 949 EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode()); |
| 956 EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode()); | 950 EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode()); |
| 957 EXPECT_EQ(4U, s[0]->InputCount()); | 951 EXPECT_EQ(4U, s[0]->InputCount()); |
| 958 EXPECT_EQ(1U, s[0]->OutputCount()); | 952 EXPECT_EQ(1U, s[0]->OutputCount()); |
| 959 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); | 953 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); |
| 960 EXPECT_EQ(kNotOverflow, s[0]->flags_condition()); | 954 EXPECT_EQ(kNotOverflow, s[0]->flags_condition()); |
| 961 } | 955 } |
| 962 | 956 |
| 963 | 957 |
| 964 TEST_P(ODPITest, BranchIfNotZeroWithParameters) { | 958 TEST_P(InstructionSelectorODPITest, BranchIfNotZeroWithParameters) { |
| 965 const ODPI odpi = GetParam(); | 959 const ODPI odpi = GetParam(); |
| 966 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); | 960 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); |
| 967 MLabel a, b; | 961 MLabel a, b; |
| 968 Node* n = (m.*odpi.constructor)(m.Parameter(0), m.Parameter(1)); | 962 Node* n = (m.*odpi.constructor)(m.Parameter(0), m.Parameter(1)); |
| 969 m.Branch(m.Word32NotEqual(m.Projection(1, n), m.Int32Constant(0)), &a, &b); | 963 m.Branch(m.Word32NotEqual(m.Projection(1, n), m.Int32Constant(0)), &a, &b); |
| 970 m.Bind(&a); | 964 m.Bind(&a); |
| 971 m.Return(m.Projection(0, n)); | 965 m.Return(m.Projection(0, n)); |
| 972 m.Bind(&b); | 966 m.Bind(&b); |
| 973 m.Return(m.Int32Constant(0)); | 967 m.Return(m.Int32Constant(0)); |
| 974 Stream s = m.Build(); | 968 Stream s = m.Build(); |
| 975 ASSERT_EQ(1U, s.size()); | 969 ASSERT_EQ(1U, s.size()); |
| 976 EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode()); | 970 EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode()); |
| 977 EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode()); | 971 EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode()); |
| 978 EXPECT_EQ(4U, s[0]->InputCount()); | 972 EXPECT_EQ(4U, s[0]->InputCount()); |
| 979 EXPECT_EQ(1U, s[0]->OutputCount()); | 973 EXPECT_EQ(1U, s[0]->OutputCount()); |
| 980 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); | 974 EXPECT_EQ(kFlags_branch, s[0]->flags_mode()); |
| 981 EXPECT_EQ(kOverflow, s[0]->flags_condition()); | 975 EXPECT_EQ(kOverflow, s[0]->flags_condition()); |
| 982 } | 976 } |
| 983 | 977 |
| 984 | 978 |
| 985 } // namespace | 979 INSTANTIATE_TEST_CASE_P(InstructionSelectorTest, InstructionSelectorODPITest, |
| 986 | |
| 987 INSTANTIATE_TEST_CASE_P(InstructionSelectorTest, ODPITest, | |
| 988 ::testing::ValuesIn(kODPIs)); | 980 ::testing::ValuesIn(kODPIs)); |
| 989 | 981 |
| 990 | 982 |
| 991 // ----------------------------------------------------------------------------- | 983 // ----------------------------------------------------------------------------- |
| 992 // Shifts. | 984 // Shifts. |
| 993 | 985 |
| 994 | 986 |
| 995 namespace { | 987 typedef InstructionSelectorTestWithParam<Shift> InstructionSelectorShiftTest; |
| 996 | |
| 997 class ShiftTest : public InstructionSelectorTestWithParam<Shift> {}; | |
| 998 | 988 |
| 999 | 989 |
| 1000 TEST_P(ShiftTest, Parameters) { | 990 TEST_P(InstructionSelectorShiftTest, Parameters) { |
| 1001 const Shift shift = GetParam(); | 991 const Shift shift = GetParam(); |
| 1002 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); | 992 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); |
| 1003 m.Return((m.*shift.constructor)(m.Parameter(0), m.Parameter(1))); | 993 m.Return((m.*shift.constructor)(m.Parameter(0), m.Parameter(1))); |
| 1004 Stream s = m.Build(); | 994 Stream s = m.Build(); |
| 1005 ASSERT_EQ(1U, s.size()); | 995 ASSERT_EQ(1U, s.size()); |
| 1006 EXPECT_EQ(kArmMov, s[0]->arch_opcode()); | 996 EXPECT_EQ(kArmMov, s[0]->arch_opcode()); |
| 1007 EXPECT_EQ(shift.r_mode, s[0]->addressing_mode()); | 997 EXPECT_EQ(shift.r_mode, s[0]->addressing_mode()); |
| 1008 EXPECT_EQ(2U, s[0]->InputCount()); | 998 EXPECT_EQ(2U, s[0]->InputCount()); |
| 1009 EXPECT_EQ(1U, s[0]->OutputCount()); | 999 EXPECT_EQ(1U, s[0]->OutputCount()); |
| 1010 } | 1000 } |
| 1011 | 1001 |
| 1012 | 1002 |
| 1013 TEST_P(ShiftTest, Immediate) { | 1003 TEST_P(InstructionSelectorShiftTest, Immediate) { |
| 1014 const Shift shift = GetParam(); | 1004 const Shift shift = GetParam(); |
| 1015 TRACED_FORRANGE(int32_t, imm, shift.i_low, shift.i_high) { | 1005 TRACED_FORRANGE(int32_t, imm, shift.i_low, shift.i_high) { |
| 1016 StreamBuilder m(this, kMachInt32, kMachInt32); | 1006 StreamBuilder m(this, kMachInt32, kMachInt32); |
| 1017 m.Return((m.*shift.constructor)(m.Parameter(0), m.Int32Constant(imm))); | 1007 m.Return((m.*shift.constructor)(m.Parameter(0), m.Int32Constant(imm))); |
| 1018 Stream s = m.Build(); | 1008 Stream s = m.Build(); |
| 1019 ASSERT_EQ(1U, s.size()); | 1009 ASSERT_EQ(1U, s.size()); |
| 1020 EXPECT_EQ(kArmMov, s[0]->arch_opcode()); | 1010 EXPECT_EQ(kArmMov, s[0]->arch_opcode()); |
| 1021 EXPECT_EQ(shift.i_mode, s[0]->addressing_mode()); | 1011 EXPECT_EQ(shift.i_mode, s[0]->addressing_mode()); |
| 1022 ASSERT_EQ(2U, s[0]->InputCount()); | 1012 ASSERT_EQ(2U, s[0]->InputCount()); |
| 1023 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1))); | 1013 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1))); |
| 1024 EXPECT_EQ(1U, s[0]->OutputCount()); | 1014 EXPECT_EQ(1U, s[0]->OutputCount()); |
| 1025 } | 1015 } |
| 1026 } | 1016 } |
| 1027 | 1017 |
| 1028 | 1018 |
| 1029 TEST_P(ShiftTest, Word32EqualWithParameter) { | 1019 TEST_P(InstructionSelectorShiftTest, Word32EqualWithParameter) { |
| 1030 const Shift shift = GetParam(); | 1020 const Shift shift = GetParam(); |
| 1031 { | 1021 { |
| 1032 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32); | 1022 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32); |
| 1033 m.Return( | 1023 m.Return( |
| 1034 m.Word32Equal(m.Parameter(0), | 1024 m.Word32Equal(m.Parameter(0), |
| 1035 (m.*shift.constructor)(m.Parameter(1), m.Parameter(2)))); | 1025 (m.*shift.constructor)(m.Parameter(1), m.Parameter(2)))); |
| 1036 Stream s = m.Build(); | 1026 Stream s = m.Build(); |
| 1037 ASSERT_EQ(1U, s.size()); | 1027 ASSERT_EQ(1U, s.size()); |
| 1038 EXPECT_EQ(kArmCmp, s[0]->arch_opcode()); | 1028 EXPECT_EQ(kArmCmp, s[0]->arch_opcode()); |
| 1039 EXPECT_EQ(shift.r_mode, s[0]->addressing_mode()); | 1029 EXPECT_EQ(shift.r_mode, s[0]->addressing_mode()); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1052 EXPECT_EQ(kArmCmp, s[0]->arch_opcode()); | 1042 EXPECT_EQ(kArmCmp, s[0]->arch_opcode()); |
| 1053 EXPECT_EQ(shift.r_mode, s[0]->addressing_mode()); | 1043 EXPECT_EQ(shift.r_mode, s[0]->addressing_mode()); |
| 1054 EXPECT_EQ(3U, s[0]->InputCount()); | 1044 EXPECT_EQ(3U, s[0]->InputCount()); |
| 1055 EXPECT_EQ(1U, s[0]->OutputCount()); | 1045 EXPECT_EQ(1U, s[0]->OutputCount()); |
| 1056 EXPECT_EQ(kFlags_set, s[0]->flags_mode()); | 1046 EXPECT_EQ(kFlags_set, s[0]->flags_mode()); |
| 1057 EXPECT_EQ(kEqual, s[0]->flags_condition()); | 1047 EXPECT_EQ(kEqual, s[0]->flags_condition()); |
| 1058 } | 1048 } |
| 1059 } | 1049 } |
| 1060 | 1050 |
| 1061 | 1051 |
| 1062 TEST_P(ShiftTest, Word32EqualWithParameterAndImmediate) { | 1052 TEST_P(InstructionSelectorShiftTest, Word32EqualWithParameterAndImmediate) { |
| 1063 const Shift shift = GetParam(); | 1053 const Shift shift = GetParam(); |
| 1064 TRACED_FORRANGE(int32_t, imm, shift.i_low, shift.i_high) { | 1054 TRACED_FORRANGE(int32_t, imm, shift.i_low, shift.i_high) { |
| 1065 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); | 1055 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); |
| 1066 m.Return(m.Word32Equal( | 1056 m.Return(m.Word32Equal( |
| 1067 (m.*shift.constructor)(m.Parameter(1), m.Int32Constant(imm)), | 1057 (m.*shift.constructor)(m.Parameter(1), m.Int32Constant(imm)), |
| 1068 m.Parameter(0))); | 1058 m.Parameter(0))); |
| 1069 Stream s = m.Build(); | 1059 Stream s = m.Build(); |
| 1070 ASSERT_EQ(1U, s.size()); | 1060 ASSERT_EQ(1U, s.size()); |
| 1071 EXPECT_EQ(kArmCmp, s[0]->arch_opcode()); | 1061 EXPECT_EQ(kArmCmp, s[0]->arch_opcode()); |
| 1072 EXPECT_EQ(shift.i_mode, s[0]->addressing_mode()); | 1062 EXPECT_EQ(shift.i_mode, s[0]->addressing_mode()); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1087 EXPECT_EQ(shift.i_mode, s[0]->addressing_mode()); | 1077 EXPECT_EQ(shift.i_mode, s[0]->addressing_mode()); |
| 1088 ASSERT_EQ(3U, s[0]->InputCount()); | 1078 ASSERT_EQ(3U, s[0]->InputCount()); |
| 1089 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2))); | 1079 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2))); |
| 1090 EXPECT_EQ(1U, s[0]->OutputCount()); | 1080 EXPECT_EQ(1U, s[0]->OutputCount()); |
| 1091 EXPECT_EQ(kFlags_set, s[0]->flags_mode()); | 1081 EXPECT_EQ(kFlags_set, s[0]->flags_mode()); |
| 1092 EXPECT_EQ(kEqual, s[0]->flags_condition()); | 1082 EXPECT_EQ(kEqual, s[0]->flags_condition()); |
| 1093 } | 1083 } |
| 1094 } | 1084 } |
| 1095 | 1085 |
| 1096 | 1086 |
| 1097 TEST_P(ShiftTest, Word32EqualToZeroWithParameters) { | 1087 TEST_P(InstructionSelectorShiftTest, Word32EqualToZeroWithParameters) { |
| 1098 const Shift shift = GetParam(); | 1088 const Shift shift = GetParam(); |
| 1099 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); | 1089 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); |
| 1100 m.Return( | 1090 m.Return( |
| 1101 m.Word32Equal(m.Int32Constant(0), | 1091 m.Word32Equal(m.Int32Constant(0), |
| 1102 (m.*shift.constructor)(m.Parameter(0), m.Parameter(1)))); | 1092 (m.*shift.constructor)(m.Parameter(0), m.Parameter(1)))); |
| 1103 Stream s = m.Build(); | 1093 Stream s = m.Build(); |
| 1104 ASSERT_EQ(1U, s.size()); | 1094 ASSERT_EQ(1U, s.size()); |
| 1105 EXPECT_EQ(kArmMov, s[0]->arch_opcode()); | 1095 EXPECT_EQ(kArmMov, s[0]->arch_opcode()); |
| 1106 EXPECT_EQ(shift.r_mode, s[0]->addressing_mode()); | 1096 EXPECT_EQ(shift.r_mode, s[0]->addressing_mode()); |
| 1107 EXPECT_EQ(2U, s[0]->InputCount()); | 1097 EXPECT_EQ(2U, s[0]->InputCount()); |
| 1108 EXPECT_EQ(2U, s[0]->OutputCount()); | 1098 EXPECT_EQ(2U, s[0]->OutputCount()); |
| 1109 EXPECT_EQ(kFlags_set, s[0]->flags_mode()); | 1099 EXPECT_EQ(kFlags_set, s[0]->flags_mode()); |
| 1110 EXPECT_EQ(kEqual, s[0]->flags_condition()); | 1100 EXPECT_EQ(kEqual, s[0]->flags_condition()); |
| 1111 } | 1101 } |
| 1112 | 1102 |
| 1113 | 1103 |
| 1114 TEST_P(ShiftTest, Word32EqualToZeroWithImmediate) { | 1104 TEST_P(InstructionSelectorShiftTest, Word32EqualToZeroWithImmediate) { |
| 1115 const Shift shift = GetParam(); | 1105 const Shift shift = GetParam(); |
| 1116 TRACED_FORRANGE(int32_t, imm, shift.i_low, shift.i_high) { | 1106 TRACED_FORRANGE(int32_t, imm, shift.i_low, shift.i_high) { |
| 1117 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); | 1107 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); |
| 1118 m.Return(m.Word32Equal( | 1108 m.Return(m.Word32Equal( |
| 1119 m.Int32Constant(0), | 1109 m.Int32Constant(0), |
| 1120 (m.*shift.constructor)(m.Parameter(0), m.Int32Constant(imm)))); | 1110 (m.*shift.constructor)(m.Parameter(0), m.Int32Constant(imm)))); |
| 1121 Stream s = m.Build(); | 1111 Stream s = m.Build(); |
| 1122 ASSERT_EQ(1U, s.size()); | 1112 ASSERT_EQ(1U, s.size()); |
| 1123 EXPECT_EQ(kArmMov, s[0]->arch_opcode()); | 1113 EXPECT_EQ(kArmMov, s[0]->arch_opcode()); |
| 1124 EXPECT_EQ(shift.i_mode, s[0]->addressing_mode()); | 1114 EXPECT_EQ(shift.i_mode, s[0]->addressing_mode()); |
| 1125 ASSERT_EQ(2U, s[0]->InputCount()); | 1115 ASSERT_EQ(2U, s[0]->InputCount()); |
| 1126 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1))); | 1116 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1))); |
| 1127 EXPECT_EQ(2U, s[0]->OutputCount()); | 1117 EXPECT_EQ(2U, s[0]->OutputCount()); |
| 1128 EXPECT_EQ(kFlags_set, s[0]->flags_mode()); | 1118 EXPECT_EQ(kFlags_set, s[0]->flags_mode()); |
| 1129 EXPECT_EQ(kEqual, s[0]->flags_condition()); | 1119 EXPECT_EQ(kEqual, s[0]->flags_condition()); |
| 1130 } | 1120 } |
| 1131 } | 1121 } |
| 1132 | 1122 |
| 1133 | 1123 |
| 1134 TEST_P(ShiftTest, Word32NotWithParameters) { | 1124 TEST_P(InstructionSelectorShiftTest, Word32NotWithParameters) { |
| 1135 const Shift shift = GetParam(); | 1125 const Shift shift = GetParam(); |
| 1136 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); | 1126 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); |
| 1137 m.Return(m.Word32Not((m.*shift.constructor)(m.Parameter(0), m.Parameter(1)))); | 1127 m.Return(m.Word32Not((m.*shift.constructor)(m.Parameter(0), m.Parameter(1)))); |
| 1138 Stream s = m.Build(); | 1128 Stream s = m.Build(); |
| 1139 ASSERT_EQ(1U, s.size()); | 1129 ASSERT_EQ(1U, s.size()); |
| 1140 EXPECT_EQ(kArmMvn, s[0]->arch_opcode()); | 1130 EXPECT_EQ(kArmMvn, s[0]->arch_opcode()); |
| 1141 EXPECT_EQ(shift.r_mode, s[0]->addressing_mode()); | 1131 EXPECT_EQ(shift.r_mode, s[0]->addressing_mode()); |
| 1142 EXPECT_EQ(2U, s[0]->InputCount()); | 1132 EXPECT_EQ(2U, s[0]->InputCount()); |
| 1143 EXPECT_EQ(1U, s[0]->OutputCount()); | 1133 EXPECT_EQ(1U, s[0]->OutputCount()); |
| 1144 } | 1134 } |
| 1145 | 1135 |
| 1146 | 1136 |
| 1147 TEST_P(ShiftTest, Word32NotWithImmediate) { | 1137 TEST_P(InstructionSelectorShiftTest, Word32NotWithImmediate) { |
| 1148 const Shift shift = GetParam(); | 1138 const Shift shift = GetParam(); |
| 1149 TRACED_FORRANGE(int32_t, imm, shift.i_low, shift.i_high) { | 1139 TRACED_FORRANGE(int32_t, imm, shift.i_low, shift.i_high) { |
| 1150 StreamBuilder m(this, kMachInt32, kMachInt32); | 1140 StreamBuilder m(this, kMachInt32, kMachInt32); |
| 1151 m.Return(m.Word32Not( | 1141 m.Return(m.Word32Not( |
| 1152 (m.*shift.constructor)(m.Parameter(0), m.Int32Constant(imm)))); | 1142 (m.*shift.constructor)(m.Parameter(0), m.Int32Constant(imm)))); |
| 1153 Stream s = m.Build(); | 1143 Stream s = m.Build(); |
| 1154 ASSERT_EQ(1U, s.size()); | 1144 ASSERT_EQ(1U, s.size()); |
| 1155 EXPECT_EQ(kArmMvn, s[0]->arch_opcode()); | 1145 EXPECT_EQ(kArmMvn, s[0]->arch_opcode()); |
| 1156 EXPECT_EQ(shift.i_mode, s[0]->addressing_mode()); | 1146 EXPECT_EQ(shift.i_mode, s[0]->addressing_mode()); |
| 1157 ASSERT_EQ(2U, s[0]->InputCount()); | 1147 ASSERT_EQ(2U, s[0]->InputCount()); |
| 1158 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1))); | 1148 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1))); |
| 1159 EXPECT_EQ(1U, s[0]->OutputCount()); | 1149 EXPECT_EQ(1U, s[0]->OutputCount()); |
| 1160 } | 1150 } |
| 1161 } | 1151 } |
| 1162 | 1152 |
| 1163 | 1153 |
| 1164 TEST_P(ShiftTest, Word32AndWithWord32NotWithParameters) { | 1154 TEST_P(InstructionSelectorShiftTest, Word32AndWithWord32NotWithParameters) { |
| 1165 const Shift shift = GetParam(); | 1155 const Shift shift = GetParam(); |
| 1166 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32); | 1156 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32); |
| 1167 m.Return(m.Word32And(m.Parameter(0), m.Word32Not((m.*shift.constructor)( | 1157 m.Return(m.Word32And(m.Parameter(0), m.Word32Not((m.*shift.constructor)( |
| 1168 m.Parameter(1), m.Parameter(2))))); | 1158 m.Parameter(1), m.Parameter(2))))); |
| 1169 Stream s = m.Build(); | 1159 Stream s = m.Build(); |
| 1170 ASSERT_EQ(1U, s.size()); | 1160 ASSERT_EQ(1U, s.size()); |
| 1171 EXPECT_EQ(kArmBic, s[0]->arch_opcode()); | 1161 EXPECT_EQ(kArmBic, s[0]->arch_opcode()); |
| 1172 EXPECT_EQ(shift.r_mode, s[0]->addressing_mode()); | 1162 EXPECT_EQ(shift.r_mode, s[0]->addressing_mode()); |
| 1173 EXPECT_EQ(3U, s[0]->InputCount()); | 1163 EXPECT_EQ(3U, s[0]->InputCount()); |
| 1174 EXPECT_EQ(1U, s[0]->OutputCount()); | 1164 EXPECT_EQ(1U, s[0]->OutputCount()); |
| 1175 } | 1165 } |
| 1176 | 1166 |
| 1177 | 1167 |
| 1178 TEST_P(ShiftTest, Word32AndWithWord32NotWithImmediate) { | 1168 TEST_P(InstructionSelectorShiftTest, Word32AndWithWord32NotWithImmediate) { |
| 1179 const Shift shift = GetParam(); | 1169 const Shift shift = GetParam(); |
| 1180 TRACED_FORRANGE(int32_t, imm, shift.i_low, shift.i_high) { | 1170 TRACED_FORRANGE(int32_t, imm, shift.i_low, shift.i_high) { |
| 1181 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); | 1171 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32); |
| 1182 m.Return(m.Word32And(m.Parameter(0), | 1172 m.Return(m.Word32And(m.Parameter(0), |
| 1183 m.Word32Not((m.*shift.constructor)( | 1173 m.Word32Not((m.*shift.constructor)( |
| 1184 m.Parameter(1), m.Int32Constant(imm))))); | 1174 m.Parameter(1), m.Int32Constant(imm))))); |
| 1185 Stream s = m.Build(); | 1175 Stream s = m.Build(); |
| 1186 ASSERT_EQ(1U, s.size()); | 1176 ASSERT_EQ(1U, s.size()); |
| 1187 EXPECT_EQ(kArmBic, s[0]->arch_opcode()); | 1177 EXPECT_EQ(kArmBic, s[0]->arch_opcode()); |
| 1188 EXPECT_EQ(shift.i_mode, s[0]->addressing_mode()); | 1178 EXPECT_EQ(shift.i_mode, s[0]->addressing_mode()); |
| 1189 ASSERT_EQ(3U, s[0]->InputCount()); | 1179 ASSERT_EQ(3U, s[0]->InputCount()); |
| 1190 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2))); | 1180 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2))); |
| 1191 EXPECT_EQ(1U, s[0]->OutputCount()); | 1181 EXPECT_EQ(1U, s[0]->OutputCount()); |
| 1192 } | 1182 } |
| 1193 } | 1183 } |
| 1194 | 1184 |
| 1195 | 1185 |
| 1196 } // namespace | 1186 INSTANTIATE_TEST_CASE_P(InstructionSelectorTest, InstructionSelectorShiftTest, |
| 1197 | |
| 1198 | |
| 1199 INSTANTIATE_TEST_CASE_P(InstructionSelectorTest, ShiftTest, | |
| 1200 ::testing::ValuesIn(kShifts)); | 1187 ::testing::ValuesIn(kShifts)); |
| 1201 | 1188 |
| 1202 | 1189 |
| 1203 // ----------------------------------------------------------------------------- | 1190 // ----------------------------------------------------------------------------- |
| 1204 // Miscellaneous. | 1191 // Miscellaneous. |
| 1205 | 1192 |
| 1206 | 1193 |
| 1207 TEST_F(InstructionSelectorTest, Int32AddWithInt32Mul) { | 1194 TEST_F(InstructionSelectorTest, Int32AddWithInt32Mul) { |
| 1208 { | 1195 { |
| 1209 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32); | 1196 StreamBuilder m(this, kMachInt32, kMachInt32, kMachInt32, kMachInt32); |
| (...skipping 544 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1754 ASSERT_EQ(3U, s[0]->InputCount()); | 1741 ASSERT_EQ(3U, s[0]->InputCount()); |
| 1755 EXPECT_EQ(lsb, s.ToInt32(s[0]->InputAt(1))); | 1742 EXPECT_EQ(lsb, s.ToInt32(s[0]->InputAt(1))); |
| 1756 EXPECT_EQ(width, s.ToInt32(s[0]->InputAt(2))); | 1743 EXPECT_EQ(width, s.ToInt32(s[0]->InputAt(2))); |
| 1757 } | 1744 } |
| 1758 } | 1745 } |
| 1759 } | 1746 } |
| 1760 | 1747 |
| 1761 } // namespace compiler | 1748 } // namespace compiler |
| 1762 } // namespace internal | 1749 } // namespace internal |
| 1763 } // namespace v8 | 1750 } // namespace v8 |
| OLD | NEW |