48 lines
No EOL
1.2 KiB
LLVM
48 lines
No EOL
1.2 KiB
LLVM
%arr = type [3 x i64]
|
|
|
|
@value = global %arr [ i64 3, i64 7, i64 1]
|
|
|
|
define i64 @cube(i64 %n) {
|
|
%1 = mul i64 %n, %n
|
|
%2 = mul i64 %1, %n
|
|
ret i64 %2
|
|
}
|
|
|
|
define i64 @value_lookup(i64 %i) {
|
|
%ptr = getelementptr %arr, %arr* @value, i64 0, i64 %i
|
|
%ret = load i64, i64* %ptr
|
|
ret i64 %ret
|
|
}
|
|
|
|
define i64 @sum_three(i64 %0, i64 %1, i64 %2) {
|
|
%add1 = add i64 %0, %1
|
|
%add2 = add i64 %add1, %2
|
|
ret i64 %add2
|
|
}
|
|
|
|
define i64 @number_from_digits(i64 %0, i64 %1, i64 %2) {
|
|
%hundreds = mul i64 %0, 100
|
|
%tens = mul i64 %1, 10
|
|
%ones = mul i64 %2, 1
|
|
%res = call i64 @sum_three(i64 %ones, i64 %tens, i64 %hundreds)
|
|
ret i64 %res
|
|
}
|
|
|
|
define i64 @main(i64 %argc, i8** %arcv) {
|
|
%a = call i64 @value_lookup(i64 0)
|
|
%b = call i64 @value_lookup(i64 1)
|
|
%c = call i64 @value_lookup(i64 2)
|
|
%v = call i64 @number_from_digits(i64 %a, i64 %b, i64 %c)
|
|
|
|
%a_cubed = call i64 @cube(i64 %a)
|
|
%b_cubed = call i64 @cube(i64 %b)
|
|
%c_cubed = call i64 @cube(i64 %c)
|
|
%sum_cubed = call i64 @sum_three(i64 %a_cubed, i64 %b_cubed, i64 %c_cubed)
|
|
|
|
%cmp = icmp eq i64 %v, %sum_cubed
|
|
br i1 %cmp, label %ret_true, label %ret_false
|
|
ret_true:
|
|
ret i64 1
|
|
ret_false:
|
|
ret i64 0
|
|
} |