<div dir="ltr"><div>We don't support the subscript operator directly on RVV vectors because we don't know how many elements can fit in a register. The *a1 and *a2 will try to read an entire register worth of data, but there is no guarantee that 5 ints will fit in a register. It might only fit 4. You'll need an outer loop to handle that case. A more correct version looks something like this</div><div><br></div><div><div style="color:rgb(0,0,0);background-color:rgb(255,255,254);font-family:Consolas,"Liberation Mono",Courier,monospace,Menlo,Monaco,"Courier New",monospace;font-size:14px;line-height:21px;white-space:pre"><div><span style="color:rgb(0,0,255)">#include<</span><span style="color:rgb(163,21,21)">stdio.h</span><span style="color:rgb(0,0,255)">></span></div><div><span style="color:rgb(0,0,255)">#include<</span><span style="color:rgb(163,21,21)">stdlib.h</span><span style="color:rgb(0,0,255)">></span></div><div><span style="color:rgb(0,0,255)">#include<</span><span style="color:rgb(163,21,21)">math.h</span><span style="color:rgb(0,0,255)">></span></div><div><span style="color:rgb(0,0,255)">#include<</span><span style="color:rgb(163,21,21)">riscv_vector.h</span><span style="color:rgb(0,0,255)">></span></div><br><div><span style="color:rgb(0,0,255)">int</span> main(){</div><div> <span style="color:rgb(0,0,255)">int</span> input1[<span style="color:rgb(9,134,88)">5</span>] = {<span style="color:rgb(9,134,88)">0</span>,<span style="color:rgb(9,134,88)">1</span>,<span style="color:rgb(9,134,88)">2</span>,<span style="color:rgb(9,134,88)">4</span>,<span style="color:rgb(9,134,88)">6</span>};</div><div> <span style="color:rgb(0,0,255)">int</span> input2[<span style="color:rgb(9,134,88)">5</span>] = {<span style="color:rgb(9,134,88)">0</span>,<span style="color:rgb(9,134,88)">1</span>,<span style="color:rgb(9,134,88)">2</span>,<span style="color:rgb(9,134,88)">4</span>,<span style="color:rgb(9,134,88)">6</span>};</div><div> <span style="color:rgb(0,0,255)">int</span> *input1ptr = input1;</div><div> <span style="color:rgb(0,0,255)">int</span> *input2ptr = input2;</div><br><div> <span style="color:rgb(0,0,255)">int</span> elts = <span style="color:rgb(9,134,88)">5</span>;</div><div> <span style="color:rgb(0,0,255)">do</span> {</div><div>  <span style="color:rgb(0,128,0)">// Ask hardware how many elements we can read at once.</span></div><div>  <span style="color:rgb(0,0,255)">int</span> vl = vsetvl_e32m1(<span style="color:rgb(9,134,88)">5</span>);</div><div>  vint32m1_t a1 = vle32_v_i32m1(input1ptr, vl);</div><div>  vint32m1_t a2 = vle32_v_i32m1(input2ptr, vl);</div><div>  vint32m1_t bb = vadd_vv_i32m1(a1, a2, vl);</div><br><div>  <span style="color:rgb(0,0,255)">for</span> (<span style="color:rgb(0,0,255)">int</span> i=<span style="color:rgb(9,134,88)">0</span>;i<vl;i++) {</div><div>   <span style="color:rgb(0,128,0)">// Shift element to lsbs.</span></div><div>   vint32m1_t shift = vslidedown_vx_i32m1(vundefined_i32m1(), bb, i, vl);</div><div>   <span style="color:rgb(0,128,0)">// Extract element 0 and print.</span></div><div>   printf(<span style="color:rgb(163,21,21)">"%d\n"</span>,vmv_x_s_i32m1_i32(shift));</div><div>  }</div><br><div>  <span style="color:rgb(0,128,0)">// Decrement elts by number read;</span></div><div>  elts -= vl;</div><div>  <span style="color:rgb(0,128,0)">// Increment by pointers by the number read.</span></div><div>  input1ptr += vl;</div><div>  input2ptr += vl;</div><div> } <span style="color:rgb(0,0,255)">while</span> (elts != <span style="color:rgb(9,134,88)">0</span>);</div><br><div> <span style="color:rgb(0,0,255)">return</span> <span style="color:rgb(9,134,88)">1</span>;</div><br><div>}</div></div></div><div><br></div><div><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature">~Craig</div></div><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Jun 14, 2021 at 9:25 PM liao via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div style="line-height:1.7;color:rgb(0,0,0);font-size:14px;font-family:Arial"><div>Is RVV used correctly in this way? If so, are there any suggestions for code implementation?</div><div><br></div><div>testcase: </div><p style="margin:0px">#include<stdio.h></p><p style="margin:0px">#include<stdlib.h></p><p style="margin:0px">#include<math.h></p><p style="margin:0px">#include<riscv_vector.h></p><p style="margin:0px">int main(){</p><p style="margin:0px"> int input1[5] = {0,1,2,4,6};</p><p style="margin:0px"> int input2[5] = {0,1,2,4,6};</p><p style="margin:0px"> vint32m1_t *a1 = (vint32m1_t *)input1;</p><p style="margin:0px"> vint32m1_t *a2 = (vint32m1_t *)input2;</p><p style="margin:0px"> vint32m1_t bb;</p><p style="margin:0px"> int vl = vsetvl_e32m1(10000);</p><p style="margin:0px"> bb = vadd_vv_i32m1( *a1, *a2, vl);</p><p style="margin:0px"> for (int i=0;i<5;i++)</p><p style="margin:0px">   printf("%d\n",bb[i]);</p><p style="margin:0px"> return 1;</p><p style="margin:0px">}</p><p style="margin:0px"><br></p><p style="margin:0px">error:</p><p style="margin:0px">clang --target=riscv64-unknown-linux-gnu   -march=rv64gcv0p10  -menable-experimental-extensions  --sysroot=xxx  --gcc-toolchain=xxx test.c</p><p style="margin:0px">Error: </p><p style="margin:0px">test.c:14:20: error: subscripted value is not an array, pointer, or vector</p><p style="margin:0px">   printf("%d\n",bb[i]);</p><div><br></div></div><br><br><span title="neteasefooter"><p> </p></span>_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
</blockquote></div>