3171 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=wasm32-unknown-unknown -mattr=+simd128,+nontrapping-fptoint | FileCheck %s3 4; i32 saturate5 6define <2 x i32> @stest_f64i32(<2 x double> %x) {7; CHECK-LABEL: stest_f64i32:8; CHECK: .functype stest_f64i32 (v128) -> (v128)9; CHECK-NEXT: .local v12810; CHECK-NEXT: # %bb.0: # %entry11; CHECK-NEXT: local.get 012; CHECK-NEXT: f64x2.extract_lane 013; CHECK-NEXT: i64.trunc_sat_f64_s14; CHECK-NEXT: i64x2.splat15; CHECK-NEXT: local.get 016; CHECK-NEXT: f64x2.extract_lane 117; CHECK-NEXT: i64.trunc_sat_f64_s18; CHECK-NEXT: i64x2.replace_lane 119; CHECK-NEXT: local.tee 020; CHECK-NEXT: v128.const 2147483647, 214748364721; CHECK-NEXT: local.tee 122; CHECK-NEXT: local.get 023; CHECK-NEXT: local.get 124; CHECK-NEXT: i64x2.lt_s25; CHECK-NEXT: v128.bitselect26; CHECK-NEXT: local.tee 027; CHECK-NEXT: v128.const -2147483648, -214748364828; CHECK-NEXT: local.tee 129; CHECK-NEXT: local.get 030; CHECK-NEXT: local.get 131; CHECK-NEXT: i64x2.gt_s32; CHECK-NEXT: v128.bitselect33; CHECK-NEXT: local.get 034; CHECK-NEXT: i8x16.shuffle 0, 1, 2, 3, 8, 9, 10, 11, 0, 1, 2, 3, 0, 1, 2, 335; CHECK-NEXT: # fallthrough-return36entry:37 %conv = fptosi <2 x double> %x to <2 x i64>38 %0 = icmp slt <2 x i64> %conv, <i64 2147483647, i64 2147483647>39 %spec.store.select = select <2 x i1> %0, <2 x i64> %conv, <2 x i64> <i64 2147483647, i64 2147483647>40 %1 = icmp sgt <2 x i64> %spec.store.select, <i64 -2147483648, i64 -2147483648>41 %spec.store.select7 = select <2 x i1> %1, <2 x i64> %spec.store.select, <2 x i64> <i64 -2147483648, i64 -2147483648>42 %conv6 = trunc <2 x i64> %spec.store.select7 to <2 x i32>43 ret <2 x i32> %conv644}45 46define <2 x i32> @utest_f64i32(<2 x double> %x) {47; CHECK-LABEL: utest_f64i32:48; CHECK: .functype utest_f64i32 (v128) -> (v128)49; CHECK-NEXT: .local i64, i6450; CHECK-NEXT: # %bb.0: # %entry51; CHECK-NEXT: local.get 052; CHECK-NEXT: f64x2.extract_lane 053; CHECK-NEXT: i64.trunc_sat_f64_u54; CHECK-NEXT: local.tee 155; CHECK-NEXT: i64x2.splat56; CHECK-NEXT: local.get 057; CHECK-NEXT: f64x2.extract_lane 158; CHECK-NEXT: i64.trunc_sat_f64_u59; CHECK-NEXT: local.tee 260; CHECK-NEXT: i64x2.replace_lane 161; CHECK-NEXT: v128.const 4294967295, 429496729562; CHECK-NEXT: i64.const -163; CHECK-NEXT: i64.const 064; CHECK-NEXT: local.get 165; CHECK-NEXT: i64.const 429496729566; CHECK-NEXT: i64.lt_u67; CHECK-NEXT: i64.select68; CHECK-NEXT: i64x2.splat69; CHECK-NEXT: i64.const -170; CHECK-NEXT: i64.const 071; CHECK-NEXT: local.get 272; CHECK-NEXT: i64.const 429496729573; CHECK-NEXT: i64.lt_u74; CHECK-NEXT: i64.select75; CHECK-NEXT: i64x2.replace_lane 176; CHECK-NEXT: v128.bitselect77; CHECK-NEXT: local.get 078; CHECK-NEXT: i8x16.shuffle 0, 1, 2, 3, 8, 9, 10, 11, 0, 1, 2, 3, 0, 1, 2, 379; CHECK-NEXT: # fallthrough-return80entry:81 %conv = fptoui <2 x double> %x to <2 x i64>82 %0 = icmp ult <2 x i64> %conv, <i64 4294967295, i64 4294967295>83 %spec.store.select = select <2 x i1> %0, <2 x i64> %conv, <2 x i64> <i64 4294967295, i64 4294967295>84 %conv6 = trunc <2 x i64> %spec.store.select to <2 x i32>85 ret <2 x i32> %conv686}87 88define <2 x i32> @ustest_f64i32(<2 x double> %x) {89; CHECK-LABEL: ustest_f64i32:90; CHECK: .functype ustest_f64i32 (v128) -> (v128)91; CHECK-NEXT: .local v12892; CHECK-NEXT: # %bb.0: # %entry93; CHECK-NEXT: local.get 094; CHECK-NEXT: f64x2.extract_lane 095; CHECK-NEXT: i64.trunc_sat_f64_s96; CHECK-NEXT: i64x2.splat97; CHECK-NEXT: local.get 098; CHECK-NEXT: f64x2.extract_lane 199; CHECK-NEXT: i64.trunc_sat_f64_s100; CHECK-NEXT: i64x2.replace_lane 1101; CHECK-NEXT: local.tee 0102; CHECK-NEXT: v128.const 4294967295, 4294967295103; CHECK-NEXT: local.tee 1104; CHECK-NEXT: local.get 0105; CHECK-NEXT: local.get 1106; CHECK-NEXT: i64x2.lt_s107; CHECK-NEXT: v128.bitselect108; CHECK-NEXT: local.tee 0109; CHECK-NEXT: v128.const 0, 0110; CHECK-NEXT: i64x2.gt_s111; CHECK-NEXT: local.get 0112; CHECK-NEXT: v128.and113; CHECK-NEXT: local.get 0114; CHECK-NEXT: i8x16.shuffle 0, 1, 2, 3, 8, 9, 10, 11, 0, 1, 2, 3, 0, 1, 2, 3115; CHECK-NEXT: # fallthrough-return116entry:117 %conv = fptosi <2 x double> %x to <2 x i64>118 %0 = icmp slt <2 x i64> %conv, <i64 4294967295, i64 4294967295>119 %spec.store.select = select <2 x i1> %0, <2 x i64> %conv, <2 x i64> <i64 4294967295, i64 4294967295>120 %1 = icmp sgt <2 x i64> %spec.store.select, zeroinitializer121 %spec.store.select7 = select <2 x i1> %1, <2 x i64> %spec.store.select, <2 x i64> zeroinitializer122 %conv6 = trunc <2 x i64> %spec.store.select7 to <2 x i32>123 ret <2 x i32> %conv6124}125 126define <4 x i32> @stest_f32i32(<4 x float> %x) {127; CHECK-LABEL: stest_f32i32:128; CHECK: .functype stest_f32i32 (v128) -> (v128)129; CHECK-NEXT: # %bb.0: # %entry130; CHECK-NEXT: local.get 0131; CHECK-NEXT: i32x4.trunc_sat_f32x4_s132; CHECK-NEXT: # fallthrough-return133entry:134 %conv = fptosi <4 x float> %x to <4 x i64>135 %0 = icmp slt <4 x i64> %conv, <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>136 %spec.store.select = select <4 x i1> %0, <4 x i64> %conv, <4 x i64> <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>137 %1 = icmp sgt <4 x i64> %spec.store.select, <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>138 %spec.store.select7 = select <4 x i1> %1, <4 x i64> %spec.store.select, <4 x i64> <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>139 %conv6 = trunc <4 x i64> %spec.store.select7 to <4 x i32>140 ret <4 x i32> %conv6141}142 143define <4 x i32> @utest_f32i32(<4 x float> %x) {144; CHECK-LABEL: utest_f32i32:145; CHECK: .functype utest_f32i32 (v128) -> (v128)146; CHECK-NEXT: # %bb.0: # %entry147; CHECK-NEXT: local.get 0148; CHECK-NEXT: i32x4.trunc_sat_f32x4_u149; CHECK-NEXT: # fallthrough-return150entry:151 %conv = fptoui <4 x float> %x to <4 x i64>152 %0 = icmp ult <4 x i64> %conv, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>153 %spec.store.select = select <4 x i1> %0, <4 x i64> %conv, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>154 %conv6 = trunc <4 x i64> %spec.store.select to <4 x i32>155 ret <4 x i32> %conv6156}157 158define <4 x i32> @ustest_f32i32(<4 x float> %x) {159; CHECK-LABEL: ustest_f32i32:160; CHECK: .functype ustest_f32i32 (v128) -> (v128)161; CHECK-NEXT: # %bb.0: # %entry162; CHECK-NEXT: local.get 0163; CHECK-NEXT: i32x4.trunc_sat_f32x4_u164; CHECK-NEXT: # fallthrough-return165entry:166 %conv = fptosi <4 x float> %x to <4 x i64>167 %0 = icmp slt <4 x i64> %conv, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>168 %spec.store.select = select <4 x i1> %0, <4 x i64> %conv, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>169 %1 = icmp sgt <4 x i64> %spec.store.select, zeroinitializer170 %spec.store.select7 = select <4 x i1> %1, <4 x i64> %spec.store.select, <4 x i64> zeroinitializer171 %conv6 = trunc <4 x i64> %spec.store.select7 to <4 x i32>172 ret <4 x i32> %conv6173}174 175define <4 x i32> @stest_f16i32(<4 x half> %x) {176; CHECK-LABEL: stest_f16i32:177; CHECK: .functype stest_f16i32 (f32, f32, f32, f32) -> (v128)178; CHECK-NEXT: # %bb.0: # %entry179; CHECK-NEXT: local.get 1180; CHECK-NEXT: call __truncsfhf2181; CHECK-NEXT: call __extendhfsf2182; CHECK-NEXT: local.set 1183; CHECK-NEXT: local.get 0184; CHECK-NEXT: call __truncsfhf2185; CHECK-NEXT: call __extendhfsf2186; CHECK-NEXT: i32.trunc_sat_f32_s187; CHECK-NEXT: i32x4.splat188; CHECK-NEXT: local.get 1189; CHECK-NEXT: i32.trunc_sat_f32_s190; CHECK-NEXT: i32x4.replace_lane 1191; CHECK-NEXT: local.get 2192; CHECK-NEXT: call __truncsfhf2193; CHECK-NEXT: call __extendhfsf2194; CHECK-NEXT: i32.trunc_sat_f32_s195; CHECK-NEXT: i32x4.replace_lane 2196; CHECK-NEXT: local.get 3197; CHECK-NEXT: call __truncsfhf2198; CHECK-NEXT: call __extendhfsf2199; CHECK-NEXT: i32.trunc_sat_f32_s200; CHECK-NEXT: i32x4.replace_lane 3201; CHECK-NEXT: # fallthrough-return202entry:203 %conv = fptosi <4 x half> %x to <4 x i64>204 %0 = icmp slt <4 x i64> %conv, <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>205 %spec.store.select = select <4 x i1> %0, <4 x i64> %conv, <4 x i64> <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>206 %1 = icmp sgt <4 x i64> %spec.store.select, <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>207 %spec.store.select7 = select <4 x i1> %1, <4 x i64> %spec.store.select, <4 x i64> <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>208 %conv6 = trunc <4 x i64> %spec.store.select7 to <4 x i32>209 ret <4 x i32> %conv6210}211 212define <4 x i32> @utest_f16i32(<4 x half> %x) {213; CHECK-LABEL: utest_f16i32:214; CHECK: .functype utest_f16i32 (f32, f32, f32, f32) -> (v128)215; CHECK-NEXT: # %bb.0: # %entry216; CHECK-NEXT: local.get 1217; CHECK-NEXT: call __truncsfhf2218; CHECK-NEXT: call __extendhfsf2219; CHECK-NEXT: local.set 1220; CHECK-NEXT: local.get 0221; CHECK-NEXT: call __truncsfhf2222; CHECK-NEXT: call __extendhfsf2223; CHECK-NEXT: i32.trunc_sat_f32_u224; CHECK-NEXT: i32x4.splat225; CHECK-NEXT: local.get 1226; CHECK-NEXT: i32.trunc_sat_f32_u227; CHECK-NEXT: i32x4.replace_lane 1228; CHECK-NEXT: local.get 2229; CHECK-NEXT: call __truncsfhf2230; CHECK-NEXT: call __extendhfsf2231; CHECK-NEXT: i32.trunc_sat_f32_u232; CHECK-NEXT: i32x4.replace_lane 2233; CHECK-NEXT: local.get 3234; CHECK-NEXT: call __truncsfhf2235; CHECK-NEXT: call __extendhfsf2236; CHECK-NEXT: i32.trunc_sat_f32_u237; CHECK-NEXT: i32x4.replace_lane 3238; CHECK-NEXT: # fallthrough-return239entry:240 %conv = fptoui <4 x half> %x to <4 x i64>241 %0 = icmp ult <4 x i64> %conv, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>242 %spec.store.select = select <4 x i1> %0, <4 x i64> %conv, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>243 %conv6 = trunc <4 x i64> %spec.store.select to <4 x i32>244 ret <4 x i32> %conv6245}246 247define <4 x i32> @ustest_f16i32(<4 x half> %x) {248; CHECK-LABEL: ustest_f16i32:249; CHECK: .functype ustest_f16i32 (f32, f32, f32, f32) -> (v128)250; CHECK-NEXT: # %bb.0: # %entry251; CHECK-NEXT: local.get 1252; CHECK-NEXT: call __truncsfhf2253; CHECK-NEXT: call __extendhfsf2254; CHECK-NEXT: local.set 1255; CHECK-NEXT: local.get 0256; CHECK-NEXT: call __truncsfhf2257; CHECK-NEXT: call __extendhfsf2258; CHECK-NEXT: i32.trunc_sat_f32_u259; CHECK-NEXT: i32x4.splat260; CHECK-NEXT: local.get 1261; CHECK-NEXT: i32.trunc_sat_f32_u262; CHECK-NEXT: i32x4.replace_lane 1263; CHECK-NEXT: local.get 2264; CHECK-NEXT: call __truncsfhf2265; CHECK-NEXT: call __extendhfsf2266; CHECK-NEXT: i32.trunc_sat_f32_u267; CHECK-NEXT: i32x4.replace_lane 2268; CHECK-NEXT: local.get 3269; CHECK-NEXT: call __truncsfhf2270; CHECK-NEXT: call __extendhfsf2271; CHECK-NEXT: i32.trunc_sat_f32_u272; CHECK-NEXT: i32x4.replace_lane 3273; CHECK-NEXT: # fallthrough-return274entry:275 %conv = fptosi <4 x half> %x to <4 x i64>276 %0 = icmp slt <4 x i64> %conv, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>277 %spec.store.select = select <4 x i1> %0, <4 x i64> %conv, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>278 %1 = icmp sgt <4 x i64> %spec.store.select, zeroinitializer279 %spec.store.select7 = select <4 x i1> %1, <4 x i64> %spec.store.select, <4 x i64> zeroinitializer280 %conv6 = trunc <4 x i64> %spec.store.select7 to <4 x i32>281 ret <4 x i32> %conv6282}283 284; i16 saturate285 286define <2 x i16> @stest_f64i16(<2 x double> %x) {287; CHECK-LABEL: stest_f64i16:288; CHECK: .functype stest_f64i16 (v128) -> (v128)289; CHECK-NEXT: # %bb.0: # %entry290; CHECK-NEXT: local.get 0291; CHECK-NEXT: f64x2.extract_lane 0292; CHECK-NEXT: i32.trunc_sat_f64_s293; CHECK-NEXT: i32x4.splat294; CHECK-NEXT: local.get 0295; CHECK-NEXT: f64x2.extract_lane 1296; CHECK-NEXT: i32.trunc_sat_f64_s297; CHECK-NEXT: i32x4.replace_lane 1298; CHECK-NEXT: v128.const 32767, 32767, 32767, 32767299; CHECK-NEXT: i32x4.min_s300; CHECK-NEXT: v128.const -32768, -32768, -32768, -32768301; CHECK-NEXT: i32x4.max_s302; CHECK-NEXT: local.get 0303; CHECK-NEXT: i8x16.shuffle 0, 1, 4, 5, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1304; CHECK-NEXT: # fallthrough-return305entry:306 %conv = fptosi <2 x double> %x to <2 x i32>307 %0 = icmp slt <2 x i32> %conv, <i32 32767, i32 32767>308 %spec.store.select = select <2 x i1> %0, <2 x i32> %conv, <2 x i32> <i32 32767, i32 32767>309 %1 = icmp sgt <2 x i32> %spec.store.select, <i32 -32768, i32 -32768>310 %spec.store.select7 = select <2 x i1> %1, <2 x i32> %spec.store.select, <2 x i32> <i32 -32768, i32 -32768>311 %conv6 = trunc <2 x i32> %spec.store.select7 to <2 x i16>312 ret <2 x i16> %conv6313}314 315define <2 x i16> @utest_f64i16(<2 x double> %x) {316; CHECK-LABEL: utest_f64i16:317; CHECK: .functype utest_f64i16 (v128) -> (v128)318; CHECK-NEXT: # %bb.0: # %entry319; CHECK-NEXT: local.get 0320; CHECK-NEXT: f64x2.extract_lane 0321; CHECK-NEXT: i32.trunc_sat_f64_u322; CHECK-NEXT: i32x4.splat323; CHECK-NEXT: local.get 0324; CHECK-NEXT: f64x2.extract_lane 1325; CHECK-NEXT: i32.trunc_sat_f64_u326; CHECK-NEXT: i32x4.replace_lane 1327; CHECK-NEXT: v128.const 65535, 65535, 65535, 65535328; CHECK-NEXT: i32x4.min_u329; CHECK-NEXT: local.get 0330; CHECK-NEXT: i8x16.shuffle 0, 1, 4, 5, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1331; CHECK-NEXT: # fallthrough-return332entry:333 %conv = fptoui <2 x double> %x to <2 x i32>334 %0 = icmp ult <2 x i32> %conv, <i32 65535, i32 65535>335 %spec.store.select = select <2 x i1> %0, <2 x i32> %conv, <2 x i32> <i32 65535, i32 65535>336 %conv6 = trunc <2 x i32> %spec.store.select to <2 x i16>337 ret <2 x i16> %conv6338}339 340define <2 x i16> @ustest_f64i16(<2 x double> %x) {341; CHECK-LABEL: ustest_f64i16:342; CHECK: .functype ustest_f64i16 (v128) -> (v128)343; CHECK-NEXT: # %bb.0: # %entry344; CHECK-NEXT: local.get 0345; CHECK-NEXT: f64x2.extract_lane 0346; CHECK-NEXT: i32.trunc_sat_f64_s347; CHECK-NEXT: i32x4.splat348; CHECK-NEXT: local.get 0349; CHECK-NEXT: f64x2.extract_lane 1350; CHECK-NEXT: i32.trunc_sat_f64_s351; CHECK-NEXT: i32x4.replace_lane 1352; CHECK-NEXT: v128.const 65535, 65535, 65535, 65535353; CHECK-NEXT: i32x4.min_s354; CHECK-NEXT: v128.const 0, 0, 0, 0355; CHECK-NEXT: i32x4.max_s356; CHECK-NEXT: local.get 0357; CHECK-NEXT: i8x16.shuffle 0, 1, 4, 5, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1358; CHECK-NEXT: # fallthrough-return359entry:360 %conv = fptosi <2 x double> %x to <2 x i32>361 %0 = icmp slt <2 x i32> %conv, <i32 65535, i32 65535>362 %spec.store.select = select <2 x i1> %0, <2 x i32> %conv, <2 x i32> <i32 65535, i32 65535>363 %1 = icmp sgt <2 x i32> %spec.store.select, zeroinitializer364 %spec.store.select7 = select <2 x i1> %1, <2 x i32> %spec.store.select, <2 x i32> zeroinitializer365 %conv6 = trunc <2 x i32> %spec.store.select7 to <2 x i16>366 ret <2 x i16> %conv6367}368 369define <4 x i16> @stest_f32i16(<4 x float> %x) {370; CHECK-LABEL: stest_f32i16:371; CHECK: .functype stest_f32i16 (v128) -> (v128)372; CHECK-NEXT: # %bb.0: # %entry373; CHECK-NEXT: local.get 0374; CHECK-NEXT: i32x4.trunc_sat_f32x4_s375; CHECK-NEXT: v128.const 32767, 32767, 32767, 32767376; CHECK-NEXT: i32x4.min_s377; CHECK-NEXT: v128.const -32768, -32768, -32768, -32768378; CHECK-NEXT: i32x4.max_s379; CHECK-NEXT: local.get 0380; CHECK-NEXT: i8x16.shuffle 0, 1, 4, 5, 8, 9, 12, 13, 0, 1, 0, 1, 0, 1, 0, 1381; CHECK-NEXT: # fallthrough-return382entry:383 %conv = fptosi <4 x float> %x to <4 x i32>384 %0 = icmp slt <4 x i32> %conv, <i32 32767, i32 32767, i32 32767, i32 32767>385 %spec.store.select = select <4 x i1> %0, <4 x i32> %conv, <4 x i32> <i32 32767, i32 32767, i32 32767, i32 32767>386 %1 = icmp sgt <4 x i32> %spec.store.select, <i32 -32768, i32 -32768, i32 -32768, i32 -32768>387 %spec.store.select7 = select <4 x i1> %1, <4 x i32> %spec.store.select, <4 x i32> <i32 -32768, i32 -32768, i32 -32768, i32 -32768>388 %conv6 = trunc <4 x i32> %spec.store.select7 to <4 x i16>389 ret <4 x i16> %conv6390}391 392define <4 x i16> @utest_f32i16(<4 x float> %x) {393; CHECK-LABEL: utest_f32i16:394; CHECK: .functype utest_f32i16 (v128) -> (v128)395; CHECK-NEXT: # %bb.0: # %entry396; CHECK-NEXT: local.get 0397; CHECK-NEXT: i32x4.trunc_sat_f32x4_u398; CHECK-NEXT: v128.const 65535, 65535, 65535, 65535399; CHECK-NEXT: i32x4.min_u400; CHECK-NEXT: local.get 0401; CHECK-NEXT: i8x16.shuffle 0, 1, 4, 5, 8, 9, 12, 13, 0, 1, 0, 1, 0, 1, 0, 1402; CHECK-NEXT: # fallthrough-return403entry:404 %conv = fptoui <4 x float> %x to <4 x i32>405 %0 = icmp ult <4 x i32> %conv, <i32 65535, i32 65535, i32 65535, i32 65535>406 %spec.store.select = select <4 x i1> %0, <4 x i32> %conv, <4 x i32> <i32 65535, i32 65535, i32 65535, i32 65535>407 %conv6 = trunc <4 x i32> %spec.store.select to <4 x i16>408 ret <4 x i16> %conv6409}410 411define <4 x i16> @ustest_f32i16(<4 x float> %x) {412; CHECK-LABEL: ustest_f32i16:413; CHECK: .functype ustest_f32i16 (v128) -> (v128)414; CHECK-NEXT: # %bb.0: # %entry415; CHECK-NEXT: local.get 0416; CHECK-NEXT: i32x4.trunc_sat_f32x4_s417; CHECK-NEXT: v128.const 65535, 65535, 65535, 65535418; CHECK-NEXT: i32x4.min_s419; CHECK-NEXT: v128.const 0, 0, 0, 0420; CHECK-NEXT: i32x4.max_s421; CHECK-NEXT: local.get 0422; CHECK-NEXT: i8x16.shuffle 0, 1, 4, 5, 8, 9, 12, 13, 0, 1, 0, 1, 0, 1, 0, 1423; CHECK-NEXT: # fallthrough-return424entry:425 %conv = fptosi <4 x float> %x to <4 x i32>426 %0 = icmp slt <4 x i32> %conv, <i32 65535, i32 65535, i32 65535, i32 65535>427 %spec.store.select = select <4 x i1> %0, <4 x i32> %conv, <4 x i32> <i32 65535, i32 65535, i32 65535, i32 65535>428 %1 = icmp sgt <4 x i32> %spec.store.select, zeroinitializer429 %spec.store.select7 = select <4 x i1> %1, <4 x i32> %spec.store.select, <4 x i32> zeroinitializer430 %conv6 = trunc <4 x i32> %spec.store.select7 to <4 x i16>431 ret <4 x i16> %conv6432}433 434define <8 x i16> @stest_f16i16(<8 x half> %x) {435; CHECK-LABEL: stest_f16i16:436; CHECK: .functype stest_f16i16 (f32, f32, f32, f32, f32, f32, f32, f32) -> (v128)437; CHECK-NEXT: # %bb.0: # %entry438; CHECK-NEXT: local.get 5439; CHECK-NEXT: call __truncsfhf2440; CHECK-NEXT: call __extendhfsf2441; CHECK-NEXT: local.set 5442; CHECK-NEXT: local.get 4443; CHECK-NEXT: call __truncsfhf2444; CHECK-NEXT: call __extendhfsf2445; CHECK-NEXT: local.set 4446; CHECK-NEXT: local.get 6447; CHECK-NEXT: call __truncsfhf2448; CHECK-NEXT: call __extendhfsf2449; CHECK-NEXT: local.set 6450; CHECK-NEXT: local.get 7451; CHECK-NEXT: call __truncsfhf2452; CHECK-NEXT: call __extendhfsf2453; CHECK-NEXT: local.set 7454; CHECK-NEXT: local.get 1455; CHECK-NEXT: call __truncsfhf2456; CHECK-NEXT: call __extendhfsf2457; CHECK-NEXT: local.set 1458; CHECK-NEXT: local.get 0459; CHECK-NEXT: call __truncsfhf2460; CHECK-NEXT: call __extendhfsf2461; CHECK-NEXT: i32.trunc_sat_f32_s462; CHECK-NEXT: i32x4.splat463; CHECK-NEXT: local.get 1464; CHECK-NEXT: i32.trunc_sat_f32_s465; CHECK-NEXT: i32x4.replace_lane 1466; CHECK-NEXT: local.get 2467; CHECK-NEXT: call __truncsfhf2468; CHECK-NEXT: call __extendhfsf2469; CHECK-NEXT: i32.trunc_sat_f32_s470; CHECK-NEXT: i32x4.replace_lane 2471; CHECK-NEXT: local.get 3472; CHECK-NEXT: call __truncsfhf2473; CHECK-NEXT: call __extendhfsf2474; CHECK-NEXT: i32.trunc_sat_f32_s475; CHECK-NEXT: i32x4.replace_lane 3476; CHECK-NEXT: local.get 4477; CHECK-NEXT: i32.trunc_sat_f32_s478; CHECK-NEXT: i32x4.splat479; CHECK-NEXT: local.get 5480; CHECK-NEXT: i32.trunc_sat_f32_s481; CHECK-NEXT: i32x4.replace_lane 1482; CHECK-NEXT: local.get 6483; CHECK-NEXT: i32.trunc_sat_f32_s484; CHECK-NEXT: i32x4.replace_lane 2485; CHECK-NEXT: local.get 7486; CHECK-NEXT: i32.trunc_sat_f32_s487; CHECK-NEXT: i32x4.replace_lane 3488; CHECK-NEXT: i16x8.narrow_i32x4_s489; CHECK-NEXT: # fallthrough-return490entry:491 %conv = fptosi <8 x half> %x to <8 x i32>492 %0 = icmp slt <8 x i32> %conv, <i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767>493 %spec.store.select = select <8 x i1> %0, <8 x i32> %conv, <8 x i32> <i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767>494 %1 = icmp sgt <8 x i32> %spec.store.select, <i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768>495 %spec.store.select7 = select <8 x i1> %1, <8 x i32> %spec.store.select, <8 x i32> <i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768>496 %conv6 = trunc <8 x i32> %spec.store.select7 to <8 x i16>497 ret <8 x i16> %conv6498}499 500define <8 x i16> @utest_f16i16(<8 x half> %x) {501; CHECK-LABEL: utest_f16i16:502; CHECK: .functype utest_f16i16 (f32, f32, f32, f32, f32, f32, f32, f32) -> (v128)503; CHECK-NEXT: # %bb.0: # %entry504; CHECK-NEXT: local.get 5505; CHECK-NEXT: call __truncsfhf2506; CHECK-NEXT: call __extendhfsf2507; CHECK-NEXT: local.set 5508; CHECK-NEXT: local.get 4509; CHECK-NEXT: call __truncsfhf2510; CHECK-NEXT: call __extendhfsf2511; CHECK-NEXT: local.set 4512; CHECK-NEXT: local.get 6513; CHECK-NEXT: call __truncsfhf2514; CHECK-NEXT: call __extendhfsf2515; CHECK-NEXT: local.set 6516; CHECK-NEXT: local.get 7517; CHECK-NEXT: call __truncsfhf2518; CHECK-NEXT: call __extendhfsf2519; CHECK-NEXT: local.set 7520; CHECK-NEXT: local.get 1521; CHECK-NEXT: call __truncsfhf2522; CHECK-NEXT: call __extendhfsf2523; CHECK-NEXT: local.set 1524; CHECK-NEXT: local.get 0525; CHECK-NEXT: call __truncsfhf2526; CHECK-NEXT: call __extendhfsf2527; CHECK-NEXT: i32.trunc_sat_f32_u528; CHECK-NEXT: i32x4.splat529; CHECK-NEXT: local.get 1530; CHECK-NEXT: i32.trunc_sat_f32_u531; CHECK-NEXT: i32x4.replace_lane 1532; CHECK-NEXT: local.get 2533; CHECK-NEXT: call __truncsfhf2534; CHECK-NEXT: call __extendhfsf2535; CHECK-NEXT: i32.trunc_sat_f32_u536; CHECK-NEXT: i32x4.replace_lane 2537; CHECK-NEXT: local.get 3538; CHECK-NEXT: call __truncsfhf2539; CHECK-NEXT: call __extendhfsf2540; CHECK-NEXT: i32.trunc_sat_f32_u541; CHECK-NEXT: i32x4.replace_lane 3542; CHECK-NEXT: local.get 4543; CHECK-NEXT: i32.trunc_sat_f32_u544; CHECK-NEXT: i32x4.splat545; CHECK-NEXT: local.get 5546; CHECK-NEXT: i32.trunc_sat_f32_u547; CHECK-NEXT: i32x4.replace_lane 1548; CHECK-NEXT: local.get 6549; CHECK-NEXT: i32.trunc_sat_f32_u550; CHECK-NEXT: i32x4.replace_lane 2551; CHECK-NEXT: local.get 7552; CHECK-NEXT: i32.trunc_sat_f32_u553; CHECK-NEXT: i32x4.replace_lane 3554; CHECK-NEXT: i16x8.narrow_i32x4_u555; CHECK-NEXT: # fallthrough-return556entry:557 %conv = fptoui <8 x half> %x to <8 x i32>558 %0 = icmp ult <8 x i32> %conv, <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>559 %spec.store.select = select <8 x i1> %0, <8 x i32> %conv, <8 x i32> <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>560 %conv6 = trunc <8 x i32> %spec.store.select to <8 x i16>561 ret <8 x i16> %conv6562}563 564define <8 x i16> @ustest_f16i16(<8 x half> %x) {565; CHECK-LABEL: ustest_f16i16:566; CHECK: .functype ustest_f16i16 (f32, f32, f32, f32, f32, f32, f32, f32) -> (v128)567; CHECK-NEXT: .local v128, v128568; CHECK-NEXT: # %bb.0: # %entry569; CHECK-NEXT: local.get 5570; CHECK-NEXT: call __truncsfhf2571; CHECK-NEXT: call __extendhfsf2572; CHECK-NEXT: local.set 5573; CHECK-NEXT: local.get 4574; CHECK-NEXT: call __truncsfhf2575; CHECK-NEXT: call __extendhfsf2576; CHECK-NEXT: local.set 4577; CHECK-NEXT: local.get 6578; CHECK-NEXT: call __truncsfhf2579; CHECK-NEXT: call __extendhfsf2580; CHECK-NEXT: local.set 6581; CHECK-NEXT: local.get 7582; CHECK-NEXT: call __truncsfhf2583; CHECK-NEXT: call __extendhfsf2584; CHECK-NEXT: local.set 7585; CHECK-NEXT: local.get 1586; CHECK-NEXT: call __truncsfhf2587; CHECK-NEXT: call __extendhfsf2588; CHECK-NEXT: local.set 1589; CHECK-NEXT: local.get 0590; CHECK-NEXT: call __truncsfhf2591; CHECK-NEXT: call __extendhfsf2592; CHECK-NEXT: i32.trunc_sat_f32_s593; CHECK-NEXT: i32x4.splat594; CHECK-NEXT: local.get 1595; CHECK-NEXT: i32.trunc_sat_f32_s596; CHECK-NEXT: i32x4.replace_lane 1597; CHECK-NEXT: local.get 2598; CHECK-NEXT: call __truncsfhf2599; CHECK-NEXT: call __extendhfsf2600; CHECK-NEXT: i32.trunc_sat_f32_s601; CHECK-NEXT: i32x4.replace_lane 2602; CHECK-NEXT: local.get 3603; CHECK-NEXT: call __truncsfhf2604; CHECK-NEXT: call __extendhfsf2605; CHECK-NEXT: i32.trunc_sat_f32_s606; CHECK-NEXT: i32x4.replace_lane 3607; CHECK-NEXT: v128.const 65535, 65535, 65535, 65535608; CHECK-NEXT: local.tee 8609; CHECK-NEXT: i32x4.min_s610; CHECK-NEXT: v128.const 0, 0, 0, 0611; CHECK-NEXT: local.tee 9612; CHECK-NEXT: i32x4.max_s613; CHECK-NEXT: local.get 4614; CHECK-NEXT: i32.trunc_sat_f32_s615; CHECK-NEXT: i32x4.splat616; CHECK-NEXT: local.get 5617; CHECK-NEXT: i32.trunc_sat_f32_s618; CHECK-NEXT: i32x4.replace_lane 1619; CHECK-NEXT: local.get 6620; CHECK-NEXT: i32.trunc_sat_f32_s621; CHECK-NEXT: i32x4.replace_lane 2622; CHECK-NEXT: local.get 7623; CHECK-NEXT: i32.trunc_sat_f32_s624; CHECK-NEXT: i32x4.replace_lane 3625; CHECK-NEXT: local.get 8626; CHECK-NEXT: i32x4.min_s627; CHECK-NEXT: local.get 9628; CHECK-NEXT: i32x4.max_s629; CHECK-NEXT: i16x8.narrow_i32x4_u630; CHECK-NEXT: # fallthrough-return631entry:632 %conv = fptosi <8 x half> %x to <8 x i32>633 %0 = icmp slt <8 x i32> %conv, <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>634 %spec.store.select = select <8 x i1> %0, <8 x i32> %conv, <8 x i32> <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>635 %1 = icmp sgt <8 x i32> %spec.store.select, zeroinitializer636 %spec.store.select7 = select <8 x i1> %1, <8 x i32> %spec.store.select, <8 x i32> zeroinitializer637 %conv6 = trunc <8 x i32> %spec.store.select7 to <8 x i16>638 ret <8 x i16> %conv6639}640 641; i64 saturate642 643define <2 x i64> @stest_f64i64(<2 x double> %x) {644; CHECK-LABEL: stest_f64i64:645; CHECK: .functype stest_f64i64 (v128) -> (v128)646; CHECK-NEXT: .local i32, i64, i64, i64, i64647; CHECK-NEXT: # %bb.0: # %entry648; CHECK-NEXT: global.get __stack_pointer649; CHECK-NEXT: i32.const 32650; CHECK-NEXT: i32.sub651; CHECK-NEXT: local.tee 1652; CHECK-NEXT: global.set __stack_pointer653; CHECK-NEXT: local.get 1654; CHECK-NEXT: i32.const 16655; CHECK-NEXT: i32.add656; CHECK-NEXT: local.get 0657; CHECK-NEXT: f64x2.extract_lane 1658; CHECK-NEXT: call __fixdfti659; CHECK-NEXT: local.get 1660; CHECK-NEXT: local.get 0661; CHECK-NEXT: f64x2.extract_lane 0662; CHECK-NEXT: call __fixdfti663; CHECK-NEXT: local.get 1664; CHECK-NEXT: i64.load 24665; CHECK-NEXT: local.set 2666; CHECK-NEXT: local.get 1667; CHECK-NEXT: i64.load 16668; CHECK-NEXT: local.set 3669; CHECK-NEXT: local.get 1670; CHECK-NEXT: i64.load 8671; CHECK-NEXT: local.set 4672; CHECK-NEXT: local.get 1673; CHECK-NEXT: i64.load 0674; CHECK-NEXT: local.set 5675; CHECK-NEXT: local.get 1676; CHECK-NEXT: i32.const 32677; CHECK-NEXT: i32.add678; CHECK-NEXT: global.set __stack_pointer679; CHECK-NEXT: local.get 5680; CHECK-NEXT: i64.const 9223372036854775807681; CHECK-NEXT: local.get 5682; CHECK-NEXT: i64.const 9223372036854775807683; CHECK-NEXT: i64.lt_u684; CHECK-NEXT: local.get 4685; CHECK-NEXT: i64.const 0686; CHECK-NEXT: i64.lt_s687; CHECK-NEXT: local.get 4688; CHECK-NEXT: i64.eqz689; CHECK-NEXT: i32.select690; CHECK-NEXT: local.tee 1691; CHECK-NEXT: i64.select692; CHECK-NEXT: local.tee 5693; CHECK-NEXT: i64.const -9223372036854775808694; CHECK-NEXT: local.get 5695; CHECK-NEXT: i64.const -9223372036854775808696; CHECK-NEXT: i64.gt_u697; CHECK-NEXT: local.get 4698; CHECK-NEXT: i64.const 0699; CHECK-NEXT: local.get 1700; CHECK-NEXT: i64.select701; CHECK-NEXT: local.tee 4702; CHECK-NEXT: i64.const -1703; CHECK-NEXT: i64.gt_s704; CHECK-NEXT: local.get 4705; CHECK-NEXT: i64.const -1706; CHECK-NEXT: i64.eq707; CHECK-NEXT: i32.select708; CHECK-NEXT: i64.select709; CHECK-NEXT: i64x2.splat710; CHECK-NEXT: local.get 3711; CHECK-NEXT: i64.const 9223372036854775807712; CHECK-NEXT: local.get 3713; CHECK-NEXT: i64.const 9223372036854775807714; CHECK-NEXT: i64.lt_u715; CHECK-NEXT: local.get 2716; CHECK-NEXT: i64.const 0717; CHECK-NEXT: i64.lt_s718; CHECK-NEXT: local.get 2719; CHECK-NEXT: i64.eqz720; CHECK-NEXT: i32.select721; CHECK-NEXT: local.tee 1722; CHECK-NEXT: i64.select723; CHECK-NEXT: local.tee 4724; CHECK-NEXT: i64.const -9223372036854775808725; CHECK-NEXT: local.get 4726; CHECK-NEXT: i64.const -9223372036854775808727; CHECK-NEXT: i64.gt_u728; CHECK-NEXT: local.get 2729; CHECK-NEXT: i64.const 0730; CHECK-NEXT: local.get 1731; CHECK-NEXT: i64.select732; CHECK-NEXT: local.tee 2733; CHECK-NEXT: i64.const -1734; CHECK-NEXT: i64.gt_s735; CHECK-NEXT: local.get 2736; CHECK-NEXT: i64.const -1737; CHECK-NEXT: i64.eq738; CHECK-NEXT: i32.select739; CHECK-NEXT: i64.select740; CHECK-NEXT: i64x2.replace_lane 1741; CHECK-NEXT: # fallthrough-return742entry:743 %conv = fptosi <2 x double> %x to <2 x i128>744 %0 = icmp slt <2 x i128> %conv, <i128 9223372036854775807, i128 9223372036854775807>745 %spec.store.select = select <2 x i1> %0, <2 x i128> %conv, <2 x i128> <i128 9223372036854775807, i128 9223372036854775807>746 %1 = icmp sgt <2 x i128> %spec.store.select, <i128 -9223372036854775808, i128 -9223372036854775808>747 %spec.store.select7 = select <2 x i1> %1, <2 x i128> %spec.store.select, <2 x i128> <i128 -9223372036854775808, i128 -9223372036854775808>748 %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64>749 ret <2 x i64> %conv6750}751 752define <2 x i64> @utest_f64i64(<2 x double> %x) {753; CHECK-LABEL: utest_f64i64:754; CHECK: .functype utest_f64i64 (v128) -> (v128)755; CHECK-NEXT: .local i32, i64, i64, i64, i64756; CHECK-NEXT: # %bb.0: # %entry757; CHECK-NEXT: global.get __stack_pointer758; CHECK-NEXT: i32.const 32759; CHECK-NEXT: i32.sub760; CHECK-NEXT: local.tee 1761; CHECK-NEXT: global.set __stack_pointer762; CHECK-NEXT: local.get 1763; CHECK-NEXT: i32.const 16764; CHECK-NEXT: i32.add765; CHECK-NEXT: local.get 0766; CHECK-NEXT: f64x2.extract_lane 1767; CHECK-NEXT: call __fixunsdfti768; CHECK-NEXT: local.get 1769; CHECK-NEXT: local.get 0770; CHECK-NEXT: f64x2.extract_lane 0771; CHECK-NEXT: call __fixunsdfti772; CHECK-NEXT: local.get 1773; CHECK-NEXT: i64.load 24774; CHECK-NEXT: local.set 2775; CHECK-NEXT: local.get 1776; CHECK-NEXT: i64.load 16777; CHECK-NEXT: local.set 3778; CHECK-NEXT: local.get 1779; CHECK-NEXT: i64.load 8780; CHECK-NEXT: local.set 4781; CHECK-NEXT: local.get 1782; CHECK-NEXT: i64.load 0783; CHECK-NEXT: local.set 5784; CHECK-NEXT: local.get 1785; CHECK-NEXT: i32.const 32786; CHECK-NEXT: i32.add787; CHECK-NEXT: global.set __stack_pointer788; CHECK-NEXT: local.get 5789; CHECK-NEXT: i64.const 0790; CHECK-NEXT: local.get 4791; CHECK-NEXT: i64.eqz792; CHECK-NEXT: i64.select793; CHECK-NEXT: i64x2.splat794; CHECK-NEXT: local.get 3795; CHECK-NEXT: i64.const 0796; CHECK-NEXT: local.get 2797; CHECK-NEXT: i64.eqz798; CHECK-NEXT: i64.select799; CHECK-NEXT: i64x2.replace_lane 1800; CHECK-NEXT: # fallthrough-return801entry:802 %conv = fptoui <2 x double> %x to <2 x i128>803 %0 = icmp ult <2 x i128> %conv, <i128 18446744073709551616, i128 18446744073709551616>804 %spec.store.select = select <2 x i1> %0, <2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>805 %conv6 = trunc <2 x i128> %spec.store.select to <2 x i64>806 ret <2 x i64> %conv6807}808 809define <2 x i64> @ustest_f64i64(<2 x double> %x) {810; CHECK-LABEL: ustest_f64i64:811; CHECK: .functype ustest_f64i64 (v128) -> (v128)812; CHECK-NEXT: .local i32, i64, i64, i64, i64813; CHECK-NEXT: # %bb.0: # %entry814; CHECK-NEXT: global.get __stack_pointer815; CHECK-NEXT: i32.const 32816; CHECK-NEXT: i32.sub817; CHECK-NEXT: local.tee 1818; CHECK-NEXT: global.set __stack_pointer819; CHECK-NEXT: local.get 1820; CHECK-NEXT: i32.const 16821; CHECK-NEXT: i32.add822; CHECK-NEXT: local.get 0823; CHECK-NEXT: f64x2.extract_lane 1824; CHECK-NEXT: call __fixdfti825; CHECK-NEXT: local.get 1826; CHECK-NEXT: local.get 0827; CHECK-NEXT: f64x2.extract_lane 0828; CHECK-NEXT: call __fixdfti829; CHECK-NEXT: local.get 1830; CHECK-NEXT: i64.load 24831; CHECK-NEXT: local.set 2832; CHECK-NEXT: local.get 1833; CHECK-NEXT: i64.load 16834; CHECK-NEXT: local.set 3835; CHECK-NEXT: local.get 1836; CHECK-NEXT: i64.load 8837; CHECK-NEXT: local.set 4838; CHECK-NEXT: local.get 1839; CHECK-NEXT: i64.load 0840; CHECK-NEXT: local.set 5841; CHECK-NEXT: local.get 1842; CHECK-NEXT: i32.const 32843; CHECK-NEXT: i32.add844; CHECK-NEXT: global.set __stack_pointer845; CHECK-NEXT: local.get 5846; CHECK-NEXT: i64.const 0847; CHECK-NEXT: local.get 4848; CHECK-NEXT: i64.const 1849; CHECK-NEXT: i64.lt_s850; CHECK-NEXT: local.tee 1851; CHECK-NEXT: i64.select852; CHECK-NEXT: local.tee 5853; CHECK-NEXT: i64.const 0854; CHECK-NEXT: local.get 5855; CHECK-NEXT: i64.const 0856; CHECK-NEXT: i64.ne857; CHECK-NEXT: local.get 4858; CHECK-NEXT: i64.const 1859; CHECK-NEXT: local.get 1860; CHECK-NEXT: i64.select861; CHECK-NEXT: local.tee 4862; CHECK-NEXT: i64.const 0863; CHECK-NEXT: i64.gt_s864; CHECK-NEXT: local.get 4865; CHECK-NEXT: i64.eqz866; CHECK-NEXT: i32.select867; CHECK-NEXT: i64.select868; CHECK-NEXT: i64x2.splat869; CHECK-NEXT: local.get 3870; CHECK-NEXT: i64.const 0871; CHECK-NEXT: local.get 2872; CHECK-NEXT: i64.const 1873; CHECK-NEXT: i64.lt_s874; CHECK-NEXT: local.tee 1875; CHECK-NEXT: i64.select876; CHECK-NEXT: local.tee 4877; CHECK-NEXT: i64.const 0878; CHECK-NEXT: local.get 4879; CHECK-NEXT: i64.const 0880; CHECK-NEXT: i64.ne881; CHECK-NEXT: local.get 2882; CHECK-NEXT: i64.const 1883; CHECK-NEXT: local.get 1884; CHECK-NEXT: i64.select885; CHECK-NEXT: local.tee 2886; CHECK-NEXT: i64.const 0887; CHECK-NEXT: i64.gt_s888; CHECK-NEXT: local.get 2889; CHECK-NEXT: i64.eqz890; CHECK-NEXT: i32.select891; CHECK-NEXT: i64.select892; CHECK-NEXT: i64x2.replace_lane 1893; CHECK-NEXT: # fallthrough-return894entry:895 %conv = fptosi <2 x double> %x to <2 x i128>896 %0 = icmp slt <2 x i128> %conv, <i128 18446744073709551616, i128 18446744073709551616>897 %spec.store.select = select <2 x i1> %0, <2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>898 %1 = icmp sgt <2 x i128> %spec.store.select, zeroinitializer899 %spec.store.select7 = select <2 x i1> %1, <2 x i128> %spec.store.select, <2 x i128> zeroinitializer900 %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64>901 ret <2 x i64> %conv6902}903 904define <2 x i64> @stest_f32i64(<2 x float> %x) {905; CHECK-LABEL: stest_f32i64:906; CHECK: .functype stest_f32i64 (v128) -> (v128)907; CHECK-NEXT: .local i32, i64, i64, i64, i64908; CHECK-NEXT: # %bb.0: # %entry909; CHECK-NEXT: global.get __stack_pointer910; CHECK-NEXT: i32.const 32911; CHECK-NEXT: i32.sub912; CHECK-NEXT: local.tee 1913; CHECK-NEXT: global.set __stack_pointer914; CHECK-NEXT: local.get 1915; CHECK-NEXT: i32.const 16916; CHECK-NEXT: i32.add917; CHECK-NEXT: local.get 0918; CHECK-NEXT: f32x4.extract_lane 1919; CHECK-NEXT: call __fixsfti920; CHECK-NEXT: local.get 1921; CHECK-NEXT: local.get 0922; CHECK-NEXT: f32x4.extract_lane 0923; CHECK-NEXT: call __fixsfti924; CHECK-NEXT: local.get 1925; CHECK-NEXT: i64.load 24926; CHECK-NEXT: local.set 2927; CHECK-NEXT: local.get 1928; CHECK-NEXT: i64.load 16929; CHECK-NEXT: local.set 3930; CHECK-NEXT: local.get 1931; CHECK-NEXT: i64.load 8932; CHECK-NEXT: local.set 4933; CHECK-NEXT: local.get 1934; CHECK-NEXT: i64.load 0935; CHECK-NEXT: local.set 5936; CHECK-NEXT: local.get 1937; CHECK-NEXT: i32.const 32938; CHECK-NEXT: i32.add939; CHECK-NEXT: global.set __stack_pointer940; CHECK-NEXT: local.get 5941; CHECK-NEXT: i64.const 9223372036854775807942; CHECK-NEXT: local.get 5943; CHECK-NEXT: i64.const 9223372036854775807944; CHECK-NEXT: i64.lt_u945; CHECK-NEXT: local.get 4946; CHECK-NEXT: i64.const 0947; CHECK-NEXT: i64.lt_s948; CHECK-NEXT: local.get 4949; CHECK-NEXT: i64.eqz950; CHECK-NEXT: i32.select951; CHECK-NEXT: local.tee 1952; CHECK-NEXT: i64.select953; CHECK-NEXT: local.tee 5954; CHECK-NEXT: i64.const -9223372036854775808955; CHECK-NEXT: local.get 5956; CHECK-NEXT: i64.const -9223372036854775808957; CHECK-NEXT: i64.gt_u958; CHECK-NEXT: local.get 4959; CHECK-NEXT: i64.const 0960; CHECK-NEXT: local.get 1961; CHECK-NEXT: i64.select962; CHECK-NEXT: local.tee 4963; CHECK-NEXT: i64.const -1964; CHECK-NEXT: i64.gt_s965; CHECK-NEXT: local.get 4966; CHECK-NEXT: i64.const -1967; CHECK-NEXT: i64.eq968; CHECK-NEXT: i32.select969; CHECK-NEXT: i64.select970; CHECK-NEXT: i64x2.splat971; CHECK-NEXT: local.get 3972; CHECK-NEXT: i64.const 9223372036854775807973; CHECK-NEXT: local.get 3974; CHECK-NEXT: i64.const 9223372036854775807975; CHECK-NEXT: i64.lt_u976; CHECK-NEXT: local.get 2977; CHECK-NEXT: i64.const 0978; CHECK-NEXT: i64.lt_s979; CHECK-NEXT: local.get 2980; CHECK-NEXT: i64.eqz981; CHECK-NEXT: i32.select982; CHECK-NEXT: local.tee 1983; CHECK-NEXT: i64.select984; CHECK-NEXT: local.tee 4985; CHECK-NEXT: i64.const -9223372036854775808986; CHECK-NEXT: local.get 4987; CHECK-NEXT: i64.const -9223372036854775808988; CHECK-NEXT: i64.gt_u989; CHECK-NEXT: local.get 2990; CHECK-NEXT: i64.const 0991; CHECK-NEXT: local.get 1992; CHECK-NEXT: i64.select993; CHECK-NEXT: local.tee 2994; CHECK-NEXT: i64.const -1995; CHECK-NEXT: i64.gt_s996; CHECK-NEXT: local.get 2997; CHECK-NEXT: i64.const -1998; CHECK-NEXT: i64.eq999; CHECK-NEXT: i32.select1000; CHECK-NEXT: i64.select1001; CHECK-NEXT: i64x2.replace_lane 11002; CHECK-NEXT: # fallthrough-return1003entry:1004 %conv = fptosi <2 x float> %x to <2 x i128>1005 %0 = icmp slt <2 x i128> %conv, <i128 9223372036854775807, i128 9223372036854775807>1006 %spec.store.select = select <2 x i1> %0, <2 x i128> %conv, <2 x i128> <i128 9223372036854775807, i128 9223372036854775807>1007 %1 = icmp sgt <2 x i128> %spec.store.select, <i128 -9223372036854775808, i128 -9223372036854775808>1008 %spec.store.select7 = select <2 x i1> %1, <2 x i128> %spec.store.select, <2 x i128> <i128 -9223372036854775808, i128 -9223372036854775808>1009 %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64>1010 ret <2 x i64> %conv61011}1012 1013define <2 x i64> @utest_f32i64(<2 x float> %x) {1014; CHECK-LABEL: utest_f32i64:1015; CHECK: .functype utest_f32i64 (v128) -> (v128)1016; CHECK-NEXT: .local i32, i64, i64, i64, i641017; CHECK-NEXT: # %bb.0: # %entry1018; CHECK-NEXT: global.get __stack_pointer1019; CHECK-NEXT: i32.const 321020; CHECK-NEXT: i32.sub1021; CHECK-NEXT: local.tee 11022; CHECK-NEXT: global.set __stack_pointer1023; CHECK-NEXT: local.get 11024; CHECK-NEXT: i32.const 161025; CHECK-NEXT: i32.add1026; CHECK-NEXT: local.get 01027; CHECK-NEXT: f32x4.extract_lane 11028; CHECK-NEXT: call __fixunssfti1029; CHECK-NEXT: local.get 11030; CHECK-NEXT: local.get 01031; CHECK-NEXT: f32x4.extract_lane 01032; CHECK-NEXT: call __fixunssfti1033; CHECK-NEXT: local.get 11034; CHECK-NEXT: i64.load 241035; CHECK-NEXT: local.set 21036; CHECK-NEXT: local.get 11037; CHECK-NEXT: i64.load 161038; CHECK-NEXT: local.set 31039; CHECK-NEXT: local.get 11040; CHECK-NEXT: i64.load 81041; CHECK-NEXT: local.set 41042; CHECK-NEXT: local.get 11043; CHECK-NEXT: i64.load 01044; CHECK-NEXT: local.set 51045; CHECK-NEXT: local.get 11046; CHECK-NEXT: i32.const 321047; CHECK-NEXT: i32.add1048; CHECK-NEXT: global.set __stack_pointer1049; CHECK-NEXT: local.get 51050; CHECK-NEXT: i64.const 01051; CHECK-NEXT: local.get 41052; CHECK-NEXT: i64.eqz1053; CHECK-NEXT: i64.select1054; CHECK-NEXT: i64x2.splat1055; CHECK-NEXT: local.get 31056; CHECK-NEXT: i64.const 01057; CHECK-NEXT: local.get 21058; CHECK-NEXT: i64.eqz1059; CHECK-NEXT: i64.select1060; CHECK-NEXT: i64x2.replace_lane 11061; CHECK-NEXT: # fallthrough-return1062entry:1063 %conv = fptoui <2 x float> %x to <2 x i128>1064 %0 = icmp ult <2 x i128> %conv, <i128 18446744073709551616, i128 18446744073709551616>1065 %spec.store.select = select <2 x i1> %0, <2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>1066 %conv6 = trunc <2 x i128> %spec.store.select to <2 x i64>1067 ret <2 x i64> %conv61068}1069 1070define <2 x i64> @ustest_f32i64(<2 x float> %x) {1071; CHECK-LABEL: ustest_f32i64:1072; CHECK: .functype ustest_f32i64 (v128) -> (v128)1073; CHECK-NEXT: .local i32, i64, i64, i64, i641074; CHECK-NEXT: # %bb.0: # %entry1075; CHECK-NEXT: global.get __stack_pointer1076; CHECK-NEXT: i32.const 321077; CHECK-NEXT: i32.sub1078; CHECK-NEXT: local.tee 11079; CHECK-NEXT: global.set __stack_pointer1080; CHECK-NEXT: local.get 11081; CHECK-NEXT: i32.const 161082; CHECK-NEXT: i32.add1083; CHECK-NEXT: local.get 01084; CHECK-NEXT: f32x4.extract_lane 11085; CHECK-NEXT: call __fixsfti1086; CHECK-NEXT: local.get 11087; CHECK-NEXT: local.get 01088; CHECK-NEXT: f32x4.extract_lane 01089; CHECK-NEXT: call __fixsfti1090; CHECK-NEXT: local.get 11091; CHECK-NEXT: i64.load 241092; CHECK-NEXT: local.set 21093; CHECK-NEXT: local.get 11094; CHECK-NEXT: i64.load 161095; CHECK-NEXT: local.set 31096; CHECK-NEXT: local.get 11097; CHECK-NEXT: i64.load 81098; CHECK-NEXT: local.set 41099; CHECK-NEXT: local.get 11100; CHECK-NEXT: i64.load 01101; CHECK-NEXT: local.set 51102; CHECK-NEXT: local.get 11103; CHECK-NEXT: i32.const 321104; CHECK-NEXT: i32.add1105; CHECK-NEXT: global.set __stack_pointer1106; CHECK-NEXT: local.get 51107; CHECK-NEXT: i64.const 01108; CHECK-NEXT: local.get 41109; CHECK-NEXT: i64.const 11110; CHECK-NEXT: i64.lt_s1111; CHECK-NEXT: local.tee 11112; CHECK-NEXT: i64.select1113; CHECK-NEXT: local.tee 51114; CHECK-NEXT: i64.const 01115; CHECK-NEXT: local.get 51116; CHECK-NEXT: i64.const 01117; CHECK-NEXT: i64.ne1118; CHECK-NEXT: local.get 41119; CHECK-NEXT: i64.const 11120; CHECK-NEXT: local.get 11121; CHECK-NEXT: i64.select1122; CHECK-NEXT: local.tee 41123; CHECK-NEXT: i64.const 01124; CHECK-NEXT: i64.gt_s1125; CHECK-NEXT: local.get 41126; CHECK-NEXT: i64.eqz1127; CHECK-NEXT: i32.select1128; CHECK-NEXT: i64.select1129; CHECK-NEXT: i64x2.splat1130; CHECK-NEXT: local.get 31131; CHECK-NEXT: i64.const 01132; CHECK-NEXT: local.get 21133; CHECK-NEXT: i64.const 11134; CHECK-NEXT: i64.lt_s1135; CHECK-NEXT: local.tee 11136; CHECK-NEXT: i64.select1137; CHECK-NEXT: local.tee 41138; CHECK-NEXT: i64.const 01139; CHECK-NEXT: local.get 41140; CHECK-NEXT: i64.const 01141; CHECK-NEXT: i64.ne1142; CHECK-NEXT: local.get 21143; CHECK-NEXT: i64.const 11144; CHECK-NEXT: local.get 11145; CHECK-NEXT: i64.select1146; CHECK-NEXT: local.tee 21147; CHECK-NEXT: i64.const 01148; CHECK-NEXT: i64.gt_s1149; CHECK-NEXT: local.get 21150; CHECK-NEXT: i64.eqz1151; CHECK-NEXT: i32.select1152; CHECK-NEXT: i64.select1153; CHECK-NEXT: i64x2.replace_lane 11154; CHECK-NEXT: # fallthrough-return1155entry:1156 %conv = fptosi <2 x float> %x to <2 x i128>1157 %0 = icmp slt <2 x i128> %conv, <i128 18446744073709551616, i128 18446744073709551616>1158 %spec.store.select = select <2 x i1> %0, <2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>1159 %1 = icmp sgt <2 x i128> %spec.store.select, zeroinitializer1160 %spec.store.select7 = select <2 x i1> %1, <2 x i128> %spec.store.select, <2 x i128> zeroinitializer1161 %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64>1162 ret <2 x i64> %conv61163}1164 1165define <2 x i64> @stest_f16i64(<2 x half> %x) {1166; CHECK-LABEL: stest_f16i64:1167; CHECK: .functype stest_f16i64 (f32, f32) -> (v128)1168; CHECK-NEXT: .local i32, i64, i64, i64, i641169; CHECK-NEXT: # %bb.0: # %entry1170; CHECK-NEXT: global.get __stack_pointer1171; CHECK-NEXT: i32.const 321172; CHECK-NEXT: i32.sub1173; CHECK-NEXT: local.tee 21174; CHECK-NEXT: global.set __stack_pointer1175; CHECK-NEXT: local.get 21176; CHECK-NEXT: i32.const 161177; CHECK-NEXT: i32.add1178; CHECK-NEXT: local.get 11179; CHECK-NEXT: call __truncsfhf21180; CHECK-NEXT: call __extendhfsf21181; CHECK-NEXT: call __fixsfti1182; CHECK-NEXT: local.get 21183; CHECK-NEXT: local.get 01184; CHECK-NEXT: call __truncsfhf21185; CHECK-NEXT: call __extendhfsf21186; CHECK-NEXT: call __fixsfti1187; CHECK-NEXT: local.get 21188; CHECK-NEXT: i64.load 241189; CHECK-NEXT: local.set 31190; CHECK-NEXT: local.get 21191; CHECK-NEXT: i64.load 161192; CHECK-NEXT: local.set 41193; CHECK-NEXT: local.get 21194; CHECK-NEXT: i64.load 81195; CHECK-NEXT: local.set 51196; CHECK-NEXT: local.get 21197; CHECK-NEXT: i64.load 01198; CHECK-NEXT: local.set 61199; CHECK-NEXT: local.get 21200; CHECK-NEXT: i32.const 321201; CHECK-NEXT: i32.add1202; CHECK-NEXT: global.set __stack_pointer1203; CHECK-NEXT: local.get 61204; CHECK-NEXT: i64.const 92233720368547758071205; CHECK-NEXT: local.get 61206; CHECK-NEXT: i64.const 92233720368547758071207; CHECK-NEXT: i64.lt_u1208; CHECK-NEXT: local.get 51209; CHECK-NEXT: i64.const 01210; CHECK-NEXT: i64.lt_s1211; CHECK-NEXT: local.get 51212; CHECK-NEXT: i64.eqz1213; CHECK-NEXT: i32.select1214; CHECK-NEXT: local.tee 21215; CHECK-NEXT: i64.select1216; CHECK-NEXT: local.tee 61217; CHECK-NEXT: i64.const -92233720368547758081218; CHECK-NEXT: local.get 61219; CHECK-NEXT: i64.const -92233720368547758081220; CHECK-NEXT: i64.gt_u1221; CHECK-NEXT: local.get 51222; CHECK-NEXT: i64.const 01223; CHECK-NEXT: local.get 21224; CHECK-NEXT: i64.select1225; CHECK-NEXT: local.tee 51226; CHECK-NEXT: i64.const -11227; CHECK-NEXT: i64.gt_s1228; CHECK-NEXT: local.get 51229; CHECK-NEXT: i64.const -11230; CHECK-NEXT: i64.eq1231; CHECK-NEXT: i32.select1232; CHECK-NEXT: i64.select1233; CHECK-NEXT: i64x2.splat1234; CHECK-NEXT: local.get 41235; CHECK-NEXT: i64.const 92233720368547758071236; CHECK-NEXT: local.get 41237; CHECK-NEXT: i64.const 92233720368547758071238; CHECK-NEXT: i64.lt_u1239; CHECK-NEXT: local.get 31240; CHECK-NEXT: i64.const 01241; CHECK-NEXT: i64.lt_s1242; CHECK-NEXT: local.get 31243; CHECK-NEXT: i64.eqz1244; CHECK-NEXT: i32.select1245; CHECK-NEXT: local.tee 21246; CHECK-NEXT: i64.select1247; CHECK-NEXT: local.tee 51248; CHECK-NEXT: i64.const -92233720368547758081249; CHECK-NEXT: local.get 51250; CHECK-NEXT: i64.const -92233720368547758081251; CHECK-NEXT: i64.gt_u1252; CHECK-NEXT: local.get 31253; CHECK-NEXT: i64.const 01254; CHECK-NEXT: local.get 21255; CHECK-NEXT: i64.select1256; CHECK-NEXT: local.tee 31257; CHECK-NEXT: i64.const -11258; CHECK-NEXT: i64.gt_s1259; CHECK-NEXT: local.get 31260; CHECK-NEXT: i64.const -11261; CHECK-NEXT: i64.eq1262; CHECK-NEXT: i32.select1263; CHECK-NEXT: i64.select1264; CHECK-NEXT: i64x2.replace_lane 11265; CHECK-NEXT: # fallthrough-return1266entry:1267 %conv = fptosi <2 x half> %x to <2 x i128>1268 %0 = icmp slt <2 x i128> %conv, <i128 9223372036854775807, i128 9223372036854775807>1269 %spec.store.select = select <2 x i1> %0, <2 x i128> %conv, <2 x i128> <i128 9223372036854775807, i128 9223372036854775807>1270 %1 = icmp sgt <2 x i128> %spec.store.select, <i128 -9223372036854775808, i128 -9223372036854775808>1271 %spec.store.select7 = select <2 x i1> %1, <2 x i128> %spec.store.select, <2 x i128> <i128 -9223372036854775808, i128 -9223372036854775808>1272 %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64>1273 ret <2 x i64> %conv61274}1275 1276define <2 x i64> @utest_f16i64(<2 x half> %x) {1277; CHECK-LABEL: utest_f16i64:1278; CHECK: .functype utest_f16i64 (f32, f32) -> (v128)1279; CHECK-NEXT: .local i32, i64, i64, i64, i641280; CHECK-NEXT: # %bb.0: # %entry1281; CHECK-NEXT: global.get __stack_pointer1282; CHECK-NEXT: i32.const 321283; CHECK-NEXT: i32.sub1284; CHECK-NEXT: local.tee 21285; CHECK-NEXT: global.set __stack_pointer1286; CHECK-NEXT: local.get 21287; CHECK-NEXT: i32.const 161288; CHECK-NEXT: i32.add1289; CHECK-NEXT: local.get 11290; CHECK-NEXT: call __truncsfhf21291; CHECK-NEXT: call __extendhfsf21292; CHECK-NEXT: call __fixunssfti1293; CHECK-NEXT: local.get 21294; CHECK-NEXT: local.get 01295; CHECK-NEXT: call __truncsfhf21296; CHECK-NEXT: call __extendhfsf21297; CHECK-NEXT: call __fixunssfti1298; CHECK-NEXT: local.get 21299; CHECK-NEXT: i64.load 241300; CHECK-NEXT: local.set 31301; CHECK-NEXT: local.get 21302; CHECK-NEXT: i64.load 161303; CHECK-NEXT: local.set 41304; CHECK-NEXT: local.get 21305; CHECK-NEXT: i64.load 81306; CHECK-NEXT: local.set 51307; CHECK-NEXT: local.get 21308; CHECK-NEXT: i64.load 01309; CHECK-NEXT: local.set 61310; CHECK-NEXT: local.get 21311; CHECK-NEXT: i32.const 321312; CHECK-NEXT: i32.add1313; CHECK-NEXT: global.set __stack_pointer1314; CHECK-NEXT: local.get 61315; CHECK-NEXT: i64.const 01316; CHECK-NEXT: local.get 51317; CHECK-NEXT: i64.eqz1318; CHECK-NEXT: i64.select1319; CHECK-NEXT: i64x2.splat1320; CHECK-NEXT: local.get 41321; CHECK-NEXT: i64.const 01322; CHECK-NEXT: local.get 31323; CHECK-NEXT: i64.eqz1324; CHECK-NEXT: i64.select1325; CHECK-NEXT: i64x2.replace_lane 11326; CHECK-NEXT: # fallthrough-return1327entry:1328 %conv = fptoui <2 x half> %x to <2 x i128>1329 %0 = icmp ult <2 x i128> %conv, <i128 18446744073709551616, i128 18446744073709551616>1330 %spec.store.select = select <2 x i1> %0, <2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>1331 %conv6 = trunc <2 x i128> %spec.store.select to <2 x i64>1332 ret <2 x i64> %conv61333}1334 1335define <2 x i64> @ustest_f16i64(<2 x half> %x) {1336; CHECK-LABEL: ustest_f16i64:1337; CHECK: .functype ustest_f16i64 (f32, f32) -> (v128)1338; CHECK-NEXT: .local i32, i64, i64, i64, i641339; CHECK-NEXT: # %bb.0: # %entry1340; CHECK-NEXT: global.get __stack_pointer1341; CHECK-NEXT: i32.const 321342; CHECK-NEXT: i32.sub1343; CHECK-NEXT: local.tee 21344; CHECK-NEXT: global.set __stack_pointer1345; CHECK-NEXT: local.get 21346; CHECK-NEXT: i32.const 161347; CHECK-NEXT: i32.add1348; CHECK-NEXT: local.get 11349; CHECK-NEXT: call __truncsfhf21350; CHECK-NEXT: call __extendhfsf21351; CHECK-NEXT: call __fixsfti1352; CHECK-NEXT: local.get 21353; CHECK-NEXT: local.get 01354; CHECK-NEXT: call __truncsfhf21355; CHECK-NEXT: call __extendhfsf21356; CHECK-NEXT: call __fixsfti1357; CHECK-NEXT: local.get 21358; CHECK-NEXT: i64.load 241359; CHECK-NEXT: local.set 31360; CHECK-NEXT: local.get 21361; CHECK-NEXT: i64.load 161362; CHECK-NEXT: local.set 41363; CHECK-NEXT: local.get 21364; CHECK-NEXT: i64.load 81365; CHECK-NEXT: local.set 51366; CHECK-NEXT: local.get 21367; CHECK-NEXT: i64.load 01368; CHECK-NEXT: local.set 61369; CHECK-NEXT: local.get 21370; CHECK-NEXT: i32.const 321371; CHECK-NEXT: i32.add1372; CHECK-NEXT: global.set __stack_pointer1373; CHECK-NEXT: local.get 61374; CHECK-NEXT: i64.const 01375; CHECK-NEXT: local.get 51376; CHECK-NEXT: i64.const 11377; CHECK-NEXT: i64.lt_s1378; CHECK-NEXT: local.tee 21379; CHECK-NEXT: i64.select1380; CHECK-NEXT: local.tee 61381; CHECK-NEXT: i64.const 01382; CHECK-NEXT: local.get 61383; CHECK-NEXT: i64.const 01384; CHECK-NEXT: i64.ne1385; CHECK-NEXT: local.get 51386; CHECK-NEXT: i64.const 11387; CHECK-NEXT: local.get 21388; CHECK-NEXT: i64.select1389; CHECK-NEXT: local.tee 51390; CHECK-NEXT: i64.const 01391; CHECK-NEXT: i64.gt_s1392; CHECK-NEXT: local.get 51393; CHECK-NEXT: i64.eqz1394; CHECK-NEXT: i32.select1395; CHECK-NEXT: i64.select1396; CHECK-NEXT: i64x2.splat1397; CHECK-NEXT: local.get 41398; CHECK-NEXT: i64.const 01399; CHECK-NEXT: local.get 31400; CHECK-NEXT: i64.const 11401; CHECK-NEXT: i64.lt_s1402; CHECK-NEXT: local.tee 21403; CHECK-NEXT: i64.select1404; CHECK-NEXT: local.tee 51405; CHECK-NEXT: i64.const 01406; CHECK-NEXT: local.get 51407; CHECK-NEXT: i64.const 01408; CHECK-NEXT: i64.ne1409; CHECK-NEXT: local.get 31410; CHECK-NEXT: i64.const 11411; CHECK-NEXT: local.get 21412; CHECK-NEXT: i64.select1413; CHECK-NEXT: local.tee 31414; CHECK-NEXT: i64.const 01415; CHECK-NEXT: i64.gt_s1416; CHECK-NEXT: local.get 31417; CHECK-NEXT: i64.eqz1418; CHECK-NEXT: i32.select1419; CHECK-NEXT: i64.select1420; CHECK-NEXT: i64x2.replace_lane 11421; CHECK-NEXT: # fallthrough-return1422entry:1423 %conv = fptosi <2 x half> %x to <2 x i128>1424 %0 = icmp slt <2 x i128> %conv, <i128 18446744073709551616, i128 18446744073709551616>1425 %spec.store.select = select <2 x i1> %0, <2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>1426 %1 = icmp sgt <2 x i128> %spec.store.select, zeroinitializer1427 %spec.store.select7 = select <2 x i1> %1, <2 x i128> %spec.store.select, <2 x i128> zeroinitializer1428 %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64>1429 ret <2 x i64> %conv61430}1431 1432 1433 1434; i32 saturate1435 1436define <2 x i32> @stest_f64i32_mm(<2 x double> %x) {1437; CHECK-LABEL: stest_f64i32_mm:1438; CHECK: .functype stest_f64i32_mm (v128) -> (v128)1439; CHECK-NEXT: .local v1281440; CHECK-NEXT: # %bb.0: # %entry1441; CHECK-NEXT: local.get 01442; CHECK-NEXT: f64x2.extract_lane 01443; CHECK-NEXT: i64.trunc_sat_f64_s1444; CHECK-NEXT: i64x2.splat1445; CHECK-NEXT: local.get 01446; CHECK-NEXT: f64x2.extract_lane 11447; CHECK-NEXT: i64.trunc_sat_f64_s1448; CHECK-NEXT: i64x2.replace_lane 11449; CHECK-NEXT: local.tee 01450; CHECK-NEXT: v128.const 2147483647, 21474836471451; CHECK-NEXT: local.tee 11452; CHECK-NEXT: local.get 01453; CHECK-NEXT: local.get 11454; CHECK-NEXT: i64x2.lt_s1455; CHECK-NEXT: v128.bitselect1456; CHECK-NEXT: local.tee 01457; CHECK-NEXT: v128.const -2147483648, -21474836481458; CHECK-NEXT: local.tee 11459; CHECK-NEXT: local.get 01460; CHECK-NEXT: local.get 11461; CHECK-NEXT: i64x2.gt_s1462; CHECK-NEXT: v128.bitselect1463; CHECK-NEXT: local.get 01464; CHECK-NEXT: i8x16.shuffle 0, 1, 2, 3, 8, 9, 10, 11, 0, 1, 2, 3, 0, 1, 2, 31465; CHECK-NEXT: # fallthrough-return1466entry:1467 %conv = fptosi <2 x double> %x to <2 x i64>1468 %spec.store.select = call <2 x i64> @llvm.smin.v2i64(<2 x i64> %conv, <2 x i64> <i64 2147483647, i64 2147483647>)1469 %spec.store.select7 = call <2 x i64> @llvm.smax.v2i64(<2 x i64> %spec.store.select, <2 x i64> <i64 -2147483648, i64 -2147483648>)1470 %conv6 = trunc <2 x i64> %spec.store.select7 to <2 x i32>1471 ret <2 x i32> %conv61472}1473 1474define <2 x i32> @utest_f64i32_mm(<2 x double> %x) {1475; CHECK-LABEL: utest_f64i32_mm:1476; CHECK: .functype utest_f64i32_mm (v128) -> (v128)1477; CHECK-NEXT: .local i64, i641478; CHECK-NEXT: # %bb.0: # %entry1479; CHECK-NEXT: local.get 01480; CHECK-NEXT: f64x2.extract_lane 01481; CHECK-NEXT: i64.trunc_sat_f64_u1482; CHECK-NEXT: local.tee 11483; CHECK-NEXT: i64x2.splat1484; CHECK-NEXT: local.get 01485; CHECK-NEXT: f64x2.extract_lane 11486; CHECK-NEXT: i64.trunc_sat_f64_u1487; CHECK-NEXT: local.tee 21488; CHECK-NEXT: i64x2.replace_lane 11489; CHECK-NEXT: v128.const 4294967295, 42949672951490; CHECK-NEXT: i64.const -11491; CHECK-NEXT: i64.const 01492; CHECK-NEXT: local.get 11493; CHECK-NEXT: i64.const 42949672951494; CHECK-NEXT: i64.lt_u1495; CHECK-NEXT: i64.select1496; CHECK-NEXT: i64x2.splat1497; CHECK-NEXT: i64.const -11498; CHECK-NEXT: i64.const 01499; CHECK-NEXT: local.get 21500; CHECK-NEXT: i64.const 42949672951501; CHECK-NEXT: i64.lt_u1502; CHECK-NEXT: i64.select1503; CHECK-NEXT: i64x2.replace_lane 11504; CHECK-NEXT: v128.bitselect1505; CHECK-NEXT: local.get 01506; CHECK-NEXT: i8x16.shuffle 0, 1, 2, 3, 8, 9, 10, 11, 0, 1, 2, 3, 0, 1, 2, 31507; CHECK-NEXT: # fallthrough-return1508entry:1509 %conv = fptoui <2 x double> %x to <2 x i64>1510 %spec.store.select = call <2 x i64> @llvm.umin.v2i64(<2 x i64> %conv, <2 x i64> <i64 4294967295, i64 4294967295>)1511 %conv6 = trunc <2 x i64> %spec.store.select to <2 x i32>1512 ret <2 x i32> %conv61513}1514 1515define <2 x i32> @ustest_f64i32_mm(<2 x double> %x) {1516; CHECK-LABEL: ustest_f64i32_mm:1517; CHECK: .functype ustest_f64i32_mm (v128) -> (v128)1518; CHECK-NEXT: .local v1281519; CHECK-NEXT: # %bb.0: # %entry1520; CHECK-NEXT: local.get 01521; CHECK-NEXT: f64x2.extract_lane 01522; CHECK-NEXT: i64.trunc_sat_f64_s1523; CHECK-NEXT: i64x2.splat1524; CHECK-NEXT: local.get 01525; CHECK-NEXT: f64x2.extract_lane 11526; CHECK-NEXT: i64.trunc_sat_f64_s1527; CHECK-NEXT: i64x2.replace_lane 11528; CHECK-NEXT: local.tee 01529; CHECK-NEXT: v128.const 4294967295, 42949672951530; CHECK-NEXT: local.tee 11531; CHECK-NEXT: local.get 01532; CHECK-NEXT: local.get 11533; CHECK-NEXT: i64x2.lt_s1534; CHECK-NEXT: v128.bitselect1535; CHECK-NEXT: local.tee 01536; CHECK-NEXT: v128.const 0, 01537; CHECK-NEXT: i64x2.gt_s1538; CHECK-NEXT: local.get 01539; CHECK-NEXT: v128.and1540; CHECK-NEXT: local.get 01541; CHECK-NEXT: i8x16.shuffle 0, 1, 2, 3, 8, 9, 10, 11, 0, 1, 2, 3, 0, 1, 2, 31542; CHECK-NEXT: # fallthrough-return1543entry:1544 %conv = fptosi <2 x double> %x to <2 x i64>1545 %spec.store.select = call <2 x i64> @llvm.smin.v2i64(<2 x i64> %conv, <2 x i64> <i64 4294967295, i64 4294967295>)1546 %spec.store.select7 = call <2 x i64> @llvm.smax.v2i64(<2 x i64> %spec.store.select, <2 x i64> zeroinitializer)1547 %conv6 = trunc <2 x i64> %spec.store.select7 to <2 x i32>1548 ret <2 x i32> %conv61549}1550 1551define <4 x i32> @stest_f32i32_mm(<4 x float> %x) {1552; CHECK-LABEL: stest_f32i32_mm:1553; CHECK: .functype stest_f32i32_mm (v128) -> (v128)1554; CHECK-NEXT: # %bb.0: # %entry1555; CHECK-NEXT: local.get 01556; CHECK-NEXT: i32x4.trunc_sat_f32x4_s1557; CHECK-NEXT: # fallthrough-return1558entry:1559 %conv = fptosi <4 x float> %x to <4 x i64>1560 %spec.store.select = call <4 x i64> @llvm.smin.v4i64(<4 x i64> %conv, <4 x i64> <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>)1561 %spec.store.select7 = call <4 x i64> @llvm.smax.v4i64(<4 x i64> %spec.store.select, <4 x i64> <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>)1562 %conv6 = trunc <4 x i64> %spec.store.select7 to <4 x i32>1563 ret <4 x i32> %conv61564}1565 1566define <4 x i32> @utest_f32i32_mm(<4 x float> %x) {1567; CHECK-LABEL: utest_f32i32_mm:1568; CHECK: .functype utest_f32i32_mm (v128) -> (v128)1569; CHECK-NEXT: # %bb.0: # %entry1570; CHECK-NEXT: local.get 01571; CHECK-NEXT: i32x4.trunc_sat_f32x4_u1572; CHECK-NEXT: # fallthrough-return1573entry:1574 %conv = fptoui <4 x float> %x to <4 x i64>1575 %spec.store.select = call <4 x i64> @llvm.umin.v4i64(<4 x i64> %conv, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>)1576 %conv6 = trunc <4 x i64> %spec.store.select to <4 x i32>1577 ret <4 x i32> %conv61578}1579 1580define <4 x i32> @ustest_f32i32_mm(<4 x float> %x) {1581; CHECK-LABEL: ustest_f32i32_mm:1582; CHECK: .functype ustest_f32i32_mm (v128) -> (v128)1583; CHECK-NEXT: # %bb.0: # %entry1584; CHECK-NEXT: local.get 01585; CHECK-NEXT: i32x4.trunc_sat_f32x4_u1586; CHECK-NEXT: # fallthrough-return1587entry:1588 %conv = fptosi <4 x float> %x to <4 x i64>1589 %spec.store.select = call <4 x i64> @llvm.smin.v4i64(<4 x i64> %conv, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>)1590 %spec.store.select7 = call <4 x i64> @llvm.smax.v4i64(<4 x i64> %spec.store.select, <4 x i64> zeroinitializer)1591 %conv6 = trunc <4 x i64> %spec.store.select7 to <4 x i32>1592 ret <4 x i32> %conv61593}1594 1595define <4 x i32> @stest_f16i32_mm(<4 x half> %x) {1596; CHECK-LABEL: stest_f16i32_mm:1597; CHECK: .functype stest_f16i32_mm (f32, f32, f32, f32) -> (v128)1598; CHECK-NEXT: # %bb.0: # %entry1599; CHECK-NEXT: local.get 11600; CHECK-NEXT: call __truncsfhf21601; CHECK-NEXT: call __extendhfsf21602; CHECK-NEXT: local.set 11603; CHECK-NEXT: local.get 01604; CHECK-NEXT: call __truncsfhf21605; CHECK-NEXT: call __extendhfsf21606; CHECK-NEXT: i32.trunc_sat_f32_s1607; CHECK-NEXT: i32x4.splat1608; CHECK-NEXT: local.get 11609; CHECK-NEXT: i32.trunc_sat_f32_s1610; CHECK-NEXT: i32x4.replace_lane 11611; CHECK-NEXT: local.get 21612; CHECK-NEXT: call __truncsfhf21613; CHECK-NEXT: call __extendhfsf21614; CHECK-NEXT: i32.trunc_sat_f32_s1615; CHECK-NEXT: i32x4.replace_lane 21616; CHECK-NEXT: local.get 31617; CHECK-NEXT: call __truncsfhf21618; CHECK-NEXT: call __extendhfsf21619; CHECK-NEXT: i32.trunc_sat_f32_s1620; CHECK-NEXT: i32x4.replace_lane 31621; CHECK-NEXT: # fallthrough-return1622entry:1623 %conv = fptosi <4 x half> %x to <4 x i64>1624 %spec.store.select = call <4 x i64> @llvm.smin.v4i64(<4 x i64> %conv, <4 x i64> <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>)1625 %spec.store.select7 = call <4 x i64> @llvm.smax.v4i64(<4 x i64> %spec.store.select, <4 x i64> <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>)1626 %conv6 = trunc <4 x i64> %spec.store.select7 to <4 x i32>1627 ret <4 x i32> %conv61628}1629 1630define <4 x i32> @utest_f16i32_mm(<4 x half> %x) {1631; CHECK-LABEL: utest_f16i32_mm:1632; CHECK: .functype utest_f16i32_mm (f32, f32, f32, f32) -> (v128)1633; CHECK-NEXT: # %bb.0: # %entry1634; CHECK-NEXT: local.get 11635; CHECK-NEXT: call __truncsfhf21636; CHECK-NEXT: call __extendhfsf21637; CHECK-NEXT: local.set 11638; CHECK-NEXT: local.get 01639; CHECK-NEXT: call __truncsfhf21640; CHECK-NEXT: call __extendhfsf21641; CHECK-NEXT: i32.trunc_sat_f32_u1642; CHECK-NEXT: i32x4.splat1643; CHECK-NEXT: local.get 11644; CHECK-NEXT: i32.trunc_sat_f32_u1645; CHECK-NEXT: i32x4.replace_lane 11646; CHECK-NEXT: local.get 21647; CHECK-NEXT: call __truncsfhf21648; CHECK-NEXT: call __extendhfsf21649; CHECK-NEXT: i32.trunc_sat_f32_u1650; CHECK-NEXT: i32x4.replace_lane 21651; CHECK-NEXT: local.get 31652; CHECK-NEXT: call __truncsfhf21653; CHECK-NEXT: call __extendhfsf21654; CHECK-NEXT: i32.trunc_sat_f32_u1655; CHECK-NEXT: i32x4.replace_lane 31656; CHECK-NEXT: # fallthrough-return1657entry:1658 %conv = fptoui <4 x half> %x to <4 x i64>1659 %spec.store.select = call <4 x i64> @llvm.umin.v4i64(<4 x i64> %conv, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>)1660 %conv6 = trunc <4 x i64> %spec.store.select to <4 x i32>1661 ret <4 x i32> %conv61662}1663 1664define <4 x i32> @ustest_f16i32_mm(<4 x half> %x) {1665; CHECK-LABEL: ustest_f16i32_mm:1666; CHECK: .functype ustest_f16i32_mm (f32, f32, f32, f32) -> (v128)1667; CHECK-NEXT: # %bb.0: # %entry1668; CHECK-NEXT: local.get 11669; CHECK-NEXT: call __truncsfhf21670; CHECK-NEXT: call __extendhfsf21671; CHECK-NEXT: local.set 11672; CHECK-NEXT: local.get 01673; CHECK-NEXT: call __truncsfhf21674; CHECK-NEXT: call __extendhfsf21675; CHECK-NEXT: i32.trunc_sat_f32_u1676; CHECK-NEXT: i32x4.splat1677; CHECK-NEXT: local.get 11678; CHECK-NEXT: i32.trunc_sat_f32_u1679; CHECK-NEXT: i32x4.replace_lane 11680; CHECK-NEXT: local.get 21681; CHECK-NEXT: call __truncsfhf21682; CHECK-NEXT: call __extendhfsf21683; CHECK-NEXT: i32.trunc_sat_f32_u1684; CHECK-NEXT: i32x4.replace_lane 21685; CHECK-NEXT: local.get 31686; CHECK-NEXT: call __truncsfhf21687; CHECK-NEXT: call __extendhfsf21688; CHECK-NEXT: i32.trunc_sat_f32_u1689; CHECK-NEXT: i32x4.replace_lane 31690; CHECK-NEXT: # fallthrough-return1691entry:1692 %conv = fptosi <4 x half> %x to <4 x i64>1693 %spec.store.select = call <4 x i64> @llvm.smin.v4i64(<4 x i64> %conv, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>)1694 %spec.store.select7 = call <4 x i64> @llvm.smax.v4i64(<4 x i64> %spec.store.select, <4 x i64> zeroinitializer)1695 %conv6 = trunc <4 x i64> %spec.store.select7 to <4 x i32>1696 ret <4 x i32> %conv61697}1698 1699; i16 saturate1700 1701define <2 x i16> @stest_f64i16_mm(<2 x double> %x) {1702; CHECK-LABEL: stest_f64i16_mm:1703; CHECK: .functype stest_f64i16_mm (v128) -> (v128)1704; CHECK-NEXT: # %bb.0: # %entry1705; CHECK-NEXT: local.get 01706; CHECK-NEXT: f64x2.extract_lane 01707; CHECK-NEXT: i32.trunc_sat_f64_s1708; CHECK-NEXT: i32x4.splat1709; CHECK-NEXT: local.get 01710; CHECK-NEXT: f64x2.extract_lane 11711; CHECK-NEXT: i32.trunc_sat_f64_s1712; CHECK-NEXT: i32x4.replace_lane 11713; CHECK-NEXT: v128.const 32767, 32767, 32767, 327671714; CHECK-NEXT: i32x4.min_s1715; CHECK-NEXT: v128.const -32768, -32768, -32768, -327681716; CHECK-NEXT: i32x4.max_s1717; CHECK-NEXT: local.get 01718; CHECK-NEXT: i8x16.shuffle 0, 1, 4, 5, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 11719; CHECK-NEXT: # fallthrough-return1720entry:1721 %conv = fptosi <2 x double> %x to <2 x i32>1722 %spec.store.select = call <2 x i32> @llvm.smin.v2i32(<2 x i32> %conv, <2 x i32> <i32 32767, i32 32767>)1723 %spec.store.select7 = call <2 x i32> @llvm.smax.v2i32(<2 x i32> %spec.store.select, <2 x i32> <i32 -32768, i32 -32768>)1724 %conv6 = trunc <2 x i32> %spec.store.select7 to <2 x i16>1725 ret <2 x i16> %conv61726}1727 1728define <2 x i16> @utest_f64i16_mm(<2 x double> %x) {1729; CHECK-LABEL: utest_f64i16_mm:1730; CHECK: .functype utest_f64i16_mm (v128) -> (v128)1731; CHECK-NEXT: # %bb.0: # %entry1732; CHECK-NEXT: local.get 01733; CHECK-NEXT: f64x2.extract_lane 01734; CHECK-NEXT: i32.trunc_sat_f64_u1735; CHECK-NEXT: i32x4.splat1736; CHECK-NEXT: local.get 01737; CHECK-NEXT: f64x2.extract_lane 11738; CHECK-NEXT: i32.trunc_sat_f64_u1739; CHECK-NEXT: i32x4.replace_lane 11740; CHECK-NEXT: v128.const 65535, 65535, 65535, 655351741; CHECK-NEXT: i32x4.min_u1742; CHECK-NEXT: local.get 01743; CHECK-NEXT: i8x16.shuffle 0, 1, 4, 5, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 11744; CHECK-NEXT: # fallthrough-return1745entry:1746 %conv = fptoui <2 x double> %x to <2 x i32>1747 %spec.store.select = call <2 x i32> @llvm.umin.v2i32(<2 x i32> %conv, <2 x i32> <i32 65535, i32 65535>)1748 %conv6 = trunc <2 x i32> %spec.store.select to <2 x i16>1749 ret <2 x i16> %conv61750}1751 1752define <2 x i16> @ustest_f64i16_mm(<2 x double> %x) {1753; CHECK-LABEL: ustest_f64i16_mm:1754; CHECK: .functype ustest_f64i16_mm (v128) -> (v128)1755; CHECK-NEXT: # %bb.0: # %entry1756; CHECK-NEXT: local.get 01757; CHECK-NEXT: f64x2.extract_lane 01758; CHECK-NEXT: i32.trunc_sat_f64_s1759; CHECK-NEXT: i32x4.splat1760; CHECK-NEXT: local.get 01761; CHECK-NEXT: f64x2.extract_lane 11762; CHECK-NEXT: i32.trunc_sat_f64_s1763; CHECK-NEXT: i32x4.replace_lane 11764; CHECK-NEXT: v128.const 65535, 65535, 65535, 655351765; CHECK-NEXT: i32x4.min_s1766; CHECK-NEXT: v128.const 0, 0, 0, 01767; CHECK-NEXT: i32x4.max_s1768; CHECK-NEXT: local.get 01769; CHECK-NEXT: i8x16.shuffle 0, 1, 4, 5, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 11770; CHECK-NEXT: # fallthrough-return1771entry:1772 %conv = fptosi <2 x double> %x to <2 x i32>1773 %spec.store.select = call <2 x i32> @llvm.smin.v2i32(<2 x i32> %conv, <2 x i32> <i32 65535, i32 65535>)1774 %spec.store.select7 = call <2 x i32> @llvm.smax.v2i32(<2 x i32> %spec.store.select, <2 x i32> zeroinitializer)1775 %conv6 = trunc <2 x i32> %spec.store.select7 to <2 x i16>1776 ret <2 x i16> %conv61777}1778 1779define <4 x i16> @stest_f32i16_mm(<4 x float> %x) {1780; CHECK-LABEL: stest_f32i16_mm:1781; CHECK: .functype stest_f32i16_mm (v128) -> (v128)1782; CHECK-NEXT: # %bb.0: # %entry1783; CHECK-NEXT: local.get 01784; CHECK-NEXT: i32x4.trunc_sat_f32x4_s1785; CHECK-NEXT: v128.const 32767, 32767, 32767, 327671786; CHECK-NEXT: i32x4.min_s1787; CHECK-NEXT: v128.const -32768, -32768, -32768, -327681788; CHECK-NEXT: i32x4.max_s1789; CHECK-NEXT: local.get 01790; CHECK-NEXT: i8x16.shuffle 0, 1, 4, 5, 8, 9, 12, 13, 0, 1, 0, 1, 0, 1, 0, 11791; CHECK-NEXT: # fallthrough-return1792entry:1793 %conv = fptosi <4 x float> %x to <4 x i32>1794 %spec.store.select = call <4 x i32> @llvm.smin.v4i32(<4 x i32> %conv, <4 x i32> <i32 32767, i32 32767, i32 32767, i32 32767>)1795 %spec.store.select7 = call <4 x i32> @llvm.smax.v4i32(<4 x i32> %spec.store.select, <4 x i32> <i32 -32768, i32 -32768, i32 -32768, i32 -32768>)1796 %conv6 = trunc <4 x i32> %spec.store.select7 to <4 x i16>1797 ret <4 x i16> %conv61798}1799 1800define <4 x i16> @utest_f32i16_mm(<4 x float> %x) {1801; CHECK-LABEL: utest_f32i16_mm:1802; CHECK: .functype utest_f32i16_mm (v128) -> (v128)1803; CHECK-NEXT: # %bb.0: # %entry1804; CHECK-NEXT: local.get 01805; CHECK-NEXT: i32x4.trunc_sat_f32x4_u1806; CHECK-NEXT: v128.const 65535, 65535, 65535, 655351807; CHECK-NEXT: i32x4.min_u1808; CHECK-NEXT: local.get 01809; CHECK-NEXT: i8x16.shuffle 0, 1, 4, 5, 8, 9, 12, 13, 0, 1, 0, 1, 0, 1, 0, 11810; CHECK-NEXT: # fallthrough-return1811entry:1812 %conv = fptoui <4 x float> %x to <4 x i32>1813 %spec.store.select = call <4 x i32> @llvm.umin.v4i32(<4 x i32> %conv, <4 x i32> <i32 65535, i32 65535, i32 65535, i32 65535>)1814 %conv6 = trunc <4 x i32> %spec.store.select to <4 x i16>1815 ret <4 x i16> %conv61816}1817 1818define <4 x i16> @ustest_f32i16_mm(<4 x float> %x) {1819; CHECK-LABEL: ustest_f32i16_mm:1820; CHECK: .functype ustest_f32i16_mm (v128) -> (v128)1821; CHECK-NEXT: # %bb.0: # %entry1822; CHECK-NEXT: local.get 01823; CHECK-NEXT: i32x4.trunc_sat_f32x4_s1824; CHECK-NEXT: v128.const 65535, 65535, 65535, 655351825; CHECK-NEXT: i32x4.min_s1826; CHECK-NEXT: v128.const 0, 0, 0, 01827; CHECK-NEXT: i32x4.max_s1828; CHECK-NEXT: local.get 01829; CHECK-NEXT: i8x16.shuffle 0, 1, 4, 5, 8, 9, 12, 13, 0, 1, 0, 1, 0, 1, 0, 11830; CHECK-NEXT: # fallthrough-return1831entry:1832 %conv = fptosi <4 x float> %x to <4 x i32>1833 %spec.store.select = call <4 x i32> @llvm.smin.v4i32(<4 x i32> %conv, <4 x i32> <i32 65535, i32 65535, i32 65535, i32 65535>)1834 %spec.store.select7 = call <4 x i32> @llvm.smax.v4i32(<4 x i32> %spec.store.select, <4 x i32> zeroinitializer)1835 %conv6 = trunc <4 x i32> %spec.store.select7 to <4 x i16>1836 ret <4 x i16> %conv61837}1838 1839define <8 x i16> @stest_f16i16_mm(<8 x half> %x) {1840; CHECK-LABEL: stest_f16i16_mm:1841; CHECK: .functype stest_f16i16_mm (f32, f32, f32, f32, f32, f32, f32, f32) -> (v128)1842; CHECK-NEXT: # %bb.0: # %entry1843; CHECK-NEXT: local.get 51844; CHECK-NEXT: call __truncsfhf21845; CHECK-NEXT: call __extendhfsf21846; CHECK-NEXT: local.set 51847; CHECK-NEXT: local.get 41848; CHECK-NEXT: call __truncsfhf21849; CHECK-NEXT: call __extendhfsf21850; CHECK-NEXT: local.set 41851; CHECK-NEXT: local.get 61852; CHECK-NEXT: call __truncsfhf21853; CHECK-NEXT: call __extendhfsf21854; CHECK-NEXT: local.set 61855; CHECK-NEXT: local.get 71856; CHECK-NEXT: call __truncsfhf21857; CHECK-NEXT: call __extendhfsf21858; CHECK-NEXT: local.set 71859; CHECK-NEXT: local.get 11860; CHECK-NEXT: call __truncsfhf21861; CHECK-NEXT: call __extendhfsf21862; CHECK-NEXT: local.set 11863; CHECK-NEXT: local.get 01864; CHECK-NEXT: call __truncsfhf21865; CHECK-NEXT: call __extendhfsf21866; CHECK-NEXT: i32.trunc_sat_f32_s1867; CHECK-NEXT: i32x4.splat1868; CHECK-NEXT: local.get 11869; CHECK-NEXT: i32.trunc_sat_f32_s1870; CHECK-NEXT: i32x4.replace_lane 11871; CHECK-NEXT: local.get 21872; CHECK-NEXT: call __truncsfhf21873; CHECK-NEXT: call __extendhfsf21874; CHECK-NEXT: i32.trunc_sat_f32_s1875; CHECK-NEXT: i32x4.replace_lane 21876; CHECK-NEXT: local.get 31877; CHECK-NEXT: call __truncsfhf21878; CHECK-NEXT: call __extendhfsf21879; CHECK-NEXT: i32.trunc_sat_f32_s1880; CHECK-NEXT: i32x4.replace_lane 31881; CHECK-NEXT: local.get 41882; CHECK-NEXT: i32.trunc_sat_f32_s1883; CHECK-NEXT: i32x4.splat1884; CHECK-NEXT: local.get 51885; CHECK-NEXT: i32.trunc_sat_f32_s1886; CHECK-NEXT: i32x4.replace_lane 11887; CHECK-NEXT: local.get 61888; CHECK-NEXT: i32.trunc_sat_f32_s1889; CHECK-NEXT: i32x4.replace_lane 21890; CHECK-NEXT: local.get 71891; CHECK-NEXT: i32.trunc_sat_f32_s1892; CHECK-NEXT: i32x4.replace_lane 31893; CHECK-NEXT: i16x8.narrow_i32x4_s1894; CHECK-NEXT: # fallthrough-return1895entry:1896 %conv = fptosi <8 x half> %x to <8 x i32>1897 %spec.store.select = call <8 x i32> @llvm.smin.v8i32(<8 x i32> %conv, <8 x i32> <i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767>)1898 %spec.store.select7 = call <8 x i32> @llvm.smax.v8i32(<8 x i32> %spec.store.select, <8 x i32> <i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768>)1899 %conv6 = trunc <8 x i32> %spec.store.select7 to <8 x i16>1900 ret <8 x i16> %conv61901}1902 1903define <8 x i16> @utest_f16i16_mm(<8 x half> %x) {1904; CHECK-LABEL: utest_f16i16_mm:1905; CHECK: .functype utest_f16i16_mm (f32, f32, f32, f32, f32, f32, f32, f32) -> (v128)1906; CHECK-NEXT: # %bb.0: # %entry1907; CHECK-NEXT: local.get 51908; CHECK-NEXT: call __truncsfhf21909; CHECK-NEXT: call __extendhfsf21910; CHECK-NEXT: local.set 51911; CHECK-NEXT: local.get 41912; CHECK-NEXT: call __truncsfhf21913; CHECK-NEXT: call __extendhfsf21914; CHECK-NEXT: local.set 41915; CHECK-NEXT: local.get 61916; CHECK-NEXT: call __truncsfhf21917; CHECK-NEXT: call __extendhfsf21918; CHECK-NEXT: local.set 61919; CHECK-NEXT: local.get 71920; CHECK-NEXT: call __truncsfhf21921; CHECK-NEXT: call __extendhfsf21922; CHECK-NEXT: local.set 71923; CHECK-NEXT: local.get 11924; CHECK-NEXT: call __truncsfhf21925; CHECK-NEXT: call __extendhfsf21926; CHECK-NEXT: local.set 11927; CHECK-NEXT: local.get 01928; CHECK-NEXT: call __truncsfhf21929; CHECK-NEXT: call __extendhfsf21930; CHECK-NEXT: i32.trunc_sat_f32_u1931; CHECK-NEXT: i32x4.splat1932; CHECK-NEXT: local.get 11933; CHECK-NEXT: i32.trunc_sat_f32_u1934; CHECK-NEXT: i32x4.replace_lane 11935; CHECK-NEXT: local.get 21936; CHECK-NEXT: call __truncsfhf21937; CHECK-NEXT: call __extendhfsf21938; CHECK-NEXT: i32.trunc_sat_f32_u1939; CHECK-NEXT: i32x4.replace_lane 21940; CHECK-NEXT: local.get 31941; CHECK-NEXT: call __truncsfhf21942; CHECK-NEXT: call __extendhfsf21943; CHECK-NEXT: i32.trunc_sat_f32_u1944; CHECK-NEXT: i32x4.replace_lane 31945; CHECK-NEXT: local.get 41946; CHECK-NEXT: i32.trunc_sat_f32_u1947; CHECK-NEXT: i32x4.splat1948; CHECK-NEXT: local.get 51949; CHECK-NEXT: i32.trunc_sat_f32_u1950; CHECK-NEXT: i32x4.replace_lane 11951; CHECK-NEXT: local.get 61952; CHECK-NEXT: i32.trunc_sat_f32_u1953; CHECK-NEXT: i32x4.replace_lane 21954; CHECK-NEXT: local.get 71955; CHECK-NEXT: i32.trunc_sat_f32_u1956; CHECK-NEXT: i32x4.replace_lane 31957; CHECK-NEXT: i16x8.narrow_i32x4_u1958; CHECK-NEXT: # fallthrough-return1959entry:1960 %conv = fptoui <8 x half> %x to <8 x i32>1961 %spec.store.select = call <8 x i32> @llvm.umin.v8i32(<8 x i32> %conv, <8 x i32> <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>)1962 %conv6 = trunc <8 x i32> %spec.store.select to <8 x i16>1963 ret <8 x i16> %conv61964}1965 1966define <8 x i16> @ustest_f16i16_mm(<8 x half> %x) {1967; CHECK-LABEL: ustest_f16i16_mm:1968; CHECK: .functype ustest_f16i16_mm (f32, f32, f32, f32, f32, f32, f32, f32) -> (v128)1969; CHECK-NEXT: .local v128, v1281970; CHECK-NEXT: # %bb.0: # %entry1971; CHECK-NEXT: local.get 51972; CHECK-NEXT: call __truncsfhf21973; CHECK-NEXT: call __extendhfsf21974; CHECK-NEXT: local.set 51975; CHECK-NEXT: local.get 41976; CHECK-NEXT: call __truncsfhf21977; CHECK-NEXT: call __extendhfsf21978; CHECK-NEXT: local.set 41979; CHECK-NEXT: local.get 61980; CHECK-NEXT: call __truncsfhf21981; CHECK-NEXT: call __extendhfsf21982; CHECK-NEXT: local.set 61983; CHECK-NEXT: local.get 71984; CHECK-NEXT: call __truncsfhf21985; CHECK-NEXT: call __extendhfsf21986; CHECK-NEXT: local.set 71987; CHECK-NEXT: local.get 11988; CHECK-NEXT: call __truncsfhf21989; CHECK-NEXT: call __extendhfsf21990; CHECK-NEXT: local.set 11991; CHECK-NEXT: local.get 01992; CHECK-NEXT: call __truncsfhf21993; CHECK-NEXT: call __extendhfsf21994; CHECK-NEXT: i32.trunc_sat_f32_s1995; CHECK-NEXT: i32x4.splat1996; CHECK-NEXT: local.get 11997; CHECK-NEXT: i32.trunc_sat_f32_s1998; CHECK-NEXT: i32x4.replace_lane 11999; CHECK-NEXT: local.get 22000; CHECK-NEXT: call __truncsfhf22001; CHECK-NEXT: call __extendhfsf22002; CHECK-NEXT: i32.trunc_sat_f32_s2003; CHECK-NEXT: i32x4.replace_lane 22004; CHECK-NEXT: local.get 32005; CHECK-NEXT: call __truncsfhf22006; CHECK-NEXT: call __extendhfsf22007; CHECK-NEXT: i32.trunc_sat_f32_s2008; CHECK-NEXT: i32x4.replace_lane 32009; CHECK-NEXT: v128.const 65535, 65535, 65535, 655352010; CHECK-NEXT: local.tee 82011; CHECK-NEXT: i32x4.min_s2012; CHECK-NEXT: v128.const 0, 0, 0, 02013; CHECK-NEXT: local.tee 92014; CHECK-NEXT: i32x4.max_s2015; CHECK-NEXT: local.get 42016; CHECK-NEXT: i32.trunc_sat_f32_s2017; CHECK-NEXT: i32x4.splat2018; CHECK-NEXT: local.get 52019; CHECK-NEXT: i32.trunc_sat_f32_s2020; CHECK-NEXT: i32x4.replace_lane 12021; CHECK-NEXT: local.get 62022; CHECK-NEXT: i32.trunc_sat_f32_s2023; CHECK-NEXT: i32x4.replace_lane 22024; CHECK-NEXT: local.get 72025; CHECK-NEXT: i32.trunc_sat_f32_s2026; CHECK-NEXT: i32x4.replace_lane 32027; CHECK-NEXT: local.get 82028; CHECK-NEXT: i32x4.min_s2029; CHECK-NEXT: local.get 92030; CHECK-NEXT: i32x4.max_s2031; CHECK-NEXT: i16x8.narrow_i32x4_u2032; CHECK-NEXT: # fallthrough-return2033entry:2034 %conv = fptosi <8 x half> %x to <8 x i32>2035 %spec.store.select = call <8 x i32> @llvm.smin.v8i32(<8 x i32> %conv, <8 x i32> <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>)2036 %spec.store.select7 = call <8 x i32> @llvm.smax.v8i32(<8 x i32> %spec.store.select, <8 x i32> zeroinitializer)2037 %conv6 = trunc <8 x i32> %spec.store.select7 to <8 x i16>2038 ret <8 x i16> %conv62039}2040 2041; i64 saturate2042 2043define <2 x i64> @stest_f64i64_mm(<2 x double> %x) {2044; CHECK-LABEL: stest_f64i64_mm:2045; CHECK: .functype stest_f64i64_mm (v128) -> (v128)2046; CHECK-NEXT: .local i32, i64, i64, i64, i642047; CHECK-NEXT: # %bb.0: # %entry2048; CHECK-NEXT: global.get __stack_pointer2049; CHECK-NEXT: i32.const 322050; CHECK-NEXT: i32.sub2051; CHECK-NEXT: local.tee 12052; CHECK-NEXT: global.set __stack_pointer2053; CHECK-NEXT: local.get 12054; CHECK-NEXT: i32.const 162055; CHECK-NEXT: i32.add2056; CHECK-NEXT: local.get 02057; CHECK-NEXT: f64x2.extract_lane 12058; CHECK-NEXT: call __fixdfti2059; CHECK-NEXT: local.get 12060; CHECK-NEXT: local.get 02061; CHECK-NEXT: f64x2.extract_lane 02062; CHECK-NEXT: call __fixdfti2063; CHECK-NEXT: local.get 12064; CHECK-NEXT: i64.load 242065; CHECK-NEXT: local.set 22066; CHECK-NEXT: local.get 12067; CHECK-NEXT: i64.load 162068; CHECK-NEXT: local.set 32069; CHECK-NEXT: local.get 12070; CHECK-NEXT: i64.load 82071; CHECK-NEXT: local.set 42072; CHECK-NEXT: local.get 12073; CHECK-NEXT: i64.load 02074; CHECK-NEXT: local.set 52075; CHECK-NEXT: local.get 12076; CHECK-NEXT: i32.const 322077; CHECK-NEXT: i32.add2078; CHECK-NEXT: global.set __stack_pointer2079; CHECK-NEXT: local.get 52080; CHECK-NEXT: i64.const 92233720368547758072081; CHECK-NEXT: local.get 52082; CHECK-NEXT: i64.const 92233720368547758072083; CHECK-NEXT: i64.lt_u2084; CHECK-NEXT: local.get 42085; CHECK-NEXT: i64.const 02086; CHECK-NEXT: i64.lt_s2087; CHECK-NEXT: local.get 42088; CHECK-NEXT: i64.eqz2089; CHECK-NEXT: i32.select2090; CHECK-NEXT: local.tee 12091; CHECK-NEXT: i64.select2092; CHECK-NEXT: local.tee 52093; CHECK-NEXT: i64.const -92233720368547758082094; CHECK-NEXT: local.get 52095; CHECK-NEXT: i64.const -92233720368547758082096; CHECK-NEXT: i64.gt_u2097; CHECK-NEXT: local.get 42098; CHECK-NEXT: i64.const 02099; CHECK-NEXT: local.get 12100; CHECK-NEXT: i64.select2101; CHECK-NEXT: local.tee 42102; CHECK-NEXT: i64.const -12103; CHECK-NEXT: i64.gt_s2104; CHECK-NEXT: local.get 42105; CHECK-NEXT: i64.const -12106; CHECK-NEXT: i64.eq2107; CHECK-NEXT: i32.select2108; CHECK-NEXT: i64.select2109; CHECK-NEXT: i64x2.splat2110; CHECK-NEXT: local.get 32111; CHECK-NEXT: i64.const 92233720368547758072112; CHECK-NEXT: local.get 32113; CHECK-NEXT: i64.const 92233720368547758072114; CHECK-NEXT: i64.lt_u2115; CHECK-NEXT: local.get 22116; CHECK-NEXT: i64.const 02117; CHECK-NEXT: i64.lt_s2118; CHECK-NEXT: local.get 22119; CHECK-NEXT: i64.eqz2120; CHECK-NEXT: i32.select2121; CHECK-NEXT: local.tee 12122; CHECK-NEXT: i64.select2123; CHECK-NEXT: local.tee 42124; CHECK-NEXT: i64.const -92233720368547758082125; CHECK-NEXT: local.get 42126; CHECK-NEXT: i64.const -92233720368547758082127; CHECK-NEXT: i64.gt_u2128; CHECK-NEXT: local.get 22129; CHECK-NEXT: i64.const 02130; CHECK-NEXT: local.get 12131; CHECK-NEXT: i64.select2132; CHECK-NEXT: local.tee 22133; CHECK-NEXT: i64.const -12134; CHECK-NEXT: i64.gt_s2135; CHECK-NEXT: local.get 22136; CHECK-NEXT: i64.const -12137; CHECK-NEXT: i64.eq2138; CHECK-NEXT: i32.select2139; CHECK-NEXT: i64.select2140; CHECK-NEXT: i64x2.replace_lane 12141; CHECK-NEXT: # fallthrough-return2142entry:2143 %conv = fptosi <2 x double> %x to <2 x i128>2144 %spec.store.select = call <2 x i128> @llvm.smin.v2i128(<2 x i128> %conv, <2 x i128> <i128 9223372036854775807, i128 9223372036854775807>)2145 %spec.store.select7 = call <2 x i128> @llvm.smax.v2i128(<2 x i128> %spec.store.select, <2 x i128> <i128 -9223372036854775808, i128 -9223372036854775808>)2146 %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64>2147 ret <2 x i64> %conv62148}2149 2150define <2 x i64> @utest_f64i64_mm(<2 x double> %x) {2151; CHECK-LABEL: utest_f64i64_mm:2152; CHECK: .functype utest_f64i64_mm (v128) -> (v128)2153; CHECK-NEXT: .local i32, i64, i64, i64, i642154; CHECK-NEXT: # %bb.0: # %entry2155; CHECK-NEXT: global.get __stack_pointer2156; CHECK-NEXT: i32.const 322157; CHECK-NEXT: i32.sub2158; CHECK-NEXT: local.tee 12159; CHECK-NEXT: global.set __stack_pointer2160; CHECK-NEXT: local.get 12161; CHECK-NEXT: i32.const 162162; CHECK-NEXT: i32.add2163; CHECK-NEXT: local.get 02164; CHECK-NEXT: f64x2.extract_lane 12165; CHECK-NEXT: call __fixunsdfti2166; CHECK-NEXT: local.get 12167; CHECK-NEXT: local.get 02168; CHECK-NEXT: f64x2.extract_lane 02169; CHECK-NEXT: call __fixunsdfti2170; CHECK-NEXT: local.get 12171; CHECK-NEXT: i64.load 242172; CHECK-NEXT: local.set 22173; CHECK-NEXT: local.get 12174; CHECK-NEXT: i64.load 162175; CHECK-NEXT: local.set 32176; CHECK-NEXT: local.get 12177; CHECK-NEXT: i64.load 82178; CHECK-NEXT: local.set 42179; CHECK-NEXT: local.get 12180; CHECK-NEXT: i64.load 02181; CHECK-NEXT: local.set 52182; CHECK-NEXT: local.get 12183; CHECK-NEXT: i32.const 322184; CHECK-NEXT: i32.add2185; CHECK-NEXT: global.set __stack_pointer2186; CHECK-NEXT: local.get 52187; CHECK-NEXT: i64.const 02188; CHECK-NEXT: local.get 42189; CHECK-NEXT: i64.eqz2190; CHECK-NEXT: i64.select2191; CHECK-NEXT: i64x2.splat2192; CHECK-NEXT: local.get 32193; CHECK-NEXT: i64.const 02194; CHECK-NEXT: local.get 22195; CHECK-NEXT: i64.eqz2196; CHECK-NEXT: i64.select2197; CHECK-NEXT: i64x2.replace_lane 12198; CHECK-NEXT: # fallthrough-return2199entry:2200 %conv = fptoui <2 x double> %x to <2 x i128>2201 %spec.store.select = call <2 x i128> @llvm.umin.v2i128(<2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>)2202 %conv6 = trunc <2 x i128> %spec.store.select to <2 x i64>2203 ret <2 x i64> %conv62204}2205 2206define <2 x i64> @ustest_f64i64_mm(<2 x double> %x) {2207; CHECK-LABEL: ustest_f64i64_mm:2208; CHECK: .functype ustest_f64i64_mm (v128) -> (v128)2209; CHECK-NEXT: .local i32, i64, i64, i64, i642210; CHECK-NEXT: # %bb.0: # %entry2211; CHECK-NEXT: global.get __stack_pointer2212; CHECK-NEXT: i32.const 322213; CHECK-NEXT: i32.sub2214; CHECK-NEXT: local.tee 12215; CHECK-NEXT: global.set __stack_pointer2216; CHECK-NEXT: local.get 12217; CHECK-NEXT: i32.const 162218; CHECK-NEXT: i32.add2219; CHECK-NEXT: local.get 02220; CHECK-NEXT: f64x2.extract_lane 12221; CHECK-NEXT: call __fixdfti2222; CHECK-NEXT: local.get 12223; CHECK-NEXT: local.get 02224; CHECK-NEXT: f64x2.extract_lane 02225; CHECK-NEXT: call __fixdfti2226; CHECK-NEXT: local.get 12227; CHECK-NEXT: i64.load 242228; CHECK-NEXT: local.set 22229; CHECK-NEXT: local.get 12230; CHECK-NEXT: i64.load 162231; CHECK-NEXT: local.set 32232; CHECK-NEXT: local.get 12233; CHECK-NEXT: i64.load 82234; CHECK-NEXT: local.set 42235; CHECK-NEXT: local.get 12236; CHECK-NEXT: i64.load 02237; CHECK-NEXT: local.set 52238; CHECK-NEXT: local.get 12239; CHECK-NEXT: i32.const 322240; CHECK-NEXT: i32.add2241; CHECK-NEXT: global.set __stack_pointer2242; CHECK-NEXT: i64.const 02243; CHECK-NEXT: local.get 52244; CHECK-NEXT: i64.const 02245; CHECK-NEXT: local.get 42246; CHECK-NEXT: i64.const 12247; CHECK-NEXT: i64.lt_s2248; CHECK-NEXT: local.tee 12249; CHECK-NEXT: i64.select2250; CHECK-NEXT: local.get 42251; CHECK-NEXT: i64.const 12252; CHECK-NEXT: local.get 12253; CHECK-NEXT: i64.select2254; CHECK-NEXT: i64.const 02255; CHECK-NEXT: i64.lt_s2256; CHECK-NEXT: i64.select2257; CHECK-NEXT: i64x2.splat2258; CHECK-NEXT: i64.const 02259; CHECK-NEXT: local.get 32260; CHECK-NEXT: i64.const 02261; CHECK-NEXT: local.get 22262; CHECK-NEXT: i64.const 12263; CHECK-NEXT: i64.lt_s2264; CHECK-NEXT: local.tee 12265; CHECK-NEXT: i64.select2266; CHECK-NEXT: local.get 22267; CHECK-NEXT: i64.const 12268; CHECK-NEXT: local.get 12269; CHECK-NEXT: i64.select2270; CHECK-NEXT: i64.const 02271; CHECK-NEXT: i64.lt_s2272; CHECK-NEXT: i64.select2273; CHECK-NEXT: i64x2.replace_lane 12274; CHECK-NEXT: # fallthrough-return2275entry:2276 %conv = fptosi <2 x double> %x to <2 x i128>2277 %spec.store.select = call <2 x i128> @llvm.smin.v2i128(<2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>)2278 %spec.store.select7 = call <2 x i128> @llvm.smax.v2i128(<2 x i128> %spec.store.select, <2 x i128> zeroinitializer)2279 %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64>2280 ret <2 x i64> %conv62281}2282 2283define <2 x i64> @stest_f32i64_mm(<2 x float> %x) {2284; CHECK-LABEL: stest_f32i64_mm:2285; CHECK: .functype stest_f32i64_mm (v128) -> (v128)2286; CHECK-NEXT: .local i32, i64, i64, i64, i642287; CHECK-NEXT: # %bb.0: # %entry2288; CHECK-NEXT: global.get __stack_pointer2289; CHECK-NEXT: i32.const 322290; CHECK-NEXT: i32.sub2291; CHECK-NEXT: local.tee 12292; CHECK-NEXT: global.set __stack_pointer2293; CHECK-NEXT: local.get 12294; CHECK-NEXT: i32.const 162295; CHECK-NEXT: i32.add2296; CHECK-NEXT: local.get 02297; CHECK-NEXT: f32x4.extract_lane 12298; CHECK-NEXT: call __fixsfti2299; CHECK-NEXT: local.get 12300; CHECK-NEXT: local.get 02301; CHECK-NEXT: f32x4.extract_lane 02302; CHECK-NEXT: call __fixsfti2303; CHECK-NEXT: local.get 12304; CHECK-NEXT: i64.load 242305; CHECK-NEXT: local.set 22306; CHECK-NEXT: local.get 12307; CHECK-NEXT: i64.load 162308; CHECK-NEXT: local.set 32309; CHECK-NEXT: local.get 12310; CHECK-NEXT: i64.load 82311; CHECK-NEXT: local.set 42312; CHECK-NEXT: local.get 12313; CHECK-NEXT: i64.load 02314; CHECK-NEXT: local.set 52315; CHECK-NEXT: local.get 12316; CHECK-NEXT: i32.const 322317; CHECK-NEXT: i32.add2318; CHECK-NEXT: global.set __stack_pointer2319; CHECK-NEXT: local.get 52320; CHECK-NEXT: i64.const 92233720368547758072321; CHECK-NEXT: local.get 52322; CHECK-NEXT: i64.const 92233720368547758072323; CHECK-NEXT: i64.lt_u2324; CHECK-NEXT: local.get 42325; CHECK-NEXT: i64.const 02326; CHECK-NEXT: i64.lt_s2327; CHECK-NEXT: local.get 42328; CHECK-NEXT: i64.eqz2329; CHECK-NEXT: i32.select2330; CHECK-NEXT: local.tee 12331; CHECK-NEXT: i64.select2332; CHECK-NEXT: local.tee 52333; CHECK-NEXT: i64.const -92233720368547758082334; CHECK-NEXT: local.get 52335; CHECK-NEXT: i64.const -92233720368547758082336; CHECK-NEXT: i64.gt_u2337; CHECK-NEXT: local.get 42338; CHECK-NEXT: i64.const 02339; CHECK-NEXT: local.get 12340; CHECK-NEXT: i64.select2341; CHECK-NEXT: local.tee 42342; CHECK-NEXT: i64.const -12343; CHECK-NEXT: i64.gt_s2344; CHECK-NEXT: local.get 42345; CHECK-NEXT: i64.const -12346; CHECK-NEXT: i64.eq2347; CHECK-NEXT: i32.select2348; CHECK-NEXT: i64.select2349; CHECK-NEXT: i64x2.splat2350; CHECK-NEXT: local.get 32351; CHECK-NEXT: i64.const 92233720368547758072352; CHECK-NEXT: local.get 32353; CHECK-NEXT: i64.const 92233720368547758072354; CHECK-NEXT: i64.lt_u2355; CHECK-NEXT: local.get 22356; CHECK-NEXT: i64.const 02357; CHECK-NEXT: i64.lt_s2358; CHECK-NEXT: local.get 22359; CHECK-NEXT: i64.eqz2360; CHECK-NEXT: i32.select2361; CHECK-NEXT: local.tee 12362; CHECK-NEXT: i64.select2363; CHECK-NEXT: local.tee 42364; CHECK-NEXT: i64.const -92233720368547758082365; CHECK-NEXT: local.get 42366; CHECK-NEXT: i64.const -92233720368547758082367; CHECK-NEXT: i64.gt_u2368; CHECK-NEXT: local.get 22369; CHECK-NEXT: i64.const 02370; CHECK-NEXT: local.get 12371; CHECK-NEXT: i64.select2372; CHECK-NEXT: local.tee 22373; CHECK-NEXT: i64.const -12374; CHECK-NEXT: i64.gt_s2375; CHECK-NEXT: local.get 22376; CHECK-NEXT: i64.const -12377; CHECK-NEXT: i64.eq2378; CHECK-NEXT: i32.select2379; CHECK-NEXT: i64.select2380; CHECK-NEXT: i64x2.replace_lane 12381; CHECK-NEXT: # fallthrough-return2382entry:2383 %conv = fptosi <2 x float> %x to <2 x i128>2384 %spec.store.select = call <2 x i128> @llvm.smin.v2i128(<2 x i128> %conv, <2 x i128> <i128 9223372036854775807, i128 9223372036854775807>)2385 %spec.store.select7 = call <2 x i128> @llvm.smax.v2i128(<2 x i128> %spec.store.select, <2 x i128> <i128 -9223372036854775808, i128 -9223372036854775808>)2386 %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64>2387 ret <2 x i64> %conv62388}2389 2390define <2 x i64> @utest_f32i64_mm(<2 x float> %x) {2391; CHECK-LABEL: utest_f32i64_mm:2392; CHECK: .functype utest_f32i64_mm (v128) -> (v128)2393; CHECK-NEXT: .local i32, i64, i64, i64, i642394; CHECK-NEXT: # %bb.0: # %entry2395; CHECK-NEXT: global.get __stack_pointer2396; CHECK-NEXT: i32.const 322397; CHECK-NEXT: i32.sub2398; CHECK-NEXT: local.tee 12399; CHECK-NEXT: global.set __stack_pointer2400; CHECK-NEXT: local.get 12401; CHECK-NEXT: i32.const 162402; CHECK-NEXT: i32.add2403; CHECK-NEXT: local.get 02404; CHECK-NEXT: f32x4.extract_lane 12405; CHECK-NEXT: call __fixunssfti2406; CHECK-NEXT: local.get 12407; CHECK-NEXT: local.get 02408; CHECK-NEXT: f32x4.extract_lane 02409; CHECK-NEXT: call __fixunssfti2410; CHECK-NEXT: local.get 12411; CHECK-NEXT: i64.load 242412; CHECK-NEXT: local.set 22413; CHECK-NEXT: local.get 12414; CHECK-NEXT: i64.load 162415; CHECK-NEXT: local.set 32416; CHECK-NEXT: local.get 12417; CHECK-NEXT: i64.load 82418; CHECK-NEXT: local.set 42419; CHECK-NEXT: local.get 12420; CHECK-NEXT: i64.load 02421; CHECK-NEXT: local.set 52422; CHECK-NEXT: local.get 12423; CHECK-NEXT: i32.const 322424; CHECK-NEXT: i32.add2425; CHECK-NEXT: global.set __stack_pointer2426; CHECK-NEXT: local.get 52427; CHECK-NEXT: i64.const 02428; CHECK-NEXT: local.get 42429; CHECK-NEXT: i64.eqz2430; CHECK-NEXT: i64.select2431; CHECK-NEXT: i64x2.splat2432; CHECK-NEXT: local.get 32433; CHECK-NEXT: i64.const 02434; CHECK-NEXT: local.get 22435; CHECK-NEXT: i64.eqz2436; CHECK-NEXT: i64.select2437; CHECK-NEXT: i64x2.replace_lane 12438; CHECK-NEXT: # fallthrough-return2439entry:2440 %conv = fptoui <2 x float> %x to <2 x i128>2441 %spec.store.select = call <2 x i128> @llvm.umin.v2i128(<2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>)2442 %conv6 = trunc <2 x i128> %spec.store.select to <2 x i64>2443 ret <2 x i64> %conv62444}2445 2446define <2 x i64> @ustest_f32i64_mm(<2 x float> %x) {2447; CHECK-LABEL: ustest_f32i64_mm:2448; CHECK: .functype ustest_f32i64_mm (v128) -> (v128)2449; CHECK-NEXT: .local i32, i64, i64, i64, i642450; CHECK-NEXT: # %bb.0: # %entry2451; CHECK-NEXT: global.get __stack_pointer2452; CHECK-NEXT: i32.const 322453; CHECK-NEXT: i32.sub2454; CHECK-NEXT: local.tee 12455; CHECK-NEXT: global.set __stack_pointer2456; CHECK-NEXT: local.get 12457; CHECK-NEXT: i32.const 162458; CHECK-NEXT: i32.add2459; CHECK-NEXT: local.get 02460; CHECK-NEXT: f32x4.extract_lane 12461; CHECK-NEXT: call __fixsfti2462; CHECK-NEXT: local.get 12463; CHECK-NEXT: local.get 02464; CHECK-NEXT: f32x4.extract_lane 02465; CHECK-NEXT: call __fixsfti2466; CHECK-NEXT: local.get 12467; CHECK-NEXT: i64.load 242468; CHECK-NEXT: local.set 22469; CHECK-NEXT: local.get 12470; CHECK-NEXT: i64.load 162471; CHECK-NEXT: local.set 32472; CHECK-NEXT: local.get 12473; CHECK-NEXT: i64.load 82474; CHECK-NEXT: local.set 42475; CHECK-NEXT: local.get 12476; CHECK-NEXT: i64.load 02477; CHECK-NEXT: local.set 52478; CHECK-NEXT: local.get 12479; CHECK-NEXT: i32.const 322480; CHECK-NEXT: i32.add2481; CHECK-NEXT: global.set __stack_pointer2482; CHECK-NEXT: i64.const 02483; CHECK-NEXT: local.get 52484; CHECK-NEXT: i64.const 02485; CHECK-NEXT: local.get 42486; CHECK-NEXT: i64.const 12487; CHECK-NEXT: i64.lt_s2488; CHECK-NEXT: local.tee 12489; CHECK-NEXT: i64.select2490; CHECK-NEXT: local.get 42491; CHECK-NEXT: i64.const 12492; CHECK-NEXT: local.get 12493; CHECK-NEXT: i64.select2494; CHECK-NEXT: i64.const 02495; CHECK-NEXT: i64.lt_s2496; CHECK-NEXT: i64.select2497; CHECK-NEXT: i64x2.splat2498; CHECK-NEXT: i64.const 02499; CHECK-NEXT: local.get 32500; CHECK-NEXT: i64.const 02501; CHECK-NEXT: local.get 22502; CHECK-NEXT: i64.const 12503; CHECK-NEXT: i64.lt_s2504; CHECK-NEXT: local.tee 12505; CHECK-NEXT: i64.select2506; CHECK-NEXT: local.get 22507; CHECK-NEXT: i64.const 12508; CHECK-NEXT: local.get 12509; CHECK-NEXT: i64.select2510; CHECK-NEXT: i64.const 02511; CHECK-NEXT: i64.lt_s2512; CHECK-NEXT: i64.select2513; CHECK-NEXT: i64x2.replace_lane 12514; CHECK-NEXT: # fallthrough-return2515entry:2516 %conv = fptosi <2 x float> %x to <2 x i128>2517 %spec.store.select = call <2 x i128> @llvm.smin.v2i128(<2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>)2518 %spec.store.select7 = call <2 x i128> @llvm.smax.v2i128(<2 x i128> %spec.store.select, <2 x i128> zeroinitializer)2519 %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64>2520 ret <2 x i64> %conv62521}2522 2523define <2 x i64> @stest_f16i64_mm(<2 x half> %x) {2524; CHECK-LABEL: stest_f16i64_mm:2525; CHECK: .functype stest_f16i64_mm (f32, f32) -> (v128)2526; CHECK-NEXT: .local i32, i64, i64, i64, i642527; CHECK-NEXT: # %bb.0: # %entry2528; CHECK-NEXT: global.get __stack_pointer2529; CHECK-NEXT: i32.const 322530; CHECK-NEXT: i32.sub2531; CHECK-NEXT: local.tee 22532; CHECK-NEXT: global.set __stack_pointer2533; CHECK-NEXT: local.get 22534; CHECK-NEXT: i32.const 162535; CHECK-NEXT: i32.add2536; CHECK-NEXT: local.get 12537; CHECK-NEXT: call __truncsfhf22538; CHECK-NEXT: call __extendhfsf22539; CHECK-NEXT: call __fixsfti2540; CHECK-NEXT: local.get 22541; CHECK-NEXT: local.get 02542; CHECK-NEXT: call __truncsfhf22543; CHECK-NEXT: call __extendhfsf22544; CHECK-NEXT: call __fixsfti2545; CHECK-NEXT: local.get 22546; CHECK-NEXT: i64.load 242547; CHECK-NEXT: local.set 32548; CHECK-NEXT: local.get 22549; CHECK-NEXT: i64.load 162550; CHECK-NEXT: local.set 42551; CHECK-NEXT: local.get 22552; CHECK-NEXT: i64.load 82553; CHECK-NEXT: local.set 52554; CHECK-NEXT: local.get 22555; CHECK-NEXT: i64.load 02556; CHECK-NEXT: local.set 62557; CHECK-NEXT: local.get 22558; CHECK-NEXT: i32.const 322559; CHECK-NEXT: i32.add2560; CHECK-NEXT: global.set __stack_pointer2561; CHECK-NEXT: local.get 62562; CHECK-NEXT: i64.const 92233720368547758072563; CHECK-NEXT: local.get 62564; CHECK-NEXT: i64.const 92233720368547758072565; CHECK-NEXT: i64.lt_u2566; CHECK-NEXT: local.get 52567; CHECK-NEXT: i64.const 02568; CHECK-NEXT: i64.lt_s2569; CHECK-NEXT: local.get 52570; CHECK-NEXT: i64.eqz2571; CHECK-NEXT: i32.select2572; CHECK-NEXT: local.tee 22573; CHECK-NEXT: i64.select2574; CHECK-NEXT: local.tee 62575; CHECK-NEXT: i64.const -92233720368547758082576; CHECK-NEXT: local.get 62577; CHECK-NEXT: i64.const -92233720368547758082578; CHECK-NEXT: i64.gt_u2579; CHECK-NEXT: local.get 52580; CHECK-NEXT: i64.const 02581; CHECK-NEXT: local.get 22582; CHECK-NEXT: i64.select2583; CHECK-NEXT: local.tee 52584; CHECK-NEXT: i64.const -12585; CHECK-NEXT: i64.gt_s2586; CHECK-NEXT: local.get 52587; CHECK-NEXT: i64.const -12588; CHECK-NEXT: i64.eq2589; CHECK-NEXT: i32.select2590; CHECK-NEXT: i64.select2591; CHECK-NEXT: i64x2.splat2592; CHECK-NEXT: local.get 42593; CHECK-NEXT: i64.const 92233720368547758072594; CHECK-NEXT: local.get 42595; CHECK-NEXT: i64.const 92233720368547758072596; CHECK-NEXT: i64.lt_u2597; CHECK-NEXT: local.get 32598; CHECK-NEXT: i64.const 02599; CHECK-NEXT: i64.lt_s2600; CHECK-NEXT: local.get 32601; CHECK-NEXT: i64.eqz2602; CHECK-NEXT: i32.select2603; CHECK-NEXT: local.tee 22604; CHECK-NEXT: i64.select2605; CHECK-NEXT: local.tee 52606; CHECK-NEXT: i64.const -92233720368547758082607; CHECK-NEXT: local.get 52608; CHECK-NEXT: i64.const -92233720368547758082609; CHECK-NEXT: i64.gt_u2610; CHECK-NEXT: local.get 32611; CHECK-NEXT: i64.const 02612; CHECK-NEXT: local.get 22613; CHECK-NEXT: i64.select2614; CHECK-NEXT: local.tee 32615; CHECK-NEXT: i64.const -12616; CHECK-NEXT: i64.gt_s2617; CHECK-NEXT: local.get 32618; CHECK-NEXT: i64.const -12619; CHECK-NEXT: i64.eq2620; CHECK-NEXT: i32.select2621; CHECK-NEXT: i64.select2622; CHECK-NEXT: i64x2.replace_lane 12623; CHECK-NEXT: # fallthrough-return2624entry:2625 %conv = fptosi <2 x half> %x to <2 x i128>2626 %spec.store.select = call <2 x i128> @llvm.smin.v2i128(<2 x i128> %conv, <2 x i128> <i128 9223372036854775807, i128 9223372036854775807>)2627 %spec.store.select7 = call <2 x i128> @llvm.smax.v2i128(<2 x i128> %spec.store.select, <2 x i128> <i128 -9223372036854775808, i128 -9223372036854775808>)2628 %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64>2629 ret <2 x i64> %conv62630}2631 2632define <2 x i64> @utest_f16i64_mm(<2 x half> %x) {2633; CHECK-LABEL: utest_f16i64_mm:2634; CHECK: .functype utest_f16i64_mm (f32, f32) -> (v128)2635; CHECK-NEXT: .local i32, i64, i64, i64, i642636; CHECK-NEXT: # %bb.0: # %entry2637; CHECK-NEXT: global.get __stack_pointer2638; CHECK-NEXT: i32.const 322639; CHECK-NEXT: i32.sub2640; CHECK-NEXT: local.tee 22641; CHECK-NEXT: global.set __stack_pointer2642; CHECK-NEXT: local.get 22643; CHECK-NEXT: i32.const 162644; CHECK-NEXT: i32.add2645; CHECK-NEXT: local.get 12646; CHECK-NEXT: call __truncsfhf22647; CHECK-NEXT: call __extendhfsf22648; CHECK-NEXT: call __fixunssfti2649; CHECK-NEXT: local.get 22650; CHECK-NEXT: local.get 02651; CHECK-NEXT: call __truncsfhf22652; CHECK-NEXT: call __extendhfsf22653; CHECK-NEXT: call __fixunssfti2654; CHECK-NEXT: local.get 22655; CHECK-NEXT: i64.load 242656; CHECK-NEXT: local.set 32657; CHECK-NEXT: local.get 22658; CHECK-NEXT: i64.load 162659; CHECK-NEXT: local.set 42660; CHECK-NEXT: local.get 22661; CHECK-NEXT: i64.load 82662; CHECK-NEXT: local.set 52663; CHECK-NEXT: local.get 22664; CHECK-NEXT: i64.load 02665; CHECK-NEXT: local.set 62666; CHECK-NEXT: local.get 22667; CHECK-NEXT: i32.const 322668; CHECK-NEXT: i32.add2669; CHECK-NEXT: global.set __stack_pointer2670; CHECK-NEXT: local.get 62671; CHECK-NEXT: i64.const 02672; CHECK-NEXT: local.get 52673; CHECK-NEXT: i64.eqz2674; CHECK-NEXT: i64.select2675; CHECK-NEXT: i64x2.splat2676; CHECK-NEXT: local.get 42677; CHECK-NEXT: i64.const 02678; CHECK-NEXT: local.get 32679; CHECK-NEXT: i64.eqz2680; CHECK-NEXT: i64.select2681; CHECK-NEXT: i64x2.replace_lane 12682; CHECK-NEXT: # fallthrough-return2683entry:2684 %conv = fptoui <2 x half> %x to <2 x i128>2685 %spec.store.select = call <2 x i128> @llvm.umin.v2i128(<2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>)2686 %conv6 = trunc <2 x i128> %spec.store.select to <2 x i64>2687 ret <2 x i64> %conv62688}2689 2690define <2 x i64> @ustest_f16i64_mm(<2 x half> %x) {2691; CHECK-LABEL: ustest_f16i64_mm:2692; CHECK: .functype ustest_f16i64_mm (f32, f32) -> (v128)2693; CHECK-NEXT: .local i32, i64, i64, i64, i642694; CHECK-NEXT: # %bb.0: # %entry2695; CHECK-NEXT: global.get __stack_pointer2696; CHECK-NEXT: i32.const 322697; CHECK-NEXT: i32.sub2698; CHECK-NEXT: local.tee 22699; CHECK-NEXT: global.set __stack_pointer2700; CHECK-NEXT: local.get 22701; CHECK-NEXT: i32.const 162702; CHECK-NEXT: i32.add2703; CHECK-NEXT: local.get 12704; CHECK-NEXT: call __truncsfhf22705; CHECK-NEXT: call __extendhfsf22706; CHECK-NEXT: call __fixsfti2707; CHECK-NEXT: local.get 22708; CHECK-NEXT: local.get 02709; CHECK-NEXT: call __truncsfhf22710; CHECK-NEXT: call __extendhfsf22711; CHECK-NEXT: call __fixsfti2712; CHECK-NEXT: local.get 22713; CHECK-NEXT: i64.load 242714; CHECK-NEXT: local.set 32715; CHECK-NEXT: local.get 22716; CHECK-NEXT: i64.load 162717; CHECK-NEXT: local.set 42718; CHECK-NEXT: local.get 22719; CHECK-NEXT: i64.load 82720; CHECK-NEXT: local.set 52721; CHECK-NEXT: local.get 22722; CHECK-NEXT: i64.load 02723; CHECK-NEXT: local.set 62724; CHECK-NEXT: local.get 22725; CHECK-NEXT: i32.const 322726; CHECK-NEXT: i32.add2727; CHECK-NEXT: global.set __stack_pointer2728; CHECK-NEXT: i64.const 02729; CHECK-NEXT: local.get 62730; CHECK-NEXT: i64.const 02731; CHECK-NEXT: local.get 52732; CHECK-NEXT: i64.const 12733; CHECK-NEXT: i64.lt_s2734; CHECK-NEXT: local.tee 22735; CHECK-NEXT: i64.select2736; CHECK-NEXT: local.get 52737; CHECK-NEXT: i64.const 12738; CHECK-NEXT: local.get 22739; CHECK-NEXT: i64.select2740; CHECK-NEXT: i64.const 02741; CHECK-NEXT: i64.lt_s2742; CHECK-NEXT: i64.select2743; CHECK-NEXT: i64x2.splat2744; CHECK-NEXT: i64.const 02745; CHECK-NEXT: local.get 42746; CHECK-NEXT: i64.const 02747; CHECK-NEXT: local.get 32748; CHECK-NEXT: i64.const 12749; CHECK-NEXT: i64.lt_s2750; CHECK-NEXT: local.tee 22751; CHECK-NEXT: i64.select2752; CHECK-NEXT: local.get 32753; CHECK-NEXT: i64.const 12754; CHECK-NEXT: local.get 22755; CHECK-NEXT: i64.select2756; CHECK-NEXT: i64.const 02757; CHECK-NEXT: i64.lt_s2758; CHECK-NEXT: i64.select2759; CHECK-NEXT: i64x2.replace_lane 12760; CHECK-NEXT: # fallthrough-return2761entry:2762 %conv = fptosi <2 x half> %x to <2 x i128>2763 %spec.store.select = call <2 x i128> @llvm.smin.v2i128(<2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>)2764 %spec.store.select7 = call <2 x i128> @llvm.smax.v2i128(<2 x i128> %spec.store.select, <2 x i128> zeroinitializer)2765 %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64>2766 ret <2 x i64> %conv62767}2768 2769; i32 non saturate2770 2771define <4 x i32> @ustest_f16i32_nsat(<4 x half> %x) {2772; CHECK-LABEL: ustest_f16i32_nsat:2773; CHECK: .functype ustest_f16i32_nsat (f32, f32, f32, f32) -> (v128)2774; CHECK-NEXT: .local v1282775; CHECK-NEXT: # %bb.0: # %entry2776; CHECK-NEXT: local.get 12777; CHECK-NEXT: call __truncsfhf22778; CHECK-NEXT: call __extendhfsf22779; CHECK-NEXT: local.set 12780; CHECK-NEXT: local.get 02781; CHECK-NEXT: call __truncsfhf22782; CHECK-NEXT: call __extendhfsf22783; CHECK-NEXT: i32.trunc_sat_f32_s2784; CHECK-NEXT: i32x4.splat2785; CHECK-NEXT: local.get 12786; CHECK-NEXT: i32.trunc_sat_f32_s2787; CHECK-NEXT: i32x4.replace_lane 12788; CHECK-NEXT: local.get 22789; CHECK-NEXT: call __truncsfhf22790; CHECK-NEXT: call __extendhfsf22791; CHECK-NEXT: i32.trunc_sat_f32_s2792; CHECK-NEXT: i32x4.replace_lane 22793; CHECK-NEXT: local.get 32794; CHECK-NEXT: call __truncsfhf22795; CHECK-NEXT: call __extendhfsf22796; CHECK-NEXT: i32.trunc_sat_f32_s2797; CHECK-NEXT: i32x4.replace_lane 32798; CHECK-NEXT: v128.const 0, 0, 0, 02799; CHECK-NEXT: local.tee 42800; CHECK-NEXT: i32x4.min_s2801; CHECK-NEXT: local.get 42802; CHECK-NEXT: i32x4.max_s2803; CHECK-NEXT: # fallthrough-return2804entry:2805 %conv = fptosi <4 x half> %x to <4 x i32>2806 %spec.store.select = call <4 x i32> @llvm.smin.v4i32(<4 x i32> zeroinitializer, <4 x i32> %conv)2807 %spec.store.select7 = call <4 x i32> @llvm.smax.v4i32(<4 x i32> %spec.store.select, <4 x i32> zeroinitializer)2808 ret <4 x i32> %spec.store.select72809}2810 2811define <2 x i8> @fptosi_v2f32_v2i8(<2 x float> %x) {2812; CHECK-LABEL: fptosi_v2f32_v2i8:2813; CHECK: .functype fptosi_v2f32_v2i8 (v128) -> (v128)2814; CHECK-NEXT: # %bb.0:2815; CHECK-NEXT: local.get 02816; CHECK-NEXT: i32x4.trunc_sat_f32x4_s2817; CHECK-NEXT: v128.const 255, 255, 255, 2552818; CHECK-NEXT: v128.and2819; CHECK-NEXT: local.get 02820; CHECK-NEXT: i16x8.narrow_i32x4_u2821; CHECK-NEXT: local.get 02822; CHECK-NEXT: local.get 02823; CHECK-NEXT: i16x8.narrow_i32x4_u2824; CHECK-NEXT: i8x16.narrow_i16x8_u2825; CHECK-NEXT: # fallthrough-return2826 %conv = fptosi <2 x float> %x to <2 x i8>2827 ret <2 x i8> %conv2828}2829 2830define <2 x i8> @fptoui_v2f32_v2i8(<2 x float> %x) {2831; CHECK-LABEL: fptoui_v2f32_v2i8:2832; CHECK: .functype fptoui_v2f32_v2i8 (v128) -> (v128)2833; CHECK-NEXT: # %bb.0:2834; CHECK-NEXT: local.get 02835; CHECK-NEXT: i32x4.trunc_sat_f32x4_u2836; CHECK-NEXT: v128.const 255, 255, 255, 2552837; CHECK-NEXT: v128.and2838; CHECK-NEXT: local.get 02839; CHECK-NEXT: i16x8.narrow_i32x4_u2840; CHECK-NEXT: local.get 02841; CHECK-NEXT: local.get 02842; CHECK-NEXT: i16x8.narrow_i32x4_u2843; CHECK-NEXT: i8x16.narrow_i16x8_u2844; CHECK-NEXT: # fallthrough-return2845 %conv = fptoui <2 x float> %x to <2 x i8>2846 ret <2 x i8> %conv2847}2848 2849define <2 x i16> @fptosi_v2f32_v2i16(<2 x float> %x) {2850; CHECK-LABEL: fptosi_v2f32_v2i16:2851; CHECK: .functype fptosi_v2f32_v2i16 (v128) -> (v128)2852; CHECK-NEXT: # %bb.0:2853; CHECK-NEXT: local.get 02854; CHECK-NEXT: i32x4.trunc_sat_f32x4_s2855; CHECK-NEXT: v128.const 65535, 65535, 65535, 655352856; CHECK-NEXT: v128.and2857; CHECK-NEXT: local.get 02858; CHECK-NEXT: i16x8.narrow_i32x4_u2859; CHECK-NEXT: # fallthrough-return2860 %conv = fptosi <2 x float> %x to <2 x i16>2861 ret <2 x i16> %conv2862}2863 2864define <2 x i16> @fptoui_v2f32_v2i16(<2 x float> %x) {2865; CHECK-LABEL: fptoui_v2f32_v2i16:2866; CHECK: .functype fptoui_v2f32_v2i16 (v128) -> (v128)2867; CHECK-NEXT: # %bb.0:2868; CHECK-NEXT: local.get 02869; CHECK-NEXT: i32x4.trunc_sat_f32x4_u2870; CHECK-NEXT: v128.const 65535, 65535, 65535, 655352871; CHECK-NEXT: v128.and2872; CHECK-NEXT: local.get 02873; CHECK-NEXT: i16x8.narrow_i32x4_u2874; CHECK-NEXT: # fallthrough-return2875 %conv = fptoui <2 x float> %x to <2 x i16>2876 ret <2 x i16> %conv2877}2878 2879define <4 x i8> @fptosi_v4f32_v4i8(<4 x float> %x) {2880; CHECK-LABEL: fptosi_v4f32_v4i8:2881; CHECK: .functype fptosi_v4f32_v4i8 (v128) -> (v128)2882; CHECK-NEXT: # %bb.0:2883; CHECK-NEXT: local.get 02884; CHECK-NEXT: i32x4.trunc_sat_f32x4_s2885; CHECK-NEXT: v128.const 255, 255, 255, 2552886; CHECK-NEXT: v128.and2887; CHECK-NEXT: local.get 02888; CHECK-NEXT: i16x8.narrow_i32x4_u2889; CHECK-NEXT: local.get 02890; CHECK-NEXT: local.get 02891; CHECK-NEXT: i16x8.narrow_i32x4_u2892; CHECK-NEXT: i8x16.narrow_i16x8_u2893; CHECK-NEXT: # fallthrough-return2894 %conv = fptosi <4 x float> %x to <4 x i8>2895 ret <4 x i8> %conv2896}2897 2898define <4 x i8> @fptoui_v4f32_v4i8(<4 x float> %x) {2899; CHECK-LABEL: fptoui_v4f32_v4i8:2900; CHECK: .functype fptoui_v4f32_v4i8 (v128) -> (v128)2901; CHECK-NEXT: # %bb.0:2902; CHECK-NEXT: local.get 02903; CHECK-NEXT: i32x4.trunc_sat_f32x4_u2904; CHECK-NEXT: v128.const 255, 255, 255, 2552905; CHECK-NEXT: v128.and2906; CHECK-NEXT: local.get 02907; CHECK-NEXT: i16x8.narrow_i32x4_u2908; CHECK-NEXT: local.get 02909; CHECK-NEXT: local.get 02910; CHECK-NEXT: i16x8.narrow_i32x4_u2911; CHECK-NEXT: i8x16.narrow_i16x8_u2912; CHECK-NEXT: # fallthrough-return2913 %conv = fptoui <4 x float> %x to <4 x i8>2914 ret <4 x i8> %conv2915}2916 2917define <4 x i16> @fptosi_v4f32_v4i16(<4 x float> %x) {2918; CHECK-LABEL: fptosi_v4f32_v4i16:2919; CHECK: .functype fptosi_v4f32_v4i16 (v128) -> (v128)2920; CHECK-NEXT: # %bb.0:2921; CHECK-NEXT: local.get 02922; CHECK-NEXT: i32x4.trunc_sat_f32x4_s2923; CHECK-NEXT: v128.const 65535, 65535, 65535, 655352924; CHECK-NEXT: v128.and2925; CHECK-NEXT: local.get 02926; CHECK-NEXT: i16x8.narrow_i32x4_u2927; CHECK-NEXT: # fallthrough-return2928 %conv = fptosi <4 x float> %x to <4 x i16>2929 ret <4 x i16> %conv2930}2931 2932define <4 x i16> @fptoui_v4f32_v4i16(<4 x float> %x) {2933; CHECK-LABEL: fptoui_v4f32_v4i16:2934; CHECK: .functype fptoui_v4f32_v4i16 (v128) -> (v128)2935; CHECK-NEXT: # %bb.0:2936; CHECK-NEXT: local.get 02937; CHECK-NEXT: i32x4.trunc_sat_f32x4_u2938; CHECK-NEXT: v128.const 65535, 65535, 65535, 655352939; CHECK-NEXT: v128.and2940; CHECK-NEXT: local.get 02941; CHECK-NEXT: i16x8.narrow_i32x4_u2942; CHECK-NEXT: # fallthrough-return2943 %conv = fptoui <4 x float> %x to <4 x i16>2944 ret <4 x i16> %conv2945}2946 2947define <8 x i8> @fptosi_v8f32_v8i8(<8 x float> %x) {2948; CHECK-LABEL: fptosi_v8f32_v8i8:2949; CHECK: .functype fptosi_v8f32_v8i8 (v128, v128) -> (v128)2950; CHECK-NEXT: # %bb.0:2951; CHECK-NEXT: local.get 02952; CHECK-NEXT: i32x4.trunc_sat_f32x4_s2953; CHECK-NEXT: v128.const 255, 255, 255, 2552954; CHECK-NEXT: local.tee 02955; CHECK-NEXT: v128.and2956; CHECK-NEXT: local.get 12957; CHECK-NEXT: i32x4.trunc_sat_f32x4_s2958; CHECK-NEXT: local.get 02959; CHECK-NEXT: v128.and2960; CHECK-NEXT: i16x8.narrow_i32x4_u2961; CHECK-NEXT: local.get 12962; CHECK-NEXT: local.get 12963; CHECK-NEXT: i16x8.narrow_i32x4_u2964; CHECK-NEXT: i8x16.narrow_i16x8_u2965; CHECK-NEXT: # fallthrough-return2966 %conv = fptosi <8 x float> %x to <8 x i8>2967 ret <8 x i8> %conv2968}2969 2970define <8 x i8> @fptoui_v8f32_v8i8(<8 x float> %x) {2971; CHECK-LABEL: fptoui_v8f32_v8i8:2972; CHECK: .functype fptoui_v8f32_v8i8 (v128, v128) -> (v128)2973; CHECK-NEXT: # %bb.0:2974; CHECK-NEXT: local.get 02975; CHECK-NEXT: i32x4.trunc_sat_f32x4_u2976; CHECK-NEXT: v128.const 255, 255, 255, 2552977; CHECK-NEXT: local.tee 02978; CHECK-NEXT: v128.and2979; CHECK-NEXT: local.get 12980; CHECK-NEXT: i32x4.trunc_sat_f32x4_u2981; CHECK-NEXT: local.get 02982; CHECK-NEXT: v128.and2983; CHECK-NEXT: i16x8.narrow_i32x4_u2984; CHECK-NEXT: local.get 12985; CHECK-NEXT: local.get 12986; CHECK-NEXT: i16x8.narrow_i32x4_u2987; CHECK-NEXT: i8x16.narrow_i16x8_u2988; CHECK-NEXT: # fallthrough-return2989 %conv = fptoui <8 x float> %x to <8 x i8>2990 ret <8 x i8> %conv2991}2992 2993define <8 x i16> @fptosi_v8f32_v8i16(<8 x float> %x) {2994; CHECK-LABEL: fptosi_v8f32_v8i16:2995; CHECK: .functype fptosi_v8f32_v8i16 (v128, v128) -> (v128)2996; CHECK-NEXT: # %bb.0:2997; CHECK-NEXT: local.get 02998; CHECK-NEXT: i32x4.trunc_sat_f32x4_s2999; CHECK-NEXT: v128.const 65535, 65535, 65535, 655353000; CHECK-NEXT: local.tee 03001; CHECK-NEXT: v128.and3002; CHECK-NEXT: local.get 13003; CHECK-NEXT: i32x4.trunc_sat_f32x4_s3004; CHECK-NEXT: local.get 03005; CHECK-NEXT: v128.and3006; CHECK-NEXT: i16x8.narrow_i32x4_u3007; CHECK-NEXT: # fallthrough-return3008 %conv = fptosi <8 x float> %x to <8 x i16>3009 ret <8 x i16> %conv3010}3011 3012define <8 x i16> @fptoui_v8f32_v8i16(<8 x float> %x) {3013; CHECK-LABEL: fptoui_v8f32_v8i16:3014; CHECK: .functype fptoui_v8f32_v8i16 (v128, v128) -> (v128)3015; CHECK-NEXT: # %bb.0:3016; CHECK-NEXT: local.get 03017; CHECK-NEXT: i32x4.trunc_sat_f32x4_u3018; CHECK-NEXT: v128.const 65535, 65535, 65535, 655353019; CHECK-NEXT: local.tee 03020; CHECK-NEXT: v128.and3021; CHECK-NEXT: local.get 13022; CHECK-NEXT: i32x4.trunc_sat_f32x4_u3023; CHECK-NEXT: local.get 03024; CHECK-NEXT: v128.and3025; CHECK-NEXT: i16x8.narrow_i32x4_u3026; CHECK-NEXT: # fallthrough-return3027 %conv = fptoui <8 x float> %x to <8 x i16>3028 ret <8 x i16> %conv3029}3030 3031define <16 x i8> @fptosi_v16f32_v16i8(<16 x float> %x) {3032; CHECK-LABEL: fptosi_v16f32_v16i8:3033; CHECK: .functype fptosi_v16f32_v16i8 (v128, v128, v128, v128) -> (v128)3034; CHECK-NEXT: # %bb.0:3035; CHECK-NEXT: local.get 03036; CHECK-NEXT: i32x4.trunc_sat_f32x4_s3037; CHECK-NEXT: v128.const 255, 255, 255, 2553038; CHECK-NEXT: local.tee 03039; CHECK-NEXT: v128.and3040; CHECK-NEXT: local.get 13041; CHECK-NEXT: i32x4.trunc_sat_f32x4_s3042; CHECK-NEXT: local.get 03043; CHECK-NEXT: v128.and3044; CHECK-NEXT: i16x8.narrow_i32x4_u3045; CHECK-NEXT: local.get 23046; CHECK-NEXT: i32x4.trunc_sat_f32x4_s3047; CHECK-NEXT: local.get 03048; CHECK-NEXT: v128.and3049; CHECK-NEXT: local.get 33050; CHECK-NEXT: i32x4.trunc_sat_f32x4_s3051; CHECK-NEXT: local.get 03052; CHECK-NEXT: v128.and3053; CHECK-NEXT: i16x8.narrow_i32x4_u3054; CHECK-NEXT: i8x16.narrow_i16x8_u3055; CHECK-NEXT: # fallthrough-return3056 %conv = fptosi <16 x float> %x to <16 x i8>3057 ret <16 x i8> %conv3058}3059 3060define <16 x i8> @fptoui_v16f32_v16i8(<16 x float> %x) {3061; CHECK-LABEL: fptoui_v16f32_v16i8:3062; CHECK: .functype fptoui_v16f32_v16i8 (v128, v128, v128, v128) -> (v128)3063; CHECK-NEXT: # %bb.0:3064; CHECK-NEXT: local.get 03065; CHECK-NEXT: i32x4.trunc_sat_f32x4_u3066; CHECK-NEXT: v128.const 255, 255, 255, 2553067; CHECK-NEXT: local.tee 03068; CHECK-NEXT: v128.and3069; CHECK-NEXT: local.get 13070; CHECK-NEXT: i32x4.trunc_sat_f32x4_u3071; CHECK-NEXT: local.get 03072; CHECK-NEXT: v128.and3073; CHECK-NEXT: i16x8.narrow_i32x4_u3074; CHECK-NEXT: local.get 23075; CHECK-NEXT: i32x4.trunc_sat_f32x4_u3076; CHECK-NEXT: local.get 03077; CHECK-NEXT: v128.and3078; CHECK-NEXT: local.get 33079; CHECK-NEXT: i32x4.trunc_sat_f32x4_u3080; CHECK-NEXT: local.get 03081; CHECK-NEXT: v128.and3082; CHECK-NEXT: i16x8.narrow_i32x4_u3083; CHECK-NEXT: i8x16.narrow_i16x8_u3084; CHECK-NEXT: # fallthrough-return3085 %conv = fptoui <16 x float> %x to <16 x i8>3086 ret <16 x i8> %conv3087}3088 3089define <16 x i16> @fptosi_v16f32_v16i16(<16 x float> %x) {3090; CHECK-LABEL: fptosi_v16f32_v16i16:3091; CHECK: .functype fptosi_v16f32_v16i16 (i32, v128, v128, v128, v128) -> ()3092; CHECK-NEXT: # %bb.0:3093; CHECK-NEXT: local.get 03094; CHECK-NEXT: local.get 33095; CHECK-NEXT: i32x4.trunc_sat_f32x4_s3096; CHECK-NEXT: v128.const 65535, 65535, 65535, 655353097; CHECK-NEXT: local.tee 33098; CHECK-NEXT: v128.and3099; CHECK-NEXT: local.get 43100; CHECK-NEXT: i32x4.trunc_sat_f32x4_s3101; CHECK-NEXT: local.get 33102; CHECK-NEXT: v128.and3103; CHECK-NEXT: i16x8.narrow_i32x4_u3104; CHECK-NEXT: v128.store 163105; CHECK-NEXT: local.get 03106; CHECK-NEXT: local.get 13107; CHECK-NEXT: i32x4.trunc_sat_f32x4_s3108; CHECK-NEXT: local.get 33109; CHECK-NEXT: v128.and3110; CHECK-NEXT: local.get 23111; CHECK-NEXT: i32x4.trunc_sat_f32x4_s3112; CHECK-NEXT: local.get 33113; CHECK-NEXT: v128.and3114; CHECK-NEXT: i16x8.narrow_i32x4_u3115; CHECK-NEXT: v128.store 03116; CHECK-NEXT: # fallthrough-return3117 %conv = fptosi <16 x float> %x to <16 x i16>3118 ret <16 x i16> %conv3119}3120 3121define <16 x i16> @fptoui_v16f32_v16i16(<16 x float> %x) {3122; CHECK-LABEL: fptoui_v16f32_v16i16:3123; CHECK: .functype fptoui_v16f32_v16i16 (i32, v128, v128, v128, v128) -> ()3124; CHECK-NEXT: # %bb.0:3125; CHECK-NEXT: local.get 03126; CHECK-NEXT: local.get 33127; CHECK-NEXT: i32x4.trunc_sat_f32x4_u3128; CHECK-NEXT: v128.const 65535, 65535, 65535, 655353129; CHECK-NEXT: local.tee 33130; CHECK-NEXT: v128.and3131; CHECK-NEXT: local.get 43132; CHECK-NEXT: i32x4.trunc_sat_f32x4_u3133; CHECK-NEXT: local.get 33134; CHECK-NEXT: v128.and3135; CHECK-NEXT: i16x8.narrow_i32x4_u3136; CHECK-NEXT: v128.store 163137; CHECK-NEXT: local.get 03138; CHECK-NEXT: local.get 13139; CHECK-NEXT: i32x4.trunc_sat_f32x4_u3140; CHECK-NEXT: local.get 33141; CHECK-NEXT: v128.and3142; CHECK-NEXT: local.get 23143; CHECK-NEXT: i32x4.trunc_sat_f32x4_u3144; CHECK-NEXT: local.get 33145; CHECK-NEXT: v128.and3146; CHECK-NEXT: i16x8.narrow_i32x4_u3147; CHECK-NEXT: v128.store 03148; CHECK-NEXT: # fallthrough-return3149 %conv = fptoui <16 x float> %x to <16 x i16>3150 ret <16 x i16> %conv3151}3152 3153declare <2 x i32> @llvm.smin.v2i32(<2 x i32>, <2 x i32>)3154declare <2 x i32> @llvm.smax.v2i32(<2 x i32>, <2 x i32>)3155declare <2 x i32> @llvm.umin.v2i32(<2 x i32>, <2 x i32>)3156declare <4 x i32> @llvm.smin.v4i32(<4 x i32>, <4 x i32>)3157declare <4 x i32> @llvm.smax.v4i32(<4 x i32>, <4 x i32>)3158declare <4 x i32> @llvm.umin.v4i32(<4 x i32>, <4 x i32>)3159declare <8 x i32> @llvm.smin.v8i32(<8 x i32>, <8 x i32>)3160declare <8 x i32> @llvm.smax.v8i32(<8 x i32>, <8 x i32>)3161declare <8 x i32> @llvm.umin.v8i32(<8 x i32>, <8 x i32>)3162declare <2 x i64> @llvm.smin.v2i64(<2 x i64>, <2 x i64>)3163declare <2 x i64> @llvm.smax.v2i64(<2 x i64>, <2 x i64>)3164declare <2 x i64> @llvm.umin.v2i64(<2 x i64>, <2 x i64>)3165declare <4 x i64> @llvm.smin.v4i64(<4 x i64>, <4 x i64>)3166declare <4 x i64> @llvm.smax.v4i64(<4 x i64>, <4 x i64>)3167declare <4 x i64> @llvm.umin.v4i64(<4 x i64>, <4 x i64>)3168declare <2 x i128> @llvm.smin.v2i128(<2 x i128>, <2 x i128>)3169declare <2 x i128> @llvm.smax.v2i128(<2 x i128>, <2 x i128>)3170declare <2 x i128> @llvm.umin.v2i128(<2 x i128>, <2 x i128>)3171