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
}