<br><tt><font size=2>&gt; On Tuesday 29 May 2007, Brian Watt wrote:<br>
&gt; &gt; However, this can be only done when the entry point is equal
to<br>
&gt; &gt; spe-&gt;base_private-&gt;entry, and not just any LS address.
What I need is any<br>
&gt; &gt; entry address to be specified. In addition I need to allow setting
a<br>
&gt; &gt; variable number of SPE registers (from 3 up to 75), and then
upon<br>
&gt; &gt; completion it needs to return an updated register 3. What does
the mailing<br>
&gt; &gt; list think about such a capability and the modifications required
in<br>
&gt; &gt; LIBSPE2 to accomplish this?<br>
&gt; <br>
&gt; You could do it in theory, but it would be horribly inefficient. The
only<br>
&gt; time that you can set SPE general purpose registers is when the context<br>
&gt; is saved in kernel memory. Making a function call to the SPU this
way<br>
&gt; basically means having more overhead than starting the program in
the<br>
&gt; first place.<br>
</font></tt>
<br><tt><font size=2>Hmmm, there is no &quot;starting the program in the
first place&quot;, instead the</font></tt>
<br><tt><font size=2>SPU context would be created, and the program loaded
once per thread-of-control,</font></tt>
<br><tt><font size=2>then one or more SPE functions would be called as
requested by the PPE program</font></tt>
<br><tt><font size=2>using spe_context_run. So I don't see why there would
be any more overhead than</font></tt>
<br><tt><font size=2>today's starting of a main function or a SPE_RUN_USER_REGS
function.</font></tt>
<br>
<br><tt><font size=2>The difference in this approach is that the programming
model is made much</font></tt>
<br><tt><font size=2>simplier, because the developer need only write code
using the standard call-return</font></tt>
<br><tt><font size=2>paradigm and the system would under-the-covers do
the necessary work to have the</font></tt>
<br><tt><font size=2>call-return operate from PPE to SPE and back. I'd
even say that the header of</font></tt>
<br><tt><font size=2>an SPU function could be marked so that the compiler
would automatically generate</font></tt>
<br><tt><font size=2>this linkage as part of its code generation.</font></tt>
<br><tt><font size=2>&nbsp;<br>
&gt; I'd recommend that you define a parameter area in local store for<br>
&gt; your program and pass the arguments by writing in there before you<br>
&gt; call spe_context_run().<br>
</font></tt>
<br><tt><font size=2>Thanks for the suggestion, however, I was trying to
mimic the current</font></tt>
<br><tt><font size=2>linkage convention by using the registers. Nevertheless,
I will think</font></tt>
<br><tt><font size=2>more about passing in arguments in LS similar to what
stop-and-signal</font></tt>
<br><tt><font size=2>does in the other direction, from SPE to PPE.</font></tt>
<br>
<br><tt><font size=2>Today there is a set_regs function in the run.c file
that is invoked by</font></tt>
<br><tt><font size=2>the spe_context_run. This function opens the register
spufs file and updates</font></tt>
<br><tt><font size=2>it with the register values. This could still be used
for function invocation,</font></tt>
<br><tt><font size=2>although I'm sure that it is an computationally expensive
way to update the</font></tt>
<br><tt><font size=2>registers. Possibly a direct program state approach
might be better, but</font></tt>
<br><tt><font size=2>I've not investigated this yet. That is another reason
I'm taking about</font></tt>
<br><tt><font size=2>it here and learning about the options.</font></tt>
<br>
<br><tt><font size=2>To allow the return of the result in a register, a
new get_regs function</font></tt>
<br><tt><font size=2>would need to be added to run.c which is invoked when
the completion stop</font></tt>
<br><tt><font size=2>and signal (0x2000) is received.</font></tt>
<br>
<br><tt><font size=2>Note: this assumes that there is a small _start function
(crt0.S) on the</font></tt>
<br><tt><font size=2>SPE that sets up the stack, and branches to the requested
function's entry</font></tt>
<br><tt><font size=2>point. Presently I'm assuming that when _start is
invoke that $0 (register 0)</font></tt>
<br><tt><font size=2>contains the function entry point address. Then when
the requested function</font></tt>
<br><tt><font size=2>returns, the _start function issues the completion
stop and signal.</font></tt>
<br><tt><font size=2>&nbsp;<br>
&gt; &nbsp; &nbsp;Arnd &lt;&gt;&lt;<br>
</font></tt>
<br>