Text file src/runtime/memmove_s390x.s

     1  // Copyright 2016 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  #include "textflag.h"
     6  
     7  // See memmove Go doc for important implementation constraints.
     8  
     9  // func memmove(to, from unsafe.Pointer, n uintptr)
    10  TEXT runtime·memmove<ABIInternal>(SB),NOSPLIT|NOFRAME,$0-24
    11  #ifndef GOEXPERIMENT_regabiargs
    12  	MOVD	to+0(FP), R6
    13  	MOVD	from+8(FP), R4
    14  	MOVD	n+16(FP), R5
    15  #else
    16  	MOVD	R4, R5
    17  	MOVD	R3, R4
    18  	MOVD	R2, R6
    19  #endif
    20  
    21  	CMPBEQ	R6, R4, done
    22  
    23  start:
    24  	CMPBLE	R5, $3, move0to3
    25  	CMPBLE	R5, $7, move4to7
    26  	CMPBLE	R5, $11, move8to11
    27  	CMPBLE	R5, $15, move12to15
    28  	CMPBNE	R5, $16, movemt16
    29  	MOVD	0(R4), R7
    30  	MOVD	8(R4), R8
    31  	MOVD	R7, 0(R6)
    32  	MOVD	R8, 8(R6)
    33  	RET
    34  
    35  movemt16:
    36  	CMPBGT	R4, R6, forwards
    37  	ADD	R5, R4, R7
    38  	CMPBLE	R7, R6, forwards
    39  	ADD	R5, R6, R8
    40  backwards:
    41  	MOVD	-8(R7), R3
    42  	MOVD	R3, -8(R8)
    43  	MOVD	-16(R7), R3
    44  	MOVD	R3, -16(R8)
    45  	ADD	$-16, R5
    46  	ADD	$-16, R7
    47  	ADD	$-16, R8
    48  	CMP	R5, $16
    49  	BGE	backwards
    50  	BR	start
    51  
    52  forwards:
    53  	CMPBGT	R5, $64, forwards_fast
    54  	MOVD	0(R4), R3
    55  	MOVD	R3, 0(R6)
    56  	MOVD	8(R4), R3
    57  	MOVD	R3, 8(R6)
    58  	ADD	$16, R4
    59  	ADD	$16, R6
    60  	ADD	$-16, R5
    61  	CMP	R5, $16
    62  	BGE	forwards
    63  	BR	start
    64  
    65  forwards_fast:
    66  	CMP	R5, $256
    67  	BLE	forwards_small
    68  	MVC	$256, 0(R4), 0(R6)
    69  	ADD	$256, R4
    70  	ADD	$256, R6
    71  	ADD	$-256, R5
    72  	BR	forwards_fast
    73  
    74  forwards_small:
    75  	CMPBEQ	R5, $0, done
    76  	ADD	$-1, R5
    77  	EXRL	$memmove_exrl_mvc<>(SB), R5
    78  	RET
    79  
    80  move0to3:
    81  	CMPBEQ	R5, $0, done
    82  move1:
    83  	CMPBNE	R5, $1, move2
    84  	MOVB	0(R4), R3
    85  	MOVB	R3, 0(R6)
    86  	RET
    87  move2:
    88  	CMPBNE	R5, $2, move3
    89  	MOVH	0(R4), R3
    90  	MOVH	R3, 0(R6)
    91  	RET
    92  move3:
    93  	MOVH	0(R4), R3
    94  	MOVB	2(R4), R7
    95  	MOVH	R3, 0(R6)
    96  	MOVB	R7, 2(R6)
    97  	RET
    98  
    99  move4to7:
   100  	CMPBNE	R5, $4, move5
   101  	MOVW	0(R4), R3
   102  	MOVW	R3, 0(R6)
   103  	RET
   104  move5:
   105  	CMPBNE	R5, $5, move6
   106  	MOVW	0(R4), R3
   107  	MOVB	4(R4), R7
   108  	MOVW	R3, 0(R6)
   109  	MOVB	R7, 4(R6)
   110  	RET
   111  move6:
   112  	CMPBNE	R5, $6, move7
   113  	MOVW	0(R4), R3
   114  	MOVH	4(R4), R7
   115  	MOVW	R3, 0(R6)
   116  	MOVH	R7, 4(R6)
   117  	RET
   118  move7:
   119  	MOVW	0(R4), R3
   120  	MOVH	4(R4), R7
   121  	MOVB	6(R4), R8
   122  	MOVW	R3, 0(R6)
   123  	MOVH	R7, 4(R6)
   124  	MOVB	R8, 6(R6)
   125  	RET
   126  
   127  move8to11:
   128  	CMPBNE	R5, $8, move9
   129  	MOVD	0(R4), R3
   130  	MOVD	R3, 0(R6)
   131  	RET
   132  move9:
   133  	CMPBNE	R5, $9, move10
   134  	MOVD	0(R4), R3
   135  	MOVB	8(R4), R7
   136  	MOVD	R3, 0(R6)
   137  	MOVB	R7, 8(R6)
   138  	RET
   139  move10:
   140  	CMPBNE	R5, $10, move11
   141  	MOVD	0(R4), R3
   142  	MOVH	8(R4), R7
   143  	MOVD	R3, 0(R6)
   144  	MOVH	R7, 8(R6)
   145  	RET
   146  move11:
   147  	MOVD	0(R4), R3
   148  	MOVH	8(R4), R7
   149  	MOVB	10(R4), R8
   150  	MOVD	R3, 0(R6)
   151  	MOVH	R7, 8(R6)
   152  	MOVB	R8, 10(R6)
   153  	RET
   154  
   155  move12to15:
   156  	CMPBNE	R5, $12, move13
   157  	MOVD	0(R4), R3
   158  	MOVW	8(R4), R7
   159  	MOVD	R3, 0(R6)
   160  	MOVW	R7, 8(R6)
   161  	RET
   162  move13:
   163  	CMPBNE	R5, $13, move14
   164  	MOVD	0(R4), R3
   165  	MOVW	8(R4), R7
   166  	MOVB	12(R4), R8
   167  	MOVD	R3, 0(R6)
   168  	MOVW	R7, 8(R6)
   169  	MOVB	R8, 12(R6)
   170  	RET
   171  move14:
   172  	CMPBNE	R5, $14, move15
   173  	MOVD	0(R4), R3
   174  	MOVW	8(R4), R7
   175  	MOVH	12(R4), R8
   176  	MOVD	R3, 0(R6)
   177  	MOVW	R7, 8(R6)
   178  	MOVH	R8, 12(R6)
   179  	RET
   180  move15:
   181  	MOVD	0(R4), R3
   182  	MOVW	8(R4), R7
   183  	MOVH	12(R4), R8
   184  	MOVB	14(R4), R10
   185  	MOVD	R3, 0(R6)
   186  	MOVW	R7, 8(R6)
   187  	MOVH	R8, 12(R6)
   188  	MOVB	R10, 14(R6)
   189  done:
   190  	RET
   191  
   192  // DO NOT CALL - target for exrl (execute relative long) instruction.
   193  TEXT memmove_exrl_mvc<>(SB),NOSPLIT|NOFRAME,$0-0
   194  	MVC	$1, 0(R4), 0(R6)
   195  	MOVD	R0, 0(R0)
   196  	RET
   197  
   198  

View as plain text