brintos

brintos / llvm-project-archived public Read only

0
0
Text · 18.3 KiB · 6277986 Raw
417 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -mtriple=x86_64-unknown-unknown -S | FileCheck %s3 4;5; EXTRQ6;7 8define <2 x i64> @test_extrq_call(<2 x i64> %x, <16 x i8> %y) {9; CHECK-LABEL: @test_extrq_call(10; CHECK-NEXT:    [[TMP1:%.*]] = tail call <2 x i64> @llvm.x86.sse4a.extrq(<2 x i64> [[X:%.*]], <16 x i8> [[Y:%.*]]) #[[ATTR1:[0-9]+]]11; CHECK-NEXT:    ret <2 x i64> [[TMP1]]12;13  %1 = tail call <2 x i64> @llvm.x86.sse4a.extrq(<2 x i64> %x, <16 x i8> %y) nounwind14  ret <2 x i64> %115}16 17define <2 x i64> @test_extrq_zero_arg0(<2 x i64> %x, <16 x i8> %y) {18; CHECK-LABEL: @test_extrq_zero_arg0(19; CHECK-NEXT:    ret <2 x i64> <i64 0, i64 undef>20;21  %1 = tail call <2 x i64> @llvm.x86.sse4a.extrq(<2 x i64> zeroinitializer, <16 x i8> %y) nounwind22  ret <2 x i64> %123}24 25define <2 x i64> @test_extrq_zero_arg1(<2 x i64> %x, <16 x i8> %y) {26; CHECK-LABEL: @test_extrq_zero_arg1(27; CHECK-NEXT:    [[TMP1:%.*]] = bitcast <2 x i64> [[X:%.*]] to <16 x i8>28; CHECK-NEXT:    [[TMP2:%.*]] = shufflevector <16 x i8> [[TMP1]], <16 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>29; CHECK-NEXT:    [[TMP3:%.*]] = bitcast <16 x i8> [[TMP2]] to <2 x i64>30; CHECK-NEXT:    ret <2 x i64> [[TMP3]]31;32  %1 = tail call <2 x i64> @llvm.x86.sse4a.extrq(<2 x i64> %x, <16 x i8> zeroinitializer) nounwind33  ret <2 x i64> %134}35 36define <2 x i64> @test_extrq_to_extqi(<2 x i64> %x, <16 x i8> %y) {37; CHECK-LABEL: @test_extrq_to_extqi(38; CHECK-NEXT:    [[TMP1:%.*]] = call <2 x i64> @llvm.x86.sse4a.extrqi(<2 x i64> [[X:%.*]], i8 8, i8 15)39; CHECK-NEXT:    ret <2 x i64> [[TMP1]]40;41  %1 = tail call <2 x i64> @llvm.x86.sse4a.extrq(<2 x i64> %x, <16 x i8> <i8 8, i8 15, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0>) nounwind42  ret <2 x i64> %143}44 45define <2 x i64> @test_extrq_constant(<2 x i64> %x, <16 x i8> %y) {46; CHECK-LABEL: @test_extrq_constant(47; CHECK-NEXT:    ret <2 x i64> <i64 255, i64 undef>48;49  %1 = tail call <2 x i64> @llvm.x86.sse4a.extrq(<2 x i64> <i64 -1, i64 55>, <16 x i8> <i8 8, i8 15, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0>) nounwind50  ret <2 x i64> %151}52 53define <2 x i64> @test_extrq_constant_undef(<2 x i64> %x, <16 x i8> %y) {54; CHECK-LABEL: @test_extrq_constant_undef(55; CHECK-NEXT:    ret <2 x i64> <i64 65535, i64 undef>56;57  %1 = tail call <2 x i64> @llvm.x86.sse4a.extrq(<2 x i64> <i64 -1, i64 undef>, <16 x i8> <i8 16, i8 15, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0>) nounwind58  ret <2 x i64> %159}60 61define <2 x i64> @test_extrq_call_constexpr(<2 x i64> %x) {62; CHECK-LABEL: @test_extrq_call_constexpr(63; CHECK-NEXT:    [[TMP1:%.*]] = bitcast <2 x i64> [[X:%.*]] to <16 x i8>64; CHECK-NEXT:    [[TMP2:%.*]] = shufflevector <16 x i8> [[TMP1]], <16 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>65; CHECK-NEXT:    [[TMP3:%.*]] = bitcast <16 x i8> [[TMP2]] to <2 x i64>66; CHECK-NEXT:    ret <2 x i64> [[TMP3]]67;68  %1 = call <2 x i64> @llvm.x86.sse4a.extrq(<2 x i64> %x, <16 x i8> bitcast (<2 x i64> <i64 0, i64 undef> to <16 x i8>))69  ret <2 x i64> %170}71 72;73; EXTRQI74;75 76define <2 x i64> @test_extrqi_call(<2 x i64> %x) {77; CHECK-LABEL: @test_extrqi_call(78; CHECK-NEXT:    [[TMP1:%.*]] = tail call <2 x i64> @llvm.x86.sse4a.extrqi(<2 x i64> [[X:%.*]], i8 8, i8 23)79; CHECK-NEXT:    ret <2 x i64> [[TMP1]]80;81  %1 = tail call <2 x i64> @llvm.x86.sse4a.extrqi(<2 x i64> %x, i8 8, i8 23)82  ret <2 x i64> %183}84 85define <2 x i64> @test_extrqi_shuffle_1zuu(<2 x i64> %x) {86; CHECK-LABEL: @test_extrqi_shuffle_1zuu(87; CHECK-NEXT:    [[TMP1:%.*]] = bitcast <2 x i64> [[X:%.*]] to <16 x i8>88; CHECK-NEXT:    [[TMP2:%.*]] = shufflevector <16 x i8> [[TMP1]], <16 x i8> <i8 poison, i8 poison, i8 poison, i8 poison, i8 0, i8 0, i8 0, i8 0, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison>, <16 x i32> <i32 4, i32 5, i32 6, i32 7, i32 20, i32 21, i32 22, i32 23, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>89; CHECK-NEXT:    [[TMP3:%.*]] = bitcast <16 x i8> [[TMP2]] to <2 x i64>90; CHECK-NEXT:    ret <2 x i64> [[TMP3]]91;92  %1 = tail call <2 x i64> @llvm.x86.sse4a.extrqi(<2 x i64> %x, i8 32, i8 32)93  ret <2 x i64> %194}95 96define <2 x i64> @test_extrqi_shuffle_2zzzzzzzuuuuuuuu(<2 x i64> %x) {97; CHECK-LABEL: @test_extrqi_shuffle_2zzzzzzzuuuuuuuu(98; CHECK-NEXT:    [[TMP1:%.*]] = bitcast <2 x i64> [[X:%.*]] to <16 x i8>99; CHECK-NEXT:    [[TMP2:%.*]] = shufflevector <16 x i8> [[TMP1]], <16 x i8> <i8 poison, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison, i8 poison>, <16 x i32> <i32 2, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>100; CHECK-NEXT:    [[TMP3:%.*]] = bitcast <16 x i8> [[TMP2]] to <2 x i64>101; CHECK-NEXT:    ret <2 x i64> [[TMP3]]102;103  %1 = tail call <2 x i64> @llvm.x86.sse4a.extrqi(<2 x i64> %x, i8 8, i8 16)104  ret <2 x i64> %1105}106 107define <2 x i64> @test_extrqi_undef(<2 x i64> %x) {108; CHECK-LABEL: @test_extrqi_undef(109; CHECK-NEXT:    ret <2 x i64> undef110;111  %1 = tail call <2 x i64> @llvm.x86.sse4a.extrqi(<2 x i64> zeroinitializer, i8 32, i8 33)112  ret <2 x i64> %1113}114 115define <2 x i64> @test_extrqi_zero(<2 x i64> %x) {116; CHECK-LABEL: @test_extrqi_zero(117; CHECK-NEXT:    ret <2 x i64> <i64 0, i64 undef>118;119  %1 = tail call <2 x i64> @llvm.x86.sse4a.extrqi(<2 x i64> zeroinitializer, i8 3, i8 18)120  ret <2 x i64> %1121}122 123define <2 x i64> @test_extrqi_constant(<2 x i64> %x) {124; CHECK-LABEL: @test_extrqi_constant(125; CHECK-NEXT:    ret <2 x i64> <i64 7, i64 undef>126;127  %1 = tail call <2 x i64> @llvm.x86.sse4a.extrqi(<2 x i64> <i64 -1, i64 55>, i8 3, i8 18)128  ret <2 x i64> %1129}130 131define <2 x i64> @test_extrqi_constant_undef(<2 x i64> %x) {132; CHECK-LABEL: @test_extrqi_constant_undef(133; CHECK-NEXT:    ret <2 x i64> <i64 15, i64 undef>134;135  %1 = tail call <2 x i64> @llvm.x86.sse4a.extrqi(<2 x i64> <i64 -1, i64 undef>, i8 4, i8 18)136  ret <2 x i64> %1137}138 139define <2 x i64> @test_extrqi_call_constexpr() {140; CHECK-LABEL: @test_extrqi_call_constexpr(141; CHECK-NEXT:    ret <2 x i64> zeroinitializer142;143  %1 = tail call <2 x i64> @llvm.x86.sse4a.extrqi(<2 x i64> bitcast (<16 x i8> trunc (<16 x i16> bitcast (<4 x i64> <i64 0, i64 undef, i64 2, i64 undef> to <16 x i16>) to <16 x i8>) to <2 x i64>), i8 8, i8 16)144  ret <2 x i64> %1145}146 147;148; INSERTQ149;150 151define <2 x i64> @test_insertq_call(<2 x i64> %x, <2 x i64> %y) {152; CHECK-LABEL: @test_insertq_call(153; CHECK-NEXT:    [[TMP1:%.*]] = tail call <2 x i64> @llvm.x86.sse4a.insertq(<2 x i64> [[X:%.*]], <2 x i64> [[Y:%.*]]) #[[ATTR1]]154; CHECK-NEXT:    ret <2 x i64> [[TMP1]]155;156  %1 = tail call <2 x i64> @llvm.x86.sse4a.insertq(<2 x i64> %x, <2 x i64> %y) nounwind157  ret <2 x i64> %1158}159 160define <2 x i64> @test_insertq_to_insertqi(<2 x i64> %x, <2 x i64> %y) {161; CHECK-LABEL: @test_insertq_to_insertqi(162; CHECK-NEXT:    [[TMP1:%.*]] = call <2 x i64> @llvm.x86.sse4a.insertqi(<2 x i64> [[X:%.*]], <2 x i64> <i64 8, i64 poison>, i8 18, i8 2)163; CHECK-NEXT:    ret <2 x i64> [[TMP1]]164;165  %1 = tail call <2 x i64> @llvm.x86.sse4a.insertq(<2 x i64> %x, <2 x i64> <i64 8, i64 658>) nounwind166  ret <2 x i64> %1167}168 169define <2 x i64> @test_insertq_constant(<2 x i64> %x, <2 x i64> %y) {170; CHECK-LABEL: @test_insertq_constant(171; CHECK-NEXT:    ret <2 x i64> <i64 32, i64 undef>172;173  %1 = tail call <2 x i64> @llvm.x86.sse4a.insertq(<2 x i64> <i64 0, i64 0>, <2 x i64> <i64 8, i64 658>) nounwind174  ret <2 x i64> %1175}176 177define <2 x i64> @test_insertq_constant_undef(<2 x i64> %x, <2 x i64> %y) {178; CHECK-LABEL: @test_insertq_constant_undef(179; CHECK-NEXT:    ret <2 x i64> <i64 33, i64 undef>180;181  %1 = tail call <2 x i64> @llvm.x86.sse4a.insertq(<2 x i64> <i64 1, i64 undef>, <2 x i64> <i64 8, i64 658>) nounwind182  ret <2 x i64> %1183}184 185define <2 x i64> @test_insertq_call_constexpr(<2 x i64> %x) {186; CHECK-LABEL: @test_insertq_call_constexpr(187; CHECK-NEXT:    [[TMP1:%.*]] = call <2 x i64> @llvm.x86.sse4a.insertqi(<2 x i64> [[X:%.*]], <2 x i64> <i64 0, i64 poison>, i8 2, i8 0)188; CHECK-NEXT:    ret <2 x i64> [[TMP1]]189;190  %1 = tail call <2 x i64> @llvm.x86.sse4a.insertq(<2 x i64> %x, <2 x i64> bitcast (<16 x i8> trunc (<16 x i16> bitcast (<4 x i64> <i64 0, i64 undef, i64 2, i64 undef> to <16 x i16>) to <16 x i8>) to <2 x i64>))191  ret <2 x i64> %1192}193 194;195; INSERTQI196;197 198define <16 x i8> @test_insertqi_shuffle_04uu(<16 x i8> %v, <16 x i8> %i) {199; CHECK-LABEL: @test_insertqi_shuffle_04uu(200; CHECK-NEXT:    [[TMP1:%.*]] = shufflevector <16 x i8> [[V:%.*]], <16 x i8> [[I:%.*]], <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 16, i32 17, i32 18, i32 19, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>201; CHECK-NEXT:    ret <16 x i8> [[TMP1]]202;203  %1 = bitcast <16 x i8> %v to <2 x i64>204  %2 = bitcast <16 x i8> %i to <2 x i64>205  %3 = tail call <2 x i64> @llvm.x86.sse4a.insertqi(<2 x i64> %1, <2 x i64> %2, i8 32, i8 32)206  %4 = bitcast <2 x i64> %3 to <16 x i8>207  ret <16 x i8> %4208}209 210define <16 x i8> @test_insertqi_shuffle_8123uuuu(<16 x i8> %v, <16 x i8> %i) {211; CHECK-LABEL: @test_insertqi_shuffle_8123uuuu(212; CHECK-NEXT:    [[TMP1:%.*]] = shufflevector <16 x i8> [[I:%.*]], <16 x i8> [[V:%.*]], <16 x i32> <i32 0, i32 1, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>213; CHECK-NEXT:    ret <16 x i8> [[TMP1]]214;215  %1 = bitcast <16 x i8> %v to <2 x i64>216  %2 = bitcast <16 x i8> %i to <2 x i64>217  %3 = tail call <2 x i64> @llvm.x86.sse4a.insertqi(<2 x i64> %1, <2 x i64> %2, i8 16, i8 0)218  %4 = bitcast <2 x i64> %3 to <16 x i8>219  ret <16 x i8> %4220}221 222define <2 x i64> @test_insertqi_constant(<2 x i64> %v, <2 x i64> %i) {223; CHECK-LABEL: @test_insertqi_constant(224; CHECK-NEXT:    ret <2 x i64> <i64 -131055, i64 undef>225;226  %1 = tail call <2 x i64> @llvm.x86.sse4a.insertqi(<2 x i64> <i64 -1, i64 -1>, <2 x i64> <i64 8, i64 0>, i8 16, i8 1)227  ret <2 x i64> %1228}229 230define <2 x i64> @test_insertqi_call_constexpr(<2 x i64> %x) {231; CHECK-LABEL: @test_insertqi_call_constexpr(232; CHECK-NEXT:    [[TMP1:%.*]] = tail call <2 x i64> @llvm.x86.sse4a.insertqi(<2 x i64> [[X:%.*]], <2 x i64> <i64 0, i64 poison>, i8 48, i8 3)233; CHECK-NEXT:    ret <2 x i64> [[TMP1]]234;235  %1 = tail call <2 x i64> @llvm.x86.sse4a.insertqi(<2 x i64> %x, <2 x i64> bitcast (<16 x i8> trunc (<16 x i16> bitcast (<4 x i64> <i64 0, i64 undef, i64 2, i64 undef> to <16 x i16>) to <16 x i8>) to <2 x i64>), i8 48, i8 3)236  ret <2 x i64> %1237}238 239; The result of this insert is the second arg, since the top 64 bits of240; the result are undefined, and we copy the bottom 64 bits from the241; second arg242define <2 x i64> @testInsert64Bits(<2 x i64> %v, <2 x i64> %i) {243; CHECK-LABEL: @testInsert64Bits(244; CHECK-NEXT:    [[TMP1:%.*]] = bitcast <2 x i64> [[I:%.*]] to <16 x i8>245; CHECK-NEXT:    [[TMP2:%.*]] = shufflevector <16 x i8> [[TMP1]], <16 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>246; CHECK-NEXT:    [[TMP3:%.*]] = bitcast <16 x i8> [[TMP2]] to <2 x i64>247; CHECK-NEXT:    ret <2 x i64> [[TMP3]]248;249  %1 = tail call <2 x i64> @llvm.x86.sse4a.insertqi(<2 x i64> %v, <2 x i64> %i, i8 64, i8 0)250  ret <2 x i64> %1251}252 253define <2 x i64> @testZeroLength(<2 x i64> %v, <2 x i64> %i) {254; CHECK-LABEL: @testZeroLength(255; CHECK-NEXT:    [[TMP1:%.*]] = bitcast <2 x i64> [[I:%.*]] to <16 x i8>256; CHECK-NEXT:    [[TMP2:%.*]] = shufflevector <16 x i8> [[TMP1]], <16 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>257; CHECK-NEXT:    [[TMP3:%.*]] = bitcast <16 x i8> [[TMP2]] to <2 x i64>258; CHECK-NEXT:    ret <2 x i64> [[TMP3]]259;260  %1 = tail call <2 x i64> @llvm.x86.sse4a.insertqi(<2 x i64> %v, <2 x i64> %i, i8 0, i8 0)261  ret <2 x i64> %1262}263 264define <2 x i64> @testUndefinedInsertq_1(<2 x i64> %v, <2 x i64> %i) {265; CHECK-LABEL: @testUndefinedInsertq_1(266; CHECK-NEXT:    ret <2 x i64> undef267;268  %1 = tail call <2 x i64> @llvm.x86.sse4a.insertqi(<2 x i64> %v, <2 x i64> %i, i8 0, i8 16)269  ret <2 x i64> %1270}271 272define <2 x i64> @testUndefinedInsertq_2(<2 x i64> %v, <2 x i64> %i) {273; CHECK-LABEL: @testUndefinedInsertq_2(274; CHECK-NEXT:    ret <2 x i64> undef275;276  %1 = tail call <2 x i64> @llvm.x86.sse4a.insertqi(<2 x i64> %v, <2 x i64> %i, i8 48, i8 32)277  ret <2 x i64> %1278}279 280define <2 x i64> @testUndefinedInsertq_3(<2 x i64> %v, <2 x i64> %i) {281; CHECK-LABEL: @testUndefinedInsertq_3(282; CHECK-NEXT:    ret <2 x i64> undef283;284  %1 = tail call <2 x i64> @llvm.x86.sse4a.insertqi(<2 x i64> %v, <2 x i64> %i, i8 64, i8 16)285  ret <2 x i64> %1286}287 288;289; Vector Demanded Bits290;291 292define <2 x i64> @test_extrq_arg0(<2 x i64> %x, <16 x i8> %y) {293; CHECK-LABEL: @test_extrq_arg0(294; CHECK-NEXT:    [[TMP1:%.*]] = tail call <2 x i64> @llvm.x86.sse4a.extrq(<2 x i64> [[X:%.*]], <16 x i8> [[Y:%.*]]) #[[ATTR1]]295; CHECK-NEXT:    ret <2 x i64> [[TMP1]]296;297  %1 = shufflevector <2 x i64> %x, <2 x i64> undef, <2 x i32> <i32 0, i32 0>298  %2 = tail call <2 x i64> @llvm.x86.sse4a.extrq(<2 x i64> %1, <16 x i8> %y) nounwind299  ret <2 x i64> %2300}301 302define <2 x i64> @test_extrq_arg1(<2 x i64> %x, <16 x i8> %y) {303; CHECK-LABEL: @test_extrq_arg1(304; CHECK-NEXT:    [[TMP1:%.*]] = tail call <2 x i64> @llvm.x86.sse4a.extrq(<2 x i64> [[X:%.*]], <16 x i8> [[Y:%.*]]) #[[ATTR1]]305; CHECK-NEXT:    ret <2 x i64> [[TMP1]]306;307  %1 = shufflevector <16 x i8> %y, <16 x i8> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>308  %2 = tail call <2 x i64> @llvm.x86.sse4a.extrq(<2 x i64> %x, <16 x i8> %1) nounwind309  ret <2 x i64> %2310}311 312define <2 x i64> @test_extrq_args01(<2 x i64> %x, <16 x i8> %y) {313; CHECK-LABEL: @test_extrq_args01(314; CHECK-NEXT:    [[TMP1:%.*]] = tail call <2 x i64> @llvm.x86.sse4a.extrq(<2 x i64> [[X:%.*]], <16 x i8> [[Y:%.*]]) #[[ATTR1]]315; CHECK-NEXT:    ret <2 x i64> [[TMP1]]316;317  %1 = shufflevector <2 x i64> %x, <2 x i64> undef, <2 x i32> <i32 0, i32 0>318  %2 = shufflevector <16 x i8> %y, <16 x i8> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>319  %3 = tail call <2 x i64> @llvm.x86.sse4a.extrq(<2 x i64> %1, <16 x i8> %2) nounwind320  ret <2 x i64> %3321}322 323define <2 x i64> @test_extrq_ret(<2 x i64> %x, <16 x i8> %y) {324; CHECK-LABEL: @test_extrq_ret(325; CHECK-NEXT:    ret <2 x i64> poison326;327  %1 = tail call <2 x i64> @llvm.x86.sse4a.extrq(<2 x i64> %x, <16 x i8> %y) nounwind328  %2 = shufflevector <2 x i64> %1, <2 x i64> undef, <2 x i32> <i32 1, i32 1>329  ret <2 x i64> %2330}331 332define <2 x i64> @test_extrqi_arg0(<2 x i64> %x) {333; CHECK-LABEL: @test_extrqi_arg0(334; CHECK-NEXT:    [[TMP1:%.*]] = tail call <2 x i64> @llvm.x86.sse4a.extrqi(<2 x i64> [[X:%.*]], i8 3, i8 2)335; CHECK-NEXT:    ret <2 x i64> [[TMP1]]336;337  %1 = shufflevector <2 x i64> %x, <2 x i64> undef, <2 x i32> <i32 0, i32 0>338  %2 = tail call <2 x i64> @llvm.x86.sse4a.extrqi(<2 x i64> %1, i8 3, i8 2)339  ret <2 x i64> %2340}341 342define <2 x i64> @test_extrqi_ret(<2 x i64> %x) {343; CHECK-LABEL: @test_extrqi_ret(344; CHECK-NEXT:    ret <2 x i64> poison345;346  %1 = tail call <2 x i64> @llvm.x86.sse4a.extrqi(<2 x i64> %x, i8 3, i8 2) nounwind347  %2 = shufflevector <2 x i64> %1, <2 x i64> undef, <2 x i32> <i32 1, i32 1>348  ret <2 x i64> %2349}350 351define <2 x i64> @test_insertq_arg0(<2 x i64> %x, <2 x i64> %y) {352; CHECK-LABEL: @test_insertq_arg0(353; CHECK-NEXT:    [[TMP1:%.*]] = tail call <2 x i64> @llvm.x86.sse4a.insertq(<2 x i64> [[X:%.*]], <2 x i64> [[Y:%.*]]) #[[ATTR1]]354; CHECK-NEXT:    ret <2 x i64> [[TMP1]]355;356  %1 = shufflevector <2 x i64> %x, <2 x i64> undef, <2 x i32> <i32 0, i32 0>357  %2 = tail call <2 x i64> @llvm.x86.sse4a.insertq(<2 x i64> %1, <2 x i64> %y) nounwind358  ret <2 x i64> %2359}360 361define <2 x i64> @test_insertq_ret(<2 x i64> %x, <2 x i64> %y) {362; CHECK-LABEL: @test_insertq_ret(363; CHECK-NEXT:    ret <2 x i64> poison364;365  %1 = tail call <2 x i64> @llvm.x86.sse4a.insertq(<2 x i64> %x, <2 x i64> %y) nounwind366  %2 = shufflevector <2 x i64> %1, <2 x i64> undef, <2 x i32> <i32 1, i32 1>367  ret <2 x i64> %2368}369 370define <2 x i64> @test_insertqi_arg0(<2 x i64> %x, <2 x i64> %y) {371; CHECK-LABEL: @test_insertqi_arg0(372; CHECK-NEXT:    [[TMP1:%.*]] = tail call <2 x i64> @llvm.x86.sse4a.insertqi(<2 x i64> [[X:%.*]], <2 x i64> [[Y:%.*]], i8 3, i8 2) #[[ATTR1]]373; CHECK-NEXT:    ret <2 x i64> [[TMP1]]374;375  %1 = shufflevector <2 x i64> %x, <2 x i64> undef, <2 x i32> <i32 0, i32 0>376  %2 = tail call <2 x i64> @llvm.x86.sse4a.insertqi(<2 x i64> %1, <2 x i64> %y, i8 3, i8 2) nounwind377  ret <2 x i64> %2378}379 380define <2 x i64> @test_insertqi_arg1(<2 x i64> %x, <2 x i64> %y) {381; CHECK-LABEL: @test_insertqi_arg1(382; CHECK-NEXT:    [[TMP1:%.*]] = tail call <2 x i64> @llvm.x86.sse4a.insertqi(<2 x i64> [[X:%.*]], <2 x i64> [[Y:%.*]], i8 3, i8 2) #[[ATTR1]]383; CHECK-NEXT:    ret <2 x i64> [[TMP1]]384;385  %1 = shufflevector <2 x i64> %y, <2 x i64> undef, <2 x i32> <i32 0, i32 0>386  %2 = tail call <2 x i64> @llvm.x86.sse4a.insertqi(<2 x i64> %x, <2 x i64> %1, i8 3, i8 2) nounwind387  ret <2 x i64> %2388}389 390define <2 x i64> @test_insertqi_args01(<2 x i64> %x, <2 x i64> %y) {391; CHECK-LABEL: @test_insertqi_args01(392; CHECK-NEXT:    [[TMP1:%.*]] = tail call <2 x i64> @llvm.x86.sse4a.insertqi(<2 x i64> [[X:%.*]], <2 x i64> [[Y:%.*]], i8 3, i8 2) #[[ATTR1]]393; CHECK-NEXT:    ret <2 x i64> [[TMP1]]394;395  %1 = shufflevector <2 x i64> %x, <2 x i64> undef, <2 x i32> <i32 0, i32 0>396  %2 = shufflevector <2 x i64> %y, <2 x i64> undef, <2 x i32> <i32 0, i32 0>397  %3 = tail call <2 x i64> @llvm.x86.sse4a.insertqi(<2 x i64> %1, <2 x i64> %2, i8 3, i8 2) nounwind398  ret <2 x i64> %3399}400 401define <2 x i64> @test_insertqi_ret(<2 x i64> %x, <2 x i64> %y) {402; CHECK-LABEL: @test_insertqi_ret(403; CHECK-NEXT:    ret <2 x i64> poison404;405  %1 = tail call <2 x i64> @llvm.x86.sse4a.insertqi(<2 x i64> %x, <2 x i64> %y, i8 3, i8 2) nounwind406  %2 = shufflevector <2 x i64> %1, <2 x i64> undef, <2 x i32> <i32 1, i32 1>407  ret <2 x i64> %2408}409 410declare <2 x i64> @llvm.x86.sse4a.extrq(<2 x i64>, <16 x i8>) nounwind411 412declare <2 x i64> @llvm.x86.sse4a.extrqi(<2 x i64>, i8, i8) nounwind413 414declare <2 x i64> @llvm.x86.sse4a.insertq(<2 x i64>, <2 x i64>) nounwind415 416declare <2 x i64> @llvm.x86.sse4a.insertqi(<2 x i64>, <2 x i64>, i8, i8) nounwind417