]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/internal/obj/arm64: fix assemble hlt/hvc/smc/brk/clrex bug
authorfanzha02 <fannie.zhang@arm.com>
Wed, 14 Jun 2017 03:42:36 +0000 (03:42 +0000)
committerCherry Zhang <cherryyz@google.com>
Mon, 20 Nov 2017 14:39:51 +0000 (14:39 +0000)
When instruction has only one argument, Go parser saves the
argument value into prog.From without any special handling.
But assembler gets the argument value from prog.To.

The fix adds special handling for CLREX and puts other instructions
arguments value into prog.From.

Uncomment hlt/hvc/smc/brk/dcps1/dcps2/dcps3/clrex test cases.

Fixes #20765

Change-Id: I1fc0d2faafb19b537cab5a665bd4af56c3a2c925
Reviewed-on: https://go-review.googlesource.com/78275
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
src/cmd/asm/internal/asm/testdata/arm64enc.s
src/cmd/internal/obj/arm64/asm7.go
src/cmd/internal/obj/arm64/obj7.go

index 2d53969a28bf6b4edf28d79cbfebfa703011fcc6..2c0f32e971877df072a3ff974c22d9b1ba4a3afd 100644 (file)
@@ -57,7 +57,7 @@ TEXT asmtest(SB),DUPOK|NOSPLIT,$-8
    CALL -1(PC)                                // ffffff97
    CALL (R15)                                 // e0013fd6
    JMP  (R29)                                 // a0031fd6
-   // BRK $35943                              // e08c31d4
+   BRK $35943                                 // e08c31d4
    CBNZW R2, -1(PC)                           // e2ffff35
    CBNZ R7, -1(PC)                            // e7ffffb5
    CBZW R15, -1(PC)                           // efffff34
@@ -81,8 +81,8 @@ TEXT asmtest(SB),DUPOK|NOSPLIT,$-8
    CINVW EQ, R2, R17                          // 5110825a
    CINV VS, R12, R7                           // 87718cda
    CINV VS, R30, R30                          // de739eda
-   // CLREX $4                                // 5f3403d5
-   // CLREX $0                                // 5f3003d5
+   CLREX $4                                   // 5f3403d5
+   CLREX $0                                   // 5f3003d5
    CLSW R15, R6                               // e615c05a
    CLS R15, ZR                                // ff15c0da
    CLZW R1, R14                               // 2e10c05a
@@ -128,9 +128,9 @@ TEXT asmtest(SB),DUPOK|NOSPLIT,$-8
    CSNEGW HS, R16, R29, R10                   // 0a269d5a
    CSNEG NE, R21, R18, R11                    // ab1692da
    //TODO DC
-   // DCPS1 $11378                            // 418ea5d4
-   // DCPS2 $10699                            // 6239a5d4
-   // DCPS3 $24415                            // e3ebabd4
+   DCPS1 $11378                               // 418ea5d4
+   DCPS2 $10699                               // 6239a5d4
+   DCPS3 $24415                               // e3ebabd4
    DMB $1                                     // bf3103d5
    DMB $0                                     // bf3003d5
    DRPS                                       // e003bfd6
@@ -145,8 +145,8 @@ TEXT asmtest(SB),DUPOK|NOSPLIT,$-8
    EXTR $35, R22, R12, R8                     // 888dd693
    SEVL                                       // bf2003d5
    HINT $6                                    // df2003d5
-   // HLT $65509                              // a0fc5fd4
-   // HVC $61428                              // 82fe1dd4
+   HLT $65509                                 // a0fc5fd4
+   HVC $61428                                 // 82fe1dd4
    ISB $1                                     // df3103d5
    ISB $15                                    // df3f03d5
    LDARW (R12), R29                           // 9dfddf88
@@ -304,7 +304,7 @@ TEXT asmtest(SB),DUPOK|NOSPLIT,$-8
    SMNEGL R26, R3, R15                        // 6ffc3a9b
    SMULH R17, R21, R21                        // b57e519b
    SMULL R0, R5, R0                           // a07c209b
-   // SMC $37977                              // 238b12d4
+   SMC $37977                                 // 238b12d4
    STLRW R16, (R22)                           // d0fe9f88
    STLR R3, (R24)                             // 03ff9fc8
    //TODO STLRB R11, (R22)                    // cbfe9f08
index fc0faf36f5f6b4b6704b8f5a063cefc3875ffd6f..c4aa6b62c81f843252df4a6fc9e9dd07cee1aebe 100644 (file)
@@ -271,7 +271,7 @@ var optab = []Optab{
        {ALSL, C_VCON, C_NONE, C_REG, 8, 4, 0, 0, 0},
        {ALSL, C_REG, C_NONE, C_REG, 9, 4, 0, 0, 0},
        {ALSL, C_REG, C_REG, C_REG, 9, 4, 0, 0, 0},
-       {ASVC, C_NONE, C_NONE, C_VCON, 10, 4, 0, 0, 0},
+       {ASVC, C_VCON, C_NONE, C_NONE, 10, 4, 0, 0, 0},
        {ASVC, C_NONE, C_NONE, C_NONE, 10, 4, 0, 0, 0},
        {ADWORD, C_NONE, C_NONE, C_VCON, 11, 8, 0, 0, 0},
        {ADWORD, C_NONE, C_NONE, C_LEXT, 11, 8, 0, 0, 0},
@@ -1914,8 +1914,8 @@ func buildop(ctxt *obj.Link) {
                        break
 
                case ASVC:
-                       oprangeset(AHLT, t)
                        oprangeset(AHVC, t)
+                       oprangeset(AHLT, t)
                        oprangeset(ASMC, t)
                        oprangeset(ABRK, t)
                        oprangeset(ADCPS1, t)
@@ -2301,8 +2301,8 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) {
        case 10: /* brk/hvc/.../svc [$con] */
                o1 = c.opimm(p, p.As)
 
-               if p.To.Type != obj.TYPE_NONE {
-                       o1 |= uint32((p.To.Offset & 0xffff) << 5)
+               if p.From.Type != obj.TYPE_NONE {
+                       o1 |= uint32((p.From.Offset & 0xffff) << 5)
                }
 
        case 11: /* dword */
index 7f22aa88bb8ff13825f82562de43fa2ce9175c21..709223223f33d7a62ce46be4bbdc6a1cf40cde57 100644 (file)
@@ -813,7 +813,7 @@ var unaryDst = map[obj.As]bool{
        ADWORD: true,
        ABL:    true,
        AB:     true,
-       ASVC:   true,
+       ACLREX: true,
 }
 
 var Linkarm64 = obj.LinkArch{