src/cpu/x86/vm/macroAssembler_x86.cpp

changeset 8548
f958bebdee26
parent 8494
445941ba41c0
child 8551
d71d6679e879
     1.1 --- a/src/cpu/x86/vm/macroAssembler_x86.cpp	Sun Apr 10 23:17:09 2016 -0700
     1.2 +++ b/src/cpu/x86/vm/macroAssembler_x86.cpp	Tue May 24 17:49:06 2016 +0530
     1.3 @@ -3202,7 +3202,24 @@
     1.4      jmp(done);
     1.5    } else {
     1.6      // Stack: X Y
     1.7 -    Label x_negative, y_odd;
     1.8 +    Label x_negative, y_not_2;
     1.9 +
    1.10 +    static double two = 2.0;
    1.11 +    ExternalAddress two_addr((address)&two);
    1.12 +
    1.13 +    // constant maybe too far on 64 bit
    1.14 +    lea(tmp2, two_addr);
    1.15 +    fld_d(Address(tmp2, 0));    // Stack: 2 X Y
    1.16 +    fcmp(tmp, 2, true, false);  // Stack: X Y
    1.17 +    jcc(Assembler::parity, y_not_2);
    1.18 +    jcc(Assembler::notEqual, y_not_2);
    1.19 +
    1.20 +    fxch(); fpop();             // Stack: X
    1.21 +    fmul(0);                    // Stack: X*X
    1.22 +
    1.23 +    jmp(done);
    1.24 +
    1.25 +    bind(y_not_2);
    1.26  
    1.27      fldz();                     // Stack: 0 X Y
    1.28      fcmp(tmp, 1, true, false);  // Stack: X Y

mercurial