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: