1// run 2 3// Copyright 2022 The Go Authors. All rights reserved. 4// Use of this source code is governed by a BSD-style 5// license that can be found in the LICENSE file. 6 7package main 8 9// This checks for incorrect application of CMP(-x,y) -> CMN(x,y) in arm and arm64 10 11//go:noinline 12func f(p int64, x, y int64) bool { return -x <= p && p <= y } 13 14//go:noinline 15func g(p int32, x, y int32) bool { return -x <= p && p <= y } 16 17// There are some more complicated patterns involving compares and shifts, try to trigger those. 18 19//go:noinline 20func h(p int64, x, y int64) bool { return -(x<<1) <= p && p <= y } 21 22//go:noinline 23func k(p int32, x, y int32) bool { return -(1<<x) <= p && p <= y } 24 25//go:noinline 26func check(b bool) { 27 if b { 28 return 29 } 30 panic("FAILURE") 31} 32 33func main() { 34 check(f(1, -1<<63, 1<<63-1)) 35 check(g(1, -1<<31, 1<<31-1)) 36 check(h(1, -1<<62, 1<<63-1)) 37 check(k(1, 31, 1<<31-1)) 38} 39