void MaxSearch<Item,Value,Compare>::Do(const Item& current) { Value val = Func(current); if ( !Cond(current) ) return; if (l){ if (better(val,opt)){ opt = val; optelem = current; } } else { l = true; opt = val; optelem = current; } }
/* * Core runtime engine. Checks type of statement and executes * appropriate function. */ void interpret_post_turing(int line, int code[1024][2]) { int instruction; display_tape(20); for(instruction = 0; instruction < line; instruction++) { switch(code[instruction][0]) { case 0: Right(); break; case 1: Left(); break; case 2: Print((char)code[instruction][1]); break; default: /* It's a label reference */ Cond((char)(code[instruction][0] - 2), code[instruction][1], &instruction); break; } display_tape(20); } }
mad_disasm_control DisasmControl( mad_disasm_data *dd, const mad_registers *mr ) { char xor; unsigned long val; xor = 0; switch( dd->ins.type ) { case DI_X86_int: return( MDC_SYSCALL | MDC_TAKEN ); case DI_X86_call: case DI_X86_call2: case DI_X86_call3: case DI_X86_call4: return( MDC_CALL | MDC_TAKEN ); case DI_X86_jmp: case DI_X86_jmp1: return( MDC_JUMP + Adjustment( dd ) ); case DI_X86_iret: case DI_X86_iretd: return( MDC_SYSRET | MDC_TAKEN ); case DI_X86_ret: case DI_X86_ret2: case DI_X86_retf: case DI_X86_retf2: return( MDC_RET | MDC_TAKEN ); case DI_X86_jmp2: case DI_X86_jmp3: case DI_X86_jmp4: return( MDC_JUMP | MDC_TAKEN ); case DI_X86_bound: return( MDC_OPER | MDC_TAKEN_NOT ); /* not supported yet */ case DI_X86_jno: case DI_X86_jno2: xor = 1; case DI_X86_jo: case DI_X86_jo2: return Cond( dd, ( ( mr->x86.cpu.efl & FLG_O ) != 0 ) ^ xor ); case DI_X86_jae: case DI_X86_jae2: xor = 1; case DI_X86_jb: case DI_X86_jb2: return Cond( dd, ( ( mr->x86.cpu.efl & FLG_C ) != 0 ) ^ xor ); case DI_X86_jne: case DI_X86_jne2: xor = 1; case DI_X86_je: case DI_X86_je2: return Cond( dd, ( ( mr->x86.cpu.efl & FLG_Z ) != 0 ) ^ xor ); case DI_X86_ja: case DI_X86_ja2: xor = 1; case DI_X86_jbe: case DI_X86_jbe2: return Cond( dd, ( ( mr->x86.cpu.efl & ( FLG_C | FLG_Z ) ) != 0 ) ^ xor ); case DI_X86_jns: case DI_X86_jns2: xor = 1; case DI_X86_js: case DI_X86_js2: return Cond( dd, ( ( mr->x86.cpu.efl & FLG_S ) != 0 ) ^ xor ); case DI_X86_jpo: case DI_X86_jpo2: xor = 1; case DI_X86_jp: case DI_X86_jp2: return Cond( dd, ( ( mr->x86.cpu.efl & FLG_P ) != 0 ) ^ xor ); case DI_X86_jge: case DI_X86_jge2: xor = 1; case DI_X86_jl: case DI_X86_jl2: return Cond( dd, ( ( mr->x86.cpu.efl & FLG_S ) != 0 ) ^ ( ( mr->x86.cpu.efl & FLG_O ) !=0 ) ^ xor ); case DI_X86_jg: case DI_X86_jg2: xor = 1; case DI_X86_jle: case DI_X86_jle2: return Cond( dd, ( ( ( ( mr->x86.cpu.efl & FLG_S ) != 0 ) ^ ( ( mr->x86.cpu.efl & FLG_O ) != 0 ) ) | ( ( mr->x86.cpu.efl & FLG_Z ) != 0 ) ) ^ xor ); case DI_X86_into: return( ( mr->x86.cpu.efl & FLG_O ) != 0 ? ( MDC_SYSCALL|MDC_CONDITIONAL|MDC_TAKEN ) : ( MDC_SYSCALL|MDC_CONDITIONAL|MDC_TAKEN_NOT ) ); case DI_X86_loopnz: val= mr->x86.cpu.ecx; if( !( dd->ins.flags.u.x86 & DIF_X86_OPND_LONG ) ) val &= 0xffff; return Cond( dd, ( mr->x86.cpu.efl & FLG_Z ) == 0 && val != 1 ); case DI_X86_loopz: val= mr->x86.cpu.ecx; if( !( dd->ins.flags.u.x86 & DIF_X86_OPND_LONG ) ) val &= 0xffff; return Cond( dd, ( mr->x86.cpu.efl & FLG_Z ) != 0 && val != 1 ); case DI_X86_loop: val= mr->x86.cpu.ecx; if( !( dd->ins.flags.u.x86 & DIF_X86_OPND_LONG ) ) val &= 0xffff; return Cond( dd, val != 1 ); case DI_X86_jcxz: case DI_X86_jecxz: val= mr->x86.cpu.ecx; if( !( dd->ins.flags.u.x86 & DIF_X86_OPND_LONG ) ) val &= 0xffff; return Cond( dd, val == 0 ); default: break; } return( MDC_OPER | MDC_TAKEN_NOT ); }