1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mattr=+sve -force-streaming-compatible < %s | FileCheck %s --check-prefixes=CHECK,SVE 3; RUN: llc -mattr=+sve2 -force-streaming-compatible < %s | FileCheck %s --check-prefixes=CHECK,SVE2 4; RUN: llc -mattr=+sme -force-streaming < %s | FileCheck %s --check-prefixes=CHECK,SVE2 5; RUN: llc -force-streaming-compatible < %s | FileCheck %s --check-prefix=NONEON-NOSVE 6 7target triple = "aarch64-unknown-linux-gnu" 8 9; 10; sext i1 -> i32 11; 12 13; NOTE: Covers the scenario where a SIGN_EXTEND_INREG is required, whose inreg 14; type's element type is not byte based and thus cannot be lowered directly to 15; an SVE instruction. 16define void @sext_v8i1_v8i32(<8 x i1> %a, ptr %out) { 17; CHECK-LABEL: sext_v8i1_v8i32: 18; CHECK: // %bb.0: 19; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 20; CHECK-NEXT: uunpklo z0.h, z0.b 21; CHECK-NEXT: uunpklo z1.s, z0.h 22; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 23; CHECK-NEXT: uunpklo z0.s, z0.h 24; CHECK-NEXT: lsl z1.s, z1.s, #31 25; CHECK-NEXT: lsl z0.s, z0.s, #31 26; CHECK-NEXT: asr z1.s, z1.s, #31 27; CHECK-NEXT: asr z0.s, z0.s, #31 28; CHECK-NEXT: stp q1, q0, [x0] 29; CHECK-NEXT: ret 30; 31; NONEON-NOSVE-LABEL: sext_v8i1_v8i32: 32; NONEON-NOSVE: // %bb.0: 33; NONEON-NOSVE-NEXT: sub sp, sp, #80 34; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 80 35; NONEON-NOSVE-NEXT: str d0, [sp, #8] 36; NONEON-NOSVE-NEXT: ldrb w8, [sp, #15] 37; NONEON-NOSVE-NEXT: strh w8, [sp, #22] 38; NONEON-NOSVE-NEXT: ldrb w8, [sp, #14] 39; NONEON-NOSVE-NEXT: strh w8, [sp, #20] 40; NONEON-NOSVE-NEXT: ldrb w8, [sp, #13] 41; NONEON-NOSVE-NEXT: strh w8, [sp, #18] 42; NONEON-NOSVE-NEXT: ldrb w8, [sp, #12] 43; NONEON-NOSVE-NEXT: strh w8, [sp, #16] 44; NONEON-NOSVE-NEXT: ldrb w8, [sp, #11] 45; NONEON-NOSVE-NEXT: strh w8, [sp, #30] 46; NONEON-NOSVE-NEXT: ldrb w8, [sp, #10] 47; NONEON-NOSVE-NEXT: strh w8, [sp, #28] 48; NONEON-NOSVE-NEXT: ldrb w8, [sp, #9] 49; NONEON-NOSVE-NEXT: strh w8, [sp, #26] 50; NONEON-NOSVE-NEXT: ldrb w8, [sp, #8] 51; NONEON-NOSVE-NEXT: strh w8, [sp, #24] 52; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #16] 53; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #32] 54; NONEON-NOSVE-NEXT: ldrh w8, [sp, #46] 55; NONEON-NOSVE-NEXT: ldrh w10, [sp, #44] 56; NONEON-NOSVE-NEXT: ldrh w12, [sp, #42] 57; NONEON-NOSVE-NEXT: ldrh w14, [sp, #40] 58; NONEON-NOSVE-NEXT: ldrh w9, [sp, #32] 59; NONEON-NOSVE-NEXT: ldrh w11, [sp, #34] 60; NONEON-NOSVE-NEXT: sbfx w8, w8, #0, #1 61; NONEON-NOSVE-NEXT: sbfx w10, w10, #0, #1 62; NONEON-NOSVE-NEXT: ldrh w13, [sp, #36] 63; NONEON-NOSVE-NEXT: ldrh w15, [sp, #38] 64; NONEON-NOSVE-NEXT: sbfx w12, w12, #0, #1 65; NONEON-NOSVE-NEXT: sbfx w9, w9, #0, #1 66; NONEON-NOSVE-NEXT: stp w10, w8, [sp, #72] 67; NONEON-NOSVE-NEXT: sbfx w8, w14, #0, #1 68; NONEON-NOSVE-NEXT: sbfx w10, w15, #0, #1 69; NONEON-NOSVE-NEXT: stp w8, w12, [sp, #64] 70; NONEON-NOSVE-NEXT: sbfx w12, w13, #0, #1 71; NONEON-NOSVE-NEXT: sbfx w8, w11, #0, #1 72; NONEON-NOSVE-NEXT: stp w12, w10, [sp, #56] 73; NONEON-NOSVE-NEXT: stp w9, w8, [sp, #48] 74; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #48] 75; NONEON-NOSVE-NEXT: stp q1, q0, [x0] 76; NONEON-NOSVE-NEXT: add sp, sp, #80 77; NONEON-NOSVE-NEXT: ret 78 %b = sext <8 x i1> %a to <8 x i32> 79 store <8 x i32> %b, ptr %out 80 ret void 81} 82 83; 84; sext i3 -> i64 85; 86 87; NOTE: Covers the scenario where a SIGN_EXTEND_INREG is required, whose inreg 88; type's element type is not power-of-2 based and thus cannot be lowered 89; directly to an SVE instruction. 90define void @sext_v4i3_v4i64(<4 x i3> %a, ptr %out) { 91; CHECK-LABEL: sext_v4i3_v4i64: 92; CHECK: // %bb.0: 93; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 94; CHECK-NEXT: uunpklo z0.s, z0.h 95; CHECK-NEXT: uunpklo z1.d, z0.s 96; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 97; CHECK-NEXT: uunpklo z0.d, z0.s 98; CHECK-NEXT: lsl z1.d, z1.d, #61 99; CHECK-NEXT: lsl z0.d, z0.d, #61 100; CHECK-NEXT: asr z1.d, z1.d, #61 101; CHECK-NEXT: asr z0.d, z0.d, #61 102; CHECK-NEXT: stp q1, q0, [x0] 103; CHECK-NEXT: ret 104; 105; NONEON-NOSVE-LABEL: sext_v4i3_v4i64: 106; NONEON-NOSVE: // %bb.0: 107; NONEON-NOSVE-NEXT: ushll v0.4s, v0.4h, #0 108; NONEON-NOSVE-NEXT: str q0, [sp, #-64]! 109; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 110; NONEON-NOSVE-NEXT: ldp d0, d1, [sp] 111; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #16] 112; NONEON-NOSVE-NEXT: ldp w9, w8, [sp, #24] 113; NONEON-NOSVE-NEXT: ldp w11, w10, [sp, #16] 114; NONEON-NOSVE-NEXT: sbfx x8, x8, #0, #3 115; NONEON-NOSVE-NEXT: sbfx x9, x9, #0, #3 116; NONEON-NOSVE-NEXT: sbfx x10, x10, #0, #3 117; NONEON-NOSVE-NEXT: stp x9, x8, [sp, #48] 118; NONEON-NOSVE-NEXT: sbfx x8, x11, #0, #3 119; NONEON-NOSVE-NEXT: stp x8, x10, [sp, #32] 120; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 121; NONEON-NOSVE-NEXT: stp q1, q0, [x0] 122; NONEON-NOSVE-NEXT: add sp, sp, #64 123; NONEON-NOSVE-NEXT: ret 124 %b = sext <4 x i3> %a to <4 x i64> 125 store <4 x i64> %b, ptr %out 126 ret void 127} 128 129; 130; sext i8 -> i16 131; 132 133define void @sext_v16i8_v16i16(<16 x i8> %a, ptr %out) { 134; CHECK-LABEL: sext_v16i8_v16i16: 135; CHECK: // %bb.0: 136; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 137; CHECK-NEXT: sunpklo z1.h, z0.b 138; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 139; CHECK-NEXT: sunpklo z0.h, z0.b 140; CHECK-NEXT: stp q1, q0, [x0] 141; CHECK-NEXT: ret 142; 143; NONEON-NOSVE-LABEL: sext_v16i8_v16i16: 144; NONEON-NOSVE: // %bb.0: 145; NONEON-NOSVE-NEXT: str q0, [sp, #-64]! 146; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 147; NONEON-NOSVE-NEXT: ldp d1, d0, [sp] 148; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16] 149; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #31] 150; NONEON-NOSVE-NEXT: strh w8, [sp, #62] 151; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #30] 152; NONEON-NOSVE-NEXT: strh w8, [sp, #60] 153; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #29] 154; NONEON-NOSVE-NEXT: strh w8, [sp, #58] 155; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #28] 156; NONEON-NOSVE-NEXT: strh w8, [sp, #56] 157; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #27] 158; NONEON-NOSVE-NEXT: strh w8, [sp, #54] 159; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #26] 160; NONEON-NOSVE-NEXT: strh w8, [sp, #52] 161; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #25] 162; NONEON-NOSVE-NEXT: strh w8, [sp, #50] 163; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #24] 164; NONEON-NOSVE-NEXT: strh w8, [sp, #48] 165; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #23] 166; NONEON-NOSVE-NEXT: strh w8, [sp, #46] 167; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #22] 168; NONEON-NOSVE-NEXT: strh w8, [sp, #44] 169; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #21] 170; NONEON-NOSVE-NEXT: strh w8, [sp, #42] 171; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #20] 172; NONEON-NOSVE-NEXT: strh w8, [sp, #40] 173; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #19] 174; NONEON-NOSVE-NEXT: strh w8, [sp, #38] 175; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #18] 176; NONEON-NOSVE-NEXT: strh w8, [sp, #36] 177; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #17] 178; NONEON-NOSVE-NEXT: strh w8, [sp, #34] 179; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #16] 180; NONEON-NOSVE-NEXT: strh w8, [sp, #32] 181; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 182; NONEON-NOSVE-NEXT: stp q1, q0, [x0] 183; NONEON-NOSVE-NEXT: add sp, sp, #64 184; NONEON-NOSVE-NEXT: ret 185 %b = sext <16 x i8> %a to <16 x i16> 186 store <16 x i16>%b, ptr %out 187 ret void 188} 189 190; NOTE: Extra 'add' is to prevent the extend being combined with the load. 191define void @sext_v32i8_v32i16(ptr %in, ptr %out) { 192; CHECK-LABEL: sext_v32i8_v32i16: 193; CHECK: // %bb.0: 194; CHECK-NEXT: ldp q1, q0, [x0] 195; CHECK-NEXT: add z0.b, z0.b, z0.b 196; CHECK-NEXT: add z1.b, z1.b, z1.b 197; CHECK-NEXT: sunpklo z2.h, z0.b 198; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 199; CHECK-NEXT: sunpklo z3.h, z1.b 200; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 201; CHECK-NEXT: sunpklo z0.h, z0.b 202; CHECK-NEXT: sunpklo z1.h, z1.b 203; CHECK-NEXT: stp q2, q0, [x1, #32] 204; CHECK-NEXT: stp q3, q1, [x1] 205; CHECK-NEXT: ret 206; 207; NONEON-NOSVE-LABEL: sext_v32i8_v32i16: 208; NONEON-NOSVE: // %bb.0: 209; NONEON-NOSVE-NEXT: sub sp, sp, #272 210; NONEON-NOSVE-NEXT: stp x29, x30, [sp, #176] // 16-byte Folded Spill 211; NONEON-NOSVE-NEXT: stp x28, x27, [sp, #192] // 16-byte Folded Spill 212; NONEON-NOSVE-NEXT: stp x26, x25, [sp, #208] // 16-byte Folded Spill 213; NONEON-NOSVE-NEXT: stp x24, x23, [sp, #224] // 16-byte Folded Spill 214; NONEON-NOSVE-NEXT: stp x22, x21, [sp, #240] // 16-byte Folded Spill 215; NONEON-NOSVE-NEXT: stp x20, x19, [sp, #256] // 16-byte Folded Spill 216; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 272 217; NONEON-NOSVE-NEXT: .cfi_offset w19, -8 218; NONEON-NOSVE-NEXT: .cfi_offset w20, -16 219; NONEON-NOSVE-NEXT: .cfi_offset w21, -24 220; NONEON-NOSVE-NEXT: .cfi_offset w22, -32 221; NONEON-NOSVE-NEXT: .cfi_offset w23, -40 222; NONEON-NOSVE-NEXT: .cfi_offset w24, -48 223; NONEON-NOSVE-NEXT: .cfi_offset w25, -56 224; NONEON-NOSVE-NEXT: .cfi_offset w26, -64 225; NONEON-NOSVE-NEXT: .cfi_offset w27, -72 226; NONEON-NOSVE-NEXT: .cfi_offset w28, -80 227; NONEON-NOSVE-NEXT: .cfi_offset w30, -88 228; NONEON-NOSVE-NEXT: .cfi_offset w29, -96 229; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 230; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #16] 231; NONEON-NOSVE-NEXT: ldrb w9, [sp, #40] 232; NONEON-NOSVE-NEXT: ldrb w8, [sp, #41] 233; NONEON-NOSVE-NEXT: ldrb w29, [sp, #18] 234; NONEON-NOSVE-NEXT: ldrb w27, [sp, #16] 235; NONEON-NOSVE-NEXT: ldrb w25, [sp, #30] 236; NONEON-NOSVE-NEXT: ldrb w23, [sp, #28] 237; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #8] // 8-byte Folded Spill 238; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20] 239; NONEON-NOSVE-NEXT: ldrb w21, [sp, #26] 240; NONEON-NOSVE-NEXT: ldrb w19, [sp, #24] 241; NONEON-NOSVE-NEXT: ldrb w9, [sp, #19] 242; NONEON-NOSVE-NEXT: ldrb w6, [sp, #38] 243; NONEON-NOSVE-NEXT: add w8, w8, w8 244; NONEON-NOSVE-NEXT: ldrb w28, [sp, #17] 245; NONEON-NOSVE-NEXT: ldrb w16, [sp, #22] 246; NONEON-NOSVE-NEXT: strb w8, [sp, #60] 247; NONEON-NOSVE-NEXT: add w8, w29, w29 248; NONEON-NOSVE-NEXT: ldrb w4, [sp, #36] 249; NONEON-NOSVE-NEXT: strb w8, [sp, #58] 250; NONEON-NOSVE-NEXT: add w8, w27, w27 251; NONEON-NOSVE-NEXT: ldrb w26, [sp, #31] 252; NONEON-NOSVE-NEXT: strb w8, [sp, #56] 253; NONEON-NOSVE-NEXT: add w8, w25, w25 254; NONEON-NOSVE-NEXT: add w9, w9, w9 255; NONEON-NOSVE-NEXT: strb w8, [sp, #54] 256; NONEON-NOSVE-NEXT: add w8, w23, w23 257; NONEON-NOSVE-NEXT: ldrb w2, [sp, #34] 258; NONEON-NOSVE-NEXT: strb w8, [sp, #52] 259; NONEON-NOSVE-NEXT: add w8, w21, w21 260; NONEON-NOSVE-NEXT: ldrb w24, [sp, #29] 261; NONEON-NOSVE-NEXT: strb w8, [sp, #50] 262; NONEON-NOSVE-NEXT: add w8, w19, w19 263; NONEON-NOSVE-NEXT: ldrb w17, [sp, #23] 264; NONEON-NOSVE-NEXT: strb w9, [sp, #59] 265; NONEON-NOSVE-NEXT: add w9, w28, w28 266; NONEON-NOSVE-NEXT: add w18, w16, w16 267; NONEON-NOSVE-NEXT: strb w8, [sp, #48] 268; NONEON-NOSVE-NEXT: add w8, w6, w6 269; NONEON-NOSVE-NEXT: ldrb w16, [sp, #32] 270; NONEON-NOSVE-NEXT: ldrb w22, [sp, #27] 271; NONEON-NOSVE-NEXT: strb w9, [sp, #57] 272; NONEON-NOSVE-NEXT: add w9, w26, w26 273; NONEON-NOSVE-NEXT: strb w8, [sp, #78] 274; NONEON-NOSVE-NEXT: add w8, w4, w4 275; NONEON-NOSVE-NEXT: ldrb w14, [sp, #46] 276; NONEON-NOSVE-NEXT: ldrb w20, [sp, #25] 277; NONEON-NOSVE-NEXT: ldrb w30, [sp, #21] 278; NONEON-NOSVE-NEXT: strb w9, [sp, #55] 279; NONEON-NOSVE-NEXT: add w9, w24, w24 280; NONEON-NOSVE-NEXT: strb w8, [sp, #76] 281; NONEON-NOSVE-NEXT: add w8, w2, w2 282; NONEON-NOSVE-NEXT: ldrb w12, [sp, #44] 283; NONEON-NOSVE-NEXT: add w17, w17, w17 284; NONEON-NOSVE-NEXT: strb w9, [sp, #53] 285; NONEON-NOSVE-NEXT: add w9, w22, w22 286; NONEON-NOSVE-NEXT: strb w8, [sp, #74] 287; NONEON-NOSVE-NEXT: add w8, w16, w16 288; NONEON-NOSVE-NEXT: ldrb w10, [sp, #42] 289; NONEON-NOSVE-NEXT: strb w17, [sp, #63] 290; NONEON-NOSVE-NEXT: add w17, w30, w30 291; NONEON-NOSVE-NEXT: strb w9, [sp, #51] 292; NONEON-NOSVE-NEXT: add w9, w20, w20 293; NONEON-NOSVE-NEXT: ldrb w7, [sp, #39] 294; NONEON-NOSVE-NEXT: strb w8, [sp, #72] 295; NONEON-NOSVE-NEXT: add w8, w14, w14 296; NONEON-NOSVE-NEXT: ldrb w5, [sp, #37] 297; NONEON-NOSVE-NEXT: strb w18, [sp, #62] 298; NONEON-NOSVE-NEXT: ldrb w3, [sp, #35] 299; NONEON-NOSVE-NEXT: ldrb w0, [sp, #33] 300; NONEON-NOSVE-NEXT: strb w17, [sp, #61] 301; NONEON-NOSVE-NEXT: ldrb w15, [sp, #47] 302; NONEON-NOSVE-NEXT: ldrb w13, [sp, #45] 303; NONEON-NOSVE-NEXT: strb w9, [sp, #49] 304; NONEON-NOSVE-NEXT: add w9, w7, w7 305; NONEON-NOSVE-NEXT: ldrb w11, [sp, #43] 306; NONEON-NOSVE-NEXT: strb w8, [sp, #70] 307; NONEON-NOSVE-NEXT: add w8, w12, w12 308; NONEON-NOSVE-NEXT: strb w8, [sp, #68] 309; NONEON-NOSVE-NEXT: add w8, w10, w10 310; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #48] 311; NONEON-NOSVE-NEXT: strb w8, [sp, #66] 312; NONEON-NOSVE-NEXT: ldr w8, [sp, #12] // 4-byte Folded Reload 313; NONEON-NOSVE-NEXT: strb w9, [sp, #79] 314; NONEON-NOSVE-NEXT: add w9, w5, w5 315; NONEON-NOSVE-NEXT: strb w9, [sp, #77] 316; NONEON-NOSVE-NEXT: add w9, w3, w3 317; NONEON-NOSVE-NEXT: add w8, w8, w8 318; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #80] 319; NONEON-NOSVE-NEXT: strb w8, [sp, #64] 320; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #95] 321; NONEON-NOSVE-NEXT: strb w9, [sp, #75] 322; NONEON-NOSVE-NEXT: add w9, w0, w0 323; NONEON-NOSVE-NEXT: strh w8, [sp, #142] 324; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #94] 325; NONEON-NOSVE-NEXT: strb w9, [sp, #73] 326; NONEON-NOSVE-NEXT: add w9, w15, w15 327; NONEON-NOSVE-NEXT: strh w8, [sp, #140] 328; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #93] 329; NONEON-NOSVE-NEXT: strb w9, [sp, #71] 330; NONEON-NOSVE-NEXT: add w9, w13, w13 331; NONEON-NOSVE-NEXT: strh w8, [sp, #138] 332; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #92] 333; NONEON-NOSVE-NEXT: strb w9, [sp, #69] 334; NONEON-NOSVE-NEXT: add w9, w11, w11 335; NONEON-NOSVE-NEXT: strh w8, [sp, #136] 336; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #91] 337; NONEON-NOSVE-NEXT: strb w9, [sp, #67] 338; NONEON-NOSVE-NEXT: ldr w9, [sp, #8] // 4-byte Folded Reload 339; NONEON-NOSVE-NEXT: strh w8, [sp, #134] 340; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #90] 341; NONEON-NOSVE-NEXT: add w9, w9, w9 342; NONEON-NOSVE-NEXT: ldp x20, x19, [sp, #256] // 16-byte Folded Reload 343; NONEON-NOSVE-NEXT: strh w8, [sp, #132] 344; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #89] 345; NONEON-NOSVE-NEXT: strb w9, [sp, #65] 346; NONEON-NOSVE-NEXT: ldp x22, x21, [sp, #240] // 16-byte Folded Reload 347; NONEON-NOSVE-NEXT: strh w8, [sp, #130] 348; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #88] 349; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #64] 350; NONEON-NOSVE-NEXT: strh w8, [sp, #128] 351; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #87] 352; NONEON-NOSVE-NEXT: ldp x24, x23, [sp, #224] // 16-byte Folded Reload 353; NONEON-NOSVE-NEXT: strh w8, [sp, #126] 354; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #86] 355; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #96] 356; NONEON-NOSVE-NEXT: ldp x26, x25, [sp, #208] // 16-byte Folded Reload 357; NONEON-NOSVE-NEXT: strh w8, [sp, #124] 358; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #85] 359; NONEON-NOSVE-NEXT: ldp x28, x27, [sp, #192] // 16-byte Folded Reload 360; NONEON-NOSVE-NEXT: strh w8, [sp, #122] 361; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #84] 362; NONEON-NOSVE-NEXT: ldp x29, x30, [sp, #176] // 16-byte Folded Reload 363; NONEON-NOSVE-NEXT: strh w8, [sp, #120] 364; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #83] 365; NONEON-NOSVE-NEXT: strh w8, [sp, #118] 366; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #82] 367; NONEON-NOSVE-NEXT: strh w8, [sp, #116] 368; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #81] 369; NONEON-NOSVE-NEXT: strh w8, [sp, #114] 370; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #80] 371; NONEON-NOSVE-NEXT: strh w8, [sp, #112] 372; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #111] 373; NONEON-NOSVE-NEXT: ldp q3, q2, [sp, #112] 374; NONEON-NOSVE-NEXT: strh w8, [sp, #174] 375; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #110] 376; NONEON-NOSVE-NEXT: strh w8, [sp, #172] 377; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #109] 378; NONEON-NOSVE-NEXT: strh w8, [sp, #170] 379; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #108] 380; NONEON-NOSVE-NEXT: strh w8, [sp, #168] 381; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #107] 382; NONEON-NOSVE-NEXT: strh w8, [sp, #166] 383; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #106] 384; NONEON-NOSVE-NEXT: strh w8, [sp, #164] 385; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #105] 386; NONEON-NOSVE-NEXT: strh w8, [sp, #162] 387; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #104] 388; NONEON-NOSVE-NEXT: strh w8, [sp, #160] 389; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #103] 390; NONEON-NOSVE-NEXT: strh w8, [sp, #158] 391; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #102] 392; NONEON-NOSVE-NEXT: strh w8, [sp, #156] 393; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #101] 394; NONEON-NOSVE-NEXT: strh w8, [sp, #154] 395; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #100] 396; NONEON-NOSVE-NEXT: strh w8, [sp, #152] 397; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #99] 398; NONEON-NOSVE-NEXT: strh w8, [sp, #150] 399; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #98] 400; NONEON-NOSVE-NEXT: strh w8, [sp, #148] 401; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #97] 402; NONEON-NOSVE-NEXT: strh w8, [sp, #146] 403; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #96] 404; NONEON-NOSVE-NEXT: strh w8, [sp, #144] 405; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #144] 406; NONEON-NOSVE-NEXT: stp q2, q3, [x1] 407; NONEON-NOSVE-NEXT: stp q1, q0, [x1, #32] 408; NONEON-NOSVE-NEXT: add sp, sp, #272 409; NONEON-NOSVE-NEXT: ret 410 %a = load <32 x i8>, ptr %in 411 %b = add <32 x i8> %a, %a 412 %c = sext <32 x i8> %b to <32 x i16> 413 store <32 x i16> %c, ptr %out 414 ret void 415} 416 417; 418; sext i8 -> i32 419; 420 421define void @sext_v8i8_v8i32(<8 x i8> %a, ptr %out) { 422; CHECK-LABEL: sext_v8i8_v8i32: 423; CHECK: // %bb.0: 424; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 425; CHECK-NEXT: sunpklo z0.h, z0.b 426; CHECK-NEXT: sunpklo z1.s, z0.h 427; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 428; CHECK-NEXT: sunpklo z0.s, z0.h 429; CHECK-NEXT: stp q1, q0, [x0] 430; CHECK-NEXT: ret 431; 432; NONEON-NOSVE-LABEL: sext_v8i8_v8i32: 433; NONEON-NOSVE: // %bb.0: 434; NONEON-NOSVE-NEXT: sub sp, sp, #80 435; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 80 436; NONEON-NOSVE-NEXT: str d0, [sp, #8] 437; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #11] 438; NONEON-NOSVE-NEXT: strh w8, [sp, #30] 439; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #10] 440; NONEON-NOSVE-NEXT: strh w8, [sp, #28] 441; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #9] 442; NONEON-NOSVE-NEXT: strh w8, [sp, #26] 443; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #8] 444; NONEON-NOSVE-NEXT: strh w8, [sp, #24] 445; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #15] 446; NONEON-NOSVE-NEXT: strh w8, [sp, #22] 447; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #14] 448; NONEON-NOSVE-NEXT: strh w8, [sp, #20] 449; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #13] 450; NONEON-NOSVE-NEXT: strh w8, [sp, #18] 451; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #12] 452; NONEON-NOSVE-NEXT: strh w8, [sp, #16] 453; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #16] 454; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #32] 455; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #46] 456; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #44] 457; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #72] 458; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #42] 459; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #40] 460; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #64] 461; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #38] 462; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #36] 463; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #56] 464; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #34] 465; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #32] 466; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #48] 467; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #48] 468; NONEON-NOSVE-NEXT: stp q1, q0, [x0] 469; NONEON-NOSVE-NEXT: add sp, sp, #80 470; NONEON-NOSVE-NEXT: ret 471 %b = sext <8 x i8> %a to <8 x i32> 472 store <8 x i32>%b, ptr %out 473 ret void 474} 475 476define void @sext_v16i8_v16i32(<16 x i8> %a, ptr %out) { 477; CHECK-LABEL: sext_v16i8_v16i32: 478; CHECK: // %bb.0: 479; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 480; CHECK-NEXT: sunpklo z1.h, z0.b 481; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 482; CHECK-NEXT: sunpklo z0.h, z0.b 483; CHECK-NEXT: sunpklo z2.s, z1.h 484; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 485; CHECK-NEXT: sunpklo z1.s, z1.h 486; CHECK-NEXT: sunpklo z3.s, z0.h 487; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 488; CHECK-NEXT: sunpklo z0.s, z0.h 489; CHECK-NEXT: stp q2, q1, [x0] 490; CHECK-NEXT: stp q3, q0, [x0, #32] 491; CHECK-NEXT: ret 492; 493; NONEON-NOSVE-LABEL: sext_v16i8_v16i32: 494; NONEON-NOSVE: // %bb.0: 495; NONEON-NOSVE-NEXT: str q0, [sp, #-160]! 496; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 160 497; NONEON-NOSVE-NEXT: ldp d1, d0, [sp] 498; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16] 499; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #27] 500; NONEON-NOSVE-NEXT: strh w8, [sp, #62] 501; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #26] 502; NONEON-NOSVE-NEXT: strh w8, [sp, #60] 503; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #25] 504; NONEON-NOSVE-NEXT: strh w8, [sp, #58] 505; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #24] 506; NONEON-NOSVE-NEXT: strh w8, [sp, #56] 507; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #31] 508; NONEON-NOSVE-NEXT: strh w8, [sp, #54] 509; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #30] 510; NONEON-NOSVE-NEXT: strh w8, [sp, #52] 511; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #29] 512; NONEON-NOSVE-NEXT: strh w8, [sp, #50] 513; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #28] 514; NONEON-NOSVE-NEXT: strh w8, [sp, #48] 515; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #19] 516; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #48] 517; NONEON-NOSVE-NEXT: strh w8, [sp, #46] 518; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #18] 519; NONEON-NOSVE-NEXT: strh w8, [sp, #44] 520; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #17] 521; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #80] 522; NONEON-NOSVE-NEXT: strh w8, [sp, #42] 523; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #16] 524; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #94] 525; NONEON-NOSVE-NEXT: strh w8, [sp, #40] 526; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #23] 527; NONEON-NOSVE-NEXT: strh w8, [sp, #38] 528; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #22] 529; NONEON-NOSVE-NEXT: strh w8, [sp, #36] 530; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #21] 531; NONEON-NOSVE-NEXT: strh w8, [sp, #34] 532; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #20] 533; NONEON-NOSVE-NEXT: strh w8, [sp, #32] 534; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #92] 535; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #32] 536; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #152] 537; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #90] 538; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #88] 539; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #144] 540; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #86] 541; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #84] 542; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #64] 543; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #136] 544; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #82] 545; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #80] 546; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #128] 547; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #78] 548; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #76] 549; NONEON-NOSVE-NEXT: ldp q3, q2, [sp, #128] 550; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #120] 551; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #74] 552; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #72] 553; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #112] 554; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #70] 555; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #68] 556; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #104] 557; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #66] 558; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #64] 559; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #96] 560; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #96] 561; NONEON-NOSVE-NEXT: stp q2, q3, [x0] 562; NONEON-NOSVE-NEXT: stp q1, q0, [x0, #32] 563; NONEON-NOSVE-NEXT: add sp, sp, #160 564; NONEON-NOSVE-NEXT: ret 565 %b = sext <16 x i8> %a to <16 x i32> 566 store <16 x i32> %b, ptr %out 567 ret void 568} 569 570define void @sext_v32i8_v32i32(ptr %in, ptr %out) { 571; CHECK-LABEL: sext_v32i8_v32i32: 572; CHECK: // %bb.0: 573; CHECK-NEXT: ldp q1, q0, [x0] 574; CHECK-NEXT: add z0.b, z0.b, z0.b 575; CHECK-NEXT: add z1.b, z1.b, z1.b 576; CHECK-NEXT: sunpklo z2.h, z0.b 577; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 578; CHECK-NEXT: sunpklo z3.h, z1.b 579; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 580; CHECK-NEXT: sunpklo z0.h, z0.b 581; CHECK-NEXT: sunpklo z1.h, z1.b 582; CHECK-NEXT: sunpklo z4.s, z2.h 583; CHECK-NEXT: ext z2.b, z2.b, z2.b, #8 584; CHECK-NEXT: sunpklo z5.s, z3.h 585; CHECK-NEXT: ext z3.b, z3.b, z3.b, #8 586; CHECK-NEXT: sunpklo z6.s, z0.h 587; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 588; CHECK-NEXT: sunpklo z2.s, z2.h 589; CHECK-NEXT: sunpklo z7.s, z1.h 590; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 591; CHECK-NEXT: sunpklo z3.s, z3.h 592; CHECK-NEXT: sunpklo z0.s, z0.h 593; CHECK-NEXT: sunpklo z1.s, z1.h 594; CHECK-NEXT: stp q4, q2, [x1, #64] 595; CHECK-NEXT: stp q5, q3, [x1] 596; CHECK-NEXT: stp q6, q0, [x1, #96] 597; CHECK-NEXT: stp q7, q1, [x1, #32] 598; CHECK-NEXT: ret 599; 600; NONEON-NOSVE-LABEL: sext_v32i8_v32i32: 601; NONEON-NOSVE: // %bb.0: 602; NONEON-NOSVE-NEXT: sub sp, sp, #464 603; NONEON-NOSVE-NEXT: stp x29, x30, [sp, #368] // 16-byte Folded Spill 604; NONEON-NOSVE-NEXT: stp x28, x27, [sp, #384] // 16-byte Folded Spill 605; NONEON-NOSVE-NEXT: stp x26, x25, [sp, #400] // 16-byte Folded Spill 606; NONEON-NOSVE-NEXT: stp x24, x23, [sp, #416] // 16-byte Folded Spill 607; NONEON-NOSVE-NEXT: stp x22, x21, [sp, #432] // 16-byte Folded Spill 608; NONEON-NOSVE-NEXT: stp x20, x19, [sp, #448] // 16-byte Folded Spill 609; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 464 610; NONEON-NOSVE-NEXT: .cfi_offset w19, -8 611; NONEON-NOSVE-NEXT: .cfi_offset w20, -16 612; NONEON-NOSVE-NEXT: .cfi_offset w21, -24 613; NONEON-NOSVE-NEXT: .cfi_offset w22, -32 614; NONEON-NOSVE-NEXT: .cfi_offset w23, -40 615; NONEON-NOSVE-NEXT: .cfi_offset w24, -48 616; NONEON-NOSVE-NEXT: .cfi_offset w25, -56 617; NONEON-NOSVE-NEXT: .cfi_offset w26, -64 618; NONEON-NOSVE-NEXT: .cfi_offset w27, -72 619; NONEON-NOSVE-NEXT: .cfi_offset w28, -80 620; NONEON-NOSVE-NEXT: .cfi_offset w30, -88 621; NONEON-NOSVE-NEXT: .cfi_offset w29, -96 622; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 623; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #16] 624; NONEON-NOSVE-NEXT: ldrb w9, [sp, #40] 625; NONEON-NOSVE-NEXT: ldrb w8, [sp, #41] 626; NONEON-NOSVE-NEXT: ldrb w29, [sp, #18] 627; NONEON-NOSVE-NEXT: ldrb w27, [sp, #16] 628; NONEON-NOSVE-NEXT: ldrb w25, [sp, #30] 629; NONEON-NOSVE-NEXT: ldrb w23, [sp, #28] 630; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #8] // 8-byte Folded Spill 631; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20] 632; NONEON-NOSVE-NEXT: ldrb w21, [sp, #26] 633; NONEON-NOSVE-NEXT: ldrb w19, [sp, #24] 634; NONEON-NOSVE-NEXT: ldrb w9, [sp, #19] 635; NONEON-NOSVE-NEXT: ldrb w6, [sp, #38] 636; NONEON-NOSVE-NEXT: add w8, w8, w8 637; NONEON-NOSVE-NEXT: ldrb w28, [sp, #17] 638; NONEON-NOSVE-NEXT: ldrb w16, [sp, #22] 639; NONEON-NOSVE-NEXT: strb w8, [sp, #60] 640; NONEON-NOSVE-NEXT: add w8, w29, w29 641; NONEON-NOSVE-NEXT: ldrb w4, [sp, #36] 642; NONEON-NOSVE-NEXT: strb w8, [sp, #58] 643; NONEON-NOSVE-NEXT: add w8, w27, w27 644; NONEON-NOSVE-NEXT: ldrb w26, [sp, #31] 645; NONEON-NOSVE-NEXT: strb w8, [sp, #56] 646; NONEON-NOSVE-NEXT: add w8, w25, w25 647; NONEON-NOSVE-NEXT: add w9, w9, w9 648; NONEON-NOSVE-NEXT: strb w8, [sp, #54] 649; NONEON-NOSVE-NEXT: add w8, w23, w23 650; NONEON-NOSVE-NEXT: ldrb w2, [sp, #34] 651; NONEON-NOSVE-NEXT: strb w8, [sp, #52] 652; NONEON-NOSVE-NEXT: add w8, w21, w21 653; NONEON-NOSVE-NEXT: ldrb w24, [sp, #29] 654; NONEON-NOSVE-NEXT: strb w8, [sp, #50] 655; NONEON-NOSVE-NEXT: add w8, w19, w19 656; NONEON-NOSVE-NEXT: ldrb w17, [sp, #23] 657; NONEON-NOSVE-NEXT: strb w9, [sp, #59] 658; NONEON-NOSVE-NEXT: add w9, w28, w28 659; NONEON-NOSVE-NEXT: add w18, w16, w16 660; NONEON-NOSVE-NEXT: strb w8, [sp, #48] 661; NONEON-NOSVE-NEXT: add w8, w6, w6 662; NONEON-NOSVE-NEXT: ldrb w16, [sp, #32] 663; NONEON-NOSVE-NEXT: ldrb w22, [sp, #27] 664; NONEON-NOSVE-NEXT: strb w9, [sp, #57] 665; NONEON-NOSVE-NEXT: add w9, w26, w26 666; NONEON-NOSVE-NEXT: strb w8, [sp, #78] 667; NONEON-NOSVE-NEXT: add w8, w4, w4 668; NONEON-NOSVE-NEXT: ldrb w14, [sp, #46] 669; NONEON-NOSVE-NEXT: ldrb w20, [sp, #25] 670; NONEON-NOSVE-NEXT: ldrb w30, [sp, #21] 671; NONEON-NOSVE-NEXT: strb w9, [sp, #55] 672; NONEON-NOSVE-NEXT: add w9, w24, w24 673; NONEON-NOSVE-NEXT: strb w8, [sp, #76] 674; NONEON-NOSVE-NEXT: add w8, w2, w2 675; NONEON-NOSVE-NEXT: ldrb w12, [sp, #44] 676; NONEON-NOSVE-NEXT: add w17, w17, w17 677; NONEON-NOSVE-NEXT: strb w9, [sp, #53] 678; NONEON-NOSVE-NEXT: add w9, w22, w22 679; NONEON-NOSVE-NEXT: strb w8, [sp, #74] 680; NONEON-NOSVE-NEXT: add w8, w16, w16 681; NONEON-NOSVE-NEXT: ldrb w10, [sp, #42] 682; NONEON-NOSVE-NEXT: strb w17, [sp, #63] 683; NONEON-NOSVE-NEXT: add w17, w30, w30 684; NONEON-NOSVE-NEXT: strb w9, [sp, #51] 685; NONEON-NOSVE-NEXT: add w9, w20, w20 686; NONEON-NOSVE-NEXT: ldrb w7, [sp, #39] 687; NONEON-NOSVE-NEXT: strb w8, [sp, #72] 688; NONEON-NOSVE-NEXT: add w8, w14, w14 689; NONEON-NOSVE-NEXT: ldrb w5, [sp, #37] 690; NONEON-NOSVE-NEXT: strb w18, [sp, #62] 691; NONEON-NOSVE-NEXT: ldrb w3, [sp, #35] 692; NONEON-NOSVE-NEXT: ldrb w0, [sp, #33] 693; NONEON-NOSVE-NEXT: strb w17, [sp, #61] 694; NONEON-NOSVE-NEXT: ldrb w15, [sp, #47] 695; NONEON-NOSVE-NEXT: ldrb w13, [sp, #45] 696; NONEON-NOSVE-NEXT: strb w9, [sp, #49] 697; NONEON-NOSVE-NEXT: add w9, w7, w7 698; NONEON-NOSVE-NEXT: ldrb w11, [sp, #43] 699; NONEON-NOSVE-NEXT: strb w8, [sp, #70] 700; NONEON-NOSVE-NEXT: add w8, w12, w12 701; NONEON-NOSVE-NEXT: strb w8, [sp, #68] 702; NONEON-NOSVE-NEXT: add w8, w10, w10 703; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #48] 704; NONEON-NOSVE-NEXT: strb w8, [sp, #66] 705; NONEON-NOSVE-NEXT: ldr w8, [sp, #12] // 4-byte Folded Reload 706; NONEON-NOSVE-NEXT: strb w9, [sp, #79] 707; NONEON-NOSVE-NEXT: add w9, w5, w5 708; NONEON-NOSVE-NEXT: strb w9, [sp, #77] 709; NONEON-NOSVE-NEXT: add w9, w3, w3 710; NONEON-NOSVE-NEXT: add w8, w8, w8 711; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #80] 712; NONEON-NOSVE-NEXT: strb w8, [sp, #64] 713; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #91] 714; NONEON-NOSVE-NEXT: strb w9, [sp, #75] 715; NONEON-NOSVE-NEXT: add w9, w0, w0 716; NONEON-NOSVE-NEXT: strh w8, [sp, #134] 717; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #90] 718; NONEON-NOSVE-NEXT: strb w9, [sp, #73] 719; NONEON-NOSVE-NEXT: add w9, w15, w15 720; NONEON-NOSVE-NEXT: strh w8, [sp, #132] 721; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #89] 722; NONEON-NOSVE-NEXT: strb w9, [sp, #71] 723; NONEON-NOSVE-NEXT: add w9, w13, w13 724; NONEON-NOSVE-NEXT: strh w8, [sp, #130] 725; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #88] 726; NONEON-NOSVE-NEXT: strb w9, [sp, #69] 727; NONEON-NOSVE-NEXT: add w9, w11, w11 728; NONEON-NOSVE-NEXT: strh w8, [sp, #128] 729; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #95] 730; NONEON-NOSVE-NEXT: strb w9, [sp, #67] 731; NONEON-NOSVE-NEXT: ldr w9, [sp, #8] // 4-byte Folded Reload 732; NONEON-NOSVE-NEXT: strh w8, [sp, #142] 733; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #94] 734; NONEON-NOSVE-NEXT: add w9, w9, w9 735; NONEON-NOSVE-NEXT: ldp x20, x19, [sp, #448] // 16-byte Folded Reload 736; NONEON-NOSVE-NEXT: strh w8, [sp, #140] 737; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #93] 738; NONEON-NOSVE-NEXT: strb w9, [sp, #65] 739; NONEON-NOSVE-NEXT: ldp x22, x21, [sp, #432] // 16-byte Folded Reload 740; NONEON-NOSVE-NEXT: strh w8, [sp, #138] 741; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #92] 742; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #64] 743; NONEON-NOSVE-NEXT: strh w8, [sp, #136] 744; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #83] 745; NONEON-NOSVE-NEXT: ldp x24, x23, [sp, #416] // 16-byte Folded Reload 746; NONEON-NOSVE-NEXT: strh w8, [sp, #118] 747; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #82] 748; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #96] 749; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #128] 750; NONEON-NOSVE-NEXT: strh w8, [sp, #116] 751; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #81] 752; NONEON-NOSVE-NEXT: ldp x26, x25, [sp, #400] // 16-byte Folded Reload 753; NONEON-NOSVE-NEXT: strh w8, [sp, #114] 754; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #80] 755; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #192] 756; NONEON-NOSVE-NEXT: ldp x28, x27, [sp, #384] // 16-byte Folded Reload 757; NONEON-NOSVE-NEXT: strh w8, [sp, #112] 758; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #87] 759; NONEON-NOSVE-NEXT: ldp x29, x30, [sp, #368] // 16-byte Folded Reload 760; NONEON-NOSVE-NEXT: strh w8, [sp, #126] 761; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #86] 762; NONEON-NOSVE-NEXT: strh w8, [sp, #124] 763; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #85] 764; NONEON-NOSVE-NEXT: strh w8, [sp, #122] 765; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #84] 766; NONEON-NOSVE-NEXT: strh w8, [sp, #120] 767; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #107] 768; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #112] 769; NONEON-NOSVE-NEXT: strh w8, [sp, #166] 770; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #106] 771; NONEON-NOSVE-NEXT: strh w8, [sp, #164] 772; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #105] 773; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #176] 774; NONEON-NOSVE-NEXT: strh w8, [sp, #162] 775; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #104] 776; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #182] 777; NONEON-NOSVE-NEXT: strh w8, [sp, #160] 778; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #111] 779; NONEON-NOSVE-NEXT: strh w8, [sp, #174] 780; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #110] 781; NONEON-NOSVE-NEXT: strh w8, [sp, #172] 782; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #109] 783; NONEON-NOSVE-NEXT: strh w8, [sp, #170] 784; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #108] 785; NONEON-NOSVE-NEXT: strh w8, [sp, #168] 786; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #99] 787; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #160] 788; NONEON-NOSVE-NEXT: strh w8, [sp, #150] 789; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #98] 790; NONEON-NOSVE-NEXT: strh w8, [sp, #148] 791; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #97] 792; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #224] 793; NONEON-NOSVE-NEXT: strh w8, [sp, #146] 794; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #96] 795; NONEON-NOSVE-NEXT: strh w8, [sp, #144] 796; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #103] 797; NONEON-NOSVE-NEXT: strh w8, [sp, #158] 798; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #102] 799; NONEON-NOSVE-NEXT: strh w8, [sp, #156] 800; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #101] 801; NONEON-NOSVE-NEXT: strh w8, [sp, #154] 802; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #100] 803; NONEON-NOSVE-NEXT: strh w8, [sp, #152] 804; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #198] 805; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #144] 806; NONEON-NOSVE-NEXT: str w8, [sp, #284] 807; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #196] 808; NONEON-NOSVE-NEXT: str w8, [sp, #280] 809; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #194] 810; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #208] 811; NONEON-NOSVE-NEXT: str w8, [sp, #276] 812; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #192] 813; NONEON-NOSVE-NEXT: str w8, [sp, #272] 814; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #206] 815; NONEON-NOSVE-NEXT: str w8, [sp, #300] 816; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #204] 817; NONEON-NOSVE-NEXT: str w8, [sp, #296] 818; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #202] 819; NONEON-NOSVE-NEXT: str w8, [sp, #292] 820; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #200] 821; NONEON-NOSVE-NEXT: str w8, [sp, #288] 822; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #180] 823; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #272] 824; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #248] 825; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #178] 826; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #176] 827; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #240] 828; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #190] 829; NONEON-NOSVE-NEXT: str w8, [sp, #268] 830; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #188] 831; NONEON-NOSVE-NEXT: str w8, [sp, #264] 832; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #186] 833; NONEON-NOSVE-NEXT: str w8, [sp, #260] 834; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #184] 835; NONEON-NOSVE-NEXT: str w8, [sp, #256] 836; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #230] 837; NONEON-NOSVE-NEXT: ldp q3, q4, [sp, #240] 838; NONEON-NOSVE-NEXT: str w8, [sp, #348] 839; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #228] 840; NONEON-NOSVE-NEXT: str w8, [sp, #344] 841; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #226] 842; NONEON-NOSVE-NEXT: str w8, [sp, #340] 843; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #224] 844; NONEON-NOSVE-NEXT: str w8, [sp, #336] 845; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #238] 846; NONEON-NOSVE-NEXT: str w8, [sp, #364] 847; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #236] 848; NONEON-NOSVE-NEXT: str w8, [sp, #360] 849; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #234] 850; NONEON-NOSVE-NEXT: str w8, [sp, #356] 851; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #232] 852; NONEON-NOSVE-NEXT: str w8, [sp, #352] 853; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #214] 854; NONEON-NOSVE-NEXT: ldp q6, q7, [sp, #336] 855; NONEON-NOSVE-NEXT: str w8, [sp, #316] 856; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #212] 857; NONEON-NOSVE-NEXT: str w8, [sp, #312] 858; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #210] 859; NONEON-NOSVE-NEXT: str w8, [sp, #308] 860; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #208] 861; NONEON-NOSVE-NEXT: str w8, [sp, #304] 862; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #222] 863; NONEON-NOSVE-NEXT: str w8, [sp, #332] 864; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #220] 865; NONEON-NOSVE-NEXT: str w8, [sp, #328] 866; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #218] 867; NONEON-NOSVE-NEXT: str w8, [sp, #324] 868; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #216] 869; NONEON-NOSVE-NEXT: str w8, [sp, #320] 870; NONEON-NOSVE-NEXT: ldp q5, q2, [sp, #304] 871; NONEON-NOSVE-NEXT: stp q0, q1, [x1] 872; NONEON-NOSVE-NEXT: stp q3, q4, [x1, #32] 873; NONEON-NOSVE-NEXT: stp q6, q7, [x1, #64] 874; NONEON-NOSVE-NEXT: stp q5, q2, [x1, #96] 875; NONEON-NOSVE-NEXT: add sp, sp, #464 876; NONEON-NOSVE-NEXT: ret 877 %a = load <32 x i8>, ptr %in 878 %b = add <32 x i8> %a, %a 879 %c = sext <32 x i8> %b to <32 x i32> 880 store <32 x i32> %c, ptr %out 881 ret void 882} 883 884; 885; sext i8 -> i64 886; 887 888; NOTE: v4i8 is an unpacked typed stored within a v4i16 container. The sign 889; extend is a two step process where the container is any_extend'd with the 890; result feeding an inreg sign extend. 891define void @sext_v4i8_v4i64(<4 x i8> %a, ptr %out) { 892; CHECK-LABEL: sext_v4i8_v4i64: 893; CHECK: // %bb.0: 894; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 895; CHECK-NEXT: ptrue p0.d, vl2 896; CHECK-NEXT: uunpklo z0.s, z0.h 897; CHECK-NEXT: uunpklo z1.d, z0.s 898; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 899; CHECK-NEXT: uunpklo z0.d, z0.s 900; CHECK-NEXT: sxtb z1.d, p0/m, z1.d 901; CHECK-NEXT: sxtb z0.d, p0/m, z0.d 902; CHECK-NEXT: stp q1, q0, [x0] 903; CHECK-NEXT: ret 904; 905; NONEON-NOSVE-LABEL: sext_v4i8_v4i64: 906; NONEON-NOSVE: // %bb.0: 907; NONEON-NOSVE-NEXT: ushll v0.4s, v0.4h, #0 908; NONEON-NOSVE-NEXT: str q0, [sp, #-64]! 909; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 910; NONEON-NOSVE-NEXT: ldp d0, d1, [sp] 911; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #16] 912; NONEON-NOSVE-NEXT: ldrsb x8, [sp, #28] 913; NONEON-NOSVE-NEXT: ldrsb x9, [sp, #24] 914; NONEON-NOSVE-NEXT: ldrsb x10, [sp, #16] 915; NONEON-NOSVE-NEXT: ldrsb x11, [sp, #20] 916; NONEON-NOSVE-NEXT: stp x9, x8, [sp, #48] 917; NONEON-NOSVE-NEXT: stp x10, x11, [sp, #32] 918; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 919; NONEON-NOSVE-NEXT: stp q1, q0, [x0] 920; NONEON-NOSVE-NEXT: add sp, sp, #64 921; NONEON-NOSVE-NEXT: ret 922 %b = sext <4 x i8> %a to <4 x i64> 923 store <4 x i64>%b, ptr %out 924 ret void 925} 926 927define void @sext_v8i8_v8i64(<8 x i8> %a, ptr %out) { 928; CHECK-LABEL: sext_v8i8_v8i64: 929; CHECK: // %bb.0: 930; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 931; CHECK-NEXT: sunpklo z0.h, z0.b 932; CHECK-NEXT: sunpklo z1.s, z0.h 933; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 934; CHECK-NEXT: sunpklo z0.s, z0.h 935; CHECK-NEXT: sunpklo z2.d, z1.s 936; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 937; CHECK-NEXT: sunpklo z3.d, z0.s 938; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 939; CHECK-NEXT: sunpklo z1.d, z1.s 940; CHECK-NEXT: sunpklo z0.d, z0.s 941; CHECK-NEXT: stp q2, q1, [x0] 942; CHECK-NEXT: stp q3, q0, [x0, #32] 943; CHECK-NEXT: ret 944; 945; NONEON-NOSVE-LABEL: sext_v8i8_v8i64: 946; NONEON-NOSVE: // %bb.0: 947; NONEON-NOSVE-NEXT: sub sp, sp, #176 948; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 176 949; NONEON-NOSVE-NEXT: str d0, [sp, #8] 950; NONEON-NOSVE-NEXT: add x8, sp, #144 951; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #11] 952; NONEON-NOSVE-NEXT: strh w9, [sp, #30] 953; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #10] 954; NONEON-NOSVE-NEXT: strh w9, [sp, #28] 955; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #9] 956; NONEON-NOSVE-NEXT: strh w9, [sp, #26] 957; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #8] 958; NONEON-NOSVE-NEXT: strh w9, [sp, #24] 959; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #15] 960; NONEON-NOSVE-NEXT: strh w9, [sp, #22] 961; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #14] 962; NONEON-NOSVE-NEXT: strh w9, [sp, #20] 963; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #13] 964; NONEON-NOSVE-NEXT: strh w9, [sp, #18] 965; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #12] 966; NONEON-NOSVE-NEXT: strh w9, [sp, #16] 967; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #16] 968; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #32] 969; NONEON-NOSVE-NEXT: ldrsh w10, [sp, #42] 970; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #40] 971; NONEON-NOSVE-NEXT: stp w9, w10, [sp, #64] 972; NONEON-NOSVE-NEXT: ldrsh w10, [sp, #46] 973; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #44] 974; NONEON-NOSVE-NEXT: stp w9, w10, [sp, #72] 975; NONEON-NOSVE-NEXT: ldrsh w10, [sp, #34] 976; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #32] 977; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #64] 978; NONEON-NOSVE-NEXT: stp w9, w10, [sp, #48] 979; NONEON-NOSVE-NEXT: ldrsh w10, [sp, #38] 980; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #36] 981; NONEON-NOSVE-NEXT: stp w9, w10, [sp, #56] 982; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #96] 983; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #48] 984; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #80] 985; NONEON-NOSVE-NEXT: ldpsw x9, x10, [sp, #96] 986; NONEON-NOSVE-NEXT: stp x9, x10, [sp, #144] 987; NONEON-NOSVE-NEXT: ldpsw x9, x10, [sp, #104] 988; NONEON-NOSVE-NEXT: stp x9, x10, [sp, #160] 989; NONEON-NOSVE-NEXT: ldpsw x9, x10, [sp, #80] 990; NONEON-NOSVE-NEXT: stp x9, x10, [sp, #112] 991; NONEON-NOSVE-NEXT: ldpsw x9, x10, [sp, #88] 992; NONEON-NOSVE-NEXT: stp x9, x10, [sp, #128] 993; NONEON-NOSVE-NEXT: ldp q1, q0, [sp, #112] 994; NONEON-NOSVE-NEXT: ldp q2, q3, [x8] 995; NONEON-NOSVE-NEXT: stp q1, q0, [x0, #32] 996; NONEON-NOSVE-NEXT: stp q2, q3, [x0] 997; NONEON-NOSVE-NEXT: add sp, sp, #176 998; NONEON-NOSVE-NEXT: ret 999 %b = sext <8 x i8> %a to <8 x i64> 1000 store <8 x i64>%b, ptr %out 1001 ret void 1002} 1003 1004define void @sext_v16i8_v16i64(<16 x i8> %a, ptr %out) { 1005; CHECK-LABEL: sext_v16i8_v16i64: 1006; CHECK: // %bb.0: 1007; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 1008; CHECK-NEXT: sunpklo z1.h, z0.b 1009; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 1010; CHECK-NEXT: sunpklo z0.h, z0.b 1011; CHECK-NEXT: sunpklo z2.s, z1.h 1012; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 1013; CHECK-NEXT: sunpklo z1.s, z1.h 1014; CHECK-NEXT: sunpklo z3.s, z0.h 1015; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 1016; CHECK-NEXT: sunpklo z4.d, z2.s 1017; CHECK-NEXT: ext z2.b, z2.b, z2.b, #8 1018; CHECK-NEXT: sunpklo z0.s, z0.h 1019; CHECK-NEXT: sunpklo z6.d, z1.s 1020; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 1021; CHECK-NEXT: sunpklo z5.d, z3.s 1022; CHECK-NEXT: ext z3.b, z3.b, z3.b, #8 1023; CHECK-NEXT: sunpklo z2.d, z2.s 1024; CHECK-NEXT: sunpklo z1.d, z1.s 1025; CHECK-NEXT: sunpklo z7.d, z0.s 1026; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 1027; CHECK-NEXT: sunpklo z3.d, z3.s 1028; CHECK-NEXT: stp q4, q2, [x0] 1029; CHECK-NEXT: sunpklo z0.d, z0.s 1030; CHECK-NEXT: stp q6, q1, [x0, #32] 1031; CHECK-NEXT: stp q5, q3, [x0, #64] 1032; CHECK-NEXT: stp q7, q0, [x0, #96] 1033; CHECK-NEXT: ret 1034; 1035; NONEON-NOSVE-LABEL: sext_v16i8_v16i64: 1036; NONEON-NOSVE: // %bb.0: 1037; NONEON-NOSVE-NEXT: sub sp, sp, #368 1038; NONEON-NOSVE-NEXT: str x29, [sp, #352] // 8-byte Folded Spill 1039; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 368 1040; NONEON-NOSVE-NEXT: .cfi_offset w29, -16 1041; NONEON-NOSVE-NEXT: str q0, [sp] 1042; NONEON-NOSVE-NEXT: ldr x29, [sp, #352] // 8-byte Folded Reload 1043; NONEON-NOSVE-NEXT: ldp d1, d0, [sp] 1044; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #24] 1045; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #35] 1046; NONEON-NOSVE-NEXT: strh w8, [sp, #70] 1047; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #34] 1048; NONEON-NOSVE-NEXT: strh w8, [sp, #68] 1049; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #33] 1050; NONEON-NOSVE-NEXT: strh w8, [sp, #66] 1051; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #32] 1052; NONEON-NOSVE-NEXT: strh w8, [sp, #64] 1053; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #39] 1054; NONEON-NOSVE-NEXT: strh w8, [sp, #62] 1055; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #38] 1056; NONEON-NOSVE-NEXT: strh w8, [sp, #60] 1057; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #37] 1058; NONEON-NOSVE-NEXT: strh w8, [sp, #58] 1059; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #36] 1060; NONEON-NOSVE-NEXT: strh w8, [sp, #56] 1061; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #27] 1062; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #56] 1063; NONEON-NOSVE-NEXT: strh w8, [sp, #54] 1064; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #26] 1065; NONEON-NOSVE-NEXT: strh w8, [sp, #52] 1066; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #25] 1067; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #88] 1068; NONEON-NOSVE-NEXT: strh w8, [sp, #50] 1069; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #24] 1070; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #98] 1071; NONEON-NOSVE-NEXT: strh w8, [sp, #48] 1072; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #31] 1073; NONEON-NOSVE-NEXT: strh w8, [sp, #46] 1074; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #30] 1075; NONEON-NOSVE-NEXT: strh w8, [sp, #44] 1076; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #29] 1077; NONEON-NOSVE-NEXT: strh w8, [sp, #42] 1078; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #28] 1079; NONEON-NOSVE-NEXT: strh w8, [sp, #40] 1080; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #96] 1081; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #40] 1082; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #152] 1083; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #102] 1084; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #100] 1085; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #160] 1086; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #90] 1087; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #88] 1088; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #72] 1089; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #152] 1090; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #136] 1091; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #94] 1092; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #92] 1093; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #144] 1094; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #82] 1095; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #80] 1096; NONEON-NOSVE-NEXT: str d0, [sp, #360] 1097; NONEON-NOSVE-NEXT: ldp d2, d0, [sp, #136] 1098; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #120] 1099; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #86] 1100; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #84] 1101; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #128] 1102; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #74] 1103; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #72] 1104; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #208] 1105; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #120] 1106; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #104] 1107; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #78] 1108; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #76] 1109; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #112] 1110; NONEON-NOSVE-NEXT: stp d0, d2, [sp, #192] 1111; NONEON-NOSVE-NEXT: ldp d2, d0, [sp, #104] 1112; NONEON-NOSVE-NEXT: str d2, [sp, #168] 1113; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #176] 1114; NONEON-NOSVE-NEXT: ldpsw x8, x9, [sp, #216] 1115; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #320] 1116; NONEON-NOSVE-NEXT: ldrsw x9, [sp, #364] 1117; NONEON-NOSVE-NEXT: ldrsw x8, [sp, #360] 1118; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #336] 1119; NONEON-NOSVE-NEXT: ldpsw x8, x9, [sp, #200] 1120; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #320] 1121; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #288] 1122; NONEON-NOSVE-NEXT: ldpsw x8, x9, [sp, #208] 1123; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #304] 1124; NONEON-NOSVE-NEXT: ldpsw x8, x9, [sp, #184] 1125; NONEON-NOSVE-NEXT: ldp q3, q4, [sp, #288] 1126; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #256] 1127; NONEON-NOSVE-NEXT: ldpsw x8, x9, [sp, #192] 1128; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #272] 1129; NONEON-NOSVE-NEXT: ldpsw x8, x9, [sp, #168] 1130; NONEON-NOSVE-NEXT: ldp q6, q7, [sp, #256] 1131; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #224] 1132; NONEON-NOSVE-NEXT: ldpsw x8, x9, [sp, #176] 1133; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #240] 1134; NONEON-NOSVE-NEXT: ldp q5, q2, [sp, #224] 1135; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 1136; NONEON-NOSVE-NEXT: stp q3, q4, [x0, #32] 1137; NONEON-NOSVE-NEXT: stp q6, q7, [x0, #64] 1138; NONEON-NOSVE-NEXT: stp q5, q2, [x0, #96] 1139; NONEON-NOSVE-NEXT: add sp, sp, #368 1140; NONEON-NOSVE-NEXT: ret 1141 %b = sext <16 x i8> %a to <16 x i64> 1142 store <16 x i64> %b, ptr %out 1143 ret void 1144} 1145 1146define void @sext_v32i8_v32i64(ptr %in, ptr %out) { 1147; CHECK-LABEL: sext_v32i8_v32i64: 1148; CHECK: // %bb.0: 1149; CHECK-NEXT: ldp q1, q0, [x0] 1150; CHECK-NEXT: add z0.b, z0.b, z0.b 1151; CHECK-NEXT: add z1.b, z1.b, z1.b 1152; CHECK-NEXT: mov z2.d, z0.d 1153; CHECK-NEXT: sunpklo z0.h, z0.b 1154; CHECK-NEXT: mov z3.d, z1.d 1155; CHECK-NEXT: sunpklo z1.h, z1.b 1156; CHECK-NEXT: ext z2.b, z2.b, z2.b, #8 1157; CHECK-NEXT: ext z3.b, z3.b, z3.b, #8 1158; CHECK-NEXT: sunpklo z4.s, z0.h 1159; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 1160; CHECK-NEXT: sunpklo z5.s, z1.h 1161; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 1162; CHECK-NEXT: sunpklo z2.h, z2.b 1163; CHECK-NEXT: sunpklo z3.h, z3.b 1164; CHECK-NEXT: sunpklo z0.s, z0.h 1165; CHECK-NEXT: sunpklo z16.d, z4.s 1166; CHECK-NEXT: ext z4.b, z4.b, z4.b, #8 1167; CHECK-NEXT: sunpklo z1.s, z1.h 1168; CHECK-NEXT: sunpklo z17.d, z5.s 1169; CHECK-NEXT: ext z5.b, z5.b, z5.b, #8 1170; CHECK-NEXT: sunpklo z6.s, z2.h 1171; CHECK-NEXT: sunpklo z7.s, z3.h 1172; CHECK-NEXT: ext z2.b, z2.b, z2.b, #8 1173; CHECK-NEXT: sunpklo z4.d, z4.s 1174; CHECK-NEXT: ext z3.b, z3.b, z3.b, #8 1175; CHECK-NEXT: sunpklo z19.d, z0.s 1176; CHECK-NEXT: sunpklo z5.d, z5.s 1177; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 1178; CHECK-NEXT: sunpklo z2.s, z2.h 1179; CHECK-NEXT: sunpklo z18.d, z6.s 1180; CHECK-NEXT: ext z6.b, z6.b, z6.b, #8 1181; CHECK-NEXT: sunpklo z3.s, z3.h 1182; CHECK-NEXT: stp q16, q4, [x1, #128] 1183; CHECK-NEXT: mov z16.d, z7.d 1184; CHECK-NEXT: sunpklo z0.d, z0.s 1185; CHECK-NEXT: stp q17, q5, [x1] 1186; CHECK-NEXT: sunpklo z5.d, z7.s 1187; CHECK-NEXT: sunpklo z4.d, z6.s 1188; CHECK-NEXT: mov z6.d, z1.d 1189; CHECK-NEXT: ext z16.b, z16.b, z7.b, #8 1190; CHECK-NEXT: mov z7.d, z2.d 1191; CHECK-NEXT: stp q19, q0, [x1, #160] 1192; CHECK-NEXT: sunpklo z0.d, z2.s 1193; CHECK-NEXT: ext z6.b, z6.b, z1.b, #8 1194; CHECK-NEXT: sunpklo z1.d, z1.s 1195; CHECK-NEXT: stp q18, q4, [x1, #192] 1196; CHECK-NEXT: mov z4.d, z3.d 1197; CHECK-NEXT: ext z7.b, z7.b, z2.b, #8 1198; CHECK-NEXT: sunpklo z16.d, z16.s 1199; CHECK-NEXT: sunpklo z6.d, z6.s 1200; CHECK-NEXT: ext z4.b, z4.b, z3.b, #8 1201; CHECK-NEXT: sunpklo z2.d, z7.s 1202; CHECK-NEXT: sunpklo z3.d, z3.s 1203; CHECK-NEXT: stp q5, q16, [x1, #64] 1204; CHECK-NEXT: stp q1, q6, [x1, #32] 1205; CHECK-NEXT: sunpklo z1.d, z4.s 1206; CHECK-NEXT: stp q0, q2, [x1, #224] 1207; CHECK-NEXT: stp q3, q1, [x1, #96] 1208; CHECK-NEXT: ret 1209; 1210; NONEON-NOSVE-LABEL: sext_v32i8_v32i64: 1211; NONEON-NOSVE: // %bb.0: 1212; NONEON-NOSVE-NEXT: stp x29, x30, [sp, #-96]! // 16-byte Folded Spill 1213; NONEON-NOSVE-NEXT: stp x28, x27, [sp, #16] // 16-byte Folded Spill 1214; NONEON-NOSVE-NEXT: stp x26, x25, [sp, #32] // 16-byte Folded Spill 1215; NONEON-NOSVE-NEXT: stp x24, x23, [sp, #48] // 16-byte Folded Spill 1216; NONEON-NOSVE-NEXT: stp x22, x21, [sp, #64] // 16-byte Folded Spill 1217; NONEON-NOSVE-NEXT: stp x20, x19, [sp, #80] // 16-byte Folded Spill 1218; NONEON-NOSVE-NEXT: sub sp, sp, #752 1219; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 848 1220; NONEON-NOSVE-NEXT: .cfi_offset w19, -8 1221; NONEON-NOSVE-NEXT: .cfi_offset w20, -16 1222; NONEON-NOSVE-NEXT: .cfi_offset w21, -24 1223; NONEON-NOSVE-NEXT: .cfi_offset w22, -32 1224; NONEON-NOSVE-NEXT: .cfi_offset w23, -40 1225; NONEON-NOSVE-NEXT: .cfi_offset w24, -48 1226; NONEON-NOSVE-NEXT: .cfi_offset w25, -56 1227; NONEON-NOSVE-NEXT: .cfi_offset w26, -64 1228; NONEON-NOSVE-NEXT: .cfi_offset w27, -72 1229; NONEON-NOSVE-NEXT: .cfi_offset w28, -80 1230; NONEON-NOSVE-NEXT: .cfi_offset w30, -88 1231; NONEON-NOSVE-NEXT: .cfi_offset w29, -96 1232; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 1233; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #16] 1234; NONEON-NOSVE-NEXT: ldrb w9, [sp, #40] 1235; NONEON-NOSVE-NEXT: ldrb w8, [sp, #41] 1236; NONEON-NOSVE-NEXT: ldrb w29, [sp, #18] 1237; NONEON-NOSVE-NEXT: ldrb w27, [sp, #16] 1238; NONEON-NOSVE-NEXT: ldrb w25, [sp, #30] 1239; NONEON-NOSVE-NEXT: ldrb w23, [sp, #28] 1240; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #8] // 8-byte Folded Spill 1241; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20] 1242; NONEON-NOSVE-NEXT: ldrb w21, [sp, #26] 1243; NONEON-NOSVE-NEXT: ldrb w19, [sp, #24] 1244; NONEON-NOSVE-NEXT: ldrb w9, [sp, #19] 1245; NONEON-NOSVE-NEXT: ldrb w6, [sp, #38] 1246; NONEON-NOSVE-NEXT: add w8, w8, w8 1247; NONEON-NOSVE-NEXT: ldrb w28, [sp, #17] 1248; NONEON-NOSVE-NEXT: ldrb w16, [sp, #22] 1249; NONEON-NOSVE-NEXT: strb w8, [sp, #60] 1250; NONEON-NOSVE-NEXT: add w8, w29, w29 1251; NONEON-NOSVE-NEXT: ldrb w4, [sp, #36] 1252; NONEON-NOSVE-NEXT: strb w8, [sp, #58] 1253; NONEON-NOSVE-NEXT: add w8, w27, w27 1254; NONEON-NOSVE-NEXT: ldrb w26, [sp, #31] 1255; NONEON-NOSVE-NEXT: strb w8, [sp, #56] 1256; NONEON-NOSVE-NEXT: add w8, w25, w25 1257; NONEON-NOSVE-NEXT: add w9, w9, w9 1258; NONEON-NOSVE-NEXT: strb w8, [sp, #54] 1259; NONEON-NOSVE-NEXT: add w8, w23, w23 1260; NONEON-NOSVE-NEXT: ldrb w2, [sp, #34] 1261; NONEON-NOSVE-NEXT: strb w8, [sp, #52] 1262; NONEON-NOSVE-NEXT: add w8, w21, w21 1263; NONEON-NOSVE-NEXT: ldrb w24, [sp, #29] 1264; NONEON-NOSVE-NEXT: strb w8, [sp, #50] 1265; NONEON-NOSVE-NEXT: add w8, w19, w19 1266; NONEON-NOSVE-NEXT: ldrb w17, [sp, #23] 1267; NONEON-NOSVE-NEXT: strb w9, [sp, #59] 1268; NONEON-NOSVE-NEXT: add w9, w28, w28 1269; NONEON-NOSVE-NEXT: add w18, w16, w16 1270; NONEON-NOSVE-NEXT: strb w8, [sp, #48] 1271; NONEON-NOSVE-NEXT: add w8, w6, w6 1272; NONEON-NOSVE-NEXT: ldrb w16, [sp, #32] 1273; NONEON-NOSVE-NEXT: ldrb w22, [sp, #27] 1274; NONEON-NOSVE-NEXT: strb w9, [sp, #57] 1275; NONEON-NOSVE-NEXT: add w9, w26, w26 1276; NONEON-NOSVE-NEXT: strb w8, [sp, #78] 1277; NONEON-NOSVE-NEXT: add w8, w4, w4 1278; NONEON-NOSVE-NEXT: ldrb w14, [sp, #46] 1279; NONEON-NOSVE-NEXT: ldrb w20, [sp, #25] 1280; NONEON-NOSVE-NEXT: ldrb w30, [sp, #21] 1281; NONEON-NOSVE-NEXT: strb w9, [sp, #55] 1282; NONEON-NOSVE-NEXT: add w9, w24, w24 1283; NONEON-NOSVE-NEXT: strb w8, [sp, #76] 1284; NONEON-NOSVE-NEXT: add w8, w2, w2 1285; NONEON-NOSVE-NEXT: ldrb w12, [sp, #44] 1286; NONEON-NOSVE-NEXT: add w17, w17, w17 1287; NONEON-NOSVE-NEXT: strb w9, [sp, #53] 1288; NONEON-NOSVE-NEXT: add w9, w22, w22 1289; NONEON-NOSVE-NEXT: strb w8, [sp, #74] 1290; NONEON-NOSVE-NEXT: add w8, w16, w16 1291; NONEON-NOSVE-NEXT: ldrb w10, [sp, #42] 1292; NONEON-NOSVE-NEXT: strb w17, [sp, #63] 1293; NONEON-NOSVE-NEXT: add w17, w30, w30 1294; NONEON-NOSVE-NEXT: strb w9, [sp, #51] 1295; NONEON-NOSVE-NEXT: add w9, w20, w20 1296; NONEON-NOSVE-NEXT: ldrb w7, [sp, #39] 1297; NONEON-NOSVE-NEXT: strb w8, [sp, #72] 1298; NONEON-NOSVE-NEXT: add w8, w14, w14 1299; NONEON-NOSVE-NEXT: ldrb w5, [sp, #37] 1300; NONEON-NOSVE-NEXT: strb w18, [sp, #62] 1301; NONEON-NOSVE-NEXT: ldrb w3, [sp, #35] 1302; NONEON-NOSVE-NEXT: ldrb w0, [sp, #33] 1303; NONEON-NOSVE-NEXT: strb w17, [sp, #61] 1304; NONEON-NOSVE-NEXT: ldrb w15, [sp, #47] 1305; NONEON-NOSVE-NEXT: ldrb w13, [sp, #45] 1306; NONEON-NOSVE-NEXT: strb w9, [sp, #49] 1307; NONEON-NOSVE-NEXT: add w9, w7, w7 1308; NONEON-NOSVE-NEXT: ldrb w11, [sp, #43] 1309; NONEON-NOSVE-NEXT: strb w8, [sp, #70] 1310; NONEON-NOSVE-NEXT: add w8, w12, w12 1311; NONEON-NOSVE-NEXT: strb w8, [sp, #68] 1312; NONEON-NOSVE-NEXT: add w8, w10, w10 1313; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #48] 1314; NONEON-NOSVE-NEXT: strb w8, [sp, #66] 1315; NONEON-NOSVE-NEXT: ldr w8, [sp, #12] // 4-byte Folded Reload 1316; NONEON-NOSVE-NEXT: strb w9, [sp, #79] 1317; NONEON-NOSVE-NEXT: add w9, w5, w5 1318; NONEON-NOSVE-NEXT: strb w9, [sp, #77] 1319; NONEON-NOSVE-NEXT: add w9, w3, w3 1320; NONEON-NOSVE-NEXT: add w8, w8, w8 1321; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #80] 1322; NONEON-NOSVE-NEXT: strb w8, [sp, #64] 1323; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #91] 1324; NONEON-NOSVE-NEXT: strb w9, [sp, #75] 1325; NONEON-NOSVE-NEXT: add w9, w0, w0 1326; NONEON-NOSVE-NEXT: strh w8, [sp, #134] 1327; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #90] 1328; NONEON-NOSVE-NEXT: strb w9, [sp, #73] 1329; NONEON-NOSVE-NEXT: add w9, w15, w15 1330; NONEON-NOSVE-NEXT: strh w8, [sp, #132] 1331; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #89] 1332; NONEON-NOSVE-NEXT: strb w9, [sp, #71] 1333; NONEON-NOSVE-NEXT: add w9, w13, w13 1334; NONEON-NOSVE-NEXT: strh w8, [sp, #130] 1335; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #88] 1336; NONEON-NOSVE-NEXT: strb w9, [sp, #69] 1337; NONEON-NOSVE-NEXT: add w9, w11, w11 1338; NONEON-NOSVE-NEXT: strh w8, [sp, #128] 1339; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #95] 1340; NONEON-NOSVE-NEXT: strb w9, [sp, #67] 1341; NONEON-NOSVE-NEXT: ldr w9, [sp, #8] // 4-byte Folded Reload 1342; NONEON-NOSVE-NEXT: strh w8, [sp, #142] 1343; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #94] 1344; NONEON-NOSVE-NEXT: add w9, w9, w9 1345; NONEON-NOSVE-NEXT: strh w8, [sp, #140] 1346; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #93] 1347; NONEON-NOSVE-NEXT: strb w9, [sp, #65] 1348; NONEON-NOSVE-NEXT: strh w8, [sp, #138] 1349; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #92] 1350; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #64] 1351; NONEON-NOSVE-NEXT: strh w8, [sp, #136] 1352; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #83] 1353; NONEON-NOSVE-NEXT: strh w8, [sp, #118] 1354; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #82] 1355; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #96] 1356; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #128] 1357; NONEON-NOSVE-NEXT: strh w8, [sp, #116] 1358; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #81] 1359; NONEON-NOSVE-NEXT: strh w8, [sp, #114] 1360; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #80] 1361; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #192] 1362; NONEON-NOSVE-NEXT: strh w8, [sp, #112] 1363; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #87] 1364; NONEON-NOSVE-NEXT: strh w8, [sp, #126] 1365; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #86] 1366; NONEON-NOSVE-NEXT: strh w8, [sp, #124] 1367; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #85] 1368; NONEON-NOSVE-NEXT: strh w8, [sp, #122] 1369; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #84] 1370; NONEON-NOSVE-NEXT: strh w8, [sp, #120] 1371; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #107] 1372; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #112] 1373; NONEON-NOSVE-NEXT: strh w8, [sp, #166] 1374; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #106] 1375; NONEON-NOSVE-NEXT: strh w8, [sp, #164] 1376; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #105] 1377; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #176] 1378; NONEON-NOSVE-NEXT: strh w8, [sp, #162] 1379; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #104] 1380; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #178] 1381; NONEON-NOSVE-NEXT: strh w8, [sp, #160] 1382; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #111] 1383; NONEON-NOSVE-NEXT: strh w8, [sp, #174] 1384; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #110] 1385; NONEON-NOSVE-NEXT: strh w8, [sp, #172] 1386; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #109] 1387; NONEON-NOSVE-NEXT: strh w8, [sp, #170] 1388; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #108] 1389; NONEON-NOSVE-NEXT: strh w8, [sp, #168] 1390; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #99] 1391; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #160] 1392; NONEON-NOSVE-NEXT: strh w8, [sp, #150] 1393; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #98] 1394; NONEON-NOSVE-NEXT: strh w8, [sp, #148] 1395; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #97] 1396; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #224] 1397; NONEON-NOSVE-NEXT: strh w8, [sp, #146] 1398; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #96] 1399; NONEON-NOSVE-NEXT: strh w8, [sp, #144] 1400; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #103] 1401; NONEON-NOSVE-NEXT: strh w8, [sp, #158] 1402; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #102] 1403; NONEON-NOSVE-NEXT: strh w8, [sp, #156] 1404; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #101] 1405; NONEON-NOSVE-NEXT: strh w8, [sp, #154] 1406; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #100] 1407; NONEON-NOSVE-NEXT: strh w8, [sp, #152] 1408; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #194] 1409; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #144] 1410; NONEON-NOSVE-NEXT: str w8, [sp, #276] 1411; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #192] 1412; NONEON-NOSVE-NEXT: str w8, [sp, #272] 1413; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #198] 1414; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #208] 1415; NONEON-NOSVE-NEXT: str w8, [sp, #284] 1416; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #196] 1417; NONEON-NOSVE-NEXT: str w8, [sp, #280] 1418; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #202] 1419; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #272] 1420; NONEON-NOSVE-NEXT: str w8, [sp, #292] 1421; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #200] 1422; NONEON-NOSVE-NEXT: str w8, [sp, #288] 1423; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #206] 1424; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #400] 1425; NONEON-NOSVE-NEXT: str w8, [sp, #300] 1426; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #204] 1427; NONEON-NOSVE-NEXT: str w8, [sp, #296] 1428; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #176] 1429; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #288] 1430; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #240] 1431; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #182] 1432; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #180] 1433; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #248] 1434; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #186] 1435; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #416] 1436; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #240] 1437; NONEON-NOSVE-NEXT: str w8, [sp, #260] 1438; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #184] 1439; NONEON-NOSVE-NEXT: str w8, [sp, #256] 1440; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #190] 1441; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #368] 1442; NONEON-NOSVE-NEXT: str w8, [sp, #268] 1443; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #188] 1444; NONEON-NOSVE-NEXT: ldrsw x9, [sp, #372] 1445; NONEON-NOSVE-NEXT: str w8, [sp, #264] 1446; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #226] 1447; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #256] 1448; NONEON-NOSVE-NEXT: str w8, [sp, #340] 1449; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #224] 1450; NONEON-NOSVE-NEXT: str w8, [sp, #336] 1451; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #230] 1452; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #384] 1453; NONEON-NOSVE-NEXT: str w8, [sp, #348] 1454; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #228] 1455; NONEON-NOSVE-NEXT: str w8, [sp, #344] 1456; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #234] 1457; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #336] 1458; NONEON-NOSVE-NEXT: str w8, [sp, #356] 1459; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #232] 1460; NONEON-NOSVE-NEXT: str w8, [sp, #352] 1461; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #238] 1462; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #464] 1463; NONEON-NOSVE-NEXT: str w8, [sp, #364] 1464; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #236] 1465; NONEON-NOSVE-NEXT: str w8, [sp, #360] 1466; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #210] 1467; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #352] 1468; NONEON-NOSVE-NEXT: str w8, [sp, #308] 1469; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #208] 1470; NONEON-NOSVE-NEXT: str w8, [sp, #304] 1471; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #214] 1472; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #480] 1473; NONEON-NOSVE-NEXT: str w8, [sp, #316] 1474; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #212] 1475; NONEON-NOSVE-NEXT: str w8, [sp, #312] 1476; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #218] 1477; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #304] 1478; NONEON-NOSVE-NEXT: str w8, [sp, #324] 1479; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #216] 1480; NONEON-NOSVE-NEXT: str w8, [sp, #320] 1481; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #222] 1482; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #432] 1483; NONEON-NOSVE-NEXT: str w8, [sp, #332] 1484; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #220] 1485; NONEON-NOSVE-NEXT: str w8, [sp, #328] 1486; NONEON-NOSVE-NEXT: ldrsw x8, [sp, #404] 1487; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #320] 1488; NONEON-NOSVE-NEXT: str x8, [sp, #568] 1489; NONEON-NOSVE-NEXT: ldrsw x8, [sp, #400] 1490; NONEON-NOSVE-NEXT: str x8, [sp, #560] 1491; NONEON-NOSVE-NEXT: ldrsw x8, [sp, #412] 1492; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #448] 1493; NONEON-NOSVE-NEXT: str x8, [sp, #584] 1494; NONEON-NOSVE-NEXT: ldrsw x8, [sp, #408] 1495; NONEON-NOSVE-NEXT: str x8, [sp, #576] 1496; NONEON-NOSVE-NEXT: ldrsw x8, [sp, #420] 1497; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #560] 1498; NONEON-NOSVE-NEXT: str x8, [sp, #600] 1499; NONEON-NOSVE-NEXT: ldrsw x8, [sp, #416] 1500; NONEON-NOSVE-NEXT: str x8, [sp, #592] 1501; NONEON-NOSVE-NEXT: ldrsw x8, [sp, #428] 1502; NONEON-NOSVE-NEXT: str x8, [sp, #616] 1503; NONEON-NOSVE-NEXT: ldrsw x8, [sp, #424] 1504; NONEON-NOSVE-NEXT: str x8, [sp, #608] 1505; NONEON-NOSVE-NEXT: ldrsw x8, [sp, #368] 1506; NONEON-NOSVE-NEXT: ldp q2, q3, [sp, #592] 1507; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #496] 1508; NONEON-NOSVE-NEXT: ldrsw x8, [sp, #380] 1509; NONEON-NOSVE-NEXT: str x8, [sp, #520] 1510; NONEON-NOSVE-NEXT: ldrsw x8, [sp, #376] 1511; NONEON-NOSVE-NEXT: str x8, [sp, #512] 1512; NONEON-NOSVE-NEXT: ldrsw x8, [sp, #388] 1513; NONEON-NOSVE-NEXT: ldp q4, q5, [sp, #496] 1514; NONEON-NOSVE-NEXT: str x8, [sp, #536] 1515; NONEON-NOSVE-NEXT: ldrsw x8, [sp, #384] 1516; NONEON-NOSVE-NEXT: str x8, [sp, #528] 1517; NONEON-NOSVE-NEXT: ldrsw x8, [sp, #396] 1518; NONEON-NOSVE-NEXT: str x8, [sp, #552] 1519; NONEON-NOSVE-NEXT: ldrsw x8, [sp, #392] 1520; NONEON-NOSVE-NEXT: str x8, [sp, #544] 1521; NONEON-NOSVE-NEXT: ldrsw x8, [sp, #468] 1522; NONEON-NOSVE-NEXT: ldp q6, q7, [sp, #528] 1523; NONEON-NOSVE-NEXT: str x8, [sp, #696] 1524; NONEON-NOSVE-NEXT: ldrsw x8, [sp, #464] 1525; NONEON-NOSVE-NEXT: str x8, [sp, #688] 1526; NONEON-NOSVE-NEXT: ldrsw x8, [sp, #476] 1527; NONEON-NOSVE-NEXT: str x8, [sp, #712] 1528; NONEON-NOSVE-NEXT: ldrsw x8, [sp, #472] 1529; NONEON-NOSVE-NEXT: str x8, [sp, #704] 1530; NONEON-NOSVE-NEXT: ldrsw x8, [sp, #484] 1531; NONEON-NOSVE-NEXT: ldp q16, q17, [sp, #688] 1532; NONEON-NOSVE-NEXT: str x8, [sp, #728] 1533; NONEON-NOSVE-NEXT: ldrsw x8, [sp, #480] 1534; NONEON-NOSVE-NEXT: str x8, [sp, #720] 1535; NONEON-NOSVE-NEXT: ldrsw x8, [sp, #492] 1536; NONEON-NOSVE-NEXT: str x8, [sp, #744] 1537; NONEON-NOSVE-NEXT: ldrsw x8, [sp, #488] 1538; NONEON-NOSVE-NEXT: str x8, [sp, #736] 1539; NONEON-NOSVE-NEXT: ldrsw x8, [sp, #436] 1540; NONEON-NOSVE-NEXT: ldp q19, q20, [sp, #720] 1541; NONEON-NOSVE-NEXT: str x8, [sp, #632] 1542; NONEON-NOSVE-NEXT: ldrsw x8, [sp, #432] 1543; NONEON-NOSVE-NEXT: str x8, [sp, #624] 1544; NONEON-NOSVE-NEXT: ldrsw x8, [sp, #444] 1545; NONEON-NOSVE-NEXT: str x8, [sp, #648] 1546; NONEON-NOSVE-NEXT: ldrsw x8, [sp, #440] 1547; NONEON-NOSVE-NEXT: str x8, [sp, #640] 1548; NONEON-NOSVE-NEXT: ldrsw x8, [sp, #452] 1549; NONEON-NOSVE-NEXT: ldp q22, q23, [sp, #624] 1550; NONEON-NOSVE-NEXT: str x8, [sp, #664] 1551; NONEON-NOSVE-NEXT: ldrsw x8, [sp, #448] 1552; NONEON-NOSVE-NEXT: str x8, [sp, #656] 1553; NONEON-NOSVE-NEXT: ldrsw x8, [sp, #460] 1554; NONEON-NOSVE-NEXT: str x8, [sp, #680] 1555; NONEON-NOSVE-NEXT: ldrsw x8, [sp, #456] 1556; NONEON-NOSVE-NEXT: str x8, [sp, #672] 1557; NONEON-NOSVE-NEXT: ldp q21, q18, [sp, #656] 1558; NONEON-NOSVE-NEXT: stp q0, q1, [x1] 1559; NONEON-NOSVE-NEXT: stp q2, q3, [x1, #32] 1560; NONEON-NOSVE-NEXT: stp q4, q5, [x1, #64] 1561; NONEON-NOSVE-NEXT: stp q6, q7, [x1, #96] 1562; NONEON-NOSVE-NEXT: stp q16, q17, [x1, #128] 1563; NONEON-NOSVE-NEXT: stp q19, q20, [x1, #160] 1564; NONEON-NOSVE-NEXT: stp q22, q23, [x1, #192] 1565; NONEON-NOSVE-NEXT: stp q21, q18, [x1, #224] 1566; NONEON-NOSVE-NEXT: add sp, sp, #752 1567; NONEON-NOSVE-NEXT: ldp x20, x19, [sp, #80] // 16-byte Folded Reload 1568; NONEON-NOSVE-NEXT: ldp x22, x21, [sp, #64] // 16-byte Folded Reload 1569; NONEON-NOSVE-NEXT: ldp x24, x23, [sp, #48] // 16-byte Folded Reload 1570; NONEON-NOSVE-NEXT: ldp x26, x25, [sp, #32] // 16-byte Folded Reload 1571; NONEON-NOSVE-NEXT: ldp x28, x27, [sp, #16] // 16-byte Folded Reload 1572; NONEON-NOSVE-NEXT: ldp x29, x30, [sp], #96 // 16-byte Folded Reload 1573; NONEON-NOSVE-NEXT: ret 1574 %a = load <32 x i8>, ptr %in 1575 %b = add <32 x i8> %a, %a 1576 %c = sext <32 x i8> %b to <32 x i64> 1577 store <32 x i64> %c, ptr %out 1578 ret void 1579} 1580 1581; 1582; sext i16 -> i32 1583; 1584 1585define void @sext_v8i16_v8i32(<8 x i16> %a, ptr %out) { 1586; CHECK-LABEL: sext_v8i16_v8i32: 1587; CHECK: // %bb.0: 1588; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 1589; CHECK-NEXT: sunpklo z1.s, z0.h 1590; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 1591; CHECK-NEXT: sunpklo z0.s, z0.h 1592; CHECK-NEXT: stp q1, q0, [x0] 1593; CHECK-NEXT: ret 1594; 1595; NONEON-NOSVE-LABEL: sext_v8i16_v8i32: 1596; NONEON-NOSVE: // %bb.0: 1597; NONEON-NOSVE-NEXT: str q0, [sp, #-64]! 1598; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 1599; NONEON-NOSVE-NEXT: ldp d1, d0, [sp] 1600; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16] 1601; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #30] 1602; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #28] 1603; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #56] 1604; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #26] 1605; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #24] 1606; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #48] 1607; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #22] 1608; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #20] 1609; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #40] 1610; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #18] 1611; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #16] 1612; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #32] 1613; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 1614; NONEON-NOSVE-NEXT: stp q1, q0, [x0] 1615; NONEON-NOSVE-NEXT: add sp, sp, #64 1616; NONEON-NOSVE-NEXT: ret 1617 %b = sext <8 x i16> %a to <8 x i32> 1618 store <8 x i32>%b, ptr %out 1619 ret void 1620} 1621 1622define void @sext_v16i16_v16i32(ptr %in, ptr %out) { 1623; CHECK-LABEL: sext_v16i16_v16i32: 1624; CHECK: // %bb.0: 1625; CHECK-NEXT: ldp q1, q0, [x0] 1626; CHECK-NEXT: add z0.h, z0.h, z0.h 1627; CHECK-NEXT: add z1.h, z1.h, z1.h 1628; CHECK-NEXT: sunpklo z2.s, z0.h 1629; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 1630; CHECK-NEXT: sunpklo z3.s, z1.h 1631; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 1632; CHECK-NEXT: sunpklo z0.s, z0.h 1633; CHECK-NEXT: sunpklo z1.s, z1.h 1634; CHECK-NEXT: stp q2, q0, [x1, #32] 1635; CHECK-NEXT: stp q3, q1, [x1] 1636; CHECK-NEXT: ret 1637; 1638; NONEON-NOSVE-LABEL: sext_v16i16_v16i32: 1639; NONEON-NOSVE: // %bb.0: 1640; NONEON-NOSVE-NEXT: sub sp, sp, #160 1641; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 160 1642; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 1643; NONEON-NOSVE-NEXT: stp q1, q0, [sp] 1644; NONEON-NOSVE-NEXT: ldrh w13, [sp, #4] 1645; NONEON-NOSVE-NEXT: ldrh w14, [sp, #6] 1646; NONEON-NOSVE-NEXT: ldrh w3, [sp, #2] 1647; NONEON-NOSVE-NEXT: ldrh w5, [sp] 1648; NONEON-NOSVE-NEXT: ldrh w2, [sp, #12] 1649; NONEON-NOSVE-NEXT: ldrh w4, [sp, #14] 1650; NONEON-NOSVE-NEXT: add w13, w13, w13 1651; NONEON-NOSVE-NEXT: add w14, w14, w14 1652; NONEON-NOSVE-NEXT: ldrh w18, [sp, #8] 1653; NONEON-NOSVE-NEXT: ldrh w0, [sp, #10] 1654; NONEON-NOSVE-NEXT: strh w14, [sp, #46] 1655; NONEON-NOSVE-NEXT: add w14, w3, w3 1656; NONEON-NOSVE-NEXT: strh w13, [sp, #44] 1657; NONEON-NOSVE-NEXT: add w13, w5, w5 1658; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24] 1659; NONEON-NOSVE-NEXT: strh w14, [sp, #42] 1660; NONEON-NOSVE-NEXT: add w14, w4, w4 1661; NONEON-NOSVE-NEXT: ldrh w9, [sp, #26] 1662; NONEON-NOSVE-NEXT: strh w13, [sp, #40] 1663; NONEON-NOSVE-NEXT: add w13, w2, w2 1664; NONEON-NOSVE-NEXT: ldrh w17, [sp, #22] 1665; NONEON-NOSVE-NEXT: strh w14, [sp, #38] 1666; NONEON-NOSVE-NEXT: add w14, w0, w0 1667; NONEON-NOSVE-NEXT: add w9, w9, w9 1668; NONEON-NOSVE-NEXT: strh w13, [sp, #36] 1669; NONEON-NOSVE-NEXT: add w13, w18, w18 1670; NONEON-NOSVE-NEXT: add w8, w8, w8 1671; NONEON-NOSVE-NEXT: strh w14, [sp, #34] 1672; NONEON-NOSVE-NEXT: ldrh w10, [sp, #28] 1673; NONEON-NOSVE-NEXT: ldrh w11, [sp, #30] 1674; NONEON-NOSVE-NEXT: strh w13, [sp, #32] 1675; NONEON-NOSVE-NEXT: ldrh w12, [sp, #16] 1676; NONEON-NOSVE-NEXT: ldrh w15, [sp, #18] 1677; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #32] 1678; NONEON-NOSVE-NEXT: ldrh w16, [sp, #20] 1679; NONEON-NOSVE-NEXT: strh w9, [sp, #50] 1680; NONEON-NOSVE-NEXT: add w14, w17, w17 1681; NONEON-NOSVE-NEXT: add w12, w12, w12 1682; NONEON-NOSVE-NEXT: strh w8, [sp, #48] 1683; NONEON-NOSVE-NEXT: add w13, w16, w16 1684; NONEON-NOSVE-NEXT: add w11, w11, w11 1685; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #64] 1686; NONEON-NOSVE-NEXT: add w10, w10, w10 1687; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #78] 1688; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #76] 1689; NONEON-NOSVE-NEXT: strh w14, [sp, #62] 1690; NONEON-NOSVE-NEXT: add w14, w15, w15 1691; NONEON-NOSVE-NEXT: strh w13, [sp, #60] 1692; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #120] 1693; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #74] 1694; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #72] 1695; NONEON-NOSVE-NEXT: strh w14, [sp, #58] 1696; NONEON-NOSVE-NEXT: strh w12, [sp, #56] 1697; NONEON-NOSVE-NEXT: strh w11, [sp, #54] 1698; NONEON-NOSVE-NEXT: strh w10, [sp, #52] 1699; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #48] 1700; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #112] 1701; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #70] 1702; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #68] 1703; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #104] 1704; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #66] 1705; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #64] 1706; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #80] 1707; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #96] 1708; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #94] 1709; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #92] 1710; NONEON-NOSVE-NEXT: ldp q3, q2, [sp, #96] 1711; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #152] 1712; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #90] 1713; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #88] 1714; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #144] 1715; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #86] 1716; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #84] 1717; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #136] 1718; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #82] 1719; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #80] 1720; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #128] 1721; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #128] 1722; NONEON-NOSVE-NEXT: stp q2, q3, [x1] 1723; NONEON-NOSVE-NEXT: stp q1, q0, [x1, #32] 1724; NONEON-NOSVE-NEXT: add sp, sp, #160 1725; NONEON-NOSVE-NEXT: ret 1726 %a = load <16 x i16>, ptr %in 1727 %b = add <16 x i16> %a, %a 1728 %c = sext <16 x i16> %b to <16 x i32> 1729 store <16 x i32> %c, ptr %out 1730 ret void 1731} 1732 1733; 1734; sext i16 -> i64 1735; 1736 1737define void @sext_v4i16_v4i64(<4 x i16> %a, ptr %out) { 1738; CHECK-LABEL: sext_v4i16_v4i64: 1739; CHECK: // %bb.0: 1740; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1741; CHECK-NEXT: sunpklo z0.s, z0.h 1742; CHECK-NEXT: sunpklo z1.d, z0.s 1743; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 1744; CHECK-NEXT: sunpklo z0.d, z0.s 1745; CHECK-NEXT: stp q1, q0, [x0] 1746; CHECK-NEXT: ret 1747; 1748; NONEON-NOSVE-LABEL: sext_v4i16_v4i64: 1749; NONEON-NOSVE: // %bb.0: 1750; NONEON-NOSVE-NEXT: sub sp, sp, #80 1751; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 80 1752; NONEON-NOSVE-NEXT: str d0, [sp, #8] 1753; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #10] 1754; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #8] 1755; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #24] 1756; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #14] 1757; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #12] 1758; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #16] 1759; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #16] 1760; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #32] 1761; NONEON-NOSVE-NEXT: ldpsw x8, x9, [sp, #40] 1762; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #64] 1763; NONEON-NOSVE-NEXT: ldpsw x8, x9, [sp, #32] 1764; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #48] 1765; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #48] 1766; NONEON-NOSVE-NEXT: stp q1, q0, [x0] 1767; NONEON-NOSVE-NEXT: add sp, sp, #80 1768; NONEON-NOSVE-NEXT: ret 1769 %b = sext <4 x i16> %a to <4 x i64> 1770 store <4 x i64>%b, ptr %out 1771 ret void 1772} 1773 1774define void @sext_v8i16_v8i64(<8 x i16> %a, ptr %out) { 1775; CHECK-LABEL: sext_v8i16_v8i64: 1776; CHECK: // %bb.0: 1777; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 1778; CHECK-NEXT: sunpklo z1.s, z0.h 1779; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 1780; CHECK-NEXT: sunpklo z0.s, z0.h 1781; CHECK-NEXT: sunpklo z2.d, z1.s 1782; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 1783; CHECK-NEXT: sunpklo z1.d, z1.s 1784; CHECK-NEXT: sunpklo z3.d, z0.s 1785; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 1786; CHECK-NEXT: sunpklo z0.d, z0.s 1787; CHECK-NEXT: stp q2, q1, [x0] 1788; CHECK-NEXT: stp q3, q0, [x0, #32] 1789; CHECK-NEXT: ret 1790; 1791; NONEON-NOSVE-LABEL: sext_v8i16_v8i64: 1792; NONEON-NOSVE: // %bb.0: 1793; NONEON-NOSVE-NEXT: str q0, [sp, #-160]! 1794; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 160 1795; NONEON-NOSVE-NEXT: ldp d1, d0, [sp] 1796; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16] 1797; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #26] 1798; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #24] 1799; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #56] 1800; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #30] 1801; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #28] 1802; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #48] 1803; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #18] 1804; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #16] 1805; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #48] 1806; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #40] 1807; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #22] 1808; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #20] 1809; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #32] 1810; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #80] 1811; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #32] 1812; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #64] 1813; NONEON-NOSVE-NEXT: ldpsw x8, x9, [sp, #88] 1814; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #144] 1815; NONEON-NOSVE-NEXT: ldpsw x8, x9, [sp, #80] 1816; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #128] 1817; NONEON-NOSVE-NEXT: ldpsw x8, x9, [sp, #72] 1818; NONEON-NOSVE-NEXT: ldp q3, q2, [sp, #128] 1819; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #112] 1820; NONEON-NOSVE-NEXT: ldpsw x8, x9, [sp, #64] 1821; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #96] 1822; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #96] 1823; NONEON-NOSVE-NEXT: stp q2, q3, [x0] 1824; NONEON-NOSVE-NEXT: stp q1, q0, [x0, #32] 1825; NONEON-NOSVE-NEXT: add sp, sp, #160 1826; NONEON-NOSVE-NEXT: ret 1827 %b = sext <8 x i16> %a to <8 x i64> 1828 store <8 x i64>%b, ptr %out 1829 ret void 1830} 1831 1832define void @sext_v16i16_v16i64(ptr %in, ptr %out) { 1833; CHECK-LABEL: sext_v16i16_v16i64: 1834; CHECK: // %bb.0: 1835; CHECK-NEXT: ldp q1, q0, [x0] 1836; CHECK-NEXT: add z0.h, z0.h, z0.h 1837; CHECK-NEXT: add z1.h, z1.h, z1.h 1838; CHECK-NEXT: sunpklo z2.s, z0.h 1839; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 1840; CHECK-NEXT: sunpklo z3.s, z1.h 1841; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 1842; CHECK-NEXT: sunpklo z0.s, z0.h 1843; CHECK-NEXT: sunpklo z1.s, z1.h 1844; CHECK-NEXT: sunpklo z4.d, z2.s 1845; CHECK-NEXT: ext z2.b, z2.b, z2.b, #8 1846; CHECK-NEXT: sunpklo z5.d, z3.s 1847; CHECK-NEXT: ext z3.b, z3.b, z3.b, #8 1848; CHECK-NEXT: sunpklo z6.d, z0.s 1849; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 1850; CHECK-NEXT: sunpklo z2.d, z2.s 1851; CHECK-NEXT: sunpklo z7.d, z1.s 1852; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 1853; CHECK-NEXT: sunpklo z3.d, z3.s 1854; CHECK-NEXT: sunpklo z0.d, z0.s 1855; CHECK-NEXT: sunpklo z1.d, z1.s 1856; CHECK-NEXT: stp q4, q2, [x1, #64] 1857; CHECK-NEXT: stp q5, q3, [x1] 1858; CHECK-NEXT: stp q6, q0, [x1, #96] 1859; CHECK-NEXT: stp q7, q1, [x1, #32] 1860; CHECK-NEXT: ret 1861; 1862; NONEON-NOSVE-LABEL: sext_v16i16_v16i64: 1863; NONEON-NOSVE: // %bb.0: 1864; NONEON-NOSVE-NEXT: sub sp, sp, #368 1865; NONEON-NOSVE-NEXT: str x29, [sp, #352] // 8-byte Folded Spill 1866; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 368 1867; NONEON-NOSVE-NEXT: .cfi_offset w29, -16 1868; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 1869; NONEON-NOSVE-NEXT: ldr x29, [sp, #352] // 8-byte Folded Reload 1870; NONEON-NOSVE-NEXT: stp q1, q0, [sp] 1871; NONEON-NOSVE-NEXT: ldrh w13, [sp, #4] 1872; NONEON-NOSVE-NEXT: ldrh w14, [sp, #6] 1873; NONEON-NOSVE-NEXT: ldrh w3, [sp, #2] 1874; NONEON-NOSVE-NEXT: ldrh w5, [sp] 1875; NONEON-NOSVE-NEXT: ldrh w2, [sp, #12] 1876; NONEON-NOSVE-NEXT: ldrh w4, [sp, #14] 1877; NONEON-NOSVE-NEXT: add w13, w13, w13 1878; NONEON-NOSVE-NEXT: add w14, w14, w14 1879; NONEON-NOSVE-NEXT: ldrh w18, [sp, #8] 1880; NONEON-NOSVE-NEXT: ldrh w0, [sp, #10] 1881; NONEON-NOSVE-NEXT: strh w14, [sp, #54] 1882; NONEON-NOSVE-NEXT: add w14, w3, w3 1883; NONEON-NOSVE-NEXT: strh w13, [sp, #52] 1884; NONEON-NOSVE-NEXT: add w13, w5, w5 1885; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24] 1886; NONEON-NOSVE-NEXT: strh w14, [sp, #50] 1887; NONEON-NOSVE-NEXT: add w14, w4, w4 1888; NONEON-NOSVE-NEXT: ldrh w9, [sp, #26] 1889; NONEON-NOSVE-NEXT: strh w13, [sp, #48] 1890; NONEON-NOSVE-NEXT: add w13, w2, w2 1891; NONEON-NOSVE-NEXT: ldrh w17, [sp, #22] 1892; NONEON-NOSVE-NEXT: strh w14, [sp, #46] 1893; NONEON-NOSVE-NEXT: add w14, w0, w0 1894; NONEON-NOSVE-NEXT: add w9, w9, w9 1895; NONEON-NOSVE-NEXT: strh w13, [sp, #44] 1896; NONEON-NOSVE-NEXT: add w13, w18, w18 1897; NONEON-NOSVE-NEXT: add w8, w8, w8 1898; NONEON-NOSVE-NEXT: strh w14, [sp, #42] 1899; NONEON-NOSVE-NEXT: ldrh w10, [sp, #28] 1900; NONEON-NOSVE-NEXT: ldrh w11, [sp, #30] 1901; NONEON-NOSVE-NEXT: strh w13, [sp, #40] 1902; NONEON-NOSVE-NEXT: ldrh w12, [sp, #16] 1903; NONEON-NOSVE-NEXT: ldrh w15, [sp, #18] 1904; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #40] 1905; NONEON-NOSVE-NEXT: ldrh w16, [sp, #20] 1906; NONEON-NOSVE-NEXT: strh w9, [sp, #58] 1907; NONEON-NOSVE-NEXT: add w14, w17, w17 1908; NONEON-NOSVE-NEXT: add w12, w12, w12 1909; NONEON-NOSVE-NEXT: strh w8, [sp, #56] 1910; NONEON-NOSVE-NEXT: add w13, w16, w16 1911; NONEON-NOSVE-NEXT: add w11, w11, w11 1912; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #72] 1913; NONEON-NOSVE-NEXT: add w10, w10, w10 1914; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #82] 1915; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #80] 1916; NONEON-NOSVE-NEXT: strh w14, [sp, #70] 1917; NONEON-NOSVE-NEXT: add w14, w15, w15 1918; NONEON-NOSVE-NEXT: strh w13, [sp, #68] 1919; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #120] 1920; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #86] 1921; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #84] 1922; NONEON-NOSVE-NEXT: strh w14, [sp, #66] 1923; NONEON-NOSVE-NEXT: strh w12, [sp, #64] 1924; NONEON-NOSVE-NEXT: strh w11, [sp, #62] 1925; NONEON-NOSVE-NEXT: strh w10, [sp, #60] 1926; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #56] 1927; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #128] 1928; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #74] 1929; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #72] 1930; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #104] 1931; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #78] 1932; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #76] 1933; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #88] 1934; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #120] 1935; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #112] 1936; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #98] 1937; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #96] 1938; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #152] 1939; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #102] 1940; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #100] 1941; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #184] 1942; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #104] 1943; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #160] 1944; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #90] 1945; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #88] 1946; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #136] 1947; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #94] 1948; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #92] 1949; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #168] 1950; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #152] 1951; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #144] 1952; NONEON-NOSVE-NEXT: str d0, [sp, #360] 1953; NONEON-NOSVE-NEXT: ldp d2, d0, [sp, #136] 1954; NONEON-NOSVE-NEXT: str d2, [sp, #200] 1955; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #208] 1956; NONEON-NOSVE-NEXT: ldpsw x8, x9, [sp, #184] 1957; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #256] 1958; NONEON-NOSVE-NEXT: ldpsw x8, x9, [sp, #192] 1959; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #272] 1960; NONEON-NOSVE-NEXT: ldpsw x8, x9, [sp, #168] 1961; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #256] 1962; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #224] 1963; NONEON-NOSVE-NEXT: ldpsw x8, x9, [sp, #176] 1964; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #240] 1965; NONEON-NOSVE-NEXT: ldpsw x8, x9, [sp, #216] 1966; NONEON-NOSVE-NEXT: ldp q3, q4, [sp, #224] 1967; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #320] 1968; NONEON-NOSVE-NEXT: ldrsw x9, [sp, #364] 1969; NONEON-NOSVE-NEXT: ldrsw x8, [sp, #360] 1970; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #336] 1971; NONEON-NOSVE-NEXT: ldpsw x8, x9, [sp, #200] 1972; NONEON-NOSVE-NEXT: ldp q6, q7, [sp, #320] 1973; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #288] 1974; NONEON-NOSVE-NEXT: ldpsw x8, x9, [sp, #208] 1975; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #304] 1976; NONEON-NOSVE-NEXT: ldp q5, q2, [sp, #288] 1977; NONEON-NOSVE-NEXT: stp q0, q1, [x1] 1978; NONEON-NOSVE-NEXT: stp q3, q4, [x1, #32] 1979; NONEON-NOSVE-NEXT: stp q6, q7, [x1, #64] 1980; NONEON-NOSVE-NEXT: stp q5, q2, [x1, #96] 1981; NONEON-NOSVE-NEXT: add sp, sp, #368 1982; NONEON-NOSVE-NEXT: ret 1983 %a = load <16 x i16>, ptr %in 1984 %b = add <16 x i16> %a, %a 1985 %c = sext <16 x i16> %b to <16 x i64> 1986 store <16 x i64> %c, ptr %out 1987 ret void 1988} 1989 1990; 1991; sext i32 -> i64 1992; 1993 1994define void @sext_v4i32_v4i64(<4 x i32> %a, ptr %out) { 1995; CHECK-LABEL: sext_v4i32_v4i64: 1996; CHECK: // %bb.0: 1997; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 1998; CHECK-NEXT: sunpklo z1.d, z0.s 1999; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 2000; CHECK-NEXT: sunpklo z0.d, z0.s 2001; CHECK-NEXT: stp q1, q0, [x0] 2002; CHECK-NEXT: ret 2003; 2004; NONEON-NOSVE-LABEL: sext_v4i32_v4i64: 2005; NONEON-NOSVE: // %bb.0: 2006; NONEON-NOSVE-NEXT: str q0, [sp, #-64]! 2007; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 2008; NONEON-NOSVE-NEXT: ldp d1, d0, [sp] 2009; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16] 2010; NONEON-NOSVE-NEXT: ldpsw x8, x9, [sp, #24] 2011; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #48] 2012; NONEON-NOSVE-NEXT: ldpsw x8, x9, [sp, #16] 2013; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #32] 2014; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 2015; NONEON-NOSVE-NEXT: stp q1, q0, [x0] 2016; NONEON-NOSVE-NEXT: add sp, sp, #64 2017; NONEON-NOSVE-NEXT: ret 2018 %b = sext <4 x i32> %a to <4 x i64> 2019 store <4 x i64>%b, ptr %out 2020 ret void 2021} 2022 2023define void @sext_v8i32_v8i64(ptr %in, ptr %out) { 2024; CHECK-LABEL: sext_v8i32_v8i64: 2025; CHECK: // %bb.0: 2026; CHECK-NEXT: ldp q1, q0, [x0] 2027; CHECK-NEXT: add z0.s, z0.s, z0.s 2028; CHECK-NEXT: add z1.s, z1.s, z1.s 2029; CHECK-NEXT: sunpklo z2.d, z0.s 2030; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 2031; CHECK-NEXT: sunpklo z3.d, z1.s 2032; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 2033; CHECK-NEXT: sunpklo z0.d, z0.s 2034; CHECK-NEXT: sunpklo z1.d, z1.s 2035; CHECK-NEXT: stp q2, q0, [x1, #32] 2036; CHECK-NEXT: stp q3, q1, [x1] 2037; CHECK-NEXT: ret 2038; 2039; NONEON-NOSVE-LABEL: sext_v8i32_v8i64: 2040; NONEON-NOSVE: // %bb.0: 2041; NONEON-NOSVE-NEXT: sub sp, sp, #160 2042; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 160 2043; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 2044; NONEON-NOSVE-NEXT: stp q1, q0, [sp] 2045; NONEON-NOSVE-NEXT: ldp w8, w9, [sp] 2046; NONEON-NOSVE-NEXT: ldp w12, w13, [sp, #8] 2047; NONEON-NOSVE-NEXT: ldp w14, w15, [sp, #16] 2048; NONEON-NOSVE-NEXT: add w9, w9, w9 2049; NONEON-NOSVE-NEXT: add w8, w8, w8 2050; NONEON-NOSVE-NEXT: ldp w10, w11, [sp, #24] 2051; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #40] 2052; NONEON-NOSVE-NEXT: add w9, w13, w13 2053; NONEON-NOSVE-NEXT: add w8, w12, w12 2054; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #32] 2055; NONEON-NOSVE-NEXT: add w9, w15, w15 2056; NONEON-NOSVE-NEXT: add w8, w14, w14 2057; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #32] 2058; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #56] 2059; NONEON-NOSVE-NEXT: add w9, w11, w11 2060; NONEON-NOSVE-NEXT: add w8, w10, w10 2061; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #48] 2062; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #64] 2063; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #48] 2064; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #80] 2065; NONEON-NOSVE-NEXT: ldpsw x8, x9, [sp, #72] 2066; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #112] 2067; NONEON-NOSVE-NEXT: ldpsw x8, x9, [sp, #64] 2068; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #96] 2069; NONEON-NOSVE-NEXT: ldpsw x8, x9, [sp, #88] 2070; NONEON-NOSVE-NEXT: ldp q3, q2, [sp, #96] 2071; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #144] 2072; NONEON-NOSVE-NEXT: ldpsw x8, x9, [sp, #80] 2073; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #128] 2074; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #128] 2075; NONEON-NOSVE-NEXT: stp q2, q3, [x1] 2076; NONEON-NOSVE-NEXT: stp q1, q0, [x1, #32] 2077; NONEON-NOSVE-NEXT: add sp, sp, #160 2078; NONEON-NOSVE-NEXT: ret 2079 %a = load <8 x i32>, ptr %in 2080 %b = add <8 x i32> %a, %a 2081 %c = sext <8 x i32> %b to <8 x i64> 2082 store <8 x i64> %c, ptr %out 2083 ret void 2084} 2085 2086; 2087; zext i8 -> i16 2088; 2089 2090define void @zext_v16i8_v16i16(<16 x i8> %a, ptr %out) { 2091; CHECK-LABEL: zext_v16i8_v16i16: 2092; CHECK: // %bb.0: 2093; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 2094; CHECK-NEXT: uunpklo z1.h, z0.b 2095; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 2096; CHECK-NEXT: uunpklo z0.h, z0.b 2097; CHECK-NEXT: stp q1, q0, [x0] 2098; CHECK-NEXT: ret 2099; 2100; NONEON-NOSVE-LABEL: zext_v16i8_v16i16: 2101; NONEON-NOSVE: // %bb.0: 2102; NONEON-NOSVE-NEXT: str q0, [sp, #-64]! 2103; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 2104; NONEON-NOSVE-NEXT: ldp d1, d0, [sp] 2105; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16] 2106; NONEON-NOSVE-NEXT: ldrb w8, [sp, #31] 2107; NONEON-NOSVE-NEXT: strh w8, [sp, #62] 2108; NONEON-NOSVE-NEXT: ldrb w8, [sp, #30] 2109; NONEON-NOSVE-NEXT: strh w8, [sp, #60] 2110; NONEON-NOSVE-NEXT: ldrb w8, [sp, #29] 2111; NONEON-NOSVE-NEXT: strh w8, [sp, #58] 2112; NONEON-NOSVE-NEXT: ldrb w8, [sp, #28] 2113; NONEON-NOSVE-NEXT: strh w8, [sp, #56] 2114; NONEON-NOSVE-NEXT: ldrb w8, [sp, #27] 2115; NONEON-NOSVE-NEXT: strh w8, [sp, #54] 2116; NONEON-NOSVE-NEXT: ldrb w8, [sp, #26] 2117; NONEON-NOSVE-NEXT: strh w8, [sp, #52] 2118; NONEON-NOSVE-NEXT: ldrb w8, [sp, #25] 2119; NONEON-NOSVE-NEXT: strh w8, [sp, #50] 2120; NONEON-NOSVE-NEXT: ldrb w8, [sp, #24] 2121; NONEON-NOSVE-NEXT: strh w8, [sp, #48] 2122; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23] 2123; NONEON-NOSVE-NEXT: strh w8, [sp, #46] 2124; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22] 2125; NONEON-NOSVE-NEXT: strh w8, [sp, #44] 2126; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21] 2127; NONEON-NOSVE-NEXT: strh w8, [sp, #42] 2128; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20] 2129; NONEON-NOSVE-NEXT: strh w8, [sp, #40] 2130; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19] 2131; NONEON-NOSVE-NEXT: strh w8, [sp, #38] 2132; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18] 2133; NONEON-NOSVE-NEXT: strh w8, [sp, #36] 2134; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17] 2135; NONEON-NOSVE-NEXT: strh w8, [sp, #34] 2136; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16] 2137; NONEON-NOSVE-NEXT: strh w8, [sp, #32] 2138; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 2139; NONEON-NOSVE-NEXT: stp q1, q0, [x0] 2140; NONEON-NOSVE-NEXT: add sp, sp, #64 2141; NONEON-NOSVE-NEXT: ret 2142 %b = zext <16 x i8> %a to <16 x i16> 2143 store <16 x i16>%b, ptr %out 2144 ret void 2145} 2146 2147; NOTE: Extra 'add' is to prevent the extend being combined with the load. 2148define void @zext_v32i8_v32i16(ptr %in, ptr %out) { 2149; CHECK-LABEL: zext_v32i8_v32i16: 2150; CHECK: // %bb.0: 2151; CHECK-NEXT: ldp q1, q0, [x0] 2152; CHECK-NEXT: add z0.b, z0.b, z0.b 2153; CHECK-NEXT: add z1.b, z1.b, z1.b 2154; CHECK-NEXT: uunpklo z2.h, z0.b 2155; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 2156; CHECK-NEXT: uunpklo z3.h, z1.b 2157; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 2158; CHECK-NEXT: uunpklo z0.h, z0.b 2159; CHECK-NEXT: uunpklo z1.h, z1.b 2160; CHECK-NEXT: stp q2, q0, [x1, #32] 2161; CHECK-NEXT: stp q3, q1, [x1] 2162; CHECK-NEXT: ret 2163; 2164; NONEON-NOSVE-LABEL: zext_v32i8_v32i16: 2165; NONEON-NOSVE: // %bb.0: 2166; NONEON-NOSVE-NEXT: sub sp, sp, #272 2167; NONEON-NOSVE-NEXT: stp x29, x30, [sp, #176] // 16-byte Folded Spill 2168; NONEON-NOSVE-NEXT: stp x28, x27, [sp, #192] // 16-byte Folded Spill 2169; NONEON-NOSVE-NEXT: stp x26, x25, [sp, #208] // 16-byte Folded Spill 2170; NONEON-NOSVE-NEXT: stp x24, x23, [sp, #224] // 16-byte Folded Spill 2171; NONEON-NOSVE-NEXT: stp x22, x21, [sp, #240] // 16-byte Folded Spill 2172; NONEON-NOSVE-NEXT: stp x20, x19, [sp, #256] // 16-byte Folded Spill 2173; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 272 2174; NONEON-NOSVE-NEXT: .cfi_offset w19, -8 2175; NONEON-NOSVE-NEXT: .cfi_offset w20, -16 2176; NONEON-NOSVE-NEXT: .cfi_offset w21, -24 2177; NONEON-NOSVE-NEXT: .cfi_offset w22, -32 2178; NONEON-NOSVE-NEXT: .cfi_offset w23, -40 2179; NONEON-NOSVE-NEXT: .cfi_offset w24, -48 2180; NONEON-NOSVE-NEXT: .cfi_offset w25, -56 2181; NONEON-NOSVE-NEXT: .cfi_offset w26, -64 2182; NONEON-NOSVE-NEXT: .cfi_offset w27, -72 2183; NONEON-NOSVE-NEXT: .cfi_offset w28, -80 2184; NONEON-NOSVE-NEXT: .cfi_offset w30, -88 2185; NONEON-NOSVE-NEXT: .cfi_offset w29, -96 2186; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 2187; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #16] 2188; NONEON-NOSVE-NEXT: ldrb w9, [sp, #40] 2189; NONEON-NOSVE-NEXT: ldrb w8, [sp, #41] 2190; NONEON-NOSVE-NEXT: ldrb w29, [sp, #18] 2191; NONEON-NOSVE-NEXT: ldrb w27, [sp, #16] 2192; NONEON-NOSVE-NEXT: ldrb w25, [sp, #30] 2193; NONEON-NOSVE-NEXT: ldrb w23, [sp, #28] 2194; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #8] // 8-byte Folded Spill 2195; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20] 2196; NONEON-NOSVE-NEXT: ldrb w21, [sp, #26] 2197; NONEON-NOSVE-NEXT: ldrb w19, [sp, #24] 2198; NONEON-NOSVE-NEXT: ldrb w9, [sp, #19] 2199; NONEON-NOSVE-NEXT: ldrb w6, [sp, #38] 2200; NONEON-NOSVE-NEXT: add w8, w8, w8 2201; NONEON-NOSVE-NEXT: ldrb w28, [sp, #17] 2202; NONEON-NOSVE-NEXT: ldrb w16, [sp, #22] 2203; NONEON-NOSVE-NEXT: strb w8, [sp, #60] 2204; NONEON-NOSVE-NEXT: add w8, w29, w29 2205; NONEON-NOSVE-NEXT: ldrb w4, [sp, #36] 2206; NONEON-NOSVE-NEXT: strb w8, [sp, #58] 2207; NONEON-NOSVE-NEXT: add w8, w27, w27 2208; NONEON-NOSVE-NEXT: ldrb w26, [sp, #31] 2209; NONEON-NOSVE-NEXT: strb w8, [sp, #56] 2210; NONEON-NOSVE-NEXT: add w8, w25, w25 2211; NONEON-NOSVE-NEXT: add w9, w9, w9 2212; NONEON-NOSVE-NEXT: strb w8, [sp, #54] 2213; NONEON-NOSVE-NEXT: add w8, w23, w23 2214; NONEON-NOSVE-NEXT: ldrb w2, [sp, #34] 2215; NONEON-NOSVE-NEXT: strb w8, [sp, #52] 2216; NONEON-NOSVE-NEXT: add w8, w21, w21 2217; NONEON-NOSVE-NEXT: ldrb w24, [sp, #29] 2218; NONEON-NOSVE-NEXT: strb w8, [sp, #50] 2219; NONEON-NOSVE-NEXT: add w8, w19, w19 2220; NONEON-NOSVE-NEXT: ldrb w17, [sp, #23] 2221; NONEON-NOSVE-NEXT: strb w9, [sp, #59] 2222; NONEON-NOSVE-NEXT: add w9, w28, w28 2223; NONEON-NOSVE-NEXT: add w18, w16, w16 2224; NONEON-NOSVE-NEXT: strb w8, [sp, #48] 2225; NONEON-NOSVE-NEXT: add w8, w6, w6 2226; NONEON-NOSVE-NEXT: ldrb w16, [sp, #32] 2227; NONEON-NOSVE-NEXT: ldrb w22, [sp, #27] 2228; NONEON-NOSVE-NEXT: strb w9, [sp, #57] 2229; NONEON-NOSVE-NEXT: add w9, w26, w26 2230; NONEON-NOSVE-NEXT: strb w8, [sp, #78] 2231; NONEON-NOSVE-NEXT: add w8, w4, w4 2232; NONEON-NOSVE-NEXT: ldrb w14, [sp, #46] 2233; NONEON-NOSVE-NEXT: ldrb w20, [sp, #25] 2234; NONEON-NOSVE-NEXT: ldrb w30, [sp, #21] 2235; NONEON-NOSVE-NEXT: strb w9, [sp, #55] 2236; NONEON-NOSVE-NEXT: add w9, w24, w24 2237; NONEON-NOSVE-NEXT: strb w8, [sp, #76] 2238; NONEON-NOSVE-NEXT: add w8, w2, w2 2239; NONEON-NOSVE-NEXT: ldrb w12, [sp, #44] 2240; NONEON-NOSVE-NEXT: add w17, w17, w17 2241; NONEON-NOSVE-NEXT: strb w9, [sp, #53] 2242; NONEON-NOSVE-NEXT: add w9, w22, w22 2243; NONEON-NOSVE-NEXT: strb w8, [sp, #74] 2244; NONEON-NOSVE-NEXT: add w8, w16, w16 2245; NONEON-NOSVE-NEXT: ldrb w10, [sp, #42] 2246; NONEON-NOSVE-NEXT: strb w17, [sp, #63] 2247; NONEON-NOSVE-NEXT: add w17, w30, w30 2248; NONEON-NOSVE-NEXT: strb w9, [sp, #51] 2249; NONEON-NOSVE-NEXT: add w9, w20, w20 2250; NONEON-NOSVE-NEXT: ldrb w7, [sp, #39] 2251; NONEON-NOSVE-NEXT: strb w8, [sp, #72] 2252; NONEON-NOSVE-NEXT: add w8, w14, w14 2253; NONEON-NOSVE-NEXT: ldrb w5, [sp, #37] 2254; NONEON-NOSVE-NEXT: strb w18, [sp, #62] 2255; NONEON-NOSVE-NEXT: ldrb w3, [sp, #35] 2256; NONEON-NOSVE-NEXT: ldrb w0, [sp, #33] 2257; NONEON-NOSVE-NEXT: strb w17, [sp, #61] 2258; NONEON-NOSVE-NEXT: ldrb w15, [sp, #47] 2259; NONEON-NOSVE-NEXT: ldrb w13, [sp, #45] 2260; NONEON-NOSVE-NEXT: strb w9, [sp, #49] 2261; NONEON-NOSVE-NEXT: add w9, w7, w7 2262; NONEON-NOSVE-NEXT: ldrb w11, [sp, #43] 2263; NONEON-NOSVE-NEXT: strb w8, [sp, #70] 2264; NONEON-NOSVE-NEXT: add w8, w12, w12 2265; NONEON-NOSVE-NEXT: strb w8, [sp, #68] 2266; NONEON-NOSVE-NEXT: add w8, w10, w10 2267; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #48] 2268; NONEON-NOSVE-NEXT: strb w8, [sp, #66] 2269; NONEON-NOSVE-NEXT: ldr w8, [sp, #12] // 4-byte Folded Reload 2270; NONEON-NOSVE-NEXT: strb w9, [sp, #79] 2271; NONEON-NOSVE-NEXT: add w9, w5, w5 2272; NONEON-NOSVE-NEXT: strb w9, [sp, #77] 2273; NONEON-NOSVE-NEXT: add w9, w3, w3 2274; NONEON-NOSVE-NEXT: add w8, w8, w8 2275; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #80] 2276; NONEON-NOSVE-NEXT: strb w8, [sp, #64] 2277; NONEON-NOSVE-NEXT: ldrb w8, [sp, #95] 2278; NONEON-NOSVE-NEXT: strb w9, [sp, #75] 2279; NONEON-NOSVE-NEXT: add w9, w0, w0 2280; NONEON-NOSVE-NEXT: strh w8, [sp, #142] 2281; NONEON-NOSVE-NEXT: ldrb w8, [sp, #94] 2282; NONEON-NOSVE-NEXT: strb w9, [sp, #73] 2283; NONEON-NOSVE-NEXT: add w9, w15, w15 2284; NONEON-NOSVE-NEXT: strh w8, [sp, #140] 2285; NONEON-NOSVE-NEXT: ldrb w8, [sp, #93] 2286; NONEON-NOSVE-NEXT: strb w9, [sp, #71] 2287; NONEON-NOSVE-NEXT: add w9, w13, w13 2288; NONEON-NOSVE-NEXT: strh w8, [sp, #138] 2289; NONEON-NOSVE-NEXT: ldrb w8, [sp, #92] 2290; NONEON-NOSVE-NEXT: strb w9, [sp, #69] 2291; NONEON-NOSVE-NEXT: add w9, w11, w11 2292; NONEON-NOSVE-NEXT: strh w8, [sp, #136] 2293; NONEON-NOSVE-NEXT: ldrb w8, [sp, #91] 2294; NONEON-NOSVE-NEXT: strb w9, [sp, #67] 2295; NONEON-NOSVE-NEXT: ldr w9, [sp, #8] // 4-byte Folded Reload 2296; NONEON-NOSVE-NEXT: strh w8, [sp, #134] 2297; NONEON-NOSVE-NEXT: ldrb w8, [sp, #90] 2298; NONEON-NOSVE-NEXT: add w9, w9, w9 2299; NONEON-NOSVE-NEXT: ldp x20, x19, [sp, #256] // 16-byte Folded Reload 2300; NONEON-NOSVE-NEXT: strh w8, [sp, #132] 2301; NONEON-NOSVE-NEXT: ldrb w8, [sp, #89] 2302; NONEON-NOSVE-NEXT: strb w9, [sp, #65] 2303; NONEON-NOSVE-NEXT: ldp x22, x21, [sp, #240] // 16-byte Folded Reload 2304; NONEON-NOSVE-NEXT: strh w8, [sp, #130] 2305; NONEON-NOSVE-NEXT: ldrb w8, [sp, #88] 2306; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #64] 2307; NONEON-NOSVE-NEXT: strh w8, [sp, #128] 2308; NONEON-NOSVE-NEXT: ldrb w8, [sp, #87] 2309; NONEON-NOSVE-NEXT: ldp x24, x23, [sp, #224] // 16-byte Folded Reload 2310; NONEON-NOSVE-NEXT: strh w8, [sp, #126] 2311; NONEON-NOSVE-NEXT: ldrb w8, [sp, #86] 2312; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #96] 2313; NONEON-NOSVE-NEXT: ldp x26, x25, [sp, #208] // 16-byte Folded Reload 2314; NONEON-NOSVE-NEXT: strh w8, [sp, #124] 2315; NONEON-NOSVE-NEXT: ldrb w8, [sp, #85] 2316; NONEON-NOSVE-NEXT: ldp x28, x27, [sp, #192] // 16-byte Folded Reload 2317; NONEON-NOSVE-NEXT: strh w8, [sp, #122] 2318; NONEON-NOSVE-NEXT: ldrb w8, [sp, #84] 2319; NONEON-NOSVE-NEXT: ldp x29, x30, [sp, #176] // 16-byte Folded Reload 2320; NONEON-NOSVE-NEXT: strh w8, [sp, #120] 2321; NONEON-NOSVE-NEXT: ldrb w8, [sp, #83] 2322; NONEON-NOSVE-NEXT: strh w8, [sp, #118] 2323; NONEON-NOSVE-NEXT: ldrb w8, [sp, #82] 2324; NONEON-NOSVE-NEXT: strh w8, [sp, #116] 2325; NONEON-NOSVE-NEXT: ldrb w8, [sp, #81] 2326; NONEON-NOSVE-NEXT: strh w8, [sp, #114] 2327; NONEON-NOSVE-NEXT: ldrb w8, [sp, #80] 2328; NONEON-NOSVE-NEXT: strh w8, [sp, #112] 2329; NONEON-NOSVE-NEXT: ldrb w8, [sp, #111] 2330; NONEON-NOSVE-NEXT: ldp q3, q2, [sp, #112] 2331; NONEON-NOSVE-NEXT: strh w8, [sp, #174] 2332; NONEON-NOSVE-NEXT: ldrb w8, [sp, #110] 2333; NONEON-NOSVE-NEXT: strh w8, [sp, #172] 2334; NONEON-NOSVE-NEXT: ldrb w8, [sp, #109] 2335; NONEON-NOSVE-NEXT: strh w8, [sp, #170] 2336; NONEON-NOSVE-NEXT: ldrb w8, [sp, #108] 2337; NONEON-NOSVE-NEXT: strh w8, [sp, #168] 2338; NONEON-NOSVE-NEXT: ldrb w8, [sp, #107] 2339; NONEON-NOSVE-NEXT: strh w8, [sp, #166] 2340; NONEON-NOSVE-NEXT: ldrb w8, [sp, #106] 2341; NONEON-NOSVE-NEXT: strh w8, [sp, #164] 2342; NONEON-NOSVE-NEXT: ldrb w8, [sp, #105] 2343; NONEON-NOSVE-NEXT: strh w8, [sp, #162] 2344; NONEON-NOSVE-NEXT: ldrb w8, [sp, #104] 2345; NONEON-NOSVE-NEXT: strh w8, [sp, #160] 2346; NONEON-NOSVE-NEXT: ldrb w8, [sp, #103] 2347; NONEON-NOSVE-NEXT: strh w8, [sp, #158] 2348; NONEON-NOSVE-NEXT: ldrb w8, [sp, #102] 2349; NONEON-NOSVE-NEXT: strh w8, [sp, #156] 2350; NONEON-NOSVE-NEXT: ldrb w8, [sp, #101] 2351; NONEON-NOSVE-NEXT: strh w8, [sp, #154] 2352; NONEON-NOSVE-NEXT: ldrb w8, [sp, #100] 2353; NONEON-NOSVE-NEXT: strh w8, [sp, #152] 2354; NONEON-NOSVE-NEXT: ldrb w8, [sp, #99] 2355; NONEON-NOSVE-NEXT: strh w8, [sp, #150] 2356; NONEON-NOSVE-NEXT: ldrb w8, [sp, #98] 2357; NONEON-NOSVE-NEXT: strh w8, [sp, #148] 2358; NONEON-NOSVE-NEXT: ldrb w8, [sp, #97] 2359; NONEON-NOSVE-NEXT: strh w8, [sp, #146] 2360; NONEON-NOSVE-NEXT: ldrb w8, [sp, #96] 2361; NONEON-NOSVE-NEXT: strh w8, [sp, #144] 2362; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #144] 2363; NONEON-NOSVE-NEXT: stp q2, q3, [x1] 2364; NONEON-NOSVE-NEXT: stp q1, q0, [x1, #32] 2365; NONEON-NOSVE-NEXT: add sp, sp, #272 2366; NONEON-NOSVE-NEXT: ret 2367 %a = load <32 x i8>, ptr %in 2368 %b = add <32 x i8> %a, %a 2369 %c = zext <32 x i8> %b to <32 x i16> 2370 store <32 x i16> %c, ptr %out 2371 ret void 2372} 2373 2374; 2375; zext i8 -> i32 2376; 2377 2378define void @zext_v8i8_v8i32(<8 x i8> %a, ptr %out) { 2379; CHECK-LABEL: zext_v8i8_v8i32: 2380; CHECK: // %bb.0: 2381; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 2382; CHECK-NEXT: uunpklo z0.h, z0.b 2383; CHECK-NEXT: uunpklo z1.s, z0.h 2384; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 2385; CHECK-NEXT: uunpklo z0.s, z0.h 2386; CHECK-NEXT: stp q1, q0, [x0] 2387; CHECK-NEXT: ret 2388; 2389; NONEON-NOSVE-LABEL: zext_v8i8_v8i32: 2390; NONEON-NOSVE: // %bb.0: 2391; NONEON-NOSVE-NEXT: sub sp, sp, #80 2392; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 80 2393; NONEON-NOSVE-NEXT: str d0, [sp, #8] 2394; NONEON-NOSVE-NEXT: ldrb w8, [sp, #11] 2395; NONEON-NOSVE-NEXT: strh w8, [sp, #30] 2396; NONEON-NOSVE-NEXT: ldrb w8, [sp, #10] 2397; NONEON-NOSVE-NEXT: strh w8, [sp, #28] 2398; NONEON-NOSVE-NEXT: ldrb w8, [sp, #9] 2399; NONEON-NOSVE-NEXT: strh w8, [sp, #26] 2400; NONEON-NOSVE-NEXT: ldrb w8, [sp, #8] 2401; NONEON-NOSVE-NEXT: strh w8, [sp, #24] 2402; NONEON-NOSVE-NEXT: ldrb w8, [sp, #15] 2403; NONEON-NOSVE-NEXT: strh w8, [sp, #22] 2404; NONEON-NOSVE-NEXT: ldrb w8, [sp, #14] 2405; NONEON-NOSVE-NEXT: strh w8, [sp, #20] 2406; NONEON-NOSVE-NEXT: ldrb w8, [sp, #13] 2407; NONEON-NOSVE-NEXT: strh w8, [sp, #18] 2408; NONEON-NOSVE-NEXT: ldrb w8, [sp, #12] 2409; NONEON-NOSVE-NEXT: strh w8, [sp, #16] 2410; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #16] 2411; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #32] 2412; NONEON-NOSVE-NEXT: ldrb w9, [sp, #46] 2413; NONEON-NOSVE-NEXT: ldrb w8, [sp, #44] 2414; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #72] 2415; NONEON-NOSVE-NEXT: ldrb w9, [sp, #42] 2416; NONEON-NOSVE-NEXT: ldrb w8, [sp, #40] 2417; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #64] 2418; NONEON-NOSVE-NEXT: ldrb w9, [sp, #38] 2419; NONEON-NOSVE-NEXT: ldrb w8, [sp, #36] 2420; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #56] 2421; NONEON-NOSVE-NEXT: ldrb w9, [sp, #34] 2422; NONEON-NOSVE-NEXT: ldrb w8, [sp, #32] 2423; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #48] 2424; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #48] 2425; NONEON-NOSVE-NEXT: stp q1, q0, [x0] 2426; NONEON-NOSVE-NEXT: add sp, sp, #80 2427; NONEON-NOSVE-NEXT: ret 2428 %b = zext <8 x i8> %a to <8 x i32> 2429 store <8 x i32>%b, ptr %out 2430 ret void 2431} 2432 2433define void @zext_v16i8_v16i32(<16 x i8> %a, ptr %out) { 2434; CHECK-LABEL: zext_v16i8_v16i32: 2435; CHECK: // %bb.0: 2436; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 2437; CHECK-NEXT: uunpklo z1.h, z0.b 2438; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 2439; CHECK-NEXT: uunpklo z0.h, z0.b 2440; CHECK-NEXT: uunpklo z2.s, z1.h 2441; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 2442; CHECK-NEXT: uunpklo z1.s, z1.h 2443; CHECK-NEXT: uunpklo z3.s, z0.h 2444; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 2445; CHECK-NEXT: uunpklo z0.s, z0.h 2446; CHECK-NEXT: stp q2, q1, [x0] 2447; CHECK-NEXT: stp q3, q0, [x0, #32] 2448; CHECK-NEXT: ret 2449; 2450; NONEON-NOSVE-LABEL: zext_v16i8_v16i32: 2451; NONEON-NOSVE: // %bb.0: 2452; NONEON-NOSVE-NEXT: str q0, [sp, #-160]! 2453; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 160 2454; NONEON-NOSVE-NEXT: ldp d1, d0, [sp] 2455; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16] 2456; NONEON-NOSVE-NEXT: ldrb w8, [sp, #27] 2457; NONEON-NOSVE-NEXT: strh w8, [sp, #62] 2458; NONEON-NOSVE-NEXT: ldrb w8, [sp, #26] 2459; NONEON-NOSVE-NEXT: strh w8, [sp, #60] 2460; NONEON-NOSVE-NEXT: ldrb w8, [sp, #25] 2461; NONEON-NOSVE-NEXT: strh w8, [sp, #58] 2462; NONEON-NOSVE-NEXT: ldrb w8, [sp, #24] 2463; NONEON-NOSVE-NEXT: strh w8, [sp, #56] 2464; NONEON-NOSVE-NEXT: ldrb w8, [sp, #31] 2465; NONEON-NOSVE-NEXT: strh w8, [sp, #54] 2466; NONEON-NOSVE-NEXT: ldrb w8, [sp, #30] 2467; NONEON-NOSVE-NEXT: strh w8, [sp, #52] 2468; NONEON-NOSVE-NEXT: ldrb w8, [sp, #29] 2469; NONEON-NOSVE-NEXT: strh w8, [sp, #50] 2470; NONEON-NOSVE-NEXT: ldrb w8, [sp, #28] 2471; NONEON-NOSVE-NEXT: strh w8, [sp, #48] 2472; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19] 2473; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #48] 2474; NONEON-NOSVE-NEXT: strh w8, [sp, #46] 2475; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18] 2476; NONEON-NOSVE-NEXT: strh w8, [sp, #44] 2477; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17] 2478; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #80] 2479; NONEON-NOSVE-NEXT: strh w8, [sp, #42] 2480; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16] 2481; NONEON-NOSVE-NEXT: ldrb w9, [sp, #94] 2482; NONEON-NOSVE-NEXT: strh w8, [sp, #40] 2483; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23] 2484; NONEON-NOSVE-NEXT: strh w8, [sp, #38] 2485; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22] 2486; NONEON-NOSVE-NEXT: strh w8, [sp, #36] 2487; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21] 2488; NONEON-NOSVE-NEXT: strh w8, [sp, #34] 2489; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20] 2490; NONEON-NOSVE-NEXT: strh w8, [sp, #32] 2491; NONEON-NOSVE-NEXT: ldrb w8, [sp, #92] 2492; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #32] 2493; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #152] 2494; NONEON-NOSVE-NEXT: ldrb w9, [sp, #90] 2495; NONEON-NOSVE-NEXT: ldrb w8, [sp, #88] 2496; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #144] 2497; NONEON-NOSVE-NEXT: ldrb w9, [sp, #86] 2498; NONEON-NOSVE-NEXT: ldrb w8, [sp, #84] 2499; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #64] 2500; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #136] 2501; NONEON-NOSVE-NEXT: ldrb w9, [sp, #82] 2502; NONEON-NOSVE-NEXT: ldrb w8, [sp, #80] 2503; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #128] 2504; NONEON-NOSVE-NEXT: ldrb w9, [sp, #78] 2505; NONEON-NOSVE-NEXT: ldrb w8, [sp, #76] 2506; NONEON-NOSVE-NEXT: ldp q3, q2, [sp, #128] 2507; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #120] 2508; NONEON-NOSVE-NEXT: ldrb w9, [sp, #74] 2509; NONEON-NOSVE-NEXT: ldrb w8, [sp, #72] 2510; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #112] 2511; NONEON-NOSVE-NEXT: ldrb w9, [sp, #70] 2512; NONEON-NOSVE-NEXT: ldrb w8, [sp, #68] 2513; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #104] 2514; NONEON-NOSVE-NEXT: ldrb w9, [sp, #66] 2515; NONEON-NOSVE-NEXT: ldrb w8, [sp, #64] 2516; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #96] 2517; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #96] 2518; NONEON-NOSVE-NEXT: stp q2, q3, [x0] 2519; NONEON-NOSVE-NEXT: stp q1, q0, [x0, #32] 2520; NONEON-NOSVE-NEXT: add sp, sp, #160 2521; NONEON-NOSVE-NEXT: ret 2522 %b = zext <16 x i8> %a to <16 x i32> 2523 store <16 x i32> %b, ptr %out 2524 ret void 2525} 2526 2527define void @zext_v32i8_v32i32(ptr %in, ptr %out) { 2528; CHECK-LABEL: zext_v32i8_v32i32: 2529; CHECK: // %bb.0: 2530; CHECK-NEXT: ldp q1, q0, [x0] 2531; CHECK-NEXT: add z0.b, z0.b, z0.b 2532; CHECK-NEXT: add z1.b, z1.b, z1.b 2533; CHECK-NEXT: uunpklo z2.h, z0.b 2534; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 2535; CHECK-NEXT: uunpklo z3.h, z1.b 2536; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 2537; CHECK-NEXT: uunpklo z0.h, z0.b 2538; CHECK-NEXT: uunpklo z1.h, z1.b 2539; CHECK-NEXT: uunpklo z4.s, z2.h 2540; CHECK-NEXT: ext z2.b, z2.b, z2.b, #8 2541; CHECK-NEXT: uunpklo z5.s, z3.h 2542; CHECK-NEXT: ext z3.b, z3.b, z3.b, #8 2543; CHECK-NEXT: uunpklo z6.s, z0.h 2544; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 2545; CHECK-NEXT: uunpklo z2.s, z2.h 2546; CHECK-NEXT: uunpklo z7.s, z1.h 2547; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 2548; CHECK-NEXT: uunpklo z3.s, z3.h 2549; CHECK-NEXT: uunpklo z0.s, z0.h 2550; CHECK-NEXT: uunpklo z1.s, z1.h 2551; CHECK-NEXT: stp q4, q2, [x1, #64] 2552; CHECK-NEXT: stp q5, q3, [x1] 2553; CHECK-NEXT: stp q6, q0, [x1, #96] 2554; CHECK-NEXT: stp q7, q1, [x1, #32] 2555; CHECK-NEXT: ret 2556; 2557; NONEON-NOSVE-LABEL: zext_v32i8_v32i32: 2558; NONEON-NOSVE: // %bb.0: 2559; NONEON-NOSVE-NEXT: sub sp, sp, #464 2560; NONEON-NOSVE-NEXT: stp x29, x30, [sp, #368] // 16-byte Folded Spill 2561; NONEON-NOSVE-NEXT: stp x28, x27, [sp, #384] // 16-byte Folded Spill 2562; NONEON-NOSVE-NEXT: stp x26, x25, [sp, #400] // 16-byte Folded Spill 2563; NONEON-NOSVE-NEXT: stp x24, x23, [sp, #416] // 16-byte Folded Spill 2564; NONEON-NOSVE-NEXT: stp x22, x21, [sp, #432] // 16-byte Folded Spill 2565; NONEON-NOSVE-NEXT: stp x20, x19, [sp, #448] // 16-byte Folded Spill 2566; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 464 2567; NONEON-NOSVE-NEXT: .cfi_offset w19, -8 2568; NONEON-NOSVE-NEXT: .cfi_offset w20, -16 2569; NONEON-NOSVE-NEXT: .cfi_offset w21, -24 2570; NONEON-NOSVE-NEXT: .cfi_offset w22, -32 2571; NONEON-NOSVE-NEXT: .cfi_offset w23, -40 2572; NONEON-NOSVE-NEXT: .cfi_offset w24, -48 2573; NONEON-NOSVE-NEXT: .cfi_offset w25, -56 2574; NONEON-NOSVE-NEXT: .cfi_offset w26, -64 2575; NONEON-NOSVE-NEXT: .cfi_offset w27, -72 2576; NONEON-NOSVE-NEXT: .cfi_offset w28, -80 2577; NONEON-NOSVE-NEXT: .cfi_offset w30, -88 2578; NONEON-NOSVE-NEXT: .cfi_offset w29, -96 2579; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 2580; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #16] 2581; NONEON-NOSVE-NEXT: ldrb w9, [sp, #40] 2582; NONEON-NOSVE-NEXT: ldrb w8, [sp, #41] 2583; NONEON-NOSVE-NEXT: ldrb w29, [sp, #18] 2584; NONEON-NOSVE-NEXT: ldrb w27, [sp, #16] 2585; NONEON-NOSVE-NEXT: ldrb w25, [sp, #30] 2586; NONEON-NOSVE-NEXT: ldrb w23, [sp, #28] 2587; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #8] // 8-byte Folded Spill 2588; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20] 2589; NONEON-NOSVE-NEXT: ldrb w21, [sp, #26] 2590; NONEON-NOSVE-NEXT: ldrb w19, [sp, #24] 2591; NONEON-NOSVE-NEXT: ldrb w9, [sp, #19] 2592; NONEON-NOSVE-NEXT: ldrb w6, [sp, #38] 2593; NONEON-NOSVE-NEXT: add w8, w8, w8 2594; NONEON-NOSVE-NEXT: ldrb w28, [sp, #17] 2595; NONEON-NOSVE-NEXT: ldrb w16, [sp, #22] 2596; NONEON-NOSVE-NEXT: strb w8, [sp, #60] 2597; NONEON-NOSVE-NEXT: add w8, w29, w29 2598; NONEON-NOSVE-NEXT: ldrb w4, [sp, #36] 2599; NONEON-NOSVE-NEXT: strb w8, [sp, #58] 2600; NONEON-NOSVE-NEXT: add w8, w27, w27 2601; NONEON-NOSVE-NEXT: ldrb w26, [sp, #31] 2602; NONEON-NOSVE-NEXT: strb w8, [sp, #56] 2603; NONEON-NOSVE-NEXT: add w8, w25, w25 2604; NONEON-NOSVE-NEXT: add w9, w9, w9 2605; NONEON-NOSVE-NEXT: strb w8, [sp, #54] 2606; NONEON-NOSVE-NEXT: add w8, w23, w23 2607; NONEON-NOSVE-NEXT: ldrb w2, [sp, #34] 2608; NONEON-NOSVE-NEXT: strb w8, [sp, #52] 2609; NONEON-NOSVE-NEXT: add w8, w21, w21 2610; NONEON-NOSVE-NEXT: ldrb w24, [sp, #29] 2611; NONEON-NOSVE-NEXT: strb w8, [sp, #50] 2612; NONEON-NOSVE-NEXT: add w8, w19, w19 2613; NONEON-NOSVE-NEXT: ldrb w17, [sp, #23] 2614; NONEON-NOSVE-NEXT: strb w9, [sp, #59] 2615; NONEON-NOSVE-NEXT: add w9, w28, w28 2616; NONEON-NOSVE-NEXT: add w18, w16, w16 2617; NONEON-NOSVE-NEXT: strb w8, [sp, #48] 2618; NONEON-NOSVE-NEXT: add w8, w6, w6 2619; NONEON-NOSVE-NEXT: ldrb w16, [sp, #32] 2620; NONEON-NOSVE-NEXT: ldrb w22, [sp, #27] 2621; NONEON-NOSVE-NEXT: strb w9, [sp, #57] 2622; NONEON-NOSVE-NEXT: add w9, w26, w26 2623; NONEON-NOSVE-NEXT: strb w8, [sp, #78] 2624; NONEON-NOSVE-NEXT: add w8, w4, w4 2625; NONEON-NOSVE-NEXT: ldrb w14, [sp, #46] 2626; NONEON-NOSVE-NEXT: ldrb w20, [sp, #25] 2627; NONEON-NOSVE-NEXT: ldrb w30, [sp, #21] 2628; NONEON-NOSVE-NEXT: strb w9, [sp, #55] 2629; NONEON-NOSVE-NEXT: add w9, w24, w24 2630; NONEON-NOSVE-NEXT: strb w8, [sp, #76] 2631; NONEON-NOSVE-NEXT: add w8, w2, w2 2632; NONEON-NOSVE-NEXT: ldrb w12, [sp, #44] 2633; NONEON-NOSVE-NEXT: add w17, w17, w17 2634; NONEON-NOSVE-NEXT: strb w9, [sp, #53] 2635; NONEON-NOSVE-NEXT: add w9, w22, w22 2636; NONEON-NOSVE-NEXT: strb w8, [sp, #74] 2637; NONEON-NOSVE-NEXT: add w8, w16, w16 2638; NONEON-NOSVE-NEXT: ldrb w10, [sp, #42] 2639; NONEON-NOSVE-NEXT: strb w17, [sp, #63] 2640; NONEON-NOSVE-NEXT: add w17, w30, w30 2641; NONEON-NOSVE-NEXT: strb w9, [sp, #51] 2642; NONEON-NOSVE-NEXT: add w9, w20, w20 2643; NONEON-NOSVE-NEXT: ldrb w7, [sp, #39] 2644; NONEON-NOSVE-NEXT: strb w8, [sp, #72] 2645; NONEON-NOSVE-NEXT: add w8, w14, w14 2646; NONEON-NOSVE-NEXT: ldrb w5, [sp, #37] 2647; NONEON-NOSVE-NEXT: strb w18, [sp, #62] 2648; NONEON-NOSVE-NEXT: ldrb w3, [sp, #35] 2649; NONEON-NOSVE-NEXT: ldrb w0, [sp, #33] 2650; NONEON-NOSVE-NEXT: strb w17, [sp, #61] 2651; NONEON-NOSVE-NEXT: ldrb w15, [sp, #47] 2652; NONEON-NOSVE-NEXT: ldrb w13, [sp, #45] 2653; NONEON-NOSVE-NEXT: strb w9, [sp, #49] 2654; NONEON-NOSVE-NEXT: add w9, w7, w7 2655; NONEON-NOSVE-NEXT: ldrb w11, [sp, #43] 2656; NONEON-NOSVE-NEXT: strb w8, [sp, #70] 2657; NONEON-NOSVE-NEXT: add w8, w12, w12 2658; NONEON-NOSVE-NEXT: strb w8, [sp, #68] 2659; NONEON-NOSVE-NEXT: add w8, w10, w10 2660; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #48] 2661; NONEON-NOSVE-NEXT: strb w8, [sp, #66] 2662; NONEON-NOSVE-NEXT: ldr w8, [sp, #12] // 4-byte Folded Reload 2663; NONEON-NOSVE-NEXT: strb w9, [sp, #79] 2664; NONEON-NOSVE-NEXT: add w9, w5, w5 2665; NONEON-NOSVE-NEXT: strb w9, [sp, #77] 2666; NONEON-NOSVE-NEXT: add w9, w3, w3 2667; NONEON-NOSVE-NEXT: add w8, w8, w8 2668; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #80] 2669; NONEON-NOSVE-NEXT: strb w8, [sp, #64] 2670; NONEON-NOSVE-NEXT: ldrb w8, [sp, #91] 2671; NONEON-NOSVE-NEXT: strb w9, [sp, #75] 2672; NONEON-NOSVE-NEXT: add w9, w0, w0 2673; NONEON-NOSVE-NEXT: strh w8, [sp, #134] 2674; NONEON-NOSVE-NEXT: ldrb w8, [sp, #90] 2675; NONEON-NOSVE-NEXT: strb w9, [sp, #73] 2676; NONEON-NOSVE-NEXT: add w9, w15, w15 2677; NONEON-NOSVE-NEXT: strh w8, [sp, #132] 2678; NONEON-NOSVE-NEXT: ldrb w8, [sp, #89] 2679; NONEON-NOSVE-NEXT: strb w9, [sp, #71] 2680; NONEON-NOSVE-NEXT: add w9, w13, w13 2681; NONEON-NOSVE-NEXT: strh w8, [sp, #130] 2682; NONEON-NOSVE-NEXT: ldrb w8, [sp, #88] 2683; NONEON-NOSVE-NEXT: strb w9, [sp, #69] 2684; NONEON-NOSVE-NEXT: add w9, w11, w11 2685; NONEON-NOSVE-NEXT: strh w8, [sp, #128] 2686; NONEON-NOSVE-NEXT: ldrb w8, [sp, #95] 2687; NONEON-NOSVE-NEXT: strb w9, [sp, #67] 2688; NONEON-NOSVE-NEXT: ldr w9, [sp, #8] // 4-byte Folded Reload 2689; NONEON-NOSVE-NEXT: strh w8, [sp, #142] 2690; NONEON-NOSVE-NEXT: ldrb w8, [sp, #94] 2691; NONEON-NOSVE-NEXT: add w9, w9, w9 2692; NONEON-NOSVE-NEXT: ldp x20, x19, [sp, #448] // 16-byte Folded Reload 2693; NONEON-NOSVE-NEXT: strh w8, [sp, #140] 2694; NONEON-NOSVE-NEXT: ldrb w8, [sp, #93] 2695; NONEON-NOSVE-NEXT: strb w9, [sp, #65] 2696; NONEON-NOSVE-NEXT: ldp x22, x21, [sp, #432] // 16-byte Folded Reload 2697; NONEON-NOSVE-NEXT: strh w8, [sp, #138] 2698; NONEON-NOSVE-NEXT: ldrb w8, [sp, #92] 2699; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #64] 2700; NONEON-NOSVE-NEXT: strh w8, [sp, #136] 2701; NONEON-NOSVE-NEXT: ldrb w8, [sp, #83] 2702; NONEON-NOSVE-NEXT: ldp x24, x23, [sp, #416] // 16-byte Folded Reload 2703; NONEON-NOSVE-NEXT: strh w8, [sp, #118] 2704; NONEON-NOSVE-NEXT: ldrb w8, [sp, #82] 2705; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #96] 2706; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #128] 2707; NONEON-NOSVE-NEXT: strh w8, [sp, #116] 2708; NONEON-NOSVE-NEXT: ldrb w8, [sp, #81] 2709; NONEON-NOSVE-NEXT: ldp x26, x25, [sp, #400] // 16-byte Folded Reload 2710; NONEON-NOSVE-NEXT: strh w8, [sp, #114] 2711; NONEON-NOSVE-NEXT: ldrb w8, [sp, #80] 2712; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #192] 2713; NONEON-NOSVE-NEXT: ldp x28, x27, [sp, #384] // 16-byte Folded Reload 2714; NONEON-NOSVE-NEXT: strh w8, [sp, #112] 2715; NONEON-NOSVE-NEXT: ldrb w8, [sp, #87] 2716; NONEON-NOSVE-NEXT: ldp x29, x30, [sp, #368] // 16-byte Folded Reload 2717; NONEON-NOSVE-NEXT: strh w8, [sp, #126] 2718; NONEON-NOSVE-NEXT: ldrb w8, [sp, #86] 2719; NONEON-NOSVE-NEXT: strh w8, [sp, #124] 2720; NONEON-NOSVE-NEXT: ldrb w8, [sp, #85] 2721; NONEON-NOSVE-NEXT: strh w8, [sp, #122] 2722; NONEON-NOSVE-NEXT: ldrb w8, [sp, #84] 2723; NONEON-NOSVE-NEXT: strh w8, [sp, #120] 2724; NONEON-NOSVE-NEXT: ldrb w8, [sp, #107] 2725; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #112] 2726; NONEON-NOSVE-NEXT: strh w8, [sp, #166] 2727; NONEON-NOSVE-NEXT: ldrb w8, [sp, #106] 2728; NONEON-NOSVE-NEXT: strh w8, [sp, #164] 2729; NONEON-NOSVE-NEXT: ldrb w8, [sp, #105] 2730; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #176] 2731; NONEON-NOSVE-NEXT: strh w8, [sp, #162] 2732; NONEON-NOSVE-NEXT: ldrb w8, [sp, #104] 2733; NONEON-NOSVE-NEXT: ldrb w9, [sp, #182] 2734; NONEON-NOSVE-NEXT: strh w8, [sp, #160] 2735; NONEON-NOSVE-NEXT: ldrb w8, [sp, #111] 2736; NONEON-NOSVE-NEXT: strh w8, [sp, #174] 2737; NONEON-NOSVE-NEXT: ldrb w8, [sp, #110] 2738; NONEON-NOSVE-NEXT: strh w8, [sp, #172] 2739; NONEON-NOSVE-NEXT: ldrb w8, [sp, #109] 2740; NONEON-NOSVE-NEXT: strh w8, [sp, #170] 2741; NONEON-NOSVE-NEXT: ldrb w8, [sp, #108] 2742; NONEON-NOSVE-NEXT: strh w8, [sp, #168] 2743; NONEON-NOSVE-NEXT: ldrb w8, [sp, #99] 2744; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #160] 2745; NONEON-NOSVE-NEXT: strh w8, [sp, #150] 2746; NONEON-NOSVE-NEXT: ldrb w8, [sp, #98] 2747; NONEON-NOSVE-NEXT: strh w8, [sp, #148] 2748; NONEON-NOSVE-NEXT: ldrb w8, [sp, #97] 2749; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #224] 2750; NONEON-NOSVE-NEXT: strh w8, [sp, #146] 2751; NONEON-NOSVE-NEXT: ldrb w8, [sp, #96] 2752; NONEON-NOSVE-NEXT: strh w8, [sp, #144] 2753; NONEON-NOSVE-NEXT: ldrb w8, [sp, #103] 2754; NONEON-NOSVE-NEXT: strh w8, [sp, #158] 2755; NONEON-NOSVE-NEXT: ldrb w8, [sp, #102] 2756; NONEON-NOSVE-NEXT: strh w8, [sp, #156] 2757; NONEON-NOSVE-NEXT: ldrb w8, [sp, #101] 2758; NONEON-NOSVE-NEXT: strh w8, [sp, #154] 2759; NONEON-NOSVE-NEXT: ldrb w8, [sp, #100] 2760; NONEON-NOSVE-NEXT: strh w8, [sp, #152] 2761; NONEON-NOSVE-NEXT: ldrb w8, [sp, #198] 2762; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #144] 2763; NONEON-NOSVE-NEXT: str w8, [sp, #284] 2764; NONEON-NOSVE-NEXT: ldrb w8, [sp, #196] 2765; NONEON-NOSVE-NEXT: str w8, [sp, #280] 2766; NONEON-NOSVE-NEXT: ldrb w8, [sp, #194] 2767; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #208] 2768; NONEON-NOSVE-NEXT: str w8, [sp, #276] 2769; NONEON-NOSVE-NEXT: ldrb w8, [sp, #192] 2770; NONEON-NOSVE-NEXT: str w8, [sp, #272] 2771; NONEON-NOSVE-NEXT: ldrb w8, [sp, #206] 2772; NONEON-NOSVE-NEXT: str w8, [sp, #300] 2773; NONEON-NOSVE-NEXT: ldrb w8, [sp, #204] 2774; NONEON-NOSVE-NEXT: str w8, [sp, #296] 2775; NONEON-NOSVE-NEXT: ldrb w8, [sp, #202] 2776; NONEON-NOSVE-NEXT: str w8, [sp, #292] 2777; NONEON-NOSVE-NEXT: ldrb w8, [sp, #200] 2778; NONEON-NOSVE-NEXT: str w8, [sp, #288] 2779; NONEON-NOSVE-NEXT: ldrb w8, [sp, #180] 2780; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #272] 2781; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #248] 2782; NONEON-NOSVE-NEXT: ldrb w9, [sp, #178] 2783; NONEON-NOSVE-NEXT: ldrb w8, [sp, #176] 2784; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #240] 2785; NONEON-NOSVE-NEXT: ldrb w8, [sp, #190] 2786; NONEON-NOSVE-NEXT: str w8, [sp, #268] 2787; NONEON-NOSVE-NEXT: ldrb w8, [sp, #188] 2788; NONEON-NOSVE-NEXT: str w8, [sp, #264] 2789; NONEON-NOSVE-NEXT: ldrb w8, [sp, #186] 2790; NONEON-NOSVE-NEXT: str w8, [sp, #260] 2791; NONEON-NOSVE-NEXT: ldrb w8, [sp, #184] 2792; NONEON-NOSVE-NEXT: str w8, [sp, #256] 2793; NONEON-NOSVE-NEXT: ldrb w8, [sp, #230] 2794; NONEON-NOSVE-NEXT: ldp q3, q4, [sp, #240] 2795; NONEON-NOSVE-NEXT: str w8, [sp, #348] 2796; NONEON-NOSVE-NEXT: ldrb w8, [sp, #228] 2797; NONEON-NOSVE-NEXT: str w8, [sp, #344] 2798; NONEON-NOSVE-NEXT: ldrb w8, [sp, #226] 2799; NONEON-NOSVE-NEXT: str w8, [sp, #340] 2800; NONEON-NOSVE-NEXT: ldrb w8, [sp, #224] 2801; NONEON-NOSVE-NEXT: str w8, [sp, #336] 2802; NONEON-NOSVE-NEXT: ldrb w8, [sp, #238] 2803; NONEON-NOSVE-NEXT: str w8, [sp, #364] 2804; NONEON-NOSVE-NEXT: ldrb w8, [sp, #236] 2805; NONEON-NOSVE-NEXT: str w8, [sp, #360] 2806; NONEON-NOSVE-NEXT: ldrb w8, [sp, #234] 2807; NONEON-NOSVE-NEXT: str w8, [sp, #356] 2808; NONEON-NOSVE-NEXT: ldrb w8, [sp, #232] 2809; NONEON-NOSVE-NEXT: str w8, [sp, #352] 2810; NONEON-NOSVE-NEXT: ldrb w8, [sp, #214] 2811; NONEON-NOSVE-NEXT: ldp q6, q7, [sp, #336] 2812; NONEON-NOSVE-NEXT: str w8, [sp, #316] 2813; NONEON-NOSVE-NEXT: ldrb w8, [sp, #212] 2814; NONEON-NOSVE-NEXT: str w8, [sp, #312] 2815; NONEON-NOSVE-NEXT: ldrb w8, [sp, #210] 2816; NONEON-NOSVE-NEXT: str w8, [sp, #308] 2817; NONEON-NOSVE-NEXT: ldrb w8, [sp, #208] 2818; NONEON-NOSVE-NEXT: str w8, [sp, #304] 2819; NONEON-NOSVE-NEXT: ldrb w8, [sp, #222] 2820; NONEON-NOSVE-NEXT: str w8, [sp, #332] 2821; NONEON-NOSVE-NEXT: ldrb w8, [sp, #220] 2822; NONEON-NOSVE-NEXT: str w8, [sp, #328] 2823; NONEON-NOSVE-NEXT: ldrb w8, [sp, #218] 2824; NONEON-NOSVE-NEXT: str w8, [sp, #324] 2825; NONEON-NOSVE-NEXT: ldrb w8, [sp, #216] 2826; NONEON-NOSVE-NEXT: str w8, [sp, #320] 2827; NONEON-NOSVE-NEXT: ldp q5, q2, [sp, #304] 2828; NONEON-NOSVE-NEXT: stp q0, q1, [x1] 2829; NONEON-NOSVE-NEXT: stp q3, q4, [x1, #32] 2830; NONEON-NOSVE-NEXT: stp q6, q7, [x1, #64] 2831; NONEON-NOSVE-NEXT: stp q5, q2, [x1, #96] 2832; NONEON-NOSVE-NEXT: add sp, sp, #464 2833; NONEON-NOSVE-NEXT: ret 2834 %a = load <32 x i8>, ptr %in 2835 %b = add <32 x i8> %a, %a 2836 %c = zext <32 x i8> %b to <32 x i32> 2837 store <32 x i32> %c, ptr %out 2838 ret void 2839} 2840 2841; 2842; zext i8 -> i64 2843; 2844 2845; NOTE: v4i8 is an unpacked typed stored within a v4i16 container. The zero 2846; extend is a two step process where the container is zero_extend_inreg'd with 2847; the result feeding a normal zero extend from halfs to doublewords. 2848define void @zext_v4i8_v4i64(<4 x i8> %a, ptr %out) { 2849; CHECK-LABEL: zext_v4i8_v4i64: 2850; CHECK: // %bb.0: 2851; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 2852; CHECK-NEXT: and z0.h, z0.h, #0xff 2853; CHECK-NEXT: uunpklo z0.s, z0.h 2854; CHECK-NEXT: uunpklo z1.d, z0.s 2855; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 2856; CHECK-NEXT: uunpklo z0.d, z0.s 2857; CHECK-NEXT: stp q1, q0, [x0] 2858; CHECK-NEXT: ret 2859; 2860; NONEON-NOSVE-LABEL: zext_v4i8_v4i64: 2861; NONEON-NOSVE: // %bb.0: 2862; NONEON-NOSVE-NEXT: sub sp, sp, #80 2863; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 80 2864; NONEON-NOSVE-NEXT: str d0, [sp, #8] 2865; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10] 2866; NONEON-NOSVE-NEXT: ldrb w8, [sp, #8] 2867; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #24] 2868; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14] 2869; NONEON-NOSVE-NEXT: ldrb w8, [sp, #12] 2870; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #16] 2871; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #16] 2872; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #32] 2873; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #40] 2874; NONEON-NOSVE-NEXT: stp w9, wzr, [sp, #72] 2875; NONEON-NOSVE-NEXT: stp w8, wzr, [sp, #64] 2876; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #32] 2877; NONEON-NOSVE-NEXT: stp w9, wzr, [sp, #56] 2878; NONEON-NOSVE-NEXT: stp w8, wzr, [sp, #48] 2879; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #48] 2880; NONEON-NOSVE-NEXT: stp q1, q0, [x0] 2881; NONEON-NOSVE-NEXT: add sp, sp, #80 2882; NONEON-NOSVE-NEXT: ret 2883 %b = zext <4 x i8> %a to <4 x i64> 2884 store <4 x i64>%b, ptr %out 2885 ret void 2886} 2887 2888define void @zext_v8i8_v8i64(<8 x i8> %a, ptr %out) { 2889; CHECK-LABEL: zext_v8i8_v8i64: 2890; CHECK: // %bb.0: 2891; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 2892; CHECK-NEXT: uunpklo z0.h, z0.b 2893; CHECK-NEXT: uunpklo z1.s, z0.h 2894; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 2895; CHECK-NEXT: uunpklo z0.s, z0.h 2896; CHECK-NEXT: uunpklo z2.d, z1.s 2897; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 2898; CHECK-NEXT: uunpklo z3.d, z0.s 2899; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 2900; CHECK-NEXT: uunpklo z1.d, z1.s 2901; CHECK-NEXT: uunpklo z0.d, z0.s 2902; CHECK-NEXT: stp q2, q1, [x0] 2903; CHECK-NEXT: stp q3, q0, [x0, #32] 2904; CHECK-NEXT: ret 2905; 2906; NONEON-NOSVE-LABEL: zext_v8i8_v8i64: 2907; NONEON-NOSVE: // %bb.0: 2908; NONEON-NOSVE-NEXT: sub sp, sp, #176 2909; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 176 2910; NONEON-NOSVE-NEXT: str d0, [sp, #8] 2911; NONEON-NOSVE-NEXT: add x8, sp, #144 2912; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11] 2913; NONEON-NOSVE-NEXT: strh w9, [sp, #30] 2914; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10] 2915; NONEON-NOSVE-NEXT: strh w9, [sp, #28] 2916; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9] 2917; NONEON-NOSVE-NEXT: strh w9, [sp, #26] 2918; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8] 2919; NONEON-NOSVE-NEXT: strh w9, [sp, #24] 2920; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15] 2921; NONEON-NOSVE-NEXT: strh w9, [sp, #22] 2922; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14] 2923; NONEON-NOSVE-NEXT: strh w9, [sp, #20] 2924; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13] 2925; NONEON-NOSVE-NEXT: strh w9, [sp, #18] 2926; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12] 2927; NONEON-NOSVE-NEXT: strh w9, [sp, #16] 2928; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #16] 2929; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #32] 2930; NONEON-NOSVE-NEXT: ldrb w10, [sp, #42] 2931; NONEON-NOSVE-NEXT: ldrb w9, [sp, #40] 2932; NONEON-NOSVE-NEXT: stp w9, w10, [sp, #64] 2933; NONEON-NOSVE-NEXT: ldrb w10, [sp, #46] 2934; NONEON-NOSVE-NEXT: ldrb w9, [sp, #44] 2935; NONEON-NOSVE-NEXT: stp w9, w10, [sp, #72] 2936; NONEON-NOSVE-NEXT: ldrb w10, [sp, #34] 2937; NONEON-NOSVE-NEXT: ldrb w9, [sp, #32] 2938; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #64] 2939; NONEON-NOSVE-NEXT: stp w9, w10, [sp, #48] 2940; NONEON-NOSVE-NEXT: ldrb w10, [sp, #38] 2941; NONEON-NOSVE-NEXT: ldrb w9, [sp, #36] 2942; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #96] 2943; NONEON-NOSVE-NEXT: stp w9, w10, [sp, #56] 2944; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #96] 2945; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #48] 2946; NONEON-NOSVE-NEXT: stp w10, wzr, [sp, #152] 2947; NONEON-NOSVE-NEXT: stp w9, wzr, [sp, #144] 2948; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #104] 2949; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #80] 2950; NONEON-NOSVE-NEXT: stp w10, wzr, [sp, #168] 2951; NONEON-NOSVE-NEXT: stp w9, wzr, [sp, #160] 2952; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #80] 2953; NONEON-NOSVE-NEXT: stp w10, wzr, [sp, #120] 2954; NONEON-NOSVE-NEXT: stp w9, wzr, [sp, #112] 2955; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #88] 2956; NONEON-NOSVE-NEXT: stp w10, wzr, [sp, #136] 2957; NONEON-NOSVE-NEXT: stp w9, wzr, [sp, #128] 2958; NONEON-NOSVE-NEXT: ldp q1, q0, [sp, #112] 2959; NONEON-NOSVE-NEXT: ldp q2, q3, [x8] 2960; NONEON-NOSVE-NEXT: stp q1, q0, [x0, #32] 2961; NONEON-NOSVE-NEXT: stp q2, q3, [x0] 2962; NONEON-NOSVE-NEXT: add sp, sp, #176 2963; NONEON-NOSVE-NEXT: ret 2964 %b = zext <8 x i8> %a to <8 x i64> 2965 store <8 x i64>%b, ptr %out 2966 ret void 2967} 2968 2969define void @zext_v16i8_v16i64(<16 x i8> %a, ptr %out) { 2970; CHECK-LABEL: zext_v16i8_v16i64: 2971; CHECK: // %bb.0: 2972; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 2973; CHECK-NEXT: uunpklo z1.h, z0.b 2974; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 2975; CHECK-NEXT: uunpklo z0.h, z0.b 2976; CHECK-NEXT: uunpklo z2.s, z1.h 2977; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 2978; CHECK-NEXT: uunpklo z1.s, z1.h 2979; CHECK-NEXT: uunpklo z3.s, z0.h 2980; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 2981; CHECK-NEXT: uunpklo z4.d, z2.s 2982; CHECK-NEXT: ext z2.b, z2.b, z2.b, #8 2983; CHECK-NEXT: uunpklo z0.s, z0.h 2984; CHECK-NEXT: uunpklo z6.d, z1.s 2985; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 2986; CHECK-NEXT: uunpklo z5.d, z3.s 2987; CHECK-NEXT: ext z3.b, z3.b, z3.b, #8 2988; CHECK-NEXT: uunpklo z2.d, z2.s 2989; CHECK-NEXT: uunpklo z1.d, z1.s 2990; CHECK-NEXT: uunpklo z7.d, z0.s 2991; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 2992; CHECK-NEXT: uunpklo z3.d, z3.s 2993; CHECK-NEXT: stp q4, q2, [x0] 2994; CHECK-NEXT: uunpklo z0.d, z0.s 2995; CHECK-NEXT: stp q6, q1, [x0, #32] 2996; CHECK-NEXT: stp q5, q3, [x0, #64] 2997; CHECK-NEXT: stp q7, q0, [x0, #96] 2998; CHECK-NEXT: ret 2999; 3000; NONEON-NOSVE-LABEL: zext_v16i8_v16i64: 3001; NONEON-NOSVE: // %bb.0: 3002; NONEON-NOSVE-NEXT: sub sp, sp, #368 3003; NONEON-NOSVE-NEXT: str x29, [sp, #352] // 8-byte Folded Spill 3004; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 368 3005; NONEON-NOSVE-NEXT: .cfi_offset w29, -16 3006; NONEON-NOSVE-NEXT: str q0, [sp] 3007; NONEON-NOSVE-NEXT: ldr x29, [sp, #352] // 8-byte Folded Reload 3008; NONEON-NOSVE-NEXT: ldp d1, d0, [sp] 3009; NONEON-NOSVE-NEXT: str wzr, [sp, #332] 3010; NONEON-NOSVE-NEXT: str wzr, [sp, #324] 3011; NONEON-NOSVE-NEXT: str wzr, [sp, #348] 3012; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #24] 3013; NONEON-NOSVE-NEXT: ldrb w8, [sp, #35] 3014; NONEON-NOSVE-NEXT: str wzr, [sp, #340] 3015; NONEON-NOSVE-NEXT: str wzr, [sp, #300] 3016; NONEON-NOSVE-NEXT: strh w8, [sp, #70] 3017; NONEON-NOSVE-NEXT: ldrb w8, [sp, #34] 3018; NONEON-NOSVE-NEXT: str wzr, [sp, #292] 3019; NONEON-NOSVE-NEXT: strh w8, [sp, #68] 3020; NONEON-NOSVE-NEXT: ldrb w8, [sp, #33] 3021; NONEON-NOSVE-NEXT: str wzr, [sp, #316] 3022; NONEON-NOSVE-NEXT: strh w8, [sp, #66] 3023; NONEON-NOSVE-NEXT: ldrb w8, [sp, #32] 3024; NONEON-NOSVE-NEXT: str wzr, [sp, #308] 3025; NONEON-NOSVE-NEXT: strh w8, [sp, #64] 3026; NONEON-NOSVE-NEXT: ldrb w8, [sp, #39] 3027; NONEON-NOSVE-NEXT: str wzr, [sp, #268] 3028; NONEON-NOSVE-NEXT: strh w8, [sp, #62] 3029; NONEON-NOSVE-NEXT: ldrb w8, [sp, #38] 3030; NONEON-NOSVE-NEXT: str wzr, [sp, #260] 3031; NONEON-NOSVE-NEXT: strh w8, [sp, #60] 3032; NONEON-NOSVE-NEXT: ldrb w8, [sp, #37] 3033; NONEON-NOSVE-NEXT: str wzr, [sp, #284] 3034; NONEON-NOSVE-NEXT: strh w8, [sp, #58] 3035; NONEON-NOSVE-NEXT: ldrb w8, [sp, #36] 3036; NONEON-NOSVE-NEXT: str wzr, [sp, #276] 3037; NONEON-NOSVE-NEXT: strh w8, [sp, #56] 3038; NONEON-NOSVE-NEXT: ldrb w8, [sp, #27] 3039; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #56] 3040; NONEON-NOSVE-NEXT: strh w8, [sp, #54] 3041; NONEON-NOSVE-NEXT: ldrb w8, [sp, #26] 3042; NONEON-NOSVE-NEXT: strh w8, [sp, #52] 3043; NONEON-NOSVE-NEXT: ldrb w8, [sp, #25] 3044; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #88] 3045; NONEON-NOSVE-NEXT: strh w8, [sp, #50] 3046; NONEON-NOSVE-NEXT: ldrb w8, [sp, #24] 3047; NONEON-NOSVE-NEXT: ldrb w9, [sp, #98] 3048; NONEON-NOSVE-NEXT: strh w8, [sp, #48] 3049; NONEON-NOSVE-NEXT: ldrb w8, [sp, #31] 3050; NONEON-NOSVE-NEXT: strh w8, [sp, #46] 3051; NONEON-NOSVE-NEXT: ldrb w8, [sp, #30] 3052; NONEON-NOSVE-NEXT: strh w8, [sp, #44] 3053; NONEON-NOSVE-NEXT: ldrb w8, [sp, #29] 3054; NONEON-NOSVE-NEXT: strh w8, [sp, #42] 3055; NONEON-NOSVE-NEXT: ldrb w8, [sp, #28] 3056; NONEON-NOSVE-NEXT: strh w8, [sp, #40] 3057; NONEON-NOSVE-NEXT: ldrb w8, [sp, #96] 3058; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #40] 3059; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #152] 3060; NONEON-NOSVE-NEXT: ldrb w9, [sp, #102] 3061; NONEON-NOSVE-NEXT: ldrb w8, [sp, #100] 3062; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #160] 3063; NONEON-NOSVE-NEXT: ldrb w9, [sp, #90] 3064; NONEON-NOSVE-NEXT: ldrb w8, [sp, #88] 3065; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #72] 3066; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #152] 3067; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #136] 3068; NONEON-NOSVE-NEXT: ldrb w9, [sp, #94] 3069; NONEON-NOSVE-NEXT: ldrb w8, [sp, #92] 3070; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #144] 3071; NONEON-NOSVE-NEXT: ldrb w9, [sp, #82] 3072; NONEON-NOSVE-NEXT: ldrb w8, [sp, #80] 3073; NONEON-NOSVE-NEXT: str d0, [sp, #360] 3074; NONEON-NOSVE-NEXT: ldp d2, d0, [sp, #136] 3075; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #120] 3076; NONEON-NOSVE-NEXT: ldrb w9, [sp, #86] 3077; NONEON-NOSVE-NEXT: ldrb w8, [sp, #84] 3078; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #128] 3079; NONEON-NOSVE-NEXT: ldrb w9, [sp, #74] 3080; NONEON-NOSVE-NEXT: ldrb w8, [sp, #72] 3081; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #208] 3082; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #120] 3083; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #104] 3084; NONEON-NOSVE-NEXT: ldrb w9, [sp, #78] 3085; NONEON-NOSVE-NEXT: ldrb w8, [sp, #76] 3086; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #112] 3087; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #216] 3088; NONEON-NOSVE-NEXT: stp d0, d2, [sp, #192] 3089; NONEON-NOSVE-NEXT: ldp d2, d0, [sp, #104] 3090; NONEON-NOSVE-NEXT: str w8, [sp, #320] 3091; NONEON-NOSVE-NEXT: ldr w8, [sp, #364] 3092; NONEON-NOSVE-NEXT: str w9, [sp, #328] 3093; NONEON-NOSVE-NEXT: str w8, [sp, #344] 3094; NONEON-NOSVE-NEXT: ldr w8, [sp, #360] 3095; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #176] 3096; NONEON-NOSVE-NEXT: str w8, [sp, #336] 3097; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #200] 3098; NONEON-NOSVE-NEXT: str d2, [sp, #168] 3099; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #320] 3100; NONEON-NOSVE-NEXT: str w9, [sp, #296] 3101; NONEON-NOSVE-NEXT: str w8, [sp, #288] 3102; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #208] 3103; NONEON-NOSVE-NEXT: str w9, [sp, #312] 3104; NONEON-NOSVE-NEXT: str w8, [sp, #304] 3105; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #184] 3106; NONEON-NOSVE-NEXT: ldp q3, q4, [sp, #288] 3107; NONEON-NOSVE-NEXT: str w9, [sp, #264] 3108; NONEON-NOSVE-NEXT: stp wzr, w8, [sp, #252] 3109; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #192] 3110; NONEON-NOSVE-NEXT: str w9, [sp, #280] 3111; NONEON-NOSVE-NEXT: str w8, [sp, #272] 3112; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #168] 3113; NONEON-NOSVE-NEXT: ldp q6, q7, [sp, #256] 3114; NONEON-NOSVE-NEXT: stp w9, wzr, [sp, #232] 3115; NONEON-NOSVE-NEXT: stp w8, wzr, [sp, #224] 3116; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #176] 3117; NONEON-NOSVE-NEXT: stp wzr, w9, [sp, #244] 3118; NONEON-NOSVE-NEXT: str w8, [sp, #240] 3119; NONEON-NOSVE-NEXT: ldp q5, q2, [sp, #224] 3120; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 3121; NONEON-NOSVE-NEXT: stp q3, q4, [x0, #32] 3122; NONEON-NOSVE-NEXT: stp q6, q7, [x0, #64] 3123; NONEON-NOSVE-NEXT: stp q5, q2, [x0, #96] 3124; NONEON-NOSVE-NEXT: add sp, sp, #368 3125; NONEON-NOSVE-NEXT: ret 3126 %b = zext <16 x i8> %a to <16 x i64> 3127 store <16 x i64> %b, ptr %out 3128 ret void 3129} 3130 3131define void @zext_v32i8_v32i64(ptr %in, ptr %out) { 3132; CHECK-LABEL: zext_v32i8_v32i64: 3133; CHECK: // %bb.0: 3134; CHECK-NEXT: ldp q1, q0, [x0] 3135; CHECK-NEXT: add z0.b, z0.b, z0.b 3136; CHECK-NEXT: add z1.b, z1.b, z1.b 3137; CHECK-NEXT: mov z2.d, z0.d 3138; CHECK-NEXT: uunpklo z0.h, z0.b 3139; CHECK-NEXT: mov z3.d, z1.d 3140; CHECK-NEXT: uunpklo z1.h, z1.b 3141; CHECK-NEXT: ext z2.b, z2.b, z2.b, #8 3142; CHECK-NEXT: ext z3.b, z3.b, z3.b, #8 3143; CHECK-NEXT: uunpklo z4.s, z0.h 3144; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 3145; CHECK-NEXT: uunpklo z5.s, z1.h 3146; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 3147; CHECK-NEXT: uunpklo z2.h, z2.b 3148; CHECK-NEXT: uunpklo z3.h, z3.b 3149; CHECK-NEXT: uunpklo z0.s, z0.h 3150; CHECK-NEXT: uunpklo z16.d, z4.s 3151; CHECK-NEXT: ext z4.b, z4.b, z4.b, #8 3152; CHECK-NEXT: uunpklo z1.s, z1.h 3153; CHECK-NEXT: uunpklo z17.d, z5.s 3154; CHECK-NEXT: ext z5.b, z5.b, z5.b, #8 3155; CHECK-NEXT: uunpklo z6.s, z2.h 3156; CHECK-NEXT: uunpklo z7.s, z3.h 3157; CHECK-NEXT: ext z2.b, z2.b, z2.b, #8 3158; CHECK-NEXT: uunpklo z4.d, z4.s 3159; CHECK-NEXT: ext z3.b, z3.b, z3.b, #8 3160; CHECK-NEXT: uunpklo z19.d, z0.s 3161; CHECK-NEXT: uunpklo z5.d, z5.s 3162; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 3163; CHECK-NEXT: uunpklo z2.s, z2.h 3164; CHECK-NEXT: uunpklo z18.d, z6.s 3165; CHECK-NEXT: ext z6.b, z6.b, z6.b, #8 3166; CHECK-NEXT: uunpklo z3.s, z3.h 3167; CHECK-NEXT: stp q16, q4, [x1, #128] 3168; CHECK-NEXT: mov z16.d, z7.d 3169; CHECK-NEXT: uunpklo z0.d, z0.s 3170; CHECK-NEXT: stp q17, q5, [x1] 3171; CHECK-NEXT: uunpklo z5.d, z7.s 3172; CHECK-NEXT: uunpklo z4.d, z6.s 3173; CHECK-NEXT: mov z6.d, z1.d 3174; CHECK-NEXT: ext z16.b, z16.b, z7.b, #8 3175; CHECK-NEXT: mov z7.d, z2.d 3176; CHECK-NEXT: stp q19, q0, [x1, #160] 3177; CHECK-NEXT: uunpklo z0.d, z2.s 3178; CHECK-NEXT: ext z6.b, z6.b, z1.b, #8 3179; CHECK-NEXT: uunpklo z1.d, z1.s 3180; CHECK-NEXT: stp q18, q4, [x1, #192] 3181; CHECK-NEXT: mov z4.d, z3.d 3182; CHECK-NEXT: ext z7.b, z7.b, z2.b, #8 3183; CHECK-NEXT: uunpklo z16.d, z16.s 3184; CHECK-NEXT: uunpklo z6.d, z6.s 3185; CHECK-NEXT: ext z4.b, z4.b, z3.b, #8 3186; CHECK-NEXT: uunpklo z2.d, z7.s 3187; CHECK-NEXT: uunpklo z3.d, z3.s 3188; CHECK-NEXT: stp q5, q16, [x1, #64] 3189; CHECK-NEXT: stp q1, q6, [x1, #32] 3190; CHECK-NEXT: uunpklo z1.d, z4.s 3191; CHECK-NEXT: stp q0, q2, [x1, #224] 3192; CHECK-NEXT: stp q3, q1, [x1, #96] 3193; CHECK-NEXT: ret 3194; 3195; NONEON-NOSVE-LABEL: zext_v32i8_v32i64: 3196; NONEON-NOSVE: // %bb.0: 3197; NONEON-NOSVE-NEXT: stp x29, x30, [sp, #-96]! // 16-byte Folded Spill 3198; NONEON-NOSVE-NEXT: stp x28, x27, [sp, #16] // 16-byte Folded Spill 3199; NONEON-NOSVE-NEXT: stp x26, x25, [sp, #32] // 16-byte Folded Spill 3200; NONEON-NOSVE-NEXT: stp x24, x23, [sp, #48] // 16-byte Folded Spill 3201; NONEON-NOSVE-NEXT: stp x22, x21, [sp, #64] // 16-byte Folded Spill 3202; NONEON-NOSVE-NEXT: stp x20, x19, [sp, #80] // 16-byte Folded Spill 3203; NONEON-NOSVE-NEXT: sub sp, sp, #752 3204; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 848 3205; NONEON-NOSVE-NEXT: .cfi_offset w19, -8 3206; NONEON-NOSVE-NEXT: .cfi_offset w20, -16 3207; NONEON-NOSVE-NEXT: .cfi_offset w21, -24 3208; NONEON-NOSVE-NEXT: .cfi_offset w22, -32 3209; NONEON-NOSVE-NEXT: .cfi_offset w23, -40 3210; NONEON-NOSVE-NEXT: .cfi_offset w24, -48 3211; NONEON-NOSVE-NEXT: .cfi_offset w25, -56 3212; NONEON-NOSVE-NEXT: .cfi_offset w26, -64 3213; NONEON-NOSVE-NEXT: .cfi_offset w27, -72 3214; NONEON-NOSVE-NEXT: .cfi_offset w28, -80 3215; NONEON-NOSVE-NEXT: .cfi_offset w30, -88 3216; NONEON-NOSVE-NEXT: .cfi_offset w29, -96 3217; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 3218; NONEON-NOSVE-NEXT: str wzr, [sp, #572] 3219; NONEON-NOSVE-NEXT: str wzr, [sp, #564] 3220; NONEON-NOSVE-NEXT: str wzr, [sp, #588] 3221; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #16] 3222; NONEON-NOSVE-NEXT: ldrb w9, [sp, #40] 3223; NONEON-NOSVE-NEXT: ldrb w8, [sp, #41] 3224; NONEON-NOSVE-NEXT: ldrb w29, [sp, #18] 3225; NONEON-NOSVE-NEXT: ldrb w27, [sp, #16] 3226; NONEON-NOSVE-NEXT: ldrb w25, [sp, #30] 3227; NONEON-NOSVE-NEXT: ldrb w23, [sp, #28] 3228; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #8] // 8-byte Folded Spill 3229; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20] 3230; NONEON-NOSVE-NEXT: ldrb w21, [sp, #26] 3231; NONEON-NOSVE-NEXT: ldrb w19, [sp, #24] 3232; NONEON-NOSVE-NEXT: ldrb w9, [sp, #19] 3233; NONEON-NOSVE-NEXT: ldrb w6, [sp, #38] 3234; NONEON-NOSVE-NEXT: add w8, w8, w8 3235; NONEON-NOSVE-NEXT: ldrb w28, [sp, #17] 3236; NONEON-NOSVE-NEXT: ldrb w16, [sp, #22] 3237; NONEON-NOSVE-NEXT: add w9, w9, w9 3238; NONEON-NOSVE-NEXT: strb w8, [sp, #60] 3239; NONEON-NOSVE-NEXT: add w8, w29, w29 3240; NONEON-NOSVE-NEXT: strb w8, [sp, #58] 3241; NONEON-NOSVE-NEXT: add w8, w27, w27 3242; NONEON-NOSVE-NEXT: add w18, w16, w16 3243; NONEON-NOSVE-NEXT: strb w8, [sp, #56] 3244; NONEON-NOSVE-NEXT: add w8, w25, w25 3245; NONEON-NOSVE-NEXT: ldrb w4, [sp, #36] 3246; NONEON-NOSVE-NEXT: strb w8, [sp, #54] 3247; NONEON-NOSVE-NEXT: add w8, w23, w23 3248; NONEON-NOSVE-NEXT: ldrb w26, [sp, #31] 3249; NONEON-NOSVE-NEXT: strb w8, [sp, #52] 3250; NONEON-NOSVE-NEXT: add w8, w21, w21 3251; NONEON-NOSVE-NEXT: ldrb w2, [sp, #34] 3252; NONEON-NOSVE-NEXT: strb w8, [sp, #50] 3253; NONEON-NOSVE-NEXT: add w8, w19, w19 3254; NONEON-NOSVE-NEXT: ldrb w24, [sp, #29] 3255; NONEON-NOSVE-NEXT: strb w9, [sp, #59] 3256; NONEON-NOSVE-NEXT: add w9, w28, w28 3257; NONEON-NOSVE-NEXT: ldrb w17, [sp, #23] 3258; NONEON-NOSVE-NEXT: strb w8, [sp, #48] 3259; NONEON-NOSVE-NEXT: add w8, w6, w6 3260; NONEON-NOSVE-NEXT: ldrb w16, [sp, #32] 3261; NONEON-NOSVE-NEXT: ldrb w22, [sp, #27] 3262; NONEON-NOSVE-NEXT: strb w9, [sp, #57] 3263; NONEON-NOSVE-NEXT: add w9, w26, w26 3264; NONEON-NOSVE-NEXT: strb w8, [sp, #78] 3265; NONEON-NOSVE-NEXT: add w8, w4, w4 3266; NONEON-NOSVE-NEXT: ldrb w14, [sp, #46] 3267; NONEON-NOSVE-NEXT: ldrb w20, [sp, #25] 3268; NONEON-NOSVE-NEXT: ldrb w30, [sp, #21] 3269; NONEON-NOSVE-NEXT: add w17, w17, w17 3270; NONEON-NOSVE-NEXT: strb w9, [sp, #55] 3271; NONEON-NOSVE-NEXT: add w9, w24, w24 3272; NONEON-NOSVE-NEXT: ldrb w12, [sp, #44] 3273; NONEON-NOSVE-NEXT: strb w8, [sp, #76] 3274; NONEON-NOSVE-NEXT: add w8, w2, w2 3275; NONEON-NOSVE-NEXT: ldrb w10, [sp, #42] 3276; NONEON-NOSVE-NEXT: strb w9, [sp, #53] 3277; NONEON-NOSVE-NEXT: add w9, w22, w22 3278; NONEON-NOSVE-NEXT: ldrb w7, [sp, #39] 3279; NONEON-NOSVE-NEXT: strb w8, [sp, #74] 3280; NONEON-NOSVE-NEXT: add w8, w16, w16 3281; NONEON-NOSVE-NEXT: ldrb w5, [sp, #37] 3282; NONEON-NOSVE-NEXT: strb w17, [sp, #63] 3283; NONEON-NOSVE-NEXT: add w17, w30, w30 3284; NONEON-NOSVE-NEXT: ldrb w3, [sp, #35] 3285; NONEON-NOSVE-NEXT: strb w9, [sp, #51] 3286; NONEON-NOSVE-NEXT: add w9, w20, w20 3287; NONEON-NOSVE-NEXT: ldrb w0, [sp, #33] 3288; NONEON-NOSVE-NEXT: strb w8, [sp, #72] 3289; NONEON-NOSVE-NEXT: add w8, w14, w14 3290; NONEON-NOSVE-NEXT: ldrb w15, [sp, #47] 3291; NONEON-NOSVE-NEXT: strb w18, [sp, #62] 3292; NONEON-NOSVE-NEXT: ldrb w13, [sp, #45] 3293; NONEON-NOSVE-NEXT: ldrb w11, [sp, #43] 3294; NONEON-NOSVE-NEXT: strb w17, [sp, #61] 3295; NONEON-NOSVE-NEXT: strb w9, [sp, #49] 3296; NONEON-NOSVE-NEXT: add w9, w7, w7 3297; NONEON-NOSVE-NEXT: strb w8, [sp, #70] 3298; NONEON-NOSVE-NEXT: add w8, w12, w12 3299; NONEON-NOSVE-NEXT: strb w8, [sp, #68] 3300; NONEON-NOSVE-NEXT: add w8, w10, w10 3301; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #48] 3302; NONEON-NOSVE-NEXT: strb w8, [sp, #66] 3303; NONEON-NOSVE-NEXT: ldr w8, [sp, #12] // 4-byte Folded Reload 3304; NONEON-NOSVE-NEXT: strb w9, [sp, #79] 3305; NONEON-NOSVE-NEXT: add w9, w5, w5 3306; NONEON-NOSVE-NEXT: strb w9, [sp, #77] 3307; NONEON-NOSVE-NEXT: add w9, w3, w3 3308; NONEON-NOSVE-NEXT: add w8, w8, w8 3309; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #80] 3310; NONEON-NOSVE-NEXT: strb w8, [sp, #64] 3311; NONEON-NOSVE-NEXT: ldrb w8, [sp, #91] 3312; NONEON-NOSVE-NEXT: strb w9, [sp, #75] 3313; NONEON-NOSVE-NEXT: add w9, w0, w0 3314; NONEON-NOSVE-NEXT: strh w8, [sp, #134] 3315; NONEON-NOSVE-NEXT: ldrb w8, [sp, #90] 3316; NONEON-NOSVE-NEXT: strb w9, [sp, #73] 3317; NONEON-NOSVE-NEXT: add w9, w15, w15 3318; NONEON-NOSVE-NEXT: strh w8, [sp, #132] 3319; NONEON-NOSVE-NEXT: ldrb w8, [sp, #89] 3320; NONEON-NOSVE-NEXT: strb w9, [sp, #71] 3321; NONEON-NOSVE-NEXT: add w9, w13, w13 3322; NONEON-NOSVE-NEXT: strh w8, [sp, #130] 3323; NONEON-NOSVE-NEXT: ldrb w8, [sp, #88] 3324; NONEON-NOSVE-NEXT: strb w9, [sp, #69] 3325; NONEON-NOSVE-NEXT: add w9, w11, w11 3326; NONEON-NOSVE-NEXT: strh w8, [sp, #128] 3327; NONEON-NOSVE-NEXT: ldrb w8, [sp, #95] 3328; NONEON-NOSVE-NEXT: strb w9, [sp, #67] 3329; NONEON-NOSVE-NEXT: ldr w9, [sp, #8] // 4-byte Folded Reload 3330; NONEON-NOSVE-NEXT: strh w8, [sp, #142] 3331; NONEON-NOSVE-NEXT: ldrb w8, [sp, #94] 3332; NONEON-NOSVE-NEXT: add w9, w9, w9 3333; NONEON-NOSVE-NEXT: str wzr, [sp, #580] 3334; NONEON-NOSVE-NEXT: strh w8, [sp, #140] 3335; NONEON-NOSVE-NEXT: ldrb w8, [sp, #93] 3336; NONEON-NOSVE-NEXT: strb w9, [sp, #65] 3337; NONEON-NOSVE-NEXT: strh w8, [sp, #138] 3338; NONEON-NOSVE-NEXT: ldrb w8, [sp, #92] 3339; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #64] 3340; NONEON-NOSVE-NEXT: str wzr, [sp, #604] 3341; NONEON-NOSVE-NEXT: strh w8, [sp, #136] 3342; NONEON-NOSVE-NEXT: ldrb w8, [sp, #83] 3343; NONEON-NOSVE-NEXT: str wzr, [sp, #596] 3344; NONEON-NOSVE-NEXT: strh w8, [sp, #118] 3345; NONEON-NOSVE-NEXT: ldrb w8, [sp, #82] 3346; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #96] 3347; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #128] 3348; NONEON-NOSVE-NEXT: strh w8, [sp, #116] 3349; NONEON-NOSVE-NEXT: ldrb w8, [sp, #81] 3350; NONEON-NOSVE-NEXT: str wzr, [sp, #620] 3351; NONEON-NOSVE-NEXT: strh w8, [sp, #114] 3352; NONEON-NOSVE-NEXT: ldrb w8, [sp, #80] 3353; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #192] 3354; NONEON-NOSVE-NEXT: strh w8, [sp, #112] 3355; NONEON-NOSVE-NEXT: ldrb w8, [sp, #87] 3356; NONEON-NOSVE-NEXT: str wzr, [sp, #612] 3357; NONEON-NOSVE-NEXT: strh w8, [sp, #126] 3358; NONEON-NOSVE-NEXT: ldrb w8, [sp, #86] 3359; NONEON-NOSVE-NEXT: str wzr, [sp, #508] 3360; NONEON-NOSVE-NEXT: strh w8, [sp, #124] 3361; NONEON-NOSVE-NEXT: ldrb w8, [sp, #85] 3362; NONEON-NOSVE-NEXT: str wzr, [sp, #500] 3363; NONEON-NOSVE-NEXT: strh w8, [sp, #122] 3364; NONEON-NOSVE-NEXT: ldrb w8, [sp, #84] 3365; NONEON-NOSVE-NEXT: str wzr, [sp, #524] 3366; NONEON-NOSVE-NEXT: strh w8, [sp, #120] 3367; NONEON-NOSVE-NEXT: ldrb w8, [sp, #107] 3368; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #112] 3369; NONEON-NOSVE-NEXT: str wzr, [sp, #516] 3370; NONEON-NOSVE-NEXT: strh w8, [sp, #166] 3371; NONEON-NOSVE-NEXT: ldrb w8, [sp, #106] 3372; NONEON-NOSVE-NEXT: str wzr, [sp, #540] 3373; NONEON-NOSVE-NEXT: strh w8, [sp, #164] 3374; NONEON-NOSVE-NEXT: ldrb w8, [sp, #105] 3375; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #176] 3376; NONEON-NOSVE-NEXT: strh w8, [sp, #162] 3377; NONEON-NOSVE-NEXT: ldrb w8, [sp, #104] 3378; NONEON-NOSVE-NEXT: ldrb w9, [sp, #178] 3379; NONEON-NOSVE-NEXT: str wzr, [sp, #532] 3380; NONEON-NOSVE-NEXT: strh w8, [sp, #160] 3381; NONEON-NOSVE-NEXT: ldrb w8, [sp, #111] 3382; NONEON-NOSVE-NEXT: str wzr, [sp, #556] 3383; NONEON-NOSVE-NEXT: strh w8, [sp, #174] 3384; NONEON-NOSVE-NEXT: ldrb w8, [sp, #110] 3385; NONEON-NOSVE-NEXT: str wzr, [sp, #548] 3386; NONEON-NOSVE-NEXT: strh w8, [sp, #172] 3387; NONEON-NOSVE-NEXT: ldrb w8, [sp, #109] 3388; NONEON-NOSVE-NEXT: str wzr, [sp, #700] 3389; NONEON-NOSVE-NEXT: strh w8, [sp, #170] 3390; NONEON-NOSVE-NEXT: ldrb w8, [sp, #108] 3391; NONEON-NOSVE-NEXT: str wzr, [sp, #692] 3392; NONEON-NOSVE-NEXT: strh w8, [sp, #168] 3393; NONEON-NOSVE-NEXT: ldrb w8, [sp, #99] 3394; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #160] 3395; NONEON-NOSVE-NEXT: str wzr, [sp, #716] 3396; NONEON-NOSVE-NEXT: strh w8, [sp, #150] 3397; NONEON-NOSVE-NEXT: ldrb w8, [sp, #98] 3398; NONEON-NOSVE-NEXT: str wzr, [sp, #708] 3399; NONEON-NOSVE-NEXT: strh w8, [sp, #148] 3400; NONEON-NOSVE-NEXT: ldrb w8, [sp, #97] 3401; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #224] 3402; NONEON-NOSVE-NEXT: strh w8, [sp, #146] 3403; NONEON-NOSVE-NEXT: ldrb w8, [sp, #96] 3404; NONEON-NOSVE-NEXT: str wzr, [sp, #732] 3405; NONEON-NOSVE-NEXT: strh w8, [sp, #144] 3406; NONEON-NOSVE-NEXT: ldrb w8, [sp, #103] 3407; NONEON-NOSVE-NEXT: str wzr, [sp, #724] 3408; NONEON-NOSVE-NEXT: strh w8, [sp, #158] 3409; NONEON-NOSVE-NEXT: ldrb w8, [sp, #102] 3410; NONEON-NOSVE-NEXT: str wzr, [sp, #748] 3411; NONEON-NOSVE-NEXT: strh w8, [sp, #156] 3412; NONEON-NOSVE-NEXT: ldrb w8, [sp, #101] 3413; NONEON-NOSVE-NEXT: str wzr, [sp, #740] 3414; NONEON-NOSVE-NEXT: strh w8, [sp, #154] 3415; NONEON-NOSVE-NEXT: ldrb w8, [sp, #100] 3416; NONEON-NOSVE-NEXT: str wzr, [sp, #636] 3417; NONEON-NOSVE-NEXT: strh w8, [sp, #152] 3418; NONEON-NOSVE-NEXT: ldrb w8, [sp, #194] 3419; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #144] 3420; NONEON-NOSVE-NEXT: str wzr, [sp, #628] 3421; NONEON-NOSVE-NEXT: str w8, [sp, #276] 3422; NONEON-NOSVE-NEXT: ldrb w8, [sp, #192] 3423; NONEON-NOSVE-NEXT: str wzr, [sp, #652] 3424; NONEON-NOSVE-NEXT: str w8, [sp, #272] 3425; NONEON-NOSVE-NEXT: ldrb w8, [sp, #198] 3426; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #208] 3427; NONEON-NOSVE-NEXT: str w8, [sp, #284] 3428; NONEON-NOSVE-NEXT: ldrb w8, [sp, #196] 3429; NONEON-NOSVE-NEXT: str wzr, [sp, #644] 3430; NONEON-NOSVE-NEXT: str w8, [sp, #280] 3431; NONEON-NOSVE-NEXT: ldrb w8, [sp, #202] 3432; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #272] 3433; NONEON-NOSVE-NEXT: str wzr, [sp, #668] 3434; NONEON-NOSVE-NEXT: str w8, [sp, #292] 3435; NONEON-NOSVE-NEXT: ldrb w8, [sp, #200] 3436; NONEON-NOSVE-NEXT: str wzr, [sp, #660] 3437; NONEON-NOSVE-NEXT: str w8, [sp, #288] 3438; NONEON-NOSVE-NEXT: ldrb w8, [sp, #206] 3439; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #400] 3440; NONEON-NOSVE-NEXT: str w8, [sp, #300] 3441; NONEON-NOSVE-NEXT: ldrb w8, [sp, #204] 3442; NONEON-NOSVE-NEXT: str wzr, [sp, #684] 3443; NONEON-NOSVE-NEXT: str w8, [sp, #296] 3444; NONEON-NOSVE-NEXT: ldrb w8, [sp, #176] 3445; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #288] 3446; NONEON-NOSVE-NEXT: str wzr, [sp, #676] 3447; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #240] 3448; NONEON-NOSVE-NEXT: ldrb w9, [sp, #182] 3449; NONEON-NOSVE-NEXT: ldrb w8, [sp, #180] 3450; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #248] 3451; NONEON-NOSVE-NEXT: ldrb w8, [sp, #186] 3452; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #416] 3453; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #240] 3454; NONEON-NOSVE-NEXT: str w8, [sp, #260] 3455; NONEON-NOSVE-NEXT: ldrb w8, [sp, #184] 3456; NONEON-NOSVE-NEXT: str w8, [sp, #256] 3457; NONEON-NOSVE-NEXT: ldrb w8, [sp, #190] 3458; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #368] 3459; NONEON-NOSVE-NEXT: str w8, [sp, #268] 3460; NONEON-NOSVE-NEXT: ldrb w8, [sp, #188] 3461; NONEON-NOSVE-NEXT: str w8, [sp, #264] 3462; NONEON-NOSVE-NEXT: ldrb w8, [sp, #226] 3463; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #256] 3464; NONEON-NOSVE-NEXT: str w8, [sp, #340] 3465; NONEON-NOSVE-NEXT: ldrb w8, [sp, #224] 3466; NONEON-NOSVE-NEXT: str w8, [sp, #336] 3467; NONEON-NOSVE-NEXT: ldrb w8, [sp, #230] 3468; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #384] 3469; NONEON-NOSVE-NEXT: str w8, [sp, #348] 3470; NONEON-NOSVE-NEXT: ldrb w8, [sp, #228] 3471; NONEON-NOSVE-NEXT: str w8, [sp, #344] 3472; NONEON-NOSVE-NEXT: ldrb w8, [sp, #234] 3473; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #336] 3474; NONEON-NOSVE-NEXT: str w8, [sp, #356] 3475; NONEON-NOSVE-NEXT: ldrb w8, [sp, #232] 3476; NONEON-NOSVE-NEXT: str w8, [sp, #352] 3477; NONEON-NOSVE-NEXT: ldrb w8, [sp, #238] 3478; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #464] 3479; NONEON-NOSVE-NEXT: str w8, [sp, #364] 3480; NONEON-NOSVE-NEXT: ldrb w8, [sp, #236] 3481; NONEON-NOSVE-NEXT: str w8, [sp, #360] 3482; NONEON-NOSVE-NEXT: ldrb w8, [sp, #210] 3483; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #352] 3484; NONEON-NOSVE-NEXT: str w8, [sp, #308] 3485; NONEON-NOSVE-NEXT: ldrb w8, [sp, #208] 3486; NONEON-NOSVE-NEXT: str w8, [sp, #304] 3487; NONEON-NOSVE-NEXT: ldrb w8, [sp, #214] 3488; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #480] 3489; NONEON-NOSVE-NEXT: str w8, [sp, #316] 3490; NONEON-NOSVE-NEXT: ldrb w8, [sp, #212] 3491; NONEON-NOSVE-NEXT: str w8, [sp, #312] 3492; NONEON-NOSVE-NEXT: ldrb w8, [sp, #218] 3493; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #304] 3494; NONEON-NOSVE-NEXT: str w8, [sp, #324] 3495; NONEON-NOSVE-NEXT: ldrb w8, [sp, #216] 3496; NONEON-NOSVE-NEXT: str w8, [sp, #320] 3497; NONEON-NOSVE-NEXT: ldrb w8, [sp, #222] 3498; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #432] 3499; NONEON-NOSVE-NEXT: str w8, [sp, #332] 3500; NONEON-NOSVE-NEXT: ldrb w8, [sp, #220] 3501; NONEON-NOSVE-NEXT: str w8, [sp, #328] 3502; NONEON-NOSVE-NEXT: ldr w8, [sp, #404] 3503; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #320] 3504; NONEON-NOSVE-NEXT: str w8, [sp, #568] 3505; NONEON-NOSVE-NEXT: ldr w8, [sp, #400] 3506; NONEON-NOSVE-NEXT: str w8, [sp, #560] 3507; NONEON-NOSVE-NEXT: ldr w8, [sp, #412] 3508; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #448] 3509; NONEON-NOSVE-NEXT: str w8, [sp, #584] 3510; NONEON-NOSVE-NEXT: ldr w8, [sp, #408] 3511; NONEON-NOSVE-NEXT: str w8, [sp, #576] 3512; NONEON-NOSVE-NEXT: ldr w8, [sp, #420] 3513; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #560] 3514; NONEON-NOSVE-NEXT: str w8, [sp, #600] 3515; NONEON-NOSVE-NEXT: ldr w8, [sp, #416] 3516; NONEON-NOSVE-NEXT: str w8, [sp, #592] 3517; NONEON-NOSVE-NEXT: ldr w8, [sp, #428] 3518; NONEON-NOSVE-NEXT: str w8, [sp, #616] 3519; NONEON-NOSVE-NEXT: ldr w8, [sp, #424] 3520; NONEON-NOSVE-NEXT: str w8, [sp, #608] 3521; NONEON-NOSVE-NEXT: ldr w8, [sp, #372] 3522; NONEON-NOSVE-NEXT: ldp q2, q3, [sp, #592] 3523; NONEON-NOSVE-NEXT: str w8, [sp, #504] 3524; NONEON-NOSVE-NEXT: ldr w8, [sp, #368] 3525; NONEON-NOSVE-NEXT: str w8, [sp, #496] 3526; NONEON-NOSVE-NEXT: ldr w8, [sp, #380] 3527; NONEON-NOSVE-NEXT: str w8, [sp, #520] 3528; NONEON-NOSVE-NEXT: ldr w8, [sp, #376] 3529; NONEON-NOSVE-NEXT: str w8, [sp, #512] 3530; NONEON-NOSVE-NEXT: ldr w8, [sp, #388] 3531; NONEON-NOSVE-NEXT: ldp q4, q5, [sp, #496] 3532; NONEON-NOSVE-NEXT: str w8, [sp, #536] 3533; NONEON-NOSVE-NEXT: ldr w8, [sp, #384] 3534; NONEON-NOSVE-NEXT: str w8, [sp, #528] 3535; NONEON-NOSVE-NEXT: ldr w8, [sp, #396] 3536; NONEON-NOSVE-NEXT: str w8, [sp, #552] 3537; NONEON-NOSVE-NEXT: ldr w8, [sp, #392] 3538; NONEON-NOSVE-NEXT: str w8, [sp, #544] 3539; NONEON-NOSVE-NEXT: ldr w8, [sp, #468] 3540; NONEON-NOSVE-NEXT: ldp q6, q7, [sp, #528] 3541; NONEON-NOSVE-NEXT: str w8, [sp, #696] 3542; NONEON-NOSVE-NEXT: ldr w8, [sp, #464] 3543; NONEON-NOSVE-NEXT: str w8, [sp, #688] 3544; NONEON-NOSVE-NEXT: ldr w8, [sp, #476] 3545; NONEON-NOSVE-NEXT: str w8, [sp, #712] 3546; NONEON-NOSVE-NEXT: ldr w8, [sp, #472] 3547; NONEON-NOSVE-NEXT: str w8, [sp, #704] 3548; NONEON-NOSVE-NEXT: ldr w8, [sp, #484] 3549; NONEON-NOSVE-NEXT: ldp q16, q17, [sp, #688] 3550; NONEON-NOSVE-NEXT: str w8, [sp, #728] 3551; NONEON-NOSVE-NEXT: ldr w8, [sp, #480] 3552; NONEON-NOSVE-NEXT: str w8, [sp, #720] 3553; NONEON-NOSVE-NEXT: ldr w8, [sp, #492] 3554; NONEON-NOSVE-NEXT: str w8, [sp, #744] 3555; NONEON-NOSVE-NEXT: ldr w8, [sp, #488] 3556; NONEON-NOSVE-NEXT: str w8, [sp, #736] 3557; NONEON-NOSVE-NEXT: ldr w8, [sp, #436] 3558; NONEON-NOSVE-NEXT: ldp q19, q20, [sp, #720] 3559; NONEON-NOSVE-NEXT: str w8, [sp, #632] 3560; NONEON-NOSVE-NEXT: ldr w8, [sp, #432] 3561; NONEON-NOSVE-NEXT: str w8, [sp, #624] 3562; NONEON-NOSVE-NEXT: ldr w8, [sp, #444] 3563; NONEON-NOSVE-NEXT: str w8, [sp, #648] 3564; NONEON-NOSVE-NEXT: ldr w8, [sp, #440] 3565; NONEON-NOSVE-NEXT: str w8, [sp, #640] 3566; NONEON-NOSVE-NEXT: ldr w8, [sp, #452] 3567; NONEON-NOSVE-NEXT: ldp q22, q23, [sp, #624] 3568; NONEON-NOSVE-NEXT: str w8, [sp, #664] 3569; NONEON-NOSVE-NEXT: ldr w8, [sp, #448] 3570; NONEON-NOSVE-NEXT: str w8, [sp, #656] 3571; NONEON-NOSVE-NEXT: ldr w8, [sp, #460] 3572; NONEON-NOSVE-NEXT: str w8, [sp, #680] 3573; NONEON-NOSVE-NEXT: ldr w8, [sp, #456] 3574; NONEON-NOSVE-NEXT: str w8, [sp, #672] 3575; NONEON-NOSVE-NEXT: ldp q21, q18, [sp, #656] 3576; NONEON-NOSVE-NEXT: stp q0, q1, [x1] 3577; NONEON-NOSVE-NEXT: stp q2, q3, [x1, #32] 3578; NONEON-NOSVE-NEXT: stp q4, q5, [x1, #64] 3579; NONEON-NOSVE-NEXT: stp q6, q7, [x1, #96] 3580; NONEON-NOSVE-NEXT: stp q16, q17, [x1, #128] 3581; NONEON-NOSVE-NEXT: stp q19, q20, [x1, #160] 3582; NONEON-NOSVE-NEXT: stp q22, q23, [x1, #192] 3583; NONEON-NOSVE-NEXT: stp q21, q18, [x1, #224] 3584; NONEON-NOSVE-NEXT: add sp, sp, #752 3585; NONEON-NOSVE-NEXT: ldp x20, x19, [sp, #80] // 16-byte Folded Reload 3586; NONEON-NOSVE-NEXT: ldp x22, x21, [sp, #64] // 16-byte Folded Reload 3587; NONEON-NOSVE-NEXT: ldp x24, x23, [sp, #48] // 16-byte Folded Reload 3588; NONEON-NOSVE-NEXT: ldp x26, x25, [sp, #32] // 16-byte Folded Reload 3589; NONEON-NOSVE-NEXT: ldp x28, x27, [sp, #16] // 16-byte Folded Reload 3590; NONEON-NOSVE-NEXT: ldp x29, x30, [sp], #96 // 16-byte Folded Reload 3591; NONEON-NOSVE-NEXT: ret 3592 %a = load <32 x i8>, ptr %in 3593 %b = add <32 x i8> %a, %a 3594 %c = zext <32 x i8> %b to <32 x i64> 3595 store <32 x i64> %c, ptr %out 3596 ret void 3597} 3598 3599; 3600; zext i16 -> i32 3601; 3602 3603define void @zext_v8i16_v8i32(<8 x i16> %a, ptr %out) { 3604; CHECK-LABEL: zext_v8i16_v8i32: 3605; CHECK: // %bb.0: 3606; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 3607; CHECK-NEXT: uunpklo z1.s, z0.h 3608; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 3609; CHECK-NEXT: uunpklo z0.s, z0.h 3610; CHECK-NEXT: stp q1, q0, [x0] 3611; CHECK-NEXT: ret 3612; 3613; NONEON-NOSVE-LABEL: zext_v8i16_v8i32: 3614; NONEON-NOSVE: // %bb.0: 3615; NONEON-NOSVE-NEXT: str q0, [sp, #-64]! 3616; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 3617; NONEON-NOSVE-NEXT: ldp d1, d0, [sp] 3618; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16] 3619; NONEON-NOSVE-NEXT: ldrh w9, [sp, #30] 3620; NONEON-NOSVE-NEXT: ldrh w8, [sp, #28] 3621; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #56] 3622; NONEON-NOSVE-NEXT: ldrh w9, [sp, #26] 3623; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24] 3624; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #48] 3625; NONEON-NOSVE-NEXT: ldrh w9, [sp, #22] 3626; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20] 3627; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #40] 3628; NONEON-NOSVE-NEXT: ldrh w9, [sp, #18] 3629; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16] 3630; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #32] 3631; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 3632; NONEON-NOSVE-NEXT: stp q1, q0, [x0] 3633; NONEON-NOSVE-NEXT: add sp, sp, #64 3634; NONEON-NOSVE-NEXT: ret 3635 %b = zext <8 x i16> %a to <8 x i32> 3636 store <8 x i32>%b, ptr %out 3637 ret void 3638} 3639 3640define void @zext_v16i16_v16i32(ptr %in, ptr %out) { 3641; CHECK-LABEL: zext_v16i16_v16i32: 3642; CHECK: // %bb.0: 3643; CHECK-NEXT: ldp q1, q0, [x0] 3644; CHECK-NEXT: add z0.h, z0.h, z0.h 3645; CHECK-NEXT: add z1.h, z1.h, z1.h 3646; CHECK-NEXT: uunpklo z2.s, z0.h 3647; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 3648; CHECK-NEXT: uunpklo z3.s, z1.h 3649; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 3650; CHECK-NEXT: uunpklo z0.s, z0.h 3651; CHECK-NEXT: uunpklo z1.s, z1.h 3652; CHECK-NEXT: stp q2, q0, [x1, #32] 3653; CHECK-NEXT: stp q3, q1, [x1] 3654; CHECK-NEXT: ret 3655; 3656; NONEON-NOSVE-LABEL: zext_v16i16_v16i32: 3657; NONEON-NOSVE: // %bb.0: 3658; NONEON-NOSVE-NEXT: sub sp, sp, #160 3659; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 160 3660; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 3661; NONEON-NOSVE-NEXT: stp q1, q0, [sp] 3662; NONEON-NOSVE-NEXT: ldrh w13, [sp, #4] 3663; NONEON-NOSVE-NEXT: ldrh w14, [sp, #6] 3664; NONEON-NOSVE-NEXT: ldrh w3, [sp, #2] 3665; NONEON-NOSVE-NEXT: ldrh w5, [sp] 3666; NONEON-NOSVE-NEXT: ldrh w2, [sp, #12] 3667; NONEON-NOSVE-NEXT: ldrh w4, [sp, #14] 3668; NONEON-NOSVE-NEXT: add w13, w13, w13 3669; NONEON-NOSVE-NEXT: add w14, w14, w14 3670; NONEON-NOSVE-NEXT: ldrh w18, [sp, #8] 3671; NONEON-NOSVE-NEXT: ldrh w0, [sp, #10] 3672; NONEON-NOSVE-NEXT: strh w14, [sp, #46] 3673; NONEON-NOSVE-NEXT: add w14, w3, w3 3674; NONEON-NOSVE-NEXT: strh w13, [sp, #44] 3675; NONEON-NOSVE-NEXT: add w13, w5, w5 3676; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24] 3677; NONEON-NOSVE-NEXT: strh w14, [sp, #42] 3678; NONEON-NOSVE-NEXT: add w14, w4, w4 3679; NONEON-NOSVE-NEXT: ldrh w9, [sp, #26] 3680; NONEON-NOSVE-NEXT: strh w13, [sp, #40] 3681; NONEON-NOSVE-NEXT: add w13, w2, w2 3682; NONEON-NOSVE-NEXT: ldrh w17, [sp, #22] 3683; NONEON-NOSVE-NEXT: strh w14, [sp, #38] 3684; NONEON-NOSVE-NEXT: add w14, w0, w0 3685; NONEON-NOSVE-NEXT: add w9, w9, w9 3686; NONEON-NOSVE-NEXT: strh w13, [sp, #36] 3687; NONEON-NOSVE-NEXT: add w13, w18, w18 3688; NONEON-NOSVE-NEXT: add w8, w8, w8 3689; NONEON-NOSVE-NEXT: strh w14, [sp, #34] 3690; NONEON-NOSVE-NEXT: ldrh w10, [sp, #28] 3691; NONEON-NOSVE-NEXT: ldrh w11, [sp, #30] 3692; NONEON-NOSVE-NEXT: strh w13, [sp, #32] 3693; NONEON-NOSVE-NEXT: ldrh w12, [sp, #16] 3694; NONEON-NOSVE-NEXT: ldrh w15, [sp, #18] 3695; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #32] 3696; NONEON-NOSVE-NEXT: ldrh w16, [sp, #20] 3697; NONEON-NOSVE-NEXT: strh w9, [sp, #50] 3698; NONEON-NOSVE-NEXT: add w14, w17, w17 3699; NONEON-NOSVE-NEXT: add w12, w12, w12 3700; NONEON-NOSVE-NEXT: strh w8, [sp, #48] 3701; NONEON-NOSVE-NEXT: add w13, w16, w16 3702; NONEON-NOSVE-NEXT: add w11, w11, w11 3703; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #64] 3704; NONEON-NOSVE-NEXT: add w10, w10, w10 3705; NONEON-NOSVE-NEXT: ldrh w9, [sp, #78] 3706; NONEON-NOSVE-NEXT: ldrh w8, [sp, #76] 3707; NONEON-NOSVE-NEXT: strh w14, [sp, #62] 3708; NONEON-NOSVE-NEXT: add w14, w15, w15 3709; NONEON-NOSVE-NEXT: strh w13, [sp, #60] 3710; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #120] 3711; NONEON-NOSVE-NEXT: ldrh w9, [sp, #74] 3712; NONEON-NOSVE-NEXT: ldrh w8, [sp, #72] 3713; NONEON-NOSVE-NEXT: strh w14, [sp, #58] 3714; NONEON-NOSVE-NEXT: strh w12, [sp, #56] 3715; NONEON-NOSVE-NEXT: strh w11, [sp, #54] 3716; NONEON-NOSVE-NEXT: strh w10, [sp, #52] 3717; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #48] 3718; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #112] 3719; NONEON-NOSVE-NEXT: ldrh w9, [sp, #70] 3720; NONEON-NOSVE-NEXT: ldrh w8, [sp, #68] 3721; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #104] 3722; NONEON-NOSVE-NEXT: ldrh w9, [sp, #66] 3723; NONEON-NOSVE-NEXT: ldrh w8, [sp, #64] 3724; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #80] 3725; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #96] 3726; NONEON-NOSVE-NEXT: ldrh w9, [sp, #94] 3727; NONEON-NOSVE-NEXT: ldrh w8, [sp, #92] 3728; NONEON-NOSVE-NEXT: ldp q3, q2, [sp, #96] 3729; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #152] 3730; NONEON-NOSVE-NEXT: ldrh w9, [sp, #90] 3731; NONEON-NOSVE-NEXT: ldrh w8, [sp, #88] 3732; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #144] 3733; NONEON-NOSVE-NEXT: ldrh w9, [sp, #86] 3734; NONEON-NOSVE-NEXT: ldrh w8, [sp, #84] 3735; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #136] 3736; NONEON-NOSVE-NEXT: ldrh w9, [sp, #82] 3737; NONEON-NOSVE-NEXT: ldrh w8, [sp, #80] 3738; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #128] 3739; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #128] 3740; NONEON-NOSVE-NEXT: stp q2, q3, [x1] 3741; NONEON-NOSVE-NEXT: stp q1, q0, [x1, #32] 3742; NONEON-NOSVE-NEXT: add sp, sp, #160 3743; NONEON-NOSVE-NEXT: ret 3744 %a = load <16 x i16>, ptr %in 3745 %b = add <16 x i16> %a, %a 3746 %c = zext <16 x i16> %b to <16 x i32> 3747 store <16 x i32> %c, ptr %out 3748 ret void 3749} 3750 3751; 3752; zext i16 -> i64 3753; 3754 3755define void @zext_v4i16_v4i64(<4 x i16> %a, ptr %out) { 3756; CHECK-LABEL: zext_v4i16_v4i64: 3757; CHECK: // %bb.0: 3758; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 3759; CHECK-NEXT: uunpklo z0.s, z0.h 3760; CHECK-NEXT: uunpklo z1.d, z0.s 3761; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 3762; CHECK-NEXT: uunpklo z0.d, z0.s 3763; CHECK-NEXT: stp q1, q0, [x0] 3764; CHECK-NEXT: ret 3765; 3766; NONEON-NOSVE-LABEL: zext_v4i16_v4i64: 3767; NONEON-NOSVE: // %bb.0: 3768; NONEON-NOSVE-NEXT: sub sp, sp, #80 3769; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 80 3770; NONEON-NOSVE-NEXT: str d0, [sp, #8] 3771; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10] 3772; NONEON-NOSVE-NEXT: ldrh w8, [sp, #8] 3773; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #24] 3774; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14] 3775; NONEON-NOSVE-NEXT: ldrh w8, [sp, #12] 3776; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #16] 3777; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #16] 3778; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #32] 3779; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #40] 3780; NONEON-NOSVE-NEXT: stp w9, wzr, [sp, #72] 3781; NONEON-NOSVE-NEXT: stp w8, wzr, [sp, #64] 3782; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #32] 3783; NONEON-NOSVE-NEXT: stp w9, wzr, [sp, #56] 3784; NONEON-NOSVE-NEXT: stp w8, wzr, [sp, #48] 3785; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #48] 3786; NONEON-NOSVE-NEXT: stp q1, q0, [x0] 3787; NONEON-NOSVE-NEXT: add sp, sp, #80 3788; NONEON-NOSVE-NEXT: ret 3789 %b = zext <4 x i16> %a to <4 x i64> 3790 store <4 x i64>%b, ptr %out 3791 ret void 3792} 3793 3794define void @zext_v8i16_v8i64(<8 x i16> %a, ptr %out) { 3795; CHECK-LABEL: zext_v8i16_v8i64: 3796; CHECK: // %bb.0: 3797; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 3798; CHECK-NEXT: uunpklo z1.s, z0.h 3799; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 3800; CHECK-NEXT: uunpklo z0.s, z0.h 3801; CHECK-NEXT: uunpklo z2.d, z1.s 3802; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 3803; CHECK-NEXT: uunpklo z1.d, z1.s 3804; CHECK-NEXT: uunpklo z3.d, z0.s 3805; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 3806; CHECK-NEXT: uunpklo z0.d, z0.s 3807; CHECK-NEXT: stp q2, q1, [x0] 3808; CHECK-NEXT: stp q3, q0, [x0, #32] 3809; CHECK-NEXT: ret 3810; 3811; NONEON-NOSVE-LABEL: zext_v8i16_v8i64: 3812; NONEON-NOSVE: // %bb.0: 3813; NONEON-NOSVE-NEXT: str q0, [sp, #-160]! 3814; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 160 3815; NONEON-NOSVE-NEXT: ldp d1, d0, [sp] 3816; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16] 3817; NONEON-NOSVE-NEXT: ldrh w9, [sp, #26] 3818; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24] 3819; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #56] 3820; NONEON-NOSVE-NEXT: ldrh w9, [sp, #30] 3821; NONEON-NOSVE-NEXT: ldrh w8, [sp, #28] 3822; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #48] 3823; NONEON-NOSVE-NEXT: ldrh w9, [sp, #18] 3824; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16] 3825; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #48] 3826; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #40] 3827; NONEON-NOSVE-NEXT: ldrh w9, [sp, #22] 3828; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20] 3829; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #80] 3830; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #32] 3831; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #88] 3832; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #32] 3833; NONEON-NOSVE-NEXT: stp w9, wzr, [sp, #152] 3834; NONEON-NOSVE-NEXT: stp w8, wzr, [sp, #144] 3835; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #80] 3836; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #64] 3837; NONEON-NOSVE-NEXT: stp w9, wzr, [sp, #136] 3838; NONEON-NOSVE-NEXT: stp w8, wzr, [sp, #128] 3839; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #72] 3840; NONEON-NOSVE-NEXT: ldp q3, q2, [sp, #128] 3841; NONEON-NOSVE-NEXT: stp w9, wzr, [sp, #120] 3842; NONEON-NOSVE-NEXT: stp w8, wzr, [sp, #112] 3843; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #64] 3844; NONEON-NOSVE-NEXT: stp w9, wzr, [sp, #104] 3845; NONEON-NOSVE-NEXT: stp w8, wzr, [sp, #96] 3846; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #96] 3847; NONEON-NOSVE-NEXT: stp q2, q3, [x0] 3848; NONEON-NOSVE-NEXT: stp q1, q0, [x0, #32] 3849; NONEON-NOSVE-NEXT: add sp, sp, #160 3850; NONEON-NOSVE-NEXT: ret 3851 %b = zext <8 x i16> %a to <8 x i64> 3852 store <8 x i64>%b, ptr %out 3853 ret void 3854} 3855 3856define void @zext_v16i16_v16i64(ptr %in, ptr %out) { 3857; CHECK-LABEL: zext_v16i16_v16i64: 3858; CHECK: // %bb.0: 3859; CHECK-NEXT: ldp q1, q0, [x0] 3860; CHECK-NEXT: add z0.h, z0.h, z0.h 3861; CHECK-NEXT: add z1.h, z1.h, z1.h 3862; CHECK-NEXT: uunpklo z2.s, z0.h 3863; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 3864; CHECK-NEXT: uunpklo z3.s, z1.h 3865; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 3866; CHECK-NEXT: uunpklo z0.s, z0.h 3867; CHECK-NEXT: uunpklo z1.s, z1.h 3868; CHECK-NEXT: uunpklo z4.d, z2.s 3869; CHECK-NEXT: ext z2.b, z2.b, z2.b, #8 3870; CHECK-NEXT: uunpklo z5.d, z3.s 3871; CHECK-NEXT: ext z3.b, z3.b, z3.b, #8 3872; CHECK-NEXT: uunpklo z6.d, z0.s 3873; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 3874; CHECK-NEXT: uunpklo z2.d, z2.s 3875; CHECK-NEXT: uunpklo z7.d, z1.s 3876; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 3877; CHECK-NEXT: uunpklo z3.d, z3.s 3878; CHECK-NEXT: uunpklo z0.d, z0.s 3879; CHECK-NEXT: uunpklo z1.d, z1.s 3880; CHECK-NEXT: stp q4, q2, [x1, #64] 3881; CHECK-NEXT: stp q5, q3, [x1] 3882; CHECK-NEXT: stp q6, q0, [x1, #96] 3883; CHECK-NEXT: stp q7, q1, [x1, #32] 3884; CHECK-NEXT: ret 3885; 3886; NONEON-NOSVE-LABEL: zext_v16i16_v16i64: 3887; NONEON-NOSVE: // %bb.0: 3888; NONEON-NOSVE-NEXT: sub sp, sp, #368 3889; NONEON-NOSVE-NEXT: str x29, [sp, #352] // 8-byte Folded Spill 3890; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 368 3891; NONEON-NOSVE-NEXT: .cfi_offset w29, -16 3892; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 3893; NONEON-NOSVE-NEXT: str wzr, [sp, #268] 3894; NONEON-NOSVE-NEXT: str wzr, [sp, #260] 3895; NONEON-NOSVE-NEXT: ldr x29, [sp, #352] // 8-byte Folded Reload 3896; NONEON-NOSVE-NEXT: str wzr, [sp, #284] 3897; NONEON-NOSVE-NEXT: stp q1, q0, [sp] 3898; NONEON-NOSVE-NEXT: ldrh w13, [sp, #4] 3899; NONEON-NOSVE-NEXT: ldrh w14, [sp, #6] 3900; NONEON-NOSVE-NEXT: ldrh w3, [sp, #2] 3901; NONEON-NOSVE-NEXT: ldrh w5, [sp] 3902; NONEON-NOSVE-NEXT: ldrh w2, [sp, #12] 3903; NONEON-NOSVE-NEXT: ldrh w4, [sp, #14] 3904; NONEON-NOSVE-NEXT: add w13, w13, w13 3905; NONEON-NOSVE-NEXT: add w14, w14, w14 3906; NONEON-NOSVE-NEXT: ldrh w18, [sp, #8] 3907; NONEON-NOSVE-NEXT: ldrh w0, [sp, #10] 3908; NONEON-NOSVE-NEXT: strh w14, [sp, #54] 3909; NONEON-NOSVE-NEXT: add w14, w3, w3 3910; NONEON-NOSVE-NEXT: strh w13, [sp, #52] 3911; NONEON-NOSVE-NEXT: add w13, w5, w5 3912; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24] 3913; NONEON-NOSVE-NEXT: strh w14, [sp, #50] 3914; NONEON-NOSVE-NEXT: add w14, w4, w4 3915; NONEON-NOSVE-NEXT: ldrh w9, [sp, #26] 3916; NONEON-NOSVE-NEXT: strh w13, [sp, #48] 3917; NONEON-NOSVE-NEXT: add w13, w2, w2 3918; NONEON-NOSVE-NEXT: ldrh w17, [sp, #22] 3919; NONEON-NOSVE-NEXT: strh w14, [sp, #46] 3920; NONEON-NOSVE-NEXT: add w14, w0, w0 3921; NONEON-NOSVE-NEXT: add w9, w9, w9 3922; NONEON-NOSVE-NEXT: strh w13, [sp, #44] 3923; NONEON-NOSVE-NEXT: add w13, w18, w18 3924; NONEON-NOSVE-NEXT: add w8, w8, w8 3925; NONEON-NOSVE-NEXT: strh w14, [sp, #42] 3926; NONEON-NOSVE-NEXT: ldrh w10, [sp, #28] 3927; NONEON-NOSVE-NEXT: ldrh w11, [sp, #30] 3928; NONEON-NOSVE-NEXT: strh w13, [sp, #40] 3929; NONEON-NOSVE-NEXT: ldrh w12, [sp, #16] 3930; NONEON-NOSVE-NEXT: ldrh w15, [sp, #18] 3931; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #40] 3932; NONEON-NOSVE-NEXT: add w14, w17, w17 3933; NONEON-NOSVE-NEXT: ldrh w16, [sp, #20] 3934; NONEON-NOSVE-NEXT: strh w9, [sp, #58] 3935; NONEON-NOSVE-NEXT: add w12, w12, w12 3936; NONEON-NOSVE-NEXT: strh w8, [sp, #56] 3937; NONEON-NOSVE-NEXT: add w11, w11, w11 3938; NONEON-NOSVE-NEXT: add w10, w10, w10 3939; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #72] 3940; NONEON-NOSVE-NEXT: add w13, w16, w16 3941; NONEON-NOSVE-NEXT: ldrh w9, [sp, #82] 3942; NONEON-NOSVE-NEXT: ldrh w8, [sp, #80] 3943; NONEON-NOSVE-NEXT: strh w14, [sp, #70] 3944; NONEON-NOSVE-NEXT: add w14, w15, w15 3945; NONEON-NOSVE-NEXT: strh w13, [sp, #68] 3946; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #120] 3947; NONEON-NOSVE-NEXT: ldrh w9, [sp, #86] 3948; NONEON-NOSVE-NEXT: ldrh w8, [sp, #84] 3949; NONEON-NOSVE-NEXT: strh w14, [sp, #66] 3950; NONEON-NOSVE-NEXT: strh w12, [sp, #64] 3951; NONEON-NOSVE-NEXT: strh w11, [sp, #62] 3952; NONEON-NOSVE-NEXT: strh w10, [sp, #60] 3953; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #56] 3954; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #128] 3955; NONEON-NOSVE-NEXT: ldrh w9, [sp, #74] 3956; NONEON-NOSVE-NEXT: ldrh w8, [sp, #72] 3957; NONEON-NOSVE-NEXT: str wzr, [sp, #276] 3958; NONEON-NOSVE-NEXT: str wzr, [sp, #332] 3959; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #104] 3960; NONEON-NOSVE-NEXT: ldrh w9, [sp, #78] 3961; NONEON-NOSVE-NEXT: ldrh w8, [sp, #76] 3962; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #88] 3963; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #120] 3964; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #112] 3965; NONEON-NOSVE-NEXT: ldrh w9, [sp, #98] 3966; NONEON-NOSVE-NEXT: ldrh w8, [sp, #96] 3967; NONEON-NOSVE-NEXT: str wzr, [sp, #324] 3968; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #152] 3969; NONEON-NOSVE-NEXT: ldrh w9, [sp, #102] 3970; NONEON-NOSVE-NEXT: ldrh w8, [sp, #100] 3971; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #184] 3972; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #104] 3973; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #160] 3974; NONEON-NOSVE-NEXT: ldrh w9, [sp, #90] 3975; NONEON-NOSVE-NEXT: ldrh w8, [sp, #88] 3976; NONEON-NOSVE-NEXT: str wzr, [sp, #348] 3977; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #136] 3978; NONEON-NOSVE-NEXT: ldrh w9, [sp, #94] 3979; NONEON-NOSVE-NEXT: ldrh w8, [sp, #92] 3980; NONEON-NOSVE-NEXT: stp d1, d0, [sp, #168] 3981; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #152] 3982; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #144] 3983; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #184] 3984; NONEON-NOSVE-NEXT: str d0, [sp, #360] 3985; NONEON-NOSVE-NEXT: ldp d2, d0, [sp, #136] 3986; NONEON-NOSVE-NEXT: str wzr, [sp, #340] 3987; NONEON-NOSVE-NEXT: str w9, [sp, #264] 3988; NONEON-NOSVE-NEXT: stp wzr, w8, [sp, #252] 3989; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #192] 3990; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #208] 3991; NONEON-NOSVE-NEXT: str d2, [sp, #200] 3992; NONEON-NOSVE-NEXT: str w9, [sp, #280] 3993; NONEON-NOSVE-NEXT: str w8, [sp, #272] 3994; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #168] 3995; NONEON-NOSVE-NEXT: str wzr, [sp, #300] 3996; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #256] 3997; NONEON-NOSVE-NEXT: str wzr, [sp, #292] 3998; NONEON-NOSVE-NEXT: stp w9, wzr, [sp, #232] 3999; NONEON-NOSVE-NEXT: stp w8, wzr, [sp, #224] 4000; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #176] 4001; NONEON-NOSVE-NEXT: str wzr, [sp, #316] 4002; NONEON-NOSVE-NEXT: str wzr, [sp, #308] 4003; NONEON-NOSVE-NEXT: stp wzr, w9, [sp, #244] 4004; NONEON-NOSVE-NEXT: str w8, [sp, #240] 4005; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #216] 4006; NONEON-NOSVE-NEXT: ldp q3, q4, [sp, #224] 4007; NONEON-NOSVE-NEXT: str w8, [sp, #320] 4008; NONEON-NOSVE-NEXT: ldr w8, [sp, #364] 4009; NONEON-NOSVE-NEXT: str w9, [sp, #328] 4010; NONEON-NOSVE-NEXT: str w8, [sp, #344] 4011; NONEON-NOSVE-NEXT: ldr w8, [sp, #360] 4012; NONEON-NOSVE-NEXT: str w8, [sp, #336] 4013; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #200] 4014; NONEON-NOSVE-NEXT: ldp q6, q7, [sp, #320] 4015; NONEON-NOSVE-NEXT: str w9, [sp, #296] 4016; NONEON-NOSVE-NEXT: str w8, [sp, #288] 4017; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #208] 4018; NONEON-NOSVE-NEXT: str w9, [sp, #312] 4019; NONEON-NOSVE-NEXT: str w8, [sp, #304] 4020; NONEON-NOSVE-NEXT: ldp q5, q2, [sp, #288] 4021; NONEON-NOSVE-NEXT: stp q0, q1, [x1] 4022; NONEON-NOSVE-NEXT: stp q3, q4, [x1, #32] 4023; NONEON-NOSVE-NEXT: stp q6, q7, [x1, #64] 4024; NONEON-NOSVE-NEXT: stp q5, q2, [x1, #96] 4025; NONEON-NOSVE-NEXT: add sp, sp, #368 4026; NONEON-NOSVE-NEXT: ret 4027 %a = load <16 x i16>, ptr %in 4028 %b = add <16 x i16> %a, %a 4029 %c = zext <16 x i16> %b to <16 x i64> 4030 store <16 x i64> %c, ptr %out 4031 ret void 4032} 4033 4034; 4035; zext i32 -> i64 4036; 4037 4038define void @zext_v4i32_v4i64(<4 x i32> %a, ptr %out) { 4039; CHECK-LABEL: zext_v4i32_v4i64: 4040; CHECK: // %bb.0: 4041; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 4042; CHECK-NEXT: uunpklo z1.d, z0.s 4043; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 4044; CHECK-NEXT: uunpklo z0.d, z0.s 4045; CHECK-NEXT: stp q1, q0, [x0] 4046; CHECK-NEXT: ret 4047; 4048; NONEON-NOSVE-LABEL: zext_v4i32_v4i64: 4049; NONEON-NOSVE: // %bb.0: 4050; NONEON-NOSVE-NEXT: str q0, [sp, #-64]! 4051; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 4052; NONEON-NOSVE-NEXT: ldp d1, d0, [sp] 4053; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16] 4054; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #24] 4055; NONEON-NOSVE-NEXT: stp w9, wzr, [sp, #56] 4056; NONEON-NOSVE-NEXT: stp w8, wzr, [sp, #48] 4057; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #16] 4058; NONEON-NOSVE-NEXT: stp w9, wzr, [sp, #40] 4059; NONEON-NOSVE-NEXT: stp w8, wzr, [sp, #32] 4060; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 4061; NONEON-NOSVE-NEXT: stp q1, q0, [x0] 4062; NONEON-NOSVE-NEXT: add sp, sp, #64 4063; NONEON-NOSVE-NEXT: ret 4064 %b = zext <4 x i32> %a to <4 x i64> 4065 store <4 x i64>%b, ptr %out 4066 ret void 4067} 4068 4069define void @zext_v8i32_v8i64(ptr %in, ptr %out) { 4070; CHECK-LABEL: zext_v8i32_v8i64: 4071; CHECK: // %bb.0: 4072; CHECK-NEXT: ldp q1, q0, [x0] 4073; CHECK-NEXT: add z0.s, z0.s, z0.s 4074; CHECK-NEXT: add z1.s, z1.s, z1.s 4075; CHECK-NEXT: uunpklo z2.d, z0.s 4076; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8 4077; CHECK-NEXT: uunpklo z3.d, z1.s 4078; CHECK-NEXT: ext z1.b, z1.b, z1.b, #8 4079; CHECK-NEXT: uunpklo z0.d, z0.s 4080; CHECK-NEXT: uunpklo z1.d, z1.s 4081; CHECK-NEXT: stp q2, q0, [x1, #32] 4082; CHECK-NEXT: stp q3, q1, [x1] 4083; CHECK-NEXT: ret 4084; 4085; NONEON-NOSVE-LABEL: zext_v8i32_v8i64: 4086; NONEON-NOSVE: // %bb.0: 4087; NONEON-NOSVE-NEXT: sub sp, sp, #160 4088; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 160 4089; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 4090; NONEON-NOSVE-NEXT: stp q1, q0, [sp] 4091; NONEON-NOSVE-NEXT: ldp w8, w9, [sp] 4092; NONEON-NOSVE-NEXT: ldp w12, w13, [sp, #8] 4093; NONEON-NOSVE-NEXT: ldp w14, w15, [sp, #16] 4094; NONEON-NOSVE-NEXT: add w9, w9, w9 4095; NONEON-NOSVE-NEXT: add w8, w8, w8 4096; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #40] 4097; NONEON-NOSVE-NEXT: add w9, w13, w13 4098; NONEON-NOSVE-NEXT: add w8, w12, w12 4099; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #32] 4100; NONEON-NOSVE-NEXT: add w9, w15, w15 4101; NONEON-NOSVE-NEXT: add w8, w14, w14 4102; NONEON-NOSVE-NEXT: ldp w10, w11, [sp, #24] 4103; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #32] 4104; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #56] 4105; NONEON-NOSVE-NEXT: add w9, w11, w11 4106; NONEON-NOSVE-NEXT: add w8, w10, w10 4107; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #64] 4108; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #48] 4109; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #72] 4110; NONEON-NOSVE-NEXT: ldp d0, d1, [sp, #48] 4111; NONEON-NOSVE-NEXT: stp w9, wzr, [sp, #120] 4112; NONEON-NOSVE-NEXT: stp w8, wzr, [sp, #112] 4113; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #64] 4114; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #80] 4115; NONEON-NOSVE-NEXT: stp w9, wzr, [sp, #104] 4116; NONEON-NOSVE-NEXT: stp w8, wzr, [sp, #96] 4117; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #88] 4118; NONEON-NOSVE-NEXT: ldp q3, q2, [sp, #96] 4119; NONEON-NOSVE-NEXT: stp w9, wzr, [sp, #152] 4120; NONEON-NOSVE-NEXT: stp w8, wzr, [sp, #144] 4121; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #80] 4122; NONEON-NOSVE-NEXT: stp w9, wzr, [sp, #136] 4123; NONEON-NOSVE-NEXT: stp w8, wzr, [sp, #128] 4124; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #128] 4125; NONEON-NOSVE-NEXT: stp q2, q3, [x1] 4126; NONEON-NOSVE-NEXT: stp q1, q0, [x1, #32] 4127; NONEON-NOSVE-NEXT: add sp, sp, #160 4128; NONEON-NOSVE-NEXT: ret 4129 %a = load <8 x i32>, ptr %in 4130 %b = add <8 x i32> %a, %a 4131 %c = zext <8 x i32> %b to <8 x i64> 4132 store <8 x i64> %c, ptr %out 4133 ret void 4134} 4135 4136define void @extend_and_mul(i32 %0, <2 x i64> %1, ptr %2) { 4137; SVE-LABEL: extend_and_mul: 4138; SVE: // %bb.0: 4139; SVE-NEXT: mov z1.s, w0 4140; SVE-NEXT: ptrue p0.d, vl2 4141; SVE-NEXT: // kill: def $q0 killed $q0 def $z0 4142; SVE-NEXT: uunpklo z1.d, z1.s 4143; SVE-NEXT: mul z0.d, p0/m, z0.d, z1.d 4144; SVE-NEXT: str q0, [x1] 4145; SVE-NEXT: ret 4146; 4147; SVE2-LABEL: extend_and_mul: 4148; SVE2: // %bb.0: 4149; SVE2-NEXT: mov z1.s, w0 4150; SVE2-NEXT: // kill: def $q0 killed $q0 def $z0 4151; SVE2-NEXT: uunpklo z1.d, z1.s 4152; SVE2-NEXT: mul z0.d, z1.d, z0.d 4153; SVE2-NEXT: str q0, [x1] 4154; SVE2-NEXT: ret 4155; 4156; NONEON-NOSVE-LABEL: extend_and_mul: 4157; NONEON-NOSVE: // %bb.0: 4158; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 4159; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 4160; NONEON-NOSVE-NEXT: ldr x8, [sp, #8] 4161; NONEON-NOSVE-NEXT: mov w9, w0 4162; NONEON-NOSVE-NEXT: mul x10, x9, x8 4163; NONEON-NOSVE-NEXT: ldr x8, [sp] 4164; NONEON-NOSVE-NEXT: mul x8, x9, x8 4165; NONEON-NOSVE-NEXT: stp x8, x10, [sp, #16] 4166; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 4167; NONEON-NOSVE-NEXT: str q0, [x1] 4168; NONEON-NOSVE-NEXT: add sp, sp, #32 4169; NONEON-NOSVE-NEXT: ret 4170 %broadcast.splatinsert2 = insertelement <2 x i32> poison, i32 %0, i64 0 4171 %broadcast.splat3 = shufflevector <2 x i32> %broadcast.splatinsert2, <2 x i32> poison, <2 x i32> zeroinitializer 4172 %4 = zext <2 x i32> %broadcast.splat3 to <2 x i64> 4173 %5 = mul <2 x i64> %4, %1 4174 store <2 x i64> %5, ptr %2, align 2 4175 ret void 4176} 4177 4178define void @extend_no_mul(i32 %0, <2 x i64> %1, ptr %2) { 4179; CHECK-LABEL: extend_no_mul: 4180; CHECK: // %bb.0: // %entry 4181; CHECK-NEXT: mov w8, w0 4182; CHECK-NEXT: mov z0.d, x8 4183; CHECK-NEXT: str q0, [x1] 4184; CHECK-NEXT: ret 4185; 4186; NONEON-NOSVE-LABEL: extend_no_mul: 4187; NONEON-NOSVE: // %bb.0: // %entry 4188; NONEON-NOSVE-NEXT: mov w8, w0 4189; NONEON-NOSVE-NEXT: stp x8, x8, [sp, #-16]! 4190; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 4191; NONEON-NOSVE-NEXT: ldr q0, [sp] 4192; NONEON-NOSVE-NEXT: str q0, [x1] 4193; NONEON-NOSVE-NEXT: add sp, sp, #16 4194; NONEON-NOSVE-NEXT: ret 4195entry: 4196 %broadcast.splatinsert2 = insertelement <2 x i32> poison, i32 %0, i64 0 4197 %broadcast.splat3 = shufflevector <2 x i32> %broadcast.splatinsert2, <2 x i32> poison, <2 x i32> zeroinitializer 4198 %3 = zext <2 x i32> %broadcast.splat3 to <2 x i64> 4199 store <2 x i64> %3, ptr %2, align 2 4200 ret void 4201} 4202