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
}
|