Mercurial > hg > CbC > old > device
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() |