Home | History | Annotate | Download | only in ARM
      1 @ RUN: not llvm-mc < %s -triple thumbv8-unknown-unknown -show-encoding -mattr=+fp-only-sp,-neon 2> %t > %t2
      2 @ RUN:     FileCheck %s < %t --check-prefix=CHECK-ERRORS
      3 @ RUN:     FileCheck %s < %t2
      4 
      5         vadd.f64 d0, d1, d2
      6         vsub.f64 d2, d3, d4
      7         vdiv.f64 d4, d5, d6
      8         vmul.f64 d6, d7, d8
      9         vnmul.f64 d8, d9, d10
     10 @ CHECK-ERRORS: error: instruction requires: double precision VFP
     11 @ CHECK-ERRORS-NEXT: vadd.f64 d0, d1, d2
     12 @ CHECK-ERRORS: error: instruction requires: double precision VFP
     13 @ CHECK-ERRORS-NEXT: vsub.f64 d2, d3, d4
     14 @ CHECK-ERRORS: error: instruction requires: double precision VFP
     15 @ CHECK-ERRORS-NEXT: vdiv.f64 d4, d5, d6
     16 @ CHECK-ERRORS: error: instruction requires: double precision VFP
     17 @ CHECK-ERRORS-NEXT: vmul.f64 d6, d7, d8
     18 @ CHECK-ERRORS: error: instruction requires: double precision VFP
     19 @ CHECK-ERRORS-NEXT: vnmul.f64 d8, d9, d10
     20 
     21         vmla.f64 d11, d10, d9
     22         vmls.f64 d8, d7, d6
     23         vnmla.f64 d5, d4, d3
     24         vnmls.f64 d2, d1, d0
     25         vfma.f64 d1, d2, d3
     26         vfms.f64 d4, d5, d6
     27         vfnma.f64 d7, d8, d9
     28         vfnms.f64 d10, d11, d12
     29 @ CHECK-ERRORS: error: instruction requires: double precision VFP
     30 @ CHECK-ERRORS-NEXT: vmla.f64 d11, d10, d9
     31 @ CHECK-ERRORS: error: instruction requires: double precision VFP
     32 @ CHECK-ERRORS-NEXT: vmls.f64 d8, d7, d6
     33 @ CHECK-ERRORS: error: instruction requires: double precision VFP
     34 @ CHECK-ERRORS-NEXT: vnmla.f64 d5, d4, d3
     35 @ CHECK-ERRORS: error: instruction requires: double precision VFP
     36 @ CHECK-ERRORS-NEXT: vnmls.f64 d2, d1, d0
     37 @ CHECK-ERRORS: error: instruction requires: double precision VFP
     38 @ CHECK-ERRORS-NEXT: vfma.f64 d1, d2, d3
     39 @ CHECK-ERRORS: error: instruction requires: double precision VFP
     40 @ CHECK-ERRORS-NEXT: vfms.f64 d4, d5, d6
     41 @ CHECK-ERRORS: error: instruction requires: double precision VFP
     42 @ CHECK-ERRORS-NEXT: vfnma.f64 d7, d8, d9
     43 @ CHECK-ERRORS: error: instruction requires: double precision VFP
     44 @ CHECK-ERRORS-NEXT: vfnms.f64 d10, d11, d12
     45 
     46         vneg.f64 d15, d14
     47         vsqrt.f64 d13, d12
     48         vsqrt d13, d14
     49 @ CHECK-ERRORS: error: instruction requires: double precision VFP
     50 @ CHECK-ERRORS-NEXT: vneg.f64 d15, d14
     51 @ CHECK-ERRORS: error: instruction requires: double precision VFP
     52 @ CHECK-ERRORS-NEXT: vsqrt.f64 d13, d12
     53 @ CHECK-ERRORS: error: instruction requires: double precision VFP
     54 @ CHECK-ERRORS-NEXT: vsqrt d13, d14
     55 
     56         vcmpe.f64 d0, d1
     57         vcmp.f64 d2, d3
     58         vabs.f64 d4, d5
     59         vcmpe.f64 d5, #0
     60         vcmp.f64 d6, #0
     61 @ CHECK-ERRORS: error: instruction requires: double precision VFP
     62 @ CHECK-ERRORS-NEXT: vcmpe.f64 d0, d1
     63 @ CHECK-ERRORS: error: instruction requires: double precision VFP
     64 @ CHECK-ERRORS-NEXT: vcmp.f64 d2, d3
     65 @ CHECK-ERRORS: error: instruction requires: double precision VFP
     66 @ CHECK-ERRORS-NEXT: vabs.f64 d4, d5
     67 @ CHECK-ERRORS: error: instruction requires: double precision VFP
     68 @ CHECK-ERRORS-NEXT: vcmpe.f64 d5, #0
     69 @ CHECK-ERRORS: error: instruction requires: double precision VFP
     70 @ CHECK-ERRORS-NEXT: vcmp.f64 d6, #0
     71 
     72         @ FIXME: overlapping aliases and a probable TableGen indeterminacy mean
     73         @ that the actual reason can vary by platform.
     74         vmov.f64 d11, d10
     75 @ CHECK-ERRORS: error: instruction requires:
     76 @ CHECK-ERRORS-NEXT: vmov.f64 d11, d10
     77 
     78         vcvt.f64.s32 d9, s8
     79         vcvt.f64.u32 d7, s6
     80         vcvt.s32.f64 s5, d4
     81         vcvt.u32.f64 s3, d2
     82         vcvtr.s32.f64 s1, d0
     83         vcvtr.u32.f64 s1, d2
     84         vcvt.s16.f64 d3, d4, #1
     85         vcvt.u16.f64 d5, d6, #2
     86         vcvt.s32.f64 d7, d8, #3
     87         vcvt.u32.f64 d9, d10, #4
     88         vcvt.f64.s16 d11, d12, #3
     89         vcvt.f64.u16 d13, d14, #2
     90         vcvt.f64.s32 d15, d14, #1
     91         vcvt.f64.u32 d13, d12, #1
     92 @ CHECK-ERRORS: error: instruction requires: double precision VFP
     93 @ CHECK-ERRORS-NEXT: vcvt.f64.s32 d9, s8
     94 @ CHECK-ERRORS: error: instruction requires: double precision VFP
     95 @ CHECK-ERRORS-NEXT: vcvt.f64.u32 d7, s6
     96 @ CHECK-ERRORS: error: instruction requires: double precision VFP
     97 @ CHECK-ERRORS-NEXT: vcvt.s32.f64 s5, d4
     98 @ CHECK-ERRORS: error: instruction requires: double precision VFP
     99 @ CHECK-ERRORS-NEXT: vcvt.u32.f64 s3, d2
    100 @ CHECK-ERRORS: error: instruction requires: double precision VFP
    101 @ CHECK-ERRORS-NEXT: vcvtr.s32.f64 s1, d0
    102 @ CHECK-ERRORS: error: instruction requires: double precision VFP
    103 @ CHECK-ERRORS-NEXT: vcvtr.u32.f64 s1, d2
    104 @ CHECK-ERRORS: error: instruction requires: double precision VFP
    105 @ CHECK-ERRORS-NEXT: vcvt.s16.f64 d3, d4, #1
    106 @ CHECK-ERRORS: error: instruction requires: double precision VFP
    107 @ CHECK-ERRORS-NEXT: vcvt.u16.f64 d5, d6, #2
    108 @ CHECK-ERRORS: error: instruction requires: double precision VFP
    109 @ CHECK-ERRORS-NEXT: vcvt.s32.f64 d7, d8, #3
    110 @ CHECK-ERRORS: error: instruction requires: double precision VFP
    111 @ CHECK-ERRORS-NEXT: vcvt.u32.f64 d9, d10, #4
    112 @ CHECK-ERRORS: error: instruction requires: double precision VFP
    113 @ CHECK-ERRORS-NEXT: vcvt.f64.s16 d11, d12, #3
    114 @ CHECK-ERRORS: error: instruction requires: double precision VFP
    115 @ CHECK-ERRORS-NEXT: vcvt.f64.u16 d13, d14, #2
    116 @ CHECK-ERRORS: error: instruction requires: double precision VFP
    117 @ CHECK-ERRORS-NEXT: vcvt.f64.s32 d15, d14, #1
    118 @ CHECK-ERRORS: error: instruction requires: double precision VFP
    119 @ CHECK-ERRORS-NEXT: vcvt.f64.u32 d13, d12, #1
    120 
    121         @ v8 operations, also double precision so make sure they're rejected.
    122         vselgt.f64 d0, d1, d2
    123         vselge.f64 d3, d4, d5
    124         vseleq.f64 d6, d7, d8
    125         vselvs.f64 d9, d10, d11
    126 @ CHECK-ERRORS: error: instruction requires: double precision VFP
    127 @ CHECK-ERRORS-NEXT: vselgt.f64 d0, d1, d2
    128 @ CHECK-ERRORS: error: instruction requires: double precision VFP
    129 @ CHECK-ERRORS-NEXT: vselge.f64 d3, d4, d5
    130 @ CHECK-ERRORS: error: instruction requires: double precision VFP
    131 @ CHECK-ERRORS-NEXT: vseleq.f64 d6, d7, d8
    132 @ CHECK-ERRORS: error: instruction requires: double precision VFP
    133 @ CHECK-ERRORS-NEXT: vselvs.f64 d9, d10, d11
    134 
    135         vmaxnm.f64 d12, d13, d14
    136 @ CHECK-ERRORS: error: instruction requires: double precision VFP
    137 @ CHECK-ERRORS-NEXT: vmaxnm.f64 d12, d13, d14
    138 
    139         vcvtb.f64.f16 d7, s8
    140         vcvtb.f16.f64 s9, d10
    141         vcvtt.f64.f16 d11, s12
    142         vcvtt.f16.f64 s13, d14
    143 @ CHECK-ERRORS: error: instruction requires: double precision VFP
    144 @ CHECK-ERRORS-NEXT: vcvtb.f64.f16 d7, s8
    145 @ CHECK-ERRORS: error: instruction requires: double precision VFP
    146 @ CHECK-ERRORS-NEXT: vcvtb.f16.f64 s9, d10
    147 @ CHECK-ERRORS: error: instruction requires: double precision VFP
    148 @ CHECK-ERRORS-NEXT: vcvtt.f64.f16 d11, s12
    149 @ CHECK-ERRORS: error: instruction requires: double precision VFP
    150 @ CHECK-ERRORS-NEXT: vcvtt.f16.f64 s13, d14
    151 
    152         vrintz.f64 d15, d14
    153         vrintr.f64.f64 d13, d12
    154         vrintx.f64 d11, d10
    155         vrinta.f64.f64 d9, d8
    156         vrintn.f64 d7, d6
    157         vrintp.f64.f64 d5, d4
    158         vrintm.f64 d3, d2
    159 @ CHECK-ERRORS: error: instruction requires: double precision VFP
    160 @ CHECK-ERRORS-NEXT: vrintz.f64 d15, d14
    161 @ CHECK-ERRORS: error: instruction requires: double precision VFP
    162 @ CHECK-ERRORS-NEXT: vrintr.f64.f64 d13, d12
    163 @ CHECK-ERRORS: error: instruction requires: double precision VFP
    164 @ CHECK-ERRORS-NEXT: vrintx.f64 d11, d10
    165 @ CHECK-ERRORS: error: instruction requires: double precision VFP
    166 @ CHECK-ERRORS-NEXT: vrinta.f64.f64 d9, d8
    167 @ CHECK-ERRORS: error: instruction requires: double precision VFP
    168 @ CHECK-ERRORS-NEXT: vrintn.f64 d7, d6
    169 @ CHECK-ERRORS: error: instruction requires: double precision VFP
    170 @ CHECK-ERRORS-NEXT: vrintp.f64.f64 d5, d4
    171 @ CHECK-ERRORS: error: instruction requires: double precision VFP
    172 @ CHECK-ERRORS-NEXT: vrintm.f64 d3, d2
    173 
    174         @ Double precisionish operations that actually *are* allowed.
    175         vldr d0, [sp]
    176         vstr d3, [sp]
    177         vldm r0, {d0, d1}
    178         vstm r4, {d3, d4}
    179         vpush {d6, d7}
    180         vpop {d8, d9}
    181         vmov r1, r0, d1
    182         vmov d2, r3, r4
    183         vmov.f64 r5, r6, d7
    184         vmov.f64 d8, r9, r10
    185 @ CHECK: vldr d0, [sp]
    186 @ CHECK: vstr d3, [sp]
    187 @ CHECK: vldmia r0, {d0, d1}
    188 @ CHECK: vstmia r4, {d3, d4}
    189 @ CHECK: vpush {d6, d7}
    190 @ CHECK: vpop {d8, d9}
    191 @ CHECK: vmov r1, r0, d1
    192 @ CHECK: vmov d2, r3, r4
    193 @ CHECK: vmov r5, r6, d7
    194 @ CHECK: vmov d8, r9, r10
    195