From 15a3ef370a433eedcf6e6650f07ec81775d0322d Mon Sep 17 00:00:00 2001 From: Matt Pharr Date: Tue, 23 Jul 2013 17:11:01 -0700 Subject: [PATCH] Use @llvm.readcyclecounter to implement stdlib clock() function. Also added a test for the clock builtin. --- builtins/util.m4 | 14 ++++---------- tests/clock.ispc | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 10 deletions(-) create mode 100644 tests/clock.ispc diff --git a/builtins/util.m4 b/builtins/util.m4 index d6f3e5c3..8c379781 100644 --- a/builtins/util.m4 +++ b/builtins/util.m4 @@ -2891,17 +2891,11 @@ m4exit(`1') ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; read hw clock +declare i64 @llvm.readcyclecounter() + define i64 @__clock() nounwind { -entry: - tail call void asm sideeffect "xorl %eax,%eax \0A cpuid", "~{rax},~{rbx},~{rcx},~{rdx},~{dirflag},~{fpsr},~{flags}"() nounwind - %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 + %r = call i64 @llvm.readcyclecounter() + ret i64 %r } ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/tests/clock.ispc b/tests/clock.ispc new file mode 100644 index 00000000..0e95379b --- /dev/null +++ b/tests/clock.ispc @@ -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; +}