101 return SubHelper<OverflowSubINode>::will_overflow(v1, v2);
102 }
103
104 bool OverflowMulINode::will_overflow(jint v1, jint v2) const {
105 jlong result = (jlong) v1 * (jlong) v2;
106 if ((jint) result == result) {
107 return false;
108 }
109 return true;
110 }
111
112 bool OverflowAddLNode::will_overflow(jlong v1, jlong v2) const {
113 return AddHelper<OverflowAddLNode>::will_overflow(v1, v2);
114 }
115
116 bool OverflowSubLNode::will_overflow(jlong v1, jlong v2) const {
117 return SubHelper<OverflowSubLNode>::will_overflow(v1, v2);
118 }
119
120 bool OverflowMulLNode::will_overflow(jlong val1, jlong val2) const {
121 jlong result = val1 * val2;
122 jlong ax = (val1 < 0 ? -val1 : val1);
123 jlong ay = (val2 < 0 ? -val2 : val2);
124
125 bool overflow = false;
126 if ((ax | ay) & CONST64(0xFFFFFFFF00000000)) {
127 // potential overflow if any bit in upper 32 bits are set
128 if ((val1 == min_jlong && val2 == -1) || (val2 == min_jlong && val1 == -1)) {
129 // -1 * Long.MIN_VALUE will overflow
130 overflow = true;
131 } else if (val2 != 0 && (result / val2 != val1)) {
132 overflow = true;
133 }
134 }
135
136 return overflow;
137 }
138
139 bool OverflowAddINode::can_overflow(const Type* t1, const Type* t2) const {
140 return AddHelper<OverflowAddINode>::can_overflow(t1, t2);
141 }
|
101 return SubHelper<OverflowSubINode>::will_overflow(v1, v2);
102 }
103
104 bool OverflowMulINode::will_overflow(jint v1, jint v2) const {
105 jlong result = (jlong) v1 * (jlong) v2;
106 if ((jint) result == result) {
107 return false;
108 }
109 return true;
110 }
111
112 bool OverflowAddLNode::will_overflow(jlong v1, jlong v2) const {
113 return AddHelper<OverflowAddLNode>::will_overflow(v1, v2);
114 }
115
116 bool OverflowSubLNode::will_overflow(jlong v1, jlong v2) const {
117 return SubHelper<OverflowSubLNode>::will_overflow(v1, v2);
118 }
119
120 bool OverflowMulLNode::will_overflow(jlong val1, jlong val2) const {
121 julong v1 = (julong) val1;
122 julong v2 = (julong) val2;
123 julong tmp = v1 * v2;
124 jlong result = (jlong) tmp;
125 jlong ax = (val1 < 0 ? -val1 : val1);
126 jlong ay = (val2 < 0 ? -val2 : val2);
127
128 bool overflow = false;
129 if ((ax | ay) & CONST64(0xFFFFFFFF00000000)) {
130 // potential overflow if any bit in upper 32 bits are set
131 if ((val1 == min_jlong && val2 == -1) || (val2 == min_jlong && val1 == -1)) {
132 // -1 * Long.MIN_VALUE will overflow
133 overflow = true;
134 } else if (val2 != 0 && (result / val2 != val1)) {
135 overflow = true;
136 }
137 }
138
139 return overflow;
140 }
141
142 bool OverflowAddINode::can_overflow(const Type* t1, const Type* t2) const {
143 return AddHelper<OverflowAddINode>::can_overflow(t1, t2);
144 }
|