!sum # ShiftAllLeft — shift every element left by one amount. The amount is a # scalar in the API, which the lowering broadcasts into the 64-bit lanes of the # vector LSL (wide elements) shifts each narrower element by. LSL gives 0 for # an amount of the element width or more, as the API does, so the amount needs # no clamping. A constant amount below the element width becomes the immediate # form, shiftAllLeftConst (sftimm). - go: ShiftAllLeft asm: "ZLSL" specialLower: sftimm in: - &int go: $t base: int|uint - &wideShift class: vreg elemBits: 64 treatLikeAScalarOfSize: 64 name: shift out: - *int # LSL has no wide form for 64-bit elements; LSL (vectors) takes the amount # from each element of a vector instead, and gives 0 for 64 or more. - go: ShiftAllLeft asm: "ZLSL" specialLower: sftimm in: - &int64 go: $t base: int|uint elemBits: 64 - *wideShift - class: mask # governing predicate out: - *int64 # shiftAllLeftConst — LSL (immediate, unpredicated), a shift by an amount # below the element width. No API; sftimm lowers ShiftAllLeft to it. - go: shiftAllLeftConst asm: "ZLSL" ssaVariant: "const" in: - class: immediate - *int out: - *int