Use @llvm.readcyclecounter to implement stdlib clock() function.
Also added a test for the clock builtin.
This commit is contained in:
@@ -2891,17 +2891,11 @@ m4exit(`1')
|
|||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; read hw clock
|
;; read hw clock
|
||||||
|
|
||||||
|
declare i64 @llvm.readcyclecounter()
|
||||||
|
|
||||||
define i64 @__clock() nounwind {
|
define i64 @__clock() nounwind {
|
||||||
entry:
|
%r = call i64 @llvm.readcyclecounter()
|
||||||
tail call void asm sideeffect "xorl %eax,%eax \0A cpuid", "~{rax},~{rbx},~{rcx},~{rdx},~{dirflag},~{fpsr},~{flags}"() nounwind
|
ret i64 %r
|
||||||
%0 = tail call { i32, i32 } asm sideeffect "rdtsc", "={ax},={dx},~{dirflag},~{fpsr},~{flags}"() nounwind
|
|
||||||
%asmresult = extractvalue { i32, i32 } %0, 0
|
|
||||||
%asmresult1 = extractvalue { i32, i32 } %0, 1
|
|
||||||
%conv = zext i32 %asmresult1 to i64
|
|
||||||
%shl = shl nuw i64 %conv, 32
|
|
||||||
%conv2 = zext i32 %asmresult to i64
|
|
||||||
%or = or i64 %shl, %conv2
|
|
||||||
ret i64 %or
|
|
||||||
}
|
}
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|||||||
14
tests/clock.ispc
Normal file
14
tests/clock.ispc
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
|
||||||
|
export uniform int width() { return programCount; }
|
||||||
|
|
||||||
|
|
||||||
|
export void f_f(uniform float RET[], uniform float aFOO[]) {
|
||||||
|
unsigned uniform int64 a = clock();
|
||||||
|
float x = pow(sqrt(aFOO[programIndex]), 5.5);
|
||||||
|
unsigned uniform int64 b = clock();
|
||||||
|
RET[programIndex] = (b - a) > 0 ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
export void result(uniform float RET[]) {
|
||||||
|
RET[programIndex] = 1;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user