1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=wasm32-unknown-unknown -mattr=+simd128,+nontrapping-fptoint | FileCheck %s 3 4; i32 saturate 5 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 v128 10; CHECK-NEXT: # %bb.0: # %entry 11; CHECK-NEXT: local.get 0 12; CHECK-NEXT: f64x2.extract_lane 0 13; CHECK-NEXT: i64.trunc_sat_f64_s 14; CHECK-NEXT: i64x2.splat 15; CHECK-NEXT: local.get 0 16; CHECK-NEXT: f64x2.extract_lane 1 17; CHECK-NEXT: i64.trunc_sat_f64_s 18; CHECK-NEXT: i64x2.replace_lane 1 19; CHECK-NEXT: local.tee 0 20; CHECK-NEXT: v128.const 2147483647, 2147483647 21; CHECK-NEXT: local.tee 1 22; CHECK-NEXT: local.get 0 23; CHECK-NEXT: local.get 1 24; CHECK-NEXT: i64x2.lt_s 25; CHECK-NEXT: v128.bitselect 26; CHECK-NEXT: local.tee 0 27; CHECK-NEXT: v128.const -2147483648, -2147483648 28; CHECK-NEXT: local.tee 1 29; CHECK-NEXT: local.get 0 30; CHECK-NEXT: local.get 1 31; CHECK-NEXT: i64x2.gt_s 32; CHECK-NEXT: v128.bitselect 33; CHECK-NEXT: local.get 0 34; CHECK-NEXT: i8x16.shuffle 0, 1, 2, 3, 8, 9, 10, 11, 0, 0, 0, 0, 0, 0, 0, 0 35; CHECK-NEXT: # fallthrough-return 36entry: 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> %conv6 44} 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, i64 50; CHECK-NEXT: # %bb.0: # %entry 51; CHECK-NEXT: local.get 0 52; CHECK-NEXT: f64x2.extract_lane 0 53; CHECK-NEXT: i64.trunc_sat_f64_u 54; CHECK-NEXT: local.tee 1 55; CHECK-NEXT: i64x2.splat 56; CHECK-NEXT: local.get 0 57; CHECK-NEXT: f64x2.extract_lane 1 58; CHECK-NEXT: i64.trunc_sat_f64_u 59; CHECK-NEXT: local.tee 2 60; CHECK-NEXT: i64x2.replace_lane 1 61; CHECK-NEXT: v128.const 4294967295, 4294967295 62; CHECK-NEXT: i64.const -1 63; CHECK-NEXT: i64.const 0 64; CHECK-NEXT: local.get 1 65; CHECK-NEXT: i64.const 4294967295 66; CHECK-NEXT: i64.lt_u 67; CHECK-NEXT: i64.select 68; CHECK-NEXT: i64x2.splat 69; CHECK-NEXT: i64.const -1 70; CHECK-NEXT: i64.const 0 71; CHECK-NEXT: local.get 2 72; CHECK-NEXT: i64.const 4294967295 73; CHECK-NEXT: i64.lt_u 74; CHECK-NEXT: i64.select 75; CHECK-NEXT: i64x2.replace_lane 1 76; CHECK-NEXT: v128.bitselect 77; CHECK-NEXT: local.get 0 78; CHECK-NEXT: i8x16.shuffle 0, 1, 2, 3, 8, 9, 10, 11, 0, 0, 0, 0, 0, 0, 0, 0 79; CHECK-NEXT: # fallthrough-return 80entry: 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> %conv6 86} 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 v128 92; CHECK-NEXT: # %bb.0: # %entry 93; CHECK-NEXT: local.get 0 94; CHECK-NEXT: f64x2.extract_lane 0 95; CHECK-NEXT: i64.trunc_sat_f64_s 96; CHECK-NEXT: i64x2.splat 97; CHECK-NEXT: local.get 0 98; CHECK-NEXT: f64x2.extract_lane 1 99; CHECK-NEXT: i64.trunc_sat_f64_s 100; CHECK-NEXT: i64x2.replace_lane 1 101; CHECK-NEXT: local.tee 0 102; CHECK-NEXT: v128.const 4294967295, 4294967295 103; CHECK-NEXT: local.tee 1 104; CHECK-NEXT: local.get 0 105; CHECK-NEXT: local.get 1 106; CHECK-NEXT: i64x2.lt_s 107; CHECK-NEXT: v128.bitselect 108; CHECK-NEXT: local.tee 0 109; CHECK-NEXT: v128.const 0, 0 110; CHECK-NEXT: local.tee 1 111; CHECK-NEXT: local.get 0 112; CHECK-NEXT: local.get 1 113; CHECK-NEXT: i64x2.gt_s 114; CHECK-NEXT: v128.bitselect 115; CHECK-NEXT: local.get 0 116; CHECK-NEXT: i8x16.shuffle 0, 1, 2, 3, 8, 9, 10, 11, 0, 0, 0, 0, 0, 0, 0, 0 117; CHECK-NEXT: # fallthrough-return 118entry: 119 %conv = fptosi <2 x double> %x to <2 x i64> 120 %0 = icmp slt <2 x i64> %conv, <i64 4294967295, i64 4294967295> 121 %spec.store.select = select <2 x i1> %0, <2 x i64> %conv, <2 x i64> <i64 4294967295, i64 4294967295> 122 %1 = icmp sgt <2 x i64> %spec.store.select, zeroinitializer 123 %spec.store.select7 = select <2 x i1> %1, <2 x i64> %spec.store.select, <2 x i64> zeroinitializer 124 %conv6 = trunc <2 x i64> %spec.store.select7 to <2 x i32> 125 ret <2 x i32> %conv6 126} 127 128define <4 x i32> @stest_f32i32(<4 x float> %x) { 129; CHECK-LABEL: stest_f32i32: 130; CHECK: .functype stest_f32i32 (v128) -> (v128) 131; CHECK-NEXT: # %bb.0: # %entry 132; CHECK-NEXT: local.get 0 133; CHECK-NEXT: i32x4.trunc_sat_f32x4_s 134; CHECK-NEXT: # fallthrough-return 135entry: 136 %conv = fptosi <4 x float> %x to <4 x i64> 137 %0 = icmp slt <4 x i64> %conv, <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647> 138 %spec.store.select = select <4 x i1> %0, <4 x i64> %conv, <4 x i64> <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647> 139 %1 = icmp sgt <4 x i64> %spec.store.select, <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648> 140 %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> 141 %conv6 = trunc <4 x i64> %spec.store.select7 to <4 x i32> 142 ret <4 x i32> %conv6 143} 144 145define <4 x i32> @utest_f32i32(<4 x float> %x) { 146; CHECK-LABEL: utest_f32i32: 147; CHECK: .functype utest_f32i32 (v128) -> (v128) 148; CHECK-NEXT: .local i64, i64, v128 149; CHECK-NEXT: # %bb.0: # %entry 150; CHECK-NEXT: local.get 0 151; CHECK-NEXT: f32x4.extract_lane 0 152; CHECK-NEXT: i64.trunc_sat_f32_u 153; CHECK-NEXT: local.tee 1 154; CHECK-NEXT: i64x2.splat 155; CHECK-NEXT: local.get 0 156; CHECK-NEXT: f32x4.extract_lane 1 157; CHECK-NEXT: i64.trunc_sat_f32_u 158; CHECK-NEXT: local.tee 2 159; CHECK-NEXT: i64x2.replace_lane 1 160; CHECK-NEXT: v128.const 4294967295, 4294967295 161; CHECK-NEXT: local.tee 3 162; CHECK-NEXT: i64.const -1 163; CHECK-NEXT: i64.const 0 164; CHECK-NEXT: local.get 1 165; CHECK-NEXT: i64.const 4294967295 166; CHECK-NEXT: i64.lt_u 167; CHECK-NEXT: i64.select 168; CHECK-NEXT: i64x2.splat 169; CHECK-NEXT: i64.const -1 170; CHECK-NEXT: i64.const 0 171; CHECK-NEXT: local.get 2 172; CHECK-NEXT: i64.const 4294967295 173; CHECK-NEXT: i64.lt_u 174; CHECK-NEXT: i64.select 175; CHECK-NEXT: i64x2.replace_lane 1 176; CHECK-NEXT: v128.bitselect 177; CHECK-NEXT: local.get 0 178; CHECK-NEXT: f32x4.extract_lane 2 179; CHECK-NEXT: i64.trunc_sat_f32_u 180; CHECK-NEXT: local.tee 1 181; CHECK-NEXT: i64x2.splat 182; CHECK-NEXT: local.get 0 183; CHECK-NEXT: f32x4.extract_lane 3 184; CHECK-NEXT: i64.trunc_sat_f32_u 185; CHECK-NEXT: local.tee 2 186; CHECK-NEXT: i64x2.replace_lane 1 187; CHECK-NEXT: local.get 3 188; CHECK-NEXT: i64.const -1 189; CHECK-NEXT: i64.const 0 190; CHECK-NEXT: local.get 1 191; CHECK-NEXT: i64.const 4294967295 192; CHECK-NEXT: i64.lt_u 193; CHECK-NEXT: i64.select 194; CHECK-NEXT: i64x2.splat 195; CHECK-NEXT: i64.const -1 196; CHECK-NEXT: i64.const 0 197; CHECK-NEXT: local.get 2 198; CHECK-NEXT: i64.const 4294967295 199; CHECK-NEXT: i64.lt_u 200; CHECK-NEXT: i64.select 201; CHECK-NEXT: i64x2.replace_lane 1 202; CHECK-NEXT: v128.bitselect 203; CHECK-NEXT: i8x16.shuffle 0, 1, 2, 3, 8, 9, 10, 11, 16, 17, 18, 19, 24, 25, 26, 27 204; CHECK-NEXT: # fallthrough-return 205entry: 206 %conv = fptoui <4 x float> %x to <4 x i64> 207 %0 = icmp ult <4 x i64> %conv, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295> 208 %spec.store.select = select <4 x i1> %0, <4 x i64> %conv, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295> 209 %conv6 = trunc <4 x i64> %spec.store.select to <4 x i32> 210 ret <4 x i32> %conv6 211} 212 213define <4 x i32> @ustest_f32i32(<4 x float> %x) { 214; CHECK-LABEL: ustest_f32i32: 215; CHECK: .functype ustest_f32i32 (v128) -> (v128) 216; CHECK-NEXT: # %bb.0: # %entry 217; CHECK-NEXT: local.get 0 218; CHECK-NEXT: i32x4.trunc_sat_f32x4_u 219; CHECK-NEXT: # fallthrough-return 220entry: 221 %conv = fptosi <4 x float> %x to <4 x i64> 222 %0 = icmp slt <4 x i64> %conv, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295> 223 %spec.store.select = select <4 x i1> %0, <4 x i64> %conv, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295> 224 %1 = icmp sgt <4 x i64> %spec.store.select, zeroinitializer 225 %spec.store.select7 = select <4 x i1> %1, <4 x i64> %spec.store.select, <4 x i64> zeroinitializer 226 %conv6 = trunc <4 x i64> %spec.store.select7 to <4 x i32> 227 ret <4 x i32> %conv6 228} 229 230define <4 x i32> @stest_f16i32(<4 x half> %x) { 231; CHECK-LABEL: stest_f16i32: 232; CHECK: .functype stest_f16i32 (f32, f32, f32, f32) -> (v128) 233; CHECK-NEXT: # %bb.0: # %entry 234; CHECK-NEXT: local.get 1 235; CHECK-NEXT: call __truncsfhf2 236; CHECK-NEXT: call __extendhfsf2 237; CHECK-NEXT: local.set 1 238; CHECK-NEXT: local.get 0 239; CHECK-NEXT: call __truncsfhf2 240; CHECK-NEXT: call __extendhfsf2 241; CHECK-NEXT: i32.trunc_sat_f32_s 242; CHECK-NEXT: i32x4.splat 243; CHECK-NEXT: local.get 1 244; CHECK-NEXT: i32.trunc_sat_f32_s 245; CHECK-NEXT: i32x4.replace_lane 1 246; CHECK-NEXT: local.get 2 247; CHECK-NEXT: call __truncsfhf2 248; CHECK-NEXT: call __extendhfsf2 249; CHECK-NEXT: i32.trunc_sat_f32_s 250; CHECK-NEXT: i32x4.replace_lane 2 251; CHECK-NEXT: local.get 3 252; CHECK-NEXT: call __truncsfhf2 253; CHECK-NEXT: call __extendhfsf2 254; CHECK-NEXT: i32.trunc_sat_f32_s 255; CHECK-NEXT: i32x4.replace_lane 3 256; CHECK-NEXT: # fallthrough-return 257entry: 258 %conv = fptosi <4 x half> %x to <4 x i64> 259 %0 = icmp slt <4 x i64> %conv, <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647> 260 %spec.store.select = select <4 x i1> %0, <4 x i64> %conv, <4 x i64> <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647> 261 %1 = icmp sgt <4 x i64> %spec.store.select, <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648> 262 %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> 263 %conv6 = trunc <4 x i64> %spec.store.select7 to <4 x i32> 264 ret <4 x i32> %conv6 265} 266 267define <4 x i32> @utesth_f16i32(<4 x half> %x) { 268; CHECK-LABEL: utesth_f16i32: 269; CHECK: .functype utesth_f16i32 (f32, f32, f32, f32) -> (v128) 270; CHECK-NEXT: .local i64, i64, v128 271; CHECK-NEXT: # %bb.0: # %entry 272; CHECK-NEXT: local.get 3 273; CHECK-NEXT: call __truncsfhf2 274; CHECK-NEXT: call __extendhfsf2 275; CHECK-NEXT: local.set 3 276; CHECK-NEXT: local.get 2 277; CHECK-NEXT: call __truncsfhf2 278; CHECK-NEXT: call __extendhfsf2 279; CHECK-NEXT: local.set 2 280; CHECK-NEXT: local.get 1 281; CHECK-NEXT: call __truncsfhf2 282; CHECK-NEXT: call __extendhfsf2 283; CHECK-NEXT: local.set 1 284; CHECK-NEXT: local.get 0 285; CHECK-NEXT: call __truncsfhf2 286; CHECK-NEXT: call __extendhfsf2 287; CHECK-NEXT: i64.trunc_sat_f32_u 288; CHECK-NEXT: local.tee 4 289; CHECK-NEXT: i64x2.splat 290; CHECK-NEXT: local.get 1 291; CHECK-NEXT: i64.trunc_sat_f32_u 292; CHECK-NEXT: local.tee 5 293; CHECK-NEXT: i64x2.replace_lane 1 294; CHECK-NEXT: v128.const 4294967295, 4294967295 295; CHECK-NEXT: local.tee 6 296; CHECK-NEXT: i64.const -1 297; CHECK-NEXT: i64.const 0 298; CHECK-NEXT: local.get 4 299; CHECK-NEXT: i64.const 4294967295 300; CHECK-NEXT: i64.lt_u 301; CHECK-NEXT: i64.select 302; CHECK-NEXT: i64x2.splat 303; CHECK-NEXT: i64.const -1 304; CHECK-NEXT: i64.const 0 305; CHECK-NEXT: local.get 5 306; CHECK-NEXT: i64.const 4294967295 307; CHECK-NEXT: i64.lt_u 308; CHECK-NEXT: i64.select 309; CHECK-NEXT: i64x2.replace_lane 1 310; CHECK-NEXT: v128.bitselect 311; CHECK-NEXT: local.get 2 312; CHECK-NEXT: i64.trunc_sat_f32_u 313; CHECK-NEXT: local.tee 4 314; CHECK-NEXT: i64x2.splat 315; CHECK-NEXT: local.get 3 316; CHECK-NEXT: i64.trunc_sat_f32_u 317; CHECK-NEXT: local.tee 5 318; CHECK-NEXT: i64x2.replace_lane 1 319; CHECK-NEXT: local.get 6 320; CHECK-NEXT: i64.const -1 321; CHECK-NEXT: i64.const 0 322; CHECK-NEXT: local.get 4 323; CHECK-NEXT: i64.const 4294967295 324; CHECK-NEXT: i64.lt_u 325; CHECK-NEXT: i64.select 326; CHECK-NEXT: i64x2.splat 327; CHECK-NEXT: i64.const -1 328; CHECK-NEXT: i64.const 0 329; CHECK-NEXT: local.get 5 330; CHECK-NEXT: i64.const 4294967295 331; CHECK-NEXT: i64.lt_u 332; CHECK-NEXT: i64.select 333; CHECK-NEXT: i64x2.replace_lane 1 334; CHECK-NEXT: v128.bitselect 335; CHECK-NEXT: i8x16.shuffle 0, 1, 2, 3, 8, 9, 10, 11, 16, 17, 18, 19, 24, 25, 26, 27 336; CHECK-NEXT: # fallthrough-return 337entry: 338 %conv = fptoui <4 x half> %x to <4 x i64> 339 %0 = icmp ult <4 x i64> %conv, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295> 340 %spec.store.select = select <4 x i1> %0, <4 x i64> %conv, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295> 341 %conv6 = trunc <4 x i64> %spec.store.select to <4 x i32> 342 ret <4 x i32> %conv6 343} 344 345define <4 x i32> @ustest_f16i32(<4 x half> %x) { 346; CHECK-LABEL: ustest_f16i32: 347; CHECK: .functype ustest_f16i32 (f32, f32, f32, f32) -> (v128) 348; CHECK-NEXT: # %bb.0: # %entry 349; CHECK-NEXT: local.get 1 350; CHECK-NEXT: call __truncsfhf2 351; CHECK-NEXT: call __extendhfsf2 352; CHECK-NEXT: local.set 1 353; CHECK-NEXT: local.get 0 354; CHECK-NEXT: call __truncsfhf2 355; CHECK-NEXT: call __extendhfsf2 356; CHECK-NEXT: i32.trunc_sat_f32_u 357; CHECK-NEXT: i32x4.splat 358; CHECK-NEXT: local.get 1 359; CHECK-NEXT: i32.trunc_sat_f32_u 360; CHECK-NEXT: i32x4.replace_lane 1 361; CHECK-NEXT: local.get 2 362; CHECK-NEXT: call __truncsfhf2 363; CHECK-NEXT: call __extendhfsf2 364; CHECK-NEXT: i32.trunc_sat_f32_u 365; CHECK-NEXT: i32x4.replace_lane 2 366; CHECK-NEXT: local.get 3 367; CHECK-NEXT: call __truncsfhf2 368; CHECK-NEXT: call __extendhfsf2 369; CHECK-NEXT: i32.trunc_sat_f32_u 370; CHECK-NEXT: i32x4.replace_lane 3 371; CHECK-NEXT: # fallthrough-return 372entry: 373 %conv = fptosi <4 x half> %x to <4 x i64> 374 %0 = icmp slt <4 x i64> %conv, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295> 375 %spec.store.select = select <4 x i1> %0, <4 x i64> %conv, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295> 376 %1 = icmp sgt <4 x i64> %spec.store.select, zeroinitializer 377 %spec.store.select7 = select <4 x i1> %1, <4 x i64> %spec.store.select, <4 x i64> zeroinitializer 378 %conv6 = trunc <4 x i64> %spec.store.select7 to <4 x i32> 379 ret <4 x i32> %conv6 380} 381 382; i16 saturate 383 384define <2 x i16> @stest_f64i16(<2 x double> %x) { 385; CHECK-LABEL: stest_f64i16: 386; CHECK: .functype stest_f64i16 (v128) -> (v128) 387; CHECK-NEXT: # %bb.0: # %entry 388; CHECK-NEXT: local.get 0 389; CHECK-NEXT: f64x2.extract_lane 0 390; CHECK-NEXT: i32.trunc_sat_f64_s 391; CHECK-NEXT: i32x4.splat 392; CHECK-NEXT: local.get 0 393; CHECK-NEXT: f64x2.extract_lane 1 394; CHECK-NEXT: i32.trunc_sat_f64_s 395; CHECK-NEXT: i32x4.replace_lane 1 396; CHECK-NEXT: v128.const 32767, 32767, 0, 0 397; CHECK-NEXT: i32x4.min_s 398; CHECK-NEXT: v128.const -32768, -32768, 0, 0 399; CHECK-NEXT: i32x4.max_s 400; CHECK-NEXT: local.get 0 401; CHECK-NEXT: i8x16.shuffle 0, 1, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 402; CHECK-NEXT: # fallthrough-return 403entry: 404 %conv = fptosi <2 x double> %x to <2 x i32> 405 %0 = icmp slt <2 x i32> %conv, <i32 32767, i32 32767> 406 %spec.store.select = select <2 x i1> %0, <2 x i32> %conv, <2 x i32> <i32 32767, i32 32767> 407 %1 = icmp sgt <2 x i32> %spec.store.select, <i32 -32768, i32 -32768> 408 %spec.store.select7 = select <2 x i1> %1, <2 x i32> %spec.store.select, <2 x i32> <i32 -32768, i32 -32768> 409 %conv6 = trunc <2 x i32> %spec.store.select7 to <2 x i16> 410 ret <2 x i16> %conv6 411} 412 413define <2 x i16> @utest_f64i16(<2 x double> %x) { 414; CHECK-LABEL: utest_f64i16: 415; CHECK: .functype utest_f64i16 (v128) -> (v128) 416; CHECK-NEXT: # %bb.0: # %entry 417; CHECK-NEXT: local.get 0 418; CHECK-NEXT: f64x2.extract_lane 0 419; CHECK-NEXT: i32.trunc_sat_f64_u 420; CHECK-NEXT: i32x4.splat 421; CHECK-NEXT: local.get 0 422; CHECK-NEXT: f64x2.extract_lane 1 423; CHECK-NEXT: i32.trunc_sat_f64_u 424; CHECK-NEXT: i32x4.replace_lane 1 425; CHECK-NEXT: v128.const 65535, 65535, 0, 0 426; CHECK-NEXT: i32x4.min_u 427; CHECK-NEXT: local.get 0 428; CHECK-NEXT: i8x16.shuffle 0, 1, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 429; CHECK-NEXT: # fallthrough-return 430entry: 431 %conv = fptoui <2 x double> %x to <2 x i32> 432 %0 = icmp ult <2 x i32> %conv, <i32 65535, i32 65535> 433 %spec.store.select = select <2 x i1> %0, <2 x i32> %conv, <2 x i32> <i32 65535, i32 65535> 434 %conv6 = trunc <2 x i32> %spec.store.select to <2 x i16> 435 ret <2 x i16> %conv6 436} 437 438define <2 x i16> @ustest_f64i16(<2 x double> %x) { 439; CHECK-LABEL: ustest_f64i16: 440; CHECK: .functype ustest_f64i16 (v128) -> (v128) 441; CHECK-NEXT: # %bb.0: # %entry 442; CHECK-NEXT: local.get 0 443; CHECK-NEXT: f64x2.extract_lane 0 444; CHECK-NEXT: i32.trunc_sat_f64_s 445; CHECK-NEXT: i32x4.splat 446; CHECK-NEXT: local.get 0 447; CHECK-NEXT: f64x2.extract_lane 1 448; CHECK-NEXT: i32.trunc_sat_f64_s 449; CHECK-NEXT: i32x4.replace_lane 1 450; CHECK-NEXT: v128.const 65535, 65535, 0, 0 451; CHECK-NEXT: i32x4.min_s 452; CHECK-NEXT: v128.const 0, 0, 0, 0 453; CHECK-NEXT: i32x4.max_s 454; CHECK-NEXT: local.get 0 455; CHECK-NEXT: i8x16.shuffle 0, 1, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 456; CHECK-NEXT: # fallthrough-return 457entry: 458 %conv = fptosi <2 x double> %x to <2 x i32> 459 %0 = icmp slt <2 x i32> %conv, <i32 65535, i32 65535> 460 %spec.store.select = select <2 x i1> %0, <2 x i32> %conv, <2 x i32> <i32 65535, i32 65535> 461 %1 = icmp sgt <2 x i32> %spec.store.select, zeroinitializer 462 %spec.store.select7 = select <2 x i1> %1, <2 x i32> %spec.store.select, <2 x i32> zeroinitializer 463 %conv6 = trunc <2 x i32> %spec.store.select7 to <2 x i16> 464 ret <2 x i16> %conv6 465} 466 467define <4 x i16> @stest_f32i16(<4 x float> %x) { 468; CHECK-LABEL: stest_f32i16: 469; CHECK: .functype stest_f32i16 (v128) -> (v128) 470; CHECK-NEXT: # %bb.0: # %entry 471; CHECK-NEXT: local.get 0 472; CHECK-NEXT: i32x4.trunc_sat_f32x4_s 473; CHECK-NEXT: v128.const 32767, 32767, 32767, 32767 474; CHECK-NEXT: i32x4.min_s 475; CHECK-NEXT: v128.const -32768, -32768, -32768, -32768 476; CHECK-NEXT: i32x4.max_s 477; CHECK-NEXT: local.get 0 478; CHECK-NEXT: i8x16.shuffle 0, 1, 4, 5, 8, 9, 12, 13, 0, 0, 0, 0, 0, 0, 0, 0 479; CHECK-NEXT: # fallthrough-return 480entry: 481 %conv = fptosi <4 x float> %x to <4 x i32> 482 %0 = icmp slt <4 x i32> %conv, <i32 32767, i32 32767, i32 32767, i32 32767> 483 %spec.store.select = select <4 x i1> %0, <4 x i32> %conv, <4 x i32> <i32 32767, i32 32767, i32 32767, i32 32767> 484 %1 = icmp sgt <4 x i32> %spec.store.select, <i32 -32768, i32 -32768, i32 -32768, i32 -32768> 485 %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> 486 %conv6 = trunc <4 x i32> %spec.store.select7 to <4 x i16> 487 ret <4 x i16> %conv6 488} 489 490define <4 x i16> @utest_f32i16(<4 x float> %x) { 491; CHECK-LABEL: utest_f32i16: 492; CHECK: .functype utest_f32i16 (v128) -> (v128) 493; CHECK-NEXT: # %bb.0: # %entry 494; CHECK-NEXT: local.get 0 495; CHECK-NEXT: i32x4.trunc_sat_f32x4_u 496; CHECK-NEXT: v128.const 65535, 65535, 65535, 65535 497; CHECK-NEXT: i32x4.min_u 498; CHECK-NEXT: local.get 0 499; CHECK-NEXT: i8x16.shuffle 0, 1, 4, 5, 8, 9, 12, 13, 0, 0, 0, 0, 0, 0, 0, 0 500; CHECK-NEXT: # fallthrough-return 501entry: 502 %conv = fptoui <4 x float> %x to <4 x i32> 503 %0 = icmp ult <4 x i32> %conv, <i32 65535, i32 65535, i32 65535, i32 65535> 504 %spec.store.select = select <4 x i1> %0, <4 x i32> %conv, <4 x i32> <i32 65535, i32 65535, i32 65535, i32 65535> 505 %conv6 = trunc <4 x i32> %spec.store.select to <4 x i16> 506 ret <4 x i16> %conv6 507} 508 509define <4 x i16> @ustest_f32i16(<4 x float> %x) { 510; CHECK-LABEL: ustest_f32i16: 511; CHECK: .functype ustest_f32i16 (v128) -> (v128) 512; CHECK-NEXT: # %bb.0: # %entry 513; CHECK-NEXT: local.get 0 514; CHECK-NEXT: i32x4.trunc_sat_f32x4_s 515; CHECK-NEXT: v128.const 65535, 65535, 65535, 65535 516; CHECK-NEXT: i32x4.min_s 517; CHECK-NEXT: v128.const 0, 0, 0, 0 518; CHECK-NEXT: i32x4.max_s 519; CHECK-NEXT: local.get 0 520; CHECK-NEXT: i8x16.shuffle 0, 1, 4, 5, 8, 9, 12, 13, 0, 0, 0, 0, 0, 0, 0, 0 521; CHECK-NEXT: # fallthrough-return 522entry: 523 %conv = fptosi <4 x float> %x to <4 x i32> 524 %0 = icmp slt <4 x i32> %conv, <i32 65535, i32 65535, i32 65535, i32 65535> 525 %spec.store.select = select <4 x i1> %0, <4 x i32> %conv, <4 x i32> <i32 65535, i32 65535, i32 65535, i32 65535> 526 %1 = icmp sgt <4 x i32> %spec.store.select, zeroinitializer 527 %spec.store.select7 = select <4 x i1> %1, <4 x i32> %spec.store.select, <4 x i32> zeroinitializer 528 %conv6 = trunc <4 x i32> %spec.store.select7 to <4 x i16> 529 ret <4 x i16> %conv6 530} 531 532define <8 x i16> @stest_f16i16(<8 x half> %x) { 533; CHECK-LABEL: stest_f16i16: 534; CHECK: .functype stest_f16i16 (f32, f32, f32, f32, f32, f32, f32, f32) -> (v128) 535; CHECK-NEXT: .local v128, v128, v128 536; CHECK-NEXT: # %bb.0: # %entry 537; CHECK-NEXT: local.get 5 538; CHECK-NEXT: call __truncsfhf2 539; CHECK-NEXT: call __extendhfsf2 540; CHECK-NEXT: local.set 5 541; CHECK-NEXT: local.get 4 542; CHECK-NEXT: call __truncsfhf2 543; CHECK-NEXT: call __extendhfsf2 544; CHECK-NEXT: local.set 4 545; CHECK-NEXT: local.get 6 546; CHECK-NEXT: call __truncsfhf2 547; CHECK-NEXT: call __extendhfsf2 548; CHECK-NEXT: local.set 6 549; CHECK-NEXT: local.get 7 550; CHECK-NEXT: call __truncsfhf2 551; CHECK-NEXT: call __extendhfsf2 552; CHECK-NEXT: local.set 7 553; CHECK-NEXT: local.get 1 554; CHECK-NEXT: call __truncsfhf2 555; CHECK-NEXT: call __extendhfsf2 556; CHECK-NEXT: local.set 1 557; CHECK-NEXT: local.get 0 558; CHECK-NEXT: call __truncsfhf2 559; CHECK-NEXT: call __extendhfsf2 560; CHECK-NEXT: i32.trunc_sat_f32_s 561; CHECK-NEXT: i32x4.splat 562; CHECK-NEXT: local.get 1 563; CHECK-NEXT: i32.trunc_sat_f32_s 564; CHECK-NEXT: i32x4.replace_lane 1 565; CHECK-NEXT: local.get 2 566; CHECK-NEXT: call __truncsfhf2 567; CHECK-NEXT: call __extendhfsf2 568; CHECK-NEXT: i32.trunc_sat_f32_s 569; CHECK-NEXT: i32x4.replace_lane 2 570; CHECK-NEXT: local.get 3 571; CHECK-NEXT: call __truncsfhf2 572; CHECK-NEXT: call __extendhfsf2 573; CHECK-NEXT: i32.trunc_sat_f32_s 574; CHECK-NEXT: i32x4.replace_lane 3 575; CHECK-NEXT: v128.const 32767, 32767, 32767, 32767 576; CHECK-NEXT: local.tee 8 577; CHECK-NEXT: i32x4.min_s 578; CHECK-NEXT: v128.const -32768, -32768, -32768, -32768 579; CHECK-NEXT: local.tee 9 580; CHECK-NEXT: i32x4.max_s 581; CHECK-NEXT: v128.const 65535, 65535, 65535, 65535 582; CHECK-NEXT: local.tee 10 583; CHECK-NEXT: v128.and 584; CHECK-NEXT: local.get 4 585; CHECK-NEXT: i32.trunc_sat_f32_s 586; CHECK-NEXT: i32x4.splat 587; CHECK-NEXT: local.get 5 588; CHECK-NEXT: i32.trunc_sat_f32_s 589; CHECK-NEXT: i32x4.replace_lane 1 590; CHECK-NEXT: local.get 6 591; CHECK-NEXT: i32.trunc_sat_f32_s 592; CHECK-NEXT: i32x4.replace_lane 2 593; CHECK-NEXT: local.get 7 594; CHECK-NEXT: i32.trunc_sat_f32_s 595; CHECK-NEXT: i32x4.replace_lane 3 596; CHECK-NEXT: local.get 8 597; CHECK-NEXT: i32x4.min_s 598; CHECK-NEXT: local.get 9 599; CHECK-NEXT: i32x4.max_s 600; CHECK-NEXT: local.get 10 601; CHECK-NEXT: v128.and 602; CHECK-NEXT: i16x8.narrow_i32x4_u 603; CHECK-NEXT: # fallthrough-return 604entry: 605 %conv = fptosi <8 x half> %x to <8 x i32> 606 %0 = icmp slt <8 x i32> %conv, <i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767> 607 %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> 608 %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> 609 %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> 610 %conv6 = trunc <8 x i32> %spec.store.select7 to <8 x i16> 611 ret <8 x i16> %conv6 612} 613 614define <8 x i16> @utesth_f16i16(<8 x half> %x) { 615; CHECK-LABEL: utesth_f16i16: 616; CHECK: .functype utesth_f16i16 (f32, f32, f32, f32, f32, f32, f32, f32) -> (v128) 617; CHECK-NEXT: .local v128 618; CHECK-NEXT: # %bb.0: # %entry 619; CHECK-NEXT: local.get 5 620; CHECK-NEXT: call __truncsfhf2 621; CHECK-NEXT: call __extendhfsf2 622; CHECK-NEXT: local.set 5 623; CHECK-NEXT: local.get 4 624; CHECK-NEXT: call __truncsfhf2 625; CHECK-NEXT: call __extendhfsf2 626; CHECK-NEXT: local.set 4 627; CHECK-NEXT: local.get 6 628; CHECK-NEXT: call __truncsfhf2 629; CHECK-NEXT: call __extendhfsf2 630; CHECK-NEXT: local.set 6 631; CHECK-NEXT: local.get 7 632; CHECK-NEXT: call __truncsfhf2 633; CHECK-NEXT: call __extendhfsf2 634; CHECK-NEXT: local.set 7 635; CHECK-NEXT: local.get 1 636; CHECK-NEXT: call __truncsfhf2 637; CHECK-NEXT: call __extendhfsf2 638; CHECK-NEXT: local.set 1 639; CHECK-NEXT: local.get 0 640; CHECK-NEXT: call __truncsfhf2 641; CHECK-NEXT: call __extendhfsf2 642; CHECK-NEXT: i32.trunc_sat_f32_u 643; CHECK-NEXT: i32x4.splat 644; CHECK-NEXT: local.get 1 645; CHECK-NEXT: i32.trunc_sat_f32_u 646; CHECK-NEXT: i32x4.replace_lane 1 647; CHECK-NEXT: local.get 2 648; CHECK-NEXT: call __truncsfhf2 649; CHECK-NEXT: call __extendhfsf2 650; CHECK-NEXT: i32.trunc_sat_f32_u 651; CHECK-NEXT: i32x4.replace_lane 2 652; CHECK-NEXT: local.get 3 653; CHECK-NEXT: call __truncsfhf2 654; CHECK-NEXT: call __extendhfsf2 655; CHECK-NEXT: i32.trunc_sat_f32_u 656; CHECK-NEXT: i32x4.replace_lane 3 657; CHECK-NEXT: v128.const 65535, 65535, 65535, 65535 658; CHECK-NEXT: local.tee 8 659; CHECK-NEXT: i32x4.min_u 660; CHECK-NEXT: local.get 4 661; CHECK-NEXT: i32.trunc_sat_f32_u 662; CHECK-NEXT: i32x4.splat 663; CHECK-NEXT: local.get 5 664; CHECK-NEXT: i32.trunc_sat_f32_u 665; CHECK-NEXT: i32x4.replace_lane 1 666; CHECK-NEXT: local.get 6 667; CHECK-NEXT: i32.trunc_sat_f32_u 668; CHECK-NEXT: i32x4.replace_lane 2 669; CHECK-NEXT: local.get 7 670; CHECK-NEXT: i32.trunc_sat_f32_u 671; CHECK-NEXT: i32x4.replace_lane 3 672; CHECK-NEXT: local.get 8 673; CHECK-NEXT: i32x4.min_u 674; CHECK-NEXT: i16x8.narrow_i32x4_u 675; CHECK-NEXT: # fallthrough-return 676entry: 677 %conv = fptoui <8 x half> %x to <8 x i32> 678 %0 = icmp ult <8 x i32> %conv, <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535> 679 %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> 680 %conv6 = trunc <8 x i32> %spec.store.select to <8 x i16> 681 ret <8 x i16> %conv6 682} 683 684define <8 x i16> @ustest_f16i16(<8 x half> %x) { 685; CHECK-LABEL: ustest_f16i16: 686; CHECK: .functype ustest_f16i16 (f32, f32, f32, f32, f32, f32, f32, f32) -> (v128) 687; CHECK-NEXT: .local v128, v128 688; CHECK-NEXT: # %bb.0: # %entry 689; CHECK-NEXT: local.get 5 690; CHECK-NEXT: call __truncsfhf2 691; CHECK-NEXT: call __extendhfsf2 692; CHECK-NEXT: local.set 5 693; CHECK-NEXT: local.get 4 694; CHECK-NEXT: call __truncsfhf2 695; CHECK-NEXT: call __extendhfsf2 696; CHECK-NEXT: local.set 4 697; CHECK-NEXT: local.get 6 698; CHECK-NEXT: call __truncsfhf2 699; CHECK-NEXT: call __extendhfsf2 700; CHECK-NEXT: local.set 6 701; CHECK-NEXT: local.get 7 702; CHECK-NEXT: call __truncsfhf2 703; CHECK-NEXT: call __extendhfsf2 704; CHECK-NEXT: local.set 7 705; CHECK-NEXT: local.get 1 706; CHECK-NEXT: call __truncsfhf2 707; CHECK-NEXT: call __extendhfsf2 708; CHECK-NEXT: local.set 1 709; CHECK-NEXT: local.get 0 710; CHECK-NEXT: call __truncsfhf2 711; CHECK-NEXT: call __extendhfsf2 712; CHECK-NEXT: i32.trunc_sat_f32_s 713; CHECK-NEXT: i32x4.splat 714; CHECK-NEXT: local.get 1 715; CHECK-NEXT: i32.trunc_sat_f32_s 716; CHECK-NEXT: i32x4.replace_lane 1 717; CHECK-NEXT: local.get 2 718; CHECK-NEXT: call __truncsfhf2 719; CHECK-NEXT: call __extendhfsf2 720; CHECK-NEXT: i32.trunc_sat_f32_s 721; CHECK-NEXT: i32x4.replace_lane 2 722; CHECK-NEXT: local.get 3 723; CHECK-NEXT: call __truncsfhf2 724; CHECK-NEXT: call __extendhfsf2 725; CHECK-NEXT: i32.trunc_sat_f32_s 726; CHECK-NEXT: i32x4.replace_lane 3 727; CHECK-NEXT: v128.const 65535, 65535, 65535, 65535 728; CHECK-NEXT: local.tee 8 729; CHECK-NEXT: i32x4.min_s 730; CHECK-NEXT: v128.const 0, 0, 0, 0 731; CHECK-NEXT: local.tee 9 732; CHECK-NEXT: i32x4.max_s 733; CHECK-NEXT: local.get 4 734; CHECK-NEXT: i32.trunc_sat_f32_s 735; CHECK-NEXT: i32x4.splat 736; CHECK-NEXT: local.get 5 737; CHECK-NEXT: i32.trunc_sat_f32_s 738; CHECK-NEXT: i32x4.replace_lane 1 739; CHECK-NEXT: local.get 6 740; CHECK-NEXT: i32.trunc_sat_f32_s 741; CHECK-NEXT: i32x4.replace_lane 2 742; CHECK-NEXT: local.get 7 743; CHECK-NEXT: i32.trunc_sat_f32_s 744; CHECK-NEXT: i32x4.replace_lane 3 745; CHECK-NEXT: local.get 8 746; CHECK-NEXT: i32x4.min_s 747; CHECK-NEXT: local.get 9 748; CHECK-NEXT: i32x4.max_s 749; CHECK-NEXT: i16x8.narrow_i32x4_u 750; CHECK-NEXT: # fallthrough-return 751entry: 752 %conv = fptosi <8 x half> %x to <8 x i32> 753 %0 = icmp slt <8 x i32> %conv, <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535> 754 %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> 755 %1 = icmp sgt <8 x i32> %spec.store.select, zeroinitializer 756 %spec.store.select7 = select <8 x i1> %1, <8 x i32> %spec.store.select, <8 x i32> zeroinitializer 757 %conv6 = trunc <8 x i32> %spec.store.select7 to <8 x i16> 758 ret <8 x i16> %conv6 759} 760 761; i64 saturate 762 763define <2 x i64> @stest_f64i64(<2 x double> %x) { 764; CHECK-LABEL: stest_f64i64: 765; CHECK: .functype stest_f64i64 (v128) -> (v128) 766; CHECK-NEXT: .local i32, i64, i64, i64, i64 767; CHECK-NEXT: # %bb.0: # %entry 768; CHECK-NEXT: global.get __stack_pointer 769; CHECK-NEXT: i32.const 32 770; CHECK-NEXT: i32.sub 771; CHECK-NEXT: local.tee 1 772; CHECK-NEXT: global.set __stack_pointer 773; CHECK-NEXT: local.get 1 774; CHECK-NEXT: i32.const 16 775; CHECK-NEXT: i32.add 776; CHECK-NEXT: local.get 0 777; CHECK-NEXT: f64x2.extract_lane 1 778; CHECK-NEXT: call __fixdfti 779; CHECK-NEXT: local.get 1 780; CHECK-NEXT: local.get 0 781; CHECK-NEXT: f64x2.extract_lane 0 782; CHECK-NEXT: call __fixdfti 783; CHECK-NEXT: local.get 1 784; CHECK-NEXT: i32.const 16 785; CHECK-NEXT: i32.add 786; CHECK-NEXT: i32.const 8 787; CHECK-NEXT: i32.add 788; CHECK-NEXT: i64.load 0 789; CHECK-NEXT: local.set 2 790; CHECK-NEXT: local.get 1 791; CHECK-NEXT: i64.load 16 792; CHECK-NEXT: local.set 3 793; CHECK-NEXT: local.get 1 794; CHECK-NEXT: i32.const 8 795; CHECK-NEXT: i32.add 796; CHECK-NEXT: i64.load 0 797; CHECK-NEXT: local.set 4 798; CHECK-NEXT: local.get 1 799; CHECK-NEXT: i64.load 0 800; CHECK-NEXT: local.set 5 801; CHECK-NEXT: local.get 1 802; CHECK-NEXT: i32.const 32 803; CHECK-NEXT: i32.add 804; CHECK-NEXT: global.set __stack_pointer 805; CHECK-NEXT: local.get 5 806; CHECK-NEXT: i64.const 9223372036854775807 807; CHECK-NEXT: local.get 5 808; CHECK-NEXT: i64.const 9223372036854775807 809; CHECK-NEXT: i64.lt_u 810; CHECK-NEXT: local.get 4 811; CHECK-NEXT: i64.const 0 812; CHECK-NEXT: i64.lt_s 813; CHECK-NEXT: local.get 4 814; CHECK-NEXT: i64.eqz 815; CHECK-NEXT: i32.select 816; CHECK-NEXT: local.tee 1 817; CHECK-NEXT: i64.select 818; CHECK-NEXT: local.tee 5 819; CHECK-NEXT: i64.const -9223372036854775808 820; CHECK-NEXT: local.get 5 821; CHECK-NEXT: i64.const -9223372036854775808 822; CHECK-NEXT: i64.gt_u 823; CHECK-NEXT: local.get 4 824; CHECK-NEXT: i64.const 0 825; CHECK-NEXT: local.get 1 826; CHECK-NEXT: i64.select 827; CHECK-NEXT: local.tee 4 828; CHECK-NEXT: i64.const -1 829; CHECK-NEXT: i64.gt_s 830; CHECK-NEXT: local.get 4 831; CHECK-NEXT: i64.const -1 832; CHECK-NEXT: i64.eq 833; CHECK-NEXT: i32.select 834; CHECK-NEXT: i64.select 835; CHECK-NEXT: i64x2.splat 836; CHECK-NEXT: local.get 3 837; CHECK-NEXT: i64.const 9223372036854775807 838; CHECK-NEXT: local.get 3 839; CHECK-NEXT: i64.const 9223372036854775807 840; CHECK-NEXT: i64.lt_u 841; CHECK-NEXT: local.get 2 842; CHECK-NEXT: i64.const 0 843; CHECK-NEXT: i64.lt_s 844; CHECK-NEXT: local.get 2 845; CHECK-NEXT: i64.eqz 846; CHECK-NEXT: i32.select 847; CHECK-NEXT: local.tee 1 848; CHECK-NEXT: i64.select 849; CHECK-NEXT: local.tee 4 850; CHECK-NEXT: i64.const -9223372036854775808 851; CHECK-NEXT: local.get 4 852; CHECK-NEXT: i64.const -9223372036854775808 853; CHECK-NEXT: i64.gt_u 854; CHECK-NEXT: local.get 2 855; CHECK-NEXT: i64.const 0 856; CHECK-NEXT: local.get 1 857; CHECK-NEXT: i64.select 858; CHECK-NEXT: local.tee 2 859; CHECK-NEXT: i64.const -1 860; CHECK-NEXT: i64.gt_s 861; CHECK-NEXT: local.get 2 862; CHECK-NEXT: i64.const -1 863; CHECK-NEXT: i64.eq 864; CHECK-NEXT: i32.select 865; CHECK-NEXT: i64.select 866; CHECK-NEXT: i64x2.replace_lane 1 867; CHECK-NEXT: # fallthrough-return 868entry: 869 %conv = fptosi <2 x double> %x to <2 x i128> 870 %0 = icmp slt <2 x i128> %conv, <i128 9223372036854775807, i128 9223372036854775807> 871 %spec.store.select = select <2 x i1> %0, <2 x i128> %conv, <2 x i128> <i128 9223372036854775807, i128 9223372036854775807> 872 %1 = icmp sgt <2 x i128> %spec.store.select, <i128 -9223372036854775808, i128 -9223372036854775808> 873 %spec.store.select7 = select <2 x i1> %1, <2 x i128> %spec.store.select, <2 x i128> <i128 -9223372036854775808, i128 -9223372036854775808> 874 %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64> 875 ret <2 x i64> %conv6 876} 877 878define <2 x i64> @utest_f64i64(<2 x double> %x) { 879; CHECK-LABEL: utest_f64i64: 880; CHECK: .functype utest_f64i64 (v128) -> (v128) 881; CHECK-NEXT: .local i32, i64, i64, i64, i64 882; CHECK-NEXT: # %bb.0: # %entry 883; CHECK-NEXT: global.get __stack_pointer 884; CHECK-NEXT: i32.const 32 885; CHECK-NEXT: i32.sub 886; CHECK-NEXT: local.tee 1 887; CHECK-NEXT: global.set __stack_pointer 888; CHECK-NEXT: local.get 1 889; CHECK-NEXT: i32.const 16 890; CHECK-NEXT: i32.add 891; CHECK-NEXT: local.get 0 892; CHECK-NEXT: f64x2.extract_lane 1 893; CHECK-NEXT: call __fixunsdfti 894; CHECK-NEXT: local.get 1 895; CHECK-NEXT: local.get 0 896; CHECK-NEXT: f64x2.extract_lane 0 897; CHECK-NEXT: call __fixunsdfti 898; CHECK-NEXT: local.get 1 899; CHECK-NEXT: i32.const 16 900; CHECK-NEXT: i32.add 901; CHECK-NEXT: i32.const 8 902; CHECK-NEXT: i32.add 903; CHECK-NEXT: i64.load 0 904; CHECK-NEXT: local.set 2 905; CHECK-NEXT: local.get 1 906; CHECK-NEXT: i64.load 16 907; CHECK-NEXT: local.set 3 908; CHECK-NEXT: local.get 1 909; CHECK-NEXT: i32.const 8 910; CHECK-NEXT: i32.add 911; CHECK-NEXT: i64.load 0 912; CHECK-NEXT: local.set 4 913; CHECK-NEXT: local.get 1 914; CHECK-NEXT: i64.load 0 915; CHECK-NEXT: local.set 5 916; CHECK-NEXT: local.get 1 917; CHECK-NEXT: i32.const 32 918; CHECK-NEXT: i32.add 919; CHECK-NEXT: global.set __stack_pointer 920; CHECK-NEXT: local.get 5 921; CHECK-NEXT: i64.const 0 922; CHECK-NEXT: local.get 4 923; CHECK-NEXT: i64.eqz 924; CHECK-NEXT: i64.select 925; CHECK-NEXT: i64x2.splat 926; CHECK-NEXT: local.get 3 927; CHECK-NEXT: i64.const 0 928; CHECK-NEXT: local.get 2 929; CHECK-NEXT: i64.eqz 930; CHECK-NEXT: i64.select 931; CHECK-NEXT: i64x2.replace_lane 1 932; CHECK-NEXT: # fallthrough-return 933entry: 934 %conv = fptoui <2 x double> %x to <2 x i128> 935 %0 = icmp ult <2 x i128> %conv, <i128 18446744073709551616, i128 18446744073709551616> 936 %spec.store.select = select <2 x i1> %0, <2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616> 937 %conv6 = trunc <2 x i128> %spec.store.select to <2 x i64> 938 ret <2 x i64> %conv6 939} 940 941define <2 x i64> @ustest_f64i64(<2 x double> %x) { 942; CHECK-LABEL: ustest_f64i64: 943; CHECK: .functype ustest_f64i64 (v128) -> (v128) 944; CHECK-NEXT: .local i32, i64, i64, i64, i64 945; CHECK-NEXT: # %bb.0: # %entry 946; CHECK-NEXT: global.get __stack_pointer 947; CHECK-NEXT: i32.const 32 948; CHECK-NEXT: i32.sub 949; CHECK-NEXT: local.tee 1 950; CHECK-NEXT: global.set __stack_pointer 951; CHECK-NEXT: local.get 1 952; CHECK-NEXT: i32.const 16 953; CHECK-NEXT: i32.add 954; CHECK-NEXT: local.get 0 955; CHECK-NEXT: f64x2.extract_lane 1 956; CHECK-NEXT: call __fixdfti 957; CHECK-NEXT: local.get 1 958; CHECK-NEXT: local.get 0 959; CHECK-NEXT: f64x2.extract_lane 0 960; CHECK-NEXT: call __fixdfti 961; CHECK-NEXT: local.get 1 962; CHECK-NEXT: i32.const 16 963; CHECK-NEXT: i32.add 964; CHECK-NEXT: i32.const 8 965; CHECK-NEXT: i32.add 966; CHECK-NEXT: i64.load 0 967; CHECK-NEXT: local.set 2 968; CHECK-NEXT: local.get 1 969; CHECK-NEXT: i64.load 16 970; CHECK-NEXT: local.set 3 971; CHECK-NEXT: local.get 1 972; CHECK-NEXT: i32.const 8 973; CHECK-NEXT: i32.add 974; CHECK-NEXT: i64.load 0 975; CHECK-NEXT: local.set 4 976; CHECK-NEXT: local.get 1 977; CHECK-NEXT: i64.load 0 978; CHECK-NEXT: local.set 5 979; CHECK-NEXT: local.get 1 980; CHECK-NEXT: i32.const 32 981; CHECK-NEXT: i32.add 982; CHECK-NEXT: global.set __stack_pointer 983; CHECK-NEXT: local.get 5 984; CHECK-NEXT: i64.const 0 985; CHECK-NEXT: local.get 4 986; CHECK-NEXT: i64.const 1 987; CHECK-NEXT: i64.lt_s 988; CHECK-NEXT: local.tee 1 989; CHECK-NEXT: i64.select 990; CHECK-NEXT: local.tee 5 991; CHECK-NEXT: i64.const 0 992; CHECK-NEXT: local.get 5 993; CHECK-NEXT: i64.const 0 994; CHECK-NEXT: i64.ne 995; CHECK-NEXT: local.get 4 996; CHECK-NEXT: i64.const 1 997; CHECK-NEXT: local.get 1 998; CHECK-NEXT: i64.select 999; CHECK-NEXT: local.tee 4 1000; CHECK-NEXT: i64.const 0 1001; CHECK-NEXT: i64.gt_s 1002; CHECK-NEXT: local.get 4 1003; CHECK-NEXT: i64.eqz 1004; CHECK-NEXT: i32.select 1005; CHECK-NEXT: i64.select 1006; CHECK-NEXT: i64x2.splat 1007; CHECK-NEXT: local.get 3 1008; CHECK-NEXT: i64.const 0 1009; CHECK-NEXT: local.get 2 1010; CHECK-NEXT: i64.const 1 1011; CHECK-NEXT: i64.lt_s 1012; CHECK-NEXT: local.tee 1 1013; CHECK-NEXT: i64.select 1014; CHECK-NEXT: local.tee 4 1015; CHECK-NEXT: i64.const 0 1016; CHECK-NEXT: local.get 4 1017; CHECK-NEXT: i64.const 0 1018; CHECK-NEXT: i64.ne 1019; CHECK-NEXT: local.get 2 1020; CHECK-NEXT: i64.const 1 1021; CHECK-NEXT: local.get 1 1022; CHECK-NEXT: i64.select 1023; CHECK-NEXT: local.tee 2 1024; CHECK-NEXT: i64.const 0 1025; CHECK-NEXT: i64.gt_s 1026; CHECK-NEXT: local.get 2 1027; CHECK-NEXT: i64.eqz 1028; CHECK-NEXT: i32.select 1029; CHECK-NEXT: i64.select 1030; CHECK-NEXT: i64x2.replace_lane 1 1031; CHECK-NEXT: # fallthrough-return 1032entry: 1033 %conv = fptosi <2 x double> %x to <2 x i128> 1034 %0 = icmp slt <2 x i128> %conv, <i128 18446744073709551616, i128 18446744073709551616> 1035 %spec.store.select = select <2 x i1> %0, <2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616> 1036 %1 = icmp sgt <2 x i128> %spec.store.select, zeroinitializer 1037 %spec.store.select7 = select <2 x i1> %1, <2 x i128> %spec.store.select, <2 x i128> zeroinitializer 1038 %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64> 1039 ret <2 x i64> %conv6 1040} 1041 1042define <2 x i64> @stest_f32i64(<2 x float> %x) { 1043; CHECK-LABEL: stest_f32i64: 1044; CHECK: .functype stest_f32i64 (v128) -> (v128) 1045; CHECK-NEXT: .local i32, i64, i64, i64, i64 1046; CHECK-NEXT: # %bb.0: # %entry 1047; CHECK-NEXT: global.get __stack_pointer 1048; CHECK-NEXT: i32.const 32 1049; CHECK-NEXT: i32.sub 1050; CHECK-NEXT: local.tee 1 1051; CHECK-NEXT: global.set __stack_pointer 1052; CHECK-NEXT: local.get 1 1053; CHECK-NEXT: i32.const 16 1054; CHECK-NEXT: i32.add 1055; CHECK-NEXT: local.get 0 1056; CHECK-NEXT: f32x4.extract_lane 1 1057; CHECK-NEXT: call __fixsfti 1058; CHECK-NEXT: local.get 1 1059; CHECK-NEXT: local.get 0 1060; CHECK-NEXT: f32x4.extract_lane 0 1061; CHECK-NEXT: call __fixsfti 1062; CHECK-NEXT: local.get 1 1063; CHECK-NEXT: i32.const 16 1064; CHECK-NEXT: i32.add 1065; CHECK-NEXT: i32.const 8 1066; CHECK-NEXT: i32.add 1067; CHECK-NEXT: i64.load 0 1068; CHECK-NEXT: local.set 2 1069; CHECK-NEXT: local.get 1 1070; CHECK-NEXT: i64.load 16 1071; CHECK-NEXT: local.set 3 1072; CHECK-NEXT: local.get 1 1073; CHECK-NEXT: i32.const 8 1074; CHECK-NEXT: i32.add 1075; CHECK-NEXT: i64.load 0 1076; CHECK-NEXT: local.set 4 1077; CHECK-NEXT: local.get 1 1078; CHECK-NEXT: i64.load 0 1079; CHECK-NEXT: local.set 5 1080; CHECK-NEXT: local.get 1 1081; CHECK-NEXT: i32.const 32 1082; CHECK-NEXT: i32.add 1083; CHECK-NEXT: global.set __stack_pointer 1084; CHECK-NEXT: local.get 5 1085; CHECK-NEXT: i64.const 9223372036854775807 1086; CHECK-NEXT: local.get 5 1087; CHECK-NEXT: i64.const 9223372036854775807 1088; CHECK-NEXT: i64.lt_u 1089; CHECK-NEXT: local.get 4 1090; CHECK-NEXT: i64.const 0 1091; CHECK-NEXT: i64.lt_s 1092; CHECK-NEXT: local.get 4 1093; CHECK-NEXT: i64.eqz 1094; CHECK-NEXT: i32.select 1095; CHECK-NEXT: local.tee 1 1096; CHECK-NEXT: i64.select 1097; CHECK-NEXT: local.tee 5 1098; CHECK-NEXT: i64.const -9223372036854775808 1099; CHECK-NEXT: local.get 5 1100; CHECK-NEXT: i64.const -9223372036854775808 1101; CHECK-NEXT: i64.gt_u 1102; CHECK-NEXT: local.get 4 1103; CHECK-NEXT: i64.const 0 1104; CHECK-NEXT: local.get 1 1105; CHECK-NEXT: i64.select 1106; CHECK-NEXT: local.tee 4 1107; CHECK-NEXT: i64.const -1 1108; CHECK-NEXT: i64.gt_s 1109; CHECK-NEXT: local.get 4 1110; CHECK-NEXT: i64.const -1 1111; CHECK-NEXT: i64.eq 1112; CHECK-NEXT: i32.select 1113; CHECK-NEXT: i64.select 1114; CHECK-NEXT: i64x2.splat 1115; CHECK-NEXT: local.get 3 1116; CHECK-NEXT: i64.const 9223372036854775807 1117; CHECK-NEXT: local.get 3 1118; CHECK-NEXT: i64.const 9223372036854775807 1119; CHECK-NEXT: i64.lt_u 1120; CHECK-NEXT: local.get 2 1121; CHECK-NEXT: i64.const 0 1122; CHECK-NEXT: i64.lt_s 1123; CHECK-NEXT: local.get 2 1124; CHECK-NEXT: i64.eqz 1125; CHECK-NEXT: i32.select 1126; CHECK-NEXT: local.tee 1 1127; CHECK-NEXT: i64.select 1128; CHECK-NEXT: local.tee 4 1129; CHECK-NEXT: i64.const -9223372036854775808 1130; CHECK-NEXT: local.get 4 1131; CHECK-NEXT: i64.const -9223372036854775808 1132; CHECK-NEXT: i64.gt_u 1133; CHECK-NEXT: local.get 2 1134; CHECK-NEXT: i64.const 0 1135; CHECK-NEXT: local.get 1 1136; CHECK-NEXT: i64.select 1137; CHECK-NEXT: local.tee 2 1138; CHECK-NEXT: i64.const -1 1139; CHECK-NEXT: i64.gt_s 1140; CHECK-NEXT: local.get 2 1141; CHECK-NEXT: i64.const -1 1142; CHECK-NEXT: i64.eq 1143; CHECK-NEXT: i32.select 1144; CHECK-NEXT: i64.select 1145; CHECK-NEXT: i64x2.replace_lane 1 1146; CHECK-NEXT: # fallthrough-return 1147entry: 1148 %conv = fptosi <2 x float> %x to <2 x i128> 1149 %0 = icmp slt <2 x i128> %conv, <i128 9223372036854775807, i128 9223372036854775807> 1150 %spec.store.select = select <2 x i1> %0, <2 x i128> %conv, <2 x i128> <i128 9223372036854775807, i128 9223372036854775807> 1151 %1 = icmp sgt <2 x i128> %spec.store.select, <i128 -9223372036854775808, i128 -9223372036854775808> 1152 %spec.store.select7 = select <2 x i1> %1, <2 x i128> %spec.store.select, <2 x i128> <i128 -9223372036854775808, i128 -9223372036854775808> 1153 %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64> 1154 ret <2 x i64> %conv6 1155} 1156 1157define <2 x i64> @utest_f32i64(<2 x float> %x) { 1158; CHECK-LABEL: utest_f32i64: 1159; CHECK: .functype utest_f32i64 (v128) -> (v128) 1160; CHECK-NEXT: .local i32, i64, i64, i64, i64 1161; CHECK-NEXT: # %bb.0: # %entry 1162; CHECK-NEXT: global.get __stack_pointer 1163; CHECK-NEXT: i32.const 32 1164; CHECK-NEXT: i32.sub 1165; CHECK-NEXT: local.tee 1 1166; CHECK-NEXT: global.set __stack_pointer 1167; CHECK-NEXT: local.get 1 1168; CHECK-NEXT: i32.const 16 1169; CHECK-NEXT: i32.add 1170; CHECK-NEXT: local.get 0 1171; CHECK-NEXT: f32x4.extract_lane 1 1172; CHECK-NEXT: call __fixunssfti 1173; CHECK-NEXT: local.get 1 1174; CHECK-NEXT: local.get 0 1175; CHECK-NEXT: f32x4.extract_lane 0 1176; CHECK-NEXT: call __fixunssfti 1177; CHECK-NEXT: local.get 1 1178; CHECK-NEXT: i32.const 16 1179; CHECK-NEXT: i32.add 1180; CHECK-NEXT: i32.const 8 1181; CHECK-NEXT: i32.add 1182; CHECK-NEXT: i64.load 0 1183; CHECK-NEXT: local.set 2 1184; CHECK-NEXT: local.get 1 1185; CHECK-NEXT: i64.load 16 1186; CHECK-NEXT: local.set 3 1187; CHECK-NEXT: local.get 1 1188; CHECK-NEXT: i32.const 8 1189; CHECK-NEXT: i32.add 1190; CHECK-NEXT: i64.load 0 1191; CHECK-NEXT: local.set 4 1192; CHECK-NEXT: local.get 1 1193; CHECK-NEXT: i64.load 0 1194; CHECK-NEXT: local.set 5 1195; CHECK-NEXT: local.get 1 1196; CHECK-NEXT: i32.const 32 1197; CHECK-NEXT: i32.add 1198; CHECK-NEXT: global.set __stack_pointer 1199; CHECK-NEXT: local.get 5 1200; CHECK-NEXT: i64.const 0 1201; CHECK-NEXT: local.get 4 1202; CHECK-NEXT: i64.eqz 1203; CHECK-NEXT: i64.select 1204; CHECK-NEXT: i64x2.splat 1205; CHECK-NEXT: local.get 3 1206; CHECK-NEXT: i64.const 0 1207; CHECK-NEXT: local.get 2 1208; CHECK-NEXT: i64.eqz 1209; CHECK-NEXT: i64.select 1210; CHECK-NEXT: i64x2.replace_lane 1 1211; CHECK-NEXT: # fallthrough-return 1212entry: 1213 %conv = fptoui <2 x float> %x to <2 x i128> 1214 %0 = icmp ult <2 x i128> %conv, <i128 18446744073709551616, i128 18446744073709551616> 1215 %spec.store.select = select <2 x i1> %0, <2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616> 1216 %conv6 = trunc <2 x i128> %spec.store.select to <2 x i64> 1217 ret <2 x i64> %conv6 1218} 1219 1220define <2 x i64> @ustest_f32i64(<2 x float> %x) { 1221; CHECK-LABEL: ustest_f32i64: 1222; CHECK: .functype ustest_f32i64 (v128) -> (v128) 1223; CHECK-NEXT: .local i32, i64, i64, i64, i64 1224; CHECK-NEXT: # %bb.0: # %entry 1225; CHECK-NEXT: global.get __stack_pointer 1226; CHECK-NEXT: i32.const 32 1227; CHECK-NEXT: i32.sub 1228; CHECK-NEXT: local.tee 1 1229; CHECK-NEXT: global.set __stack_pointer 1230; CHECK-NEXT: local.get 1 1231; CHECK-NEXT: i32.const 16 1232; CHECK-NEXT: i32.add 1233; CHECK-NEXT: local.get 0 1234; CHECK-NEXT: f32x4.extract_lane 1 1235; CHECK-NEXT: call __fixsfti 1236; CHECK-NEXT: local.get 1 1237; CHECK-NEXT: local.get 0 1238; CHECK-NEXT: f32x4.extract_lane 0 1239; CHECK-NEXT: call __fixsfti 1240; CHECK-NEXT: local.get 1 1241; CHECK-NEXT: i32.const 16 1242; CHECK-NEXT: i32.add 1243; CHECK-NEXT: i32.const 8 1244; CHECK-NEXT: i32.add 1245; CHECK-NEXT: i64.load 0 1246; CHECK-NEXT: local.set 2 1247; CHECK-NEXT: local.get 1 1248; CHECK-NEXT: i64.load 16 1249; CHECK-NEXT: local.set 3 1250; CHECK-NEXT: local.get 1 1251; CHECK-NEXT: i32.const 8 1252; CHECK-NEXT: i32.add 1253; CHECK-NEXT: i64.load 0 1254; CHECK-NEXT: local.set 4 1255; CHECK-NEXT: local.get 1 1256; CHECK-NEXT: i64.load 0 1257; CHECK-NEXT: local.set 5 1258; CHECK-NEXT: local.get 1 1259; CHECK-NEXT: i32.const 32 1260; CHECK-NEXT: i32.add 1261; CHECK-NEXT: global.set __stack_pointer 1262; CHECK-NEXT: local.get 5 1263; CHECK-NEXT: i64.const 0 1264; CHECK-NEXT: local.get 4 1265; CHECK-NEXT: i64.const 1 1266; CHECK-NEXT: i64.lt_s 1267; CHECK-NEXT: local.tee 1 1268; CHECK-NEXT: i64.select 1269; CHECK-NEXT: local.tee 5 1270; CHECK-NEXT: i64.const 0 1271; CHECK-NEXT: local.get 5 1272; CHECK-NEXT: i64.const 0 1273; CHECK-NEXT: i64.ne 1274; CHECK-NEXT: local.get 4 1275; CHECK-NEXT: i64.const 1 1276; CHECK-NEXT: local.get 1 1277; CHECK-NEXT: i64.select 1278; CHECK-NEXT: local.tee 4 1279; CHECK-NEXT: i64.const 0 1280; CHECK-NEXT: i64.gt_s 1281; CHECK-NEXT: local.get 4 1282; CHECK-NEXT: i64.eqz 1283; CHECK-NEXT: i32.select 1284; CHECK-NEXT: i64.select 1285; CHECK-NEXT: i64x2.splat 1286; CHECK-NEXT: local.get 3 1287; CHECK-NEXT: i64.const 0 1288; CHECK-NEXT: local.get 2 1289; CHECK-NEXT: i64.const 1 1290; CHECK-NEXT: i64.lt_s 1291; CHECK-NEXT: local.tee 1 1292; CHECK-NEXT: i64.select 1293; CHECK-NEXT: local.tee 4 1294; CHECK-NEXT: i64.const 0 1295; CHECK-NEXT: local.get 4 1296; CHECK-NEXT: i64.const 0 1297; CHECK-NEXT: i64.ne 1298; CHECK-NEXT: local.get 2 1299; CHECK-NEXT: i64.const 1 1300; CHECK-NEXT: local.get 1 1301; CHECK-NEXT: i64.select 1302; CHECK-NEXT: local.tee 2 1303; CHECK-NEXT: i64.const 0 1304; CHECK-NEXT: i64.gt_s 1305; CHECK-NEXT: local.get 2 1306; CHECK-NEXT: i64.eqz 1307; CHECK-NEXT: i32.select 1308; CHECK-NEXT: i64.select 1309; CHECK-NEXT: i64x2.replace_lane 1 1310; CHECK-NEXT: # fallthrough-return 1311entry: 1312 %conv = fptosi <2 x float> %x to <2 x i128> 1313 %0 = icmp slt <2 x i128> %conv, <i128 18446744073709551616, i128 18446744073709551616> 1314 %spec.store.select = select <2 x i1> %0, <2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616> 1315 %1 = icmp sgt <2 x i128> %spec.store.select, zeroinitializer 1316 %spec.store.select7 = select <2 x i1> %1, <2 x i128> %spec.store.select, <2 x i128> zeroinitializer 1317 %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64> 1318 ret <2 x i64> %conv6 1319} 1320 1321define <2 x i64> @stest_f16i64(<2 x half> %x) { 1322; CHECK-LABEL: stest_f16i64: 1323; CHECK: .functype stest_f16i64 (f32, f32) -> (v128) 1324; CHECK-NEXT: .local i32, i64, i64, i64, i64 1325; CHECK-NEXT: # %bb.0: # %entry 1326; CHECK-NEXT: global.get __stack_pointer 1327; CHECK-NEXT: i32.const 32 1328; CHECK-NEXT: i32.sub 1329; CHECK-NEXT: local.tee 2 1330; CHECK-NEXT: global.set __stack_pointer 1331; CHECK-NEXT: local.get 2 1332; CHECK-NEXT: i32.const 16 1333; CHECK-NEXT: i32.add 1334; CHECK-NEXT: local.get 1 1335; CHECK-NEXT: call __truncsfhf2 1336; CHECK-NEXT: call __extendhfsf2 1337; CHECK-NEXT: call __fixsfti 1338; CHECK-NEXT: local.get 2 1339; CHECK-NEXT: local.get 0 1340; CHECK-NEXT: call __truncsfhf2 1341; CHECK-NEXT: call __extendhfsf2 1342; CHECK-NEXT: call __fixsfti 1343; CHECK-NEXT: local.get 2 1344; CHECK-NEXT: i32.const 16 1345; CHECK-NEXT: i32.add 1346; CHECK-NEXT: i32.const 8 1347; CHECK-NEXT: i32.add 1348; CHECK-NEXT: i64.load 0 1349; CHECK-NEXT: local.set 3 1350; CHECK-NEXT: local.get 2 1351; CHECK-NEXT: i64.load 16 1352; CHECK-NEXT: local.set 4 1353; CHECK-NEXT: local.get 2 1354; CHECK-NEXT: i32.const 8 1355; CHECK-NEXT: i32.add 1356; CHECK-NEXT: i64.load 0 1357; CHECK-NEXT: local.set 5 1358; CHECK-NEXT: local.get 2 1359; CHECK-NEXT: i64.load 0 1360; CHECK-NEXT: local.set 6 1361; CHECK-NEXT: local.get 2 1362; CHECK-NEXT: i32.const 32 1363; CHECK-NEXT: i32.add 1364; CHECK-NEXT: global.set __stack_pointer 1365; CHECK-NEXT: local.get 6 1366; CHECK-NEXT: i64.const 9223372036854775807 1367; CHECK-NEXT: local.get 6 1368; CHECK-NEXT: i64.const 9223372036854775807 1369; CHECK-NEXT: i64.lt_u 1370; CHECK-NEXT: local.get 5 1371; CHECK-NEXT: i64.const 0 1372; CHECK-NEXT: i64.lt_s 1373; CHECK-NEXT: local.get 5 1374; CHECK-NEXT: i64.eqz 1375; CHECK-NEXT: i32.select 1376; CHECK-NEXT: local.tee 2 1377; CHECK-NEXT: i64.select 1378; CHECK-NEXT: local.tee 6 1379; CHECK-NEXT: i64.const -9223372036854775808 1380; CHECK-NEXT: local.get 6 1381; CHECK-NEXT: i64.const -9223372036854775808 1382; CHECK-NEXT: i64.gt_u 1383; CHECK-NEXT: local.get 5 1384; CHECK-NEXT: i64.const 0 1385; CHECK-NEXT: local.get 2 1386; CHECK-NEXT: i64.select 1387; CHECK-NEXT: local.tee 5 1388; CHECK-NEXT: i64.const -1 1389; CHECK-NEXT: i64.gt_s 1390; CHECK-NEXT: local.get 5 1391; CHECK-NEXT: i64.const -1 1392; CHECK-NEXT: i64.eq 1393; CHECK-NEXT: i32.select 1394; CHECK-NEXT: i64.select 1395; CHECK-NEXT: i64x2.splat 1396; CHECK-NEXT: local.get 4 1397; CHECK-NEXT: i64.const 9223372036854775807 1398; CHECK-NEXT: local.get 4 1399; CHECK-NEXT: i64.const 9223372036854775807 1400; CHECK-NEXT: i64.lt_u 1401; CHECK-NEXT: local.get 3 1402; CHECK-NEXT: i64.const 0 1403; CHECK-NEXT: i64.lt_s 1404; CHECK-NEXT: local.get 3 1405; CHECK-NEXT: i64.eqz 1406; CHECK-NEXT: i32.select 1407; CHECK-NEXT: local.tee 2 1408; CHECK-NEXT: i64.select 1409; CHECK-NEXT: local.tee 5 1410; CHECK-NEXT: i64.const -9223372036854775808 1411; CHECK-NEXT: local.get 5 1412; CHECK-NEXT: i64.const -9223372036854775808 1413; CHECK-NEXT: i64.gt_u 1414; CHECK-NEXT: local.get 3 1415; CHECK-NEXT: i64.const 0 1416; CHECK-NEXT: local.get 2 1417; CHECK-NEXT: i64.select 1418; CHECK-NEXT: local.tee 3 1419; CHECK-NEXT: i64.const -1 1420; CHECK-NEXT: i64.gt_s 1421; CHECK-NEXT: local.get 3 1422; CHECK-NEXT: i64.const -1 1423; CHECK-NEXT: i64.eq 1424; CHECK-NEXT: i32.select 1425; CHECK-NEXT: i64.select 1426; CHECK-NEXT: i64x2.replace_lane 1 1427; CHECK-NEXT: # fallthrough-return 1428entry: 1429 %conv = fptosi <2 x half> %x to <2 x i128> 1430 %0 = icmp slt <2 x i128> %conv, <i128 9223372036854775807, i128 9223372036854775807> 1431 %spec.store.select = select <2 x i1> %0, <2 x i128> %conv, <2 x i128> <i128 9223372036854775807, i128 9223372036854775807> 1432 %1 = icmp sgt <2 x i128> %spec.store.select, <i128 -9223372036854775808, i128 -9223372036854775808> 1433 %spec.store.select7 = select <2 x i1> %1, <2 x i128> %spec.store.select, <2 x i128> <i128 -9223372036854775808, i128 -9223372036854775808> 1434 %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64> 1435 ret <2 x i64> %conv6 1436} 1437 1438define <2 x i64> @utesth_f16i64(<2 x half> %x) { 1439; CHECK-LABEL: utesth_f16i64: 1440; CHECK: .functype utesth_f16i64 (f32, f32) -> (v128) 1441; CHECK-NEXT: .local i32, i64, i64, i64, i64 1442; CHECK-NEXT: # %bb.0: # %entry 1443; CHECK-NEXT: global.get __stack_pointer 1444; CHECK-NEXT: i32.const 32 1445; CHECK-NEXT: i32.sub 1446; CHECK-NEXT: local.tee 2 1447; CHECK-NEXT: global.set __stack_pointer 1448; CHECK-NEXT: local.get 2 1449; CHECK-NEXT: i32.const 16 1450; CHECK-NEXT: i32.add 1451; CHECK-NEXT: local.get 1 1452; CHECK-NEXT: call __truncsfhf2 1453; CHECK-NEXT: call __extendhfsf2 1454; CHECK-NEXT: call __fixunssfti 1455; CHECK-NEXT: local.get 2 1456; CHECK-NEXT: local.get 0 1457; CHECK-NEXT: call __truncsfhf2 1458; CHECK-NEXT: call __extendhfsf2 1459; CHECK-NEXT: call __fixunssfti 1460; CHECK-NEXT: local.get 2 1461; CHECK-NEXT: i32.const 16 1462; CHECK-NEXT: i32.add 1463; CHECK-NEXT: i32.const 8 1464; CHECK-NEXT: i32.add 1465; CHECK-NEXT: i64.load 0 1466; CHECK-NEXT: local.set 3 1467; CHECK-NEXT: local.get 2 1468; CHECK-NEXT: i64.load 16 1469; CHECK-NEXT: local.set 4 1470; CHECK-NEXT: local.get 2 1471; CHECK-NEXT: i32.const 8 1472; CHECK-NEXT: i32.add 1473; CHECK-NEXT: i64.load 0 1474; CHECK-NEXT: local.set 5 1475; CHECK-NEXT: local.get 2 1476; CHECK-NEXT: i64.load 0 1477; CHECK-NEXT: local.set 6 1478; CHECK-NEXT: local.get 2 1479; CHECK-NEXT: i32.const 32 1480; CHECK-NEXT: i32.add 1481; CHECK-NEXT: global.set __stack_pointer 1482; CHECK-NEXT: local.get 6 1483; CHECK-NEXT: i64.const 0 1484; CHECK-NEXT: local.get 5 1485; CHECK-NEXT: i64.eqz 1486; CHECK-NEXT: i64.select 1487; CHECK-NEXT: i64x2.splat 1488; CHECK-NEXT: local.get 4 1489; CHECK-NEXT: i64.const 0 1490; CHECK-NEXT: local.get 3 1491; CHECK-NEXT: i64.eqz 1492; CHECK-NEXT: i64.select 1493; CHECK-NEXT: i64x2.replace_lane 1 1494; CHECK-NEXT: # fallthrough-return 1495entry: 1496 %conv = fptoui <2 x half> %x to <2 x i128> 1497 %0 = icmp ult <2 x i128> %conv, <i128 18446744073709551616, i128 18446744073709551616> 1498 %spec.store.select = select <2 x i1> %0, <2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616> 1499 %conv6 = trunc <2 x i128> %spec.store.select to <2 x i64> 1500 ret <2 x i64> %conv6 1501} 1502 1503define <2 x i64> @ustest_f16i64(<2 x half> %x) { 1504; CHECK-LABEL: ustest_f16i64: 1505; CHECK: .functype ustest_f16i64 (f32, f32) -> (v128) 1506; CHECK-NEXT: .local i32, i64, i64, i64, i64 1507; CHECK-NEXT: # %bb.0: # %entry 1508; CHECK-NEXT: global.get __stack_pointer 1509; CHECK-NEXT: i32.const 32 1510; CHECK-NEXT: i32.sub 1511; CHECK-NEXT: local.tee 2 1512; CHECK-NEXT: global.set __stack_pointer 1513; CHECK-NEXT: local.get 2 1514; CHECK-NEXT: i32.const 16 1515; CHECK-NEXT: i32.add 1516; CHECK-NEXT: local.get 1 1517; CHECK-NEXT: call __truncsfhf2 1518; CHECK-NEXT: call __extendhfsf2 1519; CHECK-NEXT: call __fixsfti 1520; CHECK-NEXT: local.get 2 1521; CHECK-NEXT: local.get 0 1522; CHECK-NEXT: call __truncsfhf2 1523; CHECK-NEXT: call __extendhfsf2 1524; CHECK-NEXT: call __fixsfti 1525; CHECK-NEXT: local.get 2 1526; CHECK-NEXT: i32.const 16 1527; CHECK-NEXT: i32.add 1528; CHECK-NEXT: i32.const 8 1529; CHECK-NEXT: i32.add 1530; CHECK-NEXT: i64.load 0 1531; CHECK-NEXT: local.set 3 1532; CHECK-NEXT: local.get 2 1533; CHECK-NEXT: i64.load 16 1534; CHECK-NEXT: local.set 4 1535; CHECK-NEXT: local.get 2 1536; CHECK-NEXT: i32.const 8 1537; CHECK-NEXT: i32.add 1538; CHECK-NEXT: i64.load 0 1539; CHECK-NEXT: local.set 5 1540; CHECK-NEXT: local.get 2 1541; CHECK-NEXT: i64.load 0 1542; CHECK-NEXT: local.set 6 1543; CHECK-NEXT: local.get 2 1544; CHECK-NEXT: i32.const 32 1545; CHECK-NEXT: i32.add 1546; CHECK-NEXT: global.set __stack_pointer 1547; CHECK-NEXT: local.get 6 1548; CHECK-NEXT: i64.const 0 1549; CHECK-NEXT: local.get 5 1550; CHECK-NEXT: i64.const 1 1551; CHECK-NEXT: i64.lt_s 1552; CHECK-NEXT: local.tee 2 1553; CHECK-NEXT: i64.select 1554; CHECK-NEXT: local.tee 6 1555; CHECK-NEXT: i64.const 0 1556; CHECK-NEXT: local.get 6 1557; CHECK-NEXT: i64.const 0 1558; CHECK-NEXT: i64.ne 1559; CHECK-NEXT: local.get 5 1560; CHECK-NEXT: i64.const 1 1561; CHECK-NEXT: local.get 2 1562; CHECK-NEXT: i64.select 1563; CHECK-NEXT: local.tee 5 1564; CHECK-NEXT: i64.const 0 1565; CHECK-NEXT: i64.gt_s 1566; CHECK-NEXT: local.get 5 1567; CHECK-NEXT: i64.eqz 1568; CHECK-NEXT: i32.select 1569; CHECK-NEXT: i64.select 1570; CHECK-NEXT: i64x2.splat 1571; CHECK-NEXT: local.get 4 1572; CHECK-NEXT: i64.const 0 1573; CHECK-NEXT: local.get 3 1574; CHECK-NEXT: i64.const 1 1575; CHECK-NEXT: i64.lt_s 1576; CHECK-NEXT: local.tee 2 1577; CHECK-NEXT: i64.select 1578; CHECK-NEXT: local.tee 5 1579; CHECK-NEXT: i64.const 0 1580; CHECK-NEXT: local.get 5 1581; CHECK-NEXT: i64.const 0 1582; CHECK-NEXT: i64.ne 1583; CHECK-NEXT: local.get 3 1584; CHECK-NEXT: i64.const 1 1585; CHECK-NEXT: local.get 2 1586; CHECK-NEXT: i64.select 1587; CHECK-NEXT: local.tee 3 1588; CHECK-NEXT: i64.const 0 1589; CHECK-NEXT: i64.gt_s 1590; CHECK-NEXT: local.get 3 1591; CHECK-NEXT: i64.eqz 1592; CHECK-NEXT: i32.select 1593; CHECK-NEXT: i64.select 1594; CHECK-NEXT: i64x2.replace_lane 1 1595; CHECK-NEXT: # fallthrough-return 1596entry: 1597 %conv = fptosi <2 x half> %x to <2 x i128> 1598 %0 = icmp slt <2 x i128> %conv, <i128 18446744073709551616, i128 18446744073709551616> 1599 %spec.store.select = select <2 x i1> %0, <2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616> 1600 %1 = icmp sgt <2 x i128> %spec.store.select, zeroinitializer 1601 %spec.store.select7 = select <2 x i1> %1, <2 x i128> %spec.store.select, <2 x i128> zeroinitializer 1602 %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64> 1603 ret <2 x i64> %conv6 1604} 1605 1606 1607 1608; i32 saturate 1609 1610define <2 x i32> @stest_f64i32_mm(<2 x double> %x) { 1611; CHECK-LABEL: stest_f64i32_mm: 1612; CHECK: .functype stest_f64i32_mm (v128) -> (v128) 1613; CHECK-NEXT: .local v128 1614; CHECK-NEXT: # %bb.0: # %entry 1615; CHECK-NEXT: local.get 0 1616; CHECK-NEXT: f64x2.extract_lane 0 1617; CHECK-NEXT: i64.trunc_sat_f64_s 1618; CHECK-NEXT: i64x2.splat 1619; CHECK-NEXT: local.get 0 1620; CHECK-NEXT: f64x2.extract_lane 1 1621; CHECK-NEXT: i64.trunc_sat_f64_s 1622; CHECK-NEXT: i64x2.replace_lane 1 1623; CHECK-NEXT: local.tee 0 1624; CHECK-NEXT: v128.const 2147483647, 2147483647 1625; CHECK-NEXT: local.tee 1 1626; CHECK-NEXT: local.get 0 1627; CHECK-NEXT: local.get 1 1628; CHECK-NEXT: i64x2.lt_s 1629; CHECK-NEXT: v128.bitselect 1630; CHECK-NEXT: local.tee 0 1631; CHECK-NEXT: v128.const -2147483648, -2147483648 1632; CHECK-NEXT: local.tee 1 1633; CHECK-NEXT: local.get 0 1634; CHECK-NEXT: local.get 1 1635; CHECK-NEXT: i64x2.gt_s 1636; CHECK-NEXT: v128.bitselect 1637; CHECK-NEXT: local.get 0 1638; CHECK-NEXT: i8x16.shuffle 0, 1, 2, 3, 8, 9, 10, 11, 0, 0, 0, 0, 0, 0, 0, 0 1639; CHECK-NEXT: # fallthrough-return 1640entry: 1641 %conv = fptosi <2 x double> %x to <2 x i64> 1642 %spec.store.select = call <2 x i64> @llvm.smin.v2i64(<2 x i64> %conv, <2 x i64> <i64 2147483647, i64 2147483647>) 1643 %spec.store.select7 = call <2 x i64> @llvm.smax.v2i64(<2 x i64> %spec.store.select, <2 x i64> <i64 -2147483648, i64 -2147483648>) 1644 %conv6 = trunc <2 x i64> %spec.store.select7 to <2 x i32> 1645 ret <2 x i32> %conv6 1646} 1647 1648define <2 x i32> @utest_f64i32_mm(<2 x double> %x) { 1649; CHECK-LABEL: utest_f64i32_mm: 1650; CHECK: .functype utest_f64i32_mm (v128) -> (v128) 1651; CHECK-NEXT: .local i64, i64 1652; CHECK-NEXT: # %bb.0: # %entry 1653; CHECK-NEXT: local.get 0 1654; CHECK-NEXT: f64x2.extract_lane 0 1655; CHECK-NEXT: i64.trunc_sat_f64_u 1656; CHECK-NEXT: local.tee 1 1657; CHECK-NEXT: i64x2.splat 1658; CHECK-NEXT: local.get 0 1659; CHECK-NEXT: f64x2.extract_lane 1 1660; CHECK-NEXT: i64.trunc_sat_f64_u 1661; CHECK-NEXT: local.tee 2 1662; CHECK-NEXT: i64x2.replace_lane 1 1663; CHECK-NEXT: v128.const 4294967295, 4294967295 1664; CHECK-NEXT: i64.const -1 1665; CHECK-NEXT: i64.const 0 1666; CHECK-NEXT: local.get 1 1667; CHECK-NEXT: i64.const 4294967295 1668; CHECK-NEXT: i64.lt_u 1669; CHECK-NEXT: i64.select 1670; CHECK-NEXT: i64x2.splat 1671; CHECK-NEXT: i64.const -1 1672; CHECK-NEXT: i64.const 0 1673; CHECK-NEXT: local.get 2 1674; CHECK-NEXT: i64.const 4294967295 1675; CHECK-NEXT: i64.lt_u 1676; CHECK-NEXT: i64.select 1677; CHECK-NEXT: i64x2.replace_lane 1 1678; CHECK-NEXT: v128.bitselect 1679; CHECK-NEXT: local.get 0 1680; CHECK-NEXT: i8x16.shuffle 0, 1, 2, 3, 8, 9, 10, 11, 0, 0, 0, 0, 0, 0, 0, 0 1681; CHECK-NEXT: # fallthrough-return 1682entry: 1683 %conv = fptoui <2 x double> %x to <2 x i64> 1684 %spec.store.select = call <2 x i64> @llvm.umin.v2i64(<2 x i64> %conv, <2 x i64> <i64 4294967295, i64 4294967295>) 1685 %conv6 = trunc <2 x i64> %spec.store.select to <2 x i32> 1686 ret <2 x i32> %conv6 1687} 1688 1689define <2 x i32> @ustest_f64i32_mm(<2 x double> %x) { 1690; CHECK-LABEL: ustest_f64i32_mm: 1691; CHECK: .functype ustest_f64i32_mm (v128) -> (v128) 1692; CHECK-NEXT: .local v128 1693; CHECK-NEXT: # %bb.0: # %entry 1694; CHECK-NEXT: local.get 0 1695; CHECK-NEXT: f64x2.extract_lane 0 1696; CHECK-NEXT: i64.trunc_sat_f64_s 1697; CHECK-NEXT: i64x2.splat 1698; CHECK-NEXT: local.get 0 1699; CHECK-NEXT: f64x2.extract_lane 1 1700; CHECK-NEXT: i64.trunc_sat_f64_s 1701; CHECK-NEXT: i64x2.replace_lane 1 1702; CHECK-NEXT: local.tee 0 1703; CHECK-NEXT: v128.const 4294967295, 4294967295 1704; CHECK-NEXT: local.tee 1 1705; CHECK-NEXT: local.get 0 1706; CHECK-NEXT: local.get 1 1707; CHECK-NEXT: i64x2.lt_s 1708; CHECK-NEXT: v128.bitselect 1709; CHECK-NEXT: local.tee 0 1710; CHECK-NEXT: v128.const 0, 0 1711; CHECK-NEXT: local.tee 1 1712; CHECK-NEXT: local.get 0 1713; CHECK-NEXT: local.get 1 1714; CHECK-NEXT: i64x2.gt_s 1715; CHECK-NEXT: v128.bitselect 1716; CHECK-NEXT: local.get 0 1717; CHECK-NEXT: i8x16.shuffle 0, 1, 2, 3, 8, 9, 10, 11, 0, 0, 0, 0, 0, 0, 0, 0 1718; CHECK-NEXT: # fallthrough-return 1719entry: 1720 %conv = fptosi <2 x double> %x to <2 x i64> 1721 %spec.store.select = call <2 x i64> @llvm.smin.v2i64(<2 x i64> %conv, <2 x i64> <i64 4294967295, i64 4294967295>) 1722 %spec.store.select7 = call <2 x i64> @llvm.smax.v2i64(<2 x i64> %spec.store.select, <2 x i64> zeroinitializer) 1723 %conv6 = trunc <2 x i64> %spec.store.select7 to <2 x i32> 1724 ret <2 x i32> %conv6 1725} 1726 1727define <4 x i32> @stest_f32i32_mm(<4 x float> %x) { 1728; CHECK-LABEL: stest_f32i32_mm: 1729; CHECK: .functype stest_f32i32_mm (v128) -> (v128) 1730; CHECK-NEXT: # %bb.0: # %entry 1731; CHECK-NEXT: local.get 0 1732; CHECK-NEXT: i32x4.trunc_sat_f32x4_s 1733; CHECK-NEXT: # fallthrough-return 1734entry: 1735 %conv = fptosi <4 x float> %x to <4 x i64> 1736 %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>) 1737 %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>) 1738 %conv6 = trunc <4 x i64> %spec.store.select7 to <4 x i32> 1739 ret <4 x i32> %conv6 1740} 1741 1742define <4 x i32> @utest_f32i32_mm(<4 x float> %x) { 1743; CHECK-LABEL: utest_f32i32_mm: 1744; CHECK: .functype utest_f32i32_mm (v128) -> (v128) 1745; CHECK-NEXT: .local i64, i64, v128 1746; CHECK-NEXT: # %bb.0: # %entry 1747; CHECK-NEXT: local.get 0 1748; CHECK-NEXT: f32x4.extract_lane 0 1749; CHECK-NEXT: i64.trunc_sat_f32_u 1750; CHECK-NEXT: local.tee 1 1751; CHECK-NEXT: i64x2.splat 1752; CHECK-NEXT: local.get 0 1753; CHECK-NEXT: f32x4.extract_lane 1 1754; CHECK-NEXT: i64.trunc_sat_f32_u 1755; CHECK-NEXT: local.tee 2 1756; CHECK-NEXT: i64x2.replace_lane 1 1757; CHECK-NEXT: v128.const 4294967295, 4294967295 1758; CHECK-NEXT: local.tee 3 1759; CHECK-NEXT: i64.const -1 1760; CHECK-NEXT: i64.const 0 1761; CHECK-NEXT: local.get 1 1762; CHECK-NEXT: i64.const 4294967295 1763; CHECK-NEXT: i64.lt_u 1764; CHECK-NEXT: i64.select 1765; CHECK-NEXT: i64x2.splat 1766; CHECK-NEXT: i64.const -1 1767; CHECK-NEXT: i64.const 0 1768; CHECK-NEXT: local.get 2 1769; CHECK-NEXT: i64.const 4294967295 1770; CHECK-NEXT: i64.lt_u 1771; CHECK-NEXT: i64.select 1772; CHECK-NEXT: i64x2.replace_lane 1 1773; CHECK-NEXT: v128.bitselect 1774; CHECK-NEXT: local.get 0 1775; CHECK-NEXT: f32x4.extract_lane 2 1776; CHECK-NEXT: i64.trunc_sat_f32_u 1777; CHECK-NEXT: local.tee 1 1778; CHECK-NEXT: i64x2.splat 1779; CHECK-NEXT: local.get 0 1780; CHECK-NEXT: f32x4.extract_lane 3 1781; CHECK-NEXT: i64.trunc_sat_f32_u 1782; CHECK-NEXT: local.tee 2 1783; CHECK-NEXT: i64x2.replace_lane 1 1784; CHECK-NEXT: local.get 3 1785; CHECK-NEXT: i64.const -1 1786; CHECK-NEXT: i64.const 0 1787; CHECK-NEXT: local.get 1 1788; CHECK-NEXT: i64.const 4294967295 1789; CHECK-NEXT: i64.lt_u 1790; CHECK-NEXT: i64.select 1791; CHECK-NEXT: i64x2.splat 1792; CHECK-NEXT: i64.const -1 1793; CHECK-NEXT: i64.const 0 1794; CHECK-NEXT: local.get 2 1795; CHECK-NEXT: i64.const 4294967295 1796; CHECK-NEXT: i64.lt_u 1797; CHECK-NEXT: i64.select 1798; CHECK-NEXT: i64x2.replace_lane 1 1799; CHECK-NEXT: v128.bitselect 1800; CHECK-NEXT: i8x16.shuffle 0, 1, 2, 3, 8, 9, 10, 11, 16, 17, 18, 19, 24, 25, 26, 27 1801; CHECK-NEXT: # fallthrough-return 1802entry: 1803 %conv = fptoui <4 x float> %x to <4 x i64> 1804 %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>) 1805 %conv6 = trunc <4 x i64> %spec.store.select to <4 x i32> 1806 ret <4 x i32> %conv6 1807} 1808 1809define <4 x i32> @ustest_f32i32_mm(<4 x float> %x) { 1810; CHECK-LABEL: ustest_f32i32_mm: 1811; CHECK: .functype ustest_f32i32_mm (v128) -> (v128) 1812; CHECK-NEXT: # %bb.0: # %entry 1813; CHECK-NEXT: local.get 0 1814; CHECK-NEXT: i32x4.trunc_sat_f32x4_u 1815; CHECK-NEXT: # fallthrough-return 1816entry: 1817 %conv = fptosi <4 x float> %x to <4 x i64> 1818 %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>) 1819 %spec.store.select7 = call <4 x i64> @llvm.smax.v4i64(<4 x i64> %spec.store.select, <4 x i64> zeroinitializer) 1820 %conv6 = trunc <4 x i64> %spec.store.select7 to <4 x i32> 1821 ret <4 x i32> %conv6 1822} 1823 1824define <4 x i32> @stest_f16i32_mm(<4 x half> %x) { 1825; CHECK-LABEL: stest_f16i32_mm: 1826; CHECK: .functype stest_f16i32_mm (f32, f32, f32, f32) -> (v128) 1827; CHECK-NEXT: # %bb.0: # %entry 1828; CHECK-NEXT: local.get 1 1829; CHECK-NEXT: call __truncsfhf2 1830; CHECK-NEXT: call __extendhfsf2 1831; CHECK-NEXT: local.set 1 1832; CHECK-NEXT: local.get 0 1833; CHECK-NEXT: call __truncsfhf2 1834; CHECK-NEXT: call __extendhfsf2 1835; CHECK-NEXT: i32.trunc_sat_f32_s 1836; CHECK-NEXT: i32x4.splat 1837; CHECK-NEXT: local.get 1 1838; CHECK-NEXT: i32.trunc_sat_f32_s 1839; CHECK-NEXT: i32x4.replace_lane 1 1840; CHECK-NEXT: local.get 2 1841; CHECK-NEXT: call __truncsfhf2 1842; CHECK-NEXT: call __extendhfsf2 1843; CHECK-NEXT: i32.trunc_sat_f32_s 1844; CHECK-NEXT: i32x4.replace_lane 2 1845; CHECK-NEXT: local.get 3 1846; CHECK-NEXT: call __truncsfhf2 1847; CHECK-NEXT: call __extendhfsf2 1848; CHECK-NEXT: i32.trunc_sat_f32_s 1849; CHECK-NEXT: i32x4.replace_lane 3 1850; CHECK-NEXT: # fallthrough-return 1851entry: 1852 %conv = fptosi <4 x half> %x to <4 x i64> 1853 %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>) 1854 %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>) 1855 %conv6 = trunc <4 x i64> %spec.store.select7 to <4 x i32> 1856 ret <4 x i32> %conv6 1857} 1858 1859define <4 x i32> @utesth_f16i32_mm(<4 x half> %x) { 1860; CHECK-LABEL: utesth_f16i32_mm: 1861; CHECK: .functype utesth_f16i32_mm (f32, f32, f32, f32) -> (v128) 1862; CHECK-NEXT: .local i64, i64, v128 1863; CHECK-NEXT: # %bb.0: # %entry 1864; CHECK-NEXT: local.get 3 1865; CHECK-NEXT: call __truncsfhf2 1866; CHECK-NEXT: call __extendhfsf2 1867; CHECK-NEXT: local.set 3 1868; CHECK-NEXT: local.get 2 1869; CHECK-NEXT: call __truncsfhf2 1870; CHECK-NEXT: call __extendhfsf2 1871; CHECK-NEXT: local.set 2 1872; CHECK-NEXT: local.get 1 1873; CHECK-NEXT: call __truncsfhf2 1874; CHECK-NEXT: call __extendhfsf2 1875; CHECK-NEXT: local.set 1 1876; CHECK-NEXT: local.get 0 1877; CHECK-NEXT: call __truncsfhf2 1878; CHECK-NEXT: call __extendhfsf2 1879; CHECK-NEXT: i64.trunc_sat_f32_u 1880; CHECK-NEXT: local.tee 4 1881; CHECK-NEXT: i64x2.splat 1882; CHECK-NEXT: local.get 1 1883; CHECK-NEXT: i64.trunc_sat_f32_u 1884; CHECK-NEXT: local.tee 5 1885; CHECK-NEXT: i64x2.replace_lane 1 1886; CHECK-NEXT: v128.const 4294967295, 4294967295 1887; CHECK-NEXT: local.tee 6 1888; CHECK-NEXT: i64.const -1 1889; CHECK-NEXT: i64.const 0 1890; CHECK-NEXT: local.get 4 1891; CHECK-NEXT: i64.const 4294967295 1892; CHECK-NEXT: i64.lt_u 1893; CHECK-NEXT: i64.select 1894; CHECK-NEXT: i64x2.splat 1895; CHECK-NEXT: i64.const -1 1896; CHECK-NEXT: i64.const 0 1897; CHECK-NEXT: local.get 5 1898; CHECK-NEXT: i64.const 4294967295 1899; CHECK-NEXT: i64.lt_u 1900; CHECK-NEXT: i64.select 1901; CHECK-NEXT: i64x2.replace_lane 1 1902; CHECK-NEXT: v128.bitselect 1903; CHECK-NEXT: local.get 2 1904; CHECK-NEXT: i64.trunc_sat_f32_u 1905; CHECK-NEXT: local.tee 4 1906; CHECK-NEXT: i64x2.splat 1907; CHECK-NEXT: local.get 3 1908; CHECK-NEXT: i64.trunc_sat_f32_u 1909; CHECK-NEXT: local.tee 5 1910; CHECK-NEXT: i64x2.replace_lane 1 1911; CHECK-NEXT: local.get 6 1912; CHECK-NEXT: i64.const -1 1913; CHECK-NEXT: i64.const 0 1914; CHECK-NEXT: local.get 4 1915; CHECK-NEXT: i64.const 4294967295 1916; CHECK-NEXT: i64.lt_u 1917; CHECK-NEXT: i64.select 1918; CHECK-NEXT: i64x2.splat 1919; CHECK-NEXT: i64.const -1 1920; CHECK-NEXT: i64.const 0 1921; CHECK-NEXT: local.get 5 1922; CHECK-NEXT: i64.const 4294967295 1923; CHECK-NEXT: i64.lt_u 1924; CHECK-NEXT: i64.select 1925; CHECK-NEXT: i64x2.replace_lane 1 1926; CHECK-NEXT: v128.bitselect 1927; CHECK-NEXT: i8x16.shuffle 0, 1, 2, 3, 8, 9, 10, 11, 16, 17, 18, 19, 24, 25, 26, 27 1928; CHECK-NEXT: # fallthrough-return 1929entry: 1930 %conv = fptoui <4 x half> %x to <4 x i64> 1931 %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>) 1932 %conv6 = trunc <4 x i64> %spec.store.select to <4 x i32> 1933 ret <4 x i32> %conv6 1934} 1935 1936define <4 x i32> @ustest_f16i32_mm(<4 x half> %x) { 1937; CHECK-LABEL: ustest_f16i32_mm: 1938; CHECK: .functype ustest_f16i32_mm (f32, f32, f32, f32) -> (v128) 1939; CHECK-NEXT: # %bb.0: # %entry 1940; CHECK-NEXT: local.get 1 1941; CHECK-NEXT: call __truncsfhf2 1942; CHECK-NEXT: call __extendhfsf2 1943; CHECK-NEXT: local.set 1 1944; CHECK-NEXT: local.get 0 1945; CHECK-NEXT: call __truncsfhf2 1946; CHECK-NEXT: call __extendhfsf2 1947; CHECK-NEXT: i32.trunc_sat_f32_u 1948; CHECK-NEXT: i32x4.splat 1949; CHECK-NEXT: local.get 1 1950; CHECK-NEXT: i32.trunc_sat_f32_u 1951; CHECK-NEXT: i32x4.replace_lane 1 1952; CHECK-NEXT: local.get 2 1953; CHECK-NEXT: call __truncsfhf2 1954; CHECK-NEXT: call __extendhfsf2 1955; CHECK-NEXT: i32.trunc_sat_f32_u 1956; CHECK-NEXT: i32x4.replace_lane 2 1957; CHECK-NEXT: local.get 3 1958; CHECK-NEXT: call __truncsfhf2 1959; CHECK-NEXT: call __extendhfsf2 1960; CHECK-NEXT: i32.trunc_sat_f32_u 1961; CHECK-NEXT: i32x4.replace_lane 3 1962; CHECK-NEXT: # fallthrough-return 1963entry: 1964 %conv = fptosi <4 x half> %x to <4 x i64> 1965 %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>) 1966 %spec.store.select7 = call <4 x i64> @llvm.smax.v4i64(<4 x i64> %spec.store.select, <4 x i64> zeroinitializer) 1967 %conv6 = trunc <4 x i64> %spec.store.select7 to <4 x i32> 1968 ret <4 x i32> %conv6 1969} 1970 1971; i16 saturate 1972 1973define <2 x i16> @stest_f64i16_mm(<2 x double> %x) { 1974; CHECK-LABEL: stest_f64i16_mm: 1975; CHECK: .functype stest_f64i16_mm (v128) -> (v128) 1976; CHECK-NEXT: # %bb.0: # %entry 1977; CHECK-NEXT: local.get 0 1978; CHECK-NEXT: f64x2.extract_lane 0 1979; CHECK-NEXT: i32.trunc_sat_f64_s 1980; CHECK-NEXT: i32x4.splat 1981; CHECK-NEXT: local.get 0 1982; CHECK-NEXT: f64x2.extract_lane 1 1983; CHECK-NEXT: i32.trunc_sat_f64_s 1984; CHECK-NEXT: i32x4.replace_lane 1 1985; CHECK-NEXT: v128.const 32767, 32767, 0, 0 1986; CHECK-NEXT: i32x4.min_s 1987; CHECK-NEXT: v128.const -32768, -32768, 0, 0 1988; CHECK-NEXT: i32x4.max_s 1989; CHECK-NEXT: local.get 0 1990; CHECK-NEXT: i8x16.shuffle 0, 1, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 1991; CHECK-NEXT: # fallthrough-return 1992entry: 1993 %conv = fptosi <2 x double> %x to <2 x i32> 1994 %spec.store.select = call <2 x i32> @llvm.smin.v2i32(<2 x i32> %conv, <2 x i32> <i32 32767, i32 32767>) 1995 %spec.store.select7 = call <2 x i32> @llvm.smax.v2i32(<2 x i32> %spec.store.select, <2 x i32> <i32 -32768, i32 -32768>) 1996 %conv6 = trunc <2 x i32> %spec.store.select7 to <2 x i16> 1997 ret <2 x i16> %conv6 1998} 1999 2000define <2 x i16> @utest_f64i16_mm(<2 x double> %x) { 2001; CHECK-LABEL: utest_f64i16_mm: 2002; CHECK: .functype utest_f64i16_mm (v128) -> (v128) 2003; CHECK-NEXT: # %bb.0: # %entry 2004; CHECK-NEXT: local.get 0 2005; CHECK-NEXT: f64x2.extract_lane 0 2006; CHECK-NEXT: i32.trunc_sat_f64_u 2007; CHECK-NEXT: i32x4.splat 2008; CHECK-NEXT: local.get 0 2009; CHECK-NEXT: f64x2.extract_lane 1 2010; CHECK-NEXT: i32.trunc_sat_f64_u 2011; CHECK-NEXT: i32x4.replace_lane 1 2012; CHECK-NEXT: v128.const 65535, 65535, 0, 0 2013; CHECK-NEXT: i32x4.min_u 2014; CHECK-NEXT: local.get 0 2015; CHECK-NEXT: i8x16.shuffle 0, 1, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 2016; CHECK-NEXT: # fallthrough-return 2017entry: 2018 %conv = fptoui <2 x double> %x to <2 x i32> 2019 %spec.store.select = call <2 x i32> @llvm.umin.v2i32(<2 x i32> %conv, <2 x i32> <i32 65535, i32 65535>) 2020 %conv6 = trunc <2 x i32> %spec.store.select to <2 x i16> 2021 ret <2 x i16> %conv6 2022} 2023 2024define <2 x i16> @ustest_f64i16_mm(<2 x double> %x) { 2025; CHECK-LABEL: ustest_f64i16_mm: 2026; CHECK: .functype ustest_f64i16_mm (v128) -> (v128) 2027; CHECK-NEXT: # %bb.0: # %entry 2028; CHECK-NEXT: local.get 0 2029; CHECK-NEXT: f64x2.extract_lane 0 2030; CHECK-NEXT: i32.trunc_sat_f64_s 2031; CHECK-NEXT: i32x4.splat 2032; CHECK-NEXT: local.get 0 2033; CHECK-NEXT: f64x2.extract_lane 1 2034; CHECK-NEXT: i32.trunc_sat_f64_s 2035; CHECK-NEXT: i32x4.replace_lane 1 2036; CHECK-NEXT: v128.const 65535, 65535, 0, 0 2037; CHECK-NEXT: i32x4.min_s 2038; CHECK-NEXT: v128.const 0, 0, 0, 0 2039; CHECK-NEXT: i32x4.max_s 2040; CHECK-NEXT: local.get 0 2041; CHECK-NEXT: i8x16.shuffle 0, 1, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 2042; CHECK-NEXT: # fallthrough-return 2043entry: 2044 %conv = fptosi <2 x double> %x to <2 x i32> 2045 %spec.store.select = call <2 x i32> @llvm.smin.v2i32(<2 x i32> %conv, <2 x i32> <i32 65535, i32 65535>) 2046 %spec.store.select7 = call <2 x i32> @llvm.smax.v2i32(<2 x i32> %spec.store.select, <2 x i32> zeroinitializer) 2047 %conv6 = trunc <2 x i32> %spec.store.select7 to <2 x i16> 2048 ret <2 x i16> %conv6 2049} 2050 2051define <4 x i16> @stest_f32i16_mm(<4 x float> %x) { 2052; CHECK-LABEL: stest_f32i16_mm: 2053; CHECK: .functype stest_f32i16_mm (v128) -> (v128) 2054; CHECK-NEXT: # %bb.0: # %entry 2055; CHECK-NEXT: local.get 0 2056; CHECK-NEXT: i32x4.trunc_sat_f32x4_s 2057; CHECK-NEXT: v128.const 32767, 32767, 32767, 32767 2058; CHECK-NEXT: i32x4.min_s 2059; CHECK-NEXT: v128.const -32768, -32768, -32768, -32768 2060; CHECK-NEXT: i32x4.max_s 2061; CHECK-NEXT: local.get 0 2062; CHECK-NEXT: i8x16.shuffle 0, 1, 4, 5, 8, 9, 12, 13, 0, 0, 0, 0, 0, 0, 0, 0 2063; CHECK-NEXT: # fallthrough-return 2064entry: 2065 %conv = fptosi <4 x float> %x to <4 x i32> 2066 %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>) 2067 %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>) 2068 %conv6 = trunc <4 x i32> %spec.store.select7 to <4 x i16> 2069 ret <4 x i16> %conv6 2070} 2071 2072define <4 x i16> @utest_f32i16_mm(<4 x float> %x) { 2073; CHECK-LABEL: utest_f32i16_mm: 2074; CHECK: .functype utest_f32i16_mm (v128) -> (v128) 2075; CHECK-NEXT: # %bb.0: # %entry 2076; CHECK-NEXT: local.get 0 2077; CHECK-NEXT: i32x4.trunc_sat_f32x4_u 2078; CHECK-NEXT: v128.const 65535, 65535, 65535, 65535 2079; CHECK-NEXT: i32x4.min_u 2080; CHECK-NEXT: local.get 0 2081; CHECK-NEXT: i8x16.shuffle 0, 1, 4, 5, 8, 9, 12, 13, 0, 0, 0, 0, 0, 0, 0, 0 2082; CHECK-NEXT: # fallthrough-return 2083entry: 2084 %conv = fptoui <4 x float> %x to <4 x i32> 2085 %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>) 2086 %conv6 = trunc <4 x i32> %spec.store.select to <4 x i16> 2087 ret <4 x i16> %conv6 2088} 2089 2090define <4 x i16> @ustest_f32i16_mm(<4 x float> %x) { 2091; CHECK-LABEL: ustest_f32i16_mm: 2092; CHECK: .functype ustest_f32i16_mm (v128) -> (v128) 2093; CHECK-NEXT: # %bb.0: # %entry 2094; CHECK-NEXT: local.get 0 2095; CHECK-NEXT: i32x4.trunc_sat_f32x4_s 2096; CHECK-NEXT: v128.const 65535, 65535, 65535, 65535 2097; CHECK-NEXT: i32x4.min_s 2098; CHECK-NEXT: v128.const 0, 0, 0, 0 2099; CHECK-NEXT: i32x4.max_s 2100; CHECK-NEXT: local.get 0 2101; CHECK-NEXT: i8x16.shuffle 0, 1, 4, 5, 8, 9, 12, 13, 0, 0, 0, 0, 0, 0, 0, 0 2102; CHECK-NEXT: # fallthrough-return 2103entry: 2104 %conv = fptosi <4 x float> %x to <4 x i32> 2105 %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>) 2106 %spec.store.select7 = call <4 x i32> @llvm.smax.v4i32(<4 x i32> %spec.store.select, <4 x i32> zeroinitializer) 2107 %conv6 = trunc <4 x i32> %spec.store.select7 to <4 x i16> 2108 ret <4 x i16> %conv6 2109} 2110 2111define <8 x i16> @stest_f16i16_mm(<8 x half> %x) { 2112; CHECK-LABEL: stest_f16i16_mm: 2113; CHECK: .functype stest_f16i16_mm (f32, f32, f32, f32, f32, f32, f32, f32) -> (v128) 2114; CHECK-NEXT: .local v128, v128, v128 2115; CHECK-NEXT: # %bb.0: # %entry 2116; CHECK-NEXT: local.get 5 2117; CHECK-NEXT: call __truncsfhf2 2118; CHECK-NEXT: call __extendhfsf2 2119; CHECK-NEXT: local.set 5 2120; CHECK-NEXT: local.get 4 2121; CHECK-NEXT: call __truncsfhf2 2122; CHECK-NEXT: call __extendhfsf2 2123; CHECK-NEXT: local.set 4 2124; CHECK-NEXT: local.get 6 2125; CHECK-NEXT: call __truncsfhf2 2126; CHECK-NEXT: call __extendhfsf2 2127; CHECK-NEXT: local.set 6 2128; CHECK-NEXT: local.get 7 2129; CHECK-NEXT: call __truncsfhf2 2130; CHECK-NEXT: call __extendhfsf2 2131; CHECK-NEXT: local.set 7 2132; CHECK-NEXT: local.get 1 2133; CHECK-NEXT: call __truncsfhf2 2134; CHECK-NEXT: call __extendhfsf2 2135; CHECK-NEXT: local.set 1 2136; CHECK-NEXT: local.get 0 2137; CHECK-NEXT: call __truncsfhf2 2138; CHECK-NEXT: call __extendhfsf2 2139; CHECK-NEXT: i32.trunc_sat_f32_s 2140; CHECK-NEXT: i32x4.splat 2141; CHECK-NEXT: local.get 1 2142; CHECK-NEXT: i32.trunc_sat_f32_s 2143; CHECK-NEXT: i32x4.replace_lane 1 2144; CHECK-NEXT: local.get 2 2145; CHECK-NEXT: call __truncsfhf2 2146; CHECK-NEXT: call __extendhfsf2 2147; CHECK-NEXT: i32.trunc_sat_f32_s 2148; CHECK-NEXT: i32x4.replace_lane 2 2149; CHECK-NEXT: local.get 3 2150; CHECK-NEXT: call __truncsfhf2 2151; CHECK-NEXT: call __extendhfsf2 2152; CHECK-NEXT: i32.trunc_sat_f32_s 2153; CHECK-NEXT: i32x4.replace_lane 3 2154; CHECK-NEXT: v128.const 32767, 32767, 32767, 32767 2155; CHECK-NEXT: local.tee 8 2156; CHECK-NEXT: i32x4.min_s 2157; CHECK-NEXT: v128.const -32768, -32768, -32768, -32768 2158; CHECK-NEXT: local.tee 9 2159; CHECK-NEXT: i32x4.max_s 2160; CHECK-NEXT: v128.const 65535, 65535, 65535, 65535 2161; CHECK-NEXT: local.tee 10 2162; CHECK-NEXT: v128.and 2163; CHECK-NEXT: local.get 4 2164; CHECK-NEXT: i32.trunc_sat_f32_s 2165; CHECK-NEXT: i32x4.splat 2166; CHECK-NEXT: local.get 5 2167; CHECK-NEXT: i32.trunc_sat_f32_s 2168; CHECK-NEXT: i32x4.replace_lane 1 2169; CHECK-NEXT: local.get 6 2170; CHECK-NEXT: i32.trunc_sat_f32_s 2171; CHECK-NEXT: i32x4.replace_lane 2 2172; CHECK-NEXT: local.get 7 2173; CHECK-NEXT: i32.trunc_sat_f32_s 2174; CHECK-NEXT: i32x4.replace_lane 3 2175; CHECK-NEXT: local.get 8 2176; CHECK-NEXT: i32x4.min_s 2177; CHECK-NEXT: local.get 9 2178; CHECK-NEXT: i32x4.max_s 2179; CHECK-NEXT: local.get 10 2180; CHECK-NEXT: v128.and 2181; CHECK-NEXT: i16x8.narrow_i32x4_u 2182; CHECK-NEXT: # fallthrough-return 2183entry: 2184 %conv = fptosi <8 x half> %x to <8 x i32> 2185 %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>) 2186 %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>) 2187 %conv6 = trunc <8 x i32> %spec.store.select7 to <8 x i16> 2188 ret <8 x i16> %conv6 2189} 2190 2191define <8 x i16> @utesth_f16i16_mm(<8 x half> %x) { 2192; CHECK-LABEL: utesth_f16i16_mm: 2193; CHECK: .functype utesth_f16i16_mm (f32, f32, f32, f32, f32, f32, f32, f32) -> (v128) 2194; CHECK-NEXT: .local v128 2195; CHECK-NEXT: # %bb.0: # %entry 2196; CHECK-NEXT: local.get 5 2197; CHECK-NEXT: call __truncsfhf2 2198; CHECK-NEXT: call __extendhfsf2 2199; CHECK-NEXT: local.set 5 2200; CHECK-NEXT: local.get 4 2201; CHECK-NEXT: call __truncsfhf2 2202; CHECK-NEXT: call __extendhfsf2 2203; CHECK-NEXT: local.set 4 2204; CHECK-NEXT: local.get 6 2205; CHECK-NEXT: call __truncsfhf2 2206; CHECK-NEXT: call __extendhfsf2 2207; CHECK-NEXT: local.set 6 2208; CHECK-NEXT: local.get 7 2209; CHECK-NEXT: call __truncsfhf2 2210; CHECK-NEXT: call __extendhfsf2 2211; CHECK-NEXT: local.set 7 2212; CHECK-NEXT: local.get 1 2213; CHECK-NEXT: call __truncsfhf2 2214; CHECK-NEXT: call __extendhfsf2 2215; CHECK-NEXT: local.set 1 2216; CHECK-NEXT: local.get 0 2217; CHECK-NEXT: call __truncsfhf2 2218; CHECK-NEXT: call __extendhfsf2 2219; CHECK-NEXT: i32.trunc_sat_f32_u 2220; CHECK-NEXT: i32x4.splat 2221; CHECK-NEXT: local.get 1 2222; CHECK-NEXT: i32.trunc_sat_f32_u 2223; CHECK-NEXT: i32x4.replace_lane 1 2224; CHECK-NEXT: local.get 2 2225; CHECK-NEXT: call __truncsfhf2 2226; CHECK-NEXT: call __extendhfsf2 2227; CHECK-NEXT: i32.trunc_sat_f32_u 2228; CHECK-NEXT: i32x4.replace_lane 2 2229; CHECK-NEXT: local.get 3 2230; CHECK-NEXT: call __truncsfhf2 2231; CHECK-NEXT: call __extendhfsf2 2232; CHECK-NEXT: i32.trunc_sat_f32_u 2233; CHECK-NEXT: i32x4.replace_lane 3 2234; CHECK-NEXT: v128.const 65535, 65535, 65535, 65535 2235; CHECK-NEXT: local.tee 8 2236; CHECK-NEXT: i32x4.min_u 2237; CHECK-NEXT: local.get 4 2238; CHECK-NEXT: i32.trunc_sat_f32_u 2239; CHECK-NEXT: i32x4.splat 2240; CHECK-NEXT: local.get 5 2241; CHECK-NEXT: i32.trunc_sat_f32_u 2242; CHECK-NEXT: i32x4.replace_lane 1 2243; CHECK-NEXT: local.get 6 2244; CHECK-NEXT: i32.trunc_sat_f32_u 2245; CHECK-NEXT: i32x4.replace_lane 2 2246; CHECK-NEXT: local.get 7 2247; CHECK-NEXT: i32.trunc_sat_f32_u 2248; CHECK-NEXT: i32x4.replace_lane 3 2249; CHECK-NEXT: local.get 8 2250; CHECK-NEXT: i32x4.min_u 2251; CHECK-NEXT: i16x8.narrow_i32x4_u 2252; CHECK-NEXT: # fallthrough-return 2253entry: 2254 %conv = fptoui <8 x half> %x to <8 x i32> 2255 %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>) 2256 %conv6 = trunc <8 x i32> %spec.store.select to <8 x i16> 2257 ret <8 x i16> %conv6 2258} 2259 2260define <8 x i16> @ustest_f16i16_mm(<8 x half> %x) { 2261; CHECK-LABEL: ustest_f16i16_mm: 2262; CHECK: .functype ustest_f16i16_mm (f32, f32, f32, f32, f32, f32, f32, f32) -> (v128) 2263; CHECK-NEXT: .local v128, v128 2264; CHECK-NEXT: # %bb.0: # %entry 2265; CHECK-NEXT: local.get 5 2266; CHECK-NEXT: call __truncsfhf2 2267; CHECK-NEXT: call __extendhfsf2 2268; CHECK-NEXT: local.set 5 2269; CHECK-NEXT: local.get 4 2270; CHECK-NEXT: call __truncsfhf2 2271; CHECK-NEXT: call __extendhfsf2 2272; CHECK-NEXT: local.set 4 2273; CHECK-NEXT: local.get 6 2274; CHECK-NEXT: call __truncsfhf2 2275; CHECK-NEXT: call __extendhfsf2 2276; CHECK-NEXT: local.set 6 2277; CHECK-NEXT: local.get 7 2278; CHECK-NEXT: call __truncsfhf2 2279; CHECK-NEXT: call __extendhfsf2 2280; CHECK-NEXT: local.set 7 2281; CHECK-NEXT: local.get 1 2282; CHECK-NEXT: call __truncsfhf2 2283; CHECK-NEXT: call __extendhfsf2 2284; CHECK-NEXT: local.set 1 2285; CHECK-NEXT: local.get 0 2286; CHECK-NEXT: call __truncsfhf2 2287; CHECK-NEXT: call __extendhfsf2 2288; CHECK-NEXT: i32.trunc_sat_f32_s 2289; CHECK-NEXT: i32x4.splat 2290; CHECK-NEXT: local.get 1 2291; CHECK-NEXT: i32.trunc_sat_f32_s 2292; CHECK-NEXT: i32x4.replace_lane 1 2293; CHECK-NEXT: local.get 2 2294; CHECK-NEXT: call __truncsfhf2 2295; CHECK-NEXT: call __extendhfsf2 2296; CHECK-NEXT: i32.trunc_sat_f32_s 2297; CHECK-NEXT: i32x4.replace_lane 2 2298; CHECK-NEXT: local.get 3 2299; CHECK-NEXT: call __truncsfhf2 2300; CHECK-NEXT: call __extendhfsf2 2301; CHECK-NEXT: i32.trunc_sat_f32_s 2302; CHECK-NEXT: i32x4.replace_lane 3 2303; CHECK-NEXT: v128.const 65535, 65535, 65535, 65535 2304; CHECK-NEXT: local.tee 8 2305; CHECK-NEXT: i32x4.min_s 2306; CHECK-NEXT: v128.const 0, 0, 0, 0 2307; CHECK-NEXT: local.tee 9 2308; CHECK-NEXT: i32x4.max_s 2309; CHECK-NEXT: local.get 4 2310; CHECK-NEXT: i32.trunc_sat_f32_s 2311; CHECK-NEXT: i32x4.splat 2312; CHECK-NEXT: local.get 5 2313; CHECK-NEXT: i32.trunc_sat_f32_s 2314; CHECK-NEXT: i32x4.replace_lane 1 2315; CHECK-NEXT: local.get 6 2316; CHECK-NEXT: i32.trunc_sat_f32_s 2317; CHECK-NEXT: i32x4.replace_lane 2 2318; CHECK-NEXT: local.get 7 2319; CHECK-NEXT: i32.trunc_sat_f32_s 2320; CHECK-NEXT: i32x4.replace_lane 3 2321; CHECK-NEXT: local.get 8 2322; CHECK-NEXT: i32x4.min_s 2323; CHECK-NEXT: local.get 9 2324; CHECK-NEXT: i32x4.max_s 2325; CHECK-NEXT: i16x8.narrow_i32x4_u 2326; CHECK-NEXT: # fallthrough-return 2327entry: 2328 %conv = fptosi <8 x half> %x to <8 x i32> 2329 %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>) 2330 %spec.store.select7 = call <8 x i32> @llvm.smax.v8i32(<8 x i32> %spec.store.select, <8 x i32> zeroinitializer) 2331 %conv6 = trunc <8 x i32> %spec.store.select7 to <8 x i16> 2332 ret <8 x i16> %conv6 2333} 2334 2335; i64 saturate 2336 2337define <2 x i64> @stest_f64i64_mm(<2 x double> %x) { 2338; CHECK-LABEL: stest_f64i64_mm: 2339; CHECK: .functype stest_f64i64_mm (v128) -> (v128) 2340; CHECK-NEXT: .local i32, i64, i64, i64, i64 2341; CHECK-NEXT: # %bb.0: # %entry 2342; CHECK-NEXT: global.get __stack_pointer 2343; CHECK-NEXT: i32.const 32 2344; CHECK-NEXT: i32.sub 2345; CHECK-NEXT: local.tee 1 2346; CHECK-NEXT: global.set __stack_pointer 2347; CHECK-NEXT: local.get 1 2348; CHECK-NEXT: i32.const 16 2349; CHECK-NEXT: i32.add 2350; CHECK-NEXT: local.get 0 2351; CHECK-NEXT: f64x2.extract_lane 1 2352; CHECK-NEXT: call __fixdfti 2353; CHECK-NEXT: local.get 1 2354; CHECK-NEXT: local.get 0 2355; CHECK-NEXT: f64x2.extract_lane 0 2356; CHECK-NEXT: call __fixdfti 2357; CHECK-NEXT: local.get 1 2358; CHECK-NEXT: i32.const 16 2359; CHECK-NEXT: i32.add 2360; CHECK-NEXT: i32.const 8 2361; CHECK-NEXT: i32.add 2362; CHECK-NEXT: i64.load 0 2363; CHECK-NEXT: local.set 2 2364; CHECK-NEXT: local.get 1 2365; CHECK-NEXT: i64.load 16 2366; CHECK-NEXT: local.set 3 2367; CHECK-NEXT: local.get 1 2368; CHECK-NEXT: i32.const 8 2369; CHECK-NEXT: i32.add 2370; CHECK-NEXT: i64.load 0 2371; CHECK-NEXT: local.set 4 2372; CHECK-NEXT: local.get 1 2373; CHECK-NEXT: i64.load 0 2374; CHECK-NEXT: local.set 5 2375; CHECK-NEXT: local.get 1 2376; CHECK-NEXT: i32.const 32 2377; CHECK-NEXT: i32.add 2378; CHECK-NEXT: global.set __stack_pointer 2379; CHECK-NEXT: local.get 5 2380; CHECK-NEXT: i64.const 9223372036854775807 2381; CHECK-NEXT: local.get 5 2382; CHECK-NEXT: i64.const 9223372036854775807 2383; CHECK-NEXT: i64.lt_u 2384; CHECK-NEXT: i64.select 2385; CHECK-NEXT: local.get 5 2386; CHECK-NEXT: i64.const 9223372036854775807 2387; CHECK-NEXT: local.get 4 2388; CHECK-NEXT: i64.const 0 2389; CHECK-NEXT: i64.lt_s 2390; CHECK-NEXT: i64.select 2391; CHECK-NEXT: local.get 4 2392; CHECK-NEXT: i64.eqz 2393; CHECK-NEXT: i64.select 2394; CHECK-NEXT: local.tee 5 2395; CHECK-NEXT: i64.const -9223372036854775808 2396; CHECK-NEXT: local.get 5 2397; CHECK-NEXT: i64.const -9223372036854775808 2398; CHECK-NEXT: i64.gt_u 2399; CHECK-NEXT: i64.select 2400; CHECK-NEXT: local.get 5 2401; CHECK-NEXT: i64.const -9223372036854775808 2402; CHECK-NEXT: local.get 4 2403; CHECK-NEXT: local.get 4 2404; CHECK-NEXT: i64.const 63 2405; CHECK-NEXT: i64.shr_s 2406; CHECK-NEXT: i64.and 2407; CHECK-NEXT: local.tee 4 2408; CHECK-NEXT: i64.const -1 2409; CHECK-NEXT: i64.gt_s 2410; CHECK-NEXT: i64.select 2411; CHECK-NEXT: local.get 4 2412; CHECK-NEXT: i64.const -1 2413; CHECK-NEXT: i64.eq 2414; CHECK-NEXT: i64.select 2415; CHECK-NEXT: i64x2.splat 2416; CHECK-NEXT: local.get 3 2417; CHECK-NEXT: i64.const 9223372036854775807 2418; CHECK-NEXT: local.get 3 2419; CHECK-NEXT: i64.const 9223372036854775807 2420; CHECK-NEXT: i64.lt_u 2421; CHECK-NEXT: i64.select 2422; CHECK-NEXT: local.get 3 2423; CHECK-NEXT: i64.const 9223372036854775807 2424; CHECK-NEXT: local.get 2 2425; CHECK-NEXT: i64.const 0 2426; CHECK-NEXT: i64.lt_s 2427; CHECK-NEXT: i64.select 2428; CHECK-NEXT: local.get 2 2429; CHECK-NEXT: i64.eqz 2430; CHECK-NEXT: i64.select 2431; CHECK-NEXT: local.tee 4 2432; CHECK-NEXT: i64.const -9223372036854775808 2433; CHECK-NEXT: local.get 4 2434; CHECK-NEXT: i64.const -9223372036854775808 2435; CHECK-NEXT: i64.gt_u 2436; CHECK-NEXT: i64.select 2437; CHECK-NEXT: local.get 4 2438; CHECK-NEXT: i64.const -9223372036854775808 2439; CHECK-NEXT: local.get 2 2440; CHECK-NEXT: local.get 2 2441; CHECK-NEXT: i64.const 63 2442; CHECK-NEXT: i64.shr_s 2443; CHECK-NEXT: i64.and 2444; CHECK-NEXT: local.tee 2 2445; CHECK-NEXT: i64.const -1 2446; CHECK-NEXT: i64.gt_s 2447; CHECK-NEXT: i64.select 2448; CHECK-NEXT: local.get 2 2449; CHECK-NEXT: i64.const -1 2450; CHECK-NEXT: i64.eq 2451; CHECK-NEXT: i64.select 2452; CHECK-NEXT: i64x2.replace_lane 1 2453; CHECK-NEXT: # fallthrough-return 2454entry: 2455 %conv = fptosi <2 x double> %x to <2 x i128> 2456 %spec.store.select = call <2 x i128> @llvm.smin.v2i128(<2 x i128> %conv, <2 x i128> <i128 9223372036854775807, i128 9223372036854775807>) 2457 %spec.store.select7 = call <2 x i128> @llvm.smax.v2i128(<2 x i128> %spec.store.select, <2 x i128> <i128 -9223372036854775808, i128 -9223372036854775808>) 2458 %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64> 2459 ret <2 x i64> %conv6 2460} 2461 2462define <2 x i64> @utest_f64i64_mm(<2 x double> %x) { 2463; CHECK-LABEL: utest_f64i64_mm: 2464; CHECK: .functype utest_f64i64_mm (v128) -> (v128) 2465; CHECK-NEXT: .local i32, i64, i64, i64, i64 2466; CHECK-NEXT: # %bb.0: # %entry 2467; CHECK-NEXT: global.get __stack_pointer 2468; CHECK-NEXT: i32.const 32 2469; CHECK-NEXT: i32.sub 2470; CHECK-NEXT: local.tee 1 2471; CHECK-NEXT: global.set __stack_pointer 2472; CHECK-NEXT: local.get 1 2473; CHECK-NEXT: i32.const 16 2474; CHECK-NEXT: i32.add 2475; CHECK-NEXT: local.get 0 2476; CHECK-NEXT: f64x2.extract_lane 1 2477; CHECK-NEXT: call __fixunsdfti 2478; CHECK-NEXT: local.get 1 2479; CHECK-NEXT: local.get 0 2480; CHECK-NEXT: f64x2.extract_lane 0 2481; CHECK-NEXT: call __fixunsdfti 2482; CHECK-NEXT: local.get 1 2483; CHECK-NEXT: i32.const 16 2484; CHECK-NEXT: i32.add 2485; CHECK-NEXT: i32.const 8 2486; CHECK-NEXT: i32.add 2487; CHECK-NEXT: i64.load 0 2488; CHECK-NEXT: local.set 2 2489; CHECK-NEXT: local.get 1 2490; CHECK-NEXT: i64.load 16 2491; CHECK-NEXT: local.set 3 2492; CHECK-NEXT: local.get 1 2493; CHECK-NEXT: i32.const 8 2494; CHECK-NEXT: i32.add 2495; CHECK-NEXT: i64.load 0 2496; CHECK-NEXT: local.set 4 2497; CHECK-NEXT: local.get 1 2498; CHECK-NEXT: i64.load 0 2499; CHECK-NEXT: local.set 5 2500; CHECK-NEXT: local.get 1 2501; CHECK-NEXT: i32.const 32 2502; CHECK-NEXT: i32.add 2503; CHECK-NEXT: global.set __stack_pointer 2504; CHECK-NEXT: i64.const 0 2505; CHECK-NEXT: local.get 5 2506; CHECK-NEXT: i64.const 0 2507; CHECK-NEXT: local.get 4 2508; CHECK-NEXT: i64.eqz 2509; CHECK-NEXT: i64.select 2510; CHECK-NEXT: local.get 4 2511; CHECK-NEXT: i64.const 1 2512; CHECK-NEXT: i64.eq 2513; CHECK-NEXT: i64.select 2514; CHECK-NEXT: i64x2.splat 2515; CHECK-NEXT: i64.const 0 2516; CHECK-NEXT: local.get 3 2517; CHECK-NEXT: i64.const 0 2518; CHECK-NEXT: local.get 2 2519; CHECK-NEXT: i64.eqz 2520; CHECK-NEXT: i64.select 2521; CHECK-NEXT: local.get 2 2522; CHECK-NEXT: i64.const 1 2523; CHECK-NEXT: i64.eq 2524; CHECK-NEXT: i64.select 2525; CHECK-NEXT: i64x2.replace_lane 1 2526; CHECK-NEXT: # fallthrough-return 2527entry: 2528 %conv = fptoui <2 x double> %x to <2 x i128> 2529 %spec.store.select = call <2 x i128> @llvm.umin.v2i128(<2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>) 2530 %conv6 = trunc <2 x i128> %spec.store.select to <2 x i64> 2531 ret <2 x i64> %conv6 2532} 2533 2534define <2 x i64> @ustest_f64i64_mm(<2 x double> %x) { 2535; CHECK-LABEL: ustest_f64i64_mm: 2536; CHECK: .functype ustest_f64i64_mm (v128) -> (v128) 2537; CHECK-NEXT: .local i32, i64, i64, i64, i64 2538; CHECK-NEXT: # %bb.0: # %entry 2539; CHECK-NEXT: global.get __stack_pointer 2540; CHECK-NEXT: i32.const 32 2541; CHECK-NEXT: i32.sub 2542; CHECK-NEXT: local.tee 1 2543; CHECK-NEXT: global.set __stack_pointer 2544; CHECK-NEXT: local.get 1 2545; CHECK-NEXT: i32.const 16 2546; CHECK-NEXT: i32.add 2547; CHECK-NEXT: local.get 0 2548; CHECK-NEXT: f64x2.extract_lane 1 2549; CHECK-NEXT: call __fixdfti 2550; CHECK-NEXT: local.get 1 2551; CHECK-NEXT: local.get 0 2552; CHECK-NEXT: f64x2.extract_lane 0 2553; CHECK-NEXT: call __fixdfti 2554; CHECK-NEXT: local.get 1 2555; CHECK-NEXT: i32.const 16 2556; CHECK-NEXT: i32.add 2557; CHECK-NEXT: i32.const 8 2558; CHECK-NEXT: i32.add 2559; CHECK-NEXT: i64.load 0 2560; CHECK-NEXT: local.set 2 2561; CHECK-NEXT: local.get 1 2562; CHECK-NEXT: i64.load 16 2563; CHECK-NEXT: local.set 3 2564; CHECK-NEXT: local.get 1 2565; CHECK-NEXT: i32.const 8 2566; CHECK-NEXT: i32.add 2567; CHECK-NEXT: i64.load 0 2568; CHECK-NEXT: local.set 4 2569; CHECK-NEXT: local.get 1 2570; CHECK-NEXT: i64.load 0 2571; CHECK-NEXT: local.set 5 2572; CHECK-NEXT: local.get 1 2573; CHECK-NEXT: i32.const 32 2574; CHECK-NEXT: i32.add 2575; CHECK-NEXT: global.set __stack_pointer 2576; CHECK-NEXT: i64.const 0 2577; CHECK-NEXT: local.get 5 2578; CHECK-NEXT: i64.const 0 2579; CHECK-NEXT: local.get 4 2580; CHECK-NEXT: i64.const 1 2581; CHECK-NEXT: i64.lt_s 2582; CHECK-NEXT: local.tee 1 2583; CHECK-NEXT: i64.select 2584; CHECK-NEXT: local.get 4 2585; CHECK-NEXT: i64.const 1 2586; CHECK-NEXT: i64.eq 2587; CHECK-NEXT: i64.select 2588; CHECK-NEXT: local.tee 5 2589; CHECK-NEXT: local.get 5 2590; CHECK-NEXT: i64.const 0 2591; CHECK-NEXT: local.get 4 2592; CHECK-NEXT: i64.const 1 2593; CHECK-NEXT: local.get 1 2594; CHECK-NEXT: i64.select 2595; CHECK-NEXT: local.tee 4 2596; CHECK-NEXT: i64.const 0 2597; CHECK-NEXT: i64.gt_s 2598; CHECK-NEXT: i64.select 2599; CHECK-NEXT: local.get 4 2600; CHECK-NEXT: i64.eqz 2601; CHECK-NEXT: i64.select 2602; CHECK-NEXT: i64x2.splat 2603; CHECK-NEXT: i64.const 0 2604; CHECK-NEXT: local.get 3 2605; CHECK-NEXT: i64.const 0 2606; CHECK-NEXT: local.get 2 2607; CHECK-NEXT: i64.const 1 2608; CHECK-NEXT: i64.lt_s 2609; CHECK-NEXT: local.tee 1 2610; CHECK-NEXT: i64.select 2611; CHECK-NEXT: local.get 2 2612; CHECK-NEXT: i64.const 1 2613; CHECK-NEXT: i64.eq 2614; CHECK-NEXT: i64.select 2615; CHECK-NEXT: local.tee 4 2616; CHECK-NEXT: local.get 4 2617; CHECK-NEXT: i64.const 0 2618; CHECK-NEXT: local.get 2 2619; CHECK-NEXT: i64.const 1 2620; CHECK-NEXT: local.get 1 2621; CHECK-NEXT: i64.select 2622; CHECK-NEXT: local.tee 2 2623; CHECK-NEXT: i64.const 0 2624; CHECK-NEXT: i64.gt_s 2625; CHECK-NEXT: i64.select 2626; CHECK-NEXT: local.get 2 2627; CHECK-NEXT: i64.eqz 2628; CHECK-NEXT: i64.select 2629; CHECK-NEXT: i64x2.replace_lane 1 2630; CHECK-NEXT: # fallthrough-return 2631entry: 2632 %conv = fptosi <2 x double> %x to <2 x i128> 2633 %spec.store.select = call <2 x i128> @llvm.smin.v2i128(<2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>) 2634 %spec.store.select7 = call <2 x i128> @llvm.smax.v2i128(<2 x i128> %spec.store.select, <2 x i128> zeroinitializer) 2635 %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64> 2636 ret <2 x i64> %conv6 2637} 2638 2639define <2 x i64> @stest_f32i64_mm(<2 x float> %x) { 2640; CHECK-LABEL: stest_f32i64_mm: 2641; CHECK: .functype stest_f32i64_mm (v128) -> (v128) 2642; CHECK-NEXT: .local i32, i64, i64, i64, i64 2643; CHECK-NEXT: # %bb.0: # %entry 2644; CHECK-NEXT: global.get __stack_pointer 2645; CHECK-NEXT: i32.const 32 2646; CHECK-NEXT: i32.sub 2647; CHECK-NEXT: local.tee 1 2648; CHECK-NEXT: global.set __stack_pointer 2649; CHECK-NEXT: local.get 1 2650; CHECK-NEXT: i32.const 16 2651; CHECK-NEXT: i32.add 2652; CHECK-NEXT: local.get 0 2653; CHECK-NEXT: f32x4.extract_lane 1 2654; CHECK-NEXT: call __fixsfti 2655; CHECK-NEXT: local.get 1 2656; CHECK-NEXT: local.get 0 2657; CHECK-NEXT: f32x4.extract_lane 0 2658; CHECK-NEXT: call __fixsfti 2659; CHECK-NEXT: local.get 1 2660; CHECK-NEXT: i32.const 16 2661; CHECK-NEXT: i32.add 2662; CHECK-NEXT: i32.const 8 2663; CHECK-NEXT: i32.add 2664; CHECK-NEXT: i64.load 0 2665; CHECK-NEXT: local.set 2 2666; CHECK-NEXT: local.get 1 2667; CHECK-NEXT: i64.load 16 2668; CHECK-NEXT: local.set 3 2669; CHECK-NEXT: local.get 1 2670; CHECK-NEXT: i32.const 8 2671; CHECK-NEXT: i32.add 2672; CHECK-NEXT: i64.load 0 2673; CHECK-NEXT: local.set 4 2674; CHECK-NEXT: local.get 1 2675; CHECK-NEXT: i64.load 0 2676; CHECK-NEXT: local.set 5 2677; CHECK-NEXT: local.get 1 2678; CHECK-NEXT: i32.const 32 2679; CHECK-NEXT: i32.add 2680; CHECK-NEXT: global.set __stack_pointer 2681; CHECK-NEXT: local.get 5 2682; CHECK-NEXT: i64.const 9223372036854775807 2683; CHECK-NEXT: local.get 5 2684; CHECK-NEXT: i64.const 9223372036854775807 2685; CHECK-NEXT: i64.lt_u 2686; CHECK-NEXT: i64.select 2687; CHECK-NEXT: local.get 5 2688; CHECK-NEXT: i64.const 9223372036854775807 2689; CHECK-NEXT: local.get 4 2690; CHECK-NEXT: i64.const 0 2691; CHECK-NEXT: i64.lt_s 2692; CHECK-NEXT: i64.select 2693; CHECK-NEXT: local.get 4 2694; CHECK-NEXT: i64.eqz 2695; CHECK-NEXT: i64.select 2696; CHECK-NEXT: local.tee 5 2697; CHECK-NEXT: i64.const -9223372036854775808 2698; CHECK-NEXT: local.get 5 2699; CHECK-NEXT: i64.const -9223372036854775808 2700; CHECK-NEXT: i64.gt_u 2701; CHECK-NEXT: i64.select 2702; CHECK-NEXT: local.get 5 2703; CHECK-NEXT: i64.const -9223372036854775808 2704; CHECK-NEXT: local.get 4 2705; CHECK-NEXT: local.get 4 2706; CHECK-NEXT: i64.const 63 2707; CHECK-NEXT: i64.shr_s 2708; CHECK-NEXT: i64.and 2709; CHECK-NEXT: local.tee 4 2710; CHECK-NEXT: i64.const -1 2711; CHECK-NEXT: i64.gt_s 2712; CHECK-NEXT: i64.select 2713; CHECK-NEXT: local.get 4 2714; CHECK-NEXT: i64.const -1 2715; CHECK-NEXT: i64.eq 2716; CHECK-NEXT: i64.select 2717; CHECK-NEXT: i64x2.splat 2718; CHECK-NEXT: local.get 3 2719; CHECK-NEXT: i64.const 9223372036854775807 2720; CHECK-NEXT: local.get 3 2721; CHECK-NEXT: i64.const 9223372036854775807 2722; CHECK-NEXT: i64.lt_u 2723; CHECK-NEXT: i64.select 2724; CHECK-NEXT: local.get 3 2725; CHECK-NEXT: i64.const 9223372036854775807 2726; CHECK-NEXT: local.get 2 2727; CHECK-NEXT: i64.const 0 2728; CHECK-NEXT: i64.lt_s 2729; CHECK-NEXT: i64.select 2730; CHECK-NEXT: local.get 2 2731; CHECK-NEXT: i64.eqz 2732; CHECK-NEXT: i64.select 2733; CHECK-NEXT: local.tee 4 2734; CHECK-NEXT: i64.const -9223372036854775808 2735; CHECK-NEXT: local.get 4 2736; CHECK-NEXT: i64.const -9223372036854775808 2737; CHECK-NEXT: i64.gt_u 2738; CHECK-NEXT: i64.select 2739; CHECK-NEXT: local.get 4 2740; CHECK-NEXT: i64.const -9223372036854775808 2741; CHECK-NEXT: local.get 2 2742; CHECK-NEXT: local.get 2 2743; CHECK-NEXT: i64.const 63 2744; CHECK-NEXT: i64.shr_s 2745; CHECK-NEXT: i64.and 2746; CHECK-NEXT: local.tee 2 2747; CHECK-NEXT: i64.const -1 2748; CHECK-NEXT: i64.gt_s 2749; CHECK-NEXT: i64.select 2750; CHECK-NEXT: local.get 2 2751; CHECK-NEXT: i64.const -1 2752; CHECK-NEXT: i64.eq 2753; CHECK-NEXT: i64.select 2754; CHECK-NEXT: i64x2.replace_lane 1 2755; CHECK-NEXT: # fallthrough-return 2756entry: 2757 %conv = fptosi <2 x float> %x to <2 x i128> 2758 %spec.store.select = call <2 x i128> @llvm.smin.v2i128(<2 x i128> %conv, <2 x i128> <i128 9223372036854775807, i128 9223372036854775807>) 2759 %spec.store.select7 = call <2 x i128> @llvm.smax.v2i128(<2 x i128> %spec.store.select, <2 x i128> <i128 -9223372036854775808, i128 -9223372036854775808>) 2760 %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64> 2761 ret <2 x i64> %conv6 2762} 2763 2764define <2 x i64> @utest_f32i64_mm(<2 x float> %x) { 2765; CHECK-LABEL: utest_f32i64_mm: 2766; CHECK: .functype utest_f32i64_mm (v128) -> (v128) 2767; CHECK-NEXT: .local i32, i64, i64, i64, i64 2768; CHECK-NEXT: # %bb.0: # %entry 2769; CHECK-NEXT: global.get __stack_pointer 2770; CHECK-NEXT: i32.const 32 2771; CHECK-NEXT: i32.sub 2772; CHECK-NEXT: local.tee 1 2773; CHECK-NEXT: global.set __stack_pointer 2774; CHECK-NEXT: local.get 1 2775; CHECK-NEXT: i32.const 16 2776; CHECK-NEXT: i32.add 2777; CHECK-NEXT: local.get 0 2778; CHECK-NEXT: f32x4.extract_lane 1 2779; CHECK-NEXT: call __fixunssfti 2780; CHECK-NEXT: local.get 1 2781; CHECK-NEXT: local.get 0 2782; CHECK-NEXT: f32x4.extract_lane 0 2783; CHECK-NEXT: call __fixunssfti 2784; CHECK-NEXT: local.get 1 2785; CHECK-NEXT: i32.const 16 2786; CHECK-NEXT: i32.add 2787; CHECK-NEXT: i32.const 8 2788; CHECK-NEXT: i32.add 2789; CHECK-NEXT: i64.load 0 2790; CHECK-NEXT: local.set 2 2791; CHECK-NEXT: local.get 1 2792; CHECK-NEXT: i64.load 16 2793; CHECK-NEXT: local.set 3 2794; CHECK-NEXT: local.get 1 2795; CHECK-NEXT: i32.const 8 2796; CHECK-NEXT: i32.add 2797; CHECK-NEXT: i64.load 0 2798; CHECK-NEXT: local.set 4 2799; CHECK-NEXT: local.get 1 2800; CHECK-NEXT: i64.load 0 2801; CHECK-NEXT: local.set 5 2802; CHECK-NEXT: local.get 1 2803; CHECK-NEXT: i32.const 32 2804; CHECK-NEXT: i32.add 2805; CHECK-NEXT: global.set __stack_pointer 2806; CHECK-NEXT: i64.const 0 2807; CHECK-NEXT: local.get 5 2808; CHECK-NEXT: i64.const 0 2809; CHECK-NEXT: local.get 4 2810; CHECK-NEXT: i64.eqz 2811; CHECK-NEXT: i64.select 2812; CHECK-NEXT: local.get 4 2813; CHECK-NEXT: i64.const 1 2814; CHECK-NEXT: i64.eq 2815; CHECK-NEXT: i64.select 2816; CHECK-NEXT: i64x2.splat 2817; CHECK-NEXT: i64.const 0 2818; CHECK-NEXT: local.get 3 2819; CHECK-NEXT: i64.const 0 2820; CHECK-NEXT: local.get 2 2821; CHECK-NEXT: i64.eqz 2822; CHECK-NEXT: i64.select 2823; CHECK-NEXT: local.get 2 2824; CHECK-NEXT: i64.const 1 2825; CHECK-NEXT: i64.eq 2826; CHECK-NEXT: i64.select 2827; CHECK-NEXT: i64x2.replace_lane 1 2828; CHECK-NEXT: # fallthrough-return 2829entry: 2830 %conv = fptoui <2 x float> %x to <2 x i128> 2831 %spec.store.select = call <2 x i128> @llvm.umin.v2i128(<2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>) 2832 %conv6 = trunc <2 x i128> %spec.store.select to <2 x i64> 2833 ret <2 x i64> %conv6 2834} 2835 2836define <2 x i64> @ustest_f32i64_mm(<2 x float> %x) { 2837; CHECK-LABEL: ustest_f32i64_mm: 2838; CHECK: .functype ustest_f32i64_mm (v128) -> (v128) 2839; CHECK-NEXT: .local i32, i64, i64, i64, i64 2840; CHECK-NEXT: # %bb.0: # %entry 2841; CHECK-NEXT: global.get __stack_pointer 2842; CHECK-NEXT: i32.const 32 2843; CHECK-NEXT: i32.sub 2844; CHECK-NEXT: local.tee 1 2845; CHECK-NEXT: global.set __stack_pointer 2846; CHECK-NEXT: local.get 1 2847; CHECK-NEXT: i32.const 16 2848; CHECK-NEXT: i32.add 2849; CHECK-NEXT: local.get 0 2850; CHECK-NEXT: f32x4.extract_lane 1 2851; CHECK-NEXT: call __fixsfti 2852; CHECK-NEXT: local.get 1 2853; CHECK-NEXT: local.get 0 2854; CHECK-NEXT: f32x4.extract_lane 0 2855; CHECK-NEXT: call __fixsfti 2856; CHECK-NEXT: local.get 1 2857; CHECK-NEXT: i32.const 16 2858; CHECK-NEXT: i32.add 2859; CHECK-NEXT: i32.const 8 2860; CHECK-NEXT: i32.add 2861; CHECK-NEXT: i64.load 0 2862; CHECK-NEXT: local.set 2 2863; CHECK-NEXT: local.get 1 2864; CHECK-NEXT: i64.load 16 2865; CHECK-NEXT: local.set 3 2866; CHECK-NEXT: local.get 1 2867; CHECK-NEXT: i32.const 8 2868; CHECK-NEXT: i32.add 2869; CHECK-NEXT: i64.load 0 2870; CHECK-NEXT: local.set 4 2871; CHECK-NEXT: local.get 1 2872; CHECK-NEXT: i64.load 0 2873; CHECK-NEXT: local.set 5 2874; CHECK-NEXT: local.get 1 2875; CHECK-NEXT: i32.const 32 2876; CHECK-NEXT: i32.add 2877; CHECK-NEXT: global.set __stack_pointer 2878; CHECK-NEXT: i64.const 0 2879; CHECK-NEXT: local.get 5 2880; CHECK-NEXT: i64.const 0 2881; CHECK-NEXT: local.get 4 2882; CHECK-NEXT: i64.const 1 2883; CHECK-NEXT: i64.lt_s 2884; CHECK-NEXT: local.tee 1 2885; CHECK-NEXT: i64.select 2886; CHECK-NEXT: local.get 4 2887; CHECK-NEXT: i64.const 1 2888; CHECK-NEXT: i64.eq 2889; CHECK-NEXT: i64.select 2890; CHECK-NEXT: local.tee 5 2891; CHECK-NEXT: local.get 5 2892; CHECK-NEXT: i64.const 0 2893; CHECK-NEXT: local.get 4 2894; CHECK-NEXT: i64.const 1 2895; CHECK-NEXT: local.get 1 2896; CHECK-NEXT: i64.select 2897; CHECK-NEXT: local.tee 4 2898; CHECK-NEXT: i64.const 0 2899; CHECK-NEXT: i64.gt_s 2900; CHECK-NEXT: i64.select 2901; CHECK-NEXT: local.get 4 2902; CHECK-NEXT: i64.eqz 2903; CHECK-NEXT: i64.select 2904; CHECK-NEXT: i64x2.splat 2905; CHECK-NEXT: i64.const 0 2906; CHECK-NEXT: local.get 3 2907; CHECK-NEXT: i64.const 0 2908; CHECK-NEXT: local.get 2 2909; CHECK-NEXT: i64.const 1 2910; CHECK-NEXT: i64.lt_s 2911; CHECK-NEXT: local.tee 1 2912; CHECK-NEXT: i64.select 2913; CHECK-NEXT: local.get 2 2914; CHECK-NEXT: i64.const 1 2915; CHECK-NEXT: i64.eq 2916; CHECK-NEXT: i64.select 2917; CHECK-NEXT: local.tee 4 2918; CHECK-NEXT: local.get 4 2919; CHECK-NEXT: i64.const 0 2920; CHECK-NEXT: local.get 2 2921; CHECK-NEXT: i64.const 1 2922; CHECK-NEXT: local.get 1 2923; CHECK-NEXT: i64.select 2924; CHECK-NEXT: local.tee 2 2925; CHECK-NEXT: i64.const 0 2926; CHECK-NEXT: i64.gt_s 2927; CHECK-NEXT: i64.select 2928; CHECK-NEXT: local.get 2 2929; CHECK-NEXT: i64.eqz 2930; CHECK-NEXT: i64.select 2931; CHECK-NEXT: i64x2.replace_lane 1 2932; CHECK-NEXT: # fallthrough-return 2933entry: 2934 %conv = fptosi <2 x float> %x to <2 x i128> 2935 %spec.store.select = call <2 x i128> @llvm.smin.v2i128(<2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>) 2936 %spec.store.select7 = call <2 x i128> @llvm.smax.v2i128(<2 x i128> %spec.store.select, <2 x i128> zeroinitializer) 2937 %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64> 2938 ret <2 x i64> %conv6 2939} 2940 2941define <2 x i64> @stest_f16i64_mm(<2 x half> %x) { 2942; CHECK-LABEL: stest_f16i64_mm: 2943; CHECK: .functype stest_f16i64_mm (f32, f32) -> (v128) 2944; CHECK-NEXT: .local i32, i64, i64, i64, i64 2945; CHECK-NEXT: # %bb.0: # %entry 2946; CHECK-NEXT: global.get __stack_pointer 2947; CHECK-NEXT: i32.const 32 2948; CHECK-NEXT: i32.sub 2949; CHECK-NEXT: local.tee 2 2950; CHECK-NEXT: global.set __stack_pointer 2951; CHECK-NEXT: local.get 2 2952; CHECK-NEXT: i32.const 16 2953; CHECK-NEXT: i32.add 2954; CHECK-NEXT: local.get 1 2955; CHECK-NEXT: call __truncsfhf2 2956; CHECK-NEXT: call __extendhfsf2 2957; CHECK-NEXT: call __fixsfti 2958; CHECK-NEXT: local.get 2 2959; CHECK-NEXT: local.get 0 2960; CHECK-NEXT: call __truncsfhf2 2961; CHECK-NEXT: call __extendhfsf2 2962; CHECK-NEXT: call __fixsfti 2963; CHECK-NEXT: local.get 2 2964; CHECK-NEXT: i32.const 16 2965; CHECK-NEXT: i32.add 2966; CHECK-NEXT: i32.const 8 2967; CHECK-NEXT: i32.add 2968; CHECK-NEXT: i64.load 0 2969; CHECK-NEXT: local.set 3 2970; CHECK-NEXT: local.get 2 2971; CHECK-NEXT: i64.load 16 2972; CHECK-NEXT: local.set 4 2973; CHECK-NEXT: local.get 2 2974; CHECK-NEXT: i32.const 8 2975; CHECK-NEXT: i32.add 2976; CHECK-NEXT: i64.load 0 2977; CHECK-NEXT: local.set 5 2978; CHECK-NEXT: local.get 2 2979; CHECK-NEXT: i64.load 0 2980; CHECK-NEXT: local.set 6 2981; CHECK-NEXT: local.get 2 2982; CHECK-NEXT: i32.const 32 2983; CHECK-NEXT: i32.add 2984; CHECK-NEXT: global.set __stack_pointer 2985; CHECK-NEXT: local.get 6 2986; CHECK-NEXT: i64.const 9223372036854775807 2987; CHECK-NEXT: local.get 6 2988; CHECK-NEXT: i64.const 9223372036854775807 2989; CHECK-NEXT: i64.lt_u 2990; CHECK-NEXT: i64.select 2991; CHECK-NEXT: local.get 6 2992; CHECK-NEXT: i64.const 9223372036854775807 2993; CHECK-NEXT: local.get 5 2994; CHECK-NEXT: i64.const 0 2995; CHECK-NEXT: i64.lt_s 2996; CHECK-NEXT: i64.select 2997; CHECK-NEXT: local.get 5 2998; CHECK-NEXT: i64.eqz 2999; CHECK-NEXT: i64.select 3000; CHECK-NEXT: local.tee 6 3001; CHECK-NEXT: i64.const -9223372036854775808 3002; CHECK-NEXT: local.get 6 3003; CHECK-NEXT: i64.const -9223372036854775808 3004; CHECK-NEXT: i64.gt_u 3005; CHECK-NEXT: i64.select 3006; CHECK-NEXT: local.get 6 3007; CHECK-NEXT: i64.const -9223372036854775808 3008; CHECK-NEXT: local.get 5 3009; CHECK-NEXT: local.get 5 3010; CHECK-NEXT: i64.const 63 3011; CHECK-NEXT: i64.shr_s 3012; CHECK-NEXT: i64.and 3013; CHECK-NEXT: local.tee 5 3014; CHECK-NEXT: i64.const -1 3015; CHECK-NEXT: i64.gt_s 3016; CHECK-NEXT: i64.select 3017; CHECK-NEXT: local.get 5 3018; CHECK-NEXT: i64.const -1 3019; CHECK-NEXT: i64.eq 3020; CHECK-NEXT: i64.select 3021; CHECK-NEXT: i64x2.splat 3022; CHECK-NEXT: local.get 4 3023; CHECK-NEXT: i64.const 9223372036854775807 3024; CHECK-NEXT: local.get 4 3025; CHECK-NEXT: i64.const 9223372036854775807 3026; CHECK-NEXT: i64.lt_u 3027; CHECK-NEXT: i64.select 3028; CHECK-NEXT: local.get 4 3029; CHECK-NEXT: i64.const 9223372036854775807 3030; CHECK-NEXT: local.get 3 3031; CHECK-NEXT: i64.const 0 3032; CHECK-NEXT: i64.lt_s 3033; CHECK-NEXT: i64.select 3034; CHECK-NEXT: local.get 3 3035; CHECK-NEXT: i64.eqz 3036; CHECK-NEXT: i64.select 3037; CHECK-NEXT: local.tee 5 3038; CHECK-NEXT: i64.const -9223372036854775808 3039; CHECK-NEXT: local.get 5 3040; CHECK-NEXT: i64.const -9223372036854775808 3041; CHECK-NEXT: i64.gt_u 3042; CHECK-NEXT: i64.select 3043; CHECK-NEXT: local.get 5 3044; CHECK-NEXT: i64.const -9223372036854775808 3045; CHECK-NEXT: local.get 3 3046; CHECK-NEXT: local.get 3 3047; CHECK-NEXT: i64.const 63 3048; CHECK-NEXT: i64.shr_s 3049; CHECK-NEXT: i64.and 3050; CHECK-NEXT: local.tee 3 3051; CHECK-NEXT: i64.const -1 3052; CHECK-NEXT: i64.gt_s 3053; CHECK-NEXT: i64.select 3054; CHECK-NEXT: local.get 3 3055; CHECK-NEXT: i64.const -1 3056; CHECK-NEXT: i64.eq 3057; CHECK-NEXT: i64.select 3058; CHECK-NEXT: i64x2.replace_lane 1 3059; CHECK-NEXT: # fallthrough-return 3060entry: 3061 %conv = fptosi <2 x half> %x to <2 x i128> 3062 %spec.store.select = call <2 x i128> @llvm.smin.v2i128(<2 x i128> %conv, <2 x i128> <i128 9223372036854775807, i128 9223372036854775807>) 3063 %spec.store.select7 = call <2 x i128> @llvm.smax.v2i128(<2 x i128> %spec.store.select, <2 x i128> <i128 -9223372036854775808, i128 -9223372036854775808>) 3064 %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64> 3065 ret <2 x i64> %conv6 3066} 3067 3068define <2 x i64> @utesth_f16i64_mm(<2 x half> %x) { 3069; CHECK-LABEL: utesth_f16i64_mm: 3070; CHECK: .functype utesth_f16i64_mm (f32, f32) -> (v128) 3071; CHECK-NEXT: .local i32, i64, i64, i64, i64 3072; CHECK-NEXT: # %bb.0: # %entry 3073; CHECK-NEXT: global.get __stack_pointer 3074; CHECK-NEXT: i32.const 32 3075; CHECK-NEXT: i32.sub 3076; CHECK-NEXT: local.tee 2 3077; CHECK-NEXT: global.set __stack_pointer 3078; CHECK-NEXT: local.get 2 3079; CHECK-NEXT: i32.const 16 3080; CHECK-NEXT: i32.add 3081; CHECK-NEXT: local.get 1 3082; CHECK-NEXT: call __truncsfhf2 3083; CHECK-NEXT: call __extendhfsf2 3084; CHECK-NEXT: call __fixunssfti 3085; CHECK-NEXT: local.get 2 3086; CHECK-NEXT: local.get 0 3087; CHECK-NEXT: call __truncsfhf2 3088; CHECK-NEXT: call __extendhfsf2 3089; CHECK-NEXT: call __fixunssfti 3090; CHECK-NEXT: local.get 2 3091; CHECK-NEXT: i32.const 16 3092; CHECK-NEXT: i32.add 3093; CHECK-NEXT: i32.const 8 3094; CHECK-NEXT: i32.add 3095; CHECK-NEXT: i64.load 0 3096; CHECK-NEXT: local.set 3 3097; CHECK-NEXT: local.get 2 3098; CHECK-NEXT: i64.load 16 3099; CHECK-NEXT: local.set 4 3100; CHECK-NEXT: local.get 2 3101; CHECK-NEXT: i32.const 8 3102; CHECK-NEXT: i32.add 3103; CHECK-NEXT: i64.load 0 3104; CHECK-NEXT: local.set 5 3105; CHECK-NEXT: local.get 2 3106; CHECK-NEXT: i64.load 0 3107; CHECK-NEXT: local.set 6 3108; CHECK-NEXT: local.get 2 3109; CHECK-NEXT: i32.const 32 3110; CHECK-NEXT: i32.add 3111; CHECK-NEXT: global.set __stack_pointer 3112; CHECK-NEXT: i64.const 0 3113; CHECK-NEXT: local.get 6 3114; CHECK-NEXT: i64.const 0 3115; CHECK-NEXT: local.get 5 3116; CHECK-NEXT: i64.eqz 3117; CHECK-NEXT: i64.select 3118; CHECK-NEXT: local.get 5 3119; CHECK-NEXT: i64.const 1 3120; CHECK-NEXT: i64.eq 3121; CHECK-NEXT: i64.select 3122; CHECK-NEXT: i64x2.splat 3123; CHECK-NEXT: i64.const 0 3124; CHECK-NEXT: local.get 4 3125; CHECK-NEXT: i64.const 0 3126; CHECK-NEXT: local.get 3 3127; CHECK-NEXT: i64.eqz 3128; CHECK-NEXT: i64.select 3129; CHECK-NEXT: local.get 3 3130; CHECK-NEXT: i64.const 1 3131; CHECK-NEXT: i64.eq 3132; CHECK-NEXT: i64.select 3133; CHECK-NEXT: i64x2.replace_lane 1 3134; CHECK-NEXT: # fallthrough-return 3135entry: 3136 %conv = fptoui <2 x half> %x to <2 x i128> 3137 %spec.store.select = call <2 x i128> @llvm.umin.v2i128(<2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>) 3138 %conv6 = trunc <2 x i128> %spec.store.select to <2 x i64> 3139 ret <2 x i64> %conv6 3140} 3141 3142define <2 x i64> @ustest_f16i64_mm(<2 x half> %x) { 3143; CHECK-LABEL: ustest_f16i64_mm: 3144; CHECK: .functype ustest_f16i64_mm (f32, f32) -> (v128) 3145; CHECK-NEXT: .local i32, i64, i64, i64, i64 3146; CHECK-NEXT: # %bb.0: # %entry 3147; CHECK-NEXT: global.get __stack_pointer 3148; CHECK-NEXT: i32.const 32 3149; CHECK-NEXT: i32.sub 3150; CHECK-NEXT: local.tee 2 3151; CHECK-NEXT: global.set __stack_pointer 3152; CHECK-NEXT: local.get 2 3153; CHECK-NEXT: i32.const 16 3154; CHECK-NEXT: i32.add 3155; CHECK-NEXT: local.get 1 3156; CHECK-NEXT: call __truncsfhf2 3157; CHECK-NEXT: call __extendhfsf2 3158; CHECK-NEXT: call __fixsfti 3159; CHECK-NEXT: local.get 2 3160; CHECK-NEXT: local.get 0 3161; CHECK-NEXT: call __truncsfhf2 3162; CHECK-NEXT: call __extendhfsf2 3163; CHECK-NEXT: call __fixsfti 3164; CHECK-NEXT: local.get 2 3165; CHECK-NEXT: i32.const 16 3166; CHECK-NEXT: i32.add 3167; CHECK-NEXT: i32.const 8 3168; CHECK-NEXT: i32.add 3169; CHECK-NEXT: i64.load 0 3170; CHECK-NEXT: local.set 3 3171; CHECK-NEXT: local.get 2 3172; CHECK-NEXT: i64.load 16 3173; CHECK-NEXT: local.set 4 3174; CHECK-NEXT: local.get 2 3175; CHECK-NEXT: i32.const 8 3176; CHECK-NEXT: i32.add 3177; CHECK-NEXT: i64.load 0 3178; CHECK-NEXT: local.set 5 3179; CHECK-NEXT: local.get 2 3180; CHECK-NEXT: i64.load 0 3181; CHECK-NEXT: local.set 6 3182; CHECK-NEXT: local.get 2 3183; CHECK-NEXT: i32.const 32 3184; CHECK-NEXT: i32.add 3185; CHECK-NEXT: global.set __stack_pointer 3186; CHECK-NEXT: i64.const 0 3187; CHECK-NEXT: local.get 6 3188; CHECK-NEXT: i64.const 0 3189; CHECK-NEXT: local.get 5 3190; CHECK-NEXT: i64.const 1 3191; CHECK-NEXT: i64.lt_s 3192; CHECK-NEXT: local.tee 2 3193; CHECK-NEXT: i64.select 3194; CHECK-NEXT: local.get 5 3195; CHECK-NEXT: i64.const 1 3196; CHECK-NEXT: i64.eq 3197; CHECK-NEXT: i64.select 3198; CHECK-NEXT: local.tee 6 3199; CHECK-NEXT: local.get 6 3200; CHECK-NEXT: i64.const 0 3201; CHECK-NEXT: local.get 5 3202; CHECK-NEXT: i64.const 1 3203; CHECK-NEXT: local.get 2 3204; CHECK-NEXT: i64.select 3205; CHECK-NEXT: local.tee 5 3206; CHECK-NEXT: i64.const 0 3207; CHECK-NEXT: i64.gt_s 3208; CHECK-NEXT: i64.select 3209; CHECK-NEXT: local.get 5 3210; CHECK-NEXT: i64.eqz 3211; CHECK-NEXT: i64.select 3212; CHECK-NEXT: i64x2.splat 3213; CHECK-NEXT: i64.const 0 3214; CHECK-NEXT: local.get 4 3215; CHECK-NEXT: i64.const 0 3216; CHECK-NEXT: local.get 3 3217; CHECK-NEXT: i64.const 1 3218; CHECK-NEXT: i64.lt_s 3219; CHECK-NEXT: local.tee 2 3220; CHECK-NEXT: i64.select 3221; CHECK-NEXT: local.get 3 3222; CHECK-NEXT: i64.const 1 3223; CHECK-NEXT: i64.eq 3224; CHECK-NEXT: i64.select 3225; CHECK-NEXT: local.tee 5 3226; CHECK-NEXT: local.get 5 3227; CHECK-NEXT: i64.const 0 3228; CHECK-NEXT: local.get 3 3229; CHECK-NEXT: i64.const 1 3230; CHECK-NEXT: local.get 2 3231; CHECK-NEXT: i64.select 3232; CHECK-NEXT: local.tee 3 3233; CHECK-NEXT: i64.const 0 3234; CHECK-NEXT: i64.gt_s 3235; CHECK-NEXT: i64.select 3236; CHECK-NEXT: local.get 3 3237; CHECK-NEXT: i64.eqz 3238; CHECK-NEXT: i64.select 3239; CHECK-NEXT: i64x2.replace_lane 1 3240; CHECK-NEXT: # fallthrough-return 3241entry: 3242 %conv = fptosi <2 x half> %x to <2 x i128> 3243 %spec.store.select = call <2 x i128> @llvm.smin.v2i128(<2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>) 3244 %spec.store.select7 = call <2 x i128> @llvm.smax.v2i128(<2 x i128> %spec.store.select, <2 x i128> zeroinitializer) 3245 %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64> 3246 ret <2 x i64> %conv6 3247} 3248 3249declare <2 x i32> @llvm.smin.v2i32(<2 x i32>, <2 x i32>) 3250declare <2 x i32> @llvm.smax.v2i32(<2 x i32>, <2 x i32>) 3251declare <2 x i32> @llvm.umin.v2i32(<2 x i32>, <2 x i32>) 3252declare <4 x i32> @llvm.smin.v4i32(<4 x i32>, <4 x i32>) 3253declare <4 x i32> @llvm.smax.v4i32(<4 x i32>, <4 x i32>) 3254declare <4 x i32> @llvm.umin.v4i32(<4 x i32>, <4 x i32>) 3255declare <8 x i32> @llvm.smin.v8i32(<8 x i32>, <8 x i32>) 3256declare <8 x i32> @llvm.smax.v8i32(<8 x i32>, <8 x i32>) 3257declare <8 x i32> @llvm.umin.v8i32(<8 x i32>, <8 x i32>) 3258declare <2 x i64> @llvm.smin.v2i64(<2 x i64>, <2 x i64>) 3259declare <2 x i64> @llvm.smax.v2i64(<2 x i64>, <2 x i64>) 3260declare <2 x i64> @llvm.umin.v2i64(<2 x i64>, <2 x i64>) 3261declare <4 x i64> @llvm.smin.v4i64(<4 x i64>, <4 x i64>) 3262declare <4 x i64> @llvm.smax.v4i64(<4 x i64>, <4 x i64>) 3263declare <4 x i64> @llvm.umin.v4i64(<4 x i64>, <4 x i64>) 3264declare <2 x i128> @llvm.smin.v2i128(<2 x i128>, <2 x i128>) 3265declare <2 x i128> @llvm.smax.v2i128(<2 x i128>, <2 x i128>) 3266declare <2 x i128> @llvm.umin.v2i128(<2 x i128>, <2 x i128>) 3267