Lines Matching refs:insn

43 	struct instruction * insn = __alloc_instruction(0);
44 insn->opcode = opcode;
45 insn->size = size;
46 insn->pos = current_pos;
47 return insn;
57 struct instruction *insn = alloc_instruction(opcode, type_size(type));
58 insn->type = type;
59 return insn;
296 static char *show_asm(char *buf, struct instruction *insn)
298 struct asm_rules *rules = insn->asm_rules;
300 buf += sprintf(buf, "\"%s\"", insn->string);
307 const char *show_instruction(struct instruction *insn)
309 int opcode = insn->opcode;
314 if (!insn->bb)
323 if (insn->size)
324 buf += sprintf(buf, ".%d", insn->size);
333 if (insn->src && insn->src != VOID)
334 buf += sprintf(buf, "%s", show_pseudo(insn->src));
338 buf += sprintf(buf, "%s, %s, %s", show_pseudo(insn->cond), show_label(insn->bb_true), show_label(insn->bb_false));
342 buf += sprintf(buf, "%s", show_label(insn->bb_true));
346 buf += sprintf(buf, "%s <- ", show_pseudo(insn->target));
347 buf += sprintf(buf, "%s", show_label(insn->bb_true));
351 struct expression *expr = insn->val;
352 buf += sprintf(buf, "%s <- ", show_pseudo(insn->target));
381 buf += sprintf(buf, "%s <- ", show_pseudo(insn->target));
382 buf += sprintf(buf, "%Le", insn->fvalue);
387 buf += sprintf(buf, "%s", show_pseudo(insn->cond));
388 FOR_EACH_PTR(insn->multijmp_list, jmp) {
400 buf += sprintf(buf, "%s", show_pseudo(insn->src));
401 FOR_EACH_PTR(insn->multijmp_list, jmp) {
410 buf += sprintf(buf, "%s <- %s ", show_pseudo(insn->target), show_pseudo(insn->phi_src));
417 buf += sprintf(buf, "%s", show_pseudo(insn->target));
418 FOR_EACH_PTR(insn->phi_list, phi) {
427 buf += sprintf(buf, "%s <- %lld[%s]", show_pseudo(insn->target), insn->offset, show_pseudo(insn->src));
430 buf += sprintf(buf, "%s -> %lld[%s]", show_pseudo(insn->target), insn->offset, show_pseudo(insn->src));
435 if (insn->target && insn->target != VOID)
436 buf += sprintf(buf, "%s <- ", show_pseudo(insn->target));
437 buf += sprintf(buf, "%s", show_pseudo(insn->func));
438 FOR_EACH_PTR(insn->arguments, arg) {
452 show_pseudo(insn->target),
453 type_size(insn->orig_type),
454 show_pseudo(insn->src));
459 buf += sprintf(buf, "%s <- %s, %s", show_pseudo(insn->target), show_pseudo(insn->src1), show_pseudo(insn->src2));
464 buf += sprintf(buf, "%s <- %s, %s, %s", show_pseudo(insn->target),
465 show_pseudo(insn->src1), show_pseudo(insn->src2), show_pseudo(insn->src3));
469 buf += sprintf(buf, "%s <- (%d) %s, %d", show_pseudo(insn->target), type_size(insn->orig_type), show_pseudo(insn->src), insn->from);
475 buf += sprintf(buf, "%s <- %s", show_pseudo(insn->target), show_pseudo(insn->src1));
479 buf += sprintf(buf, "%s%d", insn->check ? "check: " : "", insn->increment);
482 buf += sprintf(buf, "%s between %s..%s", show_pseudo(insn->src1), show_pseudo(insn->src2), show_pseudo(insn->src3));
485 buf += sprintf(buf, "%s <- %s", show_pseudo(insn->target), show_pseudo(insn->src1));
488 buf += sprintf(buf, "%s", show_pseudo(insn->target));
491 buf = show_asm(buf, insn);
494 buf += sprintf(buf, "%s <- %s", show_pseudo(insn->target), show_pseudo(insn->src));
509 struct instruction *insn;
555 FOR_EACH_PTR(bb->insns, insn) {
556 if (!insn->bb && verbose < 2)
558 printf("\t%s\n", show_instruction(insn));
559 } END_FOR_EACH_PTR(insn);
566 void show_insn_bb(struct instruction *insn)
568 if (!insn || !insn->bb)
570 show_bb(insn->bb);
579 printf("\t%s\n", show_instruction(pu->insn));
622 void show_insn_entry(struct instruction *insn)
624 if (!insn || !insn->bb || !insn->bb->ep)
626 show_entry(insn->bb->ep);
668 static void add_one_insn(struct entrypoint *ep, struct instruction *insn)
673 insn->bb = bb;
674 add_instruction(&bb->insns, insn);
680 struct instruction *insn = alloc_instruction(OP_UNREACH, 0);
681 add_one_insn(ep, insn);
833 struct instruction *insn = alloc_typed_instruction(OP_PHISOURCE, type);
839 phi->def = insn;
841 use_pseudo(insn, pseudo, &insn->phi_src);
842 insn->target = phi;
843 return insn;
848 struct instruction *insn;
853 insn = alloc_phisrc(pseudo, type);
854 insn->bb = source;
855 add_instruction(&source->insns, insn);
856 return insn->target;
874 struct instruction *insn;
876 FOR_EACH_PTR(bb->insns, insn) {
877 enum opcode op = insn->opcode;
880 INSERT_CURRENT(phi_node, insn);
882 } END_FOR_EACH_PTR(insn);
968 struct instruction *insn;
974 insn = alloc_typed_instruction(OP_LOAD, ad->btype);
975 new = alloc_pseudo(insn);
977 insn->target = new;
978 insn->offset = ad->offset;
979 insn->is_volatile = ad->type && (ad->type->ctype.modifiers & MOD_VOLATILE);
980 use_pseudo(insn, ad->address, &insn->src);
981 add_one_insn(ep, insn);
1040 static void taint_undefined_behaviour(struct instruction *insn)
1044 switch (insn->opcode) {
1048 src2 = insn->src2;
1051 if ((unsigned long long)src2->value >= insn->size)
1052 insn->tainted = 1;
1059 struct instruction *insn = alloc_typed_instruction(op, ctype);
1060 pseudo_t target = alloc_pseudo(insn);
1061 insn->target = target;
1062 use_pseudo(insn, left, &insn->src1);
1063 use_pseudo(insn, right, &insn->src2);
1064 add_one_insn(ep, insn);
1077 struct instruction *insn = alloc_typed_instruction(OP_SETVAL, ctype);
1078 pseudo_t target = alloc_pseudo(insn);
1079 insn->target = target;
1080 insn->val = val;
1081 add_one_insn(ep, insn);
1087 struct instruction *insn = alloc_typed_instruction(OP_SETFVAL, ctype);
1088 pseudo_t target = alloc_pseudo(insn);
1089 insn->target = target;
1090 insn->fvalue = fval;
1091 add_one_insn(ep, insn);
1097 struct instruction *insn = alloc_typed_instruction(OP_SYMADDR, expr->ctype);
1098 pseudo_t target = alloc_pseudo(insn);
1100 insn->target = target;
1101 use_pseudo(insn, symbol_pseudo(ep, expr->symbol), &insn->src);
1102 add_one_insn(ep, insn);
1172 struct instruction *insn = alloc_typed_instruction(op, ctype);
1173 pseudo_t new = alloc_pseudo(insn);
1175 insn->target = new;
1176 use_pseudo(insn, src, &insn->src1);
1177 add_one_insn(ep, insn);
1192 struct instruction *insn = alloc_typed_instruction(OP_SLICE, expr->ctype);
1193 pseudo_t new = alloc_pseudo(insn);
1195 insn->target = new;
1196 insn->from = expr->r_bitpos;
1197 insn->orig_type = expr->base->ctype;
1198 use_pseudo(insn, pre, &insn->src);
1199 add_one_insn(ep, insn);
1364 struct instruction *insn;
1399 insn = alloc_typed_instruction(opcode, to);
1400 result = alloc_pseudo(insn);
1401 insn->target = result;
1402 insn->orig_type = from;
1403 use_pseudo(insn, src, &insn->src);
1404 add_one_insn(ep, insn);
1495 struct instruction *insn;
1516 insn = alloc_typed_instruction(OP_CALL, expr->ctype);
1517 add_symbol(&insn->fntypes, fntype);
1520 use_pseudo(insn, new, add_pseudo(&insn->arguments, new));
1521 add_symbol(&insn->fntypes, arg->ctype);
1532 use_pseudo(insn, call, &insn->func);
1535 retval = alloc_pseudo(insn);
1536 insn->target = retval;
1537 add_one_insn(ep, insn);
1555 insn = alloc_instruction(OP_CONTEXT, 0);
1556 insn->increment = context_diff;
1557 insn->check = check;
1558 insn->context_expr = context->context;
1559 add_one_insn(ep, insn);
1611 struct instruction *insn;
1617 insn = alloc_typed_instruction(OP_SEL, expr->ctype);
1620 use_pseudo(insn, cond, &insn->src1);
1621 use_pseudo(insn, valt, &insn->src2);
1622 use_pseudo(insn, valf, &insn->src3);
1624 res = alloc_pseudo(insn);
1625 insn->target = res;
1626 add_one_insn(ep, insn);
2034 struct instruction *insn = alloc_instruction(OP_INLINED_CALL, 0);
2045 add_pseudo(&insn->arguments, value);
2050 insn->target = pseudo;
2052 insn->func = symbol_pseudo(ep, stmt->inline_fn);
2056 add_one_insn(ep, insn);
2062 struct instruction *insn = alloc_instruction(OP_CONTEXT, 0);
2065 insn->increment = get_expression_value(expr);
2066 insn->context_expr = stmt->context;
2067 add_one_insn(ep, insn);
2073 struct instruction *insn = alloc_instruction(OP_RANGE, 0);
2075 use_pseudo(insn, linearize_expression(ep, stmt->range_expression), &insn->src1);
2076 use_pseudo(insn, linearize_expression(ep, stmt->range_low), &insn->src2);
2077 use_pseudo(insn, linearize_expression(ep, stmt->range_high), &insn->src3);
2078 add_one_insn(ep, insn);
2085 static void add_asm_rule(struct instruction *insn, struct asm_constraint_list **list, struct asm_operand *op, pseudo_t pseudo)
2091 use_pseudo(insn, pseudo, &rule->pseudo);
2095 static void add_asm_input(struct entrypoint *ep, struct instruction *insn, struct asm_operand *op)
2099 add_asm_rule(insn, &insn->asm_rules->inputs, op, pseudo);
2102 static void add_asm_output_address(struct entrypoint *ep, struct instruction *insn, struct asm_operand *op)
2110 add_asm_rule(insn, &insn->asm_rules->outputs, op, pseudo);
2111 insn->output_memory = 1;
2114 static void add_asm_output(struct entrypoint *ep, struct instruction *insn, struct asm_operand *op)
2124 pseudo = alloc_pseudo(insn);
2127 add_asm_rule(insn, &insn->asm_rules->outputs, op, pseudo);
2132 struct instruction *insn;
2137 insn = alloc_instruction(OP_ASM, 0);
2143 insn->string = expr->string->data;
2146 insn->asm_rules = rules;
2150 add_asm_input(ep, insn, op);
2155 add_asm_output_address(ep, insn, op);
2158 add_one_insn(ep, insn);
2162 add_asm_output(ep, insn, op);
2168 insn->clobber_memory = 1;
2195 static void sort_switch_cases(struct instruction *insn)
2197 sort_list((struct ptr_list **)&insn->multijmp_list, multijmp_cmp);
2483 static void check_tainted_insn(struct instruction *insn)
2489 switch (insn->opcode) {
2492 if (insn->src2 == value_pseudo(0))
2493 warning(insn->pos, "divide by zero");
2496 src2 = insn->src2;
2500 if (uval < insn->size)
2502 sval = sign_extend(uval, insn->size);
2504 warning(insn->pos, "shift count is negative (%lld)", sval);
2506 warning(insn->pos, "shift too big (%llu) for type %s", uval, show_typename(insn->type));
2516 struct instruction *insn;
2517 FOR_EACH_PTR(bb->insns, insn) {
2518 if (!insn->bb)
2520 if (insn->tainted)
2521 check_tainted_insn(insn);
2522 switch (insn->opcode) {
2525 check_access(insn);
2528 } END_FOR_EACH_PTR(insn);
2603 struct instruction *insn = alloc_typed_instruction(OP_FMADD, expr->ctype);
2607 use_pseudo(insn, linearize_expression(ep, arg), &insn->src1);
2609 use_pseudo(insn, linearize_expression(ep, arg), &insn->src2);
2611 use_pseudo(insn, linearize_expression(ep, arg), &insn->src3);
2614 add_one_insn(ep, insn);
2615 return insn->target = alloc_pseudo(insn);
2620 struct instruction *insn;
2623 insn = alloc_typed_instruction(OP_SUB, &int_ctype);
2625 use_pseudo(insn, src, &insn->src1);
2626 insn->src2 = value_pseudo('0');
2627 src = insn->target = alloc_pseudo(insn);
2628 add_one_insn(ep, insn);
2630 insn = alloc_typed_instruction(OP_SET_BE, &int_ctype);
2631 use_pseudo(insn, src, &insn->src1);
2632 insn->src2 = value_pseudo(9);
2633 insn->target = alloc_pseudo(insn);
2634 insn->itype = &int_ctype;
2635 add_one_insn(ep, insn);
2637 return insn->target;