brintos

brintos / llvm-project-archived public Read only

0
0
Text · 56.6 KiB · 59f3edc Raw
1795 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=wasm32-unknown-unknown -mattr=+simd128,+nontrapping-fptoint | FileCheck %s3 4; i32 saturate5 6define i32 @stest_f64i32(double %x) {7; CHECK-LABEL: stest_f64i32:8; CHECK:         .functype stest_f64i32 (f64) -> (i32)9; CHECK-NEXT:  # %bb.0: # %entry10; CHECK-NEXT:    local.get 011; CHECK-NEXT:    i32.trunc_sat_f64_s12; CHECK-NEXT:    # fallthrough-return13entry:14  %conv = fptosi double %x to i6415  %0 = icmp slt i64 %conv, 214748364716  %spec.store.select = select i1 %0, i64 %conv, i64 214748364717  %1 = icmp sgt i64 %spec.store.select, -214748364818  %spec.store.select7 = select i1 %1, i64 %spec.store.select, i64 -214748364819  %conv6 = trunc i64 %spec.store.select7 to i3220  ret i32 %conv621}22 23define i32 @utest_f64i32(double %x) {24; CHECK-LABEL: utest_f64i32:25; CHECK:         .functype utest_f64i32 (f64) -> (i32)26; CHECK-NEXT:  # %bb.0: # %entry27; CHECK-NEXT:    local.get 028; CHECK-NEXT:    i32.trunc_sat_f64_u29; CHECK-NEXT:    # fallthrough-return30entry:31  %conv = fptoui double %x to i6432  %0 = icmp ult i64 %conv, 429496729533  %spec.store.select = select i1 %0, i64 %conv, i64 429496729534  %conv6 = trunc i64 %spec.store.select to i3235  ret i32 %conv636}37 38define i32 @ustest_f64i32(double %x) {39; CHECK-LABEL: ustest_f64i32:40; CHECK:         .functype ustest_f64i32 (f64) -> (i32)41; CHECK-NEXT:  # %bb.0: # %entry42; CHECK-NEXT:    local.get 043; CHECK-NEXT:    i32.trunc_sat_f64_u44; CHECK-NEXT:    # fallthrough-return45entry:46  %conv = fptosi double %x to i6447  %0 = icmp slt i64 %conv, 429496729548  %spec.store.select = select i1 %0, i64 %conv, i64 429496729549  %1 = icmp sgt i64 %spec.store.select, 050  %spec.store.select7 = select i1 %1, i64 %spec.store.select, i64 051  %conv6 = trunc i64 %spec.store.select7 to i3252  ret i32 %conv653}54 55define i32 @stest_f32i32(float %x) {56; CHECK-LABEL: stest_f32i32:57; CHECK:         .functype stest_f32i32 (f32) -> (i32)58; CHECK-NEXT:  # %bb.0: # %entry59; CHECK-NEXT:    local.get 060; CHECK-NEXT:    i32.trunc_sat_f32_s61; CHECK-NEXT:    # fallthrough-return62entry:63  %conv = fptosi float %x to i6464  %0 = icmp slt i64 %conv, 214748364765  %spec.store.select = select i1 %0, i64 %conv, i64 214748364766  %1 = icmp sgt i64 %spec.store.select, -214748364867  %spec.store.select7 = select i1 %1, i64 %spec.store.select, i64 -214748364868  %conv6 = trunc i64 %spec.store.select7 to i3269  ret i32 %conv670}71 72define i32 @utest_f32i32(float %x) {73; CHECK-LABEL: utest_f32i32:74; CHECK:         .functype utest_f32i32 (f32) -> (i32)75; CHECK-NEXT:  # %bb.0: # %entry76; CHECK-NEXT:    local.get 077; CHECK-NEXT:    i32.trunc_sat_f32_u78; CHECK-NEXT:    # fallthrough-return79entry:80  %conv = fptoui float %x to i6481  %0 = icmp ult i64 %conv, 429496729582  %spec.store.select = select i1 %0, i64 %conv, i64 429496729583  %conv6 = trunc i64 %spec.store.select to i3284  ret i32 %conv685}86 87define i32 @ustest_f32i32(float %x) {88; CHECK-LABEL: ustest_f32i32:89; CHECK:         .functype ustest_f32i32 (f32) -> (i32)90; CHECK-NEXT:  # %bb.0: # %entry91; CHECK-NEXT:    local.get 092; CHECK-NEXT:    i32.trunc_sat_f32_u93; CHECK-NEXT:    # fallthrough-return94entry:95  %conv = fptosi float %x to i6496  %0 = icmp slt i64 %conv, 429496729597  %spec.store.select = select i1 %0, i64 %conv, i64 429496729598  %1 = icmp sgt i64 %spec.store.select, 099  %spec.store.select7 = select i1 %1, i64 %spec.store.select, i64 0100  %conv6 = trunc i64 %spec.store.select7 to i32101  ret i32 %conv6102}103 104define i32 @stest_f16i32(half %x) {105; CHECK-LABEL: stest_f16i32:106; CHECK:         .functype stest_f16i32 (f32) -> (i32)107; CHECK-NEXT:  # %bb.0: # %entry108; CHECK-NEXT:    local.get 0109; CHECK-NEXT:    call __truncsfhf2110; CHECK-NEXT:    call __extendhfsf2111; CHECK-NEXT:    i32.trunc_sat_f32_s112; CHECK-NEXT:    # fallthrough-return113entry:114  %conv = fptosi half %x to i64115  %0 = icmp slt i64 %conv, 2147483647116  %spec.store.select = select i1 %0, i64 %conv, i64 2147483647117  %1 = icmp sgt i64 %spec.store.select, -2147483648118  %spec.store.select7 = select i1 %1, i64 %spec.store.select, i64 -2147483648119  %conv6 = trunc i64 %spec.store.select7 to i32120  ret i32 %conv6121}122 123define i32 @stest_f16i32_cse(half %x) {124; CHECK-LABEL: stest_f16i32_cse:125; CHECK:         .functype stest_f16i32_cse (f32) -> (i32)126; CHECK-NEXT:  # %bb.0: # %entry127; CHECK-NEXT:    local.get 0128; CHECK-NEXT:    call __truncsfhf2129; CHECK-NEXT:    call __extendhfsf2130; CHECK-NEXT:    i64.trunc_sat_f32_s131; CHECK-NEXT:    i32.wrap_i64132; CHECK-NEXT:    # fallthrough-return133entry:134  %conv = fptosi half %x to i64135  %conv6 = trunc i64 %conv to i32136  ret i32 %conv6137}138 139define i32 @utest_f16i32(half %x) {140; CHECK-LABEL: utest_f16i32:141; CHECK:         .functype utest_f16i32 (f32) -> (i32)142; CHECK-NEXT:  # %bb.0: # %entry143; CHECK-NEXT:    local.get 0144; CHECK-NEXT:    call __truncsfhf2145; CHECK-NEXT:    call __extendhfsf2146; CHECK-NEXT:    i32.trunc_sat_f32_u147; CHECK-NEXT:    # fallthrough-return148entry:149  %conv = fptoui half %x to i64150  %0 = icmp ult i64 %conv, 4294967295151  %spec.store.select = select i1 %0, i64 %conv, i64 4294967295152  %conv6 = trunc i64 %spec.store.select to i32153  ret i32 %conv6154}155 156define i32 @utest_f16i32_cse(half %x) {157; CHECK-LABEL: utest_f16i32_cse:158; CHECK:         .functype utest_f16i32_cse (f32) -> (i32)159; CHECK-NEXT:  # %bb.0: # %entry160; CHECK-NEXT:    local.get 0161; CHECK-NEXT:    call __truncsfhf2162; CHECK-NEXT:    call __extendhfsf2163; CHECK-NEXT:    i64.trunc_sat_f32_u164; CHECK-NEXT:    i32.wrap_i64165; CHECK-NEXT:    # fallthrough-return166entry:167  %conv = fptoui half %x to i64168  %conv6 = trunc i64 %conv to i32169  ret i32 %conv6170}171 172define i32 @ustest_f16i32(half %x) {173; CHECK-LABEL: ustest_f16i32:174; CHECK:         .functype ustest_f16i32 (f32) -> (i32)175; CHECK-NEXT:  # %bb.0: # %entry176; CHECK-NEXT:    local.get 0177; CHECK-NEXT:    call __truncsfhf2178; CHECK-NEXT:    call __extendhfsf2179; CHECK-NEXT:    i32.trunc_sat_f32_u180; CHECK-NEXT:    # fallthrough-return181entry:182  %conv = fptosi half %x to i64183  %0 = icmp slt i64 %conv, 4294967295184  %spec.store.select = select i1 %0, i64 %conv, i64 4294967295185  %1 = icmp sgt i64 %spec.store.select, 0186  %spec.store.select7 = select i1 %1, i64 %spec.store.select, i64 0187  %conv6 = trunc i64 %spec.store.select7 to i32188  ret i32 %conv6189}190 191define i32 @ustest_f16i32_cse(half %x) {192; CHECK-LABEL: ustest_f16i32_cse:193; CHECK:         .functype ustest_f16i32_cse (f32) -> (i32)194; CHECK-NEXT:  # %bb.0: # %entry195; CHECK-NEXT:    local.get 0196; CHECK-NEXT:    call __truncsfhf2197; CHECK-NEXT:    call __extendhfsf2198; CHECK-NEXT:    i32.trunc_sat_f32_u199; CHECK-NEXT:    # fallthrough-return200entry:201  %conv = fptosi half %x to i64202  %0 = icmp sgt i64 %conv, 0203  %spec.store.select7 = select i1 %0, i64 %conv, i64 0204  %conv6 = trunc i64 %spec.store.select7 to i32205  ret i32 %conv6206}207 208; i16 saturate209 210define i16 @stest_f64i16(double %x) {211; CHECK-LABEL: stest_f64i16:212; CHECK:         .functype stest_f64i16 (f64) -> (i32)213; CHECK-NEXT:    .local i32214; CHECK-NEXT:  # %bb.0: # %entry215; CHECK-NEXT:    local.get 0216; CHECK-NEXT:    i32.trunc_sat_f64_s217; CHECK-NEXT:    local.tee 1218; CHECK-NEXT:    i32.const 32767219; CHECK-NEXT:    local.get 1220; CHECK-NEXT:    i32.const 32767221; CHECK-NEXT:    i32.lt_s222; CHECK-NEXT:    i32.select223; CHECK-NEXT:    local.tee 1224; CHECK-NEXT:    i32.const -32768225; CHECK-NEXT:    local.get 1226; CHECK-NEXT:    i32.const -32768227; CHECK-NEXT:    i32.gt_s228; CHECK-NEXT:    i32.select229; CHECK-NEXT:    # fallthrough-return230entry:231  %conv = fptosi double %x to i32232  %0 = icmp slt i32 %conv, 32767233  %spec.store.select = select i1 %0, i32 %conv, i32 32767234  %1 = icmp sgt i32 %spec.store.select, -32768235  %spec.store.select7 = select i1 %1, i32 %spec.store.select, i32 -32768236  %conv6 = trunc i32 %spec.store.select7 to i16237  ret i16 %conv6238}239 240define i16 @utest_f64i16(double %x) {241; CHECK-LABEL: utest_f64i16:242; CHECK:         .functype utest_f64i16 (f64) -> (i32)243; CHECK-NEXT:    .local i32244; CHECK-NEXT:  # %bb.0: # %entry245; CHECK-NEXT:    local.get 0246; CHECK-NEXT:    i32.trunc_sat_f64_u247; CHECK-NEXT:    local.tee 1248; CHECK-NEXT:    i32.const 65535249; CHECK-NEXT:    local.get 1250; CHECK-NEXT:    i32.const 65535251; CHECK-NEXT:    i32.lt_u252; CHECK-NEXT:    i32.select253; CHECK-NEXT:    # fallthrough-return254entry:255  %conv = fptoui double %x to i32256  %0 = icmp ult i32 %conv, 65535257  %spec.store.select = select i1 %0, i32 %conv, i32 65535258  %conv6 = trunc i32 %spec.store.select to i16259  ret i16 %conv6260}261 262define i16 @ustest_f64i16(double %x) {263; CHECK-LABEL: ustest_f64i16:264; CHECK:         .functype ustest_f64i16 (f64) -> (i32)265; CHECK-NEXT:    .local i32266; CHECK-NEXT:  # %bb.0: # %entry267; CHECK-NEXT:    local.get 0268; CHECK-NEXT:    i32.trunc_sat_f64_s269; CHECK-NEXT:    local.tee 1270; CHECK-NEXT:    i32.const 65535271; CHECK-NEXT:    local.get 1272; CHECK-NEXT:    i32.const 65535273; CHECK-NEXT:    i32.lt_s274; CHECK-NEXT:    i32.select275; CHECK-NEXT:    local.tee 1276; CHECK-NEXT:    i32.const 0277; CHECK-NEXT:    local.get 1278; CHECK-NEXT:    i32.const 0279; CHECK-NEXT:    i32.gt_s280; CHECK-NEXT:    i32.select281; CHECK-NEXT:    # fallthrough-return282entry:283  %conv = fptosi double %x to i32284  %0 = icmp slt i32 %conv, 65535285  %spec.store.select = select i1 %0, i32 %conv, i32 65535286  %1 = icmp sgt i32 %spec.store.select, 0287  %spec.store.select7 = select i1 %1, i32 %spec.store.select, i32 0288  %conv6 = trunc i32 %spec.store.select7 to i16289  ret i16 %conv6290}291 292define i16 @stest_f32i16(float %x) {293; CHECK-LABEL: stest_f32i16:294; CHECK:         .functype stest_f32i16 (f32) -> (i32)295; CHECK-NEXT:    .local i32296; CHECK-NEXT:  # %bb.0: # %entry297; CHECK-NEXT:    local.get 0298; CHECK-NEXT:    i32.trunc_sat_f32_s299; CHECK-NEXT:    local.tee 1300; CHECK-NEXT:    i32.const 32767301; CHECK-NEXT:    local.get 1302; CHECK-NEXT:    i32.const 32767303; CHECK-NEXT:    i32.lt_s304; CHECK-NEXT:    i32.select305; CHECK-NEXT:    local.tee 1306; CHECK-NEXT:    i32.const -32768307; CHECK-NEXT:    local.get 1308; CHECK-NEXT:    i32.const -32768309; CHECK-NEXT:    i32.gt_s310; CHECK-NEXT:    i32.select311; CHECK-NEXT:    # fallthrough-return312entry:313  %conv = fptosi float %x to i32314  %0 = icmp slt i32 %conv, 32767315  %spec.store.select = select i1 %0, i32 %conv, i32 32767316  %1 = icmp sgt i32 %spec.store.select, -32768317  %spec.store.select7 = select i1 %1, i32 %spec.store.select, i32 -32768318  %conv6 = trunc i32 %spec.store.select7 to i16319  ret i16 %conv6320}321 322define i16 @utest_f32i16(float %x) {323; CHECK-LABEL: utest_f32i16:324; CHECK:         .functype utest_f32i16 (f32) -> (i32)325; CHECK-NEXT:    .local i32326; CHECK-NEXT:  # %bb.0: # %entry327; CHECK-NEXT:    local.get 0328; CHECK-NEXT:    i32.trunc_sat_f32_u329; CHECK-NEXT:    local.tee 1330; CHECK-NEXT:    i32.const 65535331; CHECK-NEXT:    local.get 1332; CHECK-NEXT:    i32.const 65535333; CHECK-NEXT:    i32.lt_u334; CHECK-NEXT:    i32.select335; CHECK-NEXT:    # fallthrough-return336entry:337  %conv = fptoui float %x to i32338  %0 = icmp ult i32 %conv, 65535339  %spec.store.select = select i1 %0, i32 %conv, i32 65535340  %conv6 = trunc i32 %spec.store.select to i16341  ret i16 %conv6342}343 344define i16 @ustest_f32i16(float %x) {345; CHECK-LABEL: ustest_f32i16:346; CHECK:         .functype ustest_f32i16 (f32) -> (i32)347; CHECK-NEXT:    .local i32348; CHECK-NEXT:  # %bb.0: # %entry349; CHECK-NEXT:    local.get 0350; CHECK-NEXT:    i32.trunc_sat_f32_s351; CHECK-NEXT:    local.tee 1352; CHECK-NEXT:    i32.const 65535353; CHECK-NEXT:    local.get 1354; CHECK-NEXT:    i32.const 65535355; CHECK-NEXT:    i32.lt_s356; CHECK-NEXT:    i32.select357; CHECK-NEXT:    local.tee 1358; CHECK-NEXT:    i32.const 0359; CHECK-NEXT:    local.get 1360; CHECK-NEXT:    i32.const 0361; CHECK-NEXT:    i32.gt_s362; CHECK-NEXT:    i32.select363; CHECK-NEXT:    # fallthrough-return364entry:365  %conv = fptosi float %x to i32366  %0 = icmp slt i32 %conv, 65535367  %spec.store.select = select i1 %0, i32 %conv, i32 65535368  %1 = icmp sgt i32 %spec.store.select, 0369  %spec.store.select7 = select i1 %1, i32 %spec.store.select, i32 0370  %conv6 = trunc i32 %spec.store.select7 to i16371  ret i16 %conv6372}373 374define i16 @stest_f16i16(half %x) {375; CHECK-LABEL: stest_f16i16:376; CHECK:         .functype stest_f16i16 (f32) -> (i32)377; CHECK-NEXT:    .local i32378; CHECK-NEXT:  # %bb.0: # %entry379; CHECK-NEXT:    local.get 0380; CHECK-NEXT:    call __truncsfhf2381; CHECK-NEXT:    call __extendhfsf2382; CHECK-NEXT:    i32.trunc_sat_f32_s383; CHECK-NEXT:    local.tee 1384; CHECK-NEXT:    i32.const 32767385; CHECK-NEXT:    local.get 1386; CHECK-NEXT:    i32.const 32767387; CHECK-NEXT:    i32.lt_s388; CHECK-NEXT:    i32.select389; CHECK-NEXT:    local.tee 1390; CHECK-NEXT:    i32.const -32768391; CHECK-NEXT:    local.get 1392; CHECK-NEXT:    i32.const -32768393; CHECK-NEXT:    i32.gt_s394; CHECK-NEXT:    i32.select395; CHECK-NEXT:    # fallthrough-return396entry:397  %conv = fptosi half %x to i32398  %0 = icmp slt i32 %conv, 32767399  %spec.store.select = select i1 %0, i32 %conv, i32 32767400  %1 = icmp sgt i32 %spec.store.select, -32768401  %spec.store.select7 = select i1 %1, i32 %spec.store.select, i32 -32768402  %conv6 = trunc i32 %spec.store.select7 to i16403  ret i16 %conv6404}405 406define i16 @utest_f16i16(half %x) {407; CHECK-LABEL: utest_f16i16:408; CHECK:         .functype utest_f16i16 (f32) -> (i32)409; CHECK-NEXT:    .local i32410; CHECK-NEXT:  # %bb.0: # %entry411; CHECK-NEXT:    local.get 0412; CHECK-NEXT:    call __truncsfhf2413; CHECK-NEXT:    call __extendhfsf2414; CHECK-NEXT:    i32.trunc_sat_f32_u415; CHECK-NEXT:    local.tee 1416; CHECK-NEXT:    i32.const 65535417; CHECK-NEXT:    local.get 1418; CHECK-NEXT:    i32.const 65535419; CHECK-NEXT:    i32.lt_u420; CHECK-NEXT:    i32.select421; CHECK-NEXT:    # fallthrough-return422entry:423  %conv = fptoui half %x to i32424  %0 = icmp ult i32 %conv, 65535425  %spec.store.select = select i1 %0, i32 %conv, i32 65535426  %conv6 = trunc i32 %spec.store.select to i16427  ret i16 %conv6428}429 430define i16 @utest_f16i16_cse(half %x) {431; CHECK-LABEL: utest_f16i16_cse:432; CHECK:         .functype utest_f16i16_cse (f32) -> (i32)433; CHECK-NEXT:  # %bb.0: # %entry434; CHECK-NEXT:    local.get 0435; CHECK-NEXT:    call __truncsfhf2436; CHECK-NEXT:    call __extendhfsf2437; CHECK-NEXT:    i32.trunc_sat_f32_u438; CHECK-NEXT:    # fallthrough-return439entry:440  %conv = fptoui half %x to i32441  %conv6 = trunc i32 %conv to i16442  ret i16 %conv6443}444 445define i16 @ustest_f16i16(half %x) {446; CHECK-LABEL: ustest_f16i16:447; CHECK:         .functype ustest_f16i16 (f32) -> (i32)448; CHECK-NEXT:    .local i32449; CHECK-NEXT:  # %bb.0: # %entry450; CHECK-NEXT:    local.get 0451; CHECK-NEXT:    call __truncsfhf2452; CHECK-NEXT:    call __extendhfsf2453; CHECK-NEXT:    i32.trunc_sat_f32_s454; CHECK-NEXT:    local.tee 1455; CHECK-NEXT:    i32.const 65535456; CHECK-NEXT:    local.get 1457; CHECK-NEXT:    i32.const 65535458; CHECK-NEXT:    i32.lt_s459; CHECK-NEXT:    i32.select460; CHECK-NEXT:    local.tee 1461; CHECK-NEXT:    i32.const 0462; CHECK-NEXT:    local.get 1463; CHECK-NEXT:    i32.const 0464; CHECK-NEXT:    i32.gt_s465; CHECK-NEXT:    i32.select466; CHECK-NEXT:    # fallthrough-return467entry:468  %conv = fptosi half %x to i32469  %0 = icmp slt i32 %conv, 65535470  %spec.store.select = select i1 %0, i32 %conv, i32 65535471  %1 = icmp sgt i32 %spec.store.select, 0472  %spec.store.select7 = select i1 %1, i32 %spec.store.select, i32 0473  %conv6 = trunc i32 %spec.store.select7 to i16474  ret i16 %conv6475}476 477define i16 @ustest_f16i16_cse(half %x) {478; CHECK-LABEL: ustest_f16i16_cse:479; CHECK:         .functype ustest_f16i16_cse (f32) -> (i32)480; CHECK-NEXT:  # %bb.0: # %entry481; CHECK-NEXT:    local.get 0482; CHECK-NEXT:    call __truncsfhf2483; CHECK-NEXT:    call __extendhfsf2484; CHECK-NEXT:    i32.trunc_sat_f32_u485; CHECK-NEXT:    # fallthrough-return486entry:487  %conv = fptosi half %x to i32488  %0 = icmp sgt i32 %conv, 0489  %spec.store.select7 = select i1 %0, i32 %conv, i32 0490  %conv6 = trunc i32 %spec.store.select7 to i16491  ret i16 %conv6492}493 494; i64 saturate495 496define i64 @stest_f64i64(double %x) {497; CHECK-LABEL: stest_f64i64:498; CHECK:         .functype stest_f64i64 (f64) -> (i64)499; CHECK-NEXT:  # %bb.0: # %entry500; CHECK-NEXT:    local.get 0501; CHECK-NEXT:    i64.trunc_sat_f64_s502; CHECK-NEXT:    # fallthrough-return503entry:504  %conv = fptosi double %x to i128505  %0 = icmp slt i128 %conv, 9223372036854775807506  %spec.store.select = select i1 %0, i128 %conv, i128 9223372036854775807507  %1 = icmp sgt i128 %spec.store.select, -9223372036854775808508  %spec.store.select7 = select i1 %1, i128 %spec.store.select, i128 -9223372036854775808509  %conv6 = trunc i128 %spec.store.select7 to i64510  ret i64 %conv6511}512 513define i64 @utest_f64i64(double %x) {514; CHECK-LABEL: utest_f64i64:515; CHECK:         .functype utest_f64i64 (f64) -> (i64)516; CHECK-NEXT:    .local i32, i64, i64517; CHECK-NEXT:  # %bb.0: # %entry518; CHECK-NEXT:    global.get __stack_pointer519; CHECK-NEXT:    i32.const 16520; CHECK-NEXT:    i32.sub521; CHECK-NEXT:    local.tee 1522; CHECK-NEXT:    global.set __stack_pointer523; CHECK-NEXT:    local.get 1524; CHECK-NEXT:    local.get 0525; CHECK-NEXT:    call __fixunsdfti526; CHECK-NEXT:    local.get 1527; CHECK-NEXT:    i64.load 8528; CHECK-NEXT:    local.set 2529; CHECK-NEXT:    local.get 1530; CHECK-NEXT:    i64.load 0531; CHECK-NEXT:    local.set 3532; CHECK-NEXT:    local.get 1533; CHECK-NEXT:    i32.const 16534; CHECK-NEXT:    i32.add535; CHECK-NEXT:    global.set __stack_pointer536; CHECK-NEXT:    local.get 3537; CHECK-NEXT:    i64.const 0538; CHECK-NEXT:    local.get 2539; CHECK-NEXT:    i64.eqz540; CHECK-NEXT:    i64.select541; CHECK-NEXT:    # fallthrough-return542entry:543  %conv = fptoui double %x to i128544  %0 = icmp ult i128 %conv, 18446744073709551616545  %spec.store.select = select i1 %0, i128 %conv, i128 18446744073709551616546  %conv6 = trunc i128 %spec.store.select to i64547  ret i64 %conv6548}549 550define i64 @utest_f64i64_cse_combine(double %x) #0 {551; CHECK-LABEL: utest_f64i64_cse_combine:552; CHECK:         .functype utest_f64i64_cse_combine (f64) -> (i64)553; CHECK-NEXT:    .local i32, i64, i64554; CHECK-NEXT:  # %bb.0: # %entry555; CHECK-NEXT:    global.get __stack_pointer556; CHECK-NEXT:    i32.const 16557; CHECK-NEXT:    i32.sub558; CHECK-NEXT:    local.tee 1559; CHECK-NEXT:    global.set __stack_pointer560; CHECK-NEXT:    local.get 1561; CHECK-NEXT:    local.get 0562; CHECK-NEXT:    call __fixunsdfti563; CHECK-NEXT:    local.get 1564; CHECK-NEXT:    i64.load 8565; CHECK-NEXT:    local.set 2566; CHECK-NEXT:    local.get 1567; CHECK-NEXT:    i64.load 0568; CHECK-NEXT:    local.set 3569; CHECK-NEXT:    local.get 1570; CHECK-NEXT:    i32.const 16571; CHECK-NEXT:    i32.add572; CHECK-NEXT:    global.set __stack_pointer573; CHECK-NEXT:    local.get 3574; CHECK-NEXT:    i64.const 0575; CHECK-NEXT:    local.get 2576; CHECK-NEXT:    i64.eqz577; CHECK-NEXT:    i64.select578; CHECK-NEXT:    # fallthrough-return579entry:580  %conv = fptoui double %x to i128581  %spec.store.select = call i128 @llvm.umin.i128(i128 %conv, i128 18446744073709551616)582  %conv6 = trunc i128 %spec.store.select to i64583  ret i64 %conv6584}585 586 587define i64 @ustest_f64i64(double %x) {588; CHECK-LABEL: ustest_f64i64:589; CHECK:         .functype ustest_f64i64 (f64) -> (i64)590; CHECK-NEXT:    .local i32, i64, i64591; CHECK-NEXT:  # %bb.0: # %entry592; CHECK-NEXT:    global.get __stack_pointer593; CHECK-NEXT:    i32.const 16594; CHECK-NEXT:    i32.sub595; CHECK-NEXT:    local.tee 1596; CHECK-NEXT:    global.set __stack_pointer597; CHECK-NEXT:    local.get 1598; CHECK-NEXT:    local.get 0599; CHECK-NEXT:    call __fixdfti600; CHECK-NEXT:    local.get 1601; CHECK-NEXT:    i64.load 8602; CHECK-NEXT:    local.set 2603; CHECK-NEXT:    local.get 1604; CHECK-NEXT:    i64.load 0605; CHECK-NEXT:    local.set 3606; CHECK-NEXT:    local.get 1607; CHECK-NEXT:    i32.const 16608; CHECK-NEXT:    i32.add609; CHECK-NEXT:    global.set __stack_pointer610; CHECK-NEXT:    local.get 3611; CHECK-NEXT:    i64.const 0612; CHECK-NEXT:    local.get 2613; CHECK-NEXT:    i64.const 1614; CHECK-NEXT:    i64.lt_s615; CHECK-NEXT:    local.tee 1616; CHECK-NEXT:    i64.select617; CHECK-NEXT:    local.tee 3618; CHECK-NEXT:    i64.const 0619; CHECK-NEXT:    local.get 3620; CHECK-NEXT:    i64.const 0621; CHECK-NEXT:    i64.ne622; CHECK-NEXT:    local.get 2623; CHECK-NEXT:    i64.const 1624; CHECK-NEXT:    local.get 1625; CHECK-NEXT:    i64.select626; CHECK-NEXT:    local.tee 2627; CHECK-NEXT:    i64.const 0628; CHECK-NEXT:    i64.gt_s629; CHECK-NEXT:    local.get 2630; CHECK-NEXT:    i64.eqz631; CHECK-NEXT:    i32.select632; CHECK-NEXT:    i64.select633; CHECK-NEXT:    # fallthrough-return634entry:635  %conv = fptosi double %x to i128636  %0 = icmp slt i128 %conv, 18446744073709551616637  %spec.store.select = select i1 %0, i128 %conv, i128 18446744073709551616638  %1 = icmp sgt i128 %spec.store.select, 0639  %spec.store.select7 = select i1 %1, i128 %spec.store.select, i128 0640  %conv6 = trunc i128 %spec.store.select7 to i64641  ret i64 %conv6642}643 644define i64 @ustest_f64i64_cse_combine(double %x) #0 {645; CHECK-LABEL: ustest_f64i64_cse_combine:646; CHECK:         .functype ustest_f64i64_cse_combine (f64) -> (i64)647; CHECK-NEXT:    .local i32, i64, i64648; CHECK-NEXT:  # %bb.0: # %entry649; CHECK-NEXT:    global.get __stack_pointer650; CHECK-NEXT:    i32.const 16651; CHECK-NEXT:    i32.sub652; CHECK-NEXT:    local.tee 1653; CHECK-NEXT:    global.set __stack_pointer654; CHECK-NEXT:    local.get 1655; CHECK-NEXT:    local.get 0656; CHECK-NEXT:    call __fixdfti657; CHECK-NEXT:    local.get 1658; CHECK-NEXT:    i64.load 8659; CHECK-NEXT:    local.set 2660; CHECK-NEXT:    local.get 1661; CHECK-NEXT:    i64.load 0662; CHECK-NEXT:    local.set 3663; CHECK-NEXT:    local.get 1664; CHECK-NEXT:    i32.const 16665; CHECK-NEXT:    i32.add666; CHECK-NEXT:    global.set __stack_pointer667; CHECK-NEXT:    i64.const 0668; CHECK-NEXT:    local.get 3669; CHECK-NEXT:    i64.const 0670; CHECK-NEXT:    local.get 2671; CHECK-NEXT:    i64.const 1672; CHECK-NEXT:    i64.lt_s673; CHECK-NEXT:    local.tee 1674; CHECK-NEXT:    i64.select675; CHECK-NEXT:    local.get 2676; CHECK-NEXT:    i64.const 1677; CHECK-NEXT:    local.get 1678; CHECK-NEXT:    i64.select679; CHECK-NEXT:    i64.const 0680; CHECK-NEXT:    i64.lt_s681; CHECK-NEXT:    i64.select682; CHECK-NEXT:    # fallthrough-return683entry:684  %conv = fptosi double %x to i128685  %spec.store.select = call i128 @llvm.smin.i128(i128 %conv, i128 18446744073709551616)686  %spec.store.select7 = call i128 @llvm.smax.i128(i128 %spec.store.select, i128 0)687  %conv6 = trunc i128 %spec.store.select7 to i64688  ret i64 %conv6689}690 691define i64 @stest_f32i64(float %x) {692; CHECK-LABEL: stest_f32i64:693; CHECK:         .functype stest_f32i64 (f32) -> (i64)694; CHECK-NEXT:  # %bb.0: # %entry695; CHECK-NEXT:    local.get 0696; CHECK-NEXT:    i64.trunc_sat_f32_s697; CHECK-NEXT:    # fallthrough-return698entry:699  %conv = fptosi float %x to i128700  %0 = icmp slt i128 %conv, 9223372036854775807701  %spec.store.select = select i1 %0, i128 %conv, i128 9223372036854775807702  %1 = icmp sgt i128 %spec.store.select, -9223372036854775808703  %spec.store.select7 = select i1 %1, i128 %spec.store.select, i128 -9223372036854775808704  %conv6 = trunc i128 %spec.store.select7 to i64705  ret i64 %conv6706}707 708define i64 @utest_f32i64(float %x) {709; CHECK-LABEL: utest_f32i64:710; CHECK:         .functype utest_f32i64 (f32) -> (i64)711; CHECK-NEXT:    .local i32, i64, i64712; CHECK-NEXT:  # %bb.0: # %entry713; CHECK-NEXT:    global.get __stack_pointer714; CHECK-NEXT:    i32.const 16715; CHECK-NEXT:    i32.sub716; CHECK-NEXT:    local.tee 1717; CHECK-NEXT:    global.set __stack_pointer718; CHECK-NEXT:    local.get 1719; CHECK-NEXT:    local.get 0720; CHECK-NEXT:    call __fixunssfti721; CHECK-NEXT:    local.get 1722; CHECK-NEXT:    i64.load 8723; CHECK-NEXT:    local.set 2724; CHECK-NEXT:    local.get 1725; CHECK-NEXT:    i64.load 0726; CHECK-NEXT:    local.set 3727; CHECK-NEXT:    local.get 1728; CHECK-NEXT:    i32.const 16729; CHECK-NEXT:    i32.add730; CHECK-NEXT:    global.set __stack_pointer731; CHECK-NEXT:    local.get 3732; CHECK-NEXT:    i64.const 0733; CHECK-NEXT:    local.get 2734; CHECK-NEXT:    i64.eqz735; CHECK-NEXT:    i64.select736; CHECK-NEXT:    # fallthrough-return737entry:738  %conv = fptoui float %x to i128739  %0 = icmp ult i128 %conv, 18446744073709551616740  %spec.store.select = select i1 %0, i128 %conv, i128 18446744073709551616741  %conv6 = trunc i128 %spec.store.select to i64742  ret i64 %conv6743}744 745define i64 @stest_f32i64_cse_combine(float %x) #0 {746; CHECK-LABEL: stest_f32i64_cse_combine:747; CHECK:         .functype stest_f32i64_cse_combine (f32) -> (i64)748; CHECK-NEXT:  # %bb.0: # %entry749; CHECK-NEXT:    local.get 0750; CHECK-NEXT:    i64.trunc_sat_f32_s751; CHECK-NEXT:    # fallthrough-return752entry:753  %conv = fptosi float %x to i128754  %spec.store.select = call i128 @llvm.smin.i128(i128 %conv, i128 9223372036854775807)755  %spec.store.select7 = call i128 @llvm.smax.i128(i128 %spec.store.select, i128 -9223372036854775808)756  %conv6 = trunc i128 %spec.store.select7 to i64757  ret i64 %conv6758}759 760define i64 @ustest_f32i64(float %x) {761; CHECK-LABEL: ustest_f32i64:762; CHECK:         .functype ustest_f32i64 (f32) -> (i64)763; CHECK-NEXT:    .local i32, i64, i64764; CHECK-NEXT:  # %bb.0: # %entry765; CHECK-NEXT:    global.get __stack_pointer766; CHECK-NEXT:    i32.const 16767; CHECK-NEXT:    i32.sub768; CHECK-NEXT:    local.tee 1769; CHECK-NEXT:    global.set __stack_pointer770; CHECK-NEXT:    local.get 1771; CHECK-NEXT:    local.get 0772; CHECK-NEXT:    call __fixsfti773; CHECK-NEXT:    local.get 1774; CHECK-NEXT:    i64.load 8775; CHECK-NEXT:    local.set 2776; CHECK-NEXT:    local.get 1777; CHECK-NEXT:    i64.load 0778; CHECK-NEXT:    local.set 3779; CHECK-NEXT:    local.get 1780; CHECK-NEXT:    i32.const 16781; CHECK-NEXT:    i32.add782; CHECK-NEXT:    global.set __stack_pointer783; CHECK-NEXT:    local.get 3784; CHECK-NEXT:    i64.const 0785; CHECK-NEXT:    local.get 2786; CHECK-NEXT:    i64.const 1787; CHECK-NEXT:    i64.lt_s788; CHECK-NEXT:    local.tee 1789; CHECK-NEXT:    i64.select790; CHECK-NEXT:    local.tee 3791; CHECK-NEXT:    i64.const 0792; CHECK-NEXT:    local.get 3793; CHECK-NEXT:    i64.const 0794; CHECK-NEXT:    i64.ne795; CHECK-NEXT:    local.get 2796; CHECK-NEXT:    i64.const 1797; CHECK-NEXT:    local.get 1798; CHECK-NEXT:    i64.select799; CHECK-NEXT:    local.tee 2800; CHECK-NEXT:    i64.const 0801; CHECK-NEXT:    i64.gt_s802; CHECK-NEXT:    local.get 2803; CHECK-NEXT:    i64.eqz804; CHECK-NEXT:    i32.select805; CHECK-NEXT:    i64.select806; CHECK-NEXT:    # fallthrough-return807entry:808  %conv = fptosi float %x to i128809  %0 = icmp slt i128 %conv, 18446744073709551616810  %spec.store.select = select i1 %0, i128 %conv, i128 18446744073709551616811  %1 = icmp sgt i128 %spec.store.select, 0812  %spec.store.select7 = select i1 %1, i128 %spec.store.select, i128 0813  %conv6 = trunc i128 %spec.store.select7 to i64814  ret i64 %conv6815}816 817define i64 @ustest_f32i64_cse_combine(float %x) #0 {818; CHECK-LABEL: ustest_f32i64_cse_combine:819; CHECK:         .functype ustest_f32i64_cse_combine (f32) -> (i64)820; CHECK-NEXT:    .local i32, i64, i64821; CHECK-NEXT:  # %bb.0: # %entry822; CHECK-NEXT:    global.get __stack_pointer823; CHECK-NEXT:    i32.const 16824; CHECK-NEXT:    i32.sub825; CHECK-NEXT:    local.tee 1826; CHECK-NEXT:    global.set __stack_pointer827; CHECK-NEXT:    local.get 1828; CHECK-NEXT:    local.get 0829; CHECK-NEXT:    call __fixsfti830; CHECK-NEXT:    local.get 1831; CHECK-NEXT:    i64.load 8832; CHECK-NEXT:    local.set 2833; CHECK-NEXT:    local.get 1834; CHECK-NEXT:    i64.load 0835; CHECK-NEXT:    local.set 3836; CHECK-NEXT:    local.get 1837; CHECK-NEXT:    i32.const 16838; CHECK-NEXT:    i32.add839; CHECK-NEXT:    global.set __stack_pointer840; CHECK-NEXT:    i64.const 0841; CHECK-NEXT:    local.get 3842; CHECK-NEXT:    i64.const 0843; CHECK-NEXT:    local.get 2844; CHECK-NEXT:    i64.const 1845; CHECK-NEXT:    i64.lt_s846; CHECK-NEXT:    local.tee 1847; CHECK-NEXT:    i64.select848; CHECK-NEXT:    local.get 2849; CHECK-NEXT:    i64.const 1850; CHECK-NEXT:    local.get 1851; CHECK-NEXT:    i64.select852; CHECK-NEXT:    i64.const 0853; CHECK-NEXT:    i64.lt_s854; CHECK-NEXT:    i64.select855; CHECK-NEXT:    # fallthrough-return856entry:857  %conv = fptosi float %x to i128858  %spec.store.select = call i128 @llvm.smin.i128(i128 %conv, i128 18446744073709551616)859  %spec.store.select7 = call i128 @llvm.smax.i128(i128 %spec.store.select, i128 0)860  %conv6 = trunc i128 %spec.store.select7 to i64861  ret i64 %conv6862}863 864define i64 @stest_f16i64(half %x) {865; CHECK-LABEL: stest_f16i64:866; CHECK:         .functype stest_f16i64 (f32) -> (i64)867; CHECK-NEXT:  # %bb.0: # %entry868; CHECK-NEXT:    local.get 0869; CHECK-NEXT:    call __truncsfhf2870; CHECK-NEXT:    call __extendhfsf2871; CHECK-NEXT:    i64.trunc_sat_f32_s872; CHECK-NEXT:    # fallthrough-return873entry:874  %conv = fptosi half %x to i128875  %0 = icmp slt i128 %conv, 9223372036854775807876  %spec.store.select = select i1 %0, i128 %conv, i128 9223372036854775807877  %1 = icmp sgt i128 %spec.store.select, -9223372036854775808878  %spec.store.select7 = select i1 %1, i128 %spec.store.select, i128 -9223372036854775808879  %conv6 = trunc i128 %spec.store.select7 to i64880  ret i64 %conv6881}882 883define i64 @utest_f16i64(half %x) {884; CHECK-LABEL: utest_f16i64:885; CHECK:         .functype utest_f16i64 (f32) -> (i64)886; CHECK-NEXT:    .local i32, i64, i64887; CHECK-NEXT:  # %bb.0: # %entry888; CHECK-NEXT:    global.get __stack_pointer889; CHECK-NEXT:    i32.const 16890; CHECK-NEXT:    i32.sub891; CHECK-NEXT:    local.tee 1892; CHECK-NEXT:    global.set __stack_pointer893; CHECK-NEXT:    local.get 1894; CHECK-NEXT:    local.get 0895; CHECK-NEXT:    call __truncsfhf2896; CHECK-NEXT:    call __extendhfsf2897; CHECK-NEXT:    call __fixunssfti898; CHECK-NEXT:    local.get 1899; CHECK-NEXT:    i64.load 8900; CHECK-NEXT:    local.set 2901; CHECK-NEXT:    local.get 1902; CHECK-NEXT:    i64.load 0903; CHECK-NEXT:    local.set 3904; CHECK-NEXT:    local.get 1905; CHECK-NEXT:    i32.const 16906; CHECK-NEXT:    i32.add907; CHECK-NEXT:    global.set __stack_pointer908; CHECK-NEXT:    local.get 3909; CHECK-NEXT:    i64.const 0910; CHECK-NEXT:    local.get 2911; CHECK-NEXT:    i64.eqz912; CHECK-NEXT:    i64.select913; CHECK-NEXT:    # fallthrough-return914entry:915  %conv = fptoui half %x to i128916  %0 = icmp ult i128 %conv, 18446744073709551616917  %spec.store.select = select i1 %0, i128 %conv, i128 18446744073709551616918  %conv6 = trunc i128 %spec.store.select to i64919  ret i64 %conv6920}921 922define i64 @utest_f16i64_cse(half %x) {923; CHECK-LABEL: utest_f16i64_cse:924; CHECK:         .functype utest_f16i64_cse (f32) -> (i64)925; CHECK-NEXT:    .local i32, i64926; CHECK-NEXT:  # %bb.0: # %entry927; CHECK-NEXT:    global.get __stack_pointer928; CHECK-NEXT:    i32.const 16929; CHECK-NEXT:    i32.sub930; CHECK-NEXT:    local.tee 1931; CHECK-NEXT:    global.set __stack_pointer932; CHECK-NEXT:    local.get 1933; CHECK-NEXT:    local.get 0934; CHECK-NEXT:    call __truncsfhf2935; CHECK-NEXT:    call __extendhfsf2936; CHECK-NEXT:    call __fixunssfti937; CHECK-NEXT:    local.get 1938; CHECK-NEXT:    i64.load 0939; CHECK-NEXT:    local.set 2940; CHECK-NEXT:    local.get 1941; CHECK-NEXT:    i32.const 16942; CHECK-NEXT:    i32.add943; CHECK-NEXT:    global.set __stack_pointer944; CHECK-NEXT:    local.get 2945; CHECK-NEXT:    # fallthrough-return946entry:947  %conv = fptoui half %x to i128948  %conv6 = trunc i128 %conv to i64949  ret i64 %conv6950}951 952define i64 @ustest_f16i64(half %x) {953; CHECK-LABEL: ustest_f16i64:954; CHECK:         .functype ustest_f16i64 (f32) -> (i64)955; CHECK-NEXT:    .local i32, i64, i64956; CHECK-NEXT:  # %bb.0: # %entry957; CHECK-NEXT:    global.get __stack_pointer958; CHECK-NEXT:    i32.const 16959; CHECK-NEXT:    i32.sub960; CHECK-NEXT:    local.tee 1961; CHECK-NEXT:    global.set __stack_pointer962; CHECK-NEXT:    local.get 1963; CHECK-NEXT:    local.get 0964; CHECK-NEXT:    call __truncsfhf2965; CHECK-NEXT:    call __extendhfsf2966; CHECK-NEXT:    call __fixsfti967; CHECK-NEXT:    local.get 1968; CHECK-NEXT:    i64.load 8969; CHECK-NEXT:    local.set 2970; CHECK-NEXT:    local.get 1971; CHECK-NEXT:    i64.load 0972; CHECK-NEXT:    local.set 3973; CHECK-NEXT:    local.get 1974; CHECK-NEXT:    i32.const 16975; CHECK-NEXT:    i32.add976; CHECK-NEXT:    global.set __stack_pointer977; CHECK-NEXT:    local.get 3978; CHECK-NEXT:    i64.const 0979; CHECK-NEXT:    local.get 2980; CHECK-NEXT:    i64.const 1981; CHECK-NEXT:    i64.lt_s982; CHECK-NEXT:    local.tee 1983; CHECK-NEXT:    i64.select984; CHECK-NEXT:    local.tee 3985; CHECK-NEXT:    i64.const 0986; CHECK-NEXT:    local.get 3987; CHECK-NEXT:    i64.const 0988; CHECK-NEXT:    i64.ne989; CHECK-NEXT:    local.get 2990; CHECK-NEXT:    i64.const 1991; CHECK-NEXT:    local.get 1992; CHECK-NEXT:    i64.select993; CHECK-NEXT:    local.tee 2994; CHECK-NEXT:    i64.const 0995; CHECK-NEXT:    i64.gt_s996; CHECK-NEXT:    local.get 2997; CHECK-NEXT:    i64.eqz998; CHECK-NEXT:    i32.select999; CHECK-NEXT:    i64.select1000; CHECK-NEXT:    # fallthrough-return1001entry:1002  %conv = fptosi half %x to i1281003  %0 = icmp slt i128 %conv, 184467440737095516161004  %spec.store.select = select i1 %0, i128 %conv, i128 184467440737095516161005  %1 = icmp sgt i128 %spec.store.select, 01006  %spec.store.select7 = select i1 %1, i128 %spec.store.select, i128 01007  %conv6 = trunc i128 %spec.store.select7 to i641008  ret i64 %conv61009}1010 1011 1012 1013 1014; i32 saturate1015 1016define i32 @stest_f64i32_mm(double %x) {1017; CHECK-LABEL: stest_f64i32_mm:1018; CHECK:         .functype stest_f64i32_mm (f64) -> (i32)1019; CHECK-NEXT:  # %bb.0: # %entry1020; CHECK-NEXT:    local.get 01021; CHECK-NEXT:    i32.trunc_sat_f64_s1022; CHECK-NEXT:    # fallthrough-return1023entry:1024  %conv = fptosi double %x to i641025  %spec.store.select = call i64 @llvm.smin.i64(i64 %conv, i64 2147483647)1026  %spec.store.select7 = call i64 @llvm.smax.i64(i64 %spec.store.select, i64 -2147483648)1027  %conv6 = trunc i64 %spec.store.select7 to i321028  ret i32 %conv61029}1030 1031define i32 @utest_f64i32_mm(double %x) {1032; CHECK-LABEL: utest_f64i32_mm:1033; CHECK:         .functype utest_f64i32_mm (f64) -> (i32)1034; CHECK-NEXT:  # %bb.0: # %entry1035; CHECK-NEXT:    local.get 01036; CHECK-NEXT:    i32.trunc_sat_f64_u1037; CHECK-NEXT:    # fallthrough-return1038entry:1039  %conv = fptoui double %x to i641040  %spec.store.select = call i64 @llvm.umin.i64(i64 %conv, i64 4294967295)1041  %conv6 = trunc i64 %spec.store.select to i321042  ret i32 %conv61043}1044 1045define i32 @ustest_f64i32_mm(double %x) {1046; CHECK-LABEL: ustest_f64i32_mm:1047; CHECK:         .functype ustest_f64i32_mm (f64) -> (i32)1048; CHECK-NEXT:  # %bb.0: # %entry1049; CHECK-NEXT:    local.get 01050; CHECK-NEXT:    i32.trunc_sat_f64_u1051; CHECK-NEXT:    # fallthrough-return1052entry:1053  %conv = fptosi double %x to i641054  %spec.store.select = call i64 @llvm.smin.i64(i64 %conv, i64 4294967295)1055  %spec.store.select7 = call i64 @llvm.smax.i64(i64 %spec.store.select, i64 0)1056  %conv6 = trunc i64 %spec.store.select7 to i321057  ret i32 %conv61058}1059 1060define i32 @stest_f32i32_mm(float %x) {1061; CHECK-LABEL: stest_f32i32_mm:1062; CHECK:         .functype stest_f32i32_mm (f32) -> (i32)1063; CHECK-NEXT:  # %bb.0: # %entry1064; CHECK-NEXT:    local.get 01065; CHECK-NEXT:    i32.trunc_sat_f32_s1066; CHECK-NEXT:    # fallthrough-return1067entry:1068  %conv = fptosi float %x to i641069  %spec.store.select = call i64 @llvm.smin.i64(i64 %conv, i64 2147483647)1070  %spec.store.select7 = call i64 @llvm.smax.i64(i64 %spec.store.select, i64 -2147483648)1071  %conv6 = trunc i64 %spec.store.select7 to i321072  ret i32 %conv61073}1074 1075define i32 @utest_f32i32_mm(float %x) {1076; CHECK-LABEL: utest_f32i32_mm:1077; CHECK:         .functype utest_f32i32_mm (f32) -> (i32)1078; CHECK-NEXT:  # %bb.0: # %entry1079; CHECK-NEXT:    local.get 01080; CHECK-NEXT:    i32.trunc_sat_f32_u1081; CHECK-NEXT:    # fallthrough-return1082entry:1083  %conv = fptoui float %x to i641084  %spec.store.select = call i64 @llvm.umin.i64(i64 %conv, i64 4294967295)1085  %conv6 = trunc i64 %spec.store.select to i321086  ret i32 %conv61087}1088 1089define i32 @ustest_f32i32_mm(float %x) {1090; CHECK-LABEL: ustest_f32i32_mm:1091; CHECK:         .functype ustest_f32i32_mm (f32) -> (i32)1092; CHECK-NEXT:  # %bb.0: # %entry1093; CHECK-NEXT:    local.get 01094; CHECK-NEXT:    i32.trunc_sat_f32_u1095; CHECK-NEXT:    # fallthrough-return1096entry:1097  %conv = fptosi float %x to i641098  %spec.store.select = call i64 @llvm.smin.i64(i64 %conv, i64 4294967295)1099  %spec.store.select7 = call i64 @llvm.smax.i64(i64 %spec.store.select, i64 0)1100  %conv6 = trunc i64 %spec.store.select7 to i321101  ret i32 %conv61102}1103 1104define i32 @stest_f16i32_mm(half %x) {1105; CHECK-LABEL: stest_f16i32_mm:1106; CHECK:         .functype stest_f16i32_mm (f32) -> (i32)1107; CHECK-NEXT:  # %bb.0: # %entry1108; CHECK-NEXT:    local.get 01109; CHECK-NEXT:    call __truncsfhf21110; CHECK-NEXT:    call __extendhfsf21111; CHECK-NEXT:    i32.trunc_sat_f32_s1112; CHECK-NEXT:    # fallthrough-return1113entry:1114  %conv = fptosi half %x to i641115  %spec.store.select = call i64 @llvm.smin.i64(i64 %conv, i64 2147483647)1116  %spec.store.select7 = call i64 @llvm.smax.i64(i64 %spec.store.select, i64 -2147483648)1117  %conv6 = trunc i64 %spec.store.select7 to i321118  ret i32 %conv61119}1120 1121define i32 @utest_f16i32_mm(half %x) {1122; CHECK-LABEL: utest_f16i32_mm:1123; CHECK:         .functype utest_f16i32_mm (f32) -> (i32)1124; CHECK-NEXT:  # %bb.0: # %entry1125; CHECK-NEXT:    local.get 01126; CHECK-NEXT:    call __truncsfhf21127; CHECK-NEXT:    call __extendhfsf21128; CHECK-NEXT:    i32.trunc_sat_f32_u1129; CHECK-NEXT:    # fallthrough-return1130entry:1131  %conv = fptoui half %x to i641132  %spec.store.select = call i64 @llvm.umin.i64(i64 %conv, i64 4294967295)1133  %conv6 = trunc i64 %spec.store.select to i321134  ret i32 %conv61135}1136 1137define i32 @ustest_f16i32_mm(half %x) {1138; CHECK-LABEL: ustest_f16i32_mm:1139; CHECK:         .functype ustest_f16i32_mm (f32) -> (i32)1140; CHECK-NEXT:  # %bb.0: # %entry1141; CHECK-NEXT:    local.get 01142; CHECK-NEXT:    call __truncsfhf21143; CHECK-NEXT:    call __extendhfsf21144; CHECK-NEXT:    i32.trunc_sat_f32_u1145; CHECK-NEXT:    # fallthrough-return1146entry:1147  %conv = fptosi half %x to i641148  %spec.store.select = call i64 @llvm.smin.i64(i64 %conv, i64 4294967295)1149  %spec.store.select7 = call i64 @llvm.smax.i64(i64 %spec.store.select, i64 0)1150  %conv6 = trunc i64 %spec.store.select7 to i321151  ret i32 %conv61152}1153 1154define i32 @ustest_f16i32_mm_cse(half %x) {1155; CHECK-LABEL: ustest_f16i32_mm_cse:1156; CHECK:         .functype ustest_f16i32_mm_cse (f32) -> (i32)1157; CHECK-NEXT:  # %bb.0: # %entry1158; CHECK-NEXT:    local.get 01159; CHECK-NEXT:    call __truncsfhf21160; CHECK-NEXT:    call __extendhfsf21161; CHECK-NEXT:    i32.trunc_sat_f32_u1162; CHECK-NEXT:    # fallthrough-return1163entry:1164  %conv = fptosi half %x to i641165  %spec.store.select7 = call i64 @llvm.smax.i64(i64 %conv, i64 0)1166  %conv6 = trunc i64 %spec.store.select7 to i321167  ret i32 %conv61168}1169 1170; i16 saturate1171 1172define i16 @stest_f64i16_mm(double %x) {1173; CHECK-LABEL: stest_f64i16_mm:1174; CHECK:         .functype stest_f64i16_mm (f64) -> (i32)1175; CHECK-NEXT:    .local i321176; CHECK-NEXT:  # %bb.0: # %entry1177; CHECK-NEXT:    local.get 01178; CHECK-NEXT:    i32.trunc_sat_f64_s1179; CHECK-NEXT:    local.tee 11180; CHECK-NEXT:    i32.const 327671181; CHECK-NEXT:    local.get 11182; CHECK-NEXT:    i32.const 327671183; CHECK-NEXT:    i32.lt_s1184; CHECK-NEXT:    i32.select1185; CHECK-NEXT:    local.tee 11186; CHECK-NEXT:    i32.const -327681187; CHECK-NEXT:    local.get 11188; CHECK-NEXT:    i32.const -327681189; CHECK-NEXT:    i32.gt_s1190; CHECK-NEXT:    i32.select1191; CHECK-NEXT:    # fallthrough-return1192entry:1193  %conv = fptosi double %x to i321194  %spec.store.select = call i32 @llvm.smin.i32(i32 %conv, i32 32767)1195  %spec.store.select7 = call i32 @llvm.smax.i32(i32 %spec.store.select, i32 -32768)1196  %conv6 = trunc i32 %spec.store.select7 to i161197  ret i16 %conv61198}1199 1200define i16 @utest_f64i16_mm(double %x) {1201; CHECK-LABEL: utest_f64i16_mm:1202; CHECK:         .functype utest_f64i16_mm (f64) -> (i32)1203; CHECK-NEXT:    .local i321204; CHECK-NEXT:  # %bb.0: # %entry1205; CHECK-NEXT:    local.get 01206; CHECK-NEXT:    i32.trunc_sat_f64_u1207; CHECK-NEXT:    local.tee 11208; CHECK-NEXT:    i32.const 655351209; CHECK-NEXT:    local.get 11210; CHECK-NEXT:    i32.const 655351211; CHECK-NEXT:    i32.lt_u1212; CHECK-NEXT:    i32.select1213; CHECK-NEXT:    # fallthrough-return1214entry:1215  %conv = fptoui double %x to i321216  %spec.store.select = call i32 @llvm.umin.i32(i32 %conv, i32 65535)1217  %conv6 = trunc i32 %spec.store.select to i161218  ret i16 %conv61219}1220 1221define i16 @ustest_f64i16_mm(double %x) {1222; CHECK-LABEL: ustest_f64i16_mm:1223; CHECK:         .functype ustest_f64i16_mm (f64) -> (i32)1224; CHECK-NEXT:    .local i321225; CHECK-NEXT:  # %bb.0: # %entry1226; CHECK-NEXT:    local.get 01227; CHECK-NEXT:    i32.trunc_sat_f64_s1228; CHECK-NEXT:    local.tee 11229; CHECK-NEXT:    i32.const 655351230; CHECK-NEXT:    local.get 11231; CHECK-NEXT:    i32.const 655351232; CHECK-NEXT:    i32.lt_s1233; CHECK-NEXT:    i32.select1234; CHECK-NEXT:    local.tee 11235; CHECK-NEXT:    i32.const 01236; CHECK-NEXT:    local.get 11237; CHECK-NEXT:    i32.const 01238; CHECK-NEXT:    i32.gt_s1239; CHECK-NEXT:    i32.select1240; CHECK-NEXT:    # fallthrough-return1241entry:1242  %conv = fptosi double %x to i321243  %spec.store.select = call i32 @llvm.smin.i32(i32 %conv, i32 65535)1244  %spec.store.select7 = call i32 @llvm.smax.i32(i32 %spec.store.select, i32 0)1245  %conv6 = trunc i32 %spec.store.select7 to i161246  ret i16 %conv61247}1248 1249define i16 @stest_f32i16_mm(float %x) {1250; CHECK-LABEL: stest_f32i16_mm:1251; CHECK:         .functype stest_f32i16_mm (f32) -> (i32)1252; CHECK-NEXT:    .local i321253; CHECK-NEXT:  # %bb.0: # %entry1254; CHECK-NEXT:    local.get 01255; CHECK-NEXT:    i32.trunc_sat_f32_s1256; CHECK-NEXT:    local.tee 11257; CHECK-NEXT:    i32.const 327671258; CHECK-NEXT:    local.get 11259; CHECK-NEXT:    i32.const 327671260; CHECK-NEXT:    i32.lt_s1261; CHECK-NEXT:    i32.select1262; CHECK-NEXT:    local.tee 11263; CHECK-NEXT:    i32.const -327681264; CHECK-NEXT:    local.get 11265; CHECK-NEXT:    i32.const -327681266; CHECK-NEXT:    i32.gt_s1267; CHECK-NEXT:    i32.select1268; CHECK-NEXT:    # fallthrough-return1269entry:1270  %conv = fptosi float %x to i321271  %spec.store.select = call i32 @llvm.smin.i32(i32 %conv, i32 32767)1272  %spec.store.select7 = call i32 @llvm.smax.i32(i32 %spec.store.select, i32 -32768)1273  %conv6 = trunc i32 %spec.store.select7 to i161274  ret i16 %conv61275}1276 1277define i16 @utest_f32i16_mm(float %x) {1278; CHECK-LABEL: utest_f32i16_mm:1279; CHECK:         .functype utest_f32i16_mm (f32) -> (i32)1280; CHECK-NEXT:    .local i321281; CHECK-NEXT:  # %bb.0: # %entry1282; CHECK-NEXT:    local.get 01283; CHECK-NEXT:    i32.trunc_sat_f32_u1284; CHECK-NEXT:    local.tee 11285; CHECK-NEXT:    i32.const 655351286; CHECK-NEXT:    local.get 11287; CHECK-NEXT:    i32.const 655351288; CHECK-NEXT:    i32.lt_u1289; CHECK-NEXT:    i32.select1290; CHECK-NEXT:    # fallthrough-return1291entry:1292  %conv = fptoui float %x to i321293  %spec.store.select = call i32 @llvm.umin.i32(i32 %conv, i32 65535)1294  %conv6 = trunc i32 %spec.store.select to i161295  ret i16 %conv61296}1297 1298define i16 @ustest_f32i16_mm(float %x) {1299; CHECK-LABEL: ustest_f32i16_mm:1300; CHECK:         .functype ustest_f32i16_mm (f32) -> (i32)1301; CHECK-NEXT:    .local i321302; CHECK-NEXT:  # %bb.0: # %entry1303; CHECK-NEXT:    local.get 01304; CHECK-NEXT:    i32.trunc_sat_f32_s1305; CHECK-NEXT:    local.tee 11306; CHECK-NEXT:    i32.const 655351307; CHECK-NEXT:    local.get 11308; CHECK-NEXT:    i32.const 655351309; CHECK-NEXT:    i32.lt_s1310; CHECK-NEXT:    i32.select1311; CHECK-NEXT:    local.tee 11312; CHECK-NEXT:    i32.const 01313; CHECK-NEXT:    local.get 11314; CHECK-NEXT:    i32.const 01315; CHECK-NEXT:    i32.gt_s1316; CHECK-NEXT:    i32.select1317; CHECK-NEXT:    # fallthrough-return1318entry:1319  %conv = fptosi float %x to i321320  %spec.store.select = call i32 @llvm.smin.i32(i32 %conv, i32 65535)1321  %spec.store.select7 = call i32 @llvm.smax.i32(i32 %spec.store.select, i32 0)1322  %conv6 = trunc i32 %spec.store.select7 to i161323  ret i16 %conv61324}1325 1326define i16 @stest_f16i16_mm(half %x) {1327; CHECK-LABEL: stest_f16i16_mm:1328; CHECK:         .functype stest_f16i16_mm (f32) -> (i32)1329; CHECK-NEXT:    .local i321330; CHECK-NEXT:  # %bb.0: # %entry1331; CHECK-NEXT:    local.get 01332; CHECK-NEXT:    call __truncsfhf21333; CHECK-NEXT:    call __extendhfsf21334; CHECK-NEXT:    i32.trunc_sat_f32_s1335; CHECK-NEXT:    local.tee 11336; CHECK-NEXT:    i32.const 327671337; CHECK-NEXT:    local.get 11338; CHECK-NEXT:    i32.const 327671339; CHECK-NEXT:    i32.lt_s1340; CHECK-NEXT:    i32.select1341; CHECK-NEXT:    local.tee 11342; CHECK-NEXT:    i32.const -327681343; CHECK-NEXT:    local.get 11344; CHECK-NEXT:    i32.const -327681345; CHECK-NEXT:    i32.gt_s1346; CHECK-NEXT:    i32.select1347; CHECK-NEXT:    # fallthrough-return1348entry:1349  %conv = fptosi half %x to i321350  %spec.store.select = call i32 @llvm.smin.i32(i32 %conv, i32 32767)1351  %spec.store.select7 = call i32 @llvm.smax.i32(i32 %spec.store.select, i32 -32768)1352  %conv6 = trunc i32 %spec.store.select7 to i161353  ret i16 %conv61354}1355 1356define i16 @utest_f16i16_mm(half %x) {1357; CHECK-LABEL: utest_f16i16_mm:1358; CHECK:         .functype utest_f16i16_mm (f32) -> (i32)1359; CHECK-NEXT:    .local i321360; CHECK-NEXT:  # %bb.0: # %entry1361; CHECK-NEXT:    local.get 01362; CHECK-NEXT:    call __truncsfhf21363; CHECK-NEXT:    call __extendhfsf21364; CHECK-NEXT:    i32.trunc_sat_f32_u1365; CHECK-NEXT:    local.tee 11366; CHECK-NEXT:    i32.const 655351367; CHECK-NEXT:    local.get 11368; CHECK-NEXT:    i32.const 655351369; CHECK-NEXT:    i32.lt_u1370; CHECK-NEXT:    i32.select1371; CHECK-NEXT:    # fallthrough-return1372entry:1373  %conv = fptoui half %x to i321374  %spec.store.select = call i32 @llvm.umin.i32(i32 %conv, i32 65535)1375  %conv6 = trunc i32 %spec.store.select to i161376  ret i16 %conv61377}1378 1379define i16 @ustest_f16i16_mm(half %x) {1380; CHECK-LABEL: ustest_f16i16_mm:1381; CHECK:         .functype ustest_f16i16_mm (f32) -> (i32)1382; CHECK-NEXT:    .local i321383; CHECK-NEXT:  # %bb.0: # %entry1384; CHECK-NEXT:    local.get 01385; CHECK-NEXT:    call __truncsfhf21386; CHECK-NEXT:    call __extendhfsf21387; CHECK-NEXT:    i32.trunc_sat_f32_s1388; CHECK-NEXT:    local.tee 11389; CHECK-NEXT:    i32.const 655351390; CHECK-NEXT:    local.get 11391; CHECK-NEXT:    i32.const 655351392; CHECK-NEXT:    i32.lt_s1393; CHECK-NEXT:    i32.select1394; CHECK-NEXT:    local.tee 11395; CHECK-NEXT:    i32.const 01396; CHECK-NEXT:    local.get 11397; CHECK-NEXT:    i32.const 01398; CHECK-NEXT:    i32.gt_s1399; CHECK-NEXT:    i32.select1400; CHECK-NEXT:    # fallthrough-return1401entry:1402  %conv = fptosi half %x to i321403  %spec.store.select = call i32 @llvm.smin.i32(i32 %conv, i32 65535)1404  %spec.store.select7 = call i32 @llvm.smax.i32(i32 %spec.store.select, i32 0)1405  %conv6 = trunc i32 %spec.store.select7 to i161406  ret i16 %conv61407}1408 1409define i16 @ustest_f16i16_mm_cse(half %x) {1410; CHECK-LABEL: ustest_f16i16_mm_cse:1411; CHECK:         .functype ustest_f16i16_mm_cse (f32) -> (i32)1412; CHECK-NEXT:  # %bb.0: # %entry1413; CHECK-NEXT:    local.get 01414; CHECK-NEXT:    call __truncsfhf21415; CHECK-NEXT:    call __extendhfsf21416; CHECK-NEXT:    i32.trunc_sat_f32_u1417; CHECK-NEXT:    # fallthrough-return1418entry:1419  %conv = fptosi half %x to i321420  %spec.store.select7 = call i32 @llvm.smax.i32(i32 %conv, i32 0)1421  %conv6 = trunc i32 %spec.store.select7 to i161422  ret i16 %conv61423}1424 1425; i64 saturate1426 1427define i64 @stest_f64i64_mm(double %x) {1428; CHECK-LABEL: stest_f64i64_mm:1429; CHECK:         .functype stest_f64i64_mm (f64) -> (i64)1430; CHECK-NEXT:  # %bb.0: # %entry1431; CHECK-NEXT:    local.get 01432; CHECK-NEXT:    i64.trunc_sat_f64_s1433; CHECK-NEXT:    # fallthrough-return1434entry:1435  %conv = fptosi double %x to i1281436  %spec.store.select = call i128 @llvm.smin.i128(i128 %conv, i128 9223372036854775807)1437  %spec.store.select7 = call i128 @llvm.smax.i128(i128 %spec.store.select, i128 -9223372036854775808)1438  %conv6 = trunc i128 %spec.store.select7 to i641439  ret i64 %conv61440}1441 1442define i64 @utest_f64i64_mm(double %x) {1443; CHECK-LABEL: utest_f64i64_mm:1444; CHECK:         .functype utest_f64i64_mm (f64) -> (i64)1445; CHECK-NEXT:    .local i32, i64, i641446; CHECK-NEXT:  # %bb.0: # %entry1447; CHECK-NEXT:    global.get __stack_pointer1448; CHECK-NEXT:    i32.const 161449; CHECK-NEXT:    i32.sub1450; CHECK-NEXT:    local.tee 11451; CHECK-NEXT:    global.set __stack_pointer1452; CHECK-NEXT:    local.get 11453; CHECK-NEXT:    local.get 01454; CHECK-NEXT:    call __fixunsdfti1455; CHECK-NEXT:    local.get 11456; CHECK-NEXT:    i64.load 81457; CHECK-NEXT:    local.set 21458; CHECK-NEXT:    local.get 11459; CHECK-NEXT:    i64.load 01460; CHECK-NEXT:    local.set 31461; CHECK-NEXT:    local.get 11462; CHECK-NEXT:    i32.const 161463; CHECK-NEXT:    i32.add1464; CHECK-NEXT:    global.set __stack_pointer1465; CHECK-NEXT:    local.get 31466; CHECK-NEXT:    i64.const 01467; CHECK-NEXT:    local.get 21468; CHECK-NEXT:    i64.eqz1469; CHECK-NEXT:    i64.select1470; CHECK-NEXT:    # fallthrough-return1471entry:1472  %conv = fptoui double %x to i1281473  %spec.store.select = call i128 @llvm.umin.i128(i128 %conv, i128 18446744073709551616)1474  %conv6 = trunc i128 %spec.store.select to i641475  ret i64 %conv61476}1477 1478define i64 @ustest_f64i64_mm(double %x) {1479; CHECK-LABEL: ustest_f64i64_mm:1480; CHECK:         .functype ustest_f64i64_mm (f64) -> (i64)1481; CHECK-NEXT:    .local i32, i64, i641482; CHECK-NEXT:  # %bb.0: # %entry1483; CHECK-NEXT:    global.get __stack_pointer1484; CHECK-NEXT:    i32.const 161485; CHECK-NEXT:    i32.sub1486; CHECK-NEXT:    local.tee 11487; CHECK-NEXT:    global.set __stack_pointer1488; CHECK-NEXT:    local.get 11489; CHECK-NEXT:    local.get 01490; CHECK-NEXT:    call __fixdfti1491; CHECK-NEXT:    local.get 11492; CHECK-NEXT:    i64.load 81493; CHECK-NEXT:    local.set 21494; CHECK-NEXT:    local.get 11495; CHECK-NEXT:    i64.load 01496; CHECK-NEXT:    local.set 31497; CHECK-NEXT:    local.get 11498; CHECK-NEXT:    i32.const 161499; CHECK-NEXT:    i32.add1500; CHECK-NEXT:    global.set __stack_pointer1501; CHECK-NEXT:    i64.const 01502; CHECK-NEXT:    local.get 31503; CHECK-NEXT:    i64.const 01504; CHECK-NEXT:    local.get 21505; CHECK-NEXT:    i64.const 11506; CHECK-NEXT:    i64.lt_s1507; CHECK-NEXT:    local.tee 11508; CHECK-NEXT:    i64.select1509; CHECK-NEXT:    local.get 21510; CHECK-NEXT:    i64.const 11511; CHECK-NEXT:    local.get 11512; CHECK-NEXT:    i64.select1513; CHECK-NEXT:    i64.const 01514; CHECK-NEXT:    i64.lt_s1515; CHECK-NEXT:    i64.select1516; CHECK-NEXT:    # fallthrough-return1517entry:1518  %conv = fptosi double %x to i1281519  %spec.store.select = call i128 @llvm.smin.i128(i128 %conv, i128 18446744073709551616)1520  %spec.store.select7 = call i128 @llvm.smax.i128(i128 %spec.store.select, i128 0)1521  %conv6 = trunc i128 %spec.store.select7 to i641522  ret i64 %conv61523}1524 1525define i64 @stest_f32i64_mm(float %x) {1526; CHECK-LABEL: stest_f32i64_mm:1527; CHECK:         .functype stest_f32i64_mm (f32) -> (i64)1528; CHECK-NEXT:  # %bb.0: # %entry1529; CHECK-NEXT:    local.get 01530; CHECK-NEXT:    i64.trunc_sat_f32_s1531; CHECK-NEXT:    # fallthrough-return1532entry:1533  %conv = fptosi float %x to i1281534  %spec.store.select = call i128 @llvm.smin.i128(i128 %conv, i128 9223372036854775807)1535  %spec.store.select7 = call i128 @llvm.smax.i128(i128 %spec.store.select, i128 -9223372036854775808)1536  %conv6 = trunc i128 %spec.store.select7 to i641537  ret i64 %conv61538}1539 1540define i64 @utest_f32i64_mm(float %x) {1541; CHECK-LABEL: utest_f32i64_mm:1542; CHECK:         .functype utest_f32i64_mm (f32) -> (i64)1543; CHECK-NEXT:    .local i32, i64, i641544; CHECK-NEXT:  # %bb.0: # %entry1545; CHECK-NEXT:    global.get __stack_pointer1546; CHECK-NEXT:    i32.const 161547; CHECK-NEXT:    i32.sub1548; CHECK-NEXT:    local.tee 11549; CHECK-NEXT:    global.set __stack_pointer1550; CHECK-NEXT:    local.get 11551; CHECK-NEXT:    local.get 01552; CHECK-NEXT:    call __fixunssfti1553; CHECK-NEXT:    local.get 11554; CHECK-NEXT:    i64.load 81555; CHECK-NEXT:    local.set 21556; CHECK-NEXT:    local.get 11557; CHECK-NEXT:    i64.load 01558; CHECK-NEXT:    local.set 31559; CHECK-NEXT:    local.get 11560; CHECK-NEXT:    i32.const 161561; CHECK-NEXT:    i32.add1562; CHECK-NEXT:    global.set __stack_pointer1563; CHECK-NEXT:    local.get 31564; CHECK-NEXT:    i64.const 01565; CHECK-NEXT:    local.get 21566; CHECK-NEXT:    i64.eqz1567; CHECK-NEXT:    i64.select1568; CHECK-NEXT:    # fallthrough-return1569entry:1570  %conv = fptoui float %x to i1281571  %spec.store.select = call i128 @llvm.umin.i128(i128 %conv, i128 18446744073709551616)1572  %conv6 = trunc i128 %spec.store.select to i641573  ret i64 %conv61574}1575 1576define i64 @ustest_f32i64_mm(float %x) {1577; CHECK-LABEL: ustest_f32i64_mm:1578; CHECK:         .functype ustest_f32i64_mm (f32) -> (i64)1579; CHECK-NEXT:    .local i32, i64, i641580; CHECK-NEXT:  # %bb.0: # %entry1581; CHECK-NEXT:    global.get __stack_pointer1582; CHECK-NEXT:    i32.const 161583; CHECK-NEXT:    i32.sub1584; CHECK-NEXT:    local.tee 11585; CHECK-NEXT:    global.set __stack_pointer1586; CHECK-NEXT:    local.get 11587; CHECK-NEXT:    local.get 01588; CHECK-NEXT:    call __fixsfti1589; CHECK-NEXT:    local.get 11590; CHECK-NEXT:    i64.load 81591; CHECK-NEXT:    local.set 21592; CHECK-NEXT:    local.get 11593; CHECK-NEXT:    i64.load 01594; CHECK-NEXT:    local.set 31595; CHECK-NEXT:    local.get 11596; CHECK-NEXT:    i32.const 161597; CHECK-NEXT:    i32.add1598; CHECK-NEXT:    global.set __stack_pointer1599; CHECK-NEXT:    i64.const 01600; CHECK-NEXT:    local.get 31601; CHECK-NEXT:    i64.const 01602; CHECK-NEXT:    local.get 21603; CHECK-NEXT:    i64.const 11604; CHECK-NEXT:    i64.lt_s1605; CHECK-NEXT:    local.tee 11606; CHECK-NEXT:    i64.select1607; CHECK-NEXT:    local.get 21608; CHECK-NEXT:    i64.const 11609; CHECK-NEXT:    local.get 11610; CHECK-NEXT:    i64.select1611; CHECK-NEXT:    i64.const 01612; CHECK-NEXT:    i64.lt_s1613; CHECK-NEXT:    i64.select1614; CHECK-NEXT:    # fallthrough-return1615entry:1616  %conv = fptosi float %x to i1281617  %spec.store.select = call i128 @llvm.smin.i128(i128 %conv, i128 18446744073709551616)1618  %spec.store.select7 = call i128 @llvm.smax.i128(i128 %spec.store.select, i128 0)1619  %conv6 = trunc i128 %spec.store.select7 to i641620  ret i64 %conv61621}1622 1623define i64 @stest_f16i64_mm(half %x) {1624; CHECK-LABEL: stest_f16i64_mm:1625; CHECK:         .functype stest_f16i64_mm (f32) -> (i64)1626; CHECK-NEXT:  # %bb.0: # %entry1627; CHECK-NEXT:    local.get 01628; CHECK-NEXT:    call __truncsfhf21629; CHECK-NEXT:    call __extendhfsf21630; CHECK-NEXT:    i64.trunc_sat_f32_s1631; CHECK-NEXT:    # fallthrough-return1632entry:1633  %conv = fptosi half %x to i1281634  %spec.store.select = call i128 @llvm.smin.i128(i128 %conv, i128 9223372036854775807)1635  %spec.store.select7 = call i128 @llvm.smax.i128(i128 %spec.store.select, i128 -9223372036854775808)1636  %conv6 = trunc i128 %spec.store.select7 to i641637  ret i64 %conv61638}1639 1640define i64 @utest_f16i64_mm(half %x) {1641; CHECK-LABEL: utest_f16i64_mm:1642; CHECK:         .functype utest_f16i64_mm (f32) -> (i64)1643; CHECK-NEXT:    .local i32, i64, i641644; CHECK-NEXT:  # %bb.0: # %entry1645; CHECK-NEXT:    global.get __stack_pointer1646; CHECK-NEXT:    i32.const 161647; CHECK-NEXT:    i32.sub1648; CHECK-NEXT:    local.tee 11649; CHECK-NEXT:    global.set __stack_pointer1650; CHECK-NEXT:    local.get 11651; CHECK-NEXT:    local.get 01652; CHECK-NEXT:    call __truncsfhf21653; CHECK-NEXT:    call __extendhfsf21654; CHECK-NEXT:    call __fixunssfti1655; CHECK-NEXT:    local.get 11656; CHECK-NEXT:    i64.load 81657; CHECK-NEXT:    local.set 21658; CHECK-NEXT:    local.get 11659; CHECK-NEXT:    i64.load 01660; CHECK-NEXT:    local.set 31661; CHECK-NEXT:    local.get 11662; CHECK-NEXT:    i32.const 161663; CHECK-NEXT:    i32.add1664; CHECK-NEXT:    global.set __stack_pointer1665; CHECK-NEXT:    local.get 31666; CHECK-NEXT:    i64.const 01667; CHECK-NEXT:    local.get 21668; CHECK-NEXT:    i64.eqz1669; CHECK-NEXT:    i64.select1670; CHECK-NEXT:    # fallthrough-return1671entry:1672  %conv = fptoui half %x to i1281673  %spec.store.select = call i128 @llvm.umin.i128(i128 %conv, i128 18446744073709551616)1674  %conv6 = trunc i128 %spec.store.select to i641675  ret i64 %conv61676}1677 1678define i64 @ustest_f16i64_mm(half %x) {1679; CHECK-LABEL: ustest_f16i64_mm:1680; CHECK:         .functype ustest_f16i64_mm (f32) -> (i64)1681; CHECK-NEXT:    .local i32, i64, i641682; CHECK-NEXT:  # %bb.0: # %entry1683; CHECK-NEXT:    global.get __stack_pointer1684; CHECK-NEXT:    i32.const 161685; CHECK-NEXT:    i32.sub1686; CHECK-NEXT:    local.tee 11687; CHECK-NEXT:    global.set __stack_pointer1688; CHECK-NEXT:    local.get 11689; CHECK-NEXT:    local.get 01690; CHECK-NEXT:    call __truncsfhf21691; CHECK-NEXT:    call __extendhfsf21692; CHECK-NEXT:    call __fixsfti1693; CHECK-NEXT:    local.get 11694; CHECK-NEXT:    i64.load 81695; CHECK-NEXT:    local.set 21696; CHECK-NEXT:    local.get 11697; CHECK-NEXT:    i64.load 01698; CHECK-NEXT:    local.set 31699; CHECK-NEXT:    local.get 11700; CHECK-NEXT:    i32.const 161701; CHECK-NEXT:    i32.add1702; CHECK-NEXT:    global.set __stack_pointer1703; CHECK-NEXT:    i64.const 01704; CHECK-NEXT:    local.get 31705; CHECK-NEXT:    i64.const 01706; CHECK-NEXT:    local.get 21707; CHECK-NEXT:    i64.const 11708; CHECK-NEXT:    i64.lt_s1709; CHECK-NEXT:    local.tee 11710; CHECK-NEXT:    i64.select1711; CHECK-NEXT:    local.get 21712; CHECK-NEXT:    i64.const 11713; CHECK-NEXT:    local.get 11714; CHECK-NEXT:    i64.select1715; CHECK-NEXT:    i64.const 01716; CHECK-NEXT:    i64.lt_s1717; CHECK-NEXT:    i64.select1718; CHECK-NEXT:    # fallthrough-return1719entry:1720  %conv = fptosi half %x to i1281721  %spec.store.select = call i128 @llvm.smin.i128(i128 %conv, i128 18446744073709551616)1722  %spec.store.select7 = call i128 @llvm.smax.i128(i128 %spec.store.select, i128 0)1723  %conv6 = trunc i128 %spec.store.select7 to i641724  ret i64 %conv61725}1726 1727define i64 @utest_f16i64_mm_cse(half %x) {1728; CHECK-LABEL: utest_f16i64_mm_cse:1729; CHECK:         .functype utest_f16i64_mm_cse (f32) -> (i64)1730; CHECK-NEXT:    .local i32, i641731; CHECK-NEXT:  # %bb.0: # %entry1732; CHECK-NEXT:    global.get __stack_pointer1733; CHECK-NEXT:    i32.const 161734; CHECK-NEXT:    i32.sub1735; CHECK-NEXT:    local.tee 11736; CHECK-NEXT:    global.set __stack_pointer1737; CHECK-NEXT:    local.get 11738; CHECK-NEXT:    local.get 01739; CHECK-NEXT:    call __truncsfhf21740; CHECK-NEXT:    call __extendhfsf21741; CHECK-NEXT:    call __fixunssfti1742; CHECK-NEXT:    local.get 11743; CHECK-NEXT:    i64.load 01744; CHECK-NEXT:    local.set 21745; CHECK-NEXT:    local.get 11746; CHECK-NEXT:    i32.const 161747; CHECK-NEXT:    i32.add1748; CHECK-NEXT:    global.set __stack_pointer1749; CHECK-NEXT:    local.get 21750; CHECK-NEXT:    # fallthrough-return1751entry:1752  %conv = fptoui half %x to i1281753  %conv6 = trunc i128 %conv to i641754  ret i64 %conv61755}1756 1757; i32 non saturate1758 1759define i32 @ustest_f16i32_nsat(half %x) {1760; CHECK-LABEL: ustest_f16i32_nsat:1761; CHECK:         .functype ustest_f16i32_nsat (f32) -> (i32)1762; CHECK-NEXT:    .local i321763; CHECK-NEXT:  # %bb.0:1764; CHECK-NEXT:    local.get 01765; CHECK-NEXT:    call __truncsfhf21766; CHECK-NEXT:    call __extendhfsf21767; CHECK-NEXT:    i32.trunc_sat_f32_s1768; CHECK-NEXT:    local.tee 11769; CHECK-NEXT:    i32.const 311770; CHECK-NEXT:    i32.shr_s1771; CHECK-NEXT:    local.get 11772; CHECK-NEXT:    i32.and1773; CHECK-NEXT:    local.tee 11774; CHECK-NEXT:    i32.const 01775; CHECK-NEXT:    local.get 11776; CHECK-NEXT:    i32.const 01777; CHECK-NEXT:    i32.gt_s1778; CHECK-NEXT:    i32.select1779; CHECK-NEXT:    # fallthrough-return1780  %conv = fptosi half %x to i321781  %spec.store.select = call i32 @llvm.smin.i32(i32 0, i32 %conv)1782  %spec.store.select7 = call i32 @llvm.smax.i32(i32 %spec.store.select, i32 0)1783  ret i32 %spec.store.select71784}1785 1786declare i32 @llvm.smin.i32(i32, i32)1787declare i32 @llvm.smax.i32(i32, i32)1788declare i32 @llvm.umin.i32(i32, i32)1789declare i64 @llvm.smin.i64(i64, i64)1790declare i64 @llvm.smax.i64(i64, i64)1791declare i64 @llvm.umin.i64(i64, i64)1792declare i128 @llvm.smin.i128(i128, i128)1793declare i128 @llvm.smax.i128(i128, i128)1794declare i128 @llvm.umin.i128(i128, i128)1795