Lines Matching refs:s
383 static int atomuse(s) in atomuse() argument
384 struct stmt *s; in atomuse()
386 register int c = s->code;
399 return (BPF_MODE(c) == BPF_IND) ? X_ATOM : (BPF_MODE(c) == BPF_MEM) ? s->k : -1;
427 static int atomdef(s) in atomdef() argument
428 struct stmt *s; in atomdef()
430 if (s->code == NOP)
433 switch (BPF_CLASS(s->code))
445 return s->k;
448 return BPF_MISCOP(s->code) == BPF_TAX ? X_ATOM : A_ATOM;
467 struct slist *s; local
471 for (s = b->stmts; s; s = s->next)
473 if (s->s.code == NOP)
475 atom = atomuse(&s->s);
493 atom = atomdef(&s->s);
501 if (BPF_CLASS(b->s.code) == BPF_JMP)
506 atom = atomuse(&b->s);
635 static inline void vstore(s, valp, newval, alter) in vstore() argument
636 struct stmt *s; in vstore()
642 s->code = NOP;
647 static void fold_op(s, v0, v1) in fold_op() argument
648 struct stmt *s; in fold_op()
656 switch (BPF_OP(s->code))
699 s->k = a;
700 s->code = BPF_LD | BPF_IMM;
704 static inline struct slist *this_op(s) in this_op() argument
705 struct slist *s; in this_op()
707 while (s != 0 && s->s.code == NOP)
708 s = s->next;
709 return s;
724 struct slist *s; local
728 s = b->stmts;
729 if (s == 0)
732 last = s;
733 for ( /*empty */ ; /*empty */ ; s = next)
738 s = this_op(s);
739 if (s == 0)
746 next = this_op(s->next);
755 if (s->s.code == BPF_ST && next->s.code == (BPF_LDX | BPF_MEM) && s->s.k == next->s.k)
758 next->s.code = BPF_MISC | BPF_TAX;
764 if (s->s.code == (BPF_LD | BPF_IMM) && next->s.code == (BPF_MISC | BPF_TAX))
766 s->s.code = BPF_LDX | BPF_IMM;
767 next->s.code = BPF_MISC | BPF_TXA;
774 if (s->s.code == (BPF_LD | BPF_IMM))
793 if (next->s.code != (BPF_LDX | BPF_MSH | BPF_B))
797 if (add == 0 || add->s.code != (BPF_ALU | BPF_ADD | BPF_X))
805 if (tax == 0 || tax->s.code != (BPF_MISC | BPF_TAX))
813 if (ild == 0 || BPF_CLASS(ild->s.code) != BPF_LD || BPF_MODE(ild->s.code) != BPF_IND)
843 ild->s.k += s->s.k;
844 s->s.code = NOP;
845 add->s.code = NOP;
846 tax->s.code = NOP;
857 if (b->s.code == (BPF_JMP | BPF_JEQ | BPF_K) && !ATOMELEM(b->out_use, A_ATOM))
863 if (last->s.code == (BPF_ALU | BPF_SUB | BPF_X))
877 b->s.k += vmap[val].const_val;
878 last->s.code = NOP;
881 else if (b->s.k == 0)
892 last->s.code = NOP;
893 b->s.code = BPF_JMP | BPF_JEQ | BPF_X;
903 else if (last->s.code == (BPF_ALU | BPF_SUB | BPF_K))
905 last->s.code = NOP;
906 b->s.k += last->s.k;
916 else if (last->s.code == (BPF_ALU | BPF_AND | BPF_K) && b->s.k == 0)
918 b->s.k = last->s.k;
919 b->s.code = BPF_JMP | BPF_K | BPF_JSET;
920 last->s.code = NOP;
929 if (b->s.code == (BPF_JMP | BPF_K | BPF_JSET))
931 if (b->s.k == 0)
933 if (b->s.k == 0xffffffff)
942 if (vmap[val].is_const && BPF_SRC(b->s.code) == BPF_X)
945 b->s.code &= ~BPF_X;
946 b->s.k = v;
953 if (vmap[val].is_const && BPF_SRC(b->s.code) == BPF_K)
956 switch (BPF_OP(b->s.code))
960 v = v == b->s.k;
964 v = (unsigned) v > b->s.k;
968 v = (unsigned) v >= b->s.k;
972 v &= b->s.k;
993 static void opt_stmt(s, val, alter) in opt_stmt() argument
994 struct stmt *s; in opt_stmt()
1001 switch (s->code)
1007 v = F(s->code, s->k, 0L);
1008 vstore(s, &val[A_ATOM], v, alter);
1017 s->code = BPF_LD | BPF_ABS | BPF_SIZE(s->code);
1018 s->k += vmap[v].const_val;
1019 v = F(s->code, s->k, 0L);
1023 v = F(s->code, s->k, v);
1024 vstore(s, &val[A_ATOM], v, alter);
1028 v = F(s->code, 0L, 0L);
1029 vstore(s, &val[A_ATOM], v, alter);
1033 v = K(s->k);
1034 vstore(s, &val[A_ATOM], v, alter);
1038 v = K(s->k);
1039 vstore(s, &val[X_ATOM], v, alter);
1043 v = F(s->code, s->k, 0L);
1044 vstore(s, &val[X_ATOM], v, alter);
1050 s->code = BPF_LD | BPF_IMM;
1051 s->k = -vmap[val[A_ATOM]].const_val;
1052 val[A_ATOM] = K(s->k);
1055 val[A_ATOM] = F(s->code, val[A_ATOM], 0L);
1066 op = BPF_OP(s->code);
1069 if (s->k == 0)
1076 s->code = NOP;
1081 s->code = BPF_LD | BPF_IMM;
1082 val[A_ATOM] = K(s->k);
1088 fold_op(s, val[A_ATOM], K(s->k));
1089 val[A_ATOM] = K(s->k);
1093 val[A_ATOM] = F(s->code, val[A_ATOM], K(s->k));
1104 op = BPF_OP(s->code);
1109 fold_op(s, val[A_ATOM], val[X_ATOM]);
1110 val[A_ATOM] = K(s->k);
1114 s->code = BPF_ALU | BPF_K | op;
1115 s->k = vmap[val[X_ATOM]].const_val;
1117 val[A_ATOM] = F(s->code, val[A_ATOM], K(s->k));
1132 s->code = BPF_MISC | BPF_TXA;
1133 vstore(s, &val[A_ATOM], val[X_ATOM], alter);
1138 s->code = BPF_LD | BPF_IMM;
1139 s->k = 0;
1140 vstore(s, &val[A_ATOM], K(s->k), alter);
1145 s->code = NOP;
1149 val[A_ATOM] = F(s->code, val[A_ATOM], val[X_ATOM]);
1153 vstore(s, &val[A_ATOM], val[X_ATOM], alter);
1157 v = val[s->k];
1160 s->code = BPF_LD | BPF_IMM;
1161 s->k = vmap[v].const_val;
1164 vstore(s, &val[A_ATOM], v, alter);
1168 vstore(s, &val[X_ATOM], val[A_ATOM], alter);
1172 v = val[s->k];
1175 s->code = BPF_LDX | BPF_IMM;
1176 s->k = vmap[v].const_val;
1179 vstore(s, &val[X_ATOM], v, alter);
1183 vstore(s, &val[s->k], val[A_ATOM], alter);
1187 vstore(s, &val[s->k], val[X_ATOM], alter);
1192 static void deadstmt(s, last) in deadstmt() argument
1193 register struct stmt *s; in deadstmt()
1198 atom = atomuse(s);
1209 atom = atomdef(s);
1217 last[atom] = s;
1224 register struct slist *s; local
1230 for (s = b->stmts; s != 0; s = s->next)
1231 deadstmt(&s->s, last);
1232 deadstmt(&b->s, last);
1246 struct slist *s; local
1252 for (s = b->stmts; s && s->next; s = s->next)
1253 if (BPF_CLASS(s->s.code) == BPF_JMP)
1298 for (s = b->stmts; s; s = s->next)
1299 opt_stmt(&s->s, b->val, do_stmts);
1326 xval != 0 && b->val[X_ATOM] == xval) || BPF_CLASS(b->s.code) == BPF_RET))
1342 if (BPF_SRC(b->s.code) == BPF_K)
1343 b->oval = K(b->s.k);
1346 b->et.code = b->s.code;
1347 b->ef.code = -b->s.code;
1387 if (child->s.code != code)
1753 struct slist *tmp, *s; local
1755 s = (*b)->stmts;
1757 while (BPF_CLASS((*b)->s.code) == BPF_JMP && JT(*b) == JF(*b))
1762 sappend(s, tmp);
1763 (*b)->stmts = s;
1770 if (BPF_CLASS((*b)->s.code) == BPF_RET)
1843 if (BPF_CLASS(p->s.code) != BPF_RET)
1871 while (x && x->s.code == NOP)
1873 while (y && y->s.code == NOP)
1879 if (x->s.code != y->s.code || x->s.k != y->s.k)
1889 if (b0->s.code == b1->s.code &&
1890 b0->s.k == b1->s.k && b0->et.succ == b1->et.succ && b0->ef.succ == b1->ef.succ)
1956 static int slength(s) in slength() argument
1957 struct slist *s; in slength()
1961 for (; s; s = s->next)
1962 if (s->s.code != NOP)
2184 if (src->s.code == NOP)
2186 dst->code = (u_short) src->s.code;
2187 dst->k = src->s.k;
2190 if (BPF_CLASS(src->s.code) != BPF_JMP || src->s.code == (BPF_JMP | BPF_JA))
2193 if (src->s.jt || src->s.jf)
2209 printf("code=%x off=%d %x %x\n", src->s.code, off, src->s.jt, src->s.jf);
2212 if (!src->s.jt || !src->s.jf)
2220 if (offset[i] == src->s.jt)
2230 if (offset[i] == src->s.jf)
2255 dst->code = (u_short) p->s.code;
2256 dst->k = p->s.k;