Skip to content

Commit db423dd

Browse files
MouseSplintermengzhuo
authored andcommitted
cmd/internal/obj: support Zba, Zbb, Zbs extensions in riscv64 assembler
Add assembler support for Zba, Zbb, Zbs extensions, which are mandatory in the rva22u64 profile. These can be used to accelerate address computation and bit manipulation. Change-Id: Ie90fe6b76b1382cf69984a0e71a72d3cba0e750a Reviewed-on: https://go-review.googlesource.com/c/go/+/559655 Reviewed-by: M Zhuo <[email protected]> Run-TryBot: Joel Sing <[email protected]> Reviewed-by: David Chase <[email protected]> Reviewed-by: Joel Sing <[email protected]> Reviewed-by: Keith Randall <[email protected]> TryBot-Result: Gopher Robot <[email protected]> LUCI-TryBot-Result: Go LUCI <[email protected]>
1 parent e39af55 commit db423dd

File tree

5 files changed

+336
-38
lines changed

5 files changed

+336
-38
lines changed

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

Lines changed: 78 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,84 @@ start:
339339
// 12.6: Double-Precision Floating-Point Classify Instruction
340340
FCLASSD F0, X5 // d31200e2
341341

342+
// RISC-V Bit-Manipulation ISA-extensions (1.0)
343+
// 1.1: Address Generation Instructions (Zba)
344+
ADDUW X10, X11, X12 // 3b86a508
345+
ADDUW X10, X11 // bb85a508
346+
SH1ADD X11, X12, X13 // b326b620
347+
SH1ADD X11, X12 // 3326b620
348+
SH1ADDUW X12, X13, X14 // 3ba7c620
349+
SH1ADDUW X12, X13 // bba6c620
350+
SH2ADD X13, X14, X15 // b347d720
351+
SH2ADD X13, X14 // 3347d720
352+
SH2ADDUW X14, X15, X16 // 3bc8e720
353+
SH2ADDUW X14, X15 // bbc7e720
354+
SH3ADD X15, X16, X17 // b368f820
355+
SH3ADD X15, X16 // 3368f820
356+
SH3ADDUW X16, X17, X18 // 3be90821
357+
SH3ADDUW X16, X17 // bbe80821
358+
SLLIUW $31, X17, X18 // 1b99f809
359+
SLLIUW $63, X17 // 9b98f80b
360+
SLLIUW $63, X17, X18 // 1b99f80b
361+
SLLIUW $1, X18, X19 // 9b191908
362+
363+
// 1.2: Basic Bit Manipulation (Zbb)
364+
ANDN X19, X20, X21 // b37a3a41
365+
ANDN X19, X20 // 337a3a41
366+
CLZ X20, X21 // 931a0a60
367+
CLZW X21, X22 // 1b9b0a60
368+
CPOP X22, X23 // 931b2b60
369+
CPOPW X23, X24 // 1b9c2b60
370+
CTZ X24, X25 // 931c1c60
371+
CTZW X25, X26 // 1b9d1c60
372+
MAX X26, X28, X29 // b36eae0b
373+
MAX X26, X28 // 336eae0b
374+
MAXU X28, X29, X30 // 33ffce0b
375+
MAXU X28, X29 // b3fece0b
376+
MIN X29, X30, X5 // b342df0b
377+
MIN X29, X30 // 334fdf0b
378+
MINU X30, X5, X6 // 33d3e20b
379+
MINU X30, X5 // b3d2e20b
380+
ORN X6, X7, X8 // 33e46340
381+
ORN X6, X7 // b3e36340
382+
SEXTB X16, X17 // 93184860
383+
SEXTH X17, X18 // 13995860
384+
XNOR X18, X19, X20 // 33ca2941
385+
XNOR X18, X19 // b3c92941
386+
ZEXTH X19, X20 // 3bca0908
387+
388+
// 1.3: Bitwise Rotation (Zbb)
389+
ROL X8, X9, X10 // 33958460 or b30f8040b3dff4013395840033e5af00
390+
ROL X8, X9 // b3948460 or b30f8040b3dff401b3948400b3e49f00
391+
ROLW X9, X10, X11 // bb159560 or b30f9040bb5ff501bb159500b3e5bf00
392+
ROLW X9, X10 // 3b159560 or b30f9040bb5ff5013b15950033e5af00
393+
ROR X10, X11, X12 // 33d6a560 or b30fa040b39ff50133d6a50033e6cf00
394+
ROR X10, X11 // b3d5a560 or b30fa040b39ff501b3d5a500b3e5bf00
395+
ROR $63, X11 // 93d5f563 or 93dff50393951500b3e5bf00
396+
RORI $63, X11, X12 // 13d6f563 or 93dff5031396150033e6cf00
397+
RORI $1, X12, X13 // 93561660 or 935f16009316f603b3e6df00
398+
RORIW $31, X13, X14 // 1bd7f661 or 9bdff6011b97160033e7ef00
399+
RORIW $1, X14, X15 // 9b571760 or 9b5f17009b17f701b3e7ff00
400+
RORW X15, X16, X17 // bb58f860 or b30ff040bb1ff801bb58f800b3e81f01
401+
RORW X15, X16 // 3b58f860 or b30ff040bb1ff8013b58f80033e80f01
402+
RORW $31, X13 // 9bd6f661 or 9bdff6019b961600b3e6df00
403+
ORCB X5, X6 // 13d37228
404+
REV8 X7, X8 // 13d4836b
405+
406+
// 1.5: Single-bit Instructions (Zbs)
407+
BCLR X23, X24, X25 // b31c7c49
408+
BCLR $63, X24 // 131cfc4b
409+
BCLRI $1, X25, X26 // 139d1c48
410+
BEXT X26, X28, X29 // b35eae49
411+
BEXT $63, X28 // 135efe4b
412+
BEXTI $1, X29, X30 // 13df1e48
413+
BINV X30, X5, X6 // 3393e269
414+
BINV $63, X6 // 1313f36b
415+
BINVI $1, X7, X8 // 13941368
416+
BSET X8, X9, X10 // 33958428
417+
BSET $63, X9 // 9394f42b
418+
BSETI $1, X10, X11 // 93151528
419+
342420
// Privileged ISA
343421

