This is ilist.c in view mode; [Download] [Up]
/* * Copyright (C) 1985-1992 New York University * * This file is part of the Ada/Ed-C system. See the Ada/Ed README file for * warranty (none) and distribution info and also the GNU General Public * License for more details. */ /* i1_list - list single instruction */ /* Include standard header modules */ #include <stdlib.h> #include <stdio.h> #include "config.h" #include "int.h" #include "ivars.h" #include "intaprots.h" #include "opnameprots.h" #include "ilistprots.h" #ifdef DEBUG_FULL_STACK static void stdump(int); #endif static unsigned int dump_byte(int *, char *); static int dump_word(int *, char *); static void dump_gad(int *, char *); #define DUMP_BYTE dump_byte(ip, curcode) #define DUMP_WORD dump_word(ip, curcode) #define DUMP_LAD dump_word(ip, curcode) #define DUMP_GAD dump_gad(ip, curcode) void i_list1(int *ip, char *curcode) /*;i_list1*/ { unsigned int opcode; int jump, fjump; long lvalue; float fvalue; /* This procedure lists one instruction, advancing the first * argument ip to point to the next instruction. * It was obtained by editing a copy of the main_loop procedure * and should be modified whenever a change is made in inta.c * to the way in which instructions are decoded. */ if (debug_trace) { printf("tp=%1d,sp=%3d,sfp=%3d,bfp=%3d,exr=%2d,lin=%2d,tos=%3d,", tp ,sp ,sfp ,bfp ,exr ,lin ,cur_stackptr); printf("cs=%2d,ip=%3d\n",cs,*ip); } else printf("tos=%3d,cs=%2d,ip=%3d ",cur_stackptr,cs,*ip); #ifdef DEBUG_FULL_STACK stdump(sfp); #endif opcode = (unsigned ) curcode[*ip] & 0xff; *ip += 1; printf("%s ", op_name(opcode)); /* debug */ switch(opcode) { case I_NOP: break; /* Instructions Dealing with Tasking */ case I_ABORT: DUMP_WORD; /* number of tasks in stack */ break; case I_ACTIVATE: break; case I_ACTIVATE_NEW_L: DUMP_LAD; break; case I_ACTIVATE_NEW_G: case I_CREATE_TASK_G: DUMP_GAD; break; case I_CREATE_TASK_L: DUMP_LAD; break; case I_POP_TASKS_DECLARED_G: DUMP_GAD; break; case I_POP_TASKS_DECLARED_L: DUMP_LAD; break; case I_LINK_TASKS_DECLARED: case I_CURRENT_TASK: break; case I_END_ACTIVATION: DUMP_BYTE; break; case I_END_RENDEZVOUS: break; case I_ENTRY_CALL: DUMP_WORD; break; case I_RAISE_IN_CALLER: break; case I_SELECTIVE_WAIT: DUMP_WORD; /* number of alternatives */ break; case I_TERMINATE: DUMP_BYTE; break; case I_TIMED_ENTRY_CALL: case I_WAIT: /* delay */ break; case I_CREATE_COPY_B: case I_CREATE_COPY_W: printf(" ( %d ) ",TOS); case I_CREATE_B: case I_CREATE_W: case I_CREATE_L: case I_CREATE_A: case I_CREATE_STRUC: case I_CREATE_COPY_STRUC: case I_CREATE_COPY_L: case I_CREATE_COPY_A: break; case I_DECLARE_B: case I_DECLARE_W: case I_DECLARE_L: case I_DECLARE_A: DUMP_WORD; break; case I_ALLOCATE: break; case I_ALLOCATE_COPY_G: DUMP_GAD; break; case I_ALLOCATE_COPY_L: DUMP_LAD; break; case I_UPDATE: case I_UPDATE_AND_DISCARD: DUMP_WORD; break; case I_UNCREATE: printf(" ( %d %d ) ",TOSM(1),TOS); break; /* should withdraw the variable from bf_data_link TBSL */ /* Data Transfer Instructions */ case I_COMPARE_B: case I_COMPARE_W: case I_DEREF_B: case I_DEREF_W: case I_DEREF_L: case I_DEREF_D: case I_DEREF_A: printf(" ( %d %d ) ",TOSM(1),TOS); break; case I_COMPARE_L: printf(" ( %ld %ld ) ",TOSML(1),TOSL); break; case I_COMPARE_A: printf(" ( %d %d %d %d ) ",TOSM(3),TOSM(2),TOSM(1),TOS); case I_COMPARE_ARRAYS: case I_COMPARE_STRUC: break; case I_DISCARD_ADDR: DUMP_WORD; break; case I_DUPLICATE_B: case I_DUPLICATE_W: printf(" ( %d ) ",TOS); break; case I_DUPLICATE_L: printf(" ( %ld ) ",TOSL); break; case I_DUPLICATE_A: printf(" ( %d %d ) ",TOSM(1),TOS); break; case I_INDIRECT_MOVE_B: case I_INDIRECT_MOVE_W: case I_INDIRECT_MOVE_L: case I_INDIRECT_MOVE_A: printf(" ( %d %d %d %d ) ",TOSM(3),TOSM(2),TOSM(1),TOS); break; case I_INDIRECT_POP_B_G: case I_INDIRECT_POP_W_G: DUMP_GAD; break; case I_INDIRECT_POP_L_G: case I_INDIRECT_POP_A_G: DUMP_GAD; break; case I_INDIRECT_POP_B_L: case I_INDIRECT_POP_W_L: case I_INDIRECT_POP_L_L: case I_INDIRECT_POP_A_L: DUMP_LAD; break; case I_MOVE_B: case I_MOVE_W: case I_MOVE_L: case I_MOVE_A: printf(" ( %d %d ) ",TOSM(2),TOSM(1)); break; case I_POP_B_G: case I_POP_W_G: printf(" ( %d ) ",TOS); DUMP_GAD; break; case I_POP_L_G: case I_POP_A_G: DUMP_GAD; break; case I_POP_B_L: case I_POP_W_L: printf(" ( %d ) ",TOS); case I_POP_L_L: case I_POP_A_L: DUMP_LAD; break; case I_PUSH_B_G: case I_PUSH_W_G: case I_PUSH_L_G: case I_PUSH_A_G: DUMP_GAD; break; case I_PUSH_B_L: case I_PUSH_W_L: case I_PUSH_L_L: case I_PUSH_A_L: DUMP_LAD; break; case I_PUSH_EFFECTIVE_ADDRESS_G: case I_PUSH_IMMEDIATE_A: DUMP_GAD; break; case I_PUSH_EFFECTIVE_ADDRESS_L: jump = sfp + dump_word(ip, curcode); printf(" (%d %d)",cur_stack[jump], cur_stack[jump+1]); break; case I_PUSH_IMMEDIATE_B: DUMP_WORD; break; case I_PUSH_IMMEDIATE_W: DUMP_WORD; break; case I_PUSH_IMMEDIATE_L: #ifdef ALIGN_WORD lvalue = get_long(LONG(curcode + *ip)); fvalue = lvalue; #else lvalue = *LONG(curcode + *ip); fvalue = *((float *)(curcode + *ip)); #endif printf(" %ld %15.3e ", lvalue,fvalue); *ip += sizeof(long); break; /* Floating Point Instructions */ case I_FLOAT_ADD_L: case I_FLOAT_SUB_L: case I_FLOAT_MUL_L: case I_FLOAT_DIV_L: case I_FLOAT_COMPARE_L: fvalue = *((float *)(cur_stack+cur_stackptr+1-2*WORDS_FLOAT)); printf(" ( %e %e ) ",fvalue,TOSF); break; case I_FLOAT_POW_L: fvalue = *((float *)(cur_stack+cur_stackptr-WORDS_FLOAT)); printf(" ( %e %d ) ",fvalue,TOS); break; case I_FLOAT_NEG_L: case I_FLOAT_ABS_L: printf(" ( %e ) ",TOSF); break; case I_ADD_B: case I_ADD_W: printf(" ( %d %d ) ",TOSM(1),TOS); case I_ADD_L: break; case I_ADD_IMMEDIATE_B: printf(" ( %d ) ",TOS); DUMP_WORD; break; case I_ADD_IMMEDIATE_W: printf(" ( %d ) ",TOS); DUMP_WORD; break; case I_ADD_IMMEDIATE_L: lvalue = *(LONG(curcode + *ip)); printf(" ( %ld ) %ld ",TOSL,lvalue); *ip += WORDS_LONG; break; case I_DIV_B: case I_DIV_W: case I_DIV_L: case I_REM_B: case I_REM_W: case I_REM_L: case I_MOD_B: case I_MOD_W: case I_MOD_L: case I_MUL_B: case I_MUL_W: case I_MUL_L: case I_POW_B: case I_POW_W: case I_POW_L: case I_FIX_MUL: case I_FIX_DIV: printf(" ( %d %d ) ",TOSM(1),TOS); break; case I_CONVERT_TO_L: DUMP_LAD; break; case I_CONVERT_TO_G: DUMP_GAD; break; case I_NEG_B: case I_NEG_W: case I_NEG_L: case I_ABS_B: case I_ABS_W: case I_ABS_L: case I_NOT: case I_AND: case I_XOR: case I_OR: case I_IS_EQUAL: case I_IS_GREATER: case I_IS_GREATER_OR_EQUAL: case I_IS_LESS: case I_IS_LESS_OR_EQUAL: printf(" ( %d ) ",TOS); case I_MEMBERSHIP: break; case I_QUAL_RANGE_G: DUMP_GAD; break; case I_QUAL_RANGE_L: DUMP_LAD; break; case I_QUAL_DISCR_G: DUMP_GAD; break; case I_QUAL_DISCR_L: DUMP_LAD; break; case I_QUAL_INDEX_G: DUMP_GAD; break; case I_QUAL_INDEX_L: DUMP_LAD; break; case I_QUAL_SUB_G: DUMP_GAD; break; case I_QUAL_SUB_L: DUMP_LAD; break; case I_SUB_B: case I_SUB_W: case I_SUB_L: case I_ARRAY_CATENATE: case I_ARRAY_MOVE: case I_ARRAY_SLICE: case I_ARRAY_AND: case I_ARRAY_OR: case I_ARRAY_XOR: case I_ARRAY_NOT: break; /* Record Instructions */ case I_RECORD_MOVE_G: DUMP_GAD; break; case I_RECORD_MOVE_L: DUMP_LAD; break; /* Attributes */ case I_ATTRIBUTE: DUMP_WORD; /* attribute */ break; case I_ENTER_BLOCK: case I_LEAVE_BLOCK: case I_EXIT_BLOCK: break; case I_CALL_L: DUMP_LAD; break; case I_CALL_G: DUMP_GAD; break; case I_CALL_PREDEF: DUMP_BYTE; break; case I_CALL_INTERFACE: DUMP_WORD; break; case I_CASE_B: case I_CASE_W: case I_CASE_L: printf(" ( %d ) case table :\n",TOS); printf(" value "); DUMP_WORD; /* nb */ printf(" jump "); fjump = DUMP_WORD; printf("\n"); for (; *ip < fjump;) { printf(" value "); DUMP_WORD; /* nb */ printf(" jump "); jump = DUMP_WORD; printf("\n"); fjump = ((fjump < jump) ? fjump : jump); } break; case I_RETURN_B: case I_RETURN_W: DUMP_WORD; printf(" ( %d ) ",TOS); break; case I_RETURN_L: DUMP_WORD; printf(" ( %d %e ) ",TOS,TOSF); break; case I_RETURN_A: DUMP_WORD; printf(" ( %d %d ) ",TOSM(1),TOS); break; case I_RETURN_STRUC: DUMP_WORD; break; case I_END_FOR_LOOP_B: case I_END_FOR_LOOP_W: case I_END_FOR_LOOP_L: case I_END_FORREV_LOOP_B: case I_END_FORREV_LOOP_W: case I_END_FORREV_LOOP_L: case I_JUMP_IF_FALSE: case I_JUMP_IF_TRUE: case I_JUMP_IF_GREATER: case I_JUMP_IF_GREATER_OR_EQUAL: case I_JUMP_IF_LESS: case I_JUMP_IF_LESS_OR_EQUAL: printf(" ( %d ) ",TOS); DUMP_WORD; break; case I_JUMP: DUMP_WORD; break; /* Miscellanous Instructions */ case I_LOAD_EXCEPTION_REGISTER: case I_INSTALL_HANDLER: DUMP_WORD; break; case I_RAISE: break; case I_RESTORE_STACK_POINTER: DUMP_WORD; break; case I_SAVE_STACK_POINTER: break; case I_STMT: DUMP_WORD; break; case I_SUBSCRIPT: break; case I_SELECT: DUMP_WORD; break; case I_TEST_EXCEPTION_REGISTER: DUMP_WORD; break; case I_TYPE_LOCAL: DUMP_GAD; break; case I_TYPE_GLOBAL: DUMP_GAD; break; case I_SUBPROGRAM: DUMP_LAD; break; default: printf("bad opcode"); } /* end switch on operation code */ printf(" \n"); } #ifdef DEBUG_FULL_STACK /* give full stack dump for each instruction (use in desparation!) */ static void stdump(int pd) /*;stdump*/ { /* stack dump p is current value of sfp */ int i; printf("stdump sfp %d %d\n",pd,pd-18); for (i= (-18); ;i++) { if ((pd+i) <0) continue; if ((pd+i)>cur_stackptr) break; printf("%6d %03d ", cur_stack[pd+i], pd+i); if (i%7 == 0) printf("\n"); } printf("\n"); } #endif static unsigned int dump_byte(int *ip, char *curcode) /*;dump_byte*/ { unsigned int byte; /*byte = curcode[*ip++];*/ byte = (unsigned) curcode[*ip]; byte = byte & 0xff; *ip += 1; printf(" %u ", byte); return byte; } static int dump_word(int *ip, char *curcode) /*;dump_word*/ { int w; #ifdef ALIGN_WORD w = get_int((int *)(curcode + *ip)); #else w = *((int *)(curcode + *ip)); #endif printf(" %d ", w); *ip += sizeof(int); return w; } static void dump_gad(int *ip, char *curcode) /*;dump_gad*/ { unsigned int bse, off; bse = (int) curcode[*ip]; *ip += 1; #ifdef ALIGN_WORD off = get_int((int *)(curcode + *ip)); #else off = *((int *)(curcode + *ip)); #endif *ip += sizeof(int); printf(" %3u %5u ", bse, off); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.