comparison mc-code-mips.c @ 163:fc8514c9d685

*** empty log message ***
author kono
date Mon, 24 Nov 2003 00:52:18 +0900
parents da529eab5618
children 1c2a9232ea93
comparison
equal deleted inserted replaced
162:0c604d2ff585 163:fc8514c9d685
9 #define TEXT_EMIT_MODE 0 9 #define TEXT_EMIT_MODE 0
10 #define DATA_EMIT_MODE 1 10 #define DATA_EMIT_MODE 1
11 #define RODATA_EMIT_MODE 2 11 #define RODATA_EMIT_MODE 2
12 12
13 static void data_mode(char *name); 13 static void data_mode(char *name);
14 static void ld_indexx(int byte, int n, int xreg); 14 static void ld_indexx(int byte, int n, int xreg,int sign);
15 static void local_table(void); 15 static void local_table(void);
16 static void shift(char *op, int reg); 16 static void shift(char *op, int reg);
17 static int struct_push(int e4,int t,int arg); 17 static int struct_push(int e4,int t,int arg);
18 18
19 static int output_mode = TEXT_EMIT_MODE; 19 static int output_mode = TEXT_EMIT_MODE;
817 printf("\tlw %s,%s\n",register_name(creg),((NMTBL*)cadr(e1))->nm); 817 printf("\tlw %s,%s\n",register_name(creg),((NMTBL*)cadr(e1))->nm);
818 regv[creg]=1; 818 regv[creg]=1;
819 } 819 }
820 820
821 void 821 void
822 code_crgvar(int e1,int creg){ 822 code_crgvar(int e1,int creg,int sign){
823 printf("\tlb %s,%s\n",register_name(creg),((NMTBL*)cadr(e1))->nm); 823 printf("\t%s %s,%s\n",sign?"lbu":"lb",register_name(creg),((NMTBL*)cadr(e1))->nm);
824 regv[creg]=1; 824 regv[creg]=1;
825 } 825 }
826 826
827 827
828 void 828 void
840 regv[creg]=1; 840 regv[creg]=1;
841 } 841 }
842 842
843 843
844 void 844 void
845 code_crlvar(int e2,int reg) { 845 code_crlvar(int e2,int reg,int sign) {
846 printf("\tlb %s,",register_name(reg)); 846 printf("\t%s %s,",sign?"lbu":"lb",register_name(reg));
847 lvar(e2); 847 lvar(e2);
848 regv[reg]=1; 848 regv[reg]=1;
849 } 849 }
850 850
851 851
938 regv[creg]=1; ireg=creg; 938 regv[creg]=1; ireg=creg;
939 } 939 }
940 940
941 941
942 void 942 void
943 code_cpostinc(int e1,int e2,int reg) { 943 code_cpostinc(int e1,int e2,int reg,int sign) {
944 char *xrn,*crn,*nrn; 944 char *xrn,*crn,*nrn;
945 int i,nreg,dreg; 945 int i,nreg,dreg;
946 if (car(e2)==REGISTER) { 946 if (car(e2)==REGISTER) {
947 printf("\tlb %s,0(%s)\n",register_name(reg),register_name(cadr(e2))); 947 printf("\t%s %s,0(%s)\n",sign?"lbu":"lb",register_name(reg),register_name(cadr(e2)));
948 printf("\taddu %s,%s,%d\n", 948 printf("\taddu %s,%s,%d\n",
949 register_name(cadr(e2)),register_name(cadr(e2)),caddr(e1)); 949 register_name(cadr(e2)),register_name(cadr(e2)),caddr(e1));
950 regv[reg]=1; 950 regv[reg]=1;
951 return; 951 return;
952 } 952 }
955 dreg=get_register(); if (!dreg) error(-1); 955 dreg=get_register(); if (!dreg) error(-1);
956 xrn = register_name(dreg); 956 xrn = register_name(dreg);
957 nreg=get_register(); if (!nreg) error(-1); 957 nreg=get_register(); if (!nreg) error(-1);
958 nrn = register_name(nreg); 958 nrn = register_name(nreg);
959 printf("\tlw %s,0(%s)\n",xrn,crn); 959 printf("\tlw %s,0(%s)\n",xrn,crn);
960 printf("\tlb %s,0(%s)\n",nrn,xrn); 960 printf("\t%s %s,0(%s)\n",sign?"lbu":"lb",nrn,xrn);
961 printf("\taddu %s,%s,%d\n", xrn,xrn,caddr(e1)); 961 printf("\taddu %s,%s,%d\n", xrn,xrn,caddr(e1));
962 printf("\tsw %s,0(%s)\n",xrn,crn); 962 printf("\tsw %s,0(%s)\n",xrn,crn);
963 i=creg;creg=nreg;nreg=i; 963 i=creg;creg=nreg;nreg=i;
964 free_register(nreg); 964 free_register(nreg);
965 free_register(dreg); 965 free_register(dreg);
966 regv[creg]=1; ireg=creg; 966 regv[creg]=1; ireg=creg;
967 } 967 }
968 968
969 969
970 void 970 void
971 code_cpreinc(int e1,int e2,int reg) { 971 code_cpreinc(int e1,int e2,int reg,int sign) {
972 char *xrn,*crn,*nrn; 972 char *xrn,*crn,*nrn;
973 int i,nreg,dreg; 973 int i,nreg,dreg;
974 if (car(e2)==REGISTER) { 974 if (car(e2)==REGISTER) {
975 printf("\taddu %s,%s,%d\n", 975 printf("\taddu %s,%s,%d\n",
976 register_name(cadr(e2)),register_name(cadr(e2)),caddr(e1)); 976 register_name(cadr(e2)),register_name(cadr(e2)),caddr(e1));
977 printf("\tlb %s,0(%s)\n",register_name(reg),register_name(cadr(e2))); 977 printf("\t%s %s,0(%s)\n",sign?"lbu":"lb",register_name(reg),register_name(cadr(e2)));
978 regv[reg]=1; 978 regv[reg]=1;
979 return; 979 return;
980 } 980 }
981 g_expr(e2); 981 g_expr(e2);
982 crn = register_name(creg); 982 crn = register_name(creg);
984 xrn = register_name(dreg); 984 xrn = register_name(dreg);
985 nreg=get_register(); if (!nreg) error(-1); 985 nreg=get_register(); if (!nreg) error(-1);
986 nrn = register_name(nreg); 986 nrn = register_name(nreg);
987 printf("\tlw %s,0(%s)\n",xrn,crn); 987 printf("\tlw %s,0(%s)\n",xrn,crn);
988 printf("\taddu %s,%s,%d\n", nrn,xrn,caddr(e1)); 988 printf("\taddu %s,%s,%d\n", nrn,xrn,caddr(e1));
989 printf("\tlb %s,0(%s)\n",nrn,xrn); 989 printf("\t%s %s,0(%s)\n",sign?"lbu":"lb",nrn,xrn);
990 printf("\tsw %s,0(%s)\n",xrn,crn); 990 printf("\tsw %s,0(%s)\n",xrn,crn);
991 i=creg;creg=nreg;nreg=i; 991 i=creg;creg=nreg;nreg=i;
992 free_register(nreg); 992 free_register(nreg);
993 free_register(dreg); 993 free_register(dreg);
994 regv[creg]=1; ireg=creg; 994 regv[creg]=1; ireg=creg;
995 } 995 }
996 996
997 997
998 void 998 void
999 code_cpostdec(int e1,int e2,int reg) { 999 code_cpostdec(int e1,int e2,int reg,int sign) {
1000 char *xrn,*crn,*nrn; 1000 char *xrn,*crn,*nrn;
1001 int i,nreg,dreg; 1001 int i,nreg,dreg;
1002 if (car(e2)==REGISTER) { 1002 if (car(e2)==REGISTER) {
1003 crn=register_name(reg); 1003 crn=register_name(reg);
1004 xrn=register_name(cadr(e2)); 1004 xrn=register_name(cadr(e2));
1005 printf("\tlb %s,0(%s)\n",crn,xrn); 1005 printf("\t%s %s,0(%s)\n",sign?"lbu":"lb",crn,xrn);
1006 printf("\taddu %s,%s,%d\n",xrn,xrn,caddr(e1)); 1006 printf("\taddu %s,%s,%d\n",xrn,xrn,caddr(e1));
1007 regv[reg]=1; 1007 regv[reg]=1;
1008 return; 1008 return;
1009 } 1009 }
1010 g_expr(e2); 1010 g_expr(e2);
1012 dreg=get_register(); if (!dreg) error(-1); 1012 dreg=get_register(); if (!dreg) error(-1);
1013 xrn = register_name(dreg); 1013 xrn = register_name(dreg);
1014 nreg=get_register(); if (!nreg) error(-1); 1014 nreg=get_register(); if (!nreg) error(-1);
1015 nrn = register_name(nreg); 1015 nrn = register_name(nreg);
1016 printf("\tlw %s,0(%s)\n",xrn,crn); 1016 printf("\tlw %s,0(%s)\n",xrn,crn);
1017 printf("\tlb %s,0(%s)\n",nrn,xrn); 1017 printf("\t%s %s,0(%s)\n",sign?"lbu":"lb",nrn,xrn);
1018 printf("\taddu %s,%s,%d\n",xrn,xrn,caddr(e1)); 1018 printf("\taddu %s,%s,%d\n",xrn,xrn,caddr(e1));
1019 printf("\tsw %s,0(%s)\n",xrn,crn); 1019 printf("\tsw %s,0(%s)\n",xrn,crn);
1020 i=creg;creg=nreg;nreg=i; 1020 i=creg;creg=nreg;nreg=i;
1021 free_register(nreg); 1021 free_register(nreg);
1022 free_register(dreg); 1022 free_register(dreg);
1023 regv[creg]=1; ireg=creg; 1023 regv[creg]=1; ireg=creg;
1024 } 1024 }
1025 1025
1026 1026
1027 void 1027 void
1028 code_cpredec(int e1,int e2,int reg) { 1028 code_cpredec(int e1,int e2,int reg,int sign) {
1029 char *xrn,*crn,*nrn; 1029 char *xrn,*crn,*nrn;
1030 int i,nreg,dreg; 1030 int i,nreg,dreg;
1031 if (car(e2)==REGISTER) { 1031 if (car(e2)==REGISTER) {
1032 crn=register_name(reg); 1032 crn=register_name(reg);
1033 xrn=register_name(cadr(e2)); 1033 xrn=register_name(cadr(e2));
1034 printf("\taddu %s,%s,%d\n",xrn,xrn,caddr(e1)); 1034 printf("\taddu %s,%s,%d\n",xrn,xrn,caddr(e1));
1035 printf("\tlb %s,%d(%s)\n",crn,caddr(e1),xrn); 1035 printf("\t%s %s,%d(%s)\n",sign?"lbu":"lb",crn,caddr(e1),xrn);
1036 regv[reg]=1; 1036 regv[reg]=1;
1037 return; 1037 return;
1038 } 1038 }
1039 g_expr(e2); 1039 g_expr(e2);
1040 crn = register_name(creg); 1040 crn = register_name(creg);
1042 xrn = register_name(dreg); 1042 xrn = register_name(dreg);
1043 nreg=get_register(); if (!nreg) error(-1); 1043 nreg=get_register(); if (!nreg) error(-1);
1044 nrn = register_name(nreg); 1044 nrn = register_name(nreg);
1045 printf("\tlw %s,0(%s)\n",xrn,crn); 1045 printf("\tlw %s,0(%s)\n",xrn,crn);
1046 printf("\taddu %s,%s,%d\n",xrn,xrn,caddr(e1)); 1046 printf("\taddu %s,%s,%d\n",xrn,xrn,caddr(e1));
1047 printf("\tlb %s,%d(%s)\n",nrn,caddr(e1),xrn); 1047 printf("\t%s %s,%d(%s)\n",sign?"lbu":"lb",nrn,caddr(e1),xrn);
1048 printf("\tsw %s,0(%s)\n",xrn,crn); 1048 printf("\tsw %s,0(%s)\n",xrn,crn);
1049 i=creg;creg=nreg;nreg=i; 1049 i=creg;creg=nreg;nreg=i;
1050 free_register(nreg); 1050 free_register(nreg);
1051 free_register(dreg); 1051 free_register(dreg);
1052 regv[creg]=1; ireg=creg; 1052 regv[creg]=1; ireg=creg;
1117 } 1117 }
1118 1118
1119 void 1119 void
1120 code_cmp_crgvar(int e1) { 1120 code_cmp_crgvar(int e1) {
1121 if (cmpreg==-1) cmpreg = get_register(); 1121 if (cmpreg==-1) cmpreg = get_register();
1122 code_crgvar(cadr(e1),cmpreg); 1122 code_crgvar(cadr(e1),cmpreg,0);
1123 regv[cmpreg]=1; 1123 regv[cmpreg]=1;
1124 } 1124 }
1125 1125
1126 1126
1127 void 1127 void
1128 code_cmp_crlvar(int e2) { 1128 code_cmp_crlvar(int e2) {
1129 if (cmpreg==-1) cmpreg = get_register(); 1129 if (cmpreg==-1) cmpreg = get_register();
1130 code_crlvar(e2,cmpreg); 1130 code_crlvar(e2,cmpreg,0);
1131 regv[cmpreg]=1; 1131 regv[cmpreg]=1;
1132 } 1132 }
1133 1133
1134 1134
1135 void 1135 void
1629 creg = dreg; 1629 creg = dreg;
1630 return DOUBLE; 1630 return DOUBLE;
1631 case CRINDIRECT: 1631 case CRINDIRECT:
1632 printf("\tlb %s,%d(%s)\n",crn,offset,crn); 1632 printf("\tlb %s,%d(%s)\n",crn,offset,crn);
1633 return CHAR; 1633 return CHAR;
1634 case CURINDIRECT:
1635 printf("\tlbu %s,%d(%s)\n",crn,offset,crn);
1636 return UCHAR;
1634 case RINDIRECT: 1637 case RINDIRECT:
1635 printf("\tlw %s,%d(%s)\n",crn,offset,crn); 1638 printf("\tlw %s,%d(%s)\n",crn,offset,crn);
1636 return INT; 1639 return INT;
1637 } 1640 }
1638 error(-1); return INT; 1641 error(-1); return INT;
1694 regv[creg]=1; 1697 regv[creg]=1;
1695 } 1698 }
1696 1699
1697 1700
1698 void 1701 void
1699 code_assop(int op,int byte) { 1702 code_assop(int op,int byte,int sign) {
1700 char *xrn,*crn,*drn; 1703 char *xrn,*crn,*drn;
1701 int xreg; 1704 int xreg;
1702 int edx = get_register(); if(!edx) error(-1); 1705 int edx = get_register(); if(!edx) error(-1);
1703 xrn = register_name(xreg = emit_pop(0)); /* pop e3 value */ 1706 xrn = register_name(xreg = emit_pop(0)); /* pop e3 value */
1704 regv[xreg]=regs[xreg]=1; 1707 regv[xreg]=regs[xreg]=1;
1705 printf("# assop\n\tmr %s,%s\n",register_name(edx),register_name(creg)); 1708 printf("# assop\n\tmr %s,%s\n",register_name(edx),register_name(creg));
1706 regv[edx]=1; 1709 regv[edx]=1;
1707 ld_indexx(byte,0,edx); 1710 ld_indexx(byte,0,edx,sign);
1708 tosop(op,xreg); 1711 tosop(op,xreg);
1709 crn = register_name(creg); 1712 crn = register_name(creg);
1710 drn = register_name(edx); 1713 drn = register_name(edx);
1711 if (byte) { 1714 if (byte) {
1712 printf("\tsb %s,0(%s)\n",crn,drn); 1715 printf("\tsb %s,0(%s)\n",crn,drn);
1803 char *rrn = register_name(reg); 1806 char *rrn = register_name(reg);
1804 printf("\t%s %s,%s,%s\n",op,crn,rrn,crn); 1807 printf("\t%s %s,%s,%s\n",op,crn,rrn,crn);
1805 } 1808 }
1806 1809
1807 void 1810 void
1808 ld_indexx(int byte, int n, int xreg) 1811 ld_indexx(int byte, int n, int xreg,int sign)
1809 { 1812 {
1810 char *crn = register_name(creg); 1813 char *crn = register_name(creg);
1811 if (byte) { 1814 if (byte) {
1812 printf("\tlb %s,%d(%s)\n",register_name(creg),n, 1815 printf("\t%s %s,%d(%s)\n",sign?"lbu":"lb",crn,n,
1813 register_name(xreg)); 1816 register_name(xreg));
1814 printf("\textsb %s,%s\n",crn,crn);
1815 } else 1817 } else
1816 printf("\tlw %s,%d(%s)\n",register_name(creg),n, 1818 printf("\tlw %s,%d(%s)\n",crn,n,
1817 register_name(xreg)); 1819 register_name(xreg));
1818 } 1820 }
1819 1821
1820 int 1822 int
1821 code_csvalue() 1823 code_csvalue()