Alpha MIPS HPPA PPC SPARC IA-64 Return address register any r31 r2,r31 link r31 Типовой branch по флагам:
if (Logical_Function(Flags)) { Jump } |
Логическая функция может быть просто значением флага, или его инверсией или функцией от нескольких флагов Пример условий и комбинаций флагов для x86: -------------------------------------------------------------------------- Abbr Unsigned Signed Condition Description -------------------------------------------------------------------------- A/NBE > (CF==0) and (ZF==0) Above/Not Below Equal AE/NB/NC > = CF==0 Above Equal/Not Below/Not Carry B/NAE/C < CF==1 Below/Not Above Equal/Carry BE/NA < = (CF==1) or (ZF==1) Below Equal/Not Above E/Z == == ZF==1 Equal/Zero NE/NZ != != ZF==0 Not Equal/Not Zero G/NLE > (SF==OF) and (ZF==0) Greater/Not Less Equal GE/NL >= (SF==OF) Greater Equal/Not Less L/NGE < SF!=OF Less/Not Greater Equal LE/NG <= (SF!=OF) or (ZF==1) Less Equal/Not Greater NO OF==0 Not Overflow O OF==1 Overflow NP/PO PF==0 No Parity/Parity Odd P/PE PF==1 Parity/Parity even NS SF==0 No Sign S SF==1 Sign --------------------------------------------------------------------------- |
Мнемоники переходов по флагам и их комбинациям -------------------------------------------------------------------------------------- Unsigned Signed x86 Alpha PPC* MIPS SPARC 68K HPPA IA64 ARM -------------------------------------------------------------------------------------- > JA --- BGT --- BGU BHI --- --- BHI JNBE BPGU > = JAE --- BGE --- BCC BCC --- --- BCC JNB BNL BPCC BLO JNC < JB --- BLT --- BCS BCS --- --- BCS JNAE BPCS BLO BHS JC < = JBE --- BLE --- BLEU BLS --- --- BLS JNA BNG BPLEU == == JE --- BEQ --- BE BEQ --- --- BEQ JZ BPE != != JNE --- BNE --- BNE BNE --- --- BNE JNZ BPNE > JG --- BGT --- BG BGT --- --- BGT JNLE BPG >= JGE --- BGE --- BGE BGE --- --- BGE JNL BNL BPGE < JL --- BLT --- BL BLT --- --- BLT JNGE BPL <= JLE --- BLE --- BLE BLE --- --- BLE JNG BNG BPLE S == 0 JNS --- --- --- BNEG BPL --- --- BPL BPNEG S == 1 JS --- --- --- BPOS BMI --- --- BMI BPPOS O == 0 JNO --- BNS --- BVC BVC --- --- BVC BPVC O == 1 JO --- BSO --- BVS BVS --- --- BVS BPVS P == Even JP --- --- --- --- --- --- --- --- JPE P == Odd JNP --- --- --- --- --- --- --- --- JPO -------------------------------------------------------------------------------------- Замечания: PPC: Реально есть варианты команды условного перехода: BC,BCA,BCL,BCLA В CRi есть биты: LT,GT,EQ,SO. По каждому можно перейти если он установлен, либо снят. А значение зависит от того была ли предидущая операция signed или unsigned. Например для сравнений надо использовать следущие мнемоники Signed compare: CMP, CMPI Unsigned compare: CMPL, CMPLI (Logical compare) SPARC: Форма Bxx - это обычный условный переход BPxx - переход с предсказанием (branch with prediction) 68K: Есть еще серия команд DBcc reg,label которые имеют теже коды условий, но используются для циклов таким образом изменяя значения регистра
|
Branch по сравнению с нулем
if (Specified_Compare(source, 0)) { Jump } |
Переход по сравнению регистра с 0 -------------------------------------------------------------------------------------- Unsigned Signed x86 Alpha PPC MIPS SPARC 68K HPPA IA64 ARM -------------------------------------------------------------------------------------- > -- (*) > = -- (*) < -- (*) < = -- (*) == == -- BEQ BRZ (*) != != -- BNE BRNZ (*) > -- BGT BGTZ BRGZ (*) BGTZL >= -- BGE BGEZ BRGEZ (*) BGEZAL BGEZALL BGEZL < -- BLT BLTZ BRLZ (*) BLTZAL BLTZALL BLTZL <= -- BLE BLEZ BRLEZ (*) BLEZL -------------------------------------------------------------------------------------- Замечния: MIPS: L - Likely (execute delay slot only if branch is taken) AL - and link (i.e. it's not jump, but call) HPPA: Данная операция может быть сделана с помощью команды Compare with Immediate and Branch (CMPIBcc), с использованием 0 в качестве immediate операнда. (Смотри коды условий ниже в разделе - переход по сравнению двух регистров) |
Branch по сранению регистров
if (Specified_Compare(source1, source2)) { Jump } |
Переход по сравнению двух регистров -------------------------------------------------------------------------------------- Unsigned Signed x86 Alpha PPC MIPS SPARC 68K HPPA IA64 ARM -------------------------------------------------------------------------------------- > --- CMPB>> > = --- CMPB>>= < --- CMPB<< < = --- CMPB<<= == == --- BEQ CMPB= BEQL != != --- BNE CMPB<> BNEL > --- CMPB> >= --- CMPB>= < --- CMPB< <= --- CMPB<= Overflow --- CMPBSV Non Overflow --- CMPBNSV Even --- CMPBEV Odd --- CMPBOD -------------------------------------------------------------------------------------- Замечания: HPPA: Реально еще есть команды типа CMPIB Compare Immediate and Branch ADDB Add and Branch ADDIB Add Immediate and Branch |
Branch по младшему биту регистра
if (Low_Bit(source) == Desired_Value) { Jump } |
Branch по биту регистра -------------------------------------------------------------------------------------- x86 Alpha PPC MIPS SPARC 68K HPPA IA64 ARM -------------------------------------------------------------------------------------- ==0 -- BLBC BB>= ==1 -- BLBS BB< -------------------------------------------------------------------------------------- Замечания: Alpha: только младший бит HPPA: любой бит регистра |
TODO: Специальный случай с PowerPC Condition register PPC mtcrf mask, rS rS and mask -> CR mfcr rD CR -> rD mcrxr crfD XER[3:0] -> CRi mcrf crfD, crfS CRi -> CRj crand crD, crA, crB cror crxor crnand crnor creqv crandc crorc
Set_Flags(source1 - source2) |
cmp rs,reg_imm subcc rs,reg_imm,%g0 ! subcc - subtract and set flag, ! r0 - всегда равен нулю |
Set_Flags(source1 AND source2) |
tst reg1,reg2 orcc reg1,reg2,%g0 |
if (CF == 1) { Jump } |
if (CF == 0) { Jump } |
if (ZF == 1) { Jump } |
if (ZF == 0) { Jump } |