From 5e4000ad7ff153d90e77c97d7f29d3a2fa6c7de0 Mon Sep 17 00:00:00 2001 From: "Paul E. Murphy" Date: Tue, 11 Jul 2023 09:07:43 -0500 Subject: cmd/compile: on PPC64, fix sign/zero extension when masking (ANDCCconst [y] (MOV.*reg x)) should only be merged when zero extending. Otherwise, sign bits are lost on negative values. (ANDCCconst [0xFF] (MOVBreg x)) should be simplified to a zero extension of x. Likewise for the MOVHreg variant. Fixes #61297 Change-Id: I04e4fd7dc6a826e870681f37506620d48393698b Reviewed-on: https://go-review.googlesource.com/c/go/+/508775 TryBot-Result: Gopher Robot Run-TryBot: Paul Murphy Reviewed-by: Bryan Mills Reviewed-by: Cherry Mui --- test/codegen/bits.go | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'test/codegen/bits.go') diff --git a/test/codegen/bits.go b/test/codegen/bits.go index 4f70627c25..018f5b909e 100644 --- a/test/codegen/bits.go +++ b/test/codegen/bits.go @@ -374,3 +374,23 @@ func foldConstOutOfRange(a uint64) uint64 { // arm64: "MOVD\t[$]19088744",-"ADD\t[$]19088744" return a + 0x1234568 } + +// Verify sign-extended values are not zero-extended under a bit mask (#61297) +func signextendAndMask8to64(a int8) (s, z uint64) { + // ppc64x: "MOVB", "ANDCC\t[$]1015," + s = uint64(a) & 0x3F7 + // ppc64x: -"MOVB", "ANDCC\t[$]247," + z = uint64(uint8(a)) & 0x3F7 + return + +} + +// Verify zero-extended values are not sign-extended under a bit mask (#61297) +func zeroextendAndMask8to64(a int8, b int16) (x, y uint64) { + // ppc64x: -"MOVB\t", -"ANDCC", "MOVBZ" + x = uint64(a) & 0xFF + // ppc64x: -"MOVH\t", -"ANDCC", "MOVHZ" + y = uint64(b) & 0xFFFF + return + +} -- cgit v1.3