build: add module to handle querying platform details

This commit is contained in:
2026-05-05 21:30:32 +01:00
parent c29465a97d
commit e3a2d6b9d5
27 changed files with 43 additions and 8 deletions
+92
View File
@@ -0,0 +1,92 @@
.global _callvm_invoke_i
.align 4
# x0 = (function ptr) impl
# x1 = (struct callvm) context
_callvm_invoke_i:
# save the stack frame and link pointer
stp x29, x30, [sp, #-16]!
mov x29, sp
# preserve callee-saved registers
stp x19, x20, [sp, #-16]!
# store function pointer and callvm context for later
mov x19, x0
mov x20, x1
# First, set up the variable arguments
### calculate the amount of stack space needed for the varargs
# store the original stack pointer, so it can be restored later
mov x0, sp
str x0, [sp, #-16]!
# x8 = excess arg count
ldr x8, [x20, #32]
# x8 = excess arg buffer size (8 bytes per value)
lsl x8, x8, #3
# allocate the stack space
sub sp, sp, x8
# re-align the stack, and take a pointer to the newly-allocated buffer
mov x0, sp
and x0, x0, #0xFFFFFFFFFFFFFFF0
mov sp, x0
ldr x1, [x20, #176]
mov x2, x8
# memcpy(stack vararg buffer, callvm excess buffer, arg size)
bl _memcpy
# Next, set up the fixed integer arguments
ldr x0, [x20, #48]
ldr x1, [x20, #56]
ldr x2, [x20, #64]
ldr x3, [x20, #72]
ldr x4, [x20, #80]
ldr x5, [x20, #88]
ldr x6, [x20, #96]
ldr x7, [x20, #104]
# Finally, set up the fixed double arguments
ldr d0, [x20, #112]
ldr d1, [x20, #120]
ldr d2, [x20, #128]
ldr d3, [x20, #136]
ldr d4, [x20, #144]
ldr d5, [x20, #152]
ldr d6, [x20, #160]
ldr d7, [x20, #168]
# call the function implementation
blr x19
# restore the saved stack pointer, and de-allocate the stack varargs buffer
ldr x9, [x29, #-32]
mov sp, x9
# restore callee-saved registers
ldp x19, x20, [sp], #16
# restore the saved stack frame and link pointer
ldp x29, x30, [sp], #16
ret
.global _callvm_invoke_d
.align 4
# x0 = (function ptr) impl
# x1 = (struct callvm) context
_callvm_invoke_d:
b _callvm_invoke_i
.global _callvm_invoke_v
.align 4
# x0 = (function ptr) impl
# x1 = (struct callvm) context
_callvm_invoke_v:
b _callvm_invoke_i