Source file test/codegen/noextend.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  var sval64 [8]int64
    10  var sval32 [8]int32
    11  var sval16 [8]int16
    12  var sval8 [8]int8
    13  var val64 [8]uint64
    14  var val32 [8]uint32
    15  var val16 [8]uint16
    16  var val8 [8]uint8
    17  
    18  // Avoid zero/sign extensions following a load
    19  // which has extended the value correctly.
    20  // Note: No tests are done for int8 since
    21  // an extra extension is usually needed due to
    22  // no signed byte load.
    23  
    24  func set16(x8 int8, u8 *uint8, y8 int8, z8 uint8) {
    25  	// Truncate not needed, load does sign/zero extend
    26  
    27  	// ppc64:-"MOVBZ\tR\\d+,\\sR\\d+"
    28  	// ppc64le:-"MOVBZ\tR\\d+,\\sR\\d+"
    29  	val16[0] = uint16(*u8)
    30  
    31  	// AND not needed due to size
    32  	// ppc64:-"ANDCC"
    33  	// ppc64le:-"ANDCC"
    34  	sval16[1] = 255 & int16(x8+y8)
    35  
    36  	// ppc64:-"ANDCC"
    37  	// ppc64le:-"ANDCC"
    38  	val16[1] = 255 & uint16(*u8+z8)
    39  
    40  }
    41  func shiftidx(u8 *uint8, x16 *int16, u16 *uint16) {
    42  
    43  	// ppc64:-"MOVBZ\tR\\d+,\\sR\\d+"
    44  	// ppc64le:-"MOVBZ\tR\\d+,\\sR\\d+"
    45  	val16[0] = uint16(sval16[*u8>>2])
    46  
    47  	// ppc64:-"MOVH\tR\\d+,\\sR\\d+"
    48  	// ppc64le:-"MOVH\tR\\d+,\\sR\\d+"
    49  	sval16[1] = int16(val16[*x16>>1])
    50  
    51  	// ppc64:-"MOVHZ\tR\\d+,\\sR\\d+"
    52  	// ppc64le:-"MOVHZ\tR\\d+,\\sR\\d+"
    53  	val16[1] = uint16(sval16[*u16>>2])
    54  
    55  }
    56  
    57  func setnox(x8 int8, u8 *uint8, y8 *int8, z8 *uint8, x16 *int16, u16 *uint16, x32 *int32, u32 *uint32) {
    58  
    59  	// ppc64:-"MOVBZ\tR\\d+,\\sR\\d+"
    60  	// ppc64le:-"MOVBZ\tR\\d+,\\sR\\d+"
    61  	val16[0] = uint16(*u8)
    62  
    63  	// AND not needed due to size
    64  	// ppc64:-"ANDCC"
    65  	// ppc64le:-"ANDCC"
    66  	sval16[1] = 255 & int16(x8+*y8)
    67  
    68  	// ppc64:-"ANDCC"
    69  	// ppc64le:-"ANDCC"
    70  	val16[1] = 255 & uint16(*u8+*z8)
    71  
    72  	// ppc64:-"MOVH\tR\\d+,\\sR\\d+"
    73  	// ppc64le:-"MOVH\tR\\d+,\\sR\\d+"
    74  	sval32[1] = int32(*x16)
    75  
    76  	//ppc64:-"MOVBZ\tR\\d+,\\sR\\d+"
    77  	//ppc64le:-"MOVBZ\tR\\d+,\\sR\\d+"
    78  	val32[0] = uint32(*u8)
    79  
    80  	// ppc64:-"MOVHZ\tR\\d+,\\sR\\d+"
    81  	// ppc64le:-"MOVHZ\tR\\d+,\\sR\\d+"
    82  	val32[1] = uint32(*u16)
    83  
    84  	// ppc64:-"MOVH\tR\\d+,\\sR\\d+"
    85  	// ppc64le:-"MOVH\tR\\d+,\\sR\\d+"
    86  	sval64[1] = int64(*x16)
    87  
    88  	// ppc64:-"MOVW\tR\\d+,\\sR\\d+"
    89  	// ppc64le:-"MOVW\tR\\d+,\\sR\\d+"
    90  	sval64[2] = int64(*x32)
    91  
    92  	//ppc64:-"MOVBZ\tR\\d+,\\sR\\d+"
    93  	//ppc64le:-"MOVBZ\tR\\d+,\\sR\\d+"
    94  	val64[0] = uint64(*u8)
    95  
    96  	// ppc64:-"MOVHZ\tR\\d+,\\sR\\d+"
    97  	// ppc64le:-"MOVHZ\tR\\d+,\\sR\\d+"
    98  	val64[1] = uint64(*u16)
    99  
   100  	// ppc64:-"MOVWZ\tR\\d+,\\sR\\d+"
   101  	// ppc64le:-"MOVWZ\tR\\d+,\\sR\\d+"
   102  	val64[2] = uint64(*u32)
   103  }
   104  
   105  func cmp16(u8 *uint8, x32 *int32, u32 *uint32, x64 *int64, u64 *uint64) bool {
   106  
   107  	// ppc64:-"MOVBZ\tR\\d+,\\sR\\d+"
   108  	// ppc64le:-"MOVBZ\tR\\d+,\\sR\\d+"
   109  	if uint16(*u8) == val16[0] {
   110  		return true
   111  	}
   112  
   113  	// ppc64:-"MOVHZ\tR\\d+,\\sR\\d+"
   114  	// ppc64le:-"MOVHZ\tR\\d+,\\sR\\d+"
   115  	if uint16(*u32>>16) == val16[0] {
   116  		return true
   117  	}
   118  
   119  	// ppc64:-"MOVHZ\tR\\d+,\\sR\\d+"
   120  	// ppc64le:-"MOVHZ\tR\\d+,\\sR\\d+"
   121  	if uint16(*u64>>48) == val16[0] {
   122  		return true
   123  	}
   124  
   125  	// Verify the truncates are using the correct sign.
   126  	// ppc64:-"MOVHZ\tR\\d+,\\sR\\d+"
   127  	// ppc64le:-"MOVHZ\tR\\d+,\\sR\\d+"
   128  	if int16(*x32) == sval16[0] {
   129  		return true
   130  	}
   131  
   132  	// ppc64:-"MOVH\tR\\d+,\\sR\\d+"
   133  	// ppc64le:-"MOVH\tR\\d+,\\sR\\d+"
   134  	if uint16(*u32) == val16[0] {
   135  		return true
   136  	}
   137  
   138  	// ppc64:-"MOVHZ\tR\\d+,\\sR\\d+"
   139  	// ppc64le:-"MOVHZ\tR\\d+,\\sR\\d+"
   140  	if int16(*x64) == sval16[0] {
   141  		return true
   142  	}
   143  
   144  	// ppc64:-"MOVH\tR\\d+,\\sR\\d+"
   145  	// ppc64le:-"MOVH\tR\\d+,\\sR\\d+"
   146  	if uint16(*u64) == val16[0] {
   147  		return true
   148  	}
   149  
   150  	return false
   151  }
   152  
   153  func cmp32(u8 *uint8, x16 *int16, u16 *uint16, x64 *int64, u64 *uint64) bool {
   154  
   155  	// ppc64:-"MOVBZ\tR\\d+,\\sR\\d+"
   156  	// ppc64le:-"MOVBZ\tR\\d+,\\sR\\d+"
   157  	if uint32(*u8) == val32[0] {
   158  		return true
   159  	}
   160  
   161  	// ppc64:-"MOVH\tR\\d+,\\sR\\d+"
   162  	// ppc64le:-"MOVH\tR\\d+,\\sR\\d+"
   163  	if int32(*x16) == sval32[0] {
   164  		return true
   165  	}
   166  
   167  	// ppc64:-"MOVHZ\tR\\d+,\\sR\\d+"
   168  	// ppc64le:-"MOVHZ\tR\\d+,\\sR\\d+"
   169  	if uint32(*u16) == val32[0] {
   170  		return true
   171  	}
   172  
   173  	// Verify the truncates are using the correct sign.
   174  	// ppc64:-"MOVWZ\tR\\d+,\\sR\\d+"
   175  	// ppc64le:-"MOVWZ\tR\\d+,\\sR\\d+"
   176  	if int32(*x64) == sval32[0] {
   177  		return true
   178  	}
   179  
   180  	// ppc64:-"MOVW\tR\\d+,\\sR\\d+"
   181  	// ppc64le:-"MOVW\tR\\d+,\\sR\\d+"
   182  	if uint32(*u64) == val32[0] {
   183  		return true
   184  	}
   185  
   186  	return false
   187  }
   188  
   189  func cmp64(u8 *uint8, x16 *int16, u16 *uint16, x32 *int32, u32 *uint32) bool {
   190  
   191  	// ppc64:-"MOVBZ\tR\\d+,\\sR\\d+"
   192  	// ppc64le:-"MOVBZ\tR\\d+,\\sR\\d+"
   193  	if uint64(*u8) == val64[0] {
   194  		return true
   195  	}
   196  
   197  	// ppc64:-"MOVH\tR\\d+,\\sR\\d+"
   198  	// ppc64le:-"MOVH\tR\\d+,\\sR\\d+"
   199  	if int64(*x16) == sval64[0] {
   200  		return true
   201  	}
   202  
   203  	// ppc64:-"MOVHZ\tR\\d+,\\sR\\d+"
   204  	// ppc64le:-"MOVHZ\tR\\d+,\\sR\\d+"
   205  	if uint64(*u16) == val64[0] {
   206  		return true
   207  	}
   208  
   209  	// ppc64:-"MOVW\tR\\d+,\\sR\\d+"
   210  	// ppc64le:-"MOVW\tR\\d+,\\sR\\d+"
   211  	if int64(*x32) == sval64[0] {
   212  		return true
   213  	}
   214  
   215  	// ppc64:-"MOVWZ\tR\\d+,\\sR\\d+"
   216  	// ppc64le:-"MOVWZ\tR\\d+,\\sR\\d+"
   217  	if uint64(*u32) == val64[0] {
   218  		return true
   219  	}
   220  	return false
   221  }
   222  

View as plain text