| 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 "src/compiler/code-generator.h" | 5 #include "src/compiler/code-generator.h" |
| 6 #include "src/compiler/code-generator-impl.h" | 6 #include "src/compiler/code-generator-impl.h" |
| 7 #include "src/compiler/gap-resolver.h" | 7 #include "src/compiler/gap-resolver.h" |
| 8 #include "src/compiler/node-matchers.h" | 8 #include "src/compiler/node-matchers.h" |
| 9 #include "src/compiler/node-properties-inl.h" | 9 #include "src/compiler/node-properties-inl.h" |
| 10 #include "src/mips/macro-assembler-mips.h" | 10 #include "src/mips/macro-assembler-mips.h" |
| (...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 384 } | 384 } |
| 385 } | 385 } |
| 386 | 386 |
| 387 | 387 |
| 388 #define UNSUPPORTED_COND(opcode, condition) \ | 388 #define UNSUPPORTED_COND(opcode, condition) \ |
| 389 OFStream out(stdout); \ | 389 OFStream out(stdout); \ |
| 390 out << "Unsupported " << #opcode << " condition: \"" << condition << "\""; \ | 390 out << "Unsupported " << #opcode << " condition: \"" << condition << "\""; \ |
| 391 UNIMPLEMENTED(); | 391 UNIMPLEMENTED(); |
| 392 | 392 |
| 393 // Assembles branches after an instruction. | 393 // Assembles branches after an instruction. |
| 394 void CodeGenerator::AssembleArchBranch(Instruction* instr, | 394 void CodeGenerator::AssembleArchBranch(Instruction* instr, BranchInfo* branch) { |
| 395 FlagsCondition condition) { | |
| 396 MipsOperandConverter i(this, instr); | 395 MipsOperandConverter i(this, instr); |
| 397 Label* tlabel = branch->true_label; | 396 Label* tlabel = branch->true_label; |
| 398 Label* flabel = branch->false_label; | 397 Label* flabel = branch->false_label; |
| 399 Condition cc = kNoCondition; | 398 Condition cc = kNoCondition; |
| 400 | 399 |
| 401 // MIPS does not have condition code flags, so compare and branch are | 400 // MIPS does not have condition code flags, so compare and branch are |
| 402 // implemented differently than on the other arch's. The compare operations | 401 // implemented differently than on the other arch's. The compare operations |
| 403 // emit mips pseudo-instructions, which are handled here by branch | 402 // emit mips pseudo-instructions, which are handled here by branch |
| 404 // instructions that do the actual comparison. Essential that the input | 403 // instructions that do the actual comparison. Essential that the input |
| 405 // registers to compare pseudo-op are not modified before this branch op, as | 404 // registers to compare pseudo-op are not modified before this branch op, as |
| 406 // they are tested here. | 405 // they are tested here. |
| 407 // TODO(plind): Add CHECK() to ensure that test/cmp and this branch were | 406 // TODO(plind): Add CHECK() to ensure that test/cmp and this branch were |
| 408 // not separated by other instructions. | 407 // not separated by other instructions. |
| 409 | 408 |
| 410 if (instr->arch_opcode() == kMipsTst) { | 409 if (instr->arch_opcode() == kMipsTst) { |
| 411 switch (branch->condition) { | 410 switch (branch->condition) { |
| 412 case kNotEqual: | 411 case kNotEqual: |
| 413 cc = ne; | 412 cc = ne; |
| 414 break; | 413 break; |
| 415 case kEqual: | 414 case kEqual: |
| 416 cc = eq; | 415 cc = eq; |
| 417 break; | 416 break; |
| 418 default: | 417 default: |
| 419 UNSUPPORTED_COND(kMipsTst, condition); | 418 UNSUPPORTED_COND(kMipsTst, branch->condition); |
| 420 break; | 419 break; |
| 421 } | 420 } |
| 422 __ And(at, i.InputRegister(0), i.InputOperand(1)); | 421 __ And(at, i.InputRegister(0), i.InputOperand(1)); |
| 423 __ Branch(tlabel, cc, at, Operand(zero_reg)); | 422 __ Branch(tlabel, cc, at, Operand(zero_reg)); |
| 424 | 423 |
| 425 } else if (instr->arch_opcode() == kMipsAddOvf || | 424 } else if (instr->arch_opcode() == kMipsAddOvf || |
| 426 instr->arch_opcode() == kMipsSubOvf) { | 425 instr->arch_opcode() == kMipsSubOvf) { |
| 427 // kMipsAddOvf, SubOvf emit negative result to 'kCompareReg' on overflow. | 426 // kMipsAddOvf, SubOvf emit negative result to 'kCompareReg' on overflow. |
| 428 switch (branch->condition) { | 427 switch (branch->condition) { |
| 429 case kOverflow: | 428 case kOverflow: |
| (...skipping 507 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 937 } | 936 } |
| 938 } | 937 } |
| 939 MarkLazyDeoptSite(); | 938 MarkLazyDeoptSite(); |
| 940 } | 939 } |
| 941 | 940 |
| 942 #undef __ | 941 #undef __ |
| 943 | 942 |
| 944 } // namespace compiler | 943 } // namespace compiler |
| 945 } // namespace internal | 944 } // namespace internal |
| 946 } // namespace v8 | 945 } // namespace v8 |
| OLD | NEW |