• aarch64 nbody bench (done without debugger)

    From Branimir Maksimovic@21:1/5 to All on Sun Oct 3 19:23:07 2021
    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

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From =?UTF-8?B?SMOkcnJhIFJhbW9i?=@21:1/5 to All on Wed Jan 5 00:24:36 2022
    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

    πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚
    πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚
    πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)