Lines Matching refs:dnp

145 dt_cg_load(dt_node_t *dnp, ctf_file_t *ctfp, ctf_id_t type)
166 if ((dnp->dn_flags & DT_NF_BITFIELD) &&
179 if (dnp->dn_flags & DT_NF_SIGNED)
181 if (dnp->dn_flags & DT_NF_USERLAND)
188 dt_cg_ptrsize(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp,
191 ctf_file_t *ctfp = dnp->dn_ctfp;
199 type = ctf_type_resolve(ctfp, dnp->dn_type);
240 dt_cg_field_get(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp,
253 assert(dnp->dn_op == DT_TOK_PTR || dnp->dn_op == DT_TOK_DOT);
254 r1 = dnp->dn_left->dn_reg;
268 if (dnp->dn_flags & DT_NF_SIGNED) {
545 dt_node_t *dnp;
548 for (dnp = args; dnp != NULL; dnp = dnp->dn_list)
549 dt_cg_node(dnp, dlp, drp);
553 for (dnp = args; dnp != NULL; dnp = dnp->dn_list, i++) {
559 dt_node_diftype(yypcb->pcb_hdl, dnp, &t);
561 isp->dis_args[i].dn_reg = dnp->dn_reg; /* re-use register */
562 dt_cg_typecast(dnp, &isp->dis_args[i], dlp, drp);
578 instr = DIF_INSTR_PUSHTS(op, t.dtdt_kind, reg, dnp->dn_reg);
580 dt_regset_free(drp, dnp->dn_reg);
591 dt_cg_arithmetic_op(dt_node_t *dnp, dt_irlist_t *dlp,
594 int is_ptr_op = (dnp->dn_op == DT_TOK_ADD || dnp->dn_op == DT_TOK_SUB ||
595 dnp->dn_op == DT_TOK_ADD_EQ || dnp->dn_op == DT_TOK_SUB_EQ);
597 int lp_is_ptr = dt_node_is_pointer(dnp->dn_left);
598 int rp_is_ptr = dt_node_is_pointer(dnp->dn_right);
603 assert(dnp->dn_op == DT_TOK_SUB);
607 dt_cg_node(dnp->dn_left, dlp, drp);
609 dt_cg_ptrsize(dnp, dlp, drp, DIF_OP_MUL, dnp->dn_left->dn_reg);
611 dt_cg_node(dnp->dn_right, dlp, drp);
613 dt_cg_ptrsize(dnp, dlp, drp, DIF_OP_MUL, dnp->dn_right->dn_reg);
615 instr = DIF_INSTR_FMT(op, dnp->dn_left->dn_reg,
616 dnp->dn_right->dn_reg, dnp->dn_left->dn_reg);
619 dt_regset_free(drp, dnp->dn_right->dn_reg);
620 dnp->dn_reg = dnp->dn_left->dn_reg;
623 dt_cg_ptrsize(dnp->dn_right,
624 dlp, drp, DIF_OP_UDIV, dnp->dn_reg);
640 dt_cg_prearith_op(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp, uint_t op)
642 ctf_file_t *ctfp = dnp->dn_ctfp;
648 if (dt_node_is_pointer(dnp)) {
649 type = ctf_type_resolve(ctfp, dnp->dn_type);
654 dt_cg_node(dnp->dn_child, dlp, drp);
655 dnp->dn_reg = dnp->dn_child->dn_reg;
660 instr = DIF_INSTR_FMT(op, dnp->dn_reg, reg, dnp->dn_reg);
669 * In both paths, we store the value in dnp->dn_reg (the new value).
671 if (dnp->dn_child->dn_kind == DT_NODE_VAR) {
672 dt_ident_t *idp = dt_ident_resolve(dnp->dn_child->dn_ident);
676 idp->di_id, dnp->dn_reg);
679 uint_t rbit = dnp->dn_child->dn_flags & DT_NF_REF;
681 assert(dnp->dn_child->dn_flags & DT_NF_WRITABLE);
682 assert(dnp->dn_child->dn_flags & DT_NF_LVALUE);
684 dnp->dn_child->dn_flags |= DT_NF_REF; /* force pass-by-ref */
685 dt_cg_node(dnp->dn_child, dlp, drp);
687 dt_cg_store(dnp, dlp, drp, dnp->dn_child);
688 dt_regset_free(drp, dnp->dn_child->dn_reg);
690 dnp->dn_left->dn_flags &= ~DT_NF_REF;
691 dnp->dn_left->dn_flags |= rbit;
696 dt_cg_postarith_op(dt_node_t *dnp, dt_irlist_t *dlp,
699 ctf_file_t *ctfp = dnp->dn_ctfp;
705 if (dt_node_is_pointer(dnp)) {
706 type = ctf_type_resolve(ctfp, dnp->dn_type);
711 dt_cg_node(dnp->dn_child, dlp, drp);
712 dnp->dn_reg = dnp->dn_child->dn_reg;
716 instr = DIF_INSTR_FMT(op, dnp->dn_reg, nreg, nreg);
726 if (dnp->dn_child->dn_kind == DT_NODE_VAR) {
727 dt_ident_t *idp = dt_ident_resolve(dnp->dn_child->dn_ident);
733 uint_t rbit = dnp->dn_child->dn_flags & DT_NF_REF;
734 int oreg = dnp->dn_reg;
736 assert(dnp->dn_child->dn_flags & DT_NF_WRITABLE);
737 assert(dnp->dn_child->dn_flags & DT_NF_LVALUE);
739 dnp->dn_child->dn_flags |= DT_NF_REF; /* force pass-by-ref */
740 dt_cg_node(dnp->dn_child, dlp, drp);
742 dnp->dn_reg = nreg;
743 dt_cg_store(dnp, dlp, drp, dnp->dn_child);
744 dnp->dn_reg = oreg;
746 dt_regset_free(drp, dnp->dn_child->dn_reg);
747 dnp->dn_left->dn_flags &= ~DT_NF_REF;
748 dnp->dn_left->dn_flags |= rbit;
760 dt_cg_compare_signed(dt_node_t *dnp)
764 if (dt_node_is_string(dnp->dn_left) ||
765 dt_node_is_string(dnp->dn_right))
767 else if (!dt_node_is_arith(dnp->dn_left) ||
768 !dt_node_is_arith(dnp->dn_right))
772 dt_node_promote(dnp->dn_left, dnp->dn_right, &dn);
777 dt_cg_compare_op(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp, uint_t op)
785 dt_cg_node(dnp->dn_left, dlp, drp);
786 dt_cg_node(dnp->dn_right, dlp, drp);
788 if (dt_node_is_string(dnp->dn_left) || dt_node_is_string(dnp->dn_right))
793 instr = DIF_INSTR_CMP(opc, dnp->dn_left->dn_reg, dnp->dn_right->dn_reg);
795 dt_regset_free(drp, dnp->dn_right->dn_reg);
796 dnp->dn_reg = dnp->dn_left->dn_reg;
801 instr = DIF_INSTR_MOV(DIF_REG_R0, dnp->dn_reg);
807 dt_cg_xsetx(dlp, NULL, lbl_true, dnp->dn_reg, 1);
822 dt_cg_ternary_op(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
830 dt_cg_node(dnp->dn_expr, dlp, drp);
831 instr = DIF_INSTR_TST(dnp->dn_expr->dn_reg);
833 dt_regset_free(drp, dnp->dn_expr->dn_reg);
838 dt_cg_node(dnp->dn_left, dlp, drp);
839 instr = DIF_INSTR_MOV(dnp->dn_left->dn_reg, DIF_REG_R0);
842 dt_regset_free(drp, dnp->dn_left->dn_reg);
848 dt_cg_node(dnp->dn_right, dlp, drp);
849 dnp->dn_reg = dnp->dn_right->dn_reg;
856 dip->di_instr = DIF_INSTR_MOV(dnp->dn_left->dn_reg, dnp->dn_reg);
861 dt_cg_logical_and(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
868 dt_cg_node(dnp->dn_left, dlp, drp);
869 instr = DIF_INSTR_TST(dnp->dn_left->dn_reg);
871 dt_regset_free(drp, dnp->dn_left->dn_reg);
876 dt_cg_node(dnp->dn_right, dlp, drp);
877 instr = DIF_INSTR_TST(dnp->dn_right->dn_reg);
879 dnp->dn_reg = dnp->dn_right->dn_reg;
884 dt_cg_setx(dlp, dnp->dn_reg, 1);
889 instr = DIF_INSTR_MOV(DIF_REG_R0, dnp->dn_reg);
896 dt_cg_logical_xor(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
903 dt_cg_node(dnp->dn_left, dlp, drp);
904 instr = DIF_INSTR_TST(dnp->dn_left->dn_reg);
909 dt_cg_setx(dlp, dnp->dn_left->dn_reg, 1);
912 dt_cg_node(dnp->dn_right, dlp, drp);
914 instr = DIF_INSTR_TST(dnp->dn_right->dn_reg);
919 dt_cg_setx(dlp, dnp->dn_right->dn_reg, 1);
921 instr = DIF_INSTR_FMT(DIF_OP_XOR, dnp->dn_left->dn_reg,
922 dnp->dn_right->dn_reg, dnp->dn_left->dn_reg);
926 dt_regset_free(drp, dnp->dn_right->dn_reg);
927 dnp->dn_reg = dnp->dn_left->dn_reg;
931 dt_cg_logical_or(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
939 dt_cg_node(dnp->dn_left, dlp, drp);
940 instr = DIF_INSTR_TST(dnp->dn_left->dn_reg);
942 dt_regset_free(drp, dnp->dn_left->dn_reg);
947 dt_cg_node(dnp->dn_right, dlp, drp);
948 instr = DIF_INSTR_TST(dnp->dn_right->dn_reg);
950 dnp->dn_reg = dnp->dn_right->dn_reg;
955 dt_cg_xsetx(dlp, NULL, lbl_true, dnp->dn_reg, 1);
960 instr = DIF_INSTR_MOV(DIF_REG_R0, dnp->dn_reg);
967 dt_cg_logical_neg(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
974 dt_cg_node(dnp->dn_child, dlp, drp);
975 dnp->dn_reg = dnp->dn_child->dn_reg;
977 instr = DIF_INSTR_TST(dnp->dn_reg);
983 instr = DIF_INSTR_MOV(DIF_REG_R0, dnp->dn_reg);
989 dt_cg_xsetx(dlp, NULL, lbl_zero, dnp->dn_reg, 1);
994 dt_cg_asgn_op(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
1003 * each member, and then set dnp->dn_reg to the scratch object address.
1005 if ((idp = dt_node_resolve(dnp->dn_right, DT_IDENT_XLSOU)) != NULL) {
1020 dn.dn_left = dnp;
1041 * code for dnp->dn_right, which is the translator input. We
1046 dxp->dx_ident->di_id = dnp->dn_right->dn_reg;
1110 if (dnp->dn_right->dn_reg != -1)
1111 dt_regset_free(drp, dnp->dn_right->dn_reg);
1113 assert(dnp->dn_reg == dnp->dn_right->dn_reg);
1114 dnp->dn_reg = r1;
1122 * In both paths, we assume dnp->dn_reg already has the new value.
1124 if (dnp->dn_left->dn_kind == DT_NODE_VAR) {
1125 idp = dt_ident_resolve(dnp->dn_left->dn_ident);
1128 dt_cg_arglist(idp, dnp->dn_left->dn_args, dlp, drp);
1132 idp->di_id, dnp->dn_reg);
1135 uint_t rbit = dnp->dn_left->dn_flags & DT_NF_REF;
1137 assert(dnp->dn_left->dn_flags & DT_NF_WRITABLE);
1138 assert(dnp->dn_left->dn_flags & DT_NF_LVALUE);
1140 dnp->dn_left->dn_flags |= DT_NF_REF; /* force pass-by-ref */
1142 dt_cg_node(dnp->dn_left, dlp, drp);
1143 dt_cg_store(dnp, dlp, drp, dnp->dn_left);
1144 dt_regset_free(drp, dnp->dn_left->dn_reg);
1146 dnp->dn_left->dn_flags &= ~DT_NF_REF;
1147 dnp->dn_left->dn_flags |= rbit;
1152 dt_cg_assoc_op(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
1157 assert(dnp->dn_kind == DT_NODE_VAR);
1158 assert(!(dnp->dn_ident->di_flags & DT_IDFLG_LOCAL));
1159 assert(dnp->dn_args != NULL);
1161 dt_cg_arglist(dnp->dn_ident, dnp->dn_args, dlp, drp);
1163 dnp->dn_reg = dt_regset_alloc(drp);
1165 if (dnp->dn_ident->di_flags & DT_IDFLG_TLS)
1170 dnp->dn_ident->di_flags |= DT_IDFLG_DIFR;
1171 instr = DIF_INSTR_LDV(op, dnp->dn_ident->di_id, dnp->dn_reg);
1199 if (dnp->dn_flags & DT_NF_REF) {
1203 instr = DIF_INSTR_TST(dnp->dn_reg);
1209 dt_cg_setx(dlp, dnp->dn_reg, dt_node_type_size(dnp));
1210 instr = DIF_INSTR_ALLOCS(dnp->dn_reg, dnp->dn_reg);
1213 dnp->dn_ident->di_flags |= DT_IDFLG_DIFW;
1214 instr = DIF_INSTR_STV(stvop, dnp->dn_ident->di_id, dnp->dn_reg);
1217 instr = DIF_INSTR_LDV(op, dnp->dn_ident->di_id, dnp->dn_reg);
1225 dt_cg_array_op(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
1228 uintmax_t saved = dnp->dn_args->dn_value;
1229 dt_ident_t *idp = dnp->dn_ident;
1236 assert(dnp->dn_kind == DT_NODE_VAR);
1239 assert(dnp->dn_args->dn_kind == DT_NODE_INT);
1240 assert(dnp->dn_args->dn_list == NULL);
1253 dnp->dn_reg = -1;
1256 dnp->dn_args->dn_value = prp->pr_mapping[saved];
1259 dt_cg_node(dnp->dn_args, dlp, drp);
1260 dnp->dn_args->dn_value = saved;
1262 dnp->dn_reg = dnp->dn_args->dn_reg;
1272 dnp->dn_args->dn_reg, dnp->dn_reg);
1287 if (idp->di_id != DIF_VAR_ARGS || !dt_node_is_scalar(dnp))
1290 if ((size = dt_node_type_size(dnp)) == sizeof (uint64_t))
1299 instr = DIF_INSTR_FMT(DIF_OP_SLL, dnp->dn_reg, reg, dnp->dn_reg);
1302 instr = DIF_INSTR_FMT((dnp->dn_flags & DT_NF_SIGNED) ?
1303 DIF_OP_SRA : DIF_OP_SRL, dnp->dn_reg, reg, dnp->dn_reg);
1314 * For arrays, we take the input parameter subtrees from dnp->dn_args and
1322 dt_cg_inline(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
1324 dt_ident_t *idp = dnp->dn_ident;
1335 for (i = 0, pnp = dnp->dn_args;
1345 dnp->dn_reg = inp->din_root->dn_reg;
1346 dt_cg_typecast(inp->din_root, dnp, dlp, drp);
1357 dt_cg_func_typeref(dtrace_hdl_t *dtp, dt_node_t *dnp)
1360 dt_node_t *addr = dnp->dn_args;
1511 dt_cg_xlate_expand(dt_node_t *dnp, dt_ident_t *idp, dt_irlist_t *dlp,
1520 size = ctf_type_size(dnp->dn_ident->di_ctfp, dnp->dn_ident->di_type);
1537 dlm.dtxl_sreg = dnp->dn_reg;
1539 (void) ctf_member_iter(dnp->dn_ident->di_ctfp,
1540 dnp->dn_ident->di_type, dt_cg_xlate_member,
1547 dt_cg_node(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
1549 ctf_file_t *ctfp = dnp->dn_ctfp;
1559 switch (dnp->dn_op) {
1561 dt_cg_node(dnp->dn_left, dlp, drp);
1562 dt_regset_free(drp, dnp->dn_left->dn_reg);
1563 dt_cg_node(dnp->dn_right, dlp, drp);
1564 dnp->dn_reg = dnp->dn_right->dn_reg;
1568 dt_cg_node(dnp->dn_right, dlp, drp);
1569 dnp->dn_reg = dnp->dn_right->dn_reg;
1570 dt_cg_asgn_op(dnp, dlp, drp);
1574 dt_cg_arithmetic_op(dnp, dlp, drp, DIF_OP_ADD);
1575 dt_cg_asgn_op(dnp, dlp, drp);
1579 dt_cg_arithmetic_op(dnp, dlp, drp, DIF_OP_SUB);
1580 dt_cg_asgn_op(dnp, dlp, drp);
1584 dt_cg_arithmetic_op(dnp, dlp, drp, DIF_OP_MUL);
1585 dt_cg_asgn_op(dnp, dlp, drp);
1589 dt_cg_arithmetic_op(dnp, dlp, drp,
1590 (dnp->dn_flags & DT_NF_SIGNED) ? DIF_OP_SDIV : DIF_OP_UDIV);
1591 dt_cg_asgn_op(dnp, dlp, drp);
1595 dt_cg_arithmetic_op(dnp, dlp, drp,
1596 (dnp->dn_flags & DT_NF_SIGNED) ? DIF_OP_SREM : DIF_OP_UREM);
1597 dt_cg_asgn_op(dnp, dlp, drp);
1601 dt_cg_arithmetic_op(dnp, dlp, drp, DIF_OP_AND);
1602 dt_cg_asgn_op(dnp, dlp, drp);
1606 dt_cg_arithmetic_op(dnp, dlp, drp, DIF_OP_XOR);
1607 dt_cg_asgn_op(dnp, dlp, drp);
1611 dt_cg_arithmetic_op(dnp, dlp, drp, DIF_OP_OR);
1612 dt_cg_asgn_op(dnp, dlp, drp);
1616 dt_cg_arithmetic_op(dnp, dlp, drp, DIF_OP_SLL);
1617 dt_cg_asgn_op(dnp, dlp, drp);
1621 dt_cg_arithmetic_op(dnp, dlp, drp,
1622 (dnp->dn_flags & DT_NF_SIGNED) ? DIF_OP_SRA : DIF_OP_SRL);
1623 dt_cg_asgn_op(dnp, dlp, drp);
1627 dt_cg_ternary_op(dnp, dlp, drp);
1631 dt_cg_logical_or(dnp, dlp, drp);
1635 dt_cg_logical_xor(dnp, dlp, drp);
1639 dt_cg_logical_and(dnp, dlp, drp);
1643 dt_cg_arithmetic_op(dnp, dlp, drp, DIF_OP_OR);
1647 dt_cg_arithmetic_op(dnp, dlp, drp, DIF_OP_XOR);
1651 dt_cg_arithmetic_op(dnp, dlp, drp, DIF_OP_AND);
1655 dt_cg_compare_op(dnp, dlp, drp, DIF_OP_BE);
1659 dt_cg_compare_op(dnp, dlp, drp, DIF_OP_BNE);
1663 dt_cg_compare_op(dnp, dlp, drp,
1664 dt_cg_compare_signed(dnp) ? DIF_OP_BL : DIF_OP_BLU);
1668 dt_cg_compare_op(dnp, dlp, drp,
1669 dt_cg_compare_signed(dnp) ? DIF_OP_BLE : DIF_OP_BLEU);
1673 dt_cg_compare_op(dnp, dlp, drp,
1674 dt_cg_compare_signed(dnp) ? DIF_OP_BG : DIF_OP_BGU);
1678 dt_cg_compare_op(dnp, dlp, drp,
1679 dt_cg_compare_signed(dnp) ? DIF_OP_BGE : DIF_OP_BGEU);
1683 dt_cg_arithmetic_op(dnp, dlp, drp, DIF_OP_SLL);
1687 dt_cg_arithmetic_op(dnp, dlp, drp,
1688 (dnp->dn_flags & DT_NF_SIGNED) ? DIF_OP_SRA : DIF_OP_SRL);
1692 dt_cg_arithmetic_op(dnp, dlp, drp, DIF_OP_ADD);
1696 dt_cg_arithmetic_op(dnp, dlp, drp, DIF_OP_SUB);
1700 dt_cg_arithmetic_op(dnp, dlp, drp, DIF_OP_MUL);
1704 dt_cg_arithmetic_op(dnp, dlp, drp,
1705 (dnp->dn_flags & DT_NF_SIGNED) ? DIF_OP_SDIV : DIF_OP_UDIV);
1709 dt_cg_arithmetic_op(dnp, dlp, drp,
1710 (dnp->dn_flags & DT_NF_SIGNED) ? DIF_OP_SREM : DIF_OP_UREM);
1714 dt_cg_logical_neg(dnp, dlp, drp);
1718 dt_cg_node(dnp->dn_child, dlp, drp);
1719 dnp->dn_reg = dnp->dn_child->dn_reg;
1720 instr = DIF_INSTR_NOT(dnp->dn_reg, dnp->dn_reg);
1725 dt_cg_prearith_op(dnp, dlp, drp, DIF_OP_ADD);
1729 dt_cg_postarith_op(dnp, dlp, drp, DIF_OP_ADD);
1733 dt_cg_prearith_op(dnp, dlp, drp, DIF_OP_SUB);
1737 dt_cg_postarith_op(dnp, dlp, drp, DIF_OP_SUB);
1741 dt_cg_node(dnp->dn_child, dlp, drp);
1742 dnp->dn_reg = dnp->dn_child->dn_reg;
1746 dt_cg_node(dnp->dn_child, dlp, drp);
1747 dnp->dn_reg = dnp->dn_child->dn_reg;
1750 dnp->dn_reg, dnp->dn_reg);
1756 dt_cg_node(dnp->dn_child, dlp, drp);
1757 dnp->dn_reg = dnp->dn_child->dn_reg;
1759 if (dt_node_is_dynamic(dnp->dn_child)) {
1761 idp = dt_node_resolve(dnp->dn_child, DT_IDENT_XLPTR);
1763 reg = dt_cg_xlate_expand(dnp, idp, dlp, drp);
1765 dt_regset_free(drp, dnp->dn_child->dn_reg);
1766 dnp->dn_reg = reg;
1768 } else if (!(dnp->dn_flags & DT_NF_REF)) {
1769 uint_t ubit = dnp->dn_flags & DT_NF_USERLAND;
1773 * we need the sign bit from dnp and the user bit from
1774 * dnp->dn_child in order to get the proper opcode.
1776 dnp->dn_flags |=
1777 (dnp->dn_child->dn_flags & DT_NF_USERLAND);
1779 instr = DIF_INSTR_LOAD(dt_cg_load(dnp, ctfp,
1780 dnp->dn_type), dnp->dn_reg, dnp->dn_reg);
1782 dnp->dn_flags &= ~DT_NF_USERLAND;
1783 dnp->dn_flags |= ubit;
1791 uint_t rbit = dnp->dn_child->dn_flags & DT_NF_REF;
1793 dnp->dn_child->dn_flags |= DT_NF_REF; /* force pass-by-ref */
1794 dt_cg_node(dnp->dn_child, dlp, drp);
1795 dnp->dn_reg = dnp->dn_child->dn_reg;
1797 dnp->dn_child->dn_flags &= ~DT_NF_REF;
1798 dnp->dn_child->dn_flags |= rbit;
1803 size_t size = dt_node_sizeof(dnp->dn_child);
1804 dnp->dn_reg = dt_regset_alloc(drp);
1806 dt_cg_setx(dlp, dnp->dn_reg, size);
1811 dt_cg_node(dnp->dn_child, dlp, drp);
1812 dnp->dn_reg = dnp->dn_child->dn_reg;
1823 if (dnp->dn_kind == DT_NODE_XLATOR) {
1824 dt_xlator_t *dxp = dnp->dn_xlator;
1829 dnp->dn_reg = dt_regset_alloc(drp);
1833 dxp->dx_ident->di_id, dnp->dn_reg);
1840 instr = DIF_INSTR_XLATE(op, 0, dnp->dn_reg);
1844 dlp->dl_last->di_extern = dnp->dn_xmember;
1848 assert(dnp->dn_kind == DT_NODE_OP2);
1849 dt_cg_node(dnp->dn_right, dlp, drp);
1850 dnp->dn_reg = dnp->dn_right->dn_reg;
1854 dt_cg_node(dnp->dn_right, dlp, drp);
1855 dnp->dn_reg = dnp->dn_right->dn_reg;
1856 dt_cg_typecast(dnp->dn_right, dnp, dlp, drp);
1861 assert(dnp->dn_right->dn_kind == DT_NODE_IDENT);
1862 dt_cg_node(dnp->dn_left, dlp, drp);
1872 dnp->dn_left, DT_IDENT_XLSOU)) != NULL ||
1874 dnp->dn_left, DT_IDENT_XLPTR)) != NULL) {
1880 mnp = dt_xlator_member(dxp, dnp->dn_right->dn_string);
1884 dxp->dx_ident->di_id = dnp->dn_left->dn_reg;
1887 dnp->dn_reg = mnp->dn_membexpr->dn_reg;
1888 dt_cg_typecast(mnp->dn_membexpr, dnp, dlp, drp);
1893 if (dnp->dn_left->dn_reg != -1)
1894 dt_regset_free(drp, dnp->dn_left->dn_reg);
1898 ctfp = dnp->dn_left->dn_ctfp;
1899 type = ctf_type_resolve(ctfp, dnp->dn_left->dn_type);
1901 if (dnp->dn_op == DT_TOK_PTR) {
1907 dnp->dn_right->dn_string, &m)) == NULL) {
1925 dnp->dn_left->dn_reg, reg, dnp->dn_left->dn_reg);
1932 if (!(dnp->dn_flags & DT_NF_REF)) {
1933 uint_t ubit = dnp->dn_flags & DT_NF_USERLAND;
1937 * we need the sign bit from dnp and the user bit from
1938 * dnp->dn_left in order to get the proper opcode.
1940 dnp->dn_flags |=
1941 (dnp->dn_left->dn_flags & DT_NF_USERLAND);
1943 instr = DIF_INSTR_LOAD(dt_cg_load(dnp,
1944 ctfp, m.ctm_type), dnp->dn_left->dn_reg,
1945 dnp->dn_left->dn_reg);
1947 dnp->dn_flags &= ~DT_NF_USERLAND;
1948 dnp->dn_flags |= ubit;
1953 if (dnp->dn_flags & DT_NF_BITFIELD)
1954 dt_cg_field_get(dnp, dlp, drp, ctfp, &m);
1957 dnp->dn_reg = dnp->dn_left->dn_reg;
1961 dnp->dn_reg = dt_regset_alloc(drp);
1963 assert(dnp->dn_kind == DT_NODE_STRING);
1964 stroff = dt_strtab_insert(yypcb->pcb_strtab, dnp->dn_string);
1971 instr = DIF_INSTR_SETS((ulong_t)stroff, dnp->dn_reg);
1982 if (dnp->dn_kind == DT_NODE_VAR &&
1983 (dnp->dn_ident->di_flags & DT_IDFLG_CGREG)) {
1984 dnp->dn_reg = dt_regset_alloc(drp);
1985 instr = DIF_INSTR_MOV(dnp->dn_ident->di_id,
1986 dnp->dn_reg);
1997 if (dnp->dn_kind == DT_NODE_VAR &&
1998 (dnp->dn_ident->di_flags & DT_IDFLG_INLINE)) {
1999 dt_cg_inline(dnp, dlp, drp);
2003 switch (dnp->dn_kind) {
2007 if ((idp = dnp->dn_ident)->di_kind != DT_IDENT_FUNC) {
2008 dnerror(dnp, D_CG_EXPR, "%s %s( ) may not be "
2016 dt_cg_func_typeref(dtp, dnp);
2023 dt_cg_arglist(dnp->dn_ident, dnp->dn_args, dlp, drp);
2025 dnp->dn_reg = dt_regset_alloc(drp);
2026 instr = DIF_INSTR_CALL(dnp->dn_ident->di_id,
2027 dnp->dn_reg);
2036 if (dnp->dn_ident->di_kind == DT_IDENT_XLSOU ||
2037 dnp->dn_ident->di_kind == DT_IDENT_XLPTR) {
2042 assert(dnp->dn_ident->di_id == DIF_VAR_ARGS);
2043 dt_cg_array_op(dnp, dlp, drp);
2047 if (dnp->dn_ident->di_kind == DT_IDENT_ARRAY) {
2048 if (dnp->dn_ident->di_id > DIF_VAR_ARRAY_MAX)
2049 dt_cg_assoc_op(dnp, dlp, drp);
2051 dt_cg_array_op(dnp, dlp, drp);
2055 dnp->dn_reg = dt_regset_alloc(drp);
2057 if (dnp->dn_ident->di_flags & DT_IDFLG_LOCAL)
2059 else if (dnp->dn_ident->di_flags & DT_IDFLG_TLS)
2064 dnp->dn_ident->di_flags |= DT_IDFLG_DIFR;
2067 dnp->dn_ident->di_id, dnp->dn_reg);
2075 dtrace_syminfo_t *sip = dnp->dn_ident->di_data;
2085 dnp->dn_reg = dt_regset_alloc(drp);
2086 dt_cg_xsetx(dlp, dnp->dn_ident,
2087 DT_LBL_NONE, dnp->dn_reg, sym.st_value);
2089 if (!(dnp->dn_flags & DT_NF_REF)) {
2090 instr = DIF_INSTR_LOAD(dt_cg_load(dnp, ctfp,
2091 dnp->dn_type), dnp->dn_reg, dnp->dn_reg);
2100 "not valid for an identifier\n", dnp->dn_kind);
2105 dnp->dn_reg = dt_regset_alloc(drp);
2106 dt_cg_setx(dlp, dnp->dn_reg, dnp->dn_value);
2111 "valid D compilation token\n", dnp->dn_op);
2116 dt_cg(dt_pcb_t *pcb, dt_node_t *dnp)
2145 pcb->pcb_dret = dnp;
2147 if (dt_node_resolve(dnp, DT_IDENT_XLPTR) != NULL) {
2148 dnerror(dnp, D_CG_DYN, "expression cannot evaluate to result "
2156 if (dnp->dn_kind == DT_NODE_MEMBER) {
2157 dxp = dnp->dn_membxlator;
2158 dnp = dnp->dn_membexpr;
2164 dt_cg_node(dnp, &pcb->pcb_ir, pcb->pcb_regs);
2166 if ((idp = dt_node_resolve(dnp, DT_IDENT_XLSOU)) != NULL) {
2167 int reg = dt_cg_xlate_expand(dnp, idp,
2169 dt_regset_free(pcb->pcb_regs, dnp->dn_reg);
2170 dnp->dn_reg = reg;
2173 instr = DIF_INSTR_RET(dnp->dn_reg);
2174 dt_regset_free(pcb->pcb_regs, dnp->dn_reg);
2177 if (dnp->dn_kind == DT_NODE_MEMBER) {