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

View as plain text