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