@@ -115,16 +115,34 @@ XtensaTargetLowering::XtensaTargetLowering(const TargetMachine &TM,
115115 setCondCodeAction (ISD::SETUGT, MVT::i32 , Expand);
116116 setCondCodeAction (ISD::SETULE, MVT::i32 , Expand);
117117
118- setOperationAction (ISD::MUL, MVT::i32 , Expand);
119- setOperationAction (ISD::MULHU, MVT::i32 , Expand);
120- setOperationAction (ISD::MULHS, MVT::i32 , Expand);
118+ if (Subtarget.hasMul32 ())
119+ setOperationAction (ISD::MUL, MVT::i32 , Legal);
120+ else
121+ setOperationAction (ISD::MUL, MVT::i32 , Expand);
122+
123+ if (Subtarget.hasMul32High ()) {
124+ setOperationAction (ISD::MULHU, MVT::i32 , Legal);
125+ setOperationAction (ISD::MULHS, MVT::i32 , Legal);
126+ } else {
127+ setOperationAction (ISD::MULHU, MVT::i32 , Expand);
128+ setOperationAction (ISD::MULHS, MVT::i32 , Expand);
129+ }
130+
121131 setOperationAction (ISD::SMUL_LOHI, MVT::i32 , Expand);
122132 setOperationAction (ISD::UMUL_LOHI, MVT::i32 , Expand);
123133
124- setOperationAction (ISD::SDIV, MVT::i32 , Expand);
125- setOperationAction (ISD::UDIV, MVT::i32 , Expand);
126- setOperationAction (ISD::SREM, MVT::i32 , Expand);
127- setOperationAction (ISD::UREM, MVT::i32 , Expand);
134+ if (Subtarget.hasDiv32 ()) {
135+ setOperationAction (ISD::SDIV, MVT::i32 , Legal);
136+ setOperationAction (ISD::UDIV, MVT::i32 , Legal);
137+ setOperationAction (ISD::SREM, MVT::i32 , Legal);
138+ setOperationAction (ISD::UREM, MVT::i32 , Legal);
139+ } else {
140+ setOperationAction (ISD::SDIV, MVT::i32 , Expand);
141+ setOperationAction (ISD::UDIV, MVT::i32 , Expand);
142+ setOperationAction (ISD::SREM, MVT::i32 , Expand);
143+ setOperationAction (ISD::UREM, MVT::i32 , Expand);
144+ }
145+
128146 setOperationAction (ISD::SDIVREM, MVT::i32 , Expand);
129147 setOperationAction (ISD::UDIVREM, MVT::i32 , Expand);
130148
0 commit comments