📄 integerunit.cpp
字号:
if(src < 0 && (src << (32 - n)) != 0) ca = true; else ca = false; } lt = ((SInt32) result32 < 0); gt = ((SInt32) result32 > 0); eq = ((UInt32) result32 == 0); latency = 1; break; } case ID_SRAWI: { int b = operation.extra.shift.sh & 31; result32 = (SInt32) operands.data[0] >> b; ca = (b != 0) && ((SInt32) result32 < 0) && ((operands.data[0] << (32 - operation.extra.shift.sh)) != 0); latency = 1; } break; case ID_SRAWID: { int b = operation.extra.shift.sh & 31; result32 = (SInt32) operands.data[0] >> b; ca = (b != 0) && ((SInt32) result32 < 0) && ((operands.data[0] << (32 - operation.extra.shift.sh)) != 0); lt = ((SInt32) result32 < 0); gt = ((SInt32) result32 > 0); eq = ((UInt32) result32 == 0); latency = 1; } break; case ID_CNTLZW: { UInt32 n = 0; UInt32 m = 1 << 31; while(n < 32) { if(operands.data[0] & m) break; m >>= 1; n++; } result32 = n; } latency = 1; break; case ID_CNTLZWD: { UInt32 n = 0; UInt32 m = 1 << 31; while(n < 32) { if(operands.data[0] & m) break; m >>= 1; n++; } result32 = n; } lt = ((SInt32) result32 < 0); gt = ((SInt32) result32 > 0); eq = ((UInt32) result32 == 0); latency = 1; break; case ID_AND: result32 = operands.data[0] & operands.data[1]; latency = 1; break; case ID_ANDD: result32 = operands.data[0] & operands.data[1]; lt = ((SInt32) result32 < 0); gt = ((SInt32) result32 > 0); eq = ((UInt32) result32 == 0); latency = 1; break; case ID_ANDC: result32 = operands.data[0] & ~(operands.data[1]); latency = 1; break; case ID_ANDCD: result32 = operands.data[0] & ~(operands.data[1]); lt = ((SInt32) result32 < 0); gt = ((SInt32) result32 > 0); eq = ((UInt32) result32 == 0); latency = 1; break; case ID_MULHW: result32 = (UInt32)(((SInt64)(SInt32) operands.data[0] * (SInt64)(SInt32) operands.data[1]) >> 32); latency = GetMulLatency(operands.data[0], operands.data[1]); break; case ID_MULHWD: result64 = (UInt64)(((SInt64)(SInt32) operands.data[0] * (SInt64)(SInt32) operands.data[1]) >> 32); lt = ((SInt32) result64 < 0); gt = ((SInt32) result64 > 0); eq = ((UInt32) result64 == 0); result32 = (UInt32) result64; latency = GetMulLatency(operands.data[0], operands.data[1]); break; case ID_NOR: result32 = ~(operands.data[0] | operands.data[1]); latency = 1; break; case ID_NORD: result32 = ~(operands.data[0] | operands.data[1]); lt = ((SInt32) result32 < 0); gt = ((SInt32) result32 > 0); eq = ((UInt32) result32 == 0); latency = 1; break; case ID_SUBF: result32 = operands.data[1] - operands.data[0]; latency = 1; break; case ID_SUBFD: result32 = operands.data[1] - operands.data[0]; lt = ((SInt32) result32 < 0); gt = ((SInt32) result32 > 0); eq = ((UInt32) result32 == 0); latency = 1; break; case ID_SUBFO: result32 = operands.data[1] - operands.data[0]; ov = Underflow(operands.data[1], operands.data[0]); latency = 1; break; case ID_SUBFOD: result32 = operands.data[1] - operands.data[0]; ov = Underflow(operands.data[1], operands.data[0]); lt = ((SInt32) result32 < 0); gt = ((SInt32) result32 > 0); eq = ((UInt32) result32 == 0); latency = 1; break; case ID_NEG: if(operands.data[0] != 0x80000000) { result32 = (~operands.data[0]) + 1; } else { result32 = 0x80000000; } latency = 1; break; case ID_NEGD: result32 = -operands.data[0]; lt = ((SInt32) result32 < 0); gt = ((SInt32) result32 > 0); eq = ((UInt32) result32 == 0); latency = 1; break; case ID_NEGO: result32 = -operands.data[0]; ov = operands.data[0] == 0x80000000; latency = 1; break; case ID_NEGOD: result32 = -operands.data[0]; ov = operands.data[0] == 0x80000000; lt = ((SInt32) result32 < 0); gt = ((SInt32) result32 > 0); eq = ((UInt32) result32 == 0); latency = 1; break; case ID_SUBFE: { UInt32 a = ~operands.data[0]; UInt32 b = operands.data[1]; UInt32 c = inCarry ? 1 : 0; result32 = a + b + c; ca = Carry(a, b) || Carry(a + b, c); latency = 1; } break; case ID_SUBFED: { UInt32 a = ~operands.data[0]; UInt32 b = operands.data[1]; UInt32 c = inCarry ? 1 : 0; result32 = a + b + c; ca = Carry(a, b) || Carry(a + b, c); lt = ((SInt32) result32 < 0); gt = ((SInt32) result32 > 0); eq = ((UInt32) result32 == 0); latency = 1; } break; case ID_SUBFEO: { UInt32 a = ~operands.data[0]; UInt32 b = operands.data[1]; UInt32 c = inCarry ? 1 : 0; result32 = a + b + c; ca = Carry(a, b) || Carry(a + b, c); ov = Overflow(b, a) || Overflow(b + a, c); latency = 1; } break; case ID_SUBFEOD: { UInt32 a = ~operands.data[0]; UInt32 b = operands.data[1]; UInt32 c = inCarry ? 1 : 0; result32 = a + b + c; ca = Carry(a, b) || Carry(a + b, c); ov = Overflow(b, a) || Overflow(b + a, c); lt = ((SInt32) result32 < 0); gt = ((SInt32) result32 > 0); eq = ((UInt32) result32 == 0); latency = 1; } break; case ID_ADDE: { UInt32 a = operands.data[0]; UInt32 b = operands.data[1]; UInt32 c = inCarry ? 1 : 0; result32 = a + b + c; ca = Carry(a, b) || Carry(a + b, c); latency = 1; } break; case ID_ADDED: { UInt32 a = operands.data[0]; UInt32 b = operands.data[1]; UInt32 c = inCarry ? 1 : 0; result32 = a + b + c; ca = Carry(a, b) || Carry(a + b, c); lt = ((SInt32) result32 < 0); gt = ((SInt32) result32 > 0); eq = ((UInt32) result32 == 0); latency = 1; } break; case ID_ADDEO: { UInt32 a = operands.data[0]; UInt32 b = operands.data[1]; UInt32 c = inCarry ? 1 : 0; result32 = a + b + c; ca = Carry(a, b) || Carry(a + b, c); ov = Overflow(a, b) || Overflow(a + b, c); latency = 1; } break; case ID_ADDEOD: { UInt32 a = operands.data[0]; UInt32 b = operands.data[1]; UInt32 c = inCarry ? 1 : 0; result32 = a + b + c; ca = Carry(a, b) || Carry(a + b, c); ov = Overflow(a, b) || Overflow(a + b, c); lt = ((SInt32) result32 < 0); gt = ((SInt32) result32 > 0); eq = ((UInt32) result32 == 0); latency = 1; } break; case ID_SUBFZE: { UInt32 a = ~operands.data[0]; UInt32 c = inCarry ? 1 : 0; result32 = a + c; ca = Carry(a, c); latency = 1; } break; case ID_SUBFZED: { UInt32 a = ~operands.data[0]; UInt32 c = inCarry ? 1 : 0; result32 = a + c; ca = Carry(a, c); lt = ((SInt32) result32 < 0); gt = ((SInt32) result32 > 0); eq = ((UInt32) result32 == 0); latency = 1; } break; case ID_SUBFZEO: { UInt32 a = ~operands.data[0]; UInt32 c = inCarry ? 1 : 0; result32 = a + c; ca = Carry(a, c); ov = Overflow(a, c); latency = 1; } break; case ID_SUBFZEOD: { UInt32 a = ~operands.data[0]; UInt32 c = inCarry ? 1 : 0; result32 = a + c; ca = Carry(a, c); ov = Overflow(a, c); lt = ((SInt32) result32 < 0); gt = ((SInt32) result32 > 0); eq = ((UInt32) result32 == 0); latency = 1; } break; case ID_ADDZE: { UInt32 a = operands.data[0]; UInt32 c = inCarry ? 1 : 0; result32 = a + c; ca = Carry(a, c); latency = 1; } break; case ID_ADDZED: { UInt32 a = operands.data[0]; UInt32 c = inCarry ? 1 : 0; result32 = a + c; ca = Carry(a, c); lt = ((SInt32) result32 < 0); gt = ((SInt32) result32 > 0); eq = ((UInt32) result32 == 0); latency = 1; } break; case ID_ADDZEO: { UInt32 a = operands.data[0]; UInt32 c = inCarry ? 1 : 0; result32 = a + c; ca = Carry(a, c); ov = Overflow(a, c); latency = 1; } break; case ID_ADDZEOD: { UInt32 a = operands.data[0]; UInt32 c = inCarry ? 1 : 0; result32 = a + c; ca = Carry(a, c); ov = Overflow(a, c); lt = ((SInt32) result32 < 0); gt = ((SInt32) result32 > 0); eq = ((UInt32) result32 == 0); latency = 1; } break; case ID_SUBFME: { UInt32 a = ~operands.data[0]; UInt32 c = inCarry ? 1 : 0; result32 = a + c - 1; ca = Carry(a, c - 1); latency = 1; } break; case ID_SUBFMED: { UInt32 a = ~operands.data[0]; UInt32 c = inCarry ? 1 : 0; result32 = a + c - 1; ca = Carry(a, c - 1); lt = ((SInt32) result32 < 0); gt = ((SInt32) result32 > 0); eq = ((UInt32) result32 == 0); latency = 1; } break; case ID_SUBFMEO: { UInt32 a = ~operands.data[0]; UInt32 c = inCarry ? 1 : 0; result32 = a + c - 1; ca = Carry(a, c - 1); ov = Overflow(a, c - 1); latency = 1; } break; case ID_SUBFMEOD: { UInt32 a = ~operands.data[0]; UInt32 c = inCarry ? 1 : 0; result32 = a + c - 1; ca = Carry(a, c - 1); ov = Overflow(a, c - 1); lt = ((SInt32) result32 < 0); gt = ((SInt32) result32 > 0); eq = ((UInt32) result32 == 0); latency = 1; } break; case ID_ADDME: { UInt32 a = operands.data[0]; UInt32 c = inCarry ? 1 : 0; result32 = a + c - 1; ca = Carry(a, c - 1); latency = 1; } break; case ID_ADDMED: { UInt32 a = operands.data[0]; UInt32 c = inCarry ? 1 : 0; result32 = a + c - 1; ca = Carry(a, c - 1); lt = ((SInt32) result32 < 0); gt = ((SInt32) result32 > 0); eq = ((UInt32) result32 == 0); latency = 1; } break; case ID_ADDMEO: { UInt32 a = operands.data[0]; UInt32 c = inCarry ? 1 : 0; result32 = a + c - 1; ca = Carry(a, c - 1); ov = Overflow(a, c - 1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -