1 /* |
1 /* |
2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. |
2 * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * |
4 * |
5 * This code is free software; you can redistribute it and/or modify it |
5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as |
6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. |
7 * published by the Free Software Foundation. |
331 virtual int Opcode() const; |
331 virtual int Opcode() const; |
332 virtual uint ideal_reg() const { return Op_RegL; } |
332 virtual uint ideal_reg() const { return Op_RegL; } |
333 virtual int store_Opcode() const { return Op_StoreL; } |
333 virtual int store_Opcode() const { return Op_StoreL; } |
334 virtual BasicType memory_type() const { return T_LONG; } |
334 virtual BasicType memory_type() const { return T_LONG; } |
335 bool require_atomic_access() const { return _require_atomic_access; } |
335 bool require_atomic_access() const { return _require_atomic_access; } |
336 static LoadLNode* make_atomic(Compile *C, Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type, |
336 static LoadLNode* make_atomic(Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type, |
337 const Type* rt, MemOrd mo); |
337 const Type* rt, MemOrd mo); |
338 #ifndef PRODUCT |
338 #ifndef PRODUCT |
339 virtual void dump_spec(outputStream *st) const { |
339 virtual void dump_spec(outputStream *st) const { |
340 LoadNode::dump_spec(st); |
340 LoadNode::dump_spec(st); |
341 if (_require_atomic_access) st->print(" Atomic!"); |
341 if (_require_atomic_access) st->print(" Atomic!"); |
382 virtual int Opcode() const; |
382 virtual int Opcode() const; |
383 virtual uint ideal_reg() const { return Op_RegD; } |
383 virtual uint ideal_reg() const { return Op_RegD; } |
384 virtual int store_Opcode() const { return Op_StoreD; } |
384 virtual int store_Opcode() const { return Op_StoreD; } |
385 virtual BasicType memory_type() const { return T_DOUBLE; } |
385 virtual BasicType memory_type() const { return T_DOUBLE; } |
386 bool require_atomic_access() const { return _require_atomic_access; } |
386 bool require_atomic_access() const { return _require_atomic_access; } |
387 static LoadDNode* make_atomic(Compile *C, Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type, |
387 static LoadDNode* make_atomic(Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type, |
388 const Type* rt, MemOrd mo); |
388 const Type* rt, MemOrd mo); |
389 #ifndef PRODUCT |
389 #ifndef PRODUCT |
390 virtual void dump_spec(outputStream *st) const { |
390 virtual void dump_spec(outputStream *st) const { |
391 LoadNode::dump_spec(st); |
391 LoadNode::dump_spec(st); |
392 if (_require_atomic_access) st->print(" Atomic!"); |
392 if (_require_atomic_access) st->print(" Atomic!"); |
591 StoreLNode(Node *c, Node *mem, Node *adr, const TypePtr* at, Node *val, MemOrd mo, bool require_atomic_access = false) |
591 StoreLNode(Node *c, Node *mem, Node *adr, const TypePtr* at, Node *val, MemOrd mo, bool require_atomic_access = false) |
592 : StoreNode(c, mem, adr, at, val, mo), _require_atomic_access(require_atomic_access) {} |
592 : StoreNode(c, mem, adr, at, val, mo), _require_atomic_access(require_atomic_access) {} |
593 virtual int Opcode() const; |
593 virtual int Opcode() const; |
594 virtual BasicType memory_type() const { return T_LONG; } |
594 virtual BasicType memory_type() const { return T_LONG; } |
595 bool require_atomic_access() const { return _require_atomic_access; } |
595 bool require_atomic_access() const { return _require_atomic_access; } |
596 static StoreLNode* make_atomic(Compile *C, Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type, Node* val, MemOrd mo); |
596 static StoreLNode* make_atomic(Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type, Node* val, MemOrd mo); |
597 #ifndef PRODUCT |
597 #ifndef PRODUCT |
598 virtual void dump_spec(outputStream *st) const { |
598 virtual void dump_spec(outputStream *st) const { |
599 StoreNode::dump_spec(st); |
599 StoreNode::dump_spec(st); |
600 if (_require_atomic_access) st->print(" Atomic!"); |
600 if (_require_atomic_access) st->print(" Atomic!"); |
601 } |
601 } |
627 MemOrd mo, bool require_atomic_access = false) |
627 MemOrd mo, bool require_atomic_access = false) |
628 : StoreNode(c, mem, adr, at, val, mo), _require_atomic_access(require_atomic_access) {} |
628 : StoreNode(c, mem, adr, at, val, mo), _require_atomic_access(require_atomic_access) {} |
629 virtual int Opcode() const; |
629 virtual int Opcode() const; |
630 virtual BasicType memory_type() const { return T_DOUBLE; } |
630 virtual BasicType memory_type() const { return T_DOUBLE; } |
631 bool require_atomic_access() const { return _require_atomic_access; } |
631 bool require_atomic_access() const { return _require_atomic_access; } |
632 static StoreDNode* make_atomic(Compile *C, Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type, Node* val, MemOrd mo); |
632 static StoreDNode* make_atomic(Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type, Node* val, MemOrd mo); |
633 #ifndef PRODUCT |
633 #ifndef PRODUCT |
634 virtual void dump_spec(outputStream *st) const { |
634 virtual void dump_spec(outputStream *st) const { |
635 StoreNode::dump_spec(st); |
635 StoreNode::dump_spec(st); |
636 if (_require_atomic_access) st->print(" Atomic!"); |
636 if (_require_atomic_access) st->print(" Atomic!"); |
637 } |
637 } |
1136 |
1136 |
1137 public: |
1137 public: |
1138 // If the input is a whole memory state, clone it with all its slices intact. |
1138 // If the input is a whole memory state, clone it with all its slices intact. |
1139 // Otherwise, make a new memory state with just that base memory input. |
1139 // Otherwise, make a new memory state with just that base memory input. |
1140 // In either case, the result is a newly created MergeMem. |
1140 // In either case, the result is a newly created MergeMem. |
1141 static MergeMemNode* make(Compile* C, Node* base_memory); |
1141 static MergeMemNode* make(Node* base_memory); |
1142 |
1142 |
1143 virtual int Opcode() const; |
1143 virtual int Opcode() const; |
1144 virtual Node *Identity( PhaseTransform *phase ); |
1144 virtual Node *Identity( PhaseTransform *phase ); |
1145 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); |
1145 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); |
1146 virtual uint ideal_reg() const { return NotAMachineReg; } |
1146 virtual uint ideal_reg() const { return NotAMachineReg; } |