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