Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.programming > #13964

aarch64 nbody bench (done without debugger)

Newsgroups comp.programming
From Branimir Maksimovic <branimir.maksimovic@icloud.com>
Subject aarch64 nbody bench (done without debugger)
Message-ID <vqn6J.9345$fZ.8099@fx06.iad> (permalink)
Organization usenet-news.net
Date 2021-10-03 19:23 +0000

Show all headers | View raw


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

Back to comp.programming | Previous | Next — Next in thread | Find similar | Unroll thread


Thread

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

csiph-web