#8761 Backport of #8672 string_equals optimization

Wed, 03 Apr 2019 11:55:18 +0800

author
zhaixiang
date
Wed, 03 Apr 2019 11:55:18 +0800
changeset 9469
dddd4357da2c
parent 9468
a5cbd2fef2b1
child 9470
c23dcd3f87f4

#8761 Backport of #8672 string_equals optimization
Reviewed-by: aoqi

src/cpu/mips/vm/mips_64.ad file | annotate | diff | comparison | revisions
     1.1 --- a/src/cpu/mips/vm/mips_64.ad	Tue Apr 02 16:06:52 2019 +0800
     1.2 +++ b/src/cpu/mips/vm/mips_64.ad	Wed Apr 03 11:55:18 2019 +0800
     1.3 @@ -10891,27 +10891,32 @@
     1.4      Register tmp    = $temp$$Register;
     1.5      Register result = $result$$Register;
     1.6  
     1.7 -    Label    Loop, done;
     1.8 -
     1.9 -
    1.10 -   __ beq(str1, str2, done);  // same char[] ?
    1.11 -   __ delayed()->daddiu(result, R0, 1);
    1.12 -
    1.13 -   __ bind(Loop);             // Loop begin
    1.14 -   __ beq(cnt, R0, done);
    1.15 -   __ delayed()->daddiu(result, R0, 1); // count == 0
    1.16 -
    1.17 -   // compare current character
    1.18 -   __ lhu(AT, str1, 0);;
    1.19 -   __ lhu(tmp, str2, 0);
    1.20 -   __ bne(AT, tmp, done);
    1.21 -   __ delayed()->daddi(result, R0, 0);
    1.22 -   __ addi(str1, str1, 2);
    1.23 -   __ addi(str2, str2, 2);
    1.24 -   __ b(Loop);
    1.25 -   __ delayed()->addi(cnt, cnt, -1);  // Loop end
    1.26 -
    1.27 -   __ bind(done);
    1.28 +    Label Loop, True, False;
    1.29 +
    1.30 +    __ beq(str1, str2, True);  // same char[] ?
    1.31 +    __ delayed()->daddiu(result, R0, 1);
    1.32 +
    1.33 +    __ beq(cnt, R0, True);
    1.34 +    __ delayed()->nop(); // count == 0
    1.35 +
    1.36 +    __ bind(Loop);
    1.37 +
    1.38 +    // compare current character
    1.39 +    __ lhu(AT, str1, 0);
    1.40 +    __ lhu(tmp, str2, 0);
    1.41 +    __ bne(AT, tmp, False);
    1.42 +    __ delayed()->addi(str1, str1, 2);
    1.43 +    __ addi(cnt, cnt, -1);
    1.44 +    __ bne(cnt, R0, Loop);
    1.45 +    __ delayed()->addi(str2, str2, 2);
    1.46 +
    1.47 +    __ b(True);
    1.48 +    __ delayed()->nop();
    1.49 +
    1.50 +    __ bind(False);
    1.51 +    __ daddi(result, R0, 0);
    1.52 +
    1.53 +    __ bind(True);
    1.54    %}
    1.55  
    1.56    ins_pipe( pipe_slow );

mercurial