| 1082 | } |
| 1083 | |
| 1084 | RegPtr JitCodeGen::read(JitWidth width, RegPtr addressReg, std::function<void(MemPtr address)> customMemoryOp, std::function<void()> failedMemoryOp, RegPtr tmp, bool checkAlignment) { |
| 1085 | if (!tmp) { |
| 1086 | tmp = getTmpReg8(); |
| 1087 | } |
| 1088 | |
| 1089 | #ifdef BOXEDWINE_MEM_CACHE |
| 1090 | if (currentOp->exceptionCount < MAX_OP_EXCEPTION_COUNT) { |
| 1091 | #ifdef _DEBUG |
| 1092 | writeCurrentEip(0); |
| 1093 | #endif |
| 1094 | shrValueWithDest(JitWidth::b32, tmp, addressReg, K_PAGE_SHIFT); |
| 1095 | |
| 1096 | readMMU(tmp, tmp, K_NUMBER_OF_PAGES * sizeof(void*)); |
| 1097 | |
| 1098 | if (!KSystem::canJitUse4KPage && width != JitWidth::b8) { |
| 1099 | RegPtr offsetReg = getTmpReg(); |
| 1100 | |
| 1101 | andValueWithDest(JitWidth::b32, offsetReg, addressReg, K_PAGE_MASK); |
| 1102 | addReg(DYN_PTR, tmp, addressReg); |
| 1103 | clearIfSpansPage(width, offsetReg, tmp); |
| 1104 | if (customMemoryOp) { |
| 1105 | customMemoryOp(createMemPtr(tmp)); |
| 1106 | } else { |
| 1107 | readHost(width, createMemPtr(tmp), tmp); |
| 1108 | } |
| 1109 | } else { |
| 1110 | if (customMemoryOp) { |
| 1111 | customMemoryOp(createMemPtr(tmp, addressReg)); |
| 1112 | } else { |
| 1113 | readHost(width, createMemPtr(tmp, addressReg), tmp); |
| 1114 | } |
| 1115 | } |
| 1116 | return tmp; |
| 1117 | } |
| 1118 | #endif |
| 1119 | RegPtr offsetReg; |
| 1120 | |
| 1121 | shrValueWithDest(JitWidth::b32, tmp, addressReg, K_PAGE_SHIFT); |
| 1122 | readMMU(tmp, tmp); |
| 1123 | |
| 1124 | if (addressReg.use_count() == 1) { |
| 1125 | offsetReg = addressReg; |
| 1126 | andValue(JitWidth::b32, offsetReg, K_PAGE_MASK); |
| 1127 | } else { |
| 1128 | offsetReg = getTmpReg(); |
| 1129 | andValueWithDest(JitWidth::b32, offsetReg, addressReg, K_PAGE_MASK); |
| 1130 | } |
| 1131 | |
| 1132 | if (width != JitWidth::b8 && checkAlignment) { |
| 1133 | #ifdef BOXEDWINE_HOST_EXCEPTIONS |
| 1134 | if (KSystem::canJitUse4KPage) { |
| 1135 | #ifdef _DEBUG |
| 1136 | writeCurrentEip(0); |
| 1137 | #endif |
| 1138 | if (currentOp->exceptionCount == MAX_OP_EXCEPTION_COUNT) { |
| 1139 | clearMMUPermissionIfSpansPage(width, offsetReg, tmp); |
| 1140 | } |
| 1141 | } else |
nothing calls this directly
no test coverage detected