mirror of
https://github.com/golang/go
synced 2024-11-17 19:04:47 -07:00
cmd/internal/obj/arm64: fix encoding of AND MBCON
When a constant is both MOVCON (can fit into a MOV instruction) and BITCON (can fit into a logical instruction), the assembler chooses to use the MOVCON encoding, which is actually longer for logical instructions. We add MBCON rules explicitly to make sure it uses the BITCON encoding. Updates #19857. Change-Id: Ib9881be363cbc491ac2a0792b36b87e74eff34a8 Reviewed-on: https://go-review.googlesource.com/39652 Run-TryBot: Cherry Zhang <cherryyz@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: David Chase <drchase@google.com>
This commit is contained in:
parent
257b01f8f4
commit
0bae9b083b
9
src/cmd/asm/internal/asm/testdata/arm64.s
vendored
9
src/cmd/asm/internal/asm/testdata/arm64.s
vendored
@ -45,6 +45,15 @@ TEXT foo(SB), 7, $-8
|
||||
ADD R1->33, R2
|
||||
AND R1@>33, R2
|
||||
|
||||
// logical ops
|
||||
// make sure constants get encoded into an instruction when it could
|
||||
AND $(1<<63), R1 // AND $-9223372036854775808, R1 // 21004192
|
||||
AND $(1<<63-1), R1 // AND $9223372036854775807, R1 // 21f84092
|
||||
ORR $(1<<63), R1 // ORR $-9223372036854775808, R1 // 210041b2
|
||||
ORR $(1<<63-1), R1 // ORR $9223372036854775807, R1 // 21f840b2
|
||||
EOR $(1<<63), R1 // EOR $-9223372036854775808, R1 // 210041d2
|
||||
EOR $(1<<63-1), R1 // EOR $9223372036854775807, R1 // 21f840d2
|
||||
|
||||
//
|
||||
// CLS
|
||||
//
|
||||
|
@ -254,6 +254,9 @@ const (
|
||||
)
|
||||
|
||||
const (
|
||||
// optab is sorted based on the order of these constants
|
||||
// and the first match is chosen.
|
||||
// The more specific class needs to come earlier.
|
||||
C_NONE = iota
|
||||
C_REG // R0..R30
|
||||
C_RSP // R0..R30, RSP
|
||||
@ -266,13 +269,13 @@ const (
|
||||
C_COND // EQ, NE, etc
|
||||
|
||||
C_ZCON // $0 or ZR
|
||||
C_ABCON0 // could be C_ADDCON0 or C_BITCON
|
||||
C_ADDCON0 // 12-bit unsigned, unshifted
|
||||
C_ABCON // could be C_ADDCON or C_BITCON
|
||||
C_ADDCON // 12-bit unsigned, shifted left by 0 or 12
|
||||
C_MBCON // could be C_MOVCON or C_BITCON
|
||||
C_MOVCON // generated by a 16-bit constant, optionally inverted and/or shifted by multiple of 16
|
||||
C_BITCON // bitfield and logical immediate masks
|
||||
C_ABCON0 // could be C_ADDCON0 or C_BITCON
|
||||
C_ABCON // could be C_ADDCON or C_BITCON
|
||||
C_MBCON // could be C_MOVCON or C_BITCON
|
||||
C_LCON // 32-bit constant
|
||||
C_VCON // 64-bit constant
|
||||
C_FCON // floating-point constant
|
||||
|
@ -190,6 +190,10 @@ var optab = []Optab{
|
||||
{AAND, C_REG, C_NONE, C_REG, 1, 4, 0, 0, 0},
|
||||
{ABIC, C_REG, C_REG, C_REG, 1, 4, 0, 0, 0},
|
||||
{ABIC, C_REG, C_NONE, C_REG, 1, 4, 0, 0, 0},
|
||||
{AAND, C_MBCON, C_REG, C_REG, 53, 4, 0, 0, 0},
|
||||
{AAND, C_MBCON, C_NONE, C_REG, 53, 4, 0, 0, 0},
|
||||
{ABIC, C_MBCON, C_REG, C_REG, 53, 4, 0, 0, 0},
|
||||
{ABIC, C_MBCON, C_NONE, C_REG, 53, 4, 0, 0, 0},
|
||||
{AAND, C_BITCON, C_REG, C_REG, 53, 4, 0, 0, 0},
|
||||
{AAND, C_BITCON, C_NONE, C_REG, 53, 4, 0, 0, 0},
|
||||
{ABIC, C_BITCON, C_REG, C_REG, 53, 4, 0, 0, 0},
|
||||
|
Loading…
Reference in New Issue
Block a user