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