344422
// 3.2.1: Environment Call and Breakpoint
@@ -417,24 +495,6 @@ start:
417495
NEGW X5 // bb025040
418496
NEGW X5, X6 // 3b035040
419497

420-
// Bitwise rotation pseudo-instructions
421-
ROL X5, X6, X7 // b30f5040b35ff301b3135300b3e37f00
422-
ROL X5, X6 // b30f5040b35ff3013313530033e36f00
423-
ROLW X5, X6, X7 // b30f5040bb5ff301bb135300b3e37f00
424-
ROLW X5, X6 // b30f5040bb5ff3013b13530033e36f00
425-
ROR X5, X6, X7 // b30f5040b31ff301b3535300b3e37f00
426-
ROR X5, X6 // b30f5040b31ff3013353530033e36f00
427-
RORW X5, X6, X7 // b30f5040bb1ff301bb535300b3e37f00
428-
RORW X5, X6 // b30f5040bb1ff3013b53530033e36f00
429-
RORI $5, X6, X7 // 935f53009313b303b3e37f00
430-
RORI $5, X6 // 935f53001313b30333e36f00
431-
RORIW $5, X6, X7 // 9b5f53009b13b301b3e37f00
432-
RORIW $5, X6 // 9b5f53001b13b30133e36f00
433-
ROR $5, X6, X7 // 935f53009313b303b3e37f00
434-
ROR $5, X6 // 935f53001313b30333e36f00
435-
RORW $5, X6, X7 // 9b5f53009b13b301b3e37f00
436-
RORW $5, X6 // 9b5f53001b13b30133e36f00
437-
438498
// This jumps to the second instruction in the function (the
439499
// first instruction is an invisible stack pointer adjustment).
440500
JMP start // JMP 2

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

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

src/cmd/internal/obj/riscv/cpu.go

Lines changed: 52 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -572,6 +572,58 @@ const (
572572
// 4.2.1: Supervisor Memory-Management Fence Instruction
573573
ASFENCEVMA
574574

575+
//
576+
// RISC-V Bit-Manipulation ISA-extensions (1.0)
577+
//
578+
579+
// 1.1: Address Generation Instructions (Zba)
580+
AADDUW
581+
ASH1ADD
582+
ASH1ADDUW
583+
ASH2ADD
584+
ASH2ADDUW
585+
ASH3ADD
586+
ASH3ADDUW
587+
ASLLIUW
588+
589+
// 1.2: Basic Bit Manipulation (Zbb)
590+
AANDN
591+
AORN
592+
AXNOR
593+
ACLZ
594+
ACLZW
595+
ACTZ
596+
ACTZW
597+
ACPOP
598+
ACPOPW
599+
AMAX
600+
AMAXU
601+
AMIN
602+
AMINU
603+
ASEXTB
604+
ASEXTH
605+
AZEXTH
606+
607+
// 1.3: Bitwise Rotation (Zbb)
608+
AROL
609+
AROLW
610+
AROR
611+
ARORI
612+
ARORIW
613+
ARORW
614+
AORCB
615+
AREV8
616+
617+
// 1.5: Single-bit Instructions (Zbs)
618+
ABCLR
619+
ABCLRI
620+
ABEXT
621+
ABEXTI
622+
ABINV
623+
ABINVI
624+
ABSET
625+
ABSETI
626+
575627
// The escape hatch. Inserts a single 32-bit word.
576628
AWORD
577629

@@ -605,12 +657,6 @@ const (
605657
ANEG
606658
ANEGW
607659
ANOT
608-
AROL
609-
AROLW
610-
AROR
611-
ARORI
612-
ARORIW
613-
ARORW
614660
ASEQZ
615661
ASNEZ
616662

0 commit comments

Comments
 (0)