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; ADD 11; 12define <4 x i8> @add_v4i8(<4 x i8> %op1, <4 x i8> %op2) { 13; CHECK-LABEL: add_v4i8: 14; CHECK: // %bb.0: 15; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 16; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 17; CHECK-NEXT: add z0.h, z0.h, z1.h 18; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 19; CHECK-NEXT: ret 20; 21; NONEON-NOSVE-LABEL: add_v4i8: 22; NONEON-NOSVE: // %bb.0: 23; NONEON-NOSVE-NEXT: sub sp, sp, #32 24; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 25; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 26; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22] 27; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14] 28; NONEON-NOSVE-NEXT: add w8, w9, w8 29; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12] 30; NONEON-NOSVE-NEXT: strh w8, [sp, #30] 31; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20] 32; NONEON-NOSVE-NEXT: add w8, w9, w8 33; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10] 34; NONEON-NOSVE-NEXT: strh w8, [sp, #28] 35; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18] 36; NONEON-NOSVE-NEXT: add w8, w9, w8 37; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8] 38; NONEON-NOSVE-NEXT: strh w8, [sp, #26] 39; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16] 40; NONEON-NOSVE-NEXT: add w8, w9, w8 41; NONEON-NOSVE-NEXT: strh w8, [sp, #24] 42; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 43; NONEON-NOSVE-NEXT: add sp, sp, #32 44; NONEON-NOSVE-NEXT: ret 45 %res = add <4 x i8> %op1, %op2 46 ret <4 x i8> %res 47} 48 49define <8 x i8> @add_v8i8(<8 x i8> %op1, <8 x i8> %op2) { 50; CHECK-LABEL: add_v8i8: 51; CHECK: // %bb.0: 52; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 53; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 54; CHECK-NEXT: add z0.b, z0.b, z1.b 55; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 56; CHECK-NEXT: ret 57; 58; NONEON-NOSVE-LABEL: add_v8i8: 59; NONEON-NOSVE: // %bb.0: 60; NONEON-NOSVE-NEXT: sub sp, sp, #32 61; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 62; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 63; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23] 64; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15] 65; NONEON-NOSVE-NEXT: add w8, w9, w8 66; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14] 67; NONEON-NOSVE-NEXT: strb w8, [sp, #31] 68; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22] 69; NONEON-NOSVE-NEXT: add w8, w9, w8 70; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13] 71; NONEON-NOSVE-NEXT: strb w8, [sp, #30] 72; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21] 73; NONEON-NOSVE-NEXT: add w8, w9, w8 74; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12] 75; NONEON-NOSVE-NEXT: strb w8, [sp, #29] 76; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20] 77; NONEON-NOSVE-NEXT: add w8, w9, w8 78; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11] 79; NONEON-NOSVE-NEXT: strb w8, [sp, #28] 80; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19] 81; NONEON-NOSVE-NEXT: add w8, w9, w8 82; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10] 83; NONEON-NOSVE-NEXT: strb w8, [sp, #27] 84; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18] 85; NONEON-NOSVE-NEXT: add w8, w9, w8 86; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9] 87; NONEON-NOSVE-NEXT: strb w8, [sp, #26] 88; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17] 89; NONEON-NOSVE-NEXT: add w8, w9, w8 90; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8] 91; NONEON-NOSVE-NEXT: strb w8, [sp, #25] 92; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16] 93; NONEON-NOSVE-NEXT: add w8, w9, w8 94; NONEON-NOSVE-NEXT: strb w8, [sp, #24] 95; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 96; NONEON-NOSVE-NEXT: add sp, sp, #32 97; NONEON-NOSVE-NEXT: ret 98 %res = add <8 x i8> %op1, %op2 99 ret <8 x i8> %res 100} 101 102define <16 x i8> @add_v16i8(<16 x i8> %op1, <16 x i8> %op2) { 103; CHECK-LABEL: add_v16i8: 104; CHECK: // %bb.0: 105; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 106; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 107; CHECK-NEXT: add z0.b, z0.b, z1.b 108; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 109; CHECK-NEXT: ret 110; 111; NONEON-NOSVE-LABEL: add_v16i8: 112; NONEON-NOSVE: // %bb.0: 113; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 114; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 115; NONEON-NOSVE-NEXT: ldrb w8, [sp, #31] 116; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15] 117; NONEON-NOSVE-NEXT: add w8, w9, w8 118; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14] 119; NONEON-NOSVE-NEXT: strb w8, [sp, #47] 120; NONEON-NOSVE-NEXT: ldrb w8, [sp, #30] 121; NONEON-NOSVE-NEXT: add w8, w9, w8 122; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13] 123; NONEON-NOSVE-NEXT: strb w8, [sp, #46] 124; NONEON-NOSVE-NEXT: ldrb w8, [sp, #29] 125; NONEON-NOSVE-NEXT: add w8, w9, w8 126; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12] 127; NONEON-NOSVE-NEXT: strb w8, [sp, #45] 128; NONEON-NOSVE-NEXT: ldrb w8, [sp, #28] 129; NONEON-NOSVE-NEXT: add w8, w9, w8 130; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11] 131; NONEON-NOSVE-NEXT: strb w8, [sp, #44] 132; NONEON-NOSVE-NEXT: ldrb w8, [sp, #27] 133; NONEON-NOSVE-NEXT: add w8, w9, w8 134; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10] 135; NONEON-NOSVE-NEXT: strb w8, [sp, #43] 136; NONEON-NOSVE-NEXT: ldrb w8, [sp, #26] 137; NONEON-NOSVE-NEXT: add w8, w9, w8 138; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9] 139; NONEON-NOSVE-NEXT: strb w8, [sp, #42] 140; NONEON-NOSVE-NEXT: ldrb w8, [sp, #25] 141; NONEON-NOSVE-NEXT: add w8, w9, w8 142; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8] 143; NONEON-NOSVE-NEXT: strb w8, [sp, #41] 144; NONEON-NOSVE-NEXT: ldrb w8, [sp, #24] 145; NONEON-NOSVE-NEXT: add w8, w9, w8 146; NONEON-NOSVE-NEXT: ldrb w9, [sp, #7] 147; NONEON-NOSVE-NEXT: strb w8, [sp, #40] 148; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23] 149; NONEON-NOSVE-NEXT: add w8, w9, w8 150; NONEON-NOSVE-NEXT: ldrb w9, [sp, #6] 151; NONEON-NOSVE-NEXT: strb w8, [sp, #39] 152; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22] 153; NONEON-NOSVE-NEXT: add w8, w9, w8 154; NONEON-NOSVE-NEXT: ldrb w9, [sp, #5] 155; NONEON-NOSVE-NEXT: strb w8, [sp, #38] 156; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21] 157; NONEON-NOSVE-NEXT: add w8, w9, w8 158; NONEON-NOSVE-NEXT: ldrb w9, [sp, #4] 159; NONEON-NOSVE-NEXT: strb w8, [sp, #37] 160; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20] 161; NONEON-NOSVE-NEXT: add w8, w9, w8 162; NONEON-NOSVE-NEXT: ldrb w9, [sp, #3] 163; NONEON-NOSVE-NEXT: strb w8, [sp, #36] 164; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19] 165; NONEON-NOSVE-NEXT: add w8, w9, w8 166; NONEON-NOSVE-NEXT: ldrb w9, [sp, #2] 167; NONEON-NOSVE-NEXT: strb w8, [sp, #35] 168; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18] 169; NONEON-NOSVE-NEXT: add w8, w9, w8 170; NONEON-NOSVE-NEXT: ldrb w9, [sp, #1] 171; NONEON-NOSVE-NEXT: strb w8, [sp, #34] 172; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17] 173; NONEON-NOSVE-NEXT: add w8, w9, w8 174; NONEON-NOSVE-NEXT: ldrb w9, [sp] 175; NONEON-NOSVE-NEXT: strb w8, [sp, #33] 176; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16] 177; NONEON-NOSVE-NEXT: add w8, w9, w8 178; NONEON-NOSVE-NEXT: strb w8, [sp, #32] 179; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 180; NONEON-NOSVE-NEXT: add sp, sp, #48 181; NONEON-NOSVE-NEXT: ret 182 %res = add <16 x i8> %op1, %op2 183 ret <16 x i8> %res 184} 185 186define void @add_v32i8(ptr %a, ptr %b) { 187; CHECK-LABEL: add_v32i8: 188; CHECK: // %bb.0: 189; CHECK-NEXT: ldp q0, q3, [x1] 190; CHECK-NEXT: ldp q1, q2, [x0] 191; CHECK-NEXT: add z0.b, z1.b, z0.b 192; CHECK-NEXT: add z1.b, z2.b, z3.b 193; CHECK-NEXT: stp q0, q1, [x0] 194; CHECK-NEXT: ret 195; 196; NONEON-NOSVE-LABEL: add_v32i8: 197; NONEON-NOSVE: // %bb.0: 198; NONEON-NOSVE-NEXT: sub sp, sp, #96 199; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 200; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 201; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 202; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 203; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 204; NONEON-NOSVE-NEXT: ldrb w8, [sp, #63] 205; NONEON-NOSVE-NEXT: ldrb w9, [sp, #47] 206; NONEON-NOSVE-NEXT: add w8, w9, w8 207; NONEON-NOSVE-NEXT: ldrb w9, [sp, #46] 208; NONEON-NOSVE-NEXT: strb w8, [sp, #95] 209; NONEON-NOSVE-NEXT: ldrb w8, [sp, #62] 210; NONEON-NOSVE-NEXT: add w8, w9, w8 211; NONEON-NOSVE-NEXT: ldrb w9, [sp, #45] 212; NONEON-NOSVE-NEXT: strb w8, [sp, #94] 213; NONEON-NOSVE-NEXT: ldrb w8, [sp, #61] 214; NONEON-NOSVE-NEXT: add w8, w9, w8 215; NONEON-NOSVE-NEXT: ldrb w9, [sp, #44] 216; NONEON-NOSVE-NEXT: strb w8, [sp, #93] 217; NONEON-NOSVE-NEXT: ldrb w8, [sp, #60] 218; NONEON-NOSVE-NEXT: add w8, w9, w8 219; NONEON-NOSVE-NEXT: ldrb w9, [sp, #43] 220; NONEON-NOSVE-NEXT: strb w8, [sp, #92] 221; NONEON-NOSVE-NEXT: ldrb w8, [sp, #59] 222; NONEON-NOSVE-NEXT: add w8, w9, w8 223; NONEON-NOSVE-NEXT: ldrb w9, [sp, #42] 224; NONEON-NOSVE-NEXT: strb w8, [sp, #91] 225; NONEON-NOSVE-NEXT: ldrb w8, [sp, #58] 226; NONEON-NOSVE-NEXT: add w8, w9, w8 227; NONEON-NOSVE-NEXT: ldrb w9, [sp, #41] 228; NONEON-NOSVE-NEXT: strb w8, [sp, #90] 229; NONEON-NOSVE-NEXT: ldrb w8, [sp, #57] 230; NONEON-NOSVE-NEXT: add w8, w9, w8 231; NONEON-NOSVE-NEXT: ldrb w9, [sp, #40] 232; NONEON-NOSVE-NEXT: strb w8, [sp, #89] 233; NONEON-NOSVE-NEXT: ldrb w8, [sp, #56] 234; NONEON-NOSVE-NEXT: add w8, w9, w8 235; NONEON-NOSVE-NEXT: ldrb w9, [sp, #39] 236; NONEON-NOSVE-NEXT: strb w8, [sp, #88] 237; NONEON-NOSVE-NEXT: ldrb w8, [sp, #55] 238; NONEON-NOSVE-NEXT: add w8, w9, w8 239; NONEON-NOSVE-NEXT: ldrb w9, [sp, #38] 240; NONEON-NOSVE-NEXT: strb w8, [sp, #87] 241; NONEON-NOSVE-NEXT: ldrb w8, [sp, #54] 242; NONEON-NOSVE-NEXT: add w8, w9, w8 243; NONEON-NOSVE-NEXT: ldrb w9, [sp, #37] 244; NONEON-NOSVE-NEXT: strb w8, [sp, #86] 245; NONEON-NOSVE-NEXT: ldrb w8, [sp, #53] 246; NONEON-NOSVE-NEXT: add w8, w9, w8 247; NONEON-NOSVE-NEXT: ldrb w9, [sp, #36] 248; NONEON-NOSVE-NEXT: strb w8, [sp, #85] 249; NONEON-NOSVE-NEXT: ldrb w8, [sp, #52] 250; NONEON-NOSVE-NEXT: add w8, w9, w8 251; NONEON-NOSVE-NEXT: ldrb w9, [sp, #35] 252; NONEON-NOSVE-NEXT: strb w8, [sp, #84] 253; NONEON-NOSVE-NEXT: ldrb w8, [sp, #51] 254; NONEON-NOSVE-NEXT: add w8, w9, w8 255; NONEON-NOSVE-NEXT: ldrb w9, [sp, #34] 256; NONEON-NOSVE-NEXT: strb w8, [sp, #83] 257; NONEON-NOSVE-NEXT: ldrb w8, [sp, #50] 258; NONEON-NOSVE-NEXT: add w8, w9, w8 259; NONEON-NOSVE-NEXT: ldrb w9, [sp, #33] 260; NONEON-NOSVE-NEXT: strb w8, [sp, #82] 261; NONEON-NOSVE-NEXT: ldrb w8, [sp, #49] 262; NONEON-NOSVE-NEXT: add w8, w9, w8 263; NONEON-NOSVE-NEXT: ldrb w9, [sp, #32] 264; NONEON-NOSVE-NEXT: strb w8, [sp, #81] 265; NONEON-NOSVE-NEXT: ldrb w8, [sp, #48] 266; NONEON-NOSVE-NEXT: add w8, w9, w8 267; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15] 268; NONEON-NOSVE-NEXT: strb w8, [sp, #80] 269; NONEON-NOSVE-NEXT: ldrb w8, [sp, #31] 270; NONEON-NOSVE-NEXT: add w8, w9, w8 271; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14] 272; NONEON-NOSVE-NEXT: strb w8, [sp, #79] 273; NONEON-NOSVE-NEXT: ldrb w8, [sp, #30] 274; NONEON-NOSVE-NEXT: add w8, w9, w8 275; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13] 276; NONEON-NOSVE-NEXT: strb w8, [sp, #78] 277; NONEON-NOSVE-NEXT: ldrb w8, [sp, #29] 278; NONEON-NOSVE-NEXT: add w8, w9, w8 279; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12] 280; NONEON-NOSVE-NEXT: strb w8, [sp, #77] 281; NONEON-NOSVE-NEXT: ldrb w8, [sp, #28] 282; NONEON-NOSVE-NEXT: add w8, w9, w8 283; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11] 284; NONEON-NOSVE-NEXT: strb w8, [sp, #76] 285; NONEON-NOSVE-NEXT: ldrb w8, [sp, #27] 286; NONEON-NOSVE-NEXT: add w8, w9, w8 287; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10] 288; NONEON-NOSVE-NEXT: strb w8, [sp, #75] 289; NONEON-NOSVE-NEXT: ldrb w8, [sp, #26] 290; NONEON-NOSVE-NEXT: add w8, w9, w8 291; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9] 292; NONEON-NOSVE-NEXT: strb w8, [sp, #74] 293; NONEON-NOSVE-NEXT: ldrb w8, [sp, #25] 294; NONEON-NOSVE-NEXT: add w8, w9, w8 295; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8] 296; NONEON-NOSVE-NEXT: strb w8, [sp, #73] 297; NONEON-NOSVE-NEXT: ldrb w8, [sp, #24] 298; NONEON-NOSVE-NEXT: add w8, w9, w8 299; NONEON-NOSVE-NEXT: ldrb w9, [sp, #7] 300; NONEON-NOSVE-NEXT: strb w8, [sp, #72] 301; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23] 302; NONEON-NOSVE-NEXT: add w8, w9, w8 303; NONEON-NOSVE-NEXT: ldrb w9, [sp, #6] 304; NONEON-NOSVE-NEXT: strb w8, [sp, #71] 305; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22] 306; NONEON-NOSVE-NEXT: add w8, w9, w8 307; NONEON-NOSVE-NEXT: ldrb w9, [sp, #5] 308; NONEON-NOSVE-NEXT: strb w8, [sp, #70] 309; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21] 310; NONEON-NOSVE-NEXT: add w8, w9, w8 311; NONEON-NOSVE-NEXT: ldrb w9, [sp, #4] 312; NONEON-NOSVE-NEXT: strb w8, [sp, #69] 313; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20] 314; NONEON-NOSVE-NEXT: add w8, w9, w8 315; NONEON-NOSVE-NEXT: ldrb w9, [sp, #3] 316; NONEON-NOSVE-NEXT: strb w8, [sp, #68] 317; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19] 318; NONEON-NOSVE-NEXT: add w8, w9, w8 319; NONEON-NOSVE-NEXT: ldrb w9, [sp, #2] 320; NONEON-NOSVE-NEXT: strb w8, [sp, #67] 321; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18] 322; NONEON-NOSVE-NEXT: add w8, w9, w8 323; NONEON-NOSVE-NEXT: ldrb w9, [sp, #1] 324; NONEON-NOSVE-NEXT: strb w8, [sp, #66] 325; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17] 326; NONEON-NOSVE-NEXT: add w8, w9, w8 327; NONEON-NOSVE-NEXT: ldrb w9, [sp] 328; NONEON-NOSVE-NEXT: strb w8, [sp, #65] 329; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16] 330; NONEON-NOSVE-NEXT: add w8, w9, w8 331; NONEON-NOSVE-NEXT: strb w8, [sp, #64] 332; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 333; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 334; NONEON-NOSVE-NEXT: add sp, sp, #96 335; NONEON-NOSVE-NEXT: ret 336 %op1 = load <32 x i8>, ptr %a 337 %op2 = load <32 x i8>, ptr %b 338 %res = add <32 x i8> %op1, %op2 339 store <32 x i8> %res, ptr %a 340 ret void 341} 342 343define <2 x i16> @add_v2i16(<2 x i16> %op1, <2 x i16> %op2) { 344; CHECK-LABEL: add_v2i16: 345; CHECK: // %bb.0: 346; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 347; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 348; CHECK-NEXT: add z0.s, z0.s, z1.s 349; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 350; CHECK-NEXT: ret 351; 352; NONEON-NOSVE-LABEL: add_v2i16: 353; NONEON-NOSVE: // %bb.0: 354; NONEON-NOSVE-NEXT: sub sp, sp, #32 355; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 356; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 357; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8] 358; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 359; NONEON-NOSVE-NEXT: add w8, w10, w8 360; NONEON-NOSVE-NEXT: str w8, [sp, #28] 361; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 362; NONEON-NOSVE-NEXT: add w8, w9, w8 363; NONEON-NOSVE-NEXT: str w8, [sp, #24] 364; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 365; NONEON-NOSVE-NEXT: add sp, sp, #32 366; NONEON-NOSVE-NEXT: ret 367 %res = add <2 x i16> %op1, %op2 368 ret <2 x i16> %res 369} 370 371define <4 x i16> @add_v4i16(<4 x i16> %op1, <4 x i16> %op2) { 372; CHECK-LABEL: add_v4i16: 373; CHECK: // %bb.0: 374; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 375; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 376; CHECK-NEXT: add z0.h, z0.h, z1.h 377; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 378; CHECK-NEXT: ret 379; 380; NONEON-NOSVE-LABEL: add_v4i16: 381; NONEON-NOSVE: // %bb.0: 382; NONEON-NOSVE-NEXT: sub sp, sp, #32 383; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 384; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 385; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22] 386; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14] 387; NONEON-NOSVE-NEXT: add w8, w9, w8 388; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12] 389; NONEON-NOSVE-NEXT: strh w8, [sp, #30] 390; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20] 391; NONEON-NOSVE-NEXT: add w8, w9, w8 392; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10] 393; NONEON-NOSVE-NEXT: strh w8, [sp, #28] 394; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18] 395; NONEON-NOSVE-NEXT: add w8, w9, w8 396; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8] 397; NONEON-NOSVE-NEXT: strh w8, [sp, #26] 398; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16] 399; NONEON-NOSVE-NEXT: add w8, w9, w8 400; NONEON-NOSVE-NEXT: strh w8, [sp, #24] 401; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 402; NONEON-NOSVE-NEXT: add sp, sp, #32 403; NONEON-NOSVE-NEXT: ret 404 %res = add <4 x i16> %op1, %op2 405 ret <4 x i16> %res 406} 407 408define <8 x i16> @add_v8i16(<8 x i16> %op1, <8 x i16> %op2) { 409; CHECK-LABEL: add_v8i16: 410; CHECK: // %bb.0: 411; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 412; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 413; CHECK-NEXT: add z0.h, z0.h, z1.h 414; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 415; CHECK-NEXT: ret 416; 417; NONEON-NOSVE-LABEL: add_v8i16: 418; NONEON-NOSVE: // %bb.0: 419; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 420; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 421; NONEON-NOSVE-NEXT: ldrh w8, [sp, #30] 422; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14] 423; NONEON-NOSVE-NEXT: add w8, w9, w8 424; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12] 425; NONEON-NOSVE-NEXT: strh w8, [sp, #46] 426; NONEON-NOSVE-NEXT: ldrh w8, [sp, #28] 427; NONEON-NOSVE-NEXT: add w8, w9, w8 428; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10] 429; NONEON-NOSVE-NEXT: strh w8, [sp, #44] 430; NONEON-NOSVE-NEXT: ldrh w8, [sp, #26] 431; NONEON-NOSVE-NEXT: add w8, w9, w8 432; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8] 433; NONEON-NOSVE-NEXT: strh w8, [sp, #42] 434; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24] 435; NONEON-NOSVE-NEXT: add w8, w9, w8 436; NONEON-NOSVE-NEXT: ldrh w9, [sp, #6] 437; NONEON-NOSVE-NEXT: strh w8, [sp, #40] 438; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22] 439; NONEON-NOSVE-NEXT: add w8, w9, w8 440; NONEON-NOSVE-NEXT: ldrh w9, [sp, #4] 441; NONEON-NOSVE-NEXT: strh w8, [sp, #38] 442; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20] 443; NONEON-NOSVE-NEXT: add w8, w9, w8 444; NONEON-NOSVE-NEXT: ldrh w9, [sp, #2] 445; NONEON-NOSVE-NEXT: strh w8, [sp, #36] 446; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18] 447; NONEON-NOSVE-NEXT: add w8, w9, w8 448; NONEON-NOSVE-NEXT: ldrh w9, [sp] 449; NONEON-NOSVE-NEXT: strh w8, [sp, #34] 450; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16] 451; NONEON-NOSVE-NEXT: add w8, w9, w8 452; NONEON-NOSVE-NEXT: strh w8, [sp, #32] 453; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 454; NONEON-NOSVE-NEXT: add sp, sp, #48 455; NONEON-NOSVE-NEXT: ret 456 %res = add <8 x i16> %op1, %op2 457 ret <8 x i16> %res 458} 459 460define void @add_v16i16(ptr %a, ptr %b) { 461; CHECK-LABEL: add_v16i16: 462; CHECK: // %bb.0: 463; CHECK-NEXT: ldp q0, q3, [x1] 464; CHECK-NEXT: ldp q1, q2, [x0] 465; CHECK-NEXT: add z0.h, z1.h, z0.h 466; CHECK-NEXT: add z1.h, z2.h, z3.h 467; CHECK-NEXT: stp q0, q1, [x0] 468; CHECK-NEXT: ret 469; 470; NONEON-NOSVE-LABEL: add_v16i16: 471; NONEON-NOSVE: // %bb.0: 472; NONEON-NOSVE-NEXT: sub sp, sp, #96 473; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 474; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 475; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 476; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 477; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 478; NONEON-NOSVE-NEXT: ldrh w8, [sp, #62] 479; NONEON-NOSVE-NEXT: ldrh w9, [sp, #46] 480; NONEON-NOSVE-NEXT: add w8, w9, w8 481; NONEON-NOSVE-NEXT: ldrh w9, [sp, #44] 482; NONEON-NOSVE-NEXT: strh w8, [sp, #94] 483; NONEON-NOSVE-NEXT: ldrh w8, [sp, #60] 484; NONEON-NOSVE-NEXT: add w8, w9, w8 485; NONEON-NOSVE-NEXT: ldrh w9, [sp, #42] 486; NONEON-NOSVE-NEXT: strh w8, [sp, #92] 487; NONEON-NOSVE-NEXT: ldrh w8, [sp, #58] 488; NONEON-NOSVE-NEXT: add w8, w9, w8 489; NONEON-NOSVE-NEXT: ldrh w9, [sp, #40] 490; NONEON-NOSVE-NEXT: strh w8, [sp, #90] 491; NONEON-NOSVE-NEXT: ldrh w8, [sp, #56] 492; NONEON-NOSVE-NEXT: add w8, w9, w8 493; NONEON-NOSVE-NEXT: ldrh w9, [sp, #38] 494; NONEON-NOSVE-NEXT: strh w8, [sp, #88] 495; NONEON-NOSVE-NEXT: ldrh w8, [sp, #54] 496; NONEON-NOSVE-NEXT: add w8, w9, w8 497; NONEON-NOSVE-NEXT: ldrh w9, [sp, #36] 498; NONEON-NOSVE-NEXT: strh w8, [sp, #86] 499; NONEON-NOSVE-NEXT: ldrh w8, [sp, #52] 500; NONEON-NOSVE-NEXT: add w8, w9, w8 501; NONEON-NOSVE-NEXT: ldrh w9, [sp, #34] 502; NONEON-NOSVE-NEXT: strh w8, [sp, #84] 503; NONEON-NOSVE-NEXT: ldrh w8, [sp, #50] 504; NONEON-NOSVE-NEXT: add w8, w9, w8 505; NONEON-NOSVE-NEXT: ldrh w9, [sp, #32] 506; NONEON-NOSVE-NEXT: strh w8, [sp, #82] 507; NONEON-NOSVE-NEXT: ldrh w8, [sp, #48] 508; NONEON-NOSVE-NEXT: add w8, w9, w8 509; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14] 510; NONEON-NOSVE-NEXT: strh w8, [sp, #80] 511; NONEON-NOSVE-NEXT: ldrh w8, [sp, #30] 512; NONEON-NOSVE-NEXT: add w8, w9, w8 513; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12] 514; NONEON-NOSVE-NEXT: strh w8, [sp, #78] 515; NONEON-NOSVE-NEXT: ldrh w8, [sp, #28] 516; NONEON-NOSVE-NEXT: add w8, w9, w8 517; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10] 518; NONEON-NOSVE-NEXT: strh w8, [sp, #76] 519; NONEON-NOSVE-NEXT: ldrh w8, [sp, #26] 520; NONEON-NOSVE-NEXT: add w8, w9, w8 521; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8] 522; NONEON-NOSVE-NEXT: strh w8, [sp, #74] 523; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24] 524; NONEON-NOSVE-NEXT: add w8, w9, w8 525; NONEON-NOSVE-NEXT: ldrh w9, [sp, #6] 526; NONEON-NOSVE-NEXT: strh w8, [sp, #72] 527; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22] 528; NONEON-NOSVE-NEXT: add w8, w9, w8 529; NONEON-NOSVE-NEXT: ldrh w9, [sp, #4] 530; NONEON-NOSVE-NEXT: strh w8, [sp, #70] 531; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20] 532; NONEON-NOSVE-NEXT: add w8, w9, w8 533; NONEON-NOSVE-NEXT: ldrh w9, [sp, #2] 534; NONEON-NOSVE-NEXT: strh w8, [sp, #68] 535; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18] 536; NONEON-NOSVE-NEXT: add w8, w9, w8 537; NONEON-NOSVE-NEXT: ldrh w9, [sp] 538; NONEON-NOSVE-NEXT: strh w8, [sp, #66] 539; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16] 540; NONEON-NOSVE-NEXT: add w8, w9, w8 541; NONEON-NOSVE-NEXT: strh w8, [sp, #64] 542; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 543; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 544; NONEON-NOSVE-NEXT: add sp, sp, #96 545; NONEON-NOSVE-NEXT: ret 546 %op1 = load <16 x i16>, ptr %a 547 %op2 = load <16 x i16>, ptr %b 548 %res = add <16 x i16> %op1, %op2 549 store <16 x i16> %res, ptr %a 550 ret void 551} 552 553define <2 x i32> @add_v2i32(<2 x i32> %op1, <2 x i32> %op2) { 554; CHECK-LABEL: add_v2i32: 555; CHECK: // %bb.0: 556; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 557; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 558; CHECK-NEXT: add z0.s, z0.s, z1.s 559; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 560; CHECK-NEXT: ret 561; 562; NONEON-NOSVE-LABEL: add_v2i32: 563; NONEON-NOSVE: // %bb.0: 564; NONEON-NOSVE-NEXT: sub sp, sp, #32 565; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 566; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 567; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8] 568; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 569; NONEON-NOSVE-NEXT: add w8, w10, w8 570; NONEON-NOSVE-NEXT: str w8, [sp, #28] 571; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 572; NONEON-NOSVE-NEXT: add w8, w9, w8 573; NONEON-NOSVE-NEXT: str w8, [sp, #24] 574; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 575; NONEON-NOSVE-NEXT: add sp, sp, #32 576; NONEON-NOSVE-NEXT: ret 577 %res = add <2 x i32> %op1, %op2 578 ret <2 x i32> %res 579} 580 581define <4 x i32> @add_v4i32(<4 x i32> %op1, <4 x i32> %op2) { 582; CHECK-LABEL: add_v4i32: 583; CHECK: // %bb.0: 584; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 585; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 586; CHECK-NEXT: add z0.s, z0.s, z1.s 587; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 588; CHECK-NEXT: ret 589; 590; NONEON-NOSVE-LABEL: add_v4i32: 591; NONEON-NOSVE: // %bb.0: 592; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 593; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 594; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8] 595; NONEON-NOSVE-NEXT: ldr w8, [sp, #28] 596; NONEON-NOSVE-NEXT: add w8, w10, w8 597; NONEON-NOSVE-NEXT: str w8, [sp, #44] 598; NONEON-NOSVE-NEXT: ldr w8, [sp, #24] 599; NONEON-NOSVE-NEXT: add w8, w9, w8 600; NONEON-NOSVE-NEXT: ldp w9, w10, [sp] 601; NONEON-NOSVE-NEXT: str w8, [sp, #40] 602; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 603; NONEON-NOSVE-NEXT: add w8, w10, w8 604; NONEON-NOSVE-NEXT: str w8, [sp, #36] 605; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 606; NONEON-NOSVE-NEXT: add w8, w9, w8 607; NONEON-NOSVE-NEXT: str w8, [sp, #32] 608; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 609; NONEON-NOSVE-NEXT: add sp, sp, #48 610; NONEON-NOSVE-NEXT: ret 611 %res = add <4 x i32> %op1, %op2 612 ret <4 x i32> %res 613} 614 615define void @add_v8i32(ptr %a, ptr %b) { 616; CHECK-LABEL: add_v8i32: 617; CHECK: // %bb.0: 618; CHECK-NEXT: ldp q0, q3, [x1] 619; CHECK-NEXT: ldp q1, q2, [x0] 620; CHECK-NEXT: add z0.s, z1.s, z0.s 621; CHECK-NEXT: add z1.s, z2.s, z3.s 622; CHECK-NEXT: stp q0, q1, [x0] 623; CHECK-NEXT: ret 624; 625; NONEON-NOSVE-LABEL: add_v8i32: 626; NONEON-NOSVE: // %bb.0: 627; NONEON-NOSVE-NEXT: sub sp, sp, #96 628; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 629; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 630; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 631; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 632; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 633; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #40] 634; NONEON-NOSVE-NEXT: ldr w8, [sp, #60] 635; NONEON-NOSVE-NEXT: add w8, w10, w8 636; NONEON-NOSVE-NEXT: str w8, [sp, #92] 637; NONEON-NOSVE-NEXT: ldr w8, [sp, #56] 638; NONEON-NOSVE-NEXT: add w8, w9, w8 639; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #32] 640; NONEON-NOSVE-NEXT: str w8, [sp, #88] 641; NONEON-NOSVE-NEXT: ldr w8, [sp, #52] 642; NONEON-NOSVE-NEXT: add w8, w10, w8 643; NONEON-NOSVE-NEXT: str w8, [sp, #84] 644; NONEON-NOSVE-NEXT: ldr w8, [sp, #48] 645; NONEON-NOSVE-NEXT: add w8, w9, w8 646; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8] 647; NONEON-NOSVE-NEXT: str w8, [sp, #80] 648; NONEON-NOSVE-NEXT: ldr w8, [sp, #28] 649; NONEON-NOSVE-NEXT: add w8, w10, w8 650; NONEON-NOSVE-NEXT: str w8, [sp, #76] 651; NONEON-NOSVE-NEXT: ldr w8, [sp, #24] 652; NONEON-NOSVE-NEXT: add w8, w9, w8 653; NONEON-NOSVE-NEXT: ldp w9, w10, [sp] 654; NONEON-NOSVE-NEXT: str w8, [sp, #72] 655; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 656; NONEON-NOSVE-NEXT: add w8, w10, w8 657; NONEON-NOSVE-NEXT: str w8, [sp, #68] 658; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 659; NONEON-NOSVE-NEXT: add w8, w9, w8 660; NONEON-NOSVE-NEXT: str w8, [sp, #64] 661; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 662; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 663; NONEON-NOSVE-NEXT: add sp, sp, #96 664; NONEON-NOSVE-NEXT: ret 665 %op1 = load <8 x i32>, ptr %a 666 %op2 = load <8 x i32>, ptr %b 667 %res = add <8 x i32> %op1, %op2 668 store <8 x i32> %res, ptr %a 669 ret void 670} 671 672define <1 x i64> @add_v1i64(<1 x i64> %op1, <1 x i64> %op2) { 673; CHECK-LABEL: add_v1i64: 674; CHECK: // %bb.0: 675; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 676; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 677; CHECK-NEXT: add z0.d, z0.d, z1.d 678; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 679; CHECK-NEXT: ret 680; 681; NONEON-NOSVE-LABEL: add_v1i64: 682; NONEON-NOSVE: // %bb.0: 683; NONEON-NOSVE-NEXT: sub sp, sp, #16 684; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 685; NONEON-NOSVE-NEXT: fmov x8, d1 686; NONEON-NOSVE-NEXT: fmov x9, d0 687; NONEON-NOSVE-NEXT: add x8, x9, x8 688; NONEON-NOSVE-NEXT: str x8, [sp, #8] 689; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 690; NONEON-NOSVE-NEXT: add sp, sp, #16 691; NONEON-NOSVE-NEXT: ret 692 %res = add <1 x i64> %op1, %op2 693 ret <1 x i64> %res 694} 695 696define <2 x i64> @add_v2i64(<2 x i64> %op1, <2 x i64> %op2) { 697; CHECK-LABEL: add_v2i64: 698; CHECK: // %bb.0: 699; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 700; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 701; CHECK-NEXT: add z0.d, z0.d, z1.d 702; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 703; CHECK-NEXT: ret 704; 705; NONEON-NOSVE-LABEL: add_v2i64: 706; NONEON-NOSVE: // %bb.0: 707; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 708; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 709; NONEON-NOSVE-NEXT: ldp x9, x10, [sp] 710; NONEON-NOSVE-NEXT: ldr x8, [sp, #24] 711; NONEON-NOSVE-NEXT: add x8, x10, x8 712; NONEON-NOSVE-NEXT: str x8, [sp, #40] 713; NONEON-NOSVE-NEXT: ldr x8, [sp, #16] 714; NONEON-NOSVE-NEXT: add x8, x9, x8 715; NONEON-NOSVE-NEXT: str x8, [sp, #32] 716; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 717; NONEON-NOSVE-NEXT: add sp, sp, #48 718; NONEON-NOSVE-NEXT: ret 719 %res = add <2 x i64> %op1, %op2 720 ret <2 x i64> %res 721} 722 723define void @add_v4i64(ptr %a, ptr %b) { 724; CHECK-LABEL: add_v4i64: 725; CHECK: // %bb.0: 726; CHECK-NEXT: ldp q0, q3, [x1] 727; CHECK-NEXT: ldp q1, q2, [x0] 728; CHECK-NEXT: add z0.d, z1.d, z0.d 729; CHECK-NEXT: add z1.d, z2.d, z3.d 730; CHECK-NEXT: stp q0, q1, [x0] 731; CHECK-NEXT: ret 732; 733; NONEON-NOSVE-LABEL: add_v4i64: 734; NONEON-NOSVE: // %bb.0: 735; NONEON-NOSVE-NEXT: sub sp, sp, #96 736; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 737; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 738; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 739; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 740; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 741; NONEON-NOSVE-NEXT: ldp x9, x10, [sp, #32] 742; NONEON-NOSVE-NEXT: ldr x8, [sp, #56] 743; NONEON-NOSVE-NEXT: add x8, x10, x8 744; NONEON-NOSVE-NEXT: str x8, [sp, #88] 745; NONEON-NOSVE-NEXT: ldr x8, [sp, #48] 746; NONEON-NOSVE-NEXT: add x8, x9, x8 747; NONEON-NOSVE-NEXT: ldp x9, x10, [sp] 748; NONEON-NOSVE-NEXT: str x8, [sp, #80] 749; NONEON-NOSVE-NEXT: ldr x8, [sp, #24] 750; NONEON-NOSVE-NEXT: add x8, x10, x8 751; NONEON-NOSVE-NEXT: str x8, [sp, #72] 752; NONEON-NOSVE-NEXT: ldr x8, [sp, #16] 753; NONEON-NOSVE-NEXT: add x8, x9, x8 754; NONEON-NOSVE-NEXT: str x8, [sp, #64] 755; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 756; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 757; NONEON-NOSVE-NEXT: add sp, sp, #96 758; NONEON-NOSVE-NEXT: ret 759 %op1 = load <4 x i64>, ptr %a 760 %op2 = load <4 x i64>, ptr %b 761 %res = add <4 x i64> %op1, %op2 762 store <4 x i64> %res, ptr %a 763 ret void 764} 765 766; 767; MUL 768; 769 770define <4 x i8> @mul_v4i8(<4 x i8> %op1, <4 x i8> %op2) { 771; SVE-LABEL: mul_v4i8: 772; SVE: // %bb.0: 773; SVE-NEXT: ptrue p0.h, vl4 774; SVE-NEXT: // kill: def $d0 killed $d0 def $z0 775; SVE-NEXT: // kill: def $d1 killed $d1 def $z1 776; SVE-NEXT: mul z0.h, p0/m, z0.h, z1.h 777; SVE-NEXT: // kill: def $d0 killed $d0 killed $z0 778; SVE-NEXT: ret 779; 780; SVE2-LABEL: mul_v4i8: 781; SVE2: // %bb.0: 782; SVE2-NEXT: // kill: def $d0 killed $d0 def $z0 783; SVE2-NEXT: // kill: def $d1 killed $d1 def $z1 784; SVE2-NEXT: mul z0.h, z0.h, z1.h 785; SVE2-NEXT: // kill: def $d0 killed $d0 killed $z0 786; SVE2-NEXT: ret 787; 788; NONEON-NOSVE-LABEL: mul_v4i8: 789; NONEON-NOSVE: // %bb.0: 790; NONEON-NOSVE-NEXT: sub sp, sp, #32 791; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 792; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 793; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22] 794; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14] 795; NONEON-NOSVE-NEXT: mul w8, w9, w8 796; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12] 797; NONEON-NOSVE-NEXT: strh w8, [sp, #30] 798; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20] 799; NONEON-NOSVE-NEXT: mul w8, w9, w8 800; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10] 801; NONEON-NOSVE-NEXT: strh w8, [sp, #28] 802; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18] 803; NONEON-NOSVE-NEXT: mul w8, w9, w8 804; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8] 805; NONEON-NOSVE-NEXT: strh w8, [sp, #26] 806; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16] 807; NONEON-NOSVE-NEXT: mul w8, w9, w8 808; NONEON-NOSVE-NEXT: strh w8, [sp, #24] 809; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 810; NONEON-NOSVE-NEXT: add sp, sp, #32 811; NONEON-NOSVE-NEXT: ret 812 %res = mul <4 x i8> %op1, %op2 813 ret <4 x i8> %res 814} 815 816define <8 x i8> @mul_v8i8(<8 x i8> %op1, <8 x i8> %op2) { 817; SVE-LABEL: mul_v8i8: 818; SVE: // %bb.0: 819; SVE-NEXT: ptrue p0.b, vl8 820; SVE-NEXT: // kill: def $d0 killed $d0 def $z0 821; SVE-NEXT: // kill: def $d1 killed $d1 def $z1 822; SVE-NEXT: mul z0.b, p0/m, z0.b, z1.b 823; SVE-NEXT: // kill: def $d0 killed $d0 killed $z0 824; SVE-NEXT: ret 825; 826; SVE2-LABEL: mul_v8i8: 827; SVE2: // %bb.0: 828; SVE2-NEXT: // kill: def $d0 killed $d0 def $z0 829; SVE2-NEXT: // kill: def $d1 killed $d1 def $z1 830; SVE2-NEXT: mul z0.b, z0.b, z1.b 831; SVE2-NEXT: // kill: def $d0 killed $d0 killed $z0 832; SVE2-NEXT: ret 833; 834; NONEON-NOSVE-LABEL: mul_v8i8: 835; NONEON-NOSVE: // %bb.0: 836; NONEON-NOSVE-NEXT: sub sp, sp, #32 837; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 838; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 839; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23] 840; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15] 841; NONEON-NOSVE-NEXT: mul w8, w9, w8 842; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14] 843; NONEON-NOSVE-NEXT: strb w8, [sp, #31] 844; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22] 845; NONEON-NOSVE-NEXT: mul w8, w9, w8 846; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13] 847; NONEON-NOSVE-NEXT: strb w8, [sp, #30] 848; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21] 849; NONEON-NOSVE-NEXT: mul w8, w9, w8 850; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12] 851; NONEON-NOSVE-NEXT: strb w8, [sp, #29] 852; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20] 853; NONEON-NOSVE-NEXT: mul w8, w9, w8 854; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11] 855; NONEON-NOSVE-NEXT: strb w8, [sp, #28] 856; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19] 857; NONEON-NOSVE-NEXT: mul w8, w9, w8 858; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10] 859; NONEON-NOSVE-NEXT: strb w8, [sp, #27] 860; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18] 861; NONEON-NOSVE-NEXT: mul w8, w9, w8 862; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9] 863; NONEON-NOSVE-NEXT: strb w8, [sp, #26] 864; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17] 865; NONEON-NOSVE-NEXT: mul w8, w9, w8 866; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8] 867; NONEON-NOSVE-NEXT: strb w8, [sp, #25] 868; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16] 869; NONEON-NOSVE-NEXT: mul w8, w9, w8 870; NONEON-NOSVE-NEXT: strb w8, [sp, #24] 871; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 872; NONEON-NOSVE-NEXT: add sp, sp, #32 873; NONEON-NOSVE-NEXT: ret 874 %res = mul <8 x i8> %op1, %op2 875 ret <8 x i8> %res 876} 877 878define <16 x i8> @mul_v16i8(<16 x i8> %op1, <16 x i8> %op2) { 879; SVE-LABEL: mul_v16i8: 880; SVE: // %bb.0: 881; SVE-NEXT: ptrue p0.b, vl16 882; SVE-NEXT: // kill: def $q0 killed $q0 def $z0 883; SVE-NEXT: // kill: def $q1 killed $q1 def $z1 884; SVE-NEXT: mul z0.b, p0/m, z0.b, z1.b 885; SVE-NEXT: // kill: def $q0 killed $q0 killed $z0 886; SVE-NEXT: ret 887; 888; SVE2-LABEL: mul_v16i8: 889; SVE2: // %bb.0: 890; SVE2-NEXT: // kill: def $q0 killed $q0 def $z0 891; SVE2-NEXT: // kill: def $q1 killed $q1 def $z1 892; SVE2-NEXT: mul z0.b, z0.b, z1.b 893; SVE2-NEXT: // kill: def $q0 killed $q0 killed $z0 894; SVE2-NEXT: ret 895; 896; NONEON-NOSVE-LABEL: mul_v16i8: 897; NONEON-NOSVE: // %bb.0: 898; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 899; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 900; NONEON-NOSVE-NEXT: ldrb w8, [sp, #31] 901; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15] 902; NONEON-NOSVE-NEXT: mul w8, w9, w8 903; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14] 904; NONEON-NOSVE-NEXT: strb w8, [sp, #47] 905; NONEON-NOSVE-NEXT: ldrb w8, [sp, #30] 906; NONEON-NOSVE-NEXT: mul w8, w9, w8 907; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13] 908; NONEON-NOSVE-NEXT: strb w8, [sp, #46] 909; NONEON-NOSVE-NEXT: ldrb w8, [sp, #29] 910; NONEON-NOSVE-NEXT: mul w8, w9, w8 911; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12] 912; NONEON-NOSVE-NEXT: strb w8, [sp, #45] 913; NONEON-NOSVE-NEXT: ldrb w8, [sp, #28] 914; NONEON-NOSVE-NEXT: mul w8, w9, w8 915; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11] 916; NONEON-NOSVE-NEXT: strb w8, [sp, #44] 917; NONEON-NOSVE-NEXT: ldrb w8, [sp, #27] 918; NONEON-NOSVE-NEXT: mul w8, w9, w8 919; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10] 920; NONEON-NOSVE-NEXT: strb w8, [sp, #43] 921; NONEON-NOSVE-NEXT: ldrb w8, [sp, #26] 922; NONEON-NOSVE-NEXT: mul w8, w9, w8 923; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9] 924; NONEON-NOSVE-NEXT: strb w8, [sp, #42] 925; NONEON-NOSVE-NEXT: ldrb w8, [sp, #25] 926; NONEON-NOSVE-NEXT: mul w8, w9, w8 927; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8] 928; NONEON-NOSVE-NEXT: strb w8, [sp, #41] 929; NONEON-NOSVE-NEXT: ldrb w8, [sp, #24] 930; NONEON-NOSVE-NEXT: mul w8, w9, w8 931; NONEON-NOSVE-NEXT: ldrb w9, [sp, #7] 932; NONEON-NOSVE-NEXT: strb w8, [sp, #40] 933; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23] 934; NONEON-NOSVE-NEXT: mul w8, w9, w8 935; NONEON-NOSVE-NEXT: ldrb w9, [sp, #6] 936; NONEON-NOSVE-NEXT: strb w8, [sp, #39] 937; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22] 938; NONEON-NOSVE-NEXT: mul w8, w9, w8 939; NONEON-NOSVE-NEXT: ldrb w9, [sp, #5] 940; NONEON-NOSVE-NEXT: strb w8, [sp, #38] 941; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21] 942; NONEON-NOSVE-NEXT: mul w8, w9, w8 943; NONEON-NOSVE-NEXT: ldrb w9, [sp, #4] 944; NONEON-NOSVE-NEXT: strb w8, [sp, #37] 945; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20] 946; NONEON-NOSVE-NEXT: mul w8, w9, w8 947; NONEON-NOSVE-NEXT: ldrb w9, [sp, #3] 948; NONEON-NOSVE-NEXT: strb w8, [sp, #36] 949; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19] 950; NONEON-NOSVE-NEXT: mul w8, w9, w8 951; NONEON-NOSVE-NEXT: ldrb w9, [sp, #2] 952; NONEON-NOSVE-NEXT: strb w8, [sp, #35] 953; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18] 954; NONEON-NOSVE-NEXT: mul w8, w9, w8 955; NONEON-NOSVE-NEXT: ldrb w9, [sp, #1] 956; NONEON-NOSVE-NEXT: strb w8, [sp, #34] 957; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17] 958; NONEON-NOSVE-NEXT: mul w8, w9, w8 959; NONEON-NOSVE-NEXT: ldrb w9, [sp] 960; NONEON-NOSVE-NEXT: strb w8, [sp, #33] 961; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16] 962; NONEON-NOSVE-NEXT: mul w8, w9, w8 963; NONEON-NOSVE-NEXT: strb w8, [sp, #32] 964; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 965; NONEON-NOSVE-NEXT: add sp, sp, #48 966; NONEON-NOSVE-NEXT: ret 967 %res = mul <16 x i8> %op1, %op2 968 ret <16 x i8> %res 969} 970 971define void @mul_v32i8(ptr %a, ptr %b) { 972; SVE-LABEL: mul_v32i8: 973; SVE: // %bb.0: 974; SVE-NEXT: ldp q0, q3, [x1] 975; SVE-NEXT: ptrue p0.b, vl16 976; SVE-NEXT: ldp q1, q2, [x0] 977; SVE-NEXT: mul z0.b, p0/m, z0.b, z1.b 978; SVE-NEXT: movprfx z1, z2 979; SVE-NEXT: mul z1.b, p0/m, z1.b, z3.b 980; SVE-NEXT: stp q0, q1, [x0] 981; SVE-NEXT: ret 982; 983; SVE2-LABEL: mul_v32i8: 984; SVE2: // %bb.0: 985; SVE2-NEXT: ldp q0, q3, [x1] 986; SVE2-NEXT: ldp q1, q2, [x0] 987; SVE2-NEXT: mul z0.b, z1.b, z0.b 988; SVE2-NEXT: mul z1.b, z2.b, z3.b 989; SVE2-NEXT: stp q0, q1, [x0] 990; SVE2-NEXT: ret 991; 992; NONEON-NOSVE-LABEL: mul_v32i8: 993; NONEON-NOSVE: // %bb.0: 994; NONEON-NOSVE-NEXT: sub sp, sp, #96 995; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 996; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 997; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 998; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 999; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 1000; NONEON-NOSVE-NEXT: ldrb w8, [sp, #63] 1001; NONEON-NOSVE-NEXT: ldrb w9, [sp, #47] 1002; NONEON-NOSVE-NEXT: mul w8, w9, w8 1003; NONEON-NOSVE-NEXT: ldrb w9, [sp, #46] 1004; NONEON-NOSVE-NEXT: strb w8, [sp, #95] 1005; NONEON-NOSVE-NEXT: ldrb w8, [sp, #62] 1006; NONEON-NOSVE-NEXT: mul w8, w9, w8 1007; NONEON-NOSVE-NEXT: ldrb w9, [sp, #45] 1008; NONEON-NOSVE-NEXT: strb w8, [sp, #94] 1009; NONEON-NOSVE-NEXT: ldrb w8, [sp, #61] 1010; NONEON-NOSVE-NEXT: mul w8, w9, w8 1011; NONEON-NOSVE-NEXT: ldrb w9, [sp, #44] 1012; NONEON-NOSVE-NEXT: strb w8, [sp, #93] 1013; NONEON-NOSVE-NEXT: ldrb w8, [sp, #60] 1014; NONEON-NOSVE-NEXT: mul w8, w9, w8 1015; NONEON-NOSVE-NEXT: ldrb w9, [sp, #43] 1016; NONEON-NOSVE-NEXT: strb w8, [sp, #92] 1017; NONEON-NOSVE-NEXT: ldrb w8, [sp, #59] 1018; NONEON-NOSVE-NEXT: mul w8, w9, w8 1019; NONEON-NOSVE-NEXT: ldrb w9, [sp, #42] 1020; NONEON-NOSVE-NEXT: strb w8, [sp, #91] 1021; NONEON-NOSVE-NEXT: ldrb w8, [sp, #58] 1022; NONEON-NOSVE-NEXT: mul w8, w9, w8 1023; NONEON-NOSVE-NEXT: ldrb w9, [sp, #41] 1024; NONEON-NOSVE-NEXT: strb w8, [sp, #90] 1025; NONEON-NOSVE-NEXT: ldrb w8, [sp, #57] 1026; NONEON-NOSVE-NEXT: mul w8, w9, w8 1027; NONEON-NOSVE-NEXT: ldrb w9, [sp, #40] 1028; NONEON-NOSVE-NEXT: strb w8, [sp, #89] 1029; NONEON-NOSVE-NEXT: ldrb w8, [sp, #56] 1030; NONEON-NOSVE-NEXT: mul w8, w9, w8 1031; NONEON-NOSVE-NEXT: ldrb w9, [sp, #39] 1032; NONEON-NOSVE-NEXT: strb w8, [sp, #88] 1033; NONEON-NOSVE-NEXT: ldrb w8, [sp, #55] 1034; NONEON-NOSVE-NEXT: mul w8, w9, w8 1035; NONEON-NOSVE-NEXT: ldrb w9, [sp, #38] 1036; NONEON-NOSVE-NEXT: strb w8, [sp, #87] 1037; NONEON-NOSVE-NEXT: ldrb w8, [sp, #54] 1038; NONEON-NOSVE-NEXT: mul w8, w9, w8 1039; NONEON-NOSVE-NEXT: ldrb w9, [sp, #37] 1040; NONEON-NOSVE-NEXT: strb w8, [sp, #86] 1041; NONEON-NOSVE-NEXT: ldrb w8, [sp, #53] 1042; NONEON-NOSVE-NEXT: mul w8, w9, w8 1043; NONEON-NOSVE-NEXT: ldrb w9, [sp, #36] 1044; NONEON-NOSVE-NEXT: strb w8, [sp, #85] 1045; NONEON-NOSVE-NEXT: ldrb w8, [sp, #52] 1046; NONEON-NOSVE-NEXT: mul w8, w9, w8 1047; NONEON-NOSVE-NEXT: ldrb w9, [sp, #35] 1048; NONEON-NOSVE-NEXT: strb w8, [sp, #84] 1049; NONEON-NOSVE-NEXT: ldrb w8, [sp, #51] 1050; NONEON-NOSVE-NEXT: mul w8, w9, w8 1051; NONEON-NOSVE-NEXT: ldrb w9, [sp, #34] 1052; NONEON-NOSVE-NEXT: strb w8, [sp, #83] 1053; NONEON-NOSVE-NEXT: ldrb w8, [sp, #50] 1054; NONEON-NOSVE-NEXT: mul w8, w9, w8 1055; NONEON-NOSVE-NEXT: ldrb w9, [sp, #33] 1056; NONEON-NOSVE-NEXT: strb w8, [sp, #82] 1057; NONEON-NOSVE-NEXT: ldrb w8, [sp, #49] 1058; NONEON-NOSVE-NEXT: mul w8, w9, w8 1059; NONEON-NOSVE-NEXT: ldrb w9, [sp, #32] 1060; NONEON-NOSVE-NEXT: strb w8, [sp, #81] 1061; NONEON-NOSVE-NEXT: ldrb w8, [sp, #48] 1062; NONEON-NOSVE-NEXT: mul w8, w9, w8 1063; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15] 1064; NONEON-NOSVE-NEXT: strb w8, [sp, #80] 1065; NONEON-NOSVE-NEXT: ldrb w8, [sp, #31] 1066; NONEON-NOSVE-NEXT: mul w8, w9, w8 1067; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14] 1068; NONEON-NOSVE-NEXT: strb w8, [sp, #79] 1069; NONEON-NOSVE-NEXT: ldrb w8, [sp, #30] 1070; NONEON-NOSVE-NEXT: mul w8, w9, w8 1071; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13] 1072; NONEON-NOSVE-NEXT: strb w8, [sp, #78] 1073; NONEON-NOSVE-NEXT: ldrb w8, [sp, #29] 1074; NONEON-NOSVE-NEXT: mul w8, w9, w8 1075; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12] 1076; NONEON-NOSVE-NEXT: strb w8, [sp, #77] 1077; NONEON-NOSVE-NEXT: ldrb w8, [sp, #28] 1078; NONEON-NOSVE-NEXT: mul w8, w9, w8 1079; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11] 1080; NONEON-NOSVE-NEXT: strb w8, [sp, #76] 1081; NONEON-NOSVE-NEXT: ldrb w8, [sp, #27] 1082; NONEON-NOSVE-NEXT: mul w8, w9, w8 1083; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10] 1084; NONEON-NOSVE-NEXT: strb w8, [sp, #75] 1085; NONEON-NOSVE-NEXT: ldrb w8, [sp, #26] 1086; NONEON-NOSVE-NEXT: mul w8, w9, w8 1087; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9] 1088; NONEON-NOSVE-NEXT: strb w8, [sp, #74] 1089; NONEON-NOSVE-NEXT: ldrb w8, [sp, #25] 1090; NONEON-NOSVE-NEXT: mul w8, w9, w8 1091; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8] 1092; NONEON-NOSVE-NEXT: strb w8, [sp, #73] 1093; NONEON-NOSVE-NEXT: ldrb w8, [sp, #24] 1094; NONEON-NOSVE-NEXT: mul w8, w9, w8 1095; NONEON-NOSVE-NEXT: ldrb w9, [sp, #7] 1096; NONEON-NOSVE-NEXT: strb w8, [sp, #72] 1097; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23] 1098; NONEON-NOSVE-NEXT: mul w8, w9, w8 1099; NONEON-NOSVE-NEXT: ldrb w9, [sp, #6] 1100; NONEON-NOSVE-NEXT: strb w8, [sp, #71] 1101; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22] 1102; NONEON-NOSVE-NEXT: mul w8, w9, w8 1103; NONEON-NOSVE-NEXT: ldrb w9, [sp, #5] 1104; NONEON-NOSVE-NEXT: strb w8, [sp, #70] 1105; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21] 1106; NONEON-NOSVE-NEXT: mul w8, w9, w8 1107; NONEON-NOSVE-NEXT: ldrb w9, [sp, #4] 1108; NONEON-NOSVE-NEXT: strb w8, [sp, #69] 1109; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20] 1110; NONEON-NOSVE-NEXT: mul w8, w9, w8 1111; NONEON-NOSVE-NEXT: ldrb w9, [sp, #3] 1112; NONEON-NOSVE-NEXT: strb w8, [sp, #68] 1113; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19] 1114; NONEON-NOSVE-NEXT: mul w8, w9, w8 1115; NONEON-NOSVE-NEXT: ldrb w9, [sp, #2] 1116; NONEON-NOSVE-NEXT: strb w8, [sp, #67] 1117; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18] 1118; NONEON-NOSVE-NEXT: mul w8, w9, w8 1119; NONEON-NOSVE-NEXT: ldrb w9, [sp, #1] 1120; NONEON-NOSVE-NEXT: strb w8, [sp, #66] 1121; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17] 1122; NONEON-NOSVE-NEXT: mul w8, w9, w8 1123; NONEON-NOSVE-NEXT: ldrb w9, [sp] 1124; NONEON-NOSVE-NEXT: strb w8, [sp, #65] 1125; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16] 1126; NONEON-NOSVE-NEXT: mul w8, w9, w8 1127; NONEON-NOSVE-NEXT: strb w8, [sp, #64] 1128; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 1129; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 1130; NONEON-NOSVE-NEXT: add sp, sp, #96 1131; NONEON-NOSVE-NEXT: ret 1132 %op1 = load <32 x i8>, ptr %a 1133 %op2 = load <32 x i8>, ptr %b 1134 %res = mul <32 x i8> %op1, %op2 1135 store <32 x i8> %res, ptr %a 1136 ret void 1137} 1138 1139define <2 x i16> @mul_v2i16(<2 x i16> %op1, <2 x i16> %op2) { 1140; SVE-LABEL: mul_v2i16: 1141; SVE: // %bb.0: 1142; SVE-NEXT: ptrue p0.s, vl2 1143; SVE-NEXT: // kill: def $d0 killed $d0 def $z0 1144; SVE-NEXT: // kill: def $d1 killed $d1 def $z1 1145; SVE-NEXT: mul z0.s, p0/m, z0.s, z1.s 1146; SVE-NEXT: // kill: def $d0 killed $d0 killed $z0 1147; SVE-NEXT: ret 1148; 1149; SVE2-LABEL: mul_v2i16: 1150; SVE2: // %bb.0: 1151; SVE2-NEXT: // kill: def $d0 killed $d0 def $z0 1152; SVE2-NEXT: // kill: def $d1 killed $d1 def $z1 1153; SVE2-NEXT: mul z0.s, z0.s, z1.s 1154; SVE2-NEXT: // kill: def $d0 killed $d0 killed $z0 1155; SVE2-NEXT: ret 1156; 1157; NONEON-NOSVE-LABEL: mul_v2i16: 1158; NONEON-NOSVE: // %bb.0: 1159; NONEON-NOSVE-NEXT: sub sp, sp, #32 1160; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 1161; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 1162; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8] 1163; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 1164; NONEON-NOSVE-NEXT: mul w11, w10, w8 1165; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 1166; NONEON-NOSVE-NEXT: mul w8, w9, w8 1167; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #24] 1168; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 1169; NONEON-NOSVE-NEXT: add sp, sp, #32 1170; NONEON-NOSVE-NEXT: ret 1171 %res = mul <2 x i16> %op1, %op2 1172 ret <2 x i16> %res 1173} 1174 1175define <4 x i16> @mul_v4i16(<4 x i16> %op1, <4 x i16> %op2) { 1176; SVE-LABEL: mul_v4i16: 1177; SVE: // %bb.0: 1178; SVE-NEXT: ptrue p0.h, vl4 1179; SVE-NEXT: // kill: def $d0 killed $d0 def $z0 1180; SVE-NEXT: // kill: def $d1 killed $d1 def $z1 1181; SVE-NEXT: mul z0.h, p0/m, z0.h, z1.h 1182; SVE-NEXT: // kill: def $d0 killed $d0 killed $z0 1183; SVE-NEXT: ret 1184; 1185; SVE2-LABEL: mul_v4i16: 1186; SVE2: // %bb.0: 1187; SVE2-NEXT: // kill: def $d0 killed $d0 def $z0 1188; SVE2-NEXT: // kill: def $d1 killed $d1 def $z1 1189; SVE2-NEXT: mul z0.h, z0.h, z1.h 1190; SVE2-NEXT: // kill: def $d0 killed $d0 killed $z0 1191; SVE2-NEXT: ret 1192; 1193; NONEON-NOSVE-LABEL: mul_v4i16: 1194; NONEON-NOSVE: // %bb.0: 1195; NONEON-NOSVE-NEXT: sub sp, sp, #32 1196; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 1197; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 1198; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22] 1199; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14] 1200; NONEON-NOSVE-NEXT: mul w8, w9, w8 1201; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12] 1202; NONEON-NOSVE-NEXT: strh w8, [sp, #30] 1203; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20] 1204; NONEON-NOSVE-NEXT: mul w8, w9, w8 1205; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10] 1206; NONEON-NOSVE-NEXT: strh w8, [sp, #28] 1207; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18] 1208; NONEON-NOSVE-NEXT: mul w8, w9, w8 1209; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8] 1210; NONEON-NOSVE-NEXT: strh w8, [sp, #26] 1211; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16] 1212; NONEON-NOSVE-NEXT: mul w8, w9, w8 1213; NONEON-NOSVE-NEXT: strh w8, [sp, #24] 1214; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 1215; NONEON-NOSVE-NEXT: add sp, sp, #32 1216; NONEON-NOSVE-NEXT: ret 1217 %res = mul <4 x i16> %op1, %op2 1218 ret <4 x i16> %res 1219} 1220 1221define <8 x i16> @mul_v8i16(<8 x i16> %op1, <8 x i16> %op2) { 1222; SVE-LABEL: mul_v8i16: 1223; SVE: // %bb.0: 1224; SVE-NEXT: ptrue p0.h, vl8 1225; SVE-NEXT: // kill: def $q0 killed $q0 def $z0 1226; SVE-NEXT: // kill: def $q1 killed $q1 def $z1 1227; SVE-NEXT: mul z0.h, p0/m, z0.h, z1.h 1228; SVE-NEXT: // kill: def $q0 killed $q0 killed $z0 1229; SVE-NEXT: ret 1230; 1231; SVE2-LABEL: mul_v8i16: 1232; SVE2: // %bb.0: 1233; SVE2-NEXT: // kill: def $q0 killed $q0 def $z0 1234; SVE2-NEXT: // kill: def $q1 killed $q1 def $z1 1235; SVE2-NEXT: mul z0.h, z0.h, z1.h 1236; SVE2-NEXT: // kill: def $q0 killed $q0 killed $z0 1237; SVE2-NEXT: ret 1238; 1239; NONEON-NOSVE-LABEL: mul_v8i16: 1240; NONEON-NOSVE: // %bb.0: 1241; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 1242; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 1243; NONEON-NOSVE-NEXT: ldrh w8, [sp, #30] 1244; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14] 1245; NONEON-NOSVE-NEXT: mul w8, w9, w8 1246; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12] 1247; NONEON-NOSVE-NEXT: strh w8, [sp, #46] 1248; NONEON-NOSVE-NEXT: ldrh w8, [sp, #28] 1249; NONEON-NOSVE-NEXT: mul w8, w9, w8 1250; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10] 1251; NONEON-NOSVE-NEXT: strh w8, [sp, #44] 1252; NONEON-NOSVE-NEXT: ldrh w8, [sp, #26] 1253; NONEON-NOSVE-NEXT: mul w8, w9, w8 1254; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8] 1255; NONEON-NOSVE-NEXT: strh w8, [sp, #42] 1256; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24] 1257; NONEON-NOSVE-NEXT: mul w8, w9, w8 1258; NONEON-NOSVE-NEXT: ldrh w9, [sp, #6] 1259; NONEON-NOSVE-NEXT: strh w8, [sp, #40] 1260; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22] 1261; NONEON-NOSVE-NEXT: mul w8, w9, w8 1262; NONEON-NOSVE-NEXT: ldrh w9, [sp, #4] 1263; NONEON-NOSVE-NEXT: strh w8, [sp, #38] 1264; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20] 1265; NONEON-NOSVE-NEXT: mul w8, w9, w8 1266; NONEON-NOSVE-NEXT: ldrh w9, [sp, #2] 1267; NONEON-NOSVE-NEXT: strh w8, [sp, #36] 1268; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18] 1269; NONEON-NOSVE-NEXT: mul w8, w9, w8 1270; NONEON-NOSVE-NEXT: ldrh w9, [sp] 1271; NONEON-NOSVE-NEXT: strh w8, [sp, #34] 1272; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16] 1273; NONEON-NOSVE-NEXT: mul w8, w9, w8 1274; NONEON-NOSVE-NEXT: strh w8, [sp, #32] 1275; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 1276; NONEON-NOSVE-NEXT: add sp, sp, #48 1277; NONEON-NOSVE-NEXT: ret 1278 %res = mul <8 x i16> %op1, %op2 1279 ret <8 x i16> %res 1280} 1281 1282define void @mul_v16i16(ptr %a, ptr %b) { 1283; SVE-LABEL: mul_v16i16: 1284; SVE: // %bb.0: 1285; SVE-NEXT: ldp q0, q3, [x1] 1286; SVE-NEXT: ptrue p0.h, vl8 1287; SVE-NEXT: ldp q1, q2, [x0] 1288; SVE-NEXT: mul z0.h, p0/m, z0.h, z1.h 1289; SVE-NEXT: movprfx z1, z2 1290; SVE-NEXT: mul z1.h, p0/m, z1.h, z3.h 1291; SVE-NEXT: stp q0, q1, [x0] 1292; SVE-NEXT: ret 1293; 1294; SVE2-LABEL: mul_v16i16: 1295; SVE2: // %bb.0: 1296; SVE2-NEXT: ldp q0, q3, [x1] 1297; SVE2-NEXT: ldp q1, q2, [x0] 1298; SVE2-NEXT: mul z0.h, z1.h, z0.h 1299; SVE2-NEXT: mul z1.h, z2.h, z3.h 1300; SVE2-NEXT: stp q0, q1, [x0] 1301; SVE2-NEXT: ret 1302; 1303; NONEON-NOSVE-LABEL: mul_v16i16: 1304; NONEON-NOSVE: // %bb.0: 1305; NONEON-NOSVE-NEXT: sub sp, sp, #96 1306; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 1307; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 1308; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 1309; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 1310; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 1311; NONEON-NOSVE-NEXT: ldrh w8, [sp, #62] 1312; NONEON-NOSVE-NEXT: ldrh w9, [sp, #46] 1313; NONEON-NOSVE-NEXT: mul w8, w9, w8 1314; NONEON-NOSVE-NEXT: ldrh w9, [sp, #44] 1315; NONEON-NOSVE-NEXT: strh w8, [sp, #94] 1316; NONEON-NOSVE-NEXT: ldrh w8, [sp, #60] 1317; NONEON-NOSVE-NEXT: mul w8, w9, w8 1318; NONEON-NOSVE-NEXT: ldrh w9, [sp, #42] 1319; NONEON-NOSVE-NEXT: strh w8, [sp, #92] 1320; NONEON-NOSVE-NEXT: ldrh w8, [sp, #58] 1321; NONEON-NOSVE-NEXT: mul w8, w9, w8 1322; NONEON-NOSVE-NEXT: ldrh w9, [sp, #40] 1323; NONEON-NOSVE-NEXT: strh w8, [sp, #90] 1324; NONEON-NOSVE-NEXT: ldrh w8, [sp, #56] 1325; NONEON-NOSVE-NEXT: mul w8, w9, w8 1326; NONEON-NOSVE-NEXT: ldrh w9, [sp, #38] 1327; NONEON-NOSVE-NEXT: strh w8, [sp, #88] 1328; NONEON-NOSVE-NEXT: ldrh w8, [sp, #54] 1329; NONEON-NOSVE-NEXT: mul w8, w9, w8 1330; NONEON-NOSVE-NEXT: ldrh w9, [sp, #36] 1331; NONEON-NOSVE-NEXT: strh w8, [sp, #86] 1332; NONEON-NOSVE-NEXT: ldrh w8, [sp, #52] 1333; NONEON-NOSVE-NEXT: mul w8, w9, w8 1334; NONEON-NOSVE-NEXT: ldrh w9, [sp, #34] 1335; NONEON-NOSVE-NEXT: strh w8, [sp, #84] 1336; NONEON-NOSVE-NEXT: ldrh w8, [sp, #50] 1337; NONEON-NOSVE-NEXT: mul w8, w9, w8 1338; NONEON-NOSVE-NEXT: ldrh w9, [sp, #32] 1339; NONEON-NOSVE-NEXT: strh w8, [sp, #82] 1340; NONEON-NOSVE-NEXT: ldrh w8, [sp, #48] 1341; NONEON-NOSVE-NEXT: mul w8, w9, w8 1342; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14] 1343; NONEON-NOSVE-NEXT: strh w8, [sp, #80] 1344; NONEON-NOSVE-NEXT: ldrh w8, [sp, #30] 1345; NONEON-NOSVE-NEXT: mul w8, w9, w8 1346; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12] 1347; NONEON-NOSVE-NEXT: strh w8, [sp, #78] 1348; NONEON-NOSVE-NEXT: ldrh w8, [sp, #28] 1349; NONEON-NOSVE-NEXT: mul w8, w9, w8 1350; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10] 1351; NONEON-NOSVE-NEXT: strh w8, [sp, #76] 1352; NONEON-NOSVE-NEXT: ldrh w8, [sp, #26] 1353; NONEON-NOSVE-NEXT: mul w8, w9, w8 1354; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8] 1355; NONEON-NOSVE-NEXT: strh w8, [sp, #74] 1356; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24] 1357; NONEON-NOSVE-NEXT: mul w8, w9, w8 1358; NONEON-NOSVE-NEXT: ldrh w9, [sp, #6] 1359; NONEON-NOSVE-NEXT: strh w8, [sp, #72] 1360; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22] 1361; NONEON-NOSVE-NEXT: mul w8, w9, w8 1362; NONEON-NOSVE-NEXT: ldrh w9, [sp, #4] 1363; NONEON-NOSVE-NEXT: strh w8, [sp, #70] 1364; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20] 1365; NONEON-NOSVE-NEXT: mul w8, w9, w8 1366; NONEON-NOSVE-NEXT: ldrh w9, [sp, #2] 1367; NONEON-NOSVE-NEXT: strh w8, [sp, #68] 1368; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18] 1369; NONEON-NOSVE-NEXT: mul w8, w9, w8 1370; NONEON-NOSVE-NEXT: ldrh w9, [sp] 1371; NONEON-NOSVE-NEXT: strh w8, [sp, #66] 1372; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16] 1373; NONEON-NOSVE-NEXT: mul w8, w9, w8 1374; NONEON-NOSVE-NEXT: strh w8, [sp, #64] 1375; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 1376; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 1377; NONEON-NOSVE-NEXT: add sp, sp, #96 1378; NONEON-NOSVE-NEXT: ret 1379 %op1 = load <16 x i16>, ptr %a 1380 %op2 = load <16 x i16>, ptr %b 1381 %res = mul <16 x i16> %op1, %op2 1382 store <16 x i16> %res, ptr %a 1383 ret void 1384} 1385 1386define <2 x i32> @mul_v2i32(<2 x i32> %op1, <2 x i32> %op2) { 1387; SVE-LABEL: mul_v2i32: 1388; SVE: // %bb.0: 1389; SVE-NEXT: ptrue p0.s, vl2 1390; SVE-NEXT: // kill: def $d0 killed $d0 def $z0 1391; SVE-NEXT: // kill: def $d1 killed $d1 def $z1 1392; SVE-NEXT: mul z0.s, p0/m, z0.s, z1.s 1393; SVE-NEXT: // kill: def $d0 killed $d0 killed $z0 1394; SVE-NEXT: ret 1395; 1396; SVE2-LABEL: mul_v2i32: 1397; SVE2: // %bb.0: 1398; SVE2-NEXT: // kill: def $d0 killed $d0 def $z0 1399; SVE2-NEXT: // kill: def $d1 killed $d1 def $z1 1400; SVE2-NEXT: mul z0.s, z0.s, z1.s 1401; SVE2-NEXT: // kill: def $d0 killed $d0 killed $z0 1402; SVE2-NEXT: ret 1403; 1404; NONEON-NOSVE-LABEL: mul_v2i32: 1405; NONEON-NOSVE: // %bb.0: 1406; NONEON-NOSVE-NEXT: sub sp, sp, #32 1407; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 1408; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 1409; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8] 1410; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 1411; NONEON-NOSVE-NEXT: mul w11, w10, w8 1412; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 1413; NONEON-NOSVE-NEXT: mul w8, w9, w8 1414; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #24] 1415; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 1416; NONEON-NOSVE-NEXT: add sp, sp, #32 1417; NONEON-NOSVE-NEXT: ret 1418 %res = mul <2 x i32> %op1, %op2 1419 ret <2 x i32> %res 1420} 1421 1422define <4 x i32> @mul_v4i32(<4 x i32> %op1, <4 x i32> %op2) { 1423; SVE-LABEL: mul_v4i32: 1424; SVE: // %bb.0: 1425; SVE-NEXT: ptrue p0.s, vl4 1426; SVE-NEXT: // kill: def $q0 killed $q0 def $z0 1427; SVE-NEXT: // kill: def $q1 killed $q1 def $z1 1428; SVE-NEXT: mul z0.s, p0/m, z0.s, z1.s 1429; SVE-NEXT: // kill: def $q0 killed $q0 killed $z0 1430; SVE-NEXT: ret 1431; 1432; SVE2-LABEL: mul_v4i32: 1433; SVE2: // %bb.0: 1434; SVE2-NEXT: // kill: def $q0 killed $q0 def $z0 1435; SVE2-NEXT: // kill: def $q1 killed $q1 def $z1 1436; SVE2-NEXT: mul z0.s, z0.s, z1.s 1437; SVE2-NEXT: // kill: def $q0 killed $q0 killed $z0 1438; SVE2-NEXT: ret 1439; 1440; NONEON-NOSVE-LABEL: mul_v4i32: 1441; NONEON-NOSVE: // %bb.0: 1442; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 1443; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 1444; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8] 1445; NONEON-NOSVE-NEXT: ldr w8, [sp, #28] 1446; NONEON-NOSVE-NEXT: mul w11, w10, w8 1447; NONEON-NOSVE-NEXT: ldr w8, [sp, #24] 1448; NONEON-NOSVE-NEXT: mul w8, w9, w8 1449; NONEON-NOSVE-NEXT: ldp w9, w10, [sp] 1450; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #40] 1451; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 1452; NONEON-NOSVE-NEXT: mul w11, w10, w8 1453; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 1454; NONEON-NOSVE-NEXT: mul w8, w9, w8 1455; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #32] 1456; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 1457; NONEON-NOSVE-NEXT: add sp, sp, #48 1458; NONEON-NOSVE-NEXT: ret 1459 %res = mul <4 x i32> %op1, %op2 1460 ret <4 x i32> %res 1461} 1462 1463define void @mul_v8i32(ptr %a, ptr %b) { 1464; SVE-LABEL: mul_v8i32: 1465; SVE: // %bb.0: 1466; SVE-NEXT: ldp q0, q3, [x1] 1467; SVE-NEXT: ptrue p0.s, vl4 1468; SVE-NEXT: ldp q1, q2, [x0] 1469; SVE-NEXT: mul z0.s, p0/m, z0.s, z1.s 1470; SVE-NEXT: movprfx z1, z2 1471; SVE-NEXT: mul z1.s, p0/m, z1.s, z3.s 1472; SVE-NEXT: stp q0, q1, [x0] 1473; SVE-NEXT: ret 1474; 1475; SVE2-LABEL: mul_v8i32: 1476; SVE2: // %bb.0: 1477; SVE2-NEXT: ldp q0, q3, [x1] 1478; SVE2-NEXT: ldp q1, q2, [x0] 1479; SVE2-NEXT: mul z0.s, z1.s, z0.s 1480; SVE2-NEXT: mul z1.s, z2.s, z3.s 1481; SVE2-NEXT: stp q0, q1, [x0] 1482; SVE2-NEXT: ret 1483; 1484; NONEON-NOSVE-LABEL: mul_v8i32: 1485; NONEON-NOSVE: // %bb.0: 1486; NONEON-NOSVE-NEXT: sub sp, sp, #96 1487; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 1488; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 1489; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 1490; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 1491; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 1492; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #40] 1493; NONEON-NOSVE-NEXT: ldr w8, [sp, #60] 1494; NONEON-NOSVE-NEXT: mul w11, w10, w8 1495; NONEON-NOSVE-NEXT: ldr w8, [sp, #56] 1496; NONEON-NOSVE-NEXT: mul w8, w9, w8 1497; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #32] 1498; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #88] 1499; NONEON-NOSVE-NEXT: ldr w8, [sp, #52] 1500; NONEON-NOSVE-NEXT: mul w11, w10, w8 1501; NONEON-NOSVE-NEXT: ldr w8, [sp, #48] 1502; NONEON-NOSVE-NEXT: mul w8, w9, w8 1503; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8] 1504; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #80] 1505; NONEON-NOSVE-NEXT: ldr w8, [sp, #28] 1506; NONEON-NOSVE-NEXT: mul w11, w10, w8 1507; NONEON-NOSVE-NEXT: ldr w8, [sp, #24] 1508; NONEON-NOSVE-NEXT: mul w8, w9, w8 1509; NONEON-NOSVE-NEXT: ldp w9, w10, [sp] 1510; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #72] 1511; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 1512; NONEON-NOSVE-NEXT: mul w11, w10, w8 1513; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 1514; NONEON-NOSVE-NEXT: mul w8, w9, w8 1515; NONEON-NOSVE-NEXT: stp w8, w11, [sp, #64] 1516; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 1517; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 1518; NONEON-NOSVE-NEXT: add sp, sp, #96 1519; NONEON-NOSVE-NEXT: ret 1520 %op1 = load <8 x i32>, ptr %a 1521 %op2 = load <8 x i32>, ptr %b 1522 %res = mul <8 x i32> %op1, %op2 1523 store <8 x i32> %res, ptr %a 1524 ret void 1525} 1526 1527define <1 x i64> @mul_v1i64(<1 x i64> %op1, <1 x i64> %op2) { 1528; SVE-LABEL: mul_v1i64: 1529; SVE: // %bb.0: 1530; SVE-NEXT: ptrue p0.d, vl1 1531; SVE-NEXT: // kill: def $d0 killed $d0 def $z0 1532; SVE-NEXT: // kill: def $d1 killed $d1 def $z1 1533; SVE-NEXT: mul z0.d, p0/m, z0.d, z1.d 1534; SVE-NEXT: // kill: def $d0 killed $d0 killed $z0 1535; SVE-NEXT: ret 1536; 1537; SVE2-LABEL: mul_v1i64: 1538; SVE2: // %bb.0: 1539; SVE2-NEXT: // kill: def $d0 killed $d0 def $z0 1540; SVE2-NEXT: // kill: def $d1 killed $d1 def $z1 1541; SVE2-NEXT: mul z0.d, z0.d, z1.d 1542; SVE2-NEXT: // kill: def $d0 killed $d0 killed $z0 1543; SVE2-NEXT: ret 1544; 1545; NONEON-NOSVE-LABEL: mul_v1i64: 1546; NONEON-NOSVE: // %bb.0: 1547; NONEON-NOSVE-NEXT: sub sp, sp, #16 1548; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 1549; NONEON-NOSVE-NEXT: fmov x8, d1 1550; NONEON-NOSVE-NEXT: fmov x9, d0 1551; NONEON-NOSVE-NEXT: mul x8, x9, x8 1552; NONEON-NOSVE-NEXT: str x8, [sp, #8] 1553; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 1554; NONEON-NOSVE-NEXT: add sp, sp, #16 1555; NONEON-NOSVE-NEXT: ret 1556 %res = mul <1 x i64> %op1, %op2 1557 ret <1 x i64> %res 1558} 1559 1560define <2 x i64> @mul_v2i64(<2 x i64> %op1, <2 x i64> %op2) { 1561; SVE-LABEL: mul_v2i64: 1562; SVE: // %bb.0: 1563; SVE-NEXT: ptrue p0.d, vl2 1564; SVE-NEXT: // kill: def $q0 killed $q0 def $z0 1565; SVE-NEXT: // kill: def $q1 killed $q1 def $z1 1566; SVE-NEXT: mul z0.d, p0/m, z0.d, z1.d 1567; SVE-NEXT: // kill: def $q0 killed $q0 killed $z0 1568; SVE-NEXT: ret 1569; 1570; SVE2-LABEL: mul_v2i64: 1571; SVE2: // %bb.0: 1572; SVE2-NEXT: // kill: def $q0 killed $q0 def $z0 1573; SVE2-NEXT: // kill: def $q1 killed $q1 def $z1 1574; SVE2-NEXT: mul z0.d, z0.d, z1.d 1575; SVE2-NEXT: // kill: def $q0 killed $q0 killed $z0 1576; SVE2-NEXT: ret 1577; 1578; NONEON-NOSVE-LABEL: mul_v2i64: 1579; NONEON-NOSVE: // %bb.0: 1580; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 1581; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 1582; NONEON-NOSVE-NEXT: ldp x9, x10, [sp] 1583; NONEON-NOSVE-NEXT: ldr x8, [sp, #24] 1584; NONEON-NOSVE-NEXT: mul x11, x10, x8 1585; NONEON-NOSVE-NEXT: ldr x8, [sp, #16] 1586; NONEON-NOSVE-NEXT: mul x8, x9, x8 1587; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #32] 1588; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 1589; NONEON-NOSVE-NEXT: add sp, sp, #48 1590; NONEON-NOSVE-NEXT: ret 1591 %res = mul <2 x i64> %op1, %op2 1592 ret <2 x i64> %res 1593} 1594 1595define void @mul_v4i64(ptr %a, ptr %b) { 1596; SVE-LABEL: mul_v4i64: 1597; SVE: // %bb.0: 1598; SVE-NEXT: ldp q0, q3, [x1] 1599; SVE-NEXT: ptrue p0.d, vl2 1600; SVE-NEXT: ldp q1, q2, [x0] 1601; SVE-NEXT: mul z0.d, p0/m, z0.d, z1.d 1602; SVE-NEXT: movprfx z1, z2 1603; SVE-NEXT: mul z1.d, p0/m, z1.d, z3.d 1604; SVE-NEXT: stp q0, q1, [x0] 1605; SVE-NEXT: ret 1606; 1607; SVE2-LABEL: mul_v4i64: 1608; SVE2: // %bb.0: 1609; SVE2-NEXT: ldp q0, q3, [x1] 1610; SVE2-NEXT: ldp q1, q2, [x0] 1611; SVE2-NEXT: mul z0.d, z1.d, z0.d 1612; SVE2-NEXT: mul z1.d, z2.d, z3.d 1613; SVE2-NEXT: stp q0, q1, [x0] 1614; SVE2-NEXT: ret 1615; 1616; NONEON-NOSVE-LABEL: mul_v4i64: 1617; NONEON-NOSVE: // %bb.0: 1618; NONEON-NOSVE-NEXT: sub sp, sp, #96 1619; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 1620; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 1621; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 1622; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 1623; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 1624; NONEON-NOSVE-NEXT: ldp x9, x10, [sp, #32] 1625; NONEON-NOSVE-NEXT: ldr x8, [sp, #56] 1626; NONEON-NOSVE-NEXT: mul x11, x10, x8 1627; NONEON-NOSVE-NEXT: ldr x8, [sp, #48] 1628; NONEON-NOSVE-NEXT: mul x8, x9, x8 1629; NONEON-NOSVE-NEXT: ldp x9, x10, [sp] 1630; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #80] 1631; NONEON-NOSVE-NEXT: ldr x8, [sp, #24] 1632; NONEON-NOSVE-NEXT: mul x11, x10, x8 1633; NONEON-NOSVE-NEXT: ldr x8, [sp, #16] 1634; NONEON-NOSVE-NEXT: mul x8, x9, x8 1635; NONEON-NOSVE-NEXT: stp x8, x11, [sp, #64] 1636; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 1637; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 1638; NONEON-NOSVE-NEXT: add sp, sp, #96 1639; NONEON-NOSVE-NEXT: ret 1640 %op1 = load <4 x i64>, ptr %a 1641 %op2 = load <4 x i64>, ptr %b 1642 %res = mul <4 x i64> %op1, %op2 1643 store <4 x i64> %res, ptr %a 1644 ret void 1645} 1646 1647; 1648; SUB 1649; 1650 1651define <4 x i8> @sub_v4i8(<4 x i8> %op1, <4 x i8> %op2) { 1652; CHECK-LABEL: sub_v4i8: 1653; CHECK: // %bb.0: 1654; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1655; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 1656; CHECK-NEXT: sub z0.h, z0.h, z1.h 1657; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 1658; CHECK-NEXT: ret 1659; 1660; NONEON-NOSVE-LABEL: sub_v4i8: 1661; NONEON-NOSVE: // %bb.0: 1662; NONEON-NOSVE-NEXT: sub sp, sp, #32 1663; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 1664; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 1665; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22] 1666; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14] 1667; NONEON-NOSVE-NEXT: sub w8, w9, w8 1668; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12] 1669; NONEON-NOSVE-NEXT: strh w8, [sp, #30] 1670; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20] 1671; NONEON-NOSVE-NEXT: sub w8, w9, w8 1672; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10] 1673; NONEON-NOSVE-NEXT: strh w8, [sp, #28] 1674; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18] 1675; NONEON-NOSVE-NEXT: sub w8, w9, w8 1676; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8] 1677; NONEON-NOSVE-NEXT: strh w8, [sp, #26] 1678; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16] 1679; NONEON-NOSVE-NEXT: sub w8, w9, w8 1680; NONEON-NOSVE-NEXT: strh w8, [sp, #24] 1681; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 1682; NONEON-NOSVE-NEXT: add sp, sp, #32 1683; NONEON-NOSVE-NEXT: ret 1684 %res = sub <4 x i8> %op1, %op2 1685 ret <4 x i8> %res 1686} 1687 1688define <8 x i8> @sub_v8i8(<8 x i8> %op1, <8 x i8> %op2) { 1689; CHECK-LABEL: sub_v8i8: 1690; CHECK: // %bb.0: 1691; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1692; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 1693; CHECK-NEXT: sub z0.b, z0.b, z1.b 1694; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 1695; CHECK-NEXT: ret 1696; 1697; NONEON-NOSVE-LABEL: sub_v8i8: 1698; NONEON-NOSVE: // %bb.0: 1699; NONEON-NOSVE-NEXT: sub sp, sp, #32 1700; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 1701; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 1702; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23] 1703; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15] 1704; NONEON-NOSVE-NEXT: sub w8, w9, w8 1705; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14] 1706; NONEON-NOSVE-NEXT: strb w8, [sp, #31] 1707; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22] 1708; NONEON-NOSVE-NEXT: sub w8, w9, w8 1709; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13] 1710; NONEON-NOSVE-NEXT: strb w8, [sp, #30] 1711; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21] 1712; NONEON-NOSVE-NEXT: sub w8, w9, w8 1713; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12] 1714; NONEON-NOSVE-NEXT: strb w8, [sp, #29] 1715; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20] 1716; NONEON-NOSVE-NEXT: sub w8, w9, w8 1717; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11] 1718; NONEON-NOSVE-NEXT: strb w8, [sp, #28] 1719; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19] 1720; NONEON-NOSVE-NEXT: sub w8, w9, w8 1721; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10] 1722; NONEON-NOSVE-NEXT: strb w8, [sp, #27] 1723; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18] 1724; NONEON-NOSVE-NEXT: sub w8, w9, w8 1725; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9] 1726; NONEON-NOSVE-NEXT: strb w8, [sp, #26] 1727; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17] 1728; NONEON-NOSVE-NEXT: sub w8, w9, w8 1729; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8] 1730; NONEON-NOSVE-NEXT: strb w8, [sp, #25] 1731; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16] 1732; NONEON-NOSVE-NEXT: sub w8, w9, w8 1733; NONEON-NOSVE-NEXT: strb w8, [sp, #24] 1734; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 1735; NONEON-NOSVE-NEXT: add sp, sp, #32 1736; NONEON-NOSVE-NEXT: ret 1737 %res = sub <8 x i8> %op1, %op2 1738 ret <8 x i8> %res 1739} 1740 1741define <16 x i8> @sub_v16i8(<16 x i8> %op1, <16 x i8> %op2) { 1742; CHECK-LABEL: sub_v16i8: 1743; CHECK: // %bb.0: 1744; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 1745; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 1746; CHECK-NEXT: sub z0.b, z0.b, z1.b 1747; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 1748; CHECK-NEXT: ret 1749; 1750; NONEON-NOSVE-LABEL: sub_v16i8: 1751; NONEON-NOSVE: // %bb.0: 1752; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 1753; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 1754; NONEON-NOSVE-NEXT: ldrb w8, [sp, #31] 1755; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15] 1756; NONEON-NOSVE-NEXT: sub w8, w9, w8 1757; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14] 1758; NONEON-NOSVE-NEXT: strb w8, [sp, #47] 1759; NONEON-NOSVE-NEXT: ldrb w8, [sp, #30] 1760; NONEON-NOSVE-NEXT: sub w8, w9, w8 1761; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13] 1762; NONEON-NOSVE-NEXT: strb w8, [sp, #46] 1763; NONEON-NOSVE-NEXT: ldrb w8, [sp, #29] 1764; NONEON-NOSVE-NEXT: sub w8, w9, w8 1765; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12] 1766; NONEON-NOSVE-NEXT: strb w8, [sp, #45] 1767; NONEON-NOSVE-NEXT: ldrb w8, [sp, #28] 1768; NONEON-NOSVE-NEXT: sub w8, w9, w8 1769; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11] 1770; NONEON-NOSVE-NEXT: strb w8, [sp, #44] 1771; NONEON-NOSVE-NEXT: ldrb w8, [sp, #27] 1772; NONEON-NOSVE-NEXT: sub w8, w9, w8 1773; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10] 1774; NONEON-NOSVE-NEXT: strb w8, [sp, #43] 1775; NONEON-NOSVE-NEXT: ldrb w8, [sp, #26] 1776; NONEON-NOSVE-NEXT: sub w8, w9, w8 1777; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9] 1778; NONEON-NOSVE-NEXT: strb w8, [sp, #42] 1779; NONEON-NOSVE-NEXT: ldrb w8, [sp, #25] 1780; NONEON-NOSVE-NEXT: sub w8, w9, w8 1781; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8] 1782; NONEON-NOSVE-NEXT: strb w8, [sp, #41] 1783; NONEON-NOSVE-NEXT: ldrb w8, [sp, #24] 1784; NONEON-NOSVE-NEXT: sub w8, w9, w8 1785; NONEON-NOSVE-NEXT: ldrb w9, [sp, #7] 1786; NONEON-NOSVE-NEXT: strb w8, [sp, #40] 1787; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23] 1788; NONEON-NOSVE-NEXT: sub w8, w9, w8 1789; NONEON-NOSVE-NEXT: ldrb w9, [sp, #6] 1790; NONEON-NOSVE-NEXT: strb w8, [sp, #39] 1791; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22] 1792; NONEON-NOSVE-NEXT: sub w8, w9, w8 1793; NONEON-NOSVE-NEXT: ldrb w9, [sp, #5] 1794; NONEON-NOSVE-NEXT: strb w8, [sp, #38] 1795; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21] 1796; NONEON-NOSVE-NEXT: sub w8, w9, w8 1797; NONEON-NOSVE-NEXT: ldrb w9, [sp, #4] 1798; NONEON-NOSVE-NEXT: strb w8, [sp, #37] 1799; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20] 1800; NONEON-NOSVE-NEXT: sub w8, w9, w8 1801; NONEON-NOSVE-NEXT: ldrb w9, [sp, #3] 1802; NONEON-NOSVE-NEXT: strb w8, [sp, #36] 1803; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19] 1804; NONEON-NOSVE-NEXT: sub w8, w9, w8 1805; NONEON-NOSVE-NEXT: ldrb w9, [sp, #2] 1806; NONEON-NOSVE-NEXT: strb w8, [sp, #35] 1807; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18] 1808; NONEON-NOSVE-NEXT: sub w8, w9, w8 1809; NONEON-NOSVE-NEXT: ldrb w9, [sp, #1] 1810; NONEON-NOSVE-NEXT: strb w8, [sp, #34] 1811; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17] 1812; NONEON-NOSVE-NEXT: sub w8, w9, w8 1813; NONEON-NOSVE-NEXT: ldrb w9, [sp] 1814; NONEON-NOSVE-NEXT: strb w8, [sp, #33] 1815; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16] 1816; NONEON-NOSVE-NEXT: sub w8, w9, w8 1817; NONEON-NOSVE-NEXT: strb w8, [sp, #32] 1818; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 1819; NONEON-NOSVE-NEXT: add sp, sp, #48 1820; NONEON-NOSVE-NEXT: ret 1821 %res = sub <16 x i8> %op1, %op2 1822 ret <16 x i8> %res 1823} 1824 1825define void @sub_v32i8(ptr %a, ptr %b) { 1826; CHECK-LABEL: sub_v32i8: 1827; CHECK: // %bb.0: 1828; CHECK-NEXT: ldp q0, q3, [x1] 1829; CHECK-NEXT: ldp q1, q2, [x0] 1830; CHECK-NEXT: sub z0.b, z1.b, z0.b 1831; CHECK-NEXT: sub z1.b, z2.b, z3.b 1832; CHECK-NEXT: stp q0, q1, [x0] 1833; CHECK-NEXT: ret 1834; 1835; NONEON-NOSVE-LABEL: sub_v32i8: 1836; NONEON-NOSVE: // %bb.0: 1837; NONEON-NOSVE-NEXT: sub sp, sp, #96 1838; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 1839; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 1840; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 1841; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 1842; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 1843; NONEON-NOSVE-NEXT: ldrb w8, [sp, #63] 1844; NONEON-NOSVE-NEXT: ldrb w9, [sp, #47] 1845; NONEON-NOSVE-NEXT: sub w8, w9, w8 1846; NONEON-NOSVE-NEXT: ldrb w9, [sp, #46] 1847; NONEON-NOSVE-NEXT: strb w8, [sp, #95] 1848; NONEON-NOSVE-NEXT: ldrb w8, [sp, #62] 1849; NONEON-NOSVE-NEXT: sub w8, w9, w8 1850; NONEON-NOSVE-NEXT: ldrb w9, [sp, #45] 1851; NONEON-NOSVE-NEXT: strb w8, [sp, #94] 1852; NONEON-NOSVE-NEXT: ldrb w8, [sp, #61] 1853; NONEON-NOSVE-NEXT: sub w8, w9, w8 1854; NONEON-NOSVE-NEXT: ldrb w9, [sp, #44] 1855; NONEON-NOSVE-NEXT: strb w8, [sp, #93] 1856; NONEON-NOSVE-NEXT: ldrb w8, [sp, #60] 1857; NONEON-NOSVE-NEXT: sub w8, w9, w8 1858; NONEON-NOSVE-NEXT: ldrb w9, [sp, #43] 1859; NONEON-NOSVE-NEXT: strb w8, [sp, #92] 1860; NONEON-NOSVE-NEXT: ldrb w8, [sp, #59] 1861; NONEON-NOSVE-NEXT: sub w8, w9, w8 1862; NONEON-NOSVE-NEXT: ldrb w9, [sp, #42] 1863; NONEON-NOSVE-NEXT: strb w8, [sp, #91] 1864; NONEON-NOSVE-NEXT: ldrb w8, [sp, #58] 1865; NONEON-NOSVE-NEXT: sub w8, w9, w8 1866; NONEON-NOSVE-NEXT: ldrb w9, [sp, #41] 1867; NONEON-NOSVE-NEXT: strb w8, [sp, #90] 1868; NONEON-NOSVE-NEXT: ldrb w8, [sp, #57] 1869; NONEON-NOSVE-NEXT: sub w8, w9, w8 1870; NONEON-NOSVE-NEXT: ldrb w9, [sp, #40] 1871; NONEON-NOSVE-NEXT: strb w8, [sp, #89] 1872; NONEON-NOSVE-NEXT: ldrb w8, [sp, #56] 1873; NONEON-NOSVE-NEXT: sub w8, w9, w8 1874; NONEON-NOSVE-NEXT: ldrb w9, [sp, #39] 1875; NONEON-NOSVE-NEXT: strb w8, [sp, #88] 1876; NONEON-NOSVE-NEXT: ldrb w8, [sp, #55] 1877; NONEON-NOSVE-NEXT: sub w8, w9, w8 1878; NONEON-NOSVE-NEXT: ldrb w9, [sp, #38] 1879; NONEON-NOSVE-NEXT: strb w8, [sp, #87] 1880; NONEON-NOSVE-NEXT: ldrb w8, [sp, #54] 1881; NONEON-NOSVE-NEXT: sub w8, w9, w8 1882; NONEON-NOSVE-NEXT: ldrb w9, [sp, #37] 1883; NONEON-NOSVE-NEXT: strb w8, [sp, #86] 1884; NONEON-NOSVE-NEXT: ldrb w8, [sp, #53] 1885; NONEON-NOSVE-NEXT: sub w8, w9, w8 1886; NONEON-NOSVE-NEXT: ldrb w9, [sp, #36] 1887; NONEON-NOSVE-NEXT: strb w8, [sp, #85] 1888; NONEON-NOSVE-NEXT: ldrb w8, [sp, #52] 1889; NONEON-NOSVE-NEXT: sub w8, w9, w8 1890; NONEON-NOSVE-NEXT: ldrb w9, [sp, #35] 1891; NONEON-NOSVE-NEXT: strb w8, [sp, #84] 1892; NONEON-NOSVE-NEXT: ldrb w8, [sp, #51] 1893; NONEON-NOSVE-NEXT: sub w8, w9, w8 1894; NONEON-NOSVE-NEXT: ldrb w9, [sp, #34] 1895; NONEON-NOSVE-NEXT: strb w8, [sp, #83] 1896; NONEON-NOSVE-NEXT: ldrb w8, [sp, #50] 1897; NONEON-NOSVE-NEXT: sub w8, w9, w8 1898; NONEON-NOSVE-NEXT: ldrb w9, [sp, #33] 1899; NONEON-NOSVE-NEXT: strb w8, [sp, #82] 1900; NONEON-NOSVE-NEXT: ldrb w8, [sp, #49] 1901; NONEON-NOSVE-NEXT: sub w8, w9, w8 1902; NONEON-NOSVE-NEXT: ldrb w9, [sp, #32] 1903; NONEON-NOSVE-NEXT: strb w8, [sp, #81] 1904; NONEON-NOSVE-NEXT: ldrb w8, [sp, #48] 1905; NONEON-NOSVE-NEXT: sub w8, w9, w8 1906; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15] 1907; NONEON-NOSVE-NEXT: strb w8, [sp, #80] 1908; NONEON-NOSVE-NEXT: ldrb w8, [sp, #31] 1909; NONEON-NOSVE-NEXT: sub w8, w9, w8 1910; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14] 1911; NONEON-NOSVE-NEXT: strb w8, [sp, #79] 1912; NONEON-NOSVE-NEXT: ldrb w8, [sp, #30] 1913; NONEON-NOSVE-NEXT: sub w8, w9, w8 1914; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13] 1915; NONEON-NOSVE-NEXT: strb w8, [sp, #78] 1916; NONEON-NOSVE-NEXT: ldrb w8, [sp, #29] 1917; NONEON-NOSVE-NEXT: sub w8, w9, w8 1918; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12] 1919; NONEON-NOSVE-NEXT: strb w8, [sp, #77] 1920; NONEON-NOSVE-NEXT: ldrb w8, [sp, #28] 1921; NONEON-NOSVE-NEXT: sub w8, w9, w8 1922; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11] 1923; NONEON-NOSVE-NEXT: strb w8, [sp, #76] 1924; NONEON-NOSVE-NEXT: ldrb w8, [sp, #27] 1925; NONEON-NOSVE-NEXT: sub w8, w9, w8 1926; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10] 1927; NONEON-NOSVE-NEXT: strb w8, [sp, #75] 1928; NONEON-NOSVE-NEXT: ldrb w8, [sp, #26] 1929; NONEON-NOSVE-NEXT: sub w8, w9, w8 1930; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9] 1931; NONEON-NOSVE-NEXT: strb w8, [sp, #74] 1932; NONEON-NOSVE-NEXT: ldrb w8, [sp, #25] 1933; NONEON-NOSVE-NEXT: sub w8, w9, w8 1934; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8] 1935; NONEON-NOSVE-NEXT: strb w8, [sp, #73] 1936; NONEON-NOSVE-NEXT: ldrb w8, [sp, #24] 1937; NONEON-NOSVE-NEXT: sub w8, w9, w8 1938; NONEON-NOSVE-NEXT: ldrb w9, [sp, #7] 1939; NONEON-NOSVE-NEXT: strb w8, [sp, #72] 1940; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23] 1941; NONEON-NOSVE-NEXT: sub w8, w9, w8 1942; NONEON-NOSVE-NEXT: ldrb w9, [sp, #6] 1943; NONEON-NOSVE-NEXT: strb w8, [sp, #71] 1944; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22] 1945; NONEON-NOSVE-NEXT: sub w8, w9, w8 1946; NONEON-NOSVE-NEXT: ldrb w9, [sp, #5] 1947; NONEON-NOSVE-NEXT: strb w8, [sp, #70] 1948; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21] 1949; NONEON-NOSVE-NEXT: sub w8, w9, w8 1950; NONEON-NOSVE-NEXT: ldrb w9, [sp, #4] 1951; NONEON-NOSVE-NEXT: strb w8, [sp, #69] 1952; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20] 1953; NONEON-NOSVE-NEXT: sub w8, w9, w8 1954; NONEON-NOSVE-NEXT: ldrb w9, [sp, #3] 1955; NONEON-NOSVE-NEXT: strb w8, [sp, #68] 1956; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19] 1957; NONEON-NOSVE-NEXT: sub w8, w9, w8 1958; NONEON-NOSVE-NEXT: ldrb w9, [sp, #2] 1959; NONEON-NOSVE-NEXT: strb w8, [sp, #67] 1960; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18] 1961; NONEON-NOSVE-NEXT: sub w8, w9, w8 1962; NONEON-NOSVE-NEXT: ldrb w9, [sp, #1] 1963; NONEON-NOSVE-NEXT: strb w8, [sp, #66] 1964; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17] 1965; NONEON-NOSVE-NEXT: sub w8, w9, w8 1966; NONEON-NOSVE-NEXT: ldrb w9, [sp] 1967; NONEON-NOSVE-NEXT: strb w8, [sp, #65] 1968; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16] 1969; NONEON-NOSVE-NEXT: sub w8, w9, w8 1970; NONEON-NOSVE-NEXT: strb w8, [sp, #64] 1971; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 1972; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 1973; NONEON-NOSVE-NEXT: add sp, sp, #96 1974; NONEON-NOSVE-NEXT: ret 1975 %op1 = load <32 x i8>, ptr %a 1976 %op2 = load <32 x i8>, ptr %b 1977 %res = sub <32 x i8> %op1, %op2 1978 store <32 x i8> %res, ptr %a 1979 ret void 1980} 1981 1982define <2 x i16> @sub_v2i16(<2 x i16> %op1, <2 x i16> %op2) { 1983; CHECK-LABEL: sub_v2i16: 1984; CHECK: // %bb.0: 1985; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1986; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 1987; CHECK-NEXT: sub z0.s, z0.s, z1.s 1988; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 1989; CHECK-NEXT: ret 1990; 1991; NONEON-NOSVE-LABEL: sub_v2i16: 1992; NONEON-NOSVE: // %bb.0: 1993; NONEON-NOSVE-NEXT: sub sp, sp, #32 1994; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 1995; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 1996; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8] 1997; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 1998; NONEON-NOSVE-NEXT: sub w8, w10, w8 1999; NONEON-NOSVE-NEXT: str w8, [sp, #28] 2000; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 2001; NONEON-NOSVE-NEXT: sub w8, w9, w8 2002; NONEON-NOSVE-NEXT: str w8, [sp, #24] 2003; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 2004; NONEON-NOSVE-NEXT: add sp, sp, #32 2005; NONEON-NOSVE-NEXT: ret 2006 %res = sub <2 x i16> %op1, %op2 2007 ret <2 x i16> %res 2008} 2009 2010define <4 x i16> @sub_v4i16(<4 x i16> %op1, <4 x i16> %op2) { 2011; CHECK-LABEL: sub_v4i16: 2012; CHECK: // %bb.0: 2013; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 2014; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 2015; CHECK-NEXT: sub z0.h, z0.h, z1.h 2016; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 2017; CHECK-NEXT: ret 2018; 2019; NONEON-NOSVE-LABEL: sub_v4i16: 2020; NONEON-NOSVE: // %bb.0: 2021; NONEON-NOSVE-NEXT: sub sp, sp, #32 2022; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 2023; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 2024; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22] 2025; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14] 2026; NONEON-NOSVE-NEXT: sub w8, w9, w8 2027; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12] 2028; NONEON-NOSVE-NEXT: strh w8, [sp, #30] 2029; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20] 2030; NONEON-NOSVE-NEXT: sub w8, w9, w8 2031; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10] 2032; NONEON-NOSVE-NEXT: strh w8, [sp, #28] 2033; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18] 2034; NONEON-NOSVE-NEXT: sub w8, w9, w8 2035; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8] 2036; NONEON-NOSVE-NEXT: strh w8, [sp, #26] 2037; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16] 2038; NONEON-NOSVE-NEXT: sub w8, w9, w8 2039; NONEON-NOSVE-NEXT: strh w8, [sp, #24] 2040; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 2041; NONEON-NOSVE-NEXT: add sp, sp, #32 2042; NONEON-NOSVE-NEXT: ret 2043 %res = sub <4 x i16> %op1, %op2 2044 ret <4 x i16> %res 2045} 2046 2047define <8 x i16> @sub_v8i16(<8 x i16> %op1, <8 x i16> %op2) { 2048; CHECK-LABEL: sub_v8i16: 2049; CHECK: // %bb.0: 2050; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 2051; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 2052; CHECK-NEXT: sub z0.h, z0.h, z1.h 2053; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 2054; CHECK-NEXT: ret 2055; 2056; NONEON-NOSVE-LABEL: sub_v8i16: 2057; NONEON-NOSVE: // %bb.0: 2058; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 2059; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 2060; NONEON-NOSVE-NEXT: ldrh w8, [sp, #30] 2061; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14] 2062; NONEON-NOSVE-NEXT: sub w8, w9, w8 2063; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12] 2064; NONEON-NOSVE-NEXT: strh w8, [sp, #46] 2065; NONEON-NOSVE-NEXT: ldrh w8, [sp, #28] 2066; NONEON-NOSVE-NEXT: sub w8, w9, w8 2067; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10] 2068; NONEON-NOSVE-NEXT: strh w8, [sp, #44] 2069; NONEON-NOSVE-NEXT: ldrh w8, [sp, #26] 2070; NONEON-NOSVE-NEXT: sub w8, w9, w8 2071; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8] 2072; NONEON-NOSVE-NEXT: strh w8, [sp, #42] 2073; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24] 2074; NONEON-NOSVE-NEXT: sub w8, w9, w8 2075; NONEON-NOSVE-NEXT: ldrh w9, [sp, #6] 2076; NONEON-NOSVE-NEXT: strh w8, [sp, #40] 2077; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22] 2078; NONEON-NOSVE-NEXT: sub w8, w9, w8 2079; NONEON-NOSVE-NEXT: ldrh w9, [sp, #4] 2080; NONEON-NOSVE-NEXT: strh w8, [sp, #38] 2081; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20] 2082; NONEON-NOSVE-NEXT: sub w8, w9, w8 2083; NONEON-NOSVE-NEXT: ldrh w9, [sp, #2] 2084; NONEON-NOSVE-NEXT: strh w8, [sp, #36] 2085; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18] 2086; NONEON-NOSVE-NEXT: sub w8, w9, w8 2087; NONEON-NOSVE-NEXT: ldrh w9, [sp] 2088; NONEON-NOSVE-NEXT: strh w8, [sp, #34] 2089; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16] 2090; NONEON-NOSVE-NEXT: sub w8, w9, w8 2091; NONEON-NOSVE-NEXT: strh w8, [sp, #32] 2092; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 2093; NONEON-NOSVE-NEXT: add sp, sp, #48 2094; NONEON-NOSVE-NEXT: ret 2095 %res = sub <8 x i16> %op1, %op2 2096 ret <8 x i16> %res 2097} 2098 2099define void @sub_v16i16(ptr %a, ptr %b) { 2100; CHECK-LABEL: sub_v16i16: 2101; CHECK: // %bb.0: 2102; CHECK-NEXT: ldp q0, q3, [x1] 2103; CHECK-NEXT: ldp q1, q2, [x0] 2104; CHECK-NEXT: sub z0.h, z1.h, z0.h 2105; CHECK-NEXT: sub z1.h, z2.h, z3.h 2106; CHECK-NEXT: stp q0, q1, [x0] 2107; CHECK-NEXT: ret 2108; 2109; NONEON-NOSVE-LABEL: sub_v16i16: 2110; NONEON-NOSVE: // %bb.0: 2111; NONEON-NOSVE-NEXT: sub sp, sp, #96 2112; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 2113; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 2114; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 2115; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 2116; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 2117; NONEON-NOSVE-NEXT: ldrh w8, [sp, #62] 2118; NONEON-NOSVE-NEXT: ldrh w9, [sp, #46] 2119; NONEON-NOSVE-NEXT: sub w8, w9, w8 2120; NONEON-NOSVE-NEXT: ldrh w9, [sp, #44] 2121; NONEON-NOSVE-NEXT: strh w8, [sp, #94] 2122; NONEON-NOSVE-NEXT: ldrh w8, [sp, #60] 2123; NONEON-NOSVE-NEXT: sub w8, w9, w8 2124; NONEON-NOSVE-NEXT: ldrh w9, [sp, #42] 2125; NONEON-NOSVE-NEXT: strh w8, [sp, #92] 2126; NONEON-NOSVE-NEXT: ldrh w8, [sp, #58] 2127; NONEON-NOSVE-NEXT: sub w8, w9, w8 2128; NONEON-NOSVE-NEXT: ldrh w9, [sp, #40] 2129; NONEON-NOSVE-NEXT: strh w8, [sp, #90] 2130; NONEON-NOSVE-NEXT: ldrh w8, [sp, #56] 2131; NONEON-NOSVE-NEXT: sub w8, w9, w8 2132; NONEON-NOSVE-NEXT: ldrh w9, [sp, #38] 2133; NONEON-NOSVE-NEXT: strh w8, [sp, #88] 2134; NONEON-NOSVE-NEXT: ldrh w8, [sp, #54] 2135; NONEON-NOSVE-NEXT: sub w8, w9, w8 2136; NONEON-NOSVE-NEXT: ldrh w9, [sp, #36] 2137; NONEON-NOSVE-NEXT: strh w8, [sp, #86] 2138; NONEON-NOSVE-NEXT: ldrh w8, [sp, #52] 2139; NONEON-NOSVE-NEXT: sub w8, w9, w8 2140; NONEON-NOSVE-NEXT: ldrh w9, [sp, #34] 2141; NONEON-NOSVE-NEXT: strh w8, [sp, #84] 2142; NONEON-NOSVE-NEXT: ldrh w8, [sp, #50] 2143; NONEON-NOSVE-NEXT: sub w8, w9, w8 2144; NONEON-NOSVE-NEXT: ldrh w9, [sp, #32] 2145; NONEON-NOSVE-NEXT: strh w8, [sp, #82] 2146; NONEON-NOSVE-NEXT: ldrh w8, [sp, #48] 2147; NONEON-NOSVE-NEXT: sub w8, w9, w8 2148; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14] 2149; NONEON-NOSVE-NEXT: strh w8, [sp, #80] 2150; NONEON-NOSVE-NEXT: ldrh w8, [sp, #30] 2151; NONEON-NOSVE-NEXT: sub w8, w9, w8 2152; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12] 2153; NONEON-NOSVE-NEXT: strh w8, [sp, #78] 2154; NONEON-NOSVE-NEXT: ldrh w8, [sp, #28] 2155; NONEON-NOSVE-NEXT: sub w8, w9, w8 2156; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10] 2157; NONEON-NOSVE-NEXT: strh w8, [sp, #76] 2158; NONEON-NOSVE-NEXT: ldrh w8, [sp, #26] 2159; NONEON-NOSVE-NEXT: sub w8, w9, w8 2160; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8] 2161; NONEON-NOSVE-NEXT: strh w8, [sp, #74] 2162; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24] 2163; NONEON-NOSVE-NEXT: sub w8, w9, w8 2164; NONEON-NOSVE-NEXT: ldrh w9, [sp, #6] 2165; NONEON-NOSVE-NEXT: strh w8, [sp, #72] 2166; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22] 2167; NONEON-NOSVE-NEXT: sub w8, w9, w8 2168; NONEON-NOSVE-NEXT: ldrh w9, [sp, #4] 2169; NONEON-NOSVE-NEXT: strh w8, [sp, #70] 2170; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20] 2171; NONEON-NOSVE-NEXT: sub w8, w9, w8 2172; NONEON-NOSVE-NEXT: ldrh w9, [sp, #2] 2173; NONEON-NOSVE-NEXT: strh w8, [sp, #68] 2174; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18] 2175; NONEON-NOSVE-NEXT: sub w8, w9, w8 2176; NONEON-NOSVE-NEXT: ldrh w9, [sp] 2177; NONEON-NOSVE-NEXT: strh w8, [sp, #66] 2178; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16] 2179; NONEON-NOSVE-NEXT: sub w8, w9, w8 2180; NONEON-NOSVE-NEXT: strh w8, [sp, #64] 2181; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 2182; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 2183; NONEON-NOSVE-NEXT: add sp, sp, #96 2184; NONEON-NOSVE-NEXT: ret 2185 %op1 = load <16 x i16>, ptr %a 2186 %op2 = load <16 x i16>, ptr %b 2187 %res = sub <16 x i16> %op1, %op2 2188 store <16 x i16> %res, ptr %a 2189 ret void 2190} 2191 2192define <2 x i32> @sub_v2i32(<2 x i32> %op1, <2 x i32> %op2) { 2193; CHECK-LABEL: sub_v2i32: 2194; CHECK: // %bb.0: 2195; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 2196; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 2197; CHECK-NEXT: sub z0.s, z0.s, z1.s 2198; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 2199; CHECK-NEXT: ret 2200; 2201; NONEON-NOSVE-LABEL: sub_v2i32: 2202; NONEON-NOSVE: // %bb.0: 2203; NONEON-NOSVE-NEXT: sub sp, sp, #32 2204; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 2205; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 2206; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8] 2207; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 2208; NONEON-NOSVE-NEXT: sub w8, w10, w8 2209; NONEON-NOSVE-NEXT: str w8, [sp, #28] 2210; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 2211; NONEON-NOSVE-NEXT: sub w8, w9, w8 2212; NONEON-NOSVE-NEXT: str w8, [sp, #24] 2213; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 2214; NONEON-NOSVE-NEXT: add sp, sp, #32 2215; NONEON-NOSVE-NEXT: ret 2216 %res = sub <2 x i32> %op1, %op2 2217 ret <2 x i32> %res 2218} 2219 2220define <4 x i32> @sub_v4i32(<4 x i32> %op1, <4 x i32> %op2) { 2221; CHECK-LABEL: sub_v4i32: 2222; CHECK: // %bb.0: 2223; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 2224; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 2225; CHECK-NEXT: sub z0.s, z0.s, z1.s 2226; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 2227; CHECK-NEXT: ret 2228; 2229; NONEON-NOSVE-LABEL: sub_v4i32: 2230; NONEON-NOSVE: // %bb.0: 2231; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 2232; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 2233; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8] 2234; NONEON-NOSVE-NEXT: ldr w8, [sp, #28] 2235; NONEON-NOSVE-NEXT: sub w8, w10, w8 2236; NONEON-NOSVE-NEXT: str w8, [sp, #44] 2237; NONEON-NOSVE-NEXT: ldr w8, [sp, #24] 2238; NONEON-NOSVE-NEXT: sub w8, w9, w8 2239; NONEON-NOSVE-NEXT: ldp w9, w10, [sp] 2240; NONEON-NOSVE-NEXT: str w8, [sp, #40] 2241; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 2242; NONEON-NOSVE-NEXT: sub w8, w10, w8 2243; NONEON-NOSVE-NEXT: str w8, [sp, #36] 2244; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 2245; NONEON-NOSVE-NEXT: sub w8, w9, w8 2246; NONEON-NOSVE-NEXT: str w8, [sp, #32] 2247; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 2248; NONEON-NOSVE-NEXT: add sp, sp, #48 2249; NONEON-NOSVE-NEXT: ret 2250 %res = sub <4 x i32> %op1, %op2 2251 ret <4 x i32> %res 2252} 2253 2254define void @sub_v8i32(ptr %a, ptr %b) { 2255; CHECK-LABEL: sub_v8i32: 2256; CHECK: // %bb.0: 2257; CHECK-NEXT: ldp q0, q3, [x1] 2258; CHECK-NEXT: ldp q1, q2, [x0] 2259; CHECK-NEXT: sub z0.s, z1.s, z0.s 2260; CHECK-NEXT: sub z1.s, z2.s, z3.s 2261; CHECK-NEXT: stp q0, q1, [x0] 2262; CHECK-NEXT: ret 2263; 2264; NONEON-NOSVE-LABEL: sub_v8i32: 2265; NONEON-NOSVE: // %bb.0: 2266; NONEON-NOSVE-NEXT: sub sp, sp, #96 2267; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 2268; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 2269; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 2270; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 2271; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 2272; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #40] 2273; NONEON-NOSVE-NEXT: ldr w8, [sp, #60] 2274; NONEON-NOSVE-NEXT: sub w8, w10, w8 2275; NONEON-NOSVE-NEXT: str w8, [sp, #92] 2276; NONEON-NOSVE-NEXT: ldr w8, [sp, #56] 2277; NONEON-NOSVE-NEXT: sub w8, w9, w8 2278; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #32] 2279; NONEON-NOSVE-NEXT: str w8, [sp, #88] 2280; NONEON-NOSVE-NEXT: ldr w8, [sp, #52] 2281; NONEON-NOSVE-NEXT: sub w8, w10, w8 2282; NONEON-NOSVE-NEXT: str w8, [sp, #84] 2283; NONEON-NOSVE-NEXT: ldr w8, [sp, #48] 2284; NONEON-NOSVE-NEXT: sub w8, w9, w8 2285; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8] 2286; NONEON-NOSVE-NEXT: str w8, [sp, #80] 2287; NONEON-NOSVE-NEXT: ldr w8, [sp, #28] 2288; NONEON-NOSVE-NEXT: sub w8, w10, w8 2289; NONEON-NOSVE-NEXT: str w8, [sp, #76] 2290; NONEON-NOSVE-NEXT: ldr w8, [sp, #24] 2291; NONEON-NOSVE-NEXT: sub w8, w9, w8 2292; NONEON-NOSVE-NEXT: ldp w9, w10, [sp] 2293; NONEON-NOSVE-NEXT: str w8, [sp, #72] 2294; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 2295; NONEON-NOSVE-NEXT: sub w8, w10, w8 2296; NONEON-NOSVE-NEXT: str w8, [sp, #68] 2297; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 2298; NONEON-NOSVE-NEXT: sub w8, w9, w8 2299; NONEON-NOSVE-NEXT: str w8, [sp, #64] 2300; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 2301; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 2302; NONEON-NOSVE-NEXT: add sp, sp, #96 2303; NONEON-NOSVE-NEXT: ret 2304 %op1 = load <8 x i32>, ptr %a 2305 %op2 = load <8 x i32>, ptr %b 2306 %res = sub <8 x i32> %op1, %op2 2307 store <8 x i32> %res, ptr %a 2308 ret void 2309} 2310 2311define <1 x i64> @sub_v1i64(<1 x i64> %op1, <1 x i64> %op2) { 2312; CHECK-LABEL: sub_v1i64: 2313; CHECK: // %bb.0: 2314; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 2315; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 2316; CHECK-NEXT: sub z0.d, z0.d, z1.d 2317; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 2318; CHECK-NEXT: ret 2319; 2320; NONEON-NOSVE-LABEL: sub_v1i64: 2321; NONEON-NOSVE: // %bb.0: 2322; NONEON-NOSVE-NEXT: sub sp, sp, #16 2323; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 2324; NONEON-NOSVE-NEXT: fmov x8, d1 2325; NONEON-NOSVE-NEXT: fmov x9, d0 2326; NONEON-NOSVE-NEXT: sub x8, x9, x8 2327; NONEON-NOSVE-NEXT: str x8, [sp, #8] 2328; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 2329; NONEON-NOSVE-NEXT: add sp, sp, #16 2330; NONEON-NOSVE-NEXT: ret 2331 %res = sub <1 x i64> %op1, %op2 2332 ret <1 x i64> %res 2333} 2334 2335define <2 x i64> @sub_v2i64(<2 x i64> %op1, <2 x i64> %op2) { 2336; CHECK-LABEL: sub_v2i64: 2337; CHECK: // %bb.0: 2338; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 2339; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 2340; CHECK-NEXT: sub z0.d, z0.d, z1.d 2341; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 2342; CHECK-NEXT: ret 2343; 2344; NONEON-NOSVE-LABEL: sub_v2i64: 2345; NONEON-NOSVE: // %bb.0: 2346; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 2347; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 2348; NONEON-NOSVE-NEXT: ldp x9, x10, [sp] 2349; NONEON-NOSVE-NEXT: ldr x8, [sp, #24] 2350; NONEON-NOSVE-NEXT: sub x8, x10, x8 2351; NONEON-NOSVE-NEXT: str x8, [sp, #40] 2352; NONEON-NOSVE-NEXT: ldr x8, [sp, #16] 2353; NONEON-NOSVE-NEXT: sub x8, x9, x8 2354; NONEON-NOSVE-NEXT: str x8, [sp, #32] 2355; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 2356; NONEON-NOSVE-NEXT: add sp, sp, #48 2357; NONEON-NOSVE-NEXT: ret 2358 %res = sub <2 x i64> %op1, %op2 2359 ret <2 x i64> %res 2360} 2361 2362define void @sub_v4i64(ptr %a, ptr %b) { 2363; CHECK-LABEL: sub_v4i64: 2364; CHECK: // %bb.0: 2365; CHECK-NEXT: ldp q0, q3, [x1] 2366; CHECK-NEXT: ldp q1, q2, [x0] 2367; CHECK-NEXT: sub z0.d, z1.d, z0.d 2368; CHECK-NEXT: sub z1.d, z2.d, z3.d 2369; CHECK-NEXT: stp q0, q1, [x0] 2370; CHECK-NEXT: ret 2371; 2372; NONEON-NOSVE-LABEL: sub_v4i64: 2373; NONEON-NOSVE: // %bb.0: 2374; NONEON-NOSVE-NEXT: sub sp, sp, #96 2375; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 2376; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 2377; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 2378; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 2379; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 2380; NONEON-NOSVE-NEXT: ldp x9, x10, [sp, #32] 2381; NONEON-NOSVE-NEXT: ldr x8, [sp, #56] 2382; NONEON-NOSVE-NEXT: sub x8, x10, x8 2383; NONEON-NOSVE-NEXT: str x8, [sp, #88] 2384; NONEON-NOSVE-NEXT: ldr x8, [sp, #48] 2385; NONEON-NOSVE-NEXT: sub x8, x9, x8 2386; NONEON-NOSVE-NEXT: ldp x9, x10, [sp] 2387; NONEON-NOSVE-NEXT: str x8, [sp, #80] 2388; NONEON-NOSVE-NEXT: ldr x8, [sp, #24] 2389; NONEON-NOSVE-NEXT: sub x8, x10, x8 2390; NONEON-NOSVE-NEXT: str x8, [sp, #72] 2391; NONEON-NOSVE-NEXT: ldr x8, [sp, #16] 2392; NONEON-NOSVE-NEXT: sub x8, x9, x8 2393; NONEON-NOSVE-NEXT: str x8, [sp, #64] 2394; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 2395; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 2396; NONEON-NOSVE-NEXT: add sp, sp, #96 2397; NONEON-NOSVE-NEXT: ret 2398 %op1 = load <4 x i64>, ptr %a 2399 %op2 = load <4 x i64>, ptr %b 2400 %res = sub <4 x i64> %op1, %op2 2401 store <4 x i64> %res, ptr %a 2402 ret void 2403} 2404 2405; 2406; ABS 2407; 2408 2409define <4 x i8> @abs_v4i8(<4 x i8> %op1) { 2410; CHECK-LABEL: abs_v4i8: 2411; CHECK: // %bb.0: 2412; CHECK-NEXT: ptrue p0.h, vl4 2413; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 2414; CHECK-NEXT: sxtb z0.h, p0/m, z0.h 2415; CHECK-NEXT: abs z0.h, p0/m, z0.h 2416; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 2417; CHECK-NEXT: ret 2418; 2419; NONEON-NOSVE-LABEL: abs_v4i8: 2420; NONEON-NOSVE: // %bb.0: 2421; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 2422; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 2423; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #6] 2424; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #4] 2425; NONEON-NOSVE-NEXT: ldrsb w10, [sp, #2] 2426; NONEON-NOSVE-NEXT: ldrsb w11, [sp] 2427; NONEON-NOSVE-NEXT: cmp w8, #0 2428; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2429; NONEON-NOSVE-NEXT: cmp w9, #0 2430; NONEON-NOSVE-NEXT: strh w8, [sp, #14] 2431; NONEON-NOSVE-NEXT: cneg w8, w9, mi 2432; NONEON-NOSVE-NEXT: cmp w10, #0 2433; NONEON-NOSVE-NEXT: strh w8, [sp, #12] 2434; NONEON-NOSVE-NEXT: cneg w8, w10, mi 2435; NONEON-NOSVE-NEXT: cmp w11, #0 2436; NONEON-NOSVE-NEXT: strh w8, [sp, #10] 2437; NONEON-NOSVE-NEXT: cneg w8, w11, mi 2438; NONEON-NOSVE-NEXT: strh w8, [sp, #8] 2439; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 2440; NONEON-NOSVE-NEXT: add sp, sp, #16 2441; NONEON-NOSVE-NEXT: ret 2442 %res = call <4 x i8> @llvm.abs.v4i8(<4 x i8> %op1, i1 false) 2443 ret <4 x i8> %res 2444} 2445 2446define <8 x i8> @abs_v8i8(<8 x i8> %op1) { 2447; CHECK-LABEL: abs_v8i8: 2448; CHECK: // %bb.0: 2449; CHECK-NEXT: ptrue p0.b, vl8 2450; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 2451; CHECK-NEXT: abs z0.b, p0/m, z0.b 2452; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 2453; CHECK-NEXT: ret 2454; 2455; NONEON-NOSVE-LABEL: abs_v8i8: 2456; NONEON-NOSVE: // %bb.0: 2457; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 2458; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 2459; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #7] 2460; NONEON-NOSVE-NEXT: cmp w8, #0 2461; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2462; NONEON-NOSVE-NEXT: strb w8, [sp, #15] 2463; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #6] 2464; NONEON-NOSVE-NEXT: cmp w8, #0 2465; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2466; NONEON-NOSVE-NEXT: strb w8, [sp, #14] 2467; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #5] 2468; NONEON-NOSVE-NEXT: cmp w8, #0 2469; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2470; NONEON-NOSVE-NEXT: strb w8, [sp, #13] 2471; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #4] 2472; NONEON-NOSVE-NEXT: cmp w8, #0 2473; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2474; NONEON-NOSVE-NEXT: strb w8, [sp, #12] 2475; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #3] 2476; NONEON-NOSVE-NEXT: cmp w8, #0 2477; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2478; NONEON-NOSVE-NEXT: strb w8, [sp, #11] 2479; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #2] 2480; NONEON-NOSVE-NEXT: cmp w8, #0 2481; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2482; NONEON-NOSVE-NEXT: strb w8, [sp, #10] 2483; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #1] 2484; NONEON-NOSVE-NEXT: cmp w8, #0 2485; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2486; NONEON-NOSVE-NEXT: strb w8, [sp, #9] 2487; NONEON-NOSVE-NEXT: ldrsb w8, [sp] 2488; NONEON-NOSVE-NEXT: cmp w8, #0 2489; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2490; NONEON-NOSVE-NEXT: strb w8, [sp, #8] 2491; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 2492; NONEON-NOSVE-NEXT: add sp, sp, #16 2493; NONEON-NOSVE-NEXT: ret 2494 %res = call <8 x i8> @llvm.abs.v8i8(<8 x i8> %op1, i1 false) 2495 ret <8 x i8> %res 2496} 2497 2498define <16 x i8> @abs_v16i8(<16 x i8> %op1) { 2499; CHECK-LABEL: abs_v16i8: 2500; CHECK: // %bb.0: 2501; CHECK-NEXT: ptrue p0.b, vl16 2502; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 2503; CHECK-NEXT: abs z0.b, p0/m, z0.b 2504; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 2505; CHECK-NEXT: ret 2506; 2507; NONEON-NOSVE-LABEL: abs_v16i8: 2508; NONEON-NOSVE: // %bb.0: 2509; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 2510; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 2511; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #15] 2512; NONEON-NOSVE-NEXT: cmp w8, #0 2513; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2514; NONEON-NOSVE-NEXT: strb w8, [sp, #31] 2515; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #14] 2516; NONEON-NOSVE-NEXT: cmp w8, #0 2517; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2518; NONEON-NOSVE-NEXT: strb w8, [sp, #30] 2519; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #13] 2520; NONEON-NOSVE-NEXT: cmp w8, #0 2521; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2522; NONEON-NOSVE-NEXT: strb w8, [sp, #29] 2523; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #12] 2524; NONEON-NOSVE-NEXT: cmp w8, #0 2525; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2526; NONEON-NOSVE-NEXT: strb w8, [sp, #28] 2527; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #11] 2528; NONEON-NOSVE-NEXT: cmp w8, #0 2529; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2530; NONEON-NOSVE-NEXT: strb w8, [sp, #27] 2531; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #10] 2532; NONEON-NOSVE-NEXT: cmp w8, #0 2533; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2534; NONEON-NOSVE-NEXT: strb w8, [sp, #26] 2535; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #9] 2536; NONEON-NOSVE-NEXT: cmp w8, #0 2537; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2538; NONEON-NOSVE-NEXT: strb w8, [sp, #25] 2539; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #8] 2540; NONEON-NOSVE-NEXT: cmp w8, #0 2541; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2542; NONEON-NOSVE-NEXT: strb w8, [sp, #24] 2543; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #7] 2544; NONEON-NOSVE-NEXT: cmp w8, #0 2545; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2546; NONEON-NOSVE-NEXT: strb w8, [sp, #23] 2547; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #6] 2548; NONEON-NOSVE-NEXT: cmp w8, #0 2549; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2550; NONEON-NOSVE-NEXT: strb w8, [sp, #22] 2551; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #5] 2552; NONEON-NOSVE-NEXT: cmp w8, #0 2553; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2554; NONEON-NOSVE-NEXT: strb w8, [sp, #21] 2555; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #4] 2556; NONEON-NOSVE-NEXT: cmp w8, #0 2557; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2558; NONEON-NOSVE-NEXT: strb w8, [sp, #20] 2559; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #3] 2560; NONEON-NOSVE-NEXT: cmp w8, #0 2561; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2562; NONEON-NOSVE-NEXT: strb w8, [sp, #19] 2563; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #2] 2564; NONEON-NOSVE-NEXT: cmp w8, #0 2565; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2566; NONEON-NOSVE-NEXT: strb w8, [sp, #18] 2567; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #1] 2568; NONEON-NOSVE-NEXT: cmp w8, #0 2569; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2570; NONEON-NOSVE-NEXT: strb w8, [sp, #17] 2571; NONEON-NOSVE-NEXT: ldrsb w8, [sp] 2572; NONEON-NOSVE-NEXT: cmp w8, #0 2573; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2574; NONEON-NOSVE-NEXT: strb w8, [sp, #16] 2575; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 2576; NONEON-NOSVE-NEXT: add sp, sp, #32 2577; NONEON-NOSVE-NEXT: ret 2578 %res = call <16 x i8> @llvm.abs.v16i8(<16 x i8> %op1, i1 false) 2579 ret <16 x i8> %res 2580} 2581 2582define void @abs_v32i8(ptr %a) { 2583; CHECK-LABEL: abs_v32i8: 2584; CHECK: // %bb.0: 2585; CHECK-NEXT: ldp q0, q1, [x0] 2586; CHECK-NEXT: ptrue p0.b, vl16 2587; CHECK-NEXT: abs z0.b, p0/m, z0.b 2588; CHECK-NEXT: abs z1.b, p0/m, z1.b 2589; CHECK-NEXT: stp q0, q1, [x0] 2590; CHECK-NEXT: ret 2591; 2592; NONEON-NOSVE-LABEL: abs_v32i8: 2593; NONEON-NOSVE: // %bb.0: 2594; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 2595; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]! 2596; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 2597; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #31] 2598; NONEON-NOSVE-NEXT: cmp w8, #0 2599; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2600; NONEON-NOSVE-NEXT: strb w8, [sp, #63] 2601; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #30] 2602; NONEON-NOSVE-NEXT: cmp w8, #0 2603; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2604; NONEON-NOSVE-NEXT: strb w8, [sp, #62] 2605; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #29] 2606; NONEON-NOSVE-NEXT: cmp w8, #0 2607; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2608; NONEON-NOSVE-NEXT: strb w8, [sp, #61] 2609; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #28] 2610; NONEON-NOSVE-NEXT: cmp w8, #0 2611; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2612; NONEON-NOSVE-NEXT: strb w8, [sp, #60] 2613; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #27] 2614; NONEON-NOSVE-NEXT: cmp w8, #0 2615; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2616; NONEON-NOSVE-NEXT: strb w8, [sp, #59] 2617; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #26] 2618; NONEON-NOSVE-NEXT: cmp w8, #0 2619; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2620; NONEON-NOSVE-NEXT: strb w8, [sp, #58] 2621; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #25] 2622; NONEON-NOSVE-NEXT: cmp w8, #0 2623; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2624; NONEON-NOSVE-NEXT: strb w8, [sp, #57] 2625; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #24] 2626; NONEON-NOSVE-NEXT: cmp w8, #0 2627; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2628; NONEON-NOSVE-NEXT: strb w8, [sp, #56] 2629; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #23] 2630; NONEON-NOSVE-NEXT: cmp w8, #0 2631; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2632; NONEON-NOSVE-NEXT: strb w8, [sp, #55] 2633; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #22] 2634; NONEON-NOSVE-NEXT: cmp w8, #0 2635; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2636; NONEON-NOSVE-NEXT: strb w8, [sp, #54] 2637; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #21] 2638; NONEON-NOSVE-NEXT: cmp w8, #0 2639; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2640; NONEON-NOSVE-NEXT: strb w8, [sp, #53] 2641; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #20] 2642; NONEON-NOSVE-NEXT: cmp w8, #0 2643; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2644; NONEON-NOSVE-NEXT: strb w8, [sp, #52] 2645; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #19] 2646; NONEON-NOSVE-NEXT: cmp w8, #0 2647; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2648; NONEON-NOSVE-NEXT: strb w8, [sp, #51] 2649; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #18] 2650; NONEON-NOSVE-NEXT: cmp w8, #0 2651; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2652; NONEON-NOSVE-NEXT: strb w8, [sp, #50] 2653; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #17] 2654; NONEON-NOSVE-NEXT: cmp w8, #0 2655; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2656; NONEON-NOSVE-NEXT: strb w8, [sp, #49] 2657; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #16] 2658; NONEON-NOSVE-NEXT: cmp w8, #0 2659; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2660; NONEON-NOSVE-NEXT: strb w8, [sp, #48] 2661; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #15] 2662; NONEON-NOSVE-NEXT: cmp w8, #0 2663; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2664; NONEON-NOSVE-NEXT: strb w8, [sp, #47] 2665; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #14] 2666; NONEON-NOSVE-NEXT: cmp w8, #0 2667; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2668; NONEON-NOSVE-NEXT: strb w8, [sp, #46] 2669; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #13] 2670; NONEON-NOSVE-NEXT: cmp w8, #0 2671; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2672; NONEON-NOSVE-NEXT: strb w8, [sp, #45] 2673; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #12] 2674; NONEON-NOSVE-NEXT: cmp w8, #0 2675; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2676; NONEON-NOSVE-NEXT: strb w8, [sp, #44] 2677; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #11] 2678; NONEON-NOSVE-NEXT: cmp w8, #0 2679; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2680; NONEON-NOSVE-NEXT: strb w8, [sp, #43] 2681; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #10] 2682; NONEON-NOSVE-NEXT: cmp w8, #0 2683; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2684; NONEON-NOSVE-NEXT: strb w8, [sp, #42] 2685; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #9] 2686; NONEON-NOSVE-NEXT: cmp w8, #0 2687; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2688; NONEON-NOSVE-NEXT: strb w8, [sp, #41] 2689; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #8] 2690; NONEON-NOSVE-NEXT: cmp w8, #0 2691; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2692; NONEON-NOSVE-NEXT: strb w8, [sp, #40] 2693; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #7] 2694; NONEON-NOSVE-NEXT: cmp w8, #0 2695; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2696; NONEON-NOSVE-NEXT: strb w8, [sp, #39] 2697; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #6] 2698; NONEON-NOSVE-NEXT: cmp w8, #0 2699; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2700; NONEON-NOSVE-NEXT: strb w8, [sp, #38] 2701; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #5] 2702; NONEON-NOSVE-NEXT: cmp w8, #0 2703; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2704; NONEON-NOSVE-NEXT: strb w8, [sp, #37] 2705; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #4] 2706; NONEON-NOSVE-NEXT: cmp w8, #0 2707; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2708; NONEON-NOSVE-NEXT: strb w8, [sp, #36] 2709; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #3] 2710; NONEON-NOSVE-NEXT: cmp w8, #0 2711; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2712; NONEON-NOSVE-NEXT: strb w8, [sp, #35] 2713; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #2] 2714; NONEON-NOSVE-NEXT: cmp w8, #0 2715; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2716; NONEON-NOSVE-NEXT: strb w8, [sp, #34] 2717; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #1] 2718; NONEON-NOSVE-NEXT: cmp w8, #0 2719; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2720; NONEON-NOSVE-NEXT: strb w8, [sp, #33] 2721; NONEON-NOSVE-NEXT: ldrsb w8, [sp] 2722; NONEON-NOSVE-NEXT: cmp w8, #0 2723; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2724; NONEON-NOSVE-NEXT: strb w8, [sp, #32] 2725; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 2726; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 2727; NONEON-NOSVE-NEXT: add sp, sp, #64 2728; NONEON-NOSVE-NEXT: ret 2729 %op1 = load <32 x i8>, ptr %a 2730 %res = call <32 x i8> @llvm.abs.v32i8(<32 x i8> %op1, i1 false) 2731 store <32 x i8> %res, ptr %a 2732 ret void 2733} 2734 2735define <2 x i16> @abs_v2i16(<2 x i16> %op1) { 2736; CHECK-LABEL: abs_v2i16: 2737; CHECK: // %bb.0: 2738; CHECK-NEXT: ptrue p0.s, vl2 2739; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 2740; CHECK-NEXT: sxth z0.s, p0/m, z0.s 2741; CHECK-NEXT: abs z0.s, p0/m, z0.s 2742; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 2743; CHECK-NEXT: ret 2744; 2745; NONEON-NOSVE-LABEL: abs_v2i16: 2746; NONEON-NOSVE: // %bb.0: 2747; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 2748; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 2749; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #4] 2750; NONEON-NOSVE-NEXT: ldrsh w9, [sp] 2751; NONEON-NOSVE-NEXT: cmp w8, #0 2752; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2753; NONEON-NOSVE-NEXT: cmp w9, #0 2754; NONEON-NOSVE-NEXT: cneg w9, w9, mi 2755; NONEON-NOSVE-NEXT: stp w9, w8, [sp, #8] 2756; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 2757; NONEON-NOSVE-NEXT: add sp, sp, #16 2758; NONEON-NOSVE-NEXT: ret 2759 %res = call <2 x i16> @llvm.abs.v2i16(<2 x i16> %op1, i1 false) 2760 ret <2 x i16> %res 2761} 2762 2763define <4 x i16> @abs_v4i16(<4 x i16> %op1) { 2764; CHECK-LABEL: abs_v4i16: 2765; CHECK: // %bb.0: 2766; CHECK-NEXT: ptrue p0.h, vl4 2767; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 2768; CHECK-NEXT: abs z0.h, p0/m, z0.h 2769; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 2770; CHECK-NEXT: ret 2771; 2772; NONEON-NOSVE-LABEL: abs_v4i16: 2773; NONEON-NOSVE: // %bb.0: 2774; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 2775; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 2776; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #6] 2777; NONEON-NOSVE-NEXT: cmp w8, #0 2778; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2779; NONEON-NOSVE-NEXT: strh w8, [sp, #14] 2780; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #4] 2781; NONEON-NOSVE-NEXT: cmp w8, #0 2782; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2783; NONEON-NOSVE-NEXT: strh w8, [sp, #12] 2784; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #2] 2785; NONEON-NOSVE-NEXT: cmp w8, #0 2786; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2787; NONEON-NOSVE-NEXT: strh w8, [sp, #10] 2788; NONEON-NOSVE-NEXT: ldrsh w8, [sp] 2789; NONEON-NOSVE-NEXT: cmp w8, #0 2790; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2791; NONEON-NOSVE-NEXT: strh w8, [sp, #8] 2792; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 2793; NONEON-NOSVE-NEXT: add sp, sp, #16 2794; NONEON-NOSVE-NEXT: ret 2795 %res = call <4 x i16> @llvm.abs.v4i16(<4 x i16> %op1, i1 false) 2796 ret <4 x i16> %res 2797} 2798 2799define <8 x i16> @abs_v8i16(<8 x i16> %op1) { 2800; CHECK-LABEL: abs_v8i16: 2801; CHECK: // %bb.0: 2802; CHECK-NEXT: ptrue p0.h, vl8 2803; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 2804; CHECK-NEXT: abs z0.h, p0/m, z0.h 2805; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 2806; CHECK-NEXT: ret 2807; 2808; NONEON-NOSVE-LABEL: abs_v8i16: 2809; NONEON-NOSVE: // %bb.0: 2810; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 2811; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 2812; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #14] 2813; NONEON-NOSVE-NEXT: cmp w8, #0 2814; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2815; NONEON-NOSVE-NEXT: strh w8, [sp, #30] 2816; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #12] 2817; NONEON-NOSVE-NEXT: cmp w8, #0 2818; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2819; NONEON-NOSVE-NEXT: strh w8, [sp, #28] 2820; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #10] 2821; NONEON-NOSVE-NEXT: cmp w8, #0 2822; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2823; NONEON-NOSVE-NEXT: strh w8, [sp, #26] 2824; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #8] 2825; NONEON-NOSVE-NEXT: cmp w8, #0 2826; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2827; NONEON-NOSVE-NEXT: strh w8, [sp, #24] 2828; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #6] 2829; NONEON-NOSVE-NEXT: cmp w8, #0 2830; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2831; NONEON-NOSVE-NEXT: strh w8, [sp, #22] 2832; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #4] 2833; NONEON-NOSVE-NEXT: cmp w8, #0 2834; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2835; NONEON-NOSVE-NEXT: strh w8, [sp, #20] 2836; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #2] 2837; NONEON-NOSVE-NEXT: cmp w8, #0 2838; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2839; NONEON-NOSVE-NEXT: strh w8, [sp, #18] 2840; NONEON-NOSVE-NEXT: ldrsh w8, [sp] 2841; NONEON-NOSVE-NEXT: cmp w8, #0 2842; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2843; NONEON-NOSVE-NEXT: strh w8, [sp, #16] 2844; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 2845; NONEON-NOSVE-NEXT: add sp, sp, #32 2846; NONEON-NOSVE-NEXT: ret 2847 %res = call <8 x i16> @llvm.abs.v8i16(<8 x i16> %op1, i1 false) 2848 ret <8 x i16> %res 2849} 2850 2851define void @abs_v16i16(ptr %a) { 2852; CHECK-LABEL: abs_v16i16: 2853; CHECK: // %bb.0: 2854; CHECK-NEXT: ldp q0, q1, [x0] 2855; CHECK-NEXT: ptrue p0.h, vl8 2856; CHECK-NEXT: abs z0.h, p0/m, z0.h 2857; CHECK-NEXT: abs z1.h, p0/m, z1.h 2858; CHECK-NEXT: stp q0, q1, [x0] 2859; CHECK-NEXT: ret 2860; 2861; NONEON-NOSVE-LABEL: abs_v16i16: 2862; NONEON-NOSVE: // %bb.0: 2863; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 2864; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]! 2865; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 2866; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #30] 2867; NONEON-NOSVE-NEXT: cmp w8, #0 2868; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2869; NONEON-NOSVE-NEXT: strh w8, [sp, #62] 2870; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #28] 2871; NONEON-NOSVE-NEXT: cmp w8, #0 2872; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2873; NONEON-NOSVE-NEXT: strh w8, [sp, #60] 2874; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #26] 2875; NONEON-NOSVE-NEXT: cmp w8, #0 2876; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2877; NONEON-NOSVE-NEXT: strh w8, [sp, #58] 2878; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #24] 2879; NONEON-NOSVE-NEXT: cmp w8, #0 2880; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2881; NONEON-NOSVE-NEXT: strh w8, [sp, #56] 2882; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #22] 2883; NONEON-NOSVE-NEXT: cmp w8, #0 2884; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2885; NONEON-NOSVE-NEXT: strh w8, [sp, #54] 2886; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #20] 2887; NONEON-NOSVE-NEXT: cmp w8, #0 2888; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2889; NONEON-NOSVE-NEXT: strh w8, [sp, #52] 2890; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #18] 2891; NONEON-NOSVE-NEXT: cmp w8, #0 2892; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2893; NONEON-NOSVE-NEXT: strh w8, [sp, #50] 2894; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #16] 2895; NONEON-NOSVE-NEXT: cmp w8, #0 2896; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2897; NONEON-NOSVE-NEXT: strh w8, [sp, #48] 2898; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #14] 2899; NONEON-NOSVE-NEXT: cmp w8, #0 2900; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2901; NONEON-NOSVE-NEXT: strh w8, [sp, #46] 2902; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #12] 2903; NONEON-NOSVE-NEXT: cmp w8, #0 2904; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2905; NONEON-NOSVE-NEXT: strh w8, [sp, #44] 2906; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #10] 2907; NONEON-NOSVE-NEXT: cmp w8, #0 2908; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2909; NONEON-NOSVE-NEXT: strh w8, [sp, #42] 2910; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #8] 2911; NONEON-NOSVE-NEXT: cmp w8, #0 2912; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2913; NONEON-NOSVE-NEXT: strh w8, [sp, #40] 2914; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #6] 2915; NONEON-NOSVE-NEXT: cmp w8, #0 2916; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2917; NONEON-NOSVE-NEXT: strh w8, [sp, #38] 2918; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #4] 2919; NONEON-NOSVE-NEXT: cmp w8, #0 2920; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2921; NONEON-NOSVE-NEXT: strh w8, [sp, #36] 2922; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #2] 2923; NONEON-NOSVE-NEXT: cmp w8, #0 2924; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2925; NONEON-NOSVE-NEXT: strh w8, [sp, #34] 2926; NONEON-NOSVE-NEXT: ldrsh w8, [sp] 2927; NONEON-NOSVE-NEXT: cmp w8, #0 2928; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2929; NONEON-NOSVE-NEXT: strh w8, [sp, #32] 2930; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 2931; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 2932; NONEON-NOSVE-NEXT: add sp, sp, #64 2933; NONEON-NOSVE-NEXT: ret 2934 %op1 = load <16 x i16>, ptr %a 2935 %res = call <16 x i16> @llvm.abs.v16i16(<16 x i16> %op1, i1 false) 2936 store <16 x i16> %res, ptr %a 2937 ret void 2938} 2939 2940define <2 x i32> @abs_v2i32(<2 x i32> %op1) { 2941; CHECK-LABEL: abs_v2i32: 2942; CHECK: // %bb.0: 2943; CHECK-NEXT: ptrue p0.s, vl2 2944; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 2945; CHECK-NEXT: abs z0.s, p0/m, z0.s 2946; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 2947; CHECK-NEXT: ret 2948; 2949; NONEON-NOSVE-LABEL: abs_v2i32: 2950; NONEON-NOSVE: // %bb.0: 2951; NONEON-NOSVE-NEXT: str d0, [sp, #-16]! 2952; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 2953; NONEON-NOSVE-NEXT: ldr w8, [sp, #4] 2954; NONEON-NOSVE-NEXT: cmp w8, #0 2955; NONEON-NOSVE-NEXT: cneg w9, w8, mi 2956; NONEON-NOSVE-NEXT: ldr w8, [sp] 2957; NONEON-NOSVE-NEXT: cmp w8, #0 2958; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2959; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #8] 2960; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 2961; NONEON-NOSVE-NEXT: add sp, sp, #16 2962; NONEON-NOSVE-NEXT: ret 2963 %res = call <2 x i32> @llvm.abs.v2i32(<2 x i32> %op1, i1 false) 2964 ret <2 x i32> %res 2965} 2966 2967define <4 x i32> @abs_v4i32(<4 x i32> %op1) { 2968; CHECK-LABEL: abs_v4i32: 2969; CHECK: // %bb.0: 2970; CHECK-NEXT: ptrue p0.s, vl4 2971; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 2972; CHECK-NEXT: abs z0.s, p0/m, z0.s 2973; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 2974; CHECK-NEXT: ret 2975; 2976; NONEON-NOSVE-LABEL: abs_v4i32: 2977; NONEON-NOSVE: // %bb.0: 2978; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 2979; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 2980; NONEON-NOSVE-NEXT: ldr w8, [sp, #12] 2981; NONEON-NOSVE-NEXT: cmp w8, #0 2982; NONEON-NOSVE-NEXT: cneg w9, w8, mi 2983; NONEON-NOSVE-NEXT: ldr w8, [sp, #8] 2984; NONEON-NOSVE-NEXT: cmp w8, #0 2985; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2986; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #24] 2987; NONEON-NOSVE-NEXT: ldr w8, [sp, #4] 2988; NONEON-NOSVE-NEXT: cmp w8, #0 2989; NONEON-NOSVE-NEXT: cneg w9, w8, mi 2990; NONEON-NOSVE-NEXT: ldr w8, [sp] 2991; NONEON-NOSVE-NEXT: cmp w8, #0 2992; NONEON-NOSVE-NEXT: cneg w8, w8, mi 2993; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #16] 2994; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 2995; NONEON-NOSVE-NEXT: add sp, sp, #32 2996; NONEON-NOSVE-NEXT: ret 2997 %res = call <4 x i32> @llvm.abs.v4i32(<4 x i32> %op1, i1 false) 2998 ret <4 x i32> %res 2999} 3000 3001define void @abs_v8i32(ptr %a) { 3002; CHECK-LABEL: abs_v8i32: 3003; CHECK: // %bb.0: 3004; CHECK-NEXT: ldp q0, q1, [x0] 3005; CHECK-NEXT: ptrue p0.s, vl4 3006; CHECK-NEXT: abs z0.s, p0/m, z0.s 3007; CHECK-NEXT: abs z1.s, p0/m, z1.s 3008; CHECK-NEXT: stp q0, q1, [x0] 3009; CHECK-NEXT: ret 3010; 3011; NONEON-NOSVE-LABEL: abs_v8i32: 3012; NONEON-NOSVE: // %bb.0: 3013; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 3014; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]! 3015; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 3016; NONEON-NOSVE-NEXT: ldr w8, [sp, #28] 3017; NONEON-NOSVE-NEXT: cmp w8, #0 3018; NONEON-NOSVE-NEXT: cneg w9, w8, mi 3019; NONEON-NOSVE-NEXT: ldr w8, [sp, #24] 3020; NONEON-NOSVE-NEXT: cmp w8, #0 3021; NONEON-NOSVE-NEXT: cneg w8, w8, mi 3022; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #56] 3023; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 3024; NONEON-NOSVE-NEXT: cmp w8, #0 3025; NONEON-NOSVE-NEXT: cneg w9, w8, mi 3026; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 3027; NONEON-NOSVE-NEXT: cmp w8, #0 3028; NONEON-NOSVE-NEXT: cneg w8, w8, mi 3029; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #48] 3030; NONEON-NOSVE-NEXT: ldr w8, [sp, #12] 3031; NONEON-NOSVE-NEXT: cmp w8, #0 3032; NONEON-NOSVE-NEXT: cneg w9, w8, mi 3033; NONEON-NOSVE-NEXT: ldr w8, [sp, #8] 3034; NONEON-NOSVE-NEXT: cmp w8, #0 3035; NONEON-NOSVE-NEXT: cneg w8, w8, mi 3036; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #40] 3037; NONEON-NOSVE-NEXT: ldr w8, [sp, #4] 3038; NONEON-NOSVE-NEXT: cmp w8, #0 3039; NONEON-NOSVE-NEXT: cneg w9, w8, mi 3040; NONEON-NOSVE-NEXT: ldr w8, [sp] 3041; NONEON-NOSVE-NEXT: cmp w8, #0 3042; NONEON-NOSVE-NEXT: cneg w8, w8, mi 3043; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #32] 3044; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 3045; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 3046; NONEON-NOSVE-NEXT: add sp, sp, #64 3047; NONEON-NOSVE-NEXT: ret 3048 %op1 = load <8 x i32>, ptr %a 3049 %res = call <8 x i32> @llvm.abs.v8i32(<8 x i32> %op1, i1 false) 3050 store <8 x i32> %res, ptr %a 3051 ret void 3052} 3053 3054define <1 x i64> @abs_v1i64(<1 x i64> %op1) { 3055; CHECK-LABEL: abs_v1i64: 3056; CHECK: // %bb.0: 3057; CHECK-NEXT: ptrue p0.d, vl1 3058; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 3059; CHECK-NEXT: abs z0.d, p0/m, z0.d 3060; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 3061; CHECK-NEXT: ret 3062; 3063; NONEON-NOSVE-LABEL: abs_v1i64: 3064; NONEON-NOSVE: // %bb.0: 3065; NONEON-NOSVE-NEXT: sub sp, sp, #16 3066; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 3067; NONEON-NOSVE-NEXT: fmov x8, d0 3068; NONEON-NOSVE-NEXT: cmp x8, #0 3069; NONEON-NOSVE-NEXT: cneg x8, x8, mi 3070; NONEON-NOSVE-NEXT: str x8, [sp, #8] 3071; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 3072; NONEON-NOSVE-NEXT: add sp, sp, #16 3073; NONEON-NOSVE-NEXT: ret 3074 %res = call <1 x i64> @llvm.abs.v1i64(<1 x i64> %op1, i1 false) 3075 ret <1 x i64> %res 3076} 3077 3078define <2 x i64> @abs_v2i64(<2 x i64> %op1) { 3079; CHECK-LABEL: abs_v2i64: 3080; CHECK: // %bb.0: 3081; CHECK-NEXT: ptrue p0.d, vl2 3082; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 3083; CHECK-NEXT: abs z0.d, p0/m, z0.d 3084; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 3085; CHECK-NEXT: ret 3086; 3087; NONEON-NOSVE-LABEL: abs_v2i64: 3088; NONEON-NOSVE: // %bb.0: 3089; NONEON-NOSVE-NEXT: str q0, [sp, #-32]! 3090; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 3091; NONEON-NOSVE-NEXT: ldr x8, [sp, #8] 3092; NONEON-NOSVE-NEXT: cmp x8, #0 3093; NONEON-NOSVE-NEXT: cneg x9, x8, mi 3094; NONEON-NOSVE-NEXT: ldr x8, [sp] 3095; NONEON-NOSVE-NEXT: cmp x8, #0 3096; NONEON-NOSVE-NEXT: cneg x8, x8, mi 3097; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #16] 3098; NONEON-NOSVE-NEXT: ldr q0, [sp, #16] 3099; NONEON-NOSVE-NEXT: add sp, sp, #32 3100; NONEON-NOSVE-NEXT: ret 3101 %res = call <2 x i64> @llvm.abs.v2i64(<2 x i64> %op1, i1 false) 3102 ret <2 x i64> %res 3103} 3104 3105define void @abs_v4i64(ptr %a) { 3106; CHECK-LABEL: abs_v4i64: 3107; CHECK: // %bb.0: 3108; CHECK-NEXT: ldp q0, q1, [x0] 3109; CHECK-NEXT: ptrue p0.d, vl2 3110; CHECK-NEXT: abs z0.d, p0/m, z0.d 3111; CHECK-NEXT: abs z1.d, p0/m, z1.d 3112; CHECK-NEXT: stp q0, q1, [x0] 3113; CHECK-NEXT: ret 3114; 3115; NONEON-NOSVE-LABEL: abs_v4i64: 3116; NONEON-NOSVE: // %bb.0: 3117; NONEON-NOSVE-NEXT: ldp q1, q0, [x0] 3118; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #-64]! 3119; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64 3120; NONEON-NOSVE-NEXT: ldr x8, [sp, #24] 3121; NONEON-NOSVE-NEXT: cmp x8, #0 3122; NONEON-NOSVE-NEXT: cneg x9, x8, mi 3123; NONEON-NOSVE-NEXT: ldr x8, [sp, #16] 3124; NONEON-NOSVE-NEXT: cmp x8, #0 3125; NONEON-NOSVE-NEXT: cneg x8, x8, mi 3126; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #48] 3127; NONEON-NOSVE-NEXT: ldr x8, [sp, #8] 3128; NONEON-NOSVE-NEXT: cmp x8, #0 3129; NONEON-NOSVE-NEXT: cneg x9, x8, mi 3130; NONEON-NOSVE-NEXT: ldr x8, [sp] 3131; NONEON-NOSVE-NEXT: cmp x8, #0 3132; NONEON-NOSVE-NEXT: cneg x8, x8, mi 3133; NONEON-NOSVE-NEXT: stp x8, x9, [sp, #32] 3134; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #32] 3135; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 3136; NONEON-NOSVE-NEXT: add sp, sp, #64 3137; NONEON-NOSVE-NEXT: ret 3138 %op1 = load <4 x i64>, ptr %a 3139 %res = call <4 x i64> @llvm.abs.v4i64(<4 x i64> %op1, i1 false) 3140 store <4 x i64> %res, ptr %a 3141 ret void 3142} 3143 3144declare <4 x i8> @llvm.abs.v4i8(<4 x i8>, i1) 3145declare <8 x i8> @llvm.abs.v8i8(<8 x i8>, i1) 3146declare <16 x i8> @llvm.abs.v16i8(<16 x i8>, i1) 3147declare <32 x i8> @llvm.abs.v32i8(<32 x i8>, i1) 3148declare <4 x i16> @llvm.abs.v4i16(<4 x i16>, i1) 3149declare <2 x i16> @llvm.abs.v2i16(<2 x i16>, i1) 3150declare <8 x i16> @llvm.abs.v8i16(<8 x i16>, i1) 3151declare <16 x i16> @llvm.abs.v16i16(<16 x i16>, i1) 3152declare <2 x i32> @llvm.abs.v2i32(<2 x i32>, i1) 3153declare <4 x i32> @llvm.abs.v4i32(<4 x i32>, i1) 3154declare <8 x i32> @llvm.abs.v8i32(<8 x i32>, i1) 3155declare <1 x i64> @llvm.abs.v1i64(<1 x i64>, i1) 3156declare <2 x i64> @llvm.abs.v2i64(<2 x i64>, i1) 3157declare <4 x i64> @llvm.abs.v4i64(<4 x i64>, i1) 3158 3159