]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/internal/obj/loong64: Add preld{,x} instructions support
authorGuoqi Chen <chenguoqi@loongson.cn>
Fri, 25 Apr 2025 02:53:04 +0000 (10:53 +0800)
committerabner chenc <chenguoqi@loongson.cn>
Tue, 13 May 2025 00:41:20 +0000 (17:41 -0700)
Go asm syntax:
PRELD 16(R4), $8
PRELDX (R4)(R5), $8

Equivalent platform assembler syntax:
preld $8, $r4, 16
preldx $8, $r4, $r5

Change-Id: Ie81d22ebaf4153388a7e9d8fa0f618a0ae7a1c9f
Reviewed-on: https://go-review.googlesource.com/c/go/+/671875
Reviewed-by: sophie zhao <zhaoxiaolin@loongson.cn>
Reviewed-by: Meidan Li <limeidan@loongson.cn>
Reviewed-by: Cherry Mui <cherryyz@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
src/cmd/asm/internal/arch/loong64.go
src/cmd/asm/internal/asm/asm.go
src/cmd/asm/internal/asm/testdata/loong64enc1.s
src/cmd/internal/obj/loong64/a.out.go
src/cmd/internal/obj/loong64/anames.go
src/cmd/internal/obj/loong64/asm.go

index d9e428d953bb99e1d4c0898ff83bb576c758b590..bf5175f4a0bad6263b671db3ff5a55bcbd889fb3 100644 (file)
@@ -46,6 +46,14 @@ func IsLoong64RDTIME(op obj.As) bool {
        return false
 }
 
+func IsLoong64PRELD(op obj.As) bool {
+       switch op {
+       case loong64.APRELD, loong64.APRELDX:
+               return true
+       }
+       return false
+}
+
 func IsLoong64AMO(op obj.As) bool {
        return loong64.IsAtomicInst(op)
 }
index a1f6a73d70810318d037f76315fe7946ae071180..c8ad5d28e19fb0ee16b9e3ea81741bcac54de6fc 100644 (file)
@@ -654,6 +654,12 @@ func (p *Parser) asmInstruction(op obj.As, cond string, a []obj.Addr) {
                                prog.RegTo2 = a[1].Reg
                                break
                        }
+
+                       if arch.IsLoong64PRELD(op) {
+                               prog.From = a[0]
+                               prog.AddRestSource(a[1])
+                               break
+                       }
                }
                prog.From = a[0]
                prog.To = a[1]
index 494023ee657fe90dbc6a18ae5163561443ad0726..083670f512ee5d98d51aa9a80f14375ab710eb44 100644 (file)
@@ -1010,3 +1010,11 @@ lable2:
        VFCLASSD        V1, V2          // 22d89c72
        XVFCLASSF       X1, X2          // 22d49c76
        XVFCLASSD       X1, X2          // 22d89c76
