1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=R32 3; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s | FileCheck %s --check-prefixes=R64 4 5define float @maxnum_f32(float %x, float %y) nounwind { 6; R32-LABEL: maxnum_f32: 7; R32: # %bb.0: 8; R32-NEXT: addi sp, sp, -16 9; R32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 10; R32-NEXT: call fmaxf 11; R32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 12; R32-NEXT: addi sp, sp, 16 13; R32-NEXT: ret 14; 15; R64-LABEL: maxnum_f32: 16; R64: # %bb.0: 17; R64-NEXT: addi sp, sp, -16 18; R64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 19; R64-NEXT: call fmaxf 20; R64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 21; R64-NEXT: addi sp, sp, 16 22; R64-NEXT: ret 23 %r = call float @llvm.maxnum.f32(float %x, float %y) 24 ret float %r 25} 26 27define float @maxnum_f32_fast(float %x, float %y) nounwind { 28; R32-LABEL: maxnum_f32_fast: 29; R32: # %bb.0: 30; R32-NEXT: addi sp, sp, -16 31; R32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 32; R32-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 33; R32-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 34; R32-NEXT: mv s1, a1 35; R32-NEXT: mv s0, a0 36; R32-NEXT: call __gtsf2 37; R32-NEXT: bgtz a0, .LBB1_2 38; R32-NEXT: # %bb.1: 39; R32-NEXT: mv s0, s1 40; R32-NEXT: .LBB1_2: 41; R32-NEXT: mv a0, s0 42; R32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 43; R32-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 44; R32-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 45; R32-NEXT: addi sp, sp, 16 46; R32-NEXT: ret 47; 48; R64-LABEL: maxnum_f32_fast: 49; R64: # %bb.0: 50; R64-NEXT: addi sp, sp, -32 51; R64-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 52; R64-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 53; R64-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 54; R64-NEXT: mv s1, a1 55; R64-NEXT: mv s0, a0 56; R64-NEXT: call __gtsf2 57; R64-NEXT: bgtz a0, .LBB1_2 58; R64-NEXT: # %bb.1: 59; R64-NEXT: mv s0, s1 60; R64-NEXT: .LBB1_2: 61; R64-NEXT: mv a0, s0 62; R64-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 63; R64-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 64; R64-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 65; R64-NEXT: addi sp, sp, 32 66; R64-NEXT: ret 67 %r = call fast float @llvm.maxnum.f32(float %x, float %y) 68 ret float %r 69} 70 71define double @maxnum_f64(double %x, double %y) nounwind { 72; R32-LABEL: maxnum_f64: 73; R32: # %bb.0: 74; R32-NEXT: addi sp, sp, -16 75; R32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 76; R32-NEXT: call fmax 77; R32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 78; R32-NEXT: addi sp, sp, 16 79; R32-NEXT: ret 80; 81; R64-LABEL: maxnum_f64: 82; R64: # %bb.0: 83; R64-NEXT: addi sp, sp, -16 84; R64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 85; R64-NEXT: call fmax 86; R64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 87; R64-NEXT: addi sp, sp, 16 88; R64-NEXT: ret 89 %r = call double @llvm.maxnum.f64(double %x, double %y) 90 ret double %r 91} 92 93define double @maxnum_f64_nnan(double %x, double %y) nounwind { 94; R32-LABEL: maxnum_f64_nnan: 95; R32: # %bb.0: 96; R32-NEXT: addi sp, sp, -32 97; R32-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 98; R32-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 99; R32-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 100; R32-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 101; R32-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 102; R32-NEXT: mv s1, a3 103; R32-NEXT: mv s2, a2 104; R32-NEXT: mv s0, a1 105; R32-NEXT: mv s3, a0 106; R32-NEXT: call __gtdf2 107; R32-NEXT: mv a1, a0 108; R32-NEXT: mv a0, s3 109; R32-NEXT: bgtz a1, .LBB3_2 110; R32-NEXT: # %bb.1: 111; R32-NEXT: mv s3, s2 112; R32-NEXT: .LBB3_2: 113; R32-NEXT: mv a1, s0 114; R32-NEXT: mv a2, s2 115; R32-NEXT: mv a3, s1 116; R32-NEXT: call __gtdf2 117; R32-NEXT: bgtz a0, .LBB3_4 118; R32-NEXT: # %bb.3: 119; R32-NEXT: mv s0, s1 120; R32-NEXT: .LBB3_4: 121; R32-NEXT: mv a0, s3 122; R32-NEXT: mv a1, s0 123; R32-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 124; R32-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 125; R32-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 126; R32-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 127; R32-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 128; R32-NEXT: addi sp, sp, 32 129; R32-NEXT: ret 130; 131; R64-LABEL: maxnum_f64_nnan: 132; R64: # %bb.0: 133; R64-NEXT: addi sp, sp, -32 134; R64-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 135; R64-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 136; R64-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 137; R64-NEXT: mv s1, a1 138; R64-NEXT: mv s0, a0 139; R64-NEXT: call __gtdf2 140; R64-NEXT: bgtz a0, .LBB3_2 141; R64-NEXT: # %bb.1: 142; R64-NEXT: mv s0, s1 143; R64-NEXT: .LBB3_2: 144; R64-NEXT: mv a0, s0 145; R64-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 146; R64-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 147; R64-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 148; R64-NEXT: addi sp, sp, 32 149; R64-NEXT: ret 150 %r = call nnan double @llvm.maxnum.f64(double %x, double %y) 151 ret double %r 152} 153 154define float @minnum_f32(float %x, float %y) nounwind { 155; R32-LABEL: minnum_f32: 156; R32: # %bb.0: 157; R32-NEXT: addi sp, sp, -16 158; R32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 159; R32-NEXT: call fminf 160; R32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 161; R32-NEXT: addi sp, sp, 16 162; R32-NEXT: ret 163; 164; R64-LABEL: minnum_f32: 165; R64: # %bb.0: 166; R64-NEXT: addi sp, sp, -16 167; R64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 168; R64-NEXT: call fminf 169; R64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 170; R64-NEXT: addi sp, sp, 16 171; R64-NEXT: ret 172 %r = call float @llvm.minnum.f32(float %x, float %y) 173 ret float %r 174} 175 176define float @minnum_f32_nnan(float %x, float %y) nounwind { 177; R32-LABEL: minnum_f32_nnan: 178; R32: # %bb.0: 179; R32-NEXT: addi sp, sp, -16 180; R32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 181; R32-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 182; R32-NEXT: sw s1, 4(sp) # 4-byte Folded Spill 183; R32-NEXT: mv s1, a1 184; R32-NEXT: mv s0, a0 185; R32-NEXT: call __ltsf2 186; R32-NEXT: bltz a0, .LBB5_2 187; R32-NEXT: # %bb.1: 188; R32-NEXT: mv s0, s1 189; R32-NEXT: .LBB5_2: 190; R32-NEXT: mv a0, s0 191; R32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 192; R32-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 193; R32-NEXT: lw s1, 4(sp) # 4-byte Folded Reload 194; R32-NEXT: addi sp, sp, 16 195; R32-NEXT: ret 196; 197; R64-LABEL: minnum_f32_nnan: 198; R64: # %bb.0: 199; R64-NEXT: addi sp, sp, -32 200; R64-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 201; R64-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 202; R64-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 203; R64-NEXT: mv s1, a1 204; R64-NEXT: mv s0, a0 205; R64-NEXT: call __ltsf2 206; R64-NEXT: bltz a0, .LBB5_2 207; R64-NEXT: # %bb.1: 208; R64-NEXT: mv s0, s1 209; R64-NEXT: .LBB5_2: 210; R64-NEXT: mv a0, s0 211; R64-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 212; R64-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 213; R64-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 214; R64-NEXT: addi sp, sp, 32 215; R64-NEXT: ret 216 %r = call nnan float @llvm.minnum.f32(float %x, float %y) 217 ret float %r 218} 219 220define double @minnum_f64(double %x, double %y) nounwind { 221; R32-LABEL: minnum_f64: 222; R32: # %bb.0: 223; R32-NEXT: addi sp, sp, -16 224; R32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 225; R32-NEXT: call fmin 226; R32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 227; R32-NEXT: addi sp, sp, 16 228; R32-NEXT: ret 229; 230; R64-LABEL: minnum_f64: 231; R64: # %bb.0: 232; R64-NEXT: addi sp, sp, -16 233; R64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 234; R64-NEXT: call fmin 235; R64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 236; R64-NEXT: addi sp, sp, 16 237; R64-NEXT: ret 238 %r = call double @llvm.minnum.f64(double %x, double %y) 239 ret double %r 240} 241 242define double @minnum_f64_fast(double %x, double %y) nounwind { 243; R32-LABEL: minnum_f64_fast: 244; R32: # %bb.0: 245; R32-NEXT: addi sp, sp, -32 246; R32-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 247; R32-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 248; R32-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 249; R32-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 250; R32-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 251; R32-NEXT: mv s1, a3 252; R32-NEXT: mv s2, a2 253; R32-NEXT: mv s0, a1 254; R32-NEXT: mv s3, a0 255; R32-NEXT: call __ltdf2 256; R32-NEXT: mv a1, a0 257; R32-NEXT: mv a0, s3 258; R32-NEXT: bltz a1, .LBB7_2 259; R32-NEXT: # %bb.1: 260; R32-NEXT: mv s3, s2 261; R32-NEXT: .LBB7_2: 262; R32-NEXT: mv a1, s0 263; R32-NEXT: mv a2, s2 264; R32-NEXT: mv a3, s1 265; R32-NEXT: call __ltdf2 266; R32-NEXT: bltz a0, .LBB7_4 267; R32-NEXT: # %bb.3: 268; R32-NEXT: mv s0, s1 269; R32-NEXT: .LBB7_4: 270; R32-NEXT: mv a0, s3 271; R32-NEXT: mv a1, s0 272; R32-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 273; R32-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 274; R32-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 275; R32-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 276; R32-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 277; R32-NEXT: addi sp, sp, 32 278; R32-NEXT: ret 279; 280; R64-LABEL: minnum_f64_fast: 281; R64: # %bb.0: 282; R64-NEXT: addi sp, sp, -32 283; R64-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 284; R64-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 285; R64-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 286; R64-NEXT: mv s1, a1 287; R64-NEXT: mv s0, a0 288; R64-NEXT: call __ltdf2 289; R64-NEXT: bltz a0, .LBB7_2 290; R64-NEXT: # %bb.1: 291; R64-NEXT: mv s0, s1 292; R64-NEXT: .LBB7_2: 293; R64-NEXT: mv a0, s0 294; R64-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 295; R64-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 296; R64-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 297; R64-NEXT: addi sp, sp, 32 298; R64-NEXT: ret 299 %r = call fast double @llvm.minnum.f64(double %x, double %y) 300 ret double %r 301} 302 303declare float @llvm.maxnum.f32(float, float) 304declare double @llvm.maxnum.f64(double, double) 305declare float @llvm.minnum.f32(float, float) 306declare double @llvm.minnum.f64(double, double) 307