Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.programming > #13964 > unrolled thread
| Started by | Branimir Maksimovic <branimir.maksimovic@icloud.com> |
|---|---|
| First post | 2021-10-03 19:23 +0000 |
| Last post | 2022-01-05 00:24 -0800 |
| Articles | 2 — 2 participants |
Back to article view | Back to comp.programming
aarch64 nbody bench (done without debugger) Branimir Maksimovic <branimir.maksimovic@icloud.com> - 2021-10-03 19:23 +0000
Re: aarch64 nbody bench (done without debugger) Härra Ramob <hrramob@gmail.com> - 2022-01-05 00:24 -0800
| From | Branimir Maksimovic <branimir.maksimovic@icloud.com> |
|---|---|
| Date | 2021-10-03 19:23 +0000 |
| Subject | aarch64 nbody bench (done without debugger) |
| Message-ID | <vqn6J.9345$fZ.8099@fx06.iad> |
SIZEOFBODY = 64
PI = 0x400921FB54442D18;3.141592653589793;
DAYS_PER_YEAR = 0x4076D3D70A3D70A4;365.24;
SOLAR_MASS = 0x4043bd3cc9be45de ; 4 * PI * PI
.set diff.dx,0
.set diff.dy,8
.set diff.dz,16
.set body.x,0
.set body.y,8
.set body.z,16
.set body.vx,24
.set body.vy,32
.set body.vz,40
.set body.mass,48
.macro init_body b, x,y,z,vx,vy,vz,mass,index
ldr x0,=\x
fmov d0,x0
ldr x0,=\y
fmov d1,x0
ldr x0,=\z
fmov d2,x0
adrp x2,bodyx@PAGE
add x2,x2,bodyx@PAGEOFF
adrp x3,bodyy@PAGE
add x3,x3,bodyy@PAGEOFF
adrp x4,bodyz@PAGE
add x4,x4,bodyz@PAGEOFF
mov x1,\index
adrp x0,\b@PAGE
add x0,x0,\b@PAGEOFF
str d0,[x0,body.x]
str d1,[x0,body.y]
str d2,[x0,body.z]
str d0,[x2,x1, lsl 3]
str d1,[x3,x1, lsl 3]
str d2,[x4,x1, lsl 3]
adrp x2,bodyvx@PAGE
add x2,x2,bodyvx@PAGEOFF
adrp x3,bodyvy@PAGE
add x3,x3,bodyvy@PAGEOFF
adrp x4,bodyvz@PAGE
add x4,x4,bodyvz@PAGEOFF
ldr x0,=DAYS_PER_YEAR
fmov d0,x0
ldr x0,=\vx
fmov d1,x0
ldr x0,=\vy
fmov d2,x0
ldr x0,=\vz
fmov d3,x0
fmul d1,d1,d0
fmul d2,d2,d0
fmul d3,d3,d0
adrp x0,\b@PAGE
add x0,x0,\b@PAGEOFF
str d1,[x0,body.vx]
str d2,[x0,body.vy]
str d3,[x0,body.vz]
str d1,[x2,x1, lsl 3]
str d2,[x3,x1, lsl 3]
str d3,[x4,x1, lsl 3]
ldr x0,=SOLAR_MASS
fmov d0,x0
ldr x0,=\mass
fmov d1,x0
fmul d1,d1,d0
adrp x0,\b@PAGE
add x0,x0,\b@PAGEOFF
adrp x2,bodymass@PAGE
add x2,x2,bodymass@PAGEOFF
str d1,[x0,body.mass]
str d1,[x2,x1, lsl 3]
.endm
.macro advance label
; v15 holds dt
mov x2,4; x2 -> i
mov x4,xzr
mov x1,xzr
adrp x10,bodyx@PAGE
add x10,x10,bodyx@PAGEOFF
adrp x11,bodyy@PAGE
add x11,x11,bodyy@PAGEOFF
adrp x12,bodyz@PAGE
add x12,x12,bodyz@PAGEOFF
adrp x13,diffx@PAGE
add x13,x13,diffx@PAGEOFF
adrp x14,diffy@PAGE
add x14,x14,diffy@PAGEOFF
adrp x15,diffz@PAGE
add x15,x15,diffz@PAGEOFF
adrp x16,bodyvx@PAGE
add x16,x16,bodyvx@PAGEOFF
adrp x17,bodyvy@PAGE
add x17,x17,bodyvy@PAGEOFF
adrp x18,bodyvz@PAGE
add x18,x18,bodyvz@PAGEOFF
L0\label:
mov x9,x2 ; x9 -> j
mov x3,x1
add x3,x3,8
L1\label:
cmp x9,1
beq LF1\label
ldr x0,[x10,x1]
dup.2d v0,x0
ldr x0,[x11,x1]
dup.2d v1,x0
ldr x0,[x12,x1]
dup.2d v2,x0
ldr q3,[x10,x3]
ldr q4,[x11,x3]
ldr q5,[x12,x3]
fsub.2d v0,v0,v3 ; dx -> v0
fsub.2d v1,v1,v4 ; dy -> v1
fsub.2d v2,v2,v5 ; dz -> v2
str q0,[x13,x4]
str q1,[x14,x4]
str q2,[x15,x4]
add x4,x4,16
add x3,x3,16
subs x9,x9,2
b Ldskip1\label
LF1\label:
ldr d0,[x10,x1]
ldr d1,[x11,x1]
ldr d2,[x12,x1]
ldr d3,[x10,x3]
ldr d4,[x11,x3]
ldr d5,[x12,x3]
fsub d0,d0,d3 ; dx -> d0
fsub d1,d1,d4 ; dy -> d1
fsub d2,d2,d5 ; dz -> d2
str d0,[x13,x4]
str d1,[x14,x4]
str d2,[x15,x4]
add x4,x4,8
add x3,x3,8
subs x9,x9,1
Ldskip1\label:
bgt L1\label
add x1,x1,8
subs x2,x2,1
bgt L0\label
;-----------------------------------
mov x2,5
mov x5,xzr
adrp x4,mag@PAGE
add x4,x4,mag@PAGEOFF
L2\label:
ldr q3,[x13,x5]
ldr q4,[x14,x5]
ldr q5,[x15,x5]
mov v6.16b,v15.16b
fmul.2d v3,v3,v3
fmla.2d v3,v4,v4
fmla.2d v3,v5,v5
fsqrt.2d v7,v3
fmul.2d v3,v3,v7
fdiv.2d v6,v6,v3
str q6,[x4]
add x4,x4,16
add x5,x5,16
subs x2,x2,1
bgt L2\label
;-----------------------------------------------
mov x2,4
mov x9,xzr
mov x5,xzr
adrp x4,mag@PAGE
add x4,x4,mag@PAGEOFF
adrp x6,bodymass@PAGE
add x6,x6,bodymass@PAGEOFF
L3\label:
mov x7,x2
mov x8,x9
add x8,x8,8
L4\label:
cmp x7,1
beq LF3\label
ldr q6,[x6,x8]
ldr q5,[x4]
fmul.2d v6,v6,v5
ldr q10,[x13,x5]
ldr q11,[x14,x5]
ldr q12,[x15,x5]
ldr d3,[x16,x9]
ldr d4,[x17,x9]
ldr d5,[x18,x9]
mov v7.16b,v10.16b
mov v8.16b,v11.16b
mov v9.16b,v12.16b
fmul.2d v7,v7,v6
fmul.2d v8,v8,v6
fmul.2d v9,v9,v6
mov v22.d[0],v7.d[0]
mov v23.d[0],v7.d[1]
mov v22.d[1],v8.d[0]
mov v23.d[1],v8.d[1]
mov d20,v9[0]
mov d21,v9[1]
fmov x23,d3
fmov x24,d4
mov v24.d[0],x23
mov v24.d[1],x24
fadd.2d v7,v22,v23
fadd d9,d20,d21
fsub.2d v24,v24,v7
fsub d5,d5,d9
mov d3,v24[0]
mov d4,v24[1]
str d3,[x16,x9]
str d4,[x17,x9]
str d5,[x18,x9]
; iBody.vx -= dx * bodies[j].mass * mag;
; ----------------------------------------------
ldr x0,[x6,x9]
dup.2d v7,x0
ldr q6,[x4]
fmul.2d v7,v7,v6
ldr q3,[x16,x8]
ldr q4,[x17,x8]
ldr q5,[x18,x8]
mov v0.16b,v10.16b
mov v1.16b,v11.16b
mov v2.16b,v12.16b
fmla.2d v3,v0,v7
fmla.2d v4,v1,v7
fmla.2d v5,v2,v7
str q3,[x16,x8]
str q4,[x17,x8]
str q5,[x18,x8]
; bodies[j].vx += dx * iBody.mass * mag;
add x5,x5,16
add x4,x4,16
add x8,x8,16
subs x7,x7,2
b Lmskip1\label
LF3\label:
ldr d6,[x6,x8]
ldr d5,[x4]
fmul d6,d6,d5
ldr d10,[x13,x5]
ldr d11,[x14,x5]
ldr d12,[x15,x5]
ldr d3,[x16,x9]
ldr d4,[x17,x9]
ldr d5,[x18,x9]
fmov d7,d10
fmov d8,d11
fmov d9,d12
fmsub d3,d7,d6,d3
fmsub d4,d8,d6,d4
fmsub d5,d9,d6,d5
str d3,[x16,x9]
str d4,[x17,x9]
str d5,[x18,x9]
; iBody.vx -= dx * bodies[j].mass * mag;
; ----------------------------------------------
ldr d7,[x6,x9]
ldr d6,[x4]
fmul d7,d7,d6
ldr d3,[x16,x8]
ldr d4,[x17,x8]
ldr d5,[x18,x8]
fmov d0,d10
fmov d1,d11
fmov d2,d12
fmadd d3,d0,d7,d3
fmadd d4,d1,d7,d4
fmadd d5,d2,d7,d5
str d3,[x16,x8]
str d4,[x17,x8]
str d5,[x18,x8]
; bodies[j].vx += dx * iBody.mass * mag;
add x5,x5,8
add x4,x4,8
add x8,x8,8
subs x7,x7,1
;-----------------------------------------
Lmskip1\label:
bgt L4\label
add x9,x9,8
subs x2,x2,1
bgt L3\label
mov x9,xzr
mov x2,5
L5\label:
cmp x2,1
bne LF2\label
ldr d0,[x10,x9]
ldr d1,[x11,x9]
ldr d2,[x12,x9]
dup d3,v15[0]
fmov d4,d3
fmov d5,d3
ldr d6,[x16,x9]
ldr d7,[x17,x9]
ldr d8,[x18,x9]
fmadd d0,d3,d6,d0
fmadd d1,d4,d7,d1
fmadd d2,d5,d8,d2
str d0,[x10,x9]
str d1,[x11,x9]
str d2,[x12,x9]
add x9,x9,8
subs x2,x2,1
b Lkskip1\label
LF2\label:
ldr q0,[x10,x9]
ldr q1,[x11,x9]
ldr q2,[x12,x9]
mov v3.16b,v15.16b
mov v4.16b,v3.16b
mov v5.16b,v3.16b
ldr q6,[x16,x9]
ldr q7,[x17,x9]
ldr q8,[x18,x9]
fmla.2d v0,v3,v6
fmla.2d v1,v4,v7
fmla.2d v2,v5,v8
str q0,[x10,x9]
str q1,[x11,x9]
str q2,[x12,x9]
add x9,x9,16
subs x2,x2,2
Lkskip1\label:
bgt L5\label
.endm
.text
.align 4
.global _main
_main:
str x30,[sp,-16]!
mov x8,1
adrp x9,n@PAGE
str x8,[x9,n@PAGEOFF]
; x0 - > argc , x1 -> argv
cmp x0,2
blt .begin
ldr x0,[x1,8]
bl _atoi
adrp x9,n@PAGE
str x0,[x9,n@PAGEOFF]
mov x8,x0
adrp x0,argv@PAGE
add x0,x0,argv@PAGEOFF
sub sp,sp,16
str x8,[sp]
bl _printf
add sp,sp,16
.begin:
;-------------
;init_body sun,0.0,0.0,0.0,0.0,0.0,0.0,1.0
init_body sun,0,0,0,0,0,0,0x3FF0000000000000, 0
;init_body jupiter,4.84143144246472090e+00, -1.16032004402742839e+00, -1.03622044471123109e-01, 1.66007664274403694e-03, 7.69901118419740425e-03, -6.90460016972063023e-05, 9.54791938424326609e-04
init_body jupiter,0x40135DA0343CD92C, 0xBFF290ABC01FDB7C, 0xBFBA86F96C25EBF0, 0x3F5B32DDB8EC9209, 0x3F7F88FF93F670B6, 0xBF12199946DEBD80,0x3F4F49601333C135, 1
;init_body saturn,8.34336671824457987e+00, 4.12479856412430479e+00, -4.03523417114321381e-01, -2.76742510726862411e-03, 4.99852801234917238e-03, 2.30417297573763929e-05, 2.85885980666130812e-04;
init_body saturn, 0x4020afcdc332ca67,0x40107fcb31de01b0,0xbfd9d353e1eb467c,0xbf66abb60a8e1d76,0x3f747956257578b8,0x3ef829379cad4ac0,0x3f32bc5eeff5e6f8, 2
;init_body uranus,1.28943695621391310e+01, -1.51111514016986312e+01, -2.23307578892655734e-01, 2.96460137564761618e-03, 2.37847173959480950e-03, -2.96589568540237556e-05, 4.36624404335156298e-05
init_body uranus,0x4029c9eacea7d9cf,0xc02e38e8d626667e,0xbfcc9557be257da0,0x3f6849383e87d954,0x3f637c044ac0ace1,0xbeff1983fedbfaa0,0x3f06e44607a13bd6, 3
;init_body neptune,1.53796971148509165e+01, -2.59193146099879641e+01, 1.79258772950371181e-01, 2.68067772490389322e-03, 1.62824170038242295e-03, -9.51592254519715870e-05, 5.15138902046611451e-05;
init_body neptune,0x402ec267a905572a,0xc039eb5833c8a220,0x3fc6f1f393abe540,0x3f65f5c9e51b4320,0x3f5aad5736999d88,0xbf18f2070b7f9750,0x3f0b0213ca2d0eec, 4
mov x0,xzr
fmov d0,x0
fmov d1,x0
fmov d2,x0
adrp x1,sun@PAGE
add x1,x1,sun@PAGEOFF
mov x2,5
; init
; ----------------------------------
.L0main:
ldr d3,[x1,body.vx]
ldr d4,[x1,body.mass]
fmul d3,d3,d4
fadd d0,d0,d3
ldr d3,[x1,body.vy]
ldr d4,[x1,body.mass]
fmul d3,d3,d4
fadd d1,d1,d3
ldr d3,[x1,body.vz]
ldr d4,[x1,body.mass]
fmul d3,d3,d4
fadd d2,d2,d3
add x1,x1,SIZEOFBODY
subs x2,x2,1
bgt .L0main
adrp x1,sun@PAGE
add x1,x1,sun@PAGEOFF
mov x0,xzr
bl offset_momentum
; ----------------------------------------
bl energy
fmov x21,d0
adrp x20,n@PAGE
ldr x20,[x20,n@PAGEOFF]
ldr x0,=0x3F847AE147AE147B;0.01
dup.2d v15,x0
.L1main:
cmp x20,20
blt lo
advance A
advance B
advance C
advance D
advance E
advance F
advance G
advance H
advance I
advance J
advance 01
advance 02
advance 03
advance 04
advance 05
advance 06
advance 07
advance 08
advance 09
advance 10
subs x20,x20,20
bgt .L1main
b Lskip
lo:
advance K
subs x20,x20,1
bgt lo
Lskip:
bl energy
fmov x22,d0
adrp x1,sun@PAGE
add x1,x1,sun@PAGEOFF
mov x0,xzr
bl print_body
adrp x1,jupiter@PAGE
add x1,x1,jupiter@PAGEOFF
mov x0,1
bl print_body
adrp x1,saturn@PAGE
add x1,x1,saturn@PAGEOFF
mov x0,2
bl print_body
adrp x1,uranus@PAGE
add x1,x1,uranus@PAGEOFF
mov x0,3
bl print_body
adrp x1,neptune@PAGE
add x1,x1,neptune@PAGEOFF
mov x0,4
bl print_body
fmov d0,x21
bl print_energy
fmov d0,x22
bl print_energy
ldr x30,[sp],16
ret
; px d0 , py d1 , pz d2, x1 body , x0 index
offset_momentum:
mov x9,x0
ldr x0,=0x8000000000000000
fmov x8,d0
eor x8,x8,x0
fmov d0,x8
fmov x8,d1
eor x8,x8,x0
fmov d1,x8
fmov x8,d2
eor x8,x8,x0
fmov d2,x8
ldr x0,=SOLAR_MASS
fmov d3,x0
fdiv d0,d0,d3
fdiv d1,d1,d3
fdiv d2,d2,d3
str d0,[x1,body.vx]
str d1,[x1,body.vy]
str d2,[x1,body.vz]
adrp x10,bodyvx@PAGE
add x10,x10,bodyvx@PAGEOFF
adrp x11,bodyvy@PAGE
add x11,x11,bodyvy@PAGEOFF
adrp x12,bodyvz@PAGE
add x12,x12,bodyvz@PAGEOFF
str d0,[x10,x9,lsl 3]
str d1,[x11,x9,lsl 3]
str d2,[x12,x9,lsl 3]
ret
print_body:
sub sp,sp,16
stp x19,x30,[sp],-128
mov x19,x0
adrp x0,bmsg@PAGE
add x0,x0,bmsg@PAGEOFF
ldr d0,[x1,body.x]
ldr d1,[x1,body.y]
ldr d2,[x1,body.z]
ldr d3,[x1,body.vx]
ldr d4,[x1,body.vy]
ldr d5,[x1,body.vz]
ldr d6,[x1,body.mass]
str d0,[sp]
str d1,[sp,8]
str d2,[sp,16]
str d3,[sp,24]
str d4,[sp,32]
str d5,[sp,40]
str d6,[sp,48]
bl _printf
adrp x9,bodyx@PAGE
add x9,x9,bodyx@PAGEOFF
adrp x10,bodyy@PAGE
add x10,x10,bodyy@PAGEOFF
adrp x11,bodyz@PAGE
add x11,x11,bodyz@PAGEOFF
adrp x12,bodyvx@PAGE
add x12,x12,bodyvx@PAGEOFF
adrp x13,bodyvy@PAGE
add x13,x13,bodyvy@PAGEOFF
adrp x14,bodyvz@PAGE
add x14,x14,bodyvz@PAGEOFF
adrp x15,bodymass@PAGE
add x15,x15,bodymass@PAGEOFF
adrp x0,bmsg@PAGE
add x0,x0,bmsg@PAGEOFF
ldr d0,[x9,x19, lsl 3]
ldr d1,[x10,x19, lsl 3]
ldr d2,[x11,x19, lsl 3]
ldr d3,[x12,x19, lsl 3]
ldr d4,[x13,x19, lsl 3]
ldr d5,[x14,x19, lsl 3]
ldr d6,[x15,x19, lsl 3]
str d0,[sp]
str d1,[sp,8]
str d2,[sp,16]
str d3,[sp,24]
str d4,[sp,32]
str d5,[sp,40]
str d6,[sp,48]
bl _printf
ldp x19,x30,[sp,128]!
add sp,sp,16
ret
; d0 resulting energy
energy:
mov x1,xzr
mov x2,5
movi.2d v0,0
adrp x8,bodyvx@PAGE
add x8,x8,bodyvx@PAGEOFF
adrp x9,bodyvy@PAGE
add x9,x9,bodyvy@PAGEOFF
adrp x10,bodyvz@PAGE
add x10,x10,bodyvz@PAGEOFF
adrp x11,bodymass@PAGE
add x11,x11,bodymass@PAGEOFF
adrp x12,bodyx@PAGE
add x12,x12,bodyx@PAGEOFF
adrp x13,bodyy@PAGE
add x13,x13,bodyy@PAGEOFF
adrp x14,bodyz@PAGE
add x14,x14,bodyz@PAGEOFF
ldr x0,=0x3FE0000000000000 ; 0.5
.L0energy:
ldr d1,[x8,x1]
fmul d1,d1,d1
ldr d2,[x9,x1]
fmul d2,d2,d2
ldr d3,[x10,x1]
fmul d3,d3,d3
fadd d1,d1,d2
fadd d1,d1,d3
ldr d2,[x11,x1]
fmul d1,d1,d2
fmov d2,x0
fmul d2,d2,d1
fadd.2d v0,v0,v2
subs x2,x2,1
beq .L2energy
mov x18,x2
mov x3,x1
add x3,x3,8
.L1energy:
ldr x15,[x12,x1]
dup.2d v1,x15
ldr q2,[x12,x3]
fsub.2d v1,v1,v2
ldr x15,[x13,x1]
dup.2d v2,x15
ldr q3,[x13,x3]
fsub.2d v2,v2,v3
ldr x15,[x14,x1]
dup.2d v3,x15
ldr q4,[x14,x3]
fsub.2d v3,v3,v4
fmul.2d v1,v1,v1
fmul.2d v2,v2,v2
fmul.2d v3,v3,v3
fadd.2d v1,v1,v2
fadd.2d v1,v1,v3
fsqrt.2d v1,v1
ldr x15,[x11,x1]
dup.2d v2,x15
ldr q3,[x11,x3]
fmul.2d v2,v2,v3
fdiv.2d v2,v2,v1
fsub.2d v0,v0,v2
add x3,x3,16
subs x2,x2,2
bgt .L1energy
add x1,x1, 8
mov x2,x18
b .L0energy
.L2energy:
dup d1,v0[0]
dup d2,v0[1]
fadd d0,d1,d2
ret
print_energy:
sub sp,sp,16
str x30,[sp],-16
adrp x0,msg@PAGE
add x0,x0,msg@PAGEOFF
str d0,[sp]
bl _printf
ldr x30,[sp,16]!
add sp,sp,16
ret
.data
bmsg: .ascii "x: %.20f\ny: %.20f\nz: %.20f\n"
.ascii "vx: %.20f\nvy: %.20f\nvz: %.20f\n"
.asciz "mass: %.20f\n\n"
.align 8
msg: .asciz "%.9f\n"
.align 8
argv: .asciz "argv : %d\n"
.align 16
L1: .double 1.5,1.5
L2: .double 0.5,0.5
.bss
.align 16
sun: .space SIZEOFBODY
jupiter: .space SIZEOFBODY
saturn: .space SIZEOFBODY
uranus: .space SIZEOFBODY
neptune: .space SIZEOFBODY
.align 16
bodyx: .space 10*8
.align 16
bodyy: .space 10*8
.align 16
bodyz: .space 10*8
.align 16
bodyvx: .space 10*8
.align 16
bodyvy: .space 10*8
.align 16
bodyvz: .space 10*8
.align 16
bodymass: .space 10*8
.align 16
diffx: .space 10*8
.align 16
diffy: .space 10*8
.align 16
diffz: .space 10*8
.align 16
n: .space 8
.align 16
mag: .space 10*8
--
7-77-777
Evil Sinner!
to weak you should be meek, and you should brainfuck stronger
https://github.com/rofl0r/chaos-pp
[toc] | [next] | [standalone]
| From | Härra Ramob <hrramob@gmail.com> |
|---|---|
| Date | 2022-01-05 00:24 -0800 |
| Message-ID | <354bdfb2-a7e1-4911-b152-82269d382667n@googlegroups.com> |
| In reply to | #13964 |
Branimir Maksimovic kirjutas Pühapäev, 3. oktoober 2021 kl 22:23:11 UTC+3: > SIZEOFBODY = 64 > PI = 0x400921FB54442D18;3.141592653589793; > DAYS_PER_YEAR = 0x4076D3D70A3D70A4;365.24; > SOLAR_MASS = 0x4043bd3cc9be45de ; 4 * PI * PI > .set diff.dx,0 > .set diff.dy,8 > .set diff.dz,16 > .set body.x,0 > .set body.y,8 > .set body.z,16 > .set body.vx,24 > .set body.vy,32 > .set body.vz,40 > .set body.mass,48 > > .macro init_body b, x,y,z,vx,vy,vz,mass,index > ldr x0,=\x > fmov d0,x0 > ldr x0,=\y > fmov d1,x0 > ldr x0,=\z > fmov d2,x0 > > adrp x2,bodyx@PAGE > add x2,x2,bodyx@PAGEOFF > adrp x3,bodyy@PAGE > add x3,x3,bodyy@PAGEOFF > adrp x4,bodyz@PAGE > add x4,x4,bodyz@PAGEOFF > > mov x1,\index > adrp x0,\b@PAGE > add x0,x0,\b@PAGEOFF > > str d0,[x0,body.x] > str d1,[x0,body.y] > str d2,[x0,body.z] > str d0,[x2,x1, lsl 3] > str d1,[x3,x1, lsl 3] > str d2,[x4,x1, lsl 3] > adrp x2,bodyvx@PAGE > add x2,x2,bodyvx@PAGEOFF > adrp x3,bodyvy@PAGE > add x3,x3,bodyvy@PAGEOFF > adrp x4,bodyvz@PAGE > add x4,x4,bodyvz@PAGEOFF > ldr x0,=DAYS_PER_YEAR > fmov d0,x0 > ldr x0,=\vx > fmov d1,x0 > ldr x0,=\vy > fmov d2,x0 > ldr x0,=\vz > fmov d3,x0 > fmul d1,d1,d0 > fmul d2,d2,d0 > fmul d3,d3,d0 > adrp x0,\b@PAGE > add x0,x0,\b@PAGEOFF > str d1,[x0,body.vx] > str d2,[x0,body.vy] > str d3,[x0,body.vz] > str d1,[x2,x1, lsl 3] > str d2,[x3,x1, lsl 3] > str d3,[x4,x1, lsl 3] > ldr x0,=SOLAR_MASS > fmov d0,x0 > ldr x0,=\mass > fmov d1,x0 > fmul d1,d1,d0 > adrp x0,\b@PAGE > add x0,x0,\b@PAGEOFF > adrp x2,bodymass@PAGE > add x2,x2,bodymass@PAGEOFF > str d1,[x0,body.mass] > str d1,[x2,x1, lsl 3] > .endm > .macro advance label > ; v15 holds dt > > mov x2,4; x2 -> i > mov x4,xzr > mov x1,xzr > adrp x10,bodyx@PAGE > add x10,x10,bodyx@PAGEOFF > adrp x11,bodyy@PAGE > add x11,x11,bodyy@PAGEOFF > adrp x12,bodyz@PAGE > add x12,x12,bodyz@PAGEOFF > adrp x13,diffx@PAGE > add x13,x13,diffx@PAGEOFF > adrp x14,diffy@PAGE > add x14,x14,diffy@PAGEOFF > adrp x15,diffz@PAGE > add x15,x15,diffz@PAGEOFF > adrp x16,bodyvx@PAGE > add x16,x16,bodyvx@PAGEOFF > adrp x17,bodyvy@PAGE > add x17,x17,bodyvy@PAGEOFF > adrp x18,bodyvz@PAGE > add x18,x18,bodyvz@PAGEOFF > L0\label: > mov x9,x2 ; x9 -> j > mov x3,x1 > add x3,x3,8 > L1\label: > cmp x9,1 > beq LF1\label > ldr x0,[x10,x1] > dup.2d v0,x0 > ldr x0,[x11,x1] > dup.2d v1,x0 > ldr x0,[x12,x1] > dup.2d v2,x0 > > ldr q3,[x10,x3] > ldr q4,[x11,x3] > ldr q5,[x12,x3] > > fsub.2d v0,v0,v3 ; dx -> v0 > fsub.2d v1,v1,v4 ; dy -> v1 > fsub.2d v2,v2,v5 ; dz -> v2 > str q0,[x13,x4] > str q1,[x14,x4] > str q2,[x15,x4] > add x4,x4,16 > add x3,x3,16 > subs x9,x9,2 > b Ldskip1\label > > LF1\label: > ldr d0,[x10,x1] > ldr d1,[x11,x1] > ldr d2,[x12,x1] > > ldr d3,[x10,x3] > ldr d4,[x11,x3] > ldr d5,[x12,x3] > > fsub d0,d0,d3 ; dx -> d0 > fsub d1,d1,d4 ; dy -> d1 > fsub d2,d2,d5 ; dz -> d2 > str d0,[x13,x4] > str d1,[x14,x4] > str d2,[x15,x4] > add x4,x4,8 > add x3,x3,8 > subs x9,x9,1 > > Ldskip1\label: > bgt L1\label > add x1,x1,8 > subs x2,x2,1 > bgt L0\label > > ;----------------------------------- > mov x2,5 > mov x5,xzr > adrp x4,mag@PAGE > add x4,x4,mag@PAGEOFF > L2\label: > > ldr q3,[x13,x5] > ldr q4,[x14,x5] > ldr q5,[x15,x5] > > mov v6.16b,v15.16b > > fmul.2d v3,v3,v3 > > fmla.2d v3,v4,v4 > fmla.2d v3,v5,v5 > > fsqrt.2d v7,v3 > fmul.2d v3,v3,v7 > fdiv.2d v6,v6,v3 > > > str q6,[x4] > add x4,x4,16 > add x5,x5,16 > subs x2,x2,1 > bgt L2\label > > ;----------------------------------------------- > mov x2,4 > mov x9,xzr > mov x5,xzr > adrp x4,mag@PAGE > add x4,x4,mag@PAGEOFF > adrp x6,bodymass@PAGE > add x6,x6,bodymass@PAGEOFF > L3\label: > mov x7,x2 > mov x8,x9 > add x8,x8,8 > L4\label: > cmp x7,1 > beq LF3\label > ldr q6,[x6,x8] > ldr q5,[x4] > fmul.2d v6,v6,v5 > > ldr q10,[x13,x5] > ldr q11,[x14,x5] > ldr q12,[x15,x5] > > ldr d3,[x16,x9] > ldr d4,[x17,x9] > ldr d5,[x18,x9] > > mov v7.16b,v10.16b > mov v8.16b,v11.16b > mov v9.16b,v12.16b > fmul.2d v7,v7,v6 > fmul.2d v8,v8,v6 > fmul.2d v9,v9,v6 > mov v22.d[0],v7.d[0] > mov v23.d[0],v7.d[1] > mov v22.d[1],v8.d[0] > mov v23.d[1],v8.d[1] > mov d20,v9[0] > mov d21,v9[1] > fmov x23,d3 > fmov x24,d4 > mov v24.d[0],x23 > mov v24.d[1],x24 > fadd.2d v7,v22,v23 > fadd d9,d20,d21 > fsub.2d v24,v24,v7 > fsub d5,d5,d9 > mov d3,v24[0] > mov d4,v24[1] > str d3,[x16,x9] > str d4,[x17,x9] > str d5,[x18,x9] > ; iBody.vx -= dx * bodies[j].mass * mag; > ; ---------------------------------------------- > ldr x0,[x6,x9] > dup.2d v7,x0 > ldr q6,[x4] > fmul.2d v7,v7,v6 > > ldr q3,[x16,x8] > ldr q4,[x17,x8] > ldr q5,[x18,x8] > > mov v0.16b,v10.16b > mov v1.16b,v11.16b > mov v2.16b,v12.16b > fmla.2d v3,v0,v7 > fmla.2d v4,v1,v7 > fmla.2d v5,v2,v7 > > str q3,[x16,x8] > str q4,[x17,x8] > str q5,[x18,x8] > ; bodies[j].vx += dx * iBody.mass * mag; > add x5,x5,16 > add x4,x4,16 > add x8,x8,16 > subs x7,x7,2 > b Lmskip1\label > LF3\label: > ldr d6,[x6,x8] > ldr d5,[x4] > fmul d6,d6,d5 > > ldr d10,[x13,x5] > ldr d11,[x14,x5] > ldr d12,[x15,x5] > > ldr d3,[x16,x9] > ldr d4,[x17,x9] > ldr d5,[x18,x9] > > fmov d7,d10 > fmov d8,d11 > fmov d9,d12 > fmsub d3,d7,d6,d3 > fmsub d4,d8,d6,d4 > fmsub d5,d9,d6,d5 > > str d3,[x16,x9] > str d4,[x17,x9] > str d5,[x18,x9] > ; iBody.vx -= dx * bodies[j].mass * mag; > ; ---------------------------------------------- > ldr d7,[x6,x9] > ldr d6,[x4] > fmul d7,d7,d6 > > ldr d3,[x16,x8] > ldr d4,[x17,x8] > ldr d5,[x18,x8] > > fmov d0,d10 > fmov d1,d11 > fmov d2,d12 > > fmadd d3,d0,d7,d3 > fmadd d4,d1,d7,d4 > fmadd d5,d2,d7,d5 > > > str d3,[x16,x8] > str d4,[x17,x8] > str d5,[x18,x8] > ; bodies[j].vx += dx * iBody.mass * mag; > add x5,x5,8 > add x4,x4,8 > add x8,x8,8 > subs x7,x7,1 > ;----------------------------------------- > Lmskip1\label: > bgt L4\label > add x9,x9,8 > subs x2,x2,1 > bgt L3\label > > mov x9,xzr > mov x2,5 > L5\label: > cmp x2,1 > bne LF2\label > ldr d0,[x10,x9] > ldr d1,[x11,x9] > ldr d2,[x12,x9] > > dup d3,v15[0] > fmov d4,d3 > fmov d5,d3 > > ldr d6,[x16,x9] > ldr d7,[x17,x9] > ldr d8,[x18,x9] > > fmadd d0,d3,d6,d0 > fmadd d1,d4,d7,d1 > fmadd d2,d5,d8,d2 > > str d0,[x10,x9] > str d1,[x11,x9] > str d2,[x12,x9] > > add x9,x9,8 > subs x2,x2,1 > b Lkskip1\label > LF2\label: > ldr q0,[x10,x9] > ldr q1,[x11,x9] > ldr q2,[x12,x9] > > mov v3.16b,v15.16b > mov v4.16b,v3.16b > mov v5.16b,v3.16b > ldr q6,[x16,x9] > ldr q7,[x17,x9] > ldr q8,[x18,x9] > > > fmla.2d v0,v3,v6 > fmla.2d v1,v4,v7 > fmla.2d v2,v5,v8 > str q0,[x10,x9] > str q1,[x11,x9] > str q2,[x12,x9] > add x9,x9,16 > subs x2,x2,2 > Lkskip1\label: > bgt L5\label > .endm > > .text > .align 4 > .global _main > > _main: > str x30,[sp,-16]! > mov x8,1 > adrp x9,n@PAGE > str x8,[x9,n@PAGEOFF] > > ; x0 - > argc , x1 -> argv > cmp x0,2 > blt .begin > > ldr x0,[x1,8] > bl _atoi > adrp x9,n@PAGE > str x0,[x9,n@PAGEOFF] > mov x8,x0 > adrp x0,argv@PAGE > add x0,x0,argv@PAGEOFF > sub sp,sp,16 > str x8,[sp] > bl _printf > add sp,sp,16 > .begin: > ;------------- > ;init_body sun,0.0,0.0,0.0,0.0,0.0,0.0,1.0 > init_body sun,0,0,0,0,0,0,0x3FF0000000000000, 0 > > ;init_body jupiter,4.84143144246472090e+00, -1.16032004402742839e+00, -1.03622044471123109e-01, 1.66007664274403694e-03, 7.69901118419740425e-03, -6.90460016972063023e-05, 9.54791938424326609e-04 > init_body jupiter,0x40135DA0343CD92C, 0xBFF290ABC01FDB7C, 0xBFBA86F96C25EBF0, 0x3F5B32DDB8EC9209, 0x3F7F88FF93F670B6, 0xBF12199946DEBD80,0x3F4F49601333C135, 1 > ;init_body saturn,8.34336671824457987e+00, 4.12479856412430479e+00, -4.03523417114321381e-01, -2.76742510726862411e-03, 4.99852801234917238e-03, 2.30417297573763929e-05, 2.85885980666130812e-04; > init_body saturn, 0x4020afcdc332ca67,0x40107fcb31de01b0,0xbfd9d353e1eb467c,0xbf66abb60a8e1d76,0x3f747956257578b8,0x3ef829379cad4ac0,0x3f32bc5eeff5e6f8, 2 > > ;init_body uranus,1.28943695621391310e+01, -1.51111514016986312e+01, -2.23307578892655734e-01, 2.96460137564761618e-03, 2.37847173959480950e-03, -2.96589568540237556e-05, 4.36624404335156298e-05 > init_body uranus,0x4029c9eacea7d9cf,0xc02e38e8d626667e,0xbfcc9557be257da0,0x3f6849383e87d954,0x3f637c044ac0ace1,0xbeff1983fedbfaa0,0x3f06e44607a13bd6, 3 > > ;init_body neptune,1.53796971148509165e+01, -2.59193146099879641e+01, 1.79258772950371181e-01, 2.68067772490389322e-03, 1.62824170038242295e-03, -9.51592254519715870e-05, 5.15138902046611451e-05; > init_body neptune,0x402ec267a905572a,0xc039eb5833c8a220,0x3fc6f1f393abe540,0x3f65f5c9e51b4320,0x3f5aad5736999d88,0xbf18f2070b7f9750,0x3f0b0213ca2d0eec, 4 > mov x0,xzr > fmov d0,x0 > fmov d1,x0 > fmov d2,x0 > > adrp x1,sun@PAGE > add x1,x1,sun@PAGEOFF > mov x2,5 > ; init > ; ---------------------------------- > .L0main: > ldr d3,[x1,body.vx] > ldr d4,[x1,body.mass] > fmul d3,d3,d4 > fadd d0,d0,d3 > > ldr d3,[x1,body.vy] > ldr d4,[x1,body.mass] > fmul d3,d3,d4 > fadd d1,d1,d3 > > ldr d3,[x1,body.vz] > ldr d4,[x1,body.mass] > fmul d3,d3,d4 > fadd d2,d2,d3 > > add x1,x1,SIZEOFBODY > subs x2,x2,1 > bgt .L0main > > adrp x1,sun@PAGE > add x1,x1,sun@PAGEOFF > mov x0,xzr > bl offset_momentum > ; ---------------------------------------- > bl energy > fmov x21,d0 > adrp x20,n@PAGE > ldr x20,[x20,n@PAGEOFF] > ldr x0,=0x3F847AE147AE147B;0.01 > dup.2d v15,x0 > .L1main: > cmp x20,20 > blt lo > advance A > advance B > advance C > advance D > advance E > advance F > advance G > advance H > advance I > advance J > advance 01 > advance 02 > advance 03 > advance 04 > advance 05 > advance 06 > advance 07 > advance 08 > advance 09 > advance 10 > subs x20,x20,20 > bgt .L1main > b Lskip > lo: > advance K > subs x20,x20,1 > bgt lo > Lskip: > bl energy > fmov x22,d0 > adrp x1,sun@PAGE > add x1,x1,sun@PAGEOFF > mov x0,xzr > bl print_body > adrp x1,jupiter@PAGE > add x1,x1,jupiter@PAGEOFF > mov x0,1 > bl print_body > adrp x1,saturn@PAGE > add x1,x1,saturn@PAGEOFF > mov x0,2 > bl print_body > adrp x1,uranus@PAGE > add x1,x1,uranus@PAGEOFF > mov x0,3 > bl print_body > adrp x1,neptune@PAGE > add x1,x1,neptune@PAGEOFF > mov x0,4 > bl print_body > fmov d0,x21 > bl print_energy > fmov d0,x22 > bl print_energy > ldr x30,[sp],16 > ret > ; px d0 , py d1 , pz d2, x1 body , x0 index > offset_momentum: > mov x9,x0 > ldr x0,=0x8000000000000000 > fmov x8,d0 > eor x8,x8,x0 > fmov d0,x8 > fmov x8,d1 > eor x8,x8,x0 > fmov d1,x8 > fmov x8,d2 > eor x8,x8,x0 > fmov d2,x8 > ldr x0,=SOLAR_MASS > fmov d3,x0 > fdiv d0,d0,d3 > fdiv d1,d1,d3 > fdiv d2,d2,d3 > str d0,[x1,body.vx] > str d1,[x1,body.vy] > str d2,[x1,body.vz] > adrp x10,bodyvx@PAGE > add x10,x10,bodyvx@PAGEOFF > adrp x11,bodyvy@PAGE > add x11,x11,bodyvy@PAGEOFF > adrp x12,bodyvz@PAGE > add x12,x12,bodyvz@PAGEOFF > str d0,[x10,x9,lsl 3] > str d1,[x11,x9,lsl 3] > str d2,[x12,x9,lsl 3] > ret > > print_body: > sub sp,sp,16 > stp x19,x30,[sp],-128 > mov x19,x0 > > adrp x0,bmsg@PAGE > add x0,x0,bmsg@PAGEOFF > ldr d0,[x1,body.x] > ldr d1,[x1,body.y] > ldr d2,[x1,body.z] > ldr d3,[x1,body.vx] > ldr d4,[x1,body.vy] > ldr d5,[x1,body.vz] > ldr d6,[x1,body.mass] > str d0,[sp] > str d1,[sp,8] > str d2,[sp,16] > str d3,[sp,24] > str d4,[sp,32] > str d5,[sp,40] > str d6,[sp,48] > bl _printf > adrp x9,bodyx@PAGE > add x9,x9,bodyx@PAGEOFF > adrp x10,bodyy@PAGE > add x10,x10,bodyy@PAGEOFF > adrp x11,bodyz@PAGE > add x11,x11,bodyz@PAGEOFF > adrp x12,bodyvx@PAGE > add x12,x12,bodyvx@PAGEOFF > adrp x13,bodyvy@PAGE > add x13,x13,bodyvy@PAGEOFF > adrp x14,bodyvz@PAGE > add x14,x14,bodyvz@PAGEOFF > adrp x15,bodymass@PAGE > add x15,x15,bodymass@PAGEOFF > adrp x0,bmsg@PAGE > add x0,x0,bmsg@PAGEOFF > ldr d0,[x9,x19, lsl 3] > ldr d1,[x10,x19, lsl 3] > ldr d2,[x11,x19, lsl 3] > ldr d3,[x12,x19, lsl 3] > ldr d4,[x13,x19, lsl 3] > ldr d5,[x14,x19, lsl 3] > ldr d6,[x15,x19, lsl 3] > str d0,[sp] > str d1,[sp,8] > str d2,[sp,16] > str d3,[sp,24] > str d4,[sp,32] > str d5,[sp,40] > str d6,[sp,48] > bl _printf > ldp x19,x30,[sp,128]! > add sp,sp,16 > ret > ; d0 resulting energy > energy: > mov x1,xzr > mov x2,5 > movi.2d v0,0 > adrp x8,bodyvx@PAGE > add x8,x8,bodyvx@PAGEOFF > adrp x9,bodyvy@PAGE > add x9,x9,bodyvy@PAGEOFF > adrp x10,bodyvz@PAGE > add x10,x10,bodyvz@PAGEOFF > adrp x11,bodymass@PAGE > add x11,x11,bodymass@PAGEOFF > adrp x12,bodyx@PAGE > add x12,x12,bodyx@PAGEOFF > adrp x13,bodyy@PAGE > add x13,x13,bodyy@PAGEOFF > adrp x14,bodyz@PAGE > add x14,x14,bodyz@PAGEOFF > ldr x0,=0x3FE0000000000000 ; 0.5 > .L0energy: > > ldr d1,[x8,x1] > fmul d1,d1,d1 > > ldr d2,[x9,x1] > fmul d2,d2,d2 > > ldr d3,[x10,x1] > fmul d3,d3,d3 > > fadd d1,d1,d2 > fadd d1,d1,d3 > > ldr d2,[x11,x1] > fmul d1,d1,d2 > > fmov d2,x0 > fmul d2,d2,d1 > > fadd.2d v0,v0,v2 > subs x2,x2,1 > beq .L2energy > mov x18,x2 > mov x3,x1 > add x3,x3,8 > .L1energy: > ldr x15,[x12,x1] > dup.2d v1,x15 > ldr q2,[x12,x3] > fsub.2d v1,v1,v2 > > ldr x15,[x13,x1] > dup.2d v2,x15 > ldr q3,[x13,x3] > fsub.2d v2,v2,v3 > > ldr x15,[x14,x1] > dup.2d v3,x15 > ldr q4,[x14,x3] > fsub.2d v3,v3,v4 > > fmul.2d v1,v1,v1 > fmul.2d v2,v2,v2 > fmul.2d v3,v3,v3 > > fadd.2d v1,v1,v2 > fadd.2d v1,v1,v3 > fsqrt.2d v1,v1 > > ldr x15,[x11,x1] > dup.2d v2,x15 > ldr q3,[x11,x3] > fmul.2d v2,v2,v3 > fdiv.2d v2,v2,v1 > fsub.2d v0,v0,v2 > add x3,x3,16 > subs x2,x2,2 > bgt .L1energy > add x1,x1, 8 > mov x2,x18 > b .L0energy > .L2energy: > dup d1,v0[0] > dup d2,v0[1] > fadd d0,d1,d2 > ret > print_energy: > sub sp,sp,16 > str x30,[sp],-16 > adrp x0,msg@PAGE > add x0,x0,msg@PAGEOFF > str d0,[sp] > bl _printf > ldr x30,[sp,16]! > add sp,sp,16 > ret > .data > bmsg: .ascii "x: %.20f\ny: %.20f\nz: %.20f\n" > .ascii "vx: %.20f\nvy: %.20f\nvz: %.20f\n" > .asciz "mass: %.20f\n\n" > .align 8 > msg: .asciz "%.9f\n" > .align 8 > argv: .asciz "argv : %d\n" > .align 16 > L1: .double 1.5,1.5 > L2: .double 0.5,0.5 > .bss > .align 16 > sun: .space SIZEOFBODY > jupiter: .space SIZEOFBODY > saturn: .space SIZEOFBODY > uranus: .space SIZEOFBODY > neptune: .space SIZEOFBODY > .align 16 > bodyx: .space 10*8 > .align 16 > bodyy: .space 10*8 > .align 16 > bodyz: .space 10*8 > .align 16 > bodyvx: .space 10*8 > .align 16 > bodyvy: .space 10*8 > .align 16 > bodyvz: .space 10*8 > .align 16 > bodymass: .space 10*8 > .align 16 > diffx: .space 10*8 > .align 16 > diffy: .space 10*8 > .align 16 > diffz: .space 10*8 > .align 16 > n: .space 8 > .align 16 > mag: .space 10*8 > > > -- > > 7-77-777 > Evil Sinner! > to weak you should be meek, and you should brainfuck stronger > https://github.com/rofl0r/chaos-pp 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂 🙂
[toc] | [prev] | [standalone]
Back to top | Article view | comp.programming
csiph-web