brintos

brintos / llvm-project-archived public Read only

0
0
Text · 37.5 KiB · fd23f3d Raw
953 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=arm64-apple-ios -o - %s | FileCheck %s3; RUN: llc -mtriple=aarch64_be-unknown-linux -o - %s | FileCheck --check-prefix=CHECK-BE %s4; RUN: llc -mtriple=aarch64_be-unknown-linux -aarch64-enable-ext-to-tbl=false -o - %s | FileCheck --check-prefix=CHECK-DISABLE %s5 6; CHECK-LABEL: lCPI0_0:7; CHECK-NEXT:	.byte	0                               ; 0x08; CHECK-NEXT:	.byte	4                               ; 0x49; CHECK-NEXT:	.byte	8                               ; 0x810; CHECK-NEXT:	.byte	12                              ; 0xc11; CHECK-NEXT:	.byte	16                              ; 0x1012; CHECK-NEXT:	.byte	20                              ; 0x1413; CHECK-NEXT:	.byte	24                              ; 0x1814; CHECK-NEXT:	.byte	28                              ; 0x1c15; CHECK-NEXT:	.byte	32                              ; 0x2016; CHECK-NEXT:	.byte	36                              ; 0x2417; CHECK-NEXT:	.byte	40                              ; 0x2818; CHECK-NEXT:	.byte	44                              ; 0x2c19; CHECK-NEXT:	.byte	48                              ; 0x3020; CHECK-NEXT:	.byte	52                              ; 0x3421; CHECK-NEXT:	.byte	56                              ; 0x3822; CHECK-NEXT:	.byte	60                              ; 0x3c23 24; CHECK-BE-LABEL:   .LCPI0_0:25; CHECK-BE-NEXT:   .byte    3                               // 0x326; CHECK-BE-NEXT:   .byte    7                               // 0x727; CHECK-BE-NEXT:   .byte    11                              // 0xb28; CHECK-BE-NEXT:   .byte    15                              // 0xf29; CHECK-BE-NEXT:   .byte    19                              // 0x1330; CHECK-BE-NEXT:   .byte    23                              // 0x1731; CHECK-BE-NEXT:   .byte    27                              // 0x1b32; CHECK-BE-NEXT:   .byte    31                              // 0x1f33; CHECK-BE-NEXT:   .byte    35                              // 0x2334; CHECK-BE-NEXT:   .byte    39                              // 0x2735; CHECK-BE-NEXT:   .byte    43                              // 0x2b36; CHECK-BE-NEXT:   .byte    47                              // 0x2f37; CHECK-BE-NEXT:   .byte    51                              // 0x3338; CHECK-BE-NEXT:   .byte    55                              // 0x3739; CHECK-BE-NEXT:   .byte    59                              // 0x3b40; CHECK-BE-NEXT:   .byte    63                              // 0x3f41 42; It's profitable to use a single tbl.4 instruction to lower the truncate.43define void @trunc_v16i32_to_v16i8_in_loop(ptr %A, ptr %dst) {44; CHECK-LABEL: trunc_v16i32_to_v16i8_in_loop:45; CHECK:       ; %bb.0: ; %entry46; CHECK-NEXT:  Lloh0:47; CHECK-NEXT:    adrp x8, lCPI0_0@PAGE48; CHECK-NEXT:  Lloh1:49; CHECK-NEXT:    ldr q0, [x8, lCPI0_0@PAGEOFF]50; CHECK-NEXT:    mov x8, xzr51; CHECK-NEXT:  LBB0_1: ; %loop52; CHECK-NEXT:    ; =>This Inner Loop Header: Depth=153; CHECK-NEXT:    add x9, x0, x8, lsl #654; CHECK-NEXT:    ldp q1, q2, [x9]55; CHECK-NEXT:    ldp q3, q4, [x9, #32]56; CHECK-NEXT:    tbl.16b v1, { v1, v2, v3, v4 }, v057; CHECK-NEXT:    str q1, [x1, x8, lsl #4]58; CHECK-NEXT:    add x8, x8, #159; CHECK-NEXT:    cmp x8, #100060; CHECK-NEXT:    b.eq LBB0_161; CHECK-NEXT:  ; %bb.2: ; %exit62; CHECK-NEXT:    ret63; CHECK-NEXT:    .loh AdrpLdr Lloh0, Lloh164;65; CHECK-BE-LABEL: trunc_v16i32_to_v16i8_in_loop:66; CHECK-BE:       // %bb.0: // %entry67; CHECK-BE-NEXT:    adrp x8, .LCPI0_068; CHECK-BE-NEXT:    add x8, x8, :lo12:.LCPI0_069; CHECK-BE-NEXT:    ld1 { v0.16b }, [x8]70; CHECK-BE-NEXT:    mov x8, xzr71; CHECK-BE-NEXT:  .LBB0_1: // %loop72; CHECK-BE-NEXT:    // =>This Inner Loop Header: Depth=173; CHECK-BE-NEXT:    add x9, x0, x8, lsl #674; CHECK-BE-NEXT:    add x10, x9, #1675; CHECK-BE-NEXT:    ld1 { v1.16b }, [x9]76; CHECK-BE-NEXT:    add x11, x9, #3277; CHECK-BE-NEXT:    ld1 { v2.16b }, [x10]78; CHECK-BE-NEXT:    add x9, x9, #4879; CHECK-BE-NEXT:    ld1 { v3.16b }, [x11]80; CHECK-BE-NEXT:    ld1 { v4.16b }, [x9]81; CHECK-BE-NEXT:    add x9, x1, x8, lsl #482; CHECK-BE-NEXT:    add x8, x8, #183; CHECK-BE-NEXT:    cmp x8, #100084; CHECK-BE-NEXT:    tbl v1.16b, { v1.16b, v2.16b, v3.16b, v4.16b }, v0.16b85; CHECK-BE-NEXT:    st1 { v1.16b }, [x9]86; CHECK-BE-NEXT:    b.eq .LBB0_187; CHECK-BE-NEXT:  // %bb.2: // %exit88; CHECK-BE-NEXT:    ret89;90; CHECK-DISABLE-LABEL: trunc_v16i32_to_v16i8_in_loop:91; CHECK-DISABLE:       // %bb.0: // %entry92; CHECK-DISABLE-NEXT:    mov x8, xzr93; CHECK-DISABLE-NEXT:  .LBB0_1: // %loop94; CHECK-DISABLE-NEXT:    // =>This Inner Loop Header: Depth=195; CHECK-DISABLE-NEXT:    add x9, x0, x8, lsl #696; CHECK-DISABLE-NEXT:    ld1 { v0.4s }, [x9]97; CHECK-DISABLE-NEXT:    add x10, x9, #1698; CHECK-DISABLE-NEXT:    add x11, x9, #4899; CHECK-DISABLE-NEXT:    add x9, x9, #32100; CHECK-DISABLE-NEXT:    ld1 { v1.4s }, [x10]101; CHECK-DISABLE-NEXT:    ld1 { v2.4s }, [x11]102; CHECK-DISABLE-NEXT:    ld1 { v3.4s }, [x9]103; CHECK-DISABLE-NEXT:    add x9, x1, x8, lsl #4104; CHECK-DISABLE-NEXT:    add x8, x8, #1105; CHECK-DISABLE-NEXT:    cmp x8, #1000106; CHECK-DISABLE-NEXT:    uzp1 v0.8h, v0.8h, v1.8h107; CHECK-DISABLE-NEXT:    uzp1 v2.8h, v3.8h, v2.8h108; CHECK-DISABLE-NEXT:    uzp1 v0.16b, v0.16b, v2.16b109; CHECK-DISABLE-NEXT:    st1 { v0.16b }, [x9]110; CHECK-DISABLE-NEXT:    b.eq .LBB0_1111; CHECK-DISABLE-NEXT:  // %bb.2: // %exit112; CHECK-DISABLE-NEXT:    ret113entry:114  br label %loop115 116loop:117  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]118  %gep.A = getelementptr inbounds <16 x i32>, ptr %A, i64 %iv119  %l.A = load <16 x i32>, ptr %gep.A120  %trunc = trunc <16 x i32> %l.A to <16 x i8>121  %gep.dst = getelementptr inbounds <16 x i8>, ptr %dst, i64 %iv122  store <16 x i8> %trunc, ptr %gep.dst123  %iv.next = add i64 %iv, 1124  %ec = icmp eq i64 %iv.next, 1000125  br i1 %ec, label %loop, label %exit126 127exit:128  ret void129}130 131; Not profitable to use tbl, as materializing the masks requires more132; instructions.133define void @trunc_v16i32_to_v16i8_no_loop(ptr %A, ptr %dst) {134; CHECK-LABEL: trunc_v16i32_to_v16i8_no_loop:135; CHECK:       ; %bb.0: ; %entry136; CHECK-NEXT:    ldp q1, q0, [x0]137; CHECK-NEXT:    ldp q3, q2, [x0, #32]138; CHECK-NEXT:    uzp1.8h v0, v1, v0139; CHECK-NEXT:    uzp1.8h v2, v3, v2140; CHECK-NEXT:    uzp1.16b v0, v0, v2141; CHECK-NEXT:    str q0, [x1]142; CHECK-NEXT:    ret143;144; CHECK-BE-LABEL: trunc_v16i32_to_v16i8_no_loop:145; CHECK-BE:       // %bb.0: // %entry146; CHECK-BE-NEXT:    add x8, x0, #16147; CHECK-BE-NEXT:    add x9, x0, #48148; CHECK-BE-NEXT:    add x10, x0, #32149; CHECK-BE-NEXT:    ld1 { v0.4s }, [x0]150; CHECK-BE-NEXT:    ld1 { v1.4s }, [x8]151; CHECK-BE-NEXT:    ld1 { v2.4s }, [x9]152; CHECK-BE-NEXT:    ld1 { v3.4s }, [x10]153; CHECK-BE-NEXT:    uzp1 v0.8h, v0.8h, v1.8h154; CHECK-BE-NEXT:    uzp1 v2.8h, v3.8h, v2.8h155; CHECK-BE-NEXT:    uzp1 v0.16b, v0.16b, v2.16b156; CHECK-BE-NEXT:    st1 { v0.16b }, [x1]157; CHECK-BE-NEXT:    ret158;159; CHECK-DISABLE-LABEL: trunc_v16i32_to_v16i8_no_loop:160; CHECK-DISABLE:       // %bb.0: // %entry161; CHECK-DISABLE-NEXT:    add x8, x0, #16162; CHECK-DISABLE-NEXT:    add x9, x0, #48163; CHECK-DISABLE-NEXT:    add x10, x0, #32164; CHECK-DISABLE-NEXT:    ld1 { v0.4s }, [x0]165; CHECK-DISABLE-NEXT:    ld1 { v1.4s }, [x8]166; CHECK-DISABLE-NEXT:    ld1 { v2.4s }, [x9]167; CHECK-DISABLE-NEXT:    ld1 { v3.4s }, [x10]168; CHECK-DISABLE-NEXT:    uzp1 v0.8h, v0.8h, v1.8h169; CHECK-DISABLE-NEXT:    uzp1 v2.8h, v3.8h, v2.8h170; CHECK-DISABLE-NEXT:    uzp1 v0.16b, v0.16b, v2.16b171; CHECK-DISABLE-NEXT:    st1 { v0.16b }, [x1]172; CHECK-DISABLE-NEXT:    ret173entry:174  %l.A = load <16 x i32>, ptr %A175  %trunc = trunc <16 x i32> %l.A to <16 x i8>176  store <16 x i8> %trunc, ptr %dst177  ret void178}179 180 181; CHECK-LABEL: lCPI2_0:182; CHECK-NEXT:     .byte    0                               ; 0x0183; CHECK-NEXT:     .byte    4                               ; 0x4184; CHECK-NEXT:     .byte    8                               ; 0x8185; CHECK-NEXT:     .byte    12                              ; 0xc186; CHECK-NEXT:     .byte    16                              ; 0x10187; CHECK-NEXT:     .byte    20                              ; 0x14188; CHECK-NEXT:     .byte    24                              ; 0x18189; CHECK-NEXT:     .byte    28                              ; 0x1c190; CHECK-NEXT:     .byte    255                             ; 0xff191; CHECK-NEXT:     .byte    255                             ; 0xff192; CHECK-NEXT:     .byte    255                             ; 0xff193; CHECK-NEXT:     .byte    255                             ; 0xff194; CHECK-NEXT:     .byte    255                             ; 0xff195; CHECK-NEXT:     .byte    255                             ; 0xff196; CHECK-NEXT:     .byte    255                             ; 0xff197; CHECK-NEXT:     .byte    255                             ; 0xff198 199; CHECK-BE-LABEL: .LCPI2_0:200; CHECK-BE-NEXT:     .byte    3                               // 0x3201; CHECK-BE-NEXT:     .byte    7                               // 0x7202; CHECK-BE-NEXT:     .byte    11                              // 0xb203; CHECK-BE-NEXT:     .byte    15                              // 0xf204; CHECK-BE-NEXT:     .byte    19                              // 0x13205; CHECK-BE-NEXT:     .byte    23                              // 0x17206; CHECK-BE-NEXT:     .byte    27                              // 0x1b207; CHECK-BE-NEXT:     .byte    31                              // 0x1f208; CHECK-BE-NEXT:     .byte    255                             // 0xff209; CHECK-BE-NEXT:     .byte    255                             // 0xff210; CHECK-BE-NEXT:     .byte    255                             // 0xff211; CHECK-BE-NEXT:     .byte    255                             // 0xff212; CHECK-BE-NEXT:     .byte    255                             // 0xff213; CHECK-BE-NEXT:     .byte    255                             // 0xff214; CHECK-BE-NEXT:     .byte    255                             // 0xff215; CHECK-BE-NEXT:     .byte    255                             // 0xff216; It's profitable to use a single tbl.2 instruction to lower the truncate.217define void @trunc_v8i32_to_v8i8_in_loop(ptr %A, ptr %dst) {218; CHECK-LABEL: trunc_v8i32_to_v8i8_in_loop:219; CHECK:       ; %bb.0: ; %entry220; CHECK-NEXT:  Lloh2:221; CHECK-NEXT:    adrp x8, lCPI2_0@PAGE222; CHECK-NEXT:  Lloh3:223; CHECK-NEXT:    ldr q0, [x8, lCPI2_0@PAGEOFF]224; CHECK-NEXT:    mov x8, xzr225; CHECK-NEXT:  LBB2_1: ; %loop226; CHECK-NEXT:    ; =>This Inner Loop Header: Depth=1227; CHECK-NEXT:    add x9, x0, x8, lsl #5228; CHECK-NEXT:    ldp q1, q2, [x9]229; CHECK-NEXT:    tbl.16b v1, { v1, v2 }, v0230; CHECK-NEXT:    str d1, [x1, x8, lsl #3]231; CHECK-NEXT:    add x8, x8, #1232; CHECK-NEXT:    cmp x8, #1000233; CHECK-NEXT:    b.eq LBB2_1234; CHECK-NEXT:  ; %bb.2: ; %exit235; CHECK-NEXT:    ret236; CHECK-NEXT:    .loh AdrpLdr Lloh2, Lloh3237;238; CHECK-BE-LABEL: trunc_v8i32_to_v8i8_in_loop:239; CHECK-BE:       // %bb.0: // %entry240; CHECK-BE-NEXT:    adrp x8, .LCPI2_0241; CHECK-BE-NEXT:    add x8, x8, :lo12:.LCPI2_0242; CHECK-BE-NEXT:    ld1 { v0.16b }, [x8]243; CHECK-BE-NEXT:    mov x8, xzr244; CHECK-BE-NEXT:  .LBB2_1: // %loop245; CHECK-BE-NEXT:    // =>This Inner Loop Header: Depth=1246; CHECK-BE-NEXT:    add x9, x0, x8, lsl #5247; CHECK-BE-NEXT:    add x10, x9, #16248; CHECK-BE-NEXT:    ld1 { v1.16b }, [x9]249; CHECK-BE-NEXT:    add x9, x1, x8, lsl #3250; CHECK-BE-NEXT:    ld1 { v2.16b }, [x10]251; CHECK-BE-NEXT:    add x8, x8, #1252; CHECK-BE-NEXT:    cmp x8, #1000253; CHECK-BE-NEXT:    tbl v1.16b, { v1.16b, v2.16b }, v0.16b254; CHECK-BE-NEXT:    st1 { v1.8b }, [x9]255; CHECK-BE-NEXT:    b.eq .LBB2_1256; CHECK-BE-NEXT:  // %bb.2: // %exit257; CHECK-BE-NEXT:    ret258;259; CHECK-DISABLE-LABEL: trunc_v8i32_to_v8i8_in_loop:260; CHECK-DISABLE:       // %bb.0: // %entry261; CHECK-DISABLE-NEXT:    mov x8, xzr262; CHECK-DISABLE-NEXT:  .LBB2_1: // %loop263; CHECK-DISABLE-NEXT:    // =>This Inner Loop Header: Depth=1264; CHECK-DISABLE-NEXT:    add x9, x0, x8, lsl #5265; CHECK-DISABLE-NEXT:    add x10, x9, #16266; CHECK-DISABLE-NEXT:    ld1 { v0.4s }, [x9]267; CHECK-DISABLE-NEXT:    add x9, x1, x8, lsl #3268; CHECK-DISABLE-NEXT:    ld1 { v1.4s }, [x10]269; CHECK-DISABLE-NEXT:    add x8, x8, #1270; CHECK-DISABLE-NEXT:    cmp x8, #1000271; CHECK-DISABLE-NEXT:    uzp1 v0.8h, v0.8h, v1.8h272; CHECK-DISABLE-NEXT:    xtn v0.8b, v0.8h273; CHECK-DISABLE-NEXT:    st1 { v0.8b }, [x9]274; CHECK-DISABLE-NEXT:    b.eq .LBB2_1275; CHECK-DISABLE-NEXT:  // %bb.2: // %exit276; CHECK-DISABLE-NEXT:    ret277entry:278  br label %loop279 280loop:281  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]282  %gep.A = getelementptr inbounds <8 x i32>, ptr %A, i64 %iv283  %l.A = load <8 x i32>, ptr %gep.A284  %trunc = trunc <8 x i32> %l.A to <8 x i8>285  %gep.dst = getelementptr inbounds <8 x i8>, ptr %dst, i64 %iv286  store <8 x i8> %trunc, ptr %gep.dst287  %iv.next = add i64 %iv, 1288  %ec = icmp eq i64 %iv.next, 1000289  br i1 %ec, label %loop, label %exit290 291exit:292  ret void293}294 295; CHECK-LABEL:   lCPI3_0:296; CHECK-NEXT:   	.byte	0                               ; 0x0297; CHECK-NEXT:   	.byte	8                               ; 0x8298; CHECK-NEXT:   	.byte	16                              ; 0x10299; CHECK-NEXT:   	.byte	24                              ; 0x18300; CHECK-NEXT:   	.byte	32                              ; 0x20301; CHECK-NEXT:   	.byte	40                              ; 0x28302; CHECK-NEXT:   	.byte	48                              ; 0x30303; CHECK-NEXT:   	.byte	56                              ; 0x38304; CHECK-NEXT:   	.byte	64                              ; 0x40305; CHECK-NEXT:   	.byte	72                              ; 0x48306; CHECK-NEXT:   	.byte	80                              ; 0x50307; CHECK-NEXT:   	.byte	88                              ; 0x58308; CHECK-NEXT:   	.byte	96                              ; 0x60309; CHECK-NEXT:   	.byte	104                             ; 0x68310; CHECK-NEXT:   	.byte	112                             ; 0x70311; CHECK-NEXT:   	.byte	120                             ; 0x78312 313; CHECK-BE-LABEL:    .LCPI3_0:314; CHECK-BE-NEXT:    	.byte	7                               // 0x7315; CHECK-BE-NEXT:    	.byte	15                              // 0xf316; CHECK-BE-NEXT:    	.byte	23                              // 0x17317; CHECK-BE-NEXT:    	.byte	31                              // 0x1f318; CHECK-BE-NEXT:    	.byte	39                              // 0x27319; CHECK-BE-NEXT:    	.byte	47                              // 0x2f320; CHECK-BE-NEXT:    	.byte	55                              // 0x37321; CHECK-BE-NEXT:    	.byte	63                              // 0x3f322; CHECK-BE-NEXT:    	.byte	71                              // 0x47323; CHECK-BE-NEXT:    	.byte	79                              // 0x4f324; CHECK-BE-NEXT:    	.byte	87                              // 0x57325; CHECK-BE-NEXT:    	.byte	95                              // 0x5f326; CHECK-BE-NEXT:    	.byte	103                             // 0x67327; CHECK-BE-NEXT:    	.byte	111                             // 0x6f328; CHECK-BE-NEXT:    	.byte	119                             // 0x77329; CHECK-BE-NEXT:    	.byte	127                             // 0x7f330define void @trunc_v16i64_to_v16i8_in_loop(ptr %A, ptr %dst) {331; CHECK-LABEL: trunc_v16i64_to_v16i8_in_loop:332; CHECK:       ; %bb.0: ; %entry333; CHECK-NEXT:  Lloh4:334; CHECK-NEXT:    adrp x8, lCPI3_0@PAGE335; CHECK-NEXT:  Lloh5:336; CHECK-NEXT:    ldr q0, [x8, lCPI3_0@PAGEOFF]337; CHECK-NEXT:    mov x8, xzr338; CHECK-NEXT:  LBB3_1: ; %loop339; CHECK-NEXT:    ; =>This Inner Loop Header: Depth=1340; CHECK-NEXT:    add x9, x0, x8, lsl #7341; CHECK-NEXT:    ldp q1, q2, [x9]342; CHECK-NEXT:    ldp q16, q17, [x9, #64]343; CHECK-NEXT:    ldp q3, q4, [x9, #32]344; CHECK-NEXT:    ldp q18, q19, [x9, #96]345; CHECK-NEXT:    tbl.16b v1, { v1, v2, v3, v4 }, v0346; CHECK-NEXT:    tbl.16b v2, { v16, v17, v18, v19 }, v0347; CHECK-NEXT:    mov.d v1[1], v2[0]348; CHECK-NEXT:    str q1, [x1, x8, lsl #4]349; CHECK-NEXT:    add x8, x8, #1350; CHECK-NEXT:    cmp x8, #1000351; CHECK-NEXT:    b.eq LBB3_1352; CHECK-NEXT:  ; %bb.2: ; %exit353; CHECK-NEXT:    ret354; CHECK-NEXT:    .loh AdrpLdr Lloh4, Lloh5355;356; CHECK-BE-LABEL: trunc_v16i64_to_v16i8_in_loop:357; CHECK-BE:       // %bb.0: // %entry358; CHECK-BE-NEXT:    adrp x8, .LCPI3_0359; CHECK-BE-NEXT:    add x8, x8, :lo12:.LCPI3_0360; CHECK-BE-NEXT:    ld1 { v0.16b }, [x8]361; CHECK-BE-NEXT:    mov x8, xzr362; CHECK-BE-NEXT:  .LBB3_1: // %loop363; CHECK-BE-NEXT:    // =>This Inner Loop Header: Depth=1364; CHECK-BE-NEXT:    add x9, x0, x8, lsl #7365; CHECK-BE-NEXT:    add x13, x9, #64366; CHECK-BE-NEXT:    add x12, x9, #80367; CHECK-BE-NEXT:    add x14, x9, #16368; CHECK-BE-NEXT:    ld1 { v1.16b }, [x9]369; CHECK-BE-NEXT:    ld1 { v16.16b }, [x13]370; CHECK-BE-NEXT:    add x11, x9, #96371; CHECK-BE-NEXT:    add x13, x9, #32372; CHECK-BE-NEXT:    ld1 { v2.16b }, [x14]373; CHECK-BE-NEXT:    ld1 { v17.16b }, [x12]374; CHECK-BE-NEXT:    add x10, x9, #112375; CHECK-BE-NEXT:    add x9, x9, #48376; CHECK-BE-NEXT:    ld1 { v3.16b }, [x13]377; CHECK-BE-NEXT:    ld1 { v18.16b }, [x11]378; CHECK-BE-NEXT:    ld1 { v4.16b }, [x9]379; CHECK-BE-NEXT:    add x9, x1, x8, lsl #4380; CHECK-BE-NEXT:    ld1 { v19.16b }, [x10]381; CHECK-BE-NEXT:    add x8, x8, #1382; CHECK-BE-NEXT:    cmp x8, #1000383; CHECK-BE-NEXT:    tbl v1.16b, { v1.16b, v2.16b, v3.16b, v4.16b }, v0.16b384; CHECK-BE-NEXT:    tbl v2.16b, { v16.16b, v17.16b, v18.16b, v19.16b }, v0.16b385; CHECK-BE-NEXT:    mov v1.d[1], v2.d[0]386; CHECK-BE-NEXT:    st1 { v1.16b }, [x9]387; CHECK-BE-NEXT:    b.eq .LBB3_1388; CHECK-BE-NEXT:  // %bb.2: // %exit389; CHECK-BE-NEXT:    ret390;391; CHECK-DISABLE-LABEL: trunc_v16i64_to_v16i8_in_loop:392; CHECK-DISABLE:       // %bb.0: // %entry393; CHECK-DISABLE-NEXT:    mov x8, xzr394; CHECK-DISABLE-NEXT:  .LBB3_1: // %loop395; CHECK-DISABLE-NEXT:    // =>This Inner Loop Header: Depth=1396; CHECK-DISABLE-NEXT:    add x9, x0, x8, lsl #7397; CHECK-DISABLE-NEXT:    add x10, x9, #16398; CHECK-DISABLE-NEXT:    add x11, x9, #48399; CHECK-DISABLE-NEXT:    ld1 { v0.2d }, [x9]400; CHECK-DISABLE-NEXT:    ld1 { v1.2d }, [x10]401; CHECK-DISABLE-NEXT:    add x10, x9, #112402; CHECK-DISABLE-NEXT:    ld1 { v2.2d }, [x11]403; CHECK-DISABLE-NEXT:    ld1 { v3.2d }, [x10]404; CHECK-DISABLE-NEXT:    add x10, x9, #96405; CHECK-DISABLE-NEXT:    add x11, x9, #32406; CHECK-DISABLE-NEXT:    ld1 { v4.2d }, [x10]407; CHECK-DISABLE-NEXT:    add x10, x9, #80408; CHECK-DISABLE-NEXT:    add x9, x9, #64409; CHECK-DISABLE-NEXT:    ld1 { v5.2d }, [x11]410; CHECK-DISABLE-NEXT:    ld1 { v6.2d }, [x10]411; CHECK-DISABLE-NEXT:    ld1 { v7.2d }, [x9]412; CHECK-DISABLE-NEXT:    uzp1 v0.4s, v0.4s, v1.4s413; CHECK-DISABLE-NEXT:    add x9, x1, x8, lsl #4414; CHECK-DISABLE-NEXT:    add x8, x8, #1415; CHECK-DISABLE-NEXT:    uzp1 v3.4s, v4.4s, v3.4s416; CHECK-DISABLE-NEXT:    cmp x8, #1000417; CHECK-DISABLE-NEXT:    uzp1 v4.4s, v7.4s, v6.4s418; CHECK-DISABLE-NEXT:    uzp1 v2.4s, v5.4s, v2.4s419; CHECK-DISABLE-NEXT:    uzp1 v1.8h, v4.8h, v3.8h420; CHECK-DISABLE-NEXT:    uzp1 v0.8h, v0.8h, v2.8h421; CHECK-DISABLE-NEXT:    uzp1 v0.16b, v0.16b, v1.16b422; CHECK-DISABLE-NEXT:    st1 { v0.16b }, [x9]423; CHECK-DISABLE-NEXT:    b.eq .LBB3_1424; CHECK-DISABLE-NEXT:  // %bb.2: // %exit425; CHECK-DISABLE-NEXT:    ret426entry:427  br label %loop428 429loop:430  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]431  %gep.A = getelementptr inbounds <16 x i64>, ptr %A, i64 %iv432  %l.A = load <16 x i64>, ptr %gep.A433  %trunc = trunc <16 x i64> %l.A to <16 x i8>434  %gep.dst = getelementptr inbounds <16 x i8>, ptr %dst, i64 %iv435  store <16 x i8> %trunc, ptr %gep.dst436  %iv.next = add i64 %iv, 1437  %ec = icmp eq i64 %iv.next, 1000438  br i1 %ec, label %loop, label %exit439 440exit:441  ret void442}443 444; CHECK-LABEL: lCPI4_0:445; CHECK-NEXT: 	.byte	0                               ; 0x0446; CHECK-NEXT: 	.byte	8                               ; 0x8447; CHECK-NEXT: 	.byte	16                              ; 0x10448; CHECK-NEXT: 	.byte	24                              ; 0x18449; CHECK-NEXT: 	.byte	32                              ; 0x20450; CHECK-NEXT: 	.byte	40                              ; 0x28451; CHECK-NEXT: 	.byte	48                              ; 0x30452; CHECK-NEXT: 	.byte	56                              ; 0x38453; CHECK-NEXT: 	.byte	255                             ; 0xff454; CHECK-NEXT: 	.byte	255                             ; 0xff455; CHECK-NEXT: 	.byte	255                             ; 0xff456; CHECK-NEXT: 	.byte	255                             ; 0xff457; CHECK-NEXT: 	.byte	255                             ; 0xff458; CHECK-NEXT: 	.byte	255                             ; 0xff459; CHECK-NEXT: 	.byte	255                             ; 0xff460; CHECK-NEXT: 	.byte	255                             ; 0xff461 462; CHECK-BE-LABEL:   .LCPI4_0:463; CHECK-BE-NEXT:   	.byte	7                               // 0x7464; CHECK-BE-NEXT:   	.byte	15                              // 0xf465; CHECK-BE-NEXT:   	.byte	23                              // 0x17466; CHECK-BE-NEXT:   	.byte	31                              // 0x1f467; CHECK-BE-NEXT:   	.byte	39                              // 0x27468; CHECK-BE-NEXT:   	.byte	47                              // 0x2f469; CHECK-BE-NEXT:   	.byte	55                              // 0x37470; CHECK-BE-NEXT:   	.byte	63                              // 0x3f471; CHECK-BE-NEXT:   	.byte	255                             // 0xff472; CHECK-BE-NEXT:   	.byte	255                             // 0xff473; CHECK-BE-NEXT:   	.byte	255                             // 0xff474; CHECK-BE-NEXT:   	.byte	255                             // 0xff475; CHECK-BE-NEXT:   	.byte	255                             // 0xff476; CHECK-BE-NEXT:   	.byte	255                             // 0xff477; CHECK-BE-NEXT:   	.byte	255                             // 0xff478; CHECK-BE-NEXT:   	.byte	255                             // 0xff479define void @trunc_v8i64_to_v8i8_in_loop(ptr %A, ptr %dst) {480; CHECK-LABEL: trunc_v8i64_to_v8i8_in_loop:481; CHECK:       ; %bb.0: ; %entry482; CHECK-NEXT:  Lloh6:483; CHECK-NEXT:    adrp x8, lCPI4_0@PAGE484; CHECK-NEXT:  Lloh7:485; CHECK-NEXT:    ldr q0, [x8, lCPI4_0@PAGEOFF]486; CHECK-NEXT:    mov x8, xzr487; CHECK-NEXT:  LBB4_1: ; %loop488; CHECK-NEXT:    ; =>This Inner Loop Header: Depth=1489; CHECK-NEXT:    add x9, x0, x8, lsl #6490; CHECK-NEXT:    ldp q1, q2, [x9]491; CHECK-NEXT:    ldp q3, q4, [x9, #32]492; CHECK-NEXT:    tbl.16b v1, { v1, v2, v3, v4 }, v0493; CHECK-NEXT:    str d1, [x1, x8, lsl #3]494; CHECK-NEXT:    add x8, x8, #1495; CHECK-NEXT:    cmp x8, #1000496; CHECK-NEXT:    b.eq LBB4_1497; CHECK-NEXT:  ; %bb.2: ; %exit498; CHECK-NEXT:    ret499; CHECK-NEXT:    .loh AdrpLdr Lloh6, Lloh7500;501; CHECK-BE-LABEL: trunc_v8i64_to_v8i8_in_loop:502; CHECK-BE:       // %bb.0: // %entry503; CHECK-BE-NEXT:    adrp x8, .LCPI4_0504; CHECK-BE-NEXT:    add x8, x8, :lo12:.LCPI4_0505; CHECK-BE-NEXT:    ld1 { v0.16b }, [x8]506; CHECK-BE-NEXT:    mov x8, xzr507; CHECK-BE-NEXT:  .LBB4_1: // %loop508; CHECK-BE-NEXT:    // =>This Inner Loop Header: Depth=1509; CHECK-BE-NEXT:    add x9, x0, x8, lsl #6510; CHECK-BE-NEXT:    add x10, x9, #16511; CHECK-BE-NEXT:    ld1 { v1.16b }, [x9]512; CHECK-BE-NEXT:    add x11, x9, #32513; CHECK-BE-NEXT:    ld1 { v2.16b }, [x10]514; CHECK-BE-NEXT:    add x9, x9, #48515; CHECK-BE-NEXT:    ld1 { v3.16b }, [x11]516; CHECK-BE-NEXT:    ld1 { v4.16b }, [x9]517; CHECK-BE-NEXT:    add x9, x1, x8, lsl #3518; CHECK-BE-NEXT:    add x8, x8, #1519; CHECK-BE-NEXT:    cmp x8, #1000520; CHECK-BE-NEXT:    tbl v1.16b, { v1.16b, v2.16b, v3.16b, v4.16b }, v0.16b521; CHECK-BE-NEXT:    st1 { v1.8b }, [x9]522; CHECK-BE-NEXT:    b.eq .LBB4_1523; CHECK-BE-NEXT:  // %bb.2: // %exit524; CHECK-BE-NEXT:    ret525;526; CHECK-DISABLE-LABEL: trunc_v8i64_to_v8i8_in_loop:527; CHECK-DISABLE:       // %bb.0: // %entry528; CHECK-DISABLE-NEXT:    mov x8, xzr529; CHECK-DISABLE-NEXT:  .LBB4_1: // %loop530; CHECK-DISABLE-NEXT:    // =>This Inner Loop Header: Depth=1531; CHECK-DISABLE-NEXT:    add x9, x0, x8, lsl #6532; CHECK-DISABLE-NEXT:    ld1 { v0.2d }, [x9]533; CHECK-DISABLE-NEXT:    add x10, x9, #16534; CHECK-DISABLE-NEXT:    add x11, x9, #48535; CHECK-DISABLE-NEXT:    add x9, x9, #32536; CHECK-DISABLE-NEXT:    ld1 { v1.2d }, [x10]537; CHECK-DISABLE-NEXT:    ld1 { v2.2d }, [x11]538; CHECK-DISABLE-NEXT:    ld1 { v3.2d }, [x9]539; CHECK-DISABLE-NEXT:    add x9, x1, x8, lsl #3540; CHECK-DISABLE-NEXT:    add x8, x8, #1541; CHECK-DISABLE-NEXT:    cmp x8, #1000542; CHECK-DISABLE-NEXT:    uzp1 v0.4s, v0.4s, v1.4s543; CHECK-DISABLE-NEXT:    uzp1 v2.4s, v3.4s, v2.4s544; CHECK-DISABLE-NEXT:    uzp1 v0.8h, v0.8h, v2.8h545; CHECK-DISABLE-NEXT:    xtn v0.8b, v0.8h546; CHECK-DISABLE-NEXT:    st1 { v0.8b }, [x9]547; CHECK-DISABLE-NEXT:    b.eq .LBB4_1548; CHECK-DISABLE-NEXT:  // %bb.2: // %exit549; CHECK-DISABLE-NEXT:    ret550entry:551  br label %loop552 553loop:554  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]555  %gep.A = getelementptr inbounds <8 x i64>, ptr %A, i64 %iv556  %l.A = load <8 x i64>, ptr %gep.A557  %trunc = trunc <8 x i64> %l.A to <8 x i8>558  %gep.dst = getelementptr inbounds <8 x i8>, ptr %dst, i64 %iv559  store <8 x i8> %trunc, ptr %gep.dst560  %iv.next = add i64 %iv, 1561  %ec = icmp eq i64 %iv.next, 1000562  br i1 %ec, label %loop, label %exit563 564exit:565  ret void566}567 568define void @trunc_v8i19_to_v8i8_in_loop(ptr %A, ptr %dst) {569; CHECK-LABEL: trunc_v8i19_to_v8i8_in_loop:570; CHECK:       ; %bb.0: ; %entry571; CHECK-NEXT:    mov x8, xzr572; CHECK-NEXT:  LBB5_1: ; %loop573; CHECK-NEXT:    ; =>This Inner Loop Header: Depth=1574; CHECK-NEXT:    ldp x9, x10, [x0]575; CHECK-NEXT:    ldrb w14, [x0, #18]576; CHECK-NEXT:    ldrh w15, [x0, #16]577; CHECK-NEXT:    add x0, x0, #32578; CHECK-NEXT:    lsr w12, w10, #12579; CHECK-NEXT:    fmov s1, w9580; CHECK-NEXT:    lsr x11, x9, #19581; CHECK-NEXT:    lsr x13, x10, #31582; CHECK-NEXT:    fmov s0, w12583; CHECK-NEXT:    lsr x12, x9, #38584; CHECK-NEXT:    extr x9, x10, x9, #57585; CHECK-NEXT:    mov.s v1[1], w11586; CHECK-NEXT:    orr x11, x15, x14, lsl #16587; CHECK-NEXT:    mov.s v0[1], w13588; CHECK-NEXT:    extr x13, x11, x10, #50589; CHECK-NEXT:    lsr w10, w11, #5590; CHECK-NEXT:    mov.s v1[2], w12591; CHECK-NEXT:    mov.s v0[2], w13592; CHECK-NEXT:    mov.s v1[3], w9593; CHECK-NEXT:    mov.s v0[3], w10594; CHECK-NEXT:    uzp1.8h v0, v1, v0595; CHECK-NEXT:    xtn.8b v0, v0596; CHECK-NEXT:    str d0, [x1, x8, lsl #3]597; CHECK-NEXT:    add x8, x8, #1598; CHECK-NEXT:    cmp x8, #1000599; CHECK-NEXT:    b.eq LBB5_1600; CHECK-NEXT:  ; %bb.2: ; %exit601; CHECK-NEXT:    ret602;603; CHECK-BE-LABEL: trunc_v8i19_to_v8i8_in_loop:604; CHECK-BE:       // %bb.0: // %entry605; CHECK-BE-NEXT:    mov x8, xzr606; CHECK-BE-NEXT:  .LBB5_1: // %loop607; CHECK-BE-NEXT:    // =>This Inner Loop Header: Depth=1608; CHECK-BE-NEXT:    ldp x10, x9, [x0]609; CHECK-BE-NEXT:    ldrh w16, [x0, #16]610; CHECK-BE-NEXT:    ldrb w17, [x0, #18]611; CHECK-BE-NEXT:    add x0, x0, #32612; CHECK-BE-NEXT:    lsl x11, x9, #24613; CHECK-BE-NEXT:    lsr x12, x9, #40614; CHECK-BE-NEXT:    lsr x13, x10, #45615; CHECK-BE-NEXT:    lsl x14, x10, #24616; CHECK-BE-NEXT:    lsr x15, x10, #40617; CHECK-BE-NEXT:    extr x12, x12, x11, #57618; CHECK-BE-NEXT:    fmov s0, w13619; CHECK-BE-NEXT:    lsr w13, w10, #7620; CHECK-BE-NEXT:    extr x14, x15, x14, #50621; CHECK-BE-NEXT:    lsr w15, w9, #14622; CHECK-BE-NEXT:    extr x9, x10, x9, #40623; CHECK-BE-NEXT:    fmov s1, w12624; CHECK-BE-NEXT:    orr w12, w17, w16, lsl #8625; CHECK-BE-NEXT:    mov v0.s[1], w14626; CHECK-BE-NEXT:    lsr w9, w9, #12627; CHECK-BE-NEXT:    orr w11, w12, w11628; CHECK-BE-NEXT:    mov v1.s[1], w15629; CHECK-BE-NEXT:    lsr w11, w11, #19630; CHECK-BE-NEXT:    mov v0.s[2], w13631; CHECK-BE-NEXT:    mov v1.s[2], w11632; CHECK-BE-NEXT:    mov v0.s[3], w9633; CHECK-BE-NEXT:    add x9, x1, x8, lsl #3634; CHECK-BE-NEXT:    add x8, x8, #1635; CHECK-BE-NEXT:    cmp x8, #1000636; CHECK-BE-NEXT:    mov v1.s[3], w12637; CHECK-BE-NEXT:    uzp1 v0.8h, v0.8h, v1.8h638; CHECK-BE-NEXT:    xtn v0.8b, v0.8h639; CHECK-BE-NEXT:    st1 { v0.8b }, [x9]640; CHECK-BE-NEXT:    b.eq .LBB5_1641; CHECK-BE-NEXT:  // %bb.2: // %exit642; CHECK-BE-NEXT:    ret643;644; CHECK-DISABLE-LABEL: trunc_v8i19_to_v8i8_in_loop:645; CHECK-DISABLE:       // %bb.0: // %entry646; CHECK-DISABLE-NEXT:    mov x8, xzr647; CHECK-DISABLE-NEXT:  .LBB5_1: // %loop648; CHECK-DISABLE-NEXT:    // =>This Inner Loop Header: Depth=1649; CHECK-DISABLE-NEXT:    ldp x10, x9, [x0]650; CHECK-DISABLE-NEXT:    ldrh w16, [x0, #16]651; CHECK-DISABLE-NEXT:    ldrb w17, [x0, #18]652; CHECK-DISABLE-NEXT:    add x0, x0, #32653; CHECK-DISABLE-NEXT:    lsl x11, x9, #24654; CHECK-DISABLE-NEXT:    lsr x12, x9, #40655; CHECK-DISABLE-NEXT:    lsr x13, x10, #45656; CHECK-DISABLE-NEXT:    lsl x14, x10, #24657; CHECK-DISABLE-NEXT:    lsr x15, x10, #40658; CHECK-DISABLE-NEXT:    extr x12, x12, x11, #57659; CHECK-DISABLE-NEXT:    fmov s0, w13660; CHECK-DISABLE-NEXT:    lsr w13, w10, #7661; CHECK-DISABLE-NEXT:    extr x14, x15, x14, #50662; CHECK-DISABLE-NEXT:    lsr w15, w9, #14663; CHECK-DISABLE-NEXT:    extr x9, x10, x9, #40664; CHECK-DISABLE-NEXT:    fmov s1, w12665; CHECK-DISABLE-NEXT:    orr w12, w17, w16, lsl #8666; CHECK-DISABLE-NEXT:    mov v0.s[1], w14667; CHECK-DISABLE-NEXT:    lsr w9, w9, #12668; CHECK-DISABLE-NEXT:    orr w11, w12, w11669; CHECK-DISABLE-NEXT:    mov v1.s[1], w15670; CHECK-DISABLE-NEXT:    lsr w11, w11, #19671; CHECK-DISABLE-NEXT:    mov v0.s[2], w13672; CHECK-DISABLE-NEXT:    mov v1.s[2], w11673; CHECK-DISABLE-NEXT:    mov v0.s[3], w9674; CHECK-DISABLE-NEXT:    add x9, x1, x8, lsl #3675; CHECK-DISABLE-NEXT:    add x8, x8, #1676; CHECK-DISABLE-NEXT:    cmp x8, #1000677; CHECK-DISABLE-NEXT:    mov v1.s[3], w12678; CHECK-DISABLE-NEXT:    uzp1 v0.8h, v0.8h, v1.8h679; CHECK-DISABLE-NEXT:    xtn v0.8b, v0.8h680; CHECK-DISABLE-NEXT:    st1 { v0.8b }, [x9]681; CHECK-DISABLE-NEXT:    b.eq .LBB5_1682; CHECK-DISABLE-NEXT:  // %bb.2: // %exit683; CHECK-DISABLE-NEXT:    ret684entry:685  br label %loop686 687loop:688  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]689  %gep.A = getelementptr inbounds <8 x i19>, ptr %A, i64 %iv690  %l.A = load <8 x i19>, ptr %gep.A691  %trunc = trunc <8 x i19> %l.A to <8 x i8>692  %gep.dst = getelementptr inbounds <8 x i8>, ptr %dst, i64 %iv693  store <8 x i8> %trunc, ptr %gep.dst694  %iv.next = add i64 %iv, 1695  %ec = icmp eq i64 %iv.next, 1000696  br i1 %ec, label %loop, label %exit697 698exit:699  ret void700}701 702define void @trunc_v11i64_to_v11i8_in_loop(ptr %A, ptr %dst) {703; CHECK-LABEL: trunc_v11i64_to_v11i8_in_loop:704; CHECK:       ; %bb.0: ; %entry705; CHECK-NEXT:    mov w8, #1000 ; =0x3e8706; CHECK-NEXT:  LBB6_1: ; %loop707; CHECK-NEXT:    ; =>This Inner Loop Header: Depth=1708; CHECK-NEXT:    ldp q4, q0, [x0, #48]709; CHECK-NEXT:    subs x8, x8, #1710; CHECK-NEXT:    ldp q3, q2, [x0]711; CHECK-NEXT:    ldr d1, [x0, #80]712; CHECK-NEXT:    ldr q5, [x0, #32]713; CHECK-NEXT:    add x0, x0, #128714; CHECK-NEXT:    uzp1.4s v0, v0, v1715; CHECK-NEXT:    uzp1.4s v1, v5, v4716; CHECK-NEXT:    uzp1.4s v2, v3, v2717; CHECK-NEXT:    xtn.4h v0, v0718; CHECK-NEXT:    uzp1.8h v1, v2, v1719; CHECK-NEXT:    uzp1.8b v2, v0, v0720; CHECK-NEXT:    uzp1.16b v0, v1, v0721; CHECK-NEXT:    mov b1, v2[2]722; CHECK-NEXT:    mov h2, v0[4]723; CHECK-NEXT:    str d0, [x1]724; CHECK-NEXT:    stur b1, [x1, #10]725; CHECK-NEXT:    str h2, [x1, #8]726; CHECK-NEXT:    add x1, x1, #16727; CHECK-NEXT:    b.eq LBB6_1728; CHECK-NEXT:  ; %bb.2: ; %exit729; CHECK-NEXT:    ret730;731; CHECK-BE-LABEL: trunc_v11i64_to_v11i8_in_loop:732; CHECK-BE:       // %bb.0: // %entry733; CHECK-BE-NEXT:    mov w8, #1000 // =0x3e8734; CHECK-BE-NEXT:  .LBB6_1: // %loop735; CHECK-BE-NEXT:    // =>This Inner Loop Header: Depth=1736; CHECK-BE-NEXT:    add x9, x0, #64737; CHECK-BE-NEXT:    add x10, x0, #16738; CHECK-BE-NEXT:    ld1 { v3.2d }, [x0]739; CHECK-BE-NEXT:    ld1 { v0.2d }, [x9]740; CHECK-BE-NEXT:    add x9, x0, #48741; CHECK-BE-NEXT:    ld1 { v1.2d }, [x10]742; CHECK-BE-NEXT:    add x10, x0, #32743; CHECK-BE-NEXT:    ld1 { v2.2d }, [x9]744; CHECK-BE-NEXT:    ldr d5, [x0, #80]745; CHECK-BE-NEXT:    ld1 { v4.2d }, [x10]746; CHECK-BE-NEXT:    subs x8, x8, #1747; CHECK-BE-NEXT:    add x0, x0, #128748; CHECK-BE-NEXT:    uzp1 v1.4s, v3.4s, v1.4s749; CHECK-BE-NEXT:    uzp1 v0.4s, v0.4s, v5.4s750; CHECK-BE-NEXT:    uzp1 v2.4s, v4.4s, v2.4s751; CHECK-BE-NEXT:    xtn v0.4h, v0.4s752; CHECK-BE-NEXT:    uzp1 v1.8h, v1.8h, v2.8h753; CHECK-BE-NEXT:    uzp1 v1.16b, v1.16b, v0.16b754; CHECK-BE-NEXT:    uzp1 v0.8b, v0.8b, v0.8b755; CHECK-BE-NEXT:    rev16 v2.16b, v1.16b756; CHECK-BE-NEXT:    rev64 v1.16b, v1.16b757; CHECK-BE-NEXT:    mov b0, v0.b[2]758; CHECK-BE-NEXT:    mov h2, v2.h[4]759; CHECK-BE-NEXT:    str d1, [x1]760; CHECK-BE-NEXT:    stur b0, [x1, #10]761; CHECK-BE-NEXT:    str h2, [x1, #8]762; CHECK-BE-NEXT:    add x1, x1, #16763; CHECK-BE-NEXT:    b.eq .LBB6_1764; CHECK-BE-NEXT:  // %bb.2: // %exit765; CHECK-BE-NEXT:    ret766;767; CHECK-DISABLE-LABEL: trunc_v11i64_to_v11i8_in_loop:768; CHECK-DISABLE:       // %bb.0: // %entry769; CHECK-DISABLE-NEXT:    mov w8, #1000 // =0x3e8770; CHECK-DISABLE-NEXT:  .LBB6_1: // %loop771; CHECK-DISABLE-NEXT:    // =>This Inner Loop Header: Depth=1772; CHECK-DISABLE-NEXT:    add x9, x0, #64773; CHECK-DISABLE-NEXT:    add x10, x0, #16774; CHECK-DISABLE-NEXT:    ld1 { v3.2d }, [x0]775; CHECK-DISABLE-NEXT:    ld1 { v0.2d }, [x9]776; CHECK-DISABLE-NEXT:    add x9, x0, #48777; CHECK-DISABLE-NEXT:    ld1 { v1.2d }, [x10]778; CHECK-DISABLE-NEXT:    add x10, x0, #32779; CHECK-DISABLE-NEXT:    ld1 { v2.2d }, [x9]780; CHECK-DISABLE-NEXT:    ldr d5, [x0, #80]781; CHECK-DISABLE-NEXT:    ld1 { v4.2d }, [x10]782; CHECK-DISABLE-NEXT:    subs x8, x8, #1783; CHECK-DISABLE-NEXT:    add x0, x0, #128784; CHECK-DISABLE-NEXT:    uzp1 v1.4s, v3.4s, v1.4s785; CHECK-DISABLE-NEXT:    uzp1 v0.4s, v0.4s, v5.4s786; CHECK-DISABLE-NEXT:    uzp1 v2.4s, v4.4s, v2.4s787; CHECK-DISABLE-NEXT:    xtn v0.4h, v0.4s788; CHECK-DISABLE-NEXT:    uzp1 v1.8h, v1.8h, v2.8h789; CHECK-DISABLE-NEXT:    uzp1 v1.16b, v1.16b, v0.16b790; CHECK-DISABLE-NEXT:    uzp1 v0.8b, v0.8b, v0.8b791; CHECK-DISABLE-NEXT:    rev16 v2.16b, v1.16b792; CHECK-DISABLE-NEXT:    rev64 v1.16b, v1.16b793; CHECK-DISABLE-NEXT:    mov b0, v0.b[2]794; CHECK-DISABLE-NEXT:    mov h2, v2.h[4]795; CHECK-DISABLE-NEXT:    str d1, [x1]796; CHECK-DISABLE-NEXT:    stur b0, [x1, #10]797; CHECK-DISABLE-NEXT:    str h2, [x1, #8]798; CHECK-DISABLE-NEXT:    add x1, x1, #16799; CHECK-DISABLE-NEXT:    b.eq .LBB6_1800; CHECK-DISABLE-NEXT:  // %bb.2: // %exit801; CHECK-DISABLE-NEXT:    ret802entry:803  br label %loop804 805loop:806  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]807  %gep.A = getelementptr inbounds <11 x i64>, ptr %A, i64 %iv808  %l.A = load <11 x i64>, ptr %gep.A809  %trunc = trunc <11 x i64> %l.A to <11 x i8>810  %gep.dst = getelementptr inbounds <11 x i8>, ptr %dst, i64 %iv811  store <11 x i8> %trunc, ptr %gep.dst812  %iv.next = add i64 %iv, 1813  %ec = icmp eq i64 %iv.next, 1000814  br i1 %ec, label %loop, label %exit815 816exit:817  ret void818}819 820define void @trunc_v16i16_to_v16i8_in_loop(ptr %A, ptr %dst) {821; CHECK-LABEL: trunc_v16i16_to_v16i8_in_loop:822; CHECK:       ; %bb.0: ; %entry823; CHECK-NEXT:    mov x8, xzr824; CHECK-NEXT:  LBB7_1: ; %loop825; CHECK-NEXT:    ; =>This Inner Loop Header: Depth=1826; CHECK-NEXT:    add x9, x0, x8, lsl #5827; CHECK-NEXT:    ldp q1, q0, [x9]828; CHECK-NEXT:    uzp1.16b v0, v1, v0829; CHECK-NEXT:    str q0, [x1, x8, lsl #4]830; CHECK-NEXT:    add x8, x8, #1831; CHECK-NEXT:    cmp x8, #1000832; CHECK-NEXT:    b.eq LBB7_1833; CHECK-NEXT:  ; %bb.2: ; %exit834; CHECK-NEXT:    ret835;836; CHECK-BE-LABEL: trunc_v16i16_to_v16i8_in_loop:837; CHECK-BE:       // %bb.0: // %entry838; CHECK-BE-NEXT:    mov x8, xzr839; CHECK-BE-NEXT:  .LBB7_1: // %loop840; CHECK-BE-NEXT:    // =>This Inner Loop Header: Depth=1841; CHECK-BE-NEXT:    add x9, x0, x8, lsl #5842; CHECK-BE-NEXT:    add x10, x9, #16843; CHECK-BE-NEXT:    ld1 { v0.8h }, [x9]844; CHECK-BE-NEXT:    add x9, x1, x8, lsl #4845; CHECK-BE-NEXT:    ld1 { v1.8h }, [x10]846; CHECK-BE-NEXT:    add x8, x8, #1847; CHECK-BE-NEXT:    cmp x8, #1000848; CHECK-BE-NEXT:    uzp1 v0.16b, v0.16b, v1.16b849; CHECK-BE-NEXT:    st1 { v0.16b }, [x9]850; CHECK-BE-NEXT:    b.eq .LBB7_1851; CHECK-BE-NEXT:  // %bb.2: // %exit852; CHECK-BE-NEXT:    ret853;854; CHECK-DISABLE-LABEL: trunc_v16i16_to_v16i8_in_loop:855; CHECK-DISABLE:       // %bb.0: // %entry856; CHECK-DISABLE-NEXT:    mov x8, xzr857; CHECK-DISABLE-NEXT:  .LBB7_1: // %loop858; CHECK-DISABLE-NEXT:    // =>This Inner Loop Header: Depth=1859; CHECK-DISABLE-NEXT:    add x9, x0, x8, lsl #5860; CHECK-DISABLE-NEXT:    add x10, x9, #16861; CHECK-DISABLE-NEXT:    ld1 { v0.8h }, [x9]862; CHECK-DISABLE-NEXT:    add x9, x1, x8, lsl #4863; CHECK-DISABLE-NEXT:    ld1 { v1.8h }, [x10]864; CHECK-DISABLE-NEXT:    add x8, x8, #1865; CHECK-DISABLE-NEXT:    cmp x8, #1000866; CHECK-DISABLE-NEXT:    uzp1 v0.16b, v0.16b, v1.16b867; CHECK-DISABLE-NEXT:    st1 { v0.16b }, [x9]868; CHECK-DISABLE-NEXT:    b.eq .LBB7_1869; CHECK-DISABLE-NEXT:  // %bb.2: // %exit870; CHECK-DISABLE-NEXT:    ret871entry:872  br label %loop873 874loop:875  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]876  %gep.A = getelementptr inbounds <16 x i16>, ptr %A, i64 %iv877  %l.A = load <16 x i16>, ptr %gep.A878  %trunc = trunc <16 x i16> %l.A to <16 x i8>879  %gep.dst = getelementptr inbounds <16 x i8>, ptr %dst, i64 %iv880  store <16 x i8> %trunc, ptr %gep.dst881  %iv.next = add i64 %iv, 1882  %ec = icmp eq i64 %iv.next, 1000883  br i1 %ec, label %loop, label %exit884 885exit:886  ret void887}888 889define void @trunc_v8i16_to_v8i8_in_loop(ptr %A, ptr %dst) {890; CHECK-LABEL: trunc_v8i16_to_v8i8_in_loop:891; CHECK:       ; %bb.0: ; %entry892; CHECK-NEXT:    mov x8, xzr893; CHECK-NEXT:  LBB8_1: ; %loop894; CHECK-NEXT:    ; =>This Inner Loop Header: Depth=1895; CHECK-NEXT:    ldr q0, [x0, x8, lsl #4]896; CHECK-NEXT:    xtn.8b v0, v0897; CHECK-NEXT:    str d0, [x1, x8, lsl #3]898; CHECK-NEXT:    add x8, x8, #1899; CHECK-NEXT:    cmp x8, #1000900; CHECK-NEXT:    b.eq LBB8_1901; CHECK-NEXT:  ; %bb.2: ; %exit902; CHECK-NEXT:    ret903;904; CHECK-BE-LABEL: trunc_v8i16_to_v8i8_in_loop:905; CHECK-BE:       // %bb.0: // %entry906; CHECK-BE-NEXT:    mov x8, xzr907; CHECK-BE-NEXT:  .LBB8_1: // %loop908; CHECK-BE-NEXT:    // =>This Inner Loop Header: Depth=1909; CHECK-BE-NEXT:    add x9, x0, x8, lsl #4910; CHECK-BE-NEXT:    ld1 { v0.8h }, [x9]911; CHECK-BE-NEXT:    add x9, x1, x8, lsl #3912; CHECK-BE-NEXT:    add x8, x8, #1913; CHECK-BE-NEXT:    cmp x8, #1000914; CHECK-BE-NEXT:    xtn v0.8b, v0.8h915; CHECK-BE-NEXT:    st1 { v0.8b }, [x9]916; CHECK-BE-NEXT:    b.eq .LBB8_1917; CHECK-BE-NEXT:  // %bb.2: // %exit918; CHECK-BE-NEXT:    ret919;920; CHECK-DISABLE-LABEL: trunc_v8i16_to_v8i8_in_loop:921; CHECK-DISABLE:       // %bb.0: // %entry922; CHECK-DISABLE-NEXT:    mov x8, xzr923; CHECK-DISABLE-NEXT:  .LBB8_1: // %loop924; CHECK-DISABLE-NEXT:    // =>This Inner Loop Header: Depth=1925; CHECK-DISABLE-NEXT:    add x9, x0, x8, lsl #4926; CHECK-DISABLE-NEXT:    ld1 { v0.8h }, [x9]927; CHECK-DISABLE-NEXT:    add x9, x1, x8, lsl #3928; CHECK-DISABLE-NEXT:    add x8, x8, #1929; CHECK-DISABLE-NEXT:    cmp x8, #1000930; CHECK-DISABLE-NEXT:    xtn v0.8b, v0.8h931; CHECK-DISABLE-NEXT:    st1 { v0.8b }, [x9]932; CHECK-DISABLE-NEXT:    b.eq .LBB8_1933; CHECK-DISABLE-NEXT:  // %bb.2: // %exit934; CHECK-DISABLE-NEXT:    ret935entry:936  br label %loop937 938loop:939  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]940  %gep.A = getelementptr inbounds <8 x i16>, ptr %A, i64 %iv941  %l.A = load <8 x i16>, ptr %gep.A942  %trunc = trunc <8 x i16> %l.A to <8 x i8>943  %gep.dst = getelementptr inbounds <8 x i8>, ptr %dst, i64 %iv944  store <8 x i8> %trunc, ptr %gep.dst945  %iv.next = add i64 %iv, 1946  %ec = icmp eq i64 %iv.next, 1000947  br i1 %ec, label %loop, label %exit948 949exit:950  ret void951}952 953