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: instruction requires: NEON 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