Home | History | Annotate | Download | only in PowerPC
      1 ; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr8 < %s | FileCheck %s -check-prefix=PPC64-P8
      2 ; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr7 < %s | FileCheck %s -check-prefix=PPC64
      3 ; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr8 < %s | FileCheck %s -check-prefix=PPC64-P8
      4 ; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 < %s | FileCheck %s -check-prefix=PPC64
      5 ; RUN: llc -verify-machineinstrs -mtriple=powerpc-unknown-linux-gnu < %s | FileCheck %s -check-prefix=PPC32
      6 
      7 define i128 @test_abs(ppc_fp128 %x) nounwind  {
      8 entry:
      9 ; PPC64-LABEL: test_abs:
     10 ; PPC64-DAG: stfdx 2, 0, [[ADDR_HI:[0-9]+]]
     11 ; PPC64-DAG: stfdx 1, 0, [[ADDR_LO:[0-9]+]]
     12 ; PPC64-DAG: addi [[ADDR_HI]], [[SP:[0-9]+]], [[OFFSET_HI:-?[0-9]+]]
     13 ; PPC64-DAG: addi [[ADDR_LO]], [[SP]], [[OFFSET_LO:-?[0-9]+]]
     14 ; PPC64-DAG: ld [[HI:[0-9]+]], [[OFFSET_LO]]([[SP]])
     15 ; PPC64-DAG: ld [[LO:[0-9]+]], [[OFFSET_HI]]([[SP]])
     16 ; PPC64-DAG: rldicr [[FLIP_BIT:[0-9]+]], [[HI]], 0, 0
     17 ; PPC64-DAG: xor 3, [[HI]], [[FLIP_BIT]]
     18 ; PPC64-DAG: xor 4, [[LO]], [[FLIP_BIT]]
     19 ; PPC64: blr
     20 
     21 ; PPC64-P8-LABEL: test_abs:
     22 ; PPC64-P8-DAG: mffprd [[LO:[0-9]+]], 2
     23 ; PPC64-P8-DAG: mffprd [[HI:[0-9]+]], 1
     24 ; PPC64-P8-DAG: rldicr [[FLIP_BIT:[0-9]+]], [[HI]], 0, 0
     25 ; PPC64-P8-DAG: xor 3, [[HI]], [[FLIP_BIT]]
     26 ; PPC64-P8-DAG: xor 4, [[LO]], [[FLIP_BIT]]
     27 ; PPC64-P8: blr
     28 
     29 ; PPC32-DAG: stfd 1, 24(1)
     30 ; PPC32-DAG: stfd 2, 16(1)
     31 ; PPC32-DAG: lwz [[HI0:[0-9]+]], 24(1)
     32 ; PPC32-DAG: lwz [[LO0:[0-9]+]], 16(1)
     33 ; PPC32-DAG: lwz [[HI1:[0-9]+]], 28(1)
     34 ; PPC32-DAG: lwz [[LO1:[0-9]+]], 20(1)
     35 ; PPC32: rlwinm [[FLIP_BIT:[0-9]+]], [[HI0]], 0, 0, 0
     36 ; PPC32-DAG: xor [[HI0]], [[HI0]], [[FLIP_BIT]]
     37 ; PPC32-DAG: xor [[LO0]], [[LO0]], [[FLIP_BIT]]
     38 ; PPC32: blr
     39 	%0 = tail call ppc_fp128 @llvm.fabs.ppcf128(ppc_fp128 %x)
     40 	%1 = bitcast ppc_fp128 %0 to i128
     41 	ret i128 %1
     42 }
     43 
     44 define i128 @test_neg(ppc_fp128 %x) nounwind  {
     45 entry:
     46 ; PPC64-LABEL: test_neg:
     47 ; PPC64-DAG: stfdx 2, 0, [[ADDR_HI:[0-9]+]]
     48 ; PPC64-DAG: stfdx 1, 0, [[ADDR_LO:[0-9]+]]
     49 ; PPC64-DAG: addi [[ADDR_HI]], [[SP:[0-9]+]], [[OFFSET_HI:-?[0-9]+]]
     50 ; PPC64-DAG: addi [[ADDR_LO]], [[SP]], [[OFFSET_LO:-?[0-9]+]]
     51 ; PPC64-DAG: li [[FLIP_BIT:[0-9]+]], 1
     52 ; PPC64-DAG: sldi [[FLIP_BIT]], [[FLIP_BIT]], 63
     53 ; PPC64-DAG: ld [[HI:[0-9]+]], [[OFFSET_LO]]([[SP]])
     54 ; PPC64-DAG: ld [[LO:[0-9]+]], [[OFFSET_HI]]([[SP]])
     55 ; PPC64-NOT: BARRIER
     56 ; PPC64-DAG: xor 3, [[HI]], [[FLIP_BIT]]
     57 ; PPC64-DAG: xor 4, [[LO]], [[FLIP_BIT]]
     58 ; PPC64: blr
     59 
     60 ; PPC64-P8-LABEL: test_neg:
     61 ; PPC64-P8-DAG: mffprd [[LO:[0-9]+]], 2
     62 ; PPC64-P8-DAG: mffprd [[HI:[0-9]+]], 1
     63 ; PPC64-P8-DAG: li [[IMM1:[0-9]+]], 1
     64 ; PPC64-P8-DAG: sldi [[FLIP_BIT:[0-9]+]], [[IMM1]], 63
     65 ; PPC64-P8-NOT: BARRIER
     66 ; PPC64-P8-DAG: xor 3, [[HI]], [[FLIP_BIT]]
     67 ; PPC64-P8-DAG: xor 4, [[LO]], [[FLIP_BIT]]
     68 ; PPC64-P8: blr
     69 
     70 ; PPC32-DAG: stfd 1, 24(1)
     71 ; PPC32-DAG: stfd 2, 16(1)
     72 ; PPC32-DAG: lwz [[HI0:[0-9]+]], 24(1)
     73 ; PPC32-DAG: lwz [[LO0:[0-9]+]], 16(1)
     74 ; PPC32-DAG: lwz [[HI1:[0-9]+]], 28(1)
     75 ; PPC32-DAG: lwz [[LO1:[0-9]+]], 20(1)
     76 ; PPC32-NOT: BARRIER
     77 ; PPC32-DAG: xoris [[HI0]], [[HI0]], 32768
     78 ; PPC32-DAG: xoris [[LO0]], [[LO0]], 32768
     79 ; PPC32: blr
     80 	%0 = fsub ppc_fp128 0xM80000000000000000000000000000000, %x
     81 	%1 = bitcast ppc_fp128 %0 to i128
     82 	ret i128 %1
     83 }
     84 
     85 define i128 @test_copysign(ppc_fp128 %x) nounwind  {
     86 entry:
     87 ; PPC64-LABEL: test_copysign:
     88 ; PPC64-DAG: stfdx 1, 0, [[ADDR_REG:[0-9]+]]
     89 ; PPC64-DAG: addi [[ADDR_REG]], 1, [[OFFSET:-?[0-9]+]]
     90 ; PPC64-DAG: li [[HI_TMP:[0-9]+]], 16399
     91 ; PPC64-DAG: li [[LO_TMP:[0-9]+]], 3019
     92 ; PPC64-NOT: BARRIER
     93 ; PPC64-DAG: sldi [[CST_HI:[0-9]+]], [[HI_TMP]], 48
     94 ; PPC64-DAG: sldi [[CST_LO:[0-9]+]], [[LO_TMP]], 52
     95 ; PPC64-DAG: ld [[X_HI:[0-9]+]], [[OFFSET]](1)
     96 ; PPC64-DAG: rldicr [[NEW_HI_TMP:[0-9]+]], [[X_HI]], 0, 0
     97 ; PPC64-DAG: or 3, [[NEW_HI_TMP]], [[CST_HI]]
     98 ; PPC64-DAG: xor 4, [[NEW_HI_TMP]], [[CST_LO]]
     99 ; PPC64: blr
    100 
    101 ; PPC64-P8-LABEL: test_copysign:
    102 ; PPC64-P8-DAG: mffprd [[X_HI:[0-9]+]], 1
    103 ; PPC64-P8-DAG: li [[HI_TMP:[0-9]+]], 16399
    104 ; PPC64-P8-DAG: li [[LO_TMP:[0-9]+]], 3019
    105 ; PPC64-P8-NOT: BARRIER
    106 ; PPC64-P8-DAG: sldi [[CST_HI:[0-9]+]], [[HI_TMP]], 48
    107 ; PPC64-P8-DAG: sldi [[CST_LO:[0-9]+]], [[LO_TMP]], 52
    108 ; PPC64-P8-DAG: rldicr [[NEW_HI_TMP:[0-9]+]], [[X_HI]], 0, 0
    109 ; PPC64-P8-DAG: or 3, [[NEW_HI_TMP]], [[CST_HI]]
    110 ; PPC64-P8-DAG: xor 4, [[NEW_HI_TMP]], [[CST_LO]]
    111 ; PPC64-P8: blr
    112 
    113 ; PPC32: stfd 1, [[STACK:[0-9]+]](1)
    114 ; PPC32: lwz [[HI:[0-9]+]], [[STACK]](1)
    115 ; PPC32: rlwinm [[FLIP_BIT:[0-9]+]], [[HI]], 0, 0, 0
    116 ; PPC32-NOT: BARRIER
    117 ; PPC32-DAG: oris {{[0-9]+}}, [[FLIP_BIT]], 16399
    118 ; PPC32-DAG: xoris {{[0-9]+}}, [[FLIP_BIT]], 48304
    119 ; PPC32: blr
    120 	%0 = tail call ppc_fp128 @llvm.copysign.ppcf128(ppc_fp128 0xM400F000000000000BCB0000000000000, ppc_fp128 %x)
    121 	%1 = bitcast ppc_fp128 %0 to i128
    122 	ret i128 %1
    123 }
    124 
    125 declare ppc_fp128 @llvm.fabs.ppcf128(ppc_fp128)
    126 declare ppc_fp128 @llvm.copysign.ppcf128(ppc_fp128, ppc_fp128)
    127