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:
Damjan Marion
2019-09-25 00:25:36 +02:00
committed by Andrew Yourtchenko
parent 35a265ceae
commit bebbd7f62d
3 changed files with 157 additions and 213 deletions

File diff suppressed because it is too large Load Diff

View File

@ -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 ();
}
}

View File

@ -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]; \