Commit d0ff9ece authored by Ben Shi's avatar Ben Shi Committed by Brad Fitzpatrick

cmd/internal/obj/arm: Fix wrong assembly in the arm assembler

As #19357 reported,

TST has 3 different sub forms
TST $imme, Rx
TST Ry << imme, Rx
TST Ry << Rz, Rx

just like CMP/CMN/TEQ has. But current arm assembler assembles all TST
instructions wrongly. This patch fixes it and adds more tests.

Fixes #19357

Change-Id: Iafedccfaab2cbb2631e7acf259837a782e2e8e2f
Reviewed-on: https://go-review.googlesource.com/37662
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
parent c46226a6
......@@ -281,6 +281,670 @@ TEXT foo(SB), 7, $0
CMPF F1, F2
CMPD F1, F2
// AND
AND $255, R0, R1 // ff1000e2
AND $4278190080, R0, R1 // ff1400e2
AND.S $255, R0, R1 // ff1010e2
AND.S $4278190080, R0, R1 // ff1410e2
AND $255, R0 // ff0000e2
AND $4278190080, R0 // ff0400e2
AND.S $255, R0 // ff0010e2
AND.S $4278190080, R0 // ff0410e2
AND R0, R1, R2 // 002001e0
AND.S R0, R1, R2 // 002011e0
AND R0, R1 // 001001e0
AND.S R0, R1 // 001011e0
AND R0>>28, R1, R2 // 202e01e0
AND R0<<28, R1, R2 // 002e01e0
AND R0->28, R1, R2 // 402e01e0
AND R0@>28, R1, R2 // 602e01e0
AND.S R0>>28, R1, R2 // 202e11e0
AND.S R0<<28, R1, R2 // 002e11e0
AND.S R0->28, R1, R2 // 402e11e0
AND.S R0@>28, R1, R2 // 602e11e0
AND R0<<28, R1 // 001e01e0
AND R0>>28, R1 // 201e01e0
AND R0->28, R1 // 401e01e0
AND R0@>28, R1 // 601e01e0
AND.S R0<<28, R1 // 001e11e0
AND.S R0>>28, R1 // 201e11e0
AND.S R0->28, R1 // 401e11e0
AND.S R0@>28, R1 // 601e11e0
AND R0<<R1, R2, R3 // 103102e0
AND R0>>R1, R2, R3 // 303102e0
AND R0->R1, R2, R3 // 503102e0
AND R0@>R1, R2, R3 // 703102e0
AND.S R0<<R1, R2, R3 // 103112e0
AND.S R0>>R1, R2, R3 // 303112e0
AND.S R0->R1, R2, R3 // 503112e0
AND.S R0@>R1, R2, R3 // 703112e0
AND R0<<R1, R2 // 102102e0
AND R0>>R1, R2 // 302102e0
AND R0->R1, R2 // 502102e0
AND R0@>R1, R2 // 702102e0
AND.S R0<<R1, R2 // 102112e0
AND.S R0>>R1, R2 // 302112e0
AND.S R0->R1, R2 // 502112e0
AND.S R0@>R1, R2 // 702112e0
// EOR
EOR $255, R0, R1 // ff1020e2
EOR $4278190080, R0, R1 // ff1420e2
EOR.S $255, R0, R1 // ff1030e2
EOR.S $4278190080, R0, R1 // ff1430e2
EOR $255, R0 // ff0020e2
EOR $4278190080, R0 // ff0420e2
EOR.S $255, R0 // ff0030e2
EOR.S $4278190080, R0 // ff0430e2
EOR R0, R1, R2 // 002021e0
EOR.S R0, R1, R2 // 002031e0
EOR R0, R1 // 001021e0
EOR.S R0, R1 // 001031e0
EOR R0>>28, R1, R2 // 202e21e0
EOR R0<<28, R1, R2 // 002e21e0
EOR R0->28, R1, R2 // 402e21e0
EOR R0@>28, R1, R2 // 602e21e0
EOR.S R0>>28, R1, R2 // 202e31e0
EOR.S R0<<28, R1, R2 // 002e31e0
EOR.S R0->28, R1, R2 // 402e31e0
EOR.S R0@>28, R1, R2 // 602e31e0
EOR R0<<28, R1 // 001e21e0
EOR R0>>28, R1 // 201e21e0
EOR R0->28, R1 // 401e21e0
EOR R0@>28, R1 // 601e21e0
EOR.S R0<<28, R1 // 001e31e0
EOR.S R0>>28, R1 // 201e31e0
EOR.S R0->28, R1 // 401e31e0
EOR.S R0@>28, R1 // 601e31e0
EOR R0<<R1, R2, R3 // 103122e0
EOR R0>>R1, R2, R3 // 303122e0
EOR R0->R1, R2, R3 // 503122e0
EOR R0@>R1, R2, R3 // 703122e0
EOR.S R0<<R1, R2, R3 // 103132e0
EOR.S R0>>R1, R2, R3 // 303132e0
EOR.S R0->R1, R2, R3 // 503132e0
EOR.S R0@>R1, R2, R3 // 703132e0
EOR R0<<R1, R2 // 102122e0
EOR R0>>R1, R2 // 302122e0
EOR R0->R1, R2 // 502122e0
EOR R0@>R1, R2 // 702122e0
EOR.S R0<<R1, R2 // 102132e0
EOR.S R0>>R1, R2 // 302132e0
EOR.S R0->R1, R2 // 502132e0
EOR.S R0@>R1, R2 // 702132e0
// ORR
ORR $255, R0, R1 // ff1080e3
ORR $4278190080, R0, R1 // ff1480e3
ORR.S $255, R0, R1 // ff1090e3
ORR.S $4278190080, R0, R1 // ff1490e3
ORR $255, R0 // ff0080e3
ORR $4278190080, R0 // ff0480e3
ORR.S $255, R0 // ff0090e3
ORR.S $4278190080, R0 // ff0490e3
ORR R0, R1, R2 // 002081e1
ORR.S R0, R1, R2 // 002091e1
ORR R0, R1 // 001081e1
ORR.S R0, R1 // 001091e1
ORR R0>>28, R1, R2 // 202e81e1
ORR R0<<28, R1, R2 // 002e81e1
ORR R0->28, R1, R2 // 402e81e1
ORR R0@>28, R1, R2 // 602e81e1
ORR.S R0>>28, R1, R2 // 202e91e1
ORR.S R0<<28, R1, R2 // 002e91e1
ORR.S R0->28, R1, R2 // 402e91e1
ORR.S R0@>28, R1, R2 // 602e91e1
ORR R0<<28, R1 // 001e81e1
ORR R0>>28, R1 // 201e81e1
ORR R0->28, R1 // 401e81e1
ORR R0@>28, R1 // 601e81e1
ORR.S R0<<28, R1 // 001e91e1
ORR.S R0>>28, R1 // 201e91e1
ORR.S R0->28, R1 // 401e91e1
ORR.S R0@>28, R1 // 601e91e1
ORR R0<<R1, R2, R3 // 103182e1
ORR R0>>R1, R2, R3 // 303182e1
ORR R0->R1, R2, R3 // 503182e1
ORR R0@>R1, R2, R3 // 703182e1
ORR.S R0<<R1, R2, R3 // 103192e1
ORR.S R0>>R1, R2, R3 // 303192e1
ORR.S R0->R1, R2, R3 // 503192e1
ORR.S R0@>R1, R2, R3 // 703192e1
ORR R0<<R1, R2 // 102182e1
ORR R0>>R1, R2 // 302182e1
ORR R0->R1, R2 // 502182e1
ORR R0@>R1, R2 // 702182e1
ORR.S R0<<R1, R2 // 102192e1
ORR.S R0>>R1, R2 // 302192e1
ORR.S R0->R1, R2 // 502192e1
ORR.S R0@>R1, R2 // 702192e1
// SUB
SUB $255, R0, R1 // ff1040e2
SUB $4278190080, R0, R1 // ff1440e2
SUB.S $255, R0, R1 // ff1050e2
SUB.S $4278190080, R0, R1 // ff1450e2
SUB $255, R0 // ff0040e2
SUB $4278190080, R0 // ff0440e2
SUB.S $255, R0 // ff0050e2
SUB.S $4278190080, R0 // ff0450e2
SUB R0, R1, R2 // 002041e0
SUB.S R0, R1, R2 // 002051e0
SUB R0, R1 // 001041e0
SUB.S R0, R1 // 001051e0
SUB R0>>28, R1, R2 // 202e41e0
SUB R0<<28, R1, R2 // 002e41e0
SUB R0->28, R1, R2 // 402e41e0
SUB R0@>28, R1, R2 // 602e41e0
SUB.S R0>>28, R1, R2 // 202e51e0
SUB.S R0<<28, R1, R2 // 002e51e0
SUB.S R0->28, R1, R2 // 402e51e0
SUB.S R0@>28, R1, R2 // 602e51e0
SUB R0<<28, R1 // 001e41e0
SUB R0>>28, R1 // 201e41e0
SUB R0->28, R1 // 401e41e0
SUB R0@>28, R1 // 601e41e0
SUB.S R0<<28, R1 // 001e51e0
SUB.S R0>>28, R1 // 201e51e0
SUB.S R0->28, R1 // 401e51e0
SUB.S R0@>28, R1 // 601e51e0
SUB R0<<R1, R2, R3 // 103142e0
SUB R0>>R1, R2, R3 // 303142e0
SUB R0->R1, R2, R3 // 503142e0
SUB R0@>R1, R2, R3 // 703142e0
SUB.S R0<<R1, R2, R3 // 103152e0
SUB.S R0>>R1, R2, R3 // 303152e0
SUB.S R0->R1, R2, R3 // 503152e0
SUB.S R0@>R1, R2, R3 // 703152e0
SUB R0<<R1, R2 // 102142e0
SUB R0>>R1, R2 // 302142e0
SUB R0->R1, R2 // 502142e0
SUB R0@>R1, R2 // 702142e0
SUB.S R0<<R1, R2 // 102152e0
SUB.S R0>>R1, R2 // 302152e0
SUB.S R0->R1, R2 // 502152e0
SUB.S R0@>R1, R2 // 702152e0
// SBC
SBC $255, R0, R1 // ff10c0e2
SBC $4278190080, R0, R1 // ff14c0e2
SBC.S $255, R0, R1 // ff10d0e2
SBC.S $4278190080, R0, R1 // ff14d0e2
SBC $255, R0 // ff00c0e2
SBC $4278190080, R0 // ff04c0e2
SBC.S $255, R0 // ff00d0e2
SBC.S $4278190080, R0 // ff04d0e2
SBC R0, R1, R2 // 0020c1e0
SBC.S R0, R1, R2 // 0020d1e0
SBC R0, R1 // 0010c1e0
SBC.S R0, R1 // 0010d1e0
SBC R0>>28, R1, R2 // 202ec1e0
SBC R0<<28, R1, R2 // 002ec1e0
SBC R0->28, R1, R2 // 402ec1e0
SBC R0@>28, R1, R2 // 602ec1e0
SBC.S R0>>28, R1, R2 // 202ed1e0
SBC.S R0<<28, R1, R2 // 002ed1e0
SBC.S R0->28, R1, R2 // 402ed1e0
SBC.S R0@>28, R1, R2 // 602ed1e0
SBC R0<<28, R1 // 001ec1e0
SBC R0>>28, R1 // 201ec1e0
SBC R0->28, R1 // 401ec1e0
SBC R0@>28, R1 // 601ec1e0
SBC.S R0<<28, R1 // 001ed1e0
SBC.S R0>>28, R1 // 201ed1e0
SBC.S R0->28, R1 // 401ed1e0
SBC.S R0@>28, R1 // 601ed1e0
SBC R0<<R1, R2, R3 // 1031c2e0
SBC R0>>R1, R2, R3 // 3031c2e0
SBC R0->R1, R2, R3 // 5031c2e0
SBC R0@>R1, R2, R3 // 7031c2e0
SBC.S R0<<R1, R2, R3 // 1031d2e0
SBC.S R0>>R1, R2, R3 // 3031d2e0
SBC.S R0->R1, R2, R3 // 5031d2e0
SBC.S R0@>R1, R2, R3 // 7031d2e0
SBC R0<<R1, R2 // 1021c2e0
SBC R0>>R1, R2 // 3021c2e0
SBC R0->R1, R2 // 5021c2e0
SBC R0@>R1, R2 // 7021c2e0
SBC.S R0<<R1, R2 // 1021d2e0
SBC.S R0>>R1, R2 // 3021d2e0
SBC.S R0->R1, R2 // 5021d2e0
SBC.S R0@>R1, R2 // 7021d2e0
// RSB
RSB $255, R0, R1 // ff1060e2
RSB $4278190080, R0, R1 // ff1460e2
RSB.S $255, R0, R1 // ff1070e2
RSB.S $4278190080, R0, R1 // ff1470e2
RSB $255, R0 // ff0060e2
RSB $4278190080, R0 // ff0460e2
RSB.S $255, R0 // ff0070e2
RSB.S $4278190080, R0 // ff0470e2
RSB R0, R1, R2 // 002061e0
RSB.S R0, R1, R2 // 002071e0
RSB R0, R1 // 001061e0
RSB.S R0, R1 // 001071e0
RSB R0>>28, R1, R2 // 202e61e0
RSB R0<<28, R1, R2 // 002e61e0
RSB R0->28, R1, R2 // 402e61e0
RSB R0@>28, R1, R2 // 602e61e0
RSB.S R0>>28, R1, R2 // 202e71e0
RSB.S R0<<28, R1, R2 // 002e71e0
RSB.S R0->28, R1, R2 // 402e71e0
RSB.S R0@>28, R1, R2 // 602e71e0
RSB R0<<28, R1 // 001e61e0
RSB R0>>28, R1 // 201e61e0
RSB R0->28, R1 // 401e61e0
RSB R0@>28, R1 // 601e61e0
RSB.S R0<<28, R1 // 001e71e0
RSB.S R0>>28, R1 // 201e71e0
RSB.S R0->28, R1 // 401e71e0
RSB.S R0@>28, R1 // 601e71e0
RSB R0<<R1, R2, R3 // 103162e0
RSB R0>>R1, R2, R3 // 303162e0
RSB R0->R1, R2, R3 // 503162e0
RSB R0@>R1, R2, R3 // 703162e0
RSB.S R0<<R1, R2, R3 // 103172e0
RSB.S R0>>R1, R2, R3 // 303172e0
RSB.S R0->R1, R2, R3 // 503172e0
RSB.S R0@>R1, R2, R3 // 703172e0
RSB R0<<R1, R2 // 102162e0
RSB R0>>R1, R2 // 302162e0
RSB R0->R1, R2 // 502162e0
RSB R0@>R1, R2 // 702162e0
RSB.S R0<<R1, R2 // 102172e0
RSB.S R0>>R1, R2 // 302172e0
RSB.S R0->R1, R2 // 502172e0
RSB.S R0@>R1, R2 // 702172e0
// RSC
RSC $255, R0, R1 // ff10e0e2
RSC $4278190080, R0, R1 // ff14e0e2
RSC.S $255, R0, R1 // ff10f0e2
RSC.S $4278190080, R0, R1 // ff14f0e2
RSC $255, R0 // ff00e0e2
RSC $4278190080, R0 // ff04e0e2
RSC.S $255, R0 // ff00f0e2
RSC.S $4278190080, R0 // ff04f0e2
RSC R0, R1, R2 // 0020e1e0
RSC.S R0, R1, R2 // 0020f1e0
RSC R0, R1 // 0010e1e0
RSC.S R0, R1 // 0010f1e0
RSC R0>>28, R1, R2 // 202ee1e0
RSC R0<<28, R1, R2 // 002ee1e0
RSC R0->28, R1, R2 // 402ee1e0
RSC R0@>28, R1, R2 // 602ee1e0
RSC.S R0>>28, R1, R2 // 202ef1e0
RSC.S R0<<28, R1, R2 // 002ef1e0
RSC.S R0->28, R1, R2 // 402ef1e0
RSC.S R0@>28, R1, R2 // 602ef1e0
RSC R0<<28, R1 // 001ee1e0
RSC R0>>28, R1 // 201ee1e0
RSC R0->28, R1 // 401ee1e0
RSC R0@>28, R1 // 601ee1e0
RSC.S R0<<28, R1 // 001ef1e0
RSC.S R0>>28, R1 // 201ef1e0
RSC.S R0->28, R1 // 401ef1e0
RSC.S R0@>28, R1 // 601ef1e0
RSC R0<<R1, R2, R3 // 1031e2e0
RSC R0>>R1, R2, R3 // 3031e2e0
RSC R0->R1, R2, R3 // 5031e2e0
RSC R0@>R1, R2, R3 // 7031e2e0
RSC.S R0<<R1, R2, R3 // 1031f2e0
RSC.S R0>>R1, R2, R3 // 3031f2e0
RSC.S R0->R1, R2, R3 // 5031f2e0
RSC.S R0@>R1, R2, R3 // 7031f2e0
RSC R0<<R1, R2 // 1021e2e0
RSC R0>>R1, R2 // 3021e2e0
RSC R0->R1, R2 // 5021e2e0
RSC R0@>R1, R2 // 7021e2e0
RSC.S R0<<R1, R2 // 1021f2e0
RSC.S R0>>R1, R2 // 3021f2e0
RSC.S R0->R1, R2 // 5021f2e0
RSC.S R0@>R1, R2 // 7021f2e0
// ADD
ADD $255, R0, R1 // ff1080e2
ADD $4278190080, R0, R1 // ff1480e2
ADD.S $255, R0, R1 // ff1090e2
ADD.S $4278190080, R0, R1 // ff1490e2
ADD $255, R0 // ff0080e2
ADD $4278190080, R0 // ff0480e2
ADD.S $255, R0 // ff0090e2
ADD.S $4278190080, R0 // ff0490e2
ADD R0, R1, R2 // 002081e0
ADD.S R0, R1, R2 // 002091e0
ADD R0, R1 // 001081e0
ADD.S R0, R1 // 001091e0
ADD R0>>28, R1, R2 // 202e81e0
ADD R0<<28, R1, R2 // 002e81e0
ADD R0->28, R1, R2 // 402e81e0
ADD R0@>28, R1, R2 // 602e81e0
ADD.S R0>>28, R1, R2 // 202e91e0
ADD.S R0<<28, R1, R2 // 002e91e0
ADD.S R0->28, R1, R2 // 402e91e0
ADD.S R0@>28, R1, R2 // 602e91e0
ADD R0<<28, R1 // 001e81e0
ADD R0>>28, R1 // 201e81e0
ADD R0->28, R1 // 401e81e0
ADD R0@>28, R1 // 601e81e0
ADD.S R0<<28, R1 // 001e91e0
ADD.S R0>>28, R1 // 201e91e0
ADD.S R0->28, R1 // 401e91e0
ADD.S R0@>28, R1 // 601e91e0
ADD R0<<R1, R2, R3 // 103182e0
ADD R0>>R1, R2, R3 // 303182e0
ADD R0->R1, R2, R3 // 503182e0
ADD R0@>R1, R2, R3 // 703182e0
ADD.S R0<<R1, R2, R3 // 103192e0
ADD.S R0>>R1, R2, R3 // 303192e0
ADD.S R0->R1, R2, R3 // 503192e0
ADD.S R0@>R1, R2, R3 // 703192e0
ADD R0<<R1, R2 // 102182e0
ADD R0>>R1, R2 // 302182e0
ADD R0->R1, R2 // 502182e0
ADD R0@>R1, R2 // 702182e0
ADD.S R0<<R1, R2 // 102192e0
ADD.S R0>>R1, R2 // 302192e0
ADD.S R0->R1, R2 // 502192e0
ADD.S R0@>R1, R2 // 702192e0
// ADC
ADC $255, R0, R1 // ff10a0e2
ADC $4278190080, R0, R1 // ff14a0e2
ADC.S $255, R0, R1 // ff10b0e2
ADC.S $4278190080, R0, R1 // ff14b0e2
ADC $255, R0 // ff00a0e2
ADC $4278190080, R0 // ff04a0e2
ADC.S $255, R0 // ff00b0e2
ADC.S $4278190080, R0 // ff04b0e2
ADC R0, R1, R2 // 0020a1e0
ADC.S R0, R1, R2 // 0020b1e0
ADC R0, R1 // 0010a1e0
ADC.S R0, R1 // 0010b1e0
ADC R0>>28, R1, R2 // 202ea1e0
ADC R0<<28, R1, R2 // 002ea1e0
ADC R0->28, R1, R2 // 402ea1e0
ADC R0@>28, R1, R2 // 602ea1e0
ADC.S R0>>28, R1, R2 // 202eb1e0
ADC.S R0<<28, R1, R2 // 002eb1e0
ADC.S R0->28, R1, R2 // 402eb1e0
ADC.S R0@>28, R1, R2 // 602eb1e0
ADC R0<<28, R1 // 001ea1e0
ADC R0>>28, R1 // 201ea1e0
ADC R0->28, R1 // 401ea1e0
ADC R0@>28, R1 // 601ea1e0
ADC.S R0<<28, R1 // 001eb1e0
ADC.S R0>>28, R1 // 201eb1e0
ADC.S R0->28, R1 // 401eb1e0
ADC.S R0@>28, R1 // 601eb1e0
ADC R0<<R1, R2, R3 // 1031a2e0
ADC R0>>R1, R2, R3 // 3031a2e0
ADC R0->R1, R2, R3 // 5031a2e0
ADC R0@>R1, R2, R3 // 7031a2e0
ADC.S R0<<R1, R2, R3 // 1031b2e0
ADC.S R0>>R1, R2, R3 // 3031b2e0
ADC.S R0->R1, R2, R3 // 5031b2e0
ADC.S R0@>R1, R2, R3 // 7031b2e0
ADC R0<<R1, R2 // 1021a2e0
ADC R0>>R1, R2 // 3021a2e0
ADC R0->R1, R2 // 5021a2e0
ADC R0@>R1, R2 // 7021a2e0
ADC.S R0<<R1, R2 // 1021b2e0
ADC.S R0>>R1, R2 // 3021b2e0
ADC.S R0->R1, R2 // 5021b2e0
ADC.S R0@>R1, R2 // 7021b2e0
// TEQ
TEQ $255, R7 // ff0037e3
TEQ $4278190080, R9 // ff0439e3
TEQ R9<<30, R7 // 090f37e1
TEQ R9>>30, R7 // 290f37e1
TEQ R9->30, R7 // 490f37e1
TEQ R9@>30, R7 // 690f37e1
TEQ R9<<R8, R7 // 190837e1
TEQ R9>>R8, R7 // 390837e1
TEQ R9->R8, R7 // 590837e1
TEQ R9@>R8, R7 // 790837e1
// TST
TST $255, R7 // ff0017e3
TST $4278190080, R9 // ff0419e3
TST R9<<30, R7 // 090f17e1
TST R9>>30, R7 // 290f17e1
TST R9->30, R7 // 490f17e1
TST R9@>30, R7 // 690f17e1
TST R9<<R8, R7 // 190817e1
TST R9>>R8, R7 // 390817e1
TST R9->R8, R7 // 590817e1
TST R9@>R8, R7 // 790817e1
// CMP
CMP $255, R7 // ff0057e3
CMP $4278190080, R9 // ff0459e3
CMP R9<<30, R7 // 090f57e1
CMP R9>>30, R7 // 290f57e1
CMP R9->30, R7 // 490f57e1
CMP R9@>30, R7 // 690f57e1
CMP R9<<R8, R7 // 190857e1
CMP R9>>R8, R7 // 390857e1
CMP R9->R8, R7 // 590857e1
CMP R9@>R8, R7 // 790857e1
// CMN
CMN $255, R7 // ff0077e3
CMN $4278190080, R9 // ff0479e3
CMN R9<<30, R7 // 090f77e1
CMN R9>>30, R7 // 290f77e1
CMN R9->30, R7 // 490f77e1
CMN R9@>30, R7 // 690f77e1
CMN R9<<R8, R7 // 190877e1
CMN R9>>R8, R7 // 390877e1
CMN R9->R8, R7 // 590877e1
CMN R9@>R8, R7 // 790877e1
// B*
BEQ 14(PC) // BEQ 14(PC) // 0c00000a
BNE 13(PC) // BNE 13(PC) // 0b00001a
BCS 12(PC) // BCS 12(PC) // 0a00002a
BCC 11(PC) // BCC 11(PC) // 0900003a
BMI 10(PC) // BMI 10(PC) // 0800004a
BPL 9(PC) // BPL 9(PC) // 0700005a
BVS 8(PC) // BVS 8(PC) // 0600006a
BVC 7(PC) // BVC 7(PC) // 0500007a
BHI 6(PC) // BHI 6(PC) // 0400008a
BLS 5(PC) // BLS 5(PC) // 0300009a
BGE 4(PC) // BGE 4(PC) // 020000aa
BLT 3(PC) // BLT 3(PC) // 010000ba
BGT 2(PC) // BGT 2(PC) // 000000ca
BLE 1(PC) // BLE 1(PC) // ffffffda
ADD $0, R0, R0
B -1(PC) // JMP -1(PC) // fdffffea
B -2(PC) // JMP -2(PC) // fcffffea
B -3(PC) // JMP -3(PC) // fbffffea
B -4(PC) // JMP -4(PC) // faffffea
B -5(PC) // JMP -5(PC) // f9ffffea
B jmp_label_0 // JMP // 010000ea
B jmp_label_0 // JMP // 000000ea
B jmp_label_0 // JMP // ffffffea
jmp_label_0:
ADD $0, R0, R0
BEQ jmp_label_0 // BEQ 521 // fdffff0a
BNE jmp_label_0 // BNE 521 // fcffff1a
BCS jmp_label_0 // BCS 521 // fbffff2a
BCC jmp_label_0 // BCC 521 // faffff3a
BMI jmp_label_0 // BMI 521 // f9ffff4a
BPL jmp_label_0 // BPL 521 // f8ffff5a
BVS jmp_label_0 // BVS 521 // f7ffff6a
BVC jmp_label_0 // BVC 521 // f6ffff7a
BHI jmp_label_0 // BHI 521 // f5ffff8a
BLS jmp_label_0 // BLS 521 // f4ffff9a
BGE jmp_label_0 // BGE 521 // f3ffffaa
BLT jmp_label_0 // BLT 521 // f2ffffba
BGT jmp_label_0 // BGT 521 // f1ffffca
BLE jmp_label_0 // BLE 521 // f0ffffda
B jmp_label_0 // JMP 521 // efffffea
B 0(PC) // JMP 0(PC) // feffffea
jmp_label_1:
B jmp_label_1 // JMP // feffffea
// BL
BL.EQ 14(PC) // CALL.EQ 14(PC) // 0c00000b
BL.NE 13(PC) // CALL.NE 13(PC) // 0b00001b
BL.CS 12(PC) // CALL.CS 12(PC) // 0a00002b
BL.CC 11(PC) // CALL.CC 11(PC) // 0900003b
BL.MI 10(PC) // CALL.MI 10(PC) // 0800004b
BL.PL 9(PC) // CALL.PL 9(PC) // 0700005b
BL.VS 8(PC) // CALL.VS 8(PC) // 0600006b
BL.VC 7(PC) // CALL.VC 7(PC) // 0500007b
BL.HI 6(PC) // CALL.HI 6(PC) // 0400008b
BL.LS 5(PC) // CALL.LS 5(PC) // 0300009b
BL.GE 4(PC) // CALL.GE 4(PC) // 020000ab
BL.LT 3(PC) // CALL.LT 3(PC) // 010000bb
BL.GT 2(PC) // CALL.GT 2(PC) // 000000cb
BL.LE 1(PC) // CALL.LE 1(PC) // ffffffdb
ADD $0, R0, R0
BL -1(PC) // CALL -1(PC) // fdffffeb
BL -2(PC) // CALL -2(PC) // fcffffeb
BL -3(PC) // CALL -3(PC) // fbffffeb
BL -4(PC) // CALL -4(PC) // faffffeb
BL -5(PC) // CALL -5(PC) // f9ffffeb
BL jmp_label_2 // CALL // 010000eb
BL jmp_label_2 // CALL // 000000eb
BL jmp_label_2 // CALL // ffffffeb
jmp_label_2:
ADD $0, R0, R0
BL.EQ jmp_label_2 // CALL.EQ 562 // fdffff0b
BL.NE jmp_label_2 // CALL.NE 562 // fcffff1b
BL.CS jmp_label_2 // CALL.CS 562 // fbffff2b
BL.CC jmp_label_2 // CALL.CC 562 // faffff3b
BL.MI jmp_label_2 // CALL.MI 562 // f9ffff4b
BL.PL jmp_label_2 // CALL.PL 562 // f8ffff5b
BL.VS jmp_label_2 // CALL.VS 562 // f7ffff6b
BL.VC jmp_label_2 // CALL.VC 562 // f6ffff7b
BL.HI jmp_label_2 // CALL.HI 562 // f5ffff8b
BL.LS jmp_label_2 // CALL.LS 562 // f4ffff9b
BL.GE jmp_label_2 // CALL.GE 562 // f3ffffab
BL.LT jmp_label_2 // CALL.LT 562 // f2ffffbb
BL.GT jmp_label_2 // CALL.GT 562 // f1ffffcb
BL.LE jmp_label_2 // CALL.LE 562 // f0ffffdb
BL jmp_label_2 // CALL 562 // efffffeb
BL 0(PC) // CALL 0(PC) // feffffeb
jmp_label_3:
BL jmp_label_3 // CALL // feffffeb
// BIC
BIC $255, R0, R1 // ff10c0e3
BIC $4278190080, R0, R1 // ff14c0e3
BIC.S $255, R0, R1 // ff10d0e3
BIC.S $4278190080, R0, R1 // ff14d0e3
BIC $255, R0 // ff00c0e3
BIC $4278190080, R0 // ff04c0e3
BIC.S $255, R0 // ff00d0e3
BIC.S $4278190080, R0 // ff04d0e3
BIC R0, R1, R2 // 0020c1e1
BIC.S R0, R1, R2 // 0020d1e1
BIC R0, R1 // 0010c1e1
BIC.S R0, R1 // 0010d1e1
BIC R0>>28, R1, R2 // 202ec1e1
BIC R0<<28, R1, R2 // 002ec1e1
BIC R0->28, R1, R2 // 402ec1e1
BIC R0@>28, R1, R2 // 602ec1e1
BIC.S R0>>28, R1, R2 // 202ed1e1
BIC.S R0<<28, R1, R2 // 002ed1e1
BIC.S R0->28, R1, R2 // 402ed1e1
BIC.S R0@>28, R1, R2 // 602ed1e1
BIC R0<<28, R1 // 001ec1e1
BIC R0>>28, R1 // 201ec1e1
BIC R0->28, R1 // 401ec1e1
BIC R0@>28, R1 // 601ec1e1
BIC.S R0<<28, R1 // 001ed1e1
BIC.S R0>>28, R1 // 201ed1e1
BIC.S R0->28, R1 // 401ed1e1
BIC.S R0@>28, R1 // 601ed1e1
BIC R0<<R1, R2, R3 // 1031c2e1
BIC R0>>R1, R2, R3 // 3031c2e1
BIC R0->R1, R2, R3 // 5031c2e1
BIC R0@>R1, R2, R3 // 7031c2e1
BIC.S R0<<R1, R2, R3 // 1031d2e1
BIC.S R0>>R1, R2, R3 // 3031d2e1
BIC.S R0->R1, R2, R3 // 5031d2e1
BIC.S R0@>R1, R2, R3 // 7031d2e1
BIC R0<<R1, R2 // 1021c2e1
BIC R0>>R1, R2 // 3021c2e1
BIC R0->R1, R2 // 5021c2e1
BIC R0@>R1, R2 // 7021c2e1
BIC.S R0<<R1, R2 // 1021d2e1
BIC.S R0>>R1, R2 // 3021d2e1
BIC.S R0->R1, R2 // 5021d2e1
BIC.S R0@>R1, R2 // 7021d2e1
// SRL
SRL $14, R5, R6 // 2567a0e1
SRL $15, R5, R6 // a567a0e1
SRL $30, R5, R6 // 256fa0e1
SRL $31, R5, R6 // a56fa0e1
SRL.S $14, R5, R6 // 2567b0e1
SRL.S $15, R5, R6 // a567b0e1
SRL.S $30, R5, R6 // 256fb0e1
SRL.S $31, R5, R6 // a56fb0e1
SRL $14, R5 // 2557a0e1
SRL $15, R5 // a557a0e1
SRL $30, R5 // 255fa0e1
SRL $31, R5 // a55fa0e1
SRL.S $14, R5 // 2557b0e1
SRL.S $15, R5 // a557b0e1
SRL.S $30, R5 // 255fb0e1
SRL.S $31, R5 // a55fb0e1
SRL R5, R6, R7 // 3675a0e1
SRL.S R5, R6, R7 // 3675b0e1
SRL R5, R7 // 3775a0e1
SRL.S R5, R7 // 3775b0e1
// SRA
SRA $14, R5, R6 // 4567a0e1
SRA $15, R5, R6 // c567a0e1
SRA $30, R5, R6 // 456fa0e1
SRA $31, R5, R6 // c56fa0e1
SRA.S $14, R5, R6 // 4567b0e1
SRA.S $15, R5, R6 // c567b0e1
SRA.S $30, R5, R6 // 456fb0e1
SRA.S $31, R5, R6 // c56fb0e1
SRA $14, R5 // 4557a0e1
SRA $15, R5 // c557a0e1
SRA $30, R5 // 455fa0e1
SRA $31, R5 // c55fa0e1
SRA.S $14, R5 // 4557b0e1
SRA.S $15, R5 // c557b0e1
SRA.S $30, R5 // 455fb0e1
SRA.S $31, R5 // c55fb0e1
SRA R5, R6, R7 // 5675a0e1
SRA.S R5, R6, R7 // 5675b0e1
SRA R5, R7 // 5775a0e1
SRA.S R5, R7 // 5775b0e1
// SLL
SLL $14, R5, R6 // 0567a0e1
SLL $15, R5, R6 // 8567a0e1
SLL $30, R5, R6 // 056fa0e1
SLL $31, R5, R6 // 856fa0e1
SLL.S $14, R5, R6 // 0567b0e1
SLL.S $15, R5, R6 // 8567b0e1
SLL.S $30, R5, R6 // 056fb0e1
SLL.S $31, R5, R6 // 856fb0e1
SLL $14, R5 // 0557a0e1
SLL $15, R5 // 8557a0e1
SLL $30, R5 // 055fa0e1
SLL $31, R5 // 855fa0e1
SLL.S $14, R5 // 0557b0e1
SLL.S $15, R5 // 8557b0e1
SLL.S $30, R5 // 055fb0e1
SLL.S $31, R5 // 855fb0e1
SLL R5, R6, R7 // 1675a0e1
SLL.S R5, R6, R7 // 1675b0e1
SLL R5, R7 // 1775a0e1
SLL.S R5, R7 // 1775b0e1
//
// END
//
......
......@@ -239,7 +239,6 @@ var optab = []Optab{
{AMOVWF, C_REG, C_NONE, C_FREG, 87, 8, 0, 0, 0},
{AMOVW, C_REG, C_NONE, C_FREG, 88, 4, 0, 0, 0},
{AMOVW, C_FREG, C_NONE, C_REG, 89, 4, 0, 0, 0},
{ATST, C_REG, C_NONE, C_NONE, 90, 4, 0, 0, 0},
{ALDREXD, C_SOREG, C_NONE, C_REG, 91, 4, 0, 0, 0},
{ASTREXD, C_SOREG, C_REG, C_REG, 92, 4, 0, 0, 0},
{APLD, C_SOREG, C_NONE, C_NONE, 95, 4, 0, 0, 0},
......@@ -1354,6 +1353,7 @@ func buildop(ctxt *obj.Link) {
case ACMP:
opset(ATEQ, r0)
opset(ACMN, r0)
opset(ATST, r0)
case AMVN:
break
......@@ -2287,11 +2287,6 @@ func asmout(ctxt *obj.Link, p *obj.Prog, o *Optab, out []uint32) {
o1 |= (uint32(p.From.Reg) & 15) << 16
o1 |= (uint32(p.To.Reg) & 15) << 12
case 90: /* tst reg */
o1 = oprrr(ctxt, -ACMP, int(p.Scond))
o1 |= (uint32(p.From.Reg) & 15) << 16
case 91: /* ldrexd oreg,reg */
aclass(ctxt, &p.From)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment