Mercurial > hg > CbC > old > device
comparison mc-code-powerpc.c @ 302:bea7ab2fb218 switch-table
switch table jump finished.
author | kono |
---|---|
date | Mon, 07 Jun 2004 17:55:37 +0900 (2004-06-07) |
parents | 86255dd7f148 |
children | 9df8aa0497ea |
comparison
equal
deleted
inserted
replaced
301:60dba3ef1f69 | 302:bea7ab2fb218 |
---|---|
4781 | 4781 |
4782 int | 4782 int |
4783 code_table_jump_p() { return 1; } | 4783 code_table_jump_p() { return 1; } |
4784 | 4784 |
4785 void | 4785 void |
4786 code_table_jump(int l,int csvalue,int delta,int max,int min) | 4786 code_table_jump(int l,int csvalue,int delta,int max,int min,int dlabel) |
4787 { | 4787 { |
4788 int t,s,c0; | 4788 int t,s,u=-1; |
4789 char *crn = register_name(csvalue); | 4789 char *crn = register_name(csvalue); // can be t,s,u |
4790 char *trn = register_name(t=get_register()); | 4790 char *trn = register_name(t=get_register()); |
4791 char *srn = register_name(s=get_register()); | 4791 char *srn = register_name(s=get_register()); |
4792 char *urn; | |
4792 | 4793 |
4793 inc_cmpflag(); | 4794 inc_cmpflag(); |
4794 if (min>32767||min<-32765) { | 4795 if (min>32767||min<-32765) { |
4795 code_const(min,t); | 4796 if (t==csvalue) { |
4796 printf("\tsub\t%s,%s,%s\n",trn,crn,trn); | 4797 code_const(min,s); |
4798 printf("\tsub\t%s,%s,%s\n",trn,crn,srn); | |
4799 } else { | |
4800 code_const(min,t); | |
4801 printf("\tsub\t%s,%s,%s\n",trn,crn,trn); | |
4802 } | |
4797 } else { | 4803 } else { |
4798 printf("\taddi\t%s,%s,lo16(%d)\n",trn,crn,-min); | 4804 printf("\taddi\t%s,%s,lo16(%d)\n",trn,crn,-min); |
4799 } | 4805 } |
4800 printf("\tcmpwi cr%d,%s,0\n",c0=cmpflag,trn); | 4806 printf("\tcmplwi cr%d,%s,%d\n",cmpflag,trn,max-min); |
4807 printf("\tbgt-\tcr%d,L_%d\n",cmpflag,dlabel); | |
4801 inc_cmpflag(); | 4808 inc_cmpflag(); |
4802 printf("\tcmpwi cr%d,%s,%d\n",cmpflag,trn,max-min); | |
4803 printf("\tblt\tcr%d,1f\n",c0); | |
4804 printf("\tbgt\tcr%d,1f\n",cmpflag); | |
4805 switch(delta) { | 4809 switch(delta) { |
4806 case 1: printf("\tslwi %s,%s,2\n",trn,trn); break; | 4810 case 1: printf("\tslwi %s,%s,2\n",trn,trn); break; |
4807 case 2: printf("\tslwi %s,%s,1\n",trn,trn); | 4811 case 2: |
4808 case 4: break; | 4812 printf("\tli %s,1\n",srn); |
4813 printf("\tand %s,%s,%s\n",srn,srn,trn); | |
4814 printf("\tcmplwi cr%d,%s,0\n",cmpflag,srn); | |
4815 printf("\tbne\tcr%d,L_%d\n",cmpflag,dlabel); | |
4816 printf("\tslwi %s,%s,1\n",trn,trn); | |
4817 break; | |
4818 case 4: | |
4819 printf("\tli %s,3\n",srn); | |
4820 printf("\tand %s,%s,%s\n",srn,srn,trn); | |
4821 printf("\tcmplwi cr%d,%s,0\n",cmpflag,srn); | |
4822 printf("\tbne\tcr%d,L_%d\n",cmpflag,dlabel); | |
4823 break; | |
4809 default: | 4824 default: |
4810 srn = register_name(s=get_register()); | 4825 urn = register_name(u=get_register()); |
4811 if (delta%4==0) { | 4826 printf("\tli %s,%d\n",srn,delta); |
4812 printf("\tli %s,%d\n",srn,delta/4); | 4827 printf("\tdivwu %s,%s,%s\n",urn,trn,srn); |
4813 printf("\tdivwu %s,%s,%s\n",trn,trn,srn); | 4828 printf("\tmullw %s,%s,%s\n",srn,urn,srn); |
4814 } else { | 4829 printf("\tsubf %s,%s,%s\n",srn,trn,srn); |
4815 printf("\tli %s,%d\n",srn,delta); | 4830 printf("\tcmplwi cr%d,%s,0\n",cmpflag,srn); |
4816 printf("\tdivwu %s,%s,%s\n",trn,trn,srn); | 4831 printf("\tbne\tcr%d,L_%d\n",cmpflag,dlabel); |
4817 printf("\tslwi %s,%s,2\n",trn,trn); | 4832 printf("\tslwi %s,%s,2\n",trn,urn); |
4818 } | |
4819 } | 4833 } |
4820 printf("\taddis %s,r31,ha16(L_%d-L_%d)\n", | 4834 printf("\taddis %s,r31,ha16(L_%d-L_%d)\n", |
4821 srn,l,code_base); | 4835 srn,l,code_base); |
4822 printf("\tla %s,lo16(L_%d-L_%d)(%s)\n", | 4836 printf("\tla %s,lo16(L_%d-L_%d)(%s)\n", |
4823 srn,l,code_base,srn); | 4837 srn,l,code_base,srn); |
4827 printf("\tmtctr r0\n"); | 4841 printf("\tmtctr r0\n"); |
4828 printf("\tbctr\n"); | 4842 printf("\tbctr\n"); |
4829 | 4843 |
4830 free_register(s); | 4844 free_register(s); |
4831 free_register(t); | 4845 free_register(t); |
4846 if (u!=-1) free_register(u); | |
4832 } | 4847 } |
4833 | 4848 |
4834 void | 4849 void |
4835 code_table_open(int l) | 4850 code_table_open(int l) |
4836 { | 4851 { |
4845 } | 4860 } |
4846 | 4861 |
4847 void | 4862 void |
4848 code_table_close() | 4863 code_table_close() |
4849 { | 4864 { |
4850 printf("1:\n"); | |
4851 } | 4865 } |
4852 | 4866 |
4853 #endif | 4867 #endif |
4854 | 4868 |
4855 /* end */ | 4869 /* end */ |