Changeset 252728 in webkit
- Timestamp:
- Nov 20, 2019, 10:02:50 PM (7 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 3 edited
-
ChangeLog (modified) (1 diff)
-
assembler/MacroAssemblerARM64.h (modified) (8 diffs)
-
assembler/testmasm.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r252725 r252728 1 2019-11-20 Yusuke Suzuki <ysuzuki@apple.com> 2 3 [JSC] Extend MacroAssemblerARM64::load/store for datasize = 16 4 https://bugs.webkit.org/show_bug.cgi?id=204442 5 <rdar://problem/57366761> 6 7 Reviewed by Mark Lam. 8 9 Our `void load16(const void* address, RegisterID dest)` and `void store16(RegisterID src, const void* address)` are not aware of 10 the condition that passed register can be memoryTempRegister, while `MacroAssemblerARM64::{load,store}` handles it correctly, e.g. 11 `load` invalidates `cachedMemoryTempRegister` if destination register is memoryTempRegister. As a result, when we are emitting 12 `or16(TrustedImm32 imm, AbsoluteAddress address)` with address where the address's value does not fit in imm, the generated code 13 is reusing memoryTempRegister incorrectly. 14 15 0xedf8d4fb4: mov x17, #0x7af0 16 0xedf8d4fb8: movk x17, #0xd5a, lsl #16 17 0xedf8d4fbc: movk x17, #0x1, lsl #32 // Construct imm register on x17. 18 0xedf8d4fc0: ldrh w17, [x17] // Load half word from x17 to w17 (we should invalidate x17 memoryTempRegister here). 19 0xedf8d4fc4: mov w16, #0x1b 20 0xedf8d4fc8: orr w16, w17, w16 21 0xedf8d4fcc: strh w16, [x17] // x17 memoryTempRegister is reused while its content is invalid. 22 23 The problem is that `load` and `store` functions are not supporting datasize = 16 case. This patch extends `MacroAssemblerARM64::{load,store}` 24 to support 16 so that `or16` implementation looks is similar to `or32` etc. 25 26 * assembler/MacroAssemblerARM64.h: 27 (JSC::MacroAssemblerARM64::load16): 28 (JSC::MacroAssemblerARM64::store16): 29 (JSC::MacroAssemblerARM64::load): 30 (JSC::MacroAssemblerARM64::store): 31 * assembler/testmasm.cpp: 32 (JSC::testOrImmMem): 33 1 34 2019-11-20 Saam Barati <sbarati@apple.com> 2 35 -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerARM64.h
r252699 r252728 1255 1255 void load16(const void* address, RegisterID dest) 1256 1256 { 1257 moveToCachedReg(TrustedImmPtr(address), cachedMemoryTempRegister()); 1258 m_assembler.ldrh(dest, memoryTempRegister, 0); 1257 load<16>(address, dest); 1259 1258 } 1260 1259 … … 1569 1568 void store16(RegisterID src, const void* address) 1570 1569 { 1571 moveToCachedReg(TrustedImmPtr(address), cachedMemoryTempRegister()); 1572 m_assembler.strh(src, memoryTempRegister, 0); 1570 store<16>(src, address); 1573 1571 } 1574 1572 … … 4221 4219 if (isInt<32>(addressDelta)) { 4222 4220 if (Assembler::canEncodeSImmOffset(addressDelta)) { 4223 m_assembler.ldur<datasize>(dest,memoryTempRegister, addressDelta);4221 loadUnscaledImmediate<datasize>(dest, memoryTempRegister, addressDelta); 4224 4222 return; 4225 4223 } 4226 4224 4227 4225 if (Assembler::canEncodePImmOffset<datasize>(addressDelta)) { 4228 m_assembler.ldr<datasize>(dest,memoryTempRegister, addressDelta);4226 loadUnsignedImmediate<datasize>(dest, memoryTempRegister, addressDelta); 4229 4227 return; 4230 4228 } … … 4234 4232 m_assembler.movk<64>(memoryTempRegister, addressAsInt & maskHalfWord0, 0); 4235 4233 cachedMemoryTempRegister().setValue(reinterpret_cast<intptr_t>(address)); 4236 m_assembler.ldr<datasize>(dest, memoryTempRegister, ARM64Registers::zr); 4234 if constexpr (datasize == 16) 4235 m_assembler.ldrh(dest, memoryTempRegister, ARM64Registers::zr); 4236 else 4237 m_assembler.ldr<datasize>(dest, memoryTempRegister, ARM64Registers::zr); 4237 4238 return; 4238 4239 } … … 4244 4245 else 4245 4246 cachedMemoryTempRegister().setValue(reinterpret_cast<intptr_t>(address)); 4246 m_assembler.ldr<datasize>(dest, memoryTempRegister, ARM64Registers::zr); 4247 if constexpr (datasize == 16) 4248 m_assembler.ldrh(dest, memoryTempRegister, ARM64Registers::zr); 4249 else 4250 m_assembler.ldr<datasize>(dest, memoryTempRegister, ARM64Registers::zr); 4247 4251 } 4248 4252 … … 4258 4262 if (isInt<32>(addressDelta)) { 4259 4263 if (Assembler::canEncodeSImmOffset(addressDelta)) { 4260 m_assembler.stur<datasize>(src, memoryTempRegister, addressDelta);4264 storeUnscaledImmediate<datasize>(src, memoryTempRegister, addressDelta); 4261 4265 return; 4262 4266 } 4263 4267 4264 4268 if (Assembler::canEncodePImmOffset<datasize>(addressDelta)) { 4265 m_assembler.str<datasize>(src, memoryTempRegister, addressDelta);4269 storeUnsignedImmediate<datasize>(src, memoryTempRegister, addressDelta); 4266 4270 return; 4267 4271 } … … 4271 4275 m_assembler.movk<64>(memoryTempRegister, addressAsInt & maskHalfWord0, 0); 4272 4276 cachedMemoryTempRegister().setValue(reinterpret_cast<intptr_t>(address)); 4273 m_assembler.str<datasize>(src, memoryTempRegister, ARM64Registers::zr); 4277 if constexpr (datasize == 16) 4278 m_assembler.strh(src, memoryTempRegister, ARM64Registers::zr); 4279 else 4280 m_assembler.str<datasize>(src, memoryTempRegister, ARM64Registers::zr); 4274 4281 return; 4275 4282 } … … 4278 4285 move(TrustedImmPtr(address), memoryTempRegister); 4279 4286 cachedMemoryTempRegister().setValue(reinterpret_cast<intptr_t>(address)); 4280 m_assembler.str<datasize>(src, memoryTempRegister, ARM64Registers::zr); 4287 if constexpr (datasize == 16) 4288 m_assembler.strh(src, memoryTempRegister, ARM64Registers::zr); 4289 else 4290 m_assembler.str<datasize>(src, memoryTempRegister, ARM64Registers::zr); 4281 4291 } 4282 4292 -
trunk/Source/JavaScriptCore/assembler/testmasm.cpp
r252422 r252728 1128 1128 invoke<void>(or16); 1129 1129 CHECK_EQ(memoryLocation, 0x12341234 | 42); 1130 1131 memoryLocation = 0x12341234; 1132 auto or16InvalidLogicalImmInARM64 = compile([&] (CCallHelpers& jit) { 1133 emitFunctionPrologue(jit); 1134 jit.or16(CCallHelpers::TrustedImm32(0), CCallHelpers::AbsoluteAddress(&memoryLocation)); 1135 emitFunctionEpilogue(jit); 1136 jit.ret(); 1137 }); 1138 invoke<void>(or16InvalidLogicalImmInARM64); 1139 CHECK_EQ(memoryLocation, 0x12341234); 1130 1140 } 1131 1141
Note:
See TracChangeset
for help on using the changeset viewer.