652 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-pc-linux -mattr=+sse2 | FileCheck %s --check-prefix=SSE --check-prefix=SSE23; RUN: llc < %s -mtriple=x86_64-pc-linux -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE --check-prefix=SSE414; RUN: llc < %s -mtriple=x86_64-pc-linux -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX15; RUN: llc < %s -mtriple=x86_64-pc-linux -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX26 7;8; ExtractElement - Constant Index9;10 11define i64 @extract_undef_index_from_zero_vec() nounwind {12; SSE-LABEL: extract_undef_index_from_zero_vec:13; SSE: # %bb.0:14; SSE-NEXT: retq15;16; AVX-LABEL: extract_undef_index_from_zero_vec:17; AVX: # %bb.0:18; AVX-NEXT: retq19 %E = extractelement <2 x i64> zeroinitializer, i64 undef20 ret i64 %E21}22 23define i64 @extract_undef_index_from_nonzero_vec() nounwind {24; SSE-LABEL: extract_undef_index_from_nonzero_vec:25; SSE: # %bb.0:26; SSE-NEXT: retq27;28; AVX-LABEL: extract_undef_index_from_nonzero_vec:29; AVX: # %bb.0:30; AVX-NEXT: retq31 %E = extractelement <2 x i64> <i64 -1, i64 -1>, i64 undef32 ret i64 %E33}34 35define i8 @extractelement_v16i8_1(<16 x i8> %a) nounwind {36; SSE2-LABEL: extractelement_v16i8_1:37; SSE2: # %bb.0:38; SSE2-NEXT: movd %xmm0, %eax39; SSE2-NEXT: shrl $8, %eax40; SSE2-NEXT: # kill: def $al killed $al killed $eax41; SSE2-NEXT: retq42;43; SSE41-LABEL: extractelement_v16i8_1:44; SSE41: # %bb.0:45; SSE41-NEXT: pextrb $1, %xmm0, %eax46; SSE41-NEXT: # kill: def $al killed $al killed $eax47; SSE41-NEXT: retq48;49; AVX-LABEL: extractelement_v16i8_1:50; AVX: # %bb.0:51; AVX-NEXT: vpextrb $1, %xmm0, %eax52; AVX-NEXT: # kill: def $al killed $al killed $eax53; AVX-NEXT: retq54 %b = extractelement <16 x i8> %a, i256 155 ret i8 %b56}57 58define i8 @extractelement_v16i8_11(<16 x i8> %a) nounwind {59; SSE2-LABEL: extractelement_v16i8_11:60; SSE2: # %bb.0:61; SSE2-NEXT: pextrw $5, %xmm0, %eax62; SSE2-NEXT: shrl $8, %eax63; SSE2-NEXT: # kill: def $al killed $al killed $eax64; SSE2-NEXT: retq65;66; SSE41-LABEL: extractelement_v16i8_11:67; SSE41: # %bb.0:68; SSE41-NEXT: pextrb $11, %xmm0, %eax69; SSE41-NEXT: # kill: def $al killed $al killed $eax70; SSE41-NEXT: retq71;72; AVX-LABEL: extractelement_v16i8_11:73; AVX: # %bb.0:74; AVX-NEXT: vpextrb $11, %xmm0, %eax75; AVX-NEXT: # kill: def $al killed $al killed $eax76; AVX-NEXT: retq77 %b = extractelement <16 x i8> %a, i256 1178 ret i8 %b79}80 81define i8 @extractelement_v16i8_14(<16 x i8> %a) nounwind {82; SSE2-LABEL: extractelement_v16i8_14:83; SSE2: # %bb.0:84; SSE2-NEXT: pextrw $7, %xmm0, %eax85; SSE2-NEXT: # kill: def $al killed $al killed $eax86; SSE2-NEXT: retq87;88; SSE41-LABEL: extractelement_v16i8_14:89; SSE41: # %bb.0:90; SSE41-NEXT: pextrb $14, %xmm0, %eax91; SSE41-NEXT: # kill: def $al killed $al killed $eax92; SSE41-NEXT: retq93;94; AVX-LABEL: extractelement_v16i8_14:95; AVX: # %bb.0:96; AVX-NEXT: vpextrb $14, %xmm0, %eax97; AVX-NEXT: # kill: def $al killed $al killed $eax98; AVX-NEXT: retq99 %b = extractelement <16 x i8> %a, i256 14100 ret i8 %b101}102 103define i8 @extractelement_v32i8_1(<32 x i8> %a) nounwind {104; SSE2-LABEL: extractelement_v32i8_1:105; SSE2: # %bb.0:106; SSE2-NEXT: movd %xmm0, %eax107; SSE2-NEXT: shrl $8, %eax108; SSE2-NEXT: # kill: def $al killed $al killed $eax109; SSE2-NEXT: retq110;111; SSE41-LABEL: extractelement_v32i8_1:112; SSE41: # %bb.0:113; SSE41-NEXT: pextrb $1, %xmm0, %eax114; SSE41-NEXT: # kill: def $al killed $al killed $eax115; SSE41-NEXT: retq116;117; AVX-LABEL: extractelement_v32i8_1:118; AVX: # %bb.0:119; AVX-NEXT: vpextrb $1, %xmm0, %eax120; AVX-NEXT: # kill: def $al killed $al killed $eax121; AVX-NEXT: vzeroupper122; AVX-NEXT: retq123 %b = extractelement <32 x i8> %a, i256 1124 ret i8 %b125}126 127define i8 @extractelement_v32i8_17(<32 x i8> %a) nounwind {128; SSE2-LABEL: extractelement_v32i8_17:129; SSE2: # %bb.0:130; SSE2-NEXT: movd %xmm1, %eax131; SSE2-NEXT: shrl $8, %eax132; SSE2-NEXT: # kill: def $al killed $al killed $eax133; SSE2-NEXT: retq134;135; SSE41-LABEL: extractelement_v32i8_17:136; SSE41: # %bb.0:137; SSE41-NEXT: pextrb $1, %xmm1, %eax138; SSE41-NEXT: # kill: def $al killed $al killed $eax139; SSE41-NEXT: retq140;141; AVX1-LABEL: extractelement_v32i8_17:142; AVX1: # %bb.0:143; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0144; AVX1-NEXT: vpextrb $1, %xmm0, %eax145; AVX1-NEXT: # kill: def $al killed $al killed $eax146; AVX1-NEXT: vzeroupper147; AVX1-NEXT: retq148;149; AVX2-LABEL: extractelement_v32i8_17:150; AVX2: # %bb.0:151; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0152; AVX2-NEXT: vpextrb $1, %xmm0, %eax153; AVX2-NEXT: # kill: def $al killed $al killed $eax154; AVX2-NEXT: vzeroupper155; AVX2-NEXT: retq156 %b = extractelement <32 x i8> %a, i256 17157 ret i8 %b158}159 160define i16 @extractelement_v8i16_0(<8 x i16> %a, i256 %i) nounwind {161; SSE-LABEL: extractelement_v8i16_0:162; SSE: # %bb.0:163; SSE-NEXT: movd %xmm0, %eax164; SSE-NEXT: # kill: def $ax killed $ax killed $eax165; SSE-NEXT: retq166;167; AVX-LABEL: extractelement_v8i16_0:168; AVX: # %bb.0:169; AVX-NEXT: vmovd %xmm0, %eax170; AVX-NEXT: # kill: def $ax killed $ax killed $eax171; AVX-NEXT: retq172 %b = extractelement <8 x i16> %a, i256 0173 ret i16 %b174}175 176define i16 @extractelement_v8i16_3(<8 x i16> %a, i256 %i) nounwind {177; SSE-LABEL: extractelement_v8i16_3:178; SSE: # %bb.0:179; SSE-NEXT: pextrw $3, %xmm0, %eax180; SSE-NEXT: # kill: def $ax killed $ax killed $eax181; SSE-NEXT: retq182;183; AVX-LABEL: extractelement_v8i16_3:184; AVX: # %bb.0:185; AVX-NEXT: vpextrw $3, %xmm0, %eax186; AVX-NEXT: # kill: def $ax killed $ax killed $eax187; AVX-NEXT: retq188 %b = extractelement <8 x i16> %a, i256 3189 ret i16 %b190}191 192define i16 @extractelement_v16i16_0(<16 x i16> %a, i256 %i) nounwind {193; SSE-LABEL: extractelement_v16i16_0:194; SSE: # %bb.0:195; SSE-NEXT: movd %xmm0, %eax196; SSE-NEXT: # kill: def $ax killed $ax killed $eax197; SSE-NEXT: retq198;199; AVX-LABEL: extractelement_v16i16_0:200; AVX: # %bb.0:201; AVX-NEXT: vmovd %xmm0, %eax202; AVX-NEXT: # kill: def $ax killed $ax killed $eax203; AVX-NEXT: vzeroupper204; AVX-NEXT: retq205 %b = extractelement <16 x i16> %a, i256 0206 ret i16 %b207}208 209define i16 @extractelement_v16i16_13(<16 x i16> %a, i256 %i) nounwind {210; SSE-LABEL: extractelement_v16i16_13:211; SSE: # %bb.0:212; SSE-NEXT: pextrw $5, %xmm1, %eax213; SSE-NEXT: # kill: def $ax killed $ax killed $eax214; SSE-NEXT: retq215;216; AVX1-LABEL: extractelement_v16i16_13:217; AVX1: # %bb.0:218; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0219; AVX1-NEXT: vpextrw $5, %xmm0, %eax220; AVX1-NEXT: # kill: def $ax killed $ax killed $eax221; AVX1-NEXT: vzeroupper222; AVX1-NEXT: retq223;224; AVX2-LABEL: extractelement_v16i16_13:225; AVX2: # %bb.0:226; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0227; AVX2-NEXT: vpextrw $5, %xmm0, %eax228; AVX2-NEXT: # kill: def $ax killed $ax killed $eax229; AVX2-NEXT: vzeroupper230; AVX2-NEXT: retq231 %b = extractelement <16 x i16> %a, i256 13232 ret i16 %b233}234 235define i32 @extractelement_v4i32_0(<4 x i32> %a) nounwind {236; SSE-LABEL: extractelement_v4i32_0:237; SSE: # %bb.0:238; SSE-NEXT: movd %xmm0, %eax239; SSE-NEXT: retq240;241; AVX-LABEL: extractelement_v4i32_0:242; AVX: # %bb.0:243; AVX-NEXT: vmovd %xmm0, %eax244; AVX-NEXT: retq245 %b = extractelement <4 x i32> %a, i256 0246 ret i32 %b247}248 249define i32 @extractelement_v4i32_3(<4 x i32> %a) nounwind {250; SSE2-LABEL: extractelement_v4i32_3:251; SSE2: # %bb.0:252; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]253; SSE2-NEXT: movd %xmm0, %eax254; SSE2-NEXT: retq255;256; SSE41-LABEL: extractelement_v4i32_3:257; SSE41: # %bb.0:258; SSE41-NEXT: extractps $3, %xmm0, %eax259; SSE41-NEXT: retq260;261; AVX-LABEL: extractelement_v4i32_3:262; AVX: # %bb.0:263; AVX-NEXT: vextractps $3, %xmm0, %eax264; AVX-NEXT: retq265 %b = extractelement <4 x i32> %a, i256 3266 ret i32 %b267}268 269define i32 @extractelement_v8i32_0(<8 x i32> %a) nounwind {270; SSE-LABEL: extractelement_v8i32_0:271; SSE: # %bb.0:272; SSE-NEXT: movd %xmm1, %eax273; SSE-NEXT: retq274;275; AVX1-LABEL: extractelement_v8i32_0:276; AVX1: # %bb.0:277; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0278; AVX1-NEXT: vmovd %xmm0, %eax279; AVX1-NEXT: vzeroupper280; AVX1-NEXT: retq281;282; AVX2-LABEL: extractelement_v8i32_0:283; AVX2: # %bb.0:284; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0285; AVX2-NEXT: vmovd %xmm0, %eax286; AVX2-NEXT: vzeroupper287; AVX2-NEXT: retq288 %b = extractelement <8 x i32> %a, i256 4289 ret i32 %b290}291 292define i32 @extractelement_v8i32_4(<8 x i32> %a) nounwind {293; SSE-LABEL: extractelement_v8i32_4:294; SSE: # %bb.0:295; SSE-NEXT: movd %xmm1, %eax296; SSE-NEXT: retq297;298; AVX1-LABEL: extractelement_v8i32_4:299; AVX1: # %bb.0:300; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0301; AVX1-NEXT: vmovd %xmm0, %eax302; AVX1-NEXT: vzeroupper303; AVX1-NEXT: retq304;305; AVX2-LABEL: extractelement_v8i32_4:306; AVX2: # %bb.0:307; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0308; AVX2-NEXT: vmovd %xmm0, %eax309; AVX2-NEXT: vzeroupper310; AVX2-NEXT: retq311 %b = extractelement <8 x i32> %a, i256 4312 ret i32 %b313}314 315define i32 @extractelement_v8i32_7(<8 x i32> %a) nounwind {316; SSE2-LABEL: extractelement_v8i32_7:317; SSE2: # %bb.0:318; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[3,3,3,3]319; SSE2-NEXT: movd %xmm0, %eax320; SSE2-NEXT: retq321;322; SSE41-LABEL: extractelement_v8i32_7:323; SSE41: # %bb.0:324; SSE41-NEXT: extractps $3, %xmm1, %eax325; SSE41-NEXT: retq326;327; AVX-LABEL: extractelement_v8i32_7:328; AVX: # %bb.0:329; AVX-NEXT: vextractf128 $1, %ymm0, %xmm0330; AVX-NEXT: vextractps $3, %xmm0, %eax331; AVX-NEXT: vzeroupper332; AVX-NEXT: retq333 %b = extractelement <8 x i32> %a, i64 7334 ret i32 %b335}336 337define i64 @extractelement_v2i64_0(<2 x i64> %a, i256 %i) nounwind {338; SSE-LABEL: extractelement_v2i64_0:339; SSE: # %bb.0:340; SSE-NEXT: movq %xmm0, %rax341; SSE-NEXT: retq342;343; AVX-LABEL: extractelement_v2i64_0:344; AVX: # %bb.0:345; AVX-NEXT: vmovq %xmm0, %rax346; AVX-NEXT: retq347 %b = extractelement <2 x i64> %a, i256 0348 ret i64 %b349}350 351define i64 @extractelement_v2i64_1(<2 x i64> %a, i256 %i) nounwind {352; SSE2-LABEL: extractelement_v2i64_1:353; SSE2: # %bb.0:354; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]355; SSE2-NEXT: movq %xmm0, %rax356; SSE2-NEXT: retq357;358; SSE41-LABEL: extractelement_v2i64_1:359; SSE41: # %bb.0:360; SSE41-NEXT: pextrq $1, %xmm0, %rax361; SSE41-NEXT: retq362;363; AVX-LABEL: extractelement_v2i64_1:364; AVX: # %bb.0:365; AVX-NEXT: vpextrq $1, %xmm0, %rax366; AVX-NEXT: retq367 %b = extractelement <2 x i64> %a, i256 1368 ret i64 %b369}370 371define i64 @extractelement_v4i64_1(<4 x i64> %a, i256 %i) nounwind {372; SSE2-LABEL: extractelement_v4i64_1:373; SSE2: # %bb.0:374; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]375; SSE2-NEXT: movq %xmm0, %rax376; SSE2-NEXT: retq377;378; SSE41-LABEL: extractelement_v4i64_1:379; SSE41: # %bb.0:380; SSE41-NEXT: pextrq $1, %xmm0, %rax381; SSE41-NEXT: retq382;383; AVX-LABEL: extractelement_v4i64_1:384; AVX: # %bb.0:385; AVX-NEXT: vpextrq $1, %xmm0, %rax386; AVX-NEXT: vzeroupper387; AVX-NEXT: retq388 %b = extractelement <4 x i64> %a, i256 1389 ret i64 %b390}391 392define i64 @extractelement_v4i64_3(<4 x i64> %a, i256 %i) nounwind {393; SSE2-LABEL: extractelement_v4i64_3:394; SSE2: # %bb.0:395; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]396; SSE2-NEXT: movq %xmm0, %rax397; SSE2-NEXT: retq398;399; SSE41-LABEL: extractelement_v4i64_3:400; SSE41: # %bb.0:401; SSE41-NEXT: pextrq $1, %xmm1, %rax402; SSE41-NEXT: retq403;404; AVX1-LABEL: extractelement_v4i64_3:405; AVX1: # %bb.0:406; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0407; AVX1-NEXT: vpextrq $1, %xmm0, %rax408; AVX1-NEXT: vzeroupper409; AVX1-NEXT: retq410;411; AVX2-LABEL: extractelement_v4i64_3:412; AVX2: # %bb.0:413; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0414; AVX2-NEXT: vpextrq $1, %xmm0, %rax415; AVX2-NEXT: vzeroupper416; AVX2-NEXT: retq417 %b = extractelement <4 x i64> %a, i256 3418 ret i64 %b419}420 421;422; ExtractElement - Variable Index423;424 425define i8 @extractelement_v16i8_var(<16 x i8> %a, i256 %i) nounwind {426; SSE-LABEL: extractelement_v16i8_var:427; SSE: # %bb.0:428; SSE-NEXT: andl $15, %edi429; SSE-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)430; SSE-NEXT: movzbl -24(%rsp,%rdi), %eax431; SSE-NEXT: retq432;433; AVX-LABEL: extractelement_v16i8_var:434; AVX: # %bb.0:435; AVX-NEXT: andl $15, %edi436; AVX-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp)437; AVX-NEXT: movzbl -24(%rsp,%rdi), %eax438; AVX-NEXT: retq439 %b = extractelement <16 x i8> %a, i256 %i440 ret i8 %b441}442 443define i8 @extractelement_v32i8_var(<32 x i8> %a, i256 %i) nounwind {444; SSE-LABEL: extractelement_v32i8_var:445; SSE: # %bb.0:446; SSE-NEXT: andl $31, %edi447; SSE-NEXT: movaps %xmm1, -{{[0-9]+}}(%rsp)448; SSE-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)449; SSE-NEXT: movzbl -40(%rsp,%rdi), %eax450; SSE-NEXT: retq451;452; AVX-LABEL: extractelement_v32i8_var:453; AVX: # %bb.0:454; AVX-NEXT: pushq %rbp455; AVX-NEXT: movq %rsp, %rbp456; AVX-NEXT: andq $-32, %rsp457; AVX-NEXT: subq $64, %rsp458; AVX-NEXT: andl $31, %edi459; AVX-NEXT: vmovaps %ymm0, (%rsp)460; AVX-NEXT: movzbl (%rsp,%rdi), %eax461; AVX-NEXT: movq %rbp, %rsp462; AVX-NEXT: popq %rbp463; AVX-NEXT: vzeroupper464; AVX-NEXT: retq465 %b = extractelement <32 x i8> %a, i256 %i466 ret i8 %b467}468 469define i16 @extractelement_v8i16_var(<8 x i16> %a, i256 %i) nounwind {470; SSE-LABEL: extractelement_v8i16_var:471; SSE: # %bb.0:472; SSE-NEXT: andl $7, %edi473; SSE-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)474; SSE-NEXT: movzwl -24(%rsp,%rdi,2), %eax475; SSE-NEXT: retq476;477; AVX-LABEL: extractelement_v8i16_var:478; AVX: # %bb.0:479; AVX-NEXT: andl $7, %edi480; AVX-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp)481; AVX-NEXT: movzwl -24(%rsp,%rdi,2), %eax482; AVX-NEXT: retq483 %b = extractelement <8 x i16> %a, i256 %i484 ret i16 %b485}486 487define i16 @extractelement_v16i16_var(<16 x i16> %a, i256 %i) nounwind {488; SSE-LABEL: extractelement_v16i16_var:489; SSE: # %bb.0:490; SSE-NEXT: andl $15, %edi491; SSE-NEXT: movaps %xmm1, -{{[0-9]+}}(%rsp)492; SSE-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)493; SSE-NEXT: movzwl -40(%rsp,%rdi,2), %eax494; SSE-NEXT: retq495;496; AVX-LABEL: extractelement_v16i16_var:497; AVX: # %bb.0:498; AVX-NEXT: pushq %rbp499; AVX-NEXT: movq %rsp, %rbp500; AVX-NEXT: andq $-32, %rsp501; AVX-NEXT: subq $64, %rsp502; AVX-NEXT: andl $15, %edi503; AVX-NEXT: vmovaps %ymm0, (%rsp)504; AVX-NEXT: movzwl (%rsp,%rdi,2), %eax505; AVX-NEXT: movq %rbp, %rsp506; AVX-NEXT: popq %rbp507; AVX-NEXT: vzeroupper508; AVX-NEXT: retq509 %b = extractelement <16 x i16> %a, i256 %i510 ret i16 %b511}512 513define i32 @extractelement_v4i32_var(<4 x i32> %a, i256 %i) nounwind {514; SSE-LABEL: extractelement_v4i32_var:515; SSE: # %bb.0:516; SSE-NEXT: andl $3, %edi517; SSE-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)518; SSE-NEXT: movl -24(%rsp,%rdi,4), %eax519; SSE-NEXT: retq520;521; AVX-LABEL: extractelement_v4i32_var:522; AVX: # %bb.0:523; AVX-NEXT: andl $3, %edi524; AVX-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp)525; AVX-NEXT: movl -24(%rsp,%rdi,4), %eax526; AVX-NEXT: retq527 %b = extractelement <4 x i32> %a, i256 %i528 ret i32 %b529}530 531define i32 @extractelement_v8i32_var(<8 x i32> %a, i256 %i) nounwind {532; SSE-LABEL: extractelement_v8i32_var:533; SSE: # %bb.0:534; SSE-NEXT: andl $7, %edi535; SSE-NEXT: movaps %xmm1, -{{[0-9]+}}(%rsp)536; SSE-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)537; SSE-NEXT: movl -40(%rsp,%rdi,4), %eax538; SSE-NEXT: retq539;540; AVX-LABEL: extractelement_v8i32_var:541; AVX: # %bb.0:542; AVX-NEXT: pushq %rbp543; AVX-NEXT: movq %rsp, %rbp544; AVX-NEXT: andq $-32, %rsp545; AVX-NEXT: subq $64, %rsp546; AVX-NEXT: andl $7, %edi547; AVX-NEXT: vmovaps %ymm0, (%rsp)548; AVX-NEXT: movl (%rsp,%rdi,4), %eax549; AVX-NEXT: movq %rbp, %rsp550; AVX-NEXT: popq %rbp551; AVX-NEXT: vzeroupper552; AVX-NEXT: retq553 %b = extractelement <8 x i32> %a, i256 %i554 ret i32 %b555}556 557define i64 @extractelement_v2i64_var(<2 x i64> %a, i256 %i) nounwind {558; SSE-LABEL: extractelement_v2i64_var:559; SSE: # %bb.0:560; SSE-NEXT: andl $1, %edi561; SSE-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)562; SSE-NEXT: movq -24(%rsp,%rdi,8), %rax563; SSE-NEXT: retq564;565; AVX-LABEL: extractelement_v2i64_var:566; AVX: # %bb.0:567; AVX-NEXT: andl $1, %edi568; AVX-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp)569; AVX-NEXT: movq -24(%rsp,%rdi,8), %rax570; AVX-NEXT: retq571 %b = extractelement <2 x i64> %a, i256 %i572 ret i64 %b573}574 575define i64 @extractelement_v4i64_var(<4 x i64> %a, i256 %i) nounwind {576; SSE-LABEL: extractelement_v4i64_var:577; SSE: # %bb.0:578; SSE-NEXT: andl $3, %edi579; SSE-NEXT: movaps %xmm1, -{{[0-9]+}}(%rsp)580; SSE-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)581; SSE-NEXT: movq -40(%rsp,%rdi,8), %rax582; SSE-NEXT: retq583;584; AVX-LABEL: extractelement_v4i64_var:585; AVX: # %bb.0:586; AVX-NEXT: pushq %rbp587; AVX-NEXT: movq %rsp, %rbp588; AVX-NEXT: andq $-32, %rsp589; AVX-NEXT: subq $64, %rsp590; AVX-NEXT: andl $3, %edi591; AVX-NEXT: vmovaps %ymm0, (%rsp)592; AVX-NEXT: movq (%rsp,%rdi,8), %rax593; AVX-NEXT: movq %rbp, %rsp594; AVX-NEXT: popq %rbp595; AVX-NEXT: vzeroupper596; AVX-NEXT: retq597 %b = extractelement <4 x i64> %a, i256 %i598 ret i64 %b599}600 601;602; ExtractElement - Constant (Out Of Range) Index603;604 605define i8 @extractelement_32i8_m1(<32 x i8> %a) nounwind {606; SSE-LABEL: extractelement_32i8_m1:607; SSE: # %bb.0:608; SSE-NEXT: retq609;610; AVX-LABEL: extractelement_32i8_m1:611; AVX: # %bb.0:612; AVX-NEXT: retq613 %b = extractelement <32 x i8> %a, i256 -1614 ret i8 %b615}616 617define i16 @extractelement_v16i16_m4(<16 x i16> %a, i256 %i) nounwind {618; SSE-LABEL: extractelement_v16i16_m4:619; SSE: # %bb.0:620; SSE-NEXT: retq621;622; AVX-LABEL: extractelement_v16i16_m4:623; AVX: # %bb.0:624; AVX-NEXT: retq625 %b = extractelement <16 x i16> %a, i256 -4626 ret i16 %b627}628 629define i32 @extractelement_v8i32_15(<8 x i32> %a) nounwind {630; SSE-LABEL: extractelement_v8i32_15:631; SSE: # %bb.0:632; SSE-NEXT: retq633;634; AVX-LABEL: extractelement_v8i32_15:635; AVX: # %bb.0:636; AVX-NEXT: retq637 %b = extractelement <8 x i32> %a, i64 15638 ret i32 %b639}640 641define i64 @extractelement_v4i64_4(<4 x i64> %a, i256 %i) nounwind {642; SSE-LABEL: extractelement_v4i64_4:643; SSE: # %bb.0:644; SSE-NEXT: retq645;646; AVX-LABEL: extractelement_v4i64_4:647; AVX: # %bb.0:648; AVX-NEXT: retq649 %b = extractelement <4 x i64> %a, i256 4650 ret i64 %b651}652