@@ -208,6 +208,9 @@ class Assembler : public AssemblerBase {
208208 }
209209 }
210210
211+ static RegList DefaultTmpList ();
212+ static DoubleRegList DefaultFPTmpList ();
213+
211214 // Label operations & relative jumps (PPUM Appendix D)
212215 //
213216 // Takes a branch opcode (cc) and a label (L) and generates
@@ -379,6 +382,8 @@ class Assembler : public AssemblerBase {
379382 inline void name (const Register dst, const MemOperand& src) { \
380383 x_form (instr_name, src.ra (), dst, src.rb (), SetEH); \
381384 }
385+ #define DECLARE_PPC_X_INSTRUCTIONS_EH_U_FORM (name, instr_name, instr_value ) \
386+ inline void name (const CRegister cr) { x_form (instr_name, cr); }
382387
383388 inline void x_form (Instr instr, int f1, int f2, int f3, int rc) {
384389 emit (instr | f1 * B21 | f2 * B16 | f3 * B11 | rc);
@@ -397,6 +402,9 @@ class Assembler : public AssemblerBase {
397402 emit (instr | cr.code () * B23 | L * B21 | s1.code () * B16 | s2.code () * B11 |
398403 rc);
399404 }
405+ inline void x_form (Instr instr, CRegister cr) {
406+ emit (instr | cr.code () * B23);
407+ }
400408
401409 PPC_X_OPCODE_A_FORM_LIST (DECLARE_PPC_X_INSTRUCTIONS_A_FORM)
402410 PPC_X_OPCODE_B_FORM_LIST (DECLARE_PPC_X_INSTRUCTIONS_B_FORM)
@@ -407,6 +415,7 @@ class Assembler : public AssemblerBase {
407415 PPC_X_OPCODE_G_FORM_LIST (DECLARE_PPC_X_INSTRUCTIONS_G_FORM)
408416 PPC_X_OPCODE_EH_S_FORM_LIST (DECLARE_PPC_X_INSTRUCTIONS_EH_S_FORM)
409417 PPC_X_OPCODE_EH_L_FORM_LIST (DECLARE_PPC_X_INSTRUCTIONS_EH_L_FORM)
418+ PPC_X_OPCODE_EH_U_FORM_LIST (DECLARE_PPC_X_INSTRUCTIONS_EH_U_FORM)
410419
411420 inline void notx (Register dst, Register src, RCBit rc = LeaveRC) {
412421 nor (dst, src, src, rc);
@@ -628,6 +637,10 @@ class Assembler : public AssemblerBase {
628637#undef DECLARE_PPC_PREFIX_INSTRUCTIONS_TYPE_10
629638
630639 RegList* GetScratchRegisterList () { return &scratch_register_list_; }
640+ DoubleRegList* GetScratchDoubleRegisterList () {
641+ return &scratch_double_register_list_;
642+ }
643+
631644 // ---------------------------------------------------------------------------
632645 // InstructionStream generation
633646
@@ -731,6 +744,12 @@ class Assembler : public AssemblerBase {
731744 case nooverflow:
732745 bc (b_offset, BF, encode_crbit (cr, CR_SO), lk);
733746 break ;
747+ case overflow32:
748+ bc (b_offset, BT, encode_crbit (cr, CR_OV32), lk);
749+ break ;
750+ case nooverflow32:
751+ bc (b_offset, BF, encode_crbit (cr, CR_OV32), lk);
752+ break ;
734753 default :
735754 UNIMPLEMENTED ();
736755 }
@@ -773,6 +792,12 @@ class Assembler : public AssemblerBase {
773792 case nooverflow:
774793 bclr (BF, encode_crbit (cr, CR_SO), lk);
775794 break ;
795+ case overflow32:
796+ bclr (BT, encode_crbit (cr, CR_OV32), lk);
797+ break ;
798+ case nooverflow32:
799+ bclr (BF, encode_crbit (cr, CR_OV32), lk);
800+ break ;
776801 default :
777802 UNIMPLEMENTED ();
778803 }
@@ -817,6 +842,12 @@ class Assembler : public AssemblerBase {
817842 case nooverflow:
818843 isel (rt, rb, ra, encode_crbit (cr, CR_SO));
819844 break ;
845+ case overflow32:
846+ isel (rt, ra, rb, encode_crbit (cr, CR_OV32));
847+ break ;
848+ case nooverflow32:
849+ isel (rt, rb, ra, encode_crbit (cr, CR_OV32));
850+ break ;
820851 default :
821852 UNIMPLEMENTED ();
822853 }
@@ -1405,6 +1436,7 @@ class Assembler : public AssemblerBase {
14051436
14061437 // Scratch registers available for use by the Assembler.
14071438 RegList scratch_register_list_;
1439+ DoubleRegList scratch_double_register_list_;
14081440
14091441 // The bound position, before this we cannot do instruction elimination.
14101442 int last_bound_pos_;
@@ -1549,27 +1581,65 @@ class V8_EXPORT_PRIVATE V8_NODISCARD UseScratchRegisterScope {
15491581 public:
15501582 explicit UseScratchRegisterScope (Assembler* assembler)
15511583 : assembler_(assembler),
1552- old_available_(*assembler->GetScratchRegisterList ()) {}
1584+ old_available_(*assembler->GetScratchRegisterList ()),
1585+ old_available_double_(*assembler->GetScratchDoubleRegisterList ()) {}
15531586
15541587 ~UseScratchRegisterScope () {
15551588 *assembler_->GetScratchRegisterList () = old_available_;
1589+ *assembler_->GetScratchDoubleRegisterList () = old_available_double_;
15561590 }
15571591
15581592 Register Acquire () {
15591593 return assembler_->GetScratchRegisterList ()->PopFirst ();
15601594 }
15611595
1596+ DoubleRegister AcquireDouble () {
1597+ return assembler_->GetScratchDoubleRegisterList ()->PopFirst ();
1598+ }
1599+
15621600 // Check if we have registers available to acquire.
15631601 bool CanAcquire () const {
15641602 return !assembler_->GetScratchRegisterList ()->is_empty ();
15651603 }
15661604
1605+ void Include (const Register& reg1, const Register& reg2 = no_reg) {
1606+ RegList* available = assembler_->GetScratchRegisterList ();
1607+ DCHECK_NOT_NULL (available);
1608+ DCHECK (!available->has (reg1));
1609+ DCHECK (!available->has (reg2));
1610+ available->set (reg1);
1611+ available->set (reg2);
1612+ }
1613+ void Include (RegList list) {
1614+ RegList* available = assembler_->GetScratchRegisterList ();
1615+ DCHECK_NOT_NULL (available);
1616+ *available = *available | list;
1617+ }
1618+ void Include (DoubleRegList list) {
1619+ DoubleRegList* available = assembler_->GetScratchDoubleRegisterList ();
1620+ DCHECK_NOT_NULL (available);
1621+ DCHECK_EQ ((*available & list).bits (), 0x0 );
1622+ *available = *available | list;
1623+ }
1624+
1625+ DoubleRegList AvailableDoubleRegList () {
1626+ return *assembler_->GetScratchDoubleRegisterList ();
1627+ }
1628+ void SetAvailableDoubleRegList (DoubleRegList available) {
1629+ *assembler_->GetScratchDoubleRegisterList () = available;
1630+ }
1631+ RegList Available () { return *assembler_->GetScratchRegisterList (); }
1632+ void SetAvailable (RegList available) {
1633+ *assembler_->GetScratchRegisterList () = available;
1634+ }
1635+
15671636 private:
15681637 friend class Assembler ;
15691638 friend class MacroAssembler ;
15701639
15711640 Assembler* assembler_;
15721641 RegList old_available_;
1642+ DoubleRegList old_available_double_;
15731643};
15741644
15751645} // namespace internal
0 commit comments