src/cpu/x86/vm/c1_LinearScan_x86.cpp

changeset 1388
ff1a29907b6c
parent 435
a61af66fc99e
child 1907
c18cbe5936b8
     1.1 --- a/src/cpu/x86/vm/c1_LinearScan_x86.cpp	Mon Aug 31 08:31:45 2009 -0700
     1.2 +++ b/src/cpu/x86/vm/c1_LinearScan_x86.cpp	Mon Aug 31 17:07:53 2009 -0700
     1.3 @@ -764,8 +764,6 @@
     1.4        break;
     1.5      }
     1.6  
     1.7 -    case lir_log:
     1.8 -    case lir_log10:
     1.9      case lir_abs:
    1.10      case lir_sqrt: {
    1.11        // Right argument appears to be unused
    1.12 @@ -785,6 +783,30 @@
    1.13        break;
    1.14      }
    1.15  
    1.16 +    case lir_log:
    1.17 +    case lir_log10: {
    1.18 +      // log and log10 needs one temporary fpu stack slot, so there is ontemporary
    1.19 +      // registers stored in temp of the operation.
    1.20 +      // the stack allocator must guarantee that the stack slots are really free,
    1.21 +      // otherwise there might be a stack overflow.
    1.22 +      assert(right->is_illegal(), "must be");
    1.23 +      assert(left->is_fpu_register(), "must be");
    1.24 +      assert(res->is_fpu_register(), "must be");
    1.25 +      assert(op2->tmp_opr()->is_fpu_register(), "must be");
    1.26 +
    1.27 +      insert_free_if_dead(op2->tmp_opr());
    1.28 +      insert_free_if_dead(res, left);
    1.29 +      insert_exchange(left);
    1.30 +      do_rename(left, res);
    1.31 +
    1.32 +      new_left = to_fpu_stack_top(res);
    1.33 +      new_res = new_left;
    1.34 +
    1.35 +      op2->set_fpu_stack_size(sim()->stack_size());
    1.36 +      assert(sim()->stack_size() <= 7, "at least one stack slot must be free");
    1.37 +      break;
    1.38 +    }
    1.39 +
    1.40  
    1.41      case lir_tan:
    1.42      case lir_sin:

mercurial