Hello Henrik,

Thank you very much for your answer. However, the code you provided is some
sort of assembly right ? So does it mean that I need to learn assembly to
do what I want ?

I'm asking that because I don't know anything about assembly so it will
take me some time to learn.

Cheers,

Matthieu

2015-06-08 19:56 GMT+02:00 Henrik Johansen <henrik.s.johan...@veloxit.no>:

>
> > On 08 Jun 2015, at 4:41 , Matthieu Lacaton <matthieu.laca...@gmail.com>
> wrote:
> >
> > Hello everyone,
> >
> > I have a small question about NativeBoost : How does the "+" operator
> when applied to a pointer translates into NativeBoost code ?
> >
> > To give a bit of context, what I want to do is to reallocate some
> non-contiguous bytes in memory to a buffer. Basically, I have an array of
> integers in a buffer and I want to copy some chunks of it in another
> buffer. The chunks are always the same size and the offset between each
> chunk is always the same too.
> >
> > Because a bit of actual code is easier to understand here is what I'd
> like to do in Pharo :
> >
> > ...
> >
> > int i, j;
> > int *data = malloc(1000*sizeof(int));
> > int *newData = malloc(50*sizeof(int));
> >
> > // Allocate initial data
> > for (i = 0 ; i < 1000, i++) {
> >   data[i] = i;
> > }
> >
> > //Copy desired chunks into new buffer
> > for (i = 0; i < 5; i++ ) {
> >   memcpy( newData + j*10, data + 200 + j*30, 10*sizeof(int));
> >   j++;
> > }
> >
> > free(data);
>
>
>
> You can do relative addressing like this:
> (destReg ptr: dataSize) + offsetReg + constant
>
> So with offSetRegs containing j* 10 and j* 30, you might end up with an
> unrolled inner loop (barring using any fancier longer-than-int moves) like:
>
> 0 to: 9 do: [:constantOffset |
>         asm mov: (destReg ptr: currentPlatform sizeOfInt) + dstOffsetReg +
> constantOffset  with: (srcReg ptr: currentPlatform sizeOfInt) + 200 +
> srcOffsetReg + constantOffset]
>
> If the range of j is constant, you can just as easily unroll the whole
> thing in a similarly compact fashion, space and sensibilites permitting:
>
> 0 to: 4 do: [ :j | 0 to: 9 do: [ :consOffset |
>         asm mov: (destReg ptr: currentPlatform sizeOfInt) + (j* 10) +
> constOffset  with: (srcReg ptr: currentPlatform sizeOfInt) + 200 + (j * 30)
> + constOffset]
>
> Cheers,
> Henry
>

Reply via email to