174 lines
No EOL
4.7 KiB
LLVM
174 lines
No EOL
4.7 KiB
LLVM
declare void @printf(i8*, i64, i64, i64, i64, i64, i64, i64, i64, i64, i64, i64, i64, i64, i64, i64, i64, i64, i64, i64, i64, i64, i64, i64, i64, i64, i64, i64, i64)
|
|
|
|
@output_str = global [170 x i8] c"Initial array: %lld %lld %lld %lld %lld %lld %lld %lld %lld %lld %lld %lld %lld %lld; Sorted array: %lld %lld %lld %lld %lld %lld %lld %lld %lld %lld %lld %lld %lld %lld\00"
|
|
|
|
|
|
%arr = type [14 x i64]
|
|
@input = global %arr [i64 4, i64 1, i64 50, i64 50, i64 7, i64 0, i64 5, i64 10, i64 9, i64 11, i64 0, i64 100, i64 3, i64 8]
|
|
|
|
; linear time and in place partition, given the lo and hi boundaries (chooses last element as in CLRS)
|
|
define i64 @partition(%arr* %nums, i64 %lo, i64 %hi) {
|
|
|
|
; get pivot element
|
|
%pivot_ptr = getelementptr %arr, %arr* %nums, i32 0, i64 %hi
|
|
%pivot = load i64, i64* %pivot_ptr
|
|
|
|
; j is index through array
|
|
%j_ptr = alloca i64
|
|
store i64 %lo, i64* %j_ptr
|
|
|
|
; i is border of smaller elemenets
|
|
%i_ptr = alloca i64
|
|
store i64 %lo, i64* %i_ptr
|
|
|
|
br label %loop_condition
|
|
|
|
loop_condition:
|
|
|
|
; while j <= hi
|
|
%j = load i64, i64* %j_ptr
|
|
%1 = icmp sle i64 %j, %hi
|
|
br i1 %1, label %loop_body, label %loop_exit
|
|
|
|
loop_body:
|
|
|
|
;if A[j] < pivot
|
|
%p = load i64, i64* %j_ptr
|
|
%a_j_ptr = getelementptr %arr, %arr* %nums, i32 0, i64 %p
|
|
%a_j = load i64, i64* %a_j_ptr
|
|
%2 = icmp slt i64 %a_j, %pivot
|
|
br i1 %2, label %if_body, label %if_end
|
|
|
|
if_body:
|
|
|
|
%i = load i64, i64* %i_ptr
|
|
|
|
;swap A[i] and A[j]
|
|
call void @swap(%arr* %nums, i64 %i, i64 %p)
|
|
|
|
;i++
|
|
%3 = add i64 %i, 1
|
|
store i64 %3, i64* %i_ptr
|
|
|
|
br label %if_end
|
|
|
|
if_end:
|
|
|
|
;incremennt j and go back to loop
|
|
%4 = add i64 %j, 1
|
|
store i64 %4, i64* %j_ptr
|
|
br label %loop_condition
|
|
|
|
loop_exit:
|
|
|
|
;swap A[i] and A[hi]
|
|
%q = load i64, i64* %i_ptr
|
|
call void @swap(%arr* %nums, i64 %q, i64 %hi)
|
|
|
|
ret i64 %q
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
;swap nums[fst] and nums[snd]
|
|
define void @swap(%arr* %nums, i64 %fst, i64 %snd) {
|
|
|
|
%fst_element_ptr = getelementptr %arr, %arr* %nums, i32 0, i64 %fst
|
|
%snd_element_ptr = getelementptr %arr, %arr* %nums, i32 0, i64 %snd
|
|
|
|
%fst_element = load i64, i64* %fst_element_ptr
|
|
%snd_element = load i64, i64* %snd_element_ptr
|
|
|
|
store i64 %fst_element, i64* %snd_element_ptr
|
|
store i64 %snd_element, i64* %fst_element_ptr
|
|
|
|
ret void
|
|
|
|
}
|
|
|
|
;quicksort
|
|
define void @quicksort(%arr* %nums, i64 %lo, i64 %hi) {
|
|
;if lo < hi
|
|
%1 = icmp slt i64 %lo, %hi
|
|
br i1 %1, label %sort_case, label %trivial
|
|
|
|
sort_case:
|
|
|
|
%p = call i64 @partition(%arr* %nums, i64 %lo, i64 %hi)
|
|
%2 = sub i64 %p, 1
|
|
%3 = add i64 %p, 1
|
|
|
|
call void @quicksort(%arr* %nums, i64 %lo, i64 %2)
|
|
call void @quicksort(%arr* %nums, i64 %3, i64 %hi)
|
|
|
|
ret void
|
|
|
|
trivial:
|
|
|
|
ret void
|
|
}
|
|
|
|
|
|
define i64 @main(i64 %argc, i8** %arcv) {
|
|
|
|
;pointers for array elements
|
|
%in0 = getelementptr %arr, %arr* @input, i32 0, i32 0
|
|
%in1 = getelementptr %arr, %arr* @input, i32 0, i32 1
|
|
%in2 = getelementptr %arr, %arr* @input, i32 0, i32 2
|
|
%in3 = getelementptr %arr, %arr* @input, i32 0, i32 3
|
|
%in4 = getelementptr %arr, %arr* @input, i32 0, i32 4
|
|
%in5 = getelementptr %arr, %arr* @input, i32 0, i32 5
|
|
%in6 = getelementptr %arr, %arr* @input, i32 0, i32 6
|
|
%in7 = getelementptr %arr, %arr* @input, i32 0, i32 7
|
|
%in8 = getelementptr %arr, %arr* @input, i32 0, i32 8
|
|
%in9 = getelementptr %arr, %arr* @input, i32 0, i32 9
|
|
%in10 = getelementptr %arr, %arr* @input, i32 0, i32 10
|
|
%in11 = getelementptr %arr, %arr* @input, i32 0, i32 11
|
|
%in12 = getelementptr %arr, %arr* @input, i32 0, i32 12
|
|
%in13 = getelementptr %arr, %arr* @input, i32 0, i32 13
|
|
|
|
;initial elements
|
|
%a0 = load i64, i64* %in0
|
|
%a1 = load i64, i64* %in1
|
|
%a2 = load i64, i64* %in2
|
|
%a3 = load i64, i64* %in3
|
|
%a4 = load i64, i64* %in4
|
|
%a5 = load i64, i64* %in5
|
|
%a6 = load i64, i64* %in6
|
|
%a7 = load i64, i64* %in7
|
|
%a8 = load i64, i64* %in8
|
|
%a9 = load i64, i64* %in9
|
|
%a10 = load i64, i64* %in10
|
|
%a11 = load i64, i64* %in11
|
|
%a12 = load i64, i64* %in12
|
|
%a13 = load i64, i64* %in13
|
|
|
|
;sort
|
|
call void @quicksort(%arr* @input, i64 0, i64 13)
|
|
|
|
;get sorted array
|
|
%b0 = load i64, i64* %in0
|
|
%b1 = load i64, i64* %in1
|
|
%b2 = load i64, i64* %in2
|
|
%b3 = load i64, i64* %in3
|
|
%b4 = load i64, i64* %in4
|
|
%b5 = load i64, i64* %in5
|
|
%b6 = load i64, i64* %in6
|
|
%b7 = load i64, i64* %in7
|
|
%b8 = load i64, i64* %in8
|
|
%b9 = load i64, i64* %in9
|
|
%b10 = load i64, i64* %in10
|
|
%b11 = load i64, i64* %in11
|
|
%b12 = load i64, i64* %in12
|
|
%b13 = load i64, i64* %in13
|
|
|
|
%s = getelementptr [170 x i8], [170 x i8]* @output_str, i32 0, i32 0
|
|
|
|
call void @printf(i8* %s, i64 %a0, i64 %a1, i64 %a2, i64 %a3, i64 %a4, i64 %a5, i64 %a6, i64 %a7, i64 %a8, i64 %a9, i64 %a10, i64 %a11, i64 %a12, i64 %a13, i64 %b0, i64 %b1, i64 %b2, i64 %b3, i64 %b4, i64 %b5, i64 %b6, i64 %b7, i64 %b8, i64 %b9, i64 %b10, i64 %b11, i64 %b12, i64 %b13)
|
|
|
|
ret i64 1
|
|
|
|
|
|
} |