]> git.saurik.com Git - apple/objc4.git/blobdiff - runtime/a1a2-blocktramps-arm.s
objc4-646.tar.gz
[apple/objc4.git] / runtime / a1a2-blocktramps-arm.s
index cfaf5da3d0e7d89d1021ed59e9b0265f8c40e8b3..9e540788e8dfadbb2d37ffeb82b6e52148591a97 100644 (file)
 
        .private_extern __a1a2_tramphead
        .private_extern __a1a2_firsttramp
-       .private_extern __a1a2_nexttramp
        .private_extern __a1a2_trampend
 
-// This must match a2a3-blocktramps-arm.s
-#if defined(_ARM_ARCH_7)
-#   define THUMB2 1
-#else
-#   define THUMB2 0
+// Trampoline machinery assumes the trampolines are Thumb function pointers
+#if !__thumb2__
+#   error sorry
 #endif
-       
-#if THUMB2
-       .thumb
-       .thumb_func __a1a2_tramphead
-       .thumb_func __a1a2_firsttramp
-       .thumb_func __a1a2_nexttramp
-       .thumb_func __a1a2_trampend
-#else
-       // don't use Thumb-1
-       .arm
-#endif
-       
-.align PAGE_SHIFT
-__a1a2_tramphead_nt:
+
+.thumb
+.thumb_func __a1a2_tramphead
+.thumb_func __a1a2_firsttramp
+.thumb_func __a1a2_trampend
+
+.align PAGE_MAX_SHIFT
 __a1a2_tramphead:
        /*
         r0 == self
-        r1 == pc of trampoline's first instruction + PC bias
+        r12 == pc of trampoline's first instruction + PC bias
         lr == original return address
         */
 
-       // calculate the trampoline's index (512 entries, 8 bytes each)
-#if THUMB2
-       // PC bias is only 4, no need to correct with 8-byte trampolines
-       ubfx r1, r1, #3, #9
-#else
-       sub  r1, r1, #8               // correct PC bias
-       lsl  r1, r1, #20
-       lsr  r1, r1, #23
-#endif
-
-       // load block pointer from trampoline's data
-       // nt label works around thumb integrated asm bug rdar://11315197
-       adr  r12, __a1a2_tramphead_nt // text page
-       sub  r12, r12, #PAGE_SIZE     // data page precedes text page
-       ldr  r12, [r12, r1, LSL #3]   // load block pointer from data + index*8
-
-       // shuffle parameters
        mov  r1, r0                   // _cmd = self
-       mov  r0, r12                  // self = block pointer
 
-       // tail call block->invoke
-       ldr  pc, [r12, #12]
+       // Trampoline's data is one page before the trampoline text.
+       // Also correct PC bias of 4 bytes.
+       sub  r12, #PAGE_MAX_SIZE
+       ldr  r0, [r12, #-4]          // self = block object
+       ldr  pc, [r0, #12]           // tail call block->invoke
        // not reached
 
-       // Make v6 and v7 match so they have the same number of TrampolineEntry
-       // below. Debug asserts in objc-block-trampoline.m check this.
-#if THUMB2
-       .space 16
-#endif
+       // Align trampolines to 8 bytes
+.align 3
        
 .macro TrampolineEntry
-       mov r1, pc
+       mov r12, pc
        b __a1a2_tramphead
-       .align 3
+.align 3
+.endmacro
+
+.macro TrampolineEntryX16
+       TrampolineEntry
+       TrampolineEntry
+       TrampolineEntry
+       TrampolineEntry
+       
+       TrampolineEntry
+       TrampolineEntry
+       TrampolineEntry
+       TrampolineEntry
+       
+       TrampolineEntry
+       TrampolineEntry
+       TrampolineEntry
+       TrampolineEntry
+       
+       TrampolineEntry
+       TrampolineEntry
+       TrampolineEntry
+       TrampolineEntry
+.endmacro
+
+.macro TrampolineEntryX256
+       TrampolineEntryX16
+       TrampolineEntryX16
+       TrampolineEntryX16
+       TrampolineEntryX16
+       
+       TrampolineEntryX16
+       TrampolineEntryX16
+       TrampolineEntryX16
+       TrampolineEntryX16
+       
+       TrampolineEntryX16
+       TrampolineEntryX16
+       TrampolineEntryX16
+       TrampolineEntryX16
+       
+       TrampolineEntryX16
+       TrampolineEntryX16
+       TrampolineEntryX16
+       TrampolineEntryX16
 .endmacro
 
-.align 3
 .private_extern __a1a2_firsttramp
 __a1a2_firsttramp:
-    TrampolineEntry
+       // 2048-2 trampolines to fill 16K page
+       TrampolineEntryX256
+       TrampolineEntryX256
+       TrampolineEntryX256
+       TrampolineEntryX256
+
+       TrampolineEntryX256
+       TrampolineEntryX256
+       TrampolineEntryX256
+
+       TrampolineEntryX16
+       TrampolineEntryX16
+       TrampolineEntryX16
+       TrampolineEntryX16
+
+       TrampolineEntryX16
+       TrampolineEntryX16
+       TrampolineEntryX16
+       TrampolineEntryX16
+
+       TrampolineEntryX16
+       TrampolineEntryX16
+       TrampolineEntryX16
+       TrampolineEntryX16
+
+       TrampolineEntryX16
+       TrampolineEntryX16
+       TrampolineEntryX16
+
+       TrampolineEntry
+       TrampolineEntry
+       TrampolineEntry
+       TrampolineEntry
+
+       TrampolineEntry
+       TrampolineEntry
+       TrampolineEntry
+       TrampolineEntry
+
+       TrampolineEntry
+       TrampolineEntry
+       TrampolineEntry
+       TrampolineEntry
 
-.private_extern __a1a2_nexttramp
-__a1a2_nexttramp:
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
-TrampolineEntry
+       TrampolineEntry
+       TrampolineEntry
+       // TrampolineEntry
+       // TrampolineEntry
 
 .private_extern __a1a2_trampend
 __a1a2_trampend: