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

View as plain text