Lines Matching refs:insn

221 static LLVMTypeRef insn_symbol_type(struct instruction *insn)
223 if (insn->type)
224 return symbol_type(insn->type);
226 switch (insn->size) {
233 die("invalid bit size %d", insn->size);
534 static void output_op_binary(struct function *fn, struct instruction *insn)
539 lhs = get_ioperand(fn, insn->type, insn->src1);
540 rhs = get_ioperand(fn, insn->type, insn->src2);
542 pseudo_name(insn->target, target_name);
544 switch (insn->opcode) {
559 assert(!is_float_type(insn->type));
563 assert(!is_float_type(insn->type));
567 assert(!is_float_type(insn->type));
571 assert(!is_float_type(insn->type));
575 assert(!is_float_type(insn->type));
579 assert(!is_float_type(insn->type));
599 assert(!is_float_type(insn->type));
603 assert(!is_float_type(insn->type));
607 assert(!is_float_type(insn->type));
615 target = adjust_type(fn, insn->type, target);
616 insn->target->priv = target;
619 static void output_op_compare(struct function *fn, struct instruction *insn)
624 lhs = pseudo_to_value(fn, NULL, insn->src1);
625 if (insn->src2->type == PSEUDO_VAL)
626 rhs = constant_value(insn->src2->value, LLVMTypeOf(lhs));
628 rhs = pseudo_to_value(fn, NULL, insn->src2);
630 rhs = LLVMGetUndef(symbol_type(insn->type));
632 pseudo_name(insn->target, target_name);
634 LLVMTypeRef dst_type = insn_symbol_type(insn);
643 LLVMIntPredicate op = translate_op(insn->opcode);
658 LLVMRealPredicate op = translate_fop(insn->opcode);
669 insn->target->priv = target;
672 static void output_op_ret(struct function *fn, struct instruction *insn)
674 pseudo_t pseudo = insn->src;
677 LLVMValueRef result = get_operand(fn, insn->type, pseudo);
683 static LLVMValueRef calc_memop_addr(struct function *fn, struct instruction *insn)
691 off = LLVMConstInt(int_type, insn->offset, 0);
694 src = pseudo_to_value(fn, insn->type, insn->src);
696 addr_type = LLVMPointerType(insn_symbol_type(insn), as);
705 static void output_op_load(struct function *fn, struct instruction *insn)
710 addr = calc_memop_addr(fn, insn);
713 pseudo_name(insn->target, name);
716 insn->target->priv = target;
719 static void output_op_store(struct function *fn, struct instruction *insn)
723 addr = calc_memop_addr(fn, insn);
725 target_in = pseudo_to_rvalue(fn, insn->type, insn->target);
754 static void output_op_sel(struct function *fn, struct instruction *insn)
759 src1 = bool_value(fn, pseudo_to_value(fn, NULL, insn->src1));
760 src2 = get_operand(fn, insn->type, insn->src2);
761 src3 = get_operand(fn, insn->type, insn->src3);
763 pseudo_name(insn->target, name);
766 insn->target->priv = adjust_type(fn, insn->type, target);
769 static void output_op_switch(struct function *fn, struct instruction *insn)
776 FOR_EACH_PTR(insn->multijmp_list, jmp) {
783 sw_val = get_ioperand(fn, insn->type, insn->cond);
787 FOR_EACH_PTR(insn->multijmp_list, jmp) {
791 LLVMValueRef Val = val_to_value(val, insn->type);
797 static void output_op_call(struct function *fn, struct instruction *insn)
806 n_arg = pseudo_list_size(insn->arguments);
809 PREPARE_PTR_LIST(insn->fntypes, ctype);
810 if (insn->func->type == PSEUDO_REG || insn->func->type == PSEUDO_PHI)
811 func = get_operand(fn, ctype, insn->func);
813 func = pseudo_to_value(fn, ctype, insn->func);
815 FOR_EACH_PTR(insn->arguments, arg) {
821 pseudo_name(insn->target, name);
824 insn->target->priv = target;
827 static void output_op_phisrc(struct function *fn, struct instruction *insn)
829 insn->src->priv = get_operand(fn, insn->type, insn->src);
832 static void output_op_phi(struct function *fn, struct instruction *insn)
834 LLVMTypeRef dst_type = insn_symbol_type(insn);
836 insn->target->priv = LLVMBuildPhi(fn->builder, dst_type, "");
839 static void output_op_ptrcast(struct function *fn, struct instruction *insn)
843 struct symbol *otype = insn->orig_type;
847 src = get_operand(fn, otype, insn->src);
848 pseudo_name(insn->target, target_name);
850 dtype = symbol_type(insn->type);
851 switch (insn->opcode) {
855 assert(is_ptr_type(insn->type));
860 assert(is_int_type(insn->type));
866 assert(is_ptr_type(insn->type));
874 insn->target->priv = target;
877 static void output_op_cast(struct function *fn, struct instruction *insn, LLVMOpcode op)
881 struct symbol *otype = insn->orig_type;
884 if (is_ptr_type(insn->type)) // cast to void* is OP_CAST ...
885 return output_op_ptrcast(fn, insn);
887 assert(is_int_type(insn->type));
889 src = get_operand(fn, otype, insn->src);
890 pseudo_name(insn->target, target_name);
892 dtype = symbol_type(insn->type);
899 if (insn->size < width)
901 else if (insn->size == width)
908 insn->target->priv = target;
911 static void output_op_fpcast(struct function *fn, struct instruction *insn)
913 LLVMTypeRef dtype = symbol_type(insn->type);
915 struct symbol *otype = insn->orig_type;
918 assert(is_float_type(insn->type));
920 pseudo_name(insn->target, name);
921 src = get_operand(fn, otype, insn->src);
922 switch (insn->opcode) {
935 insn->target->priv = target;
938 static void output_op_label(struct function *fn, struct instruction *insn)
940 insn->target->priv = LLVMBlockAddress(fn->fn, insn->bb_true->priv);
943 static void output_op_setval(struct function *fn, struct instruction *insn)
945 struct expression *val = insn->val;
956 insn->target->priv = target;
959 static void output_op_setfval(struct function *fn, struct instruction *insn)
961 LLVMTypeRef dtype = symbol_type(insn->type);
964 target = LLVMConstReal(dtype, insn->fvalue);
965 insn->target->priv = target;
968 static void output_insn(struct function *fn, struct instruction *insn)
970 switch (insn->opcode) {
972 output_op_ret(fn, insn);
975 output_op_br(fn, insn);
978 output_op_cbr(fn, insn);
984 output_op_label(fn, insn);
987 output_op_setval(fn, insn);
990 output_op_setfval(fn, insn);
993 output_op_switch(fn, insn);
999 output_op_phisrc(fn, insn);
1002 output_op_phi(fn, insn);
1005 output_op_load(fn, insn);
1008 output_op_store(fn, insn);
1013 output_op_call(fn, insn);
1016 output_op_cast(fn, insn, LLVMZExt);
1019 output_op_cast(fn, insn, LLVMSExt);
1022 output_op_cast(fn, insn, LLVMTrunc);
1025 output_op_cast(fn, insn, LLVMFPToUI);
1028 output_op_cast(fn, insn, LLVMFPToSI);
1032 output_op_fpcast(fn, insn);
1037 output_op_ptrcast(fn, insn);
1040 output_op_binary(fn, insn);
1043 output_op_compare(fn, insn);
1046 output_op_sel(fn, insn);
1055 src = pseudo_to_value(fn, insn->type, insn->src);
1057 pseudo_name(insn->target, target_name);
1061 insn->target->priv = target;
1069 src = pseudo_to_value(fn, insn->type, insn->src);
1071 pseudo_name(insn->target, target_name);
1073 if (insn->opcode == OP_FNEG)
1078 insn->target->priv = target;
1105 struct instruction *insn;
1107 FOR_EACH_PTR(bb->insns, insn) {
1108 if (!insn->bb)
1111 output_insn(fn, insn);
1113 END_FOR_EACH_PTR(insn);
1165 struct instruction *insn;
1167 FOR_EACH_PTR(bb->insns, insn) {
1170 if (!insn->bb || insn->opcode != OP_PHI)
1173 FOR_EACH_PTR(insn->phi_list, phi) {
1184 LLVMAddIncoming(insn->target->priv, &vref, &bref, 1);
1186 } END_FOR_EACH_PTR(insn);