From 5a8351d7ea38de832162e726de3b214f22dd3d01 Mon Sep 17 00:00:00 2001 From: Evghenii Date: Fri, 24 Jan 2014 09:22:55 +0100 Subject: [PATCH] added varying new/delete --- builtins/util-nvptx.m4 | 54 +++++++++++++++++++++++++++++++++++++++--- expr.cpp | 2 +- tests/soa-22.ispc | 4 +++- 3 files changed, 55 insertions(+), 5 deletions(-) diff --git a/builtins/util-nvptx.m4 b/builtins/util-nvptx.m4 index 62b2391c..804c07e3 100644 --- a/builtins/util-nvptx.m4 +++ b/builtins/util-nvptx.m4 @@ -2204,10 +2204,58 @@ if.end: ; preds = %if.then, %entry ret void } -declare @__new_varying32_64rt( %size, %mask); -declare @__new_varying64_64rt( %size, %mask); -declare void @__delete_varying_64rt( %ptr, %mask); +define <1 x i64> @__new_varying32_64rt(<1 x i32> %sizev, <1 x i1> %maskv) +{ +entry: + %size32 = extractelement <1 x i32> %sizev, i32 0 + %mask = extractelement <1 x i1> %maskv, i32 0 + %size64 = zext i32 %size32 to i64 + br i1 %mask, label %alloc, label %skip +alloc: + %ptr = tail call noalias i8* @malloc(i64 %size64) + %addr1 = ptrtoint i8* %ptr to i64 + br label %skip + +skip: + %addr64 = phi i64 [ %addr1, %alloc], [ 0, %entry ] + %addr = insertelement <1 x i64> undef, i64 %addr64, i32 0 + ret <1 x i64> %addr +} + +define <1 x i64> @__new_varying64_64rt(<1 x i64> %sizev, <1 x i1> %maskv) +{ +entry: + %size64 = extractelement <1 x i64> %sizev, i32 0 + %mask = extractelement <1 x i1> %maskv, i32 0 + br i1 %mask, label %alloc, label %skip + +alloc: + %ptr = tail call noalias i8* @malloc(i64 %size64) + %addr1 = ptrtoint i8* %ptr to i64 + br label %skip + +skip: + %addr64 = phi i64 [ %addr1, %alloc], [ 0, %entry ] + %addr = insertelement <1 x i64> undef, i64 %addr64, i32 0 + ret <1 x i64> %addr +} + +define void @__delete_varying_64rt(<1 x i64> %ptrv, <1 x i1> %maskv) +{ +entry: + %addr64 = extractelement <1 x i64> %ptrv, i32 0 + %mask = extractelement <1 x i1> %maskv, i32 0 + br i1 %mask, label %free, label %skip + +free: + %ptr = inttoptr i64 %addr64 to i8* + tail call void @free(i8* %ptr) + br label %skip + +skip: + ret void +} ', ` errprint(`RUNTIME should be defined to either 32 or 64 ') diff --git a/expr.cpp b/expr.cpp index e7e99b83..bfa14d22 100644 --- a/expr.cpp +++ b/expr.cpp @@ -8654,7 +8654,7 @@ NewExpr::TypeCheck() { } if (g->target->getISA() == Target::NVPTX && allocType->IsVaryingType()) { - Error(pos, "\"sizeof\" with varying data types is not yet supported with \"nvptx\" target."); + Error(pos, "\"new\" with varying data types is not yet supported with \"nvptx\" target."); return NULL; } if (CastType(allocType) != NULL) { diff --git a/tests/soa-22.ispc b/tests/soa-22.ispc index 60448694..4d8fd299 100644 --- a/tests/soa-22.ispc +++ b/tests/soa-22.ispc @@ -25,8 +25,10 @@ export void f_fu(uniform float RET[], uniform float aFOO[], uniform float b) { } } } - + +#ifndef __NVPTX__ assert(programIndex < 80); +#endif RET[programIndex] = pts[programIndex].pts[programIndex % 3][programIndex % 4].z; }