1;; Chained `uextend` and `sextend`. 2(rule (simplify (uextend ty (uextend _intermediate_ty x))) 3 (uextend ty x)) 4(rule (simplify (sextend ty (sextend _intermediate_ty x))) 5 (sextend ty x)) 6 7;; Once something has be `uextend`ed, further `sextend`ing is the same as `uextend` 8(rule (simplify (sextend ty (uextend _intermediate_ty x))) 9 (uextend ty x)) 10 11;; `icmp` is zero or one, so sign-extending is the same as zero-extending 12(rule (simplify (sextend ty x@(icmp _ _ _ _))) 13 (uextend ty x)) 14 15;; Masking out any of the top bits of the result of `uextend` is a no-op. (This 16;; is like a cheap version of known-bits analysis.) 17(rule (simplify (band wide x @ (uextend _ (value_type narrow)) (iconst _ (u64_from_imm64 mask)))) 18 ; Check that `narrow_mask` has a subset of the bits that `mask` does. 19 (if-let $true (let ((narrow_mask u64 (ty_mask narrow))) (u64_eq narrow_mask (u64_and mask narrow_mask)))) 20 x) 21 22;; Masking out the sign-extended bits of an `sextend` turns it into a `uextend`. 23(rule (simplify (band wide (sextend _ x @ (value_type narrow)) (iconst _ (u64_from_imm64 mask)))) 24 (if-let $true (u64_eq mask (ty_mask narrow))) 25 (uextend wide x)) 26 27;; 32-bit integers zero-extended to 64-bit integers are never negative 28(rule (simplify 29 (slt ty 30 (uextend $I64 x @ (value_type $I32)) 31 (iconst_u _ 0))) 32 (iconst_u ty 0)) 33(rule (simplify 34 (sge ty 35 (uextend $I64 x @ (value_type $I32)) 36 (iconst_u _ 0))) 37 (iconst_u ty 1)) 38 39;; Sign-extending can't change whether a number is zero nor how it signed-compares to zero 40(rule (simplify (eq _ (sextend _ x@(value_type ty)) (iconst_s _ 0))) 41 (eq ty x (iconst_s ty 0))) 42(rule (simplify (ne _ (sextend _ x@(value_type ty)) (iconst_s _ 0))) 43 (ne ty x (iconst_s ty 0))) 44(rule (simplify (icmp _ cc (sextend _ x@(value_type ty)) (iconst_s _ 0))) 45 (if (signed_cond_code cc)) 46 (icmp ty cc x (iconst_s ty 0))) 47 48;; A reduction-of-an-extend back to the same original type is the same as not 49;; actually doing the extend in the first place. 50(rule (simplify (ireduce ty (sextend _ x @ (value_type ty)))) x) 51(rule (simplify (ireduce ty (uextend _ x @ (value_type ty)))) x) 52