Skip to content

Commit a38c8df

Browse files
benshi001cherrymui
authored andcommitted
cmd/internal/obj/arm: fix MOVW to/from FPSR
"MOVW FPSR, g" should be assembled to 0xeef1aa10, but actually 0xee30a110 (RFS). "MOVW g, FPSR" should be 0xeee1aa10, but actually 0xee20a110 (WFS). They should be updated to VFP forms, since the ARM back end doesn't support non-VFP floating points. The patch fixes them and adds more assembly encoding tests. fixes #20643 Change-Id: I3b29490337c6e8d891b400fcedc8b0a87b82b527 Reviewed-on: https://go-review.googlesource.com/45276 Run-TryBot: Cherry Zhang <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: Cherry Zhang <[email protected]>
1 parent 7a8f1e2 commit a38c8df

File tree

4 files changed

+98
-19
lines changed

4 files changed

+98
-19
lines changed

src/cmd/asm/internal/asm/testdata/arm.s

Lines changed: 87 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1109,45 +1109,117 @@ jmp_label_3:
11091109
MVN $0xffffffae, R5 // MVN $4294967214, R5 // 51b0e0e30b50e0e1
11101110
MVN.S $0xffffffae, R5 // MVN.S $4294967214, R5 // 51b0e0e30b50f0e1
11111111

