Skip to content

Commit 4c7362e

Browse files
limeidanabner-chenc
authored andcommitted
cmd/internal/obj/loong64: add new instructions ALSL{W/WU/V} for loong64
Go asm syntax: ALSL{W/WU/V} $3, R4, R5, R6 Equivalent platform assembler syntax: alsl.{w/wu/d} $r6, $r4, $r5, 3 Change-Id: Ic8364dfe2753bcea7de6cffe656ca0dde6875766 Reviewed-on: https://go-review.googlesource.com/c/go/+/692136 Reviewed-by: Dmitri Shuralyov <[email protected]> Reviewed-by: abner chenc <[email protected]> Reviewed-by: Mark Freeman <[email protected]> LUCI-TryBot-Result: Go LUCI <[email protected]> Reviewed-by: sophie zhao <[email protected]>
1 parent a552737 commit 4c7362e

File tree

4 files changed

+40
-0
lines changed

4 files changed

+40
-0
lines changed

src/cmd/asm/internal/asm/testdata/loong64enc1.s

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1095,3 +1095,8 @@ lable2:
10951095
XVBITREVH $15, X2, X1 // 417c1877
10961096
XVBITREVW $31, X2, X1 // 41fc1877
10971097
XVBITREVV $63, X2, X1 // 41fc1977
1098+
1099+
// ALSL{W/WU/D}
1100+
ALSLW $3, R4, R5, R6 // 86940500
1101+
ALSLWU $3, R4, R5, R6 // 86940700
1102+
ALSLV $3, R4, R5, R6 // 86942d00

src/cmd/internal/obj/loong64/a.out.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -567,6 +567,11 @@ const (
567567
AMOVVF
568568
AMOVVD
569569

570+
// 2.2.1.3
571+
AALSLW
572+
AALSLWU
573+
AALSLV
574+
570575
// 2.2.1.8
571576
AORN
572577
AANDN

src/cmd/internal/obj/loong64/anames.go

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/cmd/internal/obj/loong64/asm.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,8 @@ var optab = []Optab{
422422
{APRELD, C_SOREG, C_U5CON, C_NONE, C_NONE, C_NONE, 47, 4, 0, 0},
423423
{APRELDX, C_SOREG, C_DCON, C_U5CON, C_NONE, C_NONE, 48, 20, 0, 0},
424424

425+
{AALSLV, C_U2CON, C_REG, C_REG, C_REG, C_NONE, 64, 4, 0, 0},
426+
425427
{obj.APCALIGN, C_U12CON, C_NONE, C_NONE, C_NONE, C_NONE, 0, 0, 0, 0},
426428
{obj.APCDATA, C_32CON, C_NONE, C_NONE, C_32CON, C_NONE, 0, 0, 0, 0},
427429
{obj.APCDATA, C_DCON, C_NONE, C_NONE, C_DCON, C_NONE, 0, 0, 0, 0},
@@ -1492,6 +1494,10 @@ func buildop(ctxt *obj.Link) {
14921494
case ABFPT:
14931495
opset(ABFPF, r0)
14941496

1497+
case AALSLV:
1498+
opset(AALSLW, r0)
1499+
opset(AALSLWU, r0)
1500+
14951501
case AMOVW,
14961502
AMOVD,
14971503
AMOVF,
@@ -1948,6 +1954,10 @@ func OP_RR(op uint32, r2 uint32, r3 uint32) uint32 {
19481954
return op | (r2&0x1F)<<5 | (r3&0x1F)<<0
19491955
}
19501956

1957+
func OP_2IRRR(op uint32, i uint32, r2 uint32, r3 uint32, r4 uint32) uint32 {
1958+
return op | (i&0x3)<<15 | (r2&0x1F)<<10 | (r3&0x1F)<<5 | (r4&0x1F)<<0
1959+
}
1960+
19511961
func OP_16IR_5I(op uint32, i uint32, r2 uint32) uint32 {
19521962
return op | (i&0xFFFF)<<10 | (r2&0x1F)<<5 | ((i >> 16) & 0x1F)
19531963
}
@@ -2717,6 +2727,10 @@ func (c *ctxt0) asmout(p *obj.Prog, o *Optab, out []uint32) {
27172727
case 62: // rdtimex rd, rj
27182728
o1 = OP_RR(c.oprr(p.As), uint32(p.To.Reg), uint32(p.RegTo2))
27192729

2730+
case 64: // alsl rd, rj, rk, sa2
2731+
r := p.GetFrom3().Reg
2732+
o1 = OP_2IRRR(c.opirrr(p.As), uint32(p.From.Offset), uint32(r), uint32(p.Reg), uint32(p.To.Reg))
2733+
27202734
case 65: // mov sym@GOT, r ==> pcalau12i + ld.d
27212735
o1 = OP_IR(c.opir(APCALAU12I), uint32(0), uint32(p.To.Reg))
27222736
c.cursym.AddRel(c.ctxt, obj.Reloc{
@@ -4244,6 +4258,19 @@ func (c *ctxt0) opirr(a obj.As) uint32 {
42444258
return 0
42454259
}
42464260

4261+
func (c *ctxt0) opirrr(a obj.As) uint32 {
4262+
switch a {
4263+
case AALSLW:
4264+
return 0x2 << 17 // alsl.w
4265+
case AALSLWU:
4266+
return 0x3 << 17 // alsl.wu
4267+
case AALSLV:
4268+
return 0x16 << 17 // alsl.d
4269+
}
4270+
4271+
return 0
4272+
}
4273+
42474274
func (c *ctxt0) opirir(a obj.As) uint32 {
42484275
switch a {
42494276
case ABSTRINSW:

0 commit comments

Comments
 (0)