Page 190 - ARM 64 Bit Assembly Language
P. 190
Abstract data types 177
77 mov x21, x0 // x21 = ptrs
78 ldr x1, [x19, #wl_head] // x1 = list->root
79 bl getptrs // fill in the pointers
80
81 // wl_quicksort(**start, **end)
82 mov x0, x21 // get pointer to array
83 add x1, x0, x20, lsl #3 // get pointer to end of array
84 sub x1, x1, #8
85 bl wl_quicksort // re-sort the array of pointers
86
87 // Print the word frequency list.
88 mov x19, #0 // do a for loop
89 // for(i = 0; i < list->nwords; i++)
90 loop: cmp x19, x20
91 bge done
92
93 // printf("%10d ’%s’\n", ptrs[i]->count, ptrs[i]->word)
94 adr x0, fmtstr
95 ldr x3, [x21, x19, lsl #3] // get next pointer
96 add x19, x19, #1
97 ldr w1, [x3, #wln_count] // load count
98 ldr x2, [x3, #wln_word] // load ptr to word
99 bl printf
100 b loop
101 done:
102 ldr x21, [sp, #32]
103 ldp x19, x20, [sp, #16]
104 ldp x29, x30, [sp], #48
105 ret
106 .size wl_print_numerical,(. - wl_print_numerical)
107
108 ### ----------------------------------------------------------
109 ### function wl_quicksort(wln **left,wln **right) quicksorts
110 ### the array of pointers in order of the word counts
111 .type wl_quicksort, %function
112 wl_quicksort:
113 cmp x0, x1
114 bge wl_quicksort_exit // return if length<=1
115 stp x29, x30, [sp, #-48]!
116 stp x19, x20, [sp, #16]
117 stp x21, x22, [sp, #32]
118
119 ldr x12, [x0] // use count of first item as
120 ldr w12, [x12, #wln_count] // pivot value in x12
121 mov x19, x0 // current left
122 mov x20, x1 // current right
123 mov x21, x0 // original left(first)
124 mov x22, x1 // original right(last)
125 loopa: cmp x19, x20 // while left <= right &&