intops — 정확한 비교와 넓은 셈
정수 셈에서 버리지 않고 값으로 받고 싶은 것 셋을 둔다 — 부호나 폭이 다른 두 정수의 정확한 비교, 덧셈 · 뺄셈의 자리올림 · 빌림, 곱의 위 절반. 기본 타입 시스템(basic_type_system 02 §2.6 · §2.7)이 모든 처리기에 두라고 하는 연산이고, 전부 로우엔트로 적혀 있다 — 가장 안쪽의 u64 곱의 위 절반만 빌트인 mul_hi 를 부른다.
정확한 비교 — cmp_eq · cmp_lt · cmp_le 는 두 정수의 수학적 값을 견준다. 중위 lt 는 부호가 섞이면 번역이 거부되므로 (E-TYPE-SIGN), 값으로 견주려는 사람은 이름으로 말한다. 타입 인자를 앞에 적는다.
intops.cmp_lt i64. u64. a. b. . ← a = −1, b = 0 이면 참
intops.cmp_eq i64. u64. a. b. . ← a = −1, b = 2^64 − 1 이면 거짓(비트는 같지만 값은 다르다)어느 정수 타입의 짝이든 받는다 — usize · idiff · 128 비트까지. 방법은 부호를 먼저 보는 것이다: 둘 다 음수면 i128 로, 둘 다 0 이상이면 u128 로 견준다. 어느 정수든 그 둘 가운데 하나에 들어간다.
자리올림 · 빌림 · 넓은 곱 — 폭마다 하나씩 둔다(구조체에 타입 매개변수가 없어서다).
| op | 결과 | 뜻 |
add_carry_<폭> | {sum, carry} | 과 자리올림. 들어오는 c 는 0 또는 1(계약) |
sub_borrow_<폭> | {diff, borrow} | 과 빌림 |
mul_wide_<폭> | {lo, hi} | 곱의 아래 비트와 위 비트 |
mul_wide_s_<폭> | {lo, hi} | 부호 있는 곱 — lo 는 부호 없는 아래 절반, hi 는 부호 있는 위 절반 |
폭은 부호 없는 u8 · u16 · u32 · u64 · usize, 부호 있는 i8 · i16 · i32 · i64 · idiff 다. usize 와 idiff 의 곱은 u128 · i128 에서 하고 대상의 주소 폭(machine.addr_bits)으로 나눈다 — 16 비트 대상에서는 16 비트 절반 둘이다.
무엇으로 맞는지 아는가 — 골든의 intops 구획이 손으로 셈한 26 개의 답(예: 의 hi = )을 VM 과 네이티브 둘 다에서 대조하고, 차등 스윕이 impl/tests/vm_intops.low 의 op 마다 두 뒤끝을 견준다.