147void insertLane(
int lane, vobj & __restrict__
vec,
const typename vobj::scalar_object & __restrict__ extracted)
149 typedef typename vobj::vector_type vector_type;
150 typedef typename vector_type::scalar_type
scalar_type;
154 constexpr int words=
sizeof(vobj)/
sizeof(vector_type);
156 pointer __restrict__ sp = (pointer)&extracted;
157 vector_type *vp = (vector_type *)&
vec;
158 for(
int w=0;w<words;w++){
159 vp[w].putlane(sp[w],lane);
222void copyLane(vobjOut & __restrict__ vecOut,
int lane_out,
const vobjIn & __restrict__ vecIn,
int lane_in)
224 static_assert( std::is_same<typename vobjOut::scalar_typeD, typename vobjIn::scalar_typeD>::value == 1,
"copyLane: tensor types must be the same" );
226 typedef typename vobjOut::vector_type ovector_type;
227 typedef typename vobjIn::vector_type ivector_type;
228 constexpr int owords=
sizeof(vobjOut)/
sizeof(ovector_type);
229 constexpr int iwords=
sizeof(vobjIn)/
sizeof(ivector_type);
230 static_assert( owords == iwords,
"copyLane: Expected number of vector words in input and output objects to be equal" );
232 typedef typename vobjOut::scalar_type oscalar_type;
233 typedef typename vobjIn::scalar_type iscalar_type;
237 typedef oextract_type * opointer;
238 typedef iextract_type * ipointer;
243 ovector_type * __restrict__ op = (ovector_type *)&vecOut;
244 ivector_type * __restrict__ ip = (ivector_type *)&vecIn;
245 for(
int w=0;w<owords;w++){
246 itmp = ip[w].getlane(lane_in);
248 op[w].putlane(otmp,lane_out);