This commit is contained in:
Perry Kivolowitz 2023-04-06 18:53:40 -05:00
parent bba8356515
commit 6ba7a1c60d
2 changed files with 167 additions and 0 deletions

View file

@ -0,0 +1,103 @@
#include "apple-linux-convergence.S"
GLABEL main
.text
.align 2
dless .req d20
dmore .req d21
ndless .req d22
ndmore .req d23
Emit:
START_PROC
PUSH_P x29, x30
mov x29, sp
#if defined(__APPLE__)
PUSH_P x1, x2
CRT printf
add sp, sp, 16
#else
CRT printf
#endif
POP_P x29, x30
ret
END_PROC
MAIN
START_PROC
PUSH_P x29, x30
stp dless, dmore, [sp, -16]!
stp ndless, ndmore, [sp, -16]!
mov x29, sp
LLD_ADDR x0, leg
CRT printf
LLD_ADDR x0, vless
ldr dless, [x0]
ldr dmore, [x0, 8]
ldr ndless, [x0, 16]
ldr ndmore, [x0, 24]
//-fcvtps- Floating-point Convert to Signed integer, rounding toward Plus infinity
fcvtps x1, dless
fcvtps x2, dmore
LLD_ADDR x0, fmt1
bl Emit
fcvtps x1, ndless
fcvtps x2, ndmore
LLD_ADDR x0, fmt1
bl Emit
//-fcvtns- Floating-point Convert to Signed integer, rounding to nearest with ties to even (scalar).
fcvtns x1, dless
fcvtns x2, dmore
LLD_ADDR x0, fmt2
bl Emit
fcvtns x1, ndless
fcvtns x2, ndmore
LLD_ADDR x0, fmt2
bl Emit
//-fcvtzs- Floating-point Convert to Signed integer, rounding toward Zero (scalar).
fcvtzs x1, dless
fcvtzs x2, dmore
LLD_ADDR x0, fmt4
bl Emit
fcvtzs x1, ndless
fcvtzs x2, ndmore
LLD_ADDR x0, fmt4
bl Emit
//-fcvtas- Floating-point Convert to Signed integer, rounding to nearest with ties to Away (scalar).
fcvtas x1, dless
fcvtas x2, dmore
LLD_ADDR x0, fmt3
bl Emit
fcvtas x1, ndless
fcvtas x2, ndmore
LLD_ADDR x0, fmt3
bl Emit
//------------------------------
ldp ndless, ndmore, [sp], 16
ldp dless, dmore, [sp], 16
POP_P x29, x30
mov w0, wzr
ret
END_PROC
.data
vless: .double 5.49
vmore: .double 5.51
nvless: .double -5.49
nvmore: .double -5.51
fmt1: .asciz "fcvtps less: %d more: %d\n"
fmt2: .asciz "fcvtns less: %d more: %d\n"
fmt3: .asciz "fcvtta less: %d more: %d\n"
fmt4: .asciz "fcvtzs less: %d more: %d\n"
leg: .asciz "less values are +/- 5.49. more values are +/- 5.51.\n"
.end

View file

@ -0,0 +1,64 @@
#include "apple-linux-convergence.S"
GLABEL main
.text
.p2align 2
counter .req x20
dptr .req x21
fptr .req x22
.equ max, 4
MAIN
START_PROC
PUSH_P counter, x30
PUSH_P dptr, fptr
PUSH_R x29
mov x29, sp
LLD_ADDR dptr, d
LLD_ADDR fptr, f
mov counter, xzr
1: cmp counter, max
beq 2f
ldr d0, [dptr, counter, lsl 3]
ldr s1, [fptr, counter, lsl 2]
fcvt d1, s1
LLD_ADDR x0, fmt
add counter, counter, 1
mov x1, counter
#if defined(__APPLE__)
/*
Give us some stack space. Then read the printf template
string right to left. Variadics on the Mac are difficult
to get right. Remember that printf never prints floats.
Only doubles. Internally, floats are converted to double.
See the fcvt instruction above.
*/
sub sp, sp, 32
str d1, [sp, 16]
str d0, [sp, 8]
str x1, [sp]
CRT printf
add sp, sp, 32
#else
CRT printf
#endif
b 1b
2: POP_R x29
POP_P dptr, fptr
POP_P counter, x30
mov w0, wzr
END_PROC
ret
.data
fmt: .asciz "index %ld double %f float %f\n"
.p2align 3
d: .double 1.555555, 2.666666, 3.777777, 4.888888
.p2align 2
f: .float 1.111111, 2.222222, 3.333333, 4.444444
.end