256 bit subtraction

256 bit subtraction

Ritratto di garfield-lewis

Hi,

I've got the following datatype:

struct X { __m128i hi; __m128i lo; }

I need to use only SSE 4.2 and below instructions to do a subtraction of 2 of these taking into account possible borrow issues at bits 63-64, 127-128 and 191-192. Does anyone have a quick set of instructions that could be used to accomplish this? Again using SSE 4.2 and earlier instructions.

Thx...

2 post / 0 new
Ultimo contenuto
Per informazioni complete sulle ottimizzazioni del compilatore, consultare l'Avviso sull'ottimizzazione
Ritratto di styc

Quote:

garfield-lewis wrote:

Hi,

I've got the following datatype:

struct X { __m128i hi; __m128i lo; }

I need to use only SSE 4.2 and below instructions to do a subtraction of 2 of these taking into account possible borrow issues at bits 63-64, 127-128 and 191-192. Does anyone have a quick set of instructions that could be used to accomplish this? Again using SSE 4.2 and earlier instructions.

Thx...

The best solution is to break components of X into scalars:

    asm ("sub %4, %0;"

         "sbb %5, %1;"

         "sbb %6, %2;"

         "sbb %7, %3;"

         : "=r" (*(uint64*) &z.lo),

           "=r" (*((uint64*) &z.lo + 1)),

           "=r" (*(uint64*) &z.hi),

           "=r" (*((uint64*) &z.hi + 1))

         : "g" (*(uint64*) &y.lo),

           "g" (*((uint64*) &y.lo + 1)),

           "g" (*(uint64*) &y.hi),

           "g" (*((uint64*) &y.hi + 1)),

           "0" (*(uint64*) &x.lo),

           "1" (*((uint64*) &x.lo + 1)),

           "2" (*(uint64*) &x.hi),

           "3" (*((uint64*) &x.hi + 1))

         );

Accedere per lasciare un commento.