Mercurial > hg > graal-jvmci-8
comparison src/cpu/sparc/vm/assembler_sparc.cpp @ 986:62001a362ce9
6827605: new String intrinsics may prevent EA scalar replacement
6875866: Intrinsic for String.indexOf() is broken on x86 with SSE4.2
Summary: Modify String intrinsic methods to pass char[] pointers instead of string oops.
Reviewed-by: never
author | kvn |
---|---|
date | Mon, 14 Sep 2009 12:14:20 -0700 |
parents | df6caf649ff7 |
children | dcf03e02b020 |
comparison
equal
deleted
inserted
replaced
985:685e959d09ea | 986:62001a362ce9 |
---|---|
4674 // call indirectly to solve generation ordering problem | 4674 // call indirectly to solve generation ordering problem |
4675 AddressLiteral base(Universe::narrow_oop_base_addr()); | 4675 AddressLiteral base(Universe::narrow_oop_base_addr()); |
4676 load_ptr_contents(base, G6_heapbase); | 4676 load_ptr_contents(base, G6_heapbase); |
4677 } | 4677 } |
4678 } | 4678 } |
4679 | |
4680 // Compare char[] arrays aligned to 4 bytes. | |
4681 void MacroAssembler::char_arrays_equals(Register ary1, Register ary2, | |
4682 Register limit, Register result, | |
4683 Register chr1, Register chr2, Label& Ldone) { | |
4684 Label Lvector, Lloop; | |
4685 assert(chr1 == result, "should be the same"); | |
4686 | |
4687 // Note: limit contains number of bytes (2*char_elements) != 0. | |
4688 andcc(limit, 0x2, chr1); // trailing character ? | |
4689 br(Assembler::zero, false, Assembler::pt, Lvector); | |
4690 delayed()->nop(); | |
4691 | |
4692 // compare the trailing char | |
4693 sub(limit, sizeof(jchar), limit); | |
4694 lduh(ary1, limit, chr1); | |
4695 lduh(ary2, limit, chr2); | |
4696 cmp(chr1, chr2); | |
4697 br(Assembler::notEqual, true, Assembler::pt, Ldone); | |
4698 delayed()->mov(G0, result); // not equal | |
4699 | |
4700 // only one char ? | |
4701 br_on_reg_cond(rc_z, true, Assembler::pn, limit, Ldone); | |
4702 delayed()->add(G0, 1, result); // zero-length arrays are equal | |
4703 | |
4704 // word by word compare, dont't need alignment check | |
4705 bind(Lvector); | |
4706 // Shift ary1 and ary2 to the end of the arrays, negate limit | |
4707 add(ary1, limit, ary1); | |
4708 add(ary2, limit, ary2); | |
4709 neg(limit, limit); | |
4710 | |
4711 lduw(ary1, limit, chr1); | |
4712 bind(Lloop); | |
4713 lduw(ary2, limit, chr2); | |
4714 cmp(chr1, chr2); | |
4715 br(Assembler::notEqual, true, Assembler::pt, Ldone); | |
4716 delayed()->mov(G0, result); // not equal | |
4717 inccc(limit, 2*sizeof(jchar)); | |
4718 // annul LDUW if branch is not taken to prevent access past end of array | |
4719 br(Assembler::notZero, true, Assembler::pt, Lloop); | |
4720 delayed()->lduw(ary1, limit, chr1); // hoisted | |
4721 | |
4722 // Caller should set it: | |
4723 // add(G0, 1, result); // equals | |
4724 } | |
4725 |