230 virtual Node* Identity(PhaseGVN* phase) { return this; }
231 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape) { return nullptr; }
232 virtual const Type* Value(PhaseGVN* phase) const { return bottom_type(); }
233 virtual uint hash() const { return Node::hash(); }
234 virtual bool is_CFG() const { return false; }
235 virtual uint ideal_reg() const { return NotAMachineReg; }
236
237 static DivModNode* make(Node* div_or_mod, BasicType bt, bool is_unsigned);
238
239 ProjNode* div_proj() { return proj_out_or_null(div_proj_num); }
240 ProjNode* mod_proj() { return proj_out_or_null(mod_proj_num); }
241 };
242
243 //------------------------------DivModINode---------------------------------------
244 // Integer division with remainder result.
245 class DivModINode : public DivModNode {
246 public:
247 DivModINode( Node *c, Node *dividend, Node *divisor ) : DivModNode(c, dividend, divisor) {}
248 virtual int Opcode() const;
249 virtual const Type *bottom_type() const { return TypeTuple::INT_PAIR; }
250 virtual Node *match( const ProjNode *proj, const Matcher *m );
251
252 // Make a divmod and associated projections from a div or mod.
253 static DivModINode* make(Node* div_or_mod);
254 };
255
256 //------------------------------DivModLNode---------------------------------------
257 // Long division with remainder result.
258 class DivModLNode : public DivModNode {
259 public:
260 DivModLNode( Node *c, Node *dividend, Node *divisor ) : DivModNode(c, dividend, divisor) {}
261 virtual int Opcode() const;
262 virtual const Type *bottom_type() const { return TypeTuple::LONG_PAIR; }
263 virtual Node *match( const ProjNode *proj, const Matcher *m );
264
265 // Make a divmod and associated projections from a div or mod.
266 static DivModLNode* make(Node* div_or_mod);
267 };
268
269
270 //------------------------------UDivModINode---------------------------------------
271 // Unsigend integer division with remainder result.
272 class UDivModINode : public DivModNode {
273 public:
274 UDivModINode( Node *c, Node *dividend, Node *divisor ) : DivModNode(c, dividend, divisor) {}
275 virtual int Opcode() const;
276 virtual const Type *bottom_type() const { return TypeTuple::INT_PAIR; }
277 virtual Node *match( const ProjNode *proj, const Matcher *m );
278
279 // Make a divmod and associated projections from a div or mod.
280 static UDivModINode* make(Node* div_or_mod);
281 };
282
283 //------------------------------UDivModLNode---------------------------------------
284 // Unsigned long division with remainder result.
285 class UDivModLNode : public DivModNode {
286 public:
287 UDivModLNode( Node *c, Node *dividend, Node *divisor ) : DivModNode(c, dividend, divisor) {}
288 virtual int Opcode() const;
289 virtual const Type *bottom_type() const { return TypeTuple::LONG_PAIR; }
290 virtual Node *match( const ProjNode *proj, const Matcher *m );
291
292 // Make a divmod and associated projections from a div or mod.
293 static UDivModLNode* make(Node* div_or_mod);
294 };
295
296 #endif // SHARE_OPTO_DIVNODE_HPP
|
230 virtual Node* Identity(PhaseGVN* phase) { return this; }
231 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape) { return nullptr; }
232 virtual const Type* Value(PhaseGVN* phase) const { return bottom_type(); }
233 virtual uint hash() const { return Node::hash(); }
234 virtual bool is_CFG() const { return false; }
235 virtual uint ideal_reg() const { return NotAMachineReg; }
236
237 static DivModNode* make(Node* div_or_mod, BasicType bt, bool is_unsigned);
238
239 ProjNode* div_proj() { return proj_out_or_null(div_proj_num); }
240 ProjNode* mod_proj() { return proj_out_or_null(mod_proj_num); }
241 };
242
243 //------------------------------DivModINode---------------------------------------
244 // Integer division with remainder result.
245 class DivModINode : public DivModNode {
246 public:
247 DivModINode( Node *c, Node *dividend, Node *divisor ) : DivModNode(c, dividend, divisor) {}
248 virtual int Opcode() const;
249 virtual const Type *bottom_type() const { return TypeTuple::INT_PAIR; }
250 virtual Node *match(const ProjNode *proj, const Matcher *m, const RegMask* mask);
251
252 // Make a divmod and associated projections from a div or mod.
253 static DivModINode* make(Node* div_or_mod);
254 };
255
256 //------------------------------DivModLNode---------------------------------------
257 // Long division with remainder result.
258 class DivModLNode : public DivModNode {
259 public:
260 DivModLNode( Node *c, Node *dividend, Node *divisor ) : DivModNode(c, dividend, divisor) {}
261 virtual int Opcode() const;
262 virtual const Type *bottom_type() const { return TypeTuple::LONG_PAIR; }
263 virtual Node *match(const ProjNode *proj, const Matcher *m, const RegMask* mask);
264
265 // Make a divmod and associated projections from a div or mod.
266 static DivModLNode* make(Node* div_or_mod);
267 };
268
269
270 //------------------------------UDivModINode---------------------------------------
271 // Unsigend integer division with remainder result.
272 class UDivModINode : public DivModNode {
273 public:
274 UDivModINode( Node *c, Node *dividend, Node *divisor ) : DivModNode(c, dividend, divisor) {}
275 virtual int Opcode() const;
276 virtual const Type *bottom_type() const { return TypeTuple::INT_PAIR; }
277 virtual Node* match(const ProjNode* proj, const Matcher* m, const RegMask* mask);
278
279 // Make a divmod and associated projections from a div or mod.
280 static UDivModINode* make(Node* div_or_mod);
281 };
282
283 //------------------------------UDivModLNode---------------------------------------
284 // Unsigned long division with remainder result.
285 class UDivModLNode : public DivModNode {
286 public:
287 UDivModLNode( Node *c, Node *dividend, Node *divisor ) : DivModNode(c, dividend, divisor) {}
288 virtual int Opcode() const;
289 virtual const Type *bottom_type() const { return TypeTuple::LONG_PAIR; }
290 virtual Node* match(const ProjNode* proj, const Matcher* m, const RegMask* mask);
291
292 // Make a divmod and associated projections from a div or mod.
293 static UDivModLNode* make(Node* div_or_mod);
294 };
295
296 #endif // SHARE_OPTO_DIVNODE_HPP
|