Source file test/codegen/copy.go

     1  // asmcheck
     2  
     3  // Copyright 2018 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  
     7  package codegen
     8  
     9  import "runtime"
    10  
    11  // Check small copies are replaced with moves.
    12  
    13  func movesmall4() {
    14  	x := [...]byte{1, 2, 3, 4}
    15  	// 386:-".*memmove"
    16  	// amd64:-".*memmove"
    17  	// arm:-".*memmove"
    18  	// arm64:-".*memmove"
    19  	// ppc64x:-".*memmove"
    20  	copy(x[1:], x[:])
    21  }
    22  
    23  func movesmall7() {
    24  	x := [...]byte{1, 2, 3, 4, 5, 6, 7}
    25  	// 386:-".*memmove"
    26  	// amd64:-".*memmove"
    27  	// arm64:-".*memmove"
    28  	// ppc64x:-".*memmove"
    29  	copy(x[1:], x[:])
    30  }
    31  
    32  func movesmall16() {
    33  	x := [...]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}
    34  	// amd64:-".*memmove"
    35  	// ppc64x:".*memmove"
    36  	copy(x[1:], x[:])
    37  }
    38  
    39  var x [256]byte
    40  
    41  // Check that large disjoint copies are replaced with moves.
    42  
    43  func moveDisjointStack32() {
    44  	var s [32]byte
    45  	// ppc64x:-".*memmove"
    46  	// ppc64x/power8:"LXVD2X",-"ADD",-"BC"
    47  	// ppc64x/power9:"LXV",-"LXVD2X",-"ADD",-"BC"
    48  	copy(s[:], x[:32])
    49  	runtime.KeepAlive(&s)
    50  }
    51  
    52  func moveDisjointStack64() {
    53  	var s [96]byte
    54  	// ppc64x:-".*memmove"
    55  	// ppc64x/power8:"LXVD2X","ADD","BC"
    56  	// ppc64x/power9:"LXV",-"LXVD2X",-"ADD",-"BC"
    57  	copy(s[:], x[:96])
    58  	runtime.KeepAlive(&s)
    59  }
    60  
    61  func moveDisjointStack() {
    62  	var s [256]byte
    63  	// s390x:-".*memmove"
    64  	// amd64:-".*memmove"
    65  	// ppc64x:-".*memmove"
    66  	// ppc64x/power8:"LXVD2X"
    67  	// ppc64x/power9:"LXV",-"LXVD2X"
    68  	copy(s[:], x[:])
    69  	runtime.KeepAlive(&s)
    70  }
    71  
    72  func moveDisjointArg(b *[256]byte) {
    73  	var s [256]byte
    74  	// s390x:-".*memmove"
    75  	// amd64:-".*memmove"
    76  	// ppc64x:-".*memmove"
    77  	// ppc64x/power8:"LXVD2X"
    78  	// ppc64x/power9:"LXV",-"LXVD2X"
    79  	copy(s[:], b[:])
    80  	runtime.KeepAlive(&s)
    81  }
    82  
    83  func moveDisjointNoOverlap(a *[256]byte) {
    84  	// s390x:-".*memmove"
    85  	// amd64:-".*memmove"
    86  	// ppc64x:-".*memmove"
    87  	// ppc64x/power8:"LXVD2X"
    88  	// ppc64x/power9:"LXV",-"LXVD2X"
    89  	copy(a[:], a[128:])
    90  }
    91  
    92  // Check arch-specific memmove lowering. See issue 41662 fot details
    93  
    94  func moveArchLowering1(b []byte, x *[1]byte) {
    95  	_ = b[1]
    96  	// amd64:-".*memmove"
    97  	// arm64:-".*memmove"
    98  	// loong64:-".*memmove"
    99  	// ppc64x:-".*memmove"
   100  	copy(b, x[:])
   101  }
   102  
   103  func moveArchLowering2(b []byte, x *[2]byte) {
   104  	_ = b[2]
   105  	// amd64:-".*memmove"
   106  	// arm64:-".*memmove"
   107  	// loong64:-".*memmove"
   108  	// ppc64x:-".*memmove"
   109  	copy(b, x[:])
   110  }
   111  
   112  func moveArchLowering4(b []byte, x *[4]byte) {
   113  	_ = b[4]
   114  	// amd64:-".*memmove"
   115  	// arm64:-".*memmove"
   116  	// loong64:-".*memmove"
   117  	// ppc64x:-".*memmove"
   118  	copy(b, x[:])
   119  }
   120  
   121  func moveArchLowering8(b []byte, x *[8]byte) {
   122  	_ = b[8]
   123  	// amd64:-".*memmove"
   124  	// arm64:-".*memmove"
   125  	// ppc64x:-".*memmove"
   126  	copy(b, x[:])
   127  }
   128  
   129  func moveArchLowering16(b []byte, x *[16]byte) {
   130  	_ = b[16]
   131  	// amd64:-".*memmove"
   132  	copy(b, x[:])
   133  }
   134  
   135  // Check that no branches are generated when the pointers are [not] equal.
   136  
   137  func ptrEqual() {
   138  	// amd64:-"JEQ",-"JNE"
   139  	// ppc64x:-"BEQ",-"BNE"
   140  	// s390x:-"BEQ",-"BNE"
   141  	copy(x[:], x[:])
   142  }
   143  
   144  func ptrOneOffset() {
   145  	// amd64:-"JEQ",-"JNE"
   146  	// ppc64x:-"BEQ",-"BNE"
   147  	// s390x:-"BEQ",-"BNE"
   148  	copy(x[1:], x[:])
   149  }
   150  
   151  func ptrBothOffset() {
   152  	// amd64:-"JEQ",-"JNE"
   153  	// ppc64x:-"BEQ",-"BNE"
   154  	// s390x:-"BEQ",-"BNE"
   155  	copy(x[1:], x[2:])
   156  }
   157  
   158  // Verify #62698 on PPC64.
   159  func noMaskOnCopy(a []int, s string, x int) int {
   160  	// ppc64x:-"MOVD\t$-1", -"AND"
   161  	return a[x&^copy([]byte{}, s)]
   162  }
   163  

View as plain text