[ FILTER_OP_GE_DOUBLE ] = &&LABEL_FILTER_OP_GE_DOUBLE,
[ FILTER_OP_LE_DOUBLE ] = &&LABEL_FILTER_OP_LE_DOUBLE,
+ /* Mixed S64-double binary comparators */
+ [ FILTER_OP_EQ_DOUBLE_S64 ] = &&LABEL_FILTER_OP_EQ_DOUBLE_S64,
+ [ FILTER_OP_NE_DOUBLE_S64 ] = &&LABEL_FILTER_OP_NE_DOUBLE_S64,
+ [ FILTER_OP_GT_DOUBLE_S64 ] = &&LABEL_FILTER_OP_GT_DOUBLE_S64,
+ [ FILTER_OP_LT_DOUBLE_S64 ] = &&LABEL_FILTER_OP_LT_DOUBLE_S64,
+ [ FILTER_OP_GE_DOUBLE_S64 ] = &&LABEL_FILTER_OP_GE_DOUBLE_S64,
+ [ FILTER_OP_LE_DOUBLE_S64 ] = &&LABEL_FILTER_OP_LE_DOUBLE_S64,
+
+ [ FILTER_OP_EQ_S64_DOUBLE ] = &&LABEL_FILTER_OP_EQ_S64_DOUBLE,
+ [ FILTER_OP_NE_S64_DOUBLE ] = &&LABEL_FILTER_OP_NE_S64_DOUBLE,
+ [ FILTER_OP_GT_S64_DOUBLE ] = &&LABEL_FILTER_OP_GT_S64_DOUBLE,
+ [ FILTER_OP_LT_S64_DOUBLE ] = &&LABEL_FILTER_OP_LT_S64_DOUBLE,
+ [ FILTER_OP_GE_S64_DOUBLE ] = &&LABEL_FILTER_OP_GE_S64_DOUBLE,
+ [ FILTER_OP_LE_S64_DOUBLE ] = &&LABEL_FILTER_OP_LE_S64_DOUBLE,
+
/* unary */
[ FILTER_OP_UNARY_PLUS ] = &&LABEL_FILTER_OP_UNARY_PLUS,
[ FILTER_OP_UNARY_MINUS ] = &&LABEL_FILTER_OP_UNARY_MINUS,
res = (stack_strcmp(stack, "==") == 0);
estack_pop(stack);
estack_ax(stack)->u.v = res;
- estack_ax(stack)->type = REG_S64;
next_pc += sizeof(struct binary_op);
PO;
}
res = (stack_strcmp(stack, "!=") != 0);
estack_pop(stack);
estack_ax(stack)->u.v = res;
- estack_ax(stack)->type = REG_S64;
next_pc += sizeof(struct binary_op);
PO;
}
res = (stack_strcmp(stack, ">") > 0);
estack_pop(stack);
estack_ax(stack)->u.v = res;
- estack_ax(stack)->type = REG_S64;
next_pc += sizeof(struct binary_op);
PO;
}
res = (stack_strcmp(stack, "<") < 0);
estack_pop(stack);
estack_ax(stack)->u.v = res;
- estack_ax(stack)->type = REG_S64;
next_pc += sizeof(struct binary_op);
PO;
}
res = (stack_strcmp(stack, ">=") >= 0);
estack_pop(stack);
estack_ax(stack)->u.v = res;
- estack_ax(stack)->type = REG_S64;
next_pc += sizeof(struct binary_op);
PO;
}
res = (stack_strcmp(stack, "<=") <= 0);
estack_pop(stack);
estack_ax(stack)->u.v = res;
- estack_ax(stack)->type = REG_S64;
next_pc += sizeof(struct binary_op);
PO;
}
res = (estack_bx(stack)->u.v == estack_ax(stack)->u.v);
estack_pop(stack);
estack_ax(stack)->u.v = res;
- estack_ax(stack)->type = REG_S64;
next_pc += sizeof(struct binary_op);
PO;
}
res = (estack_bx(stack)->u.v != estack_ax(stack)->u.v);
estack_pop(stack);
estack_ax(stack)->u.v = res;
- estack_ax(stack)->type = REG_S64;
next_pc += sizeof(struct binary_op);
PO;
}
res = (estack_bx(stack)->u.v > estack_ax(stack)->u.v);
estack_pop(stack);
estack_ax(stack)->u.v = res;
- estack_ax(stack)->type = REG_S64;
next_pc += sizeof(struct binary_op);
PO;
}
res = (estack_bx(stack)->u.v < estack_ax(stack)->u.v);
estack_pop(stack);
estack_ax(stack)->u.v = res;
- estack_ax(stack)->type = REG_S64;
next_pc += sizeof(struct binary_op);
PO;
}
res = (estack_bx(stack)->u.v >= estack_ax(stack)->u.v);
estack_pop(stack);
estack_ax(stack)->u.v = res;
- estack_ax(stack)->type = REG_S64;
next_pc += sizeof(struct binary_op);
PO;
}
res = (estack_bx(stack)->u.v <= estack_ax(stack)->u.v);
estack_pop(stack);
estack_ax(stack)->u.v = res;
- estack_ax(stack)->type = REG_S64;
next_pc += sizeof(struct binary_op);
PO;
}
{
int res;
- if (unlikely(estack_ax(stack)->type == REG_S64))
- estack_ax(stack)->u.d = (double) estack_ax(stack)->u.v;
- else if (unlikely(estack_bx(stack)->type == REG_S64))
- estack_bx(stack)->u.d = (double) estack_bx(stack)->u.v;
- res = (estack_bx(stack)->u.v == estack_ax(stack)->u.v);
+ res = (estack_bx(stack)->u.d == estack_ax(stack)->u.d);
estack_pop(stack);
estack_ax(stack)->u.v = res;
- estack_ax(stack)->type = REG_S64;
next_pc += sizeof(struct binary_op);
PO;
}
{
int res;
- if (unlikely(estack_ax(stack)->type == REG_S64))
- estack_ax(stack)->u.d = (double) estack_ax(stack)->u.v;
- else if (unlikely(estack_bx(stack)->type == REG_S64))
- estack_bx(stack)->u.d = (double) estack_bx(stack)->u.v;
- res = (estack_bx(stack)->u.v != estack_ax(stack)->u.v);
+ res = (estack_bx(stack)->u.d != estack_ax(stack)->u.d);
estack_pop(stack);
estack_ax(stack)->u.v = res;
- estack_ax(stack)->type = REG_S64;
next_pc += sizeof(struct binary_op);
PO;
}
{
int res;
- if (unlikely(estack_ax(stack)->type == REG_S64))
- estack_ax(stack)->u.d = (double) estack_ax(stack)->u.v;
- else if (unlikely(estack_bx(stack)->type == REG_S64))
- estack_bx(stack)->u.d = (double) estack_bx(stack)->u.v;
- res = (estack_bx(stack)->u.v > estack_ax(stack)->u.v);
+ res = (estack_bx(stack)->u.d > estack_ax(stack)->u.d);
estack_pop(stack);
estack_ax(stack)->u.v = res;
- estack_ax(stack)->type = REG_S64;
next_pc += sizeof(struct binary_op);
PO;
}
{
int res;
- if (unlikely(estack_ax(stack)->type == REG_S64))
- estack_ax(stack)->u.d = (double) estack_ax(stack)->u.v;
- else if (unlikely(estack_bx(stack)->type == REG_S64))
- estack_bx(stack)->u.d = (double) estack_bx(stack)->u.v;
- res = (estack_bx(stack)->u.v < estack_ax(stack)->u.v);
+ res = (estack_bx(stack)->u.d < estack_ax(stack)->u.d);
estack_pop(stack);
estack_ax(stack)->u.v = res;
- estack_ax(stack)->type = REG_S64;
next_pc += sizeof(struct binary_op);
PO;
}
{
int res;
- if (unlikely(estack_ax(stack)->type == REG_S64))
- estack_ax(stack)->u.d = (double) estack_ax(stack)->u.v;
- else if (unlikely(estack_bx(stack)->type == REG_S64))
- estack_bx(stack)->u.d = (double) estack_bx(stack)->u.v;
- res = (estack_bx(stack)->u.v >= estack_ax(stack)->u.v);
+ res = (estack_bx(stack)->u.d >= estack_ax(stack)->u.d);
estack_pop(stack);
estack_ax(stack)->u.v = res;
- estack_ax(stack)->type = REG_S64;
next_pc += sizeof(struct binary_op);
PO;
}
{
int res;
- if (unlikely(estack_ax(stack)->type == REG_S64))
- estack_ax(stack)->u.d = (double) estack_ax(stack)->u.v;
- else if (unlikely(estack_bx(stack)->type == REG_S64))
- estack_bx(stack)->u.d = (double) estack_bx(stack)->u.v;
- res = (estack_bx(stack)->u.v <= estack_ax(stack)->u.v);
+ res = (estack_bx(stack)->u.d <= estack_ax(stack)->u.d);
+ estack_pop(stack);
+ estack_ax(stack)->u.v = res;
+ next_pc += sizeof(struct binary_op);
+ PO;
+ }
+
+ /* Mixed S64-double binary comparators */
+ OP(FILTER_OP_EQ_DOUBLE_S64):
+ {
+ int res;
+
+ res = (estack_bx(stack)->u.d == estack_ax(stack)->u.v);
+ estack_pop(stack);
+ estack_ax(stack)->u.v = res;
+ next_pc += sizeof(struct binary_op);
+ PO;
+ }
+ OP(FILTER_OP_NE_DOUBLE_S64):
+ {
+ int res;
+
+ res = (estack_bx(stack)->u.d != estack_ax(stack)->u.v);
+ estack_pop(stack);
+ estack_ax(stack)->u.v = res;
+ next_pc += sizeof(struct binary_op);
+ PO;
+ }
+ OP(FILTER_OP_GT_DOUBLE_S64):
+ {
+ int res;
+
+ res = (estack_bx(stack)->u.d > estack_ax(stack)->u.v);
+ estack_pop(stack);
+ estack_ax(stack)->u.v = res;
+ next_pc += sizeof(struct binary_op);
+ PO;
+ }
+ OP(FILTER_OP_LT_DOUBLE_S64):
+ {
+ int res;
+
+ res = (estack_bx(stack)->u.d < estack_ax(stack)->u.v);
+ estack_pop(stack);
+ estack_ax(stack)->u.v = res;
+ next_pc += sizeof(struct binary_op);
+ PO;
+ }
+ OP(FILTER_OP_GE_DOUBLE_S64):
+ {
+ int res;
+
+ res = (estack_bx(stack)->u.d >= estack_ax(stack)->u.v);
+ estack_pop(stack);
+ estack_ax(stack)->u.v = res;
+ next_pc += sizeof(struct binary_op);
+ PO;
+ }
+ OP(FILTER_OP_LE_DOUBLE_S64):
+ {
+ int res;
+
+ res = (estack_bx(stack)->u.d <= estack_ax(stack)->u.v);
+ estack_pop(stack);
+ estack_ax(stack)->u.v = res;
+ next_pc += sizeof(struct binary_op);
+ PO;
+ }
+
+ OP(FILTER_OP_EQ_S64_DOUBLE):
+ {
+ int res;
+
+ res = (estack_bx(stack)->u.v == estack_ax(stack)->u.d);
+ estack_pop(stack);
+ estack_ax(stack)->u.v = res;
+ next_pc += sizeof(struct binary_op);
+ PO;
+ }
+ OP(FILTER_OP_NE_S64_DOUBLE):
+ {
+ int res;
+
+ res = (estack_bx(stack)->u.v != estack_ax(stack)->u.d);
+ estack_pop(stack);
+ estack_ax(stack)->u.v = res;
+ next_pc += sizeof(struct binary_op);
+ PO;
+ }
+ OP(FILTER_OP_GT_S64_DOUBLE):
+ {
+ int res;
+
+ res = (estack_bx(stack)->u.v > estack_ax(stack)->u.d);
+ estack_pop(stack);
+ estack_ax(stack)->u.v = res;
+ next_pc += sizeof(struct binary_op);
+ PO;
+ }
+ OP(FILTER_OP_LT_S64_DOUBLE):
+ {
+ int res;
+
+ res = (estack_bx(stack)->u.v < estack_ax(stack)->u.d);
+ estack_pop(stack);
+ estack_ax(stack)->u.v = res;
+ next_pc += sizeof(struct binary_op);
+ PO;
+ }
+ OP(FILTER_OP_GE_S64_DOUBLE):
+ {
+ int res;
+
+ res = (estack_bx(stack)->u.v >= estack_ax(stack)->u.d);
+ estack_pop(stack);
+ estack_ax(stack)->u.v = res;
+ next_pc += sizeof(struct binary_op);
+ PO;
+ }
+ OP(FILTER_OP_LE_S64_DOUBLE):
+ {
+ int res;
+
+ res = (estack_bx(stack)->u.v <= estack_ax(stack)->u.d);
estack_pop(stack);
estack_ax(stack)->u.v = res;
- estack_ax(stack)->type = REG_S64;
next_pc += sizeof(struct binary_op);
PO;
}
(unsigned int) insn->skip_offset);
next_pc = start_pc + insn->skip_offset;
} else {
+ /* Pop 1 when jump not taken */
+ estack_pop(stack);
next_pc += sizeof(struct logical_op);
}
PO;
(unsigned int) insn->skip_offset);
next_pc = start_pc + insn->skip_offset;
} else {
+ /* Pop 1 when jump not taken */
+ estack_pop(stack);
next_pc += sizeof(struct logical_op);
}
PO;
ret = -EINVAL;
goto end;
}
- estack_ax(stack)->type = REG_STRING;
estack_ax(stack)->u.s.seq_len = UINT_MAX;
estack_ax(stack)->u.s.literal = 0;
dbg_printf("ref load string %s\n", estack_ax(stack)->u.s.str);
ret = -EINVAL;
goto end;
}
- estack_ax(stack)->type = REG_STRING;
estack_ax(stack)->u.s.literal = 0;
next_pc += sizeof(struct load_op) + sizeof(struct field_ref);
PO;
estack_push(stack);
memcpy(&estack_ax(stack)->u.v, &filter_stack_data[ref->offset],
sizeof(struct literal_numeric));
- estack_ax(stack)->type = REG_S64;
dbg_printf("ref load s64 %" PRIi64 "\n", estack_ax(stack)->u.v);
next_pc += sizeof(struct load_op) + sizeof(struct field_ref);
PO;
estack_push(stack);
memcpy(&estack_ax(stack)->u.d, &filter_stack_data[ref->offset],
sizeof(struct literal_double));
- estack_ax(stack)->type = REG_DOUBLE;
dbg_printf("ref load double %g\n", estack_ax(stack)->u.d);
next_pc += sizeof(struct load_op) + sizeof(struct field_ref);
PO;
dbg_printf("load string %s\n", insn->data);
estack_push(stack);
- estack_ax(stack)->type = REG_STRING;
estack_ax(stack)->u.s.str = insn->data;
estack_ax(stack)->u.s.seq_len = UINT_MAX;
estack_ax(stack)->u.s.literal = 1;
memcpy(&estack_ax(stack)->u.v, insn->data,
sizeof(struct literal_numeric));
dbg_printf("load s64 %" PRIi64 "\n", estack_ax(stack)->u.v);
- estack_ax(stack)->type = REG_S64;
next_pc += sizeof(struct load_op)
+ sizeof(struct literal_numeric);
PO;
memcpy(&estack_ax(stack)->u.d, insn->data,
sizeof(struct literal_double));
dbg_printf("load s64 %g\n", estack_ax(stack)->u.d);
- estack_ax(stack)->type = REG_DOUBLE;
next_pc += sizeof(struct load_op)
+ sizeof(struct literal_double);
PO;
OP(FILTER_OP_CAST_DOUBLE_TO_S64):
{
estack_ax(stack)->u.v = (int64_t) estack_ax(stack)->u.d;
- estack_ax(stack)->type = REG_S64;
next_pc += sizeof(struct cast_op);
PO;
}