diff options
author | Ben Shi <powerman1st@163.com> | 2017-06-16 11:19:01 +0000 |
---|---|---|
committer | Cherry Zhang <cherryyz@google.com> | 2017-06-23 14:29:57 +0000 |
commit | e00a38c89a4e0afa985072bdffe5dd30de7eccda (patch) | |
tree | eb1750d701b8d2ce9bb959a32411af48cf391122 | |
parent | 856fd8f50e0ccc7b43a0d4846f4c3de9f53a4e9a (diff) | |
download | go-e00a38c89a4e0afa985072bdffe5dd30de7eccda.tar.gz go-e00a38c89a4e0afa985072bdffe5dd30de7eccda.zip |
cmd/internal/obj/arm: fix setting U bit in shifted register offset of MOVBS
"MOVBS.U R0<<0(R1), R2" is assembled to 0xe19120d0 (ldrsb r2, [r1, r0]),
but it is expected to be 0xe11120d0 (ldrsb r2, [r1, -r0]).
This patch fixes it and adds more encoding tests.
fixes #20701
Change-Id: Ic1fb46438d71a978dbef06d97494a70c95fcbf3a
Reviewed-on: https://go-review.googlesource.com/45996
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
-rw-r--r-- | src/cmd/asm/internal/asm/testdata/arm.s | 282 | ||||
-rw-r--r-- | src/cmd/asm/internal/asm/testdata/armerror.s | 75 | ||||
-rw-r--r-- | src/cmd/asm/internal/asm/testdata/armv6.s | 43 | ||||
-rw-r--r-- | src/cmd/internal/obj/arm/asm5.go | 5 |
4 files changed, 398 insertions, 7 deletions
diff --git a/src/cmd/asm/internal/asm/testdata/arm.s b/src/cmd/asm/internal/asm/testdata/arm.s index e1a75480d1..e5ad86cdc2 100644 --- a/src/cmd/asm/internal/asm/testdata/arm.s +++ b/src/cmd/asm/internal/asm/testdata/arm.s @@ -1144,7 +1144,6 @@ jmp_label_3: 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 // MOVW -mov_label_0: MOVW R3, R4 // 0340a0e1 MOVW R9, R2 // 0920a0e1 MOVW $0xff, R9 // MOVW $255, R9 // ff90a0e3 @@ -1153,7 +1152,6 @@ mov_label_0: MOVW $-0xff(R0), R1 // MOVW $-255(R0), R1 // ff1040e2 MOVW $0xffffffae, R1 // MOVW $4294967214, R1 // 5110e0e3 MOVW $0xaaaaaaaa, R1 // MOVW $2863311530, R1 - MOVW $mov_label_0(SB), R2 MOVW R1, (R2) // 001082e5 MOVW.P R1, (R2) // 001082e4 MOVW.W R1, (R2) // 0010a2e5 @@ -1163,7 +1161,6 @@ mov_label_0: MOVW R1, -0x20(R2) // MOVW R1, -32(R2) // 201002e5 MOVW.P R1, -0x20(R2) // MOVW.P R1, -32(R2) // 201002e4 MOVW.W R1, -0x20(R2) // MOVW.W R1, -32(R2) // 201022e5 - MOVW R1, mov_label_0(SB) MOVW (R2), R1 // 001092e5 MOVW.P (R2), R1 // 001092e4 MOVW.W (R2), R1 // 0010b2e5 @@ -1173,11 +1170,8 @@ mov_label_0: MOVW -0x20(R2), R1 // MOVW -32(R2), R1 // 201012e5 MOVW.P -0x20(R2), R1 // MOVW.P -32(R2), R1 // 201012e4 MOVW.W -0x20(R2), R1 // MOVW.W -32(R2), R1 // 201032e5 - MOVW mov_label_0(SB), R1 MOVW R1, 0x00ffffff(R2) // MOVW R1, 16777215(R2) - MOVW R1, foo(SB) MOVW 0x00ffffff(R2), R1 // MOVW 16777215(R2), R1 - MOVW foo(SB), R1 MOVW CPSR, R1 // 00100fe1 MOVW R1, CPSR // 01f02ce1 MOVW $0xff, CPSR // MOVW $255, CPSR // fff02ce3 @@ -1221,6 +1215,282 @@ mov_label_0: MOVW R0, math·Exp(SB) // MOVW R0, math.Exp(SB) MOVW math·Exp(SB), R0 // MOVW math.Exp(SB), R0 +// MOVB + MOVB R3, R4 // 0340a0e1 + MOVB R9, R2 // 0920a0e1 + MOVBU R0, R1 // ff1000e2 + MOVBS R5, R6 // 056ca0e1466ca0e1 + MOVB R1, (R2) // 0010c2e5 + MOVB.P R1, (R2) // 0010c2e4 + MOVB.W R1, (R2) // 0010e2e5 + MOVB R1, 0x20(R2) // MOVB R1, 32(R2) // 2010c2e5 + MOVB.P R1, 0x20(R2) // MOVB.P R1, 32(R2) // 2010c2e4 + MOVB.W R1, 0x20(R2) // MOVB.W R1, 32(R2) // 2010e2e5 + MOVB R1, -0x20(R2) // MOVB R1, -32(R2) // 201042e5 + MOVB.P R1, -0x20(R2) // MOVB.P R1, -32(R2) // 201042e4 + MOVB.W R1, -0x20(R2) // MOVB.W R1, -32(R2) // 201062e5 + MOVBS R1, (R2) // 0010c2e5 + MOVBS.P R1, (R2) // 0010c2e4 + MOVBS.W R1, (R2) // 0010e2e5 + MOVBS R1, 0x20(R2) // MOVBS R1, 32(R2) // 2010c2e5 + MOVBS.P R1, 0x20(R2) // MOVBS.P R1, 32(R2) // 2010c2e4 + MOVBS.W R1, 0x20(R2) // MOVBS.W R1, 32(R2) // 2010e2e5 + MOVBS R1, -0x20(R2) // MOVBS R1, -32(R2) // 201042e5 + MOVBS.P R1, -0x20(R2) // MOVBS.P R1, -32(R2) // 201042e4 + MOVBS.W R1, -0x20(R2) // MOVBS.W R1, -32(R2) // 201062e5 + MOVBU R1, (R2) // 0010c2e5 + MOVBU.P R1, (R2) // 0010c2e4 + MOVBU.W R1, (R2) // 0010e2e5 + MOVBU R1, 0x20(R2) // MOVBU R1, 32(R2) // 2010c2e5 + MOVBU.P R1, 0x20(R2) // MOVBU.P R1, 32(R2) // 2010c2e4 + MOVBU.W R1, 0x20(R2) // MOVBU.W R1, 32(R2) // 2010e2e5 + MOVBU R1, -0x20(R2) // MOVBU R1, -32(R2) // 201042e5 + MOVBU.P R1, -0x20(R2) // MOVBU.P R1, -32(R2) // 201042e4 + MOVBU.W R1, -0x20(R2) // MOVBU.W R1, -32(R2) // 201062e5 + MOVB (R2), R1 // d010d2e1 + MOVB.P (R2), R1 // d010d2e0 + MOVB.W (R2), R1 // d010f2e1 + MOVB 0x20(R2), R1 // MOVB 32(R2), R1 // d012d2e1 + MOVB.P 0x20(R2), R1 // MOVB.P 32(R2), R1 // d012d2e0 + MOVB.W 0x20(R2), R1 // MOVB.W 32(R2), R1 // d012f2e1 + MOVB -0x20(R2), R1 // MOVB -32(R2), R1 // d01252e1 + MOVB.P -0x20(R2), R1 // MOVB.P -32(R2), R1 // d01252e0 + MOVB.W -0x20(R2), R1 // MOVB.W -32(R2), R1 // d01272e1 + MOVBS (R2), R1 // d010d2e1 + MOVBS.P (R2), R1 // d010d2e0 + MOVBS.W (R2), R1 // d010f2e1 + MOVBS 0x20(R2), R1 // MOVBS 32(R2), R1 // d012d2e1 + MOVBS.P 0x20(R2), R1 // MOVBS.P 32(R2), R1 // d012d2e0 + MOVBS.W 0x20(R2), R1 // MOVBS.W 32(R2), R1 // d012f2e1 + MOVBS -0x20(R2), R1 // MOVBS -32(R2), R1 // d01252e1 + MOVBS.P -0x20(R2), R1 // MOVBS.P -32(R2), R1 // d01252e0 + MOVBS.W -0x20(R2), R1 // MOVBS.W -32(R2), R1 // d01272e1 + MOVBU (R2), R1 // 0010d2e5 + MOVBU.P (R2), R1 // 0010d2e4 + MOVBU.W (R2), R1 // 0010f2e5 + MOVBU 0x20(R2), R1 // MOVBU 32(R2), R1 // 2010d2e5 + MOVBU.P 0x20(R2), R1 // MOVBU.P 32(R2), R1 // 2010d2e4 + MOVBU.W 0x20(R2), R1 // MOVBU.W 32(R2), R1 // 2010f2e5 + MOVBU -0x20(R2), R1 // MOVBU -32(R2), R1 // 201052e5 + MOVBU.P -0x20(R2), R1 // MOVBU.P -32(R2), R1 // 201052e4 + MOVBU.W -0x20(R2), R1 // MOVBU.W -32(R2), R1 // 201072e5 + MOVB R1, 0x00ffffff(R2) // MOVB R1, 16777215(R2) + MOVB.W R1, 0x00ffffff(R2) // MOVB.W R1, 16777215(R2) + MOVB.P R1, 0x00ffffff(R2) // MOVB.P R1, 16777215(R2) + MOVB R1, -0x00ffffff(R2) // MOVB R1, -16777215(R2) + MOVB.W R1, -0x00ffffff(R2) // MOVB.W R1, -16777215(R2) + MOVB.P R1, -0x00ffffff(R2) // MOVB.P R1, -16777215(R2) + MOVB 0x00ffffff(R2), R1 // MOVB 16777215(R2), R1 + MOVB.P 0x00ffffff(R2), R1 // MOVB.P 16777215(R2), R1 + MOVB.W 0x00ffffff(R2), R1 // MOVB.W 16777215(R2), R1 + MOVB -0x00ffffff(R2), R1 // MOVB -16777215(R2), R1 + MOVB.P -0x00ffffff(R2), R1 // MOVB.P -16777215(R2), R1 + MOVB.W -0x00ffffff(R2), R1 // MOVB.W -16777215(R2), R1 + MOVBS R1, 0x00ffffff(R2) // MOVBS R1, 16777215(R2) + MOVBS.W R1, 0x00ffffff(R2) // MOVBS.W R1, 16777215(R2) + MOVBS.P R1, 0x00ffffff(R2) // MOVBS.P R1, 16777215(R2) + MOVBS R1, -0x00ffffff(R2) // MOVBS R1, -16777215(R2) + MOVBS.W R1, -0x00ffffff(R2) // MOVBS.W R1, -16777215(R2) + MOVBS.P R1, -0x00ffffff(R2) // MOVBS.P R1, -16777215(R2) + MOVBS 0x00ffffff(R2), R1 // MOVBS 16777215(R2), R1 + MOVBS.P 0x00ffffff(R2), R1 // MOVBS.P 16777215(R2), R1 + MOVBS.W 0x00ffffff(R2), R1 // MOVBS.W 16777215(R2), R1 + MOVBS -0x00ffffff(R2), R1 // MOVBS -16777215(R2), R1 + MOVBS.P -0x00ffffff(R2), R1 // MOVBS.P -16777215(R2), R1 + MOVBS.W -0x00ffffff(R2), R1 // MOVBS.W -16777215(R2), R1 + MOVBU R1, 0x00ffffff(R2) // MOVBU R1, 16777215(R2) + MOVBU.W R1, 0x00ffffff(R2) // MOVBU.W R1, 16777215(R2) + MOVBU.P R1, 0x00ffffff(R2) // MOVBU.P R1, 16777215(R2) + MOVBU R1, -0x00ffffff(R2) // MOVBU R1, -16777215(R2) + MOVBU.W R1, -0x00ffffff(R2) // MOVBU.W R1, -16777215(R2) + MOVBU.P R1, -0x00ffffff(R2) // MOVBU.P R1, -16777215(R2) + MOVBU 0x00ffffff(R2), R1 // MOVBU 16777215(R2), R1 + MOVBU.P 0x00ffffff(R2), R1 // MOVBU.P 16777215(R2), R1 + MOVBU.W 0x00ffffff(R2), R1 // MOVBU.W 16777215(R2), R1 + MOVBU -0x00ffffff(R2), R1 // MOVBU -16777215(R2), R1 + MOVBU.P -0x00ffffff(R2), R1 // MOVBU.P -16777215(R2), R1 + MOVBU.W -0x00ffffff(R2), R1 // MOVBU.W -16777215(R2), R1 + MOVB R0, math·Exp(SB) // MOVB R0, math.Exp(SB) + MOVB math·Exp(SB), R0 // MOVB math.Exp(SB), R0 + MOVBS R0, math·Exp(SB) // MOVBS R0, math.Exp(SB) + MOVBS math·Exp(SB), R0 // MOVBS math.Exp(SB), R0 + MOVBU R0, math·Exp(SB) // MOVBU R0, math.Exp(SB) + MOVBU math·Exp(SB), R0 // MOVBU math.Exp(SB), R0 + MOVB R2, R0>>28(R1) // 202ec1e7 + MOVB R2, R0<<28(R1) // 002ec1e7 + MOVB R2, R0->28(R1) // 402ec1e7 + MOVB R2, R0@>28(R1) // 602ec1e7 + MOVB.U R2, R0>>28(R1) // 202e41e7 + MOVB.U R2, R0<<28(R1) // 002e41e7 + MOVB.U R2, R0->28(R1) // 402e41e7 + MOVB.U R2, R0@>28(R1) // 602e41e7 + MOVB.W R2, R0>>28(R1) // 202ee1e7 + MOVB.W R2, R0<<28(R1) // 002ee1e7 + MOVB.W R2, R0->28(R1) // 402ee1e7 + MOVB.W R2, R0@>28(R1) // 602ee1e7 + MOVB.P R2, R0>>28(R5) // 202ec5e6 + MOVB.P R2, R0<<28(R5) // 002ec5e6 + MOVB.P R2, R0->28(R5) // 402ec5e6 + MOVB.P R2, R0@>28(R5) // 602ec5e6 + MOVBS R2, R0>>28(R1) // 202ec1e7 + MOVBS R2, R0<<28(R1) // 002ec1e7 + MOVBS R2, R0->28(R1) // 402ec1e7 + MOVBS R2, R0@>28(R1) // 602ec1e7 + MOVBS.U R2, R0>>28(R1) // 202e41e7 + MOVBS.U R2, R0<<28(R1) // 002e41e7 + MOVBS.U R2, R0->28(R1) // 402e41e7 + MOVBS.U R2, R0@>28(R1) // 602e41e7 + MOVBS.W R2, R0>>28(R1) // 202ee1e7 + MOVBS.W R2, R0<<28(R1) // 002ee1e7 + MOVBS.W R2, R0->28(R1) // 402ee1e7 + MOVBS.W R2, R0@>28(R1) // 602ee1e7 + MOVBS.P R2, R0>>28(R5) // 202ec5e6 + MOVBS.P R2, R0<<28(R5) // 002ec5e6 + MOVBS.P R2, R0->28(R5) // 402ec5e6 + MOVBS.P R2, R0@>28(R5) // 602ec5e6 + MOVBU R2, R0>>28(R1) // 202ec1e7 + MOVBU R2, R0<<28(R1) // 002ec1e7 + MOVBU R2, R0->28(R1) // 402ec1e7 + MOVBU R2, R0@>28(R1) // 602ec1e7 + MOVBU.U R2, R0>>28(R1) // 202e41e7 + MOVBU.U R2, R0<<28(R1) // 002e41e7 + MOVBU.U R2, R0->28(R1) // 402e41e7 + MOVBU.U R2, R0@>28(R1) // 602e41e7 + MOVBU.W R2, R0>>28(R1) // 202ee1e7 + MOVBU.W R2, R0<<28(R1) // 002ee1e7 + MOVBU.W R2, R0->28(R1) // 402ee1e7 + MOVBU.W R2, R0@>28(R1) // 602ee1e7 + MOVBU.P R2, R0>>28(R5) // 202ec5e6 + MOVBU.P R2, R0<<28(R5) // 002ec5e6 + MOVBU.P R2, R0->28(R5) // 402ec5e6 + MOVBU.P R2, R0@>28(R5) // 602ec5e6 + MOVBU R0>>28(R1), R2 // 202ed1e7 + MOVBU R0<<28(R1), R2 // 002ed1e7 + MOVBU R0->28(R1), R2 // 402ed1e7 + MOVBU R0@>28(R1), R2 // 602ed1e7 + MOVBU.U R0>>28(R1), R2 // 202e51e7 + MOVBU.U R0<<28(R1), R2 // 002e51e7 + MOVBU.U R0->28(R1), R2 // 402e51e7 + MOVBU.U R0@>28(R1), R2 // 602e51e7 + MOVBU.W R0>>28(R1), R2 // 202ef1e7 + MOVBU.W R0<<28(R1), R2 // 002ef1e7 + MOVBU.W R0->28(R1), R2 // 402ef1e7 + MOVBU.W R0@>28(R1), R2 // 602ef1e7 + MOVBU.P R0>>28(g), R2 // 202edae6 + MOVBU.P R0<<28(g), R2 // 002edae6 + MOVBU.P R0->28(g), R2 // 402edae6 + MOVBU.P R0@>28(g), R2 // 602edae6 + MOVBS R0<<0(R1), R2 // d02091e1 + MOVBS.U R0<<0(R1), R2 // d02011e1 + MOVBS.W R0<<0(R1), R2 // d020b1e1 + MOVBS.P R0<<0(R1), R2 // d02091e0 + MOVB R0<<0(R1), R2 // d02091e1 + MOVB.U R0<<0(R1), R2 // d02011e1 + MOVB.W R0<<0(R1), R2 // d020b1e1 + MOVB.P R0<<0(R1), R2 // d02091e0 + +// MOVH + MOVH R3, R4 // 0340a0e1 + MOVH R9, R2 // 0920a0e1 + MOVHS R5, R6 // 0568a0e14668a0e1 + MOVHU R5, R6 // 0568a0e12668a0e1 + MOVH R4, (R3) // b040c3e1 + MOVHS.W R4, (R3) // b040e3e1 + MOVHS.P R4, (R3) // b040c3e0 + MOVHS R4, (R3) // b040c3e1 + MOVHS.W R4, (R3) // b040e3e1 + MOVHS.P R4, (R3) // b040c3e0 + MOVHU R4, (R3) // b040c3e1 + MOVHU.W R4, (R3) // b040e3e1 + MOVHU.P R4, (R3) // b040c3e0 + MOVH R3, 0x20(R4) // MOVH R3, 32(R4) // b032c4e1 + MOVH.W R3, 0x20(R4) // MOVH.W R3, 32(R4) // b032e4e1 + MOVH.P R3, 0x20(R4) // MOVH.P R3, 32(R4) // b032c4e0 + MOVHS R3, 0x20(R4) // MOVHS R3, 32(R4) // b032c4e1 + MOVHS.W R3, 0x20(R4) // MOVHS.W R3, 32(R4) // b032e4e1 + MOVHS.P R3, 0x20(R4) // MOVHS.P R3, 32(R4) // b032c4e0 + MOVHU R3, 0x20(R4) // MOVHU R3, 32(R4) // b032c4e1 + MOVHU.W R3, 0x20(R4) // MOVHU.W R3, 32(R4) // b032e4e1 + MOVHU.P R3, 0x20(R4) // MOVHU.P R3, 32(R4) // b032c4e0 + MOVH R3, -0x20(R4) // MOVH R3, -32(R4) // b03244e1 + MOVH.W R3, -0x20(R4) // MOVH.W R3, -32(R4) // b03264e1 + MOVH.P R3, -0x20(R4) // MOVH.P R3, -32(R4) // b03244e0 + MOVHS R3, -0x20(R4) // MOVHS R3, -32(R4) // b03244e1 + MOVHS.W R3, -0x20(R4) // MOVHS.W R3, -32(R4) // b03264e1 + MOVHS.P R3, -0x20(R4) // MOVHS.P R3, -32(R4) // b03244e0 + MOVHU R3, -0x20(R4) // MOVHU R3, -32(R4) // b03244e1 + MOVHU.W R3, -0x20(R4) // MOVHU.W R3, -32(R4) // b03264e1 + MOVHU.P R3, -0x20(R4) // MOVHU.P R3, -32(R4) // b03244e0 + MOVHU (R9), R8 // b080d9e1 + MOVHU.W (R9), R8 // b080f9e1 + MOVHU.P (R9), R8 // b080d9e0 + MOVH (R9), R8 // f080d9e1 + MOVH.W (R9), R8 // f080f9e1 + MOVH.P (R9), R8 // f080d9e0 + MOVHS (R9), R8 // f080d9e1 + MOVHS.W (R9), R8 // f080f9e1 + MOVHS.P (R9), R8 // f080d9e0 + MOVHU 0x22(R9), R8 // MOVHU 34(R9), R8 // b282d9e1 + MOVHU.W 0x22(R9), R8 // MOVHU.W 34(R9), R8 // b282f9e1 + MOVHU.P 0x22(R9), R8 // MOVHU.P 34(R9), R8 // b282d9e0 + MOVH 0x22(R9), R8 // MOVH 34(R9), R8 // f282d9e1 + MOVH.W 0x22(R9), R8 // MOVH.W 34(R9), R8 // f282f9e1 + MOVH.P 0x22(R9), R8 // MOVH.P 34(R9), R8 // f282d9e0 + MOVHS 0x22(R9), R8 // MOVHS 34(R9), R8 // f282d9e1 + MOVHS.W 0x22(R9), R8 // MOVHS.W 34(R9), R8 // f282f9e1 + MOVHS.P 0x22(R9), R8 // MOVHS.P 34(R9), R8 // f282d9e0 + MOVHU -0x24(R9), R8 // MOVHU -36(R9), R8 // b48259e1 + MOVHU.W -0x24(R9), R8 // MOVHU.W -36(R9), R8 // b48279e1 + MOVHU.P -0x24(R9), R8 // MOVHU.P -36(R9), R8 // b48259e0 + MOVH -0x24(R9), R8 // MOVH -36(R9), R8 // f48259e1 + MOVH.W -0x24(R9), R8 // MOVH.W -36(R9), R8 // f48279e1 + MOVH.P -0x24(R9), R8 // MOVH.P -36(R9), R8 // f48259e0 + MOVHS -0x24(R9), R8 // MOVHS -36(R9), R8 // f48259e1 + MOVHS.W -0x24(R9), R8 // MOVHS.W -36(R9), R8 // f48279e1 + MOVHS.P -0x24(R9), R8 // MOVHS.P -36(R9), R8 // f48259e0 + MOVH R1, 0x00ffffff(R2) // MOVH R1, 16777215(R2) + MOVH.W R1, 0x00ffffff(R2) // MOVH.W R1, 16777215(R2) + MOVH.P R1, 0x00ffffff(R2) // MOVH.P R1, 16777215(R2) + MOVH R1, -0x00ffffff(R2) // MOVH R1, -16777215(R2) + MOVH.W R1, -0x00ffffff(R2) // MOVH.W R1, -16777215(R2) + MOVH.P R1, -0x00ffffff(R2) // MOVH.P R1, -16777215(R2) + MOVH 0x00ffffff(R2), R1 // MOVH 16777215(R2), R1 + MOVH.P 0x00ffffff(R2), R1 // MOVH.P 16777215(R2), R1 + MOVH.W 0x00ffffff(R2), R1 // MOVH.W 16777215(R2), R1 + MOVH -0x00ffffff(R2), R1 // MOVH -16777215(R2), R1 + MOVH.P -0x00ffffff(R2), R1 // MOVH.P -16777215(R2), R1 + MOVH.W -0x00ffffff(R2), R1 // MOVH.W -16777215(R2), R1 + MOVHS R1, 0x00ffffff(R2) // MOVHS R1, 16777215(R2) + MOVHS.W R1, 0x00ffffff(R2) // MOVHS.W R1, 16777215(R2) + MOVHS.P R1, 0x00ffffff(R2) // MOVHS.P R1, 16777215(R2) + MOVHS R1, -0x00ffffff(R2) // MOVHS R1, -16777215(R2) + MOVHS.W R1, -0x00ffffff(R2) // MOVHS.W R1, -16777215(R2) + MOVHS.P R1, -0x00ffffff(R2) // MOVHS.P R1, -16777215(R2) + MOVHS 0x00ffffff(R2), R1 // MOVHS 16777215(R2), R1 + MOVHS.P 0x00ffffff(R2), R1 // MOVHS.P 16777215(R2), R1 + MOVHS.W 0x00ffffff(R2), R1 // MOVHS.W 16777215(R2), R1 + MOVHS -0x00ffffff(R2), R1 // MOVHS -16777215(R2), R1 + MOVHS.P -0x00ffffff(R2), R1 // MOVHS.P -16777215(R2), R1 + MOVHS.W -0x00ffffff(R2), R1 // MOVHS.W -16777215(R2), R1 + MOVHU R1, 0x00ffffff(R2) // MOVHU R1, 16777215(R2) + MOVHU.W R1, 0x00ffffff(R2) // MOVHU.W R1, 16777215(R2) + MOVHU.P R1, 0x00ffffff(R2) // MOVHU.P R1, 16777215(R2) + MOVHU R1, -0x00ffffff(R2) // MOVHU R1, -16777215(R2) + MOVHU.W R1, -0x00ffffff(R2) // MOVHU.W R1, -16777215(R2) + MOVHU.P R1, -0x00ffffff(R2) // MOVHU.P R1, -16777215(R2) + MOVHU 0x00ffffff(R2), R1 // MOVHU 16777215(R2), R1 + MOVHU.P 0x00ffffff(R2), R1 // MOVHU.P 16777215(R2), R1 + MOVHU.W 0x00ffffff(R2), R1 // MOVHU.W 16777215(R2), R1 + MOVHU -0x00ffffff(R2), R1 // MOVHU -16777215(R2), R1 + MOVHU.P -0x00ffffff(R2), R1 // MOVHU.P -16777215(R2), R1 + MOVHU.W -0x00ffffff(R2), R1 // MOVHU.W -16777215(R2), R1 + MOVH R0, math·Exp(SB) // MOVH R0, math.Exp(SB) + MOVH math·Exp(SB), R0 // MOVH math.Exp(SB), R0 + MOVHS R0, math·Exp(SB) // MOVHS R0, math.Exp(SB) + MOVHS math·Exp(SB), R0 // MOVHS math.Exp(SB), R0 + MOVHU R0, math·Exp(SB) // MOVHU R0, math.Exp(SB) + MOVHU math·Exp(SB), R0 // MOVHU math.Exp(SB), R0 + // // END // diff --git a/src/cmd/asm/internal/asm/testdata/armerror.s b/src/cmd/asm/internal/asm/testdata/armerror.s index b3a8da7bed..deda9cf494 100644 --- a/src/cmd/asm/internal/asm/testdata/armerror.s +++ b/src/cmd/asm/internal/asm/testdata/armerror.s @@ -23,5 +23,80 @@ TEXT errors(SB),$0 MOVM.DA 4(R1), [R0-R4] // ERROR "offset must be zero" MOVM.IB 4(R1), [R0-R4] // ERROR "offset must be zero" MOVM.DB 4(R1), [R0-R4] // ERROR "offset must be zero" + MOVM.IA [R0-R4], 4(R1) // ERROR "offset must be zero" + MOVM.DA [R0-R4], 4(R1) // ERROR "offset must be zero" + MOVM.IB [R0-R4], 4(R1) // ERROR "offset must be zero" + MOVM.DB [R0-R4], 4(R1) // ERROR "offset must be zero" + MOVW CPSR, FPSR // ERROR "illegal combination" + MOVW FPSR, CPSR // ERROR "illegal combination" + MOVW CPSR, errors(SB) // ERROR "illegal combination" + MOVW errors(SB), CPSR // ERROR "illegal combination" + MOVW FPSR, errors(SB) // ERROR "illegal combination" + MOVW errors(SB), FPSR // ERROR "illegal combination" + MOVW F0, errors(SB) // ERROR "illegal combination" + MOVW errors(SB), F0 // ERROR "illegal combination" + MOVW $20, errors(SB) // ERROR "illegal combination" + MOVW errors(SB), $20 // ERROR "illegal combination" + MOVB $245, R1 // ERROR "illegal combination" + MOVH $245, R1 // ERROR "illegal combination" + MOVB $0xff000000, R1 // ERROR "illegal combination" + MOVH $0xff000000, R1 // ERROR "illegal combination" + MOVB $0x00ffffff, R1 // ERROR "illegal combination" + MOVH $0x00ffffff, R1 // ERROR "illegal combination" + MOVB FPSR, g // ERROR "illegal combination" + MOVH FPSR, g // ERROR "illegal combination" + MOVB g, FPSR // ERROR "illegal combination" + MOVH g, FPSR // ERROR "illegal combination" + MOVB CPSR, g // ERROR "illegal combination" + MOVH CPSR, g // ERROR "illegal combination" + MOVB g, CPSR // ERROR "illegal combination" + MOVH g, CPSR // ERROR "illegal combination" + MOVB $0xff000000, CPSR // ERROR "illegal combination" + MOVH $0xff000000, CPSR // ERROR "illegal combination" + MOVB $0xff000000, FPSR // ERROR "illegal combination" + MOVH $0xff000000, FPSR // ERROR "illegal combination" + MOVB $0xffffff00, CPSR // ERROR "illegal combination" + MOVH $0xffffff00, CPSR // ERROR "illegal combination" + MOVB $0xfffffff0, FPSR // ERROR "illegal combination" + MOVH $0xfffffff0, FPSR // ERROR "illegal combination" + MOVB.IA 4(R1), [R0-R4] // ERROR "illegal combination" + MOVB.DA 4(R1), [R0-R4] // ERROR "illegal combination" + MOVH.IA 4(R1), [R0-R4] // ERROR "illegal combination" + MOVH.DA 4(R1), [R0-R4] // ERROR "illegal combination" + MOVB $0xff(R0), R1 // ERROR "illegal combination" + MOVH $0xff(R0), R1 // ERROR "illegal combination" + MOVB $errors(SB), R2 // ERROR "illegal combination" + MOVH $errors(SB), R2 // ERROR "illegal combination" + MOVB F0, R0 // ERROR "illegal combination" + MOVH F0, R0 // ERROR "illegal combination" + MOVB R0, F0 // ERROR "illegal combination" + MOVH R0, F0 // ERROR "illegal combination" + MOVB R0>>0(R1), R2 // ERROR "bad shift" + MOVB R0->0(R1), R2 // ERROR "bad shift" + MOVB R0@>0(R1), R2 // ERROR "bad shift" + MOVBS R0>>0(R1), R2 // ERROR "bad shift" + MOVBS R0->0(R1), R2 // ERROR "bad shift" + MOVBS R0@>0(R1), R2 // ERROR "bad shift" + MOVF CPSR, F1 // ERROR "illegal combination" + MOVD R1, CPSR // ERROR "illegal combination" + MOVW F1, F2 // ERROR "illegal combination" + MOVB F1, F2 // ERROR "illegal combination" + MOVH F1, F2 // ERROR "illegal combination" + MOVF R1, F2 // ERROR "illegal combination" + MOVD R1, F2 // ERROR "illegal combination" + MOVF R1, R1 // ERROR "illegal combination" + MOVD R1, R2 // ERROR "illegal combination" + MOVFW R1, R2 // ERROR "illegal combination" + MOVDW R1, R2 // ERROR "illegal combination" + MOVWF R1, R2 // ERROR "illegal combination" + MOVWD R1, R2 // ERROR "illegal combination" + MOVWD CPSR, R2 // ERROR "illegal combination" + MOVWF CPSR, R2 // ERROR "illegal combination" + MOVWD R1, CPSR // ERROR "illegal combination" + MOVWF R1, CPSR // ERROR "illegal combination" + MOVDW CPSR, R2 // ERROR "illegal combination" + MOVFW CPSR, R2 // ERROR "illegal combination" + MOVDW R1, CPSR // ERROR "illegal combination" + MOVFW R1, CPSR // ERROR "illegal combination" END diff --git a/src/cmd/asm/internal/asm/testdata/armv6.s b/src/cmd/asm/internal/asm/testdata/armv6.s index 7e38ca0846..cc79275f69 100644 --- a/src/cmd/asm/internal/asm/testdata/armv6.s +++ b/src/cmd/asm/internal/asm/testdata/armv6.s @@ -44,4 +44,47 @@ TEXT foo(SB), DUPOK|NOSPLIT, $0 MOVW R4, F8 // 104b08ee MOVW F4, R8 // 108b14ee + MOVF (R4), F9 // 009a94ed + MOVD.EQ (R4), F9 // 009b940d + MOVF.NE (g), F3 // 003a9a1d + MOVD (g), F3 // 003b9aed + MOVF 0x20(R3), F9 // MOVF 32(R3), F9 // 089a93ed + MOVD.EQ 0x20(R4), F9 // MOVD.EQ 32(R4), F9 // 089b940d + MOVF.NE -0x20(g), F3 // MOVF.NE -32(g), F3 // 083a1a1d + MOVD -0x20(g), F3 // MOVD -32(g), F3 // 083b1aed + MOVF F9, (R4) // 009a84ed + MOVD.EQ F9, (R4) // 009b840d + MOVF.NE F3, (g) // 003a8a1d + MOVD F3, (g) // 003b8aed + MOVF F9, 0x20(R3) // MOVF F9, 32(R3) // 089a83ed + MOVD.EQ F9, 0x20(R4) // MOVD.EQ F9, 32(R4) // 089b840d + MOVF.NE F3, -0x20(g) // MOVF.NE F3, -32(g) // 083a0a1d + MOVD F3, -0x20(g) // MOVD F3, -32(g) // 083b0aed + MOVF 0x00ffffff(R2), F1 // MOVF 16777215(R2), F1 + MOVD 0x00ffffff(R2), F1 // MOVD 16777215(R2), F1 + MOVF F2, 0x00ffffff(R2) // MOVF F2, 16777215(R2) + MOVD F2, 0x00ffffff(R2) // MOVD F2, 16777215(R2) + MOVF F0, math·Exp(SB) // MOVF F0, math.Exp(SB) + MOVF math·Exp(SB), F0 // MOVF math.Exp(SB), F0 + MOVD F0, math·Exp(SB) // MOVD F0, math.Exp(SB) + MOVD math·Exp(SB), F0 // MOVD math.Exp(SB), F0 + MOVF F4, F5 // 445ab0ee + MOVD F6, F7 // 467bb0ee + MOVFW F6, F8 // c68abdee + MOVFW F6, R8 // c6fabdee108b1fee + MOVFW.U F6, F8 // c68abcee + MOVFW.U F6, R8 // c6fabcee108b1fee + MOVDW F6, F8 // c68bbdee + MOVDW F6, R8 // c6fbbdee108b1fee + MOVDW.U F6, F8 // c68bbcee + MOVDW.U F6, R8 // c6fbbcee108b1fee + MOVWF F6, F8 // c68ab8ee + MOVWF R6, F8 // 106b0feecf8ab8ee + MOVWF.U F6, F8 // 468ab8ee + MOVWF.U R6, F8 // 106b0fee4f8ab8ee + MOVWD F6, F8 // c68bb8ee + MOVWD R6, F8 // 106b0feecf8bb8ee + MOVWD.U F6, F8 // 468bb8ee + MOVWD.U R6, F8 // 106b0fee4f8bb8ee + END diff --git a/src/cmd/internal/obj/arm/asm5.go b/src/cmd/internal/obj/arm/asm5.go index 417da44574..6cb6072769 100644 --- a/src/cmd/internal/obj/arm/asm5.go +++ b/src/cmd/internal/obj/arm/asm5.go @@ -2249,10 +2249,13 @@ func (c *ctxt5) asmout(p *obj.Prog, o *Optab, out []uint32) { } if p.From.Offset&(^0xf) != 0 { - c.ctxt.Diag("bad shift in LDRSB") + c.ctxt.Diag("bad shift: %v", p) } o1 = c.olhrr(int(p.From.Offset), int(p.From.Reg), int(p.To.Reg), int(p.Scond)) o1 ^= 1<<5 | 1<<6 + if p.Scond&C_UBIT != 0 { + o1 &^= 1 << 23 + } case 61: /* movw/b/bu R,R<<[IR](R) -> str indexed */ if p.To.Reg == 0 { |