1112+
// MOVM
1113+
MOVM.IA [R0,R2,R4,R6], (R1) // MOVM.U [R0,R2,R4,R6], (R1) // 550081e8
1114+
MOVM.IA [R0-R4,R6,R8,R9-R11], (R1) // MOVM.U [R0,R1,R2,R3,R4,R6,R8,R9,g,R11], (R1) // 5f0f81e8
1115+
MOVM.IA.W [R0,R2,R4,R6], (R1) // MOVM.W.U [R0,R2,R4,R6], (R1) // 5500a1e8
1116+
MOVM.IA.W [R0-R4,R6,R8,R9-R11], (R1) // MOVM.W.U [R0,R1,R2,R3,R4,R6,R8,R9,g,R11], (R1) // 5f0fa1e8
1117+
MOVM.IA (R1), [R0,R2,R4,R6] // MOVM.U (R1), [R0,R2,R4,R6] // 550091e8
1118+
MOVM.IA (R1), [R0-R4,R6,R8,R9-R11] // MOVM.U (R1), [R0,R1,R2,R3,R4,R6,R8,R9,g,R11] // 5f0f91e8
1119+
MOVM.IA.W (R1), [R0,R2,R4,R6] // MOVM.W.U (R1), [R0,R2,R4,R6] // 5500b1e8
1120+
MOVM.IA.W (R1), [R0-R4,R6,R8,R9-R11] // MOVM.W.U (R1), [R0,R1,R2,R3,R4,R6,R8,R9,g,R11] // 5f0fb1e8
1121+
MOVM.DA [R0,R2,R4,R6], (R1) // MOVM [R0,R2,R4,R6], (R1) // 550001e8
1122+
MOVM.DA [R0-R4,R6,R8,R9-R11], (R1) // MOVM [R0,R1,R2,R3,R4,R6,R8,R9,g,R11], (R1) // 5f0f01e8
1123+
MOVM.DA.W [R0,R2,R4,R6], (R1) // MOVM.W [R0,R2,R4,R6], (R1) // 550021e8
1124+
MOVM.DA.W [R0-R4,R6,R8,R9-R11], (R1) // MOVM.W [R0,R1,R2,R3,R4,R6,R8,R9,g,R11], (R1) // 5f0f21e8
1125+
MOVM.DA (R1), [R0,R2,R4,R6] // MOVM (R1), [R0,R2,R4,R6] // 550011e8
1126+
MOVM.DA (R1), [R0-R4,R6,R8,R9-R11] // MOVM (R1), [R0,R1,R2,R3,R4,R6,R8,R9,g,R11] // 5f0f11e8
1127+
MOVM.DA.W (R1), [R0,R2,R4,R6] // MOVM.W (R1), [R0,R2,R4,R6] // 550031e8
1128+
MOVM.DA.W (R1), [R0-R4,R6,R8,R9-R11] // MOVM.W (R1), [R0,R1,R2,R3,R4,R6,R8,R9,g,R11] // 5f0f31e8
1129+
MOVM.DB [R0,R2,R4,R6], (R1) // MOVM.P [R0,R2,R4,R6], (R1) // 550001e9
1130+
MOVM.DB [R0-R4,R6,R8,R9-R11], (R1) // MOVM.P [R0,R1,R2,R3,R4,R6,R8,R9,g,R11], (R1) // 5f0f01e9
1131+
MOVM.DB.W [R0,R2,R4,R6], (R1) // MOVM.P.W [R0,R2,R4,R6], (R1) // 550021e9
1132+
MOVM.DB.W [R0-R4,R6,R8,R9-R11], (R1) // MOVM.P.W [R0,R1,R2,R3,R4,R6,R8,R9,g,R11], (R1) // 5f0f21e9
1133+
MOVM.DB (R1), [R0,R2,R4,R6] // MOVM.P (R1), [R0,R2,R4,R6] // 550011e9
1134+
MOVM.DB (R1), [R0-R4,R6,R8,R9-R11] // MOVM.P (R1), [R0,R1,R2,R3,R4,R6,R8,R9,g,R11] // 5f0f11e9
1135+
MOVM.DB.W (R1), [R0,R2,R4,R6] // MOVM.P.W (R1), [R0,R2,R4,R6] // 550031e9
1136+
MOVM.DB.W (R1), [R0-R4,R6,R8,R9-R11] // MOVM.P.W (R1), [R0,R1,R2,R3,R4,R6,R8,R9,g,R11] // 5f0f31e9
1137+
MOVM.IB [R0,R2,R4,R6], (g) // MOVM.P.U [R0,R2,R4,R6], (g) // 55008ae9
1138+
MOVM.IB [R0-R4,R6,R8,R9-R11], (g) // MOVM.P.U [R0,R1,R2,R3,R4,R6,R8,R9,g,R11], (g) // 5f0f8ae9
1139+
MOVM.IB.W [R0,R2,R4,R6], (g) // MOVM.P.W.U [R0,R2,R4,R6], (g) // 5500aae9
1140+
MOVM.IB.W [R0-R4,R6,R8,R9-R11], (g) // MOVM.P.W.U [R0,R1,R2,R3,R4,R6,R8,R9,g,R11], (g) // 5f0faae9
1141+
MOVM.IB (g), [R0,R2,R4,R6] // MOVM.P.U (g), [R0,R2,R4,R6] // 55009ae9
1142+
MOVM.IB (g), [R0-R4,R6,R8,R9-R11] // MOVM.P.U (g), [R0,R1,R2,R3,R4,R6,R8,R9,g,R11] // 5f0f9ae9
1143+
MOVM.IB.W (g), [R0,R2,R4,R6] // MOVM.P.W.U (g), [R0,R2,R4,R6] // 5500bae9
1144+
MOVM.IB.W (g), [R0-R4,R6,R8,R9-R11] // MOVM.P.W.U (g), [R0,R1,R2,R3,R4,R6,R8,R9,g,R11] // 5f0fbae9
1145+
11121146
// MOVW
11131147
mov_label_0:
1114-
MOVW R3, R4 // MOVW R3, R4 // 0340a0e1
1115-
MOVW R9, R2 // MOVW R9, R2 // 0920a0e1
1148+
MOVW R3, R4 // 0340a0e1
1149+
MOVW R9, R2 // 0920a0e1
11161150
MOVW $0xff, R9 // MOVW $255, R9 // ff90a0e3
11171151
MOVW $0xff000000, R9 // MOVW $4278190080, R9 // ff94a0e3
11181152
MOVW $0xff(R0), R1 // MOVW $255(R0), R1 // ff1080e2
11191153
MOVW $-0xff(R0), R1 // MOVW $-255(R0), R1 // ff1040e2
11201154
MOVW $0xffffffae, R1 // MOVW $4294967214, R1 // 5110e0e3
11211155
MOVW $0xaaaaaaaa, R1 // MOVW $2863311530, R1
1122-
MOVW $mov_label_0(SB), R2 // MOVW $mov_label_0(SB), R2
1123-
MOVW R1, (R2) // MOVW R1, (R2) // 001082e5
1124-
MOVW.P R1, (R2) // MOVW.P R1, (R2) // 001082e4
1125-
MOVW.W R1, (R2) // MOVW.W R1, (R2) // 0010a2e5
1156+
MOVW $mov_label_0(SB), R2
1157+
MOVW R1, (R2) // 001082e5
1158+
MOVW.P R1, (R2) // 001082e4
1159+
MOVW.W R1, (R2) // 0010a2e5
11261160
MOVW R1, 0x20(R2) // MOVW R1, 32(R2) // 201082e5
11271161
MOVW.P R1, 0x20(R2) // MOVW.P R1, 32(R2) // 201082e4
11281162
MOVW.W R1, 0x20(R2) // MOVW.W R1, 32(R2) // 2010a2e5
11291163
MOVW R1, -0x20(R2) // MOVW R1, -32(R2) // 201002e5
11301164
MOVW.P R1, -0x20(R2) // MOVW.P R1, -32(R2) // 201002e4
11311165
MOVW.W R1, -0x20(R2) // MOVW.W R1, -32(R2) // 201022e5
1132-
MOVW R1, mov_label_0(SB) // MOVW R1, mov_label_0(SB)
1133-
MOVW (R2), R1 // MOVW (R2), R1 // 001092e5
1134-
MOVW.P (R2), R1 // MOVW.P (R2), R1 // 001092e4
1135-
MOVW.W (R2), R1 // MOVW.W (R2), R1 // 0010b2e5
1166+
MOVW R1, mov_label_0(SB)
1167+
MOVW (R2), R1 // 001092e5
1168+
MOVW.P (R2), R1 // 001092e4
1169+
MOVW.W (R2), R1 // 0010b2e5
11361170
MOVW 0x20(R2), R1 // MOVW 32(R2), R1 // 201092e5
11371171
MOVW.P 0x20(R2), R1 // MOVW.P 32(R2), R1 // 201092e4
11381172
MOVW.W 0x20(R2), R1 // MOVW.W 32(R2), R1 // 2010b2e5
11391173
MOVW -0x20(R2), R1 // MOVW -32(R2), R1 // 201012e5
11401174
MOVW.P -0x20(R2), R1 // MOVW.P -32(R2), R1 // 201012e4
11411175
MOVW.W -0x20(R2), R1 // MOVW.W -32(R2), R1 // 201032e5
1142-
MOVW mov_label_0(SB), R1 // MOVW mov_label_0(SB), R1
1176+
MOVW mov_label_0(SB), R1
11431177
MOVW R1, 0x00ffffff(R2) // MOVW R1, 16777215(R2)
1144-
MOVW R1, foo(SB) // MOVW R1, foo(SB)
1178+
MOVW R1, foo(SB)
11451179
MOVW 0x00ffffff(R2), R1 // MOVW 16777215(R2), R1
1146-
MOVW foo(SB), R1 // MOVW foo(SB), R1
1147-
MOVW CPSR, R1 // MOVW CPSR, R1 // 00100fe1
1148-
MOVW R1, CPSR // MOVW R1, CPSR // 01f02ce1
1180+
MOVW foo(SB), R1
1181+
MOVW CPSR, R1 // 00100fe1
1182+
MOVW R1, CPSR // 01f02ce1
11491183
MOVW $0xff, CPSR // MOVW $255, CPSR // fff02ce3
11501184
MOVW $0xff000000, CPSR // MOVW $4278190080, CPSR // fff42ce3
1185+
MOVW FPSR, R9 // 109af1ee
1186+
MOVW FPSR, g // 10aaf1ee
1187+
MOVW R9, FPSR // 109ae1ee
1188+
MOVW g, FPSR // 10aae1ee
1189+
MOVW R0>>28(R1), R2 // 202e91e7
1190+
MOVW R0<<28(R1), R2 // 002e91e7
1191+
MOVW R0->28(R1), R2 // 402e91e7
1192+
MOVW R0@>28(R1), R2 // 602e91e7
1193+
MOVW.U R0>>28(R1), R2 // 202e11e7
1194+
MOVW.U R0<<28(R1), R2 // 002e11e7
1195+
MOVW.U R0->28(R1), R2 // 402e11e7
1196+
MOVW.U R0@>28(R1), R2 // 602e11e7
1197+
MOVW.W R0>>28(R1), R2 // 202eb1e7
1198+
MOVW.W R0<<28(R1), R2 // 002eb1e7
1199+
MOVW.W R0->28(R1), R2 // 402eb1e7
1200+
MOVW.W R0@>28(R1), R2 // 602eb1e7
1201+
MOVW.P R0>>28(g), R2 // 202e9ae6
1202+
MOVW.P R0<<28(g), R2 // 002e9ae6
1203+
MOVW.P R0->28(g), R2 // 402e9ae6
1204+
MOVW.P R0@>28(g), R2 // 602e9ae6
1205+
MOVW R2, R0>>28(R1) // 202e81e7
1206+
MOVW R2, R0<<28(R1) // 002e81e7
1207+
MOVW R2, R0->28(R1) // 402e81e7
1208+
MOVW R2, R0@>28(R1) // 602e81e7
1209+
MOVW.U R2, R0>>28(R1) // 202e01e7
1210+
MOVW.U R2, R0<<28(R1) // 002e01e7
1211+
MOVW.U R2, R0->28(R1) // 402e01e7
1212+
MOVW.U R2, R0@>28(R1) // 602e01e7
1213+
MOVW.W R2, R0>>28(R1) // 202ea1e7
1214+
MOVW.W R2, R0<<28(R1) // 002ea1e7
1215+
MOVW.W R2, R0->28(R1) // 402ea1e7
1216+
MOVW.W R2, R0@>28(R1) // 602ea1e7
1217+
MOVW.P R2, R0>>28(R5) // 202e85e6
1218+
MOVW.P R2, R0<<28(R5) // 002e85e6
1219+
MOVW.P R2, R0->28(R5) // 402e85e6
1220+
MOVW.P R2, R0@>28(R5) // 602e85e6
1221+
MOVW R0, math·Exp(SB) // MOVW R0, math.Exp(SB)
1222+
MOVW math·Exp(SB), R0 // MOVW math.Exp(SB), R0
11511223

