1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc --mtriple=loongarch32 --mattr=+f,-d < %s | FileCheck %s --check-prefix=LA32F 3; RUN: llc --mtriple=loongarch32 --mattr=+d < %s | FileCheck %s --check-prefix=LA32D 4; RUN: llc --mtriple=loongarch64 --mattr=+f,-d < %s | FileCheck %s --check-prefix=LA64F 5; RUN: llc --mtriple=loongarch64 --mattr=+d < %s | FileCheck %s --check-prefix=LA64D 6 7declare float @llvm.maximumnum.f32(float, float) 8declare double @llvm.maximumnum.f64(double, double) 9declare float @llvm.minimumnum.f32(float, float) 10declare double @llvm.minimumnum.f64(double, double) 11 12define float @maximumnum_float(float %x, float %y) { 13; 14; LA32F-LABEL: maximumnum_float: 15; LA32F: # %bb.0: 16; LA32F-NEXT: fmax.s $fa1, $fa1, $fa1 17; LA32F-NEXT: fmax.s $fa0, $fa0, $fa0 18; LA32F-NEXT: fmax.s $fa0, $fa0, $fa1 19; LA32F-NEXT: ret 20; 21; LA32D-LABEL: maximumnum_float: 22; LA32D: # %bb.0: 23; LA32D-NEXT: fmax.s $fa1, $fa1, $fa1 24; LA32D-NEXT: fmax.s $fa0, $fa0, $fa0 25; LA32D-NEXT: fmax.s $fa0, $fa0, $fa1 26; LA32D-NEXT: ret 27; 28; LA64F-LABEL: maximumnum_float: 29; LA64F: # %bb.0: 30; LA64F-NEXT: fmax.s $fa1, $fa1, $fa1 31; LA64F-NEXT: fmax.s $fa0, $fa0, $fa0 32; LA64F-NEXT: fmax.s $fa0, $fa0, $fa1 33; LA64F-NEXT: ret 34; 35; LA64D-LABEL: maximumnum_float: 36; LA64D: # %bb.0: 37; LA64D-NEXT: fmax.s $fa1, $fa1, $fa1 38; LA64D-NEXT: fmax.s $fa0, $fa0, $fa0 39; LA64D-NEXT: fmax.s $fa0, $fa0, $fa1 40; LA64D-NEXT: ret 41 %z = call float @llvm.maximumnum.f32(float %x, float %y) 42 ret float %z 43} 44 45define float @maximumnum_float_nsz(float %x, float %y) { 46; 47; LA32F-LABEL: maximumnum_float_nsz: 48; LA32F: # %bb.0: 49; LA32F-NEXT: fmax.s $fa1, $fa1, $fa1 50; LA32F-NEXT: fmax.s $fa0, $fa0, $fa0 51; LA32F-NEXT: fmax.s $fa0, $fa0, $fa1 52; LA32F-NEXT: ret 53; 54; LA32D-LABEL: maximumnum_float_nsz: 55; LA32D: # %bb.0: 56; LA32D-NEXT: fmax.s $fa1, $fa1, $fa1 57; LA32D-NEXT: fmax.s $fa0, $fa0, $fa0 58; LA32D-NEXT: fmax.s $fa0, $fa0, $fa1 59; LA32D-NEXT: ret 60; 61; LA64F-LABEL: maximumnum_float_nsz: 62; LA64F: # %bb.0: 63; LA64F-NEXT: fmax.s $fa1, $fa1, $fa1 64; LA64F-NEXT: fmax.s $fa0, $fa0, $fa0 65; LA64F-NEXT: fmax.s $fa0, $fa0, $fa1 66; LA64F-NEXT: ret 67; 68; LA64D-LABEL: maximumnum_float_nsz: 69; LA64D: # %bb.0: 70; LA64D-NEXT: fmax.s $fa1, $fa1, $fa1 71; LA64D-NEXT: fmax.s $fa0, $fa0, $fa0 72; LA64D-NEXT: fmax.s $fa0, $fa0, $fa1 73; LA64D-NEXT: ret 74 %z = call nsz float @llvm.maximumnum.f32(float %x, float %y) 75 ret float %z 76} 77 78define float @maximumnum_float_nnan(float %x, float %y) { 79; 80; LA32F-LABEL: maximumnum_float_nnan: 81; LA32F: # %bb.0: 82; LA32F-NEXT: fmax.s $fa0, $fa0, $fa1 83; LA32F-NEXT: ret 84; 85; LA32D-LABEL: maximumnum_float_nnan: 86; LA32D: # %bb.0: 87; LA32D-NEXT: fmax.s $fa0, $fa0, $fa1 88; LA32D-NEXT: ret 89; 90; LA64F-LABEL: maximumnum_float_nnan: 91; LA64F: # %bb.0: 92; LA64F-NEXT: fmax.s $fa0, $fa0, $fa1 93; LA64F-NEXT: ret 94; 95; LA64D-LABEL: maximumnum_float_nnan: 96; LA64D: # %bb.0: 97; LA64D-NEXT: fmax.s $fa0, $fa0, $fa1 98; LA64D-NEXT: ret 99 %z = call nnan float @llvm.maximumnum.f32(float %x, float %y) 100 ret float %z 101} 102 103 104define double @maximumnum_double(double %x, double %y) { 105; 106; LA32F-LABEL: maximumnum_double: 107; LA32F: # %bb.0: 108; LA32F-NEXT: addi.w $sp, $sp, -16 109; LA32F-NEXT: .cfi_def_cfa_offset 16 110; LA32F-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill 111; LA32F-NEXT: .cfi_offset 1, -4 112; LA32F-NEXT: bl %plt(fmaximum_num) 113; LA32F-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload 114; LA32F-NEXT: addi.w $sp, $sp, 16 115; LA32F-NEXT: ret 116; 117; LA32D-LABEL: maximumnum_double: 118; LA32D: # %bb.0: 119; LA32D-NEXT: fmax.d $fa1, $fa1, $fa1 120; LA32D-NEXT: fmax.d $fa0, $fa0, $fa0 121; LA32D-NEXT: fmax.d $fa0, $fa0, $fa1 122; LA32D-NEXT: ret 123; 124; LA64F-LABEL: maximumnum_double: 125; LA64F: # %bb.0: 126; LA64F-NEXT: addi.d $sp, $sp, -16 127; LA64F-NEXT: .cfi_def_cfa_offset 16 128; LA64F-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill 129; LA64F-NEXT: .cfi_offset 1, -8 130; LA64F-NEXT: bl %plt(fmaximum_num) 131; LA64F-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload 132; LA64F-NEXT: addi.d $sp, $sp, 16 133; LA64F-NEXT: ret 134; 135; LA64D-LABEL: maximumnum_double: 136; LA64D: # %bb.0: 137; LA64D-NEXT: fmax.d $fa1, $fa1, $fa1 138; LA64D-NEXT: fmax.d $fa0, $fa0, $fa0 139; LA64D-NEXT: fmax.d $fa0, $fa0, $fa1 140; LA64D-NEXT: ret 141 %z = call double @llvm.maximumnum.f64(double %x, double %y) 142 ret double %z 143} 144 145define double @maximumnum_double_nsz(double %x, double %y) { 146; 147; LA32F-LABEL: maximumnum_double_nsz: 148; LA32F: # %bb.0: 149; LA32F-NEXT: addi.w $sp, $sp, -16 150; LA32F-NEXT: .cfi_def_cfa_offset 16 151; LA32F-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill 152; LA32F-NEXT: .cfi_offset 1, -4 153; LA32F-NEXT: bl %plt(fmaximum_num) 154; LA32F-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload 155; LA32F-NEXT: addi.w $sp, $sp, 16 156; LA32F-NEXT: ret 157; 158; LA32D-LABEL: maximumnum_double_nsz: 159; LA32D: # %bb.0: 160; LA32D-NEXT: fmax.d $fa1, $fa1, $fa1 161; LA32D-NEXT: fmax.d $fa0, $fa0, $fa0 162; LA32D-NEXT: fmax.d $fa0, $fa0, $fa1 163; LA32D-NEXT: ret 164; 165; LA64F-LABEL: maximumnum_double_nsz: 166; LA64F: # %bb.0: 167; LA64F-NEXT: addi.d $sp, $sp, -16 168; LA64F-NEXT: .cfi_def_cfa_offset 16 169; LA64F-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill 170; LA64F-NEXT: .cfi_offset 1, -8 171; LA64F-NEXT: bl %plt(fmaximum_num) 172; LA64F-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload 173; LA64F-NEXT: addi.d $sp, $sp, 16 174; LA64F-NEXT: ret 175; 176; LA64D-LABEL: maximumnum_double_nsz: 177; LA64D: # %bb.0: 178; LA64D-NEXT: fmax.d $fa1, $fa1, $fa1 179; LA64D-NEXT: fmax.d $fa0, $fa0, $fa0 180; LA64D-NEXT: fmax.d $fa0, $fa0, $fa1 181; LA64D-NEXT: ret 182 %z = call nsz double @llvm.maximumnum.f64(double %x, double %y) 183 ret double %z 184} 185 186define double @maximumnum_double_nnan(double %x, double %y) { 187; 188; LA32F-LABEL: maximumnum_double_nnan: 189; LA32F: # %bb.0: 190; LA32F-NEXT: addi.w $sp, $sp, -16 191; LA32F-NEXT: .cfi_def_cfa_offset 16 192; LA32F-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill 193; LA32F-NEXT: .cfi_offset 1, -4 194; LA32F-NEXT: bl %plt(fmaximum_num) 195; LA32F-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload 196; LA32F-NEXT: addi.w $sp, $sp, 16 197; LA32F-NEXT: ret 198; 199; LA32D-LABEL: maximumnum_double_nnan: 200; LA32D: # %bb.0: 201; LA32D-NEXT: fmax.d $fa0, $fa0, $fa1 202; LA32D-NEXT: ret 203; 204; LA64F-LABEL: maximumnum_double_nnan: 205; LA64F: # %bb.0: 206; LA64F-NEXT: addi.d $sp, $sp, -16 207; LA64F-NEXT: .cfi_def_cfa_offset 16 208; LA64F-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill 209; LA64F-NEXT: .cfi_offset 1, -8 210; LA64F-NEXT: bl %plt(fmaximum_num) 211; LA64F-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload 212; LA64F-NEXT: addi.d $sp, $sp, 16 213; LA64F-NEXT: ret 214; 215; LA64D-LABEL: maximumnum_double_nnan: 216; LA64D: # %bb.0: 217; LA64D-NEXT: fmax.d $fa0, $fa0, $fa1 218; LA64D-NEXT: ret 219 %z = call nnan double @llvm.maximumnum.f64(double %x, double %y) 220 ret double %z 221} 222 223define float @minimumnum_float(float %x, float %y) { 224; 225; LA32F-LABEL: minimumnum_float: 226; LA32F: # %bb.0: 227; LA32F-NEXT: fmax.s $fa1, $fa1, $fa1 228; LA32F-NEXT: fmax.s $fa0, $fa0, $fa0 229; LA32F-NEXT: fmin.s $fa0, $fa0, $fa1 230; LA32F-NEXT: ret 231; 232; LA32D-LABEL: minimumnum_float: 233; LA32D: # %bb.0: 234; LA32D-NEXT: fmax.s $fa1, $fa1, $fa1 235; LA32D-NEXT: fmax.s $fa0, $fa0, $fa0 236; LA32D-NEXT: fmin.s $fa0, $fa0, $fa1 237; LA32D-NEXT: ret 238; 239; LA64F-LABEL: minimumnum_float: 240; LA64F: # %bb.0: 241; LA64F-NEXT: fmax.s $fa1, $fa1, $fa1 242; LA64F-NEXT: fmax.s $fa0, $fa0, $fa0 243; LA64F-NEXT: fmin.s $fa0, $fa0, $fa1 244; LA64F-NEXT: ret 245; 246; LA64D-LABEL: minimumnum_float: 247; LA64D: # %bb.0: 248; LA64D-NEXT: fmax.s $fa1, $fa1, $fa1 249; LA64D-NEXT: fmax.s $fa0, $fa0, $fa0 250; LA64D-NEXT: fmin.s $fa0, $fa0, $fa1 251; LA64D-NEXT: ret 252 %z = call float @llvm.minimumnum.f32(float %x, float %y) 253 ret float %z 254} 255 256define float @minimumnum_float_nsz(float %x, float %y) { 257; 258; LA32F-LABEL: minimumnum_float_nsz: 259; LA32F: # %bb.0: 260; LA32F-NEXT: fmax.s $fa1, $fa1, $fa1 261; LA32F-NEXT: fmax.s $fa0, $fa0, $fa0 262; LA32F-NEXT: fmin.s $fa0, $fa0, $fa1 263; LA32F-NEXT: ret 264; 265; LA32D-LABEL: minimumnum_float_nsz: 266; LA32D: # %bb.0: 267; LA32D-NEXT: fmax.s $fa1, $fa1, $fa1 268; LA32D-NEXT: fmax.s $fa0, $fa0, $fa0 269; LA32D-NEXT: fmin.s $fa0, $fa0, $fa1 270; LA32D-NEXT: ret 271; 272; LA64F-LABEL: minimumnum_float_nsz: 273; LA64F: # %bb.0: 274; LA64F-NEXT: fmax.s $fa1, $fa1, $fa1 275; LA64F-NEXT: fmax.s $fa0, $fa0, $fa0 276; LA64F-NEXT: fmin.s $fa0, $fa0, $fa1 277; LA64F-NEXT: ret 278; 279; LA64D-LABEL: minimumnum_float_nsz: 280; LA64D: # %bb.0: 281; LA64D-NEXT: fmax.s $fa1, $fa1, $fa1 282; LA64D-NEXT: fmax.s $fa0, $fa0, $fa0 283; LA64D-NEXT: fmin.s $fa0, $fa0, $fa1 284; LA64D-NEXT: ret 285 %z = call nsz float @llvm.minimumnum.f32(float %x, float %y) 286 ret float %z 287} 288 289define float @minimumnum_float_nnan(float %x, float %y) { 290; 291; LA32F-LABEL: minimumnum_float_nnan: 292; LA32F: # %bb.0: 293; LA32F-NEXT: fmin.s $fa0, $fa0, $fa1 294; LA32F-NEXT: ret 295; 296; LA32D-LABEL: minimumnum_float_nnan: 297; LA32D: # %bb.0: 298; LA32D-NEXT: fmin.s $fa0, $fa0, $fa1 299; LA32D-NEXT: ret 300; 301; LA64F-LABEL: minimumnum_float_nnan: 302; LA64F: # %bb.0: 303; LA64F-NEXT: fmin.s $fa0, $fa0, $fa1 304; LA64F-NEXT: ret 305; 306; LA64D-LABEL: minimumnum_float_nnan: 307; LA64D: # %bb.0: 308; LA64D-NEXT: fmin.s $fa0, $fa0, $fa1 309; LA64D-NEXT: ret 310 %z = call nnan float @llvm.minimumnum.f32(float %x, float %y) 311 ret float %z 312} 313 314define double @minimumnum_double(double %x, double %y) { 315; 316; LA32F-LABEL: minimumnum_double: 317; LA32F: # %bb.0: 318; LA32F-NEXT: addi.w $sp, $sp, -16 319; LA32F-NEXT: .cfi_def_cfa_offset 16 320; LA32F-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill 321; LA32F-NEXT: .cfi_offset 1, -4 322; LA32F-NEXT: bl %plt(fminimum_num) 323; LA32F-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload 324; LA32F-NEXT: addi.w $sp, $sp, 16 325; LA32F-NEXT: ret 326; 327; LA32D-LABEL: minimumnum_double: 328; LA32D: # %bb.0: 329; LA32D-NEXT: fmax.d $fa1, $fa1, $fa1 330; LA32D-NEXT: fmax.d $fa0, $fa0, $fa0 331; LA32D-NEXT: fmin.d $fa0, $fa0, $fa1 332; LA32D-NEXT: ret 333; 334; LA64F-LABEL: minimumnum_double: 335; LA64F: # %bb.0: 336; LA64F-NEXT: addi.d $sp, $sp, -16 337; LA64F-NEXT: .cfi_def_cfa_offset 16 338; LA64F-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill 339; LA64F-NEXT: .cfi_offset 1, -8 340; LA64F-NEXT: bl %plt(fminimum_num) 341; LA64F-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload 342; LA64F-NEXT: addi.d $sp, $sp, 16 343; LA64F-NEXT: ret 344; 345; LA64D-LABEL: minimumnum_double: 346; LA64D: # %bb.0: 347; LA64D-NEXT: fmax.d $fa1, $fa1, $fa1 348; LA64D-NEXT: fmax.d $fa0, $fa0, $fa0 349; LA64D-NEXT: fmin.d $fa0, $fa0, $fa1 350; LA64D-NEXT: ret 351 %z = call double @llvm.minimumnum.f64(double %x, double %y) 352 ret double %z 353} 354 355define double @minimumnum_double_nsz(double %x, double %y) { 356; 357; LA32F-LABEL: minimumnum_double_nsz: 358; LA32F: # %bb.0: 359; LA32F-NEXT: addi.w $sp, $sp, -16 360; LA32F-NEXT: .cfi_def_cfa_offset 16 361; LA32F-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill 362; LA32F-NEXT: .cfi_offset 1, -4 363; LA32F-NEXT: bl %plt(fminimum_num) 364; LA32F-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload 365; LA32F-NEXT: addi.w $sp, $sp, 16 366; LA32F-NEXT: ret 367; 368; LA32D-LABEL: minimumnum_double_nsz: 369; LA32D: # %bb.0: 370; LA32D-NEXT: fmax.d $fa1, $fa1, $fa1 371; LA32D-NEXT: fmax.d $fa0, $fa0, $fa0 372; LA32D-NEXT: fmin.d $fa0, $fa0, $fa1 373; LA32D-NEXT: ret 374; 375; LA64F-LABEL: minimumnum_double_nsz: 376; LA64F: # %bb.0: 377; LA64F-NEXT: addi.d $sp, $sp, -16 378; LA64F-NEXT: .cfi_def_cfa_offset 16 379; LA64F-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill 380; LA64F-NEXT: .cfi_offset 1, -8 381; LA64F-NEXT: bl %plt(fminimum_num) 382; LA64F-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload 383; LA64F-NEXT: addi.d $sp, $sp, 16 384; LA64F-NEXT: ret 385; 386; LA64D-LABEL: minimumnum_double_nsz: 387; LA64D: # %bb.0: 388; LA64D-NEXT: fmax.d $fa1, $fa1, $fa1 389; LA64D-NEXT: fmax.d $fa0, $fa0, $fa0 390; LA64D-NEXT: fmin.d $fa0, $fa0, $fa1 391; LA64D-NEXT: ret 392 %z = call nsz double @llvm.minimumnum.f64(double %x, double %y) 393 ret double %z 394} 395 396define double @minimumnum_double_nnan(double %x, double %y) { 397; 398; LA32F-LABEL: minimumnum_double_nnan: 399; LA32F: # %bb.0: 400; LA32F-NEXT: addi.w $sp, $sp, -16 401; LA32F-NEXT: .cfi_def_cfa_offset 16 402; LA32F-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill 403; LA32F-NEXT: .cfi_offset 1, -4 404; LA32F-NEXT: bl %plt(fminimum_num) 405; LA32F-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload 406; LA32F-NEXT: addi.w $sp, $sp, 16 407; LA32F-NEXT: ret 408; 409; LA32D-LABEL: minimumnum_double_nnan: 410; LA32D: # %bb.0: 411; LA32D-NEXT: fmin.d $fa0, $fa0, $fa1 412; LA32D-NEXT: ret 413; 414; LA64F-LABEL: minimumnum_double_nnan: 415; LA64F: # %bb.0: 416; LA64F-NEXT: addi.d $sp, $sp, -16 417; LA64F-NEXT: .cfi_def_cfa_offset 16 418; LA64F-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill 419; LA64F-NEXT: .cfi_offset 1, -8 420; LA64F-NEXT: bl %plt(fminimum_num) 421; LA64F-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload 422; LA64F-NEXT: addi.d $sp, $sp, 16 423; LA64F-NEXT: ret 424; 425; LA64D-LABEL: minimumnum_double_nnan: 426; LA64D: # %bb.0: 427; LA64D-NEXT: fmin.d $fa0, $fa0, $fa1 428; LA64D-NEXT: ret 429 %z = call nnan double @llvm.minimumnum.f64(double %x, double %y) 430 ret double %z 431} 432