| // run |
| |
| // Copyright 2024 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package main |
| |
| import ( |
| "fmt" |
| ) |
| |
| type someType []uint64 |
| |
| func (s *someType) push(v uint64) { |
| *s = append(*s, v) |
| } |
| |
| func (s *someType) problematicFn(x1Lo, x1Hi, x2Lo, x2Hi uint64) { |
| r1 := int32(int16(x1Lo>>0)) * int32(int16(x2Lo>>0)) |
| g() |
| r3 := int32(int16(x1Lo>>32)) * int32(int16(x2Lo>>32)) |
| r4 := int32(int16(x1Lo>>48)) * int32(int16(x2Lo>>48)) |
| r5 := int32(int16(x1Hi>>0)) * int32(int16(x2Hi>>0)) |
| r7 := int32(int16(x1Hi>>32)) * int32(int16(x2Hi>>32)) |
| r8 := int32(int16(x1Hi>>48)) * int32(int16(x2Hi>>48)) |
| s.push(uint64(uint32(r1)) | (uint64(uint32(r3+r4)) << 32)) |
| s.push(uint64(uint32(r5)) | (uint64(uint32(r7+r8)) << 32)) |
| } |
| |
| //go:noinline |
| func g() { |
| } |
| |
| func main() { |
| s := &someType{} |
| s.problematicFn(0x1000100010001, 0x1000100010001, 0xffffffffffffffff, 0xffffffffffffffff) |
| for i := 0; i < 2; i++ { |
| if got, want := (*s)[i], uint64(0xfffffffeffffffff); got != want { |
| fmt.Printf("s[%d]=%x, want %x\n", i, got, want) |
| } |
| } |
| } |