static void pd_conjoint_jlongs_atomic(jlong* from, jlong* to, size_t count) { #ifdef AMD64 assert(BytesPerLong == BytesPerOop, "jlongs and oops must be the same size"); pd_conjoint_oops_atomic((oop*)from, (oop*)to, count); #else // Guarantee use of fild/fistp or xmm regs via some asm code, because compilers won't. __asm { mov eax, from; mov edx, to; mov ecx, count; cmp eax, edx; jbe downtest; jmp uptest; up: fild qword ptr [eax]; fistp qword ptr [edx]; add eax, 8; add edx, 8; uptest: sub ecx, 1; jge up; jmp done; down: fild qword ptr [eax][ecx*8]; fistp qword ptr [edx][ecx*8]; downtest: sub ecx, 1; jge down; done:; } #endif // AMD64 }
static void pd_conjoint_jlongs_atomic(jlong* from, jlong* to, size_t count) { #ifdef _LP64 assert(BytesPerLong == BytesPerOop, "jlongs and oops must be the same size"); pd_conjoint_oops_atomic((oop*)from, (oop*)to, count); #else // Guarantee use of ldd/std via some asm code, because compiler won't. // See solaris_sparc.il. _Copy_conjoint_jlongs_atomic(from, to, count); #endif }
static void pd_conjoint_jlongs_atomic(jlong* from, jlong* to, size_t count) { assert(BytesPerLong == BytesPerOop, "jlongs and oops must be the same size"); pd_conjoint_oops_atomic((oop*)from, (oop*)to, count); }
static void pd_arrayof_conjoint_oops(HeapWord* from, HeapWord* to, size_t count) { pd_conjoint_oops_atomic((oop*)from, (oop*)to, count); }