1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=x86_64-linux-gnu -mcpu=skx -global-isel -verify-machineinstrs < %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=SKX 3; RUN: llc -mtriple=x86_64-linux-gnu -mcpu=core-avx2 -global-isel -verify-machineinstrs < %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=AVX2 4; RUN: llc -mtriple=x86_64-linux-gnu -mcpu=corei7-avx -global-isel -verify-machineinstrs < %s -o - | FileCheck %s --check-prefix=ALL --check-prefix=AVX1 5 6 7define <16 x i8> @test_add_v16i8(<16 x i8> %arg1, <16 x i8> %arg2) { 8; ALL-LABEL: test_add_v16i8: 9; ALL: # %bb.0: 10; ALL-NEXT: vpaddb %xmm1, %xmm0, %xmm0 11; ALL-NEXT: retq 12 %ret = add <16 x i8> %arg1, %arg2 13 ret <16 x i8> %ret 14} 15 16define <8 x i16> @test_add_v8i16(<8 x i16> %arg1, <8 x i16> %arg2) { 17; ALL-LABEL: test_add_v8i16: 18; ALL: # %bb.0: 19; ALL-NEXT: vpaddw %xmm1, %xmm0, %xmm0 20; ALL-NEXT: retq 21 %ret = add <8 x i16> %arg1, %arg2 22 ret <8 x i16> %ret 23} 24 25define <4 x i32> @test_add_v4i32(<4 x i32> %arg1, <4 x i32> %arg2) { 26; ALL-LABEL: test_add_v4i32: 27; ALL: # %bb.0: 28; ALL-NEXT: vpaddd %xmm1, %xmm0, %xmm0 29; ALL-NEXT: retq 30 %ret = add <4 x i32> %arg1, %arg2 31 ret <4 x i32> %ret 32} 33 34define <2 x i64> @test_add_v2i64(<2 x i64> %arg1, <2 x i64> %arg2) { 35; ALL-LABEL: test_add_v2i64: 36; ALL: # %bb.0: 37; ALL-NEXT: vpaddq %xmm1, %xmm0, %xmm0 38; ALL-NEXT: retq 39 %ret = add <2 x i64> %arg1, %arg2 40 ret <2 x i64> %ret 41} 42 43define <32 x i8> @test_add_v32i8(<32 x i8> %arg1, <32 x i8> %arg2) { 44; SKX-LABEL: test_add_v32i8: 45; SKX: # %bb.0: 46; SKX-NEXT: vpaddb %ymm1, %ymm0, %ymm0 47; SKX-NEXT: retq 48; 49; AVX2-LABEL: test_add_v32i8: 50; AVX2: # %bb.0: 51; AVX2-NEXT: vpaddb %ymm1, %ymm0, %ymm0 52; AVX2-NEXT: retq 53; 54; AVX1-LABEL: test_add_v32i8: 55; AVX1: # %bb.0: 56; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 57; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 58; AVX1-NEXT: vpaddb %xmm3, %xmm2, %xmm2 59; AVX1-NEXT: vpaddb %xmm1, %xmm0, %xmm0 60; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 61; AVX1-NEXT: retq 62 %ret = add <32 x i8> %arg1, %arg2 63 ret <32 x i8> %ret 64} 65 66define <16 x i16> @test_add_v16i16(<16 x i16> %arg1, <16 x i16> %arg2) { 67; SKX-LABEL: test_add_v16i16: 68; SKX: # %bb.0: 69; SKX-NEXT: vpaddw %ymm1, %ymm0, %ymm0 70; SKX-NEXT: retq 71; 72; AVX2-LABEL: test_add_v16i16: 73; AVX2: # %bb.0: 74; AVX2-NEXT: vpaddw %ymm1, %ymm0, %ymm0 75; AVX2-NEXT: retq 76; 77; AVX1-LABEL: test_add_v16i16: 78; AVX1: # %bb.0: 79; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 80; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 81; AVX1-NEXT: vpaddw %xmm3, %xmm2, %xmm2 82; AVX1-NEXT: vpaddw %xmm1, %xmm0, %xmm0 83; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 84; AVX1-NEXT: retq 85 %ret = add <16 x i16> %arg1, %arg2 86 ret <16 x i16> %ret 87} 88 89define <8 x i32> @test_add_v8i32(<8 x i32> %arg1, <8 x i32> %arg2) { 90; SKX-LABEL: test_add_v8i32: 91; SKX: # %bb.0: 92; SKX-NEXT: vpaddd %ymm1, %ymm0, %ymm0 93; SKX-NEXT: retq 94; 95; AVX2-LABEL: test_add_v8i32: 96; AVX2: # %bb.0: 97; AVX2-NEXT: vpaddd %ymm1, %ymm0, %ymm0 98; AVX2-NEXT: retq 99; 100; AVX1-LABEL: test_add_v8i32: 101; AVX1: # %bb.0: 102; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 103; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 104; AVX1-NEXT: vpaddd %xmm3, %xmm2, %xmm2 105; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm0 106; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 107; AVX1-NEXT: retq 108 %ret = add <8 x i32> %arg1, %arg2 109 ret <8 x i32> %ret 110} 111 112define <4 x i64> @test_add_v4i64(<4 x i64> %arg1, <4 x i64> %arg2) { 113; SKX-LABEL: test_add_v4i64: 114; SKX: # %bb.0: 115; SKX-NEXT: vpaddq %ymm1, %ymm0, %ymm0 116; SKX-NEXT: retq 117; 118; AVX2-LABEL: test_add_v4i64: 119; AVX2: # %bb.0: 120; AVX2-NEXT: vpaddq %ymm1, %ymm0, %ymm0 121; AVX2-NEXT: retq 122; 123; AVX1-LABEL: test_add_v4i64: 124; AVX1: # %bb.0: 125; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 126; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 127; AVX1-NEXT: vpaddq %xmm3, %xmm2, %xmm2 128; AVX1-NEXT: vpaddq %xmm1, %xmm0, %xmm0 129; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0 130; AVX1-NEXT: retq 131 %ret = add <4 x i64> %arg1, %arg2 132 ret <4 x i64> %ret 133} 134 135define <64 x i8> @test_add_v64i8(<64 x i8> %arg1, <64 x i8> %arg2) { 136; SKX-LABEL: test_add_v64i8: 137; SKX: # %bb.0: 138; SKX-NEXT: vpaddb %zmm1, %zmm0, %zmm0 139; SKX-NEXT: retq 140; 141; AVX2-LABEL: test_add_v64i8: 142; AVX2: # %bb.0: 143; AVX2-NEXT: vpaddb %ymm2, %ymm0, %ymm0 144; AVX2-NEXT: vpaddb %ymm3, %ymm1, %ymm1 145; AVX2-NEXT: retq 146; 147; AVX1-LABEL: test_add_v64i8: 148; AVX1: # %bb.0: 149; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 150; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5 151; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm6 152; AVX1-NEXT: vpaddb %xmm6, %xmm4, %xmm4 153; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm6 154; AVX1-NEXT: vpaddb %xmm6, %xmm5, %xmm5 155; AVX1-NEXT: vpaddb %xmm2, %xmm0, %xmm0 156; AVX1-NEXT: vpaddb %xmm3, %xmm1, %xmm1 157; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0 158; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm1, %ymm1 159; AVX1-NEXT: retq 160 %ret = add <64 x i8> %arg1, %arg2 161 ret <64 x i8> %ret 162} 163 164define <32 x i16> @test_add_v32i16(<32 x i16> %arg1, <32 x i16> %arg2) { 165; SKX-LABEL: test_add_v32i16: 166; SKX: # %bb.0: 167; SKX-NEXT: vpaddw %zmm1, %zmm0, %zmm0 168; SKX-NEXT: retq 169; 170; AVX2-LABEL: test_add_v32i16: 171; AVX2: # %bb.0: 172; AVX2-NEXT: vpaddw %ymm2, %ymm0, %ymm0 173; AVX2-NEXT: vpaddw %ymm3, %ymm1, %ymm1 174; AVX2-NEXT: retq 175; 176; AVX1-LABEL: test_add_v32i16: 177; AVX1: # %bb.0: 178; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 179; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5 180; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm6 181; AVX1-NEXT: vpaddw %xmm6, %xmm4, %xmm4 182; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm6 183; AVX1-NEXT: vpaddw %xmm6, %xmm5, %xmm5 184; AVX1-NEXT: vpaddw %xmm2, %xmm0, %xmm0 185; AVX1-NEXT: vpaddw %xmm3, %xmm1, %xmm1 186; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0 187; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm1, %ymm1 188; AVX1-NEXT: retq 189 %ret = add <32 x i16> %arg1, %arg2 190 ret <32 x i16> %ret 191} 192 193define <16 x i32> @test_add_v16i32(<16 x i32> %arg1, <16 x i32> %arg2) { 194; SKX-LABEL: test_add_v16i32: 195; SKX: # %bb.0: 196; SKX-NEXT: vpaddd %zmm1, %zmm0, %zmm0 197; SKX-NEXT: retq 198; 199; AVX2-LABEL: test_add_v16i32: 200; AVX2: # %bb.0: 201; AVX2-NEXT: vpaddd %ymm2, %ymm0, %ymm0 202; AVX2-NEXT: vpaddd %ymm3, %ymm1, %ymm1 203; AVX2-NEXT: retq 204; 205; AVX1-LABEL: test_add_v16i32: 206; AVX1: # %bb.0: 207; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 208; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5 209; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm6 210; AVX1-NEXT: vpaddd %xmm6, %xmm4, %xmm4 211; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm6 212; AVX1-NEXT: vpaddd %xmm6, %xmm5, %xmm5 213; AVX1-NEXT: vpaddd %xmm2, %xmm0, %xmm0 214; AVX1-NEXT: vpaddd %xmm3, %xmm1, %xmm1 215; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0 216; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm1, %ymm1 217; AVX1-NEXT: retq 218 %ret = add <16 x i32> %arg1, %arg2 219 ret <16 x i32> %ret 220} 221 222define <8 x i64> @test_add_v8i64(<8 x i64> %arg1, <8 x i64> %arg2) { 223; SKX-LABEL: test_add_v8i64: 224; SKX: # %bb.0: 225; SKX-NEXT: vpaddq %zmm1, %zmm0, %zmm0 226; SKX-NEXT: retq 227; 228; AVX2-LABEL: test_add_v8i64: 229; AVX2: # %bb.0: 230; AVX2-NEXT: vpaddq %ymm2, %ymm0, %ymm0 231; AVX2-NEXT: vpaddq %ymm3, %ymm1, %ymm1 232; AVX2-NEXT: retq 233; 234; AVX1-LABEL: test_add_v8i64: 235; AVX1: # %bb.0: 236; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 237; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5 238; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm6 239; AVX1-NEXT: vpaddq %xmm6, %xmm4, %xmm4 240; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm6 241; AVX1-NEXT: vpaddq %xmm6, %xmm5, %xmm5 242; AVX1-NEXT: vpaddq %xmm2, %xmm0, %xmm0 243; AVX1-NEXT: vpaddq %xmm3, %xmm1, %xmm1 244; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0 245; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm1, %ymm1 246; AVX1-NEXT: retq 247 %ret = add <8 x i64> %arg1, %arg2 248 ret <8 x i64> %ret 249} 250 251