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 jvmti_exception_throw_id: 1469 { // rax,: exception oop 1470 StubFrame f(sasm, "jvmti_exception_throw", dont_gc_arguments); 1471 // Preserve all registers across this potentially blocking call 1472 const int num_rt_args = 2; // thread, exception oop 1473 OopMap* map = save_live_registers(sasm, num_rt_args); 1474 int call_offset = __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, Runtime1::post_jvmti_exception_throw), rax); 1475 oop_maps = new OopMapSet(); 1476 oop_maps->add_gc_map(call_offset, map); 1477 restore_live_registers(sasm); 1478 } 1479 break; 1480 1481 case dtrace_object_alloc_id: 1482 { // rax,: object 1483 StubFrame f(sasm, "dtrace_object_alloc", dont_gc_arguments); 1484 // we can't gc here so skip the oopmap but make sure that all 1485 // the live registers get saved. 1486 save_live_registers(sasm, 1); 1487 1488 __ NOT_LP64(push(rax)) LP64_ONLY(mov(c_rarg0, rax)); 1489 __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_object_alloc))); 1490 NOT_LP64(__ pop(rax)); 1491 1492 restore_live_registers(sasm); 1493 } 1494 break; 1495 1496 case fpu2long_stub_id: 1497 { 1498 // rax, and rdx are destroyed, but should be free since the result is returned there 1499 // preserve rsi,ecx 1500 __ push(rsi); | 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); 1471 // we can't gc here so skip the oopmap but make sure that all 1472 // the live registers get saved. 1473 save_live_registers(sasm, 1); 1474 1475 __ NOT_LP64(push(rax)) LP64_ONLY(mov(c_rarg0, rax)); 1476 __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_object_alloc))); 1477 NOT_LP64(__ pop(rax)); 1478 1479 restore_live_registers(sasm); 1480 } 1481 break; 1482 1483 case fpu2long_stub_id: 1484 { 1485 // rax, and rdx are destroyed, but should be free since the result is returned there 1486 // preserve rsi,ecx 1487 __ push(rsi); |