Home | History | Annotate | Download | only in Mips
      1 ; Check that madd.[ds], msub.[ds], nmadd.[ds], and nmsub.[ds] are supported
      2 ; correctly.
      3 ; The spec for nmadd.[ds], and nmsub.[ds] does not state that they obey the
      4 ; the Has2008 and ABS2008 configuration bits which govern the conformance to
      5 ; IEEE 754 (1985) and IEEE 754 (2008). These instructions are therefore only
      6 ; available when -enable-no-nans-fp-math is given.
      7 
      8 ; RUN: llc < %s -march=mipsel   -mcpu=mips32              -enable-no-nans-fp-math | FileCheck %s -check-prefixes=ALL,32-NOMADD,32-NONAN-NOMADD
      9 ; RUN: llc < %s -march=mipsel   -mcpu=mips32r2            -enable-no-nans-fp-math | FileCheck %s -check-prefixes=ALL,32R2,32R2-NONAN
     10 ; RUN: llc < %s -march=mipsel   -mcpu=mips32r6            -enable-no-nans-fp-math | FileCheck %s -check-prefixes=ALL,32R6-NOMADD,32R6-NONAN-NOMADD
     11 ; RUN: llc < %s -march=mips64el -mcpu=mips64   -target-abi=n64 -enable-no-nans-fp-math | FileCheck %s -check-prefixes=ALL,64,64-NONAN
     12 ; RUN: llc < %s -march=mips64el -mcpu=mips64r2 -target-abi=n64 -enable-no-nans-fp-math | FileCheck %s -check-prefixes=ALL,64R2,64R2-NONAN
     13 ; RUN: llc < %s -march=mips64el -mcpu=mips64r6 -target-abi=n64 -enable-no-nans-fp-math | FileCheck %s -check-prefixes=ALL,64R6-NOMADD,64R6-NONAN-NOMADD
     14 ; RUN: llc < %s -march=mipsel   -mcpu=mips32              | FileCheck %s -check-prefixes=ALL,32-NOMADD,32-NAN-NOMADD
     15 ; RUN: llc < %s -march=mipsel   -mcpu=mips32r2            | FileCheck %s -check-prefixes=ALL,32R2,32R2-NAN
     16 ; RUN: llc < %s -march=mipsel   -mcpu=mips32r6            | FileCheck %s -check-prefixes=ALL,32R6-NOMADD,32R6-NAN-NOMADD
     17 ; RUN: llc < %s -march=mips64el -mcpu=mips64   -target-abi=n64 | FileCheck %s -check-prefixes=ALL,64,64-NAN
     18 ; RUN: llc < %s -march=mips64el -mcpu=mips64r2 -target-abi=n64 | FileCheck %s -check-prefixes=ALL,64R2,64R2-NAN
     19 ; RUN: llc < %s -march=mips64el -mcpu=mips64r6 -target-abi=n64 | FileCheck %s -check-prefixes=ALL,64R6-NOMADD,64R6-NAN-NOMADD
     20 
     21 ; Check that madd.[ds], msub.[ds], nmadd.[ds], and nmsub.[ds] are not generated
     22 ; when +nomadd attribute is specified.
     23 ; Output for mips32 and mips64r6 reused since aforementioned instructions are
     24 ; not generated in those cases.
     25 ; RUN: llc < %s -march=mipsel   -mcpu=mips32r2            -enable-no-nans-fp-math -mattr=+nomadd4 | FileCheck %s -check-prefixes=ALL,32-NOMADD,32-NONAN-NOMADD
     26 ; RUN: llc < %s -march=mips64el -mcpu=mips64   -target-abi=n64 -enable-no-nans-fp-math -mattr=+nomadd4 | FileCheck %s -check-prefixes=ALL,64R6-NOMADD,64R6-NONAN-NOMADD
     27 ; RUN: llc < %s -march=mips64el -mcpu=mips64r2 -target-abi=n64 -enable-no-nans-fp-math -mattr=+nomadd4 | FileCheck %s -check-prefixes=ALL,64R6-NOMADD,64R6-NONAN-NOMADD
     28 ; RUN: llc < %s -march=mipsel   -mcpu=mips32r2            -mattr=+nomadd4 | FileCheck %s -check-prefixes=ALL,32-NOMADD,32-NAN-NOMADD
     29 ; RUN: llc < %s -march=mips64el -mcpu=mips64   -target-abi=n64 -mattr=+nomadd4 | FileCheck %s -check-prefixes=ALL,64R6-NOMADD,64R6-NAN-NOMADD
     30 ; RUN: llc < %s -march=mips64el -mcpu=mips64r2 -target-abi=n64 -mattr=+nomadd4 | FileCheck %s -check-prefixes=ALL,64R6-NOMADD,64R6-NAN-NOMADD
     31 
     32 define float @FOO0float(float %a, float %b, float %c) nounwind readnone {
     33 entry:
     34 ; ALL-LABEL: FOO0float:
     35 
     36 ; 32-NOMADD-DAG:        mtc1 $6, $[[T0:f[0-9]+]]
     37 ; 32-NOMADD-DAG:        mul.s $[[T1:f[0-9]+]], $f12, $f14
     38 ; 32-NOMADD-DAG:        add.s $[[T2:f[0-9]+]], $[[T1]], $[[T0]]
     39 ; 32-NOMADD-DAG:        mtc1 $zero, $[[T2:f[0-9]+]]
     40 ; 32-NOMADD-DAG:        add.s $f0, $[[T1]], $[[T2]]
     41 
     42 ; 32R2:                 mtc1 $6, $[[T0:f[0-9]+]]
     43 ; 32R2:                 madd.s $[[T1:f[0-9]+]], $[[T0]], $f12, $f14
     44 ; 32R2:                 mtc1 $zero, $[[T2:f[0-9]+]]
     45 ; 32R2:                 add.s $f0, $[[T1]], $[[T2]]
     46 
     47 ; 32R6-NOMADD-DAG:      mtc1 $6, $[[T0:f[0-9]+]]
     48 ; 32R6-NOMADD-DAG:      mul.s $[[T1:f[0-9]+]], $f12, $f14
     49 ; 32R6-NOMADD-DAG:      add.s $[[T2:f[0-9]+]], $[[T1]], $[[T0]]
     50 ; 32R6-NOMADD-DAG:      mtc1 $zero, $[[T2:f[0-9]+]]
     51 ; 32R6-NOMADD-DAG:      add.s $f0, $[[T1]], $[[T2]]
     52 
     53 ; 64-DAG:               madd.s $[[T0:f[0-9]+]], $f14, $f12, $f13
     54 ; 64-DAG:               mtc1 $zero, $[[T1:f[0-9]+]]
     55 ; 64-DAG:               add.s $f0, $[[T0]], $[[T1]]
     56 
     57 ; 64R2:                 madd.s $[[T0:f[0-9]+]], $f14, $f12, $f13
     58 ; 64R2:                 mtc1 $zero, $[[T1:f[0-9]+]]
     59 ; 64R2:                 add.s $f0, $[[T0]], $[[T1]]
     60 
     61 ; 64R6-NOMADD-DAG:      mul.s $[[T0:f[0-9]+]], $f12, $f13
     62 ; 64R6-NOMADD-DAG:      add.s $[[T1:f[0-9]+]], $[[T0]], $f14
     63 ; 64R6-NOMADD-DAG:      mtc1 $zero, $[[T2:f[0-9]+]]
     64 ; 64R6-NOMADD-DAG:      add.s $f0, $[[T1]], $[[T2]]
     65 
     66   %mul = fmul float %a, %b
     67   %add = fadd float %mul, %c
     68   %add1 = fadd float %add, 0.000000e+00
     69   ret float %add1
     70 }
     71 
     72 define float @FOO1float(float %a, float %b, float %c) nounwind readnone {
     73 entry:
     74 ; ALL-LABEL: FOO1float:
     75 
     76 ; 32-NOMADD-DAG:        mtc1 $6, $[[T0:f[0-9]+]]
     77 ; 32-NOMADD-DAG:        mul.s $[[T1:f[0-9]+]], $f12, $f14
     78 ; 32-NOMADD-DAG:        sub.s $[[T2:f[0-9]+]], $[[T1]], $[[T0]]
     79 ; 32-NOMADD-DAG:        mtc1 $zero, $[[T2:f[0-9]+]]
     80 ; 32-NOMADD-DAG:        add.s $f0, $[[T1]], $[[T2]]
     81 
     82 ; 32R2:                 mtc1 $6, $[[T0:f[0-9]+]]
     83 ; 32R2:                 msub.s $[[T1:f[0-9]+]], $[[T0]], $f12, $f14
     84 ; 32R2:                 mtc1 $zero, $[[T2:f[0-9]+]]
     85 ; 32R2:                 add.s $f0, $[[T1]], $[[T2]]
     86 
     87 ; 32R6-NOMADD-DAG:      mtc1 $6, $[[T0:f[0-9]+]]
     88 ; 32R6-NOMADD-DAG:      mul.s $[[T1:f[0-9]+]], $f12, $f14
     89 ; 32R6-NOMADD-DAG:      sub.s $[[T2:f[0-9]+]], $[[T1]], $[[T0]]
     90 ; 32R6-NOMADD-DAG:      mtc1 $zero, $[[T2:f[0-9]+]]
     91 ; 32R6-NOMADD-DAG:      add.s $f0, $[[T1]], $[[T2]]
     92 
     93 ; 64-DAG:               msub.s $[[T0:f[0-9]+]], $f14, $f12, $f13
     94 ; 64-DAG:               mtc1 $zero, $[[T1:f[0-9]+]]
     95 ; 64-DAG:               add.s $f0, $[[T0]], $[[T1]]
     96 
     97 ; 64R2:                 msub.s $[[T0:f[0-9]+]], $f14, $f12, $f13
     98 ; 64R2:                 mtc1 $zero, $[[T1:f[0-9]+]]
     99 ; 64R2:                 add.s $f0, $[[T0]], $[[T1]]
    100 
    101 ; 64R6-NOMADD-DAG:      mul.s $[[T0:f[0-9]+]], $f12, $f13
    102 ; 64R6-NOMADD-DAG:      sub.s $[[T1:f[0-9]+]], $[[T0]], $f14
    103 ; 64R6-NOMADD-DAG:      mtc1 $zero, $[[T2:f[0-9]+]]
    104 ; 64R6-NOMADD-DAG:      add.s $f0, $[[T1]], $[[T2]]
    105 
    106   %mul = fmul float %a, %b
    107   %sub = fsub float %mul, %c
    108   %add = fadd float %sub, 0.000000e+00
    109   ret float %add
    110 }
    111 
    112 define float @FOO2float(float %a, float %b, float %c) nounwind readnone {
    113 entry:
    114 ; ALL-LABEL: FOO2float:
    115 
    116 ; 32-NOMADD-DAG:        mtc1 $6, $[[T0:f[0-9]+]]
    117 ; 32-NOMADD-DAG:        mul.s $[[T1:f[0-9]+]], $f12, $f14
    118 ; 32-NOMADD-DAG:        add.s $[[T2:f[0-9]+]], $[[T1]], $[[T0]]
    119 ; 32-NOMADD-DAG:        mtc1 $zero, $[[T2:f[0-9]+]]
    120 ; 32-NOMADD-DAG:        sub.s $f0, $[[T2]], $[[T1]]
    121 
    122 ; 32R2-NONAN:           mtc1 $6, $[[T0:f[0-9]+]]
    123 ; 32R2-NONAN:           nmadd.s $f0, $[[T0]], $f12, $f14
    124 
    125 ; 32R2-NAN:             mtc1 $6, $[[T0:f[0-9]+]]
    126 ; 32R2-NAN:             madd.s $[[T1:f[0-9]+]], $[[T0]], $f12, $f14
    127 ; 32R2-NAN:             mtc1 $zero, $[[T2:f[0-9]+]]
    128 ; 32R2-NAN:             sub.s  $f0, $[[T2]], $[[T1]]
    129 
    130 ; 32R6-NOMADD-DAG:      mtc1 $6, $[[T0:f[0-9]+]]
    131 ; 32R6-NOMADD-DAG:      mul.s $[[T1:f[0-9]+]], $f12, $f14
    132 ; 32R6-NOMADD-DAG:      add.s $[[T2:f[0-9]+]], $[[T1]], $[[T0]]
    133 ; 32R6-NOMADD-DAG:      mtc1 $zero, $[[T2:f[0-9]+]]
    134 ; 32R6-NOMADD-DAG:      sub.s $f0, $[[T2]], $[[T1]]
    135 
    136 ; 64-NONAN:             nmadd.s $f0, $f14, $f12, $f13
    137 
    138 ; 64-NAN:               madd.s $[[T0:f[0-9]+]], $f14, $f12, $f13
    139 ; 64-NAN:               mtc1 $zero, $[[T1:f[0-9]+]]
    140 ; 64-NAN:               sub.s  $f0, $[[T1]], $[[T0]]
    141 
    142 ; 64R2-NONAN:           nmadd.s $f0, $f14, $f12, $f13
    143 
    144 ; 64R2-NAN:             madd.s $[[T0:f[0-9]+]], $f14, $f12, $f13
    145 ; 64R2-NAN:             mtc1 $zero, $[[T1:f[0-9]+]]
    146 ; 64R2-NAN:             sub.s  $f0, $[[T1]], $[[T0]]
    147 
    148 ; 64R6-NOMADD-DAG:      mul.s $[[T1:f[0-9]+]], $f12, $f13
    149 ; 64R6-NOMADD-DAG:      add.s $[[T2:f[0-9]+]], $[[T1]], $f14
    150 ; 64R6-NOMADD-DAG:      mtc1 $zero, $[[T2:f[0-9]+]]
    151 ; 64R6-NOMADD-DAG:      sub.s $f0, $[[T2]], $[[T1]]
    152 
    153   %mul = fmul float %a, %b
    154   %add = fadd float %mul, %c
    155   %sub = fsub float 0.000000e+00, %add
    156   ret float %sub
    157 }
    158 
    159 define float @FOO3float(float %a, float %b, float %c) nounwind readnone {
    160 entry:
    161 ; ALL-LABEL: FOO3float:
    162 
    163 ; 32-NOMADD-DAG:        mtc1 $6, $[[T0:f[0-9]+]]
    164 ; 32-NOMADD-DAG:        mul.s $[[T1:f[0-9]+]], $f12, $f14
    165 ; 32-NOMADD-DAG:        sub.s $[[T2:f[0-9]+]], $[[T1]], $[[T0]]
    166 ; 32-NOMADD-DAG:        mtc1 $zero, $[[T2:f[0-9]+]]
    167 ; 32-NOMADD-DAG:        sub.s $f0, $[[T2]], $[[T1]]
    168 
    169 ; 32R2-NONAN:           mtc1 $6, $[[T0:f[0-9]+]]
    170 ; 32R2-NONAN:           nmsub.s $f0, $[[T0]], $f12, $f14
    171 
    172 ; 32R2-NAN:             mtc1 $6, $[[T0:f[0-9]+]]
    173 ; 32R2-NAN:             msub.s $[[T1:f[0-9]+]], $[[T0]], $f12, $f14
    174 ; 32R2-NAN:             mtc1 $zero, $[[T2:f[0-9]+]]
    175 ; 32R2-NAN:             sub.s  $f0, $[[T2]], $[[T1]]
    176 
    177 ; 64-NAN:               msub.s $[[T0:f[0-9]+]], $f14, $f12, $f13
    178 ; 64-NAN:               mtc1 $zero, $[[T1:f[0-9]+]]
    179 ; 64-NAN:               sub.s  $f0, $[[T1]], $[[T0]]
    180 
    181 ; 64-NONAN:             nmsub.s $f0, $f14, $f12, $f13
    182 
    183 ; 64R2-NAN:             msub.s $[[T0:f[0-9]+]], $f14, $f12, $f13
    184 ; 64R2-NAN:             mtc1 $zero, $[[T1:f[0-9]+]]
    185 ; 64R2-NAN:             sub.s  $f0, $[[T1]], $[[T0]]
    186 
    187 ; 64R6-NOMADD-DAG:      mul.s $[[T1:f[0-9]+]], $f12, $f13
    188 ; 64R6-NOMADD-DAG:      sub.s $[[T2:f[0-9]+]], $[[T1]], $f14
    189 ; 64R6-NOMADD-DAG:      mtc1 $zero, $[[T2:f[0-9]+]]
    190 ; 64R6-NOMADD-DAG:      sub.s $f0, $[[T2]], $[[T1]]
    191 
    192   %mul = fmul float %a, %b
    193   %sub = fsub float %mul, %c
    194   %sub1 = fsub float 0.000000e+00, %sub
    195   ret float %sub1
    196 }
    197 
    198 define double @FOO10double(double %a, double %b, double %c) nounwind readnone {
    199 entry:
    200 ; ALL-LABEL: FOO10double:
    201 
    202 ; 32-NOMADD-DAG:        ldc1 $[[T0:f[0-9]+]], 16($sp)
    203 ; 32-NOMADD-DAG:        mul.d $[[T1:f[0-9]+]], $f12, $f14
    204 ; 32-NOMADD-DAG:        add.d $[[T2:f[0-9]+]], $[[T1]], $[[T0]]
    205 ; 32-NOMADD-DAG:        mtc1 $zero, $[[T2:f[0-9]+]]
    206 ; 32-NOMADD-DAG:        add.d $f0, $[[T1]], $[[T2]]
    207 
    208 ; 32R2:                 ldc1 $[[T0:f[0-9]+]], 16($sp)
    209 ; 32R2:                 madd.d $[[T1:f[0-9]+]], $[[T0]], $f12, $f14
    210 ; 32R2:                 mtc1 $zero, $[[T2:f[0-9]+]]
    211 ; 32R2:                 mthc1 $zero, $[[T2]]
    212 ; 32R2:                 add.d $f0, $[[T1]], $[[T2]]
    213 
    214 ; 32R6-NOMADD-DAG:      ldc1 $[[T0:f[0-9]+]], 16($sp)
    215 ; 32R6-NOMADD-DAG:      mul.d $[[T1:f[0-9]+]], $f12, $f14
    216 ; 32R6-NOMADD-DAG:      add.d $[[T2:f[0-9]+]], $[[T1]], $[[T0]]
    217 ; 32R6-NOMADD-DAG:      mtc1 $zero, $[[T2:f[0-9]+]]
    218 ; 32R6-NOMADD-DAG:      add.d $f0, $[[T1]], $[[T2]]
    219 
    220 ; 64-DAG:               madd.d $[[T0:f[0-9]+]], $f14, $f12, $f13
    221 ; 64-DAG:               mtc1 $zero, $[[T1:f[0-9]+]]
    222 ; 64-DAG:               add.d $f0, $[[T0]], $[[T1]]
    223 
    224 ; 64R2:                 madd.d $[[T0:f[0-9]+]], $f14, $f12, $f13
    225 ; 64R2:                 mtc1 $zero, $[[T1:f[0-9]+]]
    226 ; 64R2:                 add.d $f0, $[[T0]], $[[T1]]
    227 
    228 ; 64R6-NOMADD-DAG:      mul.d $[[T1:f[0-9]+]], $f12, $f13
    229 ; 64R6-NOMADD-DAG:      add.d $[[T2:f[0-9]+]], $[[T1]], $f14
    230 ; 64R6-NOMADD-DAG:      dmtc1 $zero, $[[T2:f[0-9]+]]
    231 ; 64R6-NOMADD-DAG:      add.d $f0, $[[T1]], $[[T2]]
    232 
    233   %mul = fmul double %a, %b
    234   %add = fadd double %mul, %c
    235   %add1 = fadd double %add, 0.000000e+00
    236   ret double %add1
    237 }
    238 
    239 define double @FOO11double(double %a, double %b, double %c) nounwind readnone {
    240 entry:
    241 ; ALL-LABEL: FOO11double:
    242 
    243 ; 32-NOMADD-DAG:        ldc1 $[[T0:f[0-9]+]], 16($sp)
    244 ; 32-NOMADD-DAG:        mul.d $[[T1:f[0-9]+]], $f12, $f14
    245 ; 32-NOMADD-DAG:        sub.d $[[T2:f[0-9]+]], $[[T1]], $[[T0]]
    246 ; 32-NOMADD-DAG:        mtc1 $zero, $[[T2:f[0-9]+]]
    247 ; 32-NOMADD-DAG:        add.d $f0, $[[T1]], $[[T2]]
    248 
    249 ; 32R2:                 ldc1 $[[T0:f[0-9]+]], 16($sp)
    250 ; 32R2:                 msub.d $[[T1:f[0-9]+]], $[[T0]], $f12, $f14
    251 ; 32R2:                 mtc1 $zero, $[[T2:f[0-9]+]]
    252 ; 32R2:                 mthc1 $zero, $[[T2]]
    253 ; 32R2:                 add.d $f0, $[[T1]], $[[T2]]
    254 
    255 ; 32R6-NOMADD-DAG:      ldc1 $[[T0:f[0-9]+]], 16($sp)
    256 ; 32R6-NOMADD-DAG:      mul.d $[[T1:f[0-9]+]], $f12, $f14
    257 ; 32R6-NOMADD-DAG:      sub.d $[[T2:f[0-9]+]], $[[T1]], $[[T0]]
    258 ; 32R6-NOMADD-DAG:      mtc1 $zero, $[[T2:f[0-9]+]]
    259 ; 32R6-NOMADD-DAG:      add.d $f0, $[[T1]], $[[T2]]
    260 
    261 ; 64-DAG:               msub.d $[[T0:f[0-9]+]], $f14, $f12, $f13
    262 ; 64-DAG:               mtc1 $zero, $[[T1:f[0-9]+]]
    263 ; 64-DAG:               add.d $f0, $[[T0]], $[[T1]]
    264 
    265 ; 64R2:                 msub.d $[[T0:f[0-9]+]], $f14, $f12, $f13
    266 ; 64R2:                 mtc1 $zero, $[[T1:f[0-9]+]]
    267 ; 64R2:                 add.d $f0, $[[T0]], $[[T1]]
    268 
    269 ; 64R6-NOMADD-DAG:      mul.d $[[T1:f[0-9]+]], $f12, $f13
    270 ; 64R6-NOMADD-DAG:      sub.d $[[T2:f[0-9]+]], $[[T1]], $f14
    271 ; 64R6-NOMADD-DAG:      dmtc1 $zero, $[[T2:f[0-9]+]]
    272 ; 64R6-NOMADD-DAG:      add.d $f0, $[[T1]], $[[T2]]
    273 
    274   %mul = fmul double %a, %b
    275   %sub = fsub double %mul, %c
    276   %add = fadd double %sub, 0.000000e+00
    277   ret double %add
    278 }
    279 
    280 define double @FOO12double(double %a, double %b, double %c) nounwind readnone {
    281 entry:
    282 ; ALL-LABEL: FOO12double:
    283 
    284 ; 32-NOMADD-DAG:        ldc1 $[[T0:f[0-9]+]], 16($sp)
    285 ; 32-NOMADD-DAG:        mul.d $[[T1:f[0-9]+]], $f12, $f14
    286 ; 32-NOMADD-DAG:        add.d $[[T2:f[0-9]+]], $[[T1]], $[[T0]]
    287 ; 32-NOMADD-DAG:        mtc1 $zero, $[[T2:f[0-9]+]]
    288 ; 32-NOMADD-DAG:        sub.d $f0, $[[T2]], $[[T1]]
    289 
    290 ; 32R2-NONAN:           ldc1 $[[T0:f[0-9]+]], 16($sp)
    291 ; 32R2-NONAN:           nmadd.d $f0, $[[T0]], $f12, $f14
    292 
    293 ; 32R2-NAN:             ldc1 $[[T0:f[0-9]+]], 16($sp)
    294 ; 32R2-NAN:             madd.d $[[T1:f[0-9]+]], $[[T0]], $f12, $f14
    295 ; 32R2-NAN:             mtc1 $zero, $[[T2:f[0-9]+]]
    296 ; 32R2-NAN:             mthc1 $zero, $[[T2]]
    297 ; 32R2-NAN:             sub.d $f0, $[[T2]], $[[T1]]
    298 
    299 ; 32R6-NOMADD-DAG:      ldc1 $[[T0:f[0-9]+]], 16($sp)
    300 ; 32R6-NOMADD-DAG:      mul.d $[[T1:f[0-9]+]], $f12, $f14
    301 ; 32R6-NOMADD-DAG:      add.d $[[T2:f[0-9]+]], $[[T1]], $[[T0]]
    302 ; 32R6-NOMADD-DAG:      mtc1 $zero, $[[T2:f[0-9]+]]
    303 ; 32R6-NOMADD-DAG:      sub.d $f0, $[[T2]], $[[T1]]
    304 
    305 ; 64-NONAN:             nmadd.d $f0, $f14, $f12, $f13
    306 
    307 ; 64-NAN:               madd.d $[[T0:f[0-9]+]], $f14, $f12, $f13
    308 ; 64-NAN:               mtc1 $zero, $[[T1:f[0-9]+]]
    309 ; 64-NAN:               sub.d $f0, $[[T1]], $[[T0]]
    310 
    311 ; 64R2-NONAN:           nmadd.d $f0, $f14, $f12, $f13
    312 
    313 ; 64R2-NAN:             madd.d $[[T0:f[0-9]+]], $f14, $f12, $f13
    314 ; 64R2-NAN:             mtc1 $zero, $[[T1:f[0-9]+]]
    315 ; 64R2-NAN:             sub.d $f0, $[[T1]], $[[T0]]
    316 
    317 ; 64R6-NOMADD-DAG:      mul.d $[[T1:f[0-9]+]], $f12, $f13
    318 ; 64R6-NOMADD-DAG:      add.d $[[T2:f[0-9]+]], $[[T1]], $f14
    319 ; 64R6-NOMADD-DAG:      dmtc1 $zero, $[[T2:f[0-9]+]]
    320 ; 64R6-NOMADD-DAG:      sub.d $f0, $[[T2]], $[[T1]]
    321 
    322   %mul = fmul double %a, %b
    323   %add = fadd double %mul, %c
    324   %sub = fsub double 0.000000e+00, %add
    325   ret double %sub
    326 }
    327 
    328 define double @FOO13double(double %a, double %b, double %c) nounwind readnone {
    329 entry:
    330 ; ALL-LABEL: FOO13double:
    331 
    332 ; 32-NOMADD-DAG:        ldc1 $[[T0:f[0-9]+]], 16($sp)
    333 ; 32-NOMADD-DAG:        mul.d $[[T1:f[0-9]+]], $f12, $f14
    334 ; 32-NOMADD-DAG:        sub.d $[[T2:f[0-9]+]], $[[T1]], $[[T0]]
    335 ; 32-NOMADD-DAG:        mtc1 $zero, $[[T2:f[0-9]+]]
    336 ; 32-NOMADD-DAG:        sub.d $f0, $[[T2]], $[[T1]]
    337 
    338 ; 32R2-NONAN:           ldc1 $[[T0:f[0-9]+]], 16($sp)
    339 ; 32R2-NONAN:           nmsub.d $f0, $[[T0]], $f12, $f14
    340 
    341 ; 32R2-NAN:             ldc1 $[[T0:f[0-9]+]], 16($sp)
    342 ; 32R2-NAN:             msub.d $[[T1:f[0-9]+]], $[[T0]], $f12, $f14
    343 ; 32R2-NAN:             mtc1 $zero, $[[T2:f[0-9]+]]
    344 ; 32R2-NAN:             mthc1 $zero, $[[T2]]
    345 ; 32R2-NAN:             sub.d $f0, $[[T2]], $[[T1]]
    346 
    347 ; 32R6-NOMADD-DAG:      ldc1 $[[T0:f[0-9]+]], 16($sp)
    348 ; 32R6-NOMADD-DAG:      mul.d $[[T1:f[0-9]+]], $f12, $f14
    349 ; 32R6-NOMADD-DAG:      sub.d $[[T2:f[0-9]+]], $[[T1]], $[[T0]]
    350 ; 32R6-NOMADD-DAG:      mtc1 $zero, $[[T2:f[0-9]+]]
    351 ; 32R6-NOMADD-DAG:      sub.d $f0, $[[T2]], $[[T1]]
    352 
    353 ; 64-NONAN:             nmsub.d $f0, $f14, $f12, $f13
    354 
    355 ; 64-NAN:               msub.d $[[T0:f[0-9]+]], $f14, $f12, $f13
    356 ; 64-NAN:               mtc1 $zero, $[[T1:f[0-9]+]]
    357 ; 64-NAN:               sub.d $f0, $[[T1]], $[[T0]]
    358 
    359 ; 64R2-NONAN:           nmsub.d $f0, $f14, $f12, $f13
    360 
    361 ; 64R2-NAN:             msub.d $[[T0:f[0-9]+]], $f14, $f12, $f13
    362 ; 64R2-NAN:             mtc1 $zero, $[[T1:f[0-9]+]]
    363 ; 64R2-NAN:             sub.d $f0, $[[T1]], $[[T0]]
    364 
    365 ; 64R6-NOMADD-DAG:      mul.d $[[T1:f[0-9]+]], $f12, $f13
    366 ; 64R6-NOMADD-DAG:      sub.d $[[T2:f[0-9]+]], $[[T1]], $f14
    367 ; 64R6-NOMADD-DAG:      dmtc1 $zero, $[[T2:f[0-9]+]]
    368 ; 64R6-NOMADD-DAG:      sub.d $f0, $[[T2]], $[[T1]]
    369 
    370   %mul = fmul double %a, %b
    371   %sub = fsub double %mul, %c
    372   %sub1 = fsub double 0.000000e+00, %sub
    373   ret double %sub1
    374 }
    375