mirror of
https://github.com/pkivolowitz/asm_book.git
synced 2026-06-23 15:36:45 +08:00
links
This commit is contained in:
parent
bba8356515
commit
6ba7a1c60d
2 changed files with 167 additions and 0 deletions
103
section_2/float/asm_rounding.S
Normal file
103
section_2/float/asm_rounding.S
Normal 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
|
||||||
64
section_2/float/literals.S
Normal file
64
section_2/float/literals.S
Normal 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
|
||||||
Loading…
Reference in a new issue