Forums before death by AOL, social media and spammers... "We can't have nice things"
|    comp.programming    |    Programming issues that transcend langua    |    57,431 messages    |
[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]
|    Message 55,492 of 57,431    |
|    =?UTF-8?B?SMOkcnJhIFJhbW9i?= to All    |
|    Re: merge sort vs radix sort aarch64 (do    |
|    05 Jan 22 00:24:26    |
      From: hrramob@gmail.com              Branimir Maksimovic kirjutas Pühapäev, 3. oktoober 2021 kl 22:20:34 UTC+3:       > .set Node.next, 0        > .set Node.data, 8        > NodeSize = 16        > .text        > .globl _main        > .align 4        > ; radix_sort_avx2        > ;extern _atoi        > ;extern _printf        > ;extern _puts        > ;extern _exit        > ;extern _rand_r        > ;extern _time        > ;extern _malloc        > .macro stosq label,dest,val,len        > mov x0,\dest        > mov x1,\val        > mov x2,\len        > \label:        > str x1,[x0],8        > subs x2,x2,1        > bne \label        > .endm        > _main:        > sub sp,sp,#64        > stp x29,x30,[sp,#48]        > stp x19,x20,[sp,#32]        > stp x21,x22,[sp,#16]        > add x29,sp,#48        > adrp x8, N@PAGE        > mov w9,#4096*4096        > str w9,[x8,N@PAGEOFF]        > cmp x0, #1        > beq .skip        > ldr x0,[x1,#8]        > bl _atoi        > cmp w0,#1        > blt .exit        > adrp x8, N@PAGE        > str w0,[x8,N@PAGEOFF]        > .align 8        > .skip:        > mov x0,xzr        > bl _time        > adrp x8,seed@PAGE        > str w0,[x8,seed@PAGEOFF] ; seed on time        > str x0,[sp]        > adrp x9,fmt1@PAGE        > add x0,x9,fmt1@PAGEOFF        > bl _printf ; print seed        >        > adrp x9,fmt4@PAGE        > add x0,x9,fmt4@PAGEOFF        > adrp x8,N@PAGE        > ldr w8,[x8,N@PAGEOFF]        > str x8,[sp]        > bl _printf        > adrp x20,list1@PAGE        > add x20,x20,list1@PAGEOFF        > bl init_list        > adrp x20,list2@PAGE        > add x20,x20,list2@PAGEOFF        > bl init_list        > adrp x0,fmti@PAGE        > add x0,x0,fmti@PAGEOFF        > bl _puts        >        > adrp x0,N@PAGE        > ldr x0,[x0,N@PAGEOFF]        > mov x1,#4        > mov x2,xzr        > mul x0,x0,x1        > bl _malloc        > adrp x8,array@PAGE        > str x0, [x8,array@PAGEOFF]        >        > adrp x0,list2@PAGE        > ldr x0,[x0,list2@PAGEOFF]        > adrp x1,list1@PAGE        > ldr x1,[x1,list1@PAGEOFF]        > bl assign_list        >        > adrp x0,array@PAGE        > ldr x0,[x0,array@PAGEOFF]        > adrp x1,list1@PAGE        > ldr x1,[x1,list1@PAGEOFF]        > bl assign_array        >        > adrp x0,fmtu@PAGE        > add x0,x0,fmtu@PAGEOFF        > adrp x20,list1@PAGE        > add x20,x20,list1@PAGEOFF        > bl print_list        > ;radix_avx2 equ 1        > .ifdef radix_avx2        > call init_time        > mov rdi,[array]        > mov esi,[N]        > call [radix_sort_avx2]        > mov rdi,fmtar        > call time_me        > .endif        >        > .if 1        > bl init_time        > adrp x20,list1@PAGE        > add x20,x20,list1@PAGEOFF        > bl radix_sort        >        > adrp x0,fmtr@PAGE        > add x0,x0,fmtr@PAGEOFF        > bl time_me        > .endif        > .if 1        > bl init_time        > adrp x0,list2@PAGE        > ldr x0,[x0,list2@PAGEOFF]        > sub sp,sp,32        > str x0,[sp]        > bl sort        > adrp x0,list2@PAGE        > ldr x1,[sp]        > str x1,[x0,list2@PAGEOFF]        > add sp,sp,32        > adrp x0,fmtm@PAGE        > add x0,x0,fmtm@PAGEOFF        > bl time_me        > .endif        > adrp x0,list1@PAGE        > ldr x0,[x0,list1@PAGEOFF]        > adrp x1,list2@PAGE        > ldr x1,[x1,list2@PAGEOFF]        > bl equal_list        > adrp x8,fmte@PAGE        > add x8,x8,fmte@PAGEOFF        > adrp x9,fmtne@PAGE        > add x9,x9,fmtne@PAGEOFF        > cmp x2,#1        > csel x0,x8,x9,eq        > bl _puts        > /*        > mov rdi,[array]        > mov rsi,[list2]        > call equal_array        > mov rdi,fmte        > test eax,eax        > mov rbx,fmtne        > cmovz rdi,rbx        > call _puts        > */        > adrp x0,fmts@PAGE        > add x0,x0,fmts@PAGEOFF        > adrp x20,list1@PAGE        > add x20,x20,list1@PAGEOFF        > bl print_list        > adrp x0,fmts@PAGE        > add x0,x0,fmts@PAGEOFF        > adrp x20,list2@PAGE        > add x20,x20,list2@PAGEOFF        > bl print_list        > adrp x20,list1@PAGE        > ldr x20,[x20,list1@PAGEOFF]        > bl length        > mov x8,x0        > adrp x0,fmt3@PAGE        > add x0,x0,fmt3@PAGEOFF        > mov x9,NodeSize        > str x9,[sp]        > str x8,[sp,8]        > bl _printf        > .exit:        > ldp x29,x30,[sp,#48]        > ldp x19,x20,[sp,#32]        > ldp x21,x22,[sp,#16]        > add sp,sp,#64        > ret        > .align 8        > init_list:        > str x30,[sp]        > adrp x19,N@PAGE        > ldr w19,[x19,N@PAGEOFF]        > ;address of list in x20        > .L0:        > mov x0,NodeSize        > bl _malloc        > ldr x8,[x20]        > str x8,[x0,Node.next]        > str x0,[x20]        > adrp x0,seed@PAGE        > add x0,x0,seed@PAGEOFF        > bl _rand_r        > ; x0 -> random value        > ; divide by N, x8 -> N        > adrp x8,N@PAGE        > ldr w8,[x8,N@PAGEOFF]        >        > udiv w2, w0, w8        > msub w0, w2, w8, w0        >        > ldr x8,[x20]        > str w0, [x8,Node.data]        >        > sub w19,w19,#1        > cmp w19,wzr        > bne .L0        > ldr x30,[sp]        > ret        > print_list:        > str x30,[sp]        > sub sp,sp,16        > bl _puts        > ldr x20,[x20]        > ;x20 -> list address        > mov x19,#16        > .L01:        > cmp x20,xzr        > beq .exit1        > adrp x0,fmt2@PAGE        > add x0,x0,fmt2@PAGEOFF        > mov x8,x20        > ldr x8,[x8,Node.next]        > str x8,[sp]        > mov x9,x20        > ldr w9,[x9,Node.data]        > str x9,[sp,8]        > bl _printf        > ldr x20,[x20,Node.next]        > sub x19,x19,1        > cmp x19,xzr        > beq .exit1        > b .L01        > .exit1:        > add sp,sp,16        > ldr x30,[sp]        > ret        > assign_list:        > .L02:        > cmp x1,xzr        > beq .exit2        > cmp x0,xzr        > beq .exit2        > ldr w8,[x1,Node.data]        > str w8, [x0,Node.data]        > ldr x1,[x1,Node.next]        > ldr x0,[x0,Node.next]        > b .L02        > .exit2:        > ret        > assign_array:        > .L03:        > cmp x1,xzr        > beq .exit3        > ldr w8,[x1,Node.data]        > str w8, [x0]        > ldr x1,[x1,Node.next]        > add x0,x0,#4        > b .L03        > .exit3:        > ret        > equal_list:        > str x30,[sp,-16]!        > mov x2,#1 ; return value if true        > mov x20,x0        > mov x3,x0        > bl length        > mov x4,x0        > mov x20,x1        > bl length        > mov x5,x0        > ldr x30,[sp],16        > cmp x4,x5        > bne .false        > mov x0,x3        > .L04:        > cmp x1,xzr        > beq .exit4        > cmp x0,xzr        > beq .exit4        > ldr w8,[x1,Node.data]        > ldr w9,[x0,Node.data]        > cmp w8,w9        > bne .false        > ldr x1,[x1,Node.next]        > ldr x0,[x0,Node.next]        > b .L04        > .exit4:        > ret        > .false:        > mov x2,xzr        > ret        > equal_array:        > mov x2,#1 ; return value if true        > .L05:        > cmp x1,xzr        > beq .exit5        > ldr w8,[x1,Node.data]        > ldr w9,[x0]        > cmp w8,w9        > bne .false1        > ldr x1,[x1,Node.next]        > add x0,x0,#4        > b .L05        > .exit5:        > ret        > .false1:        > mov x2,xzr        > ret        > ; [sp] list to sort        > sort:        > sub sp,sp,32        > str x30,[sp,16]        > ldr x20,[sp,32]        > bl length        > mov x11,x0        > cmp x11,#1        > ble .exitsort        > lsr x11,x11,#1        > str xzr,[sp]        > str xzr,[sp,8]        > ldr x1,[sp,#32]        > .L0sort: ; append to left        > ldr x19,[sp]        > ldr x10,[x1,Node.next]        > str x19,[x1,Node.next]        > str x1,[sp]        > mov x1,x10        > subs x11,x11,#1        > bgt .L0sort        > .L1sort: ; append to right        > ldr x19,[sp,8]        > ldr x10,[x1,Node.next]        > str x19,[x1,Node.next]        > str x1,[sp,8]        > ldr x1,[x1,Node.next]        > mov x1,x10        > cmp x1,xzr        > bne .L1sort        > sub sp,sp,16        > ldr x1,[sp,16]        > str x1,[sp]        > bl sort        > ldr x1,[sp]        > str x1,[sp,16]        > ldr x1,[sp,24]        > str x1,[sp]        > bl sort        > ldr x1,[sp]        > str x1,[sp,24]        > bl merge        > ldr x1,[sp]        > add sp,sp,#16        > str x1,[sp,32]        > .exitsort:        > ldr x30,[sp,16]        > add sp,sp,32        > ret        > ; [rsp] output , [rsp+16] left, [rsp+24] right        > merge:        > sub sp,sp,16        > str xzr,[sp,16]        > str xzr,[sp]        > .L0merge:        > ldr x0,[sp,32]        > cmp x0,xzr        > beq .right               [continued in next message]              --- SoupGate-Win32 v1.05        * Origin: you cannot sedate... all the things you hate (1:229/2)    |
[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]
(c) 1994, bbs@darkrealms.ca