1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mattr=+sve -force-streaming-compatible < %s | FileCheck %s 3; RUN: llc -mattr=+sme -force-streaming < %s | FileCheck %s 4; RUN: llc -force-streaming-compatible < %s | FileCheck %s --check-prefix=NONEON-NOSVE 5 6target triple = "aarch64-unknown-linux-gnu" 7 8; 9; AND 10; 11 12define <8 x i8> @and_v8i8(<8 x i8> %op1, <8 x i8> %op2) { 13; CHECK-LABEL: and_v8i8: 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: and z0.d, z0.d, z1.d 18; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 19; CHECK-NEXT: ret 20; 21; NONEON-NOSVE-LABEL: and_v8i8: 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: ldrb w8, [sp, #23] 27; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15] 28; NONEON-NOSVE-NEXT: and w8, w9, w8 29; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14] 30; NONEON-NOSVE-NEXT: strb w8, [sp, #31] 31; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22] 32; NONEON-NOSVE-NEXT: and w8, w9, w8 33; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13] 34; NONEON-NOSVE-NEXT: strb w8, [sp, #30] 35; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21] 36; NONEON-NOSVE-NEXT: and w8, w9, w8 37; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12] 38; NONEON-NOSVE-NEXT: strb w8, [sp, #29] 39; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20] 40; NONEON-NOSVE-NEXT: and w8, w9, w8 41; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11] 42; NONEON-NOSVE-NEXT: strb w8, [sp, #28] 43; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19] 44; NONEON-NOSVE-NEXT: and w8, w9, w8 45; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10] 46; NONEON-NOSVE-NEXT: strb w8, [sp, #27] 47; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18] 48; NONEON-NOSVE-NEXT: and w8, w9, w8 49; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9] 50; NONEON-NOSVE-NEXT: strb w8, [sp, #26] 51; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17] 52; NONEON-NOSVE-NEXT: and w8, w9, w8 53; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8] 54; NONEON-NOSVE-NEXT: strb w8, [sp, #25] 55; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16] 56; NONEON-NOSVE-NEXT: and w8, w9, w8 57; NONEON-NOSVE-NEXT: strb w8, [sp, #24] 58; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 59; NONEON-NOSVE-NEXT: add sp, sp, #32 60; NONEON-NOSVE-NEXT: ret 61 %res = and <8 x i8> %op1, %op2 62 ret <8 x i8> %res 63} 64 65define <16 x i8> @and_v16i8(<16 x i8> %op1, <16 x i8> %op2) { 66; CHECK-LABEL: and_v16i8: 67; CHECK: // %bb.0: 68; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 69; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 70; CHECK-NEXT: and z0.d, z0.d, z1.d 71; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 72; CHECK-NEXT: ret 73; 74; NONEON-NOSVE-LABEL: and_v16i8: 75; NONEON-NOSVE: // %bb.0: 76; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 77; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 78; NONEON-NOSVE-NEXT: ldrb w8, [sp, #31] 79; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15] 80; NONEON-NOSVE-NEXT: and w8, w9, w8 81; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14] 82; NONEON-NOSVE-NEXT: strb w8, [sp, #47] 83; NONEON-NOSVE-NEXT: ldrb w8, [sp, #30] 84; NONEON-NOSVE-NEXT: and w8, w9, w8 85; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13] 86; NONEON-NOSVE-NEXT: strb w8, [sp, #46] 87; NONEON-NOSVE-NEXT: ldrb w8, [sp, #29] 88; NONEON-NOSVE-NEXT: and w8, w9, w8 89; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12] 90; NONEON-NOSVE-NEXT: strb w8, [sp, #45] 91; NONEON-NOSVE-NEXT: ldrb w8, [sp, #28] 92; NONEON-NOSVE-NEXT: and w8, w9, w8 93; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11] 94; NONEON-NOSVE-NEXT: strb w8, [sp, #44] 95; NONEON-NOSVE-NEXT: ldrb w8, [sp, #27] 96; NONEON-NOSVE-NEXT: and w8, w9, w8 97; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10] 98; NONEON-NOSVE-NEXT: strb w8, [sp, #43] 99; NONEON-NOSVE-NEXT: ldrb w8, [sp, #26] 100; NONEON-NOSVE-NEXT: and w8, w9, w8 101; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9] 102; NONEON-NOSVE-NEXT: strb w8, [sp, #42] 103; NONEON-NOSVE-NEXT: ldrb w8, [sp, #25] 104; NONEON-NOSVE-NEXT: and w8, w9, w8 105; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8] 106; NONEON-NOSVE-NEXT: strb w8, [sp, #41] 107; NONEON-NOSVE-NEXT: ldrb w8, [sp, #24] 108; NONEON-NOSVE-NEXT: and w8, w9, w8 109; NONEON-NOSVE-NEXT: ldrb w9, [sp, #7] 110; NONEON-NOSVE-NEXT: strb w8, [sp, #40] 111; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23] 112; NONEON-NOSVE-NEXT: and w8, w9, w8 113; NONEON-NOSVE-NEXT: ldrb w9, [sp, #6] 114; NONEON-NOSVE-NEXT: strb w8, [sp, #39] 115; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22] 116; NONEON-NOSVE-NEXT: and w8, w9, w8 117; NONEON-NOSVE-NEXT: ldrb w9, [sp, #5] 118; NONEON-NOSVE-NEXT: strb w8, [sp, #38] 119; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21] 120; NONEON-NOSVE-NEXT: and w8, w9, w8 121; NONEON-NOSVE-NEXT: ldrb w9, [sp, #4] 122; NONEON-NOSVE-NEXT: strb w8, [sp, #37] 123; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20] 124; NONEON-NOSVE-NEXT: and w8, w9, w8 125; NONEON-NOSVE-NEXT: ldrb w9, [sp, #3] 126; NONEON-NOSVE-NEXT: strb w8, [sp, #36] 127; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19] 128; NONEON-NOSVE-NEXT: and w8, w9, w8 129; NONEON-NOSVE-NEXT: ldrb w9, [sp, #2] 130; NONEON-NOSVE-NEXT: strb w8, [sp, #35] 131; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18] 132; NONEON-NOSVE-NEXT: and w8, w9, w8 133; NONEON-NOSVE-NEXT: ldrb w9, [sp, #1] 134; NONEON-NOSVE-NEXT: strb w8, [sp, #34] 135; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17] 136; NONEON-NOSVE-NEXT: and w8, w9, w8 137; NONEON-NOSVE-NEXT: ldrb w9, [sp] 138; NONEON-NOSVE-NEXT: strb w8, [sp, #33] 139; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16] 140; NONEON-NOSVE-NEXT: and w8, w9, w8 141; NONEON-NOSVE-NEXT: strb w8, [sp, #32] 142; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 143; NONEON-NOSVE-NEXT: add sp, sp, #48 144; NONEON-NOSVE-NEXT: ret 145 %res = and <16 x i8> %op1, %op2 146 ret <16 x i8> %res 147} 148 149define void @and_v32i8(ptr %a, ptr %b) { 150; CHECK-LABEL: and_v32i8: 151; CHECK: // %bb.0: 152; CHECK-NEXT: ldp q0, q3, [x1] 153; CHECK-NEXT: ldp q1, q2, [x0] 154; CHECK-NEXT: and z0.d, z1.d, z0.d 155; CHECK-NEXT: and z1.d, z2.d, z3.d 156; CHECK-NEXT: stp q0, q1, [x0] 157; CHECK-NEXT: ret 158; 159; NONEON-NOSVE-LABEL: and_v32i8: 160; NONEON-NOSVE: // %bb.0: 161; NONEON-NOSVE-NEXT: sub sp, sp, #96 162; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 163; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 164; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 165; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 166; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 167; NONEON-NOSVE-NEXT: ldrb w8, [sp, #63] 168; NONEON-NOSVE-NEXT: ldrb w9, [sp, #47] 169; NONEON-NOSVE-NEXT: and w8, w9, w8 170; NONEON-NOSVE-NEXT: ldrb w9, [sp, #46] 171; NONEON-NOSVE-NEXT: strb w8, [sp, #95] 172; NONEON-NOSVE-NEXT: ldrb w8, [sp, #62] 173; NONEON-NOSVE-NEXT: and w8, w9, w8 174; NONEON-NOSVE-NEXT: ldrb w9, [sp, #45] 175; NONEON-NOSVE-NEXT: strb w8, [sp, #94] 176; NONEON-NOSVE-NEXT: ldrb w8, [sp, #61] 177; NONEON-NOSVE-NEXT: and w8, w9, w8 178; NONEON-NOSVE-NEXT: ldrb w9, [sp, #44] 179; NONEON-NOSVE-NEXT: strb w8, [sp, #93] 180; NONEON-NOSVE-NEXT: ldrb w8, [sp, #60] 181; NONEON-NOSVE-NEXT: and w8, w9, w8 182; NONEON-NOSVE-NEXT: ldrb w9, [sp, #43] 183; NONEON-NOSVE-NEXT: strb w8, [sp, #92] 184; NONEON-NOSVE-NEXT: ldrb w8, [sp, #59] 185; NONEON-NOSVE-NEXT: and w8, w9, w8 186; NONEON-NOSVE-NEXT: ldrb w9, [sp, #42] 187; NONEON-NOSVE-NEXT: strb w8, [sp, #91] 188; NONEON-NOSVE-NEXT: ldrb w8, [sp, #58] 189; NONEON-NOSVE-NEXT: and w8, w9, w8 190; NONEON-NOSVE-NEXT: ldrb w9, [sp, #41] 191; NONEON-NOSVE-NEXT: strb w8, [sp, #90] 192; NONEON-NOSVE-NEXT: ldrb w8, [sp, #57] 193; NONEON-NOSVE-NEXT: and w8, w9, w8 194; NONEON-NOSVE-NEXT: ldrb w9, [sp, #40] 195; NONEON-NOSVE-NEXT: strb w8, [sp, #89] 196; NONEON-NOSVE-NEXT: ldrb w8, [sp, #56] 197; NONEON-NOSVE-NEXT: and w8, w9, w8 198; NONEON-NOSVE-NEXT: ldrb w9, [sp, #39] 199; NONEON-NOSVE-NEXT: strb w8, [sp, #88] 200; NONEON-NOSVE-NEXT: ldrb w8, [sp, #55] 201; NONEON-NOSVE-NEXT: and w8, w9, w8 202; NONEON-NOSVE-NEXT: ldrb w9, [sp, #38] 203; NONEON-NOSVE-NEXT: strb w8, [sp, #87] 204; NONEON-NOSVE-NEXT: ldrb w8, [sp, #54] 205; NONEON-NOSVE-NEXT: and w8, w9, w8 206; NONEON-NOSVE-NEXT: ldrb w9, [sp, #37] 207; NONEON-NOSVE-NEXT: strb w8, [sp, #86] 208; NONEON-NOSVE-NEXT: ldrb w8, [sp, #53] 209; NONEON-NOSVE-NEXT: and w8, w9, w8 210; NONEON-NOSVE-NEXT: ldrb w9, [sp, #36] 211; NONEON-NOSVE-NEXT: strb w8, [sp, #85] 212; NONEON-NOSVE-NEXT: ldrb w8, [sp, #52] 213; NONEON-NOSVE-NEXT: and w8, w9, w8 214; NONEON-NOSVE-NEXT: ldrb w9, [sp, #35] 215; NONEON-NOSVE-NEXT: strb w8, [sp, #84] 216; NONEON-NOSVE-NEXT: ldrb w8, [sp, #51] 217; NONEON-NOSVE-NEXT: and w8, w9, w8 218; NONEON-NOSVE-NEXT: ldrb w9, [sp, #34] 219; NONEON-NOSVE-NEXT: strb w8, [sp, #83] 220; NONEON-NOSVE-NEXT: ldrb w8, [sp, #50] 221; NONEON-NOSVE-NEXT: and w8, w9, w8 222; NONEON-NOSVE-NEXT: ldrb w9, [sp, #33] 223; NONEON-NOSVE-NEXT: strb w8, [sp, #82] 224; NONEON-NOSVE-NEXT: ldrb w8, [sp, #49] 225; NONEON-NOSVE-NEXT: and w8, w9, w8 226; NONEON-NOSVE-NEXT: ldrb w9, [sp, #32] 227; NONEON-NOSVE-NEXT: strb w8, [sp, #81] 228; NONEON-NOSVE-NEXT: ldrb w8, [sp, #48] 229; NONEON-NOSVE-NEXT: and w8, w9, w8 230; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15] 231; NONEON-NOSVE-NEXT: strb w8, [sp, #80] 232; NONEON-NOSVE-NEXT: ldrb w8, [sp, #31] 233; NONEON-NOSVE-NEXT: and w8, w9, w8 234; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14] 235; NONEON-NOSVE-NEXT: strb w8, [sp, #79] 236; NONEON-NOSVE-NEXT: ldrb w8, [sp, #30] 237; NONEON-NOSVE-NEXT: and w8, w9, w8 238; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13] 239; NONEON-NOSVE-NEXT: strb w8, [sp, #78] 240; NONEON-NOSVE-NEXT: ldrb w8, [sp, #29] 241; NONEON-NOSVE-NEXT: and w8, w9, w8 242; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12] 243; NONEON-NOSVE-NEXT: strb w8, [sp, #77] 244; NONEON-NOSVE-NEXT: ldrb w8, [sp, #28] 245; NONEON-NOSVE-NEXT: and w8, w9, w8 246; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11] 247; NONEON-NOSVE-NEXT: strb w8, [sp, #76] 248; NONEON-NOSVE-NEXT: ldrb w8, [sp, #27] 249; NONEON-NOSVE-NEXT: and w8, w9, w8 250; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10] 251; NONEON-NOSVE-NEXT: strb w8, [sp, #75] 252; NONEON-NOSVE-NEXT: ldrb w8, [sp, #26] 253; NONEON-NOSVE-NEXT: and w8, w9, w8 254; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9] 255; NONEON-NOSVE-NEXT: strb w8, [sp, #74] 256; NONEON-NOSVE-NEXT: ldrb w8, [sp, #25] 257; NONEON-NOSVE-NEXT: and w8, w9, w8 258; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8] 259; NONEON-NOSVE-NEXT: strb w8, [sp, #73] 260; NONEON-NOSVE-NEXT: ldrb w8, [sp, #24] 261; NONEON-NOSVE-NEXT: and w8, w9, w8 262; NONEON-NOSVE-NEXT: ldrb w9, [sp, #7] 263; NONEON-NOSVE-NEXT: strb w8, [sp, #72] 264; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23] 265; NONEON-NOSVE-NEXT: and w8, w9, w8 266; NONEON-NOSVE-NEXT: ldrb w9, [sp, #6] 267; NONEON-NOSVE-NEXT: strb w8, [sp, #71] 268; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22] 269; NONEON-NOSVE-NEXT: and w8, w9, w8 270; NONEON-NOSVE-NEXT: ldrb w9, [sp, #5] 271; NONEON-NOSVE-NEXT: strb w8, [sp, #70] 272; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21] 273; NONEON-NOSVE-NEXT: and w8, w9, w8 274; NONEON-NOSVE-NEXT: ldrb w9, [sp, #4] 275; NONEON-NOSVE-NEXT: strb w8, [sp, #69] 276; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20] 277; NONEON-NOSVE-NEXT: and w8, w9, w8 278; NONEON-NOSVE-NEXT: ldrb w9, [sp, #3] 279; NONEON-NOSVE-NEXT: strb w8, [sp, #68] 280; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19] 281; NONEON-NOSVE-NEXT: and w8, w9, w8 282; NONEON-NOSVE-NEXT: ldrb w9, [sp, #2] 283; NONEON-NOSVE-NEXT: strb w8, [sp, #67] 284; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18] 285; NONEON-NOSVE-NEXT: and w8, w9, w8 286; NONEON-NOSVE-NEXT: ldrb w9, [sp, #1] 287; NONEON-NOSVE-NEXT: strb w8, [sp, #66] 288; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17] 289; NONEON-NOSVE-NEXT: and w8, w9, w8 290; NONEON-NOSVE-NEXT: ldrb w9, [sp] 291; NONEON-NOSVE-NEXT: strb w8, [sp, #65] 292; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16] 293; NONEON-NOSVE-NEXT: and w8, w9, w8 294; NONEON-NOSVE-NEXT: strb w8, [sp, #64] 295; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 296; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 297; NONEON-NOSVE-NEXT: add sp, sp, #96 298; NONEON-NOSVE-NEXT: ret 299 %op1 = load <32 x i8>, ptr %a 300 %op2 = load <32 x i8>, ptr %b 301 %res = and <32 x i8> %op1, %op2 302 store <32 x i8> %res, ptr %a 303 ret void 304} 305 306define <4 x i16> @and_v4i16(<4 x i16> %op1, <4 x i16> %op2) { 307; CHECK-LABEL: and_v4i16: 308; CHECK: // %bb.0: 309; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 310; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 311; CHECK-NEXT: and z0.d, z0.d, z1.d 312; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 313; CHECK-NEXT: ret 314; 315; NONEON-NOSVE-LABEL: and_v4i16: 316; NONEON-NOSVE: // %bb.0: 317; NONEON-NOSVE-NEXT: sub sp, sp, #32 318; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 319; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 320; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22] 321; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14] 322; NONEON-NOSVE-NEXT: and w8, w9, w8 323; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12] 324; NONEON-NOSVE-NEXT: strh w8, [sp, #30] 325; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20] 326; NONEON-NOSVE-NEXT: and w8, w9, w8 327; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10] 328; NONEON-NOSVE-NEXT: strh w8, [sp, #28] 329; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18] 330; NONEON-NOSVE-NEXT: and w8, w9, w8 331; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8] 332; NONEON-NOSVE-NEXT: strh w8, [sp, #26] 333; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16] 334; NONEON-NOSVE-NEXT: and w8, w9, w8 335; NONEON-NOSVE-NEXT: strh w8, [sp, #24] 336; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 337; NONEON-NOSVE-NEXT: add sp, sp, #32 338; NONEON-NOSVE-NEXT: ret 339 %res = and <4 x i16> %op1, %op2 340 ret <4 x i16> %res 341} 342 343define <8 x i16> @and_v8i16(<8 x i16> %op1, <8 x i16> %op2) { 344; CHECK-LABEL: and_v8i16: 345; CHECK: // %bb.0: 346; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 347; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 348; CHECK-NEXT: and z0.d, z0.d, z1.d 349; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 350; CHECK-NEXT: ret 351; 352; NONEON-NOSVE-LABEL: and_v8i16: 353; NONEON-NOSVE: // %bb.0: 354; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 355; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 356; NONEON-NOSVE-NEXT: ldrh w8, [sp, #30] 357; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14] 358; NONEON-NOSVE-NEXT: and w8, w9, w8 359; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12] 360; NONEON-NOSVE-NEXT: strh w8, [sp, #46] 361; NONEON-NOSVE-NEXT: ldrh w8, [sp, #28] 362; NONEON-NOSVE-NEXT: and w8, w9, w8 363; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10] 364; NONEON-NOSVE-NEXT: strh w8, [sp, #44] 365; NONEON-NOSVE-NEXT: ldrh w8, [sp, #26] 366; NONEON-NOSVE-NEXT: and w8, w9, w8 367; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8] 368; NONEON-NOSVE-NEXT: strh w8, [sp, #42] 369; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24] 370; NONEON-NOSVE-NEXT: and w8, w9, w8 371; NONEON-NOSVE-NEXT: ldrh w9, [sp, #6] 372; NONEON-NOSVE-NEXT: strh w8, [sp, #40] 373; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22] 374; NONEON-NOSVE-NEXT: and w8, w9, w8 375; NONEON-NOSVE-NEXT: ldrh w9, [sp, #4] 376; NONEON-NOSVE-NEXT: strh w8, [sp, #38] 377; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20] 378; NONEON-NOSVE-NEXT: and w8, w9, w8 379; NONEON-NOSVE-NEXT: ldrh w9, [sp, #2] 380; NONEON-NOSVE-NEXT: strh w8, [sp, #36] 381; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18] 382; NONEON-NOSVE-NEXT: and w8, w9, w8 383; NONEON-NOSVE-NEXT: ldrh w9, [sp] 384; NONEON-NOSVE-NEXT: strh w8, [sp, #34] 385; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16] 386; NONEON-NOSVE-NEXT: and w8, w9, w8 387; NONEON-NOSVE-NEXT: strh w8, [sp, #32] 388; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 389; NONEON-NOSVE-NEXT: add sp, sp, #48 390; NONEON-NOSVE-NEXT: ret 391 %res = and <8 x i16> %op1, %op2 392 ret <8 x i16> %res 393} 394 395define void @and_v16i16(ptr %a, ptr %b) { 396; CHECK-LABEL: and_v16i16: 397; CHECK: // %bb.0: 398; CHECK-NEXT: ldp q0, q3, [x1] 399; CHECK-NEXT: ldp q1, q2, [x0] 400; CHECK-NEXT: and z0.d, z1.d, z0.d 401; CHECK-NEXT: and z1.d, z2.d, z3.d 402; CHECK-NEXT: stp q0, q1, [x0] 403; CHECK-NEXT: ret 404; 405; NONEON-NOSVE-LABEL: and_v16i16: 406; NONEON-NOSVE: // %bb.0: 407; NONEON-NOSVE-NEXT: sub sp, sp, #96 408; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 409; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 410; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 411; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 412; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 413; NONEON-NOSVE-NEXT: ldrh w8, [sp, #62] 414; NONEON-NOSVE-NEXT: ldrh w9, [sp, #46] 415; NONEON-NOSVE-NEXT: and w8, w9, w8 416; NONEON-NOSVE-NEXT: ldrh w9, [sp, #44] 417; NONEON-NOSVE-NEXT: strh w8, [sp, #94] 418; NONEON-NOSVE-NEXT: ldrh w8, [sp, #60] 419; NONEON-NOSVE-NEXT: and w8, w9, w8 420; NONEON-NOSVE-NEXT: ldrh w9, [sp, #42] 421; NONEON-NOSVE-NEXT: strh w8, [sp, #92] 422; NONEON-NOSVE-NEXT: ldrh w8, [sp, #58] 423; NONEON-NOSVE-NEXT: and w8, w9, w8 424; NONEON-NOSVE-NEXT: ldrh w9, [sp, #40] 425; NONEON-NOSVE-NEXT: strh w8, [sp, #90] 426; NONEON-NOSVE-NEXT: ldrh w8, [sp, #56] 427; NONEON-NOSVE-NEXT: and w8, w9, w8 428; NONEON-NOSVE-NEXT: ldrh w9, [sp, #38] 429; NONEON-NOSVE-NEXT: strh w8, [sp, #88] 430; NONEON-NOSVE-NEXT: ldrh w8, [sp, #54] 431; NONEON-NOSVE-NEXT: and w8, w9, w8 432; NONEON-NOSVE-NEXT: ldrh w9, [sp, #36] 433; NONEON-NOSVE-NEXT: strh w8, [sp, #86] 434; NONEON-NOSVE-NEXT: ldrh w8, [sp, #52] 435; NONEON-NOSVE-NEXT: and w8, w9, w8 436; NONEON-NOSVE-NEXT: ldrh w9, [sp, #34] 437; NONEON-NOSVE-NEXT: strh w8, [sp, #84] 438; NONEON-NOSVE-NEXT: ldrh w8, [sp, #50] 439; NONEON-NOSVE-NEXT: and w8, w9, w8 440; NONEON-NOSVE-NEXT: ldrh w9, [sp, #32] 441; NONEON-NOSVE-NEXT: strh w8, [sp, #82] 442; NONEON-NOSVE-NEXT: ldrh w8, [sp, #48] 443; NONEON-NOSVE-NEXT: and w8, w9, w8 444; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14] 445; NONEON-NOSVE-NEXT: strh w8, [sp, #80] 446; NONEON-NOSVE-NEXT: ldrh w8, [sp, #30] 447; NONEON-NOSVE-NEXT: and w8, w9, w8 448; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12] 449; NONEON-NOSVE-NEXT: strh w8, [sp, #78] 450; NONEON-NOSVE-NEXT: ldrh w8, [sp, #28] 451; NONEON-NOSVE-NEXT: and w8, w9, w8 452; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10] 453; NONEON-NOSVE-NEXT: strh w8, [sp, #76] 454; NONEON-NOSVE-NEXT: ldrh w8, [sp, #26] 455; NONEON-NOSVE-NEXT: and w8, w9, w8 456; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8] 457; NONEON-NOSVE-NEXT: strh w8, [sp, #74] 458; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24] 459; NONEON-NOSVE-NEXT: and w8, w9, w8 460; NONEON-NOSVE-NEXT: ldrh w9, [sp, #6] 461; NONEON-NOSVE-NEXT: strh w8, [sp, #72] 462; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22] 463; NONEON-NOSVE-NEXT: and w8, w9, w8 464; NONEON-NOSVE-NEXT: ldrh w9, [sp, #4] 465; NONEON-NOSVE-NEXT: strh w8, [sp, #70] 466; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20] 467; NONEON-NOSVE-NEXT: and w8, w9, w8 468; NONEON-NOSVE-NEXT: ldrh w9, [sp, #2] 469; NONEON-NOSVE-NEXT: strh w8, [sp, #68] 470; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18] 471; NONEON-NOSVE-NEXT: and w8, w9, w8 472; NONEON-NOSVE-NEXT: ldrh w9, [sp] 473; NONEON-NOSVE-NEXT: strh w8, [sp, #66] 474; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16] 475; NONEON-NOSVE-NEXT: and w8, w9, w8 476; NONEON-NOSVE-NEXT: strh w8, [sp, #64] 477; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 478; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 479; NONEON-NOSVE-NEXT: add sp, sp, #96 480; NONEON-NOSVE-NEXT: ret 481 %op1 = load <16 x i16>, ptr %a 482 %op2 = load <16 x i16>, ptr %b 483 %res = and <16 x i16> %op1, %op2 484 store <16 x i16> %res, ptr %a 485 ret void 486} 487 488define <2 x i32> @and_v2i32(<2 x i32> %op1, <2 x i32> %op2) { 489; CHECK-LABEL: and_v2i32: 490; CHECK: // %bb.0: 491; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 492; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 493; CHECK-NEXT: and z0.d, z0.d, z1.d 494; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 495; CHECK-NEXT: ret 496; 497; NONEON-NOSVE-LABEL: and_v2i32: 498; NONEON-NOSVE: // %bb.0: 499; NONEON-NOSVE-NEXT: sub sp, sp, #32 500; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 501; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 502; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8] 503; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 504; NONEON-NOSVE-NEXT: and w8, w10, w8 505; NONEON-NOSVE-NEXT: str w8, [sp, #28] 506; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 507; NONEON-NOSVE-NEXT: and w8, w9, w8 508; NONEON-NOSVE-NEXT: str w8, [sp, #24] 509; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 510; NONEON-NOSVE-NEXT: add sp, sp, #32 511; NONEON-NOSVE-NEXT: ret 512 %res = and <2 x i32> %op1, %op2 513 ret <2 x i32> %res 514} 515 516define <4 x i32> @and_v4i32(<4 x i32> %op1, <4 x i32> %op2) { 517; CHECK-LABEL: and_v4i32: 518; CHECK: // %bb.0: 519; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 520; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 521; CHECK-NEXT: and z0.d, z0.d, z1.d 522; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 523; CHECK-NEXT: ret 524; 525; NONEON-NOSVE-LABEL: and_v4i32: 526; NONEON-NOSVE: // %bb.0: 527; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 528; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 529; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8] 530; NONEON-NOSVE-NEXT: ldr w8, [sp, #28] 531; NONEON-NOSVE-NEXT: and w8, w10, w8 532; NONEON-NOSVE-NEXT: str w8, [sp, #44] 533; NONEON-NOSVE-NEXT: ldr w8, [sp, #24] 534; NONEON-NOSVE-NEXT: and w8, w9, w8 535; NONEON-NOSVE-NEXT: ldp w9, w10, [sp] 536; NONEON-NOSVE-NEXT: str w8, [sp, #40] 537; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 538; NONEON-NOSVE-NEXT: and w8, w10, w8 539; NONEON-NOSVE-NEXT: str w8, [sp, #36] 540; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 541; NONEON-NOSVE-NEXT: and w8, w9, w8 542; NONEON-NOSVE-NEXT: str w8, [sp, #32] 543; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 544; NONEON-NOSVE-NEXT: add sp, sp, #48 545; NONEON-NOSVE-NEXT: ret 546 %res = and <4 x i32> %op1, %op2 547 ret <4 x i32> %res 548} 549 550define void @and_v8i32(ptr %a, ptr %b) { 551; CHECK-LABEL: and_v8i32: 552; CHECK: // %bb.0: 553; CHECK-NEXT: ldp q0, q3, [x1] 554; CHECK-NEXT: ldp q1, q2, [x0] 555; CHECK-NEXT: and z0.d, z1.d, z0.d 556; CHECK-NEXT: and z1.d, z2.d, z3.d 557; CHECK-NEXT: stp q0, q1, [x0] 558; CHECK-NEXT: ret 559; 560; NONEON-NOSVE-LABEL: and_v8i32: 561; NONEON-NOSVE: // %bb.0: 562; NONEON-NOSVE-NEXT: sub sp, sp, #96 563; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 564; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 565; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 566; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 567; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 568; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #40] 569; NONEON-NOSVE-NEXT: ldr w8, [sp, #60] 570; NONEON-NOSVE-NEXT: and w8, w10, w8 571; NONEON-NOSVE-NEXT: str w8, [sp, #92] 572; NONEON-NOSVE-NEXT: ldr w8, [sp, #56] 573; NONEON-NOSVE-NEXT: and w8, w9, w8 574; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #32] 575; NONEON-NOSVE-NEXT: str w8, [sp, #88] 576; NONEON-NOSVE-NEXT: ldr w8, [sp, #52] 577; NONEON-NOSVE-NEXT: and w8, w10, w8 578; NONEON-NOSVE-NEXT: str w8, [sp, #84] 579; NONEON-NOSVE-NEXT: ldr w8, [sp, #48] 580; NONEON-NOSVE-NEXT: and w8, w9, w8 581; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8] 582; NONEON-NOSVE-NEXT: str w8, [sp, #80] 583; NONEON-NOSVE-NEXT: ldr w8, [sp, #28] 584; NONEON-NOSVE-NEXT: and w8, w10, w8 585; NONEON-NOSVE-NEXT: str w8, [sp, #76] 586; NONEON-NOSVE-NEXT: ldr w8, [sp, #24] 587; NONEON-NOSVE-NEXT: and w8, w9, w8 588; NONEON-NOSVE-NEXT: ldp w9, w10, [sp] 589; NONEON-NOSVE-NEXT: str w8, [sp, #72] 590; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 591; NONEON-NOSVE-NEXT: and w8, w10, w8 592; NONEON-NOSVE-NEXT: str w8, [sp, #68] 593; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 594; NONEON-NOSVE-NEXT: and w8, w9, w8 595; NONEON-NOSVE-NEXT: str w8, [sp, #64] 596; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 597; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 598; NONEON-NOSVE-NEXT: add sp, sp, #96 599; NONEON-NOSVE-NEXT: ret 600 %op1 = load <8 x i32>, ptr %a 601 %op2 = load <8 x i32>, ptr %b 602 %res = and <8 x i32> %op1, %op2 603 store <8 x i32> %res, ptr %a 604 ret void 605} 606 607define <1 x i64> @and_v1i64(<1 x i64> %op1, <1 x i64> %op2) { 608; CHECK-LABEL: and_v1i64: 609; CHECK: // %bb.0: 610; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 611; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 612; CHECK-NEXT: and z0.d, z0.d, z1.d 613; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 614; CHECK-NEXT: ret 615; 616; NONEON-NOSVE-LABEL: and_v1i64: 617; NONEON-NOSVE: // %bb.0: 618; NONEON-NOSVE-NEXT: sub sp, sp, #16 619; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 620; NONEON-NOSVE-NEXT: fmov x8, d1 621; NONEON-NOSVE-NEXT: fmov x9, d0 622; NONEON-NOSVE-NEXT: and x8, x9, x8 623; NONEON-NOSVE-NEXT: str x8, [sp, #8] 624; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 625; NONEON-NOSVE-NEXT: add sp, sp, #16 626; NONEON-NOSVE-NEXT: ret 627 %res = and <1 x i64> %op1, %op2 628 ret <1 x i64> %res 629} 630 631define <2 x i64> @and_v2i64(<2 x i64> %op1, <2 x i64> %op2) { 632; CHECK-LABEL: and_v2i64: 633; CHECK: // %bb.0: 634; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 635; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 636; CHECK-NEXT: and z0.d, z0.d, z1.d 637; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 638; CHECK-NEXT: ret 639; 640; NONEON-NOSVE-LABEL: and_v2i64: 641; NONEON-NOSVE: // %bb.0: 642; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 643; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 644; NONEON-NOSVE-NEXT: ldp x9, x10, [sp] 645; NONEON-NOSVE-NEXT: ldr x8, [sp, #24] 646; NONEON-NOSVE-NEXT: and x8, x10, x8 647; NONEON-NOSVE-NEXT: str x8, [sp, #40] 648; NONEON-NOSVE-NEXT: ldr x8, [sp, #16] 649; NONEON-NOSVE-NEXT: and x8, x9, x8 650; NONEON-NOSVE-NEXT: str x8, [sp, #32] 651; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 652; NONEON-NOSVE-NEXT: add sp, sp, #48 653; NONEON-NOSVE-NEXT: ret 654 %res = and <2 x i64> %op1, %op2 655 ret <2 x i64> %res 656} 657 658define void @and_v4i64(ptr %a, ptr %b) { 659; CHECK-LABEL: and_v4i64: 660; CHECK: // %bb.0: 661; CHECK-NEXT: ldp q0, q3, [x1] 662; CHECK-NEXT: ldp q1, q2, [x0] 663; CHECK-NEXT: and z0.d, z1.d, z0.d 664; CHECK-NEXT: and z1.d, z2.d, z3.d 665; CHECK-NEXT: stp q0, q1, [x0] 666; CHECK-NEXT: ret 667; 668; NONEON-NOSVE-LABEL: and_v4i64: 669; NONEON-NOSVE: // %bb.0: 670; NONEON-NOSVE-NEXT: sub sp, sp, #96 671; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 672; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 673; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 674; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 675; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 676; NONEON-NOSVE-NEXT: ldp x9, x10, [sp, #32] 677; NONEON-NOSVE-NEXT: ldr x8, [sp, #56] 678; NONEON-NOSVE-NEXT: and x8, x10, x8 679; NONEON-NOSVE-NEXT: str x8, [sp, #88] 680; NONEON-NOSVE-NEXT: ldr x8, [sp, #48] 681; NONEON-NOSVE-NEXT: and x8, x9, x8 682; NONEON-NOSVE-NEXT: ldp x9, x10, [sp] 683; NONEON-NOSVE-NEXT: str x8, [sp, #80] 684; NONEON-NOSVE-NEXT: ldr x8, [sp, #24] 685; NONEON-NOSVE-NEXT: and x8, x10, x8 686; NONEON-NOSVE-NEXT: str x8, [sp, #72] 687; NONEON-NOSVE-NEXT: ldr x8, [sp, #16] 688; NONEON-NOSVE-NEXT: and x8, x9, x8 689; NONEON-NOSVE-NEXT: str x8, [sp, #64] 690; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 691; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 692; NONEON-NOSVE-NEXT: add sp, sp, #96 693; NONEON-NOSVE-NEXT: ret 694 %op1 = load <4 x i64>, ptr %a 695 %op2 = load <4 x i64>, ptr %b 696 %res = and <4 x i64> %op1, %op2 697 store <4 x i64> %res, ptr %a 698 ret void 699} 700 701; 702; OR 703; 704 705define <8 x i8> @or_v8i8(<8 x i8> %op1, <8 x i8> %op2) { 706; CHECK-LABEL: or_v8i8: 707; CHECK: // %bb.0: 708; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 709; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 710; CHECK-NEXT: orr z0.d, z0.d, z1.d 711; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 712; CHECK-NEXT: ret 713; 714; NONEON-NOSVE-LABEL: or_v8i8: 715; NONEON-NOSVE: // %bb.0: 716; NONEON-NOSVE-NEXT: sub sp, sp, #32 717; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 718; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 719; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23] 720; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15] 721; NONEON-NOSVE-NEXT: orr w8, w9, w8 722; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14] 723; NONEON-NOSVE-NEXT: strb w8, [sp, #31] 724; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22] 725; NONEON-NOSVE-NEXT: orr w8, w9, w8 726; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13] 727; NONEON-NOSVE-NEXT: strb w8, [sp, #30] 728; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21] 729; NONEON-NOSVE-NEXT: orr w8, w9, w8 730; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12] 731; NONEON-NOSVE-NEXT: strb w8, [sp, #29] 732; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20] 733; NONEON-NOSVE-NEXT: orr w8, w9, w8 734; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11] 735; NONEON-NOSVE-NEXT: strb w8, [sp, #28] 736; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19] 737; NONEON-NOSVE-NEXT: orr w8, w9, w8 738; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10] 739; NONEON-NOSVE-NEXT: strb w8, [sp, #27] 740; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18] 741; NONEON-NOSVE-NEXT: orr w8, w9, w8 742; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9] 743; NONEON-NOSVE-NEXT: strb w8, [sp, #26] 744; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17] 745; NONEON-NOSVE-NEXT: orr w8, w9, w8 746; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8] 747; NONEON-NOSVE-NEXT: strb w8, [sp, #25] 748; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16] 749; NONEON-NOSVE-NEXT: orr w8, w9, w8 750; NONEON-NOSVE-NEXT: strb w8, [sp, #24] 751; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 752; NONEON-NOSVE-NEXT: add sp, sp, #32 753; NONEON-NOSVE-NEXT: ret 754 %res = or <8 x i8> %op1, %op2 755 ret <8 x i8> %res 756} 757 758define <16 x i8> @or_v16i8(<16 x i8> %op1, <16 x i8> %op2) { 759; CHECK-LABEL: or_v16i8: 760; CHECK: // %bb.0: 761; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 762; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 763; CHECK-NEXT: orr z0.d, z0.d, z1.d 764; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 765; CHECK-NEXT: ret 766; 767; NONEON-NOSVE-LABEL: or_v16i8: 768; NONEON-NOSVE: // %bb.0: 769; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 770; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 771; NONEON-NOSVE-NEXT: ldrb w8, [sp, #31] 772; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15] 773; NONEON-NOSVE-NEXT: orr w8, w9, w8 774; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14] 775; NONEON-NOSVE-NEXT: strb w8, [sp, #47] 776; NONEON-NOSVE-NEXT: ldrb w8, [sp, #30] 777; NONEON-NOSVE-NEXT: orr w8, w9, w8 778; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13] 779; NONEON-NOSVE-NEXT: strb w8, [sp, #46] 780; NONEON-NOSVE-NEXT: ldrb w8, [sp, #29] 781; NONEON-NOSVE-NEXT: orr w8, w9, w8 782; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12] 783; NONEON-NOSVE-NEXT: strb w8, [sp, #45] 784; NONEON-NOSVE-NEXT: ldrb w8, [sp, #28] 785; NONEON-NOSVE-NEXT: orr w8, w9, w8 786; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11] 787; NONEON-NOSVE-NEXT: strb w8, [sp, #44] 788; NONEON-NOSVE-NEXT: ldrb w8, [sp, #27] 789; NONEON-NOSVE-NEXT: orr w8, w9, w8 790; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10] 791; NONEON-NOSVE-NEXT: strb w8, [sp, #43] 792; NONEON-NOSVE-NEXT: ldrb w8, [sp, #26] 793; NONEON-NOSVE-NEXT: orr w8, w9, w8 794; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9] 795; NONEON-NOSVE-NEXT: strb w8, [sp, #42] 796; NONEON-NOSVE-NEXT: ldrb w8, [sp, #25] 797; NONEON-NOSVE-NEXT: orr w8, w9, w8 798; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8] 799; NONEON-NOSVE-NEXT: strb w8, [sp, #41] 800; NONEON-NOSVE-NEXT: ldrb w8, [sp, #24] 801; NONEON-NOSVE-NEXT: orr w8, w9, w8 802; NONEON-NOSVE-NEXT: ldrb w9, [sp, #7] 803; NONEON-NOSVE-NEXT: strb w8, [sp, #40] 804; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23] 805; NONEON-NOSVE-NEXT: orr w8, w9, w8 806; NONEON-NOSVE-NEXT: ldrb w9, [sp, #6] 807; NONEON-NOSVE-NEXT: strb w8, [sp, #39] 808; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22] 809; NONEON-NOSVE-NEXT: orr w8, w9, w8 810; NONEON-NOSVE-NEXT: ldrb w9, [sp, #5] 811; NONEON-NOSVE-NEXT: strb w8, [sp, #38] 812; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21] 813; NONEON-NOSVE-NEXT: orr w8, w9, w8 814; NONEON-NOSVE-NEXT: ldrb w9, [sp, #4] 815; NONEON-NOSVE-NEXT: strb w8, [sp, #37] 816; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20] 817; NONEON-NOSVE-NEXT: orr w8, w9, w8 818; NONEON-NOSVE-NEXT: ldrb w9, [sp, #3] 819; NONEON-NOSVE-NEXT: strb w8, [sp, #36] 820; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19] 821; NONEON-NOSVE-NEXT: orr w8, w9, w8 822; NONEON-NOSVE-NEXT: ldrb w9, [sp, #2] 823; NONEON-NOSVE-NEXT: strb w8, [sp, #35] 824; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18] 825; NONEON-NOSVE-NEXT: orr w8, w9, w8 826; NONEON-NOSVE-NEXT: ldrb w9, [sp, #1] 827; NONEON-NOSVE-NEXT: strb w8, [sp, #34] 828; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17] 829; NONEON-NOSVE-NEXT: orr w8, w9, w8 830; NONEON-NOSVE-NEXT: ldrb w9, [sp] 831; NONEON-NOSVE-NEXT: strb w8, [sp, #33] 832; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16] 833; NONEON-NOSVE-NEXT: orr w8, w9, w8 834; NONEON-NOSVE-NEXT: strb w8, [sp, #32] 835; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 836; NONEON-NOSVE-NEXT: add sp, sp, #48 837; NONEON-NOSVE-NEXT: ret 838 %res = or <16 x i8> %op1, %op2 839 ret <16 x i8> %res 840} 841 842define void @or_v32i8(ptr %a, ptr %b) { 843; CHECK-LABEL: or_v32i8: 844; CHECK: // %bb.0: 845; CHECK-NEXT: ldp q0, q3, [x1] 846; CHECK-NEXT: ldp q1, q2, [x0] 847; CHECK-NEXT: orr z0.d, z1.d, z0.d 848; CHECK-NEXT: orr z1.d, z2.d, z3.d 849; CHECK-NEXT: stp q0, q1, [x0] 850; CHECK-NEXT: ret 851; 852; NONEON-NOSVE-LABEL: or_v32i8: 853; NONEON-NOSVE: // %bb.0: 854; NONEON-NOSVE-NEXT: sub sp, sp, #96 855; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 856; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 857; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 858; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 859; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 860; NONEON-NOSVE-NEXT: ldrb w8, [sp, #63] 861; NONEON-NOSVE-NEXT: ldrb w9, [sp, #47] 862; NONEON-NOSVE-NEXT: orr w8, w9, w8 863; NONEON-NOSVE-NEXT: ldrb w9, [sp, #46] 864; NONEON-NOSVE-NEXT: strb w8, [sp, #95] 865; NONEON-NOSVE-NEXT: ldrb w8, [sp, #62] 866; NONEON-NOSVE-NEXT: orr w8, w9, w8 867; NONEON-NOSVE-NEXT: ldrb w9, [sp, #45] 868; NONEON-NOSVE-NEXT: strb w8, [sp, #94] 869; NONEON-NOSVE-NEXT: ldrb w8, [sp, #61] 870; NONEON-NOSVE-NEXT: orr w8, w9, w8 871; NONEON-NOSVE-NEXT: ldrb w9, [sp, #44] 872; NONEON-NOSVE-NEXT: strb w8, [sp, #93] 873; NONEON-NOSVE-NEXT: ldrb w8, [sp, #60] 874; NONEON-NOSVE-NEXT: orr w8, w9, w8 875; NONEON-NOSVE-NEXT: ldrb w9, [sp, #43] 876; NONEON-NOSVE-NEXT: strb w8, [sp, #92] 877; NONEON-NOSVE-NEXT: ldrb w8, [sp, #59] 878; NONEON-NOSVE-NEXT: orr w8, w9, w8 879; NONEON-NOSVE-NEXT: ldrb w9, [sp, #42] 880; NONEON-NOSVE-NEXT: strb w8, [sp, #91] 881; NONEON-NOSVE-NEXT: ldrb w8, [sp, #58] 882; NONEON-NOSVE-NEXT: orr w8, w9, w8 883; NONEON-NOSVE-NEXT: ldrb w9, [sp, #41] 884; NONEON-NOSVE-NEXT: strb w8, [sp, #90] 885; NONEON-NOSVE-NEXT: ldrb w8, [sp, #57] 886; NONEON-NOSVE-NEXT: orr w8, w9, w8 887; NONEON-NOSVE-NEXT: ldrb w9, [sp, #40] 888; NONEON-NOSVE-NEXT: strb w8, [sp, #89] 889; NONEON-NOSVE-NEXT: ldrb w8, [sp, #56] 890; NONEON-NOSVE-NEXT: orr w8, w9, w8 891; NONEON-NOSVE-NEXT: ldrb w9, [sp, #39] 892; NONEON-NOSVE-NEXT: strb w8, [sp, #88] 893; NONEON-NOSVE-NEXT: ldrb w8, [sp, #55] 894; NONEON-NOSVE-NEXT: orr w8, w9, w8 895; NONEON-NOSVE-NEXT: ldrb w9, [sp, #38] 896; NONEON-NOSVE-NEXT: strb w8, [sp, #87] 897; NONEON-NOSVE-NEXT: ldrb w8, [sp, #54] 898; NONEON-NOSVE-NEXT: orr w8, w9, w8 899; NONEON-NOSVE-NEXT: ldrb w9, [sp, #37] 900; NONEON-NOSVE-NEXT: strb w8, [sp, #86] 901; NONEON-NOSVE-NEXT: ldrb w8, [sp, #53] 902; NONEON-NOSVE-NEXT: orr w8, w9, w8 903; NONEON-NOSVE-NEXT: ldrb w9, [sp, #36] 904; NONEON-NOSVE-NEXT: strb w8, [sp, #85] 905; NONEON-NOSVE-NEXT: ldrb w8, [sp, #52] 906; NONEON-NOSVE-NEXT: orr w8, w9, w8 907; NONEON-NOSVE-NEXT: ldrb w9, [sp, #35] 908; NONEON-NOSVE-NEXT: strb w8, [sp, #84] 909; NONEON-NOSVE-NEXT: ldrb w8, [sp, #51] 910; NONEON-NOSVE-NEXT: orr w8, w9, w8 911; NONEON-NOSVE-NEXT: ldrb w9, [sp, #34] 912; NONEON-NOSVE-NEXT: strb w8, [sp, #83] 913; NONEON-NOSVE-NEXT: ldrb w8, [sp, #50] 914; NONEON-NOSVE-NEXT: orr w8, w9, w8 915; NONEON-NOSVE-NEXT: ldrb w9, [sp, #33] 916; NONEON-NOSVE-NEXT: strb w8, [sp, #82] 917; NONEON-NOSVE-NEXT: ldrb w8, [sp, #49] 918; NONEON-NOSVE-NEXT: orr w8, w9, w8 919; NONEON-NOSVE-NEXT: ldrb w9, [sp, #32] 920; NONEON-NOSVE-NEXT: strb w8, [sp, #81] 921; NONEON-NOSVE-NEXT: ldrb w8, [sp, #48] 922; NONEON-NOSVE-NEXT: orr w8, w9, w8 923; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15] 924; NONEON-NOSVE-NEXT: strb w8, [sp, #80] 925; NONEON-NOSVE-NEXT: ldrb w8, [sp, #31] 926; NONEON-NOSVE-NEXT: orr w8, w9, w8 927; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14] 928; NONEON-NOSVE-NEXT: strb w8, [sp, #79] 929; NONEON-NOSVE-NEXT: ldrb w8, [sp, #30] 930; NONEON-NOSVE-NEXT: orr w8, w9, w8 931; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13] 932; NONEON-NOSVE-NEXT: strb w8, [sp, #78] 933; NONEON-NOSVE-NEXT: ldrb w8, [sp, #29] 934; NONEON-NOSVE-NEXT: orr w8, w9, w8 935; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12] 936; NONEON-NOSVE-NEXT: strb w8, [sp, #77] 937; NONEON-NOSVE-NEXT: ldrb w8, [sp, #28] 938; NONEON-NOSVE-NEXT: orr w8, w9, w8 939; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11] 940; NONEON-NOSVE-NEXT: strb w8, [sp, #76] 941; NONEON-NOSVE-NEXT: ldrb w8, [sp, #27] 942; NONEON-NOSVE-NEXT: orr w8, w9, w8 943; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10] 944; NONEON-NOSVE-NEXT: strb w8, [sp, #75] 945; NONEON-NOSVE-NEXT: ldrb w8, [sp, #26] 946; NONEON-NOSVE-NEXT: orr w8, w9, w8 947; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9] 948; NONEON-NOSVE-NEXT: strb w8, [sp, #74] 949; NONEON-NOSVE-NEXT: ldrb w8, [sp, #25] 950; NONEON-NOSVE-NEXT: orr w8, w9, w8 951; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8] 952; NONEON-NOSVE-NEXT: strb w8, [sp, #73] 953; NONEON-NOSVE-NEXT: ldrb w8, [sp, #24] 954; NONEON-NOSVE-NEXT: orr w8, w9, w8 955; NONEON-NOSVE-NEXT: ldrb w9, [sp, #7] 956; NONEON-NOSVE-NEXT: strb w8, [sp, #72] 957; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23] 958; NONEON-NOSVE-NEXT: orr w8, w9, w8 959; NONEON-NOSVE-NEXT: ldrb w9, [sp, #6] 960; NONEON-NOSVE-NEXT: strb w8, [sp, #71] 961; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22] 962; NONEON-NOSVE-NEXT: orr w8, w9, w8 963; NONEON-NOSVE-NEXT: ldrb w9, [sp, #5] 964; NONEON-NOSVE-NEXT: strb w8, [sp, #70] 965; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21] 966; NONEON-NOSVE-NEXT: orr w8, w9, w8 967; NONEON-NOSVE-NEXT: ldrb w9, [sp, #4] 968; NONEON-NOSVE-NEXT: strb w8, [sp, #69] 969; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20] 970; NONEON-NOSVE-NEXT: orr w8, w9, w8 971; NONEON-NOSVE-NEXT: ldrb w9, [sp, #3] 972; NONEON-NOSVE-NEXT: strb w8, [sp, #68] 973; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19] 974; NONEON-NOSVE-NEXT: orr w8, w9, w8 975; NONEON-NOSVE-NEXT: ldrb w9, [sp, #2] 976; NONEON-NOSVE-NEXT: strb w8, [sp, #67] 977; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18] 978; NONEON-NOSVE-NEXT: orr w8, w9, w8 979; NONEON-NOSVE-NEXT: ldrb w9, [sp, #1] 980; NONEON-NOSVE-NEXT: strb w8, [sp, #66] 981; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17] 982; NONEON-NOSVE-NEXT: orr w8, w9, w8 983; NONEON-NOSVE-NEXT: ldrb w9, [sp] 984; NONEON-NOSVE-NEXT: strb w8, [sp, #65] 985; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16] 986; NONEON-NOSVE-NEXT: orr w8, w9, w8 987; NONEON-NOSVE-NEXT: strb w8, [sp, #64] 988; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 989; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 990; NONEON-NOSVE-NEXT: add sp, sp, #96 991; NONEON-NOSVE-NEXT: ret 992 %op1 = load <32 x i8>, ptr %a 993 %op2 = load <32 x i8>, ptr %b 994 %res = or <32 x i8> %op1, %op2 995 store <32 x i8> %res, ptr %a 996 ret void 997} 998 999define <4 x i16> @or_v4i16(<4 x i16> %op1, <4 x i16> %op2) { 1000; CHECK-LABEL: or_v4i16: 1001; CHECK: // %bb.0: 1002; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1003; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 1004; CHECK-NEXT: orr z0.d, z0.d, z1.d 1005; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 1006; CHECK-NEXT: ret 1007; 1008; NONEON-NOSVE-LABEL: or_v4i16: 1009; NONEON-NOSVE: // %bb.0: 1010; NONEON-NOSVE-NEXT: sub sp, sp, #32 1011; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 1012; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 1013; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22] 1014; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14] 1015; NONEON-NOSVE-NEXT: orr w8, w9, w8 1016; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12] 1017; NONEON-NOSVE-NEXT: strh w8, [sp, #30] 1018; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20] 1019; NONEON-NOSVE-NEXT: orr w8, w9, w8 1020; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10] 1021; NONEON-NOSVE-NEXT: strh w8, [sp, #28] 1022; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18] 1023; NONEON-NOSVE-NEXT: orr w8, w9, w8 1024; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8] 1025; NONEON-NOSVE-NEXT: strh w8, [sp, #26] 1026; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16] 1027; NONEON-NOSVE-NEXT: orr w8, w9, w8 1028; NONEON-NOSVE-NEXT: strh w8, [sp, #24] 1029; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 1030; NONEON-NOSVE-NEXT: add sp, sp, #32 1031; NONEON-NOSVE-NEXT: ret 1032 %res = or <4 x i16> %op1, %op2 1033 ret <4 x i16> %res 1034} 1035 1036define <8 x i16> @or_v8i16(<8 x i16> %op1, <8 x i16> %op2) { 1037; CHECK-LABEL: or_v8i16: 1038; CHECK: // %bb.0: 1039; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 1040; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 1041; CHECK-NEXT: orr z0.d, z0.d, z1.d 1042; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 1043; CHECK-NEXT: ret 1044; 1045; NONEON-NOSVE-LABEL: or_v8i16: 1046; NONEON-NOSVE: // %bb.0: 1047; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 1048; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 1049; NONEON-NOSVE-NEXT: ldrh w8, [sp, #30] 1050; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14] 1051; NONEON-NOSVE-NEXT: orr w8, w9, w8 1052; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12] 1053; NONEON-NOSVE-NEXT: strh w8, [sp, #46] 1054; NONEON-NOSVE-NEXT: ldrh w8, [sp, #28] 1055; NONEON-NOSVE-NEXT: orr w8, w9, w8 1056; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10] 1057; NONEON-NOSVE-NEXT: strh w8, [sp, #44] 1058; NONEON-NOSVE-NEXT: ldrh w8, [sp, #26] 1059; NONEON-NOSVE-NEXT: orr w8, w9, w8 1060; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8] 1061; NONEON-NOSVE-NEXT: strh w8, [sp, #42] 1062; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24] 1063; NONEON-NOSVE-NEXT: orr w8, w9, w8 1064; NONEON-NOSVE-NEXT: ldrh w9, [sp, #6] 1065; NONEON-NOSVE-NEXT: strh w8, [sp, #40] 1066; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22] 1067; NONEON-NOSVE-NEXT: orr w8, w9, w8 1068; NONEON-NOSVE-NEXT: ldrh w9, [sp, #4] 1069; NONEON-NOSVE-NEXT: strh w8, [sp, #38] 1070; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20] 1071; NONEON-NOSVE-NEXT: orr w8, w9, w8 1072; NONEON-NOSVE-NEXT: ldrh w9, [sp, #2] 1073; NONEON-NOSVE-NEXT: strh w8, [sp, #36] 1074; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18] 1075; NONEON-NOSVE-NEXT: orr w8, w9, w8 1076; NONEON-NOSVE-NEXT: ldrh w9, [sp] 1077; NONEON-NOSVE-NEXT: strh w8, [sp, #34] 1078; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16] 1079; NONEON-NOSVE-NEXT: orr w8, w9, w8 1080; NONEON-NOSVE-NEXT: strh w8, [sp, #32] 1081; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 1082; NONEON-NOSVE-NEXT: add sp, sp, #48 1083; NONEON-NOSVE-NEXT: ret 1084 %res = or <8 x i16> %op1, %op2 1085 ret <8 x i16> %res 1086} 1087 1088define void @or_v16i16(ptr %a, ptr %b) { 1089; CHECK-LABEL: or_v16i16: 1090; CHECK: // %bb.0: 1091; CHECK-NEXT: ldp q0, q3, [x1] 1092; CHECK-NEXT: ldp q1, q2, [x0] 1093; CHECK-NEXT: orr z0.d, z1.d, z0.d 1094; CHECK-NEXT: orr z1.d, z2.d, z3.d 1095; CHECK-NEXT: stp q0, q1, [x0] 1096; CHECK-NEXT: ret 1097; 1098; NONEON-NOSVE-LABEL: or_v16i16: 1099; NONEON-NOSVE: // %bb.0: 1100; NONEON-NOSVE-NEXT: sub sp, sp, #96 1101; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 1102; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 1103; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 1104; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 1105; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 1106; NONEON-NOSVE-NEXT: ldrh w8, [sp, #62] 1107; NONEON-NOSVE-NEXT: ldrh w9, [sp, #46] 1108; NONEON-NOSVE-NEXT: orr w8, w9, w8 1109; NONEON-NOSVE-NEXT: ldrh w9, [sp, #44] 1110; NONEON-NOSVE-NEXT: strh w8, [sp, #94] 1111; NONEON-NOSVE-NEXT: ldrh w8, [sp, #60] 1112; NONEON-NOSVE-NEXT: orr w8, w9, w8 1113; NONEON-NOSVE-NEXT: ldrh w9, [sp, #42] 1114; NONEON-NOSVE-NEXT: strh w8, [sp, #92] 1115; NONEON-NOSVE-NEXT: ldrh w8, [sp, #58] 1116; NONEON-NOSVE-NEXT: orr w8, w9, w8 1117; NONEON-NOSVE-NEXT: ldrh w9, [sp, #40] 1118; NONEON-NOSVE-NEXT: strh w8, [sp, #90] 1119; NONEON-NOSVE-NEXT: ldrh w8, [sp, #56] 1120; NONEON-NOSVE-NEXT: orr w8, w9, w8 1121; NONEON-NOSVE-NEXT: ldrh w9, [sp, #38] 1122; NONEON-NOSVE-NEXT: strh w8, [sp, #88] 1123; NONEON-NOSVE-NEXT: ldrh w8, [sp, #54] 1124; NONEON-NOSVE-NEXT: orr w8, w9, w8 1125; NONEON-NOSVE-NEXT: ldrh w9, [sp, #36] 1126; NONEON-NOSVE-NEXT: strh w8, [sp, #86] 1127; NONEON-NOSVE-NEXT: ldrh w8, [sp, #52] 1128; NONEON-NOSVE-NEXT: orr w8, w9, w8 1129; NONEON-NOSVE-NEXT: ldrh w9, [sp, #34] 1130; NONEON-NOSVE-NEXT: strh w8, [sp, #84] 1131; NONEON-NOSVE-NEXT: ldrh w8, [sp, #50] 1132; NONEON-NOSVE-NEXT: orr w8, w9, w8 1133; NONEON-NOSVE-NEXT: ldrh w9, [sp, #32] 1134; NONEON-NOSVE-NEXT: strh w8, [sp, #82] 1135; NONEON-NOSVE-NEXT: ldrh w8, [sp, #48] 1136; NONEON-NOSVE-NEXT: orr w8, w9, w8 1137; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14] 1138; NONEON-NOSVE-NEXT: strh w8, [sp, #80] 1139; NONEON-NOSVE-NEXT: ldrh w8, [sp, #30] 1140; NONEON-NOSVE-NEXT: orr w8, w9, w8 1141; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12] 1142; NONEON-NOSVE-NEXT: strh w8, [sp, #78] 1143; NONEON-NOSVE-NEXT: ldrh w8, [sp, #28] 1144; NONEON-NOSVE-NEXT: orr w8, w9, w8 1145; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10] 1146; NONEON-NOSVE-NEXT: strh w8, [sp, #76] 1147; NONEON-NOSVE-NEXT: ldrh w8, [sp, #26] 1148; NONEON-NOSVE-NEXT: orr w8, w9, w8 1149; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8] 1150; NONEON-NOSVE-NEXT: strh w8, [sp, #74] 1151; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24] 1152; NONEON-NOSVE-NEXT: orr w8, w9, w8 1153; NONEON-NOSVE-NEXT: ldrh w9, [sp, #6] 1154; NONEON-NOSVE-NEXT: strh w8, [sp, #72] 1155; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22] 1156; NONEON-NOSVE-NEXT: orr w8, w9, w8 1157; NONEON-NOSVE-NEXT: ldrh w9, [sp, #4] 1158; NONEON-NOSVE-NEXT: strh w8, [sp, #70] 1159; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20] 1160; NONEON-NOSVE-NEXT: orr w8, w9, w8 1161; NONEON-NOSVE-NEXT: ldrh w9, [sp, #2] 1162; NONEON-NOSVE-NEXT: strh w8, [sp, #68] 1163; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18] 1164; NONEON-NOSVE-NEXT: orr w8, w9, w8 1165; NONEON-NOSVE-NEXT: ldrh w9, [sp] 1166; NONEON-NOSVE-NEXT: strh w8, [sp, #66] 1167; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16] 1168; NONEON-NOSVE-NEXT: orr w8, w9, w8 1169; NONEON-NOSVE-NEXT: strh w8, [sp, #64] 1170; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 1171; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 1172; NONEON-NOSVE-NEXT: add sp, sp, #96 1173; NONEON-NOSVE-NEXT: ret 1174 %op1 = load <16 x i16>, ptr %a 1175 %op2 = load <16 x i16>, ptr %b 1176 %res = or <16 x i16> %op1, %op2 1177 store <16 x i16> %res, ptr %a 1178 ret void 1179} 1180 1181define <2 x i32> @or_v2i32(<2 x i32> %op1, <2 x i32> %op2) { 1182; CHECK-LABEL: or_v2i32: 1183; CHECK: // %bb.0: 1184; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1185; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 1186; CHECK-NEXT: orr z0.d, z0.d, z1.d 1187; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 1188; CHECK-NEXT: ret 1189; 1190; NONEON-NOSVE-LABEL: or_v2i32: 1191; NONEON-NOSVE: // %bb.0: 1192; NONEON-NOSVE-NEXT: sub sp, sp, #32 1193; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 1194; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 1195; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8] 1196; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 1197; NONEON-NOSVE-NEXT: orr w8, w10, w8 1198; NONEON-NOSVE-NEXT: str w8, [sp, #28] 1199; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 1200; NONEON-NOSVE-NEXT: orr w8, w9, w8 1201; NONEON-NOSVE-NEXT: str w8, [sp, #24] 1202; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 1203; NONEON-NOSVE-NEXT: add sp, sp, #32 1204; NONEON-NOSVE-NEXT: ret 1205 %res = or <2 x i32> %op1, %op2 1206 ret <2 x i32> %res 1207} 1208 1209define <4 x i32> @or_v4i32(<4 x i32> %op1, <4 x i32> %op2) { 1210; CHECK-LABEL: or_v4i32: 1211; CHECK: // %bb.0: 1212; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 1213; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 1214; CHECK-NEXT: orr z0.d, z0.d, z1.d 1215; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 1216; CHECK-NEXT: ret 1217; 1218; NONEON-NOSVE-LABEL: or_v4i32: 1219; NONEON-NOSVE: // %bb.0: 1220; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 1221; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 1222; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8] 1223; NONEON-NOSVE-NEXT: ldr w8, [sp, #28] 1224; NONEON-NOSVE-NEXT: orr w8, w10, w8 1225; NONEON-NOSVE-NEXT: str w8, [sp, #44] 1226; NONEON-NOSVE-NEXT: ldr w8, [sp, #24] 1227; NONEON-NOSVE-NEXT: orr w8, w9, w8 1228; NONEON-NOSVE-NEXT: ldp w9, w10, [sp] 1229; NONEON-NOSVE-NEXT: str w8, [sp, #40] 1230; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 1231; NONEON-NOSVE-NEXT: orr w8, w10, w8 1232; NONEON-NOSVE-NEXT: str w8, [sp, #36] 1233; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 1234; NONEON-NOSVE-NEXT: orr w8, w9, w8 1235; NONEON-NOSVE-NEXT: str w8, [sp, #32] 1236; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 1237; NONEON-NOSVE-NEXT: add sp, sp, #48 1238; NONEON-NOSVE-NEXT: ret 1239 %res = or <4 x i32> %op1, %op2 1240 ret <4 x i32> %res 1241} 1242 1243define void @or_v8i32(ptr %a, ptr %b) { 1244; CHECK-LABEL: or_v8i32: 1245; CHECK: // %bb.0: 1246; CHECK-NEXT: ldp q0, q3, [x1] 1247; CHECK-NEXT: ldp q1, q2, [x0] 1248; CHECK-NEXT: orr z0.d, z1.d, z0.d 1249; CHECK-NEXT: orr z1.d, z2.d, z3.d 1250; CHECK-NEXT: stp q0, q1, [x0] 1251; CHECK-NEXT: ret 1252; 1253; NONEON-NOSVE-LABEL: or_v8i32: 1254; NONEON-NOSVE: // %bb.0: 1255; NONEON-NOSVE-NEXT: sub sp, sp, #96 1256; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 1257; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 1258; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 1259; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 1260; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 1261; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #40] 1262; NONEON-NOSVE-NEXT: ldr w8, [sp, #60] 1263; NONEON-NOSVE-NEXT: orr w8, w10, w8 1264; NONEON-NOSVE-NEXT: str w8, [sp, #92] 1265; NONEON-NOSVE-NEXT: ldr w8, [sp, #56] 1266; NONEON-NOSVE-NEXT: orr w8, w9, w8 1267; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #32] 1268; NONEON-NOSVE-NEXT: str w8, [sp, #88] 1269; NONEON-NOSVE-NEXT: ldr w8, [sp, #52] 1270; NONEON-NOSVE-NEXT: orr w8, w10, w8 1271; NONEON-NOSVE-NEXT: str w8, [sp, #84] 1272; NONEON-NOSVE-NEXT: ldr w8, [sp, #48] 1273; NONEON-NOSVE-NEXT: orr w8, w9, w8 1274; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8] 1275; NONEON-NOSVE-NEXT: str w8, [sp, #80] 1276; NONEON-NOSVE-NEXT: ldr w8, [sp, #28] 1277; NONEON-NOSVE-NEXT: orr w8, w10, w8 1278; NONEON-NOSVE-NEXT: str w8, [sp, #76] 1279; NONEON-NOSVE-NEXT: ldr w8, [sp, #24] 1280; NONEON-NOSVE-NEXT: orr w8, w9, w8 1281; NONEON-NOSVE-NEXT: ldp w9, w10, [sp] 1282; NONEON-NOSVE-NEXT: str w8, [sp, #72] 1283; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 1284; NONEON-NOSVE-NEXT: orr w8, w10, w8 1285; NONEON-NOSVE-NEXT: str w8, [sp, #68] 1286; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 1287; NONEON-NOSVE-NEXT: orr w8, w9, w8 1288; NONEON-NOSVE-NEXT: str w8, [sp, #64] 1289; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 1290; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 1291; NONEON-NOSVE-NEXT: add sp, sp, #96 1292; NONEON-NOSVE-NEXT: ret 1293 %op1 = load <8 x i32>, ptr %a 1294 %op2 = load <8 x i32>, ptr %b 1295 %res = or <8 x i32> %op1, %op2 1296 store <8 x i32> %res, ptr %a 1297 ret void 1298} 1299 1300define <1 x i64> @or_v1i64(<1 x i64> %op1, <1 x i64> %op2) { 1301; CHECK-LABEL: or_v1i64: 1302; CHECK: // %bb.0: 1303; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1304; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 1305; CHECK-NEXT: orr z0.d, z0.d, z1.d 1306; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 1307; CHECK-NEXT: ret 1308; 1309; NONEON-NOSVE-LABEL: or_v1i64: 1310; NONEON-NOSVE: // %bb.0: 1311; NONEON-NOSVE-NEXT: sub sp, sp, #16 1312; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 1313; NONEON-NOSVE-NEXT: fmov x8, d1 1314; NONEON-NOSVE-NEXT: fmov x9, d0 1315; NONEON-NOSVE-NEXT: orr x8, x9, x8 1316; NONEON-NOSVE-NEXT: str x8, [sp, #8] 1317; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 1318; NONEON-NOSVE-NEXT: add sp, sp, #16 1319; NONEON-NOSVE-NEXT: ret 1320 %res = or <1 x i64> %op1, %op2 1321 ret <1 x i64> %res 1322} 1323 1324define <2 x i64> @or_v2i64(<2 x i64> %op1, <2 x i64> %op2) { 1325; CHECK-LABEL: or_v2i64: 1326; CHECK: // %bb.0: 1327; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 1328; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 1329; CHECK-NEXT: orr z0.d, z0.d, z1.d 1330; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 1331; CHECK-NEXT: ret 1332; 1333; NONEON-NOSVE-LABEL: or_v2i64: 1334; NONEON-NOSVE: // %bb.0: 1335; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 1336; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 1337; NONEON-NOSVE-NEXT: ldp x9, x10, [sp] 1338; NONEON-NOSVE-NEXT: ldr x8, [sp, #24] 1339; NONEON-NOSVE-NEXT: orr x8, x10, x8 1340; NONEON-NOSVE-NEXT: str x8, [sp, #40] 1341; NONEON-NOSVE-NEXT: ldr x8, [sp, #16] 1342; NONEON-NOSVE-NEXT: orr x8, x9, x8 1343; NONEON-NOSVE-NEXT: str x8, [sp, #32] 1344; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 1345; NONEON-NOSVE-NEXT: add sp, sp, #48 1346; NONEON-NOSVE-NEXT: ret 1347 %res = or <2 x i64> %op1, %op2 1348 ret <2 x i64> %res 1349} 1350 1351define void @or_v4i64(ptr %a, ptr %b) { 1352; CHECK-LABEL: or_v4i64: 1353; CHECK: // %bb.0: 1354; CHECK-NEXT: ldp q0, q3, [x1] 1355; CHECK-NEXT: ldp q1, q2, [x0] 1356; CHECK-NEXT: orr z0.d, z1.d, z0.d 1357; CHECK-NEXT: orr z1.d, z2.d, z3.d 1358; CHECK-NEXT: stp q0, q1, [x0] 1359; CHECK-NEXT: ret 1360; 1361; NONEON-NOSVE-LABEL: or_v4i64: 1362; NONEON-NOSVE: // %bb.0: 1363; NONEON-NOSVE-NEXT: sub sp, sp, #96 1364; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 1365; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 1366; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 1367; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 1368; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 1369; NONEON-NOSVE-NEXT: ldp x9, x10, [sp, #32] 1370; NONEON-NOSVE-NEXT: ldr x8, [sp, #56] 1371; NONEON-NOSVE-NEXT: orr x8, x10, x8 1372; NONEON-NOSVE-NEXT: str x8, [sp, #88] 1373; NONEON-NOSVE-NEXT: ldr x8, [sp, #48] 1374; NONEON-NOSVE-NEXT: orr x8, x9, x8 1375; NONEON-NOSVE-NEXT: ldp x9, x10, [sp] 1376; NONEON-NOSVE-NEXT: str x8, [sp, #80] 1377; NONEON-NOSVE-NEXT: ldr x8, [sp, #24] 1378; NONEON-NOSVE-NEXT: orr x8, x10, x8 1379; NONEON-NOSVE-NEXT: str x8, [sp, #72] 1380; NONEON-NOSVE-NEXT: ldr x8, [sp, #16] 1381; NONEON-NOSVE-NEXT: orr x8, x9, x8 1382; NONEON-NOSVE-NEXT: str x8, [sp, #64] 1383; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 1384; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 1385; NONEON-NOSVE-NEXT: add sp, sp, #96 1386; NONEON-NOSVE-NEXT: ret 1387 %op1 = load <4 x i64>, ptr %a 1388 %op2 = load <4 x i64>, ptr %b 1389 %res = or <4 x i64> %op1, %op2 1390 store <4 x i64> %res, ptr %a 1391 ret void 1392} 1393 1394; 1395; XOR 1396; 1397 1398define <8 x i8> @xor_v8i8(<8 x i8> %op1, <8 x i8> %op2) { 1399; CHECK-LABEL: xor_v8i8: 1400; CHECK: // %bb.0: 1401; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1402; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 1403; CHECK-NEXT: eor z0.d, z0.d, z1.d 1404; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 1405; CHECK-NEXT: ret 1406; 1407; NONEON-NOSVE-LABEL: xor_v8i8: 1408; NONEON-NOSVE: // %bb.0: 1409; NONEON-NOSVE-NEXT: sub sp, sp, #32 1410; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 1411; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 1412; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23] 1413; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15] 1414; NONEON-NOSVE-NEXT: eor w8, w9, w8 1415; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14] 1416; NONEON-NOSVE-NEXT: strb w8, [sp, #31] 1417; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22] 1418; NONEON-NOSVE-NEXT: eor w8, w9, w8 1419; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13] 1420; NONEON-NOSVE-NEXT: strb w8, [sp, #30] 1421; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21] 1422; NONEON-NOSVE-NEXT: eor w8, w9, w8 1423; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12] 1424; NONEON-NOSVE-NEXT: strb w8, [sp, #29] 1425; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20] 1426; NONEON-NOSVE-NEXT: eor w8, w9, w8 1427; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11] 1428; NONEON-NOSVE-NEXT: strb w8, [sp, #28] 1429; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19] 1430; NONEON-NOSVE-NEXT: eor w8, w9, w8 1431; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10] 1432; NONEON-NOSVE-NEXT: strb w8, [sp, #27] 1433; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18] 1434; NONEON-NOSVE-NEXT: eor w8, w9, w8 1435; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9] 1436; NONEON-NOSVE-NEXT: strb w8, [sp, #26] 1437; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17] 1438; NONEON-NOSVE-NEXT: eor w8, w9, w8 1439; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8] 1440; NONEON-NOSVE-NEXT: strb w8, [sp, #25] 1441; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16] 1442; NONEON-NOSVE-NEXT: eor w8, w9, w8 1443; NONEON-NOSVE-NEXT: strb w8, [sp, #24] 1444; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 1445; NONEON-NOSVE-NEXT: add sp, sp, #32 1446; NONEON-NOSVE-NEXT: ret 1447 %res = xor <8 x i8> %op1, %op2 1448 ret <8 x i8> %res 1449} 1450 1451define <16 x i8> @xor_v16i8(<16 x i8> %op1, <16 x i8> %op2) { 1452; CHECK-LABEL: xor_v16i8: 1453; CHECK: // %bb.0: 1454; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 1455; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 1456; CHECK-NEXT: eor z0.d, z0.d, z1.d 1457; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 1458; CHECK-NEXT: ret 1459; 1460; NONEON-NOSVE-LABEL: xor_v16i8: 1461; NONEON-NOSVE: // %bb.0: 1462; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 1463; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 1464; NONEON-NOSVE-NEXT: ldrb w8, [sp, #31] 1465; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15] 1466; NONEON-NOSVE-NEXT: eor w8, w9, w8 1467; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14] 1468; NONEON-NOSVE-NEXT: strb w8, [sp, #47] 1469; NONEON-NOSVE-NEXT: ldrb w8, [sp, #30] 1470; NONEON-NOSVE-NEXT: eor w8, w9, w8 1471; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13] 1472; NONEON-NOSVE-NEXT: strb w8, [sp, #46] 1473; NONEON-NOSVE-NEXT: ldrb w8, [sp, #29] 1474; NONEON-NOSVE-NEXT: eor w8, w9, w8 1475; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12] 1476; NONEON-NOSVE-NEXT: strb w8, [sp, #45] 1477; NONEON-NOSVE-NEXT: ldrb w8, [sp, #28] 1478; NONEON-NOSVE-NEXT: eor w8, w9, w8 1479; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11] 1480; NONEON-NOSVE-NEXT: strb w8, [sp, #44] 1481; NONEON-NOSVE-NEXT: ldrb w8, [sp, #27] 1482; NONEON-NOSVE-NEXT: eor w8, w9, w8 1483; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10] 1484; NONEON-NOSVE-NEXT: strb w8, [sp, #43] 1485; NONEON-NOSVE-NEXT: ldrb w8, [sp, #26] 1486; NONEON-NOSVE-NEXT: eor w8, w9, w8 1487; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9] 1488; NONEON-NOSVE-NEXT: strb w8, [sp, #42] 1489; NONEON-NOSVE-NEXT: ldrb w8, [sp, #25] 1490; NONEON-NOSVE-NEXT: eor w8, w9, w8 1491; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8] 1492; NONEON-NOSVE-NEXT: strb w8, [sp, #41] 1493; NONEON-NOSVE-NEXT: ldrb w8, [sp, #24] 1494; NONEON-NOSVE-NEXT: eor w8, w9, w8 1495; NONEON-NOSVE-NEXT: ldrb w9, [sp, #7] 1496; NONEON-NOSVE-NEXT: strb w8, [sp, #40] 1497; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23] 1498; NONEON-NOSVE-NEXT: eor w8, w9, w8 1499; NONEON-NOSVE-NEXT: ldrb w9, [sp, #6] 1500; NONEON-NOSVE-NEXT: strb w8, [sp, #39] 1501; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22] 1502; NONEON-NOSVE-NEXT: eor w8, w9, w8 1503; NONEON-NOSVE-NEXT: ldrb w9, [sp, #5] 1504; NONEON-NOSVE-NEXT: strb w8, [sp, #38] 1505; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21] 1506; NONEON-NOSVE-NEXT: eor w8, w9, w8 1507; NONEON-NOSVE-NEXT: ldrb w9, [sp, #4] 1508; NONEON-NOSVE-NEXT: strb w8, [sp, #37] 1509; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20] 1510; NONEON-NOSVE-NEXT: eor w8, w9, w8 1511; NONEON-NOSVE-NEXT: ldrb w9, [sp, #3] 1512; NONEON-NOSVE-NEXT: strb w8, [sp, #36] 1513; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19] 1514; NONEON-NOSVE-NEXT: eor w8, w9, w8 1515; NONEON-NOSVE-NEXT: ldrb w9, [sp, #2] 1516; NONEON-NOSVE-NEXT: strb w8, [sp, #35] 1517; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18] 1518; NONEON-NOSVE-NEXT: eor w8, w9, w8 1519; NONEON-NOSVE-NEXT: ldrb w9, [sp, #1] 1520; NONEON-NOSVE-NEXT: strb w8, [sp, #34] 1521; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17] 1522; NONEON-NOSVE-NEXT: eor w8, w9, w8 1523; NONEON-NOSVE-NEXT: ldrb w9, [sp] 1524; NONEON-NOSVE-NEXT: strb w8, [sp, #33] 1525; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16] 1526; NONEON-NOSVE-NEXT: eor w8, w9, w8 1527; NONEON-NOSVE-NEXT: strb w8, [sp, #32] 1528; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 1529; NONEON-NOSVE-NEXT: add sp, sp, #48 1530; NONEON-NOSVE-NEXT: ret 1531 %res = xor <16 x i8> %op1, %op2 1532 ret <16 x i8> %res 1533} 1534 1535define void @xor_v32i8(ptr %a, ptr %b) { 1536; CHECK-LABEL: xor_v32i8: 1537; CHECK: // %bb.0: 1538; CHECK-NEXT: ldp q0, q3, [x1] 1539; CHECK-NEXT: ldp q1, q2, [x0] 1540; CHECK-NEXT: eor z0.d, z1.d, z0.d 1541; CHECK-NEXT: eor z1.d, z2.d, z3.d 1542; CHECK-NEXT: stp q0, q1, [x0] 1543; CHECK-NEXT: ret 1544; 1545; NONEON-NOSVE-LABEL: xor_v32i8: 1546; NONEON-NOSVE: // %bb.0: 1547; NONEON-NOSVE-NEXT: sub sp, sp, #96 1548; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 1549; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 1550; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 1551; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 1552; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 1553; NONEON-NOSVE-NEXT: ldrb w8, [sp, #63] 1554; NONEON-NOSVE-NEXT: ldrb w9, [sp, #47] 1555; NONEON-NOSVE-NEXT: eor w8, w9, w8 1556; NONEON-NOSVE-NEXT: ldrb w9, [sp, #46] 1557; NONEON-NOSVE-NEXT: strb w8, [sp, #95] 1558; NONEON-NOSVE-NEXT: ldrb w8, [sp, #62] 1559; NONEON-NOSVE-NEXT: eor w8, w9, w8 1560; NONEON-NOSVE-NEXT: ldrb w9, [sp, #45] 1561; NONEON-NOSVE-NEXT: strb w8, [sp, #94] 1562; NONEON-NOSVE-NEXT: ldrb w8, [sp, #61] 1563; NONEON-NOSVE-NEXT: eor w8, w9, w8 1564; NONEON-NOSVE-NEXT: ldrb w9, [sp, #44] 1565; NONEON-NOSVE-NEXT: strb w8, [sp, #93] 1566; NONEON-NOSVE-NEXT: ldrb w8, [sp, #60] 1567; NONEON-NOSVE-NEXT: eor w8, w9, w8 1568; NONEON-NOSVE-NEXT: ldrb w9, [sp, #43] 1569; NONEON-NOSVE-NEXT: strb w8, [sp, #92] 1570; NONEON-NOSVE-NEXT: ldrb w8, [sp, #59] 1571; NONEON-NOSVE-NEXT: eor w8, w9, w8 1572; NONEON-NOSVE-NEXT: ldrb w9, [sp, #42] 1573; NONEON-NOSVE-NEXT: strb w8, [sp, #91] 1574; NONEON-NOSVE-NEXT: ldrb w8, [sp, #58] 1575; NONEON-NOSVE-NEXT: eor w8, w9, w8 1576; NONEON-NOSVE-NEXT: ldrb w9, [sp, #41] 1577; NONEON-NOSVE-NEXT: strb w8, [sp, #90] 1578; NONEON-NOSVE-NEXT: ldrb w8, [sp, #57] 1579; NONEON-NOSVE-NEXT: eor w8, w9, w8 1580; NONEON-NOSVE-NEXT: ldrb w9, [sp, #40] 1581; NONEON-NOSVE-NEXT: strb w8, [sp, #89] 1582; NONEON-NOSVE-NEXT: ldrb w8, [sp, #56] 1583; NONEON-NOSVE-NEXT: eor w8, w9, w8 1584; NONEON-NOSVE-NEXT: ldrb w9, [sp, #39] 1585; NONEON-NOSVE-NEXT: strb w8, [sp, #88] 1586; NONEON-NOSVE-NEXT: ldrb w8, [sp, #55] 1587; NONEON-NOSVE-NEXT: eor w8, w9, w8 1588; NONEON-NOSVE-NEXT: ldrb w9, [sp, #38] 1589; NONEON-NOSVE-NEXT: strb w8, [sp, #87] 1590; NONEON-NOSVE-NEXT: ldrb w8, [sp, #54] 1591; NONEON-NOSVE-NEXT: eor w8, w9, w8 1592; NONEON-NOSVE-NEXT: ldrb w9, [sp, #37] 1593; NONEON-NOSVE-NEXT: strb w8, [sp, #86] 1594; NONEON-NOSVE-NEXT: ldrb w8, [sp, #53] 1595; NONEON-NOSVE-NEXT: eor w8, w9, w8 1596; NONEON-NOSVE-NEXT: ldrb w9, [sp, #36] 1597; NONEON-NOSVE-NEXT: strb w8, [sp, #85] 1598; NONEON-NOSVE-NEXT: ldrb w8, [sp, #52] 1599; NONEON-NOSVE-NEXT: eor w8, w9, w8 1600; NONEON-NOSVE-NEXT: ldrb w9, [sp, #35] 1601; NONEON-NOSVE-NEXT: strb w8, [sp, #84] 1602; NONEON-NOSVE-NEXT: ldrb w8, [sp, #51] 1603; NONEON-NOSVE-NEXT: eor w8, w9, w8 1604; NONEON-NOSVE-NEXT: ldrb w9, [sp, #34] 1605; NONEON-NOSVE-NEXT: strb w8, [sp, #83] 1606; NONEON-NOSVE-NEXT: ldrb w8, [sp, #50] 1607; NONEON-NOSVE-NEXT: eor w8, w9, w8 1608; NONEON-NOSVE-NEXT: ldrb w9, [sp, #33] 1609; NONEON-NOSVE-NEXT: strb w8, [sp, #82] 1610; NONEON-NOSVE-NEXT: ldrb w8, [sp, #49] 1611; NONEON-NOSVE-NEXT: eor w8, w9, w8 1612; NONEON-NOSVE-NEXT: ldrb w9, [sp, #32] 1613; NONEON-NOSVE-NEXT: strb w8, [sp, #81] 1614; NONEON-NOSVE-NEXT: ldrb w8, [sp, #48] 1615; NONEON-NOSVE-NEXT: eor w8, w9, w8 1616; NONEON-NOSVE-NEXT: ldrb w9, [sp, #15] 1617; NONEON-NOSVE-NEXT: strb w8, [sp, #80] 1618; NONEON-NOSVE-NEXT: ldrb w8, [sp, #31] 1619; NONEON-NOSVE-NEXT: eor w8, w9, w8 1620; NONEON-NOSVE-NEXT: ldrb w9, [sp, #14] 1621; NONEON-NOSVE-NEXT: strb w8, [sp, #79] 1622; NONEON-NOSVE-NEXT: ldrb w8, [sp, #30] 1623; NONEON-NOSVE-NEXT: eor w8, w9, w8 1624; NONEON-NOSVE-NEXT: ldrb w9, [sp, #13] 1625; NONEON-NOSVE-NEXT: strb w8, [sp, #78] 1626; NONEON-NOSVE-NEXT: ldrb w8, [sp, #29] 1627; NONEON-NOSVE-NEXT: eor w8, w9, w8 1628; NONEON-NOSVE-NEXT: ldrb w9, [sp, #12] 1629; NONEON-NOSVE-NEXT: strb w8, [sp, #77] 1630; NONEON-NOSVE-NEXT: ldrb w8, [sp, #28] 1631; NONEON-NOSVE-NEXT: eor w8, w9, w8 1632; NONEON-NOSVE-NEXT: ldrb w9, [sp, #11] 1633; NONEON-NOSVE-NEXT: strb w8, [sp, #76] 1634; NONEON-NOSVE-NEXT: ldrb w8, [sp, #27] 1635; NONEON-NOSVE-NEXT: eor w8, w9, w8 1636; NONEON-NOSVE-NEXT: ldrb w9, [sp, #10] 1637; NONEON-NOSVE-NEXT: strb w8, [sp, #75] 1638; NONEON-NOSVE-NEXT: ldrb w8, [sp, #26] 1639; NONEON-NOSVE-NEXT: eor w8, w9, w8 1640; NONEON-NOSVE-NEXT: ldrb w9, [sp, #9] 1641; NONEON-NOSVE-NEXT: strb w8, [sp, #74] 1642; NONEON-NOSVE-NEXT: ldrb w8, [sp, #25] 1643; NONEON-NOSVE-NEXT: eor w8, w9, w8 1644; NONEON-NOSVE-NEXT: ldrb w9, [sp, #8] 1645; NONEON-NOSVE-NEXT: strb w8, [sp, #73] 1646; NONEON-NOSVE-NEXT: ldrb w8, [sp, #24] 1647; NONEON-NOSVE-NEXT: eor w8, w9, w8 1648; NONEON-NOSVE-NEXT: ldrb w9, [sp, #7] 1649; NONEON-NOSVE-NEXT: strb w8, [sp, #72] 1650; NONEON-NOSVE-NEXT: ldrb w8, [sp, #23] 1651; NONEON-NOSVE-NEXT: eor w8, w9, w8 1652; NONEON-NOSVE-NEXT: ldrb w9, [sp, #6] 1653; NONEON-NOSVE-NEXT: strb w8, [sp, #71] 1654; NONEON-NOSVE-NEXT: ldrb w8, [sp, #22] 1655; NONEON-NOSVE-NEXT: eor w8, w9, w8 1656; NONEON-NOSVE-NEXT: ldrb w9, [sp, #5] 1657; NONEON-NOSVE-NEXT: strb w8, [sp, #70] 1658; NONEON-NOSVE-NEXT: ldrb w8, [sp, #21] 1659; NONEON-NOSVE-NEXT: eor w8, w9, w8 1660; NONEON-NOSVE-NEXT: ldrb w9, [sp, #4] 1661; NONEON-NOSVE-NEXT: strb w8, [sp, #69] 1662; NONEON-NOSVE-NEXT: ldrb w8, [sp, #20] 1663; NONEON-NOSVE-NEXT: eor w8, w9, w8 1664; NONEON-NOSVE-NEXT: ldrb w9, [sp, #3] 1665; NONEON-NOSVE-NEXT: strb w8, [sp, #68] 1666; NONEON-NOSVE-NEXT: ldrb w8, [sp, #19] 1667; NONEON-NOSVE-NEXT: eor w8, w9, w8 1668; NONEON-NOSVE-NEXT: ldrb w9, [sp, #2] 1669; NONEON-NOSVE-NEXT: strb w8, [sp, #67] 1670; NONEON-NOSVE-NEXT: ldrb w8, [sp, #18] 1671; NONEON-NOSVE-NEXT: eor w8, w9, w8 1672; NONEON-NOSVE-NEXT: ldrb w9, [sp, #1] 1673; NONEON-NOSVE-NEXT: strb w8, [sp, #66] 1674; NONEON-NOSVE-NEXT: ldrb w8, [sp, #17] 1675; NONEON-NOSVE-NEXT: eor w8, w9, w8 1676; NONEON-NOSVE-NEXT: ldrb w9, [sp] 1677; NONEON-NOSVE-NEXT: strb w8, [sp, #65] 1678; NONEON-NOSVE-NEXT: ldrb w8, [sp, #16] 1679; NONEON-NOSVE-NEXT: eor w8, w9, w8 1680; NONEON-NOSVE-NEXT: strb w8, [sp, #64] 1681; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 1682; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 1683; NONEON-NOSVE-NEXT: add sp, sp, #96 1684; NONEON-NOSVE-NEXT: ret 1685 %op1 = load <32 x i8>, ptr %a 1686 %op2 = load <32 x i8>, ptr %b 1687 %res = xor <32 x i8> %op1, %op2 1688 store <32 x i8> %res, ptr %a 1689 ret void 1690} 1691 1692define <4 x i16> @xor_v4i16(<4 x i16> %op1, <4 x i16> %op2) { 1693; CHECK-LABEL: xor_v4i16: 1694; CHECK: // %bb.0: 1695; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1696; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 1697; CHECK-NEXT: eor z0.d, z0.d, z1.d 1698; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 1699; CHECK-NEXT: ret 1700; 1701; NONEON-NOSVE-LABEL: xor_v4i16: 1702; NONEON-NOSVE: // %bb.0: 1703; NONEON-NOSVE-NEXT: sub sp, sp, #32 1704; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 1705; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 1706; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22] 1707; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14] 1708; NONEON-NOSVE-NEXT: eor w8, w9, w8 1709; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12] 1710; NONEON-NOSVE-NEXT: strh w8, [sp, #30] 1711; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20] 1712; NONEON-NOSVE-NEXT: eor w8, w9, w8 1713; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10] 1714; NONEON-NOSVE-NEXT: strh w8, [sp, #28] 1715; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18] 1716; NONEON-NOSVE-NEXT: eor w8, w9, w8 1717; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8] 1718; NONEON-NOSVE-NEXT: strh w8, [sp, #26] 1719; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16] 1720; NONEON-NOSVE-NEXT: eor w8, w9, w8 1721; NONEON-NOSVE-NEXT: strh w8, [sp, #24] 1722; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 1723; NONEON-NOSVE-NEXT: add sp, sp, #32 1724; NONEON-NOSVE-NEXT: ret 1725 %res = xor <4 x i16> %op1, %op2 1726 ret <4 x i16> %res 1727} 1728 1729define <8 x i16> @xor_v8i16(<8 x i16> %op1, <8 x i16> %op2) { 1730; CHECK-LABEL: xor_v8i16: 1731; CHECK: // %bb.0: 1732; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 1733; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 1734; CHECK-NEXT: eor z0.d, z0.d, z1.d 1735; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 1736; CHECK-NEXT: ret 1737; 1738; NONEON-NOSVE-LABEL: xor_v8i16: 1739; NONEON-NOSVE: // %bb.0: 1740; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 1741; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 1742; NONEON-NOSVE-NEXT: ldrh w8, [sp, #30] 1743; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14] 1744; NONEON-NOSVE-NEXT: eor w8, w9, w8 1745; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12] 1746; NONEON-NOSVE-NEXT: strh w8, [sp, #46] 1747; NONEON-NOSVE-NEXT: ldrh w8, [sp, #28] 1748; NONEON-NOSVE-NEXT: eor w8, w9, w8 1749; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10] 1750; NONEON-NOSVE-NEXT: strh w8, [sp, #44] 1751; NONEON-NOSVE-NEXT: ldrh w8, [sp, #26] 1752; NONEON-NOSVE-NEXT: eor w8, w9, w8 1753; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8] 1754; NONEON-NOSVE-NEXT: strh w8, [sp, #42] 1755; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24] 1756; NONEON-NOSVE-NEXT: eor w8, w9, w8 1757; NONEON-NOSVE-NEXT: ldrh w9, [sp, #6] 1758; NONEON-NOSVE-NEXT: strh w8, [sp, #40] 1759; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22] 1760; NONEON-NOSVE-NEXT: eor w8, w9, w8 1761; NONEON-NOSVE-NEXT: ldrh w9, [sp, #4] 1762; NONEON-NOSVE-NEXT: strh w8, [sp, #38] 1763; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20] 1764; NONEON-NOSVE-NEXT: eor w8, w9, w8 1765; NONEON-NOSVE-NEXT: ldrh w9, [sp, #2] 1766; NONEON-NOSVE-NEXT: strh w8, [sp, #36] 1767; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18] 1768; NONEON-NOSVE-NEXT: eor w8, w9, w8 1769; NONEON-NOSVE-NEXT: ldrh w9, [sp] 1770; NONEON-NOSVE-NEXT: strh w8, [sp, #34] 1771; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16] 1772; NONEON-NOSVE-NEXT: eor w8, w9, w8 1773; NONEON-NOSVE-NEXT: strh w8, [sp, #32] 1774; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 1775; NONEON-NOSVE-NEXT: add sp, sp, #48 1776; NONEON-NOSVE-NEXT: ret 1777 %res = xor <8 x i16> %op1, %op2 1778 ret <8 x i16> %res 1779} 1780 1781define void @xor_v16i16(ptr %a, ptr %b) { 1782; CHECK-LABEL: xor_v16i16: 1783; CHECK: // %bb.0: 1784; CHECK-NEXT: ldp q0, q3, [x1] 1785; CHECK-NEXT: ldp q1, q2, [x0] 1786; CHECK-NEXT: eor z0.d, z1.d, z0.d 1787; CHECK-NEXT: eor z1.d, z2.d, z3.d 1788; CHECK-NEXT: stp q0, q1, [x0] 1789; CHECK-NEXT: ret 1790; 1791; NONEON-NOSVE-LABEL: xor_v16i16: 1792; NONEON-NOSVE: // %bb.0: 1793; NONEON-NOSVE-NEXT: sub sp, sp, #96 1794; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 1795; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 1796; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 1797; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 1798; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 1799; NONEON-NOSVE-NEXT: ldrh w8, [sp, #62] 1800; NONEON-NOSVE-NEXT: ldrh w9, [sp, #46] 1801; NONEON-NOSVE-NEXT: eor w8, w9, w8 1802; NONEON-NOSVE-NEXT: ldrh w9, [sp, #44] 1803; NONEON-NOSVE-NEXT: strh w8, [sp, #94] 1804; NONEON-NOSVE-NEXT: ldrh w8, [sp, #60] 1805; NONEON-NOSVE-NEXT: eor w8, w9, w8 1806; NONEON-NOSVE-NEXT: ldrh w9, [sp, #42] 1807; NONEON-NOSVE-NEXT: strh w8, [sp, #92] 1808; NONEON-NOSVE-NEXT: ldrh w8, [sp, #58] 1809; NONEON-NOSVE-NEXT: eor w8, w9, w8 1810; NONEON-NOSVE-NEXT: ldrh w9, [sp, #40] 1811; NONEON-NOSVE-NEXT: strh w8, [sp, #90] 1812; NONEON-NOSVE-NEXT: ldrh w8, [sp, #56] 1813; NONEON-NOSVE-NEXT: eor w8, w9, w8 1814; NONEON-NOSVE-NEXT: ldrh w9, [sp, #38] 1815; NONEON-NOSVE-NEXT: strh w8, [sp, #88] 1816; NONEON-NOSVE-NEXT: ldrh w8, [sp, #54] 1817; NONEON-NOSVE-NEXT: eor w8, w9, w8 1818; NONEON-NOSVE-NEXT: ldrh w9, [sp, #36] 1819; NONEON-NOSVE-NEXT: strh w8, [sp, #86] 1820; NONEON-NOSVE-NEXT: ldrh w8, [sp, #52] 1821; NONEON-NOSVE-NEXT: eor w8, w9, w8 1822; NONEON-NOSVE-NEXT: ldrh w9, [sp, #34] 1823; NONEON-NOSVE-NEXT: strh w8, [sp, #84] 1824; NONEON-NOSVE-NEXT: ldrh w8, [sp, #50] 1825; NONEON-NOSVE-NEXT: eor w8, w9, w8 1826; NONEON-NOSVE-NEXT: ldrh w9, [sp, #32] 1827; NONEON-NOSVE-NEXT: strh w8, [sp, #82] 1828; NONEON-NOSVE-NEXT: ldrh w8, [sp, #48] 1829; NONEON-NOSVE-NEXT: eor w8, w9, w8 1830; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14] 1831; NONEON-NOSVE-NEXT: strh w8, [sp, #80] 1832; NONEON-NOSVE-NEXT: ldrh w8, [sp, #30] 1833; NONEON-NOSVE-NEXT: eor w8, w9, w8 1834; NONEON-NOSVE-NEXT: ldrh w9, [sp, #12] 1835; NONEON-NOSVE-NEXT: strh w8, [sp, #78] 1836; NONEON-NOSVE-NEXT: ldrh w8, [sp, #28] 1837; NONEON-NOSVE-NEXT: eor w8, w9, w8 1838; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10] 1839; NONEON-NOSVE-NEXT: strh w8, [sp, #76] 1840; NONEON-NOSVE-NEXT: ldrh w8, [sp, #26] 1841; NONEON-NOSVE-NEXT: eor w8, w9, w8 1842; NONEON-NOSVE-NEXT: ldrh w9, [sp, #8] 1843; NONEON-NOSVE-NEXT: strh w8, [sp, #74] 1844; NONEON-NOSVE-NEXT: ldrh w8, [sp, #24] 1845; NONEON-NOSVE-NEXT: eor w8, w9, w8 1846; NONEON-NOSVE-NEXT: ldrh w9, [sp, #6] 1847; NONEON-NOSVE-NEXT: strh w8, [sp, #72] 1848; NONEON-NOSVE-NEXT: ldrh w8, [sp, #22] 1849; NONEON-NOSVE-NEXT: eor w8, w9, w8 1850; NONEON-NOSVE-NEXT: ldrh w9, [sp, #4] 1851; NONEON-NOSVE-NEXT: strh w8, [sp, #70] 1852; NONEON-NOSVE-NEXT: ldrh w8, [sp, #20] 1853; NONEON-NOSVE-NEXT: eor w8, w9, w8 1854; NONEON-NOSVE-NEXT: ldrh w9, [sp, #2] 1855; NONEON-NOSVE-NEXT: strh w8, [sp, #68] 1856; NONEON-NOSVE-NEXT: ldrh w8, [sp, #18] 1857; NONEON-NOSVE-NEXT: eor w8, w9, w8 1858; NONEON-NOSVE-NEXT: ldrh w9, [sp] 1859; NONEON-NOSVE-NEXT: strh w8, [sp, #66] 1860; NONEON-NOSVE-NEXT: ldrh w8, [sp, #16] 1861; NONEON-NOSVE-NEXT: eor w8, w9, w8 1862; NONEON-NOSVE-NEXT: strh w8, [sp, #64] 1863; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 1864; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 1865; NONEON-NOSVE-NEXT: add sp, sp, #96 1866; NONEON-NOSVE-NEXT: ret 1867 %op1 = load <16 x i16>, ptr %a 1868 %op2 = load <16 x i16>, ptr %b 1869 %res = xor <16 x i16> %op1, %op2 1870 store <16 x i16> %res, ptr %a 1871 ret void 1872} 1873 1874define <2 x i32> @xor_v2i32(<2 x i32> %op1, <2 x i32> %op2) { 1875; CHECK-LABEL: xor_v2i32: 1876; CHECK: // %bb.0: 1877; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1878; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 1879; CHECK-NEXT: eor z0.d, z0.d, z1.d 1880; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 1881; CHECK-NEXT: ret 1882; 1883; NONEON-NOSVE-LABEL: xor_v2i32: 1884; NONEON-NOSVE: // %bb.0: 1885; NONEON-NOSVE-NEXT: sub sp, sp, #32 1886; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32 1887; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #8] 1888; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8] 1889; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 1890; NONEON-NOSVE-NEXT: eor w8, w10, w8 1891; NONEON-NOSVE-NEXT: str w8, [sp, #28] 1892; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 1893; NONEON-NOSVE-NEXT: eor w8, w9, w8 1894; NONEON-NOSVE-NEXT: str w8, [sp, #24] 1895; NONEON-NOSVE-NEXT: ldr d0, [sp, #24] 1896; NONEON-NOSVE-NEXT: add sp, sp, #32 1897; NONEON-NOSVE-NEXT: ret 1898 %res = xor <2 x i32> %op1, %op2 1899 ret <2 x i32> %res 1900} 1901 1902define <4 x i32> @xor_v4i32(<4 x i32> %op1, <4 x i32> %op2) { 1903; CHECK-LABEL: xor_v4i32: 1904; CHECK: // %bb.0: 1905; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 1906; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 1907; CHECK-NEXT: eor z0.d, z0.d, z1.d 1908; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 1909; CHECK-NEXT: ret 1910; 1911; NONEON-NOSVE-LABEL: xor_v4i32: 1912; NONEON-NOSVE: // %bb.0: 1913; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 1914; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 1915; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8] 1916; NONEON-NOSVE-NEXT: ldr w8, [sp, #28] 1917; NONEON-NOSVE-NEXT: eor w8, w10, w8 1918; NONEON-NOSVE-NEXT: str w8, [sp, #44] 1919; NONEON-NOSVE-NEXT: ldr w8, [sp, #24] 1920; NONEON-NOSVE-NEXT: eor w8, w9, w8 1921; NONEON-NOSVE-NEXT: ldp w9, w10, [sp] 1922; NONEON-NOSVE-NEXT: str w8, [sp, #40] 1923; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 1924; NONEON-NOSVE-NEXT: eor w8, w10, w8 1925; NONEON-NOSVE-NEXT: str w8, [sp, #36] 1926; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 1927; NONEON-NOSVE-NEXT: eor w8, w9, w8 1928; NONEON-NOSVE-NEXT: str w8, [sp, #32] 1929; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 1930; NONEON-NOSVE-NEXT: add sp, sp, #48 1931; NONEON-NOSVE-NEXT: ret 1932 %res = xor <4 x i32> %op1, %op2 1933 ret <4 x i32> %res 1934} 1935 1936define void @xor_v8i32(ptr %a, ptr %b) { 1937; CHECK-LABEL: xor_v8i32: 1938; CHECK: // %bb.0: 1939; CHECK-NEXT: ldp q0, q3, [x1] 1940; CHECK-NEXT: ldp q1, q2, [x0] 1941; CHECK-NEXT: eor z0.d, z1.d, z0.d 1942; CHECK-NEXT: eor z1.d, z2.d, z3.d 1943; CHECK-NEXT: stp q0, q1, [x0] 1944; CHECK-NEXT: ret 1945; 1946; NONEON-NOSVE-LABEL: xor_v8i32: 1947; NONEON-NOSVE: // %bb.0: 1948; NONEON-NOSVE-NEXT: sub sp, sp, #96 1949; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 1950; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 1951; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 1952; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 1953; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 1954; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #40] 1955; NONEON-NOSVE-NEXT: ldr w8, [sp, #60] 1956; NONEON-NOSVE-NEXT: eor w8, w10, w8 1957; NONEON-NOSVE-NEXT: str w8, [sp, #92] 1958; NONEON-NOSVE-NEXT: ldr w8, [sp, #56] 1959; NONEON-NOSVE-NEXT: eor w8, w9, w8 1960; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #32] 1961; NONEON-NOSVE-NEXT: str w8, [sp, #88] 1962; NONEON-NOSVE-NEXT: ldr w8, [sp, #52] 1963; NONEON-NOSVE-NEXT: eor w8, w10, w8 1964; NONEON-NOSVE-NEXT: str w8, [sp, #84] 1965; NONEON-NOSVE-NEXT: ldr w8, [sp, #48] 1966; NONEON-NOSVE-NEXT: eor w8, w9, w8 1967; NONEON-NOSVE-NEXT: ldp w9, w10, [sp, #8] 1968; NONEON-NOSVE-NEXT: str w8, [sp, #80] 1969; NONEON-NOSVE-NEXT: ldr w8, [sp, #28] 1970; NONEON-NOSVE-NEXT: eor w8, w10, w8 1971; NONEON-NOSVE-NEXT: str w8, [sp, #76] 1972; NONEON-NOSVE-NEXT: ldr w8, [sp, #24] 1973; NONEON-NOSVE-NEXT: eor w8, w9, w8 1974; NONEON-NOSVE-NEXT: ldp w9, w10, [sp] 1975; NONEON-NOSVE-NEXT: str w8, [sp, #72] 1976; NONEON-NOSVE-NEXT: ldr w8, [sp, #20] 1977; NONEON-NOSVE-NEXT: eor w8, w10, w8 1978; NONEON-NOSVE-NEXT: str w8, [sp, #68] 1979; NONEON-NOSVE-NEXT: ldr w8, [sp, #16] 1980; NONEON-NOSVE-NEXT: eor w8, w9, w8 1981; NONEON-NOSVE-NEXT: str w8, [sp, #64] 1982; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 1983; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 1984; NONEON-NOSVE-NEXT: add sp, sp, #96 1985; NONEON-NOSVE-NEXT: ret 1986 %op1 = load <8 x i32>, ptr %a 1987 %op2 = load <8 x i32>, ptr %b 1988 %res = xor <8 x i32> %op1, %op2 1989 store <8 x i32> %res, ptr %a 1990 ret void 1991} 1992 1993define <1 x i64> @xor_v1i64(<1 x i64> %op1, <1 x i64> %op2) { 1994; CHECK-LABEL: xor_v1i64: 1995; CHECK: // %bb.0: 1996; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0 1997; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1 1998; CHECK-NEXT: eor z0.d, z0.d, z1.d 1999; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0 2000; CHECK-NEXT: ret 2001; 2002; NONEON-NOSVE-LABEL: xor_v1i64: 2003; NONEON-NOSVE: // %bb.0: 2004; NONEON-NOSVE-NEXT: sub sp, sp, #16 2005; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16 2006; NONEON-NOSVE-NEXT: fmov x8, d1 2007; NONEON-NOSVE-NEXT: fmov x9, d0 2008; NONEON-NOSVE-NEXT: eor x8, x9, x8 2009; NONEON-NOSVE-NEXT: str x8, [sp, #8] 2010; NONEON-NOSVE-NEXT: ldr d0, [sp, #8] 2011; NONEON-NOSVE-NEXT: add sp, sp, #16 2012; NONEON-NOSVE-NEXT: ret 2013 %res = xor <1 x i64> %op1, %op2 2014 ret <1 x i64> %res 2015} 2016 2017define <2 x i64> @xor_v2i64(<2 x i64> %op1, <2 x i64> %op2) { 2018; CHECK-LABEL: xor_v2i64: 2019; CHECK: // %bb.0: 2020; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0 2021; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1 2022; CHECK-NEXT: eor z0.d, z0.d, z1.d 2023; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0 2024; CHECK-NEXT: ret 2025; 2026; NONEON-NOSVE-LABEL: xor_v2i64: 2027; NONEON-NOSVE: // %bb.0: 2028; NONEON-NOSVE-NEXT: stp q0, q1, [sp, #-48]! 2029; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 48 2030; NONEON-NOSVE-NEXT: ldp x9, x10, [sp] 2031; NONEON-NOSVE-NEXT: ldr x8, [sp, #24] 2032; NONEON-NOSVE-NEXT: eor x8, x10, x8 2033; NONEON-NOSVE-NEXT: str x8, [sp, #40] 2034; NONEON-NOSVE-NEXT: ldr x8, [sp, #16] 2035; NONEON-NOSVE-NEXT: eor x8, x9, x8 2036; NONEON-NOSVE-NEXT: str x8, [sp, #32] 2037; NONEON-NOSVE-NEXT: ldr q0, [sp, #32] 2038; NONEON-NOSVE-NEXT: add sp, sp, #48 2039; NONEON-NOSVE-NEXT: ret 2040 %res = xor <2 x i64> %op1, %op2 2041 ret <2 x i64> %res 2042} 2043 2044define void @xor_v4i64(ptr %a, ptr %b) { 2045; CHECK-LABEL: xor_v4i64: 2046; CHECK: // %bb.0: 2047; CHECK-NEXT: ldp q0, q3, [x1] 2048; CHECK-NEXT: ldp q1, q2, [x0] 2049; CHECK-NEXT: eor z0.d, z1.d, z0.d 2050; CHECK-NEXT: eor z1.d, z2.d, z3.d 2051; CHECK-NEXT: stp q0, q1, [x0] 2052; CHECK-NEXT: ret 2053; 2054; NONEON-NOSVE-LABEL: xor_v4i64: 2055; NONEON-NOSVE: // %bb.0: 2056; NONEON-NOSVE-NEXT: sub sp, sp, #96 2057; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96 2058; NONEON-NOSVE-NEXT: ldp q3, q0, [x1] 2059; NONEON-NOSVE-NEXT: ldp q2, q1, [x0] 2060; NONEON-NOSVE-NEXT: stp q2, q3, [sp] 2061; NONEON-NOSVE-NEXT: stp q1, q0, [sp, #32] 2062; NONEON-NOSVE-NEXT: ldp x9, x10, [sp, #32] 2063; NONEON-NOSVE-NEXT: ldr x8, [sp, #56] 2064; NONEON-NOSVE-NEXT: eor x8, x10, x8 2065; NONEON-NOSVE-NEXT: str x8, [sp, #88] 2066; NONEON-NOSVE-NEXT: ldr x8, [sp, #48] 2067; NONEON-NOSVE-NEXT: eor x8, x9, x8 2068; NONEON-NOSVE-NEXT: ldp x9, x10, [sp] 2069; NONEON-NOSVE-NEXT: str x8, [sp, #80] 2070; NONEON-NOSVE-NEXT: ldr x8, [sp, #24] 2071; NONEON-NOSVE-NEXT: eor x8, x10, x8 2072; NONEON-NOSVE-NEXT: str x8, [sp, #72] 2073; NONEON-NOSVE-NEXT: ldr x8, [sp, #16] 2074; NONEON-NOSVE-NEXT: eor x8, x9, x8 2075; NONEON-NOSVE-NEXT: str x8, [sp, #64] 2076; NONEON-NOSVE-NEXT: ldp q0, q1, [sp, #64] 2077; NONEON-NOSVE-NEXT: stp q0, q1, [x0] 2078; NONEON-NOSVE-NEXT: add sp, sp, #96 2079; NONEON-NOSVE-NEXT: ret 2080 %op1 = load <4 x i64>, ptr %a 2081 %op2 = load <4 x i64>, ptr %b 2082 %res = xor <4 x i64> %op1, %op2 2083 store <4 x i64> %res, ptr %a 2084 ret void 2085} 2086