1
0
mirror of https://github.com/golang/go synced 2024-11-18 02:54:47 -07:00

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>
This commit is contained in:
Ben Shi 2017-06-16 11:19:01 +00:00 committed by Cherry Zhang
parent 856fd8f50e
commit e00a38c89a
4 changed files with 398 additions and 7 deletions

View File

@ -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
//

View File

@ -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

View File

@ -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

View File

@ -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 {