Bugfix for non-const shift amt and unit tests.
This commit is contained in:
@@ -815,7 +815,6 @@ forloop(i, 1, eval(WIDTH-1), ` %ret_`'i = insertelement <WIDTH x $1> %ret_`'eva
|
|||||||
ret <WIDTH x $1> %ret_`'eval(WIDTH-1)
|
ret <WIDTH x $1> %ret_`'eval(WIDTH-1)
|
||||||
|
|
||||||
not_const:
|
not_const:
|
||||||
; store two instances of the vector into memory
|
|
||||||
%ptr = alloca <WIDTH x $1>, i32 3
|
%ptr = alloca <WIDTH x $1>, i32 3
|
||||||
%ptr0 = getelementptr <WIDTH x $1> * %ptr, i32 0
|
%ptr0 = getelementptr <WIDTH x $1> * %ptr, i32 0
|
||||||
store <WIDTH x $1> zeroinitializer, <WIDTH x $1> * %ptr0
|
store <WIDTH x $1> zeroinitializer, <WIDTH x $1> * %ptr0
|
||||||
@@ -824,8 +823,7 @@ not_const:
|
|||||||
%ptr2 = getelementptr <WIDTH x $1> * %ptr, i32 2
|
%ptr2 = getelementptr <WIDTH x $1> * %ptr, i32 2
|
||||||
store <WIDTH x $1> zeroinitializer, <WIDTH x $1> * %ptr2
|
store <WIDTH x $1> zeroinitializer, <WIDTH x $1> * %ptr2
|
||||||
|
|
||||||
; compute offset in [0,vectorwidth-1], then index into the doubled-up vector
|
%offset = add i32 %1, WIDTH
|
||||||
%offset = add i32 %1, 16
|
|
||||||
%ptr_as_elt_array = bitcast <WIDTH x $1> * %ptr to [eval(3*WIDTH) x $1] *
|
%ptr_as_elt_array = bitcast <WIDTH x $1> * %ptr to [eval(3*WIDTH) x $1] *
|
||||||
%load_ptr = getelementptr [eval(3*WIDTH) x $1] * %ptr_as_elt_array, i32 0, i32 %offset
|
%load_ptr = getelementptr [eval(3*WIDTH) x $1] * %ptr_as_elt_array, i32 0, i32 %offset
|
||||||
%load_ptr_vec = bitcast $1 * %load_ptr to <WIDTH x $1> *
|
%load_ptr_vec = bitcast $1 * %load_ptr to <WIDTH x $1> *
|
||||||
|
|||||||
14
tests/shift-1.ispc
Normal file
14
tests/shift-1.ispc
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
|
||||||
|
export uniform int width() { return programCount; }
|
||||||
|
|
||||||
|
export void f_fu(uniform float RET[], uniform float aFOO[], uniform float b) {
|
||||||
|
int a = aFOO[programIndex];
|
||||||
|
int rot = shift(a, -1);
|
||||||
|
RET[programIndex] = rot;
|
||||||
|
}
|
||||||
|
|
||||||
|
export void result(uniform float RET[]) {
|
||||||
|
varying int val = programIndex;
|
||||||
|
if (val < 0) val = 0;
|
||||||
|
RET[programIndex] = val;
|
||||||
|
}
|
||||||
15
tests/shift-2.ispc
Normal file
15
tests/shift-2.ispc
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
|
||||||
|
export uniform int width() { return programCount; }
|
||||||
|
|
||||||
|
export void f_fu(uniform float RET[], uniform float aFOO[], uniform float b) {
|
||||||
|
int a = aFOO[programIndex];
|
||||||
|
uniform int delta = b - 6; // -1
|
||||||
|
int rot = shift(a, delta);
|
||||||
|
RET[programIndex] = rot;
|
||||||
|
}
|
||||||
|
|
||||||
|
export void result(uniform float RET[]) {
|
||||||
|
varying int val = programIndex;
|
||||||
|
if (val < 0) val = 0;
|
||||||
|
RET[programIndex] = val;
|
||||||
|
}
|
||||||
14
tests/shift-3.ispc
Normal file
14
tests/shift-3.ispc
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
|
||||||
|
export uniform int width() { return programCount; }
|
||||||
|
|
||||||
|
export void f_fu(uniform float RET[], uniform float aFOO[], uniform float b) {
|
||||||
|
int a = aFOO[programIndex];
|
||||||
|
int rot = shift(a, 1);
|
||||||
|
RET[programIndex] = rot;
|
||||||
|
}
|
||||||
|
|
||||||
|
export void result(uniform float RET[]) {
|
||||||
|
varying int val = 2 + programIndex;
|
||||||
|
if (val > programCount) val = 0;
|
||||||
|
RET[programIndex] = val;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user