[llvm] [GlobalISel] Add multi-way splitting support for wide scalar shifts. (PR #155353)

Amara Emerson via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 27 01:51:39 PDT 2025


================
@@ -0,0 +1,10116 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc %s -o - | FileCheck %s --check-prefixes CHECK,SDAG
+; RUN: llc %s -global-isel -global-isel-abort=1 -o - | FileCheck %s --check-prefixes CHECK,GISEL
+target datalayout = "e-m:o-i64:64-i512:128-n32:64-S128"
+target triple = "arm64-apple-macosx14.0.0"
+
+define void @test_shl_i512(ptr %result, ptr %input, i32 %shift) {
+; SDAG-LABEL: test_shl_i512:
+; SDAG:       ; %bb.0: ; %entry
+; SDAG-NEXT:    sub sp, sp, #128
+; SDAG-NEXT:    .cfi_def_cfa_offset 128
+; SDAG-NEXT:    ldp x9, x8, [x1, #48]
+; SDAG-NEXT:    movi.2d v0, #0000000000000000
+; SDAG-NEXT:    ldp q1, q2, [x1]
+; SDAG-NEXT:    mvn w14, w2
+; SDAG-NEXT:    ldr q3, [x1, #32]
+; SDAG-NEXT:    stp x9, x8, [sp, #112]
+; SDAG-NEXT:    mov w8, w2
+; SDAG-NEXT:    mov x9, sp
+; SDAG-NEXT:    lsr x10, x8, #3
+; SDAG-NEXT:    add x9, x9, #64
+; SDAG-NEXT:    stp q0, q0, [sp]
+; SDAG-NEXT:    stp q0, q0, [sp, #32]
+; SDAG-NEXT:    and x3, x8, #0x3f
+; SDAG-NEXT:    and x10, x10, #0x38
+; SDAG-NEXT:    stp q2, q3, [sp, #80]
+; SDAG-NEXT:    eor x3, x3, #0x3f
+; SDAG-NEXT:    sub x10, x9, x10
+; SDAG-NEXT:    str q1, [sp, #64]
+; SDAG-NEXT:    ldp x9, x11, [x10]
+; SDAG-NEXT:    ldp x13, x12, [x10, #16]
+; SDAG-NEXT:    ldp x17, x16, [x10, #32]
+; SDAG-NEXT:    ldp x10, x2, [x10, #48]
+; SDAG-NEXT:    lsr x15, x11, #1
+; SDAG-NEXT:    lsr x1, x12, #1
+; SDAG-NEXT:    lsl x11, x11, x8
+; SDAG-NEXT:    lsl x12, x12, x8
+; SDAG-NEXT:    lsr x4, x16, #1
+; SDAG-NEXT:    lsr x15, x15, x14
+; SDAG-NEXT:    lsl x5, x17, x8
+; SDAG-NEXT:    lsr x6, x10, #1
+; SDAG-NEXT:    lsr x1, x1, x14
+; SDAG-NEXT:    lsl x10, x10, x8
+; SDAG-NEXT:    lsr x14, x4, x14
+; SDAG-NEXT:    lsl x2, x2, x8
+; SDAG-NEXT:    lsl x16, x16, x8
+; SDAG-NEXT:    lsr x4, x6, x3
+; SDAG-NEXT:    orr x1, x5, x1
+; SDAG-NEXT:    orr x10, x10, x14
+; SDAG-NEXT:    lsr x14, x17, #1
+; SDAG-NEXT:    orr x17, x2, x4
+; SDAG-NEXT:    lsr x2, x9, #1
+; SDAG-NEXT:    stp x10, x17, [x0, #48]
+; SDAG-NEXT:    lsr x10, x13, #1
+; SDAG-NEXT:    lsr x14, x14, x3
+; SDAG-NEXT:    lsl x13, x13, x8
+; SDAG-NEXT:    lsl x8, x9, x8
+; SDAG-NEXT:    lsr x10, x10, x3
+; SDAG-NEXT:    orr x14, x16, x14
+; SDAG-NEXT:    lsr x16, x2, x3
+; SDAG-NEXT:    orr x13, x13, x15
+; SDAG-NEXT:    stp x1, x14, [x0, #32]
+; SDAG-NEXT:    orr x10, x12, x10
+; SDAG-NEXT:    orr x9, x11, x16
+; SDAG-NEXT:    stp x13, x10, [x0, #16]
+; SDAG-NEXT:    stp x8, x9, [x0]
+; SDAG-NEXT:    add sp, sp, #128
+; SDAG-NEXT:    ret
+;
+; GISEL-LABEL: test_shl_i512:
+; GISEL:       ; %bb.0: ; %entry
+; GISEL-NEXT:    stp x28, x27, [sp, #-80]! ; 16-byte Folded Spill
+; GISEL-NEXT:    stp x26, x25, [sp, #16] ; 16-byte Folded Spill
+; GISEL-NEXT:    stp x24, x23, [sp, #32] ; 16-byte Folded Spill
+; GISEL-NEXT:    stp x22, x21, [sp, #48] ; 16-byte Folded Spill
+; GISEL-NEXT:    stp x20, x19, [sp, #64] ; 16-byte Folded Spill
+; GISEL-NEXT:    .cfi_def_cfa_offset 80
+; GISEL-NEXT:    .cfi_offset w19, -8
+; GISEL-NEXT:    .cfi_offset w20, -16
+; GISEL-NEXT:    .cfi_offset w21, -24
+; GISEL-NEXT:    .cfi_offset w22, -32
+; GISEL-NEXT:    .cfi_offset w23, -40
+; GISEL-NEXT:    .cfi_offset w24, -48
+; GISEL-NEXT:    .cfi_offset w25, -56
+; GISEL-NEXT:    .cfi_offset w26, -64
+; GISEL-NEXT:    .cfi_offset w27, -72
+; GISEL-NEXT:    .cfi_offset w28, -80
+; GISEL-NEXT:    ldp x11, x15, [x1]
+; GISEL-NEXT:    mov w8, w2
+; GISEL-NEXT:    lsr x9, x8, #6
+; GISEL-NEXT:    and x14, x8, #0x3f
+; GISEL-NEXT:    mov w13, #64 ; =0x40
+; GISEL-NEXT:    sub x16, x13, x14
+; GISEL-NEXT:    ldp x3, x6, [x1, #16]
+; GISEL-NEXT:    lsl x10, x11, x14
+; GISEL-NEXT:    cmp x9, #0
+; GISEL-NEXT:    ldp x20, x21, [x1, #32]
+; GISEL-NEXT:    csel x12, x10, xzr, eq
+; GISEL-NEXT:    cmp x9, #1
+; GISEL-NEXT:    csel x12, xzr, x12, eq
+; GISEL-NEXT:    cmp x9, #2
+; GISEL-NEXT:    csel x12, xzr, x12, eq
+; GISEL-NEXT:    cmp x9, #3
+; GISEL-NEXT:    lsr x26, x21, x16
+; GISEL-NEXT:    csel x12, xzr, x12, eq
+; GISEL-NEXT:    cmp x9, #4
+; GISEL-NEXT:    csel x12, xzr, x12, eq
+; GISEL-NEXT:    cmp x9, #5
+; GISEL-NEXT:    csel x12, xzr, x12, eq
+; GISEL-NEXT:    cmp x9, #6
+; GISEL-NEXT:    csel x12, xzr, x12, eq
+; GISEL-NEXT:    cmp x9, #7
+; GISEL-NEXT:    csel x13, xzr, x12, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    lsr x12, x11, x16
+; GISEL-NEXT:    csel x13, x11, x13, eq
+; GISEL-NEXT:    lsl x11, x15, x14
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x17, xzr, x12, eq
+; GISEL-NEXT:    cmp x9, #0
+; GISEL-NEXT:    orr x17, x11, x17
+; GISEL-NEXT:    csel x17, x17, xzr, eq
+; GISEL-NEXT:    cmp x9, #1
+; GISEL-NEXT:    csel x17, x10, x17, eq
+; GISEL-NEXT:    cmp x9, #2
+; GISEL-NEXT:    csel x17, xzr, x17, eq
+; GISEL-NEXT:    cmp x9, #3
+; GISEL-NEXT:    csel x17, xzr, x17, eq
+; GISEL-NEXT:    cmp x9, #4
+; GISEL-NEXT:    csel x17, xzr, x17, eq
+; GISEL-NEXT:    cmp x9, #5
+; GISEL-NEXT:    csel x17, xzr, x17, eq
+; GISEL-NEXT:    cmp x9, #6
+; GISEL-NEXT:    csel x17, xzr, x17, eq
+; GISEL-NEXT:    cmp x9, #7
+; GISEL-NEXT:    csel x2, xzr, x17, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    lsr x17, x15, x16
+; GISEL-NEXT:    csel x15, x15, x2, eq
+; GISEL-NEXT:    lsl x2, x3, x14
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x4, xzr, x17, eq
+; GISEL-NEXT:    cmp x9, #0
+; GISEL-NEXT:    orr x4, x2, x4
+; GISEL-NEXT:    csel x4, x4, xzr, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x5, xzr, x12, eq
+; GISEL-NEXT:    cmp x9, #1
+; GISEL-NEXT:    orr x5, x11, x5
+; GISEL-NEXT:    csel x4, x5, x4, eq
+; GISEL-NEXT:    cmp x9, #2
+; GISEL-NEXT:    csel x4, x10, x4, eq
+; GISEL-NEXT:    cmp x9, #3
+; GISEL-NEXT:    csel x4, xzr, x4, eq
+; GISEL-NEXT:    cmp x9, #4
+; GISEL-NEXT:    csel x4, xzr, x4, eq
+; GISEL-NEXT:    cmp x9, #5
+; GISEL-NEXT:    csel x4, xzr, x4, eq
+; GISEL-NEXT:    cmp x9, #6
+; GISEL-NEXT:    csel x4, xzr, x4, eq
+; GISEL-NEXT:    cmp x9, #7
+; GISEL-NEXT:    csel x5, xzr, x4, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    lsr x4, x3, x16
+; GISEL-NEXT:    csel x3, x3, x5, eq
+; GISEL-NEXT:    lsl x5, x6, x14
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x7, xzr, x4, eq
+; GISEL-NEXT:    cmp x9, #0
+; GISEL-NEXT:    orr x7, x5, x7
+; GISEL-NEXT:    csel x7, x7, xzr, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x19, xzr, x17, eq
+; GISEL-NEXT:    cmp x9, #1
+; GISEL-NEXT:    orr x19, x2, x19
+; GISEL-NEXT:    csel x7, x19, x7, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x19, xzr, x12, eq
+; GISEL-NEXT:    cmp x9, #2
+; GISEL-NEXT:    orr x19, x11, x19
+; GISEL-NEXT:    csel x7, x19, x7, eq
+; GISEL-NEXT:    cmp x9, #3
+; GISEL-NEXT:    csel x7, x10, x7, eq
+; GISEL-NEXT:    cmp x9, #4
+; GISEL-NEXT:    csel x7, xzr, x7, eq
+; GISEL-NEXT:    cmp x9, #5
+; GISEL-NEXT:    csel x7, xzr, x7, eq
+; GISEL-NEXT:    cmp x9, #6
+; GISEL-NEXT:    csel x7, xzr, x7, eq
+; GISEL-NEXT:    cmp x9, #7
+; GISEL-NEXT:    csel x19, xzr, x7, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    lsr x7, x6, x16
+; GISEL-NEXT:    csel x6, x6, x19, eq
+; GISEL-NEXT:    lsl x19, x20, x14
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x22, xzr, x7, eq
+; GISEL-NEXT:    cmp x9, #0
+; GISEL-NEXT:    orr x22, x19, x22
+; GISEL-NEXT:    csel x22, x22, xzr, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x23, xzr, x4, eq
+; GISEL-NEXT:    cmp x9, #1
+; GISEL-NEXT:    orr x23, x5, x23
+; GISEL-NEXT:    csel x22, x23, x22, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x23, xzr, x17, eq
+; GISEL-NEXT:    cmp x9, #2
+; GISEL-NEXT:    orr x23, x2, x23
+; GISEL-NEXT:    csel x22, x23, x22, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x23, xzr, x12, eq
+; GISEL-NEXT:    cmp x9, #3
+; GISEL-NEXT:    orr x23, x11, x23
+; GISEL-NEXT:    csel x22, x23, x22, eq
+; GISEL-NEXT:    cmp x9, #4
+; GISEL-NEXT:    csel x22, x10, x22, eq
+; GISEL-NEXT:    cmp x9, #5
+; GISEL-NEXT:    csel x22, xzr, x22, eq
+; GISEL-NEXT:    cmp x9, #6
+; GISEL-NEXT:    csel x22, xzr, x22, eq
+; GISEL-NEXT:    cmp x9, #7
+; GISEL-NEXT:    csel x23, xzr, x22, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    lsr x22, x20, x16
+; GISEL-NEXT:    csel x20, x20, x23, eq
+; GISEL-NEXT:    lsl x23, x21, x14
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x24, xzr, x22, eq
+; GISEL-NEXT:    cmp x9, #0
+; GISEL-NEXT:    orr x24, x23, x24
+; GISEL-NEXT:    csel x24, x24, xzr, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x25, xzr, x7, eq
+; GISEL-NEXT:    cmp x9, #1
+; GISEL-NEXT:    orr x25, x19, x25
+; GISEL-NEXT:    csel x24, x25, x24, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x25, xzr, x4, eq
+; GISEL-NEXT:    cmp x9, #2
+; GISEL-NEXT:    orr x25, x5, x25
+; GISEL-NEXT:    csel x24, x25, x24, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x25, xzr, x17, eq
+; GISEL-NEXT:    cmp x9, #3
+; GISEL-NEXT:    orr x25, x2, x25
+; GISEL-NEXT:    csel x24, x25, x24, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x25, xzr, x12, eq
+; GISEL-NEXT:    cmp x9, #4
+; GISEL-NEXT:    orr x25, x11, x25
+; GISEL-NEXT:    csel x24, x25, x24, eq
+; GISEL-NEXT:    cmp x9, #5
+; GISEL-NEXT:    csel x24, x10, x24, eq
+; GISEL-NEXT:    cmp x9, #6
+; GISEL-NEXT:    ldp x25, x1, [x1, #48]
+; GISEL-NEXT:    csel x24, xzr, x24, eq
+; GISEL-NEXT:    cmp x9, #7
+; GISEL-NEXT:    stp x13, x15, [x0]
+; GISEL-NEXT:    csel x24, xzr, x24, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    stp x3, x6, [x0, #16]
+; GISEL-NEXT:    csel x21, x21, x24, eq
+; GISEL-NEXT:    lsl x24, x25, x14
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x27, xzr, x26, eq
+; GISEL-NEXT:    cmp x9, #0
+; GISEL-NEXT:    lsr x16, x25, x16
+; GISEL-NEXT:    orr x27, x24, x27
+; GISEL-NEXT:    lsl x14, x1, x14
+; GISEL-NEXT:    stp x20, x21, [x0, #32]
+; GISEL-NEXT:    csel x27, x27, xzr, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x28, xzr, x22, eq
+; GISEL-NEXT:    cmp x9, #1
+; GISEL-NEXT:    orr x28, x23, x28
+; GISEL-NEXT:    csel x27, x28, x27, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x28, xzr, x7, eq
+; GISEL-NEXT:    cmp x9, #2
+; GISEL-NEXT:    orr x28, x19, x28
+; GISEL-NEXT:    csel x27, x28, x27, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x28, xzr, x4, eq
+; GISEL-NEXT:    cmp x9, #3
+; GISEL-NEXT:    orr x28, x5, x28
+; GISEL-NEXT:    csel x27, x28, x27, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x28, xzr, x17, eq
+; GISEL-NEXT:    cmp x9, #4
+; GISEL-NEXT:    orr x28, x2, x28
+; GISEL-NEXT:    csel x27, x28, x27, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x28, xzr, x12, eq
+; GISEL-NEXT:    cmp x9, #5
+; GISEL-NEXT:    orr x28, x11, x28
+; GISEL-NEXT:    csel x27, x28, x27, eq
+; GISEL-NEXT:    cmp x9, #6
+; GISEL-NEXT:    csel x27, x10, x27, eq
+; GISEL-NEXT:    cmp x9, #7
+; GISEL-NEXT:    csel x27, xzr, x27, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x25, x25, x27, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x16, xzr, x16, eq
+; GISEL-NEXT:    cmp x9, #0
+; GISEL-NEXT:    orr x14, x14, x16
+; GISEL-NEXT:    csel x14, x14, xzr, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x16, xzr, x26, eq
+; GISEL-NEXT:    cmp x9, #1
+; GISEL-NEXT:    orr x16, x24, x16
+; GISEL-NEXT:    csel x14, x16, x14, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x16, xzr, x22, eq
+; GISEL-NEXT:    cmp x9, #2
+; GISEL-NEXT:    orr x16, x23, x16
+; GISEL-NEXT:    ldp x22, x21, [sp, #48] ; 16-byte Folded Reload
+; GISEL-NEXT:    csel x14, x16, x14, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x16, xzr, x7, eq
+; GISEL-NEXT:    cmp x9, #3
+; GISEL-NEXT:    orr x16, x19, x16
+; GISEL-NEXT:    ldp x20, x19, [sp, #64] ; 16-byte Folded Reload
+; GISEL-NEXT:    csel x14, x16, x14, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x16, xzr, x4, eq
+; GISEL-NEXT:    cmp x9, #4
+; GISEL-NEXT:    orr x16, x5, x16
+; GISEL-NEXT:    ldp x24, x23, [sp, #32] ; 16-byte Folded Reload
+; GISEL-NEXT:    csel x14, x16, x14, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x16, xzr, x17, eq
+; GISEL-NEXT:    cmp x9, #5
+; GISEL-NEXT:    orr x16, x2, x16
+; GISEL-NEXT:    csel x13, x16, x14, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x12, xzr, x12, eq
+; GISEL-NEXT:    cmp x9, #6
+; GISEL-NEXT:    orr x11, x11, x12
+; GISEL-NEXT:    csel x11, x11, x13, eq
+; GISEL-NEXT:    cmp x9, #7
+; GISEL-NEXT:    csel x9, x10, x11, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x8, x1, x9, eq
+; GISEL-NEXT:    stp x25, x8, [x0, #48]
+; GISEL-NEXT:    ldp x26, x25, [sp, #16] ; 16-byte Folded Reload
+; GISEL-NEXT:    ldp x28, x27, [sp], #80 ; 16-byte Folded Reload
+; GISEL-NEXT:    ret
+entry:
+  ; Load i512 from input buffer
+  %input_val = load i512, ptr %input, align 64
+
+  ; Convert shift amount and perform shift
+  %shift_ext = zext i32 %shift to i512
+  %shifted = shl i512 %input_val, %shift_ext
+
+  ; Store result to output buffer
+  store i512 %shifted, ptr %result, align 64
+  ret void
+}
+
+define void @test_lshr_i512(ptr %result, ptr %input, i32 %shift) {
+; SDAG-LABEL: test_lshr_i512:
+; SDAG:       ; %bb.0: ; %entry
+; SDAG-NEXT:    sub sp, sp, #128
+; SDAG-NEXT:    .cfi_def_cfa_offset 128
+; SDAG-NEXT:    ldp x9, x8, [x1, #48]
+; SDAG-NEXT:    movi.2d v0, #0000000000000000
+; SDAG-NEXT:    ldp q1, q2, [x1]
+; SDAG-NEXT:    mvn w11, w2
+; SDAG-NEXT:    ldr q3, [x1, #32]
+; SDAG-NEXT:    stp x9, x8, [sp, #48]
+; SDAG-NEXT:    mov w8, w2
+; SDAG-NEXT:    lsr x10, x8, #3
+; SDAG-NEXT:    stp q2, q3, [sp, #16]
+; SDAG-NEXT:    and x3, x8, #0x3f
+; SDAG-NEXT:    stp q0, q0, [sp, #64]
+; SDAG-NEXT:    eor x3, x3, #0x3f
+; SDAG-NEXT:    and x9, x10, #0x38
+; SDAG-NEXT:    mov x10, sp
+; SDAG-NEXT:    stp q0, q0, [sp, #96]
+; SDAG-NEXT:    add x10, x10, x9
+; SDAG-NEXT:    str q1, [sp]
+; SDAG-NEXT:    ldp x13, x16, [x10, #48]
+; SDAG-NEXT:    ldp x9, x14, [x10, #16]
+; SDAG-NEXT:    ldp x12, x17, [x10, #32]
+; SDAG-NEXT:    lsl x4, x16, #1
+; SDAG-NEXT:    lsl x2, x13, #1
+; SDAG-NEXT:    lsr x13, x13, x8
+; SDAG-NEXT:    lsl x15, x9, #1
+; SDAG-NEXT:    lsr x16, x16, x8
+; SDAG-NEXT:    lsr x9, x9, x8
+; SDAG-NEXT:    lsl x1, x12, #1
+; SDAG-NEXT:    lsl x4, x4, x3
+; SDAG-NEXT:    lsr x12, x12, x8
+; SDAG-NEXT:    lsl x15, x15, x11
+; SDAG-NEXT:    lsl x1, x1, x11
+; SDAG-NEXT:    lsl x11, x2, x11
+; SDAG-NEXT:    lsl x2, x17, #1
+; SDAG-NEXT:    orr x13, x4, x13
+; SDAG-NEXT:    ldp x10, x4, [x10]
+; SDAG-NEXT:    lsr x17, x17, x8
+; SDAG-NEXT:    lsl x2, x2, x3
+; SDAG-NEXT:    stp x13, x16, [x0, #48]
+; SDAG-NEXT:    lsl x16, x14, #1
+; SDAG-NEXT:    lsr x14, x14, x8
+; SDAG-NEXT:    lsl x13, x4, #1
+; SDAG-NEXT:    orr x11, x17, x11
+; SDAG-NEXT:    orr x12, x2, x12
+; SDAG-NEXT:    lsl x16, x16, x3
+; SDAG-NEXT:    lsr x10, x10, x8
+; SDAG-NEXT:    stp x12, x11, [x0, #32]
+; SDAG-NEXT:    lsl x12, x13, x3
+; SDAG-NEXT:    lsr x8, x4, x8
+; SDAG-NEXT:    orr x11, x14, x1
+; SDAG-NEXT:    orr x9, x16, x9
+; SDAG-NEXT:    stp x9, x11, [x0, #16]
+; SDAG-NEXT:    orr x9, x12, x10
+; SDAG-NEXT:    orr x8, x8, x15
+; SDAG-NEXT:    stp x9, x8, [x0]
+; SDAG-NEXT:    add sp, sp, #128
+; SDAG-NEXT:    ret
+;
+; GISEL-LABEL: test_lshr_i512:
+; GISEL:       ; %bb.0: ; %entry
+; GISEL-NEXT:    stp x26, x25, [sp, #-64]! ; 16-byte Folded Spill
+; GISEL-NEXT:    stp x24, x23, [sp, #16] ; 16-byte Folded Spill
+; GISEL-NEXT:    stp x22, x21, [sp, #32] ; 16-byte Folded Spill
+; GISEL-NEXT:    stp x20, x19, [sp, #48] ; 16-byte Folded Spill
+; GISEL-NEXT:    .cfi_def_cfa_offset 64
+; GISEL-NEXT:    .cfi_offset w19, -8
+; GISEL-NEXT:    .cfi_offset w20, -16
+; GISEL-NEXT:    .cfi_offset w21, -24
+; GISEL-NEXT:    .cfi_offset w22, -32
+; GISEL-NEXT:    .cfi_offset w23, -40
+; GISEL-NEXT:    .cfi_offset w24, -48
+; GISEL-NEXT:    .cfi_offset w25, -56
+; GISEL-NEXT:    .cfi_offset w26, -64
+; GISEL-NEXT:    mov w8, w2
+; GISEL-NEXT:    ldp x13, x2, [x1]
+; GISEL-NEXT:    mov w9, #64 ; =0x40
+; GISEL-NEXT:    and x14, x8, #0x3f
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    sub x17, x9, x14
+; GISEL-NEXT:    ldp x5, x16, [x1, #16]
+; GISEL-NEXT:    lsl x10, x2, x17
+; GISEL-NEXT:    lsr x9, x8, #6
+; GISEL-NEXT:    lsr x11, x13, x14
+; GISEL-NEXT:    lsr x24, x2, x14
+; GISEL-NEXT:    csel x10, xzr, x10, eq
+; GISEL-NEXT:    lsl x23, x5, x17
+; GISEL-NEXT:    cmp x9, #0
+; GISEL-NEXT:    orr x10, x11, x10
+; GISEL-NEXT:    lsl x22, x16, x17
+; GISEL-NEXT:    lsr x21, x5, x14
+; GISEL-NEXT:    csel x10, x10, xzr, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    lsr x20, x16, x14
+; GISEL-NEXT:    csel x11, xzr, x23, eq
+; GISEL-NEXT:    cmp x9, #1
+; GISEL-NEXT:    orr x11, x24, x11
+; GISEL-NEXT:    csel x10, x11, x10, eq
+; GISEL-NEXT:    ldp x15, x11, [x1, #32]
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x12, xzr, x22, eq
+; GISEL-NEXT:    cmp x9, #2
+; GISEL-NEXT:    lsl x19, x15, x17
+; GISEL-NEXT:    orr x12, x21, x12
+; GISEL-NEXT:    lsl x6, x11, x17
+; GISEL-NEXT:    csel x10, x12, x10, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    lsr x7, x15, x14
+; GISEL-NEXT:    csel x12, xzr, x19, eq
+; GISEL-NEXT:    cmp x9, #3
+; GISEL-NEXT:    orr x12, x20, x12
+; GISEL-NEXT:    csel x4, x12, x10, eq
+; GISEL-NEXT:    ldp x12, x10, [x1, #48]
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x1, xzr, x6, eq
+; GISEL-NEXT:    cmp x9, #4
+; GISEL-NEXT:    orr x1, x7, x1
+; GISEL-NEXT:    lsl x3, x12, x17
+; GISEL-NEXT:    lsl x17, x10, x17
+; GISEL-NEXT:    csel x1, x1, x4, eq
+; GISEL-NEXT:    lsr x4, x11, x14
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x25, xzr, x3, eq
+; GISEL-NEXT:    cmp x9, #5
+; GISEL-NEXT:    orr x25, x4, x25
+; GISEL-NEXT:    csel x25, x25, x1, eq
+; GISEL-NEXT:    lsr x1, x12, x14
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x26, xzr, x17, eq
+; GISEL-NEXT:    cmp x9, #6
+; GISEL-NEXT:    lsr x14, x10, x14
+; GISEL-NEXT:    orr x26, x1, x26
+; GISEL-NEXT:    csel x25, x26, x25, eq
+; GISEL-NEXT:    cmp x9, #7
+; GISEL-NEXT:    csel x25, x14, x25, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x13, x13, x25, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x23, xzr, x23, eq
+; GISEL-NEXT:    cmp x9, #0
+; GISEL-NEXT:    orr x23, x24, x23
+; GISEL-NEXT:    csel x23, x23, xzr, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x24, xzr, x22, eq
+; GISEL-NEXT:    cmp x9, #1
+; GISEL-NEXT:    orr x24, x21, x24
+; GISEL-NEXT:    csel x23, x24, x23, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x24, xzr, x19, eq
+; GISEL-NEXT:    cmp x9, #2
+; GISEL-NEXT:    orr x24, x20, x24
+; GISEL-NEXT:    csel x23, x24, x23, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x24, xzr, x6, eq
+; GISEL-NEXT:    cmp x9, #3
+; GISEL-NEXT:    orr x24, x7, x24
+; GISEL-NEXT:    csel x23, x24, x23, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x24, xzr, x3, eq
+; GISEL-NEXT:    cmp x9, #4
+; GISEL-NEXT:    orr x24, x4, x24
+; GISEL-NEXT:    csel x23, x24, x23, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x24, xzr, x17, eq
+; GISEL-NEXT:    cmp x9, #5
+; GISEL-NEXT:    orr x24, x1, x24
+; GISEL-NEXT:    csel x23, x24, x23, eq
+; GISEL-NEXT:    cmp x9, #6
+; GISEL-NEXT:    csel x23, x14, x23, eq
+; GISEL-NEXT:    cmp x9, #7
+; GISEL-NEXT:    csel x23, xzr, x23, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x2, x2, x23, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x22, xzr, x22, eq
+; GISEL-NEXT:    cmp x9, #0
+; GISEL-NEXT:    stp x13, x2, [x0]
+; GISEL-NEXT:    orr x21, x21, x22
+; GISEL-NEXT:    ldp x24, x23, [sp, #16] ; 16-byte Folded Reload
+; GISEL-NEXT:    csel x21, x21, xzr, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x22, xzr, x19, eq
+; GISEL-NEXT:    cmp x9, #1
+; GISEL-NEXT:    orr x22, x20, x22
+; GISEL-NEXT:    csel x21, x22, x21, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x22, xzr, x6, eq
+; GISEL-NEXT:    cmp x9, #2
+; GISEL-NEXT:    orr x22, x7, x22
+; GISEL-NEXT:    csel x21, x22, x21, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x22, xzr, x3, eq
+; GISEL-NEXT:    cmp x9, #3
+; GISEL-NEXT:    orr x22, x4, x22
+; GISEL-NEXT:    csel x21, x22, x21, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x22, xzr, x17, eq
+; GISEL-NEXT:    cmp x9, #4
+; GISEL-NEXT:    orr x22, x1, x22
+; GISEL-NEXT:    csel x21, x22, x21, eq
+; GISEL-NEXT:    cmp x9, #5
+; GISEL-NEXT:    csel x21, x14, x21, eq
+; GISEL-NEXT:    cmp x9, #6
+; GISEL-NEXT:    csel x21, xzr, x21, eq
+; GISEL-NEXT:    cmp x9, #7
+; GISEL-NEXT:    csel x21, xzr, x21, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x5, x5, x21, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x19, xzr, x19, eq
+; GISEL-NEXT:    cmp x9, #0
+; GISEL-NEXT:    orr x19, x20, x19
+; GISEL-NEXT:    ldp x22, x21, [sp, #32] ; 16-byte Folded Reload
+; GISEL-NEXT:    csel x19, x19, xzr, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x6, eq
+; GISEL-NEXT:    cmp x9, #1
+; GISEL-NEXT:    orr x20, x7, x20
+; GISEL-NEXT:    csel x19, x20, x19, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x3, eq
+; GISEL-NEXT:    cmp x9, #2
+; GISEL-NEXT:    orr x20, x4, x20
+; GISEL-NEXT:    csel x19, x20, x19, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x17, eq
+; GISEL-NEXT:    cmp x9, #3
+; GISEL-NEXT:    orr x20, x1, x20
+; GISEL-NEXT:    csel x19, x20, x19, eq
+; GISEL-NEXT:    cmp x9, #4
+; GISEL-NEXT:    csel x19, x14, x19, eq
+; GISEL-NEXT:    cmp x9, #5
+; GISEL-NEXT:    csel x19, xzr, x19, eq
+; GISEL-NEXT:    cmp x9, #6
+; GISEL-NEXT:    csel x19, xzr, x19, eq
+; GISEL-NEXT:    cmp x9, #7
+; GISEL-NEXT:    csel x19, xzr, x19, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x16, x16, x19, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x6, xzr, x6, eq
+; GISEL-NEXT:    cmp x9, #0
+; GISEL-NEXT:    stp x5, x16, [x0, #16]
+; GISEL-NEXT:    orr x6, x7, x6
+; GISEL-NEXT:    ldp x20, x19, [sp, #48] ; 16-byte Folded Reload
+; GISEL-NEXT:    csel x6, x6, xzr, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x7, xzr, x3, eq
+; GISEL-NEXT:    cmp x9, #1
+; GISEL-NEXT:    orr x7, x4, x7
+; GISEL-NEXT:    csel x6, x7, x6, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x7, xzr, x17, eq
+; GISEL-NEXT:    cmp x9, #2
+; GISEL-NEXT:    orr x7, x1, x7
+; GISEL-NEXT:    csel x6, x7, x6, eq
+; GISEL-NEXT:    cmp x9, #3
+; GISEL-NEXT:    csel x6, x14, x6, eq
+; GISEL-NEXT:    cmp x9, #4
+; GISEL-NEXT:    csel x6, xzr, x6, eq
+; GISEL-NEXT:    cmp x9, #5
+; GISEL-NEXT:    csel x6, xzr, x6, eq
+; GISEL-NEXT:    cmp x9, #6
+; GISEL-NEXT:    csel x6, xzr, x6, eq
+; GISEL-NEXT:    cmp x9, #7
+; GISEL-NEXT:    csel x6, xzr, x6, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x15, x15, x6, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x3, xzr, x3, eq
+; GISEL-NEXT:    cmp x9, #0
+; GISEL-NEXT:    orr x3, x4, x3
+; GISEL-NEXT:    csel x3, x3, xzr, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x4, xzr, x17, eq
+; GISEL-NEXT:    cmp x9, #1
+; GISEL-NEXT:    orr x4, x1, x4
+; GISEL-NEXT:    csel x3, x4, x3, eq
+; GISEL-NEXT:    cmp x9, #2
+; GISEL-NEXT:    csel x3, x14, x3, eq
+; GISEL-NEXT:    cmp x9, #3
+; GISEL-NEXT:    csel x3, xzr, x3, eq
+; GISEL-NEXT:    cmp x9, #4
+; GISEL-NEXT:    csel x3, xzr, x3, eq
+; GISEL-NEXT:    cmp x9, #5
+; GISEL-NEXT:    csel x3, xzr, x3, eq
+; GISEL-NEXT:    cmp x9, #6
+; GISEL-NEXT:    csel x3, xzr, x3, eq
+; GISEL-NEXT:    cmp x9, #7
+; GISEL-NEXT:    csel x3, xzr, x3, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x11, x11, x3, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x17, xzr, x17, eq
+; GISEL-NEXT:    cmp x9, #0
+; GISEL-NEXT:    stp x15, x11, [x0, #32]
+; GISEL-NEXT:    orr x17, x1, x17
+; GISEL-NEXT:    csel x17, x17, xzr, eq
+; GISEL-NEXT:    cmp x9, #1
+; GISEL-NEXT:    csel x17, x14, x17, eq
+; GISEL-NEXT:    cmp x9, #2
+; GISEL-NEXT:    csel x17, xzr, x17, eq
+; GISEL-NEXT:    cmp x9, #3
+; GISEL-NEXT:    csel x17, xzr, x17, eq
+; GISEL-NEXT:    cmp x9, #4
+; GISEL-NEXT:    csel x17, xzr, x17, eq
+; GISEL-NEXT:    cmp x9, #5
+; GISEL-NEXT:    csel x17, xzr, x17, eq
+; GISEL-NEXT:    cmp x9, #6
+; GISEL-NEXT:    csel x17, xzr, x17, eq
+; GISEL-NEXT:    cmp x9, #7
+; GISEL-NEXT:    csel x17, xzr, x17, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x12, x12, x17, eq
+; GISEL-NEXT:    cmp x9, #0
+; GISEL-NEXT:    csel x14, x14, xzr, eq
+; GISEL-NEXT:    cmp x9, #1
+; GISEL-NEXT:    csel x14, xzr, x14, eq
+; GISEL-NEXT:    cmp x9, #2
+; GISEL-NEXT:    csel x14, xzr, x14, eq
+; GISEL-NEXT:    cmp x9, #3
+; GISEL-NEXT:    csel x13, xzr, x14, eq
+; GISEL-NEXT:    cmp x9, #4
+; GISEL-NEXT:    csel x13, xzr, x13, eq
+; GISEL-NEXT:    cmp x9, #5
+; GISEL-NEXT:    csel x13, xzr, x13, eq
+; GISEL-NEXT:    cmp x9, #6
+; GISEL-NEXT:    csel x13, xzr, x13, eq
+; GISEL-NEXT:    cmp x9, #7
+; GISEL-NEXT:    csel x9, xzr, x13, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x8, x10, x9, eq
+; GISEL-NEXT:    stp x12, x8, [x0, #48]
+; GISEL-NEXT:    ldp x26, x25, [sp], #64 ; 16-byte Folded Reload
+; GISEL-NEXT:    ret
+entry:
+  %input_val = load i512, ptr %input, align 64
+  %shift_ext = zext i32 %shift to i512
+  %shifted = lshr i512 %input_val, %shift_ext
+  store i512 %shifted, ptr %result, align 64
+  ret void
+}
+
+define void @test_ashr_i512(ptr %result, ptr %input, i32 %shift) {
+; SDAG-LABEL: test_ashr_i512:
+; SDAG:       ; %bb.0: ; %entry
+; SDAG-NEXT:    sub sp, sp, #128
+; SDAG-NEXT:    .cfi_def_cfa_offset 128
+; SDAG-NEXT:    ldp x9, x8, [x1, #48]
+; SDAG-NEXT:    mov x11, sp
+; SDAG-NEXT:    ldp q0, q1, [x1]
+; SDAG-NEXT:    ldr q2, [x1, #32]
+; SDAG-NEXT:    stp x9, x8, [sp, #48]
+; SDAG-NEXT:    asr x9, x8, #63
+; SDAG-NEXT:    mov w8, w2
+; SDAG-NEXT:    lsr x10, x8, #3
+; SDAG-NEXT:    stp q1, q2, [sp, #16]
+; SDAG-NEXT:    and x3, x8, #0x3f
+; SDAG-NEXT:    str q0, [sp]
+; SDAG-NEXT:    eor x3, x3, #0x3f
+; SDAG-NEXT:    and x10, x10, #0x38
+; SDAG-NEXT:    stp x9, x9, [sp, #112]
+; SDAG-NEXT:    stp x9, x9, [sp, #96]
+; SDAG-NEXT:    add x10, x11, x10
+; SDAG-NEXT:    mvn w11, w2
+; SDAG-NEXT:    stp x9, x9, [sp, #80]
+; SDAG-NEXT:    stp x9, x9, [sp, #64]
+; SDAG-NEXT:    ldp x13, x16, [x10, #48]
+; SDAG-NEXT:    ldp x9, x14, [x10, #16]
+; SDAG-NEXT:    ldp x12, x17, [x10, #32]
+; SDAG-NEXT:    lsl x4, x16, #1
+; SDAG-NEXT:    lsl x2, x13, #1
+; SDAG-NEXT:    lsr x13, x13, x8
+; SDAG-NEXT:    lsl x15, x9, #1
+; SDAG-NEXT:    asr x16, x16, x8
+; SDAG-NEXT:    lsr x9, x9, x8
+; SDAG-NEXT:    lsl x1, x12, #1
+; SDAG-NEXT:    lsl x4, x4, x3
+; SDAG-NEXT:    lsr x12, x12, x8
+; SDAG-NEXT:    lsl x15, x15, x11
+; SDAG-NEXT:    lsl x1, x1, x11
+; SDAG-NEXT:    lsl x11, x2, x11
+; SDAG-NEXT:    lsl x2, x17, #1
+; SDAG-NEXT:    orr x13, x4, x13
+; SDAG-NEXT:    ldp x10, x4, [x10]
+; SDAG-NEXT:    lsr x17, x17, x8
+; SDAG-NEXT:    lsl x2, x2, x3
+; SDAG-NEXT:    stp x13, x16, [x0, #48]
+; SDAG-NEXT:    lsl x16, x14, #1
+; SDAG-NEXT:    lsr x14, x14, x8
+; SDAG-NEXT:    lsl x13, x4, #1
+; SDAG-NEXT:    orr x11, x17, x11
+; SDAG-NEXT:    orr x12, x2, x12
+; SDAG-NEXT:    lsl x16, x16, x3
+; SDAG-NEXT:    lsr x10, x10, x8
+; SDAG-NEXT:    stp x12, x11, [x0, #32]
+; SDAG-NEXT:    lsl x12, x13, x3
+; SDAG-NEXT:    lsr x8, x4, x8
+; SDAG-NEXT:    orr x11, x14, x1
+; SDAG-NEXT:    orr x9, x16, x9
+; SDAG-NEXT:    stp x9, x11, [x0, #16]
+; SDAG-NEXT:    orr x9, x12, x10
+; SDAG-NEXT:    orr x8, x8, x15
+; SDAG-NEXT:    stp x9, x8, [x0]
+; SDAG-NEXT:    add sp, sp, #128
+; SDAG-NEXT:    ret
+;
+; GISEL-LABEL: test_ashr_i512:
+; GISEL:       ; %bb.0: ; %entry
+; GISEL-NEXT:    stp x28, x27, [sp, #-80]! ; 16-byte Folded Spill
+; GISEL-NEXT:    stp x26, x25, [sp, #16] ; 16-byte Folded Spill
+; GISEL-NEXT:    stp x24, x23, [sp, #32] ; 16-byte Folded Spill
+; GISEL-NEXT:    stp x22, x21, [sp, #48] ; 16-byte Folded Spill
+; GISEL-NEXT:    stp x20, x19, [sp, #64] ; 16-byte Folded Spill
+; GISEL-NEXT:    .cfi_def_cfa_offset 80
+; GISEL-NEXT:    .cfi_offset w19, -8
+; GISEL-NEXT:    .cfi_offset w20, -16
+; GISEL-NEXT:    .cfi_offset w21, -24
+; GISEL-NEXT:    .cfi_offset w22, -32
+; GISEL-NEXT:    .cfi_offset w23, -40
+; GISEL-NEXT:    .cfi_offset w24, -48
+; GISEL-NEXT:    .cfi_offset w25, -56
+; GISEL-NEXT:    .cfi_offset w26, -64
+; GISEL-NEXT:    .cfi_offset w27, -72
+; GISEL-NEXT:    .cfi_offset w28, -80
+; GISEL-NEXT:    mov w8, w2
+; GISEL-NEXT:    ldp x14, x4, [x1]
+; GISEL-NEXT:    mov w9, #64 ; =0x40
+; GISEL-NEXT:    and x16, x8, #0x3f
+; GISEL-NEXT:    lsr x10, x8, #6
+; GISEL-NEXT:    sub x15, x9, x16
+; GISEL-NEXT:    ldr x9, [x1, #56]
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    lsl x12, x4, x15
+; GISEL-NEXT:    ldp x7, x3, [x1, #16]
+; GISEL-NEXT:    lsr x13, x14, x16
+; GISEL-NEXT:    asr x11, x9, #63
+; GISEL-NEXT:    lsr x26, x4, x16
+; GISEL-NEXT:    csel x12, xzr, x12, eq
+; GISEL-NEXT:    cmp x10, #0
+; GISEL-NEXT:    lsl x25, x7, x15
+; GISEL-NEXT:    orr x12, x13, x12
+; GISEL-NEXT:    lsl x23, x3, x15
+; GISEL-NEXT:    csel x12, x12, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    lsr x24, x7, x16
+; GISEL-NEXT:    csel x13, xzr, x25, eq
+; GISEL-NEXT:    cmp x10, #1
+; GISEL-NEXT:    lsr x22, x3, x16
+; GISEL-NEXT:    orr x13, x26, x13
+; GISEL-NEXT:    csel x12, x13, x12, eq
+; GISEL-NEXT:    ldp x17, x13, [x1, #32]
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x2, xzr, x23, eq
+; GISEL-NEXT:    cmp x10, #2
+; GISEL-NEXT:    orr x2, x24, x2
+; GISEL-NEXT:    lsl x21, x17, x15
+; GISEL-NEXT:    lsl x19, x13, x15
+; GISEL-NEXT:    csel x2, x2, x12, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    ldr x12, [x1, #48]
+; GISEL-NEXT:    csel x1, xzr, x21, eq
+; GISEL-NEXT:    cmp x10, #3
+; GISEL-NEXT:    lsr x20, x17, x16
+; GISEL-NEXT:    orr x1, x22, x1
+; GISEL-NEXT:    lsl x5, x12, x15
+; GISEL-NEXT:    lsr x6, x13, x16
+; GISEL-NEXT:    csel x1, x1, x2, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x2, xzr, x19, eq
+; GISEL-NEXT:    cmp x10, #4
+; GISEL-NEXT:    orr x2, x20, x2
+; GISEL-NEXT:    csel x2, x2, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x1, xzr, x5, eq
+; GISEL-NEXT:    cmp x10, #5
+; GISEL-NEXT:    orr x27, x6, x1
+; GISEL-NEXT:    lsl x1, x9, x15
+; GISEL-NEXT:    lsl x15, x11, x15
+; GISEL-NEXT:    csel x27, x27, x2, eq
+; GISEL-NEXT:    lsr x2, x12, x16
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x28, xzr, x1, eq
+; GISEL-NEXT:    cmp x10, #6
+; GISEL-NEXT:    lsr x16, x9, x16
+; GISEL-NEXT:    orr x28, x2, x28
+; GISEL-NEXT:    csel x27, x28, x27, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x28, xzr, x15, eq
+; GISEL-NEXT:    cmp x10, #7
+; GISEL-NEXT:    orr x28, x16, x28
+; GISEL-NEXT:    csel x27, x28, x27, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x14, x14, x27, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x25, xzr, x25, eq
+; GISEL-NEXT:    cmp x10, #0
+; GISEL-NEXT:    orr x25, x26, x25
+; GISEL-NEXT:    csel x25, x25, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x26, xzr, x23, eq
+; GISEL-NEXT:    cmp x10, #1
+; GISEL-NEXT:    orr x26, x24, x26
+; GISEL-NEXT:    csel x25, x26, x25, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x26, xzr, x21, eq
+; GISEL-NEXT:    cmp x10, #2
+; GISEL-NEXT:    orr x26, x22, x26
+; GISEL-NEXT:    csel x25, x26, x25, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x26, xzr, x19, eq
+; GISEL-NEXT:    cmp x10, #3
+; GISEL-NEXT:    orr x26, x20, x26
+; GISEL-NEXT:    csel x25, x26, x25, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x26, xzr, x5, eq
+; GISEL-NEXT:    cmp x10, #4
+; GISEL-NEXT:    orr x26, x6, x26
+; GISEL-NEXT:    csel x25, x26, x25, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x26, xzr, x1, eq
+; GISEL-NEXT:    cmp x10, #5
+; GISEL-NEXT:    orr x26, x2, x26
+; GISEL-NEXT:    csel x25, x26, x25, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x26, xzr, x15, eq
+; GISEL-NEXT:    cmp x10, #6
+; GISEL-NEXT:    orr x26, x16, x26
+; GISEL-NEXT:    csel x25, x26, x25, eq
+; GISEL-NEXT:    cmp x10, #7
+; GISEL-NEXT:    csel x25, x11, x25, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x4, x4, x25, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x23, xzr, x23, eq
+; GISEL-NEXT:    cmp x10, #0
+; GISEL-NEXT:    stp x14, x4, [x0]
+; GISEL-NEXT:    orr x23, x24, x23
+; GISEL-NEXT:    ldp x26, x25, [sp, #16] ; 16-byte Folded Reload
+; GISEL-NEXT:    csel x23, x23, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x24, xzr, x21, eq
+; GISEL-NEXT:    cmp x10, #1
+; GISEL-NEXT:    orr x24, x22, x24
+; GISEL-NEXT:    csel x23, x24, x23, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x24, xzr, x19, eq
+; GISEL-NEXT:    cmp x10, #2
+; GISEL-NEXT:    orr x24, x20, x24
+; GISEL-NEXT:    csel x23, x24, x23, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x24, xzr, x5, eq
+; GISEL-NEXT:    cmp x10, #3
+; GISEL-NEXT:    orr x24, x6, x24
+; GISEL-NEXT:    csel x23, x24, x23, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x24, xzr, x1, eq
+; GISEL-NEXT:    cmp x10, #4
+; GISEL-NEXT:    orr x24, x2, x24
+; GISEL-NEXT:    csel x23, x24, x23, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x24, xzr, x15, eq
+; GISEL-NEXT:    cmp x10, #5
+; GISEL-NEXT:    orr x24, x16, x24
+; GISEL-NEXT:    csel x23, x24, x23, eq
+; GISEL-NEXT:    cmp x10, #6
+; GISEL-NEXT:    csel x23, x11, x23, eq
+; GISEL-NEXT:    cmp x10, #7
+; GISEL-NEXT:    csel x23, x11, x23, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x7, x7, x23, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x21, xzr, x21, eq
+; GISEL-NEXT:    cmp x10, #0
+; GISEL-NEXT:    orr x21, x22, x21
+; GISEL-NEXT:    ldp x24, x23, [sp, #32] ; 16-byte Folded Reload
+; GISEL-NEXT:    csel x21, x21, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x22, xzr, x19, eq
+; GISEL-NEXT:    cmp x10, #1
+; GISEL-NEXT:    orr x22, x20, x22
+; GISEL-NEXT:    csel x21, x22, x21, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x22, xzr, x5, eq
+; GISEL-NEXT:    cmp x10, #2
+; GISEL-NEXT:    orr x22, x6, x22
+; GISEL-NEXT:    csel x21, x22, x21, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x22, xzr, x1, eq
+; GISEL-NEXT:    cmp x10, #3
+; GISEL-NEXT:    orr x22, x2, x22
+; GISEL-NEXT:    csel x21, x22, x21, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x22, xzr, x15, eq
+; GISEL-NEXT:    cmp x10, #4
+; GISEL-NEXT:    orr x22, x16, x22
+; GISEL-NEXT:    csel x21, x22, x21, eq
+; GISEL-NEXT:    cmp x10, #5
+; GISEL-NEXT:    csel x21, x11, x21, eq
+; GISEL-NEXT:    cmp x10, #6
+; GISEL-NEXT:    csel x21, x11, x21, eq
+; GISEL-NEXT:    cmp x10, #7
+; GISEL-NEXT:    csel x21, x11, x21, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x3, x3, x21, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x19, xzr, x19, eq
+; GISEL-NEXT:    cmp x10, #0
+; GISEL-NEXT:    stp x7, x3, [x0, #16]
+; GISEL-NEXT:    orr x19, x20, x19
+; GISEL-NEXT:    ldp x22, x21, [sp, #48] ; 16-byte Folded Reload
+; GISEL-NEXT:    csel x19, x19, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x5, eq
+; GISEL-NEXT:    cmp x10, #1
+; GISEL-NEXT:    orr x20, x6, x20
+; GISEL-NEXT:    csel x19, x20, x19, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x1, eq
+; GISEL-NEXT:    cmp x10, #2
+; GISEL-NEXT:    orr x20, x2, x20
+; GISEL-NEXT:    csel x19, x20, x19, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x15, eq
+; GISEL-NEXT:    cmp x10, #3
+; GISEL-NEXT:    orr x20, x16, x20
+; GISEL-NEXT:    csel x19, x20, x19, eq
+; GISEL-NEXT:    cmp x10, #4
+; GISEL-NEXT:    csel x19, x11, x19, eq
+; GISEL-NEXT:    cmp x10, #5
+; GISEL-NEXT:    csel x19, x11, x19, eq
+; GISEL-NEXT:    cmp x10, #6
+; GISEL-NEXT:    csel x19, x11, x19, eq
+; GISEL-NEXT:    cmp x10, #7
+; GISEL-NEXT:    csel x19, x11, x19, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x17, x17, x19, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x5, xzr, x5, eq
+; GISEL-NEXT:    cmp x10, #0
+; GISEL-NEXT:    orr x5, x6, x5
+; GISEL-NEXT:    ldp x20, x19, [sp, #64] ; 16-byte Folded Reload
+; GISEL-NEXT:    csel x5, x5, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x6, xzr, x1, eq
+; GISEL-NEXT:    cmp x10, #1
+; GISEL-NEXT:    orr x6, x2, x6
+; GISEL-NEXT:    csel x5, x6, x5, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x6, xzr, x15, eq
+; GISEL-NEXT:    cmp x10, #2
+; GISEL-NEXT:    orr x6, x16, x6
+; GISEL-NEXT:    csel x5, x6, x5, eq
+; GISEL-NEXT:    cmp x10, #3
+; GISEL-NEXT:    csel x5, x11, x5, eq
+; GISEL-NEXT:    cmp x10, #4
+; GISEL-NEXT:    csel x5, x11, x5, eq
+; GISEL-NEXT:    cmp x10, #5
+; GISEL-NEXT:    csel x5, x11, x5, eq
+; GISEL-NEXT:    cmp x10, #6
+; GISEL-NEXT:    csel x5, x11, x5, eq
+; GISEL-NEXT:    cmp x10, #7
+; GISEL-NEXT:    csel x5, x11, x5, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x13, x13, x5, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x1, xzr, x1, eq
+; GISEL-NEXT:    cmp x10, #0
+; GISEL-NEXT:    stp x17, x13, [x0, #32]
+; GISEL-NEXT:    orr x1, x2, x1
+; GISEL-NEXT:    csel x1, x1, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x2, xzr, x15, eq
+; GISEL-NEXT:    cmp x10, #1
+; GISEL-NEXT:    orr x2, x16, x2
+; GISEL-NEXT:    csel x1, x2, x1, eq
+; GISEL-NEXT:    cmp x10, #2
+; GISEL-NEXT:    csel x1, x11, x1, eq
+; GISEL-NEXT:    cmp x10, #3
+; GISEL-NEXT:    csel x1, x11, x1, eq
+; GISEL-NEXT:    cmp x10, #4
+; GISEL-NEXT:    csel x1, x11, x1, eq
+; GISEL-NEXT:    cmp x10, #5
+; GISEL-NEXT:    csel x1, x11, x1, eq
+; GISEL-NEXT:    cmp x10, #6
+; GISEL-NEXT:    csel x1, x11, x1, eq
+; GISEL-NEXT:    cmp x10, #7
+; GISEL-NEXT:    csel x1, x11, x1, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x12, x12, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x15, xzr, x15, eq
+; GISEL-NEXT:    cmp x10, #0
+; GISEL-NEXT:    orr x15, x16, x15
+; GISEL-NEXT:    csel x15, x15, x11, eq
+; GISEL-NEXT:    cmp x10, #1
+; GISEL-NEXT:    csel x15, x11, x15, eq
+; GISEL-NEXT:    cmp x10, #2
+; GISEL-NEXT:    csel x15, x11, x15, eq
+; GISEL-NEXT:    cmp x10, #3
+; GISEL-NEXT:    csel x14, x11, x15, eq
+; GISEL-NEXT:    cmp x10, #4
+; GISEL-NEXT:    csel x14, x11, x14, eq
+; GISEL-NEXT:    cmp x10, #5
+; GISEL-NEXT:    csel x14, x11, x14, eq
+; GISEL-NEXT:    cmp x10, #6
+; GISEL-NEXT:    csel x14, x11, x14, eq
+; GISEL-NEXT:    cmp x10, #7
+; GISEL-NEXT:    csel x10, x11, x14, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x8, x9, x10, eq
+; GISEL-NEXT:    stp x12, x8, [x0, #48]
+; GISEL-NEXT:    ldp x28, x27, [sp], #80 ; 16-byte Folded Reload
+; GISEL-NEXT:    ret
+entry:
+  %input_val = load i512, ptr %input, align 64
+  %shift_ext = zext i32 %shift to i512
+  %shifted = ashr i512 %input_val, %shift_ext
+  store i512 %shifted, ptr %result, align 64
+  ret void
+}
+
+; i1024 shift functions
+define void @test_shl_i1024(ptr %result, ptr %input, i32 %shift) {
+; SDAG-LABEL: test_shl_i1024:
+; SDAG:       ; %bb.0: ; %entry
+; SDAG-NEXT:    sub sp, sp, #352
+; SDAG-NEXT:    stp x28, x27, [sp, #256] ; 16-byte Folded Spill
+; SDAG-NEXT:    stp x26, x25, [sp, #272] ; 16-byte Folded Spill
+; SDAG-NEXT:    stp x24, x23, [sp, #288] ; 16-byte Folded Spill
+; SDAG-NEXT:    stp x22, x21, [sp, #304] ; 16-byte Folded Spill
+; SDAG-NEXT:    stp x20, x19, [sp, #320] ; 16-byte Folded Spill
+; SDAG-NEXT:    stp x29, x30, [sp, #336] ; 16-byte Folded Spill
+; SDAG-NEXT:    .cfi_def_cfa_offset 352
+; SDAG-NEXT:    .cfi_offset w30, -8
+; SDAG-NEXT:    .cfi_offset w29, -16
+; SDAG-NEXT:    .cfi_offset w19, -24
+; SDAG-NEXT:    .cfi_offset w20, -32
+; SDAG-NEXT:    .cfi_offset w21, -40
+; SDAG-NEXT:    .cfi_offset w22, -48
+; SDAG-NEXT:    .cfi_offset w23, -56
+; SDAG-NEXT:    .cfi_offset w24, -64
+; SDAG-NEXT:    .cfi_offset w25, -72
+; SDAG-NEXT:    .cfi_offset w26, -80
+; SDAG-NEXT:    .cfi_offset w27, -88
+; SDAG-NEXT:    .cfi_offset w28, -96
+; SDAG-NEXT:    ldp x8, x9, [x1, #112]
+; SDAG-NEXT:    movi.2d v0, #0000000000000000
+; SDAG-NEXT:    ldp q1, q2, [x1]
+; SDAG-NEXT:    mov x10, sp
+; SDAG-NEXT:    ldp q3, q4, [x1, #32]
+; SDAG-NEXT:    add x10, x10, #128
+; SDAG-NEXT:    ldp q5, q6, [x1, #64]
+; SDAG-NEXT:    mvn w4, w2
+; SDAG-NEXT:    ldr q7, [x1, #96]
+; SDAG-NEXT:    stp x8, x9, [sp, #240]
+; SDAG-NEXT:    mov w8, w2
+; SDAG-NEXT:    lsr x9, x8, #3
+; SDAG-NEXT:    stp q0, q0, [sp]
+; SDAG-NEXT:    stp q0, q0, [sp, #32]
+; SDAG-NEXT:    ldp x29, x30, [sp, #336] ; 16-byte Folded Reload
+; SDAG-NEXT:    and x9, x9, #0x78
+; SDAG-NEXT:    stp q0, q0, [sp, #64]
+; SDAG-NEXT:    stp q0, q0, [sp, #96]
+; SDAG-NEXT:    sub x1, x10, x9
+; SDAG-NEXT:    and x10, x8, #0x3f
+; SDAG-NEXT:    stp q2, q3, [sp, #144]
+; SDAG-NEXT:    eor x10, x10, #0x3f
+; SDAG-NEXT:    stp q4, q5, [sp, #176]
+; SDAG-NEXT:    stp q6, q7, [sp, #208]
+; SDAG-NEXT:    str q1, [sp, #128]
+; SDAG-NEXT:    ldp x6, x19, [x1, #64]
+; SDAG-NEXT:    ldr x26, [x1, #96]
+; SDAG-NEXT:    ldp x22, x23, [x1, #80]
+; SDAG-NEXT:    ldp x27, x24, [x1, #104]
+; SDAG-NEXT:    lsr x20, x6, #1
+; SDAG-NEXT:    lsr x21, x19, #1
+; SDAG-NEXT:    lsl x19, x19, x8
+; SDAG-NEXT:    ldp x9, x13, [x1]
+; SDAG-NEXT:    lsl x25, x22, x8
+; SDAG-NEXT:    lsr x20, x20, x10
+; SDAG-NEXT:    ldp x11, x14, [x1, #16]
+; SDAG-NEXT:    ldp x12, x15, [x1, #32]
+; SDAG-NEXT:    lsr x21, x21, x4
+; SDAG-NEXT:    ldp x17, x2, [x1, #48]
+; SDAG-NEXT:    orr x19, x19, x20
+; SDAG-NEXT:    ldr x1, [x1, #120]
+; SDAG-NEXT:    lsr x20, x24, #1
+; SDAG-NEXT:    lsr x16, x13, #1
+; SDAG-NEXT:    lsr x3, x14, #1
+; SDAG-NEXT:    lsr x5, x15, #1
+; SDAG-NEXT:    orr x21, x25, x21
+; SDAG-NEXT:    lsr x7, x2, #1
+; SDAG-NEXT:    lsr x25, x23, #1
+; SDAG-NEXT:    lsr x28, x27, #1
+; SDAG-NEXT:    lsl x1, x1, x8
+; SDAG-NEXT:    lsr x20, x20, x10
+; SDAG-NEXT:    lsr x16, x16, x4
+; SDAG-NEXT:    lsr x3, x3, x4
+; SDAG-NEXT:    lsr x5, x5, x4
+; SDAG-NEXT:    lsr x7, x7, x4
+; SDAG-NEXT:    lsr x22, x22, #1
+; SDAG-NEXT:    lsr x25, x25, x4
+; SDAG-NEXT:    lsr x4, x28, x4
+; SDAG-NEXT:    orr x1, x1, x20
+; SDAG-NEXT:    lsl x20, x23, x8
+; SDAG-NEXT:    lsl x23, x24, x8
+; SDAG-NEXT:    lsr x28, x26, #1
+; SDAG-NEXT:    lsr x22, x22, x10
+; SDAG-NEXT:    lsl x24, x27, x8
+; SDAG-NEXT:    orr x4, x23, x4
+; SDAG-NEXT:    lsl x6, x6, x8
+; SDAG-NEXT:    lsl x2, x2, x8
+; SDAG-NEXT:    lsr x27, x28, x10
+; SDAG-NEXT:    stp x4, x1, [x0, #112]
+; SDAG-NEXT:    lsl x1, x26, x8
+; SDAG-NEXT:    orr x20, x20, x22
+; SDAG-NEXT:    lsr x4, x9, #1
+; SDAG-NEXT:    lsl x13, x13, x8
+; SDAG-NEXT:    orr x22, x24, x27
+; SDAG-NEXT:    orr x1, x1, x25
+; SDAG-NEXT:    stp x21, x20, [x0, #80]
+; SDAG-NEXT:    lsr x20, x17, #1
+; SDAG-NEXT:    stp x1, x22, [x0, #96]
+; SDAG-NEXT:    lsr x1, x11, #1
+; SDAG-NEXT:    lsr x21, x12, #1
+; SDAG-NEXT:    lsl x14, x14, x8
+; SDAG-NEXT:    lsl x15, x15, x8
+; SDAG-NEXT:    lsr x20, x20, x10
+; SDAG-NEXT:    lsl x17, x17, x8
+; SDAG-NEXT:    orr x6, x6, x7
+; SDAG-NEXT:    lsr x7, x21, x10
+; SDAG-NEXT:    lsl x12, x12, x8
+; SDAG-NEXT:    lsr x1, x1, x10
+; SDAG-NEXT:    lsl x11, x11, x8
+; SDAG-NEXT:    lsr x10, x4, x10
+; SDAG-NEXT:    stp x6, x19, [x0, #64]
+; SDAG-NEXT:    orr x2, x2, x20
+; SDAG-NEXT:    lsl x8, x9, x8
+; SDAG-NEXT:    orr x17, x17, x5
+; SDAG-NEXT:    ldp x20, x19, [sp, #320] ; 16-byte Folded Reload
+; SDAG-NEXT:    orr x15, x15, x7
+; SDAG-NEXT:    ldp x22, x21, [sp, #304] ; 16-byte Folded Reload
+; SDAG-NEXT:    orr x12, x12, x3
+; SDAG-NEXT:    ldp x24, x23, [sp, #288] ; 16-byte Folded Reload
+; SDAG-NEXT:    orr x14, x14, x1
+; SDAG-NEXT:    ldp x26, x25, [sp, #272] ; 16-byte Folded Reload
+; SDAG-NEXT:    orr x11, x11, x16
+; SDAG-NEXT:    ldp x28, x27, [sp, #256] ; 16-byte Folded Reload
+; SDAG-NEXT:    orr x9, x13, x10
+; SDAG-NEXT:    stp x17, x2, [x0, #48]
+; SDAG-NEXT:    stp x12, x15, [x0, #32]
+; SDAG-NEXT:    stp x11, x14, [x0, #16]
+; SDAG-NEXT:    stp x8, x9, [x0]
+; SDAG-NEXT:    add sp, sp, #352
+; SDAG-NEXT:    ret
+;
+; GISEL-LABEL: test_shl_i1024:
+; GISEL:       ; %bb.0: ; %entry
+; GISEL-NEXT:    sub sp, sp, #416
+; GISEL-NEXT:    stp x28, x27, [sp, #320] ; 16-byte Folded Spill
+; GISEL-NEXT:    stp x26, x25, [sp, #336] ; 16-byte Folded Spill
+; GISEL-NEXT:    stp x24, x23, [sp, #352] ; 16-byte Folded Spill
+; GISEL-NEXT:    stp x22, x21, [sp, #368] ; 16-byte Folded Spill
+; GISEL-NEXT:    stp x20, x19, [sp, #384] ; 16-byte Folded Spill
+; GISEL-NEXT:    stp x29, x30, [sp, #400] ; 16-byte Folded Spill
+; GISEL-NEXT:    .cfi_def_cfa_offset 416
+; GISEL-NEXT:    .cfi_offset w30, -8
+; GISEL-NEXT:    .cfi_offset w29, -16
+; GISEL-NEXT:    .cfi_offset w19, -24
+; GISEL-NEXT:    .cfi_offset w20, -32
+; GISEL-NEXT:    .cfi_offset w21, -40
+; GISEL-NEXT:    .cfi_offset w22, -48
+; GISEL-NEXT:    .cfi_offset w23, -56
+; GISEL-NEXT:    .cfi_offset w24, -64
+; GISEL-NEXT:    .cfi_offset w25, -72
+; GISEL-NEXT:    .cfi_offset w26, -80
+; GISEL-NEXT:    .cfi_offset w27, -88
+; GISEL-NEXT:    .cfi_offset w28, -96
+; GISEL-NEXT:    ldp x10, x11, [x1]
+; GISEL-NEXT:    mov w8, w2
+; GISEL-NEXT:    lsr x9, x8, #6
+; GISEL-NEXT:    and x16, x8, #0x3f
+; GISEL-NEXT:    mov w13, #64 ; =0x40
+; GISEL-NEXT:    sub x21, x13, x16
+; GISEL-NEXT:    str x0, [sp, #112] ; 8-byte Folded Spill
+; GISEL-NEXT:    mov x24, x16
+; GISEL-NEXT:    lsl x25, x10, x16
+; GISEL-NEXT:    cmp x9, #0
+; GISEL-NEXT:    lsr x26, x10, x21
+; GISEL-NEXT:    lsl x2, x11, x16
+; GISEL-NEXT:    lsr x23, x11, x21
+; GISEL-NEXT:    mov x22, x21
+; GISEL-NEXT:    csel x12, x25, xzr, eq
+; GISEL-NEXT:    cmp x9, #1
+; GISEL-NEXT:    str x1, [sp, #312] ; 8-byte Folded Spill
+; GISEL-NEXT:    csel x12, xzr, x12, eq
+; GISEL-NEXT:    cmp x9, #2
+; GISEL-NEXT:    str x23, [sp, #208] ; 8-byte Folded Spill
+; GISEL-NEXT:    csel x12, xzr, x12, eq
+; GISEL-NEXT:    cmp x9, #3
+; GISEL-NEXT:    stp x24, x22, [sp, #40] ; 16-byte Folded Spill
+; GISEL-NEXT:    csel x12, xzr, x12, eq
+; GISEL-NEXT:    cmp x9, #4
+; GISEL-NEXT:    csel x12, xzr, x12, eq
+; GISEL-NEXT:    cmp x9, #5
+; GISEL-NEXT:    csel x12, xzr, x12, eq
+; GISEL-NEXT:    cmp x9, #6
+; GISEL-NEXT:    csel x12, xzr, x12, eq
+; GISEL-NEXT:    cmp x9, #7
+; GISEL-NEXT:    csel x12, xzr, x12, eq
+; GISEL-NEXT:    cmp x9, #8
+; GISEL-NEXT:    csel x12, xzr, x12, eq
+; GISEL-NEXT:    cmp x9, #9
+; GISEL-NEXT:    csel x12, xzr, x12, eq
+; GISEL-NEXT:    cmp x9, #10
+; GISEL-NEXT:    csel x12, xzr, x12, eq
+; GISEL-NEXT:    cmp x9, #11
+; GISEL-NEXT:    csel x12, xzr, x12, eq
+; GISEL-NEXT:    cmp x9, #12
+; GISEL-NEXT:    csel x12, xzr, x12, eq
+; GISEL-NEXT:    cmp x9, #13
+; GISEL-NEXT:    csel x12, xzr, x12, eq
+; GISEL-NEXT:    cmp x9, #14
+; GISEL-NEXT:    csel x12, xzr, x12, eq
+; GISEL-NEXT:    cmp x9, #15
+; GISEL-NEXT:    csel x12, xzr, x12, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x10, x10, x12, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    str x10, [sp, #192] ; 8-byte Folded Spill
+; GISEL-NEXT:    csel x10, xzr, x26, eq
+; GISEL-NEXT:    cmp x9, #0
+; GISEL-NEXT:    orr x10, x2, x10
+; GISEL-NEXT:    csel x10, x10, xzr, eq
+; GISEL-NEXT:    cmp x9, #1
+; GISEL-NEXT:    csel x10, x25, x10, eq
+; GISEL-NEXT:    cmp x9, #2
+; GISEL-NEXT:    csel x10, xzr, x10, eq
+; GISEL-NEXT:    cmp x9, #3
+; GISEL-NEXT:    csel x10, xzr, x10, eq
+; GISEL-NEXT:    cmp x9, #4
+; GISEL-NEXT:    csel x10, xzr, x10, eq
+; GISEL-NEXT:    cmp x9, #5
+; GISEL-NEXT:    csel x10, xzr, x10, eq
+; GISEL-NEXT:    cmp x9, #6
+; GISEL-NEXT:    csel x10, xzr, x10, eq
+; GISEL-NEXT:    cmp x9, #7
+; GISEL-NEXT:    csel x10, xzr, x10, eq
+; GISEL-NEXT:    cmp x9, #8
+; GISEL-NEXT:    csel x10, xzr, x10, eq
+; GISEL-NEXT:    cmp x9, #9
+; GISEL-NEXT:    csel x10, xzr, x10, eq
+; GISEL-NEXT:    cmp x9, #10
+; GISEL-NEXT:    csel x10, xzr, x10, eq
+; GISEL-NEXT:    cmp x9, #11
+; GISEL-NEXT:    csel x10, xzr, x10, eq
+; GISEL-NEXT:    cmp x9, #12
+; GISEL-NEXT:    csel x10, xzr, x10, eq
+; GISEL-NEXT:    cmp x9, #13
+; GISEL-NEXT:    csel x13, xzr, x10, eq
+; GISEL-NEXT:    cmp x9, #14
+; GISEL-NEXT:    ldp x12, x10, [x1, #16]
+; GISEL-NEXT:    csel x13, xzr, x13, eq
+; GISEL-NEXT:    cmp x9, #15
+; GISEL-NEXT:    csel x13, xzr, x13, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    lsl x20, x12, x16
+; GISEL-NEXT:    csel x11, x11, x13, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    str x11, [sp, #184] ; 8-byte Folded Spill
+; GISEL-NEXT:    csel x11, xzr, x23, eq
+; GISEL-NEXT:    cmp x9, #0
+; GISEL-NEXT:    orr x11, x20, x11
+; GISEL-NEXT:    lsr x15, x12, x21
+; GISEL-NEXT:    lsl x14, x10, x16
+; GISEL-NEXT:    csel x11, x11, xzr, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    lsr x17, x10, x21
+; GISEL-NEXT:    csel x13, xzr, x26, eq
+; GISEL-NEXT:    cmp x9, #1
+; GISEL-NEXT:    str x20, [sp, #8] ; 8-byte Folded Spill
+; GISEL-NEXT:    orr x13, x2, x13
+; GISEL-NEXT:    csel x11, x13, x11, eq
+; GISEL-NEXT:    cmp x9, #2
+; GISEL-NEXT:    csel x11, x25, x11, eq
+; GISEL-NEXT:    cmp x9, #3
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #4
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #5
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #6
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #7
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #8
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #9
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #10
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #11
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #12
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #13
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #14
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #15
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x11, x12, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    str x11, [sp, #176] ; 8-byte Folded Spill
+; GISEL-NEXT:    csel x11, xzr, x15, eq
+; GISEL-NEXT:    cmp x9, #0
+; GISEL-NEXT:    orr x11, x14, x11
+; GISEL-NEXT:    csel x11, x11, xzr, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x12, xzr, x23, eq
+; GISEL-NEXT:    cmp x9, #1
+; GISEL-NEXT:    orr x12, x20, x12
+; GISEL-NEXT:    csel x11, x12, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x12, xzr, x26, eq
+; GISEL-NEXT:    cmp x9, #2
+; GISEL-NEXT:    orr x12, x2, x12
+; GISEL-NEXT:    csel x11, x12, x11, eq
+; GISEL-NEXT:    cmp x9, #3
+; GISEL-NEXT:    csel x11, x25, x11, eq
+; GISEL-NEXT:    cmp x9, #4
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #5
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #6
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #7
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #8
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #9
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #10
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #11
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #12
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #13
+; GISEL-NEXT:    csel x13, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #14
+; GISEL-NEXT:    ldp x12, x11, [x1, #32]
+; GISEL-NEXT:    csel x13, xzr, x13, eq
+; GISEL-NEXT:    cmp x9, #15
+; GISEL-NEXT:    csel x13, xzr, x13, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    lsl x0, x12, x16
+; GISEL-NEXT:    csel x10, x10, x13, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    str x10, [sp, #168] ; 8-byte Folded Spill
+; GISEL-NEXT:    csel x10, xzr, x17, eq
+; GISEL-NEXT:    cmp x9, #0
+; GISEL-NEXT:    orr x10, x0, x10
+; GISEL-NEXT:    lsr x27, x12, x21
+; GISEL-NEXT:    lsl x19, x11, x16
+; GISEL-NEXT:    csel x10, x10, xzr, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    lsr x3, x11, x21
+; GISEL-NEXT:    csel x13, xzr, x15, eq
+; GISEL-NEXT:    cmp x9, #1
+; GISEL-NEXT:    stp x27, x0, [sp, #240] ; 16-byte Folded Spill
+; GISEL-NEXT:    orr x13, x14, x13
+; GISEL-NEXT:    mov x7, x3
+; GISEL-NEXT:    csel x10, x13, x10, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x23, eq
+; GISEL-NEXT:    cmp x9, #2
+; GISEL-NEXT:    orr x13, x20, x13
+; GISEL-NEXT:    csel x10, x13, x10, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x26, eq
+; GISEL-NEXT:    cmp x9, #3
+; GISEL-NEXT:    orr x13, x2, x13
+; GISEL-NEXT:    csel x10, x13, x10, eq
+; GISEL-NEXT:    cmp x9, #4
+; GISEL-NEXT:    csel x10, x25, x10, eq
+; GISEL-NEXT:    cmp x9, #5
+; GISEL-NEXT:    csel x10, xzr, x10, eq
+; GISEL-NEXT:    cmp x9, #6
+; GISEL-NEXT:    csel x10, xzr, x10, eq
+; GISEL-NEXT:    cmp x9, #7
+; GISEL-NEXT:    csel x10, xzr, x10, eq
+; GISEL-NEXT:    cmp x9, #8
+; GISEL-NEXT:    csel x10, xzr, x10, eq
+; GISEL-NEXT:    cmp x9, #9
+; GISEL-NEXT:    csel x10, xzr, x10, eq
+; GISEL-NEXT:    cmp x9, #10
+; GISEL-NEXT:    csel x10, xzr, x10, eq
+; GISEL-NEXT:    cmp x9, #11
+; GISEL-NEXT:    csel x10, xzr, x10, eq
+; GISEL-NEXT:    cmp x9, #12
+; GISEL-NEXT:    csel x10, xzr, x10, eq
+; GISEL-NEXT:    cmp x9, #13
+; GISEL-NEXT:    csel x10, xzr, x10, eq
+; GISEL-NEXT:    cmp x9, #14
+; GISEL-NEXT:    csel x10, xzr, x10, eq
+; GISEL-NEXT:    cmp x9, #15
+; GISEL-NEXT:    csel x10, xzr, x10, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x10, x12, x10, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    str x10, [sp, #160] ; 8-byte Folded Spill
+; GISEL-NEXT:    csel x10, xzr, x27, eq
+; GISEL-NEXT:    cmp x9, #0
+; GISEL-NEXT:    orr x10, x19, x10
+; GISEL-NEXT:    csel x10, x10, xzr, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x12, xzr, x17, eq
+; GISEL-NEXT:    cmp x9, #1
+; GISEL-NEXT:    orr x12, x0, x12
+; GISEL-NEXT:    csel x10, x12, x10, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x12, xzr, x15, eq
+; GISEL-NEXT:    cmp x9, #2
+; GISEL-NEXT:    orr x12, x14, x12
+; GISEL-NEXT:    csel x10, x12, x10, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x12, xzr, x23, eq
+; GISEL-NEXT:    cmp x9, #3
+; GISEL-NEXT:    orr x12, x20, x12
+; GISEL-NEXT:    csel x10, x12, x10, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x12, xzr, x26, eq
+; GISEL-NEXT:    cmp x9, #4
+; GISEL-NEXT:    orr x12, x2, x12
+; GISEL-NEXT:    csel x10, x12, x10, eq
+; GISEL-NEXT:    cmp x9, #5
+; GISEL-NEXT:    csel x10, x25, x10, eq
+; GISEL-NEXT:    cmp x9, #6
+; GISEL-NEXT:    csel x10, xzr, x10, eq
+; GISEL-NEXT:    cmp x9, #7
+; GISEL-NEXT:    csel x10, xzr, x10, eq
+; GISEL-NEXT:    cmp x9, #8
+; GISEL-NEXT:    csel x10, xzr, x10, eq
+; GISEL-NEXT:    cmp x9, #9
+; GISEL-NEXT:    csel x10, xzr, x10, eq
+; GISEL-NEXT:    cmp x9, #10
+; GISEL-NEXT:    csel x10, xzr, x10, eq
+; GISEL-NEXT:    cmp x9, #11
+; GISEL-NEXT:    csel x10, xzr, x10, eq
+; GISEL-NEXT:    cmp x9, #12
+; GISEL-NEXT:    csel x10, xzr, x10, eq
+; GISEL-NEXT:    cmp x9, #13
+; GISEL-NEXT:    csel x13, xzr, x10, eq
+; GISEL-NEXT:    cmp x9, #14
+; GISEL-NEXT:    ldp x12, x10, [x1, #48]
+; GISEL-NEXT:    csel x13, xzr, x13, eq
+; GISEL-NEXT:    cmp x9, #15
+; GISEL-NEXT:    csel x13, xzr, x13, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    lsl x4, x12, x16
+; GISEL-NEXT:    csel x11, x11, x13, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    str x11, [sp, #152] ; 8-byte Folded Spill
+; GISEL-NEXT:    csel x11, xzr, x3, eq
+; GISEL-NEXT:    cmp x9, #0
+; GISEL-NEXT:    orr x11, x4, x11
+; GISEL-NEXT:    lsl x30, x10, x16
+; GISEL-NEXT:    lsr x28, x10, x21
+; GISEL-NEXT:    csel x11, x11, xzr, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x27, eq
+; GISEL-NEXT:    cmp x9, #1
+; GISEL-NEXT:    str x30, [sp, #200] ; 8-byte Folded Spill
+; GISEL-NEXT:    orr x13, x19, x13
+; GISEL-NEXT:    csel x11, x13, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x17, eq
+; GISEL-NEXT:    cmp x9, #2
+; GISEL-NEXT:    orr x13, x0, x13
+; GISEL-NEXT:    csel x11, x13, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x15, eq
+; GISEL-NEXT:    cmp x9, #3
+; GISEL-NEXT:    orr x13, x14, x13
+; GISEL-NEXT:    csel x11, x13, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x23, eq
+; GISEL-NEXT:    cmp x9, #4
+; GISEL-NEXT:    orr x13, x20, x13
+; GISEL-NEXT:    csel x11, x13, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x26, eq
+; GISEL-NEXT:    cmp x9, #5
+; GISEL-NEXT:    orr x13, x2, x13
+; GISEL-NEXT:    csel x11, x13, x11, eq
+; GISEL-NEXT:    cmp x9, #6
+; GISEL-NEXT:    lsr x13, x12, x21
+; GISEL-NEXT:    csel x11, x25, x11, eq
+; GISEL-NEXT:    cmp x9, #7
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #8
+; GISEL-NEXT:    mov x6, x13
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #9
+; GISEL-NEXT:    str x6, [sp, #256] ; 8-byte Folded Spill
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #10
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #11
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #12
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #13
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #14
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #15
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x11, x12, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    str x11, [sp, #144] ; 8-byte Folded Spill
+; GISEL-NEXT:    csel x11, xzr, x13, eq
+; GISEL-NEXT:    cmp x9, #0
+; GISEL-NEXT:    orr x11, x30, x11
+; GISEL-NEXT:    csel x11, x11, xzr, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x12, xzr, x3, eq
+; GISEL-NEXT:    cmp x9, #1
+; GISEL-NEXT:    orr x12, x4, x12
+; GISEL-NEXT:    csel x11, x12, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x12, xzr, x27, eq
+; GISEL-NEXT:    cmp x9, #2
+; GISEL-NEXT:    orr x12, x19, x12
+; GISEL-NEXT:    csel x11, x12, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x12, xzr, x17, eq
+; GISEL-NEXT:    cmp x9, #3
+; GISEL-NEXT:    orr x12, x0, x12
+; GISEL-NEXT:    csel x11, x12, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x12, xzr, x15, eq
+; GISEL-NEXT:    cmp x9, #4
+; GISEL-NEXT:    orr x12, x14, x12
+; GISEL-NEXT:    csel x11, x12, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x12, xzr, x23, eq
+; GISEL-NEXT:    cmp x9, #5
+; GISEL-NEXT:    orr x12, x20, x12
+; GISEL-NEXT:    csel x11, x12, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x12, xzr, x26, eq
+; GISEL-NEXT:    cmp x9, #6
+; GISEL-NEXT:    orr x12, x2, x12
+; GISEL-NEXT:    csel x11, x12, x11, eq
+; GISEL-NEXT:    cmp x9, #7
+; GISEL-NEXT:    csel x11, x25, x11, eq
+; GISEL-NEXT:    cmp x9, #8
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #9
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #10
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #11
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #12
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #13
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #14
+; GISEL-NEXT:    csel x12, xzr, x11, eq
+; GISEL-NEXT:    ldp x11, x5, [x1, #64]
+; GISEL-NEXT:    cmp x9, #15
+; GISEL-NEXT:    csel x12, xzr, x12, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x12, x10, x12, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    lsl x21, x11, x16
+; GISEL-NEXT:    str x12, [sp, #136] ; 8-byte Folded Spill
+; GISEL-NEXT:    csel x12, xzr, x28, eq
+; GISEL-NEXT:    cmp x9, #0
+; GISEL-NEXT:    orr x12, x21, x12
+; GISEL-NEXT:    lsr x10, x11, x22
+; GISEL-NEXT:    mov x16, x19
+; GISEL-NEXT:    csel x12, x12, xzr, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    mov x1, x16
+; GISEL-NEXT:    csel x13, xzr, x13, eq
+; GISEL-NEXT:    cmp x9, #1
+; GISEL-NEXT:    str x16, [sp, #304] ; 8-byte Folded Spill
+; GISEL-NEXT:    orr x13, x30, x13
+; GISEL-NEXT:    csel x12, x13, x12, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x3, eq
+; GISEL-NEXT:    cmp x9, #2
+; GISEL-NEXT:    lsl x3, x5, x24
+; GISEL-NEXT:    orr x13, x4, x13
+; GISEL-NEXT:    csel x12, x13, x12, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    stp x21, x3, [sp, #216] ; 16-byte Folded Spill
+; GISEL-NEXT:    csel x13, xzr, x27, eq
+; GISEL-NEXT:    cmp x9, #3
+; GISEL-NEXT:    orr x13, x19, x13
+; GISEL-NEXT:    mov x19, x28
+; GISEL-NEXT:    csel x12, x13, x12, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x17, eq
+; GISEL-NEXT:    cmp x9, #4
+; GISEL-NEXT:    orr x13, x0, x13
+; GISEL-NEXT:    csel x12, x13, x12, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x15, eq
+; GISEL-NEXT:    cmp x9, #5
+; GISEL-NEXT:    orr x13, x14, x13
+; GISEL-NEXT:    csel x12, x13, x12, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x23, eq
+; GISEL-NEXT:    cmp x9, #6
+; GISEL-NEXT:    orr x13, x20, x13
+; GISEL-NEXT:    csel x12, x13, x12, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x26, eq
+; GISEL-NEXT:    cmp x9, #7
+; GISEL-NEXT:    orr x13, x2, x13
+; GISEL-NEXT:    csel x12, x13, x12, eq
+; GISEL-NEXT:    cmp x9, #8
+; GISEL-NEXT:    csel x12, x25, x12, eq
+; GISEL-NEXT:    cmp x9, #9
+; GISEL-NEXT:    csel x12, xzr, x12, eq
+; GISEL-NEXT:    cmp x9, #10
+; GISEL-NEXT:    csel x12, xzr, x12, eq
+; GISEL-NEXT:    cmp x9, #11
+; GISEL-NEXT:    csel x12, xzr, x12, eq
+; GISEL-NEXT:    cmp x9, #12
+; GISEL-NEXT:    csel x12, xzr, x12, eq
+; GISEL-NEXT:    cmp x9, #13
+; GISEL-NEXT:    csel x12, xzr, x12, eq
+; GISEL-NEXT:    cmp x9, #14
+; GISEL-NEXT:    csel x12, xzr, x12, eq
+; GISEL-NEXT:    cmp x9, #15
+; GISEL-NEXT:    csel x12, xzr, x12, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x11, x11, x12, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    str x11, [sp, #128] ; 8-byte Folded Spill
+; GISEL-NEXT:    csel x11, xzr, x10, eq
+; GISEL-NEXT:    cmp x9, #0
+; GISEL-NEXT:    orr x11, x3, x11
+; GISEL-NEXT:    csel x11, x11, xzr, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x12, xzr, x28, eq
+; GISEL-NEXT:    cmp x9, #1
+; GISEL-NEXT:    mov x28, x4
+; GISEL-NEXT:    orr x12, x21, x12
+; GISEL-NEXT:    str x28, [sp, #32] ; 8-byte Folded Spill
+; GISEL-NEXT:    csel x11, x12, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x12, xzr, x6, eq
+; GISEL-NEXT:    cmp x9, #2
+; GISEL-NEXT:    orr x12, x30, x12
+; GISEL-NEXT:    csel x11, x12, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x12, xzr, x7, eq
+; GISEL-NEXT:    cmp x9, #3
+; GISEL-NEXT:    orr x12, x4, x12
+; GISEL-NEXT:    mov x4, x20
+; GISEL-NEXT:    csel x11, x12, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x12, xzr, x27, eq
+; GISEL-NEXT:    cmp x9, #4
+; GISEL-NEXT:    mov x27, x2
+; GISEL-NEXT:    orr x12, x16, x12
+; GISEL-NEXT:    mov x16, x17
+; GISEL-NEXT:    csel x11, x12, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x12, xzr, x17, eq
+; GISEL-NEXT:    cmp x9, #5
+; GISEL-NEXT:    mov x17, x15
+; GISEL-NEXT:    orr x12, x0, x12
+; GISEL-NEXT:    lsr x0, x5, x22
+; GISEL-NEXT:    csel x11, x12, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x12, xzr, x15, eq
+; GISEL-NEXT:    cmp x9, #6
+; GISEL-NEXT:    ldr x15, [sp, #312] ; 8-byte Folded Reload
+; GISEL-NEXT:    orr x12, x14, x12
+; GISEL-NEXT:    str x0, [sp, #280] ; 8-byte Folded Spill
+; GISEL-NEXT:    csel x11, x12, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x12, xzr, x23, eq
+; GISEL-NEXT:    cmp x9, #7
+; GISEL-NEXT:    mov x23, x25
+; GISEL-NEXT:    orr x12, x20, x12
+; GISEL-NEXT:    str x23, [sp, #288] ; 8-byte Folded Spill
+; GISEL-NEXT:    csel x11, x12, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x12, xzr, x26, eq
+; GISEL-NEXT:    cmp x9, #8
+; GISEL-NEXT:    orr x12, x2, x12
+; GISEL-NEXT:    mov x2, x3
+; GISEL-NEXT:    csel x11, x12, x11, eq
+; GISEL-NEXT:    cmp x9, #9
+; GISEL-NEXT:    csel x11, x25, x11, eq
+; GISEL-NEXT:    cmp x9, #10
+; GISEL-NEXT:    mov x25, x26
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #11
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #12
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #13
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #14
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #15
+; GISEL-NEXT:    csel x12, xzr, x11, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x12, x5, x12, eq
+; GISEL-NEXT:    ldp x11, x5, [x15, #80]
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    str x12, [sp, #120] ; 8-byte Folded Spill
+; GISEL-NEXT:    mov x15, x7
+; GISEL-NEXT:    csel x12, xzr, x0, eq
+; GISEL-NEXT:    cmp x9, #0
+; GISEL-NEXT:    str x15, [sp, #24] ; 8-byte Folded Spill
+; GISEL-NEXT:    lsl x20, x11, x24
+; GISEL-NEXT:    orr x12, x20, x12
+; GISEL-NEXT:    str x20, [sp, #232] ; 8-byte Folded Spill
+; GISEL-NEXT:    csel x12, x12, xzr, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x10, eq
+; GISEL-NEXT:    cmp x9, #1
+; GISEL-NEXT:    orr x13, x3, x13
+; GISEL-NEXT:    lsl x3, x5, x24
+; GISEL-NEXT:    csel x12, x13, x12, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x19, eq
+; GISEL-NEXT:    cmp x9, #2
+; GISEL-NEXT:    stp x19, x3, [sp, #264] ; 16-byte Folded Spill
+; GISEL-NEXT:    orr x13, x21, x13
+; GISEL-NEXT:    csel x12, x13, x12, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x6, eq
+; GISEL-NEXT:    cmp x9, #3
+; GISEL-NEXT:    orr x13, x30, x13
+; GISEL-NEXT:    csel x12, x13, x12, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x7, eq
+; GISEL-NEXT:    ldp x7, x30, [sp, #240] ; 16-byte Folded Reload
+; GISEL-NEXT:    cmp x9, #4
+; GISEL-NEXT:    orr x13, x28, x13
+; GISEL-NEXT:    csel x12, x13, x12, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x7, eq
+; GISEL-NEXT:    cmp x9, #5
+; GISEL-NEXT:    orr x13, x1, x13
+; GISEL-NEXT:    mov x1, x14
+; GISEL-NEXT:    csel x12, x13, x12, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x16, eq
+; GISEL-NEXT:    cmp x9, #6
+; GISEL-NEXT:    orr x13, x30, x13
+; GISEL-NEXT:    csel x12, x13, x12, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x17, eq
+; GISEL-NEXT:    cmp x9, #7
+; GISEL-NEXT:    orr x13, x14, x13
+; GISEL-NEXT:    ldr x14, [sp, #208] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x12, x13, x12, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x14, eq
+; GISEL-NEXT:    cmp x9, #8
+; GISEL-NEXT:    orr x13, x4, x13
+; GISEL-NEXT:    mov x4, x10
+; GISEL-NEXT:    csel x12, x13, x12, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x26, eq
+; GISEL-NEXT:    cmp x9, #9
+; GISEL-NEXT:    mov x26, x27
+; GISEL-NEXT:    orr x13, x27, x13
+; GISEL-NEXT:    lsr x27, x11, x22
+; GISEL-NEXT:    csel x12, x13, x12, eq
+; GISEL-NEXT:    cmp x9, #10
+; GISEL-NEXT:    mov x13, x23
+; GISEL-NEXT:    csel x12, x23, x12, eq
+; GISEL-NEXT:    cmp x9, #11
+; GISEL-NEXT:    str x27, [sp, #64] ; 8-byte Folded Spill
+; GISEL-NEXT:    csel x12, xzr, x12, eq
+; GISEL-NEXT:    cmp x9, #12
+; GISEL-NEXT:    mov x23, x20
+; GISEL-NEXT:    csel x12, xzr, x12, eq
+; GISEL-NEXT:    cmp x9, #13
+; GISEL-NEXT:    csel x12, xzr, x12, eq
+; GISEL-NEXT:    cmp x9, #14
+; GISEL-NEXT:    csel x12, xzr, x12, eq
+; GISEL-NEXT:    cmp x9, #15
+; GISEL-NEXT:    csel x12, xzr, x12, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x11, x11, x12, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    str x11, [sp, #104] ; 8-byte Folded Spill
+; GISEL-NEXT:    csel x11, xzr, x27, eq
+; GISEL-NEXT:    cmp x9, #0
+; GISEL-NEXT:    orr x11, x3, x11
+; GISEL-NEXT:    csel x11, x11, xzr, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x12, xzr, x0, eq
+; GISEL-NEXT:    cmp x9, #1
+; GISEL-NEXT:    mov x0, x7
+; GISEL-NEXT:    orr x12, x20, x12
+; GISEL-NEXT:    mov x20, x16
+; GISEL-NEXT:    csel x11, x12, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x12, xzr, x10, eq
+; GISEL-NEXT:    cmp x9, #2
+; GISEL-NEXT:    ldr x10, [sp, #312] ; 8-byte Folded Reload
+; GISEL-NEXT:    orr x12, x2, x12
+; GISEL-NEXT:    ldr x2, [sp, #304] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x11, x12, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x12, xzr, x19, eq
+; GISEL-NEXT:    cmp x9, #3
+; GISEL-NEXT:    orr x12, x21, x12
+; GISEL-NEXT:    ldr x21, [sp, #200] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x11, x12, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x12, xzr, x6, eq
+; GISEL-NEXT:    cmp x9, #4
+; GISEL-NEXT:    orr x12, x21, x12
+; GISEL-NEXT:    csel x11, x12, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x12, xzr, x15, eq
+; GISEL-NEXT:    cmp x9, #5
+; GISEL-NEXT:    orr x12, x28, x12
+; GISEL-NEXT:    csel x11, x12, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x12, xzr, x7, eq
+; GISEL-NEXT:    cmp x9, #6
+; GISEL-NEXT:    mov x7, x17
+; GISEL-NEXT:    orr x12, x2, x12
+; GISEL-NEXT:    csel x11, x12, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x12, xzr, x16, eq
+; GISEL-NEXT:    cmp x9, #7
+; GISEL-NEXT:    orr x12, x30, x12
+; GISEL-NEXT:    csel x11, x12, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x12, xzr, x17, eq
+; GISEL-NEXT:    cmp x9, #8
+; GISEL-NEXT:    mov x17, x24
+; GISEL-NEXT:    orr x12, x1, x12
+; GISEL-NEXT:    csel x11, x12, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x12, xzr, x14, eq
+; GISEL-NEXT:    ldr x14, [sp, #8] ; 8-byte Folded Reload
+; GISEL-NEXT:    cmp x9, #9
+; GISEL-NEXT:    orr x12, x14, x12
+; GISEL-NEXT:    csel x11, x12, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x12, xzr, x25, eq
+; GISEL-NEXT:    cmp x9, #10
+; GISEL-NEXT:    orr x12, x26, x12
+; GISEL-NEXT:    csel x11, x12, x11, eq
+; GISEL-NEXT:    cmp x9, #11
+; GISEL-NEXT:    csel x11, x13, x11, eq
+; GISEL-NEXT:    cmp x9, #12
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #13
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #14
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #15
+; GISEL-NEXT:    csel x12, xzr, x11, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    ldp x11, x10, [x10, #96]
+; GISEL-NEXT:    csel x12, x5, x12, eq
+; GISEL-NEXT:    str x12, [sp, #96] ; 8-byte Folded Spill
+; GISEL-NEXT:    mov x12, x22
+; GISEL-NEXT:    lsr x22, x5, x22
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    mov x5, x27
+; GISEL-NEXT:    lsl x24, x11, x24
+; GISEL-NEXT:    str x10, [sp, #296] ; 8-byte Folded Spill
+; GISEL-NEXT:    csel x10, xzr, x22, eq
+; GISEL-NEXT:    cmp x9, #0
+; GISEL-NEXT:    str x22, [sp, #16] ; 8-byte Folded Spill
+; GISEL-NEXT:    orr x10, x24, x10
+; GISEL-NEXT:    csel x10, x10, xzr, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x27, eq
+; GISEL-NEXT:    cmp x9, #1
+; GISEL-NEXT:    ldr x27, [sp, #280] ; 8-byte Folded Reload
+; GISEL-NEXT:    orr x13, x3, x13
+; GISEL-NEXT:    mov x3, x26
+; GISEL-NEXT:    csel x10, x13, x10, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x27, eq
+; GISEL-NEXT:    cmp x9, #2
+; GISEL-NEXT:    orr x13, x23, x13
+; GISEL-NEXT:    mov x23, x4
+; GISEL-NEXT:    csel x10, x13, x10, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x4, eq
+; GISEL-NEXT:    ldp x4, x16, [sp, #216] ; 16-byte Folded Reload
+; GISEL-NEXT:    cmp x9, #3
+; GISEL-NEXT:    orr x13, x16, x13
+; GISEL-NEXT:    csel x10, x13, x10, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x19, eq
+; GISEL-NEXT:    cmp x9, #4
+; GISEL-NEXT:    mov x19, x1
+; GISEL-NEXT:    orr x13, x4, x13
+; GISEL-NEXT:    csel x10, x13, x10, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x6, eq
+; GISEL-NEXT:    cmp x9, #5
+; GISEL-NEXT:    mov x6, x14
+; GISEL-NEXT:    orr x13, x21, x13
+; GISEL-NEXT:    csel x10, x13, x10, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x15, eq
+; GISEL-NEXT:    cmp x9, #6
+; GISEL-NEXT:    orr x13, x28, x13
+; GISEL-NEXT:    csel x10, x13, x10, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x0, eq
+; GISEL-NEXT:    cmp x9, #7
+; GISEL-NEXT:    mov x0, x23
+; GISEL-NEXT:    orr x13, x2, x13
+; GISEL-NEXT:    csel x10, x13, x10, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x20, eq
+; GISEL-NEXT:    cmp x9, #8
+; GISEL-NEXT:    orr x13, x30, x13
+; GISEL-NEXT:    ldr x30, [sp, #208] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x10, x13, x10, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x7, eq
+; GISEL-NEXT:    cmp x9, #9
+; GISEL-NEXT:    orr x13, x1, x13
+; GISEL-NEXT:    csel x10, x13, x10, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x30, eq
+; GISEL-NEXT:    cmp x9, #10
+; GISEL-NEXT:    orr x13, x14, x13
+; GISEL-NEXT:    ldp x14, x2, [sp, #264] ; 16-byte Folded Reload
+; GISEL-NEXT:    csel x10, x13, x10, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x25, eq
+; GISEL-NEXT:    cmp x9, #11
+; GISEL-NEXT:    orr x13, x26, x13
+; GISEL-NEXT:    ldr x26, [sp, #288] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x10, x13, x10, eq
+; GISEL-NEXT:    cmp x9, #12
+; GISEL-NEXT:    lsr x13, x11, x12
+; GISEL-NEXT:    csel x10, x26, x10, eq
+; GISEL-NEXT:    cmp x9, #13
+; GISEL-NEXT:    csel x10, xzr, x10, eq
+; GISEL-NEXT:    cmp x9, #14
+; GISEL-NEXT:    str x13, [sp, #72] ; 8-byte Folded Spill
+; GISEL-NEXT:    csel x10, xzr, x10, eq
+; GISEL-NEXT:    cmp x9, #15
+; GISEL-NEXT:    csel x10, xzr, x10, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x10, x11, x10, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    str x10, [sp, #88] ; 8-byte Folded Spill
+; GISEL-NEXT:    ldr x10, [sp, #296] ; 8-byte Folded Reload
+; GISEL-NEXT:    lsl x11, x10, x17
+; GISEL-NEXT:    csel x10, xzr, x13, eq
+; GISEL-NEXT:    cmp x9, #0
+; GISEL-NEXT:    ldr x17, [sp, #232] ; 8-byte Folded Reload
+; GISEL-NEXT:    ldr x13, [sp, #256] ; 8-byte Folded Reload
+; GISEL-NEXT:    orr x10, x11, x10
+; GISEL-NEXT:    str x11, [sp, #56] ; 8-byte Folded Spill
+; GISEL-NEXT:    csel x10, x10, xzr, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x11, xzr, x22, eq
+; GISEL-NEXT:    cmp x9, #1
+; GISEL-NEXT:    orr x11, x24, x11
+; GISEL-NEXT:    csel x10, x11, x10, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x11, xzr, x5, eq
+; GISEL-NEXT:    cmp x9, #2
+; GISEL-NEXT:    orr x11, x2, x11
+; GISEL-NEXT:    ldp x12, x5, [sp, #240] ; 16-byte Folded Reload
+; GISEL-NEXT:    csel x10, x11, x10, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x11, xzr, x27, eq
+; GISEL-NEXT:    cmp x9, #3
+; GISEL-NEXT:    mov x27, x30
+; GISEL-NEXT:    orr x11, x17, x11
+; GISEL-NEXT:    csel x10, x11, x10, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x11, xzr, x23, eq
+; GISEL-NEXT:    cmp x9, #4
+; GISEL-NEXT:    mov x23, x20
+; GISEL-NEXT:    orr x11, x16, x11
+; GISEL-NEXT:    ldr x16, [sp, #304] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x10, x11, x10, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x11, xzr, x14, eq
+; GISEL-NEXT:    cmp x9, #5
+; GISEL-NEXT:    orr x11, x4, x11
+; GISEL-NEXT:    csel x10, x11, x10, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x11, xzr, x13, eq
+; GISEL-NEXT:    cmp x9, #6
+; GISEL-NEXT:    orr x11, x21, x11
+; GISEL-NEXT:    ldr x21, [sp, #296] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x10, x11, x10, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x11, xzr, x15, eq
+; GISEL-NEXT:    cmp x9, #7
+; GISEL-NEXT:    orr x11, x28, x11
+; GISEL-NEXT:    csel x10, x11, x10, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x11, xzr, x12, eq
+; GISEL-NEXT:    cmp x9, #8
+; GISEL-NEXT:    orr x11, x16, x11
+; GISEL-NEXT:    csel x10, x11, x10, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x11, xzr, x20, eq
+; GISEL-NEXT:    cmp x9, #9
+; GISEL-NEXT:    orr x11, x5, x11
+; GISEL-NEXT:    csel x10, x11, x10, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x11, xzr, x7, eq
+; GISEL-NEXT:    cmp x9, #10
+; GISEL-NEXT:    orr x11, x1, x11
+; GISEL-NEXT:    ldr x1, [sp, #312] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x10, x11, x10, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x11, xzr, x30, eq
+; GISEL-NEXT:    cmp x9, #11
+; GISEL-NEXT:    orr x11, x6, x11
+; GISEL-NEXT:    csel x10, x11, x10, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x11, xzr, x25, eq
+; GISEL-NEXT:    cmp x9, #12
+; GISEL-NEXT:    orr x11, x3, x11
+; GISEL-NEXT:    csel x10, x11, x10, eq
+; GISEL-NEXT:    cmp x9, #13
+; GISEL-NEXT:    csel x10, x26, x10, eq
+; GISEL-NEXT:    cmp x9, #14
+; GISEL-NEXT:    csel x10, xzr, x10, eq
+; GISEL-NEXT:    cmp x9, #15
+; GISEL-NEXT:    csel x11, xzr, x10, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x11, x21, x11, eq
+; GISEL-NEXT:    ldp x10, x20, [x1, #112]
+; GISEL-NEXT:    str x11, [sp, #80] ; 8-byte Folded Spill
+; GISEL-NEXT:    ldp x11, x4, [sp, #40] ; 16-byte Folded Reload
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    lsr x21, x21, x4
+; GISEL-NEXT:    lsl x28, x10, x11
+; GISEL-NEXT:    csel x1, xzr, x21, eq
+; GISEL-NEXT:    str x21, [sp, #296] ; 8-byte Folded Spill
+; GISEL-NEXT:    cmp x9, #0
+; GISEL-NEXT:    orr x1, x28, x1
+; GISEL-NEXT:    ldr x21, [sp, #72] ; 8-byte Folded Reload
+; GISEL-NEXT:    str x28, [sp, #312] ; 8-byte Folded Spill
+; GISEL-NEXT:    csel x1, x1, xzr, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    ldr x28, [sp, #56] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x30, xzr, x21, eq
+; GISEL-NEXT:    cmp x9, #1
+; GISEL-NEXT:    orr x30, x28, x30
+; GISEL-NEXT:    csel x1, x30, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x30, xzr, x22, eq
+; GISEL-NEXT:    cmp x9, #2
+; GISEL-NEXT:    ldr x22, [sp, #64] ; 8-byte Folded Reload
+; GISEL-NEXT:    orr x30, x24, x30
+; GISEL-NEXT:    csel x1, x30, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x30, xzr, x22, eq
+; GISEL-NEXT:    cmp x9, #3
+; GISEL-NEXT:    orr x30, x2, x30
+; GISEL-NEXT:    ldr x2, [sp, #280] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x1, x30, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x30, xzr, x2, eq
+; GISEL-NEXT:    cmp x9, #4
+; GISEL-NEXT:    orr x30, x17, x30
+; GISEL-NEXT:    ldr x17, [sp, #224] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x1, x30, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x30, xzr, x0, eq
+; GISEL-NEXT:    cmp x9, #5
+; GISEL-NEXT:    orr x30, x17, x30
+; GISEL-NEXT:    csel x1, x30, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x30, xzr, x14, eq
+; GISEL-NEXT:    ldr x14, [sp, #216] ; 8-byte Folded Reload
+; GISEL-NEXT:    cmp x9, #6
+; GISEL-NEXT:    orr x30, x14, x30
+; GISEL-NEXT:    csel x1, x30, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x30, xzr, x13, eq
+; GISEL-NEXT:    ldr x13, [sp, #200] ; 8-byte Folded Reload
+; GISEL-NEXT:    cmp x9, #7
+; GISEL-NEXT:    orr x30, x13, x30
+; GISEL-NEXT:    csel x1, x30, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x30, xzr, x15, eq
+; GISEL-NEXT:    ldr x15, [sp, #32] ; 8-byte Folded Reload
+; GISEL-NEXT:    cmp x9, #8
+; GISEL-NEXT:    orr x30, x15, x30
+; GISEL-NEXT:    csel x1, x30, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x30, xzr, x12, eq
+; GISEL-NEXT:    cmp x9, #9
+; GISEL-NEXT:    orr x30, x16, x30
+; GISEL-NEXT:    csel x1, x30, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x30, xzr, x23, eq
+; GISEL-NEXT:    cmp x9, #10
+; GISEL-NEXT:    orr x30, x5, x30
+; GISEL-NEXT:    csel x1, x30, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x30, xzr, x7, eq
+; GISEL-NEXT:    cmp x9, #11
+; GISEL-NEXT:    orr x30, x19, x30
+; GISEL-NEXT:    csel x1, x30, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x30, xzr, x27, eq
+; GISEL-NEXT:    cmp x9, #12
+; GISEL-NEXT:    orr x30, x6, x30
+; GISEL-NEXT:    csel x1, x30, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x30, xzr, x25, eq
+; GISEL-NEXT:    cmp x9, #13
+; GISEL-NEXT:    orr x30, x3, x30
+; GISEL-NEXT:    csel x1, x30, x1, eq
+; GISEL-NEXT:    cmp x9, #14
+; GISEL-NEXT:    lsr x30, x10, x4
+; GISEL-NEXT:    csel x1, x26, x1, eq
+; GISEL-NEXT:    cmp x9, #15
+; GISEL-NEXT:    csel x1, xzr, x1, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x26, x10, x1, eq
+; GISEL-NEXT:    lsl x10, x20, x11
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x16, xzr, x30, eq
+; GISEL-NEXT:    cmp x9, #0
+; GISEL-NEXT:    ldr x11, [sp, #296] ; 8-byte Folded Reload
+; GISEL-NEXT:    orr x10, x10, x16
+; GISEL-NEXT:    ldr x16, [sp, #312] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x10, x10, xzr, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #1
+; GISEL-NEXT:    orr x11, x16, x11
+; GISEL-NEXT:    ldr x16, [sp, #272] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x10, x11, x10, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x11, xzr, x21, eq
+; GISEL-NEXT:    cmp x9, #2
+; GISEL-NEXT:    orr x11, x28, x11
+; GISEL-NEXT:    ldp x29, x30, [sp, #400] ; 16-byte Folded Reload
+; GISEL-NEXT:    csel x10, x11, x10, eq
+; GISEL-NEXT:    ldr x11, [sp, #16] ; 8-byte Folded Reload
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #3
+; GISEL-NEXT:    orr x11, x24, x11
+; GISEL-NEXT:    csel x10, x11, x10, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x11, xzr, x22, eq
+; GISEL-NEXT:    cmp x9, #4
+; GISEL-NEXT:    orr x11, x16, x11
+; GISEL-NEXT:    ldr x16, [sp, #232] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x10, x11, x10, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x11, xzr, x2, eq
+; GISEL-NEXT:    cmp x9, #5
+; GISEL-NEXT:    orr x11, x16, x11
+; GISEL-NEXT:    ldp x22, x21, [sp, #368] ; 16-byte Folded Reload
+; GISEL-NEXT:    csel x10, x11, x10, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x11, xzr, x0, eq
+; GISEL-NEXT:    cmp x9, #6
+; GISEL-NEXT:    orr x11, x17, x11
+; GISEL-NEXT:    csel x10, x11, x10, eq
+; GISEL-NEXT:    ldr x11, [sp, #264] ; 8-byte Folded Reload
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #7
+; GISEL-NEXT:    orr x11, x14, x11
+; GISEL-NEXT:    csel x10, x11, x10, eq
+; GISEL-NEXT:    ldr x11, [sp, #256] ; 8-byte Folded Reload
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #8
+; GISEL-NEXT:    orr x11, x13, x11
+; GISEL-NEXT:    ldr x13, [sp, #112] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x10, x11, x10, eq
+; GISEL-NEXT:    ldr x11, [sp, #24] ; 8-byte Folded Reload
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #9
+; GISEL-NEXT:    orr x11, x15, x11
+; GISEL-NEXT:    csel x10, x11, x10, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x11, xzr, x12, eq
+; GISEL-NEXT:    ldr x12, [sp, #304] ; 8-byte Folded Reload
+; GISEL-NEXT:    cmp x9, #10
+; GISEL-NEXT:    orr x11, x12, x11
+; GISEL-NEXT:    csel x10, x11, x10, eq
+; GISEL-NEXT:    ldr x11, [sp, #192] ; 8-byte Folded Reload
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    str x11, [x13]
+; GISEL-NEXT:    ldp x12, x11, [sp, #176] ; 16-byte Folded Reload
+; GISEL-NEXT:    stp x11, x12, [x13, #8]
+; GISEL-NEXT:    csel x11, xzr, x23, eq
+; GISEL-NEXT:    cmp x9, #11
+; GISEL-NEXT:    orr x11, x5, x11
+; GISEL-NEXT:    ldp x24, x23, [sp, #352] ; 16-byte Folded Reload
+; GISEL-NEXT:    csel x10, x11, x10, eq
+; GISEL-NEXT:    ldr x11, [sp, #168] ; 8-byte Folded Reload
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    str x11, [x13, #24]
+; GISEL-NEXT:    ldp x12, x11, [sp, #152] ; 16-byte Folded Reload
+; GISEL-NEXT:    stp x11, x12, [x13, #32]
+; GISEL-NEXT:    csel x11, xzr, x7, eq
+; GISEL-NEXT:    cmp x9, #12
+; GISEL-NEXT:    orr x11, x19, x11
+; GISEL-NEXT:    csel x10, x11, x10, eq
+; GISEL-NEXT:    ldr x11, [sp, #144] ; 8-byte Folded Reload
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    str x11, [x13, #48]
+; GISEL-NEXT:    ldp x12, x11, [sp, #128] ; 16-byte Folded Reload
+; GISEL-NEXT:    stp x11, x12, [x13, #56]
+; GISEL-NEXT:    csel x11, xzr, x27, eq
+; GISEL-NEXT:    cmp x9, #13
+; GISEL-NEXT:    orr x11, x6, x11
+; GISEL-NEXT:    ldp x28, x27, [sp, #320] ; 16-byte Folded Reload
+; GISEL-NEXT:    csel x10, x11, x10, eq
+; GISEL-NEXT:    ldr x11, [sp, #120] ; 8-byte Folded Reload
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    str x11, [x13, #72]
+; GISEL-NEXT:    ldp x12, x11, [sp, #96] ; 16-byte Folded Reload
+; GISEL-NEXT:    stp x11, x12, [x13, #80]
+; GISEL-NEXT:    csel x11, xzr, x25, eq
+; GISEL-NEXT:    cmp x9, #14
+; GISEL-NEXT:    orr x11, x3, x11
+; GISEL-NEXT:    csel x10, x11, x10, eq
+; GISEL-NEXT:    cmp x9, #15
+; GISEL-NEXT:    ldr x9, [sp, #288] ; 8-byte Folded Reload
+; GISEL-NEXT:    ldr x11, [sp, #88] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x9, x9, x10, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    ldr x8, [sp, #80] ; 8-byte Folded Reload
+; GISEL-NEXT:    stp x11, x8, [x13, #96]
+; GISEL-NEXT:    csel x8, x20, x9, eq
+; GISEL-NEXT:    stp x26, x8, [x13, #112]
+; GISEL-NEXT:    ldp x20, x19, [sp, #384] ; 16-byte Folded Reload
+; GISEL-NEXT:    ldp x26, x25, [sp, #336] ; 16-byte Folded Reload
+; GISEL-NEXT:    add sp, sp, #416
+; GISEL-NEXT:    ret
+entry:
+  %input_val = load i1024, ptr %input, align 128
+  %shift_ext = zext i32 %shift to i1024
+  %shifted = shl i1024 %input_val, %shift_ext
+  store i1024 %shifted, ptr %result, align 128
+  ret void
+}
+
+define void @test_lshr_i1024(ptr %result, ptr %input, i32 %shift) {
+; SDAG-LABEL: test_lshr_i1024:
+; SDAG:       ; %bb.0: ; %entry
+; SDAG-NEXT:    sub sp, sp, #336
+; SDAG-NEXT:    stp x28, x27, [sp, #256] ; 16-byte Folded Spill
+; SDAG-NEXT:    stp x26, x25, [sp, #272] ; 16-byte Folded Spill
+; SDAG-NEXT:    stp x24, x23, [sp, #288] ; 16-byte Folded Spill
+; SDAG-NEXT:    stp x22, x21, [sp, #304] ; 16-byte Folded Spill
+; SDAG-NEXT:    stp x20, x19, [sp, #320] ; 16-byte Folded Spill
+; SDAG-NEXT:    .cfi_def_cfa_offset 336
+; SDAG-NEXT:    .cfi_offset w19, -8
+; SDAG-NEXT:    .cfi_offset w20, -16
+; SDAG-NEXT:    .cfi_offset w21, -24
+; SDAG-NEXT:    .cfi_offset w22, -32
+; SDAG-NEXT:    .cfi_offset w23, -40
+; SDAG-NEXT:    .cfi_offset w24, -48
+; SDAG-NEXT:    .cfi_offset w25, -56
+; SDAG-NEXT:    .cfi_offset w26, -64
+; SDAG-NEXT:    .cfi_offset w27, -72
+; SDAG-NEXT:    .cfi_offset w28, -80
+; SDAG-NEXT:    ldp x8, x9, [x1, #112]
+; SDAG-NEXT:    movi.2d v0, #0000000000000000
+; SDAG-NEXT:    ldp q1, q2, [x1]
+; SDAG-NEXT:    mov x10, sp
+; SDAG-NEXT:    ldp q3, q4, [x1, #32]
+; SDAG-NEXT:    ldr q7, [x1, #96]
+; SDAG-NEXT:    ldp q5, q6, [x1, #64]
+; SDAG-NEXT:    mvn w1, w2
+; SDAG-NEXT:    stp x8, x9, [sp, #112]
+; SDAG-NEXT:    mov w8, w2
+; SDAG-NEXT:    lsr x9, x8, #3
+; SDAG-NEXT:    stp q2, q3, [sp, #16]
+; SDAG-NEXT:    and x14, x8, #0x3f
+; SDAG-NEXT:    stp q4, q5, [sp, #48]
+; SDAG-NEXT:    eor x15, x14, #0x3f
+; SDAG-NEXT:    and x9, x9, #0x78
+; SDAG-NEXT:    stp q6, q7, [sp, #80]
+; SDAG-NEXT:    stp q0, q0, [sp, #128]
+; SDAG-NEXT:    add x10, x10, x9
+; SDAG-NEXT:    stp q0, q0, [sp, #160]
+; SDAG-NEXT:    stp q0, q0, [sp, #192]
+; SDAG-NEXT:    stp q0, q0, [sp, #224]
+; SDAG-NEXT:    str q1, [sp]
+; SDAG-NEXT:    ldp x11, x9, [x10, #16]
+; SDAG-NEXT:    ldr x16, [x10, #32]
+; SDAG-NEXT:    ldp x12, x13, [x10, #40]
+; SDAG-NEXT:    ldr x3, [x10, #56]
+; SDAG-NEXT:    ldp x4, x6, [x10, #64]
+; SDAG-NEXT:    lsl x2, x16, #1
+; SDAG-NEXT:    lsl x17, x11, #1
+; SDAG-NEXT:    ldp x24, x26, [x10, #112]
+; SDAG-NEXT:    lsl x5, x13, #1
+; SDAG-NEXT:    lsr x13, x13, x8
+; SDAG-NEXT:    lsr x11, x11, x8
+; SDAG-NEXT:    lsl x14, x17, x1
+; SDAG-NEXT:    lsl x7, x6, #1
+; SDAG-NEXT:    lsl x17, x2, x1
+; SDAG-NEXT:    lsl x2, x5, x1
+; SDAG-NEXT:    ldp x5, x22, [x10, #80]
+; SDAG-NEXT:    lsr x19, x4, x8
+; SDAG-NEXT:    lsl x7, x7, x15
+; SDAG-NEXT:    lsl x21, x4, #1
+; SDAG-NEXT:    lsr x6, x6, x8
+; SDAG-NEXT:    lsl x27, x24, #1
+; SDAG-NEXT:    lsr x24, x24, x8
+; SDAG-NEXT:    lsl x23, x5, #1
+; SDAG-NEXT:    orr x4, x7, x19
+; SDAG-NEXT:    lsr x25, x22, x8
+; SDAG-NEXT:    ldp x20, x7, [x10, #96]
+; SDAG-NEXT:    lsl x21, x21, x1
+; SDAG-NEXT:    lsl x23, x23, x1
+; SDAG-NEXT:    lsl x22, x22, #1
+; SDAG-NEXT:    lsr x5, x5, x8
+; SDAG-NEXT:    lsr x16, x16, x8
+; SDAG-NEXT:    lsl x19, x20, #1
+; SDAG-NEXT:    orr x6, x6, x23
+; SDAG-NEXT:    lsl x23, x7, #1
+; SDAG-NEXT:    lsr x20, x20, x8
+; SDAG-NEXT:    lsr x7, x7, x8
+; SDAG-NEXT:    lsl x22, x22, x15
+; SDAG-NEXT:    lsl x19, x19, x1
+; SDAG-NEXT:    lsl x1, x27, x1
+; SDAG-NEXT:    lsl x23, x23, x15
+; SDAG-NEXT:    orr x5, x22, x5
+; SDAG-NEXT:    ldp x28, x27, [sp, #256] ; 16-byte Folded Reload
+; SDAG-NEXT:    orr x19, x25, x19
+; SDAG-NEXT:    lsl x25, x26, #1
+; SDAG-NEXT:    orr x20, x23, x20
+; SDAG-NEXT:    orr x1, x7, x1
+; SDAG-NEXT:    ldp x23, x10, [x10]
+; SDAG-NEXT:    stp x20, x1, [x0, #96]
+; SDAG-NEXT:    lsl x20, x3, #1
+; SDAG-NEXT:    lsl x25, x25, x15
+; SDAG-NEXT:    lsr x26, x26, x8
+; SDAG-NEXT:    stp x5, x19, [x0, #80]
+; SDAG-NEXT:    lsr x3, x3, x8
+; SDAG-NEXT:    lsl x19, x20, x15
+; SDAG-NEXT:    orr x7, x25, x24
+; SDAG-NEXT:    lsl x1, x9, #1
+; SDAG-NEXT:    stp x7, x26, [x0, #112]
+; SDAG-NEXT:    lsl x7, x10, #1
+; SDAG-NEXT:    orr x3, x3, x21
+; SDAG-NEXT:    orr x13, x19, x13
+; SDAG-NEXT:    lsl x5, x12, #1
+; SDAG-NEXT:    lsr x9, x9, x8
+; SDAG-NEXT:    stp x13, x3, [x0, #48]
+; SDAG-NEXT:    lsl x13, x1, x15
+; SDAG-NEXT:    lsr x23, x23, x8
+; SDAG-NEXT:    lsr x12, x12, x8
+; SDAG-NEXT:    lsr x8, x10, x8
+; SDAG-NEXT:    lsl x10, x7, x15
+; SDAG-NEXT:    stp x4, x6, [x0, #64]
+; SDAG-NEXT:    lsl x4, x5, x15
+; SDAG-NEXT:    orr x9, x9, x17
+; SDAG-NEXT:    orr x11, x13, x11
+; SDAG-NEXT:    ldp x20, x19, [sp, #320] ; 16-byte Folded Reload
+; SDAG-NEXT:    stp x11, x9, [x0, #16]
+; SDAG-NEXT:    orr x9, x10, x23
+; SDAG-NEXT:    orr x12, x12, x2
+; SDAG-NEXT:    ldp x22, x21, [sp, #304] ; 16-byte Folded Reload
+; SDAG-NEXT:    orr x16, x4, x16
+; SDAG-NEXT:    ldp x24, x23, [sp, #288] ; 16-byte Folded Reload
+; SDAG-NEXT:    orr x8, x8, x14
+; SDAG-NEXT:    ldp x26, x25, [sp, #272] ; 16-byte Folded Reload
+; SDAG-NEXT:    stp x16, x12, [x0, #32]
+; SDAG-NEXT:    stp x9, x8, [x0]
+; SDAG-NEXT:    add sp, sp, #336
+; SDAG-NEXT:    ret
+;
+; GISEL-LABEL: test_lshr_i1024:
+; GISEL:       ; %bb.0: ; %entry
+; GISEL-NEXT:    sub sp, sp, #416
+; GISEL-NEXT:    stp x28, x27, [sp, #320] ; 16-byte Folded Spill
+; GISEL-NEXT:    stp x26, x25, [sp, #336] ; 16-byte Folded Spill
+; GISEL-NEXT:    stp x24, x23, [sp, #352] ; 16-byte Folded Spill
+; GISEL-NEXT:    stp x22, x21, [sp, #368] ; 16-byte Folded Spill
+; GISEL-NEXT:    stp x20, x19, [sp, #384] ; 16-byte Folded Spill
+; GISEL-NEXT:    stp x29, x30, [sp, #400] ; 16-byte Folded Spill
+; GISEL-NEXT:    .cfi_def_cfa_offset 416
+; GISEL-NEXT:    .cfi_offset w30, -8
+; GISEL-NEXT:    .cfi_offset w29, -16
+; GISEL-NEXT:    .cfi_offset w19, -24
+; GISEL-NEXT:    .cfi_offset w20, -32
+; GISEL-NEXT:    .cfi_offset w21, -40
+; GISEL-NEXT:    .cfi_offset w22, -48
+; GISEL-NEXT:    .cfi_offset w23, -56
+; GISEL-NEXT:    .cfi_offset w24, -64
+; GISEL-NEXT:    .cfi_offset w25, -72
+; GISEL-NEXT:    .cfi_offset w26, -80
+; GISEL-NEXT:    .cfi_offset w27, -88
+; GISEL-NEXT:    .cfi_offset w28, -96
+; GISEL-NEXT:    mov w8, w2
+; GISEL-NEXT:    ldp x20, x16, [x1]
+; GISEL-NEXT:    mov w9, #64 ; =0x40
+; GISEL-NEXT:    and x14, x8, #0x3f
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    sub x15, x9, x14
+; GISEL-NEXT:    ldp x12, x13, [x1, #16]
+; GISEL-NEXT:    lsl x10, x16, x15
+; GISEL-NEXT:    lsr x9, x8, #6
+; GISEL-NEXT:    lsr x11, x20, x14
+; GISEL-NEXT:    lsr x19, x16, x14
+; GISEL-NEXT:    str x16, [sp, #264] ; 8-byte Folded Spill
+; GISEL-NEXT:    csel x10, xzr, x10, eq
+; GISEL-NEXT:    lsl x22, x12, x15
+; GISEL-NEXT:    cmp x9, #0
+; GISEL-NEXT:    orr x10, x11, x10
+; GISEL-NEXT:    str x12, [sp, #240] ; 8-byte Folded Spill
+; GISEL-NEXT:    lsr x26, x12, x14
+; GISEL-NEXT:    csel x10, x10, xzr, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    lsl x24, x13, x15
+; GISEL-NEXT:    csel x11, xzr, x22, eq
+; GISEL-NEXT:    cmp x9, #1
+; GISEL-NEXT:    lsr x5, x13, x14
+; GISEL-NEXT:    orr x11, x19, x11
+; GISEL-NEXT:    ldp x12, x16, [x1, #32]
+; GISEL-NEXT:    csel x10, x11, x10, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    str x0, [sp, #296] ; 8-byte Folded Spill
+; GISEL-NEXT:    csel x11, xzr, x24, eq
+; GISEL-NEXT:    cmp x9, #2
+; GISEL-NEXT:    str x13, [sp, #216] ; 8-byte Folded Spill
+; GISEL-NEXT:    lsl x23, x12, x15
+; GISEL-NEXT:    orr x11, x26, x11
+; GISEL-NEXT:    stp x12, x16, [sp, #176] ; 16-byte Folded Spill
+; GISEL-NEXT:    csel x10, x11, x10, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    lsr x17, x12, x14
+; GISEL-NEXT:    csel x11, xzr, x23, eq
+; GISEL-NEXT:    lsl x0, x16, x15
+; GISEL-NEXT:    cmp x9, #3
+; GISEL-NEXT:    orr x11, x5, x11
+; GISEL-NEXT:    ldp x13, x12, [x1, #48]
+; GISEL-NEXT:    csel x10, x11, x10, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    lsr x7, x16, x14
+; GISEL-NEXT:    csel x11, xzr, x0, eq
+; GISEL-NEXT:    cmp x9, #4
+; GISEL-NEXT:    stp x17, x0, [sp, #152] ; 16-byte Folded Spill
+; GISEL-NEXT:    lsl x2, x13, x15
+; GISEL-NEXT:    orr x11, x17, x11
+; GISEL-NEXT:    stp x13, x12, [sp, #192] ; 16-byte Folded Spill
+; GISEL-NEXT:    csel x10, x11, x10, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    lsr x13, x13, x14
+; GISEL-NEXT:    csel x11, xzr, x2, eq
+; GISEL-NEXT:    lsl x0, x12, x15
+; GISEL-NEXT:    cmp x9, #5
+; GISEL-NEXT:    stp x13, x2, [sp, #136] ; 16-byte Folded Spill
+; GISEL-NEXT:    orr x11, x7, x11
+; GISEL-NEXT:    lsr x12, x12, x14
+; GISEL-NEXT:    ldp x4, x2, [x1, #64]
+; GISEL-NEXT:    csel x10, x11, x10, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    ldr x17, [sp, #144] ; 8-byte Folded Reload
+; GISEL-NEXT:    stp x5, x23, [sp, #24] ; 16-byte Folded Spill
+; GISEL-NEXT:    csel x11, xzr, x0, eq
+; GISEL-NEXT:    cmp x9, #6
+; GISEL-NEXT:    lsl x3, x4, x15
+; GISEL-NEXT:    orr x11, x13, x11
+; GISEL-NEXT:    str x4, [sp, #208] ; 8-byte Folded Spill
+; GISEL-NEXT:    csel x10, x11, x10, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    lsl x6, x2, x15
+; GISEL-NEXT:    csel x11, xzr, x3, eq
+; GISEL-NEXT:    cmp x9, #7
+; GISEL-NEXT:    lsr x13, x4, x14
+; GISEL-NEXT:    orr x11, x12, x11
+; GISEL-NEXT:    str x2, [sp, #224] ; 8-byte Folded Spill
+; GISEL-NEXT:    csel x16, x11, x10, eq
+; GISEL-NEXT:    ldp x10, x4, [x1, #80]
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    mov x11, x2
+; GISEL-NEXT:    stp x13, x12, [sp, #120] ; 16-byte Folded Spill
+; GISEL-NEXT:    csel x2, xzr, x6, eq
+; GISEL-NEXT:    cmp x9, #8
+; GISEL-NEXT:    lsr x11, x11, x14
+; GISEL-NEXT:    orr x2, x13, x2
+; GISEL-NEXT:    lsl x12, x10, x15
+; GISEL-NEXT:    str x10, [sp, #232] ; 8-byte Folded Spill
+; GISEL-NEXT:    csel x16, x2, x16, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    lsr x10, x10, x14
+; GISEL-NEXT:    csel x2, xzr, x12, eq
+; GISEL-NEXT:    str x12, [sp, #312] ; 8-byte Folded Spill
+; GISEL-NEXT:    cmp x9, #9
+; GISEL-NEXT:    orr x2, x11, x2
+; GISEL-NEXT:    lsl x12, x4, x15
+; GISEL-NEXT:    str x10, [sp, #304] ; 8-byte Folded Spill
+; GISEL-NEXT:    csel x16, x2, x16, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    lsr x13, x4, x14
+; GISEL-NEXT:    stp x12, x11, [sp, #104] ; 16-byte Folded Spill
+; GISEL-NEXT:    ldr x11, [x1, #96]
+; GISEL-NEXT:    csel x2, xzr, x12, eq
+; GISEL-NEXT:    orr x2, x10, x2
+; GISEL-NEXT:    ldp x10, x30, [x1, #104]
+; GISEL-NEXT:    cmp x9, #10
+; GISEL-NEXT:    lsl x28, x11, x15
+; GISEL-NEXT:    stp x4, x11, [sp, #248] ; 16-byte Folded Spill
+; GISEL-NEXT:    csel x16, x2, x16, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    str x3, [sp, #16] ; 8-byte Folded Spill
+; GISEL-NEXT:    csel x2, xzr, x28, eq
+; GISEL-NEXT:    lsl x12, x10, x15
+; GISEL-NEXT:    cmp x9, #11
+; GISEL-NEXT:    orr x2, x13, x2
+; GISEL-NEXT:    lsl x21, x30, x15
+; GISEL-NEXT:    stp x10, x30, [sp, #272] ; 16-byte Folded Spill
+; GISEL-NEXT:    csel x16, x2, x16, eq
+; GISEL-NEXT:    stp x12, x13, [sp, #88] ; 16-byte Folded Spill
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    lsr x13, x11, x14
+; GISEL-NEXT:    csel x2, xzr, x12, eq
+; GISEL-NEXT:    cmp x9, #12
+; GISEL-NEXT:    ldr x11, [x1, #120]
+; GISEL-NEXT:    lsr x10, x10, x14
+; GISEL-NEXT:    lsr x27, x30, x14
+; GISEL-NEXT:    orr x4, x13, x2
+; GISEL-NEXT:    mov x12, x23
+; GISEL-NEXT:    str x28, [sp, #48] ; 8-byte Folded Spill
+; GISEL-NEXT:    csel x16, x4, x16, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    lsl x25, x11, x15
+; GISEL-NEXT:    csel x1, xzr, x21, eq
+; GISEL-NEXT:    cmp x9, #13
+; GISEL-NEXT:    stp x10, x13, [sp, #72] ; 16-byte Folded Spill
+; GISEL-NEXT:    orr x1, x10, x1
+; GISEL-NEXT:    lsr x10, x11, x14
+; GISEL-NEXT:    str x11, [sp, #288] ; 8-byte Folded Spill
+; GISEL-NEXT:    csel x1, x1, x16, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    str x21, [sp, #40] ; 8-byte Folded Spill
+; GISEL-NEXT:    csel x30, xzr, x25, eq
+; GISEL-NEXT:    cmp x9, #14
+; GISEL-NEXT:    stp x27, x10, [sp, #56] ; 16-byte Folded Spill
+; GISEL-NEXT:    orr x30, x27, x30
+; GISEL-NEXT:    ldp x11, x13, [sp, #152] ; 16-byte Folded Reload
+; GISEL-NEXT:    csel x1, x30, x1, eq
+; GISEL-NEXT:    cmp x9, #15
+; GISEL-NEXT:    mov x30, x7
+; GISEL-NEXT:    csel x1, x10, x1, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x10, x20, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x1, xzr, x22, eq
+; GISEL-NEXT:    cmp x9, #0
+; GISEL-NEXT:    str x10, [sp, #168] ; 8-byte Folded Spill
+; GISEL-NEXT:    orr x1, x19, x1
+; GISEL-NEXT:    ldp x20, x14, [sp, #112] ; 16-byte Folded Reload
+; GISEL-NEXT:    csel x1, x1, xzr, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x19, xzr, x24, eq
+; GISEL-NEXT:    cmp x9, #1
+; GISEL-NEXT:    orr x19, x26, x19
+; GISEL-NEXT:    ldp x10, x15, [sp, #304] ; 16-byte Folded Reload
+; GISEL-NEXT:    csel x1, x19, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x19, xzr, x23, eq
+; GISEL-NEXT:    cmp x9, #2
+; GISEL-NEXT:    orr x19, x5, x19
+; GISEL-NEXT:    ldp x16, x22, [sp, #96] ; 16-byte Folded Reload
+; GISEL-NEXT:    csel x1, x19, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x19, xzr, x13, eq
+; GISEL-NEXT:    cmp x9, #3
+; GISEL-NEXT:    orr x19, x11, x19
+; GISEL-NEXT:    ldp x4, x2, [sp, #80] ; 16-byte Folded Reload
+; GISEL-NEXT:    csel x1, x19, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x19, xzr, x17, eq
+; GISEL-NEXT:    cmp x9, #4
+; GISEL-NEXT:    orr x19, x7, x19
+; GISEL-NEXT:    mov x7, x0
+; GISEL-NEXT:    csel x1, x19, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x19, xzr, x0, eq
+; GISEL-NEXT:    ldp x23, x0, [sp, #128] ; 16-byte Folded Reload
+; GISEL-NEXT:    cmp x9, #5
+; GISEL-NEXT:    orr x19, x0, x19
+; GISEL-NEXT:    csel x1, x19, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x19, xzr, x3, eq
+; GISEL-NEXT:    cmp x9, #6
+; GISEL-NEXT:    orr x19, x23, x19
+; GISEL-NEXT:    csel x1, x19, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x19, xzr, x6, eq
+; GISEL-NEXT:    cmp x9, #7
+; GISEL-NEXT:    orr x19, x14, x19
+; GISEL-NEXT:    csel x1, x19, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x19, xzr, x15, eq
+; GISEL-NEXT:    cmp x9, #8
+; GISEL-NEXT:    orr x19, x20, x19
+; GISEL-NEXT:    csel x1, x19, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x19, xzr, x22, eq
+; GISEL-NEXT:    cmp x9, #9
+; GISEL-NEXT:    orr x19, x10, x19
+; GISEL-NEXT:    ldr x10, [sp, #264] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x1, x19, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x19, xzr, x28, eq
+; GISEL-NEXT:    cmp x9, #10
+; GISEL-NEXT:    orr x19, x16, x19
+; GISEL-NEXT:    csel x1, x19, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x19, xzr, x2, eq
+; GISEL-NEXT:    cmp x9, #11
+; GISEL-NEXT:    orr x19, x4, x19
+; GISEL-NEXT:    csel x1, x19, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x19, xzr, x21, eq
+; GISEL-NEXT:    ldp x28, x21, [sp, #64] ; 16-byte Folded Reload
+; GISEL-NEXT:    cmp x9, #12
+; GISEL-NEXT:    orr x19, x21, x19
+; GISEL-NEXT:    csel x1, x19, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x19, xzr, x25, eq
+; GISEL-NEXT:    cmp x9, #13
+; GISEL-NEXT:    orr x19, x27, x19
+; GISEL-NEXT:    csel x1, x19, x1, eq
+; GISEL-NEXT:    cmp x9, #14
+; GISEL-NEXT:    csel x1, x28, x1, eq
+; GISEL-NEXT:    cmp x9, #15
+; GISEL-NEXT:    csel x1, xzr, x1, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x10, x10, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x1, xzr, x24, eq
+; GISEL-NEXT:    cmp x9, #0
+; GISEL-NEXT:    mov x24, x11
+; GISEL-NEXT:    orr x1, x26, x1
+; GISEL-NEXT:    str x10, [sp, #264] ; 8-byte Folded Spill
+; GISEL-NEXT:    ldr x10, [sp, #240] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x1, x1, xzr, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    mov x26, x13
+; GISEL-NEXT:    csel x19, xzr, x12, eq
+; GISEL-NEXT:    cmp x9, #1
+; GISEL-NEXT:    mov x12, x30
+; GISEL-NEXT:    orr x19, x5, x19
+; GISEL-NEXT:    mov x5, x15
+; GISEL-NEXT:    csel x1, x19, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x19, xzr, x13, eq
+; GISEL-NEXT:    cmp x9, #2
+; GISEL-NEXT:    mov x13, x23
+; GISEL-NEXT:    orr x19, x11, x19
+; GISEL-NEXT:    mov x11, x17
+; GISEL-NEXT:    csel x1, x19, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x19, xzr, x17, eq
+; GISEL-NEXT:    cmp x9, #3
+; GISEL-NEXT:    mov x17, x20
+; GISEL-NEXT:    orr x19, x30, x19
+; GISEL-NEXT:    mov x30, x7
+; GISEL-NEXT:    csel x1, x19, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    mov x27, x30
+; GISEL-NEXT:    csel x19, xzr, x7, eq
+; GISEL-NEXT:    cmp x9, #4
+; GISEL-NEXT:    mov x7, x14
+; GISEL-NEXT:    orr x19, x0, x19
+; GISEL-NEXT:    csel x1, x19, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x19, xzr, x3, eq
+; GISEL-NEXT:    cmp x9, #5
+; GISEL-NEXT:    mov x3, x22
+; GISEL-NEXT:    orr x19, x23, x19
+; GISEL-NEXT:    ldr x23, [sp, #16] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x1, x19, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x19, xzr, x6, eq
+; GISEL-NEXT:    cmp x9, #6
+; GISEL-NEXT:    orr x19, x14, x19
+; GISEL-NEXT:    csel x1, x19, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x19, xzr, x15, eq
+; GISEL-NEXT:    cmp x9, #7
+; GISEL-NEXT:    ldr x15, [sp, #304] ; 8-byte Folded Reload
+; GISEL-NEXT:    orr x19, x20, x19
+; GISEL-NEXT:    ldp x14, x20, [sp, #40] ; 16-byte Folded Reload
+; GISEL-NEXT:    csel x1, x19, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x19, xzr, x22, eq
+; GISEL-NEXT:    cmp x9, #8
+; GISEL-NEXT:    ldr x22, [sp, #56] ; 8-byte Folded Reload
+; GISEL-NEXT:    orr x19, x15, x19
+; GISEL-NEXT:    csel x1, x19, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x19, xzr, x20, eq
+; GISEL-NEXT:    cmp x9, #9
+; GISEL-NEXT:    orr x19, x16, x19
+; GISEL-NEXT:    csel x1, x19, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x19, xzr, x2, eq
+; GISEL-NEXT:    cmp x9, #10
+; GISEL-NEXT:    orr x19, x4, x19
+; GISEL-NEXT:    csel x1, x19, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x19, xzr, x14, eq
+; GISEL-NEXT:    cmp x9, #11
+; GISEL-NEXT:    orr x19, x21, x19
+; GISEL-NEXT:    csel x1, x19, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x19, xzr, x25, eq
+; GISEL-NEXT:    cmp x9, #12
+; GISEL-NEXT:    orr x19, x22, x19
+; GISEL-NEXT:    csel x1, x19, x1, eq
+; GISEL-NEXT:    cmp x9, #13
+; GISEL-NEXT:    csel x1, x28, x1, eq
+; GISEL-NEXT:    cmp x9, #14
+; GISEL-NEXT:    csel x1, xzr, x1, eq
+; GISEL-NEXT:    cmp x9, #15
+; GISEL-NEXT:    csel x1, xzr, x1, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x10, x10, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    str x10, [sp, #240] ; 8-byte Folded Spill
+; GISEL-NEXT:    ldr x10, [sp, #32] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x1, xzr, x10, eq
+; GISEL-NEXT:    ldr x10, [sp, #24] ; 8-byte Folded Reload
+; GISEL-NEXT:    cmp x9, #0
+; GISEL-NEXT:    orr x1, x10, x1
+; GISEL-NEXT:    ldr x10, [sp, #216] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x1, x1, xzr, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x19, xzr, x26, eq
+; GISEL-NEXT:    cmp x9, #1
+; GISEL-NEXT:    orr x19, x24, x19
+; GISEL-NEXT:    csel x1, x19, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x19, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #2
+; GISEL-NEXT:    orr x19, x12, x19
+; GISEL-NEXT:    csel x1, x19, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x19, xzr, x30, eq
+; GISEL-NEXT:    cmp x9, #3
+; GISEL-NEXT:    mov x30, x0
+; GISEL-NEXT:    orr x19, x0, x19
+; GISEL-NEXT:    mov x0, x13
+; GISEL-NEXT:    csel x1, x19, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x19, xzr, x23, eq
+; GISEL-NEXT:    cmp x9, #4
+; GISEL-NEXT:    orr x19, x13, x19
+; GISEL-NEXT:    mov x13, x3
+; GISEL-NEXT:    csel x1, x19, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x19, xzr, x6, eq
+; GISEL-NEXT:    cmp x9, #5
+; GISEL-NEXT:    orr x19, x7, x19
+; GISEL-NEXT:    csel x1, x19, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x19, xzr, x5, eq
+; GISEL-NEXT:    cmp x9, #6
+; GISEL-NEXT:    mov x5, x17
+; GISEL-NEXT:    orr x19, x17, x19
+; GISEL-NEXT:    mov x17, x22
+; GISEL-NEXT:    csel x1, x19, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x19, xzr, x3, eq
+; GISEL-NEXT:    cmp x9, #7
+; GISEL-NEXT:    mov x3, x20
+; GISEL-NEXT:    orr x19, x15, x19
+; GISEL-NEXT:    csel x1, x19, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x19, xzr, x20, eq
+; GISEL-NEXT:    cmp x9, #8
+; GISEL-NEXT:    mov x20, x14
+; GISEL-NEXT:    orr x19, x16, x19
+; GISEL-NEXT:    csel x1, x19, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x19, xzr, x2, eq
+; GISEL-NEXT:    cmp x9, #9
+; GISEL-NEXT:    orr x19, x4, x19
+; GISEL-NEXT:    csel x1, x19, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x19, xzr, x14, eq
+; GISEL-NEXT:    cmp x9, #10
+; GISEL-NEXT:    mov x14, x13
+; GISEL-NEXT:    orr x19, x21, x19
+; GISEL-NEXT:    csel x1, x19, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x19, xzr, x25, eq
+; GISEL-NEXT:    cmp x9, #11
+; GISEL-NEXT:    orr x19, x22, x19
+; GISEL-NEXT:    mov x22, x30
+; GISEL-NEXT:    csel x1, x19, x1, eq
+; GISEL-NEXT:    cmp x9, #12
+; GISEL-NEXT:    csel x1, x28, x1, eq
+; GISEL-NEXT:    cmp x9, #13
+; GISEL-NEXT:    csel x1, xzr, x1, eq
+; GISEL-NEXT:    cmp x9, #14
+; GISEL-NEXT:    csel x1, xzr, x1, eq
+; GISEL-NEXT:    cmp x9, #15
+; GISEL-NEXT:    csel x1, xzr, x1, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x10, x10, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x1, xzr, x26, eq
+; GISEL-NEXT:    cmp x9, #0
+; GISEL-NEXT:    str x10, [sp, #216] ; 8-byte Folded Spill
+; GISEL-NEXT:    orr x1, x24, x1
+; GISEL-NEXT:    ldr x10, [sp, #176] ; 8-byte Folded Reload
+; GISEL-NEXT:    mov x24, x3
+; GISEL-NEXT:    csel x1, x1, xzr, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    mov x26, x5
+; GISEL-NEXT:    csel x19, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #1
+; GISEL-NEXT:    orr x19, x12, x19
+; GISEL-NEXT:    csel x1, x19, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x19, xzr, x27, eq
+; GISEL-NEXT:    cmp x9, #2
+; GISEL-NEXT:    orr x19, x30, x19
+; GISEL-NEXT:    ldr x30, [sp, #312] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x1, x19, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x19, xzr, x23, eq
+; GISEL-NEXT:    cmp x9, #3
+; GISEL-NEXT:    orr x19, x0, x19
+; GISEL-NEXT:    csel x1, x19, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x19, xzr, x6, eq
+; GISEL-NEXT:    cmp x9, #4
+; GISEL-NEXT:    orr x19, x7, x19
+; GISEL-NEXT:    csel x1, x19, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x19, xzr, x30, eq
+; GISEL-NEXT:    cmp x9, #5
+; GISEL-NEXT:    orr x19, x5, x19
+; GISEL-NEXT:    csel x1, x19, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x19, xzr, x13, eq
+; GISEL-NEXT:    cmp x9, #6
+; GISEL-NEXT:    orr x19, x15, x19
+; GISEL-NEXT:    csel x1, x19, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x19, xzr, x3, eq
+; GISEL-NEXT:    cmp x9, #7
+; GISEL-NEXT:    orr x19, x16, x19
+; GISEL-NEXT:    csel x1, x19, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x19, xzr, x2, eq
+; GISEL-NEXT:    cmp x9, #8
+; GISEL-NEXT:    orr x19, x4, x19
+; GISEL-NEXT:    csel x1, x19, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x19, xzr, x20, eq
+; GISEL-NEXT:    cmp x9, #9
+; GISEL-NEXT:    orr x19, x21, x19
+; GISEL-NEXT:    csel x1, x19, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x19, xzr, x25, eq
+; GISEL-NEXT:    cmp x9, #10
+; GISEL-NEXT:    orr x19, x17, x19
+; GISEL-NEXT:    csel x1, x19, x1, eq
+; GISEL-NEXT:    cmp x9, #11
+; GISEL-NEXT:    csel x1, x28, x1, eq
+; GISEL-NEXT:    cmp x9, #12
+; GISEL-NEXT:    csel x1, xzr, x1, eq
+; GISEL-NEXT:    cmp x9, #13
+; GISEL-NEXT:    csel x1, xzr, x1, eq
+; GISEL-NEXT:    cmp x9, #14
+; GISEL-NEXT:    csel x1, xzr, x1, eq
+; GISEL-NEXT:    cmp x9, #15
+; GISEL-NEXT:    csel x1, xzr, x1, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x19, x10, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    ldr x10, [sp, #184] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x1, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #0
+; GISEL-NEXT:    mov x11, x23
+; GISEL-NEXT:    orr x1, x12, x1
+; GISEL-NEXT:    mov x12, x0
+; GISEL-NEXT:    csel x1, x1, xzr, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x3, xzr, x27, eq
+; GISEL-NEXT:    cmp x9, #1
+; GISEL-NEXT:    orr x3, x22, x3
+; GISEL-NEXT:    csel x1, x3, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x3, xzr, x23, eq
+; GISEL-NEXT:    cmp x9, #2
+; GISEL-NEXT:    mov x23, x17
+; GISEL-NEXT:    orr x3, x0, x3
+; GISEL-NEXT:    csel x1, x3, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x3, xzr, x6, eq
+; GISEL-NEXT:    cmp x9, #3
+; GISEL-NEXT:    orr x3, x7, x3
+; GISEL-NEXT:    csel x1, x3, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x3, xzr, x30, eq
+; GISEL-NEXT:    cmp x9, #4
+; GISEL-NEXT:    orr x3, x26, x3
+; GISEL-NEXT:    csel x1, x3, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x3, xzr, x13, eq
+; GISEL-NEXT:    cmp x9, #5
+; GISEL-NEXT:    orr x3, x15, x3
+; GISEL-NEXT:    csel x1, x3, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x3, xzr, x24, eq
+; GISEL-NEXT:    cmp x9, #6
+; GISEL-NEXT:    orr x3, x16, x3
+; GISEL-NEXT:    csel x1, x3, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x3, xzr, x2, eq
+; GISEL-NEXT:    cmp x9, #7
+; GISEL-NEXT:    orr x3, x4, x3
+; GISEL-NEXT:    csel x1, x3, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x3, xzr, x20, eq
+; GISEL-NEXT:    cmp x9, #8
+; GISEL-NEXT:    orr x3, x21, x3
+; GISEL-NEXT:    csel x1, x3, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x3, xzr, x25, eq
+; GISEL-NEXT:    cmp x9, #9
+; GISEL-NEXT:    orr x3, x17, x3
+; GISEL-NEXT:    csel x1, x3, x1, eq
+; GISEL-NEXT:    cmp x9, #10
+; GISEL-NEXT:    mov x3, x4
+; GISEL-NEXT:    csel x1, x28, x1, eq
+; GISEL-NEXT:    cmp x9, #11
+; GISEL-NEXT:    csel x1, xzr, x1, eq
+; GISEL-NEXT:    cmp x9, #12
+; GISEL-NEXT:    csel x1, xzr, x1, eq
+; GISEL-NEXT:    cmp x9, #13
+; GISEL-NEXT:    csel x1, xzr, x1, eq
+; GISEL-NEXT:    cmp x9, #14
+; GISEL-NEXT:    csel x1, xzr, x1, eq
+; GISEL-NEXT:    cmp x9, #15
+; GISEL-NEXT:    csel x1, xzr, x1, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x10, x10, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x17, xzr, x27, eq
+; GISEL-NEXT:    cmp x9, #0
+; GISEL-NEXT:    str x10, [sp, #184] ; 8-byte Folded Spill
+; GISEL-NEXT:    orr x17, x22, x17
+; GISEL-NEXT:    ldr x10, [sp, #192] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x17, x17, xzr, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x0, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #1
+; GISEL-NEXT:    orr x0, x12, x0
+; GISEL-NEXT:    csel x17, x0, x17, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x0, xzr, x6, eq
+; GISEL-NEXT:    cmp x9, #2
+; GISEL-NEXT:    orr x0, x7, x0
+; GISEL-NEXT:    csel x17, x0, x17, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x0, xzr, x30, eq
+; GISEL-NEXT:    cmp x9, #3
+; GISEL-NEXT:    orr x0, x26, x0
+; GISEL-NEXT:    csel x17, x0, x17, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x0, xzr, x13, eq
+; GISEL-NEXT:    cmp x9, #4
+; GISEL-NEXT:    orr x0, x15, x0
+; GISEL-NEXT:    csel x17, x0, x17, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x0, xzr, x24, eq
+; GISEL-NEXT:    cmp x9, #5
+; GISEL-NEXT:    orr x0, x16, x0
+; GISEL-NEXT:    csel x17, x0, x17, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x0, xzr, x2, eq
+; GISEL-NEXT:    cmp x9, #6
+; GISEL-NEXT:    orr x0, x4, x0
+; GISEL-NEXT:    csel x17, x0, x17, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x0, xzr, x20, eq
+; GISEL-NEXT:    cmp x9, #7
+; GISEL-NEXT:    orr x0, x21, x0
+; GISEL-NEXT:    csel x17, x0, x17, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x0, xzr, x25, eq
+; GISEL-NEXT:    cmp x9, #8
+; GISEL-NEXT:    orr x0, x23, x0
+; GISEL-NEXT:    csel x17, x0, x17, eq
+; GISEL-NEXT:    cmp x9, #9
+; GISEL-NEXT:    csel x17, x28, x17, eq
+; GISEL-NEXT:    cmp x9, #10
+; GISEL-NEXT:    csel x17, xzr, x17, eq
+; GISEL-NEXT:    cmp x9, #11
+; GISEL-NEXT:    csel x17, xzr, x17, eq
+; GISEL-NEXT:    cmp x9, #12
+; GISEL-NEXT:    csel x17, xzr, x17, eq
+; GISEL-NEXT:    cmp x9, #13
+; GISEL-NEXT:    csel x17, xzr, x17, eq
+; GISEL-NEXT:    cmp x9, #14
+; GISEL-NEXT:    csel x17, xzr, x17, eq
+; GISEL-NEXT:    cmp x9, #15
+; GISEL-NEXT:    csel x17, xzr, x17, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x17, x10, x17, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    ldr x10, [sp, #200] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x13, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #0
+; GISEL-NEXT:    orr x12, x12, x13
+; GISEL-NEXT:    csel x12, x12, xzr, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x6, eq
+; GISEL-NEXT:    cmp x9, #1
+; GISEL-NEXT:    orr x13, x7, x13
+; GISEL-NEXT:    csel x12, x13, x12, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x30, eq
+; GISEL-NEXT:    cmp x9, #2
+; GISEL-NEXT:    orr x13, x26, x13
+; GISEL-NEXT:    csel x12, x13, x12, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x14, eq
+; GISEL-NEXT:    cmp x9, #3
+; GISEL-NEXT:    orr x13, x15, x13
+; GISEL-NEXT:    csel x12, x13, x12, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x24, eq
+; GISEL-NEXT:    cmp x9, #4
+; GISEL-NEXT:    orr x13, x16, x13
+; GISEL-NEXT:    csel x12, x13, x12, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x2, eq
+; GISEL-NEXT:    cmp x9, #5
+; GISEL-NEXT:    orr x13, x4, x13
+; GISEL-NEXT:    csel x12, x13, x12, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x20, eq
+; GISEL-NEXT:    cmp x9, #6
+; GISEL-NEXT:    orr x13, x21, x13
+; GISEL-NEXT:    csel x12, x13, x12, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x25, eq
+; GISEL-NEXT:    cmp x9, #7
+; GISEL-NEXT:    orr x13, x23, x13
+; GISEL-NEXT:    csel x12, x13, x12, eq
+; GISEL-NEXT:    cmp x9, #8
+; GISEL-NEXT:    csel x12, x28, x12, eq
+; GISEL-NEXT:    cmp x9, #9
+; GISEL-NEXT:    csel x12, xzr, x12, eq
+; GISEL-NEXT:    cmp x9, #10
+; GISEL-NEXT:    csel x12, xzr, x12, eq
+; GISEL-NEXT:    cmp x9, #11
+; GISEL-NEXT:    csel x12, xzr, x12, eq
+; GISEL-NEXT:    cmp x9, #12
+; GISEL-NEXT:    csel x12, xzr, x12, eq
+; GISEL-NEXT:    cmp x9, #13
+; GISEL-NEXT:    csel x12, xzr, x12, eq
+; GISEL-NEXT:    cmp x9, #14
+; GISEL-NEXT:    csel x12, xzr, x12, eq
+; GISEL-NEXT:    cmp x9, #15
+; GISEL-NEXT:    csel x12, xzr, x12, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x12, x10, x12, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x11, xzr, x6, eq
+; GISEL-NEXT:    cmp x9, #0
+; GISEL-NEXT:    orr x10, x7, x11
+; GISEL-NEXT:    csel x10, x10, xzr, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x11, xzr, x30, eq
+; GISEL-NEXT:    cmp x9, #1
+; GISEL-NEXT:    orr x11, x26, x11
+; GISEL-NEXT:    csel x10, x11, x10, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x11, xzr, x14, eq
+; GISEL-NEXT:    cmp x9, #2
+; GISEL-NEXT:    orr x11, x15, x11
+; GISEL-NEXT:    csel x10, x11, x10, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x11, xzr, x24, eq
+; GISEL-NEXT:    cmp x9, #3
+; GISEL-NEXT:    orr x11, x16, x11
+; GISEL-NEXT:    csel x10, x11, x10, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x11, xzr, x2, eq
+; GISEL-NEXT:    cmp x9, #4
+; GISEL-NEXT:    orr x11, x4, x11
+; GISEL-NEXT:    ldr x4, [sp, #168] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x10, x11, x10, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x11, xzr, x20, eq
+; GISEL-NEXT:    cmp x9, #5
+; GISEL-NEXT:    orr x11, x21, x11
+; GISEL-NEXT:    csel x10, x11, x10, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x11, xzr, x25, eq
+; GISEL-NEXT:    cmp x9, #6
+; GISEL-NEXT:    orr x11, x23, x11
+; GISEL-NEXT:    csel x10, x11, x10, eq
+; GISEL-NEXT:    cmp x9, #7
+; GISEL-NEXT:    ldr x11, [sp, #208] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x10, x28, x10, eq
+; GISEL-NEXT:    cmp x9, #8
+; GISEL-NEXT:    csel x10, xzr, x10, eq
+; GISEL-NEXT:    cmp x9, #9
+; GISEL-NEXT:    csel x10, xzr, x10, eq
+; GISEL-NEXT:    cmp x9, #10
+; GISEL-NEXT:    csel x10, xzr, x10, eq
+; GISEL-NEXT:    cmp x9, #11
+; GISEL-NEXT:    csel x10, xzr, x10, eq
+; GISEL-NEXT:    cmp x9, #12
+; GISEL-NEXT:    csel x10, xzr, x10, eq
+; GISEL-NEXT:    cmp x9, #13
+; GISEL-NEXT:    csel x10, xzr, x10, eq
+; GISEL-NEXT:    cmp x9, #14
+; GISEL-NEXT:    csel x10, xzr, x10, eq
+; GISEL-NEXT:    cmp x9, #15
+; GISEL-NEXT:    csel x10, xzr, x10, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x10, x11, x10, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x11, xzr, x30, eq
+; GISEL-NEXT:    cmp x9, #0
+; GISEL-NEXT:    orr x11, x26, x11
+; GISEL-NEXT:    ldp x29, x30, [sp, #400] ; 16-byte Folded Reload
+; GISEL-NEXT:    csel x11, x11, xzr, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x14, eq
+; GISEL-NEXT:    cmp x9, #1
+; GISEL-NEXT:    orr x13, x15, x13
+; GISEL-NEXT:    csel x11, x13, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x24, eq
+; GISEL-NEXT:    cmp x9, #2
+; GISEL-NEXT:    orr x13, x16, x13
+; GISEL-NEXT:    csel x11, x13, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x2, eq
+; GISEL-NEXT:    cmp x9, #3
+; GISEL-NEXT:    orr x13, x3, x13
+; GISEL-NEXT:    csel x11, x13, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x20, eq
+; GISEL-NEXT:    cmp x9, #4
+; GISEL-NEXT:    orr x13, x21, x13
+; GISEL-NEXT:    csel x11, x13, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x25, eq
+; GISEL-NEXT:    cmp x9, #5
+; GISEL-NEXT:    orr x13, x23, x13
+; GISEL-NEXT:    csel x11, x13, x11, eq
+; GISEL-NEXT:    cmp x9, #6
+; GISEL-NEXT:    ldr x13, [sp, #224] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x11, x28, x11, eq
+; GISEL-NEXT:    cmp x9, #7
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #8
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #9
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #10
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #11
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #12
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #13
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #14
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x9, #15
+; GISEL-NEXT:    csel x11, xzr, x11, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x11, x13, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x14, eq
+; GISEL-NEXT:    cmp x9, #0
+; GISEL-NEXT:    orr x13, x15, x13
+; GISEL-NEXT:    csel x13, x13, xzr, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x0, xzr, x24, eq
+; GISEL-NEXT:    cmp x9, #1
+; GISEL-NEXT:    orr x0, x16, x0
+; GISEL-NEXT:    csel x13, x0, x13, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x0, xzr, x2, eq
+; GISEL-NEXT:    cmp x9, #2
+; GISEL-NEXT:    orr x0, x3, x0
+; GISEL-NEXT:    csel x13, x0, x13, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x0, xzr, x20, eq
+; GISEL-NEXT:    cmp x9, #3
+; GISEL-NEXT:    orr x0, x21, x0
+; GISEL-NEXT:    csel x13, x0, x13, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x0, xzr, x25, eq
+; GISEL-NEXT:    cmp x9, #4
+; GISEL-NEXT:    orr x0, x23, x0
+; GISEL-NEXT:    csel x13, x0, x13, eq
+; GISEL-NEXT:    cmp x9, #5
+; GISEL-NEXT:    ldr x0, [sp, #232] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x13, x28, x13, eq
+; GISEL-NEXT:    cmp x9, #6
+; GISEL-NEXT:    csel x13, xzr, x13, eq
+; GISEL-NEXT:    cmp x9, #7
+; GISEL-NEXT:    csel x13, xzr, x13, eq
+; GISEL-NEXT:    cmp x9, #8
+; GISEL-NEXT:    csel x13, xzr, x13, eq
+; GISEL-NEXT:    cmp x9, #9
+; GISEL-NEXT:    csel x13, xzr, x13, eq
+; GISEL-NEXT:    cmp x9, #10
+; GISEL-NEXT:    csel x13, xzr, x13, eq
+; GISEL-NEXT:    cmp x9, #11
+; GISEL-NEXT:    csel x13, xzr, x13, eq
+; GISEL-NEXT:    cmp x9, #12
+; GISEL-NEXT:    csel x13, xzr, x13, eq
+; GISEL-NEXT:    cmp x9, #13
+; GISEL-NEXT:    csel x13, xzr, x13, eq
+; GISEL-NEXT:    cmp x9, #14
+; GISEL-NEXT:    csel x13, xzr, x13, eq
+; GISEL-NEXT:    cmp x9, #15
+; GISEL-NEXT:    csel x13, xzr, x13, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x13, x0, x13, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x0, xzr, x24, eq
+; GISEL-NEXT:    cmp x9, #0
+; GISEL-NEXT:    orr x0, x16, x0
+; GISEL-NEXT:    ldr x16, [sp, #280] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x0, x0, xzr, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x1, xzr, x2, eq
+; GISEL-NEXT:    cmp x9, #1
+; GISEL-NEXT:    orr x1, x3, x1
+; GISEL-NEXT:    csel x0, x1, x0, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x1, xzr, x20, eq
+; GISEL-NEXT:    cmp x9, #2
+; GISEL-NEXT:    orr x1, x21, x1
+; GISEL-NEXT:    csel x0, x1, x0, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x1, xzr, x25, eq
+; GISEL-NEXT:    cmp x9, #3
+; GISEL-NEXT:    orr x1, x23, x1
+; GISEL-NEXT:    csel x0, x1, x0, eq
+; GISEL-NEXT:    cmp x9, #4
+; GISEL-NEXT:    ldr x1, [sp, #248] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x0, x28, x0, eq
+; GISEL-NEXT:    cmp x9, #5
+; GISEL-NEXT:    csel x0, xzr, x0, eq
+; GISEL-NEXT:    cmp x9, #6
+; GISEL-NEXT:    csel x0, xzr, x0, eq
+; GISEL-NEXT:    cmp x9, #7
+; GISEL-NEXT:    csel x0, xzr, x0, eq
+; GISEL-NEXT:    cmp x9, #8
+; GISEL-NEXT:    csel x0, xzr, x0, eq
+; GISEL-NEXT:    cmp x9, #9
+; GISEL-NEXT:    csel x0, xzr, x0, eq
+; GISEL-NEXT:    cmp x9, #10
+; GISEL-NEXT:    csel x0, xzr, x0, eq
+; GISEL-NEXT:    cmp x9, #11
+; GISEL-NEXT:    csel x0, xzr, x0, eq
+; GISEL-NEXT:    cmp x9, #12
+; GISEL-NEXT:    csel x0, xzr, x0, eq
+; GISEL-NEXT:    cmp x9, #13
+; GISEL-NEXT:    csel x0, xzr, x0, eq
+; GISEL-NEXT:    cmp x9, #14
+; GISEL-NEXT:    csel x0, xzr, x0, eq
+; GISEL-NEXT:    cmp x9, #15
+; GISEL-NEXT:    csel x0, xzr, x0, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x0, x1, x0, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x1, xzr, x2, eq
+; GISEL-NEXT:    cmp x9, #0
+; GISEL-NEXT:    orr x1, x3, x1
+; GISEL-NEXT:    csel x1, x1, xzr, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x3, xzr, x20, eq
+; GISEL-NEXT:    cmp x9, #1
+; GISEL-NEXT:    orr x3, x21, x3
+; GISEL-NEXT:    csel x1, x3, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x3, xzr, x25, eq
+; GISEL-NEXT:    cmp x9, #2
+; GISEL-NEXT:    orr x3, x23, x3
+; GISEL-NEXT:    csel x1, x3, x1, eq
+; GISEL-NEXT:    cmp x9, #3
+; GISEL-NEXT:    ldr x3, [sp, #256] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x1, x28, x1, eq
+; GISEL-NEXT:    cmp x9, #4
+; GISEL-NEXT:    csel x1, xzr, x1, eq
+; GISEL-NEXT:    cmp x9, #5
+; GISEL-NEXT:    csel x1, xzr, x1, eq
+; GISEL-NEXT:    cmp x9, #6
+; GISEL-NEXT:    csel x1, xzr, x1, eq
+; GISEL-NEXT:    cmp x9, #7
+; GISEL-NEXT:    csel x1, xzr, x1, eq
+; GISEL-NEXT:    cmp x9, #8
+; GISEL-NEXT:    csel x1, xzr, x1, eq
+; GISEL-NEXT:    cmp x9, #9
+; GISEL-NEXT:    csel x1, xzr, x1, eq
+; GISEL-NEXT:    cmp x9, #10
+; GISEL-NEXT:    csel x1, xzr, x1, eq
+; GISEL-NEXT:    cmp x9, #11
+; GISEL-NEXT:    csel x1, xzr, x1, eq
+; GISEL-NEXT:    cmp x9, #12
+; GISEL-NEXT:    csel x1, xzr, x1, eq
+; GISEL-NEXT:    cmp x9, #13
+; GISEL-NEXT:    csel x1, xzr, x1, eq
+; GISEL-NEXT:    cmp x9, #14
+; GISEL-NEXT:    csel x1, xzr, x1, eq
+; GISEL-NEXT:    cmp x9, #15
+; GISEL-NEXT:    csel x1, xzr, x1, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x3, x3, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x1, xzr, x20, eq
+; GISEL-NEXT:    cmp x9, #0
+; GISEL-NEXT:    orr x1, x21, x1
+; GISEL-NEXT:    ldp x22, x21, [sp, #368] ; 16-byte Folded Reload
+; GISEL-NEXT:    csel x1, x1, xzr, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x2, xzr, x25, eq
+; GISEL-NEXT:    cmp x9, #1
+; GISEL-NEXT:    orr x2, x23, x2
+; GISEL-NEXT:    csel x1, x2, x1, eq
+; GISEL-NEXT:    cmp x9, #2
+; GISEL-NEXT:    ldr x2, [sp, #272] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x1, x28, x1, eq
+; GISEL-NEXT:    cmp x9, #3
+; GISEL-NEXT:    csel x1, xzr, x1, eq
+; GISEL-NEXT:    cmp x9, #4
+; GISEL-NEXT:    csel x1, xzr, x1, eq
+; GISEL-NEXT:    cmp x9, #5
+; GISEL-NEXT:    csel x1, xzr, x1, eq
+; GISEL-NEXT:    cmp x9, #6
+; GISEL-NEXT:    csel x1, xzr, x1, eq
+; GISEL-NEXT:    cmp x9, #7
+; GISEL-NEXT:    csel x1, xzr, x1, eq
+; GISEL-NEXT:    cmp x9, #8
+; GISEL-NEXT:    csel x1, xzr, x1, eq
+; GISEL-NEXT:    cmp x9, #9
+; GISEL-NEXT:    csel x1, xzr, x1, eq
+; GISEL-NEXT:    cmp x9, #10
+; GISEL-NEXT:    csel x1, xzr, x1, eq
+; GISEL-NEXT:    cmp x9, #11
+; GISEL-NEXT:    csel x1, xzr, x1, eq
+; GISEL-NEXT:    cmp x9, #12
+; GISEL-NEXT:    csel x1, xzr, x1, eq
+; GISEL-NEXT:    cmp x9, #13
+; GISEL-NEXT:    csel x1, xzr, x1, eq
+; GISEL-NEXT:    cmp x9, #14
+; GISEL-NEXT:    csel x1, xzr, x1, eq
+; GISEL-NEXT:    cmp x9, #15
+; GISEL-NEXT:    csel x1, xzr, x1, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x2, x2, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    ldr x1, [sp, #264] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x15, xzr, x25, eq
+; GISEL-NEXT:    cmp x9, #0
+; GISEL-NEXT:    orr x15, x23, x15
+; GISEL-NEXT:    ldp x24, x23, [sp, #352] ; 16-byte Folded Reload
+; GISEL-NEXT:    csel x15, x15, xzr, eq
+; GISEL-NEXT:    cmp x9, #1
+; GISEL-NEXT:    csel x15, x28, x15, eq
+; GISEL-NEXT:    cmp x9, #2
+; GISEL-NEXT:    csel x15, xzr, x15, eq
+; GISEL-NEXT:    cmp x9, #3
+; GISEL-NEXT:    csel x15, xzr, x15, eq
+; GISEL-NEXT:    cmp x9, #4
+; GISEL-NEXT:    csel x15, xzr, x15, eq
+; GISEL-NEXT:    cmp x9, #5
+; GISEL-NEXT:    csel x15, xzr, x15, eq
+; GISEL-NEXT:    cmp x9, #6
+; GISEL-NEXT:    csel x15, xzr, x15, eq
+; GISEL-NEXT:    cmp x9, #7
+; GISEL-NEXT:    csel x15, xzr, x15, eq
+; GISEL-NEXT:    cmp x9, #8
+; GISEL-NEXT:    csel x15, xzr, x15, eq
+; GISEL-NEXT:    cmp x9, #9
+; GISEL-NEXT:    csel x15, xzr, x15, eq
+; GISEL-NEXT:    cmp x9, #10
+; GISEL-NEXT:    csel x15, xzr, x15, eq
+; GISEL-NEXT:    cmp x9, #11
+; GISEL-NEXT:    csel x15, xzr, x15, eq
+; GISEL-NEXT:    cmp x9, #12
+; GISEL-NEXT:    csel x15, xzr, x15, eq
+; GISEL-NEXT:    cmp x9, #13
+; GISEL-NEXT:    csel x15, xzr, x15, eq
+; GISEL-NEXT:    cmp x9, #14
+; GISEL-NEXT:    csel x15, xzr, x15, eq
+; GISEL-NEXT:    cmp x9, #15
+; GISEL-NEXT:    csel x15, xzr, x15, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x15, x16, x15, eq
+; GISEL-NEXT:    cmp x9, #0
+; GISEL-NEXT:    ldr x16, [sp, #296] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x14, x28, xzr, eq
+; GISEL-NEXT:    cmp x9, #1
+; GISEL-NEXT:    csel x14, xzr, x14, eq
+; GISEL-NEXT:    cmp x9, #2
+; GISEL-NEXT:    stp x17, x12, [x16, #48]
+; GISEL-NEXT:    csel x14, xzr, x14, eq
+; GISEL-NEXT:    cmp x9, #3
+; GISEL-NEXT:    stp x10, x11, [x16, #64]
+; GISEL-NEXT:    csel x14, xzr, x14, eq
+; GISEL-NEXT:    cmp x9, #4
+; GISEL-NEXT:    stp x4, x1, [x16]
+; GISEL-NEXT:    csel x14, xzr, x14, eq
+; GISEL-NEXT:    cmp x9, #5
+; GISEL-NEXT:    ldr x4, [sp, #240] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x14, xzr, x14, eq
+; GISEL-NEXT:    cmp x9, #6
+; GISEL-NEXT:    ldr x1, [sp, #216] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x14, xzr, x14, eq
+; GISEL-NEXT:    cmp x9, #7
+; GISEL-NEXT:    stp x13, x0, [x16, #80]
+; GISEL-NEXT:    csel x14, xzr, x14, eq
+; GISEL-NEXT:    cmp x9, #8
+; GISEL-NEXT:    stp x4, x1, [x16, #16]
+; GISEL-NEXT:    csel x14, xzr, x14, eq
+; GISEL-NEXT:    cmp x9, #9
+; GISEL-NEXT:    ldr x1, [sp, #184] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x12, xzr, x14, eq
+; GISEL-NEXT:    cmp x9, #10
+; GISEL-NEXT:    stp x3, x2, [x16, #96]
+; GISEL-NEXT:    csel x10, xzr, x12, eq
+; GISEL-NEXT:    cmp x9, #11
+; GISEL-NEXT:    stp x19, x1, [x16, #32]
+; GISEL-NEXT:    csel x10, xzr, x10, eq
+; GISEL-NEXT:    cmp x9, #12
+; GISEL-NEXT:    csel x10, xzr, x10, eq
+; GISEL-NEXT:    cmp x9, #13
+; GISEL-NEXT:    csel x10, xzr, x10, eq
+; GISEL-NEXT:    cmp x9, #14
+; GISEL-NEXT:    csel x10, xzr, x10, eq
+; GISEL-NEXT:    cmp x9, #15
+; GISEL-NEXT:    csel x9, xzr, x10, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    ldr x8, [sp, #288] ; 8-byte Folded Reload
+; GISEL-NEXT:    ldp x20, x19, [sp, #384] ; 16-byte Folded Reload
+; GISEL-NEXT:    ldp x26, x25, [sp, #336] ; 16-byte Folded Reload
+; GISEL-NEXT:    csel x8, x8, x9, eq
+; GISEL-NEXT:    ldp x28, x27, [sp, #320] ; 16-byte Folded Reload
+; GISEL-NEXT:    stp x15, x8, [x16, #112]
+; GISEL-NEXT:    add sp, sp, #416
+; GISEL-NEXT:    ret
+entry:
+  %input_val = load i1024, ptr %input, align 128
+  %shift_ext = zext i32 %shift to i1024
+  %shifted = lshr i1024 %input_val, %shift_ext
+  store i1024 %shifted, ptr %result, align 128
+  ret void
+}
+
+define void @test_ashr_i1024(ptr %result, ptr %input, i32 %shift) {
+; SDAG-LABEL: test_ashr_i1024:
+; SDAG:       ; %bb.0: ; %entry
+; SDAG-NEXT:    sub sp, sp, #336
+; SDAG-NEXT:    stp x28, x27, [sp, #256] ; 16-byte Folded Spill
+; SDAG-NEXT:    stp x26, x25, [sp, #272] ; 16-byte Folded Spill
+; SDAG-NEXT:    stp x24, x23, [sp, #288] ; 16-byte Folded Spill
+; SDAG-NEXT:    stp x22, x21, [sp, #304] ; 16-byte Folded Spill
+; SDAG-NEXT:    stp x20, x19, [sp, #320] ; 16-byte Folded Spill
+; SDAG-NEXT:    .cfi_def_cfa_offset 336
+; SDAG-NEXT:    .cfi_offset w19, -8
+; SDAG-NEXT:    .cfi_offset w20, -16
+; SDAG-NEXT:    .cfi_offset w21, -24
+; SDAG-NEXT:    .cfi_offset w22, -32
+; SDAG-NEXT:    .cfi_offset w23, -40
+; SDAG-NEXT:    .cfi_offset w24, -48
+; SDAG-NEXT:    .cfi_offset w25, -56
+; SDAG-NEXT:    .cfi_offset w26, -64
+; SDAG-NEXT:    .cfi_offset w27, -72
+; SDAG-NEXT:    .cfi_offset w28, -80
+; SDAG-NEXT:    ldp x8, x9, [x1, #112]
+; SDAG-NEXT:    mov x11, sp
+; SDAG-NEXT:    ldp q0, q1, [x1]
+; SDAG-NEXT:    ldr q6, [x1, #96]
+; SDAG-NEXT:    ldp q2, q3, [x1, #32]
+; SDAG-NEXT:    ldp q4, q5, [x1, #64]
+; SDAG-NEXT:    mvn w1, w2
+; SDAG-NEXT:    stp x8, x9, [sp, #112]
+; SDAG-NEXT:    mov w8, w2
+; SDAG-NEXT:    asr x9, x9, #63
+; SDAG-NEXT:    lsr x10, x8, #3
+; SDAG-NEXT:    stp q1, q2, [sp, #16]
+; SDAG-NEXT:    and x14, x8, #0x3f
+; SDAG-NEXT:    stp q3, q4, [sp, #48]
+; SDAG-NEXT:    eor x15, x14, #0x3f
+; SDAG-NEXT:    and x10, x10, #0x78
+; SDAG-NEXT:    stp q5, q6, [sp, #80]
+; SDAG-NEXT:    str q0, [sp]
+; SDAG-NEXT:    add x10, x11, x10
+; SDAG-NEXT:    stp x9, x9, [sp, #240]
+; SDAG-NEXT:    stp x9, x9, [sp, #224]
+; SDAG-NEXT:    stp x9, x9, [sp, #208]
+; SDAG-NEXT:    stp x9, x9, [sp, #192]
+; SDAG-NEXT:    stp x9, x9, [sp, #176]
+; SDAG-NEXT:    stp x9, x9, [sp, #160]
+; SDAG-NEXT:    stp x9, x9, [sp, #144]
+; SDAG-NEXT:    stp x9, x9, [sp, #128]
+; SDAG-NEXT:    ldp x11, x9, [x10, #16]
+; SDAG-NEXT:    ldr x16, [x10, #32]
+; SDAG-NEXT:    ldp x12, x13, [x10, #40]
+; SDAG-NEXT:    ldr x3, [x10, #56]
+; SDAG-NEXT:    ldp x4, x6, [x10, #64]
+; SDAG-NEXT:    lsl x2, x16, #1
+; SDAG-NEXT:    lsl x17, x11, #1
+; SDAG-NEXT:    ldp x24, x26, [x10, #112]
+; SDAG-NEXT:    lsl x5, x13, #1
+; SDAG-NEXT:    lsr x13, x13, x8
+; SDAG-NEXT:    lsr x11, x11, x8
+; SDAG-NEXT:    lsl x14, x17, x1
+; SDAG-NEXT:    lsl x7, x6, #1
+; SDAG-NEXT:    lsl x17, x2, x1
+; SDAG-NEXT:    lsl x2, x5, x1
+; SDAG-NEXT:    ldp x5, x22, [x10, #80]
+; SDAG-NEXT:    lsr x19, x4, x8
+; SDAG-NEXT:    lsl x7, x7, x15
+; SDAG-NEXT:    lsl x21, x4, #1
+; SDAG-NEXT:    lsr x6, x6, x8
+; SDAG-NEXT:    lsl x27, x24, #1
+; SDAG-NEXT:    lsr x24, x24, x8
+; SDAG-NEXT:    lsl x23, x5, #1
+; SDAG-NEXT:    orr x4, x7, x19
+; SDAG-NEXT:    lsr x25, x22, x8
+; SDAG-NEXT:    ldp x20, x7, [x10, #96]
+; SDAG-NEXT:    lsl x21, x21, x1
+; SDAG-NEXT:    lsl x23, x23, x1
+; SDAG-NEXT:    lsl x22, x22, #1
+; SDAG-NEXT:    lsr x5, x5, x8
+; SDAG-NEXT:    lsr x16, x16, x8
+; SDAG-NEXT:    lsl x19, x20, #1
+; SDAG-NEXT:    orr x6, x6, x23
+; SDAG-NEXT:    lsl x23, x7, #1
+; SDAG-NEXT:    lsr x20, x20, x8
+; SDAG-NEXT:    lsr x7, x7, x8
+; SDAG-NEXT:    lsl x22, x22, x15
+; SDAG-NEXT:    lsl x19, x19, x1
+; SDAG-NEXT:    lsl x1, x27, x1
+; SDAG-NEXT:    lsl x23, x23, x15
+; SDAG-NEXT:    orr x5, x22, x5
+; SDAG-NEXT:    ldp x28, x27, [sp, #256] ; 16-byte Folded Reload
+; SDAG-NEXT:    orr x19, x25, x19
+; SDAG-NEXT:    lsl x25, x26, #1
+; SDAG-NEXT:    orr x20, x23, x20
+; SDAG-NEXT:    orr x1, x7, x1
+; SDAG-NEXT:    ldp x23, x10, [x10]
+; SDAG-NEXT:    stp x20, x1, [x0, #96]
+; SDAG-NEXT:    lsl x20, x3, #1
+; SDAG-NEXT:    lsl x25, x25, x15
+; SDAG-NEXT:    asr x26, x26, x8
+; SDAG-NEXT:    stp x5, x19, [x0, #80]
+; SDAG-NEXT:    lsr x3, x3, x8
+; SDAG-NEXT:    lsl x19, x20, x15
+; SDAG-NEXT:    orr x7, x25, x24
+; SDAG-NEXT:    lsl x1, x9, #1
+; SDAG-NEXT:    stp x7, x26, [x0, #112]
+; SDAG-NEXT:    lsl x7, x10, #1
+; SDAG-NEXT:    orr x3, x3, x21
+; SDAG-NEXT:    orr x13, x19, x13
+; SDAG-NEXT:    lsl x5, x12, #1
+; SDAG-NEXT:    lsr x9, x9, x8
+; SDAG-NEXT:    stp x13, x3, [x0, #48]
+; SDAG-NEXT:    lsl x13, x1, x15
+; SDAG-NEXT:    lsr x23, x23, x8
+; SDAG-NEXT:    lsr x12, x12, x8
+; SDAG-NEXT:    lsr x8, x10, x8
+; SDAG-NEXT:    lsl x10, x7, x15
+; SDAG-NEXT:    stp x4, x6, [x0, #64]
+; SDAG-NEXT:    lsl x4, x5, x15
+; SDAG-NEXT:    orr x9, x9, x17
+; SDAG-NEXT:    orr x11, x13, x11
+; SDAG-NEXT:    ldp x20, x19, [sp, #320] ; 16-byte Folded Reload
+; SDAG-NEXT:    stp x11, x9, [x0, #16]
+; SDAG-NEXT:    orr x9, x10, x23
+; SDAG-NEXT:    orr x12, x12, x2
+; SDAG-NEXT:    ldp x22, x21, [sp, #304] ; 16-byte Folded Reload
+; SDAG-NEXT:    orr x16, x4, x16
+; SDAG-NEXT:    ldp x24, x23, [sp, #288] ; 16-byte Folded Reload
+; SDAG-NEXT:    orr x8, x8, x14
+; SDAG-NEXT:    ldp x26, x25, [sp, #272] ; 16-byte Folded Reload
+; SDAG-NEXT:    stp x16, x12, [x0, #32]
+; SDAG-NEXT:    stp x9, x8, [x0]
+; SDAG-NEXT:    add sp, sp, #336
+; SDAG-NEXT:    ret
+;
+; GISEL-LABEL: test_ashr_i1024:
+; GISEL:       ; %bb.0: ; %entry
+; GISEL-NEXT:    sub sp, sp, #432
+; GISEL-NEXT:    stp x28, x27, [sp, #336] ; 16-byte Folded Spill
+; GISEL-NEXT:    stp x26, x25, [sp, #352] ; 16-byte Folded Spill
+; GISEL-NEXT:    stp x24, x23, [sp, #368] ; 16-byte Folded Spill
+; GISEL-NEXT:    stp x22, x21, [sp, #384] ; 16-byte Folded Spill
+; GISEL-NEXT:    stp x20, x19, [sp, #400] ; 16-byte Folded Spill
+; GISEL-NEXT:    stp x29, x30, [sp, #416] ; 16-byte Folded Spill
+; GISEL-NEXT:    .cfi_def_cfa_offset 432
+; GISEL-NEXT:    .cfi_offset w30, -8
+; GISEL-NEXT:    .cfi_offset w29, -16
+; GISEL-NEXT:    .cfi_offset w19, -24
+; GISEL-NEXT:    .cfi_offset w20, -32
+; GISEL-NEXT:    .cfi_offset w21, -40
+; GISEL-NEXT:    .cfi_offset w22, -48
+; GISEL-NEXT:    .cfi_offset w23, -56
+; GISEL-NEXT:    .cfi_offset w24, -64
+; GISEL-NEXT:    .cfi_offset w25, -72
+; GISEL-NEXT:    .cfi_offset w26, -80
+; GISEL-NEXT:    .cfi_offset w27, -88
+; GISEL-NEXT:    .cfi_offset w28, -96
+; GISEL-NEXT:    str x0, [sp, #264] ; 8-byte Folded Spill
+; GISEL-NEXT:    mov w8, w2
+; GISEL-NEXT:    mov w9, #64 ; =0x40
+; GISEL-NEXT:    ldp x7, x0, [x1]
+; GISEL-NEXT:    and x15, x8, #0x3f
+; GISEL-NEXT:    sub x14, x9, x15
+; GISEL-NEXT:    ldr x28, [x1, #120]
+; GISEL-NEXT:    lsr x10, x8, #6
+; GISEL-NEXT:    ldp x17, x16, [x1, #16]
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    lsl x9, x0, x14
+; GISEL-NEXT:    lsr x12, x7, x15
+; GISEL-NEXT:    asr x11, x28, #63
+; GISEL-NEXT:    lsr x20, x0, x15
+; GISEL-NEXT:    str x0, [sp, #232] ; 8-byte Folded Spill
+; GISEL-NEXT:    lsl x27, x28, x14
+; GISEL-NEXT:    csel x9, xzr, x9, eq
+; GISEL-NEXT:    lsl x19, x17, x14
+; GISEL-NEXT:    cmp x10, #0
+; GISEL-NEXT:    orr x9, x12, x9
+; GISEL-NEXT:    str x17, [sp, #208] ; 8-byte Folded Spill
+; GISEL-NEXT:    lsr x2, x17, x15
+; GISEL-NEXT:    csel x9, x9, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    lsl x30, x16, x14
+; GISEL-NEXT:    csel x12, xzr, x19, eq
+; GISEL-NEXT:    cmp x10, #1
+; GISEL-NEXT:    lsr x25, x16, x15
+; GISEL-NEXT:    orr x12, x20, x12
+; GISEL-NEXT:    ldp x13, x17, [x1, #32]
+; GISEL-NEXT:    csel x9, x12, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    str x16, [sp, #184] ; 8-byte Folded Spill
+; GISEL-NEXT:    csel x12, xzr, x30, eq
+; GISEL-NEXT:    cmp x10, #2
+; GISEL-NEXT:    str x2, [sp, #88] ; 8-byte Folded Spill
+; GISEL-NEXT:    lsl x24, x13, x14
+; GISEL-NEXT:    orr x12, x2, x12
+; GISEL-NEXT:    str x13, [sp, #168] ; 8-byte Folded Spill
+; GISEL-NEXT:    csel x9, x12, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    lsr x21, x13, x15
+; GISEL-NEXT:    csel x12, xzr, x24, eq
+; GISEL-NEXT:    lsl x0, x17, x14
+; GISEL-NEXT:    cmp x10, #3
+; GISEL-NEXT:    orr x12, x25, x12
+; GISEL-NEXT:    ldp x16, x13, [x1, #48]
+; GISEL-NEXT:    csel x9, x12, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    lsr x3, x17, x15
+; GISEL-NEXT:    csel x12, xzr, x0, eq
+; GISEL-NEXT:    cmp x10, #4
+; GISEL-NEXT:    str x0, [sp, #128] ; 8-byte Folded Spill
+; GISEL-NEXT:    lsl x2, x16, x14
+; GISEL-NEXT:    orr x12, x21, x12
+; GISEL-NEXT:    mov x0, x16
+; GISEL-NEXT:    csel x9, x12, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    str x17, [sp, #144] ; 8-byte Folded Spill
+; GISEL-NEXT:    csel x12, xzr, x2, eq
+; GISEL-NEXT:    str x2, [sp, #304] ; 8-byte Folded Spill
+; GISEL-NEXT:    lsl x2, x13, x14
+; GISEL-NEXT:    cmp x10, #5
+; GISEL-NEXT:    orr x12, x3, x12
+; GISEL-NEXT:    ldr x17, [x1, #64]
+; GISEL-NEXT:    lsr x6, x0, x15
+; GISEL-NEXT:    csel x9, x12, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x12, xzr, x2, eq
+; GISEL-NEXT:    stp x16, x13, [sp, #152] ; 16-byte Folded Spill
+; GISEL-NEXT:    mov x16, x13
+; GISEL-NEXT:    cmp x10, #6
+; GISEL-NEXT:    orr x12, x6, x12
+; GISEL-NEXT:    lsl x0, x17, x14
+; GISEL-NEXT:    csel x9, x12, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    lsr x16, x16, x15
+; GISEL-NEXT:    ldr x13, [x1, #72]
+; GISEL-NEXT:    csel x12, xzr, x0, eq
+; GISEL-NEXT:    cmp x10, #7
+; GISEL-NEXT:    orr x12, x16, x12
+; GISEL-NEXT:    stp x16, x0, [sp, #288] ; 16-byte Folded Spill
+; GISEL-NEXT:    lsr x0, x17, x15
+; GISEL-NEXT:    csel x9, x12, x9, eq
+; GISEL-NEXT:    lsl x12, x13, x14
+; GISEL-NEXT:    mov x16, x13
+; GISEL-NEXT:    str x13, [sp, #192] ; 8-byte Folded Spill
+; GISEL-NEXT:    ldp x13, x5, [x1, #80]
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    str x17, [sp, #176] ; 8-byte Folded Spill
+; GISEL-NEXT:    csel x17, xzr, x12, eq
+; GISEL-NEXT:    str x0, [sp, #112] ; 8-byte Folded Spill
+; GISEL-NEXT:    cmp x10, #8
+; GISEL-NEXT:    orr x17, x0, x17
+; GISEL-NEXT:    lsl x0, x13, x14
+; GISEL-NEXT:    str x12, [sp, #280] ; 8-byte Folded Spill
+; GISEL-NEXT:    csel x17, x17, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    lsr x9, x16, x15
+; GISEL-NEXT:    csel x4, xzr, x0, eq
+; GISEL-NEXT:    str x13, [sp, #200] ; 8-byte Folded Spill
+; GISEL-NEXT:    cmp x10, #9
+; GISEL-NEXT:    stp x9, x0, [sp, #96] ; 16-byte Folded Spill
+; GISEL-NEXT:    orr x4, x9, x4
+; GISEL-NEXT:    lsl x23, x5, x14
+; GISEL-NEXT:    lsr x12, x13, x15
+; GISEL-NEXT:    ldp x9, x13, [x1, #96]
+; GISEL-NEXT:    csel x17, x4, x17, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    str x28, [sp, #256] ; 8-byte Folded Spill
+; GISEL-NEXT:    csel x4, xzr, x23, eq
+; GISEL-NEXT:    cmp x10, #10
+; GISEL-NEXT:    str x3, [sp, #120] ; 8-byte Folded Spill
+; GISEL-NEXT:    orr x4, x12, x4
+; GISEL-NEXT:    lsl x16, x9, x14
+; GISEL-NEXT:    stp x5, x9, [sp, #216] ; 16-byte Folded Spill
+; GISEL-NEXT:    csel x17, x4, x17, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    lsl x3, x11, x14
+; GISEL-NEXT:    stp x16, x12, [sp, #72] ; 16-byte Folded Spill
+; GISEL-NEXT:    mov x12, x9
+; GISEL-NEXT:    lsr x9, x5, x15
+; GISEL-NEXT:    csel x4, xzr, x16, eq
+; GISEL-NEXT:    lsl x16, x13, x14
+; GISEL-NEXT:    cmp x10, #11
+; GISEL-NEXT:    orr x4, x9, x4
+; GISEL-NEXT:    lsr x12, x12, x15
+; GISEL-NEXT:    str x30, [sp, #48] ; 8-byte Folded Spill
+; GISEL-NEXT:    stp x16, x9, [sp, #56] ; 16-byte Folded Spill
+; GISEL-NEXT:    ldr x9, [x1, #112]
+; GISEL-NEXT:    csel x17, x4, x17, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    stp x25, x24, [sp, #16] ; 16-byte Folded Spill
+; GISEL-NEXT:    ldr x5, [sp, #96] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x1, xzr, x16, eq
+; GISEL-NEXT:    lsl x16, x9, x14
+; GISEL-NEXT:    cmp x10, #12
+; GISEL-NEXT:    orr x1, x12, x1
+; GISEL-NEXT:    stp x13, x9, [sp, #240] ; 16-byte Folded Spill
+; GISEL-NEXT:    stp x16, x12, [sp, #320] ; 16-byte Folded Spill
+; GISEL-NEXT:    mov x12, x9
+; GISEL-NEXT:    csel x1, x1, x17, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    lsr x9, x13, x15
+; GISEL-NEXT:    lsr x26, x12, x15
+; GISEL-NEXT:    csel x17, xzr, x16, eq
+; GISEL-NEXT:    cmp x10, #13
+; GISEL-NEXT:    str x23, [sp, #272] ; 8-byte Folded Spill
+; GISEL-NEXT:    orr x13, x9, x17
+; GISEL-NEXT:    str x9, [sp, #312] ; 8-byte Folded Spill
+; GISEL-NEXT:    mov x9, x28
+; GISEL-NEXT:    csel x13, x13, x1, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    lsr x22, x9, x15
+; GISEL-NEXT:    csel x28, xzr, x27, eq
+; GISEL-NEXT:    cmp x10, #14
+; GISEL-NEXT:    str x2, [sp, #8] ; 8-byte Folded Spill
+; GISEL-NEXT:    orr x28, x26, x28
+; GISEL-NEXT:    ldp x0, x16, [sp, #120] ; 16-byte Folded Reload
+; GISEL-NEXT:    csel x12, x28, x13, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    ldr x13, [sp, #304] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x28, xzr, x3, eq
+; GISEL-NEXT:    cmp x10, #15
+; GISEL-NEXT:    stp x22, x3, [sp, #32] ; 16-byte Folded Spill
+; GISEL-NEXT:    orr x28, x22, x28
+; GISEL-NEXT:    ldp x15, x14, [sp, #72] ; 16-byte Folded Reload
+; GISEL-NEXT:    csel x9, x28, x12, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    mov x28, x24
+; GISEL-NEXT:    csel x9, x7, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    ldr x7, [sp, #88] ; 8-byte Folded Reload
+; GISEL-NEXT:    str x9, [sp, #136] ; 8-byte Folded Spill
+; GISEL-NEXT:    csel x9, xzr, x19, eq
+; GISEL-NEXT:    cmp x10, #0
+; GISEL-NEXT:    orr x9, x20, x9
+; GISEL-NEXT:    ldr x12, [sp, #280] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x9, x9, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x30, eq
+; GISEL-NEXT:    cmp x10, #1
+; GISEL-NEXT:    mov x30, x25
+; GISEL-NEXT:    orr x20, x7, x20
+; GISEL-NEXT:    ldp x4, x19, [sp, #104] ; 16-byte Folded Reload
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x24, eq
+; GISEL-NEXT:    cmp x10, #2
+; GISEL-NEXT:    mov x24, x6
+; GISEL-NEXT:    orr x20, x25, x20
+; GISEL-NEXT:    mov x25, x21
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x16, eq
+; GISEL-NEXT:    cmp x10, #3
+; GISEL-NEXT:    orr x20, x21, x20
+; GISEL-NEXT:    ldp x1, x17, [sp, #56] ; 16-byte Folded Reload
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x13, eq
+; GISEL-NEXT:    cmp x10, #4
+; GISEL-NEXT:    orr x20, x0, x20
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x2, eq
+; GISEL-NEXT:    cmp x10, #5
+; GISEL-NEXT:    orr x20, x6, x20
+; GISEL-NEXT:    ldp x21, x6, [sp, #288] ; 16-byte Folded Reload
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x6, eq
+; GISEL-NEXT:    cmp x10, #6
+; GISEL-NEXT:    orr x20, x21, x20
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x12, eq
+; GISEL-NEXT:    cmp x10, #7
+; GISEL-NEXT:    orr x20, x19, x20
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x4, eq
+; GISEL-NEXT:    cmp x10, #8
+; GISEL-NEXT:    orr x20, x5, x20
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x23, eq
+; GISEL-NEXT:    cmp x10, #9
+; GISEL-NEXT:    ldr x23, [sp, #328] ; 8-byte Folded Reload
+; GISEL-NEXT:    orr x20, x14, x20
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x15, eq
+; GISEL-NEXT:    cmp x10, #10
+; GISEL-NEXT:    orr x20, x17, x20
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x1, eq
+; GISEL-NEXT:    cmp x10, #11
+; GISEL-NEXT:    orr x20, x23, x20
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    ldp x23, x20, [sp, #312] ; 16-byte Folded Reload
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x20, eq
+; GISEL-NEXT:    cmp x10, #12
+; GISEL-NEXT:    orr x20, x23, x20
+; GISEL-NEXT:    mov x23, x26
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x27, eq
+; GISEL-NEXT:    cmp x10, #13
+; GISEL-NEXT:    orr x20, x26, x20
+; GISEL-NEXT:    ldr x26, [sp, #272] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x3, eq
+; GISEL-NEXT:    cmp x10, #14
+; GISEL-NEXT:    ldr x3, [sp, #232] ; 8-byte Folded Reload
+; GISEL-NEXT:    orr x20, x22, x20
+; GISEL-NEXT:    mov x22, x23
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    cmp x10, #15
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x9, x3, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    mov x3, x16
+; GISEL-NEXT:    str x9, [sp, #232] ; 8-byte Folded Spill
+; GISEL-NEXT:    ldr x9, [sp, #48] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x9, xzr, x9, eq
+; GISEL-NEXT:    cmp x10, #0
+; GISEL-NEXT:    orr x9, x7, x9
+; GISEL-NEXT:    ldr x7, [sp, #312] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x9, x9, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x28, eq
+; GISEL-NEXT:    cmp x10, #1
+; GISEL-NEXT:    mov x28, x21
+; GISEL-NEXT:    orr x20, x30, x20
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x16, eq
+; GISEL-NEXT:    cmp x10, #2
+; GISEL-NEXT:    mov x16, x0
+; GISEL-NEXT:    orr x20, x25, x20
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x13, eq
+; GISEL-NEXT:    cmp x10, #3
+; GISEL-NEXT:    orr x20, x0, x20
+; GISEL-NEXT:    mov x0, x19
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x2, eq
+; GISEL-NEXT:    cmp x10, #4
+; GISEL-NEXT:    mov x2, x4
+; GISEL-NEXT:    orr x20, x24, x20
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x6, eq
+; GISEL-NEXT:    cmp x10, #5
+; GISEL-NEXT:    mov x6, x5
+; GISEL-NEXT:    orr x20, x21, x20
+; GISEL-NEXT:    mov x21, x25
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x12, eq
+; GISEL-NEXT:    cmp x10, #6
+; GISEL-NEXT:    ldr x12, [sp, #208] ; 8-byte Folded Reload
+; GISEL-NEXT:    orr x20, x19, x20
+; GISEL-NEXT:    mov x19, x27
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x4, eq
+; GISEL-NEXT:    cmp x10, #7
+; GISEL-NEXT:    orr x20, x5, x20
+; GISEL-NEXT:    ldp x30, x4, [sp, #320] ; 16-byte Folded Reload
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    mov x5, x3
+; GISEL-NEXT:    csel x20, xzr, x26, eq
+; GISEL-NEXT:    cmp x10, #8
+; GISEL-NEXT:    orr x20, x14, x20
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x15, eq
+; GISEL-NEXT:    cmp x10, #9
+; GISEL-NEXT:    orr x20, x17, x20
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x1, eq
+; GISEL-NEXT:    cmp x10, #10
+; GISEL-NEXT:    orr x20, x4, x20
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x30, eq
+; GISEL-NEXT:    cmp x10, #11
+; GISEL-NEXT:    orr x20, x7, x20
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x27, eq
+; GISEL-NEXT:    cmp x10, #12
+; GISEL-NEXT:    orr x20, x23, x20
+; GISEL-NEXT:    ldp x27, x23, [sp, #32] ; 16-byte Folded Reload
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x23, eq
+; GISEL-NEXT:    cmp x10, #13
+; GISEL-NEXT:    orr x20, x27, x20
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    cmp x10, #14
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x10, #15
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x9, x12, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    str x9, [sp, #208] ; 8-byte Folded Spill
+; GISEL-NEXT:    ldp x12, x9, [sp, #16] ; 16-byte Folded Reload
+; GISEL-NEXT:    csel x9, xzr, x9, eq
+; GISEL-NEXT:    cmp x10, #0
+; GISEL-NEXT:    orr x9, x12, x9
+; GISEL-NEXT:    ldr x12, [sp, #184] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x9, x9, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x3, eq
+; GISEL-NEXT:    cmp x10, #1
+; GISEL-NEXT:    ldr x3, [sp, #296] ; 8-byte Folded Reload
+; GISEL-NEXT:    orr x20, x25, x20
+; GISEL-NEXT:    ldr x25, [sp, #280] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x13, eq
+; GISEL-NEXT:    cmp x10, #2
+; GISEL-NEXT:    ldr x13, [sp, #8] ; 8-byte Folded Reload
+; GISEL-NEXT:    orr x20, x16, x20
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x13, eq
+; GISEL-NEXT:    cmp x10, #3
+; GISEL-NEXT:    orr x20, x24, x20
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x3, eq
+; GISEL-NEXT:    cmp x10, #4
+; GISEL-NEXT:    orr x20, x28, x20
+; GISEL-NEXT:    mov x28, x16
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x25, eq
+; GISEL-NEXT:    cmp x10, #5
+; GISEL-NEXT:    orr x20, x0, x20
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x2, eq
+; GISEL-NEXT:    cmp x10, #6
+; GISEL-NEXT:    orr x20, x6, x20
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x26, eq
+; GISEL-NEXT:    cmp x10, #7
+; GISEL-NEXT:    mov x26, x14
+; GISEL-NEXT:    orr x20, x14, x20
+; GISEL-NEXT:    mov x14, x15
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x15, eq
+; GISEL-NEXT:    cmp x10, #8
+; GISEL-NEXT:    mov x15, x17
+; GISEL-NEXT:    orr x20, x17, x20
+; GISEL-NEXT:    mov x17, x1
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x1, eq
+; GISEL-NEXT:    cmp x10, #9
+; GISEL-NEXT:    mov x1, x4
+; GISEL-NEXT:    orr x20, x4, x20
+; GISEL-NEXT:    mov x4, x30
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x30, eq
+; GISEL-NEXT:    cmp x10, #10
+; GISEL-NEXT:    ldr x30, [sp, #272] ; 8-byte Folded Reload
+; GISEL-NEXT:    orr x20, x7, x20
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x19, eq
+; GISEL-NEXT:    cmp x10, #11
+; GISEL-NEXT:    orr x20, x22, x20
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x23, eq
+; GISEL-NEXT:    cmp x10, #12
+; GISEL-NEXT:    orr x20, x27, x20
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    cmp x10, #13
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x10, #14
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x10, #15
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x9, x12, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    ldr x12, [sp, #168] ; 8-byte Folded Reload
+; GISEL-NEXT:    str x9, [sp, #184] ; 8-byte Folded Spill
+; GISEL-NEXT:    csel x9, xzr, x5, eq
+; GISEL-NEXT:    cmp x10, #0
+; GISEL-NEXT:    orr x9, x21, x9
+; GISEL-NEXT:    ldr x5, [sp, #304] ; 8-byte Folded Reload
+; GISEL-NEXT:    mov x21, x0
+; GISEL-NEXT:    csel x9, x9, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x5, eq
+; GISEL-NEXT:    cmp x10, #1
+; GISEL-NEXT:    orr x20, x16, x20
+; GISEL-NEXT:    mov x16, x24
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x13, eq
+; GISEL-NEXT:    cmp x10, #2
+; GISEL-NEXT:    orr x20, x24, x20
+; GISEL-NEXT:    ldr x24, [sp, #288] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x3, eq
+; GISEL-NEXT:    cmp x10, #3
+; GISEL-NEXT:    orr x20, x24, x20
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x25, eq
+; GISEL-NEXT:    cmp x10, #4
+; GISEL-NEXT:    orr x20, x0, x20
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x2, eq
+; GISEL-NEXT:    cmp x10, #5
+; GISEL-NEXT:    orr x20, x6, x20
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x30, eq
+; GISEL-NEXT:    cmp x10, #6
+; GISEL-NEXT:    orr x20, x26, x20
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x14, eq
+; GISEL-NEXT:    cmp x10, #7
+; GISEL-NEXT:    orr x20, x15, x20
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x17, eq
+; GISEL-NEXT:    cmp x10, #8
+; GISEL-NEXT:    orr x20, x1, x20
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x4, eq
+; GISEL-NEXT:    cmp x10, #9
+; GISEL-NEXT:    orr x20, x7, x20
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x19, eq
+; GISEL-NEXT:    cmp x10, #10
+; GISEL-NEXT:    orr x20, x22, x20
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x23, eq
+; GISEL-NEXT:    cmp x10, #11
+; GISEL-NEXT:    orr x20, x27, x20
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    cmp x10, #12
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x10, #13
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x10, #14
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x10, #15
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x9, x12, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    ldr x12, [sp, #144] ; 8-byte Folded Reload
+; GISEL-NEXT:    str x9, [sp, #168] ; 8-byte Folded Spill
+; GISEL-NEXT:    csel x9, xzr, x5, eq
+; GISEL-NEXT:    cmp x10, #0
+; GISEL-NEXT:    orr x9, x28, x9
+; GISEL-NEXT:    mov x28, x3
+; GISEL-NEXT:    mov x5, x7
+; GISEL-NEXT:    csel x9, x9, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x13, eq
+; GISEL-NEXT:    cmp x10, #1
+; GISEL-NEXT:    orr x20, x16, x20
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x3, eq
+; GISEL-NEXT:    cmp x10, #2
+; GISEL-NEXT:    orr x20, x24, x20
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x25, eq
+; GISEL-NEXT:    cmp x10, #3
+; GISEL-NEXT:    orr x20, x0, x20
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x2, eq
+; GISEL-NEXT:    cmp x10, #4
+; GISEL-NEXT:    orr x20, x6, x20
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x30, eq
+; GISEL-NEXT:    cmp x10, #5
+; GISEL-NEXT:    orr x20, x26, x20
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x14, eq
+; GISEL-NEXT:    cmp x10, #6
+; GISEL-NEXT:    orr x20, x15, x20
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x17, eq
+; GISEL-NEXT:    cmp x10, #7
+; GISEL-NEXT:    orr x20, x1, x20
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x4, eq
+; GISEL-NEXT:    cmp x10, #8
+; GISEL-NEXT:    orr x20, x7, x20
+; GISEL-NEXT:    mov x7, x19
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x19, eq
+; GISEL-NEXT:    cmp x10, #9
+; GISEL-NEXT:    mov x19, x22
+; GISEL-NEXT:    orr x20, x22, x20
+; GISEL-NEXT:    mov x22, x23
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x20, xzr, x23, eq
+; GISEL-NEXT:    cmp x10, #10
+; GISEL-NEXT:    orr x20, x27, x20
+; GISEL-NEXT:    csel x9, x20, x9, eq
+; GISEL-NEXT:    cmp x10, #11
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x10, #12
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x10, #13
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x10, #14
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x10, #15
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x9, x12, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    ldr x12, [sp, #152] ; 8-byte Folded Reload
+; GISEL-NEXT:    str x9, [sp, #304] ; 8-byte Folded Spill
+; GISEL-NEXT:    csel x9, xzr, x13, eq
+; GISEL-NEXT:    cmp x10, #0
+; GISEL-NEXT:    orr x9, x16, x9
+; GISEL-NEXT:    mov x16, x0
+; GISEL-NEXT:    csel x9, x9, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x3, xzr, x3, eq
+; GISEL-NEXT:    cmp x10, #1
+; GISEL-NEXT:    orr x3, x24, x3
+; GISEL-NEXT:    csel x9, x3, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x3, xzr, x25, eq
+; GISEL-NEXT:    cmp x10, #2
+; GISEL-NEXT:    orr x3, x21, x3
+; GISEL-NEXT:    csel x9, x3, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x3, xzr, x2, eq
+; GISEL-NEXT:    cmp x10, #3
+; GISEL-NEXT:    orr x3, x6, x3
+; GISEL-NEXT:    csel x9, x3, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x3, xzr, x30, eq
+; GISEL-NEXT:    cmp x10, #4
+; GISEL-NEXT:    orr x3, x26, x3
+; GISEL-NEXT:    csel x9, x3, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x3, xzr, x14, eq
+; GISEL-NEXT:    cmp x10, #5
+; GISEL-NEXT:    orr x3, x15, x3
+; GISEL-NEXT:    csel x9, x3, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x3, xzr, x17, eq
+; GISEL-NEXT:    cmp x10, #6
+; GISEL-NEXT:    orr x3, x1, x3
+; GISEL-NEXT:    csel x9, x3, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x3, xzr, x4, eq
+; GISEL-NEXT:    cmp x10, #7
+; GISEL-NEXT:    orr x3, x5, x3
+; GISEL-NEXT:    csel x9, x3, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x3, xzr, x7, eq
+; GISEL-NEXT:    cmp x10, #8
+; GISEL-NEXT:    orr x3, x19, x3
+; GISEL-NEXT:    csel x9, x3, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x3, xzr, x23, eq
+; GISEL-NEXT:    cmp x10, #9
+; GISEL-NEXT:    orr x3, x27, x3
+; GISEL-NEXT:    csel x9, x3, x9, eq
+; GISEL-NEXT:    cmp x10, #10
+; GISEL-NEXT:    mov x3, x2
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x10, #11
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x10, #12
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x10, #13
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x10, #14
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x10, #15
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x20, x12, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    ldr x12, [sp, #160] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x9, xzr, x28, eq
+; GISEL-NEXT:    cmp x10, #0
+; GISEL-NEXT:    orr x9, x24, x9
+; GISEL-NEXT:    csel x9, x9, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x0, xzr, x25, eq
+; GISEL-NEXT:    cmp x10, #1
+; GISEL-NEXT:    orr x0, x21, x0
+; GISEL-NEXT:    mov x21, x6
+; GISEL-NEXT:    csel x9, x0, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x0, xzr, x2, eq
+; GISEL-NEXT:    cmp x10, #2
+; GISEL-NEXT:    orr x0, x6, x0
+; GISEL-NEXT:    csel x9, x0, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x0, xzr, x30, eq
+; GISEL-NEXT:    cmp x10, #3
+; GISEL-NEXT:    orr x0, x26, x0
+; GISEL-NEXT:    csel x9, x0, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x0, xzr, x14, eq
+; GISEL-NEXT:    cmp x10, #4
+; GISEL-NEXT:    orr x0, x15, x0
+; GISEL-NEXT:    csel x9, x0, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x0, xzr, x17, eq
+; GISEL-NEXT:    cmp x10, #5
+; GISEL-NEXT:    orr x0, x1, x0
+; GISEL-NEXT:    csel x9, x0, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x0, xzr, x4, eq
+; GISEL-NEXT:    cmp x10, #6
+; GISEL-NEXT:    orr x0, x5, x0
+; GISEL-NEXT:    csel x9, x0, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x0, xzr, x7, eq
+; GISEL-NEXT:    cmp x10, #7
+; GISEL-NEXT:    orr x0, x19, x0
+; GISEL-NEXT:    csel x9, x0, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x0, xzr, x23, eq
+; GISEL-NEXT:    cmp x10, #8
+; GISEL-NEXT:    orr x0, x27, x0
+; GISEL-NEXT:    csel x9, x0, x9, eq
+; GISEL-NEXT:    cmp x10, #9
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x10, #10
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x10, #11
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x10, #12
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x10, #13
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x10, #14
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x10, #15
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x2, x12, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    ldr x12, [sp, #176] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x9, xzr, x25, eq
+; GISEL-NEXT:    cmp x10, #0
+; GISEL-NEXT:    orr x9, x16, x9
+; GISEL-NEXT:    ldr x16, [sp, #216] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x9, x9, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x3, eq
+; GISEL-NEXT:    cmp x10, #1
+; GISEL-NEXT:    orr x13, x6, x13
+; GISEL-NEXT:    csel x9, x13, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x30, eq
+; GISEL-NEXT:    cmp x10, #2
+; GISEL-NEXT:    orr x13, x26, x13
+; GISEL-NEXT:    csel x9, x13, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x14, eq
+; GISEL-NEXT:    cmp x10, #3
+; GISEL-NEXT:    orr x13, x15, x13
+; GISEL-NEXT:    csel x9, x13, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x17, eq
+; GISEL-NEXT:    cmp x10, #4
+; GISEL-NEXT:    orr x13, x1, x13
+; GISEL-NEXT:    csel x9, x13, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x4, eq
+; GISEL-NEXT:    cmp x10, #5
+; GISEL-NEXT:    orr x13, x5, x13
+; GISEL-NEXT:    csel x9, x13, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x7, eq
+; GISEL-NEXT:    cmp x10, #6
+; GISEL-NEXT:    orr x13, x19, x13
+; GISEL-NEXT:    csel x9, x13, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x23, eq
+; GISEL-NEXT:    cmp x10, #7
+; GISEL-NEXT:    orr x13, x27, x13
+; GISEL-NEXT:    csel x9, x13, x9, eq
+; GISEL-NEXT:    cmp x10, #8
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x10, #9
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x10, #10
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x10, #11
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x10, #12
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x10, #13
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x10, #14
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x10, #15
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x6, x12, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x9, xzr, x3, eq
+; GISEL-NEXT:    cmp x10, #0
+; GISEL-NEXT:    orr x9, x21, x9
+; GISEL-NEXT:    csel x9, x9, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x12, xzr, x30, eq
+; GISEL-NEXT:    cmp x10, #1
+; GISEL-NEXT:    orr x12, x26, x12
+; GISEL-NEXT:    csel x9, x12, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x12, xzr, x14, eq
+; GISEL-NEXT:    cmp x10, #2
+; GISEL-NEXT:    orr x12, x15, x12
+; GISEL-NEXT:    csel x9, x12, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x12, xzr, x17, eq
+; GISEL-NEXT:    cmp x10, #3
+; GISEL-NEXT:    orr x12, x1, x12
+; GISEL-NEXT:    csel x9, x12, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x12, xzr, x4, eq
+; GISEL-NEXT:    cmp x10, #4
+; GISEL-NEXT:    orr x12, x5, x12
+; GISEL-NEXT:    csel x9, x12, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x12, xzr, x7, eq
+; GISEL-NEXT:    cmp x10, #5
+; GISEL-NEXT:    orr x12, x19, x12
+; GISEL-NEXT:    csel x9, x12, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x12, xzr, x23, eq
+; GISEL-NEXT:    cmp x10, #6
+; GISEL-NEXT:    orr x12, x27, x12
+; GISEL-NEXT:    csel x9, x12, x9, eq
+; GISEL-NEXT:    cmp x10, #7
+; GISEL-NEXT:    ldr x12, [sp, #192] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x10, #8
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x10, #9
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x10, #10
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x10, #11
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x10, #12
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x10, #13
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x10, #14
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x10, #15
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x9, x12, x9, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x12, xzr, x30, eq
+; GISEL-NEXT:    cmp x10, #0
+; GISEL-NEXT:    orr x12, x26, x12
+; GISEL-NEXT:    ldp x29, x30, [sp, #416] ; 16-byte Folded Reload
+; GISEL-NEXT:    csel x12, x12, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x14, eq
+; GISEL-NEXT:    cmp x10, #1
+; GISEL-NEXT:    orr x13, x15, x13
+; GISEL-NEXT:    ldp x26, x25, [sp, #352] ; 16-byte Folded Reload
+; GISEL-NEXT:    csel x12, x13, x12, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x17, eq
+; GISEL-NEXT:    cmp x10, #2
+; GISEL-NEXT:    orr x13, x1, x13
+; GISEL-NEXT:    csel x12, x13, x12, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x4, eq
+; GISEL-NEXT:    cmp x10, #3
+; GISEL-NEXT:    orr x13, x5, x13
+; GISEL-NEXT:    csel x12, x13, x12, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x7, eq
+; GISEL-NEXT:    cmp x10, #4
+; GISEL-NEXT:    orr x13, x19, x13
+; GISEL-NEXT:    csel x12, x13, x12, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x13, xzr, x23, eq
+; GISEL-NEXT:    cmp x10, #5
+; GISEL-NEXT:    orr x13, x27, x13
+; GISEL-NEXT:    csel x12, x13, x12, eq
+; GISEL-NEXT:    cmp x10, #6
+; GISEL-NEXT:    ldr x13, [sp, #200] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #7
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #8
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #9
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #10
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #11
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #12
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #13
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #14
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #15
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x13, x13, x12, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x12, xzr, x14, eq
+; GISEL-NEXT:    cmp x10, #0
+; GISEL-NEXT:    ldr x14, [sp, #264] ; 8-byte Folded Reload
+; GISEL-NEXT:    orr x12, x15, x12
+; GISEL-NEXT:    ldr x15, [sp, #136] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x12, x12, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    stp x9, x13, [x14, #72]
+; GISEL-NEXT:    csel x0, xzr, x17, eq
+; GISEL-NEXT:    cmp x10, #1
+; GISEL-NEXT:    str x15, [x14]
+; GISEL-NEXT:    orr x0, x1, x0
+; GISEL-NEXT:    ldr x15, [sp, #232] ; 8-byte Folded Reload
+; GISEL-NEXT:    stp x2, x6, [x14, #56]
+; GISEL-NEXT:    csel x12, x0, x12, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x0, xzr, x4, eq
+; GISEL-NEXT:    cmp x10, #2
+; GISEL-NEXT:    str x15, [x14, #8]
+; GISEL-NEXT:    orr x0, x5, x0
+; GISEL-NEXT:    ldr x15, [sp, #208] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x12, x0, x12, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x0, xzr, x7, eq
+; GISEL-NEXT:    cmp x10, #3
+; GISEL-NEXT:    str x15, [x14, #16]
+; GISEL-NEXT:    orr x0, x19, x0
+; GISEL-NEXT:    ldr x15, [sp, #184] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x12, x0, x12, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x0, xzr, x23, eq
+; GISEL-NEXT:    cmp x10, #4
+; GISEL-NEXT:    str x15, [x14, #24]
+; GISEL-NEXT:    orr x0, x27, x0
+; GISEL-NEXT:    ldr x15, [sp, #168] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x12, x0, x12, eq
+; GISEL-NEXT:    cmp x10, #5
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #6
+; GISEL-NEXT:    str x15, [x14, #32]
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #7
+; GISEL-NEXT:    ldr x15, [sp, #304] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #8
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #9
+; GISEL-NEXT:    stp x15, x20, [x14, #40]
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #10
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #11
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #12
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #13
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #14
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #15
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x0, x16, x12, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    ldr x16, [sp, #224] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x12, xzr, x17, eq
+; GISEL-NEXT:    cmp x10, #0
+; GISEL-NEXT:    orr x12, x1, x12
+; GISEL-NEXT:    csel x12, x12, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x3, xzr, x4, eq
+; GISEL-NEXT:    cmp x10, #1
+; GISEL-NEXT:    orr x3, x5, x3
+; GISEL-NEXT:    csel x12, x3, x12, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x3, xzr, x7, eq
+; GISEL-NEXT:    cmp x10, #2
+; GISEL-NEXT:    orr x3, x19, x3
+; GISEL-NEXT:    csel x12, x3, x12, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x3, xzr, x23, eq
+; GISEL-NEXT:    cmp x10, #3
+; GISEL-NEXT:    orr x3, x27, x3
+; GISEL-NEXT:    ldp x24, x23, [sp, #368] ; 16-byte Folded Reload
+; GISEL-NEXT:    csel x12, x3, x12, eq
+; GISEL-NEXT:    cmp x10, #4
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #5
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #6
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #7
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #8
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #9
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #10
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #11
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #12
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #13
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #14
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #15
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x3, x16, x12, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    ldr x16, [sp, #240] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x12, xzr, x4, eq
+; GISEL-NEXT:    cmp x10, #0
+; GISEL-NEXT:    stp x0, x3, [x14, #88]
+; GISEL-NEXT:    orr x12, x5, x12
+; GISEL-NEXT:    csel x12, x12, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x4, xzr, x7, eq
+; GISEL-NEXT:    cmp x10, #1
+; GISEL-NEXT:    orr x4, x19, x4
+; GISEL-NEXT:    csel x12, x4, x12, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x4, xzr, x22, eq
+; GISEL-NEXT:    cmp x10, #2
+; GISEL-NEXT:    orr x4, x27, x4
+; GISEL-NEXT:    csel x12, x4, x12, eq
+; GISEL-NEXT:    cmp x10, #3
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #4
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #5
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #6
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #7
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #8
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #9
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #10
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #11
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #12
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #13
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #14
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #15
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x4, x16, x12, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    ldr x16, [sp, #248] ; 8-byte Folded Reload
+; GISEL-NEXT:    csel x12, xzr, x7, eq
+; GISEL-NEXT:    cmp x10, #0
+; GISEL-NEXT:    orr x12, x19, x12
+; GISEL-NEXT:    ldp x20, x19, [sp, #400] ; 16-byte Folded Reload
+; GISEL-NEXT:    csel x12, x12, x11, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x17, xzr, x22, eq
+; GISEL-NEXT:    cmp x10, #1
+; GISEL-NEXT:    orr x17, x27, x17
+; GISEL-NEXT:    csel x12, x17, x12, eq
+; GISEL-NEXT:    cmp x10, #2
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #3
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #4
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #5
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #6
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #7
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #8
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #9
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #10
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #11
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #12
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #13
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #14
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #15
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    csel x17, x16, x12, eq
+; GISEL-NEXT:    tst x8, #0x3f
+; GISEL-NEXT:    csel x12, xzr, x22, eq
+; GISEL-NEXT:    cmp x10, #0
+; GISEL-NEXT:    stp x4, x17, [x14, #104]
+; GISEL-NEXT:    orr x12, x27, x12
+; GISEL-NEXT:    ldp x22, x21, [sp, #384] ; 16-byte Folded Reload
+; GISEL-NEXT:    csel x12, x12, x11, eq
+; GISEL-NEXT:    cmp x10, #1
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #2
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #3
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #4
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #5
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #6
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #7
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #8
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #9
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #10
+; GISEL-NEXT:    csel x12, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #11
+; GISEL-NEXT:    csel x9, x11, x12, eq
+; GISEL-NEXT:    cmp x10, #12
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x10, #13
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x10, #14
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x10, #15
+; GISEL-NEXT:    csel x9, x11, x9, eq
+; GISEL-NEXT:    cmp x8, #0
+; GISEL-NEXT:    ldr x8, [sp, #256] ; 8-byte Folded Reload
+; GISEL-NEXT:    ldp x28, x27, [sp, #336] ; 16-byte Folded Reload
+; GISEL-NEXT:    csel x8, x8, x9, eq
+; GISEL-NEXT:    str x8, [x14, #120]
+; GISEL-NEXT:    add sp, sp, #432
+; GISEL-NEXT:    ret
+entry:
+  %input_val = load i1024, ptr %input, align 128
+  %shift_ext = zext i32 %shift to i1024
+  %shifted = ashr i1024 %input_val, %shift_ext
+  store i1024 %shifted, ptr %result, align 128
+  ret void
+}
+
+
+; Constant shift tests.
+
+; Zero shift tests
+define void @test_shl_i512_const_zero(ptr %result, ptr %input) {
+; SDAG-LABEL: test_shl_i512_const_zero:
+; SDAG:       ; %bb.0: ; %entry
+; SDAG-NEXT:    ldp x9, x8, [x1, #48]
+; SDAG-NEXT:    ldr q0, [x1]
+; SDAG-NEXT:    ldp x11, x10, [x1, #16]
+; SDAG-NEXT:    ldp x13, x12, [x1, #32]
+; SDAG-NEXT:    str q0, [x0]
+; SDAG-NEXT:    stp x9, x8, [x0, #48]
+; SDAG-NEXT:    stp x11, x10, [x0, #16]
+; SDAG-NEXT:    stp x13, x12, [x0, #32]
+; SDAG-NEXT:    ret
+;
+; GISEL-LABEL: test_shl_i512_const_zero:
+; GISEL:       ; %bb.0: ; %entry
+; GISEL-NEXT:    ldp x8, x9, [x1]
+; GISEL-NEXT:    ldp x10, x11, [x1, #16]
+; GISEL-NEXT:    ldp x12, x13, [x1, #32]
+; GISEL-NEXT:    ldp x14, x15, [x1, #48]
+; GISEL-NEXT:    stp x8, x9, [x0]
+; GISEL-NEXT:    stp x10, x11, [x0, #16]
+; GISEL-NEXT:    stp x12, x13, [x0, #32]
+; GISEL-NEXT:    stp x14, x15, [x0, #48]
+; GISEL-NEXT:    ret
+entry:
+  %input_val = load i512, ptr %input, align 64
+  %shifted = shl i512 %input_val, 0
+  store i512 %shifted, ptr %result, align 64
+  ret void
+}
+
+define void @test_lshr_i512_const_zero(ptr %result, ptr %input) {
+; SDAG-LABEL: test_lshr_i512_const_zero:
+; SDAG:       ; %bb.0: ; %entry
+; SDAG-NEXT:    ldp x9, x8, [x1, #48]
+; SDAG-NEXT:    ldr q0, [x1]
+; SDAG-NEXT:    ldp x11, x10, [x1, #16]
+; SDAG-NEXT:    ldp x13, x12, [x1, #32]
+; SDAG-NEXT:    str q0, [x0]
+; SDAG-NEXT:    stp x9, x8, [x0, #48]
+; SDAG-NEXT:    stp x11, x10, [x0, #16]
+; SDAG-NEXT:    stp x13, x12, [x0, #32]
+; SDAG-NEXT:    ret
+;
+; GISEL-LABEL: test_lshr_i512_const_zero:
+; GISEL:       ; %bb.0: ; %entry
+; GISEL-NEXT:    ldp x8, x9, [x1]
+; GISEL-NEXT:    ldp x10, x11, [x1, #16]
+; GISEL-NEXT:    ldp x12, x13, [x1, #32]
+; GISEL-NEXT:    ldp x14, x15, [x1, #48]
+; GISEL-NEXT:    stp x8, x9, [x0]
+; GISEL-NEXT:    stp x10, x11, [x0, #16]
+; GISEL-NEXT:    stp x12, x13, [x0, #32]
+; GISEL-NEXT:    stp x14, x15, [x0, #48]
+; GISEL-NEXT:    ret
+entry:
+  %input_val = load i512, ptr %input, align 64
+  %shifted = lshr i512 %input_val, 0
+  store i512 %shifted, ptr %result, align 64
+  ret void
+}
+
+define void @test_ashr_i512_const_zero(ptr %result, ptr %input) {
+; SDAG-LABEL: test_ashr_i512_const_zero:
+; SDAG:       ; %bb.0: ; %entry
+; SDAG-NEXT:    ldp x9, x8, [x1, #48]
+; SDAG-NEXT:    ldr q0, [x1]
+; SDAG-NEXT:    ldp x11, x10, [x1, #16]
+; SDAG-NEXT:    ldp x13, x12, [x1, #32]
+; SDAG-NEXT:    str q0, [x0]
+; SDAG-NEXT:    stp x9, x8, [x0, #48]
+; SDAG-NEXT:    stp x11, x10, [x0, #16]
+; SDAG-NEXT:    stp x13, x12, [x0, #32]
+; SDAG-NEXT:    ret
+;
+; GISEL-LABEL: test_ashr_i512_const_zero:
+; GISEL:       ; %bb.0: ; %entry
+; GISEL-NEXT:    ldp x8, x9, [x1]
+; GISEL-NEXT:    ldp x10, x11, [x1, #16]
+; GISEL-NEXT:    ldp x12, x13, [x1, #32]
+; GISEL-NEXT:    ldp x14, x15, [x1, #48]
+; GISEL-NEXT:    stp x8, x9, [x0]
+; GISEL-NEXT:    stp x10, x11, [x0, #16]
+; GISEL-NEXT:    stp x12, x13, [x0, #32]
+; GISEL-NEXT:    stp x14, x15, [x0, #48]
+; GISEL-NEXT:    ret
+entry:
+  %input_val = load i512, ptr %input, align 64
+  %shifted = ashr i512 %input_val, 0
+  store i512 %shifted, ptr %result, align 64
+  ret void
+}
+
+; Word-aligned constant shifts (32-bit multiples for i512 -> i32 narrowing)
+define void @test_shl_i512_const_32(ptr %result, ptr %input) {
+; SDAG-LABEL: test_shl_i512_const_32:
+; SDAG:       ; %bb.0: ; %entry
+; SDAG-NEXT:    ldp x12, x13, [x1, #16]
+; SDAG-NEXT:    ldur x8, [x1, #36]
+; SDAG-NEXT:    ldp x14, x15, [x1]
+; SDAG-NEXT:    ldur x9, [x1, #28]
+; SDAG-NEXT:    ldur x10, [x1, #44]
+; SDAG-NEXT:    ldur x11, [x1, #52]
+; SDAG-NEXT:    stp x9, x8, [x0, #32]
+; SDAG-NEXT:    extr x9, x13, x12, #32
+; SDAG-NEXT:    stp x10, x11, [x0, #48]
+; SDAG-NEXT:    extr x10, x12, x15, #32
+; SDAG-NEXT:    lsl x8, x14, #32
+; SDAG-NEXT:    stp x10, x9, [x0, #16]
+; SDAG-NEXT:    extr x10, x15, x14, #32
+; SDAG-NEXT:    stp x8, x10, [x0]
+; SDAG-NEXT:    ret
+;
+; GISEL-LABEL: test_shl_i512_const_32:
+; GISEL:       ; %bb.0: ; %entry
+; GISEL-NEXT:    ldp x8, x9, [x1]
+; GISEL-NEXT:    ldp x11, x12, [x1, #16]
+; GISEL-NEXT:    ldp x14, x15, [x1, #32]
+; GISEL-NEXT:    lsr x10, x8, #32
+; GISEL-NEXT:    lsr x13, x9, #32
+; GISEL-NEXT:    lsl x8, x8, #32
+; GISEL-NEXT:    orr x9, x10, x9, lsl #32
+; GISEL-NEXT:    lsr x10, x11, #32
+; GISEL-NEXT:    orr x11, x13, x11, lsl #32
+; GISEL-NEXT:    ldp x13, x16, [x1, #48]
+; GISEL-NEXT:    stp x8, x9, [x0]
+; GISEL-NEXT:    lsr x8, x12, #32
+; GISEL-NEXT:    orr x10, x10, x12, lsl #32
+; GISEL-NEXT:    lsr x12, x14, #32
+; GISEL-NEXT:    lsr x9, x15, #32
+; GISEL-NEXT:    orr x8, x8, x14, lsl #32
+; GISEL-NEXT:    stp x11, x10, [x0, #16]
+; GISEL-NEXT:    orr x11, x12, x15, lsl #32
+; GISEL-NEXT:    lsr x12, x13, #32
+; GISEL-NEXT:    orr x9, x9, x13, lsl #32
+; GISEL-NEXT:    stp x8, x11, [x0, #32]
+; GISEL-NEXT:    orr x8, x12, x16, lsl #32
+; GISEL-NEXT:    stp x9, x8, [x0, #48]
+; GISEL-NEXT:    ret
+entry:
+  %input_val = load i512, ptr %input, align 64
+  %shifted = shl i512 %input_val, 32
+  store i512 %shifted, ptr %result, align 64
+  ret void
+}
+
+define void @test_lshr_i512_const_32(ptr %result, ptr %input) {
+; SDAG-LABEL: test_lshr_i512_const_32:
+; SDAG:       ; %bb.0: ; %entry
+; SDAG-NEXT:    ldp x11, x10, [x1, #48]
+; SDAG-NEXT:    ldur x8, [x1, #12]
+; SDAG-NEXT:    ldp x15, x14, [x1, #32]
+; SDAG-NEXT:    ldur x9, [x1, #4]
+; SDAG-NEXT:    ldp x12, x13, [x1, #16]
+; SDAG-NEXT:    extr x16, x10, x11, #32
+; SDAG-NEXT:    stp x9, x8, [x0]
+; SDAG-NEXT:    lsr x9, x10, #32
+; SDAG-NEXT:    extr x8, x14, x15, #32
+; SDAG-NEXT:    extr x10, x11, x14, #32
+; SDAG-NEXT:    stp x16, x9, [x0, #48]
+; SDAG-NEXT:    extr x9, x13, x12, #32
+; SDAG-NEXT:    stp x8, x10, [x0, #32]
+; SDAG-NEXT:    extr x8, x15, x13, #32
+; SDAG-NEXT:    stp x9, x8, [x0, #16]
+; SDAG-NEXT:    ret
+;
+; GISEL-LABEL: test_lshr_i512_const_32:
+; GISEL:       ; %bb.0: ; %entry
+; GISEL-NEXT:    ldp x8, x9, [x1, #8]
+; GISEL-NEXT:    ldr x11, [x1]
+; GISEL-NEXT:    ldp x10, x14, [x1, #24]
+; GISEL-NEXT:    ldr x16, [x1, #56]
+; GISEL-NEXT:    lsl x12, x8, #32
+; GISEL-NEXT:    lsl x13, x9, #32
+; GISEL-NEXT:    lsl x15, x10, #32
+; GISEL-NEXT:    orr x11, x12, x11, lsr #32
+; GISEL-NEXT:    orr x8, x13, x8, lsr #32
+; GISEL-NEXT:    lsl x13, x14, #32
+; GISEL-NEXT:    orr x9, x15, x9, lsr #32
+; GISEL-NEXT:    ldp x12, x15, [x1, #40]
+; GISEL-NEXT:    stp x11, x8, [x0]
+; GISEL-NEXT:    orr x10, x13, x10, lsr #32
+; GISEL-NEXT:    lsl x8, x16, #32
+; GISEL-NEXT:    lsl x11, x12, #32
+; GISEL-NEXT:    lsl x13, x15, #32
+; GISEL-NEXT:    stp x9, x10, [x0, #16]
+; GISEL-NEXT:    orr x8, x8, x15, lsr #32
+; GISEL-NEXT:    lsr x10, x16, #32
+; GISEL-NEXT:    orr x11, x11, x14, lsr #32
+; GISEL-NEXT:    orr x9, x13, x12, lsr #32
+; GISEL-NEXT:    stp x8, x10, [x0, #48]
+; GISEL-NEXT:    stp x11, x9, [x0, #32]
+; GISEL-NEXT:    ret
+entry:
+  %input_val = load i512, ptr %input, align 64
+  %shifted = lshr i512 %input_val, 32
+  store i512 %shifted, ptr %result, align 64
+  ret void
+}
+
+define void @test_ashr_i512_const_32(ptr %result, ptr %input) {
+; SDAG-LABEL: test_ashr_i512_const_32:
+; SDAG:       ; %bb.0: ; %entry
+; SDAG-NEXT:    ldp x11, x10, [x1, #48]
+; SDAG-NEXT:    ldur x8, [x1, #12]
+; SDAG-NEXT:    ldp x15, x14, [x1, #32]
+; SDAG-NEXT:    ldur x9, [x1, #4]
+; SDAG-NEXT:    ldp x12, x13, [x1, #16]
+; SDAG-NEXT:    extr x16, x10, x11, #32
+; SDAG-NEXT:    stp x9, x8, [x0]
+; SDAG-NEXT:    asr x9, x10, #32
+; SDAG-NEXT:    extr x8, x14, x15, #32
+; SDAG-NEXT:    extr x10, x11, x14, #32
+; SDAG-NEXT:    stp x16, x9, [x0, #48]
+; SDAG-NEXT:    extr x9, x13, x12, #32
+; SDAG-NEXT:    stp x8, x10, [x0, #32]
+; SDAG-NEXT:    extr x8, x15, x13, #32
+; SDAG-NEXT:    stp x9, x8, [x0, #16]
+; SDAG-NEXT:    ret
+;
+; GISEL-LABEL: test_ashr_i512_const_32:
+; GISEL:       ; %bb.0: ; %entry
+; GISEL-NEXT:    ldp x8, x9, [x1, #8]
+; GISEL-NEXT:    ldr x11, [x1]
+; GISEL-NEXT:    ldp x10, x13, [x1, #24]
+; GISEL-NEXT:    ldr x17, [x1, #56]
+; GISEL-NEXT:    lsl x12, x8, #32
+; GISEL-NEXT:    lsl x15, x9, #32
+; GISEL-NEXT:    lsl x16, x10, #32
+; GISEL-NEXT:    orr x11, x12, x11, lsr #32
+; GISEL-NEXT:    ldp x14, x12, [x1, #40]
+; GISEL-NEXT:    orr x8, x15, x8, lsr #32
+; GISEL-NEXT:    lsl x15, x13, #32
+; GISEL-NEXT:    orr x9, x16, x9, lsr #32
+; GISEL-NEXT:    asr x16, x17, #63
+; GISEL-NEXT:    stp x11, x8, [x0]
+; GISEL-NEXT:    lsl x11, x14, #32
+; GISEL-NEXT:    orr x10, x15, x10, lsr #32
+; GISEL-NEXT:    lsl x15, x12, #32
+; GISEL-NEXT:    orr x8, x11, x13, lsr #32
+; GISEL-NEXT:    lsl x11, x17, #32
+; GISEL-NEXT:    stp x9, x10, [x0, #16]
+; GISEL-NEXT:    orr x9, x15, x14, lsr #32
+; GISEL-NEXT:    lsl x13, x16, #32
+; GISEL-NEXT:    orr x10, x11, x12, lsr #32
+; GISEL-NEXT:    stp x8, x9, [x0, #32]
+; GISEL-NEXT:    orr x8, x13, x17, asr #32
+; GISEL-NEXT:    stp x10, x8, [x0, #48]
+; GISEL-NEXT:    ret
+entry:
+  %input_val = load i512, ptr %input, align 64
+  %shifted = ashr i512 %input_val, 32
+  store i512 %shifted, ptr %result, align 64
+  ret void
+}
+
+define void @test_shl_i512_const_64(ptr %result, ptr %input) {
+; SDAG-LABEL: test_shl_i512_const_64:
+; SDAG:       ; %bb.0: ; %entry
+; SDAG-NEXT:    ldp x10, x8, [x1, #40]
+; SDAG-NEXT:    ldr q0, [x1]
+; SDAG-NEXT:    ldp x12, x9, [x1, #24]
+; SDAG-NEXT:    ldr x11, [x1, #16]
+; SDAG-NEXT:    str xzr, [x0]
+; SDAG-NEXT:    stp x10, x8, [x0, #48]
+; SDAG-NEXT:    stp x12, x9, [x0, #32]
+; SDAG-NEXT:    str x11, [x0, #24]
+; SDAG-NEXT:    stur q0, [x0, #8]
+; SDAG-NEXT:    ret
+;
+; GISEL-LABEL: test_shl_i512_const_64:
+; GISEL:       ; %bb.0: ; %entry
+; GISEL-NEXT:    ldp x8, x9, [x1]
+; GISEL-NEXT:    ldr x14, [x1, #48]
+; GISEL-NEXT:    ldp x10, x11, [x1, #16]
+; GISEL-NEXT:    ldp x12, x13, [x1, #32]
+; GISEL-NEXT:    stp xzr, x8, [x0]
+; GISEL-NEXT:    stp x9, x10, [x0, #16]
+; GISEL-NEXT:    stp x11, x12, [x0, #32]
+; GISEL-NEXT:    stp x13, x14, [x0, #48]
+; GISEL-NEXT:    ret
+entry:
+  %input_val = load i512, ptr %input, align 64
+  %shifted = shl i512 %input_val, 64
+  store i512 %shifted, ptr %result, align 64
+  ret void
+}
+
+define void @test_lshr_i512_const_64(ptr %result, ptr %input) {
+; SDAG-LABEL: test_lshr_i512_const_64:
+; SDAG:       ; %bb.0: ; %entry
+; SDAG-NEXT:    ldp x11, x8, [x1, #48]
+; SDAG-NEXT:    ldur q0, [x1, #8]
+; SDAG-NEXT:    ldp x10, x9, [x1, #24]
+; SDAG-NEXT:    ldr x12, [x1, #40]
+; SDAG-NEXT:    str q0, [x0]
+; SDAG-NEXT:    stp x8, xzr, [x0, #48]
+; SDAG-NEXT:    stp x12, x11, [x0, #32]
+; SDAG-NEXT:    stp x10, x9, [x0, #16]
+; SDAG-NEXT:    ret
+;
+; GISEL-LABEL: test_lshr_i512_const_64:
+; GISEL:       ; %bb.0: ; %entry
+; GISEL-NEXT:    ldp x8, x9, [x1, #8]
+; GISEL-NEXT:    ldr x14, [x1, #56]
+; GISEL-NEXT:    ldp x10, x11, [x1, #24]
+; GISEL-NEXT:    ldp x12, x13, [x1, #40]
+; GISEL-NEXT:    stp x14, xzr, [x0, #48]
+; GISEL-NEXT:    stp x8, x9, [x0]
+; GISEL-NEXT:    stp x10, x11, [x0, #16]
+; GISEL-NEXT:    stp x12, x13, [x0, #32]
+; GISEL-NEXT:    ret
+entry:
+  %input_val = load i512, ptr %input, align 64
+  %shifted = lshr i512 %input_val, 64
+  store i512 %shifted, ptr %result, align 64
+  ret void
+}
+
+define void @test_ashr_i512_const_64(ptr %result, ptr %input) {
+; SDAG-LABEL: test_ashr_i512_const_64:
+; SDAG:       ; %bb.0: ; %entry
+; SDAG-NEXT:    ldp x8, x9, [x1, #40]
+; SDAG-NEXT:    ldr x12, [x1, #56]
+; SDAG-NEXT:    ldp x11, x10, [x1, #24]
+; SDAG-NEXT:    ldur q0, [x1, #8]
+; SDAG-NEXT:    stp x8, x9, [x0, #32]
+; SDAG-NEXT:    asr x8, x12, #63
+; SDAG-NEXT:    stp x11, x10, [x0, #16]
+; SDAG-NEXT:    str q0, [x0]
+; SDAG-NEXT:    stp x12, x8, [x0, #48]
+; SDAG-NEXT:    ret
+;
+; GISEL-LABEL: test_ashr_i512_const_64:
+; GISEL:       ; %bb.0: ; %entry
+; GISEL-NEXT:    ldp x8, x9, [x1, #8]
+; GISEL-NEXT:    ldr x14, [x1, #56]
+; GISEL-NEXT:    ldp x10, x11, [x1, #24]
+; GISEL-NEXT:    ldp x12, x13, [x1, #40]
+; GISEL-NEXT:    stp x8, x9, [x0]
+; GISEL-NEXT:    asr x8, x14, #63
+; GISEL-NEXT:    stp x10, x11, [x0, #16]
+; GISEL-NEXT:    stp x12, x13, [x0, #32]
+; GISEL-NEXT:    stp x14, x8, [x0, #48]
+; GISEL-NEXT:    ret
+entry:
+  %input_val = load i512, ptr %input, align 64
+  %shifted = ashr i512 %input_val, 64
+  store i512 %shifted, ptr %result, align 64
+  ret void
+}
+
+define void @test_shl_i512_const_96(ptr %result, ptr %input) {
+; SDAG-LABEL: test_shl_i512_const_96:
+; SDAG:       ; %bb.0: ; %entry
+; SDAG-NEXT:    ldp x12, x11, [x1, #16]
+; SDAG-NEXT:    ldur x9, [x1, #36]
+; SDAG-NEXT:    ldur x10, [x1, #44]
+; SDAG-NEXT:    ldur x8, [x1, #28]
+; SDAG-NEXT:    ldp x13, x14, [x1]
+; SDAG-NEXT:    stp x9, x10, [x0, #48]
+; SDAG-NEXT:    extr x9, x11, x12, #32
+; SDAG-NEXT:    extr x10, x14, x13, #32
+; SDAG-NEXT:    stp x9, x8, [x0, #32]
+; SDAG-NEXT:    extr x8, x12, x14, #32
+; SDAG-NEXT:    lsl x9, x13, #32
+; SDAG-NEXT:    stp x10, x8, [x0, #16]
+; SDAG-NEXT:    stp xzr, x9, [x0]
+; SDAG-NEXT:    ret
+;
+; GISEL-LABEL: test_shl_i512_const_96:
+; GISEL:       ; %bb.0: ; %entry
+; GISEL-NEXT:    ldp x8, x9, [x1]
+; GISEL-NEXT:    ldr x15, [x1, #48]
+; GISEL-NEXT:    ldp x10, x11, [x1, #16]
+; GISEL-NEXT:    ldp x12, x13, [x1, #32]
+; GISEL-NEXT:    lsr x14, x8, #32
+; GISEL-NEXT:    lsr x16, x9, #32
+; GISEL-NEXT:    lsl x8, x8, #32
+; GISEL-NEXT:    orr x9, x14, x9, lsl #32
+; GISEL-NEXT:    lsr x14, x10, #32
+; GISEL-NEXT:    orr x10, x16, x10, lsl #32
+; GISEL-NEXT:    stp xzr, x8, [x0]
+; GISEL-NEXT:    lsr x8, x11, #32
+; GISEL-NEXT:    orr x11, x14, x11, lsl #32
+; GISEL-NEXT:    lsr x14, x12, #32
+; GISEL-NEXT:    stp x9, x10, [x0, #16]
+; GISEL-NEXT:    lsr x9, x13, #32
+; GISEL-NEXT:    orr x8, x8, x12, lsl #32
+; GISEL-NEXT:    orr x10, x14, x13, lsl #32
+; GISEL-NEXT:    orr x9, x9, x15, lsl #32
+; GISEL-NEXT:    stp x11, x8, [x0, #32]
+; GISEL-NEXT:    stp x10, x9, [x0, #48]
+; GISEL-NEXT:    ret
+entry:
+  %input_val = load i512, ptr %input, align 64
+  %shifted = shl i512 %input_val, 96
+  store i512 %shifted, ptr %result, align 64
+  ret void
+}
+
+define void @test_lshr_i512_const_96(ptr %result, ptr %input) {
+; SDAG-LABEL: test_lshr_i512_const_96:
+; SDAG:       ; %bb.0: ; %entry
+; SDAG-NEXT:    ldp x9, x10, [x1, #48]
+; SDAG-NEXT:    ldur x8, [x1, #20]
+; SDAG-NEXT:    ldp x13, x14, [x1, #32]
+; SDAG-NEXT:    ldur x11, [x1, #12]
+; SDAG-NEXT:    ldur x12, [x1, #28]
+; SDAG-NEXT:    lsr x15, x10, #32
+; SDAG-NEXT:    stp x11, x8, [x0]
+; SDAG-NEXT:    extr x8, x10, x9, #32
+; SDAG-NEXT:    extr x11, x9, x14, #32
+; SDAG-NEXT:    extr x9, x14, x13, #32
+; SDAG-NEXT:    stp x15, xzr, [x0, #48]
+; SDAG-NEXT:    stp x11, x8, [x0, #32]
+; SDAG-NEXT:    stp x12, x9, [x0, #16]
+; SDAG-NEXT:    ret
+;
+; GISEL-LABEL: test_lshr_i512_const_96:
+; GISEL:       ; %bb.0: ; %entry
+; GISEL-NEXT:    ldp x8, x9, [x1, #16]
+; GISEL-NEXT:    ldr x10, [x1, #8]
+; GISEL-NEXT:    ldp x11, x14, [x1, #32]
+; GISEL-NEXT:    ldp x15, x16, [x1, #48]
+; GISEL-NEXT:    lsl x12, x8, #32
+; GISEL-NEXT:    lsl x13, x9, #32
+; GISEL-NEXT:    orr x10, x12, x10, lsr #32
+; GISEL-NEXT:    lsl x12, x11, #32
+; GISEL-NEXT:    orr x8, x13, x8, lsr #32
+; GISEL-NEXT:    lsl x13, x14, #32
+; GISEL-NEXT:    orr x9, x12, x9, lsr #32
+; GISEL-NEXT:    stp x10, x8, [x0]
+; GISEL-NEXT:    lsl x10, x15, #32
+; GISEL-NEXT:    orr x11, x13, x11, lsr #32
+; GISEL-NEXT:    lsl x12, x16, #32
+; GISEL-NEXT:    orr x8, x10, x14, lsr #32
+; GISEL-NEXT:    lsr x10, x16, #32
+; GISEL-NEXT:    stp x9, x11, [x0, #16]
+; GISEL-NEXT:    orr x9, x12, x15, lsr #32
+; GISEL-NEXT:    stp x10, xzr, [x0, #48]
+; GISEL-NEXT:    stp x8, x9, [x0, #32]
+; GISEL-NEXT:    ret
+entry:
+  %input_val = load i512, ptr %input, align 64
+  %shifted = lshr i512 %input_val, 96
+  store i512 %shifted, ptr %result, align 64
+  ret void
+}
+
+define void @test_ashr_i512_const_96(ptr %result, ptr %input) {
+; SDAG-LABEL: test_ashr_i512_const_96:
+; SDAG:       ; %bb.0: ; %entry
+; SDAG-NEXT:    ldp x9, x10, [x1, #48]
+; SDAG-NEXT:    ldur x8, [x1, #12]
+; SDAG-NEXT:    ldur x11, [x1, #20]
+; SDAG-NEXT:    ldur x12, [x1, #28]
+; SDAG-NEXT:    ldp x13, x14, [x1, #32]
+; SDAG-NEXT:    asr x15, x10, #32
+; SDAG-NEXT:    stp x8, x11, [x0]
+; SDAG-NEXT:    asr x8, x10, #63
+; SDAG-NEXT:    extr x11, x9, x14, #32
+; SDAG-NEXT:    stp x15, x8, [x0, #48]
+; SDAG-NEXT:    extr x9, x10, x9, #32
+; SDAG-NEXT:    extr x8, x14, x13, #32
+; SDAG-NEXT:    stp x11, x9, [x0, #32]
+; SDAG-NEXT:    stp x12, x8, [x0, #16]
+; SDAG-NEXT:    ret
+;
+; GISEL-LABEL: test_ashr_i512_const_96:
+; GISEL:       ; %bb.0: ; %entry
+; GISEL-NEXT:    ldp x8, x9, [x1, #16]
+; GISEL-NEXT:    ldr x11, [x1, #8]
+; GISEL-NEXT:    ldp x10, x13, [x1, #32]
+; GISEL-NEXT:    lsl x12, x8, #32
+; GISEL-NEXT:    lsl x14, x9, #32
+; GISEL-NEXT:    lsl x15, x10, #32
+; GISEL-NEXT:    orr x11, x12, x11, lsr #32
+; GISEL-NEXT:    ldp x12, x16, [x1, #48]
+; GISEL-NEXT:    orr x8, x14, x8, lsr #32
+; GISEL-NEXT:    lsl x14, x13, #32
+; GISEL-NEXT:    orr x9, x15, x9, lsr #32
+; GISEL-NEXT:    asr x15, x16, #63
+; GISEL-NEXT:    stp x11, x8, [x0]
+; GISEL-NEXT:    lsl x11, x12, #32
+; GISEL-NEXT:    orr x10, x14, x10, lsr #32
+; GISEL-NEXT:    lsl x14, x16, #32
+; GISEL-NEXT:    orr x8, x11, x13, lsr #32
+; GISEL-NEXT:    lsl x11, x15, #32
+; GISEL-NEXT:    stp x9, x10, [x0, #16]
+; GISEL-NEXT:    orr x9, x14, x12, lsr #32
+; GISEL-NEXT:    orr x10, x11, x16, asr #32
+; GISEL-NEXT:    stp x8, x9, [x0, #32]
+; GISEL-NEXT:    stp x10, x15, [x0, #48]
+; GISEL-NEXT:    ret
+entry:
+  %input_val = load i512, ptr %input, align 64
+  %shifted = ashr i512 %input_val, 96
+  store i512 %shifted, ptr %result, align 64
+  ret void
+}
+
+; Bit-only shifts (< 64 bits)
+define void @test_shl_i512_const_1(ptr %result, ptr %input) {
+; SDAG-LABEL: test_shl_i512_const_1:
+; SDAG:       ; %bb.0: ; %entry
+; SDAG-NEXT:    ldp x8, x9, [x1, #40]
+; SDAG-NEXT:    ldr x10, [x1, #56]
+; SDAG-NEXT:    ldp x13, x11, [x1, #24]
+; SDAG-NEXT:    ldp x15, x14, [x1, #8]
+; SDAG-NEXT:    extr x12, x9, x8, #63
+; SDAG-NEXT:    extr x9, x10, x9, #63
+; SDAG-NEXT:    ldr x10, [x1]
+; SDAG-NEXT:    extr x16, x11, x13, #63
+; SDAG-NEXT:    extr x8, x8, x11, #63
+; SDAG-NEXT:    stp x12, x9, [x0, #48]
+; SDAG-NEXT:    extr x9, x14, x15, #63
+; SDAG-NEXT:    extr x11, x13, x14, #63
+; SDAG-NEXT:    stp x16, x8, [x0, #32]
+; SDAG-NEXT:    lsl x8, x10, #1
+; SDAG-NEXT:    stp x9, x11, [x0, #16]
+; SDAG-NEXT:    extr x9, x15, x10, #63
+; SDAG-NEXT:    stp x8, x9, [x0]
+; SDAG-NEXT:    ret
+;
+; GISEL-LABEL: test_shl_i512_const_1:
+; GISEL:       ; %bb.0: ; %entry
+; GISEL-NEXT:    ldp x8, x9, [x1]
+; GISEL-NEXT:    ldp x11, x12, [x1, #16]
+; GISEL-NEXT:    ldp x14, x15, [x1, #32]
+; GISEL-NEXT:    lsr x10, x8, #63
+; GISEL-NEXT:    lsr x13, x9, #63
+; GISEL-NEXT:    lsl x8, x8, #1
+; GISEL-NEXT:    orr x9, x10, x9, lsl #1
+; GISEL-NEXT:    lsr x10, x11, #63
+; GISEL-NEXT:    orr x11, x13, x11, lsl #1
+; GISEL-NEXT:    ldp x13, x16, [x1, #48]
+; GISEL-NEXT:    stp x8, x9, [x0]
+; GISEL-NEXT:    lsr x8, x12, #63
+; GISEL-NEXT:    orr x10, x10, x12, lsl #1
+; GISEL-NEXT:    lsr x12, x14, #63
+; GISEL-NEXT:    lsr x9, x15, #63
+; GISEL-NEXT:    orr x8, x8, x14, lsl #1
+; GISEL-NEXT:    stp x11, x10, [x0, #16]
+; GISEL-NEXT:    orr x11, x12, x15, lsl #1
+; GISEL-NEXT:    lsr x12, x13, #63
+; GISEL-NEXT:    orr x9, x9, x13, lsl #1
+; GISEL-NEXT:    stp x8, x11, [x0, #32]
+; GISEL-NEXT:    orr x8, x12, x16, lsl #1
+; GISEL-NEXT:    stp x9, x8, [x0, #48]
+; GISEL-NEXT:    ret
+entry:
+  %input_val = load i512, ptr %input, align 64
+  %shifted = shl i512 %input_val, 1
+  store i512 %shifted, ptr %result, align 64
+  ret void
+}
+
+define void @test_lshr_i512_const_1(ptr %result, ptr %input) {
+; SDAG-LABEL: test_lshr_i512_const_1:
+; SDAG:       ; %bb.0: ; %entry
+; SDAG-NEXT:    ldp x9, x8, [x1, #48]
+; SDAG-NEXT:    ldp x11, x10, [x1, #32]
+; SDAG-NEXT:    ldp x16, x15, [x1, #16]
+; SDAG-NEXT:    extr x12, x8, x9, #1
+; SDAG-NEXT:    lsr x8, x8, #1
+; SDAG-NEXT:    ldp x13, x14, [x1]
+; SDAG-NEXT:    extr x9, x9, x10, #1
+; SDAG-NEXT:    stp x12, x8, [x0, #48]
+; SDAG-NEXT:    extr x12, x10, x11, #1
+; SDAG-NEXT:    extr x8, x15, x16, #1
+; SDAG-NEXT:    extr x10, x11, x15, #1
+; SDAG-NEXT:    stp x12, x9, [x0, #32]
+; SDAG-NEXT:    extr x9, x14, x13, #1
+; SDAG-NEXT:    stp x8, x10, [x0, #16]
+; SDAG-NEXT:    extr x8, x16, x14, #1
+; SDAG-NEXT:    stp x9, x8, [x0]
+; SDAG-NEXT:    ret
+;
+; GISEL-LABEL: test_lshr_i512_const_1:
+; GISEL:       ; %bb.0: ; %entry
+; GISEL-NEXT:    ldp x8, x9, [x1, #8]
+; GISEL-NEXT:    ldr x11, [x1]
+; GISEL-NEXT:    ldp x10, x14, [x1, #24]
+; GISEL-NEXT:    ldr x16, [x1, #56]
+; GISEL-NEXT:    lsl x12, x8, #63
+; GISEL-NEXT:    lsl x13, x9, #63
+; GISEL-NEXT:    lsl x15, x10, #63
+; GISEL-NEXT:    orr x11, x12, x11, lsr #1
+; GISEL-NEXT:    orr x8, x13, x8, lsr #1
+; GISEL-NEXT:    lsl x13, x14, #63
+; GISEL-NEXT:    orr x9, x15, x9, lsr #1
+; GISEL-NEXT:    ldp x12, x15, [x1, #40]
+; GISEL-NEXT:    stp x11, x8, [x0]
+; GISEL-NEXT:    orr x10, x13, x10, lsr #1
+; GISEL-NEXT:    lsl x8, x16, #63
+; GISEL-NEXT:    lsl x11, x12, #63
+; GISEL-NEXT:    lsl x13, x15, #63
+; GISEL-NEXT:    stp x9, x10, [x0, #16]
+; GISEL-NEXT:    orr x8, x8, x15, lsr #1
+; GISEL-NEXT:    lsr x10, x16, #1
+; GISEL-NEXT:    orr x11, x11, x14, lsr #1
+; GISEL-NEXT:    orr x9, x13, x12, lsr #1
+; GISEL-NEXT:    stp x8, x10, [x0, #48]
+; GISEL-NEXT:    stp x11, x9, [x0, #32]
+; GISEL-NEXT:    ret
+entry:
+  %input_val = load i512, ptr %input, align 64
+  %shifted = lshr i512 %input_val, 1
+  store i512 %shifted, ptr %result, align 64
+  ret void
+}
+
+define void @test_ashr_i512_const_1(ptr %result, ptr %input) {
+; SDAG-LABEL: test_ashr_i512_const_1:
+; SDAG:       ; %bb.0: ; %entry
+; SDAG-NEXT:    ldp x9, x8, [x1, #48]
+; SDAG-NEXT:    ldp x11, x10, [x1, #32]
+; SDAG-NEXT:    ldp x16, x15, [x1, #16]
+; SDAG-NEXT:    extr x12, x8, x9, #1
+; SDAG-NEXT:    asr x8, x8, #1
+; SDAG-NEXT:    ldp x13, x14, [x1]
+; SDAG-NEXT:    extr x9, x9, x10, #1
+; SDAG-NEXT:    stp x12, x8, [x0, #48]
+; SDAG-NEXT:    extr x12, x10, x11, #1
+; SDAG-NEXT:    extr x8, x15, x16, #1
+; SDAG-NEXT:    extr x10, x11, x15, #1
+; SDAG-NEXT:    stp x12, x9, [x0, #32]
+; SDAG-NEXT:    extr x9, x14, x13, #1
+; SDAG-NEXT:    stp x8, x10, [x0, #16]
+; SDAG-NEXT:    extr x8, x16, x14, #1
+; SDAG-NEXT:    stp x9, x8, [x0]
+; SDAG-NEXT:    ret
+;
+; GISEL-LABEL: test_ashr_i512_const_1:
+; GISEL:       ; %bb.0: ; %entry
+; GISEL-NEXT:    ldp x8, x9, [x1, #8]
+; GISEL-NEXT:    ldr x11, [x1]
+; GISEL-NEXT:    ldp x10, x13, [x1, #24]
+; GISEL-NEXT:    ldr x17, [x1, #56]
+; GISEL-NEXT:    lsl x12, x8, #63
+; GISEL-NEXT:    lsl x15, x9, #63
+; GISEL-NEXT:    lsl x16, x10, #63
+; GISEL-NEXT:    orr x11, x12, x11, lsr #1
+; GISEL-NEXT:    ldp x14, x12, [x1, #40]
+; GISEL-NEXT:    orr x8, x15, x8, lsr #1
+; GISEL-NEXT:    lsl x15, x13, #63
+; GISEL-NEXT:    orr x9, x16, x9, lsr #1
+; GISEL-NEXT:    asr x16, x17, #63
+; GISEL-NEXT:    stp x11, x8, [x0]
+; GISEL-NEXT:    lsl x11, x14, #63
+; GISEL-NEXT:    orr x10, x15, x10, lsr #1
+; GISEL-NEXT:    lsl x15, x12, #63
+; GISEL-NEXT:    orr x8, x11, x13, lsr #1
+; GISEL-NEXT:    lsl x11, x17, #63
+; GISEL-NEXT:    stp x9, x10, [x0, #16]
+; GISEL-NEXT:    orr x9, x15, x14, lsr #1
+; GISEL-NEXT:    lsl x13, x16, #63
+; GISEL-NEXT:    orr x10, x11, x12, lsr #1
+; GISEL-NEXT:    stp x8, x9, [x0, #32]
+; GISEL-NEXT:    orr x8, x13, x17, asr #1
+; GISEL-NEXT:    stp x10, x8, [x0, #48]
+; GISEL-NEXT:    ret
+entry:
+  %input_val = load i512, ptr %input, align 64
+  %shifted = ashr i512 %input_val, 1
+  store i512 %shifted, ptr %result, align 64
+  ret void
+}
+
+define void @test_shl_i512_const_15(ptr %result, ptr %input) {
+; SDAG-LABEL: test_shl_i512_const_15:
+; SDAG:       ; %bb.0: ; %entry
+; SDAG-NEXT:    ldp x8, x9, [x1, #40]
+; SDAG-NEXT:    ldr x10, [x1, #56]
+; SDAG-NEXT:    ldp x13, x11, [x1, #24]
+; SDAG-NEXT:    ldp x15, x14, [x1, #8]
+; SDAG-NEXT:    extr x12, x9, x8, #49
+; SDAG-NEXT:    extr x9, x10, x9, #49
+; SDAG-NEXT:    ldr x10, [x1]
+; SDAG-NEXT:    extr x16, x11, x13, #49
+; SDAG-NEXT:    extr x8, x8, x11, #49
+; SDAG-NEXT:    stp x12, x9, [x0, #48]
+; SDAG-NEXT:    extr x9, x14, x15, #49
+; SDAG-NEXT:    extr x11, x13, x14, #49
+; SDAG-NEXT:    stp x16, x8, [x0, #32]
+; SDAG-NEXT:    lsl x8, x10, #15
+; SDAG-NEXT:    stp x9, x11, [x0, #16]
+; SDAG-NEXT:    extr x9, x15, x10, #49
+; SDAG-NEXT:    stp x8, x9, [x0]
+; SDAG-NEXT:    ret
+;
+; GISEL-LABEL: test_shl_i512_const_15:
+; GISEL:       ; %bb.0: ; %entry
+; GISEL-NEXT:    ldp x8, x9, [x1]
+; GISEL-NEXT:    ldp x11, x12, [x1, #16]
+; GISEL-NEXT:    ldp x14, x15, [x1, #32]
+; GISEL-NEXT:    lsr x10, x8, #49
+; GISEL-NEXT:    lsr x13, x9, #49
+; GISEL-NEXT:    lsl x8, x8, #15
+; GISEL-NEXT:    orr x9, x10, x9, lsl #15
+; GISEL-NEXT:    lsr x10, x11, #49
+; GISEL-NEXT:    orr x11, x13, x11, lsl #15
+; GISEL-NEXT:    ldp x13, x16, [x1, #48]
+; GISEL-NEXT:    stp x8, x9, [x0]
+; GISEL-NEXT:    lsr x8, x12, #49
+; GISEL-NEXT:    orr x10, x10, x12, lsl #15
+; GISEL-NEXT:    lsr x12, x14, #49
+; GISEL-NEXT:    lsr x9, x15, #49
+; GISEL-NEXT:    orr x8, x8, x14, lsl #15
+; GISEL-NEXT:    stp x11, x10, [x0, #16]
+; GISEL-NEXT:    orr x11, x12, x15, lsl #15
+; GISEL-NEXT:    lsr x12, x13, #49
+; GISEL-NEXT:    orr x9, x9, x13, lsl #15
+; GISEL-NEXT:    stp x8, x11, [x0, #32]
+; GISEL-NEXT:    orr x8, x12, x16, lsl #15
+; GISEL-NEXT:    stp x9, x8, [x0, #48]
+; GISEL-NEXT:    ret
+entry:
+  %input_val = load i512, ptr %input, align 64
+  %shifted = shl i512 %input_val, 15
+  store i512 %shifted, ptr %result, align 64
+  ret void
+}
+
+define void @test_lshr_i512_const_15(ptr %result, ptr %input) {
+; SDAG-LABEL: test_lshr_i512_const_15:
+; SDAG:       ; %bb.0: ; %entry
+; SDAG-NEXT:    ldp x9, x8, [x1, #48]
+; SDAG-NEXT:    ldp x11, x10, [x1, #32]
+; SDAG-NEXT:    ldp x16, x15, [x1, #16]
+; SDAG-NEXT:    extr x12, x8, x9, #15
+; SDAG-NEXT:    lsr x8, x8, #15
+; SDAG-NEXT:    ldp x13, x14, [x1]
+; SDAG-NEXT:    extr x9, x9, x10, #15
+; SDAG-NEXT:    stp x12, x8, [x0, #48]
+; SDAG-NEXT:    extr x12, x10, x11, #15
+; SDAG-NEXT:    extr x8, x15, x16, #15
+; SDAG-NEXT:    extr x10, x11, x15, #15
+; SDAG-NEXT:    stp x12, x9, [x0, #32]
+; SDAG-NEXT:    extr x9, x14, x13, #15
+; SDAG-NEXT:    stp x8, x10, [x0, #16]
+; SDAG-NEXT:    extr x8, x16, x14, #15
+; SDAG-NEXT:    stp x9, x8, [x0]
+; SDAG-NEXT:    ret
+;
+; GISEL-LABEL: test_lshr_i512_const_15:
+; GISEL:       ; %bb.0: ; %entry
+; GISEL-NEXT:    ldp x8, x9, [x1, #8]
+; GISEL-NEXT:    ldr x11, [x1]
+; GISEL-NEXT:    ldp x10, x14, [x1, #24]
+; GISEL-NEXT:    ldr x16, [x1, #56]
+; GISEL-NEXT:    lsl x12, x8, #49
+; GISEL-NEXT:    lsl x13, x9, #49
+; GISEL-NEXT:    lsl x15, x10, #49
+; GISEL-NEXT:    orr x11, x12, x11, lsr #15
+; GISEL-NEXT:    orr x8, x13, x8, lsr #15
+; GISEL-NEXT:    lsl x13, x14, #49
+; GISEL-NEXT:    orr x9, x15, x9, lsr #15
+; GISEL-NEXT:    ldp x12, x15, [x1, #40]
+; GISEL-NEXT:    stp x11, x8, [x0]
+; GISEL-NEXT:    orr x10, x13, x10, lsr #15
+; GISEL-NEXT:    lsl x8, x16, #49
+; GISEL-NEXT:    lsl x11, x12, #49
+; GISEL-NEXT:    lsl x13, x15, #49
+; GISEL-NEXT:    stp x9, x10, [x0, #16]
+; GISEL-NEXT:    orr x8, x8, x15, lsr #15
+; GISEL-NEXT:    lsr x10, x16, #15
+; GISEL-NEXT:    orr x11, x11, x14, lsr #15
+; GISEL-NEXT:    orr x9, x13, x12, lsr #15
+; GISEL-NEXT:    stp x8, x10, [x0, #48]
+; GISEL-NEXT:    stp x11, x9, [x0, #32]
+; GISEL-NEXT:    ret
+entry:
+  %input_val = load i512, ptr %input, align 64
+  %shifted = lshr i512 %input_val, 15
+  store i512 %shifted, ptr %result, align 64
+  ret void
+}
+
+define void @test_ashr_i512_const_15(ptr %result, ptr %input) {
+; SDAG-LABEL: test_ashr_i512_const_15:
+; SDAG:       ; %bb.0: ; %entry
+; SDAG-NEXT:    ldp x9, x8, [x1, #48]
+; SDAG-NEXT:    ldp x11, x10, [x1, #32]
+; SDAG-NEXT:    ldp x16, x15, [x1, #16]
+; SDAG-NEXT:    extr x12, x8, x9, #15
+; SDAG-NEXT:    asr x8, x8, #15
+; SDAG-NEXT:    ldp x13, x14, [x1]
+; SDAG-NEXT:    extr x9, x9, x10, #15
+; SDAG-NEXT:    stp x12, x8, [x0, #48]
+; SDAG-NEXT:    extr x12, x10, x11, #15
+; SDAG-NEXT:    extr x8, x15, x16, #15
+; SDAG-NEXT:    extr x10, x11, x15, #15
+; SDAG-NEXT:    stp x12, x9, [x0, #32]
+; SDAG-NEXT:    extr x9, x14, x13, #15
+; SDAG-NEXT:    stp x8, x10, [x0, #16]
+; SDAG-NEXT:    extr x8, x16, x14, #15
+; SDAG-NEXT:    stp x9, x8, [x0]
+; SDAG-NEXT:    ret
+;
+; GISEL-LABEL: test_ashr_i512_const_15:
+; GISEL:       ; %bb.0: ; %entry
+; GISEL-NEXT:    ldp x8, x9, [x1, #8]
+; GISEL-NEXT:    ldr x11, [x1]
+; GISEL-NEXT:    ldp x10, x13, [x1, #24]
+; GISEL-NEXT:    ldr x17, [x1, #56]
+; GISEL-NEXT:    lsl x12, x8, #49
+; GISEL-NEXT:    lsl x15, x9, #49
+; GISEL-NEXT:    lsl x16, x10, #49
+; GISEL-NEXT:    orr x11, x12, x11, lsr #15
+; GISEL-NEXT:    ldp x14, x12, [x1, #40]
+; GISEL-NEXT:    orr x8, x15, x8, lsr #15
+; GISEL-NEXT:    lsl x15, x13, #49
+; GISEL-NEXT:    orr x9, x16, x9, lsr #15
+; GISEL-NEXT:    asr x16, x17, #63
+; GISEL-NEXT:    stp x11, x8, [x0]
+; GISEL-NEXT:    lsl x11, x14, #49
+; GISEL-NEXT:    orr x10, x15, x10, lsr #15
+; GISEL-NEXT:    lsl x15, x12, #49
+; GISEL-NEXT:    orr x8, x11, x13, lsr #15
+; GISEL-NEXT:    lsl x11, x17, #49
+; GISEL-NEXT:    stp x9, x10, [x0, #16]
+; GISEL-NEXT:    orr x9, x15, x14, lsr #15
+; GISEL-NEXT:    lsl x13, x16, #49
+; GISEL-NEXT:    orr x10, x11, x12, lsr #15
+; GISEL-NEXT:    stp x8, x9, [x0, #32]
+; GISEL-NEXT:    orr x8, x13, x17, asr #15
+; GISEL-NEXT:    stp x10, x8, [x0, #48]
+; GISEL-NEXT:    ret
+entry:
+  %input_val = load i512, ptr %input, align 64
+  %shifted = ashr i512 %input_val, 15
+  store i512 %shifted, ptr %result, align 64
+  ret void
+}
+
+define void @test_shl_i512_const_63(ptr %result, ptr %input) {
+; SDAG-LABEL: test_shl_i512_const_63:
+; SDAG:       ; %bb.0: ; %entry
+; SDAG-NEXT:    ldp x8, x9, [x1, #40]
+; SDAG-NEXT:    ldr x10, [x1, #56]
+; SDAG-NEXT:    ldp x13, x11, [x1, #24]
+; SDAG-NEXT:    ldp x15, x14, [x1, #8]
+; SDAG-NEXT:    extr x12, x9, x8, #1
+; SDAG-NEXT:    extr x9, x10, x9, #1
+; SDAG-NEXT:    ldr x10, [x1]
+; SDAG-NEXT:    extr x16, x11, x13, #1
+; SDAG-NEXT:    extr x8, x8, x11, #1
+; SDAG-NEXT:    stp x12, x9, [x0, #48]
+; SDAG-NEXT:    extr x9, x14, x15, #1
+; SDAG-NEXT:    extr x11, x13, x14, #1
+; SDAG-NEXT:    stp x16, x8, [x0, #32]
+; SDAG-NEXT:    lsl x8, x10, #63
+; SDAG-NEXT:    stp x9, x11, [x0, #16]
+; SDAG-NEXT:    extr x9, x15, x10, #1
+; SDAG-NEXT:    stp x8, x9, [x0]
+; SDAG-NEXT:    ret
+;
+; GISEL-LABEL: test_shl_i512_const_63:
+; GISEL:       ; %bb.0: ; %entry
+; GISEL-NEXT:    ldp x8, x9, [x1]
+; GISEL-NEXT:    ldp x11, x12, [x1, #16]
+; GISEL-NEXT:    ldp x14, x15, [x1, #32]
+; GISEL-NEXT:    lsr x10, x8, #1
+; GISEL-NEXT:    lsr x13, x9, #1
+; GISEL-NEXT:    lsl x8, x8, #63
+; GISEL-NEXT:    orr x9, x10, x9, lsl #63
+; GISEL-NEXT:    lsr x10, x11, #1
+; GISEL-NEXT:    orr x11, x13, x11, lsl #63
+; GISEL-NEXT:    ldp x13, x16, [x1, #48]
+; GISEL-NEXT:    stp x8, x9, [x0]
+; GISEL-NEXT:    lsr x8, x12, #1
+; GISEL-NEXT:    orr x10, x10, x12, lsl #63
+; GISEL-NEXT:    lsr x12, x14, #1
+; GISEL-NEXT:    lsr x9, x15, #1
+; GISEL-NEXT:    orr x8, x8, x14, lsl #63
+; GISEL-NEXT:    stp x11, x10, [x0, #16]
+; GISEL-NEXT:    orr x11, x12, x15, lsl #63
+; GISEL-NEXT:    lsr x12, x13, #1
+; GISEL-NEXT:    orr x9, x9, x13, lsl #63
+; GISEL-NEXT:    stp x8, x11, [x0, #32]
+; GISEL-NEXT:    orr x8, x12, x16, lsl #63
+; GISEL-NEXT:    stp x9, x8, [x0, #48]
+; GISEL-NEXT:    ret
+entry:
+  %input_val = load i512, ptr %input, align 64
+  %shifted = shl i512 %input_val, 63
+  store i512 %shifted, ptr %result, align 64
+  ret void
+}
+
+define void @test_lshr_i512_const_63(ptr %result, ptr %input) {
+; SDAG-LABEL: test_lshr_i512_const_63:
+; SDAG:       ; %bb.0: ; %entry
+; SDAG-NEXT:    ldp x9, x8, [x1, #48]
+; SDAG-NEXT:    ldp x11, x10, [x1, #32]
+; SDAG-NEXT:    ldp x16, x15, [x1, #16]
+; SDAG-NEXT:    extr x12, x8, x9, #63
+; SDAG-NEXT:    lsr x8, x8, #63
+; SDAG-NEXT:    ldp x13, x14, [x1]
+; SDAG-NEXT:    extr x9, x9, x10, #63
+; SDAG-NEXT:    stp x12, x8, [x0, #48]
+; SDAG-NEXT:    extr x12, x10, x11, #63
+; SDAG-NEXT:    extr x8, x15, x16, #63
+; SDAG-NEXT:    extr x10, x11, x15, #63
+; SDAG-NEXT:    stp x12, x9, [x0, #32]
+; SDAG-NEXT:    extr x9, x14, x13, #63
+; SDAG-NEXT:    stp x8, x10, [x0, #16]
+; SDAG-NEXT:    extr x8, x16, x14, #63
+; SDAG-NEXT:    stp x9, x8, [x0]
+; SDAG-NEXT:    ret
+;
+; GISEL-LABEL: test_lshr_i512_const_63:
+; GISEL:       ; %bb.0: ; %entry
+; GISEL-NEXT:    ldp x8, x9, [x1, #8]
+; GISEL-NEXT:    ldr x11, [x1]
+; GISEL-NEXT:    ldp x10, x14, [x1, #24]
+; GISEL-NEXT:    ldr x16, [x1, #56]
+; GISEL-NEXT:    lsl x12, x8, #1
+; GISEL-NEXT:    lsl x13, x9, #1
+; GISEL-NEXT:    lsl x15, x10, #1
+; GISEL-NEXT:    orr x11, x12, x11, lsr #63
+; GISEL-NEXT:    orr x8, x13, x8, lsr #63
+; GISEL-NEXT:    lsl x13, x14, #1
+; GISEL-NEXT:    orr x9, x15, x9, lsr #63
+; GISEL-NEXT:    ldp x12, x15, [x1, #40]
+; GISEL-NEXT:    stp x11, x8, [x0]
+; GISEL-NEXT:    orr x10, x13, x10, lsr #63
+; GISEL-NEXT:    lsl x8, x16, #1
+; GISEL-NEXT:    lsl x11, x12, #1
+; GISEL-NEXT:    lsl x13, x15, #1
+; GISEL-NEXT:    stp x9, x10, [x0, #16]
+; GISEL-NEXT:    orr x8, x8, x15, lsr #63
+; GISEL-NEXT:    lsr x10, x16, #63
+; GISEL-NEXT:    orr x11, x11, x14, lsr #63
+; GISEL-NEXT:    orr x9, x13, x12, lsr #63
+; GISEL-NEXT:    stp x8, x10, [x0, #48]
+; GISEL-NEXT:    stp x11, x9, [x0, #32]
+; GISEL-NEXT:    ret
+entry:
+  %input_val = load i512, ptr %input, align 64
+  %shifted = lshr i512 %input_val, 63
+  store i512 %shifted, ptr %result, align 64
+  ret void
+}
+
+define void @test_ashr_i512_const_63(ptr %result, ptr %input) {
+; SDAG-LABEL: test_ashr_i512_const_63:
+; SDAG:       ; %bb.0: ; %entry
+; SDAG-NEXT:    ldp x9, x8, [x1, #48]
+; SDAG-NEXT:    ldp x11, x10, [x1, #32]
+; SDAG-NEXT:    ldp x16, x15, [x1, #16]
+; SDAG-NEXT:    extr x12, x8, x9, #63
+; SDAG-NEXT:    asr x8, x8, #63
+; SDAG-NEXT:    ldp x13, x14, [x1]
+; SDAG-NEXT:    extr x9, x9, x10, #63
+; SDAG-NEXT:    stp x12, x8, [x0, #48]
+; SDAG-NEXT:    extr x12, x10, x11, #63
+; SDAG-NEXT:    extr x8, x15, x16, #63
+; SDAG-NEXT:    extr x10, x11, x15, #63
+; SDAG-NEXT:    stp x12, x9, [x0, #32]
+; SDAG-NEXT:    extr x9, x14, x13, #63
+; SDAG-NEXT:    stp x8, x10, [x0, #16]
+; SDAG-NEXT:    extr x8, x16, x14, #63
+; SDAG-NEXT:    stp x9, x8, [x0]
+; SDAG-NEXT:    ret
+;
+; GISEL-LABEL: test_ashr_i512_const_63:
+; GISEL:       ; %bb.0: ; %entry
+; GISEL-NEXT:    ldp x8, x9, [x1, #8]
+; GISEL-NEXT:    ldr x10, [x1]
+; GISEL-NEXT:    ldp x11, x13, [x1, #24]
+; GISEL-NEXT:    ldr x17, [x1, #56]
+; GISEL-NEXT:    lsl x15, x9, #1
+; GISEL-NEXT:    lsl x12, x8, #1
+; GISEL-NEXT:    lsl x16, x11, #1
+; GISEL-NEXT:    orr x8, x15, x8, lsr #63
+; GISEL-NEXT:    lsl x15, x13, #1
+; GISEL-NEXT:    orr x10, x12, x10, lsr #63
+; GISEL-NEXT:    ldp x14, x12, [x1, #40]
+; GISEL-NEXT:    orr x9, x16, x9, lsr #63
+; GISEL-NEXT:    orr x11, x15, x11, lsr #63
+; GISEL-NEXT:    stp x10, x8, [x0]
+; GISEL-NEXT:    lsl x8, x17, #1
+; GISEL-NEXT:    lsl x16, x14, #1
+; GISEL-NEXT:    lsl x10, x12, #1
+; GISEL-NEXT:    stp x9, x11, [x0, #16]
+; GISEL-NEXT:    asr x9, x17, #63
+; GISEL-NEXT:    orr x8, x8, x12, lsr #63
+; GISEL-NEXT:    orr x13, x16, x13, lsr #63
+; GISEL-NEXT:    orr x10, x10, x14, lsr #63
+; GISEL-NEXT:    orr x9, x9, x9, lsl #1
+; GISEL-NEXT:    stp x13, x10, [x0, #32]
+; GISEL-NEXT:    stp x8, x9, [x0, #48]
+; GISEL-NEXT:    ret
+entry:
+  %input_val = load i512, ptr %input, align 64
+  %shifted = ashr i512 %input_val, 63
+  store i512 %shifted, ptr %result, align 64
+  ret void
+}
+
+; Mixed word+bit shifts
+define void @test_shl_i512_const_65(ptr %result, ptr %input) {
+; SDAG-LABEL: test_shl_i512_const_65:
+; SDAG:       ; %bb.0: ; %entry
+; SDAG-NEXT:    ldp x9, x8, [x1, #32]
+; SDAG-NEXT:    ldr x10, [x1, #48]
+; SDAG-NEXT:    ldp x12, x11, [x1, #16]
+; SDAG-NEXT:    extr x13, x8, x9, #63
+; SDAG-NEXT:    extr x8, x10, x8, #63
+; SDAG-NEXT:    ldp x10, x14, [x1]
+; SDAG-NEXT:    extr x15, x11, x12, #63
+; SDAG-NEXT:    stp x13, x8, [x0, #48]
+; SDAG-NEXT:    extr x9, x9, x11, #63
+; SDAG-NEXT:    extr x8, x14, x10, #63
+; SDAG-NEXT:    extr x11, x12, x14, #63
+; SDAG-NEXT:    stp x15, x9, [x0, #32]
+; SDAG-NEXT:    stp x8, x11, [x0, #16]
+; SDAG-NEXT:    lsl x8, x10, #1
+; SDAG-NEXT:    stp xzr, x8, [x0]
+; SDAG-NEXT:    ret
+;
+; GISEL-LABEL: test_shl_i512_const_65:
+; GISEL:       ; %bb.0: ; %entry
+; GISEL-NEXT:    ldp x8, x9, [x1]
+; GISEL-NEXT:    ldr x15, [x1, #48]
+; GISEL-NEXT:    ldp x10, x11, [x1, #16]
+; GISEL-NEXT:    ldp x12, x13, [x1, #32]
+; GISEL-NEXT:    lsr x14, x8, #63
+; GISEL-NEXT:    lsr x16, x9, #63
+; GISEL-NEXT:    lsl x8, x8, #1
+; GISEL-NEXT:    orr x9, x14, x9, lsl #1
+; GISEL-NEXT:    lsr x14, x10, #63
+; GISEL-NEXT:    orr x10, x16, x10, lsl #1
+; GISEL-NEXT:    stp xzr, x8, [x0]
+; GISEL-NEXT:    lsr x8, x11, #63
+; GISEL-NEXT:    orr x11, x14, x11, lsl #1
+; GISEL-NEXT:    lsr x14, x12, #63
+; GISEL-NEXT:    stp x9, x10, [x0, #16]
+; GISEL-NEXT:    lsr x9, x13, #63
+; GISEL-NEXT:    orr x8, x8, x12, lsl #1
+; GISEL-NEXT:    orr x10, x14, x13, lsl #1
+; GISEL-NEXT:    orr x9, x9, x15, lsl #1
+; GISEL-NEXT:    stp x11, x8, [x0, #32]
+; GISEL-NEXT:    stp x10, x9, [x0, #48]
+; GISEL-NEXT:    ret
+entry:
+  %input_val = load i512, ptr %input, align 64
+  %shifted = shl i512 %input_val, 65
+  store i512 %shifted, ptr %result, align 64
+  ret void
+}
+
+define void @test_lshr_i512_const_65(ptr %result, ptr %input) {
+; SDAG-LABEL: test_lshr_i512_const_65:
+; SDAG:       ; %bb.0: ; %entry
+; SDAG-NEXT:    ldp x9, x8, [x1, #48]
+; SDAG-NEXT:    ldr x15, [x1, #24]
+; SDAG-NEXT:    ldp x14, x10, [x1, #32]
+; SDAG-NEXT:    ldp x11, x12, [x1, #8]
+; SDAG-NEXT:    lsr x13, x8, #1
+; SDAG-NEXT:    extr x8, x8, x9, #1
+; SDAG-NEXT:    extr x16, x9, x10, #1
+; SDAG-NEXT:    extr x9, x14, x15, #1
+; SDAG-NEXT:    extr x10, x10, x14, #1
+; SDAG-NEXT:    stp x13, xzr, [x0, #48]
+; SDAG-NEXT:    stp x16, x8, [x0, #32]
+; SDAG-NEXT:    extr x8, x12, x11, #1
+; SDAG-NEXT:    stp x9, x10, [x0, #16]
+; SDAG-NEXT:    extr x9, x15, x12, #1
+; SDAG-NEXT:    stp x8, x9, [x0]
+; SDAG-NEXT:    ret
+;
+; GISEL-LABEL: test_lshr_i512_const_65:
+; GISEL:       ; %bb.0: ; %entry
+; GISEL-NEXT:    ldp x8, x9, [x1, #16]
+; GISEL-NEXT:    ldr x10, [x1, #8]
+; GISEL-NEXT:    ldp x11, x14, [x1, #32]
+; GISEL-NEXT:    ldp x15, x16, [x1, #48]
+; GISEL-NEXT:    lsl x12, x8, #63
+; GISEL-NEXT:    lsl x13, x9, #63
+; GISEL-NEXT:    orr x10, x12, x10, lsr #1
+; GISEL-NEXT:    lsl x12, x11, #63
+; GISEL-NEXT:    orr x8, x13, x8, lsr #1
+; GISEL-NEXT:    lsl x13, x14, #63
+; GISEL-NEXT:    orr x9, x12, x9, lsr #1
+; GISEL-NEXT:    stp x10, x8, [x0]
+; GISEL-NEXT:    lsl x10, x15, #63
+; GISEL-NEXT:    orr x11, x13, x11, lsr #1
+; GISEL-NEXT:    lsl x12, x16, #63
+; GISEL-NEXT:    orr x8, x10, x14, lsr #1
+; GISEL-NEXT:    lsr x10, x16, #1
+; GISEL-NEXT:    stp x9, x11, [x0, #16]
+; GISEL-NEXT:    orr x9, x12, x15, lsr #1
+; GISEL-NEXT:    stp x10, xzr, [x0, #48]
+; GISEL-NEXT:    stp x8, x9, [x0, #32]
+; GISEL-NEXT:    ret
+entry:
+  %input_val = load i512, ptr %input, align 64
+  %shifted = lshr i512 %input_val, 65
+  store i512 %shifted, ptr %result, align 64
+  ret void
+}
+
+define void @test_ashr_i512_const_65(ptr %result, ptr %input) {
+; SDAG-LABEL: test_ashr_i512_const_65:
+; SDAG:       ; %bb.0: ; %entry
+; SDAG-NEXT:    ldp x9, x8, [x1, #48]
+; SDAG-NEXT:    ldr x16, [x1, #24]
+; SDAG-NEXT:    ldp x15, x10, [x1, #32]
+; SDAG-NEXT:    ldp x12, x13, [x1, #8]
+; SDAG-NEXT:    asr x11, x8, #1
+; SDAG-NEXT:    asr x14, x8, #63
+; SDAG-NEXT:    extr x8, x8, x9, #1
+; SDAG-NEXT:    stp x11, x14, [x0, #48]
+; SDAG-NEXT:    extr x11, x9, x10, #1
+; SDAG-NEXT:    extr x9, x15, x16, #1
+; SDAG-NEXT:    extr x10, x10, x15, #1
+; SDAG-NEXT:    stp x11, x8, [x0, #32]
+; SDAG-NEXT:    extr x8, x13, x12, #1
+; SDAG-NEXT:    stp x9, x10, [x0, #16]
+; SDAG-NEXT:    extr x9, x16, x13, #1
+; SDAG-NEXT:    stp x8, x9, [x0]
+; SDAG-NEXT:    ret
+;
+; GISEL-LABEL: test_ashr_i512_const_65:
+; GISEL:       ; %bb.0: ; %entry
+; GISEL-NEXT:    ldp x8, x9, [x1, #16]
+; GISEL-NEXT:    ldr x11, [x1, #8]
+; GISEL-NEXT:    ldp x10, x13, [x1, #32]
+; GISEL-NEXT:    lsl x12, x8, #63
+; GISEL-NEXT:    lsl x14, x9, #63
+; GISEL-NEXT:    lsl x15, x10, #63
+; GISEL-NEXT:    orr x11, x12, x11, lsr #1
+; GISEL-NEXT:    ldp x12, x16, [x1, #48]
+; GISEL-NEXT:    orr x8, x14, x8, lsr #1
+; GISEL-NEXT:    lsl x14, x13, #63
+; GISEL-NEXT:    orr x9, x15, x9, lsr #1
+; GISEL-NEXT:    asr x15, x16, #63
+; GISEL-NEXT:    stp x11, x8, [x0]
+; GISEL-NEXT:    lsl x11, x12, #63
+; GISEL-NEXT:    orr x10, x14, x10, lsr #1
+; GISEL-NEXT:    lsl x14, x16, #63
+; GISEL-NEXT:    orr x8, x11, x13, lsr #1
+; GISEL-NEXT:    lsl x11, x15, #63
+; GISEL-NEXT:    stp x9, x10, [x0, #16]
+; GISEL-NEXT:    orr x9, x14, x12, lsr #1
+; GISEL-NEXT:    orr x10, x11, x16, asr #1
+; GISEL-NEXT:    stp x8, x9, [x0, #32]
+; GISEL-NEXT:    stp x10, x15, [x0, #48]
+; GISEL-NEXT:    ret
+entry:
+  %input_val = load i512, ptr %input, align 64
+  %shifted = ashr i512 %input_val, 65
+  store i512 %shifted, ptr %result, align 64
+  ret void
+}
+
+define void @test_shl_i512_const_100(ptr %result, ptr %input) {
+; SDAG-LABEL: test_shl_i512_const_100:
+; SDAG:       ; %bb.0: ; %entry
+; SDAG-NEXT:    ldp x9, x8, [x1, #32]
+; SDAG-NEXT:    ldr x10, [x1, #48]
+; SDAG-NEXT:    ldp x12, x11, [x1, #16]
+; SDAG-NEXT:    extr x13, x8, x9, #28
+; SDAG-NEXT:    extr x8, x10, x8, #28
+; SDAG-NEXT:    ldp x10, x14, [x1]
+; SDAG-NEXT:    extr x15, x11, x12, #28
+; SDAG-NEXT:    stp x13, x8, [x0, #48]
+; SDAG-NEXT:    extr x9, x9, x11, #28
+; SDAG-NEXT:    extr x8, x14, x10, #28
+; SDAG-NEXT:    extr x11, x12, x14, #28
+; SDAG-NEXT:    stp x15, x9, [x0, #32]
+; SDAG-NEXT:    stp x8, x11, [x0, #16]
+; SDAG-NEXT:    lsl x8, x10, #36
+; SDAG-NEXT:    stp xzr, x8, [x0]
+; SDAG-NEXT:    ret
+;
+; GISEL-LABEL: test_shl_i512_const_100:
+; GISEL:       ; %bb.0: ; %entry
+; GISEL-NEXT:    ldp x8, x9, [x1]
+; GISEL-NEXT:    ldr x15, [x1, #48]
+; GISEL-NEXT:    ldp x10, x11, [x1, #16]
+; GISEL-NEXT:    ldp x12, x13, [x1, #32]
+; GISEL-NEXT:    lsr x14, x8, #28
+; GISEL-NEXT:    lsr x16, x9, #28
+; GISEL-NEXT:    lsl x8, x8, #36
+; GISEL-NEXT:    orr x9, x14, x9, lsl #36
+; GISEL-NEXT:    lsr x14, x10, #28
+; GISEL-NEXT:    orr x10, x16, x10, lsl #36
+; GISEL-NEXT:    stp xzr, x8, [x0]
+; GISEL-NEXT:    lsr x8, x11, #28
+; GISEL-NEXT:    orr x11, x14, x11, lsl #36
+; GISEL-NEXT:    lsr x14, x12, #28
+; GISEL-NEXT:    stp x9, x10, [x0, #16]
+; GISEL-NEXT:    lsr x9, x13, #28
+; GISEL-NEXT:    orr x8, x8, x12, lsl #36
+; GISEL-NEXT:    orr x10, x14, x13, lsl #36
+; GISEL-NEXT:    orr x9, x9, x15, lsl #36
+; GISEL-NEXT:    stp x11, x8, [x0, #32]
+; GISEL-NEXT:    stp x10, x9, [x0, #48]
+; GISEL-NEXT:    ret
+entry:
+  %input_val = load i512, ptr %input, align 64
+  %shifted = shl i512 %input_val, 100
+  store i512 %shifted, ptr %result, align 64
+  ret void
+}
+
+define void @test_lshr_i512_const_100(ptr %result, ptr %input) {
+; SDAG-LABEL: test_lshr_i512_const_100:
+; SDAG:       ; %bb.0: ; %entry
+; SDAG-NEXT:    ldp x9, x8, [x1, #48]
+; SDAG-NEXT:    ldr x15, [x1, #24]
+; SDAG-NEXT:    ldp x14, x10, [x1, #32]
+; SDAG-NEXT:    ldp x11, x12, [x1, #8]
+; SDAG-NEXT:    lsr x13, x8, #36
+; SDAG-NEXT:    extr x8, x8, x9, #36
+; SDAG-NEXT:    extr x16, x9, x10, #36
+; SDAG-NEXT:    extr x9, x14, x15, #36
+; SDAG-NEXT:    extr x10, x10, x14, #36
+; SDAG-NEXT:    stp x13, xzr, [x0, #48]
+; SDAG-NEXT:    stp x16, x8, [x0, #32]
+; SDAG-NEXT:    extr x8, x12, x11, #36
+; SDAG-NEXT:    stp x9, x10, [x0, #16]
+; SDAG-NEXT:    extr x9, x15, x12, #36
+; SDAG-NEXT:    stp x8, x9, [x0]
+; SDAG-NEXT:    ret
+;
+; GISEL-LABEL: test_lshr_i512_const_100:
+; GISEL:       ; %bb.0: ; %entry
+; GISEL-NEXT:    ldp x8, x9, [x1, #16]
+; GISEL-NEXT:    ldr x10, [x1, #8]
+; GISEL-NEXT:    ldp x11, x14, [x1, #32]
+; GISEL-NEXT:    ldp x15, x16, [x1, #48]
+; GISEL-NEXT:    lsl x12, x8, #28
+; GISEL-NEXT:    lsl x13, x9, #28
+; GISEL-NEXT:    orr x10, x12, x10, lsr #36
+; GISEL-NEXT:    lsl x12, x11, #28
+; GISEL-NEXT:    orr x8, x13, x8, lsr #36
+; GISEL-NEXT:    lsl x13, x14, #28
+; GISEL-NEXT:    orr x9, x12, x9, lsr #36
+; GISEL-NEXT:    stp x10, x8, [x0]
+; GISEL-NEXT:    lsl x10, x15, #28
+; GISEL-NEXT:    orr x11, x13, x11, lsr #36
+; GISEL-NEXT:    lsl x12, x16, #28
+; GISEL-NEXT:    orr x8, x10, x14, lsr #36
+; GISEL-NEXT:    lsr x10, x16, #36
+; GISEL-NEXT:    stp x9, x11, [x0, #16]
+; GISEL-NEXT:    orr x9, x12, x15, lsr #36
+; GISEL-NEXT:    stp x10, xzr, [x0, #48]
+; GISEL-NEXT:    stp x8, x9, [x0, #32]
+; GISEL-NEXT:    ret
+entry:
+  %input_val = load i512, ptr %input, align 64
+  %shifted = lshr i512 %input_val, 100
+  store i512 %shifted, ptr %result, align 64
+  ret void
+}
+
+define void @test_ashr_i512_const_100(ptr %result, ptr %input) {
+; SDAG-LABEL: test_ashr_i512_const_100:
+; SDAG:       ; %bb.0: ; %entry
+; SDAG-NEXT:    ldp x9, x8, [x1, #48]
+; SDAG-NEXT:    ldr x16, [x1, #24]
+; SDAG-NEXT:    ldp x15, x10, [x1, #32]
+; SDAG-NEXT:    ldp x12, x13, [x1, #8]
+; SDAG-NEXT:    asr x11, x8, #36
+; SDAG-NEXT:    asr x14, x8, #63
+; SDAG-NEXT:    extr x8, x8, x9, #36
+; SDAG-NEXT:    stp x11, x14, [x0, #48]
+; SDAG-NEXT:    extr x11, x9, x10, #36
+; SDAG-NEXT:    extr x9, x15, x16, #36
+; SDAG-NEXT:    extr x10, x10, x15, #36
+; SDAG-NEXT:    stp x11, x8, [x0, #32]
+; SDAG-NEXT:    extr x8, x13, x12, #36
+; SDAG-NEXT:    stp x9, x10, [x0, #16]
+; SDAG-NEXT:    extr x9, x16, x13, #36
+; SDAG-NEXT:    stp x8, x9, [x0]
+; SDAG-NEXT:    ret
+;
+; GISEL-LABEL: test_ashr_i512_const_100:
+; GISEL:       ; %bb.0: ; %entry
+; GISEL-NEXT:    ldp x8, x9, [x1, #16]
+; GISEL-NEXT:    ldr x11, [x1, #8]
+; GISEL-NEXT:    ldp x10, x13, [x1, #32]
+; GISEL-NEXT:    lsl x12, x8, #28
+; GISEL-NEXT:    lsl x14, x9, #28
+; GISEL-NEXT:    lsl x15, x10, #28
+; GISEL-NEXT:    orr x11, x12, x11, lsr #36
+; GISEL-NEXT:    ldp x12, x16, [x1, #48]
+; GISEL-NEXT:    orr x8, x14, x8, lsr #36
+; GISEL-NEXT:    lsl x14, x13, #28
+; GISEL-NEXT:    orr x9, x15, x9, lsr #36
+; GISEL-NEXT:    asr x15, x16, #63
+; GISEL-NEXT:    stp x11, x8, [x0]
+; GISEL-NEXT:    lsl x11, x12, #28
+; GISEL-NEXT:    orr x10, x14, x10, lsr #36
+; GISEL-NEXT:    lsl x14, x16, #28
+; GISEL-NEXT:    orr x8, x11, x13, lsr #36
+; GISEL-NEXT:    lsl x11, x15, #28
+; GISEL-NEXT:    stp x9, x10, [x0, #16]
+; GISEL-NEXT:    orr x9, x14, x12, lsr #36
+; GISEL-NEXT:    orr x10, x11, x16, asr #36
+; GISEL-NEXT:    stp x8, x9, [x0, #32]
+; GISEL-NEXT:    stp x10, x15, [x0, #48]
+; GISEL-NEXT:    ret
+entry:
+  %input_val = load i512, ptr %input, align 64
+  %shifted = ashr i512 %input_val, 100
+  store i512 %shifted, ptr %result, align 64
+  ret void
+}
+
+; Boundary conditions - test exactly at the edge
+define void @test_shl_i512_const_127(ptr %result, ptr %input) {
+; SDAG-LABEL: test_shl_i512_const_127:
+; SDAG:       ; %bb.0: ; %entry
+; SDAG-NEXT:    ldp x9, x8, [x1, #32]
+; SDAG-NEXT:    ldr x10, [x1, #48]
+; SDAG-NEXT:    ldp x12, x11, [x1, #16]
+; SDAG-NEXT:    extr x13, x8, x9, #1
+; SDAG-NEXT:    extr x8, x10, x8, #1
+; SDAG-NEXT:    ldp x10, x14, [x1]
+; SDAG-NEXT:    extr x15, x11, x12, #1
+; SDAG-NEXT:    stp x13, x8, [x0, #48]
+; SDAG-NEXT:    extr x9, x9, x11, #1
+; SDAG-NEXT:    extr x8, x14, x10, #1
+; SDAG-NEXT:    extr x11, x12, x14, #1
+; SDAG-NEXT:    stp x15, x9, [x0, #32]
+; SDAG-NEXT:    stp x8, x11, [x0, #16]
+; SDAG-NEXT:    lsl x8, x10, #63
+; SDAG-NEXT:    stp xzr, x8, [x0]
+; SDAG-NEXT:    ret
+;
+; GISEL-LABEL: test_shl_i512_const_127:
+; GISEL:       ; %bb.0: ; %entry
+; GISEL-NEXT:    ldp x8, x9, [x1]
+; GISEL-NEXT:    ldr x15, [x1, #48]
+; GISEL-NEXT:    ldp x10, x11, [x1, #16]
+; GISEL-NEXT:    ldp x12, x13, [x1, #32]
+; GISEL-NEXT:    lsr x14, x8, #1
+; GISEL-NEXT:    lsr x16, x9, #1
+; GISEL-NEXT:    lsl x8, x8, #63
+; GISEL-NEXT:    orr x9, x14, x9, lsl #63
+; GISEL-NEXT:    lsr x14, x10, #1
+; GISEL-NEXT:    orr x10, x16, x10, lsl #63
+; GISEL-NEXT:    stp xzr, x8, [x0]
+; GISEL-NEXT:    lsr x8, x11, #1
+; GISEL-NEXT:    orr x11, x14, x11, lsl #63
+; GISEL-NEXT:    lsr x14, x12, #1
+; GISEL-NEXT:    stp x9, x10, [x0, #16]
+; GISEL-NEXT:    lsr x9, x13, #1
+; GISEL-NEXT:    orr x8, x8, x12, lsl #63
+; GISEL-NEXT:    orr x10, x14, x13, lsl #63
+; GISEL-NEXT:    orr x9, x9, x15, lsl #63
+; GISEL-NEXT:    stp x11, x8, [x0, #32]
+; GISEL-NEXT:    stp x10, x9, [x0, #48]
+; GISEL-NEXT:    ret
+entry:
+  %input_val = load i512, ptr %input, align 64
+  %shifted = shl i512 %input_val, 127
+  store i512 %shifted, ptr %result, align 64
+  ret void
+}
+
+define void @test_lshr_i512_const_127(ptr %result, ptr %input) {
+; SDAG-LABEL: test_lshr_i512_const_127:
+; SDAG:       ; %bb.0: ; %entry
+; SDAG-NEXT:    ldp x9, x8, [x1, #48]
+; SDAG-NEXT:    ldr x15, [x1, #24]
+; SDAG-NEXT:    ldp x14, x10, [x1, #32]
+; SDAG-NEXT:    ldp x11, x12, [x1, #8]
+; SDAG-NEXT:    lsr x13, x8, #63
+; SDAG-NEXT:    extr x8, x8, x9, #63
+; SDAG-NEXT:    extr x16, x9, x10, #63
+; SDAG-NEXT:    extr x9, x14, x15, #63
+; SDAG-NEXT:    extr x10, x10, x14, #63
+; SDAG-NEXT:    stp x13, xzr, [x0, #48]
+; SDAG-NEXT:    stp x16, x8, [x0, #32]
+; SDAG-NEXT:    extr x8, x12, x11, #63
+; SDAG-NEXT:    stp x9, x10, [x0, #16]
+; SDAG-NEXT:    extr x9, x15, x12, #63
+; SDAG-NEXT:    stp x8, x9, [x0]
+; SDAG-NEXT:    ret
+;
+; GISEL-LABEL: test_lshr_i512_const_127:
+; GISEL:       ; %bb.0: ; %entry
+; GISEL-NEXT:    ldp x8, x9, [x1, #16]
+; GISEL-NEXT:    ldr x10, [x1, #8]
+; GISEL-NEXT:    ldp x11, x14, [x1, #32]
+; GISEL-NEXT:    ldp x15, x16, [x1, #48]
+; GISEL-NEXT:    lsl x12, x8, #1
+; GISEL-NEXT:    lsl x13, x9, #1
+; GISEL-NEXT:    orr x10, x12, x10, lsr #63
+; GISEL-NEXT:    lsl x12, x11, #1
+; GISEL-NEXT:    orr x8, x13, x8, lsr #63
+; GISEL-NEXT:    lsl x13, x14, #1
+; GISEL-NEXT:    orr x9, x12, x9, lsr #63
+; GISEL-NEXT:    stp x10, x8, [x0]
+; GISEL-NEXT:    lsl x10, x15, #1
+; GISEL-NEXT:    orr x11, x13, x11, lsr #63
+; GISEL-NEXT:    lsl x12, x16, #1
+; GISEL-NEXT:    orr x8, x10, x14, lsr #63
+; GISEL-NEXT:    lsr x10, x16, #63
+; GISEL-NEXT:    stp x9, x11, [x0, #16]
+; GISEL-NEXT:    orr x9, x12, x15, lsr #63
+; GISEL-NEXT:    stp x10, xzr, [x0, #48]
+; GISEL-NEXT:    stp x8, x9, [x0, #32]
+; GISEL-NEXT:    ret
+entry:
+  %input_val = load i512, ptr %input, align 64
+  %shifted = lshr i512 %input_val, 127
+  store i512 %shifted, ptr %result, align 64
+  ret void
+}
+
+define void @test_ashr_i512_const_127(ptr %result, ptr %input) {
+; SDAG-LABEL: test_ashr_i512_const_127:
+; SDAG:       ; %bb.0: ; %entry
+; SDAG-NEXT:    ldp x9, x8, [x1, #48]
+; SDAG-NEXT:    ldr x15, [x1, #24]
+; SDAG-NEXT:    ldp x14, x10, [x1, #32]
+; SDAG-NEXT:    ldp x12, x13, [x1, #8]
+; SDAG-NEXT:    asr x11, x8, #63
+; SDAG-NEXT:    extr x8, x8, x9, #63
+; SDAG-NEXT:    extr x16, x9, x10, #63
+; SDAG-NEXT:    extr x9, x14, x15, #63
+; SDAG-NEXT:    extr x10, x10, x14, #63
+; SDAG-NEXT:    stp x11, x11, [x0, #48]
+; SDAG-NEXT:    stp x16, x8, [x0, #32]
+; SDAG-NEXT:    extr x8, x13, x12, #63
+; SDAG-NEXT:    stp x9, x10, [x0, #16]
+; SDAG-NEXT:    extr x9, x15, x13, #63
+; SDAG-NEXT:    stp x8, x9, [x0]
+; SDAG-NEXT:    ret
+;
+; GISEL-LABEL: test_ashr_i512_const_127:
+; GISEL:       ; %bb.0: ; %entry
+; GISEL-NEXT:    ldp x8, x9, [x1, #16]
+; GISEL-NEXT:    ldr x10, [x1, #8]
+; GISEL-NEXT:    ldp x11, x14, [x1, #32]
+; GISEL-NEXT:    ldp x15, x16, [x1, #48]
+; GISEL-NEXT:    lsl x12, x8, #1
+; GISEL-NEXT:    lsl x13, x9, #1
+; GISEL-NEXT:    orr x10, x12, x10, lsr #63
+; GISEL-NEXT:    lsl x12, x11, #1
+; GISEL-NEXT:    orr x8, x13, x8, lsr #63
+; GISEL-NEXT:    lsl x13, x14, #1
+; GISEL-NEXT:    orr x9, x12, x9, lsr #63
+; GISEL-NEXT:    lsl x12, x15, #1
+; GISEL-NEXT:    stp x10, x8, [x0]
+; GISEL-NEXT:    lsl x10, x16, #1
+; GISEL-NEXT:    orr x11, x13, x11, lsr #63
+; GISEL-NEXT:    asr x8, x16, #63
+; GISEL-NEXT:    orr x12, x12, x14, lsr #63
+; GISEL-NEXT:    stp x9, x11, [x0, #16]
+; GISEL-NEXT:    orr x9, x10, x15, lsr #63
+; GISEL-NEXT:    orr x10, x8, x8, lsl #1
+; GISEL-NEXT:    stp x12, x9, [x0, #32]
+; GISEL-NEXT:    stp x10, x8, [x0, #48]
+; GISEL-NEXT:    ret
+entry:
+  %input_val = load i512, ptr %input, align 64
+  %shifted = ashr i512 %input_val, 127
+  store i512 %shifted, ptr %result, align 64
+  ret void
+}
+
+; Over-shift tests - shift >= bitwidth (should produce predictable results)
+; Note: In LLVM IR, shifts by >= bitwidth are undefined behavior, so we avoid these
+
+; =============================================================================
+; VARIABLE SHIFT TESTS - Additional edge cases for variable shift paths
+; =============================================================================
+
+define void @test_shl_i1024_variable_edge(ptr %result, ptr %input, i32 %shift) {
----------------
aemerson wrote:

Not apart from the types, will remove.

https://github.com/llvm/llvm-project/pull/155353


More information about the llvm-commits mailing list