Skip to content

Commit 1356c19

Browse files
ctmarinasRussell King
authored andcommitted
[ARM] 3473/1: Use numbers 0-15 for the VFP double registers
Patch from Catalin Marinas This patch changes the double registers numbering to 0-15 from even 0-30, in preparation for future VFP extensions. It also fixes the VFP_REG_ZERO bug (value 16 actually represents the 8th double register with the original numbering). The original mcrr/mrrc on CP10 were generating FMRRS/FMSRR instead of FMRRD/FMDRR. The patch changes to CP11 for the correct instructions. Signed-off-by: Catalin Marinas <[email protected]> Signed-off-by: Russell King <[email protected]>
1 parent bb54a33 commit 1356c19

File tree

3 files changed

+11
-17
lines changed

3 files changed

+11
-17
lines changed

arch/arm/vfp/vfpdouble.c

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1127,9 +1127,9 @@ u32 vfp_double_cpdo(u32 inst, u32 fpscr)
11271127
{
11281128
u32 op = inst & FOP_MASK;
11291129
u32 exceptions = 0;
1130-
unsigned int dd = vfp_get_sd(inst);
1131-
unsigned int dn = vfp_get_sn(inst);
1132-
unsigned int dm = vfp_get_sm(inst);
1130+
unsigned int dd = vfp_get_dd(inst);
1131+
unsigned int dn = vfp_get_dn(inst);
1132+
unsigned int dm = vfp_get_dm(inst);
11331133
unsigned int vecitr, veclen, vecstride;
11341134
u32 (*fop)(int, int, s32, u32);
11351135

@@ -1146,25 +1146,21 @@ u32 vfp_double_cpdo(u32 inst, u32 fpscr)
11461146
pr_debug("VFP: vecstride=%u veclen=%u\n", vecstride,
11471147
(veclen >> FPSCR_LENGTH_BIT) + 1);
11481148

1149-
fop = (op == FOP_EXT) ? fop_extfns[dn] : fop_fns[FOP_TO_IDX(op)];
1149+
fop = (op == FOP_EXT) ? fop_extfns[FEXT_TO_IDX(inst)] : fop_fns[FOP_TO_IDX(op)];
11501150
if (!fop)
11511151
goto invalid;
11521152

11531153
for (vecitr = 0; vecitr <= veclen; vecitr += 1 << FPSCR_LENGTH_BIT) {
11541154
u32 except;
11551155

11561156
if (op == FOP_EXT)
1157-
pr_debug("VFP: itr%d (d%u.%u) = op[%u] (d%u.%u)\n",
1157+
pr_debug("VFP: itr%d (d%u) = op[%u] (d%u)\n",
11581158
vecitr >> FPSCR_LENGTH_BIT,
1159-
dd >> 1, dd & 1, dn,
1160-
dm >> 1, dm & 1);
1159+
dd, dn, dm);
11611160
else
1162-
pr_debug("VFP: itr%d (d%u.%u) = (d%u.%u) op[%u] (d%u.%u)\n",
1161+
pr_debug("VFP: itr%d (d%u) = (d%u) op[%u] (d%u)\n",
11631162
vecitr >> FPSCR_LENGTH_BIT,
1164-
dd >> 1, dd & 1,
1165-
dn >> 1, dn & 1,
1166-
FOP_TO_IDX(op),
1167-
dm >> 1, dm & 1);
1163+
dd, dn, FOP_TO_IDX(op), dm);
11681164

11691165
except = fop(dd, dn, dm, fpscr);
11701166
pr_debug("VFP: itr%d: exceptions=%08x\n",

arch/arm/vfp/vfphw.S

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -189,11 +189,10 @@ vfp_put_float:
189189

190190
.globl vfp_get_double
191191
vfp_get_double:
192-
mov r0, r0, lsr #1
193192
add pc, pc, r0, lsl #3
194193
mov r0, r0
195194
.irp dr,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
196-
mrrc p10, 1, r0, r1, c\dr @ fmrrd r0, r1, d\dr
195+
mrrc p11, 1, r0, r1, c\dr @ fmrrd r0, r1, d\dr
197196
mov pc, lr
198197
.endr
199198

@@ -204,10 +203,9 @@ vfp_get_double:
204203

205204
.globl vfp_put_double
206205
vfp_put_double:
207-
mov r0, r0, lsr #1
208206
add pc, pc, r0, lsl #3
209207
mov r0, r0
210208
.irp dr,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
211-
mcrr p10, 1, r1, r2, c\dr @ fmrrd r1, r2, d\dr
209+
mcrr p11, 1, r1, r2, c\dr @ fmdrr r1, r2, d\dr
212210
mov pc, lr
213211
.endr

arch/arm/vfp/vfpsingle.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1193,7 +1193,7 @@ u32 vfp_single_cpdo(u32 inst, u32 fpscr)
11931193
pr_debug("VFP: vecstride=%u veclen=%u\n", vecstride,
11941194
(veclen >> FPSCR_LENGTH_BIT) + 1);
11951195

1196-
fop = (op == FOP_EXT) ? fop_extfns[sn] : fop_fns[FOP_TO_IDX(op)];
1196+
fop = (op == FOP_EXT) ? fop_extfns[FEXT_TO_IDX(inst)] : fop_fns[FOP_TO_IDX(op)];
11971197
if (!fop)
11981198
goto invalid;
11991199

0 commit comments

Comments
 (0)