brintos

brintos / llvm-project-archived public Read only

0
0
Text · 18.2 KiB · 077351b Raw
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