2239 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+ssse3 | FileCheck %s --check-prefixes=SSE3,SSE3-SLOW3; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+ssse3,fast-hops | FileCheck %s --check-prefixes=SSE3,SSE3-FAST4; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX-SLOW,AVX1-SLOW5; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx,fast-hops | FileCheck %s --check-prefixes=AVX,AVX-FAST,AVX1-FAST6; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX-SLOW,AVX2-SLOW7; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx2,fast-hops | FileCheck %s --check-prefixes=AVX,AVX-FAST,AVX2-FAST8; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx512vl | FileCheck %s --check-prefixes=AVX,AVX-SLOW,AVX512-SLOW9; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx512vl,fast-hops | FileCheck %s --check-prefixes=AVX,AVX-FAST,AVX512-FAST10 11; 128-bit vectors, 16/32-bit, add/sub12 13define i32 @extract_extract01_v4i32_add_i32(<4 x i32> %x) {14; SSE3-SLOW-LABEL: extract_extract01_v4i32_add_i32:15; SSE3-SLOW: # %bb.0:16; SSE3-SLOW-NEXT: movd %xmm0, %ecx17; SSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]18; SSE3-SLOW-NEXT: movd %xmm0, %eax19; SSE3-SLOW-NEXT: addl %ecx, %eax20; SSE3-SLOW-NEXT: retq21;22; SSE3-FAST-LABEL: extract_extract01_v4i32_add_i32:23; SSE3-FAST: # %bb.0:24; SSE3-FAST-NEXT: phaddd %xmm0, %xmm025; SSE3-FAST-NEXT: movd %xmm0, %eax26; SSE3-FAST-NEXT: retq27;28; AVX-SLOW-LABEL: extract_extract01_v4i32_add_i32:29; AVX-SLOW: # %bb.0:30; AVX-SLOW-NEXT: vmovd %xmm0, %ecx31; AVX-SLOW-NEXT: vpextrd $1, %xmm0, %eax32; AVX-SLOW-NEXT: addl %ecx, %eax33; AVX-SLOW-NEXT: retq34;35; AVX-FAST-LABEL: extract_extract01_v4i32_add_i32:36; AVX-FAST: # %bb.0:37; AVX-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm038; AVX-FAST-NEXT: vmovd %xmm0, %eax39; AVX-FAST-NEXT: retq40 %x0 = extractelement <4 x i32> %x, i32 041 %x1 = extractelement <4 x i32> %x, i32 142 %x01 = add i32 %x0, %x143 ret i32 %x0144}45 46define i32 @extract_extract23_v4i32_add_i32(<4 x i32> %x) {47; SSE3-SLOW-LABEL: extract_extract23_v4i32_add_i32:48; SSE3-SLOW: # %bb.0:49; SSE3-SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]50; SSE3-SLOW-NEXT: movd %xmm1, %ecx51; SSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]52; SSE3-SLOW-NEXT: movd %xmm0, %eax53; SSE3-SLOW-NEXT: addl %ecx, %eax54; SSE3-SLOW-NEXT: retq55;56; SSE3-FAST-LABEL: extract_extract23_v4i32_add_i32:57; SSE3-FAST: # %bb.0:58; SSE3-FAST-NEXT: phaddd %xmm0, %xmm059; SSE3-FAST-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]60; SSE3-FAST-NEXT: movd %xmm0, %eax61; SSE3-FAST-NEXT: retq62;63; AVX-SLOW-LABEL: extract_extract23_v4i32_add_i32:64; AVX-SLOW: # %bb.0:65; AVX-SLOW-NEXT: vextractps $2, %xmm0, %ecx66; AVX-SLOW-NEXT: vextractps $3, %xmm0, %eax67; AVX-SLOW-NEXT: addl %ecx, %eax68; AVX-SLOW-NEXT: retq69;70; AVX-FAST-LABEL: extract_extract23_v4i32_add_i32:71; AVX-FAST: # %bb.0:72; AVX-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm073; AVX-FAST-NEXT: vpextrd $1, %xmm0, %eax74; AVX-FAST-NEXT: retq75 %x0 = extractelement <4 x i32> %x, i32 276 %x1 = extractelement <4 x i32> %x, i32 377 %x01 = add i32 %x0, %x178 ret i32 %x0179}80 81define i32 @extract_extract01_v4i32_add_i32_commute(<4 x i32> %x) {82; SSE3-SLOW-LABEL: extract_extract01_v4i32_add_i32_commute:83; SSE3-SLOW: # %bb.0:84; SSE3-SLOW-NEXT: movd %xmm0, %ecx85; SSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]86; SSE3-SLOW-NEXT: movd %xmm0, %eax87; SSE3-SLOW-NEXT: addl %ecx, %eax88; SSE3-SLOW-NEXT: retq89;90; SSE3-FAST-LABEL: extract_extract01_v4i32_add_i32_commute:91; SSE3-FAST: # %bb.0:92; SSE3-FAST-NEXT: phaddd %xmm0, %xmm093; SSE3-FAST-NEXT: movd %xmm0, %eax94; SSE3-FAST-NEXT: retq95;96; AVX-SLOW-LABEL: extract_extract01_v4i32_add_i32_commute:97; AVX-SLOW: # %bb.0:98; AVX-SLOW-NEXT: vmovd %xmm0, %ecx99; AVX-SLOW-NEXT: vpextrd $1, %xmm0, %eax100; AVX-SLOW-NEXT: addl %ecx, %eax101; AVX-SLOW-NEXT: retq102;103; AVX-FAST-LABEL: extract_extract01_v4i32_add_i32_commute:104; AVX-FAST: # %bb.0:105; AVX-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm0106; AVX-FAST-NEXT: vmovd %xmm0, %eax107; AVX-FAST-NEXT: retq108 %x0 = extractelement <4 x i32> %x, i32 0109 %x1 = extractelement <4 x i32> %x, i32 1110 %x01 = add i32 %x1, %x0111 ret i32 %x01112}113 114define i32 @extract_extract23_v4i32_add_i32_commute(<4 x i32> %x) {115; SSE3-SLOW-LABEL: extract_extract23_v4i32_add_i32_commute:116; SSE3-SLOW: # %bb.0:117; SSE3-SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]118; SSE3-SLOW-NEXT: movd %xmm1, %ecx119; SSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]120; SSE3-SLOW-NEXT: movd %xmm0, %eax121; SSE3-SLOW-NEXT: addl %ecx, %eax122; SSE3-SLOW-NEXT: retq123;124; SSE3-FAST-LABEL: extract_extract23_v4i32_add_i32_commute:125; SSE3-FAST: # %bb.0:126; SSE3-FAST-NEXT: phaddd %xmm0, %xmm0127; SSE3-FAST-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]128; SSE3-FAST-NEXT: movd %xmm0, %eax129; SSE3-FAST-NEXT: retq130;131; AVX-SLOW-LABEL: extract_extract23_v4i32_add_i32_commute:132; AVX-SLOW: # %bb.0:133; AVX-SLOW-NEXT: vextractps $2, %xmm0, %ecx134; AVX-SLOW-NEXT: vextractps $3, %xmm0, %eax135; AVX-SLOW-NEXT: addl %ecx, %eax136; AVX-SLOW-NEXT: retq137;138; AVX-FAST-LABEL: extract_extract23_v4i32_add_i32_commute:139; AVX-FAST: # %bb.0:140; AVX-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm0141; AVX-FAST-NEXT: vpextrd $1, %xmm0, %eax142; AVX-FAST-NEXT: retq143 %x0 = extractelement <4 x i32> %x, i32 2144 %x1 = extractelement <4 x i32> %x, i32 3145 %x01 = add i32 %x1, %x0146 ret i32 %x01147}148 149define i16 @extract_extract01_v8i16_add_i16(<8 x i16> %x) {150; SSE3-SLOW-LABEL: extract_extract01_v8i16_add_i16:151; SSE3-SLOW: # %bb.0:152; SSE3-SLOW-NEXT: movd %xmm0, %ecx153; SSE3-SLOW-NEXT: pextrw $1, %xmm0, %eax154; SSE3-SLOW-NEXT: addl %ecx, %eax155; SSE3-SLOW-NEXT: # kill: def $ax killed $ax killed $eax156; SSE3-SLOW-NEXT: retq157;158; SSE3-FAST-LABEL: extract_extract01_v8i16_add_i16:159; SSE3-FAST: # %bb.0:160; SSE3-FAST-NEXT: phaddw %xmm0, %xmm0161; SSE3-FAST-NEXT: movd %xmm0, %eax162; SSE3-FAST-NEXT: # kill: def $ax killed $ax killed $eax163; SSE3-FAST-NEXT: retq164;165; AVX-SLOW-LABEL: extract_extract01_v8i16_add_i16:166; AVX-SLOW: # %bb.0:167; AVX-SLOW-NEXT: vmovd %xmm0, %ecx168; AVX-SLOW-NEXT: vpextrw $1, %xmm0, %eax169; AVX-SLOW-NEXT: addl %ecx, %eax170; AVX-SLOW-NEXT: # kill: def $ax killed $ax killed $eax171; AVX-SLOW-NEXT: retq172;173; AVX-FAST-LABEL: extract_extract01_v8i16_add_i16:174; AVX-FAST: # %bb.0:175; AVX-FAST-NEXT: vphaddw %xmm0, %xmm0, %xmm0176; AVX-FAST-NEXT: vmovd %xmm0, %eax177; AVX-FAST-NEXT: # kill: def $ax killed $ax killed $eax178; AVX-FAST-NEXT: retq179 %x0 = extractelement <8 x i16> %x, i32 0180 %x1 = extractelement <8 x i16> %x, i32 1181 %x01 = add i16 %x0, %x1182 ret i16 %x01183}184 185define i16 @extract_extract45_v8i16_add_i16(<8 x i16> %x) {186; SSE3-SLOW-LABEL: extract_extract45_v8i16_add_i16:187; SSE3-SLOW: # %bb.0:188; SSE3-SLOW-NEXT: pextrw $4, %xmm0, %ecx189; SSE3-SLOW-NEXT: pextrw $5, %xmm0, %eax190; SSE3-SLOW-NEXT: addl %ecx, %eax191; SSE3-SLOW-NEXT: # kill: def $ax killed $ax killed $eax192; SSE3-SLOW-NEXT: retq193;194; SSE3-FAST-LABEL: extract_extract45_v8i16_add_i16:195; SSE3-FAST: # %bb.0:196; SSE3-FAST-NEXT: phaddw %xmm0, %xmm0197; SSE3-FAST-NEXT: pextrw $2, %xmm0, %eax198; SSE3-FAST-NEXT: # kill: def $ax killed $ax killed $eax199; SSE3-FAST-NEXT: retq200;201; AVX-SLOW-LABEL: extract_extract45_v8i16_add_i16:202; AVX-SLOW: # %bb.0:203; AVX-SLOW-NEXT: vpextrw $4, %xmm0, %ecx204; AVX-SLOW-NEXT: vpextrw $5, %xmm0, %eax205; AVX-SLOW-NEXT: addl %ecx, %eax206; AVX-SLOW-NEXT: # kill: def $ax killed $ax killed $eax207; AVX-SLOW-NEXT: retq208;209; AVX-FAST-LABEL: extract_extract45_v8i16_add_i16:210; AVX-FAST: # %bb.0:211; AVX-FAST-NEXT: vphaddw %xmm0, %xmm0, %xmm0212; AVX-FAST-NEXT: vpextrw $2, %xmm0, %eax213; AVX-FAST-NEXT: # kill: def $ax killed $ax killed $eax214; AVX-FAST-NEXT: retq215 %x0 = extractelement <8 x i16> %x, i32 4216 %x1 = extractelement <8 x i16> %x, i32 5217 %x01 = add i16 %x0, %x1218 ret i16 %x01219}220 221define i16 @extract_extract01_v8i16_add_i16_commute(<8 x i16> %x) {222; SSE3-SLOW-LABEL: extract_extract01_v8i16_add_i16_commute:223; SSE3-SLOW: # %bb.0:224; SSE3-SLOW-NEXT: movd %xmm0, %ecx225; SSE3-SLOW-NEXT: pextrw $1, %xmm0, %eax226; SSE3-SLOW-NEXT: addl %ecx, %eax227; SSE3-SLOW-NEXT: # kill: def $ax killed $ax killed $eax228; SSE3-SLOW-NEXT: retq229;230; SSE3-FAST-LABEL: extract_extract01_v8i16_add_i16_commute:231; SSE3-FAST: # %bb.0:232; SSE3-FAST-NEXT: phaddw %xmm0, %xmm0233; SSE3-FAST-NEXT: movd %xmm0, %eax234; SSE3-FAST-NEXT: # kill: def $ax killed $ax killed $eax235; SSE3-FAST-NEXT: retq236;237; AVX-SLOW-LABEL: extract_extract01_v8i16_add_i16_commute:238; AVX-SLOW: # %bb.0:239; AVX-SLOW-NEXT: vmovd %xmm0, %ecx240; AVX-SLOW-NEXT: vpextrw $1, %xmm0, %eax241; AVX-SLOW-NEXT: addl %ecx, %eax242; AVX-SLOW-NEXT: # kill: def $ax killed $ax killed $eax243; AVX-SLOW-NEXT: retq244;245; AVX-FAST-LABEL: extract_extract01_v8i16_add_i16_commute:246; AVX-FAST: # %bb.0:247; AVX-FAST-NEXT: vphaddw %xmm0, %xmm0, %xmm0248; AVX-FAST-NEXT: vmovd %xmm0, %eax249; AVX-FAST-NEXT: # kill: def $ax killed $ax killed $eax250; AVX-FAST-NEXT: retq251 %x0 = extractelement <8 x i16> %x, i32 0252 %x1 = extractelement <8 x i16> %x, i32 1253 %x01 = add i16 %x1, %x0254 ret i16 %x01255}256 257define i16 @extract_extract45_v8i16_add_i16_commute(<8 x i16> %x) {258; SSE3-SLOW-LABEL: extract_extract45_v8i16_add_i16_commute:259; SSE3-SLOW: # %bb.0:260; SSE3-SLOW-NEXT: pextrw $4, %xmm0, %ecx261; SSE3-SLOW-NEXT: pextrw $5, %xmm0, %eax262; SSE3-SLOW-NEXT: addl %ecx, %eax263; SSE3-SLOW-NEXT: # kill: def $ax killed $ax killed $eax264; SSE3-SLOW-NEXT: retq265;266; SSE3-FAST-LABEL: extract_extract45_v8i16_add_i16_commute:267; SSE3-FAST: # %bb.0:268; SSE3-FAST-NEXT: phaddw %xmm0, %xmm0269; SSE3-FAST-NEXT: pextrw $2, %xmm0, %eax270; SSE3-FAST-NEXT: # kill: def $ax killed $ax killed $eax271; SSE3-FAST-NEXT: retq272;273; AVX-SLOW-LABEL: extract_extract45_v8i16_add_i16_commute:274; AVX-SLOW: # %bb.0:275; AVX-SLOW-NEXT: vpextrw $4, %xmm0, %ecx276; AVX-SLOW-NEXT: vpextrw $5, %xmm0, %eax277; AVX-SLOW-NEXT: addl %ecx, %eax278; AVX-SLOW-NEXT: # kill: def $ax killed $ax killed $eax279; AVX-SLOW-NEXT: retq280;281; AVX-FAST-LABEL: extract_extract45_v8i16_add_i16_commute:282; AVX-FAST: # %bb.0:283; AVX-FAST-NEXT: vphaddw %xmm0, %xmm0, %xmm0284; AVX-FAST-NEXT: vpextrw $2, %xmm0, %eax285; AVX-FAST-NEXT: # kill: def $ax killed $ax killed $eax286; AVX-FAST-NEXT: retq287 %x0 = extractelement <8 x i16> %x, i32 4288 %x1 = extractelement <8 x i16> %x, i32 5289 %x01 = add i16 %x1, %x0290 ret i16 %x01291}292 293define i32 @extract_extract01_v4i32_sub_i32(<4 x i32> %x) {294; SSE3-SLOW-LABEL: extract_extract01_v4i32_sub_i32:295; SSE3-SLOW: # %bb.0:296; SSE3-SLOW-NEXT: movd %xmm0, %eax297; SSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]298; SSE3-SLOW-NEXT: movd %xmm0, %ecx299; SSE3-SLOW-NEXT: subl %ecx, %eax300; SSE3-SLOW-NEXT: retq301;302; SSE3-FAST-LABEL: extract_extract01_v4i32_sub_i32:303; SSE3-FAST: # %bb.0:304; SSE3-FAST-NEXT: phsubd %xmm0, %xmm0305; SSE3-FAST-NEXT: movd %xmm0, %eax306; SSE3-FAST-NEXT: retq307;308; AVX-SLOW-LABEL: extract_extract01_v4i32_sub_i32:309; AVX-SLOW: # %bb.0:310; AVX-SLOW-NEXT: vmovd %xmm0, %eax311; AVX-SLOW-NEXT: vpextrd $1, %xmm0, %ecx312; AVX-SLOW-NEXT: subl %ecx, %eax313; AVX-SLOW-NEXT: retq314;315; AVX-FAST-LABEL: extract_extract01_v4i32_sub_i32:316; AVX-FAST: # %bb.0:317; AVX-FAST-NEXT: vphsubd %xmm0, %xmm0, %xmm0318; AVX-FAST-NEXT: vmovd %xmm0, %eax319; AVX-FAST-NEXT: retq320 %x0 = extractelement <4 x i32> %x, i32 0321 %x1 = extractelement <4 x i32> %x, i32 1322 %x01 = sub i32 %x0, %x1323 ret i32 %x01324}325 326define i32 @extract_extract23_v4i32_sub_i32(<4 x i32> %x) {327; SSE3-SLOW-LABEL: extract_extract23_v4i32_sub_i32:328; SSE3-SLOW: # %bb.0:329; SSE3-SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]330; SSE3-SLOW-NEXT: movd %xmm1, %eax331; SSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]332; SSE3-SLOW-NEXT: movd %xmm0, %ecx333; SSE3-SLOW-NEXT: subl %ecx, %eax334; SSE3-SLOW-NEXT: retq335;336; SSE3-FAST-LABEL: extract_extract23_v4i32_sub_i32:337; SSE3-FAST: # %bb.0:338; SSE3-FAST-NEXT: phsubd %xmm0, %xmm0339; SSE3-FAST-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]340; SSE3-FAST-NEXT: movd %xmm0, %eax341; SSE3-FAST-NEXT: retq342;343; AVX-SLOW-LABEL: extract_extract23_v4i32_sub_i32:344; AVX-SLOW: # %bb.0:345; AVX-SLOW-NEXT: vextractps $2, %xmm0, %eax346; AVX-SLOW-NEXT: vextractps $3, %xmm0, %ecx347; AVX-SLOW-NEXT: subl %ecx, %eax348; AVX-SLOW-NEXT: retq349;350; AVX-FAST-LABEL: extract_extract23_v4i32_sub_i32:351; AVX-FAST: # %bb.0:352; AVX-FAST-NEXT: vphsubd %xmm0, %xmm0, %xmm0353; AVX-FAST-NEXT: vpextrd $1, %xmm0, %eax354; AVX-FAST-NEXT: retq355 %x0 = extractelement <4 x i32> %x, i32 2356 %x1 = extractelement <4 x i32> %x, i32 3357 %x01 = sub i32 %x0, %x1358 ret i32 %x01359}360 361define i32 @extract_extract01_v4i32_sub_i32_commute(<4 x i32> %x) {362; SSE3-LABEL: extract_extract01_v4i32_sub_i32_commute:363; SSE3: # %bb.0:364; SSE3-NEXT: movd %xmm0, %ecx365; SSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]366; SSE3-NEXT: movd %xmm0, %eax367; SSE3-NEXT: subl %ecx, %eax368; SSE3-NEXT: retq369;370; AVX-LABEL: extract_extract01_v4i32_sub_i32_commute:371; AVX: # %bb.0:372; AVX-NEXT: vmovd %xmm0, %ecx373; AVX-NEXT: vpextrd $1, %xmm0, %eax374; AVX-NEXT: subl %ecx, %eax375; AVX-NEXT: retq376 %x0 = extractelement <4 x i32> %x, i32 0377 %x1 = extractelement <4 x i32> %x, i32 1378 %x01 = sub i32 %x1, %x0379 ret i32 %x01380}381 382define i32 @extract_extract23_v4i32_sub_i32_commute(<4 x i32> %x) {383; SSE3-LABEL: extract_extract23_v4i32_sub_i32_commute:384; SSE3: # %bb.0:385; SSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]386; SSE3-NEXT: movd %xmm1, %ecx387; SSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]388; SSE3-NEXT: movd %xmm0, %eax389; SSE3-NEXT: subl %ecx, %eax390; SSE3-NEXT: retq391;392; AVX-LABEL: extract_extract23_v4i32_sub_i32_commute:393; AVX: # %bb.0:394; AVX-NEXT: vextractps $2, %xmm0, %ecx395; AVX-NEXT: vextractps $3, %xmm0, %eax396; AVX-NEXT: subl %ecx, %eax397; AVX-NEXT: retq398 %x0 = extractelement <4 x i32> %x, i32 2399 %x1 = extractelement <4 x i32> %x, i32 3400 %x01 = sub i32 %x1, %x0401 ret i32 %x01402}403 404define i16 @extract_extract01_v8i16_sub_i16(<8 x i16> %x) {405; SSE3-SLOW-LABEL: extract_extract01_v8i16_sub_i16:406; SSE3-SLOW: # %bb.0:407; SSE3-SLOW-NEXT: movd %xmm0, %eax408; SSE3-SLOW-NEXT: pextrw $1, %xmm0, %ecx409; SSE3-SLOW-NEXT: subl %ecx, %eax410; SSE3-SLOW-NEXT: # kill: def $ax killed $ax killed $eax411; SSE3-SLOW-NEXT: retq412;413; SSE3-FAST-LABEL: extract_extract01_v8i16_sub_i16:414; SSE3-FAST: # %bb.0:415; SSE3-FAST-NEXT: phsubw %xmm0, %xmm0416; SSE3-FAST-NEXT: movd %xmm0, %eax417; SSE3-FAST-NEXT: # kill: def $ax killed $ax killed $eax418; SSE3-FAST-NEXT: retq419;420; AVX-SLOW-LABEL: extract_extract01_v8i16_sub_i16:421; AVX-SLOW: # %bb.0:422; AVX-SLOW-NEXT: vmovd %xmm0, %eax423; AVX-SLOW-NEXT: vpextrw $1, %xmm0, %ecx424; AVX-SLOW-NEXT: subl %ecx, %eax425; AVX-SLOW-NEXT: # kill: def $ax killed $ax killed $eax426; AVX-SLOW-NEXT: retq427;428; AVX-FAST-LABEL: extract_extract01_v8i16_sub_i16:429; AVX-FAST: # %bb.0:430; AVX-FAST-NEXT: vphsubw %xmm0, %xmm0, %xmm0431; AVX-FAST-NEXT: vmovd %xmm0, %eax432; AVX-FAST-NEXT: # kill: def $ax killed $ax killed $eax433; AVX-FAST-NEXT: retq434 %x0 = extractelement <8 x i16> %x, i32 0435 %x1 = extractelement <8 x i16> %x, i32 1436 %x01 = sub i16 %x0, %x1437 ret i16 %x01438}439 440define i16 @extract_extract23_v8i16_sub_i16(<8 x i16> %x) {441; SSE3-SLOW-LABEL: extract_extract23_v8i16_sub_i16:442; SSE3-SLOW: # %bb.0:443; SSE3-SLOW-NEXT: pextrw $2, %xmm0, %eax444; SSE3-SLOW-NEXT: pextrw $3, %xmm0, %ecx445; SSE3-SLOW-NEXT: subl %ecx, %eax446; SSE3-SLOW-NEXT: # kill: def $ax killed $ax killed $eax447; SSE3-SLOW-NEXT: retq448;449; SSE3-FAST-LABEL: extract_extract23_v8i16_sub_i16:450; SSE3-FAST: # %bb.0:451; SSE3-FAST-NEXT: phsubw %xmm0, %xmm0452; SSE3-FAST-NEXT: pextrw $1, %xmm0, %eax453; SSE3-FAST-NEXT: # kill: def $ax killed $ax killed $eax454; SSE3-FAST-NEXT: retq455;456; AVX-SLOW-LABEL: extract_extract23_v8i16_sub_i16:457; AVX-SLOW: # %bb.0:458; AVX-SLOW-NEXT: vpextrw $2, %xmm0, %eax459; AVX-SLOW-NEXT: vpextrw $3, %xmm0, %ecx460; AVX-SLOW-NEXT: subl %ecx, %eax461; AVX-SLOW-NEXT: # kill: def $ax killed $ax killed $eax462; AVX-SLOW-NEXT: retq463;464; AVX-FAST-LABEL: extract_extract23_v8i16_sub_i16:465; AVX-FAST: # %bb.0:466; AVX-FAST-NEXT: vphsubw %xmm0, %xmm0, %xmm0467; AVX-FAST-NEXT: vpextrw $1, %xmm0, %eax468; AVX-FAST-NEXT: # kill: def $ax killed $ax killed $eax469; AVX-FAST-NEXT: retq470 %x0 = extractelement <8 x i16> %x, i32 2471 %x1 = extractelement <8 x i16> %x, i32 3472 %x01 = sub i16 %x0, %x1473 ret i16 %x01474}475 476define i16 @extract_extract01_v8i16_sub_i16_commute(<8 x i16> %x) {477; SSE3-LABEL: extract_extract01_v8i16_sub_i16_commute:478; SSE3: # %bb.0:479; SSE3-NEXT: movd %xmm0, %ecx480; SSE3-NEXT: pextrw $1, %xmm0, %eax481; SSE3-NEXT: subl %ecx, %eax482; SSE3-NEXT: # kill: def $ax killed $ax killed $eax483; SSE3-NEXT: retq484;485; AVX-LABEL: extract_extract01_v8i16_sub_i16_commute:486; AVX: # %bb.0:487; AVX-NEXT: vmovd %xmm0, %ecx488; AVX-NEXT: vpextrw $1, %xmm0, %eax489; AVX-NEXT: subl %ecx, %eax490; AVX-NEXT: # kill: def $ax killed $ax killed $eax491; AVX-NEXT: retq492 %x0 = extractelement <8 x i16> %x, i32 0493 %x1 = extractelement <8 x i16> %x, i32 1494 %x01 = sub i16 %x1, %x0495 ret i16 %x01496}497 498define i16 @extract_extract23_v8i16_sub_i16_commute(<8 x i16> %x) {499; SSE3-LABEL: extract_extract23_v8i16_sub_i16_commute:500; SSE3: # %bb.0:501; SSE3-NEXT: pextrw $2, %xmm0, %ecx502; SSE3-NEXT: pextrw $3, %xmm0, %eax503; SSE3-NEXT: subl %ecx, %eax504; SSE3-NEXT: # kill: def $ax killed $ax killed $eax505; SSE3-NEXT: retq506;507; AVX-LABEL: extract_extract23_v8i16_sub_i16_commute:508; AVX: # %bb.0:509; AVX-NEXT: vpextrw $2, %xmm0, %ecx510; AVX-NEXT: vpextrw $3, %xmm0, %eax511; AVX-NEXT: subl %ecx, %eax512; AVX-NEXT: # kill: def $ax killed $ax killed $eax513; AVX-NEXT: retq514 %x0 = extractelement <8 x i16> %x, i32 2515 %x1 = extractelement <8 x i16> %x, i32 3516 %x01 = sub i16 %x1, %x0517 ret i16 %x01518}519 520; 256-bit vectors, i32/i16, add/sub521 522define i32 @extract_extract01_v8i32_add_i32(<8 x i32> %x) {523; SSE3-SLOW-LABEL: extract_extract01_v8i32_add_i32:524; SSE3-SLOW: # %bb.0:525; SSE3-SLOW-NEXT: movd %xmm0, %ecx526; SSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]527; SSE3-SLOW-NEXT: movd %xmm0, %eax528; SSE3-SLOW-NEXT: addl %ecx, %eax529; SSE3-SLOW-NEXT: retq530;531; SSE3-FAST-LABEL: extract_extract01_v8i32_add_i32:532; SSE3-FAST: # %bb.0:533; SSE3-FAST-NEXT: phaddd %xmm0, %xmm0534; SSE3-FAST-NEXT: movd %xmm0, %eax535; SSE3-FAST-NEXT: retq536;537; AVX-SLOW-LABEL: extract_extract01_v8i32_add_i32:538; AVX-SLOW: # %bb.0:539; AVX-SLOW-NEXT: vmovd %xmm0, %ecx540; AVX-SLOW-NEXT: vpextrd $1, %xmm0, %eax541; AVX-SLOW-NEXT: addl %ecx, %eax542; AVX-SLOW-NEXT: vzeroupper543; AVX-SLOW-NEXT: retq544;545; AVX-FAST-LABEL: extract_extract01_v8i32_add_i32:546; AVX-FAST: # %bb.0:547; AVX-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm0548; AVX-FAST-NEXT: vmovd %xmm0, %eax549; AVX-FAST-NEXT: vzeroupper550; AVX-FAST-NEXT: retq551 %x0 = extractelement <8 x i32> %x, i32 0552 %x1 = extractelement <8 x i32> %x, i32 1553 %x01 = add i32 %x0, %x1554 ret i32 %x01555}556 557define i32 @extract_extract23_v8i32_add_i32(<8 x i32> %x) {558; SSE3-SLOW-LABEL: extract_extract23_v8i32_add_i32:559; SSE3-SLOW: # %bb.0:560; SSE3-SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]561; SSE3-SLOW-NEXT: movd %xmm1, %ecx562; SSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]563; SSE3-SLOW-NEXT: movd %xmm0, %eax564; SSE3-SLOW-NEXT: addl %ecx, %eax565; SSE3-SLOW-NEXT: retq566;567; SSE3-FAST-LABEL: extract_extract23_v8i32_add_i32:568; SSE3-FAST: # %bb.0:569; SSE3-FAST-NEXT: phaddd %xmm0, %xmm0570; SSE3-FAST-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]571; SSE3-FAST-NEXT: movd %xmm0, %eax572; SSE3-FAST-NEXT: retq573;574; AVX-SLOW-LABEL: extract_extract23_v8i32_add_i32:575; AVX-SLOW: # %bb.0:576; AVX-SLOW-NEXT: vextractps $2, %xmm0, %ecx577; AVX-SLOW-NEXT: vextractps $3, %xmm0, %eax578; AVX-SLOW-NEXT: addl %ecx, %eax579; AVX-SLOW-NEXT: vzeroupper580; AVX-SLOW-NEXT: retq581;582; AVX-FAST-LABEL: extract_extract23_v8i32_add_i32:583; AVX-FAST: # %bb.0:584; AVX-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm0585; AVX-FAST-NEXT: vpextrd $1, %xmm0, %eax586; AVX-FAST-NEXT: vzeroupper587; AVX-FAST-NEXT: retq588 %x0 = extractelement <8 x i32> %x, i32 2589 %x1 = extractelement <8 x i32> %x, i32 3590 %x01 = add i32 %x0, %x1591 ret i32 %x01592}593 594define i32 @extract_extract67_v8i32_add_i32(<8 x i32> %x) {595; SSE3-SLOW-LABEL: extract_extract67_v8i32_add_i32:596; SSE3-SLOW: # %bb.0:597; SSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]598; SSE3-SLOW-NEXT: movd %xmm0, %ecx599; SSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm1[3,3,3,3]600; SSE3-SLOW-NEXT: movd %xmm0, %eax601; SSE3-SLOW-NEXT: addl %ecx, %eax602; SSE3-SLOW-NEXT: retq603;604; SSE3-FAST-LABEL: extract_extract67_v8i32_add_i32:605; SSE3-FAST: # %bb.0:606; SSE3-FAST-NEXT: phaddd %xmm1, %xmm1607; SSE3-FAST-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]608; SSE3-FAST-NEXT: movd %xmm0, %eax609; SSE3-FAST-NEXT: retq610;611; AVX-SLOW-LABEL: extract_extract67_v8i32_add_i32:612; AVX-SLOW: # %bb.0:613; AVX-SLOW-NEXT: vextractf128 $1, %ymm0, %xmm0614; AVX-SLOW-NEXT: vextractps $2, %xmm0, %ecx615; AVX-SLOW-NEXT: vextractps $3, %xmm0, %eax616; AVX-SLOW-NEXT: addl %ecx, %eax617; AVX-SLOW-NEXT: vzeroupper618; AVX-SLOW-NEXT: retq619;620; AVX1-FAST-LABEL: extract_extract67_v8i32_add_i32:621; AVX1-FAST: # %bb.0:622; AVX1-FAST-NEXT: vextractf128 $1, %ymm0, %xmm0623; AVX1-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm0624; AVX1-FAST-NEXT: vpextrd $1, %xmm0, %eax625; AVX1-FAST-NEXT: vzeroupper626; AVX1-FAST-NEXT: retq627;628; AVX2-FAST-LABEL: extract_extract67_v8i32_add_i32:629; AVX2-FAST: # %bb.0:630; AVX2-FAST-NEXT: vextracti128 $1, %ymm0, %xmm0631; AVX2-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm0632; AVX2-FAST-NEXT: vpextrd $1, %xmm0, %eax633; AVX2-FAST-NEXT: vzeroupper634; AVX2-FAST-NEXT: retq635;636; AVX512-FAST-LABEL: extract_extract67_v8i32_add_i32:637; AVX512-FAST: # %bb.0:638; AVX512-FAST-NEXT: vextracti128 $1, %ymm0, %xmm0639; AVX512-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm0640; AVX512-FAST-NEXT: vpextrd $1, %xmm0, %eax641; AVX512-FAST-NEXT: vzeroupper642; AVX512-FAST-NEXT: retq643 %x0 = extractelement <8 x i32> %x, i32 6644 %x1 = extractelement <8 x i32> %x, i32 7645 %x01 = add i32 %x0, %x1646 ret i32 %x01647}648 649define i32 @extract_extract01_v8i32_add_i32_commute(<8 x i32> %x) {650; SSE3-SLOW-LABEL: extract_extract01_v8i32_add_i32_commute:651; SSE3-SLOW: # %bb.0:652; SSE3-SLOW-NEXT: movd %xmm0, %ecx653; SSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]654; SSE3-SLOW-NEXT: movd %xmm0, %eax655; SSE3-SLOW-NEXT: addl %ecx, %eax656; SSE3-SLOW-NEXT: retq657;658; SSE3-FAST-LABEL: extract_extract01_v8i32_add_i32_commute:659; SSE3-FAST: # %bb.0:660; SSE3-FAST-NEXT: phaddd %xmm0, %xmm0661; SSE3-FAST-NEXT: movd %xmm0, %eax662; SSE3-FAST-NEXT: retq663;664; AVX-SLOW-LABEL: extract_extract01_v8i32_add_i32_commute:665; AVX-SLOW: # %bb.0:666; AVX-SLOW-NEXT: vmovd %xmm0, %ecx667; AVX-SLOW-NEXT: vpextrd $1, %xmm0, %eax668; AVX-SLOW-NEXT: addl %ecx, %eax669; AVX-SLOW-NEXT: vzeroupper670; AVX-SLOW-NEXT: retq671;672; AVX-FAST-LABEL: extract_extract01_v8i32_add_i32_commute:673; AVX-FAST: # %bb.0:674; AVX-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm0675; AVX-FAST-NEXT: vmovd %xmm0, %eax676; AVX-FAST-NEXT: vzeroupper677; AVX-FAST-NEXT: retq678 %x0 = extractelement <8 x i32> %x, i32 0679 %x1 = extractelement <8 x i32> %x, i32 1680 %x01 = add i32 %x1, %x0681 ret i32 %x01682}683 684define i32 @extract_extract23_v8i32_add_i32_commute(<8 x i32> %x) {685; SSE3-SLOW-LABEL: extract_extract23_v8i32_add_i32_commute:686; SSE3-SLOW: # %bb.0:687; SSE3-SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]688; SSE3-SLOW-NEXT: movd %xmm1, %ecx689; SSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]690; SSE3-SLOW-NEXT: movd %xmm0, %eax691; SSE3-SLOW-NEXT: addl %ecx, %eax692; SSE3-SLOW-NEXT: retq693;694; SSE3-FAST-LABEL: extract_extract23_v8i32_add_i32_commute:695; SSE3-FAST: # %bb.0:696; SSE3-FAST-NEXT: phaddd %xmm0, %xmm0697; SSE3-FAST-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]698; SSE3-FAST-NEXT: movd %xmm0, %eax699; SSE3-FAST-NEXT: retq700;701; AVX-SLOW-LABEL: extract_extract23_v8i32_add_i32_commute:702; AVX-SLOW: # %bb.0:703; AVX-SLOW-NEXT: vextractps $2, %xmm0, %ecx704; AVX-SLOW-NEXT: vextractps $3, %xmm0, %eax705; AVX-SLOW-NEXT: addl %ecx, %eax706; AVX-SLOW-NEXT: vzeroupper707; AVX-SLOW-NEXT: retq708;709; AVX-FAST-LABEL: extract_extract23_v8i32_add_i32_commute:710; AVX-FAST: # %bb.0:711; AVX-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm0712; AVX-FAST-NEXT: vpextrd $1, %xmm0, %eax713; AVX-FAST-NEXT: vzeroupper714; AVX-FAST-NEXT: retq715 %x0 = extractelement <8 x i32> %x, i32 2716 %x1 = extractelement <8 x i32> %x, i32 3717 %x01 = add i32 %x1, %x0718 ret i32 %x01719}720 721define i32 @extract_extract67_v8i32_add_i32_commute(<8 x i32> %x) {722; SSE3-SLOW-LABEL: extract_extract67_v8i32_add_i32_commute:723; SSE3-SLOW: # %bb.0:724; SSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]725; SSE3-SLOW-NEXT: movd %xmm0, %ecx726; SSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm1[3,3,3,3]727; SSE3-SLOW-NEXT: movd %xmm0, %eax728; SSE3-SLOW-NEXT: addl %ecx, %eax729; SSE3-SLOW-NEXT: retq730;731; SSE3-FAST-LABEL: extract_extract67_v8i32_add_i32_commute:732; SSE3-FAST: # %bb.0:733; SSE3-FAST-NEXT: phaddd %xmm1, %xmm1734; SSE3-FAST-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]735; SSE3-FAST-NEXT: movd %xmm0, %eax736; SSE3-FAST-NEXT: retq737;738; AVX-SLOW-LABEL: extract_extract67_v8i32_add_i32_commute:739; AVX-SLOW: # %bb.0:740; AVX-SLOW-NEXT: vextractf128 $1, %ymm0, %xmm0741; AVX-SLOW-NEXT: vextractps $2, %xmm0, %ecx742; AVX-SLOW-NEXT: vextractps $3, %xmm0, %eax743; AVX-SLOW-NEXT: addl %ecx, %eax744; AVX-SLOW-NEXT: vzeroupper745; AVX-SLOW-NEXT: retq746;747; AVX1-FAST-LABEL: extract_extract67_v8i32_add_i32_commute:748; AVX1-FAST: # %bb.0:749; AVX1-FAST-NEXT: vextractf128 $1, %ymm0, %xmm0750; AVX1-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm0751; AVX1-FAST-NEXT: vpextrd $1, %xmm0, %eax752; AVX1-FAST-NEXT: vzeroupper753; AVX1-FAST-NEXT: retq754;755; AVX2-FAST-LABEL: extract_extract67_v8i32_add_i32_commute:756; AVX2-FAST: # %bb.0:757; AVX2-FAST-NEXT: vextracti128 $1, %ymm0, %xmm0758; AVX2-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm0759; AVX2-FAST-NEXT: vpextrd $1, %xmm0, %eax760; AVX2-FAST-NEXT: vzeroupper761; AVX2-FAST-NEXT: retq762;763; AVX512-FAST-LABEL: extract_extract67_v8i32_add_i32_commute:764; AVX512-FAST: # %bb.0:765; AVX512-FAST-NEXT: vextracti128 $1, %ymm0, %xmm0766; AVX512-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm0767; AVX512-FAST-NEXT: vpextrd $1, %xmm0, %eax768; AVX512-FAST-NEXT: vzeroupper769; AVX512-FAST-NEXT: retq770 %x0 = extractelement <8 x i32> %x, i32 6771 %x1 = extractelement <8 x i32> %x, i32 7772 %x01 = add i32 %x1, %x0773 ret i32 %x01774}775 776define i16 @extract_extract01_v16i16_add_i16(<16 x i16> %x) {777; SSE3-SLOW-LABEL: extract_extract01_v16i16_add_i16:778; SSE3-SLOW: # %bb.0:779; SSE3-SLOW-NEXT: movd %xmm0, %ecx780; SSE3-SLOW-NEXT: pextrw $1, %xmm0, %eax781; SSE3-SLOW-NEXT: addl %ecx, %eax782; SSE3-SLOW-NEXT: # kill: def $ax killed $ax killed $eax783; SSE3-SLOW-NEXT: retq784;785; SSE3-FAST-LABEL: extract_extract01_v16i16_add_i16:786; SSE3-FAST: # %bb.0:787; SSE3-FAST-NEXT: phaddw %xmm0, %xmm0788; SSE3-FAST-NEXT: movd %xmm0, %eax789; SSE3-FAST-NEXT: # kill: def $ax killed $ax killed $eax790; SSE3-FAST-NEXT: retq791;792; AVX-SLOW-LABEL: extract_extract01_v16i16_add_i16:793; AVX-SLOW: # %bb.0:794; AVX-SLOW-NEXT: vmovd %xmm0, %ecx795; AVX-SLOW-NEXT: vpextrw $1, %xmm0, %eax796; AVX-SLOW-NEXT: addl %ecx, %eax797; AVX-SLOW-NEXT: # kill: def $ax killed $ax killed $eax798; AVX-SLOW-NEXT: vzeroupper799; AVX-SLOW-NEXT: retq800;801; AVX-FAST-LABEL: extract_extract01_v16i16_add_i16:802; AVX-FAST: # %bb.0:803; AVX-FAST-NEXT: vphaddw %xmm0, %xmm0, %xmm0804; AVX-FAST-NEXT: vmovd %xmm0, %eax805; AVX-FAST-NEXT: # kill: def $ax killed $ax killed $eax806; AVX-FAST-NEXT: vzeroupper807; AVX-FAST-NEXT: retq808 %x0 = extractelement <16 x i16> %x, i32 0809 %x1 = extractelement <16 x i16> %x, i32 1810 %x01 = add i16 %x0, %x1811 ret i16 %x01812}813 814define i16 @extract_extract23_v16i16_add_i16(<16 x i16> %x) {815; SSE3-SLOW-LABEL: extract_extract23_v16i16_add_i16:816; SSE3-SLOW: # %bb.0:817; SSE3-SLOW-NEXT: pextrw $2, %xmm0, %ecx818; SSE3-SLOW-NEXT: pextrw $3, %xmm0, %eax819; SSE3-SLOW-NEXT: addl %ecx, %eax820; SSE3-SLOW-NEXT: # kill: def $ax killed $ax killed $eax821; SSE3-SLOW-NEXT: retq822;823; SSE3-FAST-LABEL: extract_extract23_v16i16_add_i16:824; SSE3-FAST: # %bb.0:825; SSE3-FAST-NEXT: phaddw %xmm0, %xmm0826; SSE3-FAST-NEXT: pextrw $1, %xmm0, %eax827; SSE3-FAST-NEXT: # kill: def $ax killed $ax killed $eax828; SSE3-FAST-NEXT: retq829;830; AVX-SLOW-LABEL: extract_extract23_v16i16_add_i16:831; AVX-SLOW: # %bb.0:832; AVX-SLOW-NEXT: vpextrw $2, %xmm0, %ecx833; AVX-SLOW-NEXT: vpextrw $3, %xmm0, %eax834; AVX-SLOW-NEXT: addl %ecx, %eax835; AVX-SLOW-NEXT: # kill: def $ax killed $ax killed $eax836; AVX-SLOW-NEXT: vzeroupper837; AVX-SLOW-NEXT: retq838;839; AVX-FAST-LABEL: extract_extract23_v16i16_add_i16:840; AVX-FAST: # %bb.0:841; AVX-FAST-NEXT: vphaddw %xmm0, %xmm0, %xmm0842; AVX-FAST-NEXT: vpextrw $1, %xmm0, %eax843; AVX-FAST-NEXT: # kill: def $ax killed $ax killed $eax844; AVX-FAST-NEXT: vzeroupper845; AVX-FAST-NEXT: retq846 %x0 = extractelement <16 x i16> %x, i32 2847 %x1 = extractelement <16 x i16> %x, i32 3848 %x01 = add i16 %x0, %x1849 ret i16 %x01850}851 852define i16 @extract_extract89_v16i16_add_i16(<16 x i16> %x) {853; SSE3-SLOW-LABEL: extract_extract89_v16i16_add_i16:854; SSE3-SLOW: # %bb.0:855; SSE3-SLOW-NEXT: movd %xmm1, %ecx856; SSE3-SLOW-NEXT: pextrw $1, %xmm1, %eax857; SSE3-SLOW-NEXT: addl %ecx, %eax858; SSE3-SLOW-NEXT: # kill: def $ax killed $ax killed $eax859; SSE3-SLOW-NEXT: retq860;861; SSE3-FAST-LABEL: extract_extract89_v16i16_add_i16:862; SSE3-FAST: # %bb.0:863; SSE3-FAST-NEXT: phaddw %xmm1, %xmm1864; SSE3-FAST-NEXT: movd %xmm1, %eax865; SSE3-FAST-NEXT: # kill: def $ax killed $ax killed $eax866; SSE3-FAST-NEXT: retq867;868; AVX1-SLOW-LABEL: extract_extract89_v16i16_add_i16:869; AVX1-SLOW: # %bb.0:870; AVX1-SLOW-NEXT: vextractf128 $1, %ymm0, %xmm0871; AVX1-SLOW-NEXT: vmovd %xmm0, %ecx872; AVX1-SLOW-NEXT: vpextrw $1, %xmm0, %eax873; AVX1-SLOW-NEXT: addl %ecx, %eax874; AVX1-SLOW-NEXT: # kill: def $ax killed $ax killed $eax875; AVX1-SLOW-NEXT: vzeroupper876; AVX1-SLOW-NEXT: retq877;878; AVX1-FAST-LABEL: extract_extract89_v16i16_add_i16:879; AVX1-FAST: # %bb.0:880; AVX1-FAST-NEXT: vextractf128 $1, %ymm0, %xmm0881; AVX1-FAST-NEXT: vphaddw %xmm0, %xmm0, %xmm0882; AVX1-FAST-NEXT: vmovd %xmm0, %eax883; AVX1-FAST-NEXT: # kill: def $ax killed $ax killed $eax884; AVX1-FAST-NEXT: vzeroupper885; AVX1-FAST-NEXT: retq886;887; AVX2-SLOW-LABEL: extract_extract89_v16i16_add_i16:888; AVX2-SLOW: # %bb.0:889; AVX2-SLOW-NEXT: vextracti128 $1, %ymm0, %xmm0890; AVX2-SLOW-NEXT: vmovd %xmm0, %ecx891; AVX2-SLOW-NEXT: vpextrw $1, %xmm0, %eax892; AVX2-SLOW-NEXT: addl %ecx, %eax893; AVX2-SLOW-NEXT: # kill: def $ax killed $ax killed $eax894; AVX2-SLOW-NEXT: vzeroupper895; AVX2-SLOW-NEXT: retq896;897; AVX2-FAST-LABEL: extract_extract89_v16i16_add_i16:898; AVX2-FAST: # %bb.0:899; AVX2-FAST-NEXT: vextracti128 $1, %ymm0, %xmm0900; AVX2-FAST-NEXT: vphaddw %xmm0, %xmm0, %xmm0901; AVX2-FAST-NEXT: vmovd %xmm0, %eax902; AVX2-FAST-NEXT: # kill: def $ax killed $ax killed $eax903; AVX2-FAST-NEXT: vzeroupper904; AVX2-FAST-NEXT: retq905;906; AVX512-SLOW-LABEL: extract_extract89_v16i16_add_i16:907; AVX512-SLOW: # %bb.0:908; AVX512-SLOW-NEXT: vextracti128 $1, %ymm0, %xmm0909; AVX512-SLOW-NEXT: vmovd %xmm0, %ecx910; AVX512-SLOW-NEXT: vpextrw $1, %xmm0, %eax911; AVX512-SLOW-NEXT: addl %ecx, %eax912; AVX512-SLOW-NEXT: # kill: def $ax killed $ax killed $eax913; AVX512-SLOW-NEXT: vzeroupper914; AVX512-SLOW-NEXT: retq915;916; AVX512-FAST-LABEL: extract_extract89_v16i16_add_i16:917; AVX512-FAST: # %bb.0:918; AVX512-FAST-NEXT: vextracti128 $1, %ymm0, %xmm0919; AVX512-FAST-NEXT: vphaddw %xmm0, %xmm0, %xmm0920; AVX512-FAST-NEXT: vmovd %xmm0, %eax921; AVX512-FAST-NEXT: # kill: def $ax killed $ax killed $eax922; AVX512-FAST-NEXT: vzeroupper923; AVX512-FAST-NEXT: retq924 %x0 = extractelement <16 x i16> %x, i32 8925 %x1 = extractelement <16 x i16> %x, i32 9926 %x01 = add i16 %x0, %x1927 ret i16 %x01928}929 930define i16 @extract_extract01_v16i16_add_i16_commute(<16 x i16> %x) {931; SSE3-SLOW-LABEL: extract_extract01_v16i16_add_i16_commute:932; SSE3-SLOW: # %bb.0:933; SSE3-SLOW-NEXT: movd %xmm0, %ecx934; SSE3-SLOW-NEXT: pextrw $1, %xmm0, %eax935; SSE3-SLOW-NEXT: addl %ecx, %eax936; SSE3-SLOW-NEXT: # kill: def $ax killed $ax killed $eax937; SSE3-SLOW-NEXT: retq938;939; SSE3-FAST-LABEL: extract_extract01_v16i16_add_i16_commute:940; SSE3-FAST: # %bb.0:941; SSE3-FAST-NEXT: phaddw %xmm0, %xmm0942; SSE3-FAST-NEXT: movd %xmm0, %eax943; SSE3-FAST-NEXT: # kill: def $ax killed $ax killed $eax944; SSE3-FAST-NEXT: retq945;946; AVX-SLOW-LABEL: extract_extract01_v16i16_add_i16_commute:947; AVX-SLOW: # %bb.0:948; AVX-SLOW-NEXT: vmovd %xmm0, %ecx949; AVX-SLOW-NEXT: vpextrw $1, %xmm0, %eax950; AVX-SLOW-NEXT: addl %ecx, %eax951; AVX-SLOW-NEXT: # kill: def $ax killed $ax killed $eax952; AVX-SLOW-NEXT: vzeroupper953; AVX-SLOW-NEXT: retq954;955; AVX-FAST-LABEL: extract_extract01_v16i16_add_i16_commute:956; AVX-FAST: # %bb.0:957; AVX-FAST-NEXT: vphaddw %xmm0, %xmm0, %xmm0958; AVX-FAST-NEXT: vmovd %xmm0, %eax959; AVX-FAST-NEXT: # kill: def $ax killed $ax killed $eax960; AVX-FAST-NEXT: vzeroupper961; AVX-FAST-NEXT: retq962 %x0 = extractelement <16 x i16> %x, i32 0963 %x1 = extractelement <16 x i16> %x, i32 1964 %x01 = add i16 %x1, %x0965 ret i16 %x01966}967 968define i16 @extract_extract45_v16i16_add_i16_commute(<16 x i16> %x) {969; SSE3-SLOW-LABEL: extract_extract45_v16i16_add_i16_commute:970; SSE3-SLOW: # %bb.0:971; SSE3-SLOW-NEXT: pextrw $4, %xmm0, %ecx972; SSE3-SLOW-NEXT: pextrw $5, %xmm0, %eax973; SSE3-SLOW-NEXT: addl %ecx, %eax974; SSE3-SLOW-NEXT: # kill: def $ax killed $ax killed $eax975; SSE3-SLOW-NEXT: retq976;977; SSE3-FAST-LABEL: extract_extract45_v16i16_add_i16_commute:978; SSE3-FAST: # %bb.0:979; SSE3-FAST-NEXT: phaddw %xmm0, %xmm0980; SSE3-FAST-NEXT: pextrw $2, %xmm0, %eax981; SSE3-FAST-NEXT: # kill: def $ax killed $ax killed $eax982; SSE3-FAST-NEXT: retq983;984; AVX-SLOW-LABEL: extract_extract45_v16i16_add_i16_commute:985; AVX-SLOW: # %bb.0:986; AVX-SLOW-NEXT: vpextrw $4, %xmm0, %ecx987; AVX-SLOW-NEXT: vpextrw $5, %xmm0, %eax988; AVX-SLOW-NEXT: addl %ecx, %eax989; AVX-SLOW-NEXT: # kill: def $ax killed $ax killed $eax990; AVX-SLOW-NEXT: vzeroupper991; AVX-SLOW-NEXT: retq992;993; AVX-FAST-LABEL: extract_extract45_v16i16_add_i16_commute:994; AVX-FAST: # %bb.0:995; AVX-FAST-NEXT: vphaddw %xmm0, %xmm0, %xmm0996; AVX-FAST-NEXT: vpextrw $2, %xmm0, %eax997; AVX-FAST-NEXT: # kill: def $ax killed $ax killed $eax998; AVX-FAST-NEXT: vzeroupper999; AVX-FAST-NEXT: retq1000 %x0 = extractelement <16 x i16> %x, i32 41001 %x1 = extractelement <16 x i16> %x, i32 51002 %x01 = add i16 %x1, %x01003 ret i16 %x011004}1005 1006define i16 @extract_extract89_v16i16_add_i16_commute(<16 x i16> %x) {1007; SSE3-SLOW-LABEL: extract_extract89_v16i16_add_i16_commute:1008; SSE3-SLOW: # %bb.0:1009; SSE3-SLOW-NEXT: movd %xmm1, %ecx1010; SSE3-SLOW-NEXT: pextrw $1, %xmm1, %eax1011; SSE3-SLOW-NEXT: addl %ecx, %eax1012; SSE3-SLOW-NEXT: # kill: def $ax killed $ax killed $eax1013; SSE3-SLOW-NEXT: retq1014;1015; SSE3-FAST-LABEL: extract_extract89_v16i16_add_i16_commute:1016; SSE3-FAST: # %bb.0:1017; SSE3-FAST-NEXT: phaddw %xmm1, %xmm11018; SSE3-FAST-NEXT: movd %xmm1, %eax1019; SSE3-FAST-NEXT: # kill: def $ax killed $ax killed $eax1020; SSE3-FAST-NEXT: retq1021;1022; AVX1-SLOW-LABEL: extract_extract89_v16i16_add_i16_commute:1023; AVX1-SLOW: # %bb.0:1024; AVX1-SLOW-NEXT: vextractf128 $1, %ymm0, %xmm01025; AVX1-SLOW-NEXT: vmovd %xmm0, %ecx1026; AVX1-SLOW-NEXT: vpextrw $1, %xmm0, %eax1027; AVX1-SLOW-NEXT: addl %ecx, %eax1028; AVX1-SLOW-NEXT: # kill: def $ax killed $ax killed $eax1029; AVX1-SLOW-NEXT: vzeroupper1030; AVX1-SLOW-NEXT: retq1031;1032; AVX1-FAST-LABEL: extract_extract89_v16i16_add_i16_commute:1033; AVX1-FAST: # %bb.0:1034; AVX1-FAST-NEXT: vextractf128 $1, %ymm0, %xmm01035; AVX1-FAST-NEXT: vphaddw %xmm0, %xmm0, %xmm01036; AVX1-FAST-NEXT: vmovd %xmm0, %eax1037; AVX1-FAST-NEXT: # kill: def $ax killed $ax killed $eax1038; AVX1-FAST-NEXT: vzeroupper1039; AVX1-FAST-NEXT: retq1040;1041; AVX2-SLOW-LABEL: extract_extract89_v16i16_add_i16_commute:1042; AVX2-SLOW: # %bb.0:1043; AVX2-SLOW-NEXT: vextracti128 $1, %ymm0, %xmm01044; AVX2-SLOW-NEXT: vmovd %xmm0, %ecx1045; AVX2-SLOW-NEXT: vpextrw $1, %xmm0, %eax1046; AVX2-SLOW-NEXT: addl %ecx, %eax1047; AVX2-SLOW-NEXT: # kill: def $ax killed $ax killed $eax1048; AVX2-SLOW-NEXT: vzeroupper1049; AVX2-SLOW-NEXT: retq1050;1051; AVX2-FAST-LABEL: extract_extract89_v16i16_add_i16_commute:1052; AVX2-FAST: # %bb.0:1053; AVX2-FAST-NEXT: vextracti128 $1, %ymm0, %xmm01054; AVX2-FAST-NEXT: vphaddw %xmm0, %xmm0, %xmm01055; AVX2-FAST-NEXT: vmovd %xmm0, %eax1056; AVX2-FAST-NEXT: # kill: def $ax killed $ax killed $eax1057; AVX2-FAST-NEXT: vzeroupper1058; AVX2-FAST-NEXT: retq1059;1060; AVX512-SLOW-LABEL: extract_extract89_v16i16_add_i16_commute:1061; AVX512-SLOW: # %bb.0:1062; AVX512-SLOW-NEXT: vextracti128 $1, %ymm0, %xmm01063; AVX512-SLOW-NEXT: vmovd %xmm0, %ecx1064; AVX512-SLOW-NEXT: vpextrw $1, %xmm0, %eax1065; AVX512-SLOW-NEXT: addl %ecx, %eax1066; AVX512-SLOW-NEXT: # kill: def $ax killed $ax killed $eax1067; AVX512-SLOW-NEXT: vzeroupper1068; AVX512-SLOW-NEXT: retq1069;1070; AVX512-FAST-LABEL: extract_extract89_v16i16_add_i16_commute:1071; AVX512-FAST: # %bb.0:1072; AVX512-FAST-NEXT: vextracti128 $1, %ymm0, %xmm01073; AVX512-FAST-NEXT: vphaddw %xmm0, %xmm0, %xmm01074; AVX512-FAST-NEXT: vmovd %xmm0, %eax1075; AVX512-FAST-NEXT: # kill: def $ax killed $ax killed $eax1076; AVX512-FAST-NEXT: vzeroupper1077; AVX512-FAST-NEXT: retq1078 %x0 = extractelement <16 x i16> %x, i32 81079 %x1 = extractelement <16 x i16> %x, i32 91080 %x01 = add i16 %x1, %x01081 ret i16 %x011082}1083 1084define i32 @extract_extract01_v8i32_sub_i32(<8 x i32> %x) {1085; SSE3-SLOW-LABEL: extract_extract01_v8i32_sub_i32:1086; SSE3-SLOW: # %bb.0:1087; SSE3-SLOW-NEXT: movd %xmm0, %eax1088; SSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]1089; SSE3-SLOW-NEXT: movd %xmm0, %ecx1090; SSE3-SLOW-NEXT: subl %ecx, %eax1091; SSE3-SLOW-NEXT: retq1092;1093; SSE3-FAST-LABEL: extract_extract01_v8i32_sub_i32:1094; SSE3-FAST: # %bb.0:1095; SSE3-FAST-NEXT: phsubd %xmm0, %xmm01096; SSE3-FAST-NEXT: movd %xmm0, %eax1097; SSE3-FAST-NEXT: retq1098;1099; AVX-SLOW-LABEL: extract_extract01_v8i32_sub_i32:1100; AVX-SLOW: # %bb.0:1101; AVX-SLOW-NEXT: vmovd %xmm0, %eax1102; AVX-SLOW-NEXT: vpextrd $1, %xmm0, %ecx1103; AVX-SLOW-NEXT: subl %ecx, %eax1104; AVX-SLOW-NEXT: vzeroupper1105; AVX-SLOW-NEXT: retq1106;1107; AVX-FAST-LABEL: extract_extract01_v8i32_sub_i32:1108; AVX-FAST: # %bb.0:1109; AVX-FAST-NEXT: vphsubd %xmm0, %xmm0, %xmm01110; AVX-FAST-NEXT: vmovd %xmm0, %eax1111; AVX-FAST-NEXT: vzeroupper1112; AVX-FAST-NEXT: retq1113 %x0 = extractelement <8 x i32> %x, i32 01114 %x1 = extractelement <8 x i32> %x, i32 11115 %x01 = sub i32 %x0, %x11116 ret i32 %x011117}1118 1119define i32 @extract_extract23_v8i32_sub_i32(<8 x i32> %x) {1120; SSE3-SLOW-LABEL: extract_extract23_v8i32_sub_i32:1121; SSE3-SLOW: # %bb.0:1122; SSE3-SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1123; SSE3-SLOW-NEXT: movd %xmm1, %eax1124; SSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]1125; SSE3-SLOW-NEXT: movd %xmm0, %ecx1126; SSE3-SLOW-NEXT: subl %ecx, %eax1127; SSE3-SLOW-NEXT: retq1128;1129; SSE3-FAST-LABEL: extract_extract23_v8i32_sub_i32:1130; SSE3-FAST: # %bb.0:1131; SSE3-FAST-NEXT: phsubd %xmm0, %xmm01132; SSE3-FAST-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]1133; SSE3-FAST-NEXT: movd %xmm0, %eax1134; SSE3-FAST-NEXT: retq1135;1136; AVX-SLOW-LABEL: extract_extract23_v8i32_sub_i32:1137; AVX-SLOW: # %bb.0:1138; AVX-SLOW-NEXT: vextractps $2, %xmm0, %eax1139; AVX-SLOW-NEXT: vextractps $3, %xmm0, %ecx1140; AVX-SLOW-NEXT: subl %ecx, %eax1141; AVX-SLOW-NEXT: vzeroupper1142; AVX-SLOW-NEXT: retq1143;1144; AVX-FAST-LABEL: extract_extract23_v8i32_sub_i32:1145; AVX-FAST: # %bb.0:1146; AVX-FAST-NEXT: vphsubd %xmm0, %xmm0, %xmm01147; AVX-FAST-NEXT: vpextrd $1, %xmm0, %eax1148; AVX-FAST-NEXT: vzeroupper1149; AVX-FAST-NEXT: retq1150 %x0 = extractelement <8 x i32> %x, i32 21151 %x1 = extractelement <8 x i32> %x, i32 31152 %x01 = sub i32 %x0, %x11153 ret i32 %x011154}1155 1156define i32 @extract_extract67_v8i32_sub_i32(<8 x i32> %x) {1157; SSE3-SLOW-LABEL: extract_extract67_v8i32_sub_i32:1158; SSE3-SLOW: # %bb.0:1159; SSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]1160; SSE3-SLOW-NEXT: movd %xmm0, %eax1161; SSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm1[3,3,3,3]1162; SSE3-SLOW-NEXT: movd %xmm0, %ecx1163; SSE3-SLOW-NEXT: subl %ecx, %eax1164; SSE3-SLOW-NEXT: retq1165;1166; SSE3-FAST-LABEL: extract_extract67_v8i32_sub_i32:1167; SSE3-FAST: # %bb.0:1168; SSE3-FAST-NEXT: phsubd %xmm1, %xmm11169; SSE3-FAST-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]1170; SSE3-FAST-NEXT: movd %xmm0, %eax1171; SSE3-FAST-NEXT: retq1172;1173; AVX-SLOW-LABEL: extract_extract67_v8i32_sub_i32:1174; AVX-SLOW: # %bb.0:1175; AVX-SLOW-NEXT: vextractf128 $1, %ymm0, %xmm01176; AVX-SLOW-NEXT: vextractps $2, %xmm0, %eax1177; AVX-SLOW-NEXT: vextractps $3, %xmm0, %ecx1178; AVX-SLOW-NEXT: subl %ecx, %eax1179; AVX-SLOW-NEXT: vzeroupper1180; AVX-SLOW-NEXT: retq1181;1182; AVX1-FAST-LABEL: extract_extract67_v8i32_sub_i32:1183; AVX1-FAST: # %bb.0:1184; AVX1-FAST-NEXT: vextractf128 $1, %ymm0, %xmm01185; AVX1-FAST-NEXT: vphsubd %xmm0, %xmm0, %xmm01186; AVX1-FAST-NEXT: vpextrd $1, %xmm0, %eax1187; AVX1-FAST-NEXT: vzeroupper1188; AVX1-FAST-NEXT: retq1189;1190; AVX2-FAST-LABEL: extract_extract67_v8i32_sub_i32:1191; AVX2-FAST: # %bb.0:1192; AVX2-FAST-NEXT: vextracti128 $1, %ymm0, %xmm01193; AVX2-FAST-NEXT: vphsubd %xmm0, %xmm0, %xmm01194; AVX2-FAST-NEXT: vpextrd $1, %xmm0, %eax1195; AVX2-FAST-NEXT: vzeroupper1196; AVX2-FAST-NEXT: retq1197;1198; AVX512-FAST-LABEL: extract_extract67_v8i32_sub_i32:1199; AVX512-FAST: # %bb.0:1200; AVX512-FAST-NEXT: vextracti128 $1, %ymm0, %xmm01201; AVX512-FAST-NEXT: vphsubd %xmm0, %xmm0, %xmm01202; AVX512-FAST-NEXT: vpextrd $1, %xmm0, %eax1203; AVX512-FAST-NEXT: vzeroupper1204; AVX512-FAST-NEXT: retq1205 %x0 = extractelement <8 x i32> %x, i32 61206 %x1 = extractelement <8 x i32> %x, i32 71207 %x01 = sub i32 %x0, %x11208 ret i32 %x011209}1210 1211; Negative test...or get hoppy and negate?1212 1213define i32 @extract_extract01_v8i32_sub_i32_commute(<8 x i32> %x) {1214; SSE3-LABEL: extract_extract01_v8i32_sub_i32_commute:1215; SSE3: # %bb.0:1216; SSE3-NEXT: movd %xmm0, %ecx1217; SSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]1218; SSE3-NEXT: movd %xmm0, %eax1219; SSE3-NEXT: subl %ecx, %eax1220; SSE3-NEXT: retq1221;1222; AVX-LABEL: extract_extract01_v8i32_sub_i32_commute:1223; AVX: # %bb.0:1224; AVX-NEXT: vmovd %xmm0, %ecx1225; AVX-NEXT: vpextrd $1, %xmm0, %eax1226; AVX-NEXT: subl %ecx, %eax1227; AVX-NEXT: vzeroupper1228; AVX-NEXT: retq1229 %x0 = extractelement <8 x i32> %x, i32 01230 %x1 = extractelement <8 x i32> %x, i32 11231 %x01 = sub i32 %x1, %x01232 ret i32 %x011233}1234 1235define i16 @extract_extract01_v16i16_sub_i16(<16 x i16> %x) {1236; SSE3-SLOW-LABEL: extract_extract01_v16i16_sub_i16:1237; SSE3-SLOW: # %bb.0:1238; SSE3-SLOW-NEXT: movd %xmm0, %eax1239; SSE3-SLOW-NEXT: pextrw $1, %xmm0, %ecx1240; SSE3-SLOW-NEXT: subl %ecx, %eax1241; SSE3-SLOW-NEXT: # kill: def $ax killed $ax killed $eax1242; SSE3-SLOW-NEXT: retq1243;1244; SSE3-FAST-LABEL: extract_extract01_v16i16_sub_i16:1245; SSE3-FAST: # %bb.0:1246; SSE3-FAST-NEXT: phsubw %xmm0, %xmm01247; SSE3-FAST-NEXT: movd %xmm0, %eax1248; SSE3-FAST-NEXT: # kill: def $ax killed $ax killed $eax1249; SSE3-FAST-NEXT: retq1250;1251; AVX-SLOW-LABEL: extract_extract01_v16i16_sub_i16:1252; AVX-SLOW: # %bb.0:1253; AVX-SLOW-NEXT: vmovd %xmm0, %eax1254; AVX-SLOW-NEXT: vpextrw $1, %xmm0, %ecx1255; AVX-SLOW-NEXT: subl %ecx, %eax1256; AVX-SLOW-NEXT: # kill: def $ax killed $ax killed $eax1257; AVX-SLOW-NEXT: vzeroupper1258; AVX-SLOW-NEXT: retq1259;1260; AVX-FAST-LABEL: extract_extract01_v16i16_sub_i16:1261; AVX-FAST: # %bb.0:1262; AVX-FAST-NEXT: vphsubw %xmm0, %xmm0, %xmm01263; AVX-FAST-NEXT: vmovd %xmm0, %eax1264; AVX-FAST-NEXT: # kill: def $ax killed $ax killed $eax1265; AVX-FAST-NEXT: vzeroupper1266; AVX-FAST-NEXT: retq1267 %x0 = extractelement <16 x i16> %x, i32 01268 %x1 = extractelement <16 x i16> %x, i32 11269 %x01 = sub i16 %x0, %x11270 ret i16 %x011271}1272 1273; Negative test...or get hoppy and negate?1274 1275define i16 @extract_extract01_v16i16_sub_i16_commute(<16 x i16> %x) {1276; SSE3-LABEL: extract_extract01_v16i16_sub_i16_commute:1277; SSE3: # %bb.0:1278; SSE3-NEXT: movd %xmm0, %ecx1279; SSE3-NEXT: pextrw $1, %xmm0, %eax1280; SSE3-NEXT: subl %ecx, %eax1281; SSE3-NEXT: # kill: def $ax killed $ax killed $eax1282; SSE3-NEXT: retq1283;1284; AVX-LABEL: extract_extract01_v16i16_sub_i16_commute:1285; AVX: # %bb.0:1286; AVX-NEXT: vmovd %xmm0, %ecx1287; AVX-NEXT: vpextrw $1, %xmm0, %eax1288; AVX-NEXT: subl %ecx, %eax1289; AVX-NEXT: # kill: def $ax killed $ax killed $eax1290; AVX-NEXT: vzeroupper1291; AVX-NEXT: retq1292 %x0 = extractelement <16 x i16> %x, i32 01293 %x1 = extractelement <16 x i16> %x, i32 11294 %x01 = sub i16 %x1, %x01295 ret i16 %x011296}1297 1298; 512-bit vectors, i32/i16, add/sub1299 1300define i32 @extract_extract01_v16i32_add_i32(<16 x i32> %x) {1301; SSE3-SLOW-LABEL: extract_extract01_v16i32_add_i32:1302; SSE3-SLOW: # %bb.0:1303; SSE3-SLOW-NEXT: movd %xmm0, %ecx1304; SSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]1305; SSE3-SLOW-NEXT: movd %xmm0, %eax1306; SSE3-SLOW-NEXT: addl %ecx, %eax1307; SSE3-SLOW-NEXT: retq1308;1309; SSE3-FAST-LABEL: extract_extract01_v16i32_add_i32:1310; SSE3-FAST: # %bb.0:1311; SSE3-FAST-NEXT: phaddd %xmm0, %xmm01312; SSE3-FAST-NEXT: movd %xmm0, %eax1313; SSE3-FAST-NEXT: retq1314;1315; AVX-SLOW-LABEL: extract_extract01_v16i32_add_i32:1316; AVX-SLOW: # %bb.0:1317; AVX-SLOW-NEXT: vmovd %xmm0, %ecx1318; AVX-SLOW-NEXT: vpextrd $1, %xmm0, %eax1319; AVX-SLOW-NEXT: addl %ecx, %eax1320; AVX-SLOW-NEXT: vzeroupper1321; AVX-SLOW-NEXT: retq1322;1323; AVX-FAST-LABEL: extract_extract01_v16i32_add_i32:1324; AVX-FAST: # %bb.0:1325; AVX-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm01326; AVX-FAST-NEXT: vmovd %xmm0, %eax1327; AVX-FAST-NEXT: vzeroupper1328; AVX-FAST-NEXT: retq1329 %x0 = extractelement <16 x i32> %x, i32 01330 %x1 = extractelement <16 x i32> %x, i32 11331 %x01 = add i32 %x0, %x11332 ret i32 %x011333}1334 1335define i32 @extract_extract01_v16i32_add_i32_commute(<16 x i32> %x) {1336; SSE3-SLOW-LABEL: extract_extract01_v16i32_add_i32_commute:1337; SSE3-SLOW: # %bb.0:1338; SSE3-SLOW-NEXT: movd %xmm0, %ecx1339; SSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]1340; SSE3-SLOW-NEXT: movd %xmm0, %eax1341; SSE3-SLOW-NEXT: addl %ecx, %eax1342; SSE3-SLOW-NEXT: retq1343;1344; SSE3-FAST-LABEL: extract_extract01_v16i32_add_i32_commute:1345; SSE3-FAST: # %bb.0:1346; SSE3-FAST-NEXT: phaddd %xmm0, %xmm01347; SSE3-FAST-NEXT: movd %xmm0, %eax1348; SSE3-FAST-NEXT: retq1349;1350; AVX-SLOW-LABEL: extract_extract01_v16i32_add_i32_commute:1351; AVX-SLOW: # %bb.0:1352; AVX-SLOW-NEXT: vmovd %xmm0, %ecx1353; AVX-SLOW-NEXT: vpextrd $1, %xmm0, %eax1354; AVX-SLOW-NEXT: addl %ecx, %eax1355; AVX-SLOW-NEXT: vzeroupper1356; AVX-SLOW-NEXT: retq1357;1358; AVX-FAST-LABEL: extract_extract01_v16i32_add_i32_commute:1359; AVX-FAST: # %bb.0:1360; AVX-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm01361; AVX-FAST-NEXT: vmovd %xmm0, %eax1362; AVX-FAST-NEXT: vzeroupper1363; AVX-FAST-NEXT: retq1364 %x0 = extractelement <16 x i32> %x, i32 01365 %x1 = extractelement <16 x i32> %x, i32 11366 %x01 = add i32 %x1, %x01367 ret i32 %x011368}1369 1370define i16 @extract_extract01_v32i16_add_i16(<32 x i16> %x) {1371; SSE3-SLOW-LABEL: extract_extract01_v32i16_add_i16:1372; SSE3-SLOW: # %bb.0:1373; SSE3-SLOW-NEXT: movd %xmm0, %ecx1374; SSE3-SLOW-NEXT: pextrw $1, %xmm0, %eax1375; SSE3-SLOW-NEXT: addl %ecx, %eax1376; SSE3-SLOW-NEXT: # kill: def $ax killed $ax killed $eax1377; SSE3-SLOW-NEXT: retq1378;1379; SSE3-FAST-LABEL: extract_extract01_v32i16_add_i16:1380; SSE3-FAST: # %bb.0:1381; SSE3-FAST-NEXT: phaddw %xmm0, %xmm01382; SSE3-FAST-NEXT: movd %xmm0, %eax1383; SSE3-FAST-NEXT: # kill: def $ax killed $ax killed $eax1384; SSE3-FAST-NEXT: retq1385;1386; AVX-SLOW-LABEL: extract_extract01_v32i16_add_i16:1387; AVX-SLOW: # %bb.0:1388; AVX-SLOW-NEXT: vmovd %xmm0, %ecx1389; AVX-SLOW-NEXT: vpextrw $1, %xmm0, %eax1390; AVX-SLOW-NEXT: addl %ecx, %eax1391; AVX-SLOW-NEXT: # kill: def $ax killed $ax killed $eax1392; AVX-SLOW-NEXT: vzeroupper1393; AVX-SLOW-NEXT: retq1394;1395; AVX-FAST-LABEL: extract_extract01_v32i16_add_i16:1396; AVX-FAST: # %bb.0:1397; AVX-FAST-NEXT: vphaddw %xmm0, %xmm0, %xmm01398; AVX-FAST-NEXT: vmovd %xmm0, %eax1399; AVX-FAST-NEXT: # kill: def $ax killed $ax killed $eax1400; AVX-FAST-NEXT: vzeroupper1401; AVX-FAST-NEXT: retq1402 %x0 = extractelement <32 x i16> %x, i32 01403 %x1 = extractelement <32 x i16> %x, i32 11404 %x01 = add i16 %x0, %x11405 ret i16 %x011406}1407 1408define i16 @extract_extract01_v32i16_add_i16_commute(<32 x i16> %x) {1409; SSE3-SLOW-LABEL: extract_extract01_v32i16_add_i16_commute:1410; SSE3-SLOW: # %bb.0:1411; SSE3-SLOW-NEXT: movd %xmm0, %ecx1412; SSE3-SLOW-NEXT: pextrw $1, %xmm0, %eax1413; SSE3-SLOW-NEXT: addl %ecx, %eax1414; SSE3-SLOW-NEXT: # kill: def $ax killed $ax killed $eax1415; SSE3-SLOW-NEXT: retq1416;1417; SSE3-FAST-LABEL: extract_extract01_v32i16_add_i16_commute:1418; SSE3-FAST: # %bb.0:1419; SSE3-FAST-NEXT: phaddw %xmm0, %xmm01420; SSE3-FAST-NEXT: movd %xmm0, %eax1421; SSE3-FAST-NEXT: # kill: def $ax killed $ax killed $eax1422; SSE3-FAST-NEXT: retq1423;1424; AVX-SLOW-LABEL: extract_extract01_v32i16_add_i16_commute:1425; AVX-SLOW: # %bb.0:1426; AVX-SLOW-NEXT: vmovd %xmm0, %ecx1427; AVX-SLOW-NEXT: vpextrw $1, %xmm0, %eax1428; AVX-SLOW-NEXT: addl %ecx, %eax1429; AVX-SLOW-NEXT: # kill: def $ax killed $ax killed $eax1430; AVX-SLOW-NEXT: vzeroupper1431; AVX-SLOW-NEXT: retq1432;1433; AVX-FAST-LABEL: extract_extract01_v32i16_add_i16_commute:1434; AVX-FAST: # %bb.0:1435; AVX-FAST-NEXT: vphaddw %xmm0, %xmm0, %xmm01436; AVX-FAST-NEXT: vmovd %xmm0, %eax1437; AVX-FAST-NEXT: # kill: def $ax killed $ax killed $eax1438; AVX-FAST-NEXT: vzeroupper1439; AVX-FAST-NEXT: retq1440 %x0 = extractelement <32 x i16> %x, i32 01441 %x1 = extractelement <32 x i16> %x, i32 11442 %x01 = add i16 %x1, %x01443 ret i16 %x011444}1445 1446define i32 @extract_extract01_v16i32_sub_i32(<16 x i32> %x) {1447; SSE3-SLOW-LABEL: extract_extract01_v16i32_sub_i32:1448; SSE3-SLOW: # %bb.0:1449; SSE3-SLOW-NEXT: movd %xmm0, %eax1450; SSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]1451; SSE3-SLOW-NEXT: movd %xmm0, %ecx1452; SSE3-SLOW-NEXT: subl %ecx, %eax1453; SSE3-SLOW-NEXT: retq1454;1455; SSE3-FAST-LABEL: extract_extract01_v16i32_sub_i32:1456; SSE3-FAST: # %bb.0:1457; SSE3-FAST-NEXT: phsubd %xmm0, %xmm01458; SSE3-FAST-NEXT: movd %xmm0, %eax1459; SSE3-FAST-NEXT: retq1460;1461; AVX-SLOW-LABEL: extract_extract01_v16i32_sub_i32:1462; AVX-SLOW: # %bb.0:1463; AVX-SLOW-NEXT: vmovd %xmm0, %eax1464; AVX-SLOW-NEXT: vpextrd $1, %xmm0, %ecx1465; AVX-SLOW-NEXT: subl %ecx, %eax1466; AVX-SLOW-NEXT: vzeroupper1467; AVX-SLOW-NEXT: retq1468;1469; AVX-FAST-LABEL: extract_extract01_v16i32_sub_i32:1470; AVX-FAST: # %bb.0:1471; AVX-FAST-NEXT: vphsubd %xmm0, %xmm0, %xmm01472; AVX-FAST-NEXT: vmovd %xmm0, %eax1473; AVX-FAST-NEXT: vzeroupper1474; AVX-FAST-NEXT: retq1475 %x0 = extractelement <16 x i32> %x, i32 01476 %x1 = extractelement <16 x i32> %x, i32 11477 %x01 = sub i32 %x0, %x11478 ret i32 %x011479}1480 1481define i32 @extract_extract01_v16i32_sub_i32_commute(<16 x i32> %x) {1482; SSE3-LABEL: extract_extract01_v16i32_sub_i32_commute:1483; SSE3: # %bb.0:1484; SSE3-NEXT: movd %xmm0, %ecx1485; SSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]1486; SSE3-NEXT: movd %xmm0, %eax1487; SSE3-NEXT: subl %ecx, %eax1488; SSE3-NEXT: retq1489;1490; AVX-LABEL: extract_extract01_v16i32_sub_i32_commute:1491; AVX: # %bb.0:1492; AVX-NEXT: vmovd %xmm0, %ecx1493; AVX-NEXT: vpextrd $1, %xmm0, %eax1494; AVX-NEXT: subl %ecx, %eax1495; AVX-NEXT: vzeroupper1496; AVX-NEXT: retq1497 %x0 = extractelement <16 x i32> %x, i32 01498 %x1 = extractelement <16 x i32> %x, i32 11499 %x01 = sub i32 %x1, %x01500 ret i32 %x011501}1502 1503define i16 @extract_extract01_v32i16_sub_i16(<32 x i16> %x) {1504; SSE3-SLOW-LABEL: extract_extract01_v32i16_sub_i16:1505; SSE3-SLOW: # %bb.0:1506; SSE3-SLOW-NEXT: movd %xmm0, %eax1507; SSE3-SLOW-NEXT: pextrw $1, %xmm0, %ecx1508; SSE3-SLOW-NEXT: subl %ecx, %eax1509; SSE3-SLOW-NEXT: # kill: def $ax killed $ax killed $eax1510; SSE3-SLOW-NEXT: retq1511;1512; SSE3-FAST-LABEL: extract_extract01_v32i16_sub_i16:1513; SSE3-FAST: # %bb.0:1514; SSE3-FAST-NEXT: phsubw %xmm0, %xmm01515; SSE3-FAST-NEXT: movd %xmm0, %eax1516; SSE3-FAST-NEXT: # kill: def $ax killed $ax killed $eax1517; SSE3-FAST-NEXT: retq1518;1519; AVX-SLOW-LABEL: extract_extract01_v32i16_sub_i16:1520; AVX-SLOW: # %bb.0:1521; AVX-SLOW-NEXT: vmovd %xmm0, %eax1522; AVX-SLOW-NEXT: vpextrw $1, %xmm0, %ecx1523; AVX-SLOW-NEXT: subl %ecx, %eax1524; AVX-SLOW-NEXT: # kill: def $ax killed $ax killed $eax1525; AVX-SLOW-NEXT: vzeroupper1526; AVX-SLOW-NEXT: retq1527;1528; AVX-FAST-LABEL: extract_extract01_v32i16_sub_i16:1529; AVX-FAST: # %bb.0:1530; AVX-FAST-NEXT: vphsubw %xmm0, %xmm0, %xmm01531; AVX-FAST-NEXT: vmovd %xmm0, %eax1532; AVX-FAST-NEXT: # kill: def $ax killed $ax killed $eax1533; AVX-FAST-NEXT: vzeroupper1534; AVX-FAST-NEXT: retq1535 %x0 = extractelement <32 x i16> %x, i32 01536 %x1 = extractelement <32 x i16> %x, i32 11537 %x01 = sub i16 %x0, %x11538 ret i16 %x011539}1540 1541define i16 @extract_extract01_v32i16_sub_i16_commute(<32 x i16> %x) {1542; SSE3-LABEL: extract_extract01_v32i16_sub_i16_commute:1543; SSE3: # %bb.0:1544; SSE3-NEXT: movd %xmm0, %ecx1545; SSE3-NEXT: pextrw $1, %xmm0, %eax1546; SSE3-NEXT: subl %ecx, %eax1547; SSE3-NEXT: # kill: def $ax killed $ax killed $eax1548; SSE3-NEXT: retq1549;1550; AVX-LABEL: extract_extract01_v32i16_sub_i16_commute:1551; AVX: # %bb.0:1552; AVX-NEXT: vmovd %xmm0, %ecx1553; AVX-NEXT: vpextrw $1, %xmm0, %eax1554; AVX-NEXT: subl %ecx, %eax1555; AVX-NEXT: # kill: def $ax killed $ax killed $eax1556; AVX-NEXT: vzeroupper1557; AVX-NEXT: retq1558 %x0 = extractelement <32 x i16> %x, i32 01559 %x1 = extractelement <32 x i16> %x, i32 11560 %x01 = sub i16 %x1, %x01561 ret i16 %x011562}1563 1564; Check output when 1 or both extracts have extra uses.1565 1566define i32 @extract_extract01_v4i32_add_i32_uses1(<4 x i32> %x, ptr %p) {1567; SSE3-SLOW-LABEL: extract_extract01_v4i32_add_i32_uses1:1568; SSE3-SLOW: # %bb.0:1569; SSE3-SLOW-NEXT: movd %xmm0, %ecx1570; SSE3-SLOW-NEXT: movd %xmm0, (%rdi)1571; SSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]1572; SSE3-SLOW-NEXT: movd %xmm0, %eax1573; SSE3-SLOW-NEXT: addl %ecx, %eax1574; SSE3-SLOW-NEXT: retq1575;1576; SSE3-FAST-LABEL: extract_extract01_v4i32_add_i32_uses1:1577; SSE3-FAST: # %bb.0:1578; SSE3-FAST-NEXT: movd %xmm0, (%rdi)1579; SSE3-FAST-NEXT: phaddd %xmm0, %xmm01580; SSE3-FAST-NEXT: movd %xmm0, %eax1581; SSE3-FAST-NEXT: retq1582;1583; AVX-SLOW-LABEL: extract_extract01_v4i32_add_i32_uses1:1584; AVX-SLOW: # %bb.0:1585; AVX-SLOW-NEXT: vmovd %xmm0, %ecx1586; AVX-SLOW-NEXT: vmovd %xmm0, (%rdi)1587; AVX-SLOW-NEXT: vpextrd $1, %xmm0, %eax1588; AVX-SLOW-NEXT: addl %ecx, %eax1589; AVX-SLOW-NEXT: retq1590;1591; AVX-FAST-LABEL: extract_extract01_v4i32_add_i32_uses1:1592; AVX-FAST: # %bb.0:1593; AVX-FAST-NEXT: vmovd %xmm0, (%rdi)1594; AVX-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm01595; AVX-FAST-NEXT: vmovd %xmm0, %eax1596; AVX-FAST-NEXT: retq1597 %x0 = extractelement <4 x i32> %x, i32 01598 store i32 %x0, ptr %p1599 %x1 = extractelement <4 x i32> %x, i32 11600 %x01 = add i32 %x0, %x11601 ret i32 %x011602}1603 1604define i32 @extract_extract01_v4i32_add_i32_uses2(<4 x i32> %x, ptr %p) {1605; SSE3-SLOW-LABEL: extract_extract01_v4i32_add_i32_uses2:1606; SSE3-SLOW: # %bb.0:1607; SSE3-SLOW-NEXT: movd %xmm0, %ecx1608; SSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]1609; SSE3-SLOW-NEXT: movd %xmm0, %eax1610; SSE3-SLOW-NEXT: addl %ecx, %eax1611; SSE3-SLOW-NEXT: movd %xmm0, (%rdi)1612; SSE3-SLOW-NEXT: retq1613;1614; SSE3-FAST-LABEL: extract_extract01_v4i32_add_i32_uses2:1615; SSE3-FAST: # %bb.0:1616; SSE3-FAST-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1617; SSE3-FAST-NEXT: movd %xmm1, (%rdi)1618; SSE3-FAST-NEXT: phaddd %xmm0, %xmm01619; SSE3-FAST-NEXT: movd %xmm0, %eax1620; SSE3-FAST-NEXT: retq1621;1622; AVX-SLOW-LABEL: extract_extract01_v4i32_add_i32_uses2:1623; AVX-SLOW: # %bb.0:1624; AVX-SLOW-NEXT: vmovd %xmm0, %ecx1625; AVX-SLOW-NEXT: vpextrd $1, %xmm0, %eax1626; AVX-SLOW-NEXT: addl %ecx, %eax1627; AVX-SLOW-NEXT: vpextrd $1, %xmm0, (%rdi)1628; AVX-SLOW-NEXT: retq1629;1630; AVX-FAST-LABEL: extract_extract01_v4i32_add_i32_uses2:1631; AVX-FAST: # %bb.0:1632; AVX-FAST-NEXT: vpextrd $1, %xmm0, (%rdi)1633; AVX-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm01634; AVX-FAST-NEXT: vmovd %xmm0, %eax1635; AVX-FAST-NEXT: retq1636 %x0 = extractelement <4 x i32> %x, i32 01637 %x1 = extractelement <4 x i32> %x, i32 11638 store i32 %x1, ptr %p1639 %x01 = add i32 %x0, %x11640 ret i32 %x011641}1642 1643define i32 @extract_extract01_v4i32_add_i32_uses3(<4 x i32> %x, ptr %p1, ptr %p2) {1644; SSE3-LABEL: extract_extract01_v4i32_add_i32_uses3:1645; SSE3: # %bb.0:1646; SSE3-NEXT: movd %xmm0, %ecx1647; SSE3-NEXT: movd %xmm0, (%rdi)1648; SSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]1649; SSE3-NEXT: movd %xmm0, %eax1650; SSE3-NEXT: addl %ecx, %eax1651; SSE3-NEXT: movd %xmm0, (%rsi)1652; SSE3-NEXT: retq1653;1654; AVX-LABEL: extract_extract01_v4i32_add_i32_uses3:1655; AVX: # %bb.0:1656; AVX-NEXT: vmovd %xmm0, %ecx1657; AVX-NEXT: vmovd %xmm0, (%rdi)1658; AVX-NEXT: vpextrd $1, %xmm0, %eax1659; AVX-NEXT: addl %ecx, %eax1660; AVX-NEXT: vpextrd $1, %xmm0, (%rsi)1661; AVX-NEXT: retq1662 %x0 = extractelement <4 x i32> %x, i32 01663 store i32 %x0, ptr %p11664 %x1 = extractelement <4 x i32> %x, i32 11665 store i32 %x1, ptr %p21666 %x01 = add i32 %x0, %x11667 ret i32 %x011668}1669 1670; PR33758: https://bugs.llvm.org/show_bug.cgi?id=337581671 1672define i32 @partial_reduction_add_v8i32(<8 x i32> %x) {1673; SSE3-SLOW-LABEL: partial_reduction_add_v8i32:1674; SSE3-SLOW: # %bb.0:1675; SSE3-SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1676; SSE3-SLOW-NEXT: paddd %xmm0, %xmm11677; SSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]1678; SSE3-SLOW-NEXT: paddd %xmm1, %xmm01679; SSE3-SLOW-NEXT: movd %xmm0, %eax1680; SSE3-SLOW-NEXT: retq1681;1682; SSE3-FAST-LABEL: partial_reduction_add_v8i32:1683; SSE3-FAST: # %bb.0:1684; SSE3-FAST-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1685; SSE3-FAST-NEXT: paddd %xmm0, %xmm11686; SSE3-FAST-NEXT: phaddd %xmm1, %xmm11687; SSE3-FAST-NEXT: movd %xmm1, %eax1688; SSE3-FAST-NEXT: retq1689;1690; AVX-SLOW-LABEL: partial_reduction_add_v8i32:1691; AVX-SLOW: # %bb.0:1692; AVX-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1693; AVX-SLOW-NEXT: vpaddd %xmm1, %xmm0, %xmm01694; AVX-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1695; AVX-SLOW-NEXT: vpaddd %xmm1, %xmm0, %xmm01696; AVX-SLOW-NEXT: vmovd %xmm0, %eax1697; AVX-SLOW-NEXT: vzeroupper1698; AVX-SLOW-NEXT: retq1699;1700; AVX-FAST-LABEL: partial_reduction_add_v8i32:1701; AVX-FAST: # %bb.0:1702; AVX-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm01703; AVX-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm01704; AVX-FAST-NEXT: vmovd %xmm0, %eax1705; AVX-FAST-NEXT: vzeroupper1706; AVX-FAST-NEXT: retq1707 %x23 = shufflevector <8 x i32> %x, <8 x i32> undef, <8 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>1708 %x0213 = add <8 x i32> %x, %x231709 %x13 = shufflevector <8 x i32> %x0213, <8 x i32> undef, <8 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>1710 %x0123 = add <8 x i32> %x0213, %x131711 %r = extractelement <8 x i32> %x0123, i32 01712 ret i32 %r1713}1714 1715define i32 @partial_reduction_add_v16i32(<16 x i32> %x) {1716; SSE3-SLOW-LABEL: partial_reduction_add_v16i32:1717; SSE3-SLOW: # %bb.0:1718; SSE3-SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1719; SSE3-SLOW-NEXT: paddd %xmm0, %xmm11720; SSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]1721; SSE3-SLOW-NEXT: paddd %xmm1, %xmm01722; SSE3-SLOW-NEXT: movd %xmm0, %eax1723; SSE3-SLOW-NEXT: retq1724;1725; SSE3-FAST-LABEL: partial_reduction_add_v16i32:1726; SSE3-FAST: # %bb.0:1727; SSE3-FAST-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1728; SSE3-FAST-NEXT: paddd %xmm0, %xmm11729; SSE3-FAST-NEXT: phaddd %xmm1, %xmm11730; SSE3-FAST-NEXT: movd %xmm1, %eax1731; SSE3-FAST-NEXT: retq1732;1733; AVX-SLOW-LABEL: partial_reduction_add_v16i32:1734; AVX-SLOW: # %bb.0:1735; AVX-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1736; AVX-SLOW-NEXT: vpaddd %xmm1, %xmm0, %xmm01737; AVX-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1738; AVX-SLOW-NEXT: vpaddd %xmm1, %xmm0, %xmm01739; AVX-SLOW-NEXT: vmovd %xmm0, %eax1740; AVX-SLOW-NEXT: vzeroupper1741; AVX-SLOW-NEXT: retq1742;1743; AVX-FAST-LABEL: partial_reduction_add_v16i32:1744; AVX-FAST: # %bb.0:1745; AVX-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm01746; AVX-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm01747; AVX-FAST-NEXT: vmovd %xmm0, %eax1748; AVX-FAST-NEXT: vzeroupper1749; AVX-FAST-NEXT: retq1750 %x23 = shufflevector <16 x i32> %x, <16 x i32> undef, <16 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>1751 %x0213 = add <16 x i32> %x, %x231752 %x13 = shufflevector <16 x i32> %x0213, <16 x i32> undef, <16 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>1753 %x0123 = add <16 x i32> %x0213, %x131754 %r = extractelement <16 x i32> %x0123, i32 01755 ret i32 %r1756}1757 1758define i32 @partial_reduction_sub_v8i32(<8 x i32> %x) {1759; SSE3-SLOW-LABEL: partial_reduction_sub_v8i32:1760; SSE3-SLOW: # %bb.0:1761; SSE3-SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1762; SSE3-SLOW-NEXT: psubd %xmm1, %xmm01763; SSE3-SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1764; SSE3-SLOW-NEXT: psubd %xmm1, %xmm01765; SSE3-SLOW-NEXT: movd %xmm0, %eax1766; SSE3-SLOW-NEXT: retq1767;1768; SSE3-FAST-LABEL: partial_reduction_sub_v8i32:1769; SSE3-FAST: # %bb.0:1770; SSE3-FAST-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1771; SSE3-FAST-NEXT: psubd %xmm1, %xmm01772; SSE3-FAST-NEXT: phsubd %xmm0, %xmm01773; SSE3-FAST-NEXT: movd %xmm0, %eax1774; SSE3-FAST-NEXT: retq1775;1776; AVX-SLOW-LABEL: partial_reduction_sub_v8i32:1777; AVX-SLOW: # %bb.0:1778; AVX-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1779; AVX-SLOW-NEXT: vpsubd %xmm1, %xmm0, %xmm01780; AVX-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1781; AVX-SLOW-NEXT: vpsubd %xmm1, %xmm0, %xmm01782; AVX-SLOW-NEXT: vmovd %xmm0, %eax1783; AVX-SLOW-NEXT: vzeroupper1784; AVX-SLOW-NEXT: retq1785;1786; AVX-FAST-LABEL: partial_reduction_sub_v8i32:1787; AVX-FAST: # %bb.0:1788; AVX-FAST-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1789; AVX-FAST-NEXT: vpsubd %xmm1, %xmm0, %xmm01790; AVX-FAST-NEXT: vphsubd %xmm0, %xmm0, %xmm01791; AVX-FAST-NEXT: vmovd %xmm0, %eax1792; AVX-FAST-NEXT: vzeroupper1793; AVX-FAST-NEXT: retq1794 %x23 = shufflevector <8 x i32> %x, <8 x i32> undef, <8 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>1795 %x0213 = sub <8 x i32> %x, %x231796 %x13 = shufflevector <8 x i32> %x0213, <8 x i32> undef, <8 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>1797 %x0123 = sub <8 x i32> %x0213, %x131798 %r = extractelement <8 x i32> %x0123, i32 01799 ret i32 %r1800}1801 1802define i32 @partial_reduction_sub_v16i32(<16 x i32> %x) {1803; SSE3-SLOW-LABEL: partial_reduction_sub_v16i32:1804; SSE3-SLOW: # %bb.0:1805; SSE3-SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1806; SSE3-SLOW-NEXT: psubd %xmm1, %xmm01807; SSE3-SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1808; SSE3-SLOW-NEXT: psubd %xmm1, %xmm01809; SSE3-SLOW-NEXT: movd %xmm0, %eax1810; SSE3-SLOW-NEXT: retq1811;1812; SSE3-FAST-LABEL: partial_reduction_sub_v16i32:1813; SSE3-FAST: # %bb.0:1814; SSE3-FAST-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1815; SSE3-FAST-NEXT: psubd %xmm1, %xmm01816; SSE3-FAST-NEXT: phsubd %xmm0, %xmm01817; SSE3-FAST-NEXT: movd %xmm0, %eax1818; SSE3-FAST-NEXT: retq1819;1820; AVX-SLOW-LABEL: partial_reduction_sub_v16i32:1821; AVX-SLOW: # %bb.0:1822; AVX-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1823; AVX-SLOW-NEXT: vpsubd %xmm1, %xmm0, %xmm01824; AVX-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1825; AVX-SLOW-NEXT: vpsubd %xmm1, %xmm0, %xmm01826; AVX-SLOW-NEXT: vmovd %xmm0, %eax1827; AVX-SLOW-NEXT: vzeroupper1828; AVX-SLOW-NEXT: retq1829;1830; AVX1-FAST-LABEL: partial_reduction_sub_v16i32:1831; AVX1-FAST: # %bb.0:1832; AVX1-FAST-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1833; AVX1-FAST-NEXT: vpsubd %xmm1, %xmm0, %xmm01834; AVX1-FAST-NEXT: vphsubd %xmm0, %xmm0, %xmm01835; AVX1-FAST-NEXT: vmovd %xmm0, %eax1836; AVX1-FAST-NEXT: vzeroupper1837; AVX1-FAST-NEXT: retq1838;1839; AVX2-FAST-LABEL: partial_reduction_sub_v16i32:1840; AVX2-FAST: # %bb.0:1841; AVX2-FAST-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1842; AVX2-FAST-NEXT: vpsubd %xmm1, %xmm0, %xmm01843; AVX2-FAST-NEXT: vphsubd %xmm0, %xmm0, %xmm01844; AVX2-FAST-NEXT: vmovd %xmm0, %eax1845; AVX2-FAST-NEXT: vzeroupper1846; AVX2-FAST-NEXT: retq1847;1848; AVX512-FAST-LABEL: partial_reduction_sub_v16i32:1849; AVX512-FAST: # %bb.0:1850; AVX512-FAST-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1851; AVX512-FAST-NEXT: vpsubd %xmm1, %xmm0, %xmm01852; AVX512-FAST-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1853; AVX512-FAST-NEXT: vpsubd %xmm1, %xmm0, %xmm01854; AVX512-FAST-NEXT: vmovd %xmm0, %eax1855; AVX512-FAST-NEXT: vzeroupper1856; AVX512-FAST-NEXT: retq1857 %x23 = shufflevector <16 x i32> %x, <16 x i32> undef, <16 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>1858 %x0213 = sub <16 x i32> %x, %x231859 %x13 = shufflevector <16 x i32> %x0213, <16 x i32> undef, <16 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>1860 %x0123 = sub <16 x i32> %x0213, %x131861 %r = extractelement <16 x i32> %x0123, i32 01862 ret i32 %r1863}1864 1865; https://bugs.chromium.org/p/chromium/issues/detail?id=11953531866define <2 x i64> @negative_extract_v16i16_v8i16(<4 x i64> %a0) {1867; SSE3-LABEL: negative_extract_v16i16_v8i16:1868; SSE3: # %bb.0:1869; SSE3-NEXT: paddw %xmm1, %xmm01870; SSE3-NEXT: retq1871;1872; AVX1-SLOW-LABEL: negative_extract_v16i16_v8i16:1873; AVX1-SLOW: # %bb.0:1874; AVX1-SLOW-NEXT: vextractf128 $1, %ymm0, %xmm11875; AVX1-SLOW-NEXT: vpaddw %xmm1, %xmm0, %xmm01876; AVX1-SLOW-NEXT: vzeroupper1877; AVX1-SLOW-NEXT: retq1878;1879; AVX1-FAST-LABEL: negative_extract_v16i16_v8i16:1880; AVX1-FAST: # %bb.0:1881; AVX1-FAST-NEXT: vextractf128 $1, %ymm0, %xmm11882; AVX1-FAST-NEXT: vpaddw %xmm1, %xmm0, %xmm01883; AVX1-FAST-NEXT: vzeroupper1884; AVX1-FAST-NEXT: retq1885;1886; AVX2-SLOW-LABEL: negative_extract_v16i16_v8i16:1887; AVX2-SLOW: # %bb.0:1888; AVX2-SLOW-NEXT: vextracti128 $1, %ymm0, %xmm11889; AVX2-SLOW-NEXT: vpaddw %xmm1, %xmm0, %xmm01890; AVX2-SLOW-NEXT: vzeroupper1891; AVX2-SLOW-NEXT: retq1892;1893; AVX2-FAST-LABEL: negative_extract_v16i16_v8i16:1894; AVX2-FAST: # %bb.0:1895; AVX2-FAST-NEXT: vextracti128 $1, %ymm0, %xmm11896; AVX2-FAST-NEXT: vpaddw %xmm1, %xmm0, %xmm01897; AVX2-FAST-NEXT: vzeroupper1898; AVX2-FAST-NEXT: retq1899;1900; AVX512-SLOW-LABEL: negative_extract_v16i16_v8i16:1901; AVX512-SLOW: # %bb.0:1902; AVX512-SLOW-NEXT: vextracti128 $1, %ymm0, %xmm11903; AVX512-SLOW-NEXT: vpaddw %xmm1, %xmm0, %xmm01904; AVX512-SLOW-NEXT: vzeroupper1905; AVX512-SLOW-NEXT: retq1906;1907; AVX512-FAST-LABEL: negative_extract_v16i16_v8i16:1908; AVX512-FAST: # %bb.0:1909; AVX512-FAST-NEXT: vextracti128 $1, %ymm0, %xmm11910; AVX512-FAST-NEXT: vpaddw %xmm1, %xmm0, %xmm01911; AVX512-FAST-NEXT: vzeroupper1912; AVX512-FAST-NEXT: retq1913 %s = shufflevector <4 x i64> %a0, <4 x i64> undef, <4 x i32> <i32 2, i32 3, i32 undef, i32 undef>1914 %b = bitcast <4 x i64> %a0 to <16 x i16>1915 %c = bitcast <4 x i64> %s to <16 x i16>1916 %d = add <16 x i16> %b, %c1917 %e = bitcast <16 x i16> %d to <4 x i64>1918 %f = shufflevector <4 x i64> %e, <4 x i64> undef, <2 x i32> <i32 0, i32 1>1919 ret <2 x i64> %f1920}1921 1922; PR42023 - https://bugs.llvm.org/show_bug.cgi?id=420231923 1924define i16 @hadd16_8(<8 x i16> %x223) {1925; SSE3-SLOW-LABEL: hadd16_8:1926; SSE3-SLOW: # %bb.0:1927; SSE3-SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1928; SSE3-SLOW-NEXT: paddw %xmm0, %xmm11929; SSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]1930; SSE3-SLOW-NEXT: paddw %xmm1, %xmm01931; SSE3-SLOW-NEXT: movdqa %xmm0, %xmm11932; SSE3-SLOW-NEXT: psrld $16, %xmm11933; SSE3-SLOW-NEXT: paddw %xmm0, %xmm11934; SSE3-SLOW-NEXT: movd %xmm1, %eax1935; SSE3-SLOW-NEXT: # kill: def $ax killed $ax killed $eax1936; SSE3-SLOW-NEXT: retq1937;1938; SSE3-FAST-LABEL: hadd16_8:1939; SSE3-FAST: # %bb.0:1940; SSE3-FAST-NEXT: phaddw %xmm0, %xmm01941; SSE3-FAST-NEXT: phaddw %xmm0, %xmm01942; SSE3-FAST-NEXT: phaddw %xmm0, %xmm01943; SSE3-FAST-NEXT: movd %xmm0, %eax1944; SSE3-FAST-NEXT: # kill: def $ax killed $ax killed $eax1945; SSE3-FAST-NEXT: retq1946;1947; AVX-SLOW-LABEL: hadd16_8:1948; AVX-SLOW: # %bb.0:1949; AVX-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1950; AVX-SLOW-NEXT: vpaddw %xmm1, %xmm0, %xmm01951; AVX-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1952; AVX-SLOW-NEXT: vpaddw %xmm1, %xmm0, %xmm01953; AVX-SLOW-NEXT: vpsrld $16, %xmm0, %xmm11954; AVX-SLOW-NEXT: vpaddw %xmm1, %xmm0, %xmm01955; AVX-SLOW-NEXT: vmovd %xmm0, %eax1956; AVX-SLOW-NEXT: # kill: def $ax killed $ax killed $eax1957; AVX-SLOW-NEXT: retq1958;1959; AVX-FAST-LABEL: hadd16_8:1960; AVX-FAST: # %bb.0:1961; AVX-FAST-NEXT: vphaddw %xmm0, %xmm0, %xmm01962; AVX-FAST-NEXT: vphaddw %xmm0, %xmm0, %xmm01963; AVX-FAST-NEXT: vphaddw %xmm0, %xmm0, %xmm01964; AVX-FAST-NEXT: vmovd %xmm0, %eax1965; AVX-FAST-NEXT: # kill: def $ax killed $ax killed $eax1966; AVX-FAST-NEXT: retq1967 %x224 = shufflevector <8 x i16> %x223, <8 x i16> undef, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef>1968 %x225 = add <8 x i16> %x223, %x2241969 %x226 = shufflevector <8 x i16> %x225, <8 x i16> undef, <8 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>1970 %x227 = add <8 x i16> %x225, %x2261971 %x228 = shufflevector <8 x i16> %x227, <8 x i16> undef, <8 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>1972 %x229 = add <8 x i16> %x227, %x2281973 %x230 = extractelement <8 x i16> %x229, i32 01974 ret i16 %x2301975}1976 1977define i32 @hadd32_4(<4 x i32> %x225) {1978; SSE3-SLOW-LABEL: hadd32_4:1979; SSE3-SLOW: # %bb.0:1980; SSE3-SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1981; SSE3-SLOW-NEXT: paddd %xmm0, %xmm11982; SSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]1983; SSE3-SLOW-NEXT: paddd %xmm1, %xmm01984; SSE3-SLOW-NEXT: movd %xmm0, %eax1985; SSE3-SLOW-NEXT: retq1986;1987; SSE3-FAST-LABEL: hadd32_4:1988; SSE3-FAST: # %bb.0:1989; SSE3-FAST-NEXT: phaddd %xmm0, %xmm01990; SSE3-FAST-NEXT: phaddd %xmm0, %xmm01991; SSE3-FAST-NEXT: movd %xmm0, %eax1992; SSE3-FAST-NEXT: retq1993;1994; AVX-SLOW-LABEL: hadd32_4:1995; AVX-SLOW: # %bb.0:1996; AVX-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]1997; AVX-SLOW-NEXT: vpaddd %xmm1, %xmm0, %xmm01998; AVX-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]1999; AVX-SLOW-NEXT: vpaddd %xmm1, %xmm0, %xmm02000; AVX-SLOW-NEXT: vmovd %xmm0, %eax2001; AVX-SLOW-NEXT: retq2002;2003; AVX-FAST-LABEL: hadd32_4:2004; AVX-FAST: # %bb.0:2005; AVX-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm02006; AVX-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm02007; AVX-FAST-NEXT: vmovd %xmm0, %eax2008; AVX-FAST-NEXT: retq2009 %x226 = shufflevector <4 x i32> %x225, <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 undef, i32 undef>2010 %x227 = add <4 x i32> %x225, %x2262011 %x228 = shufflevector <4 x i32> %x227, <4 x i32> undef, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef>2012 %x229 = add <4 x i32> %x227, %x2282013 %x230 = extractelement <4 x i32> %x229, i32 02014 ret i32 %x2302015}2016 2017define i32 @hadd32_8(<8 x i32> %x225) {2018; SSE3-SLOW-LABEL: hadd32_8:2019; SSE3-SLOW: # %bb.0:2020; SSE3-SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]2021; SSE3-SLOW-NEXT: paddd %xmm0, %xmm12022; SSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]2023; SSE3-SLOW-NEXT: paddd %xmm1, %xmm02024; SSE3-SLOW-NEXT: movd %xmm0, %eax2025; SSE3-SLOW-NEXT: retq2026;2027; SSE3-FAST-LABEL: hadd32_8:2028; SSE3-FAST: # %bb.0:2029; SSE3-FAST-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]2030; SSE3-FAST-NEXT: paddd %xmm0, %xmm12031; SSE3-FAST-NEXT: phaddd %xmm1, %xmm12032; SSE3-FAST-NEXT: movd %xmm1, %eax2033; SSE3-FAST-NEXT: retq2034;2035; AVX-SLOW-LABEL: hadd32_8:2036; AVX-SLOW: # %bb.0:2037; AVX-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]2038; AVX-SLOW-NEXT: vpaddd %xmm1, %xmm0, %xmm02039; AVX-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]2040; AVX-SLOW-NEXT: vpaddd %xmm1, %xmm0, %xmm02041; AVX-SLOW-NEXT: vmovd %xmm0, %eax2042; AVX-SLOW-NEXT: vzeroupper2043; AVX-SLOW-NEXT: retq2044;2045; AVX-FAST-LABEL: hadd32_8:2046; AVX-FAST: # %bb.0:2047; AVX-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm02048; AVX-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm02049; AVX-FAST-NEXT: vmovd %xmm0, %eax2050; AVX-FAST-NEXT: vzeroupper2051; AVX-FAST-NEXT: retq2052 %x226 = shufflevector <8 x i32> %x225, <8 x i32> undef, <8 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>2053 %x227 = add <8 x i32> %x225, %x2262054 %x228 = shufflevector <8 x i32> %x227, <8 x i32> undef, <8 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>2055 %x229 = add <8 x i32> %x227, %x2282056 %x230 = extractelement <8 x i32> %x229, i32 02057 ret i32 %x2302058}2059 2060define i32 @hadd32_16(<16 x i32> %x225) {2061; SSE3-SLOW-LABEL: hadd32_16:2062; SSE3-SLOW: # %bb.0:2063; SSE3-SLOW-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]2064; SSE3-SLOW-NEXT: paddd %xmm0, %xmm12065; SSE3-SLOW-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]2066; SSE3-SLOW-NEXT: paddd %xmm1, %xmm02067; SSE3-SLOW-NEXT: movd %xmm0, %eax2068; SSE3-SLOW-NEXT: retq2069;2070; SSE3-FAST-LABEL: hadd32_16:2071; SSE3-FAST: # %bb.0:2072; SSE3-FAST-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]2073; SSE3-FAST-NEXT: paddd %xmm0, %xmm12074; SSE3-FAST-NEXT: phaddd %xmm1, %xmm12075; SSE3-FAST-NEXT: movd %xmm1, %eax2076; SSE3-FAST-NEXT: retq2077;2078; AVX-SLOW-LABEL: hadd32_16:2079; AVX-SLOW: # %bb.0:2080; AVX-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]2081; AVX-SLOW-NEXT: vpaddd %xmm1, %xmm0, %xmm02082; AVX-SLOW-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]2083; AVX-SLOW-NEXT: vpaddd %xmm1, %xmm0, %xmm02084; AVX-SLOW-NEXT: vmovd %xmm0, %eax2085; AVX-SLOW-NEXT: vzeroupper2086; AVX-SLOW-NEXT: retq2087;2088; AVX-FAST-LABEL: hadd32_16:2089; AVX-FAST: # %bb.0:2090; AVX-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm02091; AVX-FAST-NEXT: vphaddd %xmm0, %xmm0, %xmm02092; AVX-FAST-NEXT: vmovd %xmm0, %eax2093; AVX-FAST-NEXT: vzeroupper2094; AVX-FAST-NEXT: retq2095 %x226 = shufflevector <16 x i32> %x225, <16 x i32> undef, <16 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>2096 %x227 = add <16 x i32> %x225, %x2262097 %x228 = shufflevector <16 x i32> %x227, <16 x i32> undef, <16 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>2098 %x229 = add <16 x i32> %x227, %x2282099 %x230 = extractelement <16 x i32> %x229, i32 02100 ret i32 %x2302101}2102 2103define i16 @hadd16_8_optsize(<8 x i16> %x223) optsize {2104; SSE3-LABEL: hadd16_8_optsize:2105; SSE3: # %bb.0:2106; SSE3-NEXT: phaddw %xmm0, %xmm02107; SSE3-NEXT: phaddw %xmm0, %xmm02108; SSE3-NEXT: phaddw %xmm0, %xmm02109; SSE3-NEXT: movd %xmm0, %eax2110; SSE3-NEXT: # kill: def $ax killed $ax killed $eax2111; SSE3-NEXT: retq2112;2113; AVX-LABEL: hadd16_8_optsize:2114; AVX: # %bb.0:2115; AVX-NEXT: vphaddw %xmm0, %xmm0, %xmm02116; AVX-NEXT: vphaddw %xmm0, %xmm0, %xmm02117; AVX-NEXT: vphaddw %xmm0, %xmm0, %xmm02118; AVX-NEXT: vmovd %xmm0, %eax2119; AVX-NEXT: # kill: def $ax killed $ax killed $eax2120; AVX-NEXT: retq2121 %x224 = shufflevector <8 x i16> %x223, <8 x i16> undef, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef>2122 %x225 = add <8 x i16> %x223, %x2242123 %x226 = shufflevector <8 x i16> %x225, <8 x i16> undef, <8 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>2124 %x227 = add <8 x i16> %x225, %x2262125 %x228 = shufflevector <8 x i16> %x227, <8 x i16> undef, <8 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>2126 %x229 = add <8 x i16> %x227, %x2282127 %x230 = extractelement <8 x i16> %x229, i32 02128 ret i16 %x2302129}2130 2131define i32 @hadd32_4_optsize(<4 x i32> %x225) optsize {2132; SSE3-LABEL: hadd32_4_optsize:2133; SSE3: # %bb.0:2134; SSE3-NEXT: phaddd %xmm0, %xmm02135; SSE3-NEXT: phaddd %xmm0, %xmm02136; SSE3-NEXT: movd %xmm0, %eax2137; SSE3-NEXT: retq2138;2139; AVX-LABEL: hadd32_4_optsize:2140; AVX: # %bb.0:2141; AVX-NEXT: vphaddd %xmm0, %xmm0, %xmm02142; AVX-NEXT: vphaddd %xmm0, %xmm0, %xmm02143; AVX-NEXT: vmovd %xmm0, %eax2144; AVX-NEXT: retq2145 %x226 = shufflevector <4 x i32> %x225, <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 undef, i32 undef>2146 %x227 = add <4 x i32> %x225, %x2262147 %x228 = shufflevector <4 x i32> %x227, <4 x i32> undef, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef>2148 %x229 = add <4 x i32> %x227, %x2282149 %x230 = extractelement <4 x i32> %x229, i32 02150 ret i32 %x2302151}2152 2153define i32 @hadd32_4_pgso(<4 x i32> %x225) !prof !14 {2154; SSE3-LABEL: hadd32_4_pgso:2155; SSE3: # %bb.0:2156; SSE3-NEXT: phaddd %xmm0, %xmm02157; SSE3-NEXT: phaddd %xmm0, %xmm02158; SSE3-NEXT: movd %xmm0, %eax2159; SSE3-NEXT: retq2160;2161; AVX-LABEL: hadd32_4_pgso:2162; AVX: # %bb.0:2163; AVX-NEXT: vphaddd %xmm0, %xmm0, %xmm02164; AVX-NEXT: vphaddd %xmm0, %xmm0, %xmm02165; AVX-NEXT: vmovd %xmm0, %eax2166; AVX-NEXT: retq2167 %x226 = shufflevector <4 x i32> %x225, <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 undef, i32 undef>2168 %x227 = add <4 x i32> %x225, %x2262169 %x228 = shufflevector <4 x i32> %x227, <4 x i32> undef, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef>2170 %x229 = add <4 x i32> %x227, %x2282171 %x230 = extractelement <4 x i32> %x229, i32 02172 ret i32 %x2302173}2174 2175define i32 @hadd32_8_optsize(<8 x i32> %x225) optsize {2176; SSE3-LABEL: hadd32_8_optsize:2177; SSE3: # %bb.0:2178; SSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]2179; SSE3-NEXT: paddd %xmm0, %xmm12180; SSE3-NEXT: phaddd %xmm1, %xmm12181; SSE3-NEXT: movd %xmm1, %eax2182; SSE3-NEXT: retq2183;2184; AVX-LABEL: hadd32_8_optsize:2185; AVX: # %bb.0:2186; AVX-NEXT: vphaddd %xmm0, %xmm0, %xmm02187; AVX-NEXT: vphaddd %xmm0, %xmm0, %xmm02188; AVX-NEXT: vmovd %xmm0, %eax2189; AVX-NEXT: vzeroupper2190; AVX-NEXT: retq2191 %x226 = shufflevector <8 x i32> %x225, <8 x i32> undef, <8 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>2192 %x227 = add <8 x i32> %x225, %x2262193 %x228 = shufflevector <8 x i32> %x227, <8 x i32> undef, <8 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>2194 %x229 = add <8 x i32> %x227, %x2282195 %x230 = extractelement <8 x i32> %x229, i32 02196 ret i32 %x2302197}2198 2199define i32 @hadd32_16_optsize(<16 x i32> %x225) optsize {2200; SSE3-LABEL: hadd32_16_optsize:2201; SSE3: # %bb.0:2202; SSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]2203; SSE3-NEXT: paddd %xmm0, %xmm12204; SSE3-NEXT: phaddd %xmm1, %xmm12205; SSE3-NEXT: movd %xmm1, %eax2206; SSE3-NEXT: retq2207;2208; AVX-LABEL: hadd32_16_optsize:2209; AVX: # %bb.0:2210; AVX-NEXT: vphaddd %xmm0, %xmm0, %xmm02211; AVX-NEXT: vphaddd %xmm0, %xmm0, %xmm02212; AVX-NEXT: vmovd %xmm0, %eax2213; AVX-NEXT: vzeroupper2214; AVX-NEXT: retq2215 %x226 = shufflevector <16 x i32> %x225, <16 x i32> undef, <16 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>2216 %x227 = add <16 x i32> %x225, %x2262217 %x228 = shufflevector <16 x i32> %x227, <16 x i32> undef, <16 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>2218 %x229 = add <16 x i32> %x227, %x2282219 %x230 = extractelement <16 x i32> %x229, i32 02220 ret i32 %x2302221}2222 2223!llvm.module.flags = !{!0}2224!0 = !{i32 1, !"ProfileSummary", !1}2225!1 = !{!2, !3, !4, !5, !6, !7, !8, !9}2226!2 = !{!"ProfileFormat", !"InstrProf"}2227!3 = !{!"TotalCount", i64 10000}2228!4 = !{!"MaxCount", i64 10}2229!5 = !{!"MaxInternalCount", i64 1}2230!6 = !{!"MaxFunctionCount", i64 1000}2231!7 = !{!"NumCounts", i64 3}2232!8 = !{!"NumFunctions", i64 3}2233!9 = !{!"DetailedSummary", !10}2234!10 = !{!11, !12, !13}2235!11 = !{i32 10000, i64 100, i32 1}2236!12 = !{i32 999000, i64 100, i32 1}2237!13 = !{i32 999999, i64 1, i32 2}2238!14 = !{!"function_entry_count", i64 0}2239