@@ -127,15 +127,14 @@ class IA32OperandGenerator final : public OperandGenerator {
127127
128128namespace {
129129
130- void VisitROFloat (InstructionSelector* selector, Node* node,
131- ArchOpcode opcode) {
130+ void VisitRO (InstructionSelector* selector, Node* node, ArchOpcode opcode) {
132131 IA32OperandGenerator g (selector);
133132 selector->Emit (opcode, g.DefineAsRegister (node), g.Use (node->InputAt (0 )));
134133}
135134
136135
137- void VisitRRFloat (InstructionSelector* selector, Node* node,
138- InstructionCode opcode) {
136+ void VisitRR (InstructionSelector* selector, Node* node,
137+ InstructionCode opcode) {
139138 IA32OperandGenerator g (selector);
140139 selector->Emit (opcode, g.DefineAsRegister (node),
141140 g.UseRegister (node->InputAt (0 )));
@@ -648,38 +647,43 @@ void InstructionSelector::VisitUint32Mod(Node* node) {
648647
649648
650649void InstructionSelector::VisitChangeFloat32ToFloat64 (Node* node) {
651- IA32OperandGenerator g (this );
652- Emit (kSSEFloat32ToFloat64 , g.DefineAsRegister (node), g.Use (node->InputAt (0 )));
650+ VisitRO (this , node, kSSEFloat32ToFloat64 );
653651}
654652
655653
656654void InstructionSelector::VisitChangeInt32ToFloat64 (Node* node) {
657- IA32OperandGenerator g (this );
658- Emit (kSSEInt32ToFloat64 , g.DefineAsRegister (node), g.Use (node->InputAt (0 )));
655+ VisitRO (this , node, kSSEInt32ToFloat64 );
659656}
660657
661658
662659void InstructionSelector::VisitChangeUint32ToFloat64 (Node* node) {
663- IA32OperandGenerator g (this );
664- Emit (kSSEUint32ToFloat64 , g.DefineAsRegister (node), g.Use (node->InputAt (0 )));
660+ VisitRO (this , node, kSSEUint32ToFloat64 );
665661}
666662
667663
668664void InstructionSelector::VisitChangeFloat64ToInt32 (Node* node) {
669- IA32OperandGenerator g (this );
670- Emit (kSSEFloat64ToInt32 , g.DefineAsRegister (node), g.Use (node->InputAt (0 )));
665+ VisitRO (this , node, kSSEFloat64ToInt32 );
671666}
672667
673668
674669void InstructionSelector::VisitChangeFloat64ToUint32 (Node* node) {
675- IA32OperandGenerator g (this );
676- Emit (kSSEFloat64ToUint32 , g.DefineAsRegister (node), g.Use (node->InputAt (0 )));
670+ VisitRO (this , node, kSSEFloat64ToUint32 );
677671}
678672
679673
680674void InstructionSelector::VisitTruncateFloat64ToFloat32 (Node* node) {
681- IA32OperandGenerator g (this );
682- Emit (kSSEFloat64ToFloat32 , g.DefineAsRegister (node), g.Use (node->InputAt (0 )));
675+ VisitRO (this , node, kSSEFloat64ToFloat32 );
676+ }
677+
678+
679+ void InstructionSelector::VisitTruncateFloat64ToInt32 (Node* node) {
680+ switch (TruncationModeOf (node->op ())) {
681+ case TruncationMode::kJavaScript :
682+ return VisitRR (this , node, kArchTruncateDoubleToI );
683+ case TruncationMode::kRoundToZero :
684+ return VisitRO (this , node, kSSEFloat64ToInt32 );
685+ }
686+ UNREACHABLE ();
683687}
684688
685689
@@ -791,22 +795,22 @@ void InstructionSelector::VisitFloat64Abs(Node* node) {
791795
792796
793797void InstructionSelector::VisitFloat32Sqrt (Node* node) {
794- VisitROFloat (this , node, kSSEFloat32Sqrt );
798+ VisitRO (this , node, kSSEFloat32Sqrt );
795799}
796800
797801
798802void InstructionSelector::VisitFloat64Sqrt (Node* node) {
799- VisitROFloat (this , node, kSSEFloat64Sqrt );
803+ VisitRO (this , node, kSSEFloat64Sqrt );
800804}
801805
802806
803807void InstructionSelector::VisitFloat64RoundDown (Node* node) {
804- VisitRRFloat (this , node, kSSEFloat64Round | MiscField::encode (kRoundDown ));
808+ VisitRR (this , node, kSSEFloat64Round | MiscField::encode (kRoundDown ));
805809}
806810
807811
808812void InstructionSelector::VisitFloat64RoundTruncate (Node* node) {
809- VisitRRFloat (this , node, kSSEFloat64Round | MiscField::encode (kRoundToZero ));
813+ VisitRR (this , node, kSSEFloat64Round | MiscField::encode (kRoundToZero ));
810814}
811815
812816
0 commit comments