Index: config/tc-arm.c =================================================================== RCS file: /cvs/src/src/gas/config/tc-arm.c,v retrieving revision 1.413 diff -u -r1.413 tc-arm.c --- config/tc-arm.c 3 Nov 2009 12:37:44 -0000 1.413 +++ config/tc-arm.c 12 Nov 2009 21:45:54 -0000 @@ -6303,6 +6303,8 @@ if (found != 15) goto failure; inst.operands[i].isvec = 1; + /* APSR_nzcv is encoded in instructions as if it were the REG_PC. */ + inst.operands[i].reg = REG_PC; } else goto failure; @@ -7615,6 +7617,49 @@ } static void +do_vmrs (void) +{ + unsigned Rt = inst.operands[0].reg; + + if (thumb_mode && inst.operands[0].reg == REG_SP) + { + inst.error = BAD_SP; + return; + } + + /* APSR_ sets isvec. All other refs to PC are illegal. */ + if (!inst.operands[0].isvec && inst.operands[0].reg == REG_PC) + { + inst.error = BAD_PC; + return; + } + + if (inst.operands[1].reg != 1) + first_error (_("operand 1 must be FPSCR")); + + inst.instruction |= (Rt << 12); +} + +static void +do_vmsr (void) +{ + unsigned Rt = inst.operands[1].reg; + + if (thumb_mode) + reject_bad_reg (Rt); + else if (Rt == REG_PC) + { + inst.error = BAD_PC; + return; + } + + if (inst.operands[0].reg != 1) + first_error (_("operand 0 must be FPSCR")); + + inst.instruction |= (Rt << 12); +} + +static void do_mrs (void) { if (do_vfp_nsyn_mrs () == SUCCESS) @@ -17168,6 +17213,8 @@ cCE("fmrs", e100a10, 2, (RR, RVS), vfp_reg_from_sp), cCE("fmsr", e000a10, 2, (RVS, RR), vfp_sp_from_reg), cCE("fmstat", ef1fa10, 0, (), noargs), + cCE("vmrs", ef10a10, 2, (APSR_RR, RVC), vmrs), + cCE("vmsr", ee10a10, 2, (RVC, RR), vmsr), cCE("fsitos", eb80ac0, 2, (RVS, RVS), vfp_sp_monadic), cCE("fuitos", eb80a40, 2, (RVS, RVS), vfp_sp_monadic), cCE("ftosis", ebd0a40, 2, (RVS, RVS), vfp_sp_monadic), Index: testsuite/gas/arm/vfp1xD.d =================================================================== RCS file: /cvs/src/src/gas/testsuite/gas/arm/vfp1xD.d,v retrieving revision 1.10 diff -u -r1.10 vfp1xD.d --- testsuite/gas/arm/vfp1xD.d 30 Jun 2009 11:57:05 -0000 1.10 +++ testsuite/gas/arm/vfp1xD.d 12 Nov 2009 21:45:54 -0000 @@ -249,5 +249,34 @@ 0+3bc <[^>]*> eee70a10 (vmsr|fmxr) mvfr0, r0 0+3c0 <[^>]*> eee60a10 (vmsr|fmxr) mvfr1, r0 0+3c4 <[^>]*> eeec0a10 (vmsr|fmxr) , r0 -0+3c8 <[^>]*> e1a00000 nop ; \(mov r0, r0\) -0+3cc <[^>]*> e1a00000 nop ; \(mov r0, r0\) +0+3c8 <[^>]*> eef10a10 vmrs r0, fpscr +0+3cc <[^>]*> eef11a10 vmrs r1, fpscr +0+3d0 <[^>]*> eef12a10 vmrs r2, fpscr +0+3d4 <[^>]*> eef13a10 vmrs r3, fpscr +0+3d8 <[^>]*> eef14a10 vmrs r4, fpscr +0+3dc <[^>]*> eef15a10 vmrs r5, fpscr +0+3e0 <[^>]*> eef16a10 vmrs r6, fpscr +0+3e4 <[^>]*> eef17a10 vmrs r7, fpscr +0+3e8 <[^>]*> eef18a10 vmrs r8, fpscr +0+3ec <[^>]*> eef19a10 vmrs r9, fpscr +0+3f0 <[^>]*> eef1aa10 vmrs sl, fpscr +0+3f4 <[^>]*> eef1ba10 vmrs fp, fpscr +0+3f8 <[^>]*> eef1ca10 vmrs ip, fpscr +0+3fc <[^>]*> eef1ea10 vmrs lr, fpscr +0+400 <[^>]*> eef1fa10 vmrs APSR_nzcv, fpscr +0+404 <[^>]*> eee10a10 vmsr fpscr, r0 +0+408 <[^>]*> eee11a10 vmsr fpscr, r1 +0+40c <[^>]*> eee12a10 vmsr fpscr, r2 +0+410 <[^>]*> eee13a10 vmsr fpscr, r3 +0+414 <[^>]*> eee14a10 vmsr fpscr, r4 +0+418 <[^>]*> eee15a10 vmsr fpscr, r5 +0+41c <[^>]*> eee16a10 vmsr fpscr, r6 +0+420 <[^>]*> eee17a10 vmsr fpscr, r7 +0+424 <[^>]*> eee18a10 vmsr fpscr, r8 +0+428 <[^>]*> eee19a10 vmsr fpscr, r9 +0+42c <[^>]*> eee1aa10 vmsr fpscr, sl +0+430 <[^>]*> eee1ba10 vmsr fpscr, fp +0+434 <[^>]*> eee1ca10 vmsr fpscr, ip +0+438 <[^>]*> eee1ea10 vmsr fpscr, lr +0+43c <[^>]*> e1a00000 nop ; \(mov r0, r0\) +0+440 <[^>]*> e1a00000 nop ; \(mov r0, r0\) Index: testsuite/gas/arm/vfp1xD.s =================================================================== RCS file: /cvs/src/src/gas/testsuite/gas/arm/vfp1xD.s,v retrieving revision 1.2 diff -u -r1.2 vfp1xD.s --- testsuite/gas/arm/vfp1xD.s 26 Jun 2007 21:36:37 -0000 1.2 +++ testsuite/gas/arm/vfp1xD.s 12 Nov 2009 21:45:54 -0000 @@ -349,5 +349,37 @@ fmxr mvfr1, r0 fmxr c12, r0 + @ ARM VMSR/VMRS instructions + vmrs r0, FPSCR + vmrs r1, FPSCR + vmrs r2, FPSCR + vmrs r3, FPSCR + vmrs r4, FPSCR + vmrs r5, FPSCR + vmrs r6, FPSCR + vmrs r7, FPSCR + vmrs r8, FPSCR + vmrs r9, FPSCR + vmrs r10, FPSCR + vmrs r11, FPSCR + vmrs r12, FPSCR + vmrs r14, FPSCR + vmrs APSR_nzcv, FPSCR + + vmsr FPSCR, r0 + vmsr FPSCR, r1 + vmsr FPSCR, r2 + vmsr FPSCR, r3 + vmsr FPSCR, r4 + vmsr FPSCR, r5 + vmsr FPSCR, r6 + vmsr FPSCR, r7 + vmsr FPSCR, r8 + vmsr FPSCR, r9 + vmsr FPSCR, r10 + vmsr FPSCR, r11 + vmsr FPSCR, r12 + vmsr FPSCR, r14 + nop nop