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:
33
builtins.m4
33
builtins.m4
@@ -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
|
||||
}
|
||||
|
||||
|
||||
44
stdlib.ispc
44
stdlib.ispc
@@ -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);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
6
tests_errors/redeclare.ispc
Normal file
6
tests_errors/redeclare.ispc
Normal file
@@ -0,0 +1,6 @@
|
||||
// Ignoring redeclaration of symbol "a"
|
||||
|
||||
void foo() {
|
||||
int a;
|
||||
int a;
|
||||
}
|
||||
8
tests_errors/shadow.ispc
Normal file
8
tests_errors/shadow.ispc
Normal file
@@ -0,0 +1,8 @@
|
||||
// Symbol "a" shadows symbol declared in outer scope
|
||||
|
||||
void foo() {
|
||||
int a;
|
||||
{
|
||||
int a;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user