History

Add arm64 alloca() support.

kbkpbot committed 12 months ago

Commit 264229a1 parent fa6a6bf2 files · +70 −10Browse files

Showing the changes to lib/alloca.S (1 of 2 files). Show all

Unified · Split

lib/alloca.S+69−9
@@ -70,16 +70,76 @@ p3: · 69 unmodified lines
70/* ---------------------------------------------- */70/* ---------------------------------------------- */
71#elif defined __arm__71#elif defined __arm__
72 72
73 .text73 .text
74 .align 274 .align
75 .global alloca75 .global alloca
76 .type alloca, %function76 .type alloca, %function
77alloca:77alloca:
78 rsb sp, r0, sp78 rsb sp, r0, sp
79 bic sp, sp, #779 bic sp, sp, #7
80 mov r0, sp80 mov r0, sp
81 mov pc, lr81 mov pc, lr
82 .size alloca, .-alloca82 .size alloca, .-alloca
83 83
84/* ---------------------------------------------- */84/* ---------------------------------------------- */
85#elif defined __aarch64__ || defined __arm64__
86
87 .text
88 .align 2
89 .global alloca
90 .type alloca, %function
91alloca:
92#ifdef __TINYC__
93 .int 0x91003c00
94 .int 0x927cec00
95#ifdef _WIN32
96 .int 0xb4000160
97 .int 0xd2820001
98 .int 0xeb01001f
99 .int 0x540000c3
100 .int 0xcb2163e2
101 .int 0xf940005f
102 .int 0xcb2163ff
103 .int 0xcb010000
104 .int 0x17fffffa
105#endif
106 .int 0xb4000040
107 .int 0xcb2063ff
108 .int 0x910003e0
109 .int 0xd65f03c0
110#else
111 add x0, x0, #15 // Round up to 16-byte boundary
112 and x0, x0, #-16 // Ensure 16-byte alignment
113 cbz x0, p100 // If size is 0, skip to return
114#ifdef _WIN32
115 // Windows requires page-wise allocation with stack probing
116 mov x1, #4096 // Page size = 4096 bytes
117
118p101:
119 cmp x0, x1 // Compare remaining size with page size
120 b.lo p102 // If less than page, jump to remainder
121
122 // Probe first, then allocate
123 sub x2, sp, x1 // Calculate guard page address (sp - 4096)
124 ldr xzr, [x2] // Touch guard page FIRST
125 sub sp, sp, x1 // THEN allocate the page
126
127 sub x0, x0, x1 // Decrement remaining size
128 b p101 // Continue loop
129
130p102:
131 // Allocate remaining bytes (less than one page)
132 cbz x0, p100 // If no remaining bytes, skip
133 sub sp, sp, x0 // Allocate remaining space
134#else
135 // Non-Windows: simple one-time allocation
136 sub sp, sp, x0 // Allocate space on stack
137#endif
138
139p100:
140 mov x0, sp // Return allocated address
141 ret // Return to caller
142#endif
143 .size alloca, .-alloca
144/* ---------------------------------------------- */
85#endif145#endif

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t