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 */