| // asmcheck |
| |
| // Copyright 2018 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 codegen |
| |
| var x [2]bool |
| var x8 [2]uint8 |
| var x16 [2]uint16 |
| var x32 [2]uint32 |
| var x64 [2]uint64 |
| |
| func compMem1() int { |
| // amd64:`CMPB\t"".x\+1\(SB\), [$]0` |
| if x[1] { |
| return 1 |
| } |
| // amd64:`CMPB\t"".x8\+1\(SB\), [$]7` |
| if x8[1] == 7 { |
| return 1 |
| } |
| // amd64:`CMPW\t"".x16\+2\(SB\), [$]7` |
| if x16[1] == 7 { |
| return 1 |
| } |
| // amd64:`CMPL\t"".x32\+4\(SB\), [$]7` |
| if x32[1] == 7 { |
| return 1 |
| } |
| // amd64:`CMPQ\t"".x64\+8\(SB\), [$]7` |
| if x64[1] == 7 { |
| return 1 |
| } |
| return 0 |
| } |
| |
| //go:noinline |
| func f(x int) bool { |
| return false |
| } |
| |
| //go:noinline |
| func f8(x int) int8 { |
| return 0 |
| } |
| |
| //go:noinline |
| func f16(x int) int16 { |
| return 0 |
| } |
| |
| //go:noinline |
| func f32(x int) int32 { |
| return 0 |
| } |
| |
| //go:noinline |
| func f64(x int) int64 { |
| return 0 |
| } |
| |
| func compMem2() int { |
| // amd64:`CMPB\t8\(SP\), [$]0` |
| if f(3) { |
| return 1 |
| } |
| // amd64:`CMPB\t8\(SP\), [$]7` |
| if f8(3) == 7 { |
| return 1 |
| } |
| // amd64:`CMPW\t8\(SP\), [$]7` |
| if f16(3) == 7 { |
| return 1 |
| } |
| // amd64:`CMPL\t8\(SP\), [$]7` |
| if f32(3) == 7 { |
| return 1 |
| } |
| // amd64:`CMPQ\t8\(SP\), [$]7` |
| if f64(3) == 7 { |
| return 1 |
| } |
| return 0 |
| } |
| |
| func compMem3(x, y *int) (int, bool) { |
| // We can do comparisons of a register with memory even if |
| // the register is used subsequently. |
| r := *x |
| // amd64:`CMPQ\t\(` |
| // 386:`CMPL\t\(` |
| return r, r < *y |
| } |