+
+       // PRELD{,X} instructions
+       PRELD   (R4), $0                // 8000c02a
+       PRELD   -1(R4), $8              // 88fcff2a
+       PRELD   8(R4),  $31             // 9f20c02a
+       PRELDX  (R4)(R5), $0            // 80142c38
+       PRELDX  (R4)(R6), $8            // 88182c38
+       PRELDX  (R4)(R7), $31           // 9f1c2c38
index 97a4d6c179c449d673c2d3cc87da7f9b822f82bb..d46d6ce962307c380b1f261a19afb433a57f31ee 100644 (file)
@@ -663,6 +663,10 @@ const (
        ABSTRPICKW
        ABSTRPICKV
 
+       // 2.2.5.4. Prefetch Instructions
+       APRELD
+       APRELDX
+
        // 2.2.9. CRC Check Instructions
        ACRCWBW
        ACRCWHW
index 0c1a6ea0c6f20f8969620028e3c77774d4ff4adf..bf9b0722cc39d7391d415bb4be9b29a53e4f87fa 100644 (file)
@@ -199,6 +199,8 @@ var Anames = []string{
        "BSTRINSV",
        "BSTRPICKW",
        "BSTRPICKV",
+       "PRELD",
+       "PRELDX",
        "CRCWBW",
        "CRCWHW",
        "CRCWWW",
index 6723c67b3fc389edb02b0f6556340610276cfd1d..2f5cf94707fa68065bb3f1b21211bf648647e984 100644 (file)
@@ -412,6 +412,9 @@ var optab = []Optab{
 
        {AVMOVQ, C_ELEM, C_NONE, C_NONE, C_ARNG, C_NONE, 45, 4, 0, 0},
 
+       {APRELD, C_SOREG, C_NONE, C_U5CON, C_NONE, C_NONE, 46, 4, 0, 0},
+       {APRELDX, C_ROFF, C_NONE, C_U5CON, C_NONE, C_NONE, 47, 4, 0, 0},
+
        {obj.APCALIGN, C_U12CON, C_NONE, C_NONE, C_NONE, C_NONE, 0, 0, 0, 0},
        {obj.APCDATA, C_32CON, C_NONE, C_NONE, C_32CON, C_NONE, 0, 0, 0, 0},
        {obj.APCDATA, C_DCON, C_NONE, C_NONE, C_DCON, C_NONE, 0, 0, 0, 0},
@@ -1486,6 +1489,8 @@ func buildop(ctxt *obj.Link) {
                        ANEGW,
                        ANEGV,
                        AWORD,
+                       APRELD,
+                       APRELDX,
                        obj.ANOP,
                        obj.ATEXT,
                        obj.AFUNCDATA,
@@ -1907,6 +1912,10 @@ func OP_16IRR(op uint32, i uint32, r2 uint32, r3 uint32) uint32 {
        return op | (i&0xFFFF)<<10 | (r2&0x1F)<<5 | (r3&0x1F)<<0
 }
 
+func OP_12IR_5I(op uint32, i1 uint32, r2 uint32, i2 uint32) uint32 {
+       return op | (i1&0xFFF)<<10 | (r2&0x1F)<<5 | (i2&0x1F)<<0
+}
+
 func OP_12IRR(op uint32, i uint32, r2 uint32, r3 uint32) uint32 {
        return op | (i&0xFFF)<<10 | (r2&0x1F)<<5 | (r3&0x1F)<<0
 }
@@ -2444,6 +2453,17 @@ func (c *ctxt0) asmout(p *obj.Prog, o *Optab, out []uint32) {
                c.checkindex(p, index, m)
                o1 = v | (index << 10) | (vj << 5) | vd
 
+       case 46:
+               // preld  offset(Rbase), hint
+               offs := c.regoff(&p.From)
+               hint := p.GetFrom3().Offset
+               o1 = OP_12IR_5I(c.opiir(p.As), uint32(offs), uint32(p.From.Reg), uint32(hint))
+
+       case 47:
+               // preldx (Rbase)(Roff), hint
+               hint := p.GetFrom3().Offset
+               o1 = OP_5IRR(c.opirr(p.As), uint32(p.From.Index), uint32(p.From.Reg), uint32(hint))
+
        case 49:
                if p.As == ANOOP {
                        // andi r0, r0, 0
@@ -3836,7 +3856,8 @@ func (c *ctxt0) opirr(a obj.As) uint32 {
                return 0x12<<26 | 0x1<<8
        case ABFPF:
                return 0x12<<26 | 0x0<<8
-
+       case APRELDX:
+               return 0x07058 << 15 // preldx
        case AMOVB,
                AMOVBU:
                return 0x0a4 << 22
@@ -4063,6 +4084,15 @@ func (c *ctxt0) opirir(a obj.As) uint32 {
        return 0
 }
 
+func (c *ctxt0) opiir(a obj.As) uint32 {
+       switch a {
+       case APRELD:
+               return 0x0AB << 22 // preld
+       }
+
+       return 0
+}
+
 func (c *ctxt0) specialFpMovInst(a obj.As, fclass int, tclass int) uint32 {
        switch a {
        case AMOVV: