Files
tlib/oversampling/WDL/eel2/asm-nseel-arm64ec.asm
2024-05-24 13:28:31 +02:00

1417 lines
20 KiB
NASM

NSEEL_RAM_ITEMSPERBLOCK_LOG2 equ 16
NSEEL_RAM_BLOCKS_LOG2 equ 9
NSEEL_LOOPFUNC_SUPPORT_MAXLEN equ 1048576
NSEEL_RAM_BLOCKS equ (1 << NSEEL_RAM_BLOCKS_LOG2)
NSEEL_RAM_ITEMSPERBLOCK equ (1<<NSEEL_RAM_ITEMSPERBLOCK_LOG2)
AREA |.drectve|, DRECTVE
AREA |.data|, DATA
EXPORT |#nseel_asm_1pdd|
EXPORT |#nseel_asm_2pdd|
EXPORT |#nseel_asm_2pdds|
EXPORT |#nseel_asm_invsqrt|
EXPORT |#nseel_asm_dbg_getstackptr|
EXPORT |#nseel_asm_sqr|
EXPORT |#nseel_asm_abs|
EXPORT |#nseel_asm_assign|
EXPORT |#nseel_asm_assign_fromfp|
EXPORT |#nseel_asm_assign_fast|
EXPORT |#nseel_asm_assign_fast_fromfp|
EXPORT |#nseel_asm_add|
EXPORT |#nseel_asm_add_op|
EXPORT |#nseel_asm_add_op_fast|
EXPORT |#nseel_asm_sub|
EXPORT |#nseel_asm_sub_op|
EXPORT |#nseel_asm_sub_op_fast|
EXPORT |#nseel_asm_mul|
EXPORT |#nseel_asm_mul_op|
EXPORT |#nseel_asm_mul_op_fast|
EXPORT |#nseel_asm_div|
EXPORT |#nseel_asm_div_op|
EXPORT |#nseel_asm_div_op_fast|
EXPORT |#nseel_asm_mod|
EXPORT |#nseel_asm_shl|
EXPORT |#nseel_asm_shr|
EXPORT |#nseel_asm_mod_op|
EXPORT |#nseel_asm_or|
EXPORT |#nseel_asm_or0|
EXPORT |#nseel_asm_or_op|
EXPORT |#nseel_asm_xor|
EXPORT |#nseel_asm_xor_op|
EXPORT |#nseel_asm_and|
EXPORT |#nseel_asm_and_op|
EXPORT |#nseel_asm_uminus|
EXPORT |#nseel_asm_sign|
EXPORT |#nseel_asm_bnot|
EXPORT |#nseel_asm_if|
EXPORT |#nseel_asm_repeat|
EXPORT |#nseel_asm_repeatwhile|
EXPORT |#nseel_asm_band|
EXPORT |#nseel_asm_bor|
EXPORT |#nseel_asm_equal|
EXPORT |#nseel_asm_equal_exact|
EXPORT |#nseel_asm_notequal_exact|
EXPORT |#nseel_asm_notequal|
EXPORT |#nseel_asm_below|
EXPORT |#nseel_asm_beloweq|
EXPORT |#nseel_asm_above|
EXPORT |#nseel_asm_aboveeq|
EXPORT |#nseel_asm_min|
EXPORT |#nseel_asm_max|
EXPORT |#nseel_asm_min_fp|
EXPORT |#nseel_asm_max_fp|
EXPORT |#_asm_generic3parm|
EXPORT |#_asm_generic3parm_retd|
EXPORT |#_asm_generic2parm|
EXPORT |#_asm_generic2parm_retd|
EXPORT |#_asm_generic2xparm_retd|
EXPORT |#_asm_generic1parm|
EXPORT |#_asm_generic1parm_retd|
EXPORT |#_asm_megabuf|
EXPORT |#_asm_gmegabuf|
EXPORT |#nseel_asm_fcall|
EXPORT |#nseel_asm_stack_push|
EXPORT |#nseel_asm_stack_pop|
EXPORT |#nseel_asm_stack_pop_fast|
EXPORT |#nseel_asm_stack_peek|
EXPORT |#nseel_asm_stack_peek_top|
EXPORT |#nseel_asm_stack_peek_int|
EXPORT |#nseel_asm_stack_exch|
EXPORT |#nseel_asm_booltofp|
EXPORT |#nseel_asm_fptobool|
EXPORT |#nseel_asm_fptobool_rev|
EXPORT |#eel_callcode64|
EXPORT |#glue_setscr|
EXPORT |#glue_getscr|
AREA |.text$mn|, CODE, ARM64
|#nseel_asm_1pdd| PROC
mov x1, x1
mov x3, 0xdead
movk x3, 0xbeef, lsl 16
movk x3, 0xbeef, lsl 32
stp fp, lr, [sp, #-16]!
mov fp, sp
blr x3
ldp fp, lr, [sp], #16
mov x1, x1
ENDP
|#nseel_asm_2pdd| PROC
mov x1, x1
mov x3, 0xdead
movk x3, 0xbeef, lsl 16
movk x3, 0xbeef, lsl 32
fmov d2, d0
fmov d0, d1
fmov d1, d2
stp fp, lr, [sp, #-16]!
mov fp, sp
blr x3
ldp fp, lr, [sp], #16
mov x1, x1
ENDP;
|#nseel_asm_2pdds| PROC
mov x1, x1
mov x3, 0xdead
movk x3, 0xbeef, lsl 16
movk x3, 0xbeef, lsl 32
stp fp, lr, [sp, #-32]!
mov fp, sp
str x1, [sp, #16]
fmov d1, d0
ldr d0, [x1]
blr x3
ldr x0, [sp, #16]
ldp fp, lr, [sp], #32
str d0, [x0]
mov x1, x1
ENDP
|#nseel_asm_invsqrt| PROC
mov x1, x1
mov x0, 0x59df
movk x0, 0x5f37, lsl 16
fcvt s2, d0
ldr d3, [x21, #32]
fmov w1, s2
fmul d0, d0, d3
asr w1, w1, #1
sub w0, w0, w1
fmov s4, w0
fcvt d1, s4
ldr d2, [x21, #40]
fmul d0, d0, d1
fmul d0, d0, d1
fadd d0, d0, d2
fmul d0, d0, d1
mov x1, x1
ENDP
|#nseel_asm_dbg_getstackptr| PROC
mov x1, x1
mov x0, sp
ucvtf d0, x0
mov x1, x1
ENDP
|#nseel_asm_sqr| PROC
mov x1, x1
fmul d0, d0, d0
mov x1, x1
ENDP
|#nseel_asm_abs| PROC
mov x1, x1
fabs d0, d0
mov x1, x1
ENDP
|#nseel_asm_assign| PROC
mov x1, x1
ldr d0, [x0]
mov x0, x1
str d0, [x1]
ldr x1, [x1]
mov x3, #0x10000000000000
mov x2, #0x20000000000000
add x1, x1, x3
and x1, x1, #0x7ff0000000000000
cmp x1, x2
bgt |ftz1|
str xzr, [x0]
|ftz1|
mov x1, x1
ENDP
|#nseel_asm_assign_fromfp| PROC
mov x1, x1
mov x0, x1
str d0, [x1]
ldr x1, [x1]
mov x3, #0x10000000000000
mov x2, #0x20000000000000
add x1, x1, x3
and x1, x1, #0x7ff0000000000000
cmp x1, x2
bgt |ftz2|
str xzr, [x0]
|ftz2|
mov x1, x1
ENDP
|#nseel_asm_assign_fast| PROC
mov x1, x1
ldr d0, [x0]
mov x0, x1
str d0, [x1]
mov x1, x1
ENDP
|#nseel_asm_assign_fast_fromfp| PROC
mov x1, x1
mov x0, x1
str d0, [x1]
mov x1, x1
ENDP
|#nseel_asm_add| PROC
mov x1, x1
fadd d0, d1, d0
mov x1, x1
ENDP
|#nseel_asm_add_op| PROC
mov x1, x1
ldr d1, [x1]
fadd d0, d1, d0
mov x0, x1
str d0, [x1]
ldr x1, [x1]
mov x3, #0x10000000000000
mov x2, #0x20000000000000
add x1, x1, x3
and x1, x1, #0x7ff0000000000000
cmp x1, x2
bgt |ftz3|
str xzr, [x0]
|ftz3|
mov x1, x1
ENDP
|#nseel_asm_add_op_fast| PROC
mov x1, x1
ldr d1, [x1]
fadd d0, d1, d0
mov x0, x1
str d0, [x1]
mov x1, x1
ENDP
|#nseel_asm_sub| PROC
mov x1, x1
fsub d0, d1, d0
mov x1, x1
ENDP
|#nseel_asm_sub_op| PROC
mov x1, x1
ldr d1, [x1]
fsub d0, d1, d0
mov x0, x1
str d0, [x1]
ldr x1, [x1]
mov x3, #0x10000000000000
mov x2, #0x20000000000000
add x1, x1, x3
and x1, x1, #0x7ff0000000000000
cmp x1, x2
bgt |ftz4|
str xzr, [x0]
|ftz4|
mov x1, x1
ENDP
|#nseel_asm_sub_op_fast| PROC
mov x1, x1
ldr d1, [x1]
fsub d0, d1, d0
mov x0, x1
str d0, [x1]
mov x1, x1
ENDP
|#nseel_asm_mul| PROC
mov x1, x1
fmul d0, d1, d0
mov x1, x1
ENDP
|#nseel_asm_mul_op| PROC
mov x1, x1
ldr d1, [x1]
fmul d0, d0, d1
mov x0, x1
str d0, [x1]
ldr x1, [x1]
mov x3, #0x10000000000000
mov x2, #0x20000000000000
add x1, x1, x3
and x1, x1, #0x7ff0000000000000
cmp x1, x2
bgt |ftz5|
str xzr, [x0]
|ftz5|
mov x1, x1
ENDP
|#nseel_asm_mul_op_fast| PROC
mov x1, x1
ldr d1, [x1]
fmul d0, d0, d1
mov x0, x1
str d0, [x1]
mov x1, x1
ENDP
|#nseel_asm_div| PROC
mov x1, x1
fdiv d0, d1, d0
mov x1, x1
ENDP
|#nseel_asm_div_op| PROC
mov x1, x1
ldr d1, [x1]
fdiv d0, d1, d0
mov x0, x1
str d0, [x1]
ldr x1, [x1]
mov x3, #0x10000000000000
mov x2, #0x20000000000000
add x1, x1, x3
and x1, x1, #0x7ff0000000000000
cmp x1, x2
bgt |ftz6|
str xzr, [x0]
|ftz6|
mov x1, x1
ENDP
|#nseel_asm_div_op_fast| PROC
mov x1, x1
ldr d1, [x1]
fdiv d0, d1, d0
mov x0, x1
str d0, [x1]
mov x1, x1
ENDP
|#nseel_asm_mod| PROC
mov x1, x1
fabs d0, d0
fabs d1, d1
fcvtzu w1, d0
fcvtzu w0, d1
udiv w2, w0, w1
msub w0, w2, w1, w0
ucvtf d0, w0
mov x1, x1
ENDP
|#nseel_asm_shl| PROC
mov x1, x1
fcvtzs w0, d1
fcvtzs w1, d0
lsl w0, w0, w1
scvtf d0, w0
mov x1, x1
ENDP
|#nseel_asm_shr| PROC
mov x1, x1
fcvtzs w0, d1
fcvtzs w1, d0
asr w0, w0, w1
scvtf d0, w0
mov x1, x1
ENDP
|#nseel_asm_mod_op| PROC
mov x1, x1
ldr d1, [x1]
fabs d0, d0
fabs d1, d1
fcvtzu w3, d0
fcvtzu w0, d1
udiv w2, w0, w3
msub w0, w2, w3, w0
ucvtf d0, w0
str d0, [x1]
mov x0, x1
mov x1, x1
ENDP
|#nseel_asm_or| PROC
mov x1, x1
fcvtzs x0, d0
fcvtzs x1, d1
orr x0, x0, x1
scvtf d0, x0
mov x1, x1
ENDP
|#nseel_asm_or0| PROC
mov x1, x1
fcvtzs x0, d0
scvtf d0, x0
mov x1, x1
ENDP
|#nseel_asm_or_op| PROC
mov x1, x1
ldr d1, [x1]
fcvtzs x0, d0
fcvtzs x3, d1
orr x0, x0, x3
scvtf d0, x0
mov x0, x1
str d0, [x1]
mov x1, x1
ENDP
|#nseel_asm_xor| PROC
mov x1, x1
fcvtzs x0, d0
fcvtzs x1, d1
eor x0, x0, x1
scvtf d0, x0
mov x1, x1
ENDP
|#nseel_asm_xor_op| PROC
mov x1, x1
ldr d1, [x1]
fcvtzs x0, d0
fcvtzs x3, d1
eor x0, x0, x3
scvtf d0, x0
mov x0, x1
str d0, [x1]
mov x1, x1
ENDP
|#nseel_asm_and| PROC
mov x1, x1
fcvtzs x0, d0
fcvtzs x1, d1
and x0, x0, x1
scvtf d0, x0
mov x1, x1
ENDP
|#nseel_asm_and_op| PROC
mov x1, x1
ldr d1, [x1]
fcvtzs x0, d0
fcvtzs x3, d1
and x0, x0, x3
scvtf d0, x0
mov x0, x1
str d0, [x1]
mov x1, x1
ENDP
|#nseel_asm_uminus| PROC
mov x1, x1
fneg d0, d0
mov x1, x1
ENDP
|#nseel_asm_sign| PROC
mov x1, x1
fmov d1, #-1.0
fmov d2, #1.0
fcmpe d0, #0.0
fcsel d0, d0, d1, gt
fcsel d0, d0, d2, lt
mov x1, x1
ENDP
|#nseel_asm_bnot| PROC
mov x1, x1
cmp w0, #0
cset w0, eq
mov x1, x1
ENDP
|#nseel_asm_if| PROC
mov x1, x1
stp fp, lr, [sp, #-16]!
mov fp, sp
mov x1, 0xdead
movk x1, 0xbeef, lsl 16
movk x1, 0xbeef, lsl 32
mov x2, 0xdead
movk x2, 0xbeef, lsl 16
movk x2, 0xbeef, lsl 32
cmp w0, #0
csel x1, x1, x2, ne
blr x1
ldp fp, lr, [sp], #16
mov x1, x1
ENDP
|#nseel_asm_repeat| PROC
mov x1, x1
fcvtzs w3, d0
cmp w3, #0
ble |rep_lz2|
[ NSEEL_LOOPFUNC_SUPPORT_MAXLEN > 0
mov x2, (NSEEL_LOOPFUNC_SUPPORT_MAXLEN & 65535)
movk x2, (NSEEL_LOOPFUNC_SUPPORT_MAXLEN>>16), lsl 16
cmp w3, w2
csel w3, w2, w3, gt
]
stp fp, lr, [sp, #-48]!
mov fp, sp
str x25, [sp, #16]
mov x25, 0xdead
movk x25, 0xbeef, lsl 16
movk x25, 0xbeef, lsl 32
|rep_lz|
stp x3, x22, [sp, #32]
blr x25
ldp x3, x22, [sp, #32]
sub x3, x3, #1
cmp x3, #0
bgt |rep_lz|
ldr x25, [sp, #16]
ldp fp, lr, [sp], #48
|rep_lz2|
mov x1, x1
ENDP
|#nseel_asm_repeatwhile| PROC
mov x1, x1
[ NSEEL_LOOPFUNC_SUPPORT_MAXLEN > 0
mov x3, (NSEEL_LOOPFUNC_SUPPORT_MAXLEN & 65535)
movk x3, (NSEEL_LOOPFUNC_SUPPORT_MAXLEN>>16), lsl 16
]
stp fp, lr, [sp, #-48]!
str x25, [sp, #16]
mov x25, 0xdead
movk x25, 0xbeef, lsl 16
movk x25, 0xbeef, lsl 32
|repw_lz|
stp x3, x22, [sp, #32]
blr x25
ldp x3, x22, [sp, #32]
cmp w0, #0
[ NSEEL_LOOPFUNC_SUPPORT_MAXLEN > 0
beq |repw_lz2|
sub x3, x3, #1
cmp x3, #0
bne |repw_lz|
|repw_lz2|
]
[ NSEEL_LOOPFUNC_SUPPORT_MAXLEN == 0
bne |repw_lz|
]
ldr x25, [sp, #16]
ldp fp, lr, [sp], #48
mov x1, x1
ENDP
|#nseel_asm_band| PROC
mov x1, x1
cmp w0, #0
beq |band_chk|
mov x3, 0xdead
movk x3, 0xbeef, lsl 16
movk x3, 0xbeef, lsl 32
stp fp, lr, [sp, #-16]!
mov fp, sp
blr x3
ldp fp, lr, [sp], #16
|band_chk|
mov x1, x1
ENDP
|#nseel_asm_bor| PROC
mov x1, x1
cmp w0, #0
bne |bor_chk|
mov x3, 0xdead
movk x3, 0xbeef, lsl 16
movk x3, 0xbeef, lsl 32
stp fp, lr, [sp, #-16]!
mov fp, sp
blr x3
ldp fp, lr, [sp], #16
|bor_chk|
mov x1, x1
ENDP
|#nseel_asm_equal| PROC
mov x1, x1
ldr d2, [x21]
fsub d0, d0, d1
fabs d0, d0
fcmp d0, d2
cset w0, lt
mov x1, x1
ENDP
|#nseel_asm_equal_exact| PROC
mov x1, x1
fcmp d1, d0
cset w0, eq
mov x1, x1
ENDP
|#nseel_asm_notequal_exact| PROC
mov x1, x1
fcmp d1, d0
cset w0, ne
mov x1, x1
ENDP
|#nseel_asm_notequal| PROC
mov x1, x1
ldr d2, [x21]
fsub d0, d0, d1
fabs d0, d0
fcmp d0, d2
cset w0, ge
mov x1, x1
ENDP
|#nseel_asm_below| PROC
mov x1, x1
fcmp d1, d0
cset w0, lt
mov x1, x1
ENDP
|#nseel_asm_beloweq| PROC
mov x1, x1
fcmp d1, d0
cset w0, le
mov x1, x1
ENDP
|#nseel_asm_above| PROC
mov x1, x1
fcmp d1, d0
cset w0, gt
mov x1, x1
ENDP
|#nseel_asm_aboveeq| PROC
mov x1, x1
fcmp d1, d0
cset w0, ge
mov x1, x1
ENDP
|#nseel_asm_min| PROC
mov x1, x1
ldr d0, [x0]
ldr d1, [x1]
fcmp d1, d0
csel x0, x1, x0, lt
mov x1, x1
ENDP
|#nseel_asm_max| PROC
mov x1, x1
ldr d0, [x0]
ldr d1, [x1]
fcmp d1, d0
csel x0, x1, x0, gt
mov x1, x1
ENDP
|#nseel_asm_min_fp| PROC
mov x1, x1
fcmp d1, d0
fcsel d0, d1, d0, lt
mov x1, x1
ENDP
|#nseel_asm_max_fp| PROC
mov x1, x1
fcmp d1, d0
fcsel d0, d1, d0, gt
mov x1, x1
ENDP
|#_asm_generic3parm| PROC
mov x1, x1
stp fp, lr, [sp, #-16]! ; input: r0 last, r1=second to last, r2=third to last
mov fp, sp
mov x3, x0 ; r0 (last parameter) -> r3
mov x0, 0xdead ; r0 is first parm (context)
movk x0, 0xbeef, lsl 16
movk x0, 0xbeef, lsl 32
mov x4, 0xdead
movk x4, 0xbeef, lsl 16
movk x4, 0xbeef, lsl 32
mov x5, x1 ; swap x1/x2
mov x1, x2
mov x2, x5
blr x4
ldp fp, lr, [sp], #16
mov x1, x1
ENDP
|#_asm_generic3parm_retd| PROC
mov x1, x1
stp fp, lr, [sp, #-16]! ; input: r0 last, r1=second to last, r2=third to last
mov fp, sp
mov x3, x0 ; r0 (last parameter) -> r3
mov x0, 0xdead ; r0 is first parm (context)
movk x0, 0xbeef, lsl 16
movk x0, 0xbeef, lsl 32
mov x4, 0xdead
movk x4, 0xbeef, lsl 16
movk x4, 0xbeef, lsl 32
mov x5, x1 ; // swap x1/x2
mov x1, x2
mov x2, x5
blr x4
ldp fp, lr, [sp], #16
mov x1, x1
ENDP
|#_asm_generic2parm| PROC
mov x1, x1
stp fp, lr, [sp, #-16]! ; input: r0 last, r1=second to last
mov fp, sp
mov x2, x0
mov x0, 0xdead ; r0 is first parm (context)
movk x0, 0xbeef, lsl 16
movk x0, 0xbeef, lsl 32
mov x4, 0xdead
movk x4, 0xbeef, lsl 16
movk x4, 0xbeef, lsl 32
blr x4
ldp fp, lr, [sp], #16
mov x1, x1
ENDP
|#_asm_generic2parm_retd| PROC
mov x1, x1
stp fp, lr, [sp, #-16]! ; input: r0 last, r1=second to last
mov fp, sp
mov x2, x0
mov x0, 0xdead ; r0 is first parm (context)
movk x0, 0xbeef, lsl 16
movk x0, 0xbeef, lsl 32
mov x4, 0xdead
movk x4, 0xbeef, lsl 16
movk x4, 0xbeef, lsl 32
blr x4
ldp fp, lr, [sp], #16
mov x1, x1
ENDP
|#_asm_generic2xparm_retd| PROC
mov x1, x1
stp fp, lr, [sp, #-16]! ; input: r0 last, r1=second to last
mov fp, sp
mov x2, x1
mov x3, x0
mov x0, 0xdead ; r0 is first parm (context)
movk x0, 0xbeef, lsl 16
movk x0, 0xbeef, lsl 32
mov x1, 0xdead ; second parm
movk x1, 0xbeef, lsl 16
movk x1, 0xbeef, lsl 32
mov x4, 0xdead
movk x4, 0xbeef, lsl 16
movk x4, 0xbeef, lsl 32
blr x4
ldp fp, lr, [sp], #16
mov x1, x1
ENDP
|#_asm_generic1parm| PROC
mov x1, x1
stp fp, lr, [sp, #-16]!
mov fp, sp
mov x1, x0
mov x0, 0xdead ; r0 is first parm (context)
movk x0, 0xbeef, lsl 16
movk x0, 0xbeef, lsl 32
mov x4, 0xdead
movk x4, 0xbeef, lsl 16
movk x4, 0xbeef, lsl 32
blr x4
ldp fp, lr, [sp], #16
mov x1, x1
ENDP
|#_asm_generic1parm_retd| PROC
mov x1, x1
stp fp, lr, [sp, #-16]!
mov fp, sp
mov x1, x0
mov x0, 0xdead ; // r0 is first parm (context)
movk x0, 0xbeef, lsl 16
movk x0, 0xbeef, lsl 32
mov x4, 0xdead
movk x4, 0xbeef, lsl 16
movk x4, 0xbeef, lsl 32
blr x4
ldp fp, lr, [sp], #16
mov x1, x1
ENDP
|#_asm_megabuf| PROC
mov x1, x1
add x0, x20, #-8
ldr d1, [x0]
fadd d0, d0, d1
fcvtzu w3, d0
asr w2, w3, (NSEEL_RAM_ITEMSPERBLOCK_LOG2 - 3)
bic w2, w2, #7 ; r2 is page index*8
mov w0, (NSEEL_RAM_BLOCKS * 8)
cmp w2, w0
bhs |mbchk1|
add x2, x2, x20
ldr x2, [x2]
cmp x2, #0
beq |mbchk1|
mov x0, (NSEEL_RAM_ITEMSPERBLOCK - 1)
and x3, x3, x0 ; r3 mask item in slot
add x0, x2, x3, lsl #3 ; set result
b |mbchk2|
|mbchk1|
mov x2, 0xdead
movk x2, 0xbeef, lsl 16
movk x2, 0xbeef, lsl 32
stp fp, lr, [sp, #-16]!
mov fp, sp
mov x0, x20 ; first parameter: blocks
mov x1, x3 ; second parameter: slot index
blr x2
ldp fp, lr, [sp], #16
|mbchk2|
mov x1, x1
ENDP
|#_asm_gmegabuf| PROC
mov x1, x1
add x2, x20, #-8
ldr d1, [x2]
mov x0, 0xdead
movk x0, 0xbeef, lsl 16
movk x0, 0xbeef, lsl 32
mov x2, 0xdead
movk x2, 0xbeef, lsl 16
movk x2, 0xbeef, lsl 32
fadd d0, d0, d1
fcvtzu w1, d0
stp fp, lr, [sp, #-16]!
mov fp, sp
blr x2
ldp fp, lr, [sp], #16
mov x1, x1
ENDP
|#nseel_asm_fcall| PROC
mov x1, x1
mov x0, 0xdead
movk x0, 0xbeef, lsl 16
movk x0, 0xbeef, lsl 32
stp fp, lr, [sp, #-16]!
mov fp, sp
blr x0
ldp fp, lr, [sp], #16
mov x1, x1
ENDP
|#nseel_asm_stack_push| PROC
mov x1, x1
ldr d0, [x0]
mov x3, 0xdead ; r3 is stack
movk x3, 0xbeef, lsl 16
movk x3, 0xbeef, lsl 32
ldr x0, [x3]
add x0, x0, #8
mov x2, 0xdead
movk x2, 0xbeef, lsl 16
movk x2, 0xbeef, lsl 32
and x0, x0, x2
mov x2, 0xdead
movk x2, 0xbeef, lsl 16
movk x2, 0xbeef, lsl 32
orr x0, x0, x2
str x0, [x3]
str d0, [x0]
mov x1, x1
ENDP
|#nseel_asm_stack_pop| PROC
mov x1, x1
mov x3, 0xdead ; r3 is stack
movk x3, 0xbeef, lsl 16
movk x3, 0xbeef, lsl 32
ldr x1, [x3]
ldr d0, [x1]
sub x1, x1, #8
mov x2, 0xdead
movk x2, 0xbeef, lsl 16
movk x2, 0xbeef, lsl 32
str d0, [x0]
and x1, x1, x2
mov x2, 0xdead
movk x2, 0xbeef, lsl 16
movk x2, 0xbeef, lsl 32
orr x1, x1, x2
str x1, [x3]
mov x1, x1
ENDP
|#nseel_asm_stack_pop_fast| PROC
mov x1, x1
mov x3, 0xdead ; r3 is stack
movk x3, 0xbeef, lsl 16
movk x3, 0xbeef, lsl 32
ldr x1, [x3]
mov x0, x1
sub x1, x1, #8
mov x2, 0xdead
movk x2, 0xbeef, lsl 16
movk x2, 0xbeef, lsl 32
and x1, x1, x2
mov x2, 0xdead
movk x2, 0xbeef, lsl 16
movk x2, 0xbeef, lsl 32
orr x1, x1, x2
str x1, [x3]
mov x1, x1
ENDP
|#nseel_asm_stack_peek| PROC
mov x1, x1
mov x3, 0xdead ; r3 is stack
movk x3, 0xbeef, lsl 16
movk x3, 0xbeef, lsl 32
fcvtzs w2, d0
ldr x1, [x3]
sub x1, x1, x2, lsl #3
mov x2, 0xdead
movk x2, 0xbeef, lsl 16
movk x2, 0xbeef, lsl 32
and x1, x1, x2
mov x2, 0xdead
movk x2, 0xbeef, lsl 16
movk x2, 0xbeef, lsl 32
orr x0, x1, x2
mov x1, x1
ENDP
|#nseel_asm_stack_peek_top| PROC
mov x1, x1
mov x3, 0xdead ; r3 is stack
movk x3, 0xbeef, lsl 16
movk x3, 0xbeef, lsl 32
ldr x0, [x3]
mov x1, x1
ENDP
|#nseel_asm_stack_peek_int| PROC
mov x1, x1
mov x3, 0xdead ; r3 is stack
movk x3, 0xbeef, lsl 16
movk x3, 0xbeef, lsl 32
mov x2, 0xdead
movk x2, 0xbeef, lsl 16
movk x2, 0xbeef, lsl 32
ldr x1, [x3]
sub x1, x1, x2
mov x2, 0xdead
movk x2, 0xbeef, lsl 16
movk x2, 0xbeef, lsl 32
and x1, x1, x2
mov x2, 0xdead
movk x2, 0xbeef, lsl 16
movk x2, 0xbeef, lsl 32
orr x0, x1, x2
mov x1, x1
ENDP
|#nseel_asm_stack_exch| PROC
mov x1, x1
mov x3, 0xdead ; r3 is stack
movk x3, 0xbeef, lsl 16
movk x3, 0xbeef, lsl 32
ldr x1, [x3]
ldr d0, [x0]
ldr d1, [x1]
str d0, [x1]
str d1, [x0]
mov x1, x1
ENDP
|#nseel_asm_booltofp| PROC
mov x1, x1
cmp w0, #0
fmov d0, #1.0
movi d1, #0
fcsel d0, d0, d1, ne
mov x1, x1
ENDP
|#nseel_asm_fptobool| PROC
mov x1, x1
ldr d1, [x21]
fabs d0, d0
fcmp d0, d1
cset w0, ge
mov x1, x1
ENDP
|#nseel_asm_fptobool_rev| PROC
mov x1, x1
ldr d1, [x21]
fabs d0, d0
fcmp d0, d1
cset w0, lt
mov x1, x1
ENDP
|#eel_callcode64| PROC
stp fp, lr, [sp, #-128]!
mov fp, sp
stp d13, d12, [sp, #16]
stp d11, d10, [sp, #32]
stp d9, d8, [sp, #48]
stp d15, d14, [sp, #64]
stp x20, x19, [sp, #80]
stp x22, x21, [sp, #96]
mov x19, x0
mov x20, x2
mov x21, x3
blr x1
ldp d13, d12, [sp, #16]
ldp d11, d10, [sp, #32]
ldp d9, d8, [sp, #48]
ldp d15, d14, [sp, #64]
ldp x20, x19, [sp, #80]
ldp x22, x21, [sp, #96]
ldp fp, lr, [sp], #128
ret
ENDP
|#glue_getscr| PROC
mrs x0, FPCR
ret
ENDP
|#glue_setscr| PROC
msr FPCR, x0
ret
ENDP
END