pipeline: fix instruction translation
authorCristian Dumitrescu <cristian.dumitrescu@intel.com>
Wed, 24 Mar 2021 11:36:03 +0000 (11:36 +0000)
committerThomas Monjalon <thomas@monjalon.net>
Wed, 24 Mar 2021 17:54:04 +0000 (18:54 +0100)
The SWX pipeline instructions work with operands of different types:
header fields (h.header.field), packet meta-data (m.field), extern
object mailbox field (e.obj.field), extern function (f.field), action
data read from table entries (t.field), or immediate values; hence the
HMEFTI acronym.

For some pipeline instructions (add/sub, srl/shr, jmplt/jmpgt), only
the H, M and I cases were handled, while the E, F and T cases were
disregarded. This is what we fix here.

Fixes: baf7999303d0 ("pipeline: introduce SWX add instruction")
Fixes: c88c62943818 ("pipeline: introduce SWX subtract instruction")
Fixes: b09ba6d0a3c2 ("pipeline: introduce SWX SHL instruction")
Fixes: e0f51638b715 ("pipeline: introduce SWX SHR instruction")
Fixes: b3947e25bed4 ("pipeline: introduce SWX jump and return instructions")
Cc: stable@dpdk.org
Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
lib/librte_pipeline/rte_swx_pipeline.c

index eaaed7a..bc619ca 100644 (file)
@@ -3475,9 +3475,9 @@ instr_alu_add_translate(struct rte_swx_pipeline *p,
        fsrc = struct_field_parse(p, action, src, &src_struct_id);
        if (fsrc) {
                instr->type = INSTR_ALU_ADD;
-               if (dst[0] == 'h' && src[0] == 'm')
+               if (dst[0] == 'h' && src[0] != 'h')
                        instr->type = INSTR_ALU_ADD_HM;
-               if (dst[0] == 'm' && src[0] == 'h')
+               if (dst[0] != 'h' && src[0] == 'h')
                        instr->type = INSTR_ALU_ADD_MH;
                if (dst[0] == 'h' && src[0] == 'h')
                        instr->type = INSTR_ALU_ADD_HH;
@@ -3528,9 +3528,9 @@ instr_alu_sub_translate(struct rte_swx_pipeline *p,
        fsrc = struct_field_parse(p, action, src, &src_struct_id);
        if (fsrc) {
                instr->type = INSTR_ALU_SUB;
-               if (dst[0] == 'h' && src[0] == 'm')
+               if (dst[0] == 'h' && src[0] != 'h')
                        instr->type = INSTR_ALU_SUB_HM;
-               if (dst[0] == 'm' && src[0] == 'h')
+               if (dst[0] != 'h' && src[0] == 'h')
                        instr->type = INSTR_ALU_SUB_MH;
                if (dst[0] == 'h' && src[0] == 'h')
                        instr->type = INSTR_ALU_SUB_HH;
@@ -3658,9 +3658,9 @@ instr_alu_shl_translate(struct rte_swx_pipeline *p,
        fsrc = struct_field_parse(p, action, src, &src_struct_id);
        if (fsrc) {
                instr->type = INSTR_ALU_SHL;
-               if (dst[0] == 'h' && src[0] == 'm')
+               if (dst[0] == 'h' && src[0] != 'h')
                        instr->type = INSTR_ALU_SHL_HM;
-               if (dst[0] == 'm' && src[0] == 'h')
+               if (dst[0] != 'h' && src[0] == 'h')
                        instr->type = INSTR_ALU_SHL_MH;
                if (dst[0] == 'h' && src[0] == 'h')
                        instr->type = INSTR_ALU_SHL_HH;
@@ -3711,9 +3711,9 @@ instr_alu_shr_translate(struct rte_swx_pipeline *p,
        fsrc = struct_field_parse(p, action, src, &src_struct_id);
        if (fsrc) {
                instr->type = INSTR_ALU_SHR;
-               if (dst[0] == 'h' && src[0] == 'm')
+               if (dst[0] == 'h' && src[0] != 'h')
                        instr->type = INSTR_ALU_SHR_HM;
-               if (dst[0] == 'm' && src[0] == 'h')
+               if (dst[0] != 'h' && src[0] == 'h')
                        instr->type = INSTR_ALU_SHR_MH;
                if (dst[0] == 'h' && src[0] == 'h')
                        instr->type = INSTR_ALU_SHR_HH;
@@ -4906,9 +4906,9 @@ instr_jmp_lt_translate(struct rte_swx_pipeline *p,
        fb = struct_field_parse(p, action, b, &b_struct_id);
        if (fb) {
                instr->type = INSTR_JMP_LT;
-               if (a[0] == 'h' && b[0] == 'm')
+               if (a[0] == 'h' && b[0] != 'h')
                        instr->type = INSTR_JMP_LT_HM;
-               if (a[0] == 'm' && b[0] == 'h')
+               if (a[0] != 'h' && b[0] == 'h')
                        instr->type = INSTR_JMP_LT_MH;
                if (a[0] == 'h' && b[0] == 'h')
                        instr->type = INSTR_JMP_LT_HH;
@@ -4963,9 +4963,9 @@ instr_jmp_gt_translate(struct rte_swx_pipeline *p,
        fb = struct_field_parse(p, action, b, &b_struct_id);
        if (fb) {
                instr->type = INSTR_JMP_GT;
-               if (a[0] == 'h' && b[0] == 'm')
+               if (a[0] == 'h' && b[0] != 'h')
                        instr->type = INSTR_JMP_GT_HM;
-               if (a[0] == 'm' && b[0] == 'h')
+               if (a[0] != 'h' && b[0] == 'h')
                        instr->type = INSTR_JMP_GT_MH;
                if (a[0] == 'h' && b[0] == 'h')
                        instr->type = INSTR_JMP_GT_HH;