llvm_build_utils 0.3.0

Ever wanted to build “native” assembly stuff in your cargo build scripts… something gcc crate cannot quite handle yet? Welcome to llvm_build_utils which provides a convenient API to pack your .ll or .bc files into a ready to use archive full of machine code! It doesn’t even need an installation of LLVM*!
declare {i16, i32} @llvm.x86.rdseed.16()
declare {i32, i32} @llvm.x86.rdseed.32()
declare {i64, i32} @llvm.x86.rdseed.64()

define i64 @librdrand_rust_seed_64() {
    br label %body
body:
    %result = tail call {i64, i32} @llvm.x86.rdseed.64() nounwind
    %flag = extractvalue {i64, i32} %result, 1
    %boolflag = icmp eq i32 %flag, 0
    br i1 %boolflag, label %body, label %done
done:
    %val = extractvalue {i64, i32} %result, 0
    ret i64 %val
}

define i32 @librdrand_rust_seed_32() {
    br label %body
body:
    %result = tail call {i32, i32} @llvm.x86.rdseed.32() nounwind
    %flag = extractvalue {i32, i32} %result, 1
    %boolflag = icmp eq i32 %flag, 0
    br i1 %boolflag, label %body, label %done
done:
    %val = extractvalue {i32, i32} %result, 0
    ret i32 %val
}

define i16 @librdrand_rust_seed_16() {
    br label %body
body:
    %result = tail call {i16, i32} @llvm.x86.rdseed.16() nounwind
    %flag = extractvalue {i16, i32} %result, 1
    %boolflag = icmp eq i32 %flag, 0
    br i1 %boolflag, label %body, label %done
done:
    %val = extractvalue {i16, i32} %result, 0
    ret i16 %val
}

define zeroext i1 @librdrand_rust_has_rdseed() unnamed_addr #0 {
entry-block:
  %0 = tail call { i32, i32, i32, i32 } asm "cpuid", "={eax},={ebx},={ecx},={edx},0,2,~{dirflag},~{fpsr},~{flags}"(i32 7, i32 0)
  %1 = extractvalue { i32, i32, i32, i32 } %0, 1
  %2 = and i32 %1, 262144
  %3 = icmp ne i32 %2, 0
  ret i1 %3
}