Input : rs1, rs2 (32비트)
output : branch_flag (1비트)
논리식 : rs1==rs2
구현 과정
result=rs1-rs2 계산
result의 포함된 비트를 서로 모두 OR 연산한다.
만약 result=0 이면 모든 비트를 or했을때 0이 도출될 것임.
만약 result =1 이면 모든 비트를 or 했을 때 1이 도출될 것임.
이후 result에 부정을 취해 1이면 True, 0이면 False
branch_flag=~(|(rs1-rs2);
논리식 : rs1!=rs2
구현 과정
BEQ 과정과 동일하게 계산 후 Branch_flag에 not 연산을 추가한다.
1. result=rs1-rs2 계산
2. result의 포함된 비트를 서로 모두 OR 연산한다.
3. 만약 result=0 이면 모든 비트를 or했을때 0이 도출될 것임.
4. 만약 result =1 이면 모든 비트를 or 했을 때 1이 도출될 것임.
branch_flag=(|(rs1-rs2);
논리식 : rs1 < rs2
구현 과정
Signed 연산시 Overflow 발생 조건
1. rs1 : 양(MSB=0), rs2 : 양(MSB=0)
이때 result의 MSB가 1이면 overflow 발생함.
2. rs1 : 음(MSB=1), rs2 : 음(MSB=1)
이때 result의 MSB가 0이면 overflow 발생함.
overflow = (rs1[31]==rs2[31]) && (result[31]!=rs1[31])
3. 따라서 branch_flag는 다음과 같이 구분할 수 있다.
branch_flag = result[31]^overflow
위 BLT 계산 결과에 부정을 취한 값.
branch_flag = ~(result[31]^overflow)
부호를 신경쓰지 않으니 그냥 result의 MSB로 branch_flag 결정
branch_flag = result[31]BLTU에 부정을 취한다.
branch_flag = ~result[31]