decode.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. /*
  2. * Giovanni Agosta, Andrea Di Biagio
  3. * Politecnico di Milano, 2007
  4. *
  5. * decode.c
  6. * Formal Languages & Compilers Machine, 2007/2008
  7. *
  8. */
  9. #include <stdlib.h>
  10. #include "decode.h"
  11. /* Code Names for debug printing */
  12. char *names[4][16] = {
  13. { "ADD", "SUB", "ANDL", "ORL", "EORL", "ANDB", "ORB", "EORB", "MUL", "DIV", "SHL", "SHR", "ROTL", "ROTR", "NEG", "SPCL" },
  14. { "ADDI", "SUBI", "ANDLI", "ORLI", "EORLI", "ANDBI", "ORBI", "EORBI", "MULI", "DIVI", "SHLI", "SHRI", "ROTLI", "ROTRI", "NOTL", "NOTB" },
  15. { "NOP", "MOVA", "JSR", "RET", "LOAD", "STORE", "HALT", "SEQ", "SGE", "SGT", "SLE", "SLT", "SNE", "READ", "WRITE", "ILL15" },
  16. { "BT", "BF", "BHI", "BLS", "BCC", "BCS", "BNE", "BEQ", "BVC", "BVS", "BPL", "BMI", "BGE", "BLT", "BGT", "BLE" }
  17. };
  18. decoded_instr *decode(int the_instr) {
  19. decoded_instr *instr = (decoded_instr *) malloc(sizeof(decoded_instr));
  20. /* decodifica */
  21. instr->format = getbits(the_instr,31,30); /* Instruction format (2 bits) */
  22. instr->opcode = getbits(the_instr,29,26); /* Opcode (4 bits) */
  23. instr->dest = getbits(the_instr,25,21); /* Destination register */
  24. instr->src1 = getbits(the_instr,20,16); /* Source register 1 */
  25. instr->src2 = getbits(the_instr,15,11); /* Source register 2 */
  26. instr->imm = getbits(the_instr,15, 0); /* 16 bits immediate value */
  27. instr->addr = getbits(the_instr,19, 0); /* 20 bits immediate address */
  28. instr->func = getbits(the_instr,10, 0); /* 11 extra bits, used to encode extra info */
  29. normalizeValues(instr);
  30. return instr;
  31. }
  32. int carry(decoded_instr *instr){
  33. return instr->func & 1;
  34. }
  35. int sign(decoded_instr *instr){
  36. return instr->func & 2;
  37. }
  38. int indirect_dest(decoded_instr *instr){
  39. return instr->func & 4;
  40. }
  41. int indirect_src2(decoded_instr *instr){
  42. return instr->func & 8;
  43. }
  44. /* Debug printf: print out the current instruction */
  45. void print(FILE* file, decoded_instr *instr)
  46. {
  47. /* default value for file is stderr */
  48. if (file == NULL)
  49. file = stderr;
  50. /* precondition: instr should be different from NULL */
  51. if (instr == NULL)
  52. {
  53. fprintf(file,"[NULL POINTER] \n");
  54. return;
  55. }
  56. switch (instr->format)
  57. {
  58. case FORMAT_TER :
  59. fprintf(file,"%s ", names[instr->format][instr->opcode]);
  60. if (indirect_dest(instr))
  61. fprintf(file,"(R%d) ", instr->dest);
  62. else
  63. fprintf(file,"R%d ", instr->dest);
  64. fprintf(file,"R%d ", instr->src1);
  65. if (indirect_src2(instr))
  66. fprintf(file,"(R%d) \n", instr->src2);
  67. else
  68. fprintf(file,"R%d \n", instr->src2);
  69. break;
  70. case FORMAT_BIN :
  71. fprintf(file,"%s R%d, R%d, #%d \n"
  72. , names[instr->format][instr->opcode], instr->dest
  73. , instr->src1, instr->imm);
  74. break;
  75. case FORMAT_UNR :
  76. if (instr->opcode == 0 || instr->opcode == 6)
  77. fprintf(file,"%s \n", names[instr->format][instr->opcode]);
  78. else if (instr->opcode == 13 || instr->opcode == 14)
  79. fprintf(file,"%s R%d \n"
  80. , names[instr->format][instr->opcode], instr->dest);
  81. else
  82. fprintf(file,"%s R%d, $%d \n", names[instr->format][instr->opcode]
  83. , instr->dest, instr->addr);
  84. break;
  85. case FORMAT_CC :
  86. fprintf(file,"%s $%d \n"
  87. , names[instr->format][instr->opcode], instr->addr);
  88. break;
  89. default :
  90. fprintf(file,"[UNKNOWN INSTRUCTION FORMAT] \n");
  91. break;
  92. }
  93. }
  94. void normalizeValues(decoded_instr *instr)
  95. {
  96. instr->imm = (instr->imm << 16);
  97. instr->imm = (instr->imm >> 16);
  98. instr->addr = (instr->addr << 12);
  99. instr->addr = (instr->addr >> 12);
  100. }