home bbs files messages ]

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