equal
deleted
inserted
replaced
2095 |
2095 |
2096 // number of stack slots per value argument (1 or 2) |
2096 // number of stack slots per value argument (1 or 2) |
2097 int type_words = type2size[type]; |
2097 int type_words = type2size[type]; |
2098 |
2098 |
2099 // Cannot inline wide CAS on machines that don't support it natively |
2099 // Cannot inline wide CAS on machines that don't support it natively |
2100 if (type2aelembytes[type] > BytesPerInt && !VM_Version::supports_cx8()) |
2100 if (type2aelembytes(type) > BytesPerInt && !VM_Version::supports_cx8()) |
2101 return false; |
2101 return false; |
2102 |
2102 |
2103 C->set_has_unsafe_access(true); // Mark eventual nmethod as "unsafe". |
2103 C->set_has_unsafe_access(true); // Mark eventual nmethod as "unsafe". |
2104 |
2104 |
2105 // Argument words: "this" plus oop plus offset plus oldvalue plus newvalue; |
2105 // Argument words: "this" plus oop plus offset plus oldvalue plus newvalue; |
3973 if (src_offset_inttype != NULL && src_offset_inttype->is_con() && |
3973 if (src_offset_inttype != NULL && src_offset_inttype->is_con() && |
3974 dest_offset_inttype != NULL && dest_offset_inttype->is_con()) { |
3974 dest_offset_inttype != NULL && dest_offset_inttype->is_con()) { |
3975 // both indices are constants |
3975 // both indices are constants |
3976 int s_offs = src_offset_inttype->get_con(); |
3976 int s_offs = src_offset_inttype->get_con(); |
3977 int d_offs = dest_offset_inttype->get_con(); |
3977 int d_offs = dest_offset_inttype->get_con(); |
3978 int element_size = type2aelembytes[t]; |
3978 int element_size = type2aelembytes(t); |
3979 aligned = ((arrayOopDesc::base_offset_in_bytes(t) + s_offs * element_size) % HeapWordSize == 0) && |
3979 aligned = ((arrayOopDesc::base_offset_in_bytes(t) + s_offs * element_size) % HeapWordSize == 0) && |
3980 ((arrayOopDesc::base_offset_in_bytes(t) + d_offs * element_size) % HeapWordSize == 0); |
3980 ((arrayOopDesc::base_offset_in_bytes(t) + d_offs * element_size) % HeapWordSize == 0); |
3981 if (s_offs >= d_offs) disjoint = true; |
3981 if (s_offs >= d_offs) disjoint = true; |
3982 } else if (src_offset == dest_offset && src_offset != NULL) { |
3982 } else if (src_offset == dest_offset && src_offset != NULL) { |
3983 // This can occur if the offsets are identical non-constants. |
3983 // This can occur if the offsets are identical non-constants. |
4387 |
4387 |
4388 // Let's see if we need card marks: |
4388 // Let's see if we need card marks: |
4389 if (alloc != NULL && use_ReduceInitialCardMarks()) { |
4389 if (alloc != NULL && use_ReduceInitialCardMarks()) { |
4390 // If we do not need card marks, copy using the jint or jlong stub. |
4390 // If we do not need card marks, copy using the jint or jlong stub. |
4391 copy_type = LP64_ONLY(T_LONG) NOT_LP64(T_INT); |
4391 copy_type = LP64_ONLY(T_LONG) NOT_LP64(T_INT); |
4392 assert(type2aelembytes[basic_elem_type] == type2aelembytes[copy_type], |
4392 assert(type2aelembytes(basic_elem_type) == type2aelembytes(copy_type), |
4393 "sizes agree"); |
4393 "sizes agree"); |
4394 } |
4394 } |
4395 } |
4395 } |
4396 |
4396 |
4397 if (!stopped()) { |
4397 if (!stopped()) { |
4657 |
4657 |
4658 // operate on this memory slice: |
4658 // operate on this memory slice: |
4659 Node* mem = memory(adr_type); // memory slice to operate on |
4659 Node* mem = memory(adr_type); // memory slice to operate on |
4660 |
4660 |
4661 // scaling and rounding of indexes: |
4661 // scaling and rounding of indexes: |
4662 int scale = exact_log2(type2aelembytes[basic_elem_type]); |
4662 int scale = exact_log2(type2aelembytes(basic_elem_type)); |
4663 int abase = arrayOopDesc::base_offset_in_bytes(basic_elem_type); |
4663 int abase = arrayOopDesc::base_offset_in_bytes(basic_elem_type); |
4664 int clear_low = (-1 << scale) & (BytesPerInt - 1); |
4664 int clear_low = (-1 << scale) & (BytesPerInt - 1); |
4665 int bump_bit = (-1 << scale) & BytesPerInt; |
4665 int bump_bit = (-1 << scale) & BytesPerInt; |
4666 |
4666 |
4667 // determine constant starts and ends |
4667 // determine constant starts and ends |
4751 AllocateNode* alloc, |
4751 AllocateNode* alloc, |
4752 Node* src, Node* src_offset, |
4752 Node* src, Node* src_offset, |
4753 Node* dest, Node* dest_offset, |
4753 Node* dest, Node* dest_offset, |
4754 Node* dest_size) { |
4754 Node* dest_size) { |
4755 // See if there is an advantage from block transfer. |
4755 // See if there is an advantage from block transfer. |
4756 int scale = exact_log2(type2aelembytes[basic_elem_type]); |
4756 int scale = exact_log2(type2aelembytes(basic_elem_type)); |
4757 if (scale >= LogBytesPerLong) |
4757 if (scale >= LogBytesPerLong) |
4758 return false; // it is already a block transfer |
4758 return false; // it is already a block transfer |
4759 |
4759 |
4760 // Look at the alignment of the starting offsets. |
4760 // Look at the alignment of the starting offsets. |
4761 int abase = arrayOopDesc::base_offset_in_bytes(basic_elem_type); |
4761 int abase = arrayOopDesc::base_offset_in_bytes(basic_elem_type); |