55 "Int32AddWithOverflow", kArmAdd, kArmAdd},
57 "Int32SubWithOverflow", kArmSub, kArmRsb}};
72 return os <<
shift.constructor_name;
78 kMode_Operand2_R_ASR_I, kMode_Operand2_R_ASR_R},
80 kMode_Operand2_R_LSL_I, kMode_Operand2_R_LSL_R},
82 kMode_Operand2_R_LSR_I, kMode_Operand2_R_LSR_R},
84 kMode_Operand2_R_ROR_I, kMode_Operand2_R_ROR_R}};
89 -2147483617, -2147483606, -2113929216, -2080374784, -1996488704,
90 -1879048192, -1459617792, -1358954496, -1342177265, -1275068414,
91 -1073741818, -1073741777, -855638016, -805306368, -402653184,
92 -268435444, -16777216, 0, 35, 61,
93 105, 116, 171, 245, 255,
94 692, 1216, 1248, 1520, 1600,
95 1888, 3744, 4080, 5888, 8384,
96 9344, 9472, 9792, 13312, 15040,
97 15360, 20736, 22272, 23296, 32000,
98 33536, 37120, 45824, 47872, 56320,
99 59392, 65280, 72704, 101376, 147456,
100 161792, 164864, 167936, 173056, 195584,
101 209920, 212992, 356352, 655360, 704512,
102 716800, 851968, 901120, 1044480, 1523712,
103 2572288, 3211264, 3588096, 3833856, 3866624,
104 4325376, 5177344, 6488064, 7012352, 7471104,
105 14090240, 16711680, 19398656, 22282240, 28573696,
106 30408704, 30670848, 43253760, 54525952, 55312384,
107 56623104, 68157440, 115343360, 131072000, 187695104,
108 188743680, 195035136, 197132288, 203423744, 218103808,
109 267386880, 268435470, 285212672, 402653185, 415236096,
110 595591168, 603979776, 603979778, 629145600, 1073741835,
111 1073741855, 1073741861, 1073741884, 1157627904, 1476395008,
112 1476395010, 1610612741, 2030043136, 2080374785, 2097152000};
125 const DPI dpi = GetParam();
127 m.Return((m.*dpi.constructor)(m.Parameter(0), m.Parameter(1)));
128 Stream s = m.Build();
129 ASSERT_EQ(1U, s.size());
130 EXPECT_EQ(dpi.arch_opcode, s[0]->arch_opcode());
131 EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode());
132 EXPECT_EQ(2U, s[0]->InputCount());
133 EXPECT_EQ(1U, s[0]->OutputCount());
138 const DPI dpi = GetParam();
141 m.Return((m.*dpi.constructor)(m.Parameter(0), m.Int32Constant(imm)));
142 Stream s = m.Build();
143 ASSERT_EQ(1U, s.size());
144 EXPECT_EQ(dpi.arch_opcode, s[0]->arch_opcode());
145 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode());
146 ASSERT_EQ(2U, s[0]->InputCount());
147 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1)));
148 EXPECT_EQ(1U, s[0]->OutputCount());
152 m.Return((m.*dpi.constructor)(m.Int32Constant(imm), m.Parameter(0)));
153 Stream s = m.Build();
154 ASSERT_EQ(1U, s.size());
155 EXPECT_EQ(dpi.reverse_arch_opcode, s[0]->arch_opcode());
156 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode());
157 ASSERT_EQ(2U, s[0]->InputCount());
158 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1)));
159 EXPECT_EQ(1U, s[0]->OutputCount());
165 const DPI dpi = GetParam();
168 m.Return((m.*dpi.constructor)(
170 (m.*
shift.constructor)(m.Parameter(1), m.Parameter(2))));
171 Stream s = m.Build();
172 ASSERT_EQ(1U, s.size());
173 EXPECT_EQ(dpi.arch_opcode, s[0]->arch_opcode());
174 EXPECT_EQ(
shift.r_mode, s[0]->addressing_mode());
175 EXPECT_EQ(3U, s[0]->InputCount());
176 EXPECT_EQ(1U, s[0]->OutputCount());
180 m.Return((m.*dpi.constructor)(
181 (m.*
shift.constructor)(m.Parameter(0), m.Parameter(1)),
183 Stream s = m.Build();
184 ASSERT_EQ(1U, s.size());
185 EXPECT_EQ(dpi.reverse_arch_opcode, s[0]->arch_opcode());
186 EXPECT_EQ(
shift.r_mode, s[0]->addressing_mode());
187 EXPECT_EQ(3U, s[0]->InputCount());
188 EXPECT_EQ(1U, s[0]->OutputCount());
194 const DPI dpi = GetParam();
198 m.Return((m.*dpi.constructor)(
200 (m.*
shift.constructor)(m.Parameter(1), m.Int32Constant(imm))));
201 Stream s = m.Build();
202 ASSERT_EQ(1U, s.size());
203 EXPECT_EQ(dpi.arch_opcode, s[0]->arch_opcode());
204 EXPECT_EQ(
shift.i_mode, s[0]->addressing_mode());
205 ASSERT_EQ(3U, s[0]->InputCount());
206 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2)));
207 EXPECT_EQ(1U, s[0]->OutputCount());
213 m.Return((m.*dpi.constructor)(
214 (m.*
shift.constructor)(m.Parameter(0), m.Int32Constant(imm)),
216 Stream s = m.Build();
217 ASSERT_EQ(1U, s.size());
218 EXPECT_EQ(dpi.reverse_arch_opcode, s[0]->arch_opcode());
219 EXPECT_EQ(
shift.i_mode, s[0]->addressing_mode());
220 ASSERT_EQ(3U, s[0]->InputCount());
221 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2)));
222 EXPECT_EQ(1U, s[0]->OutputCount());
229 const DPI dpi = GetParam();
232 m.Branch((m.*dpi.constructor)(m.Parameter(0), m.Parameter(1)), &a, &b);
234 m.Return(m.Int32Constant(1));
236 m.Return(m.Int32Constant(0));
237 Stream s = m.Build();
238 ASSERT_EQ(1U, s.size());
239 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode());
240 EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode());
242 EXPECT_EQ(
kNotEqual, s[0]->flags_condition());
247 const DPI dpi = GetParam();
251 m.Branch((m.*dpi.constructor)(m.Parameter(0), m.Int32Constant(imm)), &a,
254 m.Return(m.Int32Constant(1));
256 m.Return(m.Int32Constant(0));
257 Stream s = m.Build();
258 ASSERT_EQ(1U, s.size());
259 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode());
260 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode());
262 EXPECT_EQ(
kNotEqual, s[0]->flags_condition());
267 m.Branch((m.*dpi.constructor)(m.Int32Constant(imm), m.Parameter(0)), &a,
270 m.Return(m.Int32Constant(1));
272 m.Return(m.Int32Constant(0));
273 Stream s = m.Build();
274 ASSERT_EQ(1U, s.size());
275 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode());
276 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode());
278 EXPECT_EQ(
kNotEqual, s[0]->flags_condition());
284 const DPI dpi = GetParam();
288 m.Branch((m.*dpi.constructor)(
290 (m.*
shift.constructor)(m.Parameter(1), m.Parameter(2))),
293 m.Return(m.Int32Constant(1));
295 m.Return(m.Int32Constant(0));
296 Stream s = m.Build();
297 ASSERT_EQ(1U, s.size());
298 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode());
299 EXPECT_EQ(
shift.r_mode, s[0]->addressing_mode());
301 EXPECT_EQ(
kNotEqual, s[0]->flags_condition());
306 m.Branch((m.*dpi.constructor)(
307 (m.*
shift.constructor)(m.Parameter(0), m.Parameter(1)),
311 m.Return(m.Int32Constant(1));
313 m.Return(m.Int32Constant(0));
314 Stream s = m.Build();
315 ASSERT_EQ(1U, s.size());
316 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode());
317 EXPECT_EQ(
shift.r_mode, s[0]->addressing_mode());
319 EXPECT_EQ(
kNotEqual, s[0]->flags_condition());
325 const DPI dpi = GetParam();
330 m.Branch((m.*dpi.constructor)(m.Parameter(0),
331 (m.*
shift.constructor)(
332 m.Parameter(1), m.Int32Constant(imm))),
335 m.Return(m.Int32Constant(1));
337 m.Return(m.Int32Constant(0));
338 Stream s = m.Build();
339 ASSERT_EQ(1U, s.size());
340 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode());
341 EXPECT_EQ(
shift.i_mode, s[0]->addressing_mode());
342 ASSERT_EQ(5U, s[0]->InputCount());
343 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2)));
345 EXPECT_EQ(
kNotEqual, s[0]->flags_condition());
352 m.Branch((m.*dpi.constructor)(
353 (m.*
shift.constructor)(m.Parameter(0), m.Int32Constant(imm)),
357 m.Return(m.Int32Constant(1));
359 m.Return(m.Int32Constant(0));
360 Stream s = m.Build();
361 ASSERT_EQ(1U, s.size());
362 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode());
363 EXPECT_EQ(
shift.i_mode, s[0]->addressing_mode());
364 ASSERT_EQ(5U, s[0]->InputCount());
365 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2)));
367 EXPECT_EQ(
kNotEqual, s[0]->flags_condition());
374 const DPI dpi = GetParam();
377 m.Branch(m.Word32Equal((m.*dpi.constructor)(m.Parameter(0), m.Parameter(1)),
381 m.Return(m.Int32Constant(1));
383 m.Return(m.Int32Constant(0));
384 Stream s = m.Build();
385 ASSERT_EQ(1U, s.size());
386 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode());
387 EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode());
389 EXPECT_EQ(
kEqual, s[0]->flags_condition());
394 const DPI dpi = GetParam();
398 m.Word32NotEqual((m.*dpi.constructor)(m.Parameter(0), m.Parameter(1)),
402 m.Return(m.Int32Constant(1));
404 m.Return(m.Int32Constant(0));
405 Stream s = m.Build();
406 ASSERT_EQ(1U, s.size());
407 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode());
408 EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode());
410 EXPECT_EQ(
kNotEqual, s[0]->flags_condition());
415 const DPI dpi = GetParam();
419 m.Branch(m.Word32Equal(
420 (m.*dpi.constructor)(m.Parameter(0), m.Int32Constant(imm)),
424 m.Return(m.Int32Constant(1));
426 m.Return(m.Int32Constant(0));
427 Stream s = m.Build();
428 ASSERT_EQ(1U, s.size());
429 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode());
430 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode());
432 EXPECT_EQ(
kEqual, s[0]->flags_condition());
437 m.Branch(m.Word32Equal(
438 (m.*dpi.constructor)(m.Int32Constant(imm), m.Parameter(0)),
442 m.Return(m.Int32Constant(1));
444 m.Return(m.Int32Constant(0));
445 Stream s = m.Build();
446 ASSERT_EQ(1U, s.size());
447 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode());
448 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode());
450 EXPECT_EQ(
kEqual, s[0]->flags_condition());
456 const DPI dpi = GetParam();
460 m.Branch(m.Word32NotEqual(
461 (m.*dpi.constructor)(m.Parameter(0), m.Int32Constant(imm)),
465 m.Return(m.Int32Constant(1));
467 m.Return(m.Int32Constant(0));
468 Stream s = m.Build();
469 ASSERT_EQ(1U, s.size());
470 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode());
471 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode());
473 EXPECT_EQ(
kNotEqual, s[0]->flags_condition());
478 m.Branch(m.Word32NotEqual(
479 (m.*dpi.constructor)(m.Int32Constant(imm), m.Parameter(0)),
483 m.Return(m.Int32Constant(1));
485 m.Return(m.Int32Constant(0));
486 Stream s = m.Build();
487 ASSERT_EQ(1U, s.size());
488 EXPECT_EQ(dpi.test_arch_opcode, s[0]->arch_opcode());
489 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode());
491 EXPECT_EQ(
kNotEqual, s[0]->flags_condition());
497 ::testing::ValuesIn(
kDPIs));
508 const ODPI odpi = GetParam();
511 m.Projection(1, (m.*odpi.constructor)(m.Parameter(0), m.Parameter(1))));
512 Stream s = m.Build();
513 ASSERT_EQ(1U, s.size());
514 EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode());
515 EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode());
516 EXPECT_EQ(2U, s[0]->InputCount());
517 EXPECT_LE(1U, s[0]->OutputCount());
519 EXPECT_EQ(
kOverflow, s[0]->flags_condition());
524 const ODPI odpi = GetParam();
527 m.Return(m.Projection(
528 1, (m.*odpi.constructor)(m.Parameter(0), m.Int32Constant(imm))));
529 Stream s = m.Build();
530 ASSERT_EQ(1U, s.size());
531 EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode());
532 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode());
533 ASSERT_EQ(2U, s[0]->InputCount());
534 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1)));
535 EXPECT_LE(1U, s[0]->OutputCount());
537 EXPECT_EQ(
kOverflow, s[0]->flags_condition());
541 m.Return(m.Projection(
542 1, (m.*odpi.constructor)(m.Int32Constant(imm), m.Parameter(0))));
543 Stream s = m.Build();
544 ASSERT_EQ(1U, s.size());
545 EXPECT_EQ(odpi.reverse_arch_opcode, s[0]->arch_opcode());
546 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode());
547 ASSERT_EQ(2U, s[0]->InputCount());
548 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1)));
549 EXPECT_LE(1U, s[0]->OutputCount());
551 EXPECT_EQ(
kOverflow, s[0]->flags_condition());
557 const ODPI odpi = GetParam();
560 m.Return(m.Projection(
561 1, (m.*odpi.constructor)(
563 (m.*
shift.constructor)(m.Parameter(1), m.Parameter(2)))));
564 Stream s = m.Build();
565 ASSERT_EQ(1U, s.size());
566 EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode());
567 EXPECT_EQ(
shift.r_mode, s[0]->addressing_mode());
568 EXPECT_EQ(3U, s[0]->InputCount());
569 EXPECT_LE(1U, s[0]->OutputCount());
571 EXPECT_EQ(
kOverflow, s[0]->flags_condition());
575 m.Return(m.Projection(
576 1, (m.*odpi.constructor)(
577 (m.*
shift.constructor)(m.Parameter(0), m.Parameter(1)),
579 Stream s = m.Build();
580 ASSERT_EQ(1U, s.size());
581 EXPECT_EQ(odpi.reverse_arch_opcode, s[0]->arch_opcode());
582 EXPECT_EQ(
shift.r_mode, s[0]->addressing_mode());
583 EXPECT_EQ(3U, s[0]->InputCount());
584 EXPECT_LE(1U, s[0]->OutputCount());
586 EXPECT_EQ(
kOverflow, s[0]->flags_condition());
592 const ODPI odpi = GetParam();
596 m.Return(m.Projection(
597 1, (m.*odpi.constructor)(m.Parameter(0),
598 (m.*
shift.constructor)(
599 m.Parameter(1), m.Int32Constant(imm)))));
600 Stream s = m.Build();
601 ASSERT_EQ(1U, s.size());
602 EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode());
603 EXPECT_EQ(
shift.i_mode, s[0]->addressing_mode());
604 ASSERT_EQ(3U, s[0]->InputCount());
605 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2)));
606 EXPECT_LE(1U, s[0]->OutputCount());
608 EXPECT_EQ(
kOverflow, s[0]->flags_condition());
614 m.Return(m.Projection(
615 1, (m.*odpi.constructor)(
616 (m.*
shift.constructor)(m.Parameter(1), m.Int32Constant(imm)),
618 Stream s = m.Build();
619 ASSERT_EQ(1U, s.size());
620 EXPECT_EQ(odpi.reverse_arch_opcode, s[0]->arch_opcode());
621 EXPECT_EQ(
shift.i_mode, s[0]->addressing_mode());
622 ASSERT_EQ(3U, s[0]->InputCount());
623 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2)));
624 EXPECT_LE(1U, s[0]->OutputCount());
626 EXPECT_EQ(
kOverflow, s[0]->flags_condition());
633 const ODPI odpi = GetParam();
636 m.Projection(0, (m.*odpi.constructor)(m.Parameter(0), m.Parameter(1))));
637 Stream s = m.Build();
638 ASSERT_EQ(1U, s.size());
639 EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode());
640 EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode());
641 EXPECT_EQ(2U, s[0]->InputCount());
642 EXPECT_LE(1U, s[0]->OutputCount());
648 const ODPI odpi = GetParam();
651 m.Return(m.Projection(
652 0, (m.*odpi.constructor)(m.Parameter(0), m.Int32Constant(imm))));
653 Stream s = m.Build();
654 ASSERT_EQ(1U, s.size());
655 EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode());
656 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode());
657 ASSERT_EQ(2U, s[0]->InputCount());
658 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1)));
659 EXPECT_LE(1U, s[0]->OutputCount());
664 m.Return(m.Projection(
665 0, (m.*odpi.constructor)(m.Int32Constant(imm), m.Parameter(0))));
666 Stream s = m.Build();
667 ASSERT_EQ(1U, s.size());
668 EXPECT_EQ(odpi.reverse_arch_opcode, s[0]->arch_opcode());
669 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode());
670 ASSERT_EQ(2U, s[0]->InputCount());
671 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1)));
672 EXPECT_LE(1U, s[0]->OutputCount());
679 const ODPI odpi = GetParam();
682 m.Return(m.Projection(
683 0, (m.*odpi.constructor)(
685 (m.*
shift.constructor)(m.Parameter(1), m.Parameter(2)))));
686 Stream s = m.Build();
687 ASSERT_EQ(1U, s.size());
688 EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode());
689 EXPECT_EQ(
shift.r_mode, s[0]->addressing_mode());
690 EXPECT_EQ(3U, s[0]->InputCount());
691 EXPECT_LE(1U, s[0]->OutputCount());
696 m.Return(m.Projection(
697 0, (m.*odpi.constructor)(
698 (m.*
shift.constructor)(m.Parameter(0), m.Parameter(1)),
700 Stream s = m.Build();
701 ASSERT_EQ(1U, s.size());
702 EXPECT_EQ(odpi.reverse_arch_opcode, s[0]->arch_opcode());
703 EXPECT_EQ(
shift.r_mode, s[0]->addressing_mode());
704 EXPECT_EQ(3U, s[0]->InputCount());
705 EXPECT_LE(1U, s[0]->OutputCount());
712 const ODPI odpi = GetParam();
716 m.Return(m.Projection(
717 0, (m.*odpi.constructor)(m.Parameter(0),
718 (m.*
shift.constructor)(
719 m.Parameter(1), m.Int32Constant(imm)))));
720 Stream s = m.Build();
721 ASSERT_EQ(1U, s.size());
722 EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode());
723 EXPECT_EQ(
shift.i_mode, s[0]->addressing_mode());
724 ASSERT_EQ(3U, s[0]->InputCount());
725 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2)));
726 EXPECT_LE(1U, s[0]->OutputCount());
733 m.Return(m.Projection(
734 0, (m.*odpi.constructor)(
735 (m.*
shift.constructor)(m.Parameter(1), m.Int32Constant(imm)),
737 Stream s = m.Build();
738 ASSERT_EQ(1U, s.size());
739 EXPECT_EQ(odpi.reverse_arch_opcode, s[0]->arch_opcode());
740 EXPECT_EQ(
shift.i_mode, s[0]->addressing_mode());
741 ASSERT_EQ(3U, s[0]->InputCount());
742 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2)));
743 EXPECT_LE(1U, s[0]->OutputCount());
751 const ODPI odpi = GetParam();
753 Node* n = (m.*odpi.constructor)(m.Parameter(0), m.Parameter(1));
754 m.Return(m.Word32Equal(m.Projection(0, n), m.Projection(1, n)));
755 Stream s = m.Build();
756 ASSERT_LE(1U, s.size());
757 EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode());
758 EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode());
759 EXPECT_EQ(2U, s[0]->InputCount());
760 EXPECT_EQ(2U, s[0]->OutputCount());
762 EXPECT_EQ(
kOverflow, s[0]->flags_condition());
767 const ODPI odpi = GetParam();
770 Node* n = (m.*odpi.constructor)(m.Parameter(0), m.Int32Constant(imm));
771 m.Return(m.Word32Equal(m.Projection(0, n), m.Projection(1, n)));
772 Stream s = m.Build();
773 ASSERT_LE(1U, s.size());
774 EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode());
775 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode());
776 ASSERT_EQ(2U, s[0]->InputCount());
777 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1)));
778 EXPECT_EQ(2U, s[0]->OutputCount());
780 EXPECT_EQ(
kOverflow, s[0]->flags_condition());
784 Node* n = (m.*odpi.constructor)(m.Int32Constant(imm), m.Parameter(0));
785 m.Return(m.Word32Equal(m.Projection(0, n), m.Projection(1, n)));
786 Stream s = m.Build();
787 ASSERT_LE(1U, s.size());
788 EXPECT_EQ(odpi.reverse_arch_opcode, s[0]->arch_opcode());
789 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode());
790 ASSERT_EQ(2U, s[0]->InputCount());
791 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1)));
792 EXPECT_EQ(2U, s[0]->OutputCount());
794 EXPECT_EQ(
kOverflow, s[0]->flags_condition());
800 const ODPI odpi = GetParam();
803 Node* n = (m.*odpi.constructor)(
804 m.Parameter(0), (m.*
shift.constructor)(m.Parameter(1), m.Parameter(2)));
805 m.Return(m.Word32Equal(m.Projection(0, n), m.Projection(1, n)));
806 Stream s = m.Build();
807 ASSERT_LE(1U, s.size());
808 EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode());
809 EXPECT_EQ(
shift.r_mode, s[0]->addressing_mode());
810 EXPECT_EQ(3U, s[0]->InputCount());
811 EXPECT_EQ(2U, s[0]->OutputCount());
813 EXPECT_EQ(
kOverflow, s[0]->flags_condition());
817 Node* n = (m.*odpi.constructor)(
818 (m.*
shift.constructor)(m.Parameter(0), m.Parameter(1)), m.Parameter(2));
819 m.Return(m.Word32Equal(m.Projection(0, n), m.Projection(1, n)));
820 Stream s = m.Build();
821 ASSERT_LE(1U, s.size());
822 EXPECT_EQ(odpi.reverse_arch_opcode, s[0]->arch_opcode());
823 EXPECT_EQ(
shift.r_mode, s[0]->addressing_mode());
824 EXPECT_EQ(3U, s[0]->InputCount());
825 EXPECT_EQ(2U, s[0]->OutputCount());
827 EXPECT_EQ(
kOverflow, s[0]->flags_condition());
833 const ODPI odpi = GetParam();
837 Node* n = (m.*odpi.constructor)(
839 (m.*
shift.constructor)(m.Parameter(1), m.Int32Constant(imm)));
840 m.Return(m.Word32Equal(m.Projection(0, n), m.Projection(1, n)));
841 Stream s = m.Build();
842 ASSERT_LE(1U, s.size());
843 EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode());
844 EXPECT_EQ(
shift.i_mode, s[0]->addressing_mode());
845 ASSERT_EQ(3U, s[0]->InputCount());
846 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2)));
847 EXPECT_EQ(2U, s[0]->OutputCount());
849 EXPECT_EQ(
kOverflow, s[0]->flags_condition());
855 Node* n = (m.*odpi.constructor)(
856 (m.*
shift.constructor)(m.Parameter(0), m.Int32Constant(imm)),
858 m.Return(m.Word32Equal(m.Projection(0, n), m.Projection(1, n)));
859 Stream s = m.Build();
860 ASSERT_LE(1U, s.size());
861 EXPECT_EQ(odpi.reverse_arch_opcode, s[0]->arch_opcode());
862 EXPECT_EQ(
shift.i_mode, s[0]->addressing_mode());
863 ASSERT_EQ(3U, s[0]->InputCount());
864 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2)));
865 EXPECT_EQ(2U, s[0]->OutputCount());
867 EXPECT_EQ(
kOverflow, s[0]->flags_condition());
874 const ODPI odpi = GetParam();
877 Node* n = (m.*odpi.constructor)(m.Parameter(0), m.Parameter(1));
878 m.Branch(m.Projection(1, n), &a, &b);
880 m.Return(m.Int32Constant(0));
882 m.Return(m.Projection(0, n));
883 Stream s = m.Build();
884 ASSERT_EQ(1U, s.size());
885 EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode());
886 EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode());
887 EXPECT_EQ(4U, s[0]->InputCount());
888 EXPECT_EQ(1U, s[0]->OutputCount());
890 EXPECT_EQ(
kOverflow, s[0]->flags_condition());
895 const ODPI odpi = GetParam();
899 Node* n = (m.*odpi.constructor)(m.Parameter(0), m.Int32Constant(imm));
900 m.Branch(m.Projection(1, n), &a, &b);
902 m.Return(m.Int32Constant(0));
904 m.Return(m.Projection(0, n));
905 Stream s = m.Build();
906 ASSERT_EQ(1U, s.size());
907 EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode());
908 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode());
909 ASSERT_EQ(4U, s[0]->InputCount());
910 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1)));
911 EXPECT_EQ(1U, s[0]->OutputCount());
913 EXPECT_EQ(
kOverflow, s[0]->flags_condition());
918 Node* n = (m.*odpi.constructor)(m.Int32Constant(imm), m.Parameter(0));
919 m.Branch(m.Projection(1, n), &a, &b);
921 m.Return(m.Int32Constant(0));
923 m.Return(m.Projection(0, n));
924 Stream s = m.Build();
925 ASSERT_EQ(1U, s.size());
926 EXPECT_EQ(odpi.reverse_arch_opcode, s[0]->arch_opcode());
927 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode());
928 ASSERT_EQ(4U, s[0]->InputCount());
929 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1)));
930 EXPECT_EQ(1U, s[0]->OutputCount());
932 EXPECT_EQ(
kOverflow, s[0]->flags_condition());
938 const ODPI odpi = GetParam();
941 Node* n = (m.*odpi.constructor)(m.Parameter(0), m.Parameter(1));
942 m.Branch(m.Word32Equal(m.Projection(1, n), m.Int32Constant(0)), &a, &b);
944 m.Return(m.Projection(0, n));
946 m.Return(m.Int32Constant(0));
947 Stream s = m.Build();
948 ASSERT_EQ(1U, s.size());
949 EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode());
950 EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode());
951 EXPECT_EQ(4U, s[0]->InputCount());
952 EXPECT_EQ(1U, s[0]->OutputCount());
959 const ODPI odpi = GetParam();
962 Node* n = (m.*odpi.constructor)(m.Parameter(0), m.Parameter(1));
963 m.Branch(m.Word32NotEqual(m.Projection(1, n), m.Int32Constant(0)), &a, &b);
965 m.Return(m.Projection(0, n));
967 m.Return(m.Int32Constant(0));
968 Stream s = m.Build();
969 ASSERT_EQ(1U, s.size());
970 EXPECT_EQ(odpi.arch_opcode, s[0]->arch_opcode());
971 EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode());
972 EXPECT_EQ(4U, s[0]->InputCount());
973 EXPECT_EQ(1U, s[0]->OutputCount());
975 EXPECT_EQ(
kOverflow, s[0]->flags_condition());
980 ::testing::ValuesIn(
kODPIs));
993 m.Return((m.*
shift.constructor)(m.Parameter(0), m.Parameter(1)));
994 Stream s = m.Build();
995 ASSERT_EQ(1U, s.size());
996 EXPECT_EQ(kArmMov, s[0]->arch_opcode());
997 EXPECT_EQ(
shift.r_mode, s[0]->addressing_mode());
998 EXPECT_EQ(2U, s[0]->InputCount());
999 EXPECT_EQ(1U, s[0]->OutputCount());
1007 m.Return((m.*
shift.constructor)(m.Parameter(0), m.Int32Constant(imm)));
1008 Stream s = m.Build();
1009 ASSERT_EQ(1U, s.size());
1010 EXPECT_EQ(kArmMov, s[0]->arch_opcode());
1011 EXPECT_EQ(
shift.i_mode, s[0]->addressing_mode());
1012 ASSERT_EQ(2U, s[0]->InputCount());
1013 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1)));
1014 EXPECT_EQ(1U, s[0]->OutputCount());
1024 m.Word32Equal(m.Parameter(0),
1025 (m.*
shift.constructor)(m.Parameter(1), m.Parameter(2))));
1026 Stream s = m.Build();
1027 ASSERT_EQ(1U, s.size());
1028 EXPECT_EQ(kArmCmp, s[0]->arch_opcode());
1029 EXPECT_EQ(
shift.r_mode, s[0]->addressing_mode());
1030 EXPECT_EQ(3U, s[0]->InputCount());
1031 EXPECT_EQ(1U, s[0]->OutputCount());
1033 EXPECT_EQ(
kEqual, s[0]->flags_condition());
1038 m.Word32Equal((m.*
shift.constructor)(m.Parameter(1), m.Parameter(2)),
1040 Stream s = m.Build();
1041 ASSERT_EQ(1U, s.size());
1042 EXPECT_EQ(kArmCmp, s[0]->arch_opcode());
1043 EXPECT_EQ(
shift.r_mode, s[0]->addressing_mode());
1044 EXPECT_EQ(3U, s[0]->InputCount());
1045 EXPECT_EQ(1U, s[0]->OutputCount());
1047 EXPECT_EQ(
kEqual, s[0]->flags_condition());
1056 m.Return(m.Word32Equal(
1057 (m.*
shift.constructor)(m.Parameter(1), m.Int32Constant(imm)),
1059 Stream s = m.Build();
1060 ASSERT_EQ(1U, s.size());
1061 EXPECT_EQ(kArmCmp, s[0]->arch_opcode());
1062 EXPECT_EQ(
shift.i_mode, s[0]->addressing_mode());
1063 ASSERT_EQ(3U, s[0]->InputCount());
1064 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2)));
1065 EXPECT_EQ(1U, s[0]->OutputCount());
1067 EXPECT_EQ(
kEqual, s[0]->flags_condition());
1071 m.Return(m.Word32Equal(
1073 (m.*
shift.constructor)(m.Parameter(1), m.Int32Constant(imm))));
1074 Stream s = m.Build();
1075 ASSERT_EQ(1U, s.size());
1076 EXPECT_EQ(kArmCmp, s[0]->arch_opcode());
1077 EXPECT_EQ(
shift.i_mode, s[0]->addressing_mode());
1078 ASSERT_EQ(3U, s[0]->InputCount());
1079 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2)));
1080 EXPECT_EQ(1U, s[0]->OutputCount());
1082 EXPECT_EQ(
kEqual, s[0]->flags_condition());
1091 m.Word32Equal(m.Int32Constant(0),
1092 (m.*
shift.constructor)(m.Parameter(0), m.Parameter(1))));
1093 Stream s = m.Build();
1094 ASSERT_EQ(1U, s.size());
1095 EXPECT_EQ(kArmMov, s[0]->arch_opcode());
1096 EXPECT_EQ(
shift.r_mode, s[0]->addressing_mode());
1097 EXPECT_EQ(2U, s[0]->InputCount());
1098 EXPECT_EQ(2U, s[0]->OutputCount());
1100 EXPECT_EQ(
kEqual, s[0]->flags_condition());
1108 m.Return(m.Word32Equal(
1110 (m.*
shift.constructor)(m.Parameter(0), m.Int32Constant(imm))));
1111 Stream s = m.Build();
1112 ASSERT_EQ(1U, s.size());
1113 EXPECT_EQ(kArmMov, s[0]->arch_opcode());
1114 EXPECT_EQ(
shift.i_mode, s[0]->addressing_mode());
1115 ASSERT_EQ(2U, s[0]->InputCount());
1116 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1)));
1117 EXPECT_EQ(2U, s[0]->OutputCount());
1119 EXPECT_EQ(
kEqual, s[0]->flags_condition());
1127 m.Return(m.Word32Not((m.*
shift.constructor)(m.Parameter(0), m.Parameter(1))));
1128 Stream s = m.Build();
1129 ASSERT_EQ(1U, s.size());
1130 EXPECT_EQ(kArmMvn, s[0]->arch_opcode());
1131 EXPECT_EQ(
shift.r_mode, s[0]->addressing_mode());
1132 EXPECT_EQ(2U, s[0]->InputCount());
1133 EXPECT_EQ(1U, s[0]->OutputCount());
1141 m.Return(m.Word32Not(
1142 (m.*
shift.constructor)(m.Parameter(0), m.Int32Constant(imm))));
1143 Stream s = m.Build();
1144 ASSERT_EQ(1U, s.size());
1145 EXPECT_EQ(kArmMvn, s[0]->arch_opcode());
1146 EXPECT_EQ(
shift.i_mode, s[0]->addressing_mode());
1147 ASSERT_EQ(2U, s[0]->InputCount());
1148 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1)));
1149 EXPECT_EQ(1U, s[0]->OutputCount());
1157 m.Return(m.Word32And(m.Parameter(0), m.Word32Not((m.*
shift.constructor)(
1158 m.Parameter(1), m.Parameter(2)))));
1159 Stream s = m.Build();
1160 ASSERT_EQ(1U, s.size());
1161 EXPECT_EQ(kArmBic, s[0]->arch_opcode());
1162 EXPECT_EQ(
shift.r_mode, s[0]->addressing_mode());
1163 EXPECT_EQ(3U, s[0]->InputCount());
1164 EXPECT_EQ(1U, s[0]->OutputCount());
1172 m.Return(m.Word32And(m.Parameter(0),
1173 m.Word32Not((m.*
shift.constructor)(
1174 m.Parameter(1), m.Int32Constant(imm)))));
1175 Stream s = m.Build();
1176 ASSERT_EQ(1U, s.size());
1177 EXPECT_EQ(kArmBic, s[0]->arch_opcode());
1178 EXPECT_EQ(
shift.i_mode, s[0]->addressing_mode());
1179 ASSERT_EQ(3U, s[0]->InputCount());
1180 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(2)));
1181 EXPECT_EQ(1U, s[0]->OutputCount());
1187 ::testing::ValuesIn(
kShifts));
1200 bool (InstructionSelectorTest::Stream::*val_predicate)(
1209 return os << ost.
c_str();
1217 &InstructionSelectorTest::Stream::IsInteger,
1218 {-4095, -3340, -3231, -3224, -3088, -1758, -1203, -123, -117, -91, -89,
1219 -87, -86, -82, -44, -23, -3, 0, 7, 10, 39, 52, 69, 71, 91, 92, 107, 109,
1220 115, 124, 286, 655, 1362, 1569, 2587, 3067, 3096, 3462, 3510, 4095}},
1224 &InstructionSelectorTest::Stream::IsInteger,
1225 {-4095, -3914, -3536, -3234, -3185, -3169, -1073, -990, -859, -720, -434,
1226 -127, -124, -122, -105, -91, -86, -64, -55, -53, -30, -10, -3, 0, 20, 28,
1227 39, 58, 64, 73, 75, 100, 108, 121, 686, 963, 1363, 2759, 3449, 4095}},
1231 &InstructionSelectorTest::Stream::IsInteger,
1232 {-255, -251, -232, -220, -144, -138, -130, -126, -116, -115, -102, -101,
1233 -98, -69, -59, -56, -39, -35, -23, -19, -7, 0, 22, 26, 37, 68, 83, 87, 98,
1234 102, 108, 111, 117, 171, 195, 203, 204, 245, 246, 255}},
1238 &InstructionSelectorTest::Stream::IsInteger,
1239 {-255, -230, -201, -172, -125, -119, -118, -105, -98, -79, -54, -42, -41,
1240 -32, -12, -11, -5, -4, 0, 5, 9, 25, 28, 51, 58, 60, 89, 104, 108, 109,
1241 114, 116, 120, 138, 150, 161, 166, 172, 228, 255}},
1245 &InstructionSelectorTest::Stream::IsInteger,
1246 {-4095, -1898, -1685, -1562, -1408, -1313, -344, -128, -116, -100, -92,
1247 -80, -72, -71, -56, -25, -21, -11, -9, 0, 3, 5, 27, 28, 42, 52, 63, 88,
1248 93, 97, 125, 846, 1037, 2102, 2403, 2597, 2632, 2997, 3935, 4095}},
1252 &InstructionSelectorTest::Stream::IsDouble,
1253 {-1020, -928, -896, -772, -728, -680, -660, -488, -372, -112, -100, -92,
1254 -84, -80, -72, -64, -60, -56, -52, -48, -36, -32, -20, -8, -4, 0, 8, 20,
1255 24, 40, 64, 112, 204, 388, 516, 852, 856, 976, 988, 1020}},
1259 &InstructionSelectorTest::Stream::IsDouble,
1260 {-1020, -948, -796, -696, -612, -364, -320, -308, -128, -112, -108, -104,
1261 -96, -84, -80, -56, -48, -40, -20, 0, 24, 28, 36, 48, 64, 84, 96, 100,
1262 108, 116, 120, 140, 156, 408, 432, 444, 772, 832, 940, 1020}}};
1267 typedef InstructionSelectorTestWithParam<MemoryAccess>
1272 const MemoryAccess memacc = GetParam();
1274 m.Return(m.Load(memacc.type, m.Parameter(0), m.Parameter(1)));
1275 Stream s = m.Build();
1276 ASSERT_EQ(1U, s.size());
1277 EXPECT_EQ(memacc.ldr_opcode, s[0]->arch_opcode());
1278 EXPECT_EQ(kMode_Offset_RR, s[0]->addressing_mode());
1279 EXPECT_EQ(2U, s[0]->InputCount());
1280 ASSERT_EQ(1U, s[0]->OutputCount());
1281 EXPECT_TRUE((s.*memacc.val_predicate)(s[0]->Output()));
1286 const MemoryAccess memacc = GetParam();
1287 TRACED_FOREACH(
int32_t, index, memacc.immediates) {
1288 StreamBuilder m(
this, memacc.type,
kMachPtr);
1289 m.Return(m.Load(memacc.type, m.Parameter(0), m.Int32Constant(index)));
1290 Stream s = m.Build();
1291 ASSERT_EQ(1U, s.size());
1292 EXPECT_EQ(memacc.ldr_opcode, s[0]->arch_opcode());
1293 EXPECT_EQ(kMode_Offset_RI, s[0]->addressing_mode());
1294 ASSERT_EQ(2U, s[0]->InputCount());
1296 EXPECT_EQ(index, s.ToInt32(s[0]->InputAt(1)));
1297 ASSERT_EQ(1U, s[0]->OutputCount());
1298 EXPECT_TRUE((s.*memacc.val_predicate)(s[0]->Output()));
1304 const MemoryAccess memacc = GetParam();
1306 m.Store(memacc.type, m.Parameter(0), m.Parameter(1), m.Parameter(2));
1307 m.Return(m.Int32Constant(0));
1308 Stream s = m.Build();
1309 ASSERT_EQ(1U, s.size());
1310 EXPECT_EQ(memacc.str_opcode, s[0]->arch_opcode());
1311 EXPECT_EQ(kMode_Offset_RR, s[0]->addressing_mode());
1312 EXPECT_EQ(3U, s[0]->InputCount());
1313 EXPECT_EQ(0
U, s[0]->OutputCount());
1318 const MemoryAccess memacc = GetParam();
1319 TRACED_FOREACH(
int32_t, index, memacc.immediates) {
1321 m.Store(memacc.type, m.Parameter(0), m.Int32Constant(index),
1323 m.Return(m.Int32Constant(0));
1324 Stream s = m.Build();
1325 ASSERT_EQ(1U, s.size());
1326 EXPECT_EQ(memacc.str_opcode, s[0]->arch_opcode());
1327 EXPECT_EQ(kMode_Offset_RI, s[0]->addressing_mode());
1328 ASSERT_EQ(3U, s[0]->InputCount());
1330 EXPECT_EQ(index, s.ToInt32(s[0]->InputAt(1)));
1331 EXPECT_EQ(0
U, s[0]->OutputCount());
1347 m.Return(m.ChangeFloat32ToFloat64(m.Parameter(0)));
1348 Stream s = m.Build();
1349 ASSERT_EQ(1U, s.size());
1350 EXPECT_EQ(kArmVcvtF64F32, s[0]->arch_opcode());
1351 EXPECT_EQ(1U, s[0]->InputCount());
1352 EXPECT_EQ(1U, s[0]->OutputCount());
1358 m.Return(m.TruncateFloat64ToFloat32(m.Parameter(0)));
1359 Stream s = m.Build();
1360 ASSERT_EQ(1U, s.size());
1361 EXPECT_EQ(kArmVcvtF32F64, s[0]->arch_opcode());
1362 EXPECT_EQ(1U, s[0]->InputCount());
1363 EXPECT_EQ(1U, s[0]->OutputCount());
1375 m.Int32Add(m.Parameter(0), m.Int32Mul(m.Parameter(1), m.Parameter(2))));
1376 Stream s = m.Build();
1377 ASSERT_EQ(1U, s.size());
1378 EXPECT_EQ(kArmMla, s[0]->arch_opcode());
1379 EXPECT_EQ(3U, s[0]->InputCount());
1380 EXPECT_EQ(1U, s[0]->OutputCount());
1385 m.Int32Add(m.Int32Mul(m.Parameter(1), m.Parameter(2)), m.Parameter(0)));
1386 Stream s = m.Build();
1387 ASSERT_EQ(1U, s.size());
1388 EXPECT_EQ(kArmMla, s[0]->arch_opcode());
1389 EXPECT_EQ(3U, s[0]->InputCount());
1390 EXPECT_EQ(1U, s[0]->OutputCount());
1397 m.Return(m.Int32Div(m.Parameter(0), m.Parameter(1)));
1398 Stream s = m.Build();
1399 ASSERT_EQ(4U, s.size());
1400 EXPECT_EQ(kArmVcvtF64S32, s[0]->arch_opcode());
1401 ASSERT_EQ(1U, s[0]->OutputCount());
1402 EXPECT_EQ(kArmVcvtF64S32, s[1]->arch_opcode());
1403 ASSERT_EQ(1U, s[1]->OutputCount());
1404 EXPECT_EQ(kArmVdivF64, s[2]->arch_opcode());
1405 ASSERT_EQ(2U, s[2]->InputCount());
1406 ASSERT_EQ(1U, s[2]->OutputCount());
1407 EXPECT_EQ(s.ToVreg(s[0]->Output()), s.ToVreg(s[2]->InputAt(0)));
1408 EXPECT_EQ(s.ToVreg(s[1]->Output()), s.ToVreg(s[2]->InputAt(1)));
1409 EXPECT_EQ(kArmVcvtS32F64, s[3]->arch_opcode());
1410 ASSERT_EQ(1U, s[3]->InputCount());
1411 EXPECT_EQ(s.ToVreg(s[2]->Output()), s.ToVreg(s[3]->InputAt(0)));
1417 m.Return(m.Int32Div(m.Parameter(0), m.Parameter(1)));
1418 Stream s = m.Build(
SUDIV);
1419 ASSERT_EQ(1U, s.size());
1420 EXPECT_EQ(kArmSdiv, s[0]->arch_opcode());
1426 m.Return(m.Int32Mod(m.Parameter(0), m.Parameter(1)));
1427 Stream s = m.Build();
1428 ASSERT_EQ(6U, s.size());
1429 EXPECT_EQ(kArmVcvtF64S32, s[0]->arch_opcode());
1430 ASSERT_EQ(1U, s[0]->OutputCount());
1431 EXPECT_EQ(kArmVcvtF64S32, s[1]->arch_opcode());
1432 ASSERT_EQ(1U, s[1]->OutputCount());
1433 EXPECT_EQ(kArmVdivF64, s[2]->arch_opcode());
1434 ASSERT_EQ(2U, s[2]->InputCount());
1435 ASSERT_EQ(1U, s[2]->OutputCount());
1436 EXPECT_EQ(s.ToVreg(s[0]->Output()), s.ToVreg(s[2]->InputAt(0)));
1437 EXPECT_EQ(s.ToVreg(s[1]->Output()), s.ToVreg(s[2]->InputAt(1)));
1438 EXPECT_EQ(kArmVcvtS32F64, s[3]->arch_opcode());
1439 ASSERT_EQ(1U, s[3]->InputCount());
1440 EXPECT_EQ(s.ToVreg(s[2]->Output()), s.ToVreg(s[3]->InputAt(0)));
1441 EXPECT_EQ(kArmMul, s[4]->arch_opcode());
1442 ASSERT_EQ(1U, s[4]->OutputCount());
1443 ASSERT_EQ(2U, s[4]->InputCount());
1444 EXPECT_EQ(s.ToVreg(s[3]->Output()), s.ToVreg(s[4]->InputAt(0)));
1445 EXPECT_EQ(s.ToVreg(s[1]->InputAt(0)), s.ToVreg(s[4]->InputAt(1)));
1446 EXPECT_EQ(kArmSub, s[5]->arch_opcode());
1447 ASSERT_EQ(1U, s[5]->OutputCount());
1448 ASSERT_EQ(2U, s[5]->InputCount());
1449 EXPECT_EQ(s.ToVreg(s[0]->InputAt(0)), s.ToVreg(s[5]->InputAt(0)));
1450 EXPECT_EQ(s.ToVreg(s[4]->Output()), s.ToVreg(s[5]->InputAt(1)));
1456 m.Return(m.Int32Mod(m.Parameter(0), m.Parameter(1)));
1457 Stream s = m.Build(
SUDIV);
1458 ASSERT_EQ(3U, s.size());
1459 EXPECT_EQ(kArmSdiv, s[0]->arch_opcode());
1460 ASSERT_EQ(1U, s[0]->OutputCount());
1461 ASSERT_EQ(2U, s[0]->InputCount());
1462 EXPECT_EQ(kArmMul, s[1]->arch_opcode());
1463 ASSERT_EQ(1U, s[1]->OutputCount());
1464 ASSERT_EQ(2U, s[1]->InputCount());
1465 EXPECT_EQ(s.ToVreg(s[0]->Output()), s.ToVreg(s[1]->InputAt(0)));
1466 EXPECT_EQ(s.ToVreg(s[0]->InputAt(1)), s.ToVreg(s[1]->InputAt(1)));
1467 EXPECT_EQ(kArmSub, s[2]->arch_opcode());
1468 ASSERT_EQ(1U, s[2]->OutputCount());
1469 ASSERT_EQ(2U, s[2]->InputCount());
1470 EXPECT_EQ(s.ToVreg(s[0]->InputAt(0)), s.ToVreg(s[2]->InputAt(0)));
1471 EXPECT_EQ(s.ToVreg(s[1]->Output()), s.ToVreg(s[2]->InputAt(1)));
1477 m.Return(m.Int32Mod(m.Parameter(0), m.Parameter(1)));
1479 ASSERT_EQ(2U, s.size());
1480 EXPECT_EQ(kArmSdiv, s[0]->arch_opcode());
1481 ASSERT_EQ(1U, s[0]->OutputCount());
1482 ASSERT_EQ(2U, s[0]->InputCount());
1483 EXPECT_EQ(kArmMls, s[1]->arch_opcode());
1484 ASSERT_EQ(1U, s[1]->OutputCount());
1485 ASSERT_EQ(3U, s[1]->InputCount());
1486 EXPECT_EQ(s.ToVreg(s[0]->Output()), s.ToVreg(s[1]->InputAt(0)));
1487 EXPECT_EQ(s.ToVreg(s[0]->InputAt(1)), s.ToVreg(s[1]->InputAt(1)));
1488 EXPECT_EQ(s.ToVreg(s[0]->InputAt(0)), s.ToVreg(s[1]->InputAt(2)));
1494 m.Return(m.Int32Mul(m.Parameter(0), m.Parameter(1)));
1495 Stream s = m.Build();
1496 ASSERT_EQ(1U, s.size());
1497 EXPECT_EQ(kArmMul, s[0]->arch_opcode());
1498 EXPECT_EQ(2U, s[0]->InputCount());
1499 EXPECT_EQ(1U, s[0]->OutputCount());
1505 TRACED_FORRANGE(
int32_t, k, 1, 30) {
1507 m.Return(m.Int32Mul(m.Parameter(0), m.Int32Constant((1 << k) + 1)));
1508 Stream s = m.Build();
1509 ASSERT_EQ(1U, s.size());
1510 EXPECT_EQ(kArmAdd, s[0]->arch_opcode());
1511 EXPECT_EQ(kMode_Operand2_R_LSL_I, s[0]->addressing_mode());
1512 ASSERT_EQ(3U, s[0]->InputCount());
1513 EXPECT_EQ(s.ToVreg(s[0]->InputAt(0)), s.ToVreg(s[0]->InputAt(1)));
1514 EXPECT_EQ(k, s.ToInt32(s[0]->InputAt(2)));
1515 EXPECT_EQ(1U, s[0]->OutputCount());
1518 TRACED_FORRANGE(
int32_t, k, 3, 30) {
1520 m.Return(m.Int32Mul(m.Parameter(0), m.Int32Constant((1 << k) - 1)));
1521 Stream s = m.Build();
1522 ASSERT_EQ(1U, s.size());
1523 EXPECT_EQ(kArmRsb, s[0]->arch_opcode());
1524 EXPECT_EQ(kMode_Operand2_R_LSL_I, s[0]->addressing_mode());
1525 ASSERT_EQ(3U, s[0]->InputCount());
1526 EXPECT_EQ(s.ToVreg(s[0]->InputAt(0)), s.ToVreg(s[0]->InputAt(1)));
1527 EXPECT_EQ(k, s.ToInt32(s[0]->InputAt(2)));
1528 EXPECT_EQ(1U, s[0]->OutputCount());
1531 TRACED_FORRANGE(
int32_t, k, 1, 30) {
1533 m.Return(m.Int32Mul(m.Int32Constant((1 << k) + 1), m.Parameter(0)));
1534 Stream s = m.Build();
1535 ASSERT_EQ(1U, s.size());
1536 EXPECT_EQ(kArmAdd, s[0]->arch_opcode());
1537 EXPECT_EQ(kMode_Operand2_R_LSL_I, s[0]->addressing_mode());
1538 ASSERT_EQ(3U, s[0]->InputCount());
1539 EXPECT_EQ(s.ToVreg(s[0]->InputAt(0)), s.ToVreg(s[0]->InputAt(1)));
1540 EXPECT_EQ(k, s.ToInt32(s[0]->InputAt(2)));
1541 EXPECT_EQ(1U, s[0]->OutputCount());
1544 TRACED_FORRANGE(
int32_t, k, 3, 30) {
1546 m.Return(m.Int32Mul(m.Int32Constant((1 << k) - 1), m.Parameter(0)));
1547 Stream s = m.Build();
1548 ASSERT_EQ(1U, s.size());
1549 EXPECT_EQ(kArmRsb, s[0]->arch_opcode());
1550 EXPECT_EQ(kMode_Operand2_R_LSL_I, s[0]->addressing_mode());
1551 ASSERT_EQ(3U, s[0]->InputCount());
1552 EXPECT_EQ(s.ToVreg(s[0]->InputAt(0)), s.ToVreg(s[0]->InputAt(1)));
1553 EXPECT_EQ(k, s.ToInt32(s[0]->InputAt(2)));
1554 EXPECT_EQ(1U, s[0]->OutputCount());
1562 m.Int32Sub(m.Parameter(0), m.Int32Mul(m.Parameter(1), m.Parameter(2))));
1563 Stream s = m.Build();
1564 ASSERT_EQ(2U, s.size());
1565 EXPECT_EQ(kArmMul, s[0]->arch_opcode());
1566 ASSERT_EQ(1U, s[0]->OutputCount());
1567 EXPECT_EQ(kArmSub, s[1]->arch_opcode());
1568 ASSERT_EQ(2U, s[1]->InputCount());
1569 EXPECT_EQ(s.ToVreg(s[0]->Output()), s.ToVreg(s[1]->InputAt(1)));
1576 m.Int32Sub(m.Parameter(0), m.Int32Mul(m.Parameter(1), m.Parameter(2))));
1577 Stream s = m.Build(
MLS);
1578 ASSERT_EQ(1U, s.size());
1579 EXPECT_EQ(kArmMls, s[0]->arch_opcode());
1580 EXPECT_EQ(1U, s[0]->OutputCount());
1581 EXPECT_EQ(3U, s[0]->InputCount());
1587 m.Return(m.Int32UDiv(m.Parameter(0), m.Parameter(1)));
1588 Stream s = m.Build();
1589 ASSERT_EQ(4U, s.size());
1590 EXPECT_EQ(kArmVcvtF64U32, s[0]->arch_opcode());
1591 ASSERT_EQ(1U, s[0]->OutputCount());
1592 EXPECT_EQ(kArmVcvtF64U32, s[1]->arch_opcode());
1593 ASSERT_EQ(1U, s[1]->OutputCount());
1594 EXPECT_EQ(kArmVdivF64, s[2]->arch_opcode());
1595 ASSERT_EQ(2U, s[2]->InputCount());
1596 ASSERT_EQ(1U, s[2]->OutputCount());
1597 EXPECT_EQ(s.ToVreg(s[0]->Output()), s.ToVreg(s[2]->InputAt(0)));
1598 EXPECT_EQ(s.ToVreg(s[1]->Output()), s.ToVreg(s[2]->InputAt(1)));
1599 EXPECT_EQ(kArmVcvtU32F64, s[3]->arch_opcode());
1600 ASSERT_EQ(1U, s[3]->InputCount());
1601 EXPECT_EQ(s.ToVreg(s[2]->Output()), s.ToVreg(s[3]->InputAt(0)));
1607 m.Return(m.Int32UDiv(m.Parameter(0), m.Parameter(1)));
1608 Stream s = m.Build(
SUDIV);
1609 ASSERT_EQ(1U, s.size());
1610 EXPECT_EQ(kArmUdiv, s[0]->arch_opcode());
1616 m.Return(m.Int32UMod(m.Parameter(0), m.Parameter(1)));
1617 Stream s = m.Build();
1618 ASSERT_EQ(6U, s.size());
1619 EXPECT_EQ(kArmVcvtF64U32, s[0]->arch_opcode());
1620 ASSERT_EQ(1U, s[0]->OutputCount());
1621 EXPECT_EQ(kArmVcvtF64U32, s[1]->arch_opcode());
1622 ASSERT_EQ(1U, s[1]->OutputCount());
1623 EXPECT_EQ(kArmVdivF64, s[2]->arch_opcode());
1624 ASSERT_EQ(2U, s[2]->InputCount());
1625 ASSERT_EQ(1U, s[2]->OutputCount());
1626 EXPECT_EQ(s.ToVreg(s[0]->Output()), s.ToVreg(s[2]->InputAt(0)));
1627 EXPECT_EQ(s.ToVreg(s[1]->Output()), s.ToVreg(s[2]->InputAt(1)));
1628 EXPECT_EQ(kArmVcvtU32F64, s[3]->arch_opcode());
1629 ASSERT_EQ(1U, s[3]->InputCount());
1630 EXPECT_EQ(s.ToVreg(s[2]->Output()), s.ToVreg(s[3]->InputAt(0)));
1631 EXPECT_EQ(kArmMul, s[4]->arch_opcode());
1632 ASSERT_EQ(1U, s[4]->OutputCount());
1633 ASSERT_EQ(2U, s[4]->InputCount());
1634 EXPECT_EQ(s.ToVreg(s[3]->Output()), s.ToVreg(s[4]->InputAt(0)));
1635 EXPECT_EQ(s.ToVreg(s[1]->InputAt(0)), s.ToVreg(s[4]->InputAt(1)));
1636 EXPECT_EQ(kArmSub, s[5]->arch_opcode());
1637 ASSERT_EQ(1U, s[5]->OutputCount());
1638 ASSERT_EQ(2U, s[5]->InputCount());
1639 EXPECT_EQ(s.ToVreg(s[0]->InputAt(0)), s.ToVreg(s[5]->InputAt(0)));
1640 EXPECT_EQ(s.ToVreg(s[4]->Output()), s.ToVreg(s[5]->InputAt(1)));
1646 m.Return(m.Int32UMod(m.Parameter(0), m.Parameter(1)));
1647 Stream s = m.Build(
SUDIV);
1648 ASSERT_EQ(3U, s.size());
1649 EXPECT_EQ(kArmUdiv, s[0]->arch_opcode());
1650 ASSERT_EQ(1U, s[0]->OutputCount());
1651 ASSERT_EQ(2U, s[0]->InputCount());
1652 EXPECT_EQ(kArmMul, s[1]->arch_opcode());
1653 ASSERT_EQ(1U, s[1]->OutputCount());
1654 ASSERT_EQ(2U, s[1]->InputCount());
1655 EXPECT_EQ(s.ToVreg(s[0]->Output()), s.ToVreg(s[1]->InputAt(0)));
1656 EXPECT_EQ(s.ToVreg(s[0]->InputAt(1)), s.ToVreg(s[1]->InputAt(1)));
1657 EXPECT_EQ(kArmSub, s[2]->arch_opcode());
1658 ASSERT_EQ(1U, s[2]->OutputCount());
1659 ASSERT_EQ(2U, s[2]->InputCount());
1660 EXPECT_EQ(s.ToVreg(s[0]->InputAt(0)), s.ToVreg(s[2]->InputAt(0)));
1661 EXPECT_EQ(s.ToVreg(s[1]->Output()), s.ToVreg(s[2]->InputAt(1)));
1667 m.Return(m.Int32UMod(m.Parameter(0), m.Parameter(1)));
1669 ASSERT_EQ(2U, s.size());
1670 EXPECT_EQ(kArmUdiv, s[0]->arch_opcode());
1671 ASSERT_EQ(1U, s[0]->OutputCount());
1672 ASSERT_EQ(2U, s[0]->InputCount());
1673 EXPECT_EQ(kArmMls, s[1]->arch_opcode());
1674 ASSERT_EQ(1U, s[1]->OutputCount());
1675 ASSERT_EQ(3U, s[1]->InputCount());
1676 EXPECT_EQ(s.ToVreg(s[0]->Output()), s.ToVreg(s[1]->InputAt(0)));
1677 EXPECT_EQ(s.ToVreg(s[0]->InputAt(1)), s.ToVreg(s[1]->InputAt(1)));
1678 EXPECT_EQ(s.ToVreg(s[0]->InputAt(0)), s.ToVreg(s[1]->InputAt(2)));
1683 TRACED_FORRANGE(
int32_t, width, 1, 32) {
1685 m.Return(m.Word32And(m.Parameter(0),
1686 m.Int32Constant(0xffffffffu >> (32 - width))));
1687 Stream s = m.Build(
ARMv7);
1688 ASSERT_EQ(1U, s.size());
1689 EXPECT_EQ(kArmUbfx, s[0]->arch_opcode());
1690 ASSERT_EQ(3U, s[0]->InputCount());
1691 EXPECT_EQ(0, s.ToInt32(s[0]->InputAt(1)));
1692 EXPECT_EQ(width, s.ToInt32(s[0]->InputAt(2)));
1694 TRACED_FORRANGE(
int32_t, width, 1, 32) {
1696 m.Return(m.Word32And(m.Int32Constant(0xffffffffu >> (32 - width)),
1698 Stream s = m.Build(
ARMv7);
1699 ASSERT_EQ(1U, s.size());
1700 EXPECT_EQ(kArmUbfx, s[0]->arch_opcode());
1701 ASSERT_EQ(3U, s[0]->InputCount());
1702 EXPECT_EQ(0, s.ToInt32(s[0]->InputAt(1)));
1703 EXPECT_EQ(width, s.ToInt32(s[0]->InputAt(2)));
1709 TRACED_FORRANGE(
int32_t, lsb, 0, 31) {
1710 TRACED_FORRANGE(
int32_t, width, 1, (32 - lsb) - 1) {
1712 m.Return(m.Word32And(
1714 m.Int32Constant(~((0xffffffffu >> (32 - width)) << lsb))));
1715 Stream s = m.Build(
ARMv7);
1716 ASSERT_EQ(1U, s.size());
1717 EXPECT_EQ(kArmBfc, s[0]->arch_opcode());
1718 ASSERT_EQ(1U, s[0]->OutputCount());
1721 ASSERT_EQ(3U, s[0]->InputCount());
1722 EXPECT_EQ(lsb, s.ToInt32(s[0]->InputAt(1)));
1723 EXPECT_EQ(width, s.ToInt32(s[0]->InputAt(2)));
1726 TRACED_FORRANGE(
int32_t, lsb, 0, 31) {
1727 TRACED_FORRANGE(
int32_t, width, 1, (32 - lsb) - 1) {
1730 m.Word32And(m.Int32Constant(~((0xffffffffu >> (32 - width)) << lsb)),
1732 Stream s = m.Build(
ARMv7);
1733 ASSERT_EQ(1U, s.size());
1734 EXPECT_EQ(kArmBfc, s[0]->arch_opcode());
1735 ASSERT_EQ(1U, s[0]->OutputCount());
1738 ASSERT_EQ(3U, s[0]->InputCount());
1739 EXPECT_EQ(lsb, s.ToInt32(s[0]->InputAt(1)));
1740 EXPECT_EQ(width, s.ToInt32(s[0]->InputAt(2)));
1747 TRACED_FORRANGE(
int32_t, lsb, 0, 31) {
1748 TRACED_FORRANGE(
int32_t, width, 1, 32 - lsb) {
1751 uint32_t jnk = rng()->NextInt(max);
1752 uint32_t msk = ((0xffffffffu >> (32 - width)) << lsb) | jnk;
1754 m.Return(m.Word32Shr(m.Word32And(m.Parameter(0), m.Int32Constant(msk)),
1755 m.Int32Constant(lsb)));
1756 Stream s = m.Build(
ARMv7);
1757 ASSERT_EQ(1U, s.size());
1758 EXPECT_EQ(kArmUbfx, s[0]->arch_opcode());
1759 ASSERT_EQ(3U, s[0]->InputCount());
1760 EXPECT_EQ(lsb, s.ToInt32(s[0]->InputAt(1)));
1761 EXPECT_EQ(width, s.ToInt32(s[0]->InputAt(2)));
1764 TRACED_FORRANGE(
int32_t, lsb, 0, 31) {
1765 TRACED_FORRANGE(
int32_t, width, 1, 32 - lsb) {
1768 uint32_t jnk = rng()->NextInt(max);
1769 uint32_t msk = ((0xffffffffu >> (32 - width)) << lsb) | jnk;
1771 m.Return(m.Word32Shr(m.Word32And(m.Int32Constant(msk), m.Parameter(0)),
1772 m.Int32Constant(lsb)));
1773 Stream s = m.Build(
ARMv7);
1774 ASSERT_EQ(1U, s.size());
1775 EXPECT_EQ(kArmUbfx, s[0]->arch_opcode());
1776 ASSERT_EQ(3U, s[0]->InputCount());
1777 EXPECT_EQ(lsb, s.ToInt32(s[0]->InputAt(1)));
1778 EXPECT_EQ(width, s.ToInt32(s[0]->InputAt(2)));
1787 m.Return(m.Word32And(m.Parameter(0), m.Word32Not(m.Parameter(1))));
1788 Stream s = m.Build();
1789 ASSERT_EQ(1U, s.size());
1790 EXPECT_EQ(kArmBic, s[0]->arch_opcode());
1791 EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode());
1792 EXPECT_EQ(2U, s[0]->InputCount());
1793 EXPECT_EQ(1U, s[0]->OutputCount());
1797 m.Return(m.Word32And(m.Word32Not(m.Parameter(0)), m.Parameter(1)));
1798 Stream s = m.Build();
1799 ASSERT_EQ(1U, s.size());
1800 EXPECT_EQ(kArmBic, s[0]->arch_opcode());
1801 EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode());
1802 EXPECT_EQ(2U, s[0]->InputCount());
1803 EXPECT_EQ(1U, s[0]->OutputCount());
1810 m.Return(m.Word32Equal(m.Parameter(0), m.Parameter(1)));
1811 Stream s = m.Build();
1812 ASSERT_EQ(1U, s.size());
1813 EXPECT_EQ(kArmCmp, s[0]->arch_opcode());
1814 EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode());
1815 EXPECT_EQ(2U, s[0]->InputCount());
1816 EXPECT_EQ(1U, s[0]->OutputCount());
1818 EXPECT_EQ(
kEqual, s[0]->flags_condition());
1824 if (imm == 0)
continue;
1826 m.Return(m.Word32Equal(m.Parameter(0), m.Int32Constant(imm)));
1827 Stream s = m.Build();
1828 ASSERT_EQ(1U, s.size());
1829 EXPECT_EQ(kArmCmp, s[0]->arch_opcode());
1830 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode());
1831 ASSERT_EQ(2U, s[0]->InputCount());
1832 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1)));
1833 EXPECT_EQ(1U, s[0]->OutputCount());
1835 EXPECT_EQ(
kEqual, s[0]->flags_condition());
1838 if (imm == 0)
continue;
1840 m.Return(m.Word32Equal(m.Int32Constant(imm), m.Parameter(0)));
1841 Stream s = m.Build();
1842 ASSERT_EQ(1U, s.size());
1843 EXPECT_EQ(kArmCmp, s[0]->arch_opcode());
1844 EXPECT_EQ(kMode_Operand2_I, s[0]->addressing_mode());
1845 ASSERT_EQ(2U, s[0]->InputCount());
1846 EXPECT_EQ(imm, s.ToInt32(s[0]->InputAt(1)));
1847 EXPECT_EQ(1U, s[0]->OutputCount());
1849 EXPECT_EQ(
kEqual, s[0]->flags_condition());
1857 m.Return(m.Word32Equal(m.Parameter(0), m.Int32Constant(0)));
1858 Stream s = m.Build();
1859 ASSERT_EQ(1U, s.size());
1860 EXPECT_EQ(kArmTst, s[0]->arch_opcode());
1861 EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode());
1862 ASSERT_EQ(2U, s[0]->InputCount());
1863 EXPECT_EQ(s.ToVreg(s[0]->InputAt(0)), s.ToVreg(s[0]->InputAt(1)));
1864 EXPECT_EQ(1U, s[0]->OutputCount());
1866 EXPECT_EQ(
kEqual, s[0]->flags_condition());
1870 m.Return(m.Word32Equal(m.Int32Constant(0), m.Parameter(0)));
1871 Stream s = m.Build();
1872 ASSERT_EQ(1U, s.size());
1873 EXPECT_EQ(kArmTst, s[0]->arch_opcode());
1874 EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode());
1875 ASSERT_EQ(2U, s[0]->InputCount());
1876 EXPECT_EQ(s.ToVreg(s[0]->InputAt(0)), s.ToVreg(s[0]->InputAt(1)));
1877 EXPECT_EQ(1U, s[0]->OutputCount());
1879 EXPECT_EQ(
kEqual, s[0]->flags_condition());
1886 m.Return(m.Word32Not(m.Parameter(0)));
1887 Stream s = m.Build();
1888 ASSERT_EQ(1U, s.size());
1889 EXPECT_EQ(kArmMvn, s[0]->arch_opcode());
1890 EXPECT_EQ(kMode_Operand2_R, s[0]->addressing_mode());
1891 EXPECT_EQ(1U, s[0]->InputCount());
1892 EXPECT_EQ(1U, s[0]->OutputCount());
1897 TRACED_FORRANGE(
int32_t, lsb, 0, 31) {
1898 TRACED_FORRANGE(
int32_t, width, 1, 32 - lsb) {
1900 m.Return(m.Word32And(m.Word32Shr(m.Parameter(0), m.Int32Constant(lsb)),
1901 m.Int32Constant(0xffffffffu >> (32 - width))));
1902 Stream s = m.Build(
ARMv7);
1903 ASSERT_EQ(1U, s.size());
1904 EXPECT_EQ(kArmUbfx, s[0]->arch_opcode());
1905 ASSERT_EQ(3U, s[0]->InputCount());
1906 EXPECT_EQ(lsb, s.ToInt32(s[0]->InputAt(1)));
1907 EXPECT_EQ(width, s.ToInt32(s[0]->InputAt(2)));
1910 TRACED_FORRANGE(
int32_t, lsb, 0, 31) {
1911 TRACED_FORRANGE(
int32_t, width, 1, 32 - lsb) {
1913 m.Return(m.Word32And(m.Int32Constant(0xffffffffu >> (32 - width)),
1914 m.Word32Shr(m.Parameter(0), m.Int32Constant(lsb))));
1915 Stream s = m.Build(
ARMv7);
1916 ASSERT_EQ(1U, s.size());
1917 EXPECT_EQ(kArmUbfx, s[0]->arch_opcode());
1918 ASSERT_EQ(3U, s[0]->InputCount());
1919 EXPECT_EQ(lsb, s.ToInt32(s[0]->InputAt(1)));
1920 EXPECT_EQ(width, s.ToInt32(s[0]->InputAt(2)));
const char * c_str() const
Node * Int32Sub(Node *a, Node *b)
Node * Word32And(Node *a, Node *b)
Node * Int32AddWithOverflow(Node *a, Node *b)
Node * Int32SubWithOverflow(Node *a, Node *b)
Node * Word32Xor(Node *a, Node *b)
Node * Word32Or(Node *a, Node *b)
Node * Word32Ror(Node *a, Node *b)
Node * Word32Shl(Node *a, Node *b)
Node * Word32Shr(Node *a, Node *b)
Node * Word32Sar(Node *a, Node *b)
Node * Int32Add(Node *a, Node *b)
static const UnallocatedOperand * cast(const InstructionOperand *op)
enable harmony numeric enable harmony object literal extensions Optimize object Array shift
RawMachineAssembler::Label MLabel
static const Shift kShifts[]
Node *(RawMachineAssembler::* Constructor)(Node *, Node *)
static const ODPI kODPIs[]
static const int32_t kImmediates[]
InstructionSelectorTestWithParam< Shift > InstructionSelectorShiftTest
InstructionSelectorTestWithParam< DPI > InstructionSelectorDPITest
std::ostream & operator<<(std::ostream &os, const MachineType &type)
static const MemoryAccess kMemoryAccesses[]
TEST_P(InstructionSelectorDPITest, Parameters)
InstructionSelectorTestWithParam< MemoryAccess > InstructionSelectorMemoryAccessTest
INSTANTIATE_TEST_CASE_P(InstructionSelectorTest, InstructionSelectorDPITest, ::testing::ValuesIn(kDPIs))
TEST_F(InstructionSelectorTest, ChangeFloat32ToFloat64WithParameter)
InstructionSelectorTestWithParam< ODPI > InstructionSelectorODPITest
Debugger support for the V8 JavaScript engine.
ArchOpcode reverse_arch_opcode
const char * constructor_name
ArchOpcode test_arch_opcode
const char * constructor_name
ArchOpcode reverse_arch_opcode
const char * constructor_name