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 &&
   185   186   187   188   189   190   191   192   193   194   195