Fix AoS/SoA stdlib functions to match documentation

(i.e. actually remove the old offset parameter stuff now that
we can actually pass pointers.)
This commit is contained in:
Matt Pharr
2011-12-03 22:37:53 -08:00
parent 3efbfc30b7
commit 186d0223d2
12 changed files with 55 additions and 52 deletions

View File

@@ -1660,11 +1660,10 @@ define void
;; versions to be called from stdlib
define void
@__aos_to_soa4_float(float * noalias %pf, i32 %offset,
@__aos_to_soa4_float(float * noalias %p,
<$1 x float> * noalias %out0, <$1 x float> * noalias %out1,
<$1 x float> * noalias %out2, <$1 x float> * noalias %out3)
nounwind alwaysinline {
%p = getelementptr float * %pf, i32 %offset
%p0 = bitcast float * %p to <$1 x float> *
%v0 = load <$1 x float> * %p0, align 4
%p1 = getelementptr <$1 x float> * %p0, i32 1
@@ -1681,16 +1680,16 @@ define void
define void
@__aos_to_soa4_int32(i32 * noalias %base, i32 %offset,
@__aos_to_soa4_int32(i32 * noalias %ptr,
<$1 x i32> * noalias %out0, <$1 x i32> * noalias %out1,
<$1 x i32> * noalias %out2, <$1 x i32> * noalias %out3)
nounwind alwaysinline {
%fbase = bitcast i32 * %base to float *
%fptr = bitcast i32 * %ptr to float *
%fout0 = bitcast <$1 x i32> * %out0 to <$1 x float> *
%fout1 = bitcast <$1 x i32> * %out1 to <$1 x float> *
%fout2 = bitcast <$1 x i32> * %out2 to <$1 x float> *
%fout3 = bitcast <$1 x i32> * %out3 to <$1 x float> *
call void @__aos_to_soa4_float(float * %fbase, i32 %offset,
call void @__aos_to_soa4_float(float * %fptr,
<$1 x float> * %fout0, <$1 x float> * %fout1, <$1 x float> * %fout2,
<$1 x float> * %fout3)
ret void
@@ -1699,9 +1698,7 @@ define void
define void
@__soa_to_aos4_float(<$1 x float> %v0, <$1 x float> %v1, <$1 x float> %v2,
<$1 x float> %v3, float * noalias %pf,
i32 %offset) nounwind alwaysinline {
%p = getelementptr float * %pf, i32 %offset
<$1 x float> %v3, float * noalias %p) nounwind alwaysinline {
%out0 = bitcast float * %p to <$1 x float> *
%out1 = getelementptr <$1 x float> * %out0, i32 1
%out2 = getelementptr <$1 x float> * %out0, i32 2
@@ -1715,25 +1712,22 @@ define void
define void
@__soa_to_aos4_int32(<$1 x i32> %v0, <$1 x i32> %v1, <$1 x i32> %v2,
<$1 x i32> %v3, i32 * noalias %base,
i32 %offset) nounwind alwaysinline {
<$1 x i32> %v3, i32 * noalias %base) nounwind alwaysinline {
%fv0 = bitcast <$1 x i32> %v0 to <$1 x float>
%fv1 = bitcast <$1 x i32> %v1 to <$1 x float>
%fv2 = bitcast <$1 x i32> %v2 to <$1 x float>
%fv3 = bitcast <$1 x i32> %v3 to <$1 x float>
%fbase = bitcast i32 * %base to float *
call void @__soa_to_aos4_float(<$1 x float> %fv0, <$1 x float> %fv1,
<$1 x float> %fv2, <$1 x float> %fv3, float * %fbase,
i32 %offset)
<$1 x float> %fv2, <$1 x float> %fv3, float * %fbase)
ret void
}
define void
@__aos_to_soa3_float(float * noalias %pf, i32 %offset,
@__aos_to_soa3_float(float * noalias %p,
<$1 x float> * %out0, <$1 x float> * %out1,
<$1 x float> * %out2) nounwind alwaysinline {
%p = getelementptr float * %pf, i32 %offset
%p0 = bitcast float * %p to <$1 x float> *
%v0 = load <$1 x float> * %p0, align 4
%p1 = getelementptr <$1 x float> * %p0, i32 1
@@ -1748,14 +1742,14 @@ define void
define void
@__aos_to_soa3_int32(i32 * noalias %base, i32 %offset,
@__aos_to_soa3_int32(i32 * noalias %base,
<$1 x i32> * noalias %out0, <$1 x i32> * noalias %out1,
<$1 x i32> * noalias %out2) nounwind alwaysinline {
%fbase = bitcast i32 * %base to float *
%fout0 = bitcast <$1 x i32> * %out0 to <$1 x float> *
%fout1 = bitcast <$1 x i32> * %out1 to <$1 x float> *
%fout2 = bitcast <$1 x i32> * %out2 to <$1 x float> *
call void @__aos_to_soa3_float(float * %fbase, i32 %offset,
call void @__aos_to_soa3_float(float * %fbase,
<$1 x float> * %fout0, <$1 x float> * %fout1, <$1 x float> * %fout2)
ret void
}
@@ -1763,8 +1757,7 @@ define void
define void
@__soa_to_aos3_float(<$1 x float> %v0, <$1 x float> %v1, <$1 x float> %v2,
float * noalias %pf, i32 %offset) nounwind alwaysinline {
%p = getelementptr float * %pf, i32 %offset
float * noalias %p) nounwind alwaysinline {
%out0 = bitcast float * %p to <$1 x float> *
%out1 = getelementptr <$1 x float> * %out0, i32 1
%out2 = getelementptr <$1 x float> * %out0, i32 2
@@ -1777,13 +1770,13 @@ define void
define void
@__soa_to_aos3_int32(<$1 x i32> %v0, <$1 x i32> %v1, <$1 x i32> %v2,
i32 * noalias %base, i32 %offset) nounwind alwaysinline {
i32 * noalias %base) nounwind alwaysinline {
%fv0 = bitcast <$1 x i32> %v0 to <$1 x float>
%fv1 = bitcast <$1 x i32> %v1 to <$1 x float>
%fv2 = bitcast <$1 x i32> %v2 to <$1 x float>
%fbase = bitcast i32 * %base to float *
call void @__soa_to_aos3_float(<$1 x float> %fv0, <$1 x float> %fv1,
<$1 x float> %fv2, float * %fbase, i32 %offset)
<$1 x float> %fv2, float * %fbase)
ret void
}

View File

@@ -426,51 +426,47 @@ count_trailing_zeros(int64 v) {
// AOS/SOA conversion
static inline void
aos_to_soa3(uniform float a[], uniform int offset, float * uniform v0,
float * uniform v1, float * uniform v2) {
__aos_to_soa3_float(&a[0], offset, v0, v1, v2);
aos_to_soa3(uniform float a[], float * uniform v0, float * uniform v1,
float * uniform v2) {
__aos_to_soa3_float(a, v0, v1, v2);
}
static inline void
soa_to_aos3(float v0, float v1, float v2, uniform float a[],
uniform int offset) {
__soa_to_aos3_float(v0, v1, v2, &a[0], offset);
soa_to_aos3(float v0, float v1, float v2, uniform float a[]) {
__soa_to_aos3_float(v0, v1, v2, a);
}
static inline void
aos_to_soa4(uniform float a[], uniform int offset, float * uniform v0,
float * uniform v1, float * uniform v2, float * uniform v3) {
__aos_to_soa4_float(&a[0], offset, v0, v1, v2, v3);
aos_to_soa4(uniform float a[], float * uniform v0, float * uniform v1,
float * uniform v2, float * uniform v3) {
__aos_to_soa4_float(a, v0, v1, v2, v3);
}
static inline void
soa_to_aos4(float v0, float v1, float v2, float v3, uniform float a[],
uniform int offset) {
__soa_to_aos4_float(v0, v1, v2, v3, &a[0], offset);
soa_to_aos4(float v0, float v1, float v2, float v3, uniform float a[]) {
__soa_to_aos4_float(v0, v1, v2, v3, a);
}
static inline void
aos_to_soa3(uniform int32 a[], uniform int offset, int32 * uniform v0,
int32 * uniform v1, int32 * uniform v2) {
__aos_to_soa3_int32(&a[0], offset, v0, v1, v2);
aos_to_soa3(uniform int32 a[], int32 * uniform v0, int32 * uniform v1,
int32 * uniform v2) {
__aos_to_soa3_int32(a, v0, v1, v2);
}
static inline void
soa_to_aos3(int32 v0, int32 v1, int32 v2, uniform int32 a[],
uniform int offset) {
__soa_to_aos3_int32(v0, v1, v2, &a[0], offset);
soa_to_aos3(int32 v0, int32 v1, int32 v2, uniform int32 a[]) {
__soa_to_aos3_int32(v0, v1, v2, a);
}
static inline void
aos_to_soa4(uniform int32 a[], uniform int offset, int32 * uniform v0,
int32 * uniform v1, int32 * uniform v2, int32 * uniform v3) {
__aos_to_soa4_int32(&a[0], offset, v0, v1, v2, v3);
aos_to_soa4(uniform int32 a[], int32 * uniform v0, int32 * uniform v1,
int32 * uniform v2, int32 * uniform v3) {
__aos_to_soa4_int32(a, v0, v1, v2, v3);
}
static inline void
soa_to_aos4(int32 v0, int32 v1, int32 v2, int32 v3, uniform int32 a[],
uniform int offset) {
__soa_to_aos4_int32(v0, v1, v2, v3, &a[0], offset);
soa_to_aos4(int32 v0, int32 v1, int32 v2, int32 v3, uniform int32 a[]) {
__soa_to_aos4_int32(v0, v1, v2, v3, a);
}
///////////////////////////////////////////////////////////////////////////

View File

@@ -11,7 +11,7 @@ export void f_v(uniform float RET[]) {
a[i] = i;
float x=-1, y=-1, z=-1;
aos_to_soa3(a, 0, &x, &y, &z);
aos_to_soa3(a, &x, &y, &z);
int errs = 0;
if (x != width * programIndex) ++errs;

View File

@@ -11,7 +11,7 @@ export void f_v(uniform float RET[]) {
a[i] = i;
float x=-1, y=-1, z=-1, w=-1;
aos_to_soa4(a, 0, &x, &y, &z, &w);
aos_to_soa4(a, &x, &y, &z, &w);
int errs = 0;
if (x != width * programIndex) ++errs;

View File

@@ -13,7 +13,7 @@ export void f_v(uniform float RET[]) {
float z = 2 + width * programIndex;
float w = 3 + width * programIndex;
soa_to_aos4(x, y, z, w, a, 0);
soa_to_aos4(x, y, z, w, a);
uniform int errs = 0;
for (uniform int i = 0; i < width * programCount; ++i)
if (a[i] != i) ++errs;

View File

@@ -12,7 +12,7 @@ export void f_v(uniform float RET[]) {
float y = 1 + width * programIndex;
float z = 2 + width * programIndex;
soa_to_aos3(x, y, z, a, 0);
soa_to_aos3(x, y, z, a);
uniform int errs = 0;
for (uniform int i = 0; i < width * programCount; ++i)
if (a[i] != i) ++errs;

View File

@@ -11,7 +11,7 @@ export void f_v(uniform float RET[]) {
a[i] = i;
int x=-1, y=-1, z=-1;
aos_to_soa3(a, 0, &x, &y, &z);
aos_to_soa3(a, &x, &y, &z);
int errs = 0;
if (x != width * programIndex) ++errs;

View File

@@ -11,7 +11,7 @@ export void f_v(uniform float RET[]) {
a[i] = i;
int x=-1, y=-1, z=-1, w=-1;
aos_to_soa4(a, 0, &x, &y, &z, &w);
aos_to_soa4(a, &x, &y, &z, &w);
int errs = 0;
if (x != width * programIndex) ++errs;

View File

@@ -13,7 +13,7 @@ export void f_v(uniform float RET[]) {
int z = 2 + width * programIndex;
int w = 3 + width * programIndex;
soa_to_aos4(x, y, z, w, a, 0);
soa_to_aos4(x, y, z, w, a);
uniform int errs = 0;
for (uniform int i = 0; i < width * programCount; ++i)
if (a[i] != i) ++errs;

View File

@@ -12,7 +12,7 @@ export void f_v(uniform float RET[]) {
int y = 1 + width * programIndex;
int z = 2 + width * programIndex;
soa_to_aos3(x, y, z, a, 0);
soa_to_aos3(x, y, z, a);
uniform int errs = 0;
for (uniform int i = 0; i < width * programCount; ++i)
if (a[i] != i) ++errs;

View File

@@ -0,0 +1,6 @@
// Ignoring redeclaration of symbol "a"
void foo() {
int a;
int a;
}

8
tests_errors/shadow.ispc Normal file
View File

@@ -0,0 +1,8 @@
// Symbol "a" shadows symbol declared in outer scope
void foo() {
int a;
{
int a;
}
}