1430 case monitorexit_nofpu_id: 1431 save_fpu_registers = false; 1432 // fall through 1433 case monitorexit_id: 1434 { 1435 StubFrame f(sasm, "monitorexit", dont_gc_arguments); 1436 OopMap* map = save_live_registers(sasm, 2, save_fpu_registers); 1437 1438 // Called with store_parameter and not C abi 1439 1440 f.load_argument(0, rax); // rax,: lock address 1441 1442 // note: really a leaf routine but must setup last java sp 1443 // => use call_RT for now (speed can be improved by 1444 // doing last java sp setup manually) 1445 int call_offset = __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, monitorexit), rax); 1446 1447 oop_maps = new OopMapSet(); 1448 oop_maps->add_gc_map(call_offset, map); 1449 restore_live_registers(sasm, save_fpu_registers); 1450 1451 } 1452 break; 1453 1454 case access_field_patching_id: 1455 { StubFrame f(sasm, "access_field_patching", dont_gc_arguments); 1456 // we should set up register map 1457 oop_maps = generate_patching(sasm, CAST_FROM_FN_PTR(address, access_field_patching)); 1458 } 1459 break; 1460 1461 case load_klass_patching_id: 1462 { StubFrame f(sasm, "load_klass_patching", dont_gc_arguments); 1463 // we should set up register map 1464 oop_maps = generate_patching(sasm, CAST_FROM_FN_PTR(address, move_klass_patching)); 1465 } 1466 break; 1467 1468 case dtrace_object_alloc_id: 1469 { // rax,: object 1470 StubFrame f(sasm, "dtrace_object_alloc", dont_gc_arguments); | 1430 case monitorexit_nofpu_id: 1431 save_fpu_registers = false; 1432 // fall through 1433 case monitorexit_id: 1434 { 1435 StubFrame f(sasm, "monitorexit", dont_gc_arguments); 1436 OopMap* map = save_live_registers(sasm, 2, save_fpu_registers); 1437 1438 // Called with store_parameter and not C abi 1439 1440 f.load_argument(0, rax); // rax,: lock address 1441 1442 // note: really a leaf routine but must setup last java sp 1443 // => use call_RT for now (speed can be improved by 1444 // doing last java sp setup manually) 1445 int call_offset = __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, monitorexit), rax); 1446 1447 oop_maps = new OopMapSet(); 1448 oop_maps->add_gc_map(call_offset, map); 1449 restore_live_registers(sasm, save_fpu_registers); 1450 } 1451 break; 1452 1453 case deoptimize_id: 1454 { 1455 StubFrame f(sasm, "deoptimize", dont_gc_arguments); 1456 const int num_rt_args = 1; // thread 1457 OopMap* oop_map = save_live_registers(sasm, num_rt_args); 1458 int call_offset = __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, deoptimize)); 1459 oop_maps = new OopMapSet(); 1460 oop_maps->add_gc_map(call_offset, oop_map); 1461 restore_live_registers(sasm); 1462 DeoptimizationBlob* deopt_blob = SharedRuntime::deopt_blob(); 1463 assert(deopt_blob != NULL, "deoptimization blob must have been created"); 1464 __ leave(); 1465 __ jump(RuntimeAddress(deopt_blob->unpack_with_reexecution())); 1466 } 1467 break; 1468 1469 case access_field_patching_id: 1470 { StubFrame f(sasm, "access_field_patching", dont_gc_arguments); 1471 // we should set up register map 1472 oop_maps = generate_patching(sasm, CAST_FROM_FN_PTR(address, access_field_patching)); 1473 } 1474 break; 1475 1476 case load_klass_patching_id: 1477 { StubFrame f(sasm, "load_klass_patching", dont_gc_arguments); 1478 // we should set up register map 1479 oop_maps = generate_patching(sasm, CAST_FROM_FN_PTR(address, move_klass_patching)); 1480 } 1481 break; 1482 1483 case dtrace_object_alloc_id: 1484 { // rax,: object 1485 StubFrame f(sasm, "dtrace_object_alloc", dont_gc_arguments); |