Lines Matching refs:dnp
142 dt_cg_load(dt_node_t *dnp, ctf_file_t *ctfp, ctf_id_t type)
163 if ((dnp->dn_flags & DT_NF_BITFIELD) &&
176 if (dnp->dn_flags & DT_NF_SIGNED)
178 if (dnp->dn_flags & DT_NF_USERLAND)
185 dt_cg_ptrsize(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp,
188 ctf_file_t *ctfp = dnp->dn_ctfp;
199 type = ctf_type_resolve(ctfp, dnp->dn_type);
239 dt_cg_field_get(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp,
252 assert(dnp->dn_op == DT_TOK_PTR || dnp->dn_op == DT_TOK_DOT);
253 r1 = dnp->dn_left->dn_reg;
269 if (dnp->dn_flags & DT_NF_SIGNED) {
520 dt_node_t *dnp;
523 for (dnp = args; dnp != NULL; dnp = dnp->dn_list)
524 dt_cg_node(dnp, dlp, drp);
529 for (dnp = args; dnp != NULL; dnp = dnp->dn_list, i++) {
535 dt_node_diftype(yypcb->pcb_hdl, dnp, &t);
537 isp->dis_args[i].dn_reg = dnp->dn_reg; /* re-use register */
538 dt_cg_typecast(dnp, &isp->dis_args[i], dlp, drp);
553 instr = DIF_INSTR_PUSHTS(op, t.dtdt_kind, reg, dnp->dn_reg);
555 dt_regset_free(drp, dnp->dn_reg);
566 dt_cg_arithmetic_op(dt_node_t *dnp, dt_irlist_t *dlp,
569 int is_ptr_op = (dnp->dn_op == DT_TOK_ADD || dnp->dn_op == DT_TOK_SUB ||
570 dnp->dn_op == DT_TOK_ADD_EQ || dnp->dn_op == DT_TOK_SUB_EQ);
572 int lp_is_ptr = dt_node_is_pointer(dnp->dn_left);
573 int rp_is_ptr = dt_node_is_pointer(dnp->dn_right);
578 assert(dnp->dn_op == DT_TOK_SUB);
582 dt_cg_node(dnp->dn_left, dlp, drp);
584 dt_cg_ptrsize(dnp, dlp, drp, DIF_OP_MUL, dnp->dn_left->dn_reg);
586 dt_cg_node(dnp->dn_right, dlp, drp);
588 dt_cg_ptrsize(dnp, dlp, drp, DIF_OP_MUL, dnp->dn_right->dn_reg);
590 instr = DIF_INSTR_FMT(op, dnp->dn_left->dn_reg,
591 dnp->dn_right->dn_reg, dnp->dn_left->dn_reg);
594 dt_regset_free(drp, dnp->dn_right->dn_reg);
595 dnp->dn_reg = dnp->dn_left->dn_reg;
598 dt_cg_ptrsize(dnp->dn_right,
599 dlp, drp, DIF_OP_UDIV, dnp->dn_reg);
615 dt_cg_prearith_op(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp, uint_t op)
617 ctf_file_t *ctfp = dnp->dn_ctfp;
623 if (dt_node_is_pointer(dnp)) {
624 type = ctf_type_resolve(ctfp, dnp->dn_type);
629 dt_cg_node(dnp->dn_child, dlp, drp);
630 dnp->dn_reg = dnp->dn_child->dn_reg;
637 instr = DIF_INSTR_FMT(op, dnp->dn_reg, reg, dnp->dn_reg);
646 * In both paths, we store the value in dnp->dn_reg (the new value).
648 if (dnp->dn_child->dn_kind == DT_NODE_VAR) {
649 dt_ident_t *idp = dt_ident_resolve(dnp->dn_child->dn_ident);
653 idp->di_id, dnp->dn_reg);
656 uint_t rbit = dnp->dn_child->dn_flags & DT_NF_REF;
658 assert(dnp->dn_child->dn_flags & DT_NF_WRITABLE);
659 assert(dnp->dn_child->dn_flags & DT_NF_LVALUE);
661 dnp->dn_child->dn_flags |= DT_NF_REF; /* force pass-by-ref */
662 dt_cg_node(dnp->dn_child, dlp, drp);
664 dt_cg_store(dnp, dlp, drp, dnp->dn_child);
665 dt_regset_free(drp, dnp->dn_child->dn_reg);
667 dnp->dn_left->dn_flags &= ~DT_NF_REF;
668 dnp->dn_left->dn_flags |= rbit;
673 dt_cg_postarith_op(dt_node_t *dnp, dt_irlist_t *dlp,
676 ctf_file_t *ctfp = dnp->dn_ctfp;
682 if (dt_node_is_pointer(dnp)) {
683 type = ctf_type_resolve(ctfp, dnp->dn_type);
688 dt_cg_node(dnp->dn_child, dlp, drp);
689 dnp->dn_reg = dnp->dn_child->dn_reg;
695 instr = DIF_INSTR_FMT(op, dnp->dn_reg, nreg, nreg);
705 if (dnp->dn_child->dn_kind == DT_NODE_VAR) {
706 dt_ident_t *idp = dt_ident_resolve(dnp->dn_child->dn_ident);
712 uint_t rbit = dnp->dn_child->dn_flags & DT_NF_REF;
713 int oreg = dnp->dn_reg;
715 assert(dnp->dn_child->dn_flags & DT_NF_WRITABLE);
716 assert(dnp->dn_child->dn_flags & DT_NF_LVALUE);
718 dnp->dn_child->dn_flags |= DT_NF_REF; /* force pass-by-ref */
719 dt_cg_node(dnp->dn_child, dlp, drp);
721 dnp->dn_reg = nreg;
722 dt_cg_store(dnp, dlp, drp, dnp->dn_child);
723 dnp->dn_reg = oreg;
725 dt_regset_free(drp, dnp->dn_child->dn_reg);
726 dnp->dn_left->dn_flags &= ~DT_NF_REF;
727 dnp->dn_left->dn_flags |= rbit;
739 dt_cg_compare_signed(dt_node_t *dnp)
743 if (dt_node_is_string(dnp->dn_left) ||
744 dt_node_is_string(dnp->dn_right))
746 else if (!dt_node_is_arith(dnp->dn_left) ||
747 !dt_node_is_arith(dnp->dn_right))
751 dt_node_promote(dnp->dn_left, dnp->dn_right, &dn);
756 dt_cg_compare_op(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp, uint_t op)
764 dt_cg_node(dnp->dn_left, dlp, drp);
765 dt_cg_node(dnp->dn_right, dlp, drp);
767 if (dt_node_is_string(dnp->dn_left) || dt_node_is_string(dnp->dn_right))
772 instr = DIF_INSTR_CMP(opc, dnp->dn_left->dn_reg, dnp->dn_right->dn_reg);
774 dt_regset_free(drp, dnp->dn_right->dn_reg);
775 dnp->dn_reg = dnp->dn_left->dn_reg;
780 instr = DIF_INSTR_MOV(DIF_REG_R0, dnp->dn_reg);
786 dt_cg_xsetx(dlp, NULL, lbl_true, dnp->dn_reg, 1);
801 dt_cg_ternary_op(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
809 dt_cg_node(dnp->dn_expr, dlp, drp);
810 instr = DIF_INSTR_TST(dnp->dn_expr->dn_reg);
812 dt_regset_free(drp, dnp->dn_expr->dn_reg);
817 dt_cg_node(dnp->dn_left, dlp, drp);
818 instr = DIF_INSTR_MOV(dnp->dn_left->dn_reg, DIF_REG_R0);
821 dt_regset_free(drp, dnp->dn_left->dn_reg);
827 dt_cg_node(dnp->dn_right, dlp, drp);
828 dnp->dn_reg = dnp->dn_right->dn_reg;
835 dip->di_instr = DIF_INSTR_MOV(dnp->dn_left->dn_reg, dnp->dn_reg);
840 dt_cg_logical_and(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
847 dt_cg_node(dnp->dn_left, dlp, drp);
848 instr = DIF_INSTR_TST(dnp->dn_left->dn_reg);
850 dt_regset_free(drp, dnp->dn_left->dn_reg);
855 dt_cg_node(dnp->dn_right, dlp, drp);
856 instr = DIF_INSTR_TST(dnp->dn_right->dn_reg);
858 dnp->dn_reg = dnp->dn_right->dn_reg;
863 dt_cg_setx(dlp, dnp->dn_reg, 1);
868 instr = DIF_INSTR_MOV(DIF_REG_R0, dnp->dn_reg);
875 dt_cg_logical_xor(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
882 dt_cg_node(dnp->dn_left, dlp, drp);
883 instr = DIF_INSTR_TST(dnp->dn_left->dn_reg);
888 dt_cg_setx(dlp, dnp->dn_left->dn_reg, 1);
891 dt_cg_node(dnp->dn_right, dlp, drp);
893 instr = DIF_INSTR_TST(dnp->dn_right->dn_reg);
898 dt_cg_setx(dlp, dnp->dn_right->dn_reg, 1);
900 instr = DIF_INSTR_FMT(DIF_OP_XOR, dnp->dn_left->dn_reg,
901 dnp->dn_right->dn_reg, dnp->dn_left->dn_reg);
905 dt_regset_free(drp, dnp->dn_right->dn_reg);
906 dnp->dn_reg = dnp->dn_left->dn_reg;
910 dt_cg_logical_or(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
918 dt_cg_node(dnp->dn_left, dlp, drp);
919 instr = DIF_INSTR_TST(dnp->dn_left->dn_reg);
921 dt_regset_free(drp, dnp->dn_left->dn_reg);
926 dt_cg_node(dnp->dn_right, dlp, drp);
927 instr = DIF_INSTR_TST(dnp->dn_right->dn_reg);
929 dnp->dn_reg = dnp->dn_right->dn_reg;
934 dt_cg_xsetx(dlp, NULL, lbl_true, dnp->dn_reg, 1);
939 instr = DIF_INSTR_MOV(DIF_REG_R0, dnp->dn_reg);
946 dt_cg_logical_neg(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
953 dt_cg_node(dnp->dn_child, dlp, drp);
954 dnp->dn_reg = dnp->dn_child->dn_reg;
956 instr = DIF_INSTR_TST(dnp->dn_reg);
962 instr = DIF_INSTR_MOV(DIF_REG_R0, dnp->dn_reg);
968 dt_cg_xsetx(dlp, NULL, lbl_zero, dnp->dn_reg, 1);
973 dt_cg_asgn_op(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
982 * each member, and then set dnp->dn_reg to the scratch object address.
984 if ((idp = dt_node_resolve(dnp->dn_right, DT_IDENT_XLSOU)) != NULL) {
999 dn.dn_left = dnp;
1022 * code for dnp->dn_right, which is the translator input. We
1027 dxp->dx_ident->di_id = dnp->dn_right->dn_reg;
1092 if (dnp->dn_right->dn_reg != -1)
1093 dt_regset_free(drp, dnp->dn_right->dn_reg);
1095 assert(dnp->dn_reg == dnp->dn_right->dn_reg);
1096 dnp->dn_reg = r1;
1104 * In both paths, we assume dnp->dn_reg already has the new value.
1106 if (dnp->dn_left->dn_kind == DT_NODE_VAR) {
1107 idp = dt_ident_resolve(dnp->dn_left->dn_ident);
1110 dt_cg_arglist(idp, dnp->dn_left->dn_args, dlp, drp);
1114 idp->di_id, dnp->dn_reg);
1117 uint_t rbit = dnp->dn_left->dn_flags & DT_NF_REF;
1119 assert(dnp->dn_left->dn_flags & DT_NF_WRITABLE);
1120 assert(dnp->dn_left->dn_flags & DT_NF_LVALUE);
1122 dnp->dn_left->dn_flags |= DT_NF_REF; /* force pass-by-ref */
1124 dt_cg_node(dnp->dn_left, dlp, drp);
1125 dt_cg_store(dnp, dlp, drp, dnp->dn_left);
1126 dt_regset_free(drp, dnp->dn_left->dn_reg);
1128 dnp->dn_left->dn_flags &= ~DT_NF_REF;
1129 dnp->dn_left->dn_flags |= rbit;
1134 dt_cg_assoc_op(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
1139 assert(dnp->dn_kind == DT_NODE_VAR);
1140 assert(!(dnp->dn_ident->di_flags & DT_IDFLG_LOCAL));
1141 assert(dnp->dn_args != NULL);
1143 dt_cg_arglist(dnp->dn_ident, dnp->dn_args, dlp, drp);
1145 if ((dnp->dn_reg = dt_regset_alloc(drp)) == -1)
1148 if (dnp->dn_ident->di_flags & DT_IDFLG_TLS)
1153 dnp->dn_ident->di_flags |= DT_IDFLG_DIFR;
1154 instr = DIF_INSTR_LDV(op, dnp->dn_ident->di_id, dnp->dn_reg);
1182 if (dnp->dn_flags & DT_NF_REF) {
1186 instr = DIF_INSTR_TST(dnp->dn_reg);
1192 dt_cg_setx(dlp, dnp->dn_reg, dt_node_type_size(dnp));
1193 instr = DIF_INSTR_ALLOCS(dnp->dn_reg, dnp->dn_reg);
1196 dnp->dn_ident->di_flags |= DT_IDFLG_DIFW;
1197 instr = DIF_INSTR_STV(stvop, dnp->dn_ident->di_id, dnp->dn_reg);
1200 instr = DIF_INSTR_LDV(op, dnp->dn_ident->di_id, dnp->dn_reg);
1208 dt_cg_array_op(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
1211 uintmax_t saved = dnp->dn_args->dn_value;
1212 dt_ident_t *idp = dnp->dn_ident;
1219 assert(dnp->dn_kind == DT_NODE_VAR);
1222 assert(dnp->dn_args->dn_kind == DT_NODE_INT);
1223 assert(dnp->dn_args->dn_list == NULL);
1236 dnp->dn_reg = -1;
1239 dnp->dn_args->dn_value = prp->pr_mapping[saved];
1242 dt_cg_node(dnp->dn_args, dlp, drp);
1243 dnp->dn_args->dn_value = saved;
1245 dnp->dn_reg = dnp->dn_args->dn_reg;
1255 dnp->dn_args->dn_reg, dnp->dn_reg);
1270 if (idp->di_id != DIF_VAR_ARGS || !dt_node_is_scalar(dnp))
1273 if ((size = dt_node_type_size(dnp)) == sizeof (uint64_t))
1284 instr = DIF_INSTR_FMT(DIF_OP_SLL, dnp->dn_reg, reg, dnp->dn_reg);
1287 instr = DIF_INSTR_FMT((dnp->dn_flags & DT_NF_SIGNED) ?
1288 DIF_OP_SRA : DIF_OP_SRL, dnp->dn_reg, reg, dnp->dn_reg);
1299 * For arrays, we take the input parameter subtrees from dnp->dn_args and
1307 dt_cg_inline(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
1309 dt_ident_t *idp = dnp->dn_ident;
1320 for (i = 0, pnp = dnp->dn_args;
1330 dnp->dn_reg = inp->din_root->dn_reg;
1331 dt_cg_typecast(inp->din_root, dnp, dlp, drp);
1342 dt_cg_node(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
1344 ctf_file_t *ctfp = dnp->dn_ctfp;
1355 switch (dnp->dn_op) {
1357 dt_cg_node(dnp->dn_left, dlp, drp);
1358 dt_regset_free(drp, dnp->dn_left->dn_reg);
1359 dt_cg_node(dnp->dn_right, dlp, drp);
1360 dnp->dn_reg = dnp->dn_right->dn_reg;
1364 dt_cg_node(dnp->dn_right, dlp, drp);
1365 dnp->dn_reg = dnp->dn_right->dn_reg;
1366 dt_cg_asgn_op(dnp, dlp, drp);
1370 dt_cg_arithmetic_op(dnp, dlp, drp, DIF_OP_ADD);
1371 dt_cg_asgn_op(dnp, dlp, drp);
1375 dt_cg_arithmetic_op(dnp, dlp, drp, DIF_OP_SUB);
1376 dt_cg_asgn_op(dnp, dlp, drp);
1380 dt_cg_arithmetic_op(dnp, dlp, drp, DIF_OP_MUL);
1381 dt_cg_asgn_op(dnp, dlp, drp);
1385 dt_cg_arithmetic_op(dnp, dlp, drp,
1386 (dnp->dn_flags & DT_NF_SIGNED) ? DIF_OP_SDIV : DIF_OP_UDIV);
1387 dt_cg_asgn_op(dnp, dlp, drp);
1391 dt_cg_arithmetic_op(dnp, dlp, drp,
1392 (dnp->dn_flags & DT_NF_SIGNED) ? DIF_OP_SREM : DIF_OP_UREM);
1393 dt_cg_asgn_op(dnp, dlp, drp);
1397 dt_cg_arithmetic_op(dnp, dlp, drp, DIF_OP_AND);
1398 dt_cg_asgn_op(dnp, dlp, drp);
1402 dt_cg_arithmetic_op(dnp, dlp, drp, DIF_OP_XOR);
1403 dt_cg_asgn_op(dnp, dlp, drp);
1407 dt_cg_arithmetic_op(dnp, dlp, drp, DIF_OP_OR);
1408 dt_cg_asgn_op(dnp, dlp, drp);
1412 dt_cg_arithmetic_op(dnp, dlp, drp, DIF_OP_SLL);
1413 dt_cg_asgn_op(dnp, dlp, drp);
1417 dt_cg_arithmetic_op(dnp, dlp, drp,
1418 (dnp->dn_flags & DT_NF_SIGNED) ? DIF_OP_SRA : DIF_OP_SRL);
1419 dt_cg_asgn_op(dnp, dlp, drp);
1423 dt_cg_ternary_op(dnp, dlp, drp);
1427 dt_cg_logical_or(dnp, dlp, drp);
1431 dt_cg_logical_xor(dnp, dlp, drp);
1435 dt_cg_logical_and(dnp, dlp, drp);
1439 dt_cg_arithmetic_op(dnp, dlp, drp, DIF_OP_OR);
1443 dt_cg_arithmetic_op(dnp, dlp, drp, DIF_OP_XOR);
1447 dt_cg_arithmetic_op(dnp, dlp, drp, DIF_OP_AND);
1451 dt_cg_compare_op(dnp, dlp, drp, DIF_OP_BE);
1455 dt_cg_compare_op(dnp, dlp, drp, DIF_OP_BNE);
1459 dt_cg_compare_op(dnp, dlp, drp,
1460 dt_cg_compare_signed(dnp) ? DIF_OP_BL : DIF_OP_BLU);
1464 dt_cg_compare_op(dnp, dlp, drp,
1465 dt_cg_compare_signed(dnp) ? DIF_OP_BLE : DIF_OP_BLEU);
1469 dt_cg_compare_op(dnp, dlp, drp,
1470 dt_cg_compare_signed(dnp) ? DIF_OP_BG : DIF_OP_BGU);
1474 dt_cg_compare_op(dnp, dlp, drp,
1475 dt_cg_compare_signed(dnp) ? DIF_OP_BGE : DIF_OP_BGEU);
1479 dt_cg_arithmetic_op(dnp, dlp, drp, DIF_OP_SLL);
1483 dt_cg_arithmetic_op(dnp, dlp, drp,
1484 (dnp->dn_flags & DT_NF_SIGNED) ? DIF_OP_SRA : DIF_OP_SRL);
1488 dt_cg_arithmetic_op(dnp, dlp, drp, DIF_OP_ADD);
1492 dt_cg_arithmetic_op(dnp, dlp, drp, DIF_OP_SUB);
1496 dt_cg_arithmetic_op(dnp, dlp, drp, DIF_OP_MUL);
1500 dt_cg_arithmetic_op(dnp, dlp, drp,
1501 (dnp->dn_flags & DT_NF_SIGNED) ? DIF_OP_SDIV : DIF_OP_UDIV);
1505 dt_cg_arithmetic_op(dnp, dlp, drp,
1506 (dnp->dn_flags & DT_NF_SIGNED) ? DIF_OP_SREM : DIF_OP_UREM);
1510 dt_cg_logical_neg(dnp, dlp, drp);
1514 dt_cg_node(dnp->dn_child, dlp, drp);
1515 dnp->dn_reg = dnp->dn_child->dn_reg;
1516 instr = DIF_INSTR_NOT(dnp->dn_reg, dnp->dn_reg);
1521 dt_cg_prearith_op(dnp, dlp, drp, DIF_OP_ADD);
1525 dt_cg_postarith_op(dnp, dlp, drp, DIF_OP_ADD);
1529 dt_cg_prearith_op(dnp, dlp, drp, DIF_OP_SUB);
1533 dt_cg_postarith_op(dnp, dlp, drp, DIF_OP_SUB);
1537 dt_cg_node(dnp->dn_child, dlp, drp);
1538 dnp->dn_reg = dnp->dn_child->dn_reg;
1542 dt_cg_node(dnp->dn_child, dlp, drp);
1543 dnp->dn_reg = dnp->dn_child->dn_reg;
1546 dnp->dn_reg, dnp->dn_reg);
1552 dt_cg_node(dnp->dn_child, dlp, drp);
1553 dnp->dn_reg = dnp->dn_child->dn_reg;
1555 if (!(dnp->dn_flags & DT_NF_REF)) {
1556 uint_t ubit = dnp->dn_flags & DT_NF_USERLAND;
1560 * we need the sign bit from dnp and the user bit from
1561 * dnp->dn_child in order to get the proper opcode.
1563 dnp->dn_flags |=
1564 (dnp->dn_child->dn_flags & DT_NF_USERLAND);
1566 instr = DIF_INSTR_LOAD(dt_cg_load(dnp, ctfp,
1567 dnp->dn_type), dnp->dn_reg, dnp->dn_reg);
1569 dnp->dn_flags &= ~DT_NF_USERLAND;
1570 dnp->dn_flags |= ubit;
1578 uint_t rbit = dnp->dn_child->dn_flags & DT_NF_REF;
1580 dnp->dn_child->dn_flags |= DT_NF_REF; /* force pass-by-ref */
1581 dt_cg_node(dnp->dn_child, dlp, drp);
1582 dnp->dn_reg = dnp->dn_child->dn_reg;
1584 dnp->dn_child->dn_flags &= ~DT_NF_REF;
1585 dnp->dn_child->dn_flags |= rbit;
1590 size_t size = dt_node_sizeof(dnp->dn_child);
1592 if ((dnp->dn_reg = dt_regset_alloc(drp)) == -1)
1596 dt_cg_setx(dlp, dnp->dn_reg, size);
1601 dt_cg_node(dnp->dn_child, dlp, drp);
1602 dnp->dn_reg = dnp->dn_child->dn_reg;
1613 if (dnp->dn_kind == DT_NODE_XLATOR) {
1614 dt_xlator_t *dxp = dnp->dn_xlator;
1619 if ((dnp->dn_reg = dt_regset_alloc(drp)) == -1)
1624 dxp->dx_ident->di_id, dnp->dn_reg);
1631 instr = DIF_INSTR_XLATE(op, 0, dnp->dn_reg);
1635 dlp->dl_last->di_extern = dnp->dn_xmember;
1639 assert(dnp->dn_kind == DT_NODE_OP2);
1640 dt_cg_node(dnp->dn_right, dlp, drp);
1641 dnp->dn_reg = dnp->dn_right->dn_reg;
1645 dt_cg_node(dnp->dn_right, dlp, drp);
1646 dnp->dn_reg = dnp->dn_right->dn_reg;
1647 dt_cg_typecast(dnp->dn_right, dnp, dlp, drp);
1652 assert(dnp->dn_right->dn_kind == DT_NODE_IDENT);
1653 dt_cg_node(dnp->dn_left, dlp, drp);
1663 dnp->dn_left, DT_IDENT_XLSOU)) != NULL ||
1665 dnp->dn_left, DT_IDENT_XLPTR)) != NULL) {
1671 mnp = dt_xlator_member(dxp, dnp->dn_right->dn_string);
1675 dxp->dx_ident->di_id = dnp->dn_left->dn_reg;
1678 dnp->dn_reg = mnp->dn_membexpr->dn_reg;
1679 dt_cg_typecast(mnp->dn_membexpr, dnp, dlp, drp);
1684 if (dnp->dn_left->dn_reg != -1)
1685 dt_regset_free(drp, dnp->dn_left->dn_reg);
1689 ctfp = dnp->dn_left->dn_ctfp;
1690 type = ctf_type_resolve(ctfp, dnp->dn_left->dn_type);
1692 if (dnp->dn_op == DT_TOK_PTR) {
1698 dnp->dn_right->dn_string, &m)) == NULL) {
1715 dnp->dn_left->dn_reg, reg, dnp->dn_left->dn_reg);
1722 if (!(dnp->dn_flags & DT_NF_REF)) {
1723 uint_t ubit = dnp->dn_flags & DT_NF_USERLAND;
1727 * we need the sign bit from dnp and the user bit from
1728 * dnp->dn_left in order to get the proper opcode.
1730 dnp->dn_flags |=
1731 (dnp->dn_left->dn_flags & DT_NF_USERLAND);
1733 instr = DIF_INSTR_LOAD(dt_cg_load(dnp,
1734 ctfp, m.ctm_type), dnp->dn_left->dn_reg,
1735 dnp->dn_left->dn_reg);
1737 dnp->dn_flags &= ~DT_NF_USERLAND;
1738 dnp->dn_flags |= ubit;
1743 if (dnp->dn_flags & DT_NF_BITFIELD)
1744 dt_cg_field_get(dnp, dlp, drp, ctfp, &m);
1747 dnp->dn_reg = dnp->dn_left->dn_reg;
1751 if ((dnp->dn_reg = dt_regset_alloc(drp)) == -1)
1754 assert(dnp->dn_kind == DT_NODE_STRING);
1755 stroff = dt_strtab_insert(yypcb->pcb_strtab, dnp->dn_string);
1762 instr = DIF_INSTR_SETS((ulong_t)stroff, dnp->dn_reg);
1773 if (dnp->dn_kind == DT_NODE_VAR &&
1774 (dnp->dn_ident->di_flags & DT_IDFLG_CGREG)) {
1775 if ((dnp->dn_reg = dt_regset_alloc(drp)) == -1)
1777 instr = DIF_INSTR_MOV(dnp->dn_ident->di_id,
1778 dnp->dn_reg);
1789 if (dnp->dn_kind == DT_NODE_VAR &&
1790 (dnp->dn_ident->di_flags & DT_IDFLG_INLINE)) {
1791 dt_cg_inline(dnp, dlp, drp);
1795 switch (dnp->dn_kind) {
1797 if ((idp = dnp->dn_ident)->di_kind != DT_IDENT_FUNC) {
1798 dnerror(dnp, D_CG_EXPR, "%s %s( ) may not be "
1804 dt_cg_arglist(dnp->dn_ident, dnp->dn_args, dlp, drp);
1806 if ((dnp->dn_reg = dt_regset_alloc(drp)) == -1)
1810 dnp->dn_ident->di_id, dnp->dn_reg);
1818 if (dnp->dn_ident->di_kind == DT_IDENT_XLSOU ||
1819 dnp->dn_ident->di_kind == DT_IDENT_XLPTR) {
1824 assert(dnp->dn_ident->di_id == DIF_VAR_ARGS);
1825 dt_cg_array_op(dnp, dlp, drp);
1829 if (dnp->dn_ident->di_kind == DT_IDENT_ARRAY) {
1830 if (dnp->dn_ident->di_id > DIF_VAR_ARRAY_MAX)
1831 dt_cg_assoc_op(dnp, dlp, drp);
1833 dt_cg_array_op(dnp, dlp, drp);
1837 if ((dnp->dn_reg = dt_regset_alloc(drp)) == -1)
1840 if (dnp->dn_ident->di_flags & DT_IDFLG_LOCAL)
1842 else if (dnp->dn_ident->di_flags & DT_IDFLG_TLS)
1847 dnp->dn_ident->di_flags |= DT_IDFLG_DIFR;
1850 dnp->dn_ident->di_id, dnp->dn_reg);
1858 dtrace_syminfo_t *sip = dnp->dn_ident->di_data;
1868 if ((dnp->dn_reg = dt_regset_alloc(drp)) == -1)
1871 dt_cg_xsetx(dlp, dnp->dn_ident,
1872 DT_LBL_NONE, dnp->dn_reg, sym.st_value);
1874 if (!(dnp->dn_flags & DT_NF_REF)) {
1875 instr = DIF_INSTR_LOAD(dt_cg_load(dnp, ctfp,
1876 dnp->dn_type), dnp->dn_reg, dnp->dn_reg);
1885 "not valid for an identifier\n", dnp->dn_kind);
1890 if ((dnp->dn_reg = dt_regset_alloc(drp)) == -1)
1893 dt_cg_setx(dlp, dnp->dn_reg, dnp->dn_value);
1898 "valid D compilation token\n", dnp->dn_op);
1903 dt_cg(dt_pcb_t *pcb, dt_node_t *dnp)
1931 pcb->pcb_dret = dnp;
1933 if (dt_node_is_dynamic(dnp)) {
1934 dnerror(dnp, D_CG_DYN, "expression cannot evaluate to result "
1942 if (dnp->dn_kind == DT_NODE_MEMBER) {
1943 dxp = dnp->dn_membxlator;
1944 dnp = dnp->dn_membexpr;
1950 dt_cg_node(dnp, &pcb->pcb_ir, pcb->pcb_regs);
1951 instr = DIF_INSTR_RET(dnp->dn_reg);
1952 dt_regset_free(pcb->pcb_regs, dnp->dn_reg);
1955 if (dnp->dn_kind == DT_NODE_MEMBER) {