@ VFP Instructions for D variants (Double precision) @ Same as vfp1.s, but for Thumb-2 .syntax unified .thumb .text .global F F: @ First we test the basic syntax and bit patterns of the opcodes. @ Most of these tests deliberatly use d0/r0 to avoid setting @ any more bits than necessary. @ Comparison operations fcmped d0, d0 fcmpezd d0 fcmpd d0, d0 fcmpzd d0 @ Monadic data operations fabsd d0, d0 fcpyd d0, d0 fnegd d0, d0 fsqrtd d0, d0 @ Dyadic data operations faddd d0, d0, d0 fdivd d0, d0, d0 fmacd d0, d0, d0 fmscd d0, d0, d0 fmuld d0, d0, d0 fnmacd d0, d0, d0 fnmscd d0, d0, d0 fnmuld d0, d0, d0 fsubd d0, d0, d0 @ Load/store operations fldd d0, [r0] fstd d0, [r0] @ Load/store multiple operations fldmiad r0, {d0} fldmfdd r0, {d0} fldmiad r0!, {d0} fldmfdd r0!, {d0} fldmdbd r0!, {d0} fldmead r0!, {d0} fstmiad r0, {d0} fstmead r0, {d0} fstmiad r0!, {d0} fstmead r0!, {d0} fstmdbd r0!, {d0} fstmfdd r0!, {d0} @ Conversion operations fsitod d0, s0 fuitod d0, s0 ftosid s0, d0 ftosizd s0, d0 ftouid s0, d0 ftouizd s0, d0 fcvtds d0, s0 fcvtsd s0, d0 @ ARM from VFP operations fmrdh r0, d0 fmrdl r0, d0 @ VFP From ARM operations fmdhr d0, r0 fmdlr d0, r0 @ Now we test that the register fields are updated correctly for @ each class of instruction. @ Single register operations (compare-zero): fcmpzd d1 fcmpzd d2 fcmpzd d15 @ Two register comparison operations: fcmpd d0, d1 fcmpd d0, d2 fcmpd d0, d15 fcmpd d1, d0 fcmpd d2, d0 fcmpd d15, d0 fcmpd d5, d12 @ Two register data operations (monadic) fnegd d0, d1 fnegd d0, d2 fnegd d0, d15 fnegd d1, d0 fnegd d2, d0 fnegd d15, d0 fnegd d12, d5 @ Three register data operations (dyadic) faddd d0, d0, d1 faddd d0, d0, d2 faddd d0, d0, d15 faddd d0, d1, d0 faddd d0, d2, d0 faddd d0, d15, d0 faddd d1, d0, d0 faddd d2, d0, d0 faddd d15, d0, d0 faddd d12, d9, d5 @ Conversion operations fcvtds d0, s1 fcvtds d0, s2 fcvtds d0, s31 fcvtds d1, s0 fcvtds d2, s0 fcvtds d15, s0 fcvtsd s1, d0 fcvtsd s2, d0 fcvtsd s31, d0 fcvtsd s0, d1 fcvtsd s0, d2 fcvtsd s0, d15 @ Move to VFP from ARM fmrdh r1, d0 fmrdh r14, d0 fmrdh r0, d1 fmrdh r0, d2 fmrdh r0, d15 fmrdl r1, d0 fmrdl r14, d0 fmrdl r0, d1 fmrdl r0, d2 fmrdl r0, d15 @ Move to ARM from VFP fmdhr d0, r1 fmdhr d0, r14 fmdhr d1, r0 fmdhr d2, r0 fmdhr d15, r0 fmdlr d0, r1 fmdlr d0, r14 fmdlr d1, r0 fmdlr d2, r0 fmdlr d15, r0 @ Load/store operations fldd d0, [r1] fldd d0, [r14] fldd d0, [r0, #0] fldd d0, [r0, #1020] fldd d0, [r0, #-1020] fldd d1, [r0] fldd d2, [r0] fldd d15, [r0] fstd d12, [r12, #804] @ Load/store multiple operations fldmiad r0, {d1} fldmiad r0, {d2} fldmiad r0, {d15} fldmiad r0, {d0-d1} fldmiad r0, {d0-d2} fldmiad r0, {d0-d15} fldmiad r0, {d1-d15} fldmiad r0, {d2-d15} fldmiad r0, {d14-d15} fldmiad r1, {d0} fldmiad r14, {d0} @ Check that we assemble all the register names correctly fcmpzd d0 fcmpzd d1 fcmpzd d2 fcmpzd d3 fcmpzd d4 fcmpzd d5 fcmpzd d6 fcmpzd d7 fcmpzd d8 fcmpzd d9 fcmpzd d10 fcmpzd d11 fcmpzd d12 fcmpzd d13 fcmpzd d14 fcmpzd d15 @ Now we check the placement of the conditional execution substring. @ On VFP this is always at the end of the instruction. @ Comparison operations itttt eq fcmpedeq d1, d15 fcmpezdeq d2 fcmpdeq d3, d14 fcmpzdeq d4 @ Monadic data operations itttt eq fabsdeq d5, d13 fcpydeq d6, d12 fnegdeq d7, d11 fsqrtdeq d8, d10 @ Dyadic data operations itttt eq fadddeq d9, d1, d15 fdivdeq d2, d3, d14 fmacdeq d4, d13, d12 fmscdeq d5, d6, d11 itttt eq fmuldeq d7, d10, d9 fnmacdeq d8, d9, d10 fnmscdeq d7, d6, d11 fnmuldeq d5, d4, d12 ittt eq fsubdeq d3, d13, d14 @ Load/store operations flddeq d2, [r5] fstdeq d1, [r12] @ Load/store multiple operations itttt eq fldmiadeq r1, {d1} fldmfddeq r2, {d2} fldmiadeq r3!, {d3} fldmfddeq r4!, {d4} itttt eq fldmdbdeq r5!, {d5} fldmeadeq r6!, {d6} fstmiadeq r7, {d15} fstmeadeq r8, {d14} itttt eq fstmiadeq r9!, {d13} fstmeadeq r10!, {d12} fstmdbdeq r11!, {d11} fstmfddeq r12!, {d10} @ Conversion operations itttt eq fsitodeq d15, s1 fuitodeq d1, s31 ftosideq s1, d15 ftosizdeq s31, d2 itttt eq ftouideq s15, d2 ftouizdeq s11, d3 fcvtdseq d1, s10 fcvtsdeq s11, d1 @ ARM from VFP operations itttt eq fmrdheq r8, d1 fmrdleq r7, d15 @ VFP From ARM operations fmdhreq d1, r15 fmdlreq d15, r1 # Add three nop instructions to ensure that the # output is 32-byte aligned as required for arm-aout. nop nop nop