Change hw6 to an unsolved version.
Signed-off-by: jmug <u.g.a.mariano@gmail.com>
This commit is contained in:
parent
0c04936ccf
commit
ee01a8f5b2
186 changed files with 9605 additions and 4019 deletions
55
hw6/llprograms/sp24_hw3/find_power_of_two.ll
Normal file
55
hw6/llprograms/sp24_hw3/find_power_of_two.ll
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
%consList = type { i64, %consList* }
|
||||
|
||||
@nonPowerOfTwoElem = global %consList { i64 9, %consList* null }
|
||||
@powerOfTwoElem = global %consList { i64 64, %consList* @nonPowerOfTwoElem }
|
||||
@head = global %consList { i64 31, %consList* @powerOfTwoElem }
|
||||
|
||||
define i64 @numOneBits(i64 %n) {
|
||||
%isZero = icmp eq i64 %n, 0
|
||||
br i1 %isZero, label %retZero, label %rec
|
||||
retZero:
|
||||
ret i64 0
|
||||
rec:
|
||||
%shifted = lshr i64 %n, 1
|
||||
%recResult = call i64 @numOneBits(i64 %shifted)
|
||||
%lsb = and i64 %n, 1
|
||||
%result = add i64 %recResult, %lsb
|
||||
ret i64 %result
|
||||
}
|
||||
|
||||
define i1 @isPowerOfTwo(i64 %n) {
|
||||
%isNotPositive = icmp sle i64 %n, 0
|
||||
br i1 %isNotPositive, label %retFalse, label %continue
|
||||
retFalse:
|
||||
ret i1 0
|
||||
continue:
|
||||
%numOnes = call i64 @numOneBits(i64 %n)
|
||||
%hasSingleOneBit = icmp eq i64 %numOnes, 1
|
||||
br i1 %hasSingleOneBit, label %retTrue, label %retFalse
|
||||
retTrue:
|
||||
ret i1 1
|
||||
}
|
||||
|
||||
define i64 @findFirstPowerOfTwo(%consList* %l) {
|
||||
%isNull = icmp eq %consList* %l, null
|
||||
br i1 %isNull, label %retFalse, label %continue
|
||||
retFalse:
|
||||
ret i64 0
|
||||
continue:
|
||||
%currNumPtr = getelementptr %consList, %consList* %l, i32 0, i32 0
|
||||
%currNum = load i64, i64* %currNumPtr
|
||||
%isPowTwo = call i1 @isPowerOfTwo(i64 %currNum)
|
||||
br i1 %isPowTwo, label %retTrue, label %rec
|
||||
retTrue:
|
||||
ret i64 %currNum
|
||||
rec:
|
||||
%nextPtr = getelementptr %consList, %consList* %l, i32 0, i32 1
|
||||
%next = load %consList*, %consList** %nextPtr
|
||||
%recResult = call i64 @findFirstPowerOfTwo(%consList* %next)
|
||||
ret i64 %recResult
|
||||
}
|
||||
|
||||
define i64 @main(i64 %argc, i8** %arcv) {
|
||||
%powTwoValue = call i64 @findFirstPowerOfTwo(%consList* @head)
|
||||
ret i64 %powTwoValue
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue