int
MR_get_register_number_short(MR_ShortLval locn)
{
    if (MR_SHORT_LVAL_TYPE(locn) == MR_SHORT_LVAL_TYPE_R) {
        return locn >> MR_SHORT_LVAL_TAGBITS;
    } else {
        return -1;
Example #2
0
static void
MR_dump_short_value(MR_ShortLval locn, MR_MemoryZone *heap_zone,
    MR_Word *stack_pointer, MR_Word *current_frame, MR_bool do_regs)
{
    int     locn_num;
    MR_Word value;
    int     difference;
    MR_bool have_value;

    value = 0;
    have_value = MR_FALSE;
    locn_num = (int) locn >> MR_SHORT_LVAL_TAGBITS;
    switch (MR_SHORT_LVAL_TYPE(locn)) {
        case MR_SHORT_LVAL_TYPE_R:
            if (do_regs) {
                value = MR_virtual_reg_value(locn_num);
                have_value = MR_TRUE;
                fprintf(stderr, "r%d\t", locn_num);
            } else {
                fprintf(stderr, "r%d (invalid)\t", locn_num);
            }
            break;

        case MR_SHORT_LVAL_TYPE_STACKVAR:
            value = MR_based_stackvar(stack_pointer, locn_num);
            have_value = MR_TRUE;
            fprintf(stderr, "stackvar%d", locn_num);
            break;

        case MR_SHORT_LVAL_TYPE_FRAMEVAR:
            value = MR_based_framevar(current_frame, locn_num);
            have_value = MR_TRUE;
            fprintf(stderr, "framevar%d", locn_num);
            break;

        case MR_SHORT_LVAL_TYPE_SPECIAL:
            switch (locn_num) {
                case MR_LONG_LVAL_TYPE_SUCCIP:
                    fprintf(stderr, "succip");
                    break;
                case MR_LONG_LVAL_TYPE_MAXFR:
                    fprintf(stderr, "succip");
                    break;
                case MR_LONG_LVAL_TYPE_CURFR:
                    fprintf(stderr, "curfr");
                    break;
                case MR_LONG_LVAL_TYPE_HP:
                    fprintf(stderr, "hp");
                    break;
                case MR_LONG_LVAL_TYPE_SP:
                    fprintf(stderr, "sp");
                    break;
                default:
                    fprintf(stderr, "SPECIAL DEFAULT");
                    break;
            }
            break;

        default:
            fprintf(stderr, "SHORT DEFAULT");
            break;
    }
    if (have_value) {
        if (value >= (MR_Word) heap_zone->MR_zone_min &&
                value < (MR_Word) heap_zone->MR_zone_hardmax)
        {
            difference = (MR_Word *) value - (MR_Word *) heap_zone->MR_zone_min;
            fprintf(stderr, "\thp[%d]\t(%lx)", difference, (long) value);
        } else {
            fprintf(stderr, "\t       \t(%lx)", (long) value);
        }
    }
}