30 #include "utilities/formatBuffer.hpp"
31
32 bool ForeignGlobals::is_foreign_linker_supported() {
33 return true;
34 }
35
36 bool ABIDescriptor::is_volatile_reg(Register reg) const {
37 return _integer_argument_registers.contains(reg)
38 || _integer_additional_volatile_registers.contains(reg);
39 }
40
41 bool ABIDescriptor::is_volatile_reg(XMMRegister reg) const {
42 return _vector_argument_registers.contains(reg)
43 || _vector_additional_volatile_registers.contains(reg);
44 }
45
46 const ABIDescriptor ForeignGlobals::parse_abi_descriptor(jobject jabi) {
47 oop abi_oop = JNIHandles::resolve_non_null(jabi);
48 ABIDescriptor abi;
49
50 objArrayOop inputStorage = jdk_internal_foreign_abi_ABIDescriptor::inputStorage(abi_oop);
51 parse_register_array(inputStorage, StorageType::INTEGER, abi._integer_argument_registers, as_Register);
52 parse_register_array(inputStorage, StorageType::VECTOR, abi._vector_argument_registers, as_XMMRegister);
53
54 objArrayOop outputStorage = jdk_internal_foreign_abi_ABIDescriptor::outputStorage(abi_oop);
55 parse_register_array(outputStorage, StorageType::INTEGER, abi._integer_return_registers, as_Register);
56 parse_register_array(outputStorage, StorageType::VECTOR, abi._vector_return_registers, as_XMMRegister);
57 objArrayOop subarray = oop_cast<objArrayOop>(outputStorage->obj_at((int) StorageType::X87));
58 abi._X87_return_registers_noof = subarray->length();
59
60 objArrayOop volatileStorage = jdk_internal_foreign_abi_ABIDescriptor::volatileStorage(abi_oop);
61 parse_register_array(volatileStorage, StorageType::INTEGER, abi._integer_additional_volatile_registers, as_Register);
62 parse_register_array(volatileStorage, StorageType::VECTOR, abi._vector_additional_volatile_registers, as_XMMRegister);
63
64 abi._stack_alignment_bytes = jdk_internal_foreign_abi_ABIDescriptor::stackAlignment(abi_oop);
65 abi._shadow_space_bytes = jdk_internal_foreign_abi_ABIDescriptor::shadowSpace(abi_oop);
66
67 abi._scratch1 = parse_vmstorage(jdk_internal_foreign_abi_ABIDescriptor::scratch1(abi_oop));
68 abi._scratch2 = parse_vmstorage(jdk_internal_foreign_abi_ABIDescriptor::scratch2(abi_oop));
69
70 return abi;
71 }
72
73 int RegSpiller::pd_reg_size(VMStorage reg) {
74 if (reg.type() == StorageType::INTEGER) {
75 return 8;
76 } else if (reg.type() == StorageType::VECTOR) {
77 return 16;
78 }
79 return 0; // stack and BAD
80 }
|
30 #include "utilities/formatBuffer.hpp"
31
32 bool ForeignGlobals::is_foreign_linker_supported() {
33 return true;
34 }
35
36 bool ABIDescriptor::is_volatile_reg(Register reg) const {
37 return _integer_argument_registers.contains(reg)
38 || _integer_additional_volatile_registers.contains(reg);
39 }
40
41 bool ABIDescriptor::is_volatile_reg(XMMRegister reg) const {
42 return _vector_argument_registers.contains(reg)
43 || _vector_additional_volatile_registers.contains(reg);
44 }
45
46 const ABIDescriptor ForeignGlobals::parse_abi_descriptor(jobject jabi) {
47 oop abi_oop = JNIHandles::resolve_non_null(jabi);
48 ABIDescriptor abi;
49
50 refArrayOop inputStorage = jdk_internal_foreign_abi_ABIDescriptor::inputStorage(abi_oop);
51 parse_register_array(inputStorage, StorageType::INTEGER, abi._integer_argument_registers, as_Register);
52 parse_register_array(inputStorage, StorageType::VECTOR, abi._vector_argument_registers, as_XMMRegister);
53
54 refArrayOop outputStorage = jdk_internal_foreign_abi_ABIDescriptor::outputStorage(abi_oop);
55 parse_register_array(outputStorage, StorageType::INTEGER, abi._integer_return_registers, as_Register);
56 parse_register_array(outputStorage, StorageType::VECTOR, abi._vector_return_registers, as_XMMRegister);
57 refArrayOop subarray = oop_cast<refArrayOop>(outputStorage->obj_at((int) StorageType::X87));
58 abi._X87_return_registers_noof = subarray->length();
59
60 refArrayOop volatileStorage = jdk_internal_foreign_abi_ABIDescriptor::volatileStorage(abi_oop);
61 parse_register_array(volatileStorage, StorageType::INTEGER, abi._integer_additional_volatile_registers, as_Register);
62 parse_register_array(volatileStorage, StorageType::VECTOR, abi._vector_additional_volatile_registers, as_XMMRegister);
63
64 abi._stack_alignment_bytes = jdk_internal_foreign_abi_ABIDescriptor::stackAlignment(abi_oop);
65 abi._shadow_space_bytes = jdk_internal_foreign_abi_ABIDescriptor::shadowSpace(abi_oop);
66
67 abi._scratch1 = parse_vmstorage(jdk_internal_foreign_abi_ABIDescriptor::scratch1(abi_oop));
68 abi._scratch2 = parse_vmstorage(jdk_internal_foreign_abi_ABIDescriptor::scratch2(abi_oop));
69
70 return abi;
71 }
72
73 int RegSpiller::pd_reg_size(VMStorage reg) {
74 if (reg.type() == StorageType::INTEGER) {
75 return 8;
76 } else if (reg.type() == StorageType::VECTOR) {
77 return 16;
78 }
79 return 0; // stack and BAD
80 }
|