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.maxnum.f32(float, float) 8declare double @llvm.maxnum.f64(double, double) 9declare float @llvm.minnum.f32(float, float) 10declare double @llvm.minnum.f64(double, double) 11 12define float @maxnum_float(float %x, float %y) { 13; LA32F-LABEL: maxnum_float: 14; LA32F: # %bb.0: 15; LA32F-NEXT: fmax.s $fa1, $fa1, $fa1 16; LA32F-NEXT: fmax.s $fa0, $fa0, $fa0 17; LA32F-NEXT: fmax.s $fa0, $fa0, $fa1 18; LA32F-NEXT: ret 19; 20; LA32D-LABEL: maxnum_float: 21; LA32D: # %bb.0: 22; LA32D-NEXT: fmax.s $fa1, $fa1, $fa1 23; LA32D-NEXT: fmax.s $fa0, $fa0, $fa0 24; LA32D-NEXT: fmax.s $fa0, $fa0, $fa1 25; LA32D-NEXT: ret 26; 27; LA64F-LABEL: maxnum_float: 28; LA64F: # %bb.0: 29; LA64F-NEXT: fmax.s $fa1, $fa1, $fa1 30; LA64F-NEXT: fmax.s $fa0, $fa0, $fa0 31; LA64F-NEXT: fmax.s $fa0, $fa0, $fa1 32; LA64F-NEXT: ret 33; 34; LA64D-LABEL: maxnum_float: 35; LA64D: # %bb.0: 36; LA64D-NEXT: fmax.s $fa1, $fa1, $fa1 37; LA64D-NEXT: fmax.s $fa0, $fa0, $fa0 38; LA64D-NEXT: fmax.s $fa0, $fa0, $fa1 39; LA64D-NEXT: ret 40 %z = call float @llvm.maxnum.f32(float %x, float %y) 41 ret float %z 42} 43 44define double @maxnum_double(double %x, double %y) { 45; LA32F-LABEL: maxnum_double: 46; LA32F: # %bb.0: 47; LA32F-NEXT: addi.w $sp, $sp, -16 48; LA32F-NEXT: .cfi_def_cfa_offset 16 49; LA32F-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill 50; LA32F-NEXT: .cfi_offset 1, -4 51; LA32F-NEXT: bl %plt(fmax) 52; LA32F-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload 53; LA32F-NEXT: addi.w $sp, $sp, 16 54; LA32F-NEXT: ret 55; 56; LA32D-LABEL: maxnum_double: 57; LA32D: # %bb.0: 58; LA32D-NEXT: fmax.d $fa1, $fa1, $fa1 59; LA32D-NEXT: fmax.d $fa0, $fa0, $fa0 60; LA32D-NEXT: fmax.d $fa0, $fa0, $fa1 61; LA32D-NEXT: ret 62; 63; LA64F-LABEL: maxnum_double: 64; LA64F: # %bb.0: 65; LA64F-NEXT: addi.d $sp, $sp, -16 66; LA64F-NEXT: .cfi_def_cfa_offset 16 67; LA64F-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill 68; LA64F-NEXT: .cfi_offset 1, -8 69; LA64F-NEXT: bl %plt(fmax) 70; LA64F-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload 71; LA64F-NEXT: addi.d $sp, $sp, 16 72; LA64F-NEXT: ret 73; 74; LA64D-LABEL: maxnum_double: 75; LA64D: # %bb.0: 76; LA64D-NEXT: fmax.d $fa1, $fa1, $fa1 77; LA64D-NEXT: fmax.d $fa0, $fa0, $fa0 78; LA64D-NEXT: fmax.d $fa0, $fa0, $fa1 79; LA64D-NEXT: ret 80 %z = call double @llvm.maxnum.f64(double %x, double %y) 81 ret double %z 82} 83 84define float @minnum_float(float %x, float %y) { 85; LA32F-LABEL: minnum_float: 86; LA32F: # %bb.0: 87; LA32F-NEXT: fmax.s $fa1, $fa1, $fa1 88; LA32F-NEXT: fmax.s $fa0, $fa0, $fa0 89; LA32F-NEXT: fmin.s $fa0, $fa0, $fa1 90; LA32F-NEXT: ret 91; 92; LA32D-LABEL: minnum_float: 93; LA32D: # %bb.0: 94; LA32D-NEXT: fmax.s $fa1, $fa1, $fa1 95; LA32D-NEXT: fmax.s $fa0, $fa0, $fa0 96; LA32D-NEXT: fmin.s $fa0, $fa0, $fa1 97; LA32D-NEXT: ret 98; 99; LA64F-LABEL: minnum_float: 100; LA64F: # %bb.0: 101; LA64F-NEXT: fmax.s $fa1, $fa1, $fa1 102; LA64F-NEXT: fmax.s $fa0, $fa0, $fa0 103; LA64F-NEXT: fmin.s $fa0, $fa0, $fa1 104; LA64F-NEXT: ret 105; 106; LA64D-LABEL: minnum_float: 107; LA64D: # %bb.0: 108; LA64D-NEXT: fmax.s $fa1, $fa1, $fa1 109; LA64D-NEXT: fmax.s $fa0, $fa0, $fa0 110; LA64D-NEXT: fmin.s $fa0, $fa0, $fa1 111; LA64D-NEXT: ret 112 %z = call float @llvm.minnum.f32(float %x, float %y) 113 ret float %z 114} 115 116define double @minnum_double(double %x, double %y) { 117; LA32F-LABEL: minnum_double: 118; LA32F: # %bb.0: 119; LA32F-NEXT: addi.w $sp, $sp, -16 120; LA32F-NEXT: .cfi_def_cfa_offset 16 121; LA32F-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill 122; LA32F-NEXT: .cfi_offset 1, -4 123; LA32F-NEXT: bl %plt(fmin) 124; LA32F-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload 125; LA32F-NEXT: addi.w $sp, $sp, 16 126; LA32F-NEXT: ret 127; 128; LA32D-LABEL: minnum_double: 129; LA32D: # %bb.0: 130; LA32D-NEXT: fmax.d $fa1, $fa1, $fa1 131; LA32D-NEXT: fmax.d $fa0, $fa0, $fa0 132; LA32D-NEXT: fmin.d $fa0, $fa0, $fa1 133; LA32D-NEXT: ret 134; 135; LA64F-LABEL: minnum_double: 136; LA64F: # %bb.0: 137; LA64F-NEXT: addi.d $sp, $sp, -16 138; LA64F-NEXT: .cfi_def_cfa_offset 16 139; LA64F-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill 140; LA64F-NEXT: .cfi_offset 1, -8 141; LA64F-NEXT: bl %plt(fmin) 142; LA64F-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload 143; LA64F-NEXT: addi.d $sp, $sp, 16 144; LA64F-NEXT: ret 145; 146; LA64D-LABEL: minnum_double: 147; LA64D: # %bb.0: 148; LA64D-NEXT: fmax.d $fa1, $fa1, $fa1 149; LA64D-NEXT: fmax.d $fa0, $fa0, $fa0 150; LA64D-NEXT: fmin.d $fa0, $fa0, $fa1 151; LA64D-NEXT: ret 152 %z = call double @llvm.minnum.f64(double %x, double %y) 153 ret double %z 154} 155