140f1af47SCraig Topper; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2c2614b31SCraig Topper; RUN: llc < %s -mtriple=riscv32 -mattr=+f,+d,+zfh -target-abi=ilp32d | \ 3c2614b31SCraig Topper; RUN: FileCheck %s --check-prefixes=RV32 4c2614b31SCraig Topper; RUN: llc < %s -mtriple=riscv64 -mattr=+f,+d,+zfh -target-abi=lp64d | \ 5c2614b31SCraig Topper; RUN: FileCheck %s --check-prefixes=RV64 640f1af47SCraig Topper 740f1af47SCraig Topper; Make sure MachineCSE can combine the adds with the operands commuted. 840f1af47SCraig Topper 91456b686SNikita Popovdefine void @commute_add_i32(i32 signext %x, i32 signext %y, ptr %p1, ptr %p2, i1 zeroext %cond) { 1040f1af47SCraig Topper; RV32-LABEL: commute_add_i32: 1140f1af47SCraig Topper; RV32: # %bb.0: 1240f1af47SCraig Topper; RV32-NEXT: add a0, a0, a1 1340f1af47SCraig Topper; RV32-NEXT: sw a0, 0(a2) 1440f1af47SCraig Topper; RV32-NEXT: beqz a4, .LBB0_2 1540f1af47SCraig Topper; RV32-NEXT: # %bb.1: # %trueblock 1640f1af47SCraig Topper; RV32-NEXT: sw a0, 0(a2) 1740f1af47SCraig Topper; RV32-NEXT: .LBB0_2: # %falseblock 1840f1af47SCraig Topper; RV32-NEXT: ret 1940f1af47SCraig Topper; 2040f1af47SCraig Topper; RV64-LABEL: commute_add_i32: 2140f1af47SCraig Topper; RV64: # %bb.0: 22d64d3c5aSNitin John Raj; RV64-NEXT: add a0, a0, a1 2340f1af47SCraig Topper; RV64-NEXT: sw a0, 0(a2) 2440f1af47SCraig Topper; RV64-NEXT: beqz a4, .LBB0_2 2540f1af47SCraig Topper; RV64-NEXT: # %bb.1: # %trueblock 2640f1af47SCraig Topper; RV64-NEXT: sw a0, 0(a2) 2740f1af47SCraig Topper; RV64-NEXT: .LBB0_2: # %falseblock 2840f1af47SCraig Topper; RV64-NEXT: ret 2940f1af47SCraig Topper %a = add i32 %x, %y 301456b686SNikita Popov store i32 %a, ptr %p1 3140f1af47SCraig Topper br i1 %cond, label %trueblock, label %falseblock 3240f1af47SCraig Topper 3340f1af47SCraig Toppertrueblock: 3440f1af47SCraig Topper %b = add i32 %y, %x 351456b686SNikita Popov store i32 %b, ptr %p1 3640f1af47SCraig Topper br label %falseblock 3740f1af47SCraig Topper 3840f1af47SCraig Topperfalseblock: 3940f1af47SCraig Topper ret void 4040f1af47SCraig Topper} 4140f1af47SCraig Topper 421456b686SNikita Popovdefine void @commute_add_i64(i64 %x, i64 %y, ptr %p1, ptr %p2, i1 zeroext %cond) { 4340f1af47SCraig Topper; RV32-LABEL: commute_add_i64: 4440f1af47SCraig Topper; RV32: # %bb.0: 4540f1af47SCraig Topper; RV32-NEXT: add a1, a1, a3 4640f1af47SCraig Topper; RV32-NEXT: add a3, a0, a2 4740f1af47SCraig Topper; RV32-NEXT: sltu a0, a3, a0 4840f1af47SCraig Topper; RV32-NEXT: add a0, a1, a0 4940f1af47SCraig Topper; RV32-NEXT: sw a3, 0(a4) 5040f1af47SCraig Topper; RV32-NEXT: sw a0, 4(a4) 5140f1af47SCraig Topper; RV32-NEXT: beqz a6, .LBB1_2 5240f1af47SCraig Topper; RV32-NEXT: # %bb.1: # %trueblock 5340f1af47SCraig Topper; RV32-NEXT: sltu a0, a3, a2 5440f1af47SCraig Topper; RV32-NEXT: add a0, a1, a0 5540f1af47SCraig Topper; RV32-NEXT: sw a3, 0(a4) 5640f1af47SCraig Topper; RV32-NEXT: sw a0, 4(a4) 5740f1af47SCraig Topper; RV32-NEXT: .LBB1_2: # %falseblock 5840f1af47SCraig Topper; RV32-NEXT: ret 5940f1af47SCraig Topper; 6040f1af47SCraig Topper; RV64-LABEL: commute_add_i64: 6140f1af47SCraig Topper; RV64: # %bb.0: 6240f1af47SCraig Topper; RV64-NEXT: add a0, a0, a1 6340f1af47SCraig Topper; RV64-NEXT: sd a0, 0(a2) 6440f1af47SCraig Topper; RV64-NEXT: beqz a4, .LBB1_2 6540f1af47SCraig Topper; RV64-NEXT: # %bb.1: # %trueblock 6640f1af47SCraig Topper; RV64-NEXT: sd a0, 0(a2) 6740f1af47SCraig Topper; RV64-NEXT: .LBB1_2: # %falseblock 6840f1af47SCraig Topper; RV64-NEXT: ret 6940f1af47SCraig Topper %a = add i64 %x, %y 701456b686SNikita Popov store i64 %a, ptr %p1 7140f1af47SCraig Topper br i1 %cond, label %trueblock, label %falseblock 7240f1af47SCraig Topper 7340f1af47SCraig Toppertrueblock: 7440f1af47SCraig Topper %b = add i64 %y, %x 751456b686SNikita Popov store i64 %b, ptr %p1 7640f1af47SCraig Topper br label %falseblock 7740f1af47SCraig Topper 7840f1af47SCraig Topperfalseblock: 7940f1af47SCraig Topper ret void 8040f1af47SCraig Topper} 81c2614b31SCraig Topper 82c2614b31SCraig Topperdeclare half @llvm.fma.f16(half, half, half) 83c2614b31SCraig Topper 841456b686SNikita Popovdefine void @commute_fmadd_f16(half %x, half %y, half %z, ptr %p1, ptr %p2, i1 zeroext %cond) { 85c2614b31SCraig Topper; RV32-LABEL: commute_fmadd_f16: 86c2614b31SCraig Topper; RV32: # %bb.0: 87*7b0c4184SCraig Topper; RV32-NEXT: fmadd.h fa5, fa0, fa1, fa2 88*7b0c4184SCraig Topper; RV32-NEXT: fsh fa5, 0(a0) 89c2614b31SCraig Topper; RV32-NEXT: beqz a2, .LBB2_2 90c2614b31SCraig Topper; RV32-NEXT: # %bb.1: # %trueblock 91*7b0c4184SCraig Topper; RV32-NEXT: fsh fa5, 0(a0) 92c2614b31SCraig Topper; RV32-NEXT: .LBB2_2: # %falseblock 93c2614b31SCraig Topper; RV32-NEXT: ret 94c2614b31SCraig Topper; 95c2614b31SCraig Topper; RV64-LABEL: commute_fmadd_f16: 96c2614b31SCraig Topper; RV64: # %bb.0: 97*7b0c4184SCraig Topper; RV64-NEXT: fmadd.h fa5, fa0, fa1, fa2 98*7b0c4184SCraig Topper; RV64-NEXT: fsh fa5, 0(a0) 99c2614b31SCraig Topper; RV64-NEXT: beqz a2, .LBB2_2 100c2614b31SCraig Topper; RV64-NEXT: # %bb.1: # %trueblock 101*7b0c4184SCraig Topper; RV64-NEXT: fsh fa5, 0(a0) 102c2614b31SCraig Topper; RV64-NEXT: .LBB2_2: # %falseblock 103c2614b31SCraig Topper; RV64-NEXT: ret 104c2614b31SCraig Topper %a = call half @llvm.fma.f16(half %x, half %y, half %z) 1051456b686SNikita Popov store half %a, ptr %p1 106c2614b31SCraig Topper br i1 %cond, label %trueblock, label %falseblock 107c2614b31SCraig Topper 108c2614b31SCraig Toppertrueblock: 109c2614b31SCraig Topper %b = call half @llvm.fma.f16(half %y, half %x, half %z) 1101456b686SNikita Popov store half %b, ptr %p1 111c2614b31SCraig Topper br label %falseblock 112c2614b31SCraig Topper 113c2614b31SCraig Topperfalseblock: 114c2614b31SCraig Topper ret void 115c2614b31SCraig Topper} 116c2614b31SCraig Topper 117c2614b31SCraig Topperdeclare float @llvm.fma.f32(float, float, float) 118c2614b31SCraig Topper 1191456b686SNikita Popovdefine void @commute_fmadd_f32(float %x, float %y, float %z, ptr %p1, ptr %p2, i1 zeroext %cond) { 120c2614b31SCraig Topper; RV32-LABEL: commute_fmadd_f32: 121c2614b31SCraig Topper; RV32: # %bb.0: 122*7b0c4184SCraig Topper; RV32-NEXT: fmadd.s fa5, fa0, fa1, fa2 123*7b0c4184SCraig Topper; RV32-NEXT: fsw fa5, 0(a0) 124c2614b31SCraig Topper; RV32-NEXT: beqz a2, .LBB3_2 125c2614b31SCraig Topper; RV32-NEXT: # %bb.1: # %trueblock 126*7b0c4184SCraig Topper; RV32-NEXT: fsw fa5, 0(a0) 127c2614b31SCraig Topper; RV32-NEXT: .LBB3_2: # %falseblock 128c2614b31SCraig Topper; RV32-NEXT: ret 129c2614b31SCraig Topper; 130c2614b31SCraig Topper; RV64-LABEL: commute_fmadd_f32: 131c2614b31SCraig Topper; RV64: # %bb.0: 132*7b0c4184SCraig Topper; RV64-NEXT: fmadd.s fa5, fa0, fa1, fa2 133*7b0c4184SCraig Topper; RV64-NEXT: fsw fa5, 0(a0) 134c2614b31SCraig Topper; RV64-NEXT: beqz a2, .LBB3_2 135c2614b31SCraig Topper; RV64-NEXT: # %bb.1: # %trueblock 136*7b0c4184SCraig Topper; RV64-NEXT: fsw fa5, 0(a0) 137c2614b31SCraig Topper; RV64-NEXT: .LBB3_2: # %falseblock 138c2614b31SCraig Topper; RV64-NEXT: ret 139c2614b31SCraig Topper %a = call float @llvm.fma.f32(float %x, float %y, float %z) 1401456b686SNikita Popov store float %a, ptr %p1 141c2614b31SCraig Topper br i1 %cond, label %trueblock, label %falseblock 142c2614b31SCraig Topper 143c2614b31SCraig Toppertrueblock: 144c2614b31SCraig Topper %b = call float @llvm.fma.f32(float %y, float %x, float %z) 1451456b686SNikita Popov store float %b, ptr %p1 146c2614b31SCraig Topper br label %falseblock 147c2614b31SCraig Topper 148c2614b31SCraig Topperfalseblock: 149c2614b31SCraig Topper ret void 150c2614b31SCraig Topper} 151c2614b31SCraig Topper 152c2614b31SCraig Topperdeclare double @llvm.fma.f64(double, double, double) 153c2614b31SCraig Topper 1541456b686SNikita Popovdefine void @commute_fmadd_f64(double %x, double %y, double %z, ptr %p1, ptr %p2, i1 zeroext %cond) { 155c2614b31SCraig Topper; RV32-LABEL: commute_fmadd_f64: 156c2614b31SCraig Topper; RV32: # %bb.0: 157*7b0c4184SCraig Topper; RV32-NEXT: fmadd.d fa5, fa0, fa1, fa2 158*7b0c4184SCraig Topper; RV32-NEXT: fsd fa5, 0(a0) 159c2614b31SCraig Topper; RV32-NEXT: beqz a2, .LBB4_2 160c2614b31SCraig Topper; RV32-NEXT: # %bb.1: # %trueblock 161*7b0c4184SCraig Topper; RV32-NEXT: fsd fa5, 0(a0) 162c2614b31SCraig Topper; RV32-NEXT: .LBB4_2: # %falseblock 163c2614b31SCraig Topper; RV32-NEXT: ret 164c2614b31SCraig Topper; 165c2614b31SCraig Topper; RV64-LABEL: commute_fmadd_f64: 166c2614b31SCraig Topper; RV64: # %bb.0: 167*7b0c4184SCraig Topper; RV64-NEXT: fmadd.d fa5, fa0, fa1, fa2 168*7b0c4184SCraig Topper; RV64-NEXT: fsd fa5, 0(a0) 169c2614b31SCraig Topper; RV64-NEXT: beqz a2, .LBB4_2 170c2614b31SCraig Topper; RV64-NEXT: # %bb.1: # %trueblock 171*7b0c4184SCraig Topper; RV64-NEXT: fsd fa5, 0(a0) 172c2614b31SCraig Topper; RV64-NEXT: .LBB4_2: # %falseblock 173c2614b31SCraig Topper; RV64-NEXT: ret 174c2614b31SCraig Topper %a = call double @llvm.fma.f64(double %x, double %y, double %z) 1751456b686SNikita Popov store double %a, ptr %p1 176c2614b31SCraig Topper br i1 %cond, label %trueblock, label %falseblock 177c2614b31SCraig Topper 178c2614b31SCraig Toppertrueblock: 179c2614b31SCraig Topper %b = call double @llvm.fma.f64(double %y, double %x, double %z) 1801456b686SNikita Popov store double %b, ptr %p1 181c2614b31SCraig Topper br label %falseblock 182c2614b31SCraig Topper 183c2614b31SCraig Topperfalseblock: 184c2614b31SCraig Topper ret void 185c2614b31SCraig Topper} 186c2614b31SCraig Topper 1871456b686SNikita Popovdefine void @commute_fmsub_f16(half %x, half %y, half %z, ptr %p1, ptr %p2, i1 zeroext %cond) { 188c2614b31SCraig Topper; RV32-LABEL: commute_fmsub_f16: 189c2614b31SCraig Topper; RV32: # %bb.0: 190*7b0c4184SCraig Topper; RV32-NEXT: fmsub.h fa5, fa0, fa1, fa2 191*7b0c4184SCraig Topper; RV32-NEXT: fsh fa5, 0(a0) 192c2614b31SCraig Topper; RV32-NEXT: beqz a2, .LBB5_2 193c2614b31SCraig Topper; RV32-NEXT: # %bb.1: # %trueblock 194*7b0c4184SCraig Topper; RV32-NEXT: fsh fa5, 0(a0) 195c2614b31SCraig Topper; RV32-NEXT: .LBB5_2: # %falseblock 196c2614b31SCraig Topper; RV32-NEXT: ret 197c2614b31SCraig Topper; 198c2614b31SCraig Topper; RV64-LABEL: commute_fmsub_f16: 199c2614b31SCraig Topper; RV64: # %bb.0: 200*7b0c4184SCraig Topper; RV64-NEXT: fmsub.h fa5, fa0, fa1, fa2 201*7b0c4184SCraig Topper; RV64-NEXT: fsh fa5, 0(a0) 202c2614b31SCraig Topper; RV64-NEXT: beqz a2, .LBB5_2 203c2614b31SCraig Topper; RV64-NEXT: # %bb.1: # %trueblock 204*7b0c4184SCraig Topper; RV64-NEXT: fsh fa5, 0(a0) 205c2614b31SCraig Topper; RV64-NEXT: .LBB5_2: # %falseblock 206c2614b31SCraig Topper; RV64-NEXT: ret 207c2614b31SCraig Topper %negz = fneg half %z 208c2614b31SCraig Topper %a = call half @llvm.fma.f16(half %x, half %y, half %negz) 2091456b686SNikita Popov store half %a, ptr %p1 210c2614b31SCraig Topper br i1 %cond, label %trueblock, label %falseblock 211c2614b31SCraig Topper 212c2614b31SCraig Toppertrueblock: 213c2614b31SCraig Topper %negz2 = fneg half %z 214c2614b31SCraig Topper %b = call half @llvm.fma.f16(half %y, half %x, half %negz2) 2151456b686SNikita Popov store half %b, ptr %p1 216c2614b31SCraig Topper br label %falseblock 217c2614b31SCraig Topper 218c2614b31SCraig Topperfalseblock: 219c2614b31SCraig Topper ret void 220c2614b31SCraig Topper} 221c2614b31SCraig Topper 2221456b686SNikita Popovdefine void @commute_fmsub_f32(float %x, float %y, float %z, ptr %p1, ptr %p2, i1 zeroext %cond) { 223c2614b31SCraig Topper; RV32-LABEL: commute_fmsub_f32: 224c2614b31SCraig Topper; RV32: # %bb.0: 225*7b0c4184SCraig Topper; RV32-NEXT: fmsub.s fa5, fa0, fa1, fa2 226*7b0c4184SCraig Topper; RV32-NEXT: fsw fa5, 0(a0) 227c2614b31SCraig Topper; RV32-NEXT: beqz a2, .LBB6_2 228c2614b31SCraig Topper; RV32-NEXT: # %bb.1: # %trueblock 229*7b0c4184SCraig Topper; RV32-NEXT: fsw fa5, 0(a0) 230c2614b31SCraig Topper; RV32-NEXT: .LBB6_2: # %falseblock 231c2614b31SCraig Topper; RV32-NEXT: ret 232c2614b31SCraig Topper; 233c2614b31SCraig Topper; RV64-LABEL: commute_fmsub_f32: 234c2614b31SCraig Topper; RV64: # %bb.0: 235*7b0c4184SCraig Topper; RV64-NEXT: fmsub.s fa5, fa0, fa1, fa2 236*7b0c4184SCraig Topper; RV64-NEXT: fsw fa5, 0(a0) 237c2614b31SCraig Topper; RV64-NEXT: beqz a2, .LBB6_2 238c2614b31SCraig Topper; RV64-NEXT: # %bb.1: # %trueblock 239*7b0c4184SCraig Topper; RV64-NEXT: fsw fa5, 0(a0) 240c2614b31SCraig Topper; RV64-NEXT: .LBB6_2: # %falseblock 241c2614b31SCraig Topper; RV64-NEXT: ret 242c2614b31SCraig Topper %negz = fneg float %z 243c2614b31SCraig Topper %a = call float @llvm.fma.f32(float %x, float %y, float %negz) 2441456b686SNikita Popov store float %a, ptr %p1 245c2614b31SCraig Topper br i1 %cond, label %trueblock, label %falseblock 246c2614b31SCraig Topper 247c2614b31SCraig Toppertrueblock: 248c2614b31SCraig Topper %negz2 = fneg float %z 249c2614b31SCraig Topper %b = call float @llvm.fma.f32(float %y, float %x, float %negz2) 2501456b686SNikita Popov store float %b, ptr %p1 251c2614b31SCraig Topper br label %falseblock 252c2614b31SCraig Topper 253c2614b31SCraig Topperfalseblock: 254c2614b31SCraig Topper ret void 255c2614b31SCraig Topper} 256c2614b31SCraig Topper 2571456b686SNikita Popovdefine void @commute_fmsub_f64(double %x, double %y, double %z, ptr %p1, ptr %p2, i1 zeroext %cond) { 258c2614b31SCraig Topper; RV32-LABEL: commute_fmsub_f64: 259c2614b31SCraig Topper; RV32: # %bb.0: 260*7b0c4184SCraig Topper; RV32-NEXT: fmsub.d fa5, fa0, fa1, fa2 261*7b0c4184SCraig Topper; RV32-NEXT: fsd fa5, 0(a0) 262c2614b31SCraig Topper; RV32-NEXT: beqz a2, .LBB7_2 263c2614b31SCraig Topper; RV32-NEXT: # %bb.1: # %trueblock 264*7b0c4184SCraig Topper; RV32-NEXT: fsd fa5, 0(a0) 265c2614b31SCraig Topper; RV32-NEXT: .LBB7_2: # %falseblock 266c2614b31SCraig Topper; RV32-NEXT: ret 267c2614b31SCraig Topper; 268c2614b31SCraig Topper; RV64-LABEL: commute_fmsub_f64: 269c2614b31SCraig Topper; RV64: # %bb.0: 270*7b0c4184SCraig Topper; RV64-NEXT: fmsub.d fa5, fa0, fa1, fa2 271*7b0c4184SCraig Topper; RV64-NEXT: fsd fa5, 0(a0) 272c2614b31SCraig Topper; RV64-NEXT: beqz a2, .LBB7_2 273c2614b31SCraig Topper; RV64-NEXT: # %bb.1: # %trueblock 274*7b0c4184SCraig Topper; RV64-NEXT: fsd fa5, 0(a0) 275c2614b31SCraig Topper; RV64-NEXT: .LBB7_2: # %falseblock 276c2614b31SCraig Topper; RV64-NEXT: ret 277c2614b31SCraig Topper %negz = fneg double %z 278c2614b31SCraig Topper %a = call double @llvm.fma.f64(double %x, double %y, double %negz) 2791456b686SNikita Popov store double %a, ptr %p1 280c2614b31SCraig Topper br i1 %cond, label %trueblock, label %falseblock 281c2614b31SCraig Topper 282c2614b31SCraig Toppertrueblock: 283c2614b31SCraig Topper %negz2 = fneg double %z 284c2614b31SCraig Topper %b = call double @llvm.fma.f64(double %y, double %x, double %negz2) 2851456b686SNikita Popov store double %b, ptr %p1 286c2614b31SCraig Topper br label %falseblock 287c2614b31SCraig Topper 288c2614b31SCraig Topperfalseblock: 289c2614b31SCraig Topper ret void 290c2614b31SCraig Topper} 291c2614b31SCraig Topper 2921456b686SNikita Popovdefine void @commute_fnmadd_f16(half %x, half %y, half %z, ptr %p1, ptr %p2, i1 zeroext %cond) { 293c2614b31SCraig Topper; RV32-LABEL: commute_fnmadd_f16: 294c2614b31SCraig Topper; RV32: # %bb.0: 295*7b0c4184SCraig Topper; RV32-NEXT: fnmadd.h fa5, fa0, fa1, fa2 296*7b0c4184SCraig Topper; RV32-NEXT: fsh fa5, 0(a0) 297c2614b31SCraig Topper; RV32-NEXT: beqz a2, .LBB8_2 298c2614b31SCraig Topper; RV32-NEXT: # %bb.1: # %trueblock 299*7b0c4184SCraig Topper; RV32-NEXT: fsh fa5, 0(a0) 300c2614b31SCraig Topper; RV32-NEXT: .LBB8_2: # %falseblock 301c2614b31SCraig Topper; RV32-NEXT: ret 302c2614b31SCraig Topper; 303c2614b31SCraig Topper; RV64-LABEL: commute_fnmadd_f16: 304c2614b31SCraig Topper; RV64: # %bb.0: 305*7b0c4184SCraig Topper; RV64-NEXT: fnmadd.h fa5, fa0, fa1, fa2 306*7b0c4184SCraig Topper; RV64-NEXT: fsh fa5, 0(a0) 307c2614b31SCraig Topper; RV64-NEXT: beqz a2, .LBB8_2 308c2614b31SCraig Topper; RV64-NEXT: # %bb.1: # %trueblock 309*7b0c4184SCraig Topper; RV64-NEXT: fsh fa5, 0(a0) 310c2614b31SCraig Topper; RV64-NEXT: .LBB8_2: # %falseblock 311c2614b31SCraig Topper; RV64-NEXT: ret 312c2614b31SCraig Topper %negx = fneg half %x 313c2614b31SCraig Topper %negz = fneg half %z 314c2614b31SCraig Topper %a = call half @llvm.fma.f16(half %negx, half %y, half %negz) 3151456b686SNikita Popov store half %a, ptr %p1 316c2614b31SCraig Topper br i1 %cond, label %trueblock, label %falseblock 317c2614b31SCraig Topper 318c2614b31SCraig Toppertrueblock: 319c2614b31SCraig Topper %negy = fneg half %y 320c2614b31SCraig Topper %negz2 = fneg half %z 321c2614b31SCraig Topper %b = call half @llvm.fma.f16(half %negy, half %x, half %negz2) 3221456b686SNikita Popov store half %b, ptr %p1 323c2614b31SCraig Topper br label %falseblock 324c2614b31SCraig Topper 325c2614b31SCraig Topperfalseblock: 326c2614b31SCraig Topper ret void 327c2614b31SCraig Topper} 328c2614b31SCraig Topper 3291456b686SNikita Popovdefine void @commute_fnmadd_f32(float %x, float %y, float %z, ptr %p1, ptr %p2, i1 zeroext %cond) { 330c2614b31SCraig Topper; RV32-LABEL: commute_fnmadd_f32: 331c2614b31SCraig Topper; RV32: # %bb.0: 332*7b0c4184SCraig Topper; RV32-NEXT: fnmadd.s fa5, fa0, fa1, fa2 333*7b0c4184SCraig Topper; RV32-NEXT: fsw fa5, 0(a0) 334c2614b31SCraig Topper; RV32-NEXT: beqz a2, .LBB9_2 335c2614b31SCraig Topper; RV32-NEXT: # %bb.1: # %trueblock 336*7b0c4184SCraig Topper; RV32-NEXT: fsw fa5, 0(a0) 337c2614b31SCraig Topper; RV32-NEXT: .LBB9_2: # %falseblock 338c2614b31SCraig Topper; RV32-NEXT: ret 339c2614b31SCraig Topper; 340c2614b31SCraig Topper; RV64-LABEL: commute_fnmadd_f32: 341c2614b31SCraig Topper; RV64: # %bb.0: 342*7b0c4184SCraig Topper; RV64-NEXT: fnmadd.s fa5, fa0, fa1, fa2 343*7b0c4184SCraig Topper; RV64-NEXT: fsw fa5, 0(a0) 344c2614b31SCraig Topper; RV64-NEXT: beqz a2, .LBB9_2 345c2614b31SCraig Topper; RV64-NEXT: # %bb.1: # %trueblock 346*7b0c4184SCraig Topper; RV64-NEXT: fsw fa5, 0(a0) 347c2614b31SCraig Topper; RV64-NEXT: .LBB9_2: # %falseblock 348c2614b31SCraig Topper; RV64-NEXT: ret 349c2614b31SCraig Topper %negx = fneg float %x 350c2614b31SCraig Topper %negz = fneg float %z 351c2614b31SCraig Topper %a = call float @llvm.fma.f32(float %negx, float %y, float %negz) 3521456b686SNikita Popov store float %a, ptr %p1 353c2614b31SCraig Topper br i1 %cond, label %trueblock, label %falseblock 354c2614b31SCraig Topper 355c2614b31SCraig Toppertrueblock: 356c2614b31SCraig Topper %negy = fneg float %y 357c2614b31SCraig Topper %negz2 = fneg float %z 358c2614b31SCraig Topper %b = call float @llvm.fma.f32(float %negy, float %x, float %negz2) 3591456b686SNikita Popov store float %b, ptr %p1 360c2614b31SCraig Topper br label %falseblock 361c2614b31SCraig Topper 362c2614b31SCraig Topperfalseblock: 363c2614b31SCraig Topper ret void 364c2614b31SCraig Topper} 365c2614b31SCraig Topper 3661456b686SNikita Popovdefine void @commute_fnmadd_f64(double %x, double %y, double %z, ptr %p1, ptr %p2, i1 zeroext %cond) { 367c2614b31SCraig Topper; RV32-LABEL: commute_fnmadd_f64: 368c2614b31SCraig Topper; RV32: # %bb.0: 369*7b0c4184SCraig Topper; RV32-NEXT: fnmadd.d fa5, fa0, fa1, fa2 370*7b0c4184SCraig Topper; RV32-NEXT: fsd fa5, 0(a0) 371c2614b31SCraig Topper; RV32-NEXT: beqz a2, .LBB10_2 372c2614b31SCraig Topper; RV32-NEXT: # %bb.1: # %trueblock 373*7b0c4184SCraig Topper; RV32-NEXT: fsd fa5, 0(a0) 374c2614b31SCraig Topper; RV32-NEXT: .LBB10_2: # %falseblock 375c2614b31SCraig Topper; RV32-NEXT: ret 376c2614b31SCraig Topper; 377c2614b31SCraig Topper; RV64-LABEL: commute_fnmadd_f64: 378c2614b31SCraig Topper; RV64: # %bb.0: 379*7b0c4184SCraig Topper; RV64-NEXT: fnmadd.d fa5, fa0, fa1, fa2 380*7b0c4184SCraig Topper; RV64-NEXT: fsd fa5, 0(a0) 381c2614b31SCraig Topper; RV64-NEXT: beqz a2, .LBB10_2 382c2614b31SCraig Topper; RV64-NEXT: # %bb.1: # %trueblock 383*7b0c4184SCraig Topper; RV64-NEXT: fsd fa5, 0(a0) 384c2614b31SCraig Topper; RV64-NEXT: .LBB10_2: # %falseblock 385c2614b31SCraig Topper; RV64-NEXT: ret 386c2614b31SCraig Topper %negx = fneg double %x 387c2614b31SCraig Topper %negz = fneg double %z 388c2614b31SCraig Topper %a = call double @llvm.fma.f64(double %negx, double %y, double %negz) 3891456b686SNikita Popov store double %a, ptr %p1 390c2614b31SCraig Topper br i1 %cond, label %trueblock, label %falseblock 391c2614b31SCraig Topper 392c2614b31SCraig Toppertrueblock: 393c2614b31SCraig Topper %negy = fneg double %y 394c2614b31SCraig Topper %negz2 = fneg double %z 395c2614b31SCraig Topper %b = call double @llvm.fma.f64(double %negy, double %x, double %negz2) 3961456b686SNikita Popov store double %b, ptr %p1 397c2614b31SCraig Topper br label %falseblock 398c2614b31SCraig Topper 399c2614b31SCraig Topperfalseblock: 400c2614b31SCraig Topper ret void 401c2614b31SCraig Topper} 402c2614b31SCraig Topper 4031456b686SNikita Popovdefine void @commute_fnmsub_f16(half %x, half %y, half %z, ptr %p1, ptr %p2, i1 zeroext %cond) { 404c2614b31SCraig Topper; RV32-LABEL: commute_fnmsub_f16: 405c2614b31SCraig Topper; RV32: # %bb.0: 406*7b0c4184SCraig Topper; RV32-NEXT: fnmsub.h fa5, fa0, fa1, fa2 407*7b0c4184SCraig Topper; RV32-NEXT: fsh fa5, 0(a0) 408c2614b31SCraig Topper; RV32-NEXT: beqz a2, .LBB11_2 409c2614b31SCraig Topper; RV32-NEXT: # %bb.1: # %trueblock 410*7b0c4184SCraig Topper; RV32-NEXT: fsh fa5, 0(a0) 411c2614b31SCraig Topper; RV32-NEXT: .LBB11_2: # %falseblock 412c2614b31SCraig Topper; RV32-NEXT: ret 413c2614b31SCraig Topper; 414c2614b31SCraig Topper; RV64-LABEL: commute_fnmsub_f16: 415c2614b31SCraig Topper; RV64: # %bb.0: 416*7b0c4184SCraig Topper; RV64-NEXT: fnmsub.h fa5, fa0, fa1, fa2 417*7b0c4184SCraig Topper; RV64-NEXT: fsh fa5, 0(a0) 418c2614b31SCraig Topper; RV64-NEXT: beqz a2, .LBB11_2 419c2614b31SCraig Topper; RV64-NEXT: # %bb.1: # %trueblock 420*7b0c4184SCraig Topper; RV64-NEXT: fsh fa5, 0(a0) 421c2614b31SCraig Topper; RV64-NEXT: .LBB11_2: # %falseblock 422c2614b31SCraig Topper; RV64-NEXT: ret 423c2614b31SCraig Topper %negx = fneg half %x 424c2614b31SCraig Topper %a = call half @llvm.fma.f16(half %negx, half %y, half %z) 4251456b686SNikita Popov store half %a, ptr %p1 426c2614b31SCraig Topper br i1 %cond, label %trueblock, label %falseblock 427c2614b31SCraig Topper 428c2614b31SCraig Toppertrueblock: 429c2614b31SCraig Topper %negy = fneg half %y 430c2614b31SCraig Topper %b = call half @llvm.fma.f16(half %negy, half %x, half %z) 4311456b686SNikita Popov store half %b, ptr %p1 432c2614b31SCraig Topper br label %falseblock 433c2614b31SCraig Topper 434c2614b31SCraig Topperfalseblock: 435c2614b31SCraig Topper ret void 436c2614b31SCraig Topper} 437c2614b31SCraig Topper 4381456b686SNikita Popovdefine void @commute_fnmsub_f32(float %x, float %y, float %z, ptr %p1, ptr %p2, i1 zeroext %cond) { 439c2614b31SCraig Topper; RV32-LABEL: commute_fnmsub_f32: 440c2614b31SCraig Topper; RV32: # %bb.0: 441*7b0c4184SCraig Topper; RV32-NEXT: fnmsub.s fa5, fa0, fa1, fa2 442*7b0c4184SCraig Topper; RV32-NEXT: fsw fa5, 0(a0) 443c2614b31SCraig Topper; RV32-NEXT: beqz a2, .LBB12_2 444c2614b31SCraig Topper; RV32-NEXT: # %bb.1: # %trueblock 445*7b0c4184SCraig Topper; RV32-NEXT: fsw fa5, 0(a0) 446c2614b31SCraig Topper; RV32-NEXT: .LBB12_2: # %falseblock 447c2614b31SCraig Topper; RV32-NEXT: ret 448c2614b31SCraig Topper; 449c2614b31SCraig Topper; RV64-LABEL: commute_fnmsub_f32: 450c2614b31SCraig Topper; RV64: # %bb.0: 451*7b0c4184SCraig Topper; RV64-NEXT: fnmsub.s fa5, fa0, fa1, fa2 452*7b0c4184SCraig Topper; RV64-NEXT: fsw fa5, 0(a0) 453c2614b31SCraig Topper; RV64-NEXT: beqz a2, .LBB12_2 454c2614b31SCraig Topper; RV64-NEXT: # %bb.1: # %trueblock 455*7b0c4184SCraig Topper; RV64-NEXT: fsw fa5, 0(a0) 456c2614b31SCraig Topper; RV64-NEXT: .LBB12_2: # %falseblock 457c2614b31SCraig Topper; RV64-NEXT: ret 458c2614b31SCraig Topper %negx = fneg float %x 459c2614b31SCraig Topper %a = call float @llvm.fma.f32(float %negx, float %y, float %z) 4601456b686SNikita Popov store float %a, ptr %p1 461c2614b31SCraig Topper br i1 %cond, label %trueblock, label %falseblock 462c2614b31SCraig Topper 463c2614b31SCraig Toppertrueblock: 464c2614b31SCraig Topper %negy = fneg float %y 465c2614b31SCraig Topper %b = call float @llvm.fma.f32(float %negy, float %x, float %z) 4661456b686SNikita Popov store float %b, ptr %p1 467c2614b31SCraig Topper br label %falseblock 468c2614b31SCraig Topper 469c2614b31SCraig Topperfalseblock: 470c2614b31SCraig Topper ret void 471c2614b31SCraig Topper} 472c2614b31SCraig Topper 4731456b686SNikita Popovdefine void @commute_fnmsub_f64(double %x, double %y, double %z, ptr %p1, ptr %p2, i1 zeroext %cond) { 474c2614b31SCraig Topper; RV32-LABEL: commute_fnmsub_f64: 475c2614b31SCraig Topper; RV32: # %bb.0: 476*7b0c4184SCraig Topper; RV32-NEXT: fnmsub.d fa5, fa0, fa1, fa2 477*7b0c4184SCraig Topper; RV32-NEXT: fsd fa5, 0(a0) 478c2614b31SCraig Topper; RV32-NEXT: beqz a2, .LBB13_2 479c2614b31SCraig Topper; RV32-NEXT: # %bb.1: # %trueblock 480*7b0c4184SCraig Topper; RV32-NEXT: fsd fa5, 0(a0) 481c2614b31SCraig Topper; RV32-NEXT: .LBB13_2: # %falseblock 482c2614b31SCraig Topper; RV32-NEXT: ret 483c2614b31SCraig Topper; 484c2614b31SCraig Topper; RV64-LABEL: commute_fnmsub_f64: 485c2614b31SCraig Topper; RV64: # %bb.0: 486*7b0c4184SCraig Topper; RV64-NEXT: fnmsub.d fa5, fa0, fa1, fa2 487*7b0c4184SCraig Topper; RV64-NEXT: fsd fa5, 0(a0) 488c2614b31SCraig Topper; RV64-NEXT: beqz a2, .LBB13_2 489c2614b31SCraig Topper; RV64-NEXT: # %bb.1: # %trueblock 490*7b0c4184SCraig Topper; RV64-NEXT: fsd fa5, 0(a0) 491c2614b31SCraig Topper; RV64-NEXT: .LBB13_2: # %falseblock 492c2614b31SCraig Topper; RV64-NEXT: ret 493c2614b31SCraig Topper %negx = fneg double %x 494c2614b31SCraig Topper %a = call double @llvm.fma.f64(double %negx, double %y, double %z) 4951456b686SNikita Popov store double %a, ptr %p1 496c2614b31SCraig Topper br i1 %cond, label %trueblock, label %falseblock 497c2614b31SCraig Topper 498c2614b31SCraig Toppertrueblock: 499c2614b31SCraig Topper %negy = fneg double %y 500c2614b31SCraig Topper %b = call double @llvm.fma.f64(double %negy, double %x, double %z) 5011456b686SNikita Popov store double %b, ptr %p1 502c2614b31SCraig Topper br label %falseblock 503c2614b31SCraig Topper 504c2614b31SCraig Topperfalseblock: 505c2614b31SCraig Topper ret void 506c2614b31SCraig Topper} 50772a66358SCraig Topper 5081456b686SNikita Popovdefine void @commute_fadd_f16(half %x, half %y, ptr %p1, ptr %p2, i1 zeroext %cond) { 50972a66358SCraig Topper; RV32-LABEL: commute_fadd_f16: 51072a66358SCraig Topper; RV32: # %bb.0: 511*7b0c4184SCraig Topper; RV32-NEXT: fadd.h fa5, fa0, fa1 512*7b0c4184SCraig Topper; RV32-NEXT: fsh fa5, 0(a0) 51372a66358SCraig Topper; RV32-NEXT: beqz a2, .LBB14_2 51472a66358SCraig Topper; RV32-NEXT: # %bb.1: # %trueblock 515*7b0c4184SCraig Topper; RV32-NEXT: fsh fa5, 0(a0) 51672a66358SCraig Topper; RV32-NEXT: .LBB14_2: # %falseblock 51772a66358SCraig Topper; RV32-NEXT: ret 51872a66358SCraig Topper; 51972a66358SCraig Topper; RV64-LABEL: commute_fadd_f16: 52072a66358SCraig Topper; RV64: # %bb.0: 521*7b0c4184SCraig Topper; RV64-NEXT: fadd.h fa5, fa0, fa1 522*7b0c4184SCraig Topper; RV64-NEXT: fsh fa5, 0(a0) 52372a66358SCraig Topper; RV64-NEXT: beqz a2, .LBB14_2 52472a66358SCraig Topper; RV64-NEXT: # %bb.1: # %trueblock 525*7b0c4184SCraig Topper; RV64-NEXT: fsh fa5, 0(a0) 52672a66358SCraig Topper; RV64-NEXT: .LBB14_2: # %falseblock 52772a66358SCraig Topper; RV64-NEXT: ret 52872a66358SCraig Topper %a = fadd half %x, %y 5291456b686SNikita Popov store half %a, ptr %p1 53072a66358SCraig Topper br i1 %cond, label %trueblock, label %falseblock 53172a66358SCraig Topper 53272a66358SCraig Toppertrueblock: 53372a66358SCraig Topper %b = fadd half %y, %x 5341456b686SNikita Popov store half %b, ptr %p1 53572a66358SCraig Topper br label %falseblock 53672a66358SCraig Topper 53772a66358SCraig Topperfalseblock: 53872a66358SCraig Topper ret void 53972a66358SCraig Topper} 54072a66358SCraig Topper 5411456b686SNikita Popovdefine void @commute_fadd_f32(float %x, float %y, ptr %p1, ptr %p2, i1 zeroext %cond) { 54272a66358SCraig Topper; RV32-LABEL: commute_fadd_f32: 54372a66358SCraig Topper; RV32: # %bb.0: 544*7b0c4184SCraig Topper; RV32-NEXT: fadd.s fa5, fa0, fa1 545*7b0c4184SCraig Topper; RV32-NEXT: fsw fa5, 0(a0) 54672a66358SCraig Topper; RV32-NEXT: beqz a2, .LBB15_2 54772a66358SCraig Topper; RV32-NEXT: # %bb.1: # %trueblock 548*7b0c4184SCraig Topper; RV32-NEXT: fsw fa5, 0(a0) 54972a66358SCraig Topper; RV32-NEXT: .LBB15_2: # %falseblock 55072a66358SCraig Topper; RV32-NEXT: ret 55172a66358SCraig Topper; 55272a66358SCraig Topper; RV64-LABEL: commute_fadd_f32: 55372a66358SCraig Topper; RV64: # %bb.0: 554*7b0c4184SCraig Topper; RV64-NEXT: fadd.s fa5, fa0, fa1 555*7b0c4184SCraig Topper; RV64-NEXT: fsw fa5, 0(a0) 55672a66358SCraig Topper; RV64-NEXT: beqz a2, .LBB15_2 55772a66358SCraig Topper; RV64-NEXT: # %bb.1: # %trueblock 558*7b0c4184SCraig Topper; RV64-NEXT: fsw fa5, 0(a0) 55972a66358SCraig Topper; RV64-NEXT: .LBB15_2: # %falseblock 56072a66358SCraig Topper; RV64-NEXT: ret 56172a66358SCraig Topper %a = fadd float %x, %y 5621456b686SNikita Popov store float %a, ptr %p1 56372a66358SCraig Topper br i1 %cond, label %trueblock, label %falseblock 56472a66358SCraig Topper 56572a66358SCraig Toppertrueblock: 56672a66358SCraig Topper %b = fadd float %y, %x 5671456b686SNikita Popov store float %b, ptr %p1 56872a66358SCraig Topper br label %falseblock 56972a66358SCraig Topper 57072a66358SCraig Topperfalseblock: 57172a66358SCraig Topper ret void 57272a66358SCraig Topper} 57372a66358SCraig Topper 5741456b686SNikita Popovdefine void @commute_fadd_f64(double %x, double %y, ptr %p1, ptr %p2, i1 zeroext %cond) { 57572a66358SCraig Topper; RV32-LABEL: commute_fadd_f64: 57672a66358SCraig Topper; RV32: # %bb.0: 577*7b0c4184SCraig Topper; RV32-NEXT: fadd.d fa5, fa0, fa1 578*7b0c4184SCraig Topper; RV32-NEXT: fsd fa5, 0(a0) 57972a66358SCraig Topper; RV32-NEXT: beqz a2, .LBB16_2 58072a66358SCraig Topper; RV32-NEXT: # %bb.1: # %trueblock 581*7b0c4184SCraig Topper; RV32-NEXT: fsd fa5, 0(a0) 58272a66358SCraig Topper; RV32-NEXT: .LBB16_2: # %falseblock 58372a66358SCraig Topper; RV32-NEXT: ret 58472a66358SCraig Topper; 58572a66358SCraig Topper; RV64-LABEL: commute_fadd_f64: 58672a66358SCraig Topper; RV64: # %bb.0: 587*7b0c4184SCraig Topper; RV64-NEXT: fadd.d fa5, fa0, fa1 588*7b0c4184SCraig Topper; RV64-NEXT: fsd fa5, 0(a0) 58972a66358SCraig Topper; RV64-NEXT: beqz a2, .LBB16_2 59072a66358SCraig Topper; RV64-NEXT: # %bb.1: # %trueblock 591*7b0c4184SCraig Topper; RV64-NEXT: fsd fa5, 0(a0) 59272a66358SCraig Topper; RV64-NEXT: .LBB16_2: # %falseblock 59372a66358SCraig Topper; RV64-NEXT: ret 59472a66358SCraig Topper %a = fadd double %x, %y 5951456b686SNikita Popov store double %a, ptr %p1 59672a66358SCraig Topper br i1 %cond, label %trueblock, label %falseblock 59772a66358SCraig Topper 59872a66358SCraig Toppertrueblock: 59972a66358SCraig Topper %b = fadd double %y, %x 6001456b686SNikita Popov store double %b, ptr %p1 60172a66358SCraig Topper br label %falseblock 60272a66358SCraig Topper 60372a66358SCraig Topperfalseblock: 60472a66358SCraig Topper ret void 60572a66358SCraig Topper} 60672a66358SCraig Topper 6071456b686SNikita Popovdefine void @commute_feq_f16(half %x, half %y, ptr %p1, ptr %p2, i1 zeroext %cond) { 60872a66358SCraig Topper; RV32-LABEL: commute_feq_f16: 60972a66358SCraig Topper; RV32: # %bb.0: 61072a66358SCraig Topper; RV32-NEXT: feq.h a1, fa0, fa1 61172a66358SCraig Topper; RV32-NEXT: sb a1, 0(a0) 61272a66358SCraig Topper; RV32-NEXT: beqz a2, .LBB17_2 61372a66358SCraig Topper; RV32-NEXT: # %bb.1: # %trueblock 61472a66358SCraig Topper; RV32-NEXT: sb a1, 0(a0) 61572a66358SCraig Topper; RV32-NEXT: .LBB17_2: # %falseblock 61672a66358SCraig Topper; RV32-NEXT: ret 61772a66358SCraig Topper; 61872a66358SCraig Topper; RV64-LABEL: commute_feq_f16: 61972a66358SCraig Topper; RV64: # %bb.0: 62072a66358SCraig Topper; RV64-NEXT: feq.h a1, fa0, fa1 62172a66358SCraig Topper; RV64-NEXT: sb a1, 0(a0) 62272a66358SCraig Topper; RV64-NEXT: beqz a2, .LBB17_2 62372a66358SCraig Topper; RV64-NEXT: # %bb.1: # %trueblock 62472a66358SCraig Topper; RV64-NEXT: sb a1, 0(a0) 62572a66358SCraig Topper; RV64-NEXT: .LBB17_2: # %falseblock 62672a66358SCraig Topper; RV64-NEXT: ret 62772a66358SCraig Topper %a = fcmp oeq half %x, %y 62872a66358SCraig Topper %b = zext i1 %a to i8 6291456b686SNikita Popov store i8 %b, ptr %p1 63072a66358SCraig Topper br i1 %cond, label %trueblock, label %falseblock 63172a66358SCraig Topper 63272a66358SCraig Toppertrueblock: 63372a66358SCraig Topper %c = fcmp oeq half %y, %x 63472a66358SCraig Topper %d = zext i1 %c to i8 6351456b686SNikita Popov store i8 %d, ptr %p1 63672a66358SCraig Topper br label %falseblock 63772a66358SCraig Topper 63872a66358SCraig Topperfalseblock: 63972a66358SCraig Topper ret void 64072a66358SCraig Topper} 64172a66358SCraig Topper 6421456b686SNikita Popovdefine void @commute_feq_f32(float %x, float %y, ptr %p1, ptr %p2, i1 zeroext %cond) { 64372a66358SCraig Topper; RV32-LABEL: commute_feq_f32: 64472a66358SCraig Topper; RV32: # %bb.0: 64572a66358SCraig Topper; RV32-NEXT: feq.s a1, fa0, fa1 64672a66358SCraig Topper; RV32-NEXT: sb a1, 0(a0) 64772a66358SCraig Topper; RV32-NEXT: beqz a2, .LBB18_2 64872a66358SCraig Topper; RV32-NEXT: # %bb.1: # %trueblock 64972a66358SCraig Topper; RV32-NEXT: sb a1, 0(a0) 65072a66358SCraig Topper; RV32-NEXT: .LBB18_2: # %falseblock 65172a66358SCraig Topper; RV32-NEXT: ret 65272a66358SCraig Topper; 65372a66358SCraig Topper; RV64-LABEL: commute_feq_f32: 65472a66358SCraig Topper; RV64: # %bb.0: 65572a66358SCraig Topper; RV64-NEXT: feq.s a1, fa0, fa1 65672a66358SCraig Topper; RV64-NEXT: sb a1, 0(a0) 65772a66358SCraig Topper; RV64-NEXT: beqz a2, .LBB18_2 65872a66358SCraig Topper; RV64-NEXT: # %bb.1: # %trueblock 65972a66358SCraig Topper; RV64-NEXT: sb a1, 0(a0) 66072a66358SCraig Topper; RV64-NEXT: .LBB18_2: # %falseblock 66172a66358SCraig Topper; RV64-NEXT: ret 66272a66358SCraig Topper %a = fcmp oeq float %x, %y 66372a66358SCraig Topper %b = zext i1 %a to i8 6641456b686SNikita Popov store i8 %b, ptr %p1 66572a66358SCraig Topper br i1 %cond, label %trueblock, label %falseblock 66672a66358SCraig Topper 66772a66358SCraig Toppertrueblock: 66872a66358SCraig Topper %c = fcmp oeq float %y, %x 66972a66358SCraig Topper %d = zext i1 %c to i8 6701456b686SNikita Popov store i8 %d, ptr %p1 67172a66358SCraig Topper br label %falseblock 67272a66358SCraig Topper 67372a66358SCraig Topperfalseblock: 67472a66358SCraig Topper ret void 67572a66358SCraig Topper} 67672a66358SCraig Topper 6771456b686SNikita Popovdefine void @commute_feq_f64(double %x, double %y, ptr %p1, ptr %p2, i1 zeroext %cond) { 67872a66358SCraig Topper; RV32-LABEL: commute_feq_f64: 67972a66358SCraig Topper; RV32: # %bb.0: 68072a66358SCraig Topper; RV32-NEXT: feq.d a1, fa0, fa1 68172a66358SCraig Topper; RV32-NEXT: sb a1, 0(a0) 68272a66358SCraig Topper; RV32-NEXT: beqz a2, .LBB19_2 68372a66358SCraig Topper; RV32-NEXT: # %bb.1: # %trueblock 68472a66358SCraig Topper; RV32-NEXT: sb a1, 0(a0) 68572a66358SCraig Topper; RV32-NEXT: .LBB19_2: # %falseblock 68672a66358SCraig Topper; RV32-NEXT: ret 68772a66358SCraig Topper; 68872a66358SCraig Topper; RV64-LABEL: commute_feq_f64: 68972a66358SCraig Topper; RV64: # %bb.0: 69072a66358SCraig Topper; RV64-NEXT: feq.d a1, fa0, fa1 69172a66358SCraig Topper; RV64-NEXT: sb a1, 0(a0) 69272a66358SCraig Topper; RV64-NEXT: beqz a2, .LBB19_2 69372a66358SCraig Topper; RV64-NEXT: # %bb.1: # %trueblock 69472a66358SCraig Topper; RV64-NEXT: sb a1, 0(a0) 69572a66358SCraig Topper; RV64-NEXT: .LBB19_2: # %falseblock 69672a66358SCraig Topper; RV64-NEXT: ret 69772a66358SCraig Topper %a = fcmp oeq double %x, %y 69872a66358SCraig Topper %b = zext i1 %a to i8 6991456b686SNikita Popov store i8 %b, ptr %p1 70072a66358SCraig Topper br i1 %cond, label %trueblock, label %falseblock 70172a66358SCraig Topper 70272a66358SCraig Toppertrueblock: 70372a66358SCraig Topper %c = fcmp oeq double %y, %x 70472a66358SCraig Topper %d = zext i1 %c to i8 7051456b686SNikita Popov store i8 %d, ptr %p1 70672a66358SCraig Topper br label %falseblock 70772a66358SCraig Topper 70872a66358SCraig Topperfalseblock: 70972a66358SCraig Topper ret void 71072a66358SCraig Topper} 711