int find_option (st_parameter_common *cmp, const char *s1, int s1_len, const st_option * opts, const char *error_message) { for (; opts->name; opts++) if (compare0 (s1, s1_len, opts->name)) return opts->value; generate_error (cmp, ERROR_BAD_OPTION, error_message); return -1; }
void emitdag(sNode_t p) { a = p->kids[0]; b = p->kids[1]; r=p; switch (p->op) { case BANDU: binary("ANDW"); break; case BORU: binary("ORW"); break; case BXORU: binary("XORW"); break; case ADDD: case ADDF: binary("ADDF"); break; case ADDI: case ADDP: case ADDU: if (optimizelevel>=2 && strcmp(a->x.name,p->x.name)==0 && p->x.adrmode=='D' && strcmp(b->x.name,"1")==0) print("\tINCW_%c(%s)\n" ,(p->x.name[0]=='_' || p->x.name[0]=='L')? 'D':'Z' ,p->x.name); else binary("ADDW"); break; case SUBD: case SUBF: binary("SUBF"); break; case SUBI: case SUBP: case SUBU: if (optimizelevel>=2 && strcmp(a->x.name,p->x.name)==0 && p->x.adrmode=='D' && strcmp(b->x.name,"1")==0) { print("\tDECW_%c(%s)\n" ,(p->x.name[0]=='_' || p->x.name[0]=='L')? 'D':'Z' ,p->x.name); } else binary("SUBW"); break; case MULD: case MULF: binary("MULF"); break; case MULI: binary("MULI"); break; case MULU: binary("MULU"); break; case DIVD: case DIVF: binary("DIVF"); break; case DIVI: binary("DIVI"); break; case DIVU: binary("DIVU"); break; case MODI: binary("MODI"); break; case MODU: binary("MODU"); break; case RSHU: case RSHI: binary("RSHW"); break; case LSHI: case LSHU: if (optimizelevel>=2 && strcmp(b->x.name,"1")==0) { unary("LSH1W"); } else binary("LSHW"); break; case INDIRC: case INDIRS: if (!p->x.optimized) print("\tINDIRB_%c%c(%s,%s)\n" ,adrmode(a) ,r->x.adrmode ,a->x.name ,r->x.name); break; case INDIRI: case INDIRP: if (!p->x.optimized) print("\tINDIRW_%c%c(%s,%s)\n" ,adrmode(a) ,r->x.adrmode ,a->x.name ,r->x.name); break; case INDIRD: case INDIRF: if (!p->x.optimized) unary("INDIRF"); break; case INDIRB: if (!p->x.optimized) unary("INDIRS"); break; case BCOMU: unary("COMW" ); break; case NEGD: case NEGF: unary("NEGF" ); break; case NEGI: unary("NEGI" ); break; case CVCI: case CVSI: unary("CSBW"); break; case CVCU: case CVSU: unary("CZBW"); break; case CVUC: case CVUS: case CVIC: case CVIS: if (optimizelevel<=1 || strcmp(a->x.name,p->x.name)!=0) unary("CWB"); break; case CVPU: case CVUP: case CVIU: case CVUI: if (optimizelevel<=1 || strcmp(a->x.name,p->x.name)!=0) unary("MOVW"); break; case CVID: unary("CIF" ); break; case CVDF: case CVFD: if (optimizelevel<=1 || strcmp(a->x.name,p->x.name)!=0) unary("MOVF"); break; case CVDI: unary("CFI" ); break; case RETD: case RETF: if (optimizelevel>=2 && omit_frame && nbregs==0) print("\tRETF_%c(%s)\n" ,a->x.adrmode ,a->x.name); else print("\tLEAVEF_%c(%s)\n" ,a->x.adrmode ,a->x.name); break; case RETI: if (optimizelevel>=2 && omit_frame && nbregs==0) print("\tRETW_%c(%s)\n" ,a->x.adrmode ,a->x.name); else print("\tLEAVEW_%c(%s)\n" ,a->x.adrmode ,a->x.name); break; case RETV: if (optimizelevel>=2 && omit_frame && nbregs==0) print("\tRET\n"); else print("\tLEAVE\n"); break; case ADDRGP: case ADDRFP: case ADDRLP: if (optimizelevel==0) print("\tADDR_%c%c(%s,%s)\n" ,p->syms[0]->x.adrmode ,p->x.adrmode ,p->syms[0]->x.name ,p->x.name); break; case CNSTC: case CNSTS: case CNSTI: case CNSTU: case CNSTP: if (optimizelevel==0) print("\tCNST_%c%c(%s,%s)\n" ,p->syms[0]->x.adrmode ,p->x.adrmode ,p->syms[0]->name ,p->x.name); break; case JUMPV: print("\tJUMP_%c(%s)\n" ,a->x.adrmode, a->x.name); break; case ASGNB: print("\tASGNS_%c%c(%s,%s,%s)\n" ,b->x.adrmode ,a->x.adrmode ,b->x.name ,a->x.name ,p->syms[0]->x.name); break; case ASGNC: case ASGNS: if (!p->x.optimized) print("\tASGNB_%c%c(%s,%s)\n" ,b->x.adrmode ,adrmode(a) ,b->x.name ,a->x.name); break; case ASGND: case ASGNF: if (!p->x.optimized) print("\tASGNF_%c%c(%s,%s)\n" ,b->x.adrmode ,adrmode(a) ,b->x.name ,a->x.name); break; case ASGNI: case ASGNP: if (!p->x.optimized) print("\tASGNW_%c%c(%s,%s)\n" ,b->x.adrmode ,adrmode(a) ,b->x.name ,a->x.name); break; case ARGB: print("\tARGS_%c(%s,(sp),%d,%s)\n" ,a->x.adrmode ,a->x.name ,p->x.argoffset ,p->syms[0]->x.name); break; case ARGD: case ARGF: if (!p->x.optimized) print("\tARGF_%c(%s,(sp),%d)\n" ,a->x.adrmode ,a->x.name ,p->x.argoffset); break; case ARGI: case ARGP: if (!p->x.optimized) print("\tARGW_%c(%s,(sp),%d)\n" ,a->x.adrmode ,a->x.name ,p->x.argoffset); break; case CALLB: print("\tMOVW_%cD(%s,op1)\n" ,b->x.adrmode ,b->x.name); case CALLV: print("\tCALLV_%c(%s,%d)\n" ,a->x.adrmode ,a->x.name ,p->x.argoffset); break; case CALLD: case CALLF: print("\tCALLF_%c%c(%s,%d,%s)\n" ,a->x.adrmode ,p->x.adrmode ,a->x.name ,p->x.argoffset ,p->x.name); break; case CALLI: print("\tCALLW_%c%c(%s,%d,%s)\n" ,a->x.adrmode ,p->x.adrmode ,a->x.name ,p->x.argoffset ,p->x.name); break; case EQD: case EQF: compare("EQF" ); break; case EQI: if (optimizelevel>=2 && strcmp(b->x.name,"0")==0) compare0("EQ0W"); else compare("EQW" ); break; case GED: case GEF: compare("GEF" ); break; case GEI: compare("GEI" ); break; case GEU: compare("GEU" ); break; case GTD: case GTF: compare("GTF" ); break; case GTI: compare("GTI" ); break; case GTU: compare("GTU" ); break; case LED: case LEF: compare("LEF" ); break; case LEI: compare("LEI" ); break; case LEU: compare("LEU" ); break; case LTD: case LTF: compare("LTF" ); break; case LTI: compare("LTI" ); break; case LTU: compare("LTU" ); break; case NED: case NEF: compare("NEF" ); break; case NEI: if (optimizelevel>=2 && strcmp(b->x.name,"0")==0) compare0("NE0W"); else compare("NEW" ); break; case LABELV: print("%s\n", p->syms[0]->x.name); break; default: assert(0); } }
//The comparison function for SJF. int compare1(const void * a, const void * b) { int remtm = ( ((job_t*)a)->running_time - ((job_t*)b)->running_time ); return remtm == 0 ? compare0(a, b) : remtm; }
//The comparison function for PRI. int compare3(const void * a, const void * b) { int pridiff = ( ((job_t*)a)->priority - ((job_t*)b)->priority ); return pridiff == 0 ? compare0(a, b) : pridiff; }