[Custom Thumbnail]
All the Code of the series can be found at the Github repository:
https://github.com/drifter1/compiler
switch (node->entry->st_type){
case INT_TYPE:
case CHAR_TYPE:
...
break;
case REAL_TYPE:
...
break;
case POINTER_TYPE:
...
break;
case ARRAY_TYPE:
...
break;
default:
fprintf(stderr, "Error in case selection!\n");
exit(1);
}
switch (node->entry->st_type){
case INT_TYPE:
case CHAR_TYPE:
if(expression_data_type(node->assign_val) == INT_TYPE){
/* constant */
if(node->assign_val->type == CONST_NODE){
temp_const = (AST_Node_Const *) node->assign_val;
fprintf(fp, "LI %s, %d\n",
GetRegisterName(node->entry->g_index, 0), temp_const->val);
}
/* variable */
else{
fprintf(fp, "MOVE %s, %s\n",
GetRegisterName(node->entry->g_index, 0),
GetRegisterName(getGraphIndex(node->assign_val), 0));
}
}
else{
if(node->assign_val->type == CONST_NODE){
temp_const = (AST_Node_Const *) node->assign_val;
fprintf(fp, "LI %s, %d\n",
GetRegisterName(node->entry->g_index, 0), temp_const->val);
}
/* variable */
else{
fprintf(fp, "CVT.W.D %s, %s\n",
GetRegisterName(getGraphIndex(node->assign_val), 1),
GetRegisterName(getGraphIndex(node->assign_val), 1));
fprintf(fp, "MFC1 %s, %s\n",
GetRegisterName(getGraphIndex(node->assign_val), 0),
GetRegisterName(getGraphIndex(node->assign_val), 1));
fprintf(fp, "MOVE %s, %s\n",
GetRegisterName(node->entry->g_index, 0),
GetRegisterName(getGraphIndex(node->assign_val), 0));
}
}
break;
case REAL_TYPE:
if(expression_data_type(node->assign_val) == REAL_TYPE){
/* constant */
if(node->assign_val->type == CONST_NODE){
temp_const = (AST_Node_Const *) node->assign_val;
fprintf(fp, "LI.D %s, %.2f\n",
GetRegisterName(node->entry->g_index, 1), temp_const->val);
}
/* variable*/
else{
fprintf(fp, "MOV.D %s, %s\n",
GetRegisterName(node->entry->g_index, 1),
GetRegisterName(getGraphIndex(node->assign_val), 1));
}
}
else{
/* constant */
if(node->assign_val->type == CONST_NODE){
temp_const = (AST_Node_Const *) node->assign_val;
fprintf(fp, "LI.D %s, %d.0\n",
GetRegisterName(node->entry->g_index, 1), temp_const->val);
}
/* variable*/
else{
fprintf(fp, "MTC1 %s, %s\n",
GetRegisterName(getGraphIndex(node->assign_val), 0),
GetRegisterName(getGraphIndex(node->assign_val), 1));
fprintf(fp, "CVT.D.W %s, %s\n",
GetRegisterName(getGraphIndex(node->assign_val), 1),
GetRegisterName(getGraphIndex(node->assign_val), 1));
fprintf(fp, "MOVE %s, %s\n",
GetRegisterName(node->entry->g_index, 1),
GetRegisterName(getGraphIndex(node->assign_val), 1));
}
}
break;
...
case POINTER_TYPE:
if(node->assign_val->type == REF_NODE){
AST_Node_Ref *temp_ref = (AST_Node_Ref *) node->assign_val;
/* not a reference */
if(temp_ref->ref == 0){
/* integer */
if(expression_data_type(node->assign_val) == INT_TYPE){
fprintf(fp, "SW %s, 0(%s)\n",
GetRegisterName(getGraphIndex(node->assign_val), 0),
GetRegisterName(node->entry->g_index, 0));
}
/* floating point */
else{
fprintf(fp, "S.D %s, 0(%s)\n",
GetRegisterName(getGraphIndex(node->assign_val), 1),
GetRegisterName(node->entry->g_index, 0));
}
}
/* reference */
else{
fprintf(fp, "SW %s, %s($0)\n",
GetRegisterName(getGraphIndex(node->assign_val), 0),
node->entry->st_name);
fprintf(fp, "MOVE %s, %s\n",
GetRegisterName(node->entry->g_index, 0),
GetRegisterName(getGraphIndex(node->assign_val), 0));
}
}
else{
/* integer */
if(expression_data_type(node->assign_val) == INT_TYPE){
fprintf(fp, "SW %s, 0(%s)\n",
GetRegisterName(getGraphIndex(node->assign_val), 0),
GetRegisterName(node->entry->g_index, 0));
}
/* floating point */
else{
fprintf(fp, "S.D %s, 0(%s)\n",
GetRegisterName(getGraphIndex(node->assign_val), 1),
GetRegisterName(node->entry->g_index, 0));
}
}
break;
....data
# variables
i: .word 0
val: .double 0.000000
res: .double 0.000000
# messages
.text
main:
LI.D $f2, 2.50
LI.D $f28, 1.0
ADD.D $f6, $f2 $f28
MOV.D $f4, $f6
.data
# variables
i: .word 0
val: .double 2.500000
res: .space 80
# messages
.text
main:
LI $s0, 0
LW $s0, i($0)
BGE $s0, 10, Temp_Label
L.D $f2, val
LW $s0, i($0)
LI.D $f6, 0.0
Array Assignment
LW $s2, res($0)
MOV.D $f2, $f4
LW $s2, res($0)
ADDI $s0, $s0, 1
.data
# variables
c: .byte 'c'
i: .word 0
p: .word 0
val: .double 2.500000
res: .double 0.500000, 1.500000, 2.500000, 3.500000, 4.500000, 5.500000
# messages
msg1: .asciiz "\n"
msg2: .asciiz "\n"
msg3: .asciiz "iteration: 3\n"
msg4: .asciiz " "
msg5: .asciiz "\n"
.text
main:
LA $s3, res($0)
SW $s3, p($0)
MOVE $s4, $s3
LI $s0, 0
LW $s0, i($0)
BGE $s0, 10, Temp_Label
LW $s0, i($0)
BGT $s0, 5, Temp_Label
J Temp_Label
LW $s0, i($0)
BNE $s0, 5, Temp_Label
LW $s0, i($0)
MULI $s5, $s0, 2
MOVE $s0, $s5
LI $s6, 0
MTC1 $s6, $f12
CVT.D.W $f12, $f12
MOVE $f4, $f12
L.D $f4, val
LW $s0, i($0)
LI.D $f14, 0.0
S.D $f14, 0($s4)
LW $s3, res($0)
J Temp_Label
L.D $f4, val
LW $s0, i($0)
LI.D $f16, 0.0
S.D $f16, 0($s4)
LW $s3, res($0)
MOV.D $f4, $f6
LW $s3, res($0)
LW $s4, p($0)
ADDI $t1, $s4, 1
SW $t1, 0($s4)
LW $s0, i($0)
BNE $s0, 2, Temp_Label
L.D $f4, val
LI.D $f28, 4.50
C.EQ.D $f4 $f28
BC1F Temp_Label
AND $s0, $s0, $s0
ADDI $s0, $s0, 1
LW $s0, i($0)
BGE $s0, 12, Temp_Label
LW $s0, i($0)
LW $s1, c($0)
ADDI $s0, $s0, 1