| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py |
| ; RUN: llc -mcpu=pwr9 -verify-machineinstrs -mtriple=powerpc64le-unknown-linux \ |
| ; RUN: < %s | FileCheck --check-prefixes=CHECK,CHECK-P9 %s |
| ; RUN: llc -mcpu=pwr8 -verify-machineinstrs -mtriple=powerpc64le-unknown-linux \ |
| ; RUN: < %s | FileCheck --check-prefixes=CHECK,CHECK-P8 %s |
| |
| declare ppc_fp128 @llvm.ppc.maxfe(ppc_fp128 %a, ppc_fp128 %b, ppc_fp128 %c, ...) |
| define ppc_fp128 @test_maxfe(ppc_fp128 %a, ppc_fp128 %b, ppc_fp128 %c, ppc_fp128 %d) { |
| ; CHECK-LABEL: test_maxfe: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: fcmpu 0, 6, 4 |
| ; CHECK-NEXT: fcmpu 1, 5, 3 |
| ; CHECK-NEXT: crand 20, 6, 1 |
| ; CHECK-NEXT: cror 20, 5, 20 |
| ; CHECK-NEXT: bc 12, 20, .LBB0_2 |
| ; CHECK-NEXT: # %bb.1: # %entry |
| ; CHECK-NEXT: fmr 6, 4 |
| ; CHECK-NEXT: .LBB0_2: # %entry |
| ; CHECK-NEXT: fcmpu 0, 6, 2 |
| ; CHECK-NEXT: bc 12, 20, .LBB0_4 |
| ; CHECK-NEXT: # %bb.3: # %entry |
| ; CHECK-NEXT: fmr 5, 3 |
| ; CHECK-NEXT: .LBB0_4: # %entry |
| ; CHECK-NEXT: fcmpu 1, 5, 1 |
| ; CHECK-NEXT: crand 20, 6, 1 |
| ; CHECK-NEXT: cror 20, 5, 20 |
| ; CHECK-NEXT: bc 12, 20, .LBB0_6 |
| ; CHECK-NEXT: # %bb.5: # %entry |
| ; CHECK-NEXT: fmr 6, 2 |
| ; CHECK-NEXT: .LBB0_6: # %entry |
| ; CHECK-NEXT: fcmpu 0, 6, 8 |
| ; CHECK-NEXT: bc 12, 20, .LBB0_8 |
| ; CHECK-NEXT: # %bb.7: # %entry |
| ; CHECK-NEXT: fmr 5, 1 |
| ; CHECK-NEXT: .LBB0_8: # %entry |
| ; CHECK-NEXT: fcmpu 1, 5, 7 |
| ; CHECK-NEXT: crand 20, 6, 1 |
| ; CHECK-NEXT: cror 20, 5, 20 |
| ; CHECK-NEXT: bc 12, 20, .LBB0_10 |
| ; CHECK-NEXT: # %bb.9: # %entry |
| ; CHECK-NEXT: fmr 5, 7 |
| ; CHECK-NEXT: .LBB0_10: # %entry |
| ; CHECK-NEXT: bc 12, 20, .LBB0_12 |
| ; CHECK-NEXT: # %bb.11: # %entry |
| ; CHECK-NEXT: fmr 6, 8 |
| ; CHECK-NEXT: .LBB0_12: # %entry |
| ; CHECK-NEXT: fmr 1, 5 |
| ; CHECK-NEXT: fmr 2, 6 |
| ; CHECK-NEXT: blr |
| entry: |
| %0 = call ppc_fp128 (ppc_fp128, ppc_fp128, ppc_fp128, ...) @llvm.ppc.maxfe(ppc_fp128 %a, ppc_fp128 %b, ppc_fp128 %c, ppc_fp128 %d) |
| ret ppc_fp128 %0 |
| } |
| |
| declare double @llvm.ppc.maxfl(double %a, double %b, double %c, ...) |
| define double @test_maxfl(double %a, double %b, double %c, double %d) { |
| ; CHECK-P9-LABEL: test_maxfl: |
| ; CHECK-P9: # %bb.0: # %entry |
| ; CHECK-P9-NEXT: xsmaxcdp 0, 3, 2 |
| ; CHECK-P9-NEXT: xsmaxcdp 0, 0, 1 |
| ; CHECK-P9-NEXT: xsmaxcdp 1, 0, 4 |
| ; CHECK-P9-NEXT: blr |
| ; |
| ; CHECK-P8-LABEL: test_maxfl: |
| ; CHECK-P8: # %bb.0: # %entry |
| ; CHECK-P8-NEXT: xscmpudp 0, 3, 2 |
| ; CHECK-P8-NEXT: ble 0, .LBB1_4 |
| ; CHECK-P8-NEXT: # %bb.1: # %entry |
| ; CHECK-P8-NEXT: xscmpudp 0, 3, 1 |
| ; CHECK-P8-NEXT: ble 0, .LBB1_5 |
| ; CHECK-P8-NEXT: .LBB1_2: # %entry |
| ; CHECK-P8-NEXT: xscmpudp 0, 3, 4 |
| ; CHECK-P8-NEXT: ble 0, .LBB1_6 |
| ; CHECK-P8-NEXT: .LBB1_3: # %entry |
| ; CHECK-P8-NEXT: fmr 1, 3 |
| ; CHECK-P8-NEXT: blr |
| ; CHECK-P8-NEXT: .LBB1_4: # %entry |
| ; CHECK-P8-NEXT: fmr 3, 2 |
| ; CHECK-P8-NEXT: xscmpudp 0, 3, 1 |
| ; CHECK-P8-NEXT: bgt 0, .LBB1_2 |
| ; CHECK-P8-NEXT: .LBB1_5: # %entry |
| ; CHECK-P8-NEXT: fmr 3, 1 |
| ; CHECK-P8-NEXT: xscmpudp 0, 3, 4 |
| ; CHECK-P8-NEXT: bgt 0, .LBB1_3 |
| ; CHECK-P8-NEXT: .LBB1_6: # %entry |
| ; CHECK-P8-NEXT: fmr 3, 4 |
| ; CHECK-P8-NEXT: fmr 1, 3 |
| ; CHECK-P8-NEXT: blr |
| entry: |
| %0 = call double (double, double, double, ...) @llvm.ppc.maxfl(double %a, double %b, double %c, double %d) |
| ret double %0 |
| } |
| |
| declare float @llvm.ppc.maxfs(float %a, float %b, float %c, ...) |
| define float @test_maxfs(float %a, float %b, float %c, float %d) { |
| ; CHECK-P9-LABEL: test_maxfs: |
| ; CHECK-P9: # %bb.0: # %entry |
| ; CHECK-P9-NEXT: xsmaxcdp 0, 3, 2 |
| ; CHECK-P9-NEXT: xsmaxcdp 0, 0, 1 |
| ; CHECK-P9-NEXT: xsmaxcdp 1, 0, 4 |
| ; CHECK-P9-NEXT: blr |
| ; |
| ; CHECK-P8-LABEL: test_maxfs: |
| ; CHECK-P8: # %bb.0: # %entry |
| ; CHECK-P8-NEXT: fcmpu 0, 3, 2 |
| ; CHECK-P8-NEXT: ble 0, .LBB2_4 |
| ; CHECK-P8-NEXT: # %bb.1: # %entry |
| ; CHECK-P8-NEXT: fcmpu 0, 3, 1 |
| ; CHECK-P8-NEXT: ble 0, .LBB2_5 |
| ; CHECK-P8-NEXT: .LBB2_2: # %entry |
| ; CHECK-P8-NEXT: fcmpu 0, 3, 4 |
| ; CHECK-P8-NEXT: ble 0, .LBB2_6 |
| ; CHECK-P8-NEXT: .LBB2_3: # %entry |
| ; CHECK-P8-NEXT: fmr 1, 3 |
| ; CHECK-P8-NEXT: blr |
| ; CHECK-P8-NEXT: .LBB2_4: # %entry |
| ; CHECK-P8-NEXT: fmr 3, 2 |
| ; CHECK-P8-NEXT: fcmpu 0, 3, 1 |
| ; CHECK-P8-NEXT: bgt 0, .LBB2_2 |
| ; CHECK-P8-NEXT: .LBB2_5: # %entry |
| ; CHECK-P8-NEXT: fmr 3, 1 |
| ; CHECK-P8-NEXT: fcmpu 0, 3, 4 |
| ; CHECK-P8-NEXT: bgt 0, .LBB2_3 |
| ; CHECK-P8-NEXT: .LBB2_6: # %entry |
| ; CHECK-P8-NEXT: fmr 3, 4 |
| ; CHECK-P8-NEXT: fmr 1, 3 |
| ; CHECK-P8-NEXT: blr |
| entry: |
| %0 = call float (float, float, float, ...) @llvm.ppc.maxfs(float %a, float %b, float %c, float %d) |
| ret float %0 |
| } |
| |
| declare ppc_fp128 @llvm.ppc.minfe(ppc_fp128 %a, ppc_fp128 %b, ppc_fp128 %c, ...) |
| define ppc_fp128 @test_minfe(ppc_fp128 %a, ppc_fp128 %b, ppc_fp128 %c, ppc_fp128 %d) { |
| ; CHECK-LABEL: test_minfe: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: fcmpu 0, 6, 4 |
| ; CHECK-NEXT: fcmpu 1, 5, 3 |
| ; CHECK-NEXT: crand 20, 6, 0 |
| ; CHECK-NEXT: cror 20, 4, 20 |
| ; CHECK-NEXT: bc 12, 20, .LBB3_2 |
| ; CHECK-NEXT: # %bb.1: # %entry |
| ; CHECK-NEXT: fmr 6, 4 |
| ; CHECK-NEXT: .LBB3_2: # %entry |
| ; CHECK-NEXT: fcmpu 0, 6, 2 |
| ; CHECK-NEXT: bc 12, 20, .LBB3_4 |
| ; CHECK-NEXT: # %bb.3: # %entry |
| ; CHECK-NEXT: fmr 5, 3 |
| ; CHECK-NEXT: .LBB3_4: # %entry |
| ; CHECK-NEXT: fcmpu 1, 5, 1 |
| ; CHECK-NEXT: crand 20, 6, 0 |
| ; CHECK-NEXT: cror 20, 4, 20 |
| ; CHECK-NEXT: bc 12, 20, .LBB3_6 |
| ; CHECK-NEXT: # %bb.5: # %entry |
| ; CHECK-NEXT: fmr 6, 2 |
| ; CHECK-NEXT: .LBB3_6: # %entry |
| ; CHECK-NEXT: fcmpu 0, 6, 8 |
| ; CHECK-NEXT: bc 12, 20, .LBB3_8 |
| ; CHECK-NEXT: # %bb.7: # %entry |
| ; CHECK-NEXT: fmr 5, 1 |
| ; CHECK-NEXT: .LBB3_8: # %entry |
| ; CHECK-NEXT: fcmpu 1, 5, 7 |
| ; CHECK-NEXT: crand 20, 6, 0 |
| ; CHECK-NEXT: cror 20, 4, 20 |
| ; CHECK-NEXT: bc 12, 20, .LBB3_10 |
| ; CHECK-NEXT: # %bb.9: # %entry |
| ; CHECK-NEXT: fmr 5, 7 |
| ; CHECK-NEXT: .LBB3_10: # %entry |
| ; CHECK-NEXT: bc 12, 20, .LBB3_12 |
| ; CHECK-NEXT: # %bb.11: # %entry |
| ; CHECK-NEXT: fmr 6, 8 |
| ; CHECK-NEXT: .LBB3_12: # %entry |
| ; CHECK-NEXT: fmr 1, 5 |
| ; CHECK-NEXT: fmr 2, 6 |
| ; CHECK-NEXT: blr |
| entry: |
| %0 = call ppc_fp128 (ppc_fp128, ppc_fp128, ppc_fp128, ...) @llvm.ppc.minfe(ppc_fp128 %a, ppc_fp128 %b, ppc_fp128 %c, ppc_fp128 %d) |
| ret ppc_fp128 %0 |
| } |
| |
| declare double @llvm.ppc.minfl(double %a, double %b, double %c, ...) |
| define double @test_minfl(double %a, double %b, double %c, double %d) { |
| ; CHECK-P9-LABEL: test_minfl: |
| ; CHECK-P9: # %bb.0: # %entry |
| ; CHECK-P9-NEXT: xsmincdp 0, 3, 2 |
| ; CHECK-P9-NEXT: xsmincdp 0, 0, 1 |
| ; CHECK-P9-NEXT: xsmincdp 1, 0, 4 |
| ; CHECK-P9-NEXT: blr |
| ; |
| ; CHECK-P8-LABEL: test_minfl: |
| ; CHECK-P8: # %bb.0: # %entry |
| ; CHECK-P8-NEXT: xscmpudp 0, 3, 2 |
| ; CHECK-P8-NEXT: bge 0, .LBB4_4 |
| ; CHECK-P8-NEXT: # %bb.1: # %entry |
| ; CHECK-P8-NEXT: xscmpudp 0, 3, 1 |
| ; CHECK-P8-NEXT: bge 0, .LBB4_5 |
| ; CHECK-P8-NEXT: .LBB4_2: # %entry |
| ; CHECK-P8-NEXT: xscmpudp 0, 3, 4 |
| ; CHECK-P8-NEXT: bge 0, .LBB4_6 |
| ; CHECK-P8-NEXT: .LBB4_3: # %entry |
| ; CHECK-P8-NEXT: fmr 1, 3 |
| ; CHECK-P8-NEXT: blr |
| ; CHECK-P8-NEXT: .LBB4_4: # %entry |
| ; CHECK-P8-NEXT: fmr 3, 2 |
| ; CHECK-P8-NEXT: xscmpudp 0, 3, 1 |
| ; CHECK-P8-NEXT: blt 0, .LBB4_2 |
| ; CHECK-P8-NEXT: .LBB4_5: # %entry |
| ; CHECK-P8-NEXT: fmr 3, 1 |
| ; CHECK-P8-NEXT: xscmpudp 0, 3, 4 |
| ; CHECK-P8-NEXT: blt 0, .LBB4_3 |
| ; CHECK-P8-NEXT: .LBB4_6: # %entry |
| ; CHECK-P8-NEXT: fmr 3, 4 |
| ; CHECK-P8-NEXT: fmr 1, 3 |
| ; CHECK-P8-NEXT: blr |
| entry: |
| %0 = call double (double, double, double, ...) @llvm.ppc.minfl(double %a, double %b, double %c, double %d) |
| ret double %0 |
| } |
| |
| declare float @llvm.ppc.minfs(float %a, float %b, float %c, ...) |
| define float @test_minfs(float %a, float %b, float %c, float %d) { |
| ; CHECK-P9-LABEL: test_minfs: |
| ; CHECK-P9: # %bb.0: # %entry |
| ; CHECK-P9-NEXT: xsmincdp 0, 3, 2 |
| ; CHECK-P9-NEXT: xsmincdp 0, 0, 1 |
| ; CHECK-P9-NEXT: xsmincdp 1, 0, 4 |
| ; CHECK-P9-NEXT: blr |
| ; |
| ; CHECK-P8-LABEL: test_minfs: |
| ; CHECK-P8: # %bb.0: # %entry |
| ; CHECK-P8-NEXT: fcmpu 0, 3, 2 |
| ; CHECK-P8-NEXT: bge 0, .LBB5_4 |
| ; CHECK-P8-NEXT: # %bb.1: # %entry |
| ; CHECK-P8-NEXT: fcmpu 0, 3, 1 |
| ; CHECK-P8-NEXT: bge 0, .LBB5_5 |
| ; CHECK-P8-NEXT: .LBB5_2: # %entry |
| ; CHECK-P8-NEXT: fcmpu 0, 3, 4 |
| ; CHECK-P8-NEXT: bge 0, .LBB5_6 |
| ; CHECK-P8-NEXT: .LBB5_3: # %entry |
| ; CHECK-P8-NEXT: fmr 1, 3 |
| ; CHECK-P8-NEXT: blr |
| ; CHECK-P8-NEXT: .LBB5_4: # %entry |
| ; CHECK-P8-NEXT: fmr 3, 2 |
| ; CHECK-P8-NEXT: fcmpu 0, 3, 1 |
| ; CHECK-P8-NEXT: blt 0, .LBB5_2 |
| ; CHECK-P8-NEXT: .LBB5_5: # %entry |
| ; CHECK-P8-NEXT: fmr 3, 1 |
| ; CHECK-P8-NEXT: fcmpu 0, 3, 4 |
| ; CHECK-P8-NEXT: blt 0, .LBB5_3 |
| ; CHECK-P8-NEXT: .LBB5_6: # %entry |
| ; CHECK-P8-NEXT: fmr 3, 4 |
| ; CHECK-P8-NEXT: fmr 1, 3 |
| ; CHECK-P8-NEXT: blr |
| entry: |
| %0 = call float (float, float, float, ...) @llvm.ppc.minfs(float %a, float %b, float %c, float %d) |
| ret float %0 |
| } |