Lowent 매뉴얼←↑→

intops — 정확한 비교와 넓은 셈

소스
lib/intops.low
층
L0 — 순수 계산
권한
없음

정수 셈에서 버리지 않고 값으로 받고 싶은 것 셋을 둔다 — 부호나 폭이 다른 두 정수의 정확한 비교, 덧셈 · 뺄셈의 자리올림 · 빌림, 곱의 위 절반. 기본 타입 시스템(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}(𝑎+𝑏+𝑐)mod2𝑁 과 자리올림. 들어오는 c 는 0 또는 1(계약)
sub_borrow_<폭>{diff, borrow}(𝑎−𝑏−𝑐)mod2𝑁 과 빌림
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 개의 답(예: (−263)2 의 hi = 262)을 VM 과 네이티브 둘 다에서 대조하고, 차등 스윕이 impl/tests/vm_intops.low 의 op 마다 두 뒤끝을 견준다.