classify: use vector code even when data is not aligned
Type: feature Change-Id: I8f5f4841965beb13ebc8c2a37ce0dc331c920109 Signed-off-by: Damjan Marion <damarion@cisco.com> (cherry picked from commit 8304933922620cef005b788a36a4d3f2eab45bb5)
This commit is contained in:

committed by
Andrew Yourtchenko

parent
35a265ceae
commit
bebbd7f62d
File diff suppressed because it is too large
Load Diff
@ -91,68 +91,26 @@ l2_rw_get_config (u32 sw_if_index)
|
||||
static_always_inline void
|
||||
l2_rw_rewrite (l2_rw_entry_t * rwe, u8 * h)
|
||||
{
|
||||
if (U32X4_ALIGNED (h))
|
||||
u32x4u *d = ((u32x4u *) h) + rwe->skip_n_vectors;
|
||||
switch (rwe->rewrite_n_vectors)
|
||||
{
|
||||
u32x4 *d = ((u32x4 *) h) + rwe->skip_n_vectors;
|
||||
switch (rwe->rewrite_n_vectors)
|
||||
{
|
||||
case 5:
|
||||
d[4] = (d[4] & ~rwe->mask[4]) | rwe->value[4];
|
||||
/* FALLTHROUGH */
|
||||
case 4:
|
||||
d[3] = (d[3] & ~rwe->mask[3]) | rwe->value[3];
|
||||
/* FALLTHROUGH */
|
||||
case 3:
|
||||
d[2] = (d[2] & ~rwe->mask[2]) | rwe->value[2];
|
||||
/* FALLTHROUGH */
|
||||
case 2:
|
||||
d[1] = (d[1] & ~rwe->mask[1]) | rwe->value[1];
|
||||
/* FALLTHROUGH */
|
||||
case 1:
|
||||
d[0] = (d[0] & ~rwe->mask[0]) | rwe->value[0];
|
||||
break;
|
||||
default:
|
||||
abort ();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
u64 *d = ((u64 *) h) + rwe->skip_n_vectors * 2;
|
||||
switch (rwe->rewrite_n_vectors)
|
||||
{
|
||||
case 5:
|
||||
d[8] =
|
||||
(d[8] & ~(((u64 *) rwe->mask)[8])) | (((u64 *) rwe->value)[8]);
|
||||
d[9] =
|
||||
(d[9] & ~(((u64 *) rwe->mask)[9])) | (((u64 *) rwe->value)[9]);
|
||||
/* FALLTHROUGH */
|
||||
case 4:
|
||||
d[6] =
|
||||
(d[6] & ~(((u64 *) rwe->mask)[6])) | (((u64 *) rwe->value)[6]);
|
||||
d[7] =
|
||||
(d[7] & ~(((u64 *) rwe->mask)[7])) | (((u64 *) rwe->value)[7]);
|
||||
/* FALLTHROUGH */
|
||||
case 3:
|
||||
d[4] =
|
||||
(d[4] & ~(((u64 *) rwe->mask)[4])) | (((u64 *) rwe->value)[4]);
|
||||
d[5] =
|
||||
(d[5] & ~(((u64 *) rwe->mask)[5])) | (((u64 *) rwe->value)[5]);
|
||||
/* FALLTHROUGH */
|
||||
case 2:
|
||||
d[2] =
|
||||
(d[2] & ~(((u64 *) rwe->mask)[2])) | (((u64 *) rwe->value)[2]);
|
||||
d[3] =
|
||||
(d[3] & ~(((u64 *) rwe->mask)[3])) | (((u64 *) rwe->value)[3]);
|
||||
/* FALLTHROUGH */
|
||||
case 1:
|
||||
d[0] =
|
||||
(d[0] & ~(((u64 *) rwe->mask)[0])) | (((u64 *) rwe->value)[0]);
|
||||
d[1] =
|
||||
(d[1] & ~(((u64 *) rwe->mask)[1])) | (((u64 *) rwe->value)[1]);
|
||||
break;
|
||||
default:
|
||||
abort ();
|
||||
}
|
||||
case 5:
|
||||
d[4] = (d[4] & ~rwe->mask[4]) | rwe->value[4];
|
||||
/* FALLTHROUGH */
|
||||
case 4:
|
||||
d[3] = (d[3] & ~rwe->mask[3]) | rwe->value[3];
|
||||
/* FALLTHROUGH */
|
||||
case 3:
|
||||
d[2] = (d[2] & ~rwe->mask[2]) | rwe->value[2];
|
||||
/* FALLTHROUGH */
|
||||
case 2:
|
||||
d[1] = (d[1] & ~rwe->mask[1]) | rwe->value[1];
|
||||
/* FALLTHROUGH */
|
||||
case 1:
|
||||
d[0] = (d[0] & ~rwe->mask[0]) | rwe->value[0];
|
||||
break;
|
||||
default:
|
||||
abort ();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -76,6 +76,7 @@
|
||||
#endif
|
||||
|
||||
#define _vector_size(n) __attribute__ ((vector_size (n)))
|
||||
#define _vector_size_unaligned(n) __attribute__ ((vector_size (n), __aligned__ (1)))
|
||||
|
||||
#define foreach_vec64i _(i,8,8) _(i,16,4) _(i,32,2)
|
||||
#define foreach_vec64u _(u,8,8) _(u,16,4) _(u,32,2)
|
||||
@ -111,6 +112,7 @@
|
||||
/* Type Definitions */
|
||||
#define _(t,s,c) \
|
||||
typedef t##s t##s##x##c _vector_size (s/8*c); \
|
||||
typedef t##s t##s##x##c##u _vector_size_unaligned (s/8*c); \
|
||||
typedef union { \
|
||||
t##s##x##c as_##t##s##x##c; \
|
||||
t##s as_##t##s[c]; \
|
||||
|
Reference in New Issue
Block a user