Skip to content

Commit ffd2b2a

Browse files
committed
Unroll repne_scan loop for better performance.
1 parent 84c7aac commit ffd2b2a

File tree

1 file changed

+16
-15
lines changed

1 file changed

+16
-15
lines changed

src/hotspot/cpu/ppc/macroAssembler_ppc.cpp

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2265,27 +2265,28 @@ void MacroAssembler::check_klass_subtype(Register sub_klass,
22652265
// generic (count must be >0)
22662266
// iff found: CR0 eq, scratch == 0
22672267
void MacroAssembler::repne_scan(Register addr, Register value, Register count, Register scratch) {
2268-
Label Lloop, Lexit;
2268+
Label Lloop, Lafter_loop, Lexit;
22692269

2270-
#ifdef ASSERT
2271-
{
2272-
Label ok;
2273-
cmpdi(CR0, count, 0);
2274-
bgt(CR0, ok);
2275-
stop("count must be positive");
2276-
bind(ok);
2277-
}
2278-
#endif
2279-
2280-
mtctr(count);
2270+
srdi_(scratch, count, 1);
2271+
beq(CR0, Lafter_loop);
2272+
mtctr(scratch);
22812273

2282-
bind(Lloop);
2283-
ld(scratch, 0 , addr);
2274+
bind(Lloop); // 2x unrolled
2275+
ld(scratch, 0, addr);
22842276
xor_(scratch, scratch, value);
22852277
beq(CR0, Lexit);
2286-
addi(addr, addr, wordSize);
2278+
ld(scratch, 8, addr);
2279+
xor_(scratch, scratch, value);
2280+
beq(CR0, Lexit);
2281+
addi(addr, addr, 2 * wordSize);
22872282
bdnz(Lloop);
22882283

2284+
bind(Lafter_loop);
2285+
andi_(scratch, count, 1);
2286+
beq(CR0, Lexit); // if taken: CR0 eq and scratch == 0
2287+
ld(scratch, 0, addr);
2288+
xor_(scratch, scratch, value);
2289+
22892290
bind(Lexit);
22902291
}
22912292

0 commit comments

Comments
 (0)