Closed
Description
On a 32-bit system, an expression like uint64value & constantUint64Mask
could easily be decomposed two 32-bit mask operations. That does not seem to happen (see below, especially the OR instructions). It seems like probably it should.
$ cat x.go
package p
func f(x uint64) uint64 {
return x & (1<<60 - 1)
}
$ GOARCH=arm go build -gcflags=-S x.go
# command-line-arguments
"".f STEXT size=40 args=0x10 locals=0x0 leaf
0x0000 00000 (/Users/rsc/x.go:3) TEXT "".f(SB), LEAF|NOFRAME|ABIInternal, $-4-16
0x0000 00000 (/Users/rsc/x.go:3) FUNCDATA $0, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
0x0000 00000 (/Users/rsc/x.go:3) FUNCDATA $1, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
0x0000 00000 (/Users/rsc/x.go:3) FUNCDATA $2, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
0x0000 00000 (/Users/rsc/x.go:4) PCDATA $0, $0
0x0000 00000 (/Users/rsc/x.go:4) PCDATA $1, $0
0x0000 00000 (/Users/rsc/x.go:4) MOVW "".x(FP), R0
0x0004 00004 (/Users/rsc/x.go:4) SRL $28, R0, R1
0x0008 00008 (/Users/rsc/x.go:4) MOVW "".x+4(FP), R2
0x000c 00012 (/Users/rsc/x.go:4) ORR R2<<4, R1, R1
0x0010 00016 (/Users/rsc/x.go:4) BFXU $28, R0, $0, R0
0x0014 00020 (/Users/rsc/x.go:4) ORR R1<<28, R0, R0
0x0018 00024 (/Users/rsc/x.go:4) MOVW R0, "".~r1+8(FP)
0x001c 00028 (/Users/rsc/x.go:4) SRL $4, R1, R0
0x0020 00032 (/Users/rsc/x.go:4) MOVW R0, "".~r1+12(FP)
0x0024 00036 (/Users/rsc/x.go:4) JMP (R14)
...
$ GOARCH=386 go build -gcflags=-S x.go
# command-line-arguments
"".f STEXT size=62 args=0x10 locals=0x0
0x0000 00000 (/Users/rsc/x.go:3) TEXT "".f(SB), ABIInternal, $0-16
0x0000 00000 (/Users/rsc/x.go:3) MOVL (TLS), CX
0x0007 00007 (/Users/rsc/x.go:3) CMPL SP, 8(CX)
0x000a 00010 (/Users/rsc/x.go:3) JLS 55
0x000c 00012 (/Users/rsc/x.go:3) FUNCDATA $0, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
0x000c 00012 (/Users/rsc/x.go:3) FUNCDATA $1, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
0x000c 00012 (/Users/rsc/x.go:3) FUNCDATA $2, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
0x000c 00012 (/Users/rsc/x.go:4) PCDATA $0, $0
0x000c 00012 (/Users/rsc/x.go:4) PCDATA $1, $0
0x000c 00012 (/Users/rsc/x.go:4) MOVL "".x+8(SP), AX
0x0010 00016 (/Users/rsc/x.go:4) SHLL $4, AX
0x0013 00019 (/Users/rsc/x.go:4) MOVL "".x+4(SP), CX
0x0017 00023 (/Users/rsc/x.go:4) MOVL CX, DX
0x0019 00025 (/Users/rsc/x.go:4) SHRL $28, CX
0x001c 00028 (/Users/rsc/x.go:4) ORL AX, CX
0x001e 00030 (/Users/rsc/x.go:4) SHLL $4, DX
0x0021 00033 (/Users/rsc/x.go:4) SHRL $4, DX
0x0024 00036 (/Users/rsc/x.go:4) MOVL CX, AX
0x0026 00038 (/Users/rsc/x.go:4) SHLL $28, CX
0x0029 00041 (/Users/rsc/x.go:4) ORL DX, CX
0x002b 00043 (/Users/rsc/x.go:4) MOVL CX, "".~r1+12(SP)
0x002f 00047 (/Users/rsc/x.go:4) SHRL $4, AX
0x0032 00050 (/Users/rsc/x.go:4) MOVL AX, "".~r1+16(SP)
0x0036 00054 (/Users/rsc/x.go:4) RET
0x0037 00055 (/Users/rsc/x.go:4) NOP
0x0037 00055 (/Users/rsc/x.go:3) PCDATA $1, $-1
0x0037 00055 (/Users/rsc/x.go:3) PCDATA $0, $-1
0x0037 00055 (/Users/rsc/x.go:3) CALL runtime.morestack_noctxt(SB)
0x003c 00060 (/Users/rsc/x.go:3) JMP 0