238 };
239
240 //------------------------------DivModNode---------------------------------------
241 // Division with remainder result.
242 class DivModNode : public BinaryMultiNode {
243 protected:
244 DivModNode(Node* ctrl, Node* dividend, Node* divisor) : BinaryMultiNode(ctrl, dividend, divisor) {}
245 public:
246 virtual int Opcode() const;
247
248 static DivModNode* make(Node* div_or_mod, BasicType bt, bool is_unsigned);
249 };
250
251 //------------------------------DivModINode---------------------------------------
252 // Integer division with remainder result.
253 class DivModINode : public DivModNode {
254 public:
255 DivModINode(Node* ctrl, Node* dividend, Node* divisor) : DivModNode(ctrl, dividend, divisor) {}
256 virtual int Opcode() const;
257 virtual const Type *bottom_type() const { return TypeTuple::INT_PAIR; }
258 virtual Node *match( const ProjNode *proj, const Matcher *m );
259
260 // Make a divmod and associated projections from a div or mod.
261 static DivModINode* make(Node* div_or_mod);
262 };
263
264 //------------------------------DivModLNode---------------------------------------
265 // Long division with remainder result.
266 class DivModLNode : public DivModNode {
267 public:
268 DivModLNode(Node* ctrl, Node* dividend, Node* divisor) : DivModNode(ctrl, dividend, divisor) {}
269 virtual int Opcode() const;
270 virtual const Type *bottom_type() const { return TypeTuple::LONG_PAIR; }
271 virtual Node *match( const ProjNode *proj, const Matcher *m );
272
273 // Make a divmod and associated projections from a div or mod.
274 static DivModLNode* make(Node* div_or_mod);
275 };
276
277
278 //------------------------------UDivModINode---------------------------------------
279 // Unsigend integer division with remainder result.
280 class UDivModINode : public DivModNode {
281 public:
282 UDivModINode(Node* ctrl, Node* dividend, Node* divisor) : DivModNode(ctrl, dividend, divisor) {}
283 virtual int Opcode() const;
284 virtual const Type *bottom_type() const { return TypeTuple::INT_PAIR; }
285 virtual Node *match( const ProjNode *proj, const Matcher *m );
286
287 // Make a divmod and associated projections from a div or mod.
288 static UDivModINode* make(Node* div_or_mod);
289 };
290
291 //------------------------------UDivModLNode---------------------------------------
292 // Unsigned long division with remainder result.
293 class UDivModLNode : public DivModNode {
294 public:
295 UDivModLNode(Node* ctrl, Node* dividend, Node* divisor) : DivModNode(ctrl, dividend, divisor) {}
296 virtual int Opcode() const;
297 virtual const Type *bottom_type() const { return TypeTuple::LONG_PAIR; }
298 virtual Node *match( const ProjNode *proj, const Matcher *m );
299
300 // Make a divmod and associated projections from a div or mod.
301 static UDivModLNode* make(Node* div_or_mod);
302 };
303
304 #endif // SHARE_OPTO_DIVNODE_HPP
|
238 };
239
240 //------------------------------DivModNode---------------------------------------
241 // Division with remainder result.
242 class DivModNode : public BinaryMultiNode {
243 protected:
244 DivModNode(Node* ctrl, Node* dividend, Node* divisor) : BinaryMultiNode(ctrl, dividend, divisor) {}
245 public:
246 virtual int Opcode() const;
247
248 static DivModNode* make(Node* div_or_mod, BasicType bt, bool is_unsigned);
249 };
250
251 //------------------------------DivModINode---------------------------------------
252 // Integer division with remainder result.
253 class DivModINode : public DivModNode {
254 public:
255 DivModINode(Node* ctrl, Node* dividend, Node* divisor) : DivModNode(ctrl, dividend, divisor) {}
256 virtual int Opcode() const;
257 virtual const Type *bottom_type() const { return TypeTuple::INT_PAIR; }
258 virtual Node *match(const ProjNode *proj, const Matcher *m, const RegMask* mask);
259
260 // Make a divmod and associated projections from a div or mod.
261 static DivModINode* make(Node* div_or_mod);
262 };
263
264 //------------------------------DivModLNode---------------------------------------
265 // Long division with remainder result.
266 class DivModLNode : public DivModNode {
267 public:
268 DivModLNode(Node* ctrl, Node* dividend, Node* divisor) : DivModNode(ctrl, dividend, divisor) {}
269 virtual int Opcode() const;
270 virtual const Type *bottom_type() const { return TypeTuple::LONG_PAIR; }
271 virtual Node *match(const ProjNode *proj, const Matcher *m, const RegMask* mask);
272
273 // Make a divmod and associated projections from a div or mod.
274 static DivModLNode* make(Node* div_or_mod);
275 };
276
277
278 //------------------------------UDivModINode---------------------------------------
279 // Unsigend integer division with remainder result.
280 class UDivModINode : public DivModNode {
281 public:
282 UDivModINode(Node* ctrl, Node* dividend, Node* divisor) : DivModNode(ctrl, dividend, divisor) {}
283 virtual int Opcode() const;
284 virtual const Type *bottom_type() const { return TypeTuple::INT_PAIR; }
285 virtual Node* match(const ProjNode* proj, const Matcher* m, const RegMask* mask);
286
287 // Make a divmod and associated projections from a div or mod.
288 static UDivModINode* make(Node* div_or_mod);
289 };
290
291 //------------------------------UDivModLNode---------------------------------------
292 // Unsigned long division with remainder result.
293 class UDivModLNode : public DivModNode {
294 public:
295 UDivModLNode(Node* ctrl, Node* dividend, Node* divisor) : DivModNode(ctrl, dividend, divisor) {}
296 virtual int Opcode() const;
297 virtual const Type *bottom_type() const { return TypeTuple::LONG_PAIR; }
298 virtual Node* match(const ProjNode* proj, const Matcher* m, const RegMask* mask);
299
300 // Make a divmod and associated projections from a div or mod.
301 static UDivModLNode* make(Node* div_or_mod);
302 };
303
304 #endif // SHARE_OPTO_DIVNODE_HPP
|