Nodes (Ops) and patterns (Upat) share them. On nodes, a binary operation first promotes its operands to their least upper type (Dtype.least_upper), a weak constant staying weak; the node's shape is their broadcast shape (broadcast_shape). On patterns, each builds the pattern of the node the operation builds.
div ~rounding x y divides integers by Op.t.Truncdiv or Op.t.Div when rounding; otherwise it multiplies x, as a float, by y's reciprocal, then rounds as asked.
pow x y is Op.t.Pow of x and y: promoted to a common type, but for an integer x and a weak integer y, which keeps its value at no width (Op.t.Pow's exponent is a number).
Raises Invalid_argument if the promoted type is not a float and y is a negative integer constant.
Operators, for local opening: O.(x + int 4 * y). Each is the function of the same meaning: + is add, // is div ~rounding:`Floor, % is mod_, <> is ne, land, lor, lxor and lnot are the bitwise operations, lsl and lsr the shifts.