109 lines
4.8 KiB
Text
109 lines
4.8 KiB
Text
/* ARM assembly AARCH64 Raspberry PI 3B */
|
|
/* program nroot64.s */
|
|
/* link with gcc. Use C function for display float */
|
|
|
|
/*******************************************/
|
|
/* Constantes file */
|
|
/*******************************************/
|
|
/* for this file see task include a file in language AArch64 assembly*/
|
|
.include "../includeConstantesARM64.inc"
|
|
|
|
/*******************************************/
|
|
/* Initialized data */
|
|
/*******************************************/
|
|
.data
|
|
szFormat1: .asciz "Root= %+09.15f\n"
|
|
.align 4
|
|
qNumberA: .quad 1024
|
|
/*******************************************/
|
|
/* UnInitialized data */
|
|
/*******************************************/
|
|
.bss
|
|
.align 4
|
|
/*******************************************/
|
|
/* code section */
|
|
/*******************************************/
|
|
.text
|
|
.global main
|
|
main: // entry of program
|
|
|
|
/* root 10ieme de 1024 */
|
|
ldr x0,qAdriNumberA // number address
|
|
ldr d0,[x0] // load number in registre d0
|
|
scvtf d0,d0 // conversion in float
|
|
mov x0,#10 // N
|
|
bl nthRoot
|
|
ldr x0,qAdrszFormat1 // format
|
|
bl printf // call C function !!!
|
|
// Attention register dn lost !!!
|
|
/* square root of 2 */
|
|
fmov d0,2 // conversion 2 in float register d0
|
|
mov x0,#2 // N
|
|
bl nthRoot
|
|
ldr x0,qAdrszFormat1 // format
|
|
// d0 contains résult
|
|
bl printf // call C function !!!
|
|
|
|
100: // standard end of the program
|
|
mov x0, #0 // return code
|
|
mov x8, #EXIT // request to exit program
|
|
svc 0 // perform the system call
|
|
|
|
qAdrszFormat1: .quad szFormat1
|
|
qAdriNumberA: .quad qNumberA
|
|
|
|
/******************************************************************/
|
|
/* compute nth root */
|
|
/******************************************************************/
|
|
/* x0 contains N */
|
|
/* d0 contains the value */
|
|
/* x0 return result */
|
|
nthRoot:
|
|
stp x1,lr,[sp,-16]! // save registers
|
|
stp x2,x3,[sp,-16]! // save registers
|
|
stp d1,d2,[sp,-16]! // save float registers
|
|
stp d3,d4,[sp,-16]! // save float registers
|
|
stp d5,d6,[sp,-16]! // save float registers
|
|
stp d7,d8,[sp,-16]! // save float registers
|
|
fmov d6,x0 //
|
|
scvtf d6,d6 // N conversion in float double précision (64 bits)
|
|
sub x1,x0,#1 // N - 1
|
|
fmov d8,x1 //
|
|
scvtf d4,d8 //conversion in float double précision
|
|
fmov d2,d0 // a = A
|
|
fdiv d3,d0,d6 // b = A/n
|
|
adr x2,dfPrec // load précision
|
|
ldr d8,[x2]
|
|
1: // begin loop
|
|
fmov d2,d3 // a <- b
|
|
fmul d5,d3,d4 // (N-1)*b
|
|
|
|
fmov d1,1 // constante 1 -> float
|
|
mov x2,0 // loop indice
|
|
2: // compute pow (n-1)
|
|
fmul d1,d1,d3 //
|
|
add x2,x2,1
|
|
cmp x2,x1 // n -1 ?
|
|
blt 2b // no -> loop
|
|
fdiv d7,d0,d1 // A / b pow (n-1)
|
|
fadd d7,d7,d5 // + (N-1)*b
|
|
fdiv d3,d7,d6 // / N -> new b
|
|
fsub d1,d3,d2 // compute gap
|
|
fabs d1,d1 // absolute value
|
|
fcmp d1,d8 // compare float maj FPSCR
|
|
bgt 1b // if gap > précision -> loop
|
|
fmov d0,d3 // end return result in d0
|
|
100:
|
|
ldp d7,d8,[sp],16 // restaur 2 float registers
|
|
ldp d5,d6,[sp],16 // restaur 2 float registers
|
|
ldp d3,d4,[sp],16 // restaur 2 float registers
|
|
ldp d1,d2,[sp],16 // restaur 2 float registers
|
|
ldp x2,x3,[sp],16 // restaur 2 registers
|
|
ldp x1,lr,[sp],16 // restaur 2 registers
|
|
ret // return to address lr x30
|
|
dfPrec: .double 0f1E-10 // précision
|
|
/********************************************************/
|
|
/* File Include fonctions */
|
|
/********************************************************/
|
|
/* for this file see task include a file in language AArch64 assembly */
|
|
.include "../includeARM64.inc"
|