Currently, to load a JSCConfig field, our LLInt asm does something like this: ``` leap JSCConfig + constexpr JSC::offsetOfJSCConfigGateMap + (constexpr Gate::%opcodeName%) * PtrSize, ws1 jmp [ws1], NativeToJITGatePtrTag # JSEntrySlowPathPtrTag ``` ... and generates this: ``` #if OS(DARWIN) ".loc 1 1\n" "Ljsc_llint_loh_adrp_1508: \n" // LowLevelInterpreter.asm:1 "adrp x10, " LOCAL_REFERENCE(g_config) "@GOTPAGE \n" "Ljsc_llint_loh_ldr_1508: \n" "ldr x10, [x10, " LOCAL_REFERENCE(g_config) "@GOTPAGEOFF] \n" #elif OS(LINUX) ... #endif ".loc 1 1\n" "add x10, x10, #3592 \n" // <---- this add can be applied as an offset to the ldr below. ".loc 6 1034\n" "movz x13, #57366 \n" // WebAssembly.asm:1034 "ldr x17, [x10] \n" "brab x17, x13 \n" ``` This patch re-arranges the LLInt assembly to look like this instead: ``` leap _g_config, ws1 jmp JSCConfigGateMapOffset + (constexpr Gate::%opcodeName%) * PtrSize[ws1], NativeToJITGatePtrTag # JSEntrySlowPathPtrTag ``` ... resulting in the removal of the unnecessary add instruction: ``` #if OS(DARWIN) ".loc 1 1\n" "Ljsc_llint_loh_adrp_1508: \n" // LowLevelInterpreter.asm:1 "adrp x10, " LOCAL_REFERENCE(g_config) "@GOTPAGE \n" "Ljsc_llint_loh_ldr_1508: \n" "ldr x10, [x10, " LOCAL_REFERENCE(g_config) "@GOTPAGEOFF] \n" #elif OS(LINUX) ... #endif ".loc 6 1034\n" "movz x13, #57366 \n" // WebAssembly.asm:1034 "ldr x17, [x10, #3592] \n" "brab x17, x13 \n" ```
<rdar://problem/104854843>
Pull request: https://github.com/WebKit/WebKit/pull/9368
Committed 259629@main (95dcffb800f8): <https://commits.webkit.org/259629@main> Reviewed commits have been landed. Closing PR #9368 and removing active labels.