11521224
//
11531225
// END

src/cmd/asm/internal/asm/testdata/armerror.s

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,9 @@ TEXT errors(SB),$0
1919
MOVD F0, F1, F2 // ERROR "illegal combination"
2020
MOVDF F0, F1, F2 // ERROR "illegal combination"
2121
MOVFD F0, F1, F2 // ERROR "illegal combination"
22+
MOVM.IA 4(R1), [R0-R4] // ERROR "offset must be zero"
23+
MOVM.DA 4(R1), [R0-R4] // ERROR "offset must be zero"
24+
MOVM.IB 4(R1), [R0-R4] // ERROR "offset must be zero"
25+
MOVM.DB 4(R1), [R0-R4] // ERROR "offset must be zero"
2226

2327
END

src/cmd/asm/internal/asm/testdata/armv6.s

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,7 @@ TEXT foo(SB), DUPOK|NOSPLIT, $0
4141
CMPF.VS F7 // c07ab56e10faf16e
4242
CMPD F6 // c06bb5ee10faf1ee
4343

44+
MOVW R4, F8 // 104b08ee
45+
MOVW F4, R8 // 108b14ee
46+
4447
END

src/cmd/internal/obj/arm/asm5.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2201,14 +2201,14 @@ func (c *ctxt5) asmout(p *obj.Prog, o *Optab, out []uint32) {
22012201
o1 |= (uint32(rf)&15)<<0 | (uint32(rt)&15)<<12
22022202

22032203
case 56: /* move to FP[CS]R */
2204-
o1 = ((uint32(p.Scond)&C_SCOND)^C_SCOND_XOR)<<28 | 0xe<<24 | 1<<8 | 1<<4
2204+
o1 = ((uint32(p.Scond)&C_SCOND)^C_SCOND_XOR)<<28 | 0xee1<<16 | 0xa1<<4
22052205

2206-
o1 |= ((uint32(p.To.Reg)&1)+1)<<21 | (uint32(p.From.Reg)&15)<<12
2206+
o1 |= (uint32(p.From.Reg) & 15) << 12
22072207

22082208
case 57: /* move from FP[CS]R */
2209-
o1 = ((uint32(p.Scond)&C_SCOND)^C_SCOND_XOR)<<28 | 0xe<<24 | 1<<8 | 1<<4
2209+
o1 = ((uint32(p.Scond)&C_SCOND)^C_SCOND_XOR)<<28 | 0xef1<<16 | 0xa1<<4
22102210

2211-
o1 |= ((uint32(p.From.Reg)&1)+1)<<21 | (uint32(p.To.Reg)&15)<<12 | 1<<20
2211+
o1 |= (uint32(p.To.Reg) & 15) << 12
22122212

22132213
case 58: /* movbu R,R */
22142214
o1 = c.oprrr(p, AAND, int(p.Scond))

0 commit comments

Comments
 (0)