Lines Matching refs:node
27 InstructionOperand UseOperand(Node* node, InstructionCode opcode) { in UseOperand() argument
28 if (CanBeImmediate(node, opcode)) { in UseOperand()
29 return UseImmediate(node); in UseOperand()
31 return UseRegister(node); in UseOperand()
36 InstructionOperand UseRegisterOrImmediateZero(Node* node) { in UseRegisterOrImmediateZero() argument
37 if ((IsIntegerConstant(node) && (GetIntegerConstantValue(node) == 0)) || in UseRegisterOrImmediateZero()
38 (IsFloatConstant(node) && in UseRegisterOrImmediateZero()
39 (bit_cast<int64_t>(GetFloatConstantValue(node)) == V8_INT64_C(0)))) { in UseRegisterOrImmediateZero()
40 return UseImmediate(node); in UseRegisterOrImmediateZero()
42 return UseRegister(node); in UseRegisterOrImmediateZero()
45 bool IsIntegerConstant(Node* node) { in IsIntegerConstant() argument
46 return (node->opcode() == IrOpcode::kInt32Constant); in IsIntegerConstant()
49 int64_t GetIntegerConstantValue(Node* node) { in GetIntegerConstantValue() argument
50 DCHECK(node->opcode() == IrOpcode::kInt32Constant); in GetIntegerConstantValue()
51 return OpParameter<int32_t>(node); in GetIntegerConstantValue()
54 bool IsFloatConstant(Node* node) { in IsFloatConstant() argument
55 return (node->opcode() == IrOpcode::kFloat32Constant) || in IsFloatConstant()
56 (node->opcode() == IrOpcode::kFloat64Constant); in IsFloatConstant()
59 double GetFloatConstantValue(Node* node) { in GetFloatConstantValue() argument
60 if (node->opcode() == IrOpcode::kFloat32Constant) { in GetFloatConstantValue()
61 return OpParameter<float>(node); in GetFloatConstantValue()
63 DCHECK_EQ(IrOpcode::kFloat64Constant, node->opcode()); in GetFloatConstantValue()
64 return OpParameter<double>(node); in GetFloatConstantValue()
67 bool CanBeImmediate(Node* node, InstructionCode opcode) { in CanBeImmediate() argument
68 Int32Matcher m(node); in CanBeImmediate()
124 Node* node) { in VisitRRR() argument
126 selector->Emit(opcode, g.DefineAsRegister(node), in VisitRRR()
127 g.UseRegister(node->InputAt(0)), in VisitRRR()
128 g.UseRegister(node->InputAt(1))); in VisitRRR()
133 Node* node) { in VisitRR() argument
135 selector->Emit(opcode, g.DefineAsRegister(node), in VisitRR()
136 g.UseRegister(node->InputAt(0))); in VisitRR()
141 Node* node) { in VisitRRO() argument
143 selector->Emit(opcode, g.DefineAsRegister(node), in VisitRRO()
144 g.UseRegister(node->InputAt(0)), in VisitRRO()
145 g.UseOperand(node->InputAt(1), opcode)); in VisitRRO()
149 InstructionCode* opcode_return, Node* node, in TryMatchImmediate() argument
152 if (g.CanBeImmediate(node, *opcode_return)) { in TryMatchImmediate()
154 inputs[0] = g.UseImmediate(node); in TryMatchImmediate()
161 static void VisitBinop(InstructionSelector* selector, Node* node, in VisitBinop() argument
166 Int32BinopMatcher m(node); in VisitBinop()
172 if (TryMatchImmediate(selector, &opcode, m.right().node(), &input_count, in VisitBinop()
174 inputs[0] = g.UseRegister(m.left().node()); in VisitBinop()
178 TryMatchImmediate(selector, &reverse_opcode, m.left().node(), in VisitBinop()
180 inputs[0] = g.UseRegister(m.right().node()); in VisitBinop()
184 inputs[input_count++] = g.UseRegister(m.left().node()); in VisitBinop()
185 inputs[input_count++] = g.UseOperand(m.right().node(), opcode); in VisitBinop()
197 outputs[output_count++] = g.DefineSameAsFirst(node); in VisitBinop()
199 outputs[output_count++] = g.DefineAsRegister(node); in VisitBinop()
219 static void VisitBinop(InstructionSelector* selector, Node* node, in VisitBinop() argument
223 VisitBinop(selector, node, opcode, has_reverse_opcode, reverse_opcode, &cont); in VisitBinop()
226 static void VisitBinop(InstructionSelector* selector, Node* node, in VisitBinop() argument
228 VisitBinop(selector, node, opcode, false, kArchNop, cont); in VisitBinop()
231 static void VisitBinop(InstructionSelector* selector, Node* node, in VisitBinop() argument
233 VisitBinop(selector, node, opcode, false, kArchNop); in VisitBinop()
237 void InstructionSelector::VisitLoad(Node* node) { in VisitLoad() argument
238 LoadRepresentation load_rep = LoadRepresentationOf(node->op()); in VisitLoad()
240 Node* base = node->InputAt(0); in VisitLoad()
241 Node* index = node->InputAt(1); in VisitLoad()
273 g.DefineAsRegister(node), g.UseRegister(base), g.UseImmediate(index)); in VisitLoad()
280 g.DefineAsRegister(node), addr_reg, g.TempImmediate(0)); in VisitLoad()
284 void InstructionSelector::VisitProtectedLoad(Node* node) { in VisitProtectedLoad() argument
289 void InstructionSelector::VisitStore(Node* node) { in VisitStore() argument
291 Node* base = node->InputAt(0); in VisitStore()
292 Node* index = node->InputAt(1); in VisitStore()
293 Node* value = node->InputAt(2); in VisitStore()
295 StoreRepresentation store_rep = StoreRepresentationOf(node->op()); in VisitStore()
372 void InstructionSelector::VisitWord32And(Node* node) { in VisitWord32And() argument
374 Int32BinopMatcher m(node); in VisitWord32And()
375 if (m.left().IsWord32Shr() && CanCover(node, m.left().node()) && in VisitWord32And()
386 Int32BinopMatcher mleft(m.left().node()); in VisitWord32And()
397 Emit(kMipsExt, g.DefineAsRegister(node), in VisitWord32And()
398 g.UseRegister(mleft.left().node()), g.TempImmediate(lsb), in VisitWord32And()
412 Emit(kMipsIns, g.DefineSameAsFirst(node), g.UseRegister(m.left().node()), in VisitWord32And()
417 VisitBinop(this, node, kMipsAnd, true, kMipsAnd); in VisitWord32And()
421 void InstructionSelector::VisitWord32Or(Node* node) { in VisitWord32Or() argument
422 VisitBinop(this, node, kMipsOr, true, kMipsOr); in VisitWord32Or()
426 void InstructionSelector::VisitWord32Xor(Node* node) { in VisitWord32Xor() argument
427 Int32BinopMatcher m(node); in VisitWord32Xor()
428 if (m.left().IsWord32Or() && CanCover(node, m.left().node()) && in VisitWord32Xor()
430 Int32BinopMatcher mleft(m.left().node()); in VisitWord32Xor()
433 Emit(kMipsNor, g.DefineAsRegister(node), in VisitWord32Xor()
434 g.UseRegister(mleft.left().node()), in VisitWord32Xor()
435 g.UseRegister(mleft.right().node())); in VisitWord32Xor()
442 Emit(kMipsNor, g.DefineAsRegister(node), g.UseRegister(m.left().node()), in VisitWord32Xor()
446 VisitBinop(this, node, kMipsXor, true, kMipsXor); in VisitWord32Xor()
450 void InstructionSelector::VisitWord32Shl(Node* node) { in VisitWord32Shl() argument
451 Int32BinopMatcher m(node); in VisitWord32Shl()
452 if (m.left().IsWord32And() && CanCover(node, m.left().node()) && in VisitWord32Shl()
455 Int32BinopMatcher mleft(m.left().node()); in VisitWord32Shl()
469 Emit(kMipsShl, g.DefineAsRegister(node), in VisitWord32Shl()
470 g.UseRegister(mleft.left().node()), in VisitWord32Shl()
471 g.UseImmediate(m.right().node())); in VisitWord32Shl()
477 VisitRRO(this, kMipsShl, node); in VisitWord32Shl()
481 void InstructionSelector::VisitWord32Shr(Node* node) { in VisitWord32Shr() argument
482 Int32BinopMatcher m(node); in VisitWord32Shr()
485 Int32BinopMatcher mleft(m.left().node()); in VisitWord32Shr()
495 Emit(kMipsExt, g.DefineAsRegister(node), in VisitWord32Shr()
496 g.UseRegister(mleft.left().node()), g.TempImmediate(lsb), in VisitWord32Shr()
502 VisitRRO(this, kMipsShr, node); in VisitWord32Shr()
506 void InstructionSelector::VisitWord32Sar(Node* node) { in VisitWord32Sar() argument
507 Int32BinopMatcher m(node); in VisitWord32Sar()
508 if (m.left().IsWord32Shl() && CanCover(node, m.left().node())) { in VisitWord32Sar()
509 Int32BinopMatcher mleft(m.left().node()); in VisitWord32Sar()
515 Emit(kMipsSeh, g.DefineAsRegister(node), in VisitWord32Sar()
516 g.UseRegister(mleft.left().node())); in VisitWord32Sar()
519 Emit(kMipsSeb, g.DefineAsRegister(node), in VisitWord32Sar()
520 g.UseRegister(mleft.left().node())); in VisitWord32Sar()
525 VisitRRO(this, kMipsSar, node); in VisitWord32Sar()
530 InstructionCode single_opcode, Node* node) { in VisitInt32PairBinop() argument
533 Node* projection1 = NodeProperties::FindProjection(node, 1); in VisitInt32PairBinop()
538 InstructionOperand inputs[] = {g.UseUniqueRegister(node->InputAt(0)), in VisitInt32PairBinop()
539 g.UseUniqueRegister(node->InputAt(1)), in VisitInt32PairBinop()
540 g.UseUniqueRegister(node->InputAt(2)), in VisitInt32PairBinop()
541 g.UseUniqueRegister(node->InputAt(3))}; in VisitInt32PairBinop()
544 g.DefineAsRegister(node), in VisitInt32PairBinop()
545 g.DefineAsRegister(NodeProperties::FindProjection(node, 1))}; in VisitInt32PairBinop()
550 selector->Emit(single_opcode, g.DefineSameAsFirst(node), in VisitInt32PairBinop()
551 g.UseRegister(node->InputAt(0)), in VisitInt32PairBinop()
552 g.UseRegister(node->InputAt(2))); in VisitInt32PairBinop()
556 void InstructionSelector::VisitInt32PairAdd(Node* node) { in VisitInt32PairAdd() argument
557 VisitInt32PairBinop(this, kMipsAddPair, kMipsAdd, node); in VisitInt32PairAdd()
560 void InstructionSelector::VisitInt32PairSub(Node* node) { in VisitInt32PairSub() argument
561 VisitInt32PairBinop(this, kMipsSubPair, kMipsSub, node); in VisitInt32PairSub()
564 void InstructionSelector::VisitInt32PairMul(Node* node) { in VisitInt32PairMul() argument
565 VisitInt32PairBinop(this, kMipsMulPair, kMipsMul, node); in VisitInt32PairMul()
570 InstructionCode opcode, Node* node) { in VisitWord32PairShift() argument
572 Int32Matcher m(node->InputAt(2)); in VisitWord32PairShift()
575 shift_operand = g.UseImmediate(m.node()); in VisitWord32PairShift()
577 shift_operand = g.UseUniqueRegister(m.node()); in VisitWord32PairShift()
582 InstructionOperand inputs[] = {g.UseUniqueRegister(node->InputAt(0)), in VisitWord32PairShift()
583 g.UseUniqueRegister(node->InputAt(1)), in VisitWord32PairShift()
586 Node* projection1 = NodeProperties::FindProjection(node, 1); in VisitWord32PairShift()
593 outputs[output_count++] = g.DefineAsRegister(node); in VisitWord32PairShift()
603 void InstructionSelector::VisitWord32PairShl(Node* node) { in VisitWord32PairShl() argument
604 VisitWord32PairShift(this, kMipsShlPair, node); in VisitWord32PairShl()
607 void InstructionSelector::VisitWord32PairShr(Node* node) { in VisitWord32PairShr() argument
608 VisitWord32PairShift(this, kMipsShrPair, node); in VisitWord32PairShr()
611 void InstructionSelector::VisitWord32PairSar(Node* node) { in VisitWord32PairSar() argument
612 VisitWord32PairShift(this, kMipsSarPair, node); in VisitWord32PairSar()
615 void InstructionSelector::VisitWord32Ror(Node* node) { in VisitWord32Ror() argument
616 VisitRRO(this, kMipsRor, node); in VisitWord32Ror()
620 void InstructionSelector::VisitWord32Clz(Node* node) { in VisitWord32Clz() argument
621 VisitRR(this, kMipsClz, node); in VisitWord32Clz()
625 void InstructionSelector::VisitWord32ReverseBits(Node* node) { UNREACHABLE(); } in VisitWord32ReverseBits() argument
627 void InstructionSelector::VisitWord64ReverseBytes(Node* node) { UNREACHABLE(); } in VisitWord64ReverseBytes() argument
629 void InstructionSelector::VisitWord32ReverseBytes(Node* node) { in VisitWord32ReverseBytes() argument
631 Emit(kMipsByteSwap32, g.DefineAsRegister(node), in VisitWord32ReverseBytes()
632 g.UseRegister(node->InputAt(0))); in VisitWord32ReverseBytes()
635 void InstructionSelector::VisitWord32Ctz(Node* node) { in VisitWord32Ctz() argument
637 Emit(kMipsCtz, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0))); in VisitWord32Ctz()
641 void InstructionSelector::VisitWord32Popcnt(Node* node) { in VisitWord32Popcnt() argument
643 Emit(kMipsPopcnt, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0))); in VisitWord32Popcnt()
647 void InstructionSelector::VisitInt32Add(Node* node) { in VisitInt32Add() argument
649 Int32BinopMatcher m(node); in VisitInt32Add()
653 CanCover(node, m.left().node()) && CanCover(node, m.right().node())) { in VisitInt32Add()
654 Int32BinopMatcher mright(m.right().node()); in VisitInt32Add()
657 Emit(kMipsLsa, g.DefineAsRegister(node), g.UseRegister(m.left().node()), in VisitInt32Add()
658 g.UseRegister(mright.left().node()), g.TempImmediate(shift_value)); in VisitInt32Add()
665 CanCover(node, m.right().node()) && CanCover(node, m.left().node())) { in VisitInt32Add()
666 Int32BinopMatcher mleft(m.left().node()); in VisitInt32Add()
669 Emit(kMipsLsa, g.DefineAsRegister(node), g.UseRegister(m.right().node()), in VisitInt32Add()
670 g.UseRegister(mleft.left().node()), g.TempImmediate(shift_value)); in VisitInt32Add()
675 VisitBinop(this, node, kMipsAdd, true, kMipsAdd); in VisitInt32Add()
679 void InstructionSelector::VisitInt32Sub(Node* node) { in VisitInt32Sub() argument
680 VisitBinop(this, node, kMipsSub); in VisitInt32Sub()
684 void InstructionSelector::VisitInt32Mul(Node* node) { in VisitInt32Mul() argument
686 Int32BinopMatcher m(node); in VisitInt32Mul()
691 g.DefineAsRegister(node), g.UseRegister(m.left().node()), in VisitInt32Mul()
696 Emit(kMipsLsa, g.DefineAsRegister(node), g.UseRegister(m.left().node()), in VisitInt32Mul()
697 g.UseRegister(m.left().node()), in VisitInt32Mul()
704 g.UseRegister(m.left().node()), in VisitInt32Mul()
707 g.DefineAsRegister(node), temp, g.UseRegister(m.left().node())); in VisitInt32Mul()
711 VisitRRR(this, kMipsMul, node); in VisitInt32Mul()
715 void InstructionSelector::VisitInt32MulHigh(Node* node) { in VisitInt32MulHigh() argument
716 VisitRRR(this, kMipsMulHigh, node); in VisitInt32MulHigh()
720 void InstructionSelector::VisitUint32MulHigh(Node* node) { in VisitUint32MulHigh() argument
722 Emit(kMipsMulHighU, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0)), in VisitUint32MulHigh()
723 g.UseRegister(node->InputAt(1))); in VisitUint32MulHigh()
727 void InstructionSelector::VisitInt32Div(Node* node) { in VisitInt32Div() argument
729 Int32BinopMatcher m(node); in VisitInt32Div()
730 Emit(kMipsDiv, g.DefineSameAsFirst(node), g.UseRegister(m.left().node()), in VisitInt32Div()
731 g.UseRegister(m.right().node())); in VisitInt32Div()
735 void InstructionSelector::VisitUint32Div(Node* node) { in VisitUint32Div() argument
737 Int32BinopMatcher m(node); in VisitUint32Div()
738 Emit(kMipsDivU, g.DefineSameAsFirst(node), g.UseRegister(m.left().node()), in VisitUint32Div()
739 g.UseRegister(m.right().node())); in VisitUint32Div()
743 void InstructionSelector::VisitInt32Mod(Node* node) { in VisitInt32Mod() argument
745 Int32BinopMatcher m(node); in VisitInt32Mod()
746 Emit(kMipsMod, g.DefineAsRegister(node), g.UseRegister(m.left().node()), in VisitInt32Mod()
747 g.UseRegister(m.right().node())); in VisitInt32Mod()
751 void InstructionSelector::VisitUint32Mod(Node* node) { in VisitUint32Mod() argument
753 Int32BinopMatcher m(node); in VisitUint32Mod()
754 Emit(kMipsModU, g.DefineAsRegister(node), g.UseRegister(m.left().node()), in VisitUint32Mod()
755 g.UseRegister(m.right().node())); in VisitUint32Mod()
759 void InstructionSelector::VisitChangeFloat32ToFloat64(Node* node) { in VisitChangeFloat32ToFloat64() argument
760 VisitRR(this, kMipsCvtDS, node); in VisitChangeFloat32ToFloat64()
764 void InstructionSelector::VisitRoundInt32ToFloat32(Node* node) { in VisitRoundInt32ToFloat32() argument
765 VisitRR(this, kMipsCvtSW, node); in VisitRoundInt32ToFloat32()
769 void InstructionSelector::VisitRoundUint32ToFloat32(Node* node) { in VisitRoundUint32ToFloat32() argument
770 VisitRR(this, kMipsCvtSUw, node); in VisitRoundUint32ToFloat32()
774 void InstructionSelector::VisitChangeInt32ToFloat64(Node* node) { in VisitChangeInt32ToFloat64() argument
775 VisitRR(this, kMipsCvtDW, node); in VisitChangeInt32ToFloat64()
779 void InstructionSelector::VisitChangeUint32ToFloat64(Node* node) { in VisitChangeUint32ToFloat64() argument
780 VisitRR(this, kMipsCvtDUw, node); in VisitChangeUint32ToFloat64()
784 void InstructionSelector::VisitTruncateFloat32ToInt32(Node* node) { in VisitTruncateFloat32ToInt32() argument
785 VisitRR(this, kMipsTruncWS, node); in VisitTruncateFloat32ToInt32()
789 void InstructionSelector::VisitTruncateFloat32ToUint32(Node* node) { in VisitTruncateFloat32ToUint32() argument
790 VisitRR(this, kMipsTruncUwS, node); in VisitTruncateFloat32ToUint32()
794 void InstructionSelector::VisitChangeFloat64ToInt32(Node* node) { in VisitChangeFloat64ToInt32() argument
796 Node* value = node->InputAt(0); in VisitChangeFloat64ToInt32()
799 if (CanCover(node, value)) { in VisitChangeFloat64ToInt32()
802 Emit(kMipsFloorWD, g.DefineAsRegister(node), in VisitChangeFloat64ToInt32()
806 Emit(kMipsCeilWD, g.DefineAsRegister(node), in VisitChangeFloat64ToInt32()
810 Emit(kMipsRoundWD, g.DefineAsRegister(node), in VisitChangeFloat64ToInt32()
814 Emit(kMipsTruncWD, g.DefineAsRegister(node), in VisitChangeFloat64ToInt32()
826 Emit(kMipsFloorWS, g.DefineAsRegister(node), in VisitChangeFloat64ToInt32()
830 Emit(kMipsCeilWS, g.DefineAsRegister(node), in VisitChangeFloat64ToInt32()
834 Emit(kMipsRoundWS, g.DefineAsRegister(node), in VisitChangeFloat64ToInt32()
838 Emit(kMipsTruncWS, g.DefineAsRegister(node), in VisitChangeFloat64ToInt32()
842 Emit(kMipsTruncWS, g.DefineAsRegister(node), in VisitChangeFloat64ToInt32()
848 Emit(kMipsTruncWS, g.DefineAsRegister(node), in VisitChangeFloat64ToInt32()
854 VisitRR(this, kMipsTruncWD, node); in VisitChangeFloat64ToInt32()
858 void InstructionSelector::VisitChangeFloat64ToUint32(Node* node) { in VisitChangeFloat64ToUint32() argument
859 VisitRR(this, kMipsTruncUwD, node); in VisitChangeFloat64ToUint32()
862 void InstructionSelector::VisitTruncateFloat64ToUint32(Node* node) { in VisitTruncateFloat64ToUint32() argument
863 VisitRR(this, kMipsTruncUwD, node); in VisitTruncateFloat64ToUint32()
866 void InstructionSelector::VisitTruncateFloat64ToFloat32(Node* node) { in VisitTruncateFloat64ToFloat32() argument
868 Node* value = node->InputAt(0); in VisitTruncateFloat64ToFloat32()
871 if (CanCover(node, value) && in VisitTruncateFloat64ToFloat32()
873 Emit(kMipsCvtSW, g.DefineAsRegister(node), in VisitTruncateFloat64ToFloat32()
877 VisitRR(this, kMipsCvtSD, node); in VisitTruncateFloat64ToFloat32()
880 void InstructionSelector::VisitTruncateFloat64ToWord32(Node* node) { in VisitTruncateFloat64ToWord32() argument
881 VisitRR(this, kArchTruncateDoubleToI, node); in VisitTruncateFloat64ToWord32()
884 void InstructionSelector::VisitRoundFloat64ToInt32(Node* node) { in VisitRoundFloat64ToInt32() argument
885 VisitRR(this, kMipsTruncWD, node); in VisitRoundFloat64ToInt32()
888 void InstructionSelector::VisitBitcastFloat32ToInt32(Node* node) { in VisitBitcastFloat32ToInt32() argument
889 VisitRR(this, kMipsFloat64ExtractLowWord32, node); in VisitBitcastFloat32ToInt32()
893 void InstructionSelector::VisitBitcastInt32ToFloat32(Node* node) { in VisitBitcastInt32ToFloat32() argument
895 Emit(kMipsFloat64InsertLowWord32, g.DefineAsRegister(node), in VisitBitcastInt32ToFloat32()
897 g.UseRegister(node->InputAt(0))); in VisitBitcastInt32ToFloat32()
901 void InstructionSelector::VisitFloat32Add(Node* node) { in VisitFloat32Add() argument
903 Float32BinopMatcher m(node); in VisitFloat32Add()
904 if (m.left().IsFloat32Mul() && CanCover(node, m.left().node())) { in VisitFloat32Add()
906 Float32BinopMatcher mleft(m.left().node()); in VisitFloat32Add()
908 Emit(kMipsMaddS, g.DefineAsRegister(node), in VisitFloat32Add()
909 g.UseRegister(m.right().node()), g.UseRegister(mleft.left().node()), in VisitFloat32Add()
910 g.UseRegister(mleft.right().node())); in VisitFloat32Add()
913 Emit(kMipsMaddfS, g.DefineSameAsFirst(node), in VisitFloat32Add()
914 g.UseRegister(m.right().node()), g.UseRegister(mleft.left().node()), in VisitFloat32Add()
915 g.UseRegister(mleft.right().node())); in VisitFloat32Add()
919 if (m.right().IsFloat32Mul() && CanCover(node, m.right().node())) { in VisitFloat32Add()
921 Float32BinopMatcher mright(m.right().node()); in VisitFloat32Add()
923 Emit(kMipsMaddS, g.DefineAsRegister(node), g.UseRegister(m.left().node()), in VisitFloat32Add()
924 g.UseRegister(mright.left().node()), in VisitFloat32Add()
925 g.UseRegister(mright.right().node())); in VisitFloat32Add()
928 Emit(kMipsMaddfS, g.DefineSameAsFirst(node), in VisitFloat32Add()
929 g.UseRegister(m.left().node()), g.UseRegister(mright.left().node()), in VisitFloat32Add()
930 g.UseRegister(mright.right().node())); in VisitFloat32Add()
934 VisitRRR(this, kMipsAddS, node); in VisitFloat32Add()
938 void InstructionSelector::VisitFloat64Add(Node* node) { in VisitFloat64Add() argument
940 Float64BinopMatcher m(node); in VisitFloat64Add()
941 if (m.left().IsFloat64Mul() && CanCover(node, m.left().node())) { in VisitFloat64Add()
943 Float64BinopMatcher mleft(m.left().node()); in VisitFloat64Add()
945 Emit(kMipsMaddD, g.DefineAsRegister(node), in VisitFloat64Add()
946 g.UseRegister(m.right().node()), g.UseRegister(mleft.left().node()), in VisitFloat64Add()
947 g.UseRegister(mleft.right().node())); in VisitFloat64Add()
950 Emit(kMipsMaddfD, g.DefineSameAsFirst(node), in VisitFloat64Add()
951 g.UseRegister(m.right().node()), g.UseRegister(mleft.left().node()), in VisitFloat64Add()
952 g.UseRegister(mleft.right().node())); in VisitFloat64Add()
956 if (m.right().IsFloat64Mul() && CanCover(node, m.right().node())) { in VisitFloat64Add()
958 Float64BinopMatcher mright(m.right().node()); in VisitFloat64Add()
960 Emit(kMipsMaddD, g.DefineAsRegister(node), g.UseRegister(m.left().node()), in VisitFloat64Add()
961 g.UseRegister(mright.left().node()), in VisitFloat64Add()
962 g.UseRegister(mright.right().node())); in VisitFloat64Add()
965 Emit(kMipsMaddfD, g.DefineSameAsFirst(node), in VisitFloat64Add()
966 g.UseRegister(m.left().node()), g.UseRegister(mright.left().node()), in VisitFloat64Add()
967 g.UseRegister(mright.right().node())); in VisitFloat64Add()
971 VisitRRR(this, kMipsAddD, node); in VisitFloat64Add()
975 void InstructionSelector::VisitFloat32Sub(Node* node) { in VisitFloat32Sub() argument
977 Float32BinopMatcher m(node); in VisitFloat32Sub()
978 if (m.left().IsFloat32Mul() && CanCover(node, m.left().node())) { in VisitFloat32Sub()
981 Float32BinopMatcher mleft(m.left().node()); in VisitFloat32Sub()
982 Emit(kMipsMsubS, g.DefineAsRegister(node), in VisitFloat32Sub()
983 g.UseRegister(m.right().node()), g.UseRegister(mleft.left().node()), in VisitFloat32Sub()
984 g.UseRegister(mleft.right().node())); in VisitFloat32Sub()
987 } else if (m.right().IsFloat32Mul() && CanCover(node, m.right().node())) { in VisitFloat32Sub()
990 Float32BinopMatcher mright(m.right().node()); in VisitFloat32Sub()
991 Emit(kMipsMsubfS, g.DefineSameAsFirst(node), in VisitFloat32Sub()
992 g.UseRegister(m.left().node()), g.UseRegister(mright.left().node()), in VisitFloat32Sub()
993 g.UseRegister(mright.right().node())); in VisitFloat32Sub()
997 VisitRRR(this, kMipsSubS, node); in VisitFloat32Sub()
1000 void InstructionSelector::VisitFloat64Sub(Node* node) { in VisitFloat64Sub() argument
1002 Float64BinopMatcher m(node); in VisitFloat64Sub()
1003 if (m.left().IsFloat64Mul() && CanCover(node, m.left().node())) { in VisitFloat64Sub()
1006 Float64BinopMatcher mleft(m.left().node()); in VisitFloat64Sub()
1007 Emit(kMipsMsubD, g.DefineAsRegister(node), in VisitFloat64Sub()
1008 g.UseRegister(m.right().node()), g.UseRegister(mleft.left().node()), in VisitFloat64Sub()
1009 g.UseRegister(mleft.right().node())); in VisitFloat64Sub()
1012 } else if (m.right().IsFloat64Mul() && CanCover(node, m.right().node())) { in VisitFloat64Sub()
1015 Float64BinopMatcher mright(m.right().node()); in VisitFloat64Sub()
1016 Emit(kMipsMsubfD, g.DefineSameAsFirst(node), in VisitFloat64Sub()
1017 g.UseRegister(m.left().node()), g.UseRegister(mright.left().node()), in VisitFloat64Sub()
1018 g.UseRegister(mright.right().node())); in VisitFloat64Sub()
1022 VisitRRR(this, kMipsSubD, node); in VisitFloat64Sub()
1025 void InstructionSelector::VisitFloat32Mul(Node* node) { in VisitFloat32Mul() argument
1026 VisitRRR(this, kMipsMulS, node); in VisitFloat32Mul()
1030 void InstructionSelector::VisitFloat64Mul(Node* node) { in VisitFloat64Mul() argument
1031 VisitRRR(this, kMipsMulD, node); in VisitFloat64Mul()
1035 void InstructionSelector::VisitFloat32Div(Node* node) { in VisitFloat32Div() argument
1036 VisitRRR(this, kMipsDivS, node); in VisitFloat32Div()
1040 void InstructionSelector::VisitFloat64Div(Node* node) { in VisitFloat64Div() argument
1041 VisitRRR(this, kMipsDivD, node); in VisitFloat64Div()
1045 void InstructionSelector::VisitFloat64Mod(Node* node) { in VisitFloat64Mod() argument
1047 Emit(kMipsModD, g.DefineAsFixed(node, f0), g.UseFixed(node->InputAt(0), f12), in VisitFloat64Mod()
1048 g.UseFixed(node->InputAt(1), f14))->MarkAsCall(); in VisitFloat64Mod()
1051 void InstructionSelector::VisitFloat32Max(Node* node) { in VisitFloat32Max() argument
1053 Emit(kMipsFloat32Max, g.DefineAsRegister(node), in VisitFloat32Max()
1054 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); in VisitFloat32Max()
1057 void InstructionSelector::VisitFloat64Max(Node* node) { in VisitFloat64Max() argument
1059 Emit(kMipsFloat64Max, g.DefineAsRegister(node), in VisitFloat64Max()
1060 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); in VisitFloat64Max()
1063 void InstructionSelector::VisitFloat32Min(Node* node) { in VisitFloat32Min() argument
1065 Emit(kMipsFloat32Min, g.DefineAsRegister(node), in VisitFloat32Min()
1066 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); in VisitFloat32Min()
1069 void InstructionSelector::VisitFloat64Min(Node* node) { in VisitFloat64Min() argument
1071 Emit(kMipsFloat64Min, g.DefineAsRegister(node), in VisitFloat64Min()
1072 g.UseRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); in VisitFloat64Min()
1076 void InstructionSelector::VisitFloat32Abs(Node* node) { in VisitFloat32Abs() argument
1077 VisitRR(this, kMipsAbsS, node); in VisitFloat32Abs()
1081 void InstructionSelector::VisitFloat64Abs(Node* node) { in VisitFloat64Abs() argument
1082 VisitRR(this, kMipsAbsD, node); in VisitFloat64Abs()
1085 void InstructionSelector::VisitFloat32Sqrt(Node* node) { in VisitFloat32Sqrt() argument
1086 VisitRR(this, kMipsSqrtS, node); in VisitFloat32Sqrt()
1090 void InstructionSelector::VisitFloat64Sqrt(Node* node) { in VisitFloat64Sqrt() argument
1091 VisitRR(this, kMipsSqrtD, node); in VisitFloat64Sqrt()
1095 void InstructionSelector::VisitFloat32RoundDown(Node* node) { in VisitFloat32RoundDown() argument
1096 VisitRR(this, kMipsFloat32RoundDown, node); in VisitFloat32RoundDown()
1100 void InstructionSelector::VisitFloat64RoundDown(Node* node) { in VisitFloat64RoundDown() argument
1101 VisitRR(this, kMipsFloat64RoundDown, node); in VisitFloat64RoundDown()
1105 void InstructionSelector::VisitFloat32RoundUp(Node* node) { in VisitFloat32RoundUp() argument
1106 VisitRR(this, kMipsFloat32RoundUp, node); in VisitFloat32RoundUp()
1110 void InstructionSelector::VisitFloat64RoundUp(Node* node) { in VisitFloat64RoundUp() argument
1111 VisitRR(this, kMipsFloat64RoundUp, node); in VisitFloat64RoundUp()
1115 void InstructionSelector::VisitFloat32RoundTruncate(Node* node) { in VisitFloat32RoundTruncate() argument
1116 VisitRR(this, kMipsFloat32RoundTruncate, node); in VisitFloat32RoundTruncate()
1120 void InstructionSelector::VisitFloat64RoundTruncate(Node* node) { in VisitFloat64RoundTruncate() argument
1121 VisitRR(this, kMipsFloat64RoundTruncate, node); in VisitFloat64RoundTruncate()
1125 void InstructionSelector::VisitFloat64RoundTiesAway(Node* node) { in VisitFloat64RoundTiesAway() argument
1130 void InstructionSelector::VisitFloat32RoundTiesEven(Node* node) { in VisitFloat32RoundTiesEven() argument
1131 VisitRR(this, kMipsFloat32RoundTiesEven, node); in VisitFloat32RoundTiesEven()
1135 void InstructionSelector::VisitFloat64RoundTiesEven(Node* node) { in VisitFloat64RoundTiesEven() argument
1136 VisitRR(this, kMipsFloat64RoundTiesEven, node); in VisitFloat64RoundTiesEven()
1139 void InstructionSelector::VisitFloat32Neg(Node* node) { in VisitFloat32Neg() argument
1140 VisitRR(this, kMipsNegS, node); in VisitFloat32Neg()
1143 void InstructionSelector::VisitFloat64Neg(Node* node) { in VisitFloat64Neg() argument
1144 VisitRR(this, kMipsNegD, node); in VisitFloat64Neg()
1147 void InstructionSelector::VisitFloat64Ieee754Binop(Node* node, in VisitFloat64Ieee754Binop() argument
1150 Emit(opcode, g.DefineAsFixed(node, f0), g.UseFixed(node->InputAt(0), f2), in VisitFloat64Ieee754Binop()
1151 g.UseFixed(node->InputAt(1), f4)) in VisitFloat64Ieee754Binop()
1155 void InstructionSelector::VisitFloat64Ieee754Unop(Node* node, in VisitFloat64Ieee754Unop() argument
1158 Emit(opcode, g.DefineAsFixed(node, f0), g.UseFixed(node->InputAt(0), f12)) in VisitFloat64Ieee754Unop()
1164 Node* node) { in EmitPrepareArguments() argument
1176 if (input.node()) { in EmitPrepareArguments()
1177 Emit(kMipsStoreToStackSlot, g.NoOutput(), g.UseRegister(input.node()), in EmitPrepareArguments()
1191 if (input.node()) { in EmitPrepareArguments()
1192 Emit(kMipsStoreToStackSlot, g.NoOutput(), g.UseRegister(input.node()), in EmitPrepareArguments()
1204 void InstructionSelector::VisitUnalignedLoad(Node* node) { in VisitUnalignedLoad() argument
1206 UnalignedLoadRepresentationOf(node->op()); in VisitUnalignedLoad()
1208 Node* base = node->InputAt(0); in VisitUnalignedLoad()
1209 Node* index = node->InputAt(1); in VisitUnalignedLoad()
1241 g.DefineAsRegister(node), g.UseRegister(base), g.UseImmediate(index)); in VisitUnalignedLoad()
1248 g.DefineAsRegister(node), addr_reg, g.TempImmediate(0)); in VisitUnalignedLoad()
1252 void InstructionSelector::VisitUnalignedStore(Node* node) { in VisitUnalignedStore() argument
1254 Node* base = node->InputAt(0); in VisitUnalignedStore()
1255 Node* index = node->InputAt(1); in VisitUnalignedStore()
1256 Node* value = node->InputAt(2); in VisitUnalignedStore()
1258 UnalignedStoreRepresentation rep = UnalignedStoreRepresentationOf(node->op()); in VisitUnalignedStore()
1303 void InstructionSelector::VisitCheckedLoad(Node* node) { in VisitCheckedLoad() argument
1304 CheckedLoadRepresentation load_rep = CheckedLoadRepresentationOf(node->op()); in VisitCheckedLoad()
1306 Node* const buffer = node->InputAt(0); in VisitCheckedLoad()
1307 Node* const offset = node->InputAt(1); in VisitCheckedLoad()
1308 Node* const length = node->InputAt(2); in VisitCheckedLoad()
1347 g.DefineAsRegister(node), offset_operand, length_operand, in VisitCheckedLoad()
1352 void InstructionSelector::VisitCheckedStore(Node* node) { in VisitCheckedStore() argument
1353 MachineRepresentation rep = CheckedStoreRepresentationOf(node->op()); in VisitCheckedStore()
1355 Node* const buffer = node->InputAt(0); in VisitCheckedStore()
1356 Node* const offset = node->InputAt(1); in VisitCheckedStore()
1357 Node* const length = node->InputAt(2); in VisitCheckedStore()
1358 Node* const value = node->InputAt(3); in VisitCheckedStore()
1417 void VisitFloat32Compare(InstructionSelector* selector, Node* node, in VisitFloat32Compare() argument
1420 Float32BinopMatcher m(node); in VisitFloat32Compare()
1423 lhs = m.left().IsZero() ? g.UseImmediate(m.left().node()) in VisitFloat32Compare()
1424 : g.UseRegister(m.left().node()); in VisitFloat32Compare()
1425 rhs = m.right().IsZero() ? g.UseImmediate(m.right().node()) in VisitFloat32Compare()
1426 : g.UseRegister(m.right().node()); in VisitFloat32Compare()
1432 void VisitFloat64Compare(InstructionSelector* selector, Node* node, in VisitFloat64Compare() argument
1435 Float64BinopMatcher m(node); in VisitFloat64Compare()
1438 lhs = m.left().IsZero() ? g.UseImmediate(m.left().node()) in VisitFloat64Compare()
1439 : g.UseRegister(m.left().node()); in VisitFloat64Compare()
1440 rhs = m.right().IsZero() ? g.UseImmediate(m.right().node()) in VisitFloat64Compare()
1441 : g.UseRegister(m.right().node()); in VisitFloat64Compare()
1447 void VisitWordCompare(InstructionSelector* selector, Node* node, in VisitWordCompare() argument
1451 Node* left = node->InputAt(0); in VisitWordCompare()
1452 Node* right = node->InputAt(1); in VisitWordCompare()
1519 void VisitWordCompare(InstructionSelector* selector, Node* node, in VisitWordCompare() argument
1521 VisitWordCompare(selector, node, kMipsCmp, cont, false); in VisitWordCompare()
1534 value = m.left().node(); in VisitWordCompareZero()
1582 Node* const node = value->InputAt(0); in VisitWordCompareZero() local
1583 Node* const result = NodeProperties::FindProjection(node, 0); in VisitWordCompareZero()
1585 switch (node->opcode()) { in VisitWordCompareZero()
1588 return VisitBinop(selector, node, kMipsAddOvf, cont); in VisitWordCompareZero()
1591 return VisitBinop(selector, node, kMipsSubOvf, cont); in VisitWordCompareZero()
1594 return VisitBinop(selector, node, kMipsMulOvf, cont); in VisitWordCompareZero()
1634 void InstructionSelector::VisitDeoptimizeIf(Node* node) { in VisitDeoptimizeIf() argument
1636 kNotEqual, DeoptimizeReasonOf(node->op()), node->InputAt(1)); in VisitDeoptimizeIf()
1637 VisitWordCompareZero(this, node, node->InputAt(0), &cont); in VisitDeoptimizeIf()
1640 void InstructionSelector::VisitDeoptimizeUnless(Node* node) { in VisitDeoptimizeUnless() argument
1642 kEqual, DeoptimizeReasonOf(node->op()), node->InputAt(1)); in VisitDeoptimizeUnless()
1643 VisitWordCompareZero(this, node, node->InputAt(0), &cont); in VisitDeoptimizeUnless()
1646 void InstructionSelector::VisitSwitch(Node* node, const SwitchInfo& sw) { in VisitSwitch() argument
1648 InstructionOperand value_operand = g.UseRegister(node->InputAt(0)); in VisitSwitch()
1674 void InstructionSelector::VisitWord32Equal(Node* const node) { in VisitWord32Equal() argument
1675 FlagsContinuation cont = FlagsContinuation::ForSet(kEqual, node); in VisitWord32Equal()
1676 Int32BinopMatcher m(node); in VisitWord32Equal()
1678 return VisitWordCompareZero(this, m.node(), m.left().node(), &cont); in VisitWord32Equal()
1680 VisitWordCompare(this, node, &cont); in VisitWord32Equal()
1684 void InstructionSelector::VisitInt32LessThan(Node* node) { in VisitInt32LessThan() argument
1685 FlagsContinuation cont = FlagsContinuation::ForSet(kSignedLessThan, node); in VisitInt32LessThan()
1686 VisitWordCompare(this, node, &cont); in VisitInt32LessThan()
1690 void InstructionSelector::VisitInt32LessThanOrEqual(Node* node) { in VisitInt32LessThanOrEqual() argument
1692 FlagsContinuation::ForSet(kSignedLessThanOrEqual, node); in VisitInt32LessThanOrEqual()
1693 VisitWordCompare(this, node, &cont); in VisitInt32LessThanOrEqual()
1697 void InstructionSelector::VisitUint32LessThan(Node* node) { in VisitUint32LessThan() argument
1698 FlagsContinuation cont = FlagsContinuation::ForSet(kUnsignedLessThan, node); in VisitUint32LessThan()
1699 VisitWordCompare(this, node, &cont); in VisitUint32LessThan()
1703 void InstructionSelector::VisitUint32LessThanOrEqual(Node* node) { in VisitUint32LessThanOrEqual() argument
1705 FlagsContinuation::ForSet(kUnsignedLessThanOrEqual, node); in VisitUint32LessThanOrEqual()
1706 VisitWordCompare(this, node, &cont); in VisitUint32LessThanOrEqual()
1710 void InstructionSelector::VisitInt32AddWithOverflow(Node* node) { in VisitInt32AddWithOverflow() argument
1711 if (Node* ovf = NodeProperties::FindProjection(node, 1)) { in VisitInt32AddWithOverflow()
1713 return VisitBinop(this, node, kMipsAddOvf, &cont); in VisitInt32AddWithOverflow()
1716 VisitBinop(this, node, kMipsAddOvf, &cont); in VisitInt32AddWithOverflow()
1720 void InstructionSelector::VisitInt32SubWithOverflow(Node* node) { in VisitInt32SubWithOverflow() argument
1721 if (Node* ovf = NodeProperties::FindProjection(node, 1)) { in VisitInt32SubWithOverflow()
1723 return VisitBinop(this, node, kMipsSubOvf, &cont); in VisitInt32SubWithOverflow()
1726 VisitBinop(this, node, kMipsSubOvf, &cont); in VisitInt32SubWithOverflow()
1729 void InstructionSelector::VisitInt32MulWithOverflow(Node* node) { in VisitInt32MulWithOverflow() argument
1730 if (Node* ovf = NodeProperties::FindProjection(node, 1)) { in VisitInt32MulWithOverflow()
1732 return VisitBinop(this, node, kMipsMulOvf, &cont); in VisitInt32MulWithOverflow()
1735 VisitBinop(this, node, kMipsMulOvf, &cont); in VisitInt32MulWithOverflow()
1738 void InstructionSelector::VisitFloat32Equal(Node* node) { in VisitFloat32Equal() argument
1739 FlagsContinuation cont = FlagsContinuation::ForSet(kEqual, node); in VisitFloat32Equal()
1740 VisitFloat32Compare(this, node, &cont); in VisitFloat32Equal()
1744 void InstructionSelector::VisitFloat32LessThan(Node* node) { in VisitFloat32LessThan() argument
1745 FlagsContinuation cont = FlagsContinuation::ForSet(kUnsignedLessThan, node); in VisitFloat32LessThan()
1746 VisitFloat32Compare(this, node, &cont); in VisitFloat32LessThan()
1750 void InstructionSelector::VisitFloat32LessThanOrEqual(Node* node) { in VisitFloat32LessThanOrEqual() argument
1752 FlagsContinuation::ForSet(kUnsignedLessThanOrEqual, node); in VisitFloat32LessThanOrEqual()
1753 VisitFloat32Compare(this, node, &cont); in VisitFloat32LessThanOrEqual()
1757 void InstructionSelector::VisitFloat64Equal(Node* node) { in VisitFloat64Equal() argument
1758 FlagsContinuation cont = FlagsContinuation::ForSet(kEqual, node); in VisitFloat64Equal()
1759 VisitFloat64Compare(this, node, &cont); in VisitFloat64Equal()
1763 void InstructionSelector::VisitFloat64LessThan(Node* node) { in VisitFloat64LessThan() argument
1764 FlagsContinuation cont = FlagsContinuation::ForSet(kUnsignedLessThan, node); in VisitFloat64LessThan()
1765 VisitFloat64Compare(this, node, &cont); in VisitFloat64LessThan()
1769 void InstructionSelector::VisitFloat64LessThanOrEqual(Node* node) { in VisitFloat64LessThanOrEqual() argument
1771 FlagsContinuation::ForSet(kUnsignedLessThanOrEqual, node); in VisitFloat64LessThanOrEqual()
1772 VisitFloat64Compare(this, node, &cont); in VisitFloat64LessThanOrEqual()
1776 void InstructionSelector::VisitFloat64ExtractLowWord32(Node* node) { in VisitFloat64ExtractLowWord32() argument
1778 Emit(kMipsFloat64ExtractLowWord32, g.DefineAsRegister(node), in VisitFloat64ExtractLowWord32()
1779 g.UseRegister(node->InputAt(0))); in VisitFloat64ExtractLowWord32()
1783 void InstructionSelector::VisitFloat64ExtractHighWord32(Node* node) { in VisitFloat64ExtractHighWord32() argument
1785 Emit(kMipsFloat64ExtractHighWord32, g.DefineAsRegister(node), in VisitFloat64ExtractHighWord32()
1786 g.UseRegister(node->InputAt(0))); in VisitFloat64ExtractHighWord32()
1790 void InstructionSelector::VisitFloat64InsertLowWord32(Node* node) { in VisitFloat64InsertLowWord32() argument
1792 Node* left = node->InputAt(0); in VisitFloat64InsertLowWord32()
1793 Node* right = node->InputAt(1); in VisitFloat64InsertLowWord32()
1794 Emit(kMipsFloat64InsertLowWord32, g.DefineSameAsFirst(node), in VisitFloat64InsertLowWord32()
1799 void InstructionSelector::VisitFloat64InsertHighWord32(Node* node) { in VisitFloat64InsertHighWord32() argument
1801 Node* left = node->InputAt(0); in VisitFloat64InsertHighWord32()
1802 Node* right = node->InputAt(1); in VisitFloat64InsertHighWord32()
1803 Emit(kMipsFloat64InsertHighWord32, g.DefineSameAsFirst(node), in VisitFloat64InsertHighWord32()
1807 void InstructionSelector::VisitFloat64SilenceNaN(Node* node) { in VisitFloat64SilenceNaN() argument
1809 Node* left = node->InputAt(0); in VisitFloat64SilenceNaN()
1811 Emit(kMipsFloat64SilenceNaN, g.DefineSameAsFirst(node), g.UseRegister(left), in VisitFloat64SilenceNaN()
1815 void InstructionSelector::VisitAtomicLoad(Node* node) { in VisitAtomicLoad() argument
1816 LoadRepresentation load_rep = LoadRepresentationOf(node->op()); in VisitAtomicLoad()
1818 Node* base = node->InputAt(0); in VisitAtomicLoad()
1819 Node* index = node->InputAt(1); in VisitAtomicLoad()
1838 g.DefineAsRegister(node), g.UseRegister(base), g.UseImmediate(index)); in VisitAtomicLoad()
1845 g.DefineAsRegister(node), addr_reg, g.TempImmediate(0)); in VisitAtomicLoad()
1849 void InstructionSelector::VisitAtomicStore(Node* node) { in VisitAtomicStore() argument
1850 MachineRepresentation rep = AtomicStoreRepresentationOf(node->op()); in VisitAtomicStore()
1852 Node* base = node->InputAt(0); in VisitAtomicStore()
1853 Node* index = node->InputAt(1); in VisitAtomicStore()
1854 Node* value = node->InputAt(2); in VisitAtomicStore()