1 @ VFP Instructions for v1xD variants (Single precision only) 2 .text 3 .global F 4 F: 5 @ First we test the basic syntax and bit patterns of the opcodes. 6 @ Most of these tests deliberatly use s0/r0 to avoid setting 7 @ any more bits than necessary. 8 9 @ Comparison operations 10 11 fmstat 12 13 fcmpes s0, s0 14 fcmpezs s0 15 fcmps s0, s0 16 fcmpzs s0 17 18 @ Monadic data operations 19 20 fabss s0, s0 21 fcpys s0, s0 22 fnegs s0, s0 23 fsqrts s0, s0 24 25 @ Dyadic data operations 26 27 fadds s0, s0, s0 28 fdivs s0, s0, s0 29 fmacs s0, s0, s0 30 fmscs s0, s0, s0 31 fmuls s0, s0, s0 32 fnmacs s0, s0, s0 33 fnmscs s0, s0, s0 34 fnmuls s0, s0, s0 35 fsubs s0, s0, s0 36 37 @ Load/store operations 38 39 flds s0, [r0] 40 fsts s0, [r0] 41 42 @ Load/store multiple operations 43 44 fldmias r0, {s0} 45 fldmfds r0, {s0} 46 fldmias r0!, {s0} 47 fldmfds r0!, {s0} 48 fldmdbs r0!, {s0} 49 fldmeas r0!, {s0} 50 51 fldmiax r0, {d0} 52 fldmfdx r0, {d0} 53 fldmiax r0!, {d0} 54 fldmfdx r0!, {d0} 55 fldmdbx r0!, {d0} 56 fldmeax r0!, {d0} 57 58 fstmias r0, {s0} 59 fstmeas r0, {s0} 60 fstmias r0!, {s0} 61 fstmeas r0!, {s0} 62 fstmdbs r0!, {s0} 63 fstmfds r0!, {s0} 64 65 fstmiax r0, {d0} 66 fstmeax r0, {d0} 67 fstmiax r0!, {d0} 68 fstmeax r0!, {d0} 69 fstmdbx r0!, {d0} 70 fstmfdx r0!, {d0} 71 72 @ Conversion operations 73 74 fsitos s0, s0 75 fuitos s0, s0 76 77 ftosis s0, s0 78 ftosizs s0, s0 79 ftouis s0, s0 80 ftouizs s0, s0 81 82 @ ARM from VFP operations 83 84 fmrs r0, s0 85 fmrx r0, fpsid 86 fmrx r0, fpscr 87 fmrx r0, fpexc 88 89 @ VFP From ARM operations 90 91 fmsr s0, r0 92 fmxr fpsid, r0 93 fmxr fpscr, r0 94 fmxr fpexc, r0 95 96 @ Now we test that the register fields are updated correctly for 97 @ each class of instruction. 98 99 @ Single register operations (compare-zero): 100 101 fcmpzs s1 102 fcmpzs s2 103 fcmpzs s31 104 105 @ Two register comparison operations: 106 107 fcmps s0, s1 108 fcmps s0, s2 109 fcmps s0, s31 110 fcmps s1, s0 111 fcmps s2, s0 112 fcmps s31, s0 113 fcmps s21, s12 114 115 @ Two register data operations (monadic) 116 117 fnegs s0, s1 118 fnegs s0, s2 119 fnegs s0, s31 120 fnegs s1, s0 121 fnegs s2, s0 122 fnegs s31, s0 123 fnegs s12, s21 124 125 @ Three register data operations (dyadic) 126 127 fadds s0, s0, s1 128 fadds s0, s0, s2 129 fadds s0, s0, s31 130 fadds s0, s1, s0 131 fadds s0, s2, s0 132 fadds s0, s31, s0 133 fadds s1, s0, s0 134 fadds s2, s0, s0 135 fadds s31, s0, s0 136 fadds s12, s21, s5 137 138 @ Conversion operations 139 140 fsitos s0, s1 141 fsitos s0, s2 142 fsitos s0, s31 143 fsitos s1, s0 144 fsitos s2, s0 145 fsitos s31, s0 146 147 ftosis s0, s1 148 ftosis s0, s2 149 ftosis s0, s31 150 ftosis s1, s0 151 ftosis s2, s0 152 ftosis s31, s0 153 154 @ Move to VFP from ARM 155 156 fmsr s0, r1 157 fmsr s0, r7 158 fmsr s0, r14 159 fmsr s1, r0 160 fmsr s2, r0 161 fmsr s31, r0 162 fmsr s21, r7 163 164 fmxr fpsid, r1 165 fmxr fpsid, r14 166 167 @ Move to ARM from VFP 168 169 fmrs r0, s1 170 fmrs r0, s2 171 fmrs r0, s31 172 fmrs r1, s0 173 fmrs r7, s0 174 fmrs r14, s0 175 fmrs r9, s11 176 177 fmrx r1, fpsid 178 fmrx r14, fpsid 179 180 @ Load/store operations 181 182 flds s0, [r1] 183 flds s0, [r14] 184 flds s0, [r0, #0] 185 flds s0, [r0, #1020] 186 flds s0, [r0, #-1020] 187 flds s1, [r0] 188 flds s2, [r0] 189 flds s31, [r0] 190 fsts s21, [r12, #804] 191 192 @ Load/store multiple operations 193 194 fldmias r0, {s1} 195 fldmias r0, {s2} 196 fldmias r0, {s31} 197 fldmias r0, {s0-s1} 198 fldmias r0, {s0-s2} 199 fldmias r0, {s0-s31} 200 fldmias r0, {s1-s31} 201 fldmias r0, {s2-s31} 202 fldmias r0, {s30-s31} 203 fldmias r1, {s0} 204 fldmias r14, {s0} 205 206 fstmiax r0, {d1} 207 fstmiax r0, {d2} 208 fstmiax r0, {d15} 209 fstmiax r0, {d0-d1} 210 fstmiax r0, {d0-d2} 211 fstmiax r0, {d0-d15} 212 fstmiax r0, {d1-d15} 213 fstmiax r0, {d2-d15} 214 fstmiax r0, {d14-d15} 215 fstmiax r1, {d0} 216 fstmiax r14, {d0} 217 218 @ Check that we assemble all the register names correctly 219 220 fcmpzs s0 221 fcmpzs s1 222 fcmpzs s2 223 fcmpzs s3 224 fcmpzs s4 225 fcmpzs s5 226 fcmpzs s6 227 fcmpzs s7 228 fcmpzs s8 229 fcmpzs s9 230 fcmpzs s10 231 fcmpzs s11 232 fcmpzs s12 233 fcmpzs s13 234 fcmpzs s14 235 fcmpzs s15 236 fcmpzs s16 237 fcmpzs s17 238 fcmpzs s18 239 fcmpzs s19 240 fcmpzs s20 241 fcmpzs s21 242 fcmpzs s22 243 fcmpzs s23 244 fcmpzs s24 245 fcmpzs s25 246 fcmpzs s26 247 fcmpzs s27 248 fcmpzs s28 249 fcmpzs s29 250 fcmpzs s30 251 fcmpzs s31 252 253 @ Now we check the placement of the conditional execution substring. 254 @ On VFP this is always at the end of the instruction. 255 @ We use different register numbers here to check for correct 256 @ disassembly 257 258 @ Comparison operations 259 260 fmstateq 261 262 fcmpeseq s3, s7 263 fcmpezseq s5 264 fcmpseq s1, s2 265 fcmpzseq s1 266 267 @ Monadic data operations 268 269 fabsseq s1, s3 270 fcpyseq s31, s19 271 fnegseq s20, s8 272 fsqrtseq s5, s7 273 274 @ Dyadic data operations 275 276 faddseq s6, s5, s4 277 fdivseq s3, s2, s1 278 fmacseq s31, s30, s29 279 fmscseq s28, s27, s26 280 fmulseq s25, s24, s23 281 fnmacseq s22, s21, s20 282 fnmscseq s19, s18, s17 283 fnmulseq s16, s15, s14 284 fsubseq s13, s12, s11 285 286 @ Load/store operations 287 288 fldseq s10, [r8] 289 fstseq s9, [r7] 290 291 @ Load/store multiple operations 292 293 fldmiaseq r1, {s8} 294 fldmfdseq r2, {s7} 295 fldmiaseq r3!, {s6} 296 fldmfdseq r4!, {s5} 297 fldmdbseq r5!, {s4} 298 fldmeaseq r6!, {s3} 299 300 fldmiaxeq r7, {d1} 301 fldmfdxeq r8, {d2} 302 fldmiaxeq r9!, {d3} 303 fldmfdxeq r10!, {d4} 304 fldmdbxeq r11!, {d5} 305 fldmeaxeq r12!, {d6} 306 307 fstmiaseq r13, {s2} 308 fstmeaseq r14, {s1} 309 fstmiaseq r1!, {s31} 310 fstmeaseq r2!, {s30} 311 fstmdbseq r3!, {s29} 312 fstmfdseq r4!, {s28} 313 314 fstmiaxeq r5, {d7} 315 fstmeaxeq r6, {d8} 316 fstmiaxeq r7!, {d9} 317 fstmeaxeq r8!, {d10} 318 fstmdbxeq r9!, {d11} 319 fstmfdxeq r10!, {d12} 320 321 @ Conversion operations 322 323 fsitoseq s27, s6 324 ftosiseq s25, s5 325 ftosizseq s23, s4 326 ftouiseq s21, s3 327 ftouizseq s19, s2 328 fuitoseq s17, s1 329 330 @ ARM from VFP operations 331 332 fmrseq r11, s3 333 fmrxeq r9, fpsid 334 335 @ VFP From ARM operations 336 337 fmsreq s3, r9 338 fmxreq fpsid, r8 339 340 @ Implementation specific system registers 341 fmrx r0, fpinst 342 fmrx r0, fpinst2 343 fmrx r0, mvfr0 344 fmrx r0, mvfr1 345 fmrx r0, c12 346 fmxr fpinst, r0 347 fmxr fpinst2, r0 348 fmxr mvfr0, r0 349 fmxr mvfr1, r0 350 fmxr c12, r0 351 352 @ ARM VMSR/VMRS instructions 353 vmrs r0, FPSCR 354 vmrs r1, FPSCR 355 vmrs r2, FPSCR 356 vmrs r3, FPSCR 357 vmrs r4, FPSCR 358 vmrs r5, FPSCR 359 vmrs r6, FPSCR 360 vmrs r7, FPSCR 361 vmrs r8, FPSCR 362 vmrs r9, FPSCR 363 vmrs r10, FPSCR 364 vmrs r11, FPSCR 365 vmrs r12, FPSCR 366 vmrs r14, FPSCR 367 vmrs APSR_nzcv, FPSCR 368 369 vmsr FPSCR, r0 370 vmsr FPSCR, r1 371 vmsr FPSCR, r2 372 vmsr FPSCR, r3 373 vmsr FPSCR, r4 374 vmsr FPSCR, r5 375 vmsr FPSCR, r6 376 vmsr FPSCR, r7 377 vmsr FPSCR, r8 378 vmsr FPSCR, r9 379 vmsr FPSCR, r10 380 vmsr FPSCR, r11 381 vmsr FPSCR, r12 382 vmsr FPSCR, r14 383 384 @ Priviledged extensions to VMSR/VMRS instructions 385 vmsr FPSID, r1 386 vmsr FPEXC, r2 387 vmsr FPINST, r3 388 vmsr FPINST2, r4 389 vmsr C15, r5 390 vmrs r3, FPSID 391 vmrs r4, MVFR1 392 vmrs r5, MVFR0 393 vmrs r6, FPEXC 394 vmrs r7, FPINST 395 vmrs r8, FPINST2 396 vmrs r9, C15 397 398 nop 399 nop 400 nop 401