github.com/stingnevermore/go@v0.0.0-20180120041312-3810f5bfed72/src/cmd/compile/internal/ssa/rewritegeneric.go (about) 1 // Code generated from gen/generic.rules; DO NOT EDIT. 2 // generated with: cd gen; go run *.go 3 4 package ssa 5 6 import "math" 7 import "cmd/internal/obj" 8 import "cmd/internal/objabi" 9 import "cmd/compile/internal/types" 10 11 var _ = math.MinInt8 // in case not otherwise used 12 var _ = obj.ANOP // in case not otherwise used 13 var _ = objabi.GOROOT // in case not otherwise used 14 var _ = types.TypeMem // in case not otherwise used 15 16 func rewriteValuegeneric(v *Value) bool { 17 switch v.Op { 18 case OpAdd16: 19 return rewriteValuegeneric_OpAdd16_0(v) || rewriteValuegeneric_OpAdd16_10(v) || rewriteValuegeneric_OpAdd16_20(v) || rewriteValuegeneric_OpAdd16_30(v) 20 case OpAdd32: 21 return rewriteValuegeneric_OpAdd32_0(v) || rewriteValuegeneric_OpAdd32_10(v) || rewriteValuegeneric_OpAdd32_20(v) || rewriteValuegeneric_OpAdd32_30(v) 22 case OpAdd32F: 23 return rewriteValuegeneric_OpAdd32F_0(v) 24 case OpAdd64: 25 return rewriteValuegeneric_OpAdd64_0(v) || rewriteValuegeneric_OpAdd64_10(v) || rewriteValuegeneric_OpAdd64_20(v) || rewriteValuegeneric_OpAdd64_30(v) 26 case OpAdd64F: 27 return rewriteValuegeneric_OpAdd64F_0(v) 28 case OpAdd8: 29 return rewriteValuegeneric_OpAdd8_0(v) || rewriteValuegeneric_OpAdd8_10(v) || rewriteValuegeneric_OpAdd8_20(v) || rewriteValuegeneric_OpAdd8_30(v) 30 case OpAddPtr: 31 return rewriteValuegeneric_OpAddPtr_0(v) 32 case OpAnd16: 33 return rewriteValuegeneric_OpAnd16_0(v) || rewriteValuegeneric_OpAnd16_10(v) 34 case OpAnd32: 35 return rewriteValuegeneric_OpAnd32_0(v) || rewriteValuegeneric_OpAnd32_10(v) 36 case OpAnd64: 37 return rewriteValuegeneric_OpAnd64_0(v) || rewriteValuegeneric_OpAnd64_10(v) || rewriteValuegeneric_OpAnd64_20(v) 38 case OpAnd8: 39 return rewriteValuegeneric_OpAnd8_0(v) || rewriteValuegeneric_OpAnd8_10(v) 40 case OpArg: 41 return rewriteValuegeneric_OpArg_0(v) || rewriteValuegeneric_OpArg_10(v) 42 case OpArraySelect: 43 return rewriteValuegeneric_OpArraySelect_0(v) 44 case OpCom16: 45 return rewriteValuegeneric_OpCom16_0(v) 46 case OpCom32: 47 return rewriteValuegeneric_OpCom32_0(v) 48 case OpCom64: 49 return rewriteValuegeneric_OpCom64_0(v) 50 case OpCom8: 51 return rewriteValuegeneric_OpCom8_0(v) 52 case OpConstInterface: 53 return rewriteValuegeneric_OpConstInterface_0(v) 54 case OpConstSlice: 55 return rewriteValuegeneric_OpConstSlice_0(v) 56 case OpConstString: 57 return rewriteValuegeneric_OpConstString_0(v) 58 case OpConvert: 59 return rewriteValuegeneric_OpConvert_0(v) 60 case OpCvt32Fto32: 61 return rewriteValuegeneric_OpCvt32Fto32_0(v) 62 case OpCvt32Fto64: 63 return rewriteValuegeneric_OpCvt32Fto64_0(v) 64 case OpCvt32Fto64F: 65 return rewriteValuegeneric_OpCvt32Fto64F_0(v) 66 case OpCvt32to32F: 67 return rewriteValuegeneric_OpCvt32to32F_0(v) 68 case OpCvt32to64F: 69 return rewriteValuegeneric_OpCvt32to64F_0(v) 70 case OpCvt64Fto32: 71 return rewriteValuegeneric_OpCvt64Fto32_0(v) 72 case OpCvt64Fto32F: 73 return rewriteValuegeneric_OpCvt64Fto32F_0(v) 74 case OpCvt64Fto64: 75 return rewriteValuegeneric_OpCvt64Fto64_0(v) 76 case OpCvt64to32F: 77 return rewriteValuegeneric_OpCvt64to32F_0(v) 78 case OpCvt64to64F: 79 return rewriteValuegeneric_OpCvt64to64F_0(v) 80 case OpDiv16: 81 return rewriteValuegeneric_OpDiv16_0(v) 82 case OpDiv16u: 83 return rewriteValuegeneric_OpDiv16u_0(v) 84 case OpDiv32: 85 return rewriteValuegeneric_OpDiv32_0(v) 86 case OpDiv32F: 87 return rewriteValuegeneric_OpDiv32F_0(v) 88 case OpDiv32u: 89 return rewriteValuegeneric_OpDiv32u_0(v) 90 case OpDiv64: 91 return rewriteValuegeneric_OpDiv64_0(v) 92 case OpDiv64F: 93 return rewriteValuegeneric_OpDiv64F_0(v) 94 case OpDiv64u: 95 return rewriteValuegeneric_OpDiv64u_0(v) 96 case OpDiv8: 97 return rewriteValuegeneric_OpDiv8_0(v) 98 case OpDiv8u: 99 return rewriteValuegeneric_OpDiv8u_0(v) 100 case OpEq16: 101 return rewriteValuegeneric_OpEq16_0(v) 102 case OpEq32: 103 return rewriteValuegeneric_OpEq32_0(v) 104 case OpEq32F: 105 return rewriteValuegeneric_OpEq32F_0(v) 106 case OpEq64: 107 return rewriteValuegeneric_OpEq64_0(v) 108 case OpEq64F: 109 return rewriteValuegeneric_OpEq64F_0(v) 110 case OpEq8: 111 return rewriteValuegeneric_OpEq8_0(v) 112 case OpEqB: 113 return rewriteValuegeneric_OpEqB_0(v) 114 case OpEqInter: 115 return rewriteValuegeneric_OpEqInter_0(v) 116 case OpEqPtr: 117 return rewriteValuegeneric_OpEqPtr_0(v) 118 case OpEqSlice: 119 return rewriteValuegeneric_OpEqSlice_0(v) 120 case OpGeq16: 121 return rewriteValuegeneric_OpGeq16_0(v) 122 case OpGeq16U: 123 return rewriteValuegeneric_OpGeq16U_0(v) 124 case OpGeq32: 125 return rewriteValuegeneric_OpGeq32_0(v) 126 case OpGeq32F: 127 return rewriteValuegeneric_OpGeq32F_0(v) 128 case OpGeq32U: 129 return rewriteValuegeneric_OpGeq32U_0(v) 130 case OpGeq64: 131 return rewriteValuegeneric_OpGeq64_0(v) 132 case OpGeq64F: 133 return rewriteValuegeneric_OpGeq64F_0(v) 134 case OpGeq64U: 135 return rewriteValuegeneric_OpGeq64U_0(v) 136 case OpGeq8: 137 return rewriteValuegeneric_OpGeq8_0(v) 138 case OpGeq8U: 139 return rewriteValuegeneric_OpGeq8U_0(v) 140 case OpGreater16: 141 return rewriteValuegeneric_OpGreater16_0(v) 142 case OpGreater16U: 143 return rewriteValuegeneric_OpGreater16U_0(v) 144 case OpGreater32: 145 return rewriteValuegeneric_OpGreater32_0(v) 146 case OpGreater32F: 147 return rewriteValuegeneric_OpGreater32F_0(v) 148 case OpGreater32U: 149 return rewriteValuegeneric_OpGreater32U_0(v) 150 case OpGreater64: 151 return rewriteValuegeneric_OpGreater64_0(v) 152 case OpGreater64F: 153 return rewriteValuegeneric_OpGreater64F_0(v) 154 case OpGreater64U: 155 return rewriteValuegeneric_OpGreater64U_0(v) 156 case OpGreater8: 157 return rewriteValuegeneric_OpGreater8_0(v) 158 case OpGreater8U: 159 return rewriteValuegeneric_OpGreater8U_0(v) 160 case OpIMake: 161 return rewriteValuegeneric_OpIMake_0(v) 162 case OpInterCall: 163 return rewriteValuegeneric_OpInterCall_0(v) 164 case OpIsInBounds: 165 return rewriteValuegeneric_OpIsInBounds_0(v) || rewriteValuegeneric_OpIsInBounds_10(v) || rewriteValuegeneric_OpIsInBounds_20(v) || rewriteValuegeneric_OpIsInBounds_30(v) 166 case OpIsNonNil: 167 return rewriteValuegeneric_OpIsNonNil_0(v) 168 case OpIsSliceInBounds: 169 return rewriteValuegeneric_OpIsSliceInBounds_0(v) 170 case OpLeq16: 171 return rewriteValuegeneric_OpLeq16_0(v) 172 case OpLeq16U: 173 return rewriteValuegeneric_OpLeq16U_0(v) 174 case OpLeq32: 175 return rewriteValuegeneric_OpLeq32_0(v) 176 case OpLeq32F: 177 return rewriteValuegeneric_OpLeq32F_0(v) 178 case OpLeq32U: 179 return rewriteValuegeneric_OpLeq32U_0(v) 180 case OpLeq64: 181 return rewriteValuegeneric_OpLeq64_0(v) 182 case OpLeq64F: 183 return rewriteValuegeneric_OpLeq64F_0(v) 184 case OpLeq64U: 185 return rewriteValuegeneric_OpLeq64U_0(v) 186 case OpLeq8: 187 return rewriteValuegeneric_OpLeq8_0(v) 188 case OpLeq8U: 189 return rewriteValuegeneric_OpLeq8U_0(v) 190 case OpLess16: 191 return rewriteValuegeneric_OpLess16_0(v) 192 case OpLess16U: 193 return rewriteValuegeneric_OpLess16U_0(v) 194 case OpLess32: 195 return rewriteValuegeneric_OpLess32_0(v) 196 case OpLess32F: 197 return rewriteValuegeneric_OpLess32F_0(v) 198 case OpLess32U: 199 return rewriteValuegeneric_OpLess32U_0(v) 200 case OpLess64: 201 return rewriteValuegeneric_OpLess64_0(v) 202 case OpLess64F: 203 return rewriteValuegeneric_OpLess64F_0(v) 204 case OpLess64U: 205 return rewriteValuegeneric_OpLess64U_0(v) 206 case OpLess8: 207 return rewriteValuegeneric_OpLess8_0(v) 208 case OpLess8U: 209 return rewriteValuegeneric_OpLess8U_0(v) 210 case OpLoad: 211 return rewriteValuegeneric_OpLoad_0(v) || rewriteValuegeneric_OpLoad_10(v) 212 case OpLsh16x16: 213 return rewriteValuegeneric_OpLsh16x16_0(v) 214 case OpLsh16x32: 215 return rewriteValuegeneric_OpLsh16x32_0(v) 216 case OpLsh16x64: 217 return rewriteValuegeneric_OpLsh16x64_0(v) 218 case OpLsh16x8: 219 return rewriteValuegeneric_OpLsh16x8_0(v) 220 case OpLsh32x16: 221 return rewriteValuegeneric_OpLsh32x16_0(v) 222 case OpLsh32x32: 223 return rewriteValuegeneric_OpLsh32x32_0(v) 224 case OpLsh32x64: 225 return rewriteValuegeneric_OpLsh32x64_0(v) 226 case OpLsh32x8: 227 return rewriteValuegeneric_OpLsh32x8_0(v) 228 case OpLsh64x16: 229 return rewriteValuegeneric_OpLsh64x16_0(v) 230 case OpLsh64x32: 231 return rewriteValuegeneric_OpLsh64x32_0(v) 232 case OpLsh64x64: 233 return rewriteValuegeneric_OpLsh64x64_0(v) 234 case OpLsh64x8: 235 return rewriteValuegeneric_OpLsh64x8_0(v) 236 case OpLsh8x16: 237 return rewriteValuegeneric_OpLsh8x16_0(v) 238 case OpLsh8x32: 239 return rewriteValuegeneric_OpLsh8x32_0(v) 240 case OpLsh8x64: 241 return rewriteValuegeneric_OpLsh8x64_0(v) 242 case OpLsh8x8: 243 return rewriteValuegeneric_OpLsh8x8_0(v) 244 case OpMod16: 245 return rewriteValuegeneric_OpMod16_0(v) 246 case OpMod16u: 247 return rewriteValuegeneric_OpMod16u_0(v) 248 case OpMod32: 249 return rewriteValuegeneric_OpMod32_0(v) 250 case OpMod32u: 251 return rewriteValuegeneric_OpMod32u_0(v) 252 case OpMod64: 253 return rewriteValuegeneric_OpMod64_0(v) 254 case OpMod64u: 255 return rewriteValuegeneric_OpMod64u_0(v) 256 case OpMod8: 257 return rewriteValuegeneric_OpMod8_0(v) 258 case OpMod8u: 259 return rewriteValuegeneric_OpMod8u_0(v) 260 case OpMul16: 261 return rewriteValuegeneric_OpMul16_0(v) || rewriteValuegeneric_OpMul16_10(v) 262 case OpMul32: 263 return rewriteValuegeneric_OpMul32_0(v) || rewriteValuegeneric_OpMul32_10(v) 264 case OpMul32F: 265 return rewriteValuegeneric_OpMul32F_0(v) 266 case OpMul64: 267 return rewriteValuegeneric_OpMul64_0(v) || rewriteValuegeneric_OpMul64_10(v) 268 case OpMul64F: 269 return rewriteValuegeneric_OpMul64F_0(v) 270 case OpMul8: 271 return rewriteValuegeneric_OpMul8_0(v) || rewriteValuegeneric_OpMul8_10(v) 272 case OpNeg16: 273 return rewriteValuegeneric_OpNeg16_0(v) 274 case OpNeg32: 275 return rewriteValuegeneric_OpNeg32_0(v) 276 case OpNeg32F: 277 return rewriteValuegeneric_OpNeg32F_0(v) 278 case OpNeg64: 279 return rewriteValuegeneric_OpNeg64_0(v) 280 case OpNeg64F: 281 return rewriteValuegeneric_OpNeg64F_0(v) 282 case OpNeg8: 283 return rewriteValuegeneric_OpNeg8_0(v) 284 case OpNeq16: 285 return rewriteValuegeneric_OpNeq16_0(v) 286 case OpNeq32: 287 return rewriteValuegeneric_OpNeq32_0(v) 288 case OpNeq32F: 289 return rewriteValuegeneric_OpNeq32F_0(v) 290 case OpNeq64: 291 return rewriteValuegeneric_OpNeq64_0(v) 292 case OpNeq64F: 293 return rewriteValuegeneric_OpNeq64F_0(v) 294 case OpNeq8: 295 return rewriteValuegeneric_OpNeq8_0(v) 296 case OpNeqB: 297 return rewriteValuegeneric_OpNeqB_0(v) 298 case OpNeqInter: 299 return rewriteValuegeneric_OpNeqInter_0(v) 300 case OpNeqPtr: 301 return rewriteValuegeneric_OpNeqPtr_0(v) 302 case OpNeqSlice: 303 return rewriteValuegeneric_OpNeqSlice_0(v) 304 case OpNilCheck: 305 return rewriteValuegeneric_OpNilCheck_0(v) 306 case OpNot: 307 return rewriteValuegeneric_OpNot_0(v) || rewriteValuegeneric_OpNot_10(v) || rewriteValuegeneric_OpNot_20(v) || rewriteValuegeneric_OpNot_30(v) || rewriteValuegeneric_OpNot_40(v) 308 case OpOffPtr: 309 return rewriteValuegeneric_OpOffPtr_0(v) 310 case OpOr16: 311 return rewriteValuegeneric_OpOr16_0(v) || rewriteValuegeneric_OpOr16_10(v) || rewriteValuegeneric_OpOr16_20(v) 312 case OpOr32: 313 return rewriteValuegeneric_OpOr32_0(v) || rewriteValuegeneric_OpOr32_10(v) || rewriteValuegeneric_OpOr32_20(v) 314 case OpOr64: 315 return rewriteValuegeneric_OpOr64_0(v) || rewriteValuegeneric_OpOr64_10(v) || rewriteValuegeneric_OpOr64_20(v) 316 case OpOr8: 317 return rewriteValuegeneric_OpOr8_0(v) || rewriteValuegeneric_OpOr8_10(v) || rewriteValuegeneric_OpOr8_20(v) 318 case OpPhi: 319 return rewriteValuegeneric_OpPhi_0(v) 320 case OpPtrIndex: 321 return rewriteValuegeneric_OpPtrIndex_0(v) 322 case OpRound32F: 323 return rewriteValuegeneric_OpRound32F_0(v) 324 case OpRound64F: 325 return rewriteValuegeneric_OpRound64F_0(v) 326 case OpRsh16Ux16: 327 return rewriteValuegeneric_OpRsh16Ux16_0(v) 328 case OpRsh16Ux32: 329 return rewriteValuegeneric_OpRsh16Ux32_0(v) 330 case OpRsh16Ux64: 331 return rewriteValuegeneric_OpRsh16Ux64_0(v) 332 case OpRsh16Ux8: 333 return rewriteValuegeneric_OpRsh16Ux8_0(v) 334 case OpRsh16x16: 335 return rewriteValuegeneric_OpRsh16x16_0(v) 336 case OpRsh16x32: 337 return rewriteValuegeneric_OpRsh16x32_0(v) 338 case OpRsh16x64: 339 return rewriteValuegeneric_OpRsh16x64_0(v) 340 case OpRsh16x8: 341 return rewriteValuegeneric_OpRsh16x8_0(v) 342 case OpRsh32Ux16: 343 return rewriteValuegeneric_OpRsh32Ux16_0(v) 344 case OpRsh32Ux32: 345 return rewriteValuegeneric_OpRsh32Ux32_0(v) 346 case OpRsh32Ux64: 347 return rewriteValuegeneric_OpRsh32Ux64_0(v) 348 case OpRsh32Ux8: 349 return rewriteValuegeneric_OpRsh32Ux8_0(v) 350 case OpRsh32x16: 351 return rewriteValuegeneric_OpRsh32x16_0(v) 352 case OpRsh32x32: 353 return rewriteValuegeneric_OpRsh32x32_0(v) 354 case OpRsh32x64: 355 return rewriteValuegeneric_OpRsh32x64_0(v) 356 case OpRsh32x8: 357 return rewriteValuegeneric_OpRsh32x8_0(v) 358 case OpRsh64Ux16: 359 return rewriteValuegeneric_OpRsh64Ux16_0(v) 360 case OpRsh64Ux32: 361 return rewriteValuegeneric_OpRsh64Ux32_0(v) 362 case OpRsh64Ux64: 363 return rewriteValuegeneric_OpRsh64Ux64_0(v) 364 case OpRsh64Ux8: 365 return rewriteValuegeneric_OpRsh64Ux8_0(v) 366 case OpRsh64x16: 367 return rewriteValuegeneric_OpRsh64x16_0(v) 368 case OpRsh64x32: 369 return rewriteValuegeneric_OpRsh64x32_0(v) 370 case OpRsh64x64: 371 return rewriteValuegeneric_OpRsh64x64_0(v) 372 case OpRsh64x8: 373 return rewriteValuegeneric_OpRsh64x8_0(v) 374 case OpRsh8Ux16: 375 return rewriteValuegeneric_OpRsh8Ux16_0(v) 376 case OpRsh8Ux32: 377 return rewriteValuegeneric_OpRsh8Ux32_0(v) 378 case OpRsh8Ux64: 379 return rewriteValuegeneric_OpRsh8Ux64_0(v) 380 case OpRsh8Ux8: 381 return rewriteValuegeneric_OpRsh8Ux8_0(v) 382 case OpRsh8x16: 383 return rewriteValuegeneric_OpRsh8x16_0(v) 384 case OpRsh8x32: 385 return rewriteValuegeneric_OpRsh8x32_0(v) 386 case OpRsh8x64: 387 return rewriteValuegeneric_OpRsh8x64_0(v) 388 case OpRsh8x8: 389 return rewriteValuegeneric_OpRsh8x8_0(v) 390 case OpSignExt16to32: 391 return rewriteValuegeneric_OpSignExt16to32_0(v) 392 case OpSignExt16to64: 393 return rewriteValuegeneric_OpSignExt16to64_0(v) 394 case OpSignExt32to64: 395 return rewriteValuegeneric_OpSignExt32to64_0(v) 396 case OpSignExt8to16: 397 return rewriteValuegeneric_OpSignExt8to16_0(v) 398 case OpSignExt8to32: 399 return rewriteValuegeneric_OpSignExt8to32_0(v) 400 case OpSignExt8to64: 401 return rewriteValuegeneric_OpSignExt8to64_0(v) 402 case OpSliceCap: 403 return rewriteValuegeneric_OpSliceCap_0(v) 404 case OpSliceLen: 405 return rewriteValuegeneric_OpSliceLen_0(v) 406 case OpSlicePtr: 407 return rewriteValuegeneric_OpSlicePtr_0(v) 408 case OpSlicemask: 409 return rewriteValuegeneric_OpSlicemask_0(v) 410 case OpSqrt: 411 return rewriteValuegeneric_OpSqrt_0(v) 412 case OpStaticCall: 413 return rewriteValuegeneric_OpStaticCall_0(v) 414 case OpStore: 415 return rewriteValuegeneric_OpStore_0(v) || rewriteValuegeneric_OpStore_10(v) 416 case OpStringLen: 417 return rewriteValuegeneric_OpStringLen_0(v) 418 case OpStringPtr: 419 return rewriteValuegeneric_OpStringPtr_0(v) 420 case OpStructSelect: 421 return rewriteValuegeneric_OpStructSelect_0(v) || rewriteValuegeneric_OpStructSelect_10(v) 422 case OpSub16: 423 return rewriteValuegeneric_OpSub16_0(v) || rewriteValuegeneric_OpSub16_10(v) 424 case OpSub32: 425 return rewriteValuegeneric_OpSub32_0(v) || rewriteValuegeneric_OpSub32_10(v) 426 case OpSub32F: 427 return rewriteValuegeneric_OpSub32F_0(v) 428 case OpSub64: 429 return rewriteValuegeneric_OpSub64_0(v) || rewriteValuegeneric_OpSub64_10(v) 430 case OpSub64F: 431 return rewriteValuegeneric_OpSub64F_0(v) 432 case OpSub8: 433 return rewriteValuegeneric_OpSub8_0(v) || rewriteValuegeneric_OpSub8_10(v) 434 case OpTrunc16to8: 435 return rewriteValuegeneric_OpTrunc16to8_0(v) 436 case OpTrunc32to16: 437 return rewriteValuegeneric_OpTrunc32to16_0(v) 438 case OpTrunc32to8: 439 return rewriteValuegeneric_OpTrunc32to8_0(v) 440 case OpTrunc64to16: 441 return rewriteValuegeneric_OpTrunc64to16_0(v) 442 case OpTrunc64to32: 443 return rewriteValuegeneric_OpTrunc64to32_0(v) 444 case OpTrunc64to8: 445 return rewriteValuegeneric_OpTrunc64to8_0(v) 446 case OpXor16: 447 return rewriteValuegeneric_OpXor16_0(v) || rewriteValuegeneric_OpXor16_10(v) 448 case OpXor32: 449 return rewriteValuegeneric_OpXor32_0(v) || rewriteValuegeneric_OpXor32_10(v) 450 case OpXor64: 451 return rewriteValuegeneric_OpXor64_0(v) || rewriteValuegeneric_OpXor64_10(v) 452 case OpXor8: 453 return rewriteValuegeneric_OpXor8_0(v) || rewriteValuegeneric_OpXor8_10(v) 454 case OpZero: 455 return rewriteValuegeneric_OpZero_0(v) 456 case OpZeroExt16to32: 457 return rewriteValuegeneric_OpZeroExt16to32_0(v) 458 case OpZeroExt16to64: 459 return rewriteValuegeneric_OpZeroExt16to64_0(v) 460 case OpZeroExt32to64: 461 return rewriteValuegeneric_OpZeroExt32to64_0(v) 462 case OpZeroExt8to16: 463 return rewriteValuegeneric_OpZeroExt8to16_0(v) 464 case OpZeroExt8to32: 465 return rewriteValuegeneric_OpZeroExt8to32_0(v) 466 case OpZeroExt8to64: 467 return rewriteValuegeneric_OpZeroExt8to64_0(v) 468 } 469 return false 470 } 471 func rewriteValuegeneric_OpAdd16_0(v *Value) bool { 472 b := v.Block 473 _ = b 474 // match: (Add16 (Const16 [c]) (Const16 [d])) 475 // cond: 476 // result: (Const16 [int64(int16(c+d))]) 477 for { 478 _ = v.Args[1] 479 v_0 := v.Args[0] 480 if v_0.Op != OpConst16 { 481 break 482 } 483 c := v_0.AuxInt 484 v_1 := v.Args[1] 485 if v_1.Op != OpConst16 { 486 break 487 } 488 d := v_1.AuxInt 489 v.reset(OpConst16) 490 v.AuxInt = int64(int16(c + d)) 491 return true 492 } 493 // match: (Add16 (Const16 [d]) (Const16 [c])) 494 // cond: 495 // result: (Const16 [int64(int16(c+d))]) 496 for { 497 _ = v.Args[1] 498 v_0 := v.Args[0] 499 if v_0.Op != OpConst16 { 500 break 501 } 502 d := v_0.AuxInt 503 v_1 := v.Args[1] 504 if v_1.Op != OpConst16 { 505 break 506 } 507 c := v_1.AuxInt 508 v.reset(OpConst16) 509 v.AuxInt = int64(int16(c + d)) 510 return true 511 } 512 // match: (Add16 <t> (Mul16 x y) (Mul16 x z)) 513 // cond: 514 // result: (Mul16 x (Add16 <t> y z)) 515 for { 516 t := v.Type 517 _ = v.Args[1] 518 v_0 := v.Args[0] 519 if v_0.Op != OpMul16 { 520 break 521 } 522 _ = v_0.Args[1] 523 x := v_0.Args[0] 524 y := v_0.Args[1] 525 v_1 := v.Args[1] 526 if v_1.Op != OpMul16 { 527 break 528 } 529 _ = v_1.Args[1] 530 if x != v_1.Args[0] { 531 break 532 } 533 z := v_1.Args[1] 534 v.reset(OpMul16) 535 v.AddArg(x) 536 v0 := b.NewValue0(v.Pos, OpAdd16, t) 537 v0.AddArg(y) 538 v0.AddArg(z) 539 v.AddArg(v0) 540 return true 541 } 542 // match: (Add16 <t> (Mul16 y x) (Mul16 x z)) 543 // cond: 544 // result: (Mul16 x (Add16 <t> y z)) 545 for { 546 t := v.Type 547 _ = v.Args[1] 548 v_0 := v.Args[0] 549 if v_0.Op != OpMul16 { 550 break 551 } 552 _ = v_0.Args[1] 553 y := v_0.Args[0] 554 x := v_0.Args[1] 555 v_1 := v.Args[1] 556 if v_1.Op != OpMul16 { 557 break 558 } 559 _ = v_1.Args[1] 560 if x != v_1.Args[0] { 561 break 562 } 563 z := v_1.Args[1] 564 v.reset(OpMul16) 565 v.AddArg(x) 566 v0 := b.NewValue0(v.Pos, OpAdd16, t) 567 v0.AddArg(y) 568 v0.AddArg(z) 569 v.AddArg(v0) 570 return true 571 } 572 // match: (Add16 <t> (Mul16 x y) (Mul16 z x)) 573 // cond: 574 // result: (Mul16 x (Add16 <t> y z)) 575 for { 576 t := v.Type 577 _ = v.Args[1] 578 v_0 := v.Args[0] 579 if v_0.Op != OpMul16 { 580 break 581 } 582 _ = v_0.Args[1] 583 x := v_0.Args[0] 584 y := v_0.Args[1] 585 v_1 := v.Args[1] 586 if v_1.Op != OpMul16 { 587 break 588 } 589 _ = v_1.Args[1] 590 z := v_1.Args[0] 591 if x != v_1.Args[1] { 592 break 593 } 594 v.reset(OpMul16) 595 v.AddArg(x) 596 v0 := b.NewValue0(v.Pos, OpAdd16, t) 597 v0.AddArg(y) 598 v0.AddArg(z) 599 v.AddArg(v0) 600 return true 601 } 602 // match: (Add16 <t> (Mul16 y x) (Mul16 z x)) 603 // cond: 604 // result: (Mul16 x (Add16 <t> y z)) 605 for { 606 t := v.Type 607 _ = v.Args[1] 608 v_0 := v.Args[0] 609 if v_0.Op != OpMul16 { 610 break 611 } 612 _ = v_0.Args[1] 613 y := v_0.Args[0] 614 x := v_0.Args[1] 615 v_1 := v.Args[1] 616 if v_1.Op != OpMul16 { 617 break 618 } 619 _ = v_1.Args[1] 620 z := v_1.Args[0] 621 if x != v_1.Args[1] { 622 break 623 } 624 v.reset(OpMul16) 625 v.AddArg(x) 626 v0 := b.NewValue0(v.Pos, OpAdd16, t) 627 v0.AddArg(y) 628 v0.AddArg(z) 629 v.AddArg(v0) 630 return true 631 } 632 // match: (Add16 <t> (Mul16 x z) (Mul16 x y)) 633 // cond: 634 // result: (Mul16 x (Add16 <t> y z)) 635 for { 636 t := v.Type 637 _ = v.Args[1] 638 v_0 := v.Args[0] 639 if v_0.Op != OpMul16 { 640 break 641 } 642 _ = v_0.Args[1] 643 x := v_0.Args[0] 644 z := v_0.Args[1] 645 v_1 := v.Args[1] 646 if v_1.Op != OpMul16 { 647 break 648 } 649 _ = v_1.Args[1] 650 if x != v_1.Args[0] { 651 break 652 } 653 y := v_1.Args[1] 654 v.reset(OpMul16) 655 v.AddArg(x) 656 v0 := b.NewValue0(v.Pos, OpAdd16, t) 657 v0.AddArg(y) 658 v0.AddArg(z) 659 v.AddArg(v0) 660 return true 661 } 662 // match: (Add16 <t> (Mul16 z x) (Mul16 x y)) 663 // cond: 664 // result: (Mul16 x (Add16 <t> y z)) 665 for { 666 t := v.Type 667 _ = v.Args[1] 668 v_0 := v.Args[0] 669 if v_0.Op != OpMul16 { 670 break 671 } 672 _ = v_0.Args[1] 673 z := v_0.Args[0] 674 x := v_0.Args[1] 675 v_1 := v.Args[1] 676 if v_1.Op != OpMul16 { 677 break 678 } 679 _ = v_1.Args[1] 680 if x != v_1.Args[0] { 681 break 682 } 683 y := v_1.Args[1] 684 v.reset(OpMul16) 685 v.AddArg(x) 686 v0 := b.NewValue0(v.Pos, OpAdd16, t) 687 v0.AddArg(y) 688 v0.AddArg(z) 689 v.AddArg(v0) 690 return true 691 } 692 // match: (Add16 <t> (Mul16 x z) (Mul16 y x)) 693 // cond: 694 // result: (Mul16 x (Add16 <t> y z)) 695 for { 696 t := v.Type 697 _ = v.Args[1] 698 v_0 := v.Args[0] 699 if v_0.Op != OpMul16 { 700 break 701 } 702 _ = v_0.Args[1] 703 x := v_0.Args[0] 704 z := v_0.Args[1] 705 v_1 := v.Args[1] 706 if v_1.Op != OpMul16 { 707 break 708 } 709 _ = v_1.Args[1] 710 y := v_1.Args[0] 711 if x != v_1.Args[1] { 712 break 713 } 714 v.reset(OpMul16) 715 v.AddArg(x) 716 v0 := b.NewValue0(v.Pos, OpAdd16, t) 717 v0.AddArg(y) 718 v0.AddArg(z) 719 v.AddArg(v0) 720 return true 721 } 722 // match: (Add16 <t> (Mul16 z x) (Mul16 y x)) 723 // cond: 724 // result: (Mul16 x (Add16 <t> y z)) 725 for { 726 t := v.Type 727 _ = v.Args[1] 728 v_0 := v.Args[0] 729 if v_0.Op != OpMul16 { 730 break 731 } 732 _ = v_0.Args[1] 733 z := v_0.Args[0] 734 x := v_0.Args[1] 735 v_1 := v.Args[1] 736 if v_1.Op != OpMul16 { 737 break 738 } 739 _ = v_1.Args[1] 740 y := v_1.Args[0] 741 if x != v_1.Args[1] { 742 break 743 } 744 v.reset(OpMul16) 745 v.AddArg(x) 746 v0 := b.NewValue0(v.Pos, OpAdd16, t) 747 v0.AddArg(y) 748 v0.AddArg(z) 749 v.AddArg(v0) 750 return true 751 } 752 return false 753 } 754 func rewriteValuegeneric_OpAdd16_10(v *Value) bool { 755 b := v.Block 756 _ = b 757 // match: (Add16 (Const16 [0]) x) 758 // cond: 759 // result: x 760 for { 761 _ = v.Args[1] 762 v_0 := v.Args[0] 763 if v_0.Op != OpConst16 { 764 break 765 } 766 if v_0.AuxInt != 0 { 767 break 768 } 769 x := v.Args[1] 770 v.reset(OpCopy) 771 v.Type = x.Type 772 v.AddArg(x) 773 return true 774 } 775 // match: (Add16 x (Const16 [0])) 776 // cond: 777 // result: x 778 for { 779 _ = v.Args[1] 780 x := v.Args[0] 781 v_1 := v.Args[1] 782 if v_1.Op != OpConst16 { 783 break 784 } 785 if v_1.AuxInt != 0 { 786 break 787 } 788 v.reset(OpCopy) 789 v.Type = x.Type 790 v.AddArg(x) 791 return true 792 } 793 // match: (Add16 (Const16 [1]) (Com16 x)) 794 // cond: 795 // result: (Neg16 x) 796 for { 797 _ = v.Args[1] 798 v_0 := v.Args[0] 799 if v_0.Op != OpConst16 { 800 break 801 } 802 if v_0.AuxInt != 1 { 803 break 804 } 805 v_1 := v.Args[1] 806 if v_1.Op != OpCom16 { 807 break 808 } 809 x := v_1.Args[0] 810 v.reset(OpNeg16) 811 v.AddArg(x) 812 return true 813 } 814 // match: (Add16 (Com16 x) (Const16 [1])) 815 // cond: 816 // result: (Neg16 x) 817 for { 818 _ = v.Args[1] 819 v_0 := v.Args[0] 820 if v_0.Op != OpCom16 { 821 break 822 } 823 x := v_0.Args[0] 824 v_1 := v.Args[1] 825 if v_1.Op != OpConst16 { 826 break 827 } 828 if v_1.AuxInt != 1 { 829 break 830 } 831 v.reset(OpNeg16) 832 v.AddArg(x) 833 return true 834 } 835 // match: (Add16 (Add16 i:(Const16 <t>) z) x) 836 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 837 // result: (Add16 i (Add16 <t> z x)) 838 for { 839 _ = v.Args[1] 840 v_0 := v.Args[0] 841 if v_0.Op != OpAdd16 { 842 break 843 } 844 _ = v_0.Args[1] 845 i := v_0.Args[0] 846 if i.Op != OpConst16 { 847 break 848 } 849 t := i.Type 850 z := v_0.Args[1] 851 x := v.Args[1] 852 if !(z.Op != OpConst16 && x.Op != OpConst16) { 853 break 854 } 855 v.reset(OpAdd16) 856 v.AddArg(i) 857 v0 := b.NewValue0(v.Pos, OpAdd16, t) 858 v0.AddArg(z) 859 v0.AddArg(x) 860 v.AddArg(v0) 861 return true 862 } 863 // match: (Add16 (Add16 z i:(Const16 <t>)) x) 864 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 865 // result: (Add16 i (Add16 <t> z x)) 866 for { 867 _ = v.Args[1] 868 v_0 := v.Args[0] 869 if v_0.Op != OpAdd16 { 870 break 871 } 872 _ = v_0.Args[1] 873 z := v_0.Args[0] 874 i := v_0.Args[1] 875 if i.Op != OpConst16 { 876 break 877 } 878 t := i.Type 879 x := v.Args[1] 880 if !(z.Op != OpConst16 && x.Op != OpConst16) { 881 break 882 } 883 v.reset(OpAdd16) 884 v.AddArg(i) 885 v0 := b.NewValue0(v.Pos, OpAdd16, t) 886 v0.AddArg(z) 887 v0.AddArg(x) 888 v.AddArg(v0) 889 return true 890 } 891 // match: (Add16 x (Add16 i:(Const16 <t>) z)) 892 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 893 // result: (Add16 i (Add16 <t> z x)) 894 for { 895 _ = v.Args[1] 896 x := v.Args[0] 897 v_1 := v.Args[1] 898 if v_1.Op != OpAdd16 { 899 break 900 } 901 _ = v_1.Args[1] 902 i := v_1.Args[0] 903 if i.Op != OpConst16 { 904 break 905 } 906 t := i.Type 907 z := v_1.Args[1] 908 if !(z.Op != OpConst16 && x.Op != OpConst16) { 909 break 910 } 911 v.reset(OpAdd16) 912 v.AddArg(i) 913 v0 := b.NewValue0(v.Pos, OpAdd16, t) 914 v0.AddArg(z) 915 v0.AddArg(x) 916 v.AddArg(v0) 917 return true 918 } 919 // match: (Add16 x (Add16 z i:(Const16 <t>))) 920 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 921 // result: (Add16 i (Add16 <t> z x)) 922 for { 923 _ = v.Args[1] 924 x := v.Args[0] 925 v_1 := v.Args[1] 926 if v_1.Op != OpAdd16 { 927 break 928 } 929 _ = v_1.Args[1] 930 z := v_1.Args[0] 931 i := v_1.Args[1] 932 if i.Op != OpConst16 { 933 break 934 } 935 t := i.Type 936 if !(z.Op != OpConst16 && x.Op != OpConst16) { 937 break 938 } 939 v.reset(OpAdd16) 940 v.AddArg(i) 941 v0 := b.NewValue0(v.Pos, OpAdd16, t) 942 v0.AddArg(z) 943 v0.AddArg(x) 944 v.AddArg(v0) 945 return true 946 } 947 // match: (Add16 (Sub16 i:(Const16 <t>) z) x) 948 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 949 // result: (Add16 i (Sub16 <t> x z)) 950 for { 951 _ = v.Args[1] 952 v_0 := v.Args[0] 953 if v_0.Op != OpSub16 { 954 break 955 } 956 _ = v_0.Args[1] 957 i := v_0.Args[0] 958 if i.Op != OpConst16 { 959 break 960 } 961 t := i.Type 962 z := v_0.Args[1] 963 x := v.Args[1] 964 if !(z.Op != OpConst16 && x.Op != OpConst16) { 965 break 966 } 967 v.reset(OpAdd16) 968 v.AddArg(i) 969 v0 := b.NewValue0(v.Pos, OpSub16, t) 970 v0.AddArg(x) 971 v0.AddArg(z) 972 v.AddArg(v0) 973 return true 974 } 975 // match: (Add16 x (Sub16 i:(Const16 <t>) z)) 976 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 977 // result: (Add16 i (Sub16 <t> x z)) 978 for { 979 _ = v.Args[1] 980 x := v.Args[0] 981 v_1 := v.Args[1] 982 if v_1.Op != OpSub16 { 983 break 984 } 985 _ = v_1.Args[1] 986 i := v_1.Args[0] 987 if i.Op != OpConst16 { 988 break 989 } 990 t := i.Type 991 z := v_1.Args[1] 992 if !(z.Op != OpConst16 && x.Op != OpConst16) { 993 break 994 } 995 v.reset(OpAdd16) 996 v.AddArg(i) 997 v0 := b.NewValue0(v.Pos, OpSub16, t) 998 v0.AddArg(x) 999 v0.AddArg(z) 1000 v.AddArg(v0) 1001 return true 1002 } 1003 return false 1004 } 1005 func rewriteValuegeneric_OpAdd16_20(v *Value) bool { 1006 b := v.Block 1007 _ = b 1008 // match: (Add16 x (Sub16 i:(Const16 <t>) z)) 1009 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 1010 // result: (Add16 i (Sub16 <t> x z)) 1011 for { 1012 _ = v.Args[1] 1013 x := v.Args[0] 1014 v_1 := v.Args[1] 1015 if v_1.Op != OpSub16 { 1016 break 1017 } 1018 _ = v_1.Args[1] 1019 i := v_1.Args[0] 1020 if i.Op != OpConst16 { 1021 break 1022 } 1023 t := i.Type 1024 z := v_1.Args[1] 1025 if !(z.Op != OpConst16 && x.Op != OpConst16) { 1026 break 1027 } 1028 v.reset(OpAdd16) 1029 v.AddArg(i) 1030 v0 := b.NewValue0(v.Pos, OpSub16, t) 1031 v0.AddArg(x) 1032 v0.AddArg(z) 1033 v.AddArg(v0) 1034 return true 1035 } 1036 // match: (Add16 (Sub16 i:(Const16 <t>) z) x) 1037 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 1038 // result: (Add16 i (Sub16 <t> x z)) 1039 for { 1040 _ = v.Args[1] 1041 v_0 := v.Args[0] 1042 if v_0.Op != OpSub16 { 1043 break 1044 } 1045 _ = v_0.Args[1] 1046 i := v_0.Args[0] 1047 if i.Op != OpConst16 { 1048 break 1049 } 1050 t := i.Type 1051 z := v_0.Args[1] 1052 x := v.Args[1] 1053 if !(z.Op != OpConst16 && x.Op != OpConst16) { 1054 break 1055 } 1056 v.reset(OpAdd16) 1057 v.AddArg(i) 1058 v0 := b.NewValue0(v.Pos, OpSub16, t) 1059 v0.AddArg(x) 1060 v0.AddArg(z) 1061 v.AddArg(v0) 1062 return true 1063 } 1064 // match: (Add16 (Sub16 z i:(Const16 <t>)) x) 1065 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 1066 // result: (Sub16 (Add16 <t> x z) i) 1067 for { 1068 _ = v.Args[1] 1069 v_0 := v.Args[0] 1070 if v_0.Op != OpSub16 { 1071 break 1072 } 1073 _ = v_0.Args[1] 1074 z := v_0.Args[0] 1075 i := v_0.Args[1] 1076 if i.Op != OpConst16 { 1077 break 1078 } 1079 t := i.Type 1080 x := v.Args[1] 1081 if !(z.Op != OpConst16 && x.Op != OpConst16) { 1082 break 1083 } 1084 v.reset(OpSub16) 1085 v0 := b.NewValue0(v.Pos, OpAdd16, t) 1086 v0.AddArg(x) 1087 v0.AddArg(z) 1088 v.AddArg(v0) 1089 v.AddArg(i) 1090 return true 1091 } 1092 // match: (Add16 x (Sub16 z i:(Const16 <t>))) 1093 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 1094 // result: (Sub16 (Add16 <t> x z) i) 1095 for { 1096 _ = v.Args[1] 1097 x := v.Args[0] 1098 v_1 := v.Args[1] 1099 if v_1.Op != OpSub16 { 1100 break 1101 } 1102 _ = v_1.Args[1] 1103 z := v_1.Args[0] 1104 i := v_1.Args[1] 1105 if i.Op != OpConst16 { 1106 break 1107 } 1108 t := i.Type 1109 if !(z.Op != OpConst16 && x.Op != OpConst16) { 1110 break 1111 } 1112 v.reset(OpSub16) 1113 v0 := b.NewValue0(v.Pos, OpAdd16, t) 1114 v0.AddArg(x) 1115 v0.AddArg(z) 1116 v.AddArg(v0) 1117 v.AddArg(i) 1118 return true 1119 } 1120 // match: (Add16 x (Sub16 z i:(Const16 <t>))) 1121 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 1122 // result: (Sub16 (Add16 <t> x z) i) 1123 for { 1124 _ = v.Args[1] 1125 x := v.Args[0] 1126 v_1 := v.Args[1] 1127 if v_1.Op != OpSub16 { 1128 break 1129 } 1130 _ = v_1.Args[1] 1131 z := v_1.Args[0] 1132 i := v_1.Args[1] 1133 if i.Op != OpConst16 { 1134 break 1135 } 1136 t := i.Type 1137 if !(z.Op != OpConst16 && x.Op != OpConst16) { 1138 break 1139 } 1140 v.reset(OpSub16) 1141 v0 := b.NewValue0(v.Pos, OpAdd16, t) 1142 v0.AddArg(x) 1143 v0.AddArg(z) 1144 v.AddArg(v0) 1145 v.AddArg(i) 1146 return true 1147 } 1148 // match: (Add16 (Sub16 z i:(Const16 <t>)) x) 1149 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 1150 // result: (Sub16 (Add16 <t> x z) i) 1151 for { 1152 _ = v.Args[1] 1153 v_0 := v.Args[0] 1154 if v_0.Op != OpSub16 { 1155 break 1156 } 1157 _ = v_0.Args[1] 1158 z := v_0.Args[0] 1159 i := v_0.Args[1] 1160 if i.Op != OpConst16 { 1161 break 1162 } 1163 t := i.Type 1164 x := v.Args[1] 1165 if !(z.Op != OpConst16 && x.Op != OpConst16) { 1166 break 1167 } 1168 v.reset(OpSub16) 1169 v0 := b.NewValue0(v.Pos, OpAdd16, t) 1170 v0.AddArg(x) 1171 v0.AddArg(z) 1172 v.AddArg(v0) 1173 v.AddArg(i) 1174 return true 1175 } 1176 // match: (Add16 (Const16 <t> [c]) (Add16 (Const16 <t> [d]) x)) 1177 // cond: 1178 // result: (Add16 (Const16 <t> [int64(int16(c+d))]) x) 1179 for { 1180 _ = v.Args[1] 1181 v_0 := v.Args[0] 1182 if v_0.Op != OpConst16 { 1183 break 1184 } 1185 t := v_0.Type 1186 c := v_0.AuxInt 1187 v_1 := v.Args[1] 1188 if v_1.Op != OpAdd16 { 1189 break 1190 } 1191 _ = v_1.Args[1] 1192 v_1_0 := v_1.Args[0] 1193 if v_1_0.Op != OpConst16 { 1194 break 1195 } 1196 if v_1_0.Type != t { 1197 break 1198 } 1199 d := v_1_0.AuxInt 1200 x := v_1.Args[1] 1201 v.reset(OpAdd16) 1202 v0 := b.NewValue0(v.Pos, OpConst16, t) 1203 v0.AuxInt = int64(int16(c + d)) 1204 v.AddArg(v0) 1205 v.AddArg(x) 1206 return true 1207 } 1208 // match: (Add16 (Const16 <t> [c]) (Add16 x (Const16 <t> [d]))) 1209 // cond: 1210 // result: (Add16 (Const16 <t> [int64(int16(c+d))]) x) 1211 for { 1212 _ = v.Args[1] 1213 v_0 := v.Args[0] 1214 if v_0.Op != OpConst16 { 1215 break 1216 } 1217 t := v_0.Type 1218 c := v_0.AuxInt 1219 v_1 := v.Args[1] 1220 if v_1.Op != OpAdd16 { 1221 break 1222 } 1223 _ = v_1.Args[1] 1224 x := v_1.Args[0] 1225 v_1_1 := v_1.Args[1] 1226 if v_1_1.Op != OpConst16 { 1227 break 1228 } 1229 if v_1_1.Type != t { 1230 break 1231 } 1232 d := v_1_1.AuxInt 1233 v.reset(OpAdd16) 1234 v0 := b.NewValue0(v.Pos, OpConst16, t) 1235 v0.AuxInt = int64(int16(c + d)) 1236 v.AddArg(v0) 1237 v.AddArg(x) 1238 return true 1239 } 1240 // match: (Add16 (Add16 (Const16 <t> [d]) x) (Const16 <t> [c])) 1241 // cond: 1242 // result: (Add16 (Const16 <t> [int64(int16(c+d))]) x) 1243 for { 1244 _ = v.Args[1] 1245 v_0 := v.Args[0] 1246 if v_0.Op != OpAdd16 { 1247 break 1248 } 1249 _ = v_0.Args[1] 1250 v_0_0 := v_0.Args[0] 1251 if v_0_0.Op != OpConst16 { 1252 break 1253 } 1254 t := v_0_0.Type 1255 d := v_0_0.AuxInt 1256 x := v_0.Args[1] 1257 v_1 := v.Args[1] 1258 if v_1.Op != OpConst16 { 1259 break 1260 } 1261 if v_1.Type != t { 1262 break 1263 } 1264 c := v_1.AuxInt 1265 v.reset(OpAdd16) 1266 v0 := b.NewValue0(v.Pos, OpConst16, t) 1267 v0.AuxInt = int64(int16(c + d)) 1268 v.AddArg(v0) 1269 v.AddArg(x) 1270 return true 1271 } 1272 // match: (Add16 (Add16 x (Const16 <t> [d])) (Const16 <t> [c])) 1273 // cond: 1274 // result: (Add16 (Const16 <t> [int64(int16(c+d))]) x) 1275 for { 1276 _ = v.Args[1] 1277 v_0 := v.Args[0] 1278 if v_0.Op != OpAdd16 { 1279 break 1280 } 1281 _ = v_0.Args[1] 1282 x := v_0.Args[0] 1283 v_0_1 := v_0.Args[1] 1284 if v_0_1.Op != OpConst16 { 1285 break 1286 } 1287 t := v_0_1.Type 1288 d := v_0_1.AuxInt 1289 v_1 := v.Args[1] 1290 if v_1.Op != OpConst16 { 1291 break 1292 } 1293 if v_1.Type != t { 1294 break 1295 } 1296 c := v_1.AuxInt 1297 v.reset(OpAdd16) 1298 v0 := b.NewValue0(v.Pos, OpConst16, t) 1299 v0.AuxInt = int64(int16(c + d)) 1300 v.AddArg(v0) 1301 v.AddArg(x) 1302 return true 1303 } 1304 return false 1305 } 1306 func rewriteValuegeneric_OpAdd16_30(v *Value) bool { 1307 b := v.Block 1308 _ = b 1309 // match: (Add16 (Const16 <t> [c]) (Sub16 (Const16 <t> [d]) x)) 1310 // cond: 1311 // result: (Sub16 (Const16 <t> [int64(int16(c+d))]) x) 1312 for { 1313 _ = v.Args[1] 1314 v_0 := v.Args[0] 1315 if v_0.Op != OpConst16 { 1316 break 1317 } 1318 t := v_0.Type 1319 c := v_0.AuxInt 1320 v_1 := v.Args[1] 1321 if v_1.Op != OpSub16 { 1322 break 1323 } 1324 _ = v_1.Args[1] 1325 v_1_0 := v_1.Args[0] 1326 if v_1_0.Op != OpConst16 { 1327 break 1328 } 1329 if v_1_0.Type != t { 1330 break 1331 } 1332 d := v_1_0.AuxInt 1333 x := v_1.Args[1] 1334 v.reset(OpSub16) 1335 v0 := b.NewValue0(v.Pos, OpConst16, t) 1336 v0.AuxInt = int64(int16(c + d)) 1337 v.AddArg(v0) 1338 v.AddArg(x) 1339 return true 1340 } 1341 // match: (Add16 (Sub16 (Const16 <t> [d]) x) (Const16 <t> [c])) 1342 // cond: 1343 // result: (Sub16 (Const16 <t> [int64(int16(c+d))]) x) 1344 for { 1345 _ = v.Args[1] 1346 v_0 := v.Args[0] 1347 if v_0.Op != OpSub16 { 1348 break 1349 } 1350 _ = v_0.Args[1] 1351 v_0_0 := v_0.Args[0] 1352 if v_0_0.Op != OpConst16 { 1353 break 1354 } 1355 t := v_0_0.Type 1356 d := v_0_0.AuxInt 1357 x := v_0.Args[1] 1358 v_1 := v.Args[1] 1359 if v_1.Op != OpConst16 { 1360 break 1361 } 1362 if v_1.Type != t { 1363 break 1364 } 1365 c := v_1.AuxInt 1366 v.reset(OpSub16) 1367 v0 := b.NewValue0(v.Pos, OpConst16, t) 1368 v0.AuxInt = int64(int16(c + d)) 1369 v.AddArg(v0) 1370 v.AddArg(x) 1371 return true 1372 } 1373 // match: (Add16 (Const16 <t> [c]) (Sub16 x (Const16 <t> [d]))) 1374 // cond: 1375 // result: (Add16 (Const16 <t> [int64(int16(c-d))]) x) 1376 for { 1377 _ = v.Args[1] 1378 v_0 := v.Args[0] 1379 if v_0.Op != OpConst16 { 1380 break 1381 } 1382 t := v_0.Type 1383 c := v_0.AuxInt 1384 v_1 := v.Args[1] 1385 if v_1.Op != OpSub16 { 1386 break 1387 } 1388 _ = v_1.Args[1] 1389 x := v_1.Args[0] 1390 v_1_1 := v_1.Args[1] 1391 if v_1_1.Op != OpConst16 { 1392 break 1393 } 1394 if v_1_1.Type != t { 1395 break 1396 } 1397 d := v_1_1.AuxInt 1398 v.reset(OpAdd16) 1399 v0 := b.NewValue0(v.Pos, OpConst16, t) 1400 v0.AuxInt = int64(int16(c - d)) 1401 v.AddArg(v0) 1402 v.AddArg(x) 1403 return true 1404 } 1405 // match: (Add16 (Sub16 x (Const16 <t> [d])) (Const16 <t> [c])) 1406 // cond: 1407 // result: (Add16 (Const16 <t> [int64(int16(c-d))]) x) 1408 for { 1409 _ = v.Args[1] 1410 v_0 := v.Args[0] 1411 if v_0.Op != OpSub16 { 1412 break 1413 } 1414 _ = v_0.Args[1] 1415 x := v_0.Args[0] 1416 v_0_1 := v_0.Args[1] 1417 if v_0_1.Op != OpConst16 { 1418 break 1419 } 1420 t := v_0_1.Type 1421 d := v_0_1.AuxInt 1422 v_1 := v.Args[1] 1423 if v_1.Op != OpConst16 { 1424 break 1425 } 1426 if v_1.Type != t { 1427 break 1428 } 1429 c := v_1.AuxInt 1430 v.reset(OpAdd16) 1431 v0 := b.NewValue0(v.Pos, OpConst16, t) 1432 v0.AuxInt = int64(int16(c - d)) 1433 v.AddArg(v0) 1434 v.AddArg(x) 1435 return true 1436 } 1437 return false 1438 } 1439 func rewriteValuegeneric_OpAdd32_0(v *Value) bool { 1440 b := v.Block 1441 _ = b 1442 // match: (Add32 (Const32 [c]) (Const32 [d])) 1443 // cond: 1444 // result: (Const32 [int64(int32(c+d))]) 1445 for { 1446 _ = v.Args[1] 1447 v_0 := v.Args[0] 1448 if v_0.Op != OpConst32 { 1449 break 1450 } 1451 c := v_0.AuxInt 1452 v_1 := v.Args[1] 1453 if v_1.Op != OpConst32 { 1454 break 1455 } 1456 d := v_1.AuxInt 1457 v.reset(OpConst32) 1458 v.AuxInt = int64(int32(c + d)) 1459 return true 1460 } 1461 // match: (Add32 (Const32 [d]) (Const32 [c])) 1462 // cond: 1463 // result: (Const32 [int64(int32(c+d))]) 1464 for { 1465 _ = v.Args[1] 1466 v_0 := v.Args[0] 1467 if v_0.Op != OpConst32 { 1468 break 1469 } 1470 d := v_0.AuxInt 1471 v_1 := v.Args[1] 1472 if v_1.Op != OpConst32 { 1473 break 1474 } 1475 c := v_1.AuxInt 1476 v.reset(OpConst32) 1477 v.AuxInt = int64(int32(c + d)) 1478 return true 1479 } 1480 // match: (Add32 <t> (Mul32 x y) (Mul32 x z)) 1481 // cond: 1482 // result: (Mul32 x (Add32 <t> y z)) 1483 for { 1484 t := v.Type 1485 _ = v.Args[1] 1486 v_0 := v.Args[0] 1487 if v_0.Op != OpMul32 { 1488 break 1489 } 1490 _ = v_0.Args[1] 1491 x := v_0.Args[0] 1492 y := v_0.Args[1] 1493 v_1 := v.Args[1] 1494 if v_1.Op != OpMul32 { 1495 break 1496 } 1497 _ = v_1.Args[1] 1498 if x != v_1.Args[0] { 1499 break 1500 } 1501 z := v_1.Args[1] 1502 v.reset(OpMul32) 1503 v.AddArg(x) 1504 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1505 v0.AddArg(y) 1506 v0.AddArg(z) 1507 v.AddArg(v0) 1508 return true 1509 } 1510 // match: (Add32 <t> (Mul32 y x) (Mul32 x z)) 1511 // cond: 1512 // result: (Mul32 x (Add32 <t> y z)) 1513 for { 1514 t := v.Type 1515 _ = v.Args[1] 1516 v_0 := v.Args[0] 1517 if v_0.Op != OpMul32 { 1518 break 1519 } 1520 _ = v_0.Args[1] 1521 y := v_0.Args[0] 1522 x := v_0.Args[1] 1523 v_1 := v.Args[1] 1524 if v_1.Op != OpMul32 { 1525 break 1526 } 1527 _ = v_1.Args[1] 1528 if x != v_1.Args[0] { 1529 break 1530 } 1531 z := v_1.Args[1] 1532 v.reset(OpMul32) 1533 v.AddArg(x) 1534 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1535 v0.AddArg(y) 1536 v0.AddArg(z) 1537 v.AddArg(v0) 1538 return true 1539 } 1540 // match: (Add32 <t> (Mul32 x y) (Mul32 z x)) 1541 // cond: 1542 // result: (Mul32 x (Add32 <t> y z)) 1543 for { 1544 t := v.Type 1545 _ = v.Args[1] 1546 v_0 := v.Args[0] 1547 if v_0.Op != OpMul32 { 1548 break 1549 } 1550 _ = v_0.Args[1] 1551 x := v_0.Args[0] 1552 y := v_0.Args[1] 1553 v_1 := v.Args[1] 1554 if v_1.Op != OpMul32 { 1555 break 1556 } 1557 _ = v_1.Args[1] 1558 z := v_1.Args[0] 1559 if x != v_1.Args[1] { 1560 break 1561 } 1562 v.reset(OpMul32) 1563 v.AddArg(x) 1564 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1565 v0.AddArg(y) 1566 v0.AddArg(z) 1567 v.AddArg(v0) 1568 return true 1569 } 1570 // match: (Add32 <t> (Mul32 y x) (Mul32 z x)) 1571 // cond: 1572 // result: (Mul32 x (Add32 <t> y z)) 1573 for { 1574 t := v.Type 1575 _ = v.Args[1] 1576 v_0 := v.Args[0] 1577 if v_0.Op != OpMul32 { 1578 break 1579 } 1580 _ = v_0.Args[1] 1581 y := v_0.Args[0] 1582 x := v_0.Args[1] 1583 v_1 := v.Args[1] 1584 if v_1.Op != OpMul32 { 1585 break 1586 } 1587 _ = v_1.Args[1] 1588 z := v_1.Args[0] 1589 if x != v_1.Args[1] { 1590 break 1591 } 1592 v.reset(OpMul32) 1593 v.AddArg(x) 1594 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1595 v0.AddArg(y) 1596 v0.AddArg(z) 1597 v.AddArg(v0) 1598 return true 1599 } 1600 // match: (Add32 <t> (Mul32 x z) (Mul32 x y)) 1601 // cond: 1602 // result: (Mul32 x (Add32 <t> y z)) 1603 for { 1604 t := v.Type 1605 _ = v.Args[1] 1606 v_0 := v.Args[0] 1607 if v_0.Op != OpMul32 { 1608 break 1609 } 1610 _ = v_0.Args[1] 1611 x := v_0.Args[0] 1612 z := v_0.Args[1] 1613 v_1 := v.Args[1] 1614 if v_1.Op != OpMul32 { 1615 break 1616 } 1617 _ = v_1.Args[1] 1618 if x != v_1.Args[0] { 1619 break 1620 } 1621 y := v_1.Args[1] 1622 v.reset(OpMul32) 1623 v.AddArg(x) 1624 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1625 v0.AddArg(y) 1626 v0.AddArg(z) 1627 v.AddArg(v0) 1628 return true 1629 } 1630 // match: (Add32 <t> (Mul32 z x) (Mul32 x y)) 1631 // cond: 1632 // result: (Mul32 x (Add32 <t> y z)) 1633 for { 1634 t := v.Type 1635 _ = v.Args[1] 1636 v_0 := v.Args[0] 1637 if v_0.Op != OpMul32 { 1638 break 1639 } 1640 _ = v_0.Args[1] 1641 z := v_0.Args[0] 1642 x := v_0.Args[1] 1643 v_1 := v.Args[1] 1644 if v_1.Op != OpMul32 { 1645 break 1646 } 1647 _ = v_1.Args[1] 1648 if x != v_1.Args[0] { 1649 break 1650 } 1651 y := v_1.Args[1] 1652 v.reset(OpMul32) 1653 v.AddArg(x) 1654 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1655 v0.AddArg(y) 1656 v0.AddArg(z) 1657 v.AddArg(v0) 1658 return true 1659 } 1660 // match: (Add32 <t> (Mul32 x z) (Mul32 y x)) 1661 // cond: 1662 // result: (Mul32 x (Add32 <t> y z)) 1663 for { 1664 t := v.Type 1665 _ = v.Args[1] 1666 v_0 := v.Args[0] 1667 if v_0.Op != OpMul32 { 1668 break 1669 } 1670 _ = v_0.Args[1] 1671 x := v_0.Args[0] 1672 z := v_0.Args[1] 1673 v_1 := v.Args[1] 1674 if v_1.Op != OpMul32 { 1675 break 1676 } 1677 _ = v_1.Args[1] 1678 y := v_1.Args[0] 1679 if x != v_1.Args[1] { 1680 break 1681 } 1682 v.reset(OpMul32) 1683 v.AddArg(x) 1684 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1685 v0.AddArg(y) 1686 v0.AddArg(z) 1687 v.AddArg(v0) 1688 return true 1689 } 1690 // match: (Add32 <t> (Mul32 z x) (Mul32 y x)) 1691 // cond: 1692 // result: (Mul32 x (Add32 <t> y z)) 1693 for { 1694 t := v.Type 1695 _ = v.Args[1] 1696 v_0 := v.Args[0] 1697 if v_0.Op != OpMul32 { 1698 break 1699 } 1700 _ = v_0.Args[1] 1701 z := v_0.Args[0] 1702 x := v_0.Args[1] 1703 v_1 := v.Args[1] 1704 if v_1.Op != OpMul32 { 1705 break 1706 } 1707 _ = v_1.Args[1] 1708 y := v_1.Args[0] 1709 if x != v_1.Args[1] { 1710 break 1711 } 1712 v.reset(OpMul32) 1713 v.AddArg(x) 1714 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1715 v0.AddArg(y) 1716 v0.AddArg(z) 1717 v.AddArg(v0) 1718 return true 1719 } 1720 return false 1721 } 1722 func rewriteValuegeneric_OpAdd32_10(v *Value) bool { 1723 b := v.Block 1724 _ = b 1725 // match: (Add32 (Const32 [0]) x) 1726 // cond: 1727 // result: x 1728 for { 1729 _ = v.Args[1] 1730 v_0 := v.Args[0] 1731 if v_0.Op != OpConst32 { 1732 break 1733 } 1734 if v_0.AuxInt != 0 { 1735 break 1736 } 1737 x := v.Args[1] 1738 v.reset(OpCopy) 1739 v.Type = x.Type 1740 v.AddArg(x) 1741 return true 1742 } 1743 // match: (Add32 x (Const32 [0])) 1744 // cond: 1745 // result: x 1746 for { 1747 _ = v.Args[1] 1748 x := v.Args[0] 1749 v_1 := v.Args[1] 1750 if v_1.Op != OpConst32 { 1751 break 1752 } 1753 if v_1.AuxInt != 0 { 1754 break 1755 } 1756 v.reset(OpCopy) 1757 v.Type = x.Type 1758 v.AddArg(x) 1759 return true 1760 } 1761 // match: (Add32 (Const32 [1]) (Com32 x)) 1762 // cond: 1763 // result: (Neg32 x) 1764 for { 1765 _ = v.Args[1] 1766 v_0 := v.Args[0] 1767 if v_0.Op != OpConst32 { 1768 break 1769 } 1770 if v_0.AuxInt != 1 { 1771 break 1772 } 1773 v_1 := v.Args[1] 1774 if v_1.Op != OpCom32 { 1775 break 1776 } 1777 x := v_1.Args[0] 1778 v.reset(OpNeg32) 1779 v.AddArg(x) 1780 return true 1781 } 1782 // match: (Add32 (Com32 x) (Const32 [1])) 1783 // cond: 1784 // result: (Neg32 x) 1785 for { 1786 _ = v.Args[1] 1787 v_0 := v.Args[0] 1788 if v_0.Op != OpCom32 { 1789 break 1790 } 1791 x := v_0.Args[0] 1792 v_1 := v.Args[1] 1793 if v_1.Op != OpConst32 { 1794 break 1795 } 1796 if v_1.AuxInt != 1 { 1797 break 1798 } 1799 v.reset(OpNeg32) 1800 v.AddArg(x) 1801 return true 1802 } 1803 // match: (Add32 (Add32 i:(Const32 <t>) z) x) 1804 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1805 // result: (Add32 i (Add32 <t> z x)) 1806 for { 1807 _ = v.Args[1] 1808 v_0 := v.Args[0] 1809 if v_0.Op != OpAdd32 { 1810 break 1811 } 1812 _ = v_0.Args[1] 1813 i := v_0.Args[0] 1814 if i.Op != OpConst32 { 1815 break 1816 } 1817 t := i.Type 1818 z := v_0.Args[1] 1819 x := v.Args[1] 1820 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1821 break 1822 } 1823 v.reset(OpAdd32) 1824 v.AddArg(i) 1825 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1826 v0.AddArg(z) 1827 v0.AddArg(x) 1828 v.AddArg(v0) 1829 return true 1830 } 1831 // match: (Add32 (Add32 z i:(Const32 <t>)) x) 1832 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1833 // result: (Add32 i (Add32 <t> z x)) 1834 for { 1835 _ = v.Args[1] 1836 v_0 := v.Args[0] 1837 if v_0.Op != OpAdd32 { 1838 break 1839 } 1840 _ = v_0.Args[1] 1841 z := v_0.Args[0] 1842 i := v_0.Args[1] 1843 if i.Op != OpConst32 { 1844 break 1845 } 1846 t := i.Type 1847 x := v.Args[1] 1848 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1849 break 1850 } 1851 v.reset(OpAdd32) 1852 v.AddArg(i) 1853 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1854 v0.AddArg(z) 1855 v0.AddArg(x) 1856 v.AddArg(v0) 1857 return true 1858 } 1859 // match: (Add32 x (Add32 i:(Const32 <t>) z)) 1860 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1861 // result: (Add32 i (Add32 <t> z x)) 1862 for { 1863 _ = v.Args[1] 1864 x := v.Args[0] 1865 v_1 := v.Args[1] 1866 if v_1.Op != OpAdd32 { 1867 break 1868 } 1869 _ = v_1.Args[1] 1870 i := v_1.Args[0] 1871 if i.Op != OpConst32 { 1872 break 1873 } 1874 t := i.Type 1875 z := v_1.Args[1] 1876 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1877 break 1878 } 1879 v.reset(OpAdd32) 1880 v.AddArg(i) 1881 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1882 v0.AddArg(z) 1883 v0.AddArg(x) 1884 v.AddArg(v0) 1885 return true 1886 } 1887 // match: (Add32 x (Add32 z i:(Const32 <t>))) 1888 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1889 // result: (Add32 i (Add32 <t> z x)) 1890 for { 1891 _ = v.Args[1] 1892 x := v.Args[0] 1893 v_1 := v.Args[1] 1894 if v_1.Op != OpAdd32 { 1895 break 1896 } 1897 _ = v_1.Args[1] 1898 z := v_1.Args[0] 1899 i := v_1.Args[1] 1900 if i.Op != OpConst32 { 1901 break 1902 } 1903 t := i.Type 1904 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1905 break 1906 } 1907 v.reset(OpAdd32) 1908 v.AddArg(i) 1909 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1910 v0.AddArg(z) 1911 v0.AddArg(x) 1912 v.AddArg(v0) 1913 return true 1914 } 1915 // match: (Add32 (Sub32 i:(Const32 <t>) z) x) 1916 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1917 // result: (Add32 i (Sub32 <t> x z)) 1918 for { 1919 _ = v.Args[1] 1920 v_0 := v.Args[0] 1921 if v_0.Op != OpSub32 { 1922 break 1923 } 1924 _ = v_0.Args[1] 1925 i := v_0.Args[0] 1926 if i.Op != OpConst32 { 1927 break 1928 } 1929 t := i.Type 1930 z := v_0.Args[1] 1931 x := v.Args[1] 1932 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1933 break 1934 } 1935 v.reset(OpAdd32) 1936 v.AddArg(i) 1937 v0 := b.NewValue0(v.Pos, OpSub32, t) 1938 v0.AddArg(x) 1939 v0.AddArg(z) 1940 v.AddArg(v0) 1941 return true 1942 } 1943 // match: (Add32 x (Sub32 i:(Const32 <t>) z)) 1944 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1945 // result: (Add32 i (Sub32 <t> x z)) 1946 for { 1947 _ = v.Args[1] 1948 x := v.Args[0] 1949 v_1 := v.Args[1] 1950 if v_1.Op != OpSub32 { 1951 break 1952 } 1953 _ = v_1.Args[1] 1954 i := v_1.Args[0] 1955 if i.Op != OpConst32 { 1956 break 1957 } 1958 t := i.Type 1959 z := v_1.Args[1] 1960 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1961 break 1962 } 1963 v.reset(OpAdd32) 1964 v.AddArg(i) 1965 v0 := b.NewValue0(v.Pos, OpSub32, t) 1966 v0.AddArg(x) 1967 v0.AddArg(z) 1968 v.AddArg(v0) 1969 return true 1970 } 1971 return false 1972 } 1973 func rewriteValuegeneric_OpAdd32_20(v *Value) bool { 1974 b := v.Block 1975 _ = b 1976 // match: (Add32 x (Sub32 i:(Const32 <t>) z)) 1977 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1978 // result: (Add32 i (Sub32 <t> x z)) 1979 for { 1980 _ = v.Args[1] 1981 x := v.Args[0] 1982 v_1 := v.Args[1] 1983 if v_1.Op != OpSub32 { 1984 break 1985 } 1986 _ = v_1.Args[1] 1987 i := v_1.Args[0] 1988 if i.Op != OpConst32 { 1989 break 1990 } 1991 t := i.Type 1992 z := v_1.Args[1] 1993 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1994 break 1995 } 1996 v.reset(OpAdd32) 1997 v.AddArg(i) 1998 v0 := b.NewValue0(v.Pos, OpSub32, t) 1999 v0.AddArg(x) 2000 v0.AddArg(z) 2001 v.AddArg(v0) 2002 return true 2003 } 2004 // match: (Add32 (Sub32 i:(Const32 <t>) z) x) 2005 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 2006 // result: (Add32 i (Sub32 <t> x z)) 2007 for { 2008 _ = v.Args[1] 2009 v_0 := v.Args[0] 2010 if v_0.Op != OpSub32 { 2011 break 2012 } 2013 _ = v_0.Args[1] 2014 i := v_0.Args[0] 2015 if i.Op != OpConst32 { 2016 break 2017 } 2018 t := i.Type 2019 z := v_0.Args[1] 2020 x := v.Args[1] 2021 if !(z.Op != OpConst32 && x.Op != OpConst32) { 2022 break 2023 } 2024 v.reset(OpAdd32) 2025 v.AddArg(i) 2026 v0 := b.NewValue0(v.Pos, OpSub32, t) 2027 v0.AddArg(x) 2028 v0.AddArg(z) 2029 v.AddArg(v0) 2030 return true 2031 } 2032 // match: (Add32 (Sub32 z i:(Const32 <t>)) x) 2033 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 2034 // result: (Sub32 (Add32 <t> x z) i) 2035 for { 2036 _ = v.Args[1] 2037 v_0 := v.Args[0] 2038 if v_0.Op != OpSub32 { 2039 break 2040 } 2041 _ = v_0.Args[1] 2042 z := v_0.Args[0] 2043 i := v_0.Args[1] 2044 if i.Op != OpConst32 { 2045 break 2046 } 2047 t := i.Type 2048 x := v.Args[1] 2049 if !(z.Op != OpConst32 && x.Op != OpConst32) { 2050 break 2051 } 2052 v.reset(OpSub32) 2053 v0 := b.NewValue0(v.Pos, OpAdd32, t) 2054 v0.AddArg(x) 2055 v0.AddArg(z) 2056 v.AddArg(v0) 2057 v.AddArg(i) 2058 return true 2059 } 2060 // match: (Add32 x (Sub32 z i:(Const32 <t>))) 2061 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 2062 // result: (Sub32 (Add32 <t> x z) i) 2063 for { 2064 _ = v.Args[1] 2065 x := v.Args[0] 2066 v_1 := v.Args[1] 2067 if v_1.Op != OpSub32 { 2068 break 2069 } 2070 _ = v_1.Args[1] 2071 z := v_1.Args[0] 2072 i := v_1.Args[1] 2073 if i.Op != OpConst32 { 2074 break 2075 } 2076 t := i.Type 2077 if !(z.Op != OpConst32 && x.Op != OpConst32) { 2078 break 2079 } 2080 v.reset(OpSub32) 2081 v0 := b.NewValue0(v.Pos, OpAdd32, t) 2082 v0.AddArg(x) 2083 v0.AddArg(z) 2084 v.AddArg(v0) 2085 v.AddArg(i) 2086 return true 2087 } 2088 // match: (Add32 x (Sub32 z i:(Const32 <t>))) 2089 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 2090 // result: (Sub32 (Add32 <t> x z) i) 2091 for { 2092 _ = v.Args[1] 2093 x := v.Args[0] 2094 v_1 := v.Args[1] 2095 if v_1.Op != OpSub32 { 2096 break 2097 } 2098 _ = v_1.Args[1] 2099 z := v_1.Args[0] 2100 i := v_1.Args[1] 2101 if i.Op != OpConst32 { 2102 break 2103 } 2104 t := i.Type 2105 if !(z.Op != OpConst32 && x.Op != OpConst32) { 2106 break 2107 } 2108 v.reset(OpSub32) 2109 v0 := b.NewValue0(v.Pos, OpAdd32, t) 2110 v0.AddArg(x) 2111 v0.AddArg(z) 2112 v.AddArg(v0) 2113 v.AddArg(i) 2114 return true 2115 } 2116 // match: (Add32 (Sub32 z i:(Const32 <t>)) x) 2117 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 2118 // result: (Sub32 (Add32 <t> x z) i) 2119 for { 2120 _ = v.Args[1] 2121 v_0 := v.Args[0] 2122 if v_0.Op != OpSub32 { 2123 break 2124 } 2125 _ = v_0.Args[1] 2126 z := v_0.Args[0] 2127 i := v_0.Args[1] 2128 if i.Op != OpConst32 { 2129 break 2130 } 2131 t := i.Type 2132 x := v.Args[1] 2133 if !(z.Op != OpConst32 && x.Op != OpConst32) { 2134 break 2135 } 2136 v.reset(OpSub32) 2137 v0 := b.NewValue0(v.Pos, OpAdd32, t) 2138 v0.AddArg(x) 2139 v0.AddArg(z) 2140 v.AddArg(v0) 2141 v.AddArg(i) 2142 return true 2143 } 2144 // match: (Add32 (Const32 <t> [c]) (Add32 (Const32 <t> [d]) x)) 2145 // cond: 2146 // result: (Add32 (Const32 <t> [int64(int32(c+d))]) x) 2147 for { 2148 _ = v.Args[1] 2149 v_0 := v.Args[0] 2150 if v_0.Op != OpConst32 { 2151 break 2152 } 2153 t := v_0.Type 2154 c := v_0.AuxInt 2155 v_1 := v.Args[1] 2156 if v_1.Op != OpAdd32 { 2157 break 2158 } 2159 _ = v_1.Args[1] 2160 v_1_0 := v_1.Args[0] 2161 if v_1_0.Op != OpConst32 { 2162 break 2163 } 2164 if v_1_0.Type != t { 2165 break 2166 } 2167 d := v_1_0.AuxInt 2168 x := v_1.Args[1] 2169 v.reset(OpAdd32) 2170 v0 := b.NewValue0(v.Pos, OpConst32, t) 2171 v0.AuxInt = int64(int32(c + d)) 2172 v.AddArg(v0) 2173 v.AddArg(x) 2174 return true 2175 } 2176 // match: (Add32 (Const32 <t> [c]) (Add32 x (Const32 <t> [d]))) 2177 // cond: 2178 // result: (Add32 (Const32 <t> [int64(int32(c+d))]) x) 2179 for { 2180 _ = v.Args[1] 2181 v_0 := v.Args[0] 2182 if v_0.Op != OpConst32 { 2183 break 2184 } 2185 t := v_0.Type 2186 c := v_0.AuxInt 2187 v_1 := v.Args[1] 2188 if v_1.Op != OpAdd32 { 2189 break 2190 } 2191 _ = v_1.Args[1] 2192 x := v_1.Args[0] 2193 v_1_1 := v_1.Args[1] 2194 if v_1_1.Op != OpConst32 { 2195 break 2196 } 2197 if v_1_1.Type != t { 2198 break 2199 } 2200 d := v_1_1.AuxInt 2201 v.reset(OpAdd32) 2202 v0 := b.NewValue0(v.Pos, OpConst32, t) 2203 v0.AuxInt = int64(int32(c + d)) 2204 v.AddArg(v0) 2205 v.AddArg(x) 2206 return true 2207 } 2208 // match: (Add32 (Add32 (Const32 <t> [d]) x) (Const32 <t> [c])) 2209 // cond: 2210 // result: (Add32 (Const32 <t> [int64(int32(c+d))]) x) 2211 for { 2212 _ = v.Args[1] 2213 v_0 := v.Args[0] 2214 if v_0.Op != OpAdd32 { 2215 break 2216 } 2217 _ = v_0.Args[1] 2218 v_0_0 := v_0.Args[0] 2219 if v_0_0.Op != OpConst32 { 2220 break 2221 } 2222 t := v_0_0.Type 2223 d := v_0_0.AuxInt 2224 x := v_0.Args[1] 2225 v_1 := v.Args[1] 2226 if v_1.Op != OpConst32 { 2227 break 2228 } 2229 if v_1.Type != t { 2230 break 2231 } 2232 c := v_1.AuxInt 2233 v.reset(OpAdd32) 2234 v0 := b.NewValue0(v.Pos, OpConst32, t) 2235 v0.AuxInt = int64(int32(c + d)) 2236 v.AddArg(v0) 2237 v.AddArg(x) 2238 return true 2239 } 2240 // match: (Add32 (Add32 x (Const32 <t> [d])) (Const32 <t> [c])) 2241 // cond: 2242 // result: (Add32 (Const32 <t> [int64(int32(c+d))]) x) 2243 for { 2244 _ = v.Args[1] 2245 v_0 := v.Args[0] 2246 if v_0.Op != OpAdd32 { 2247 break 2248 } 2249 _ = v_0.Args[1] 2250 x := v_0.Args[0] 2251 v_0_1 := v_0.Args[1] 2252 if v_0_1.Op != OpConst32 { 2253 break 2254 } 2255 t := v_0_1.Type 2256 d := v_0_1.AuxInt 2257 v_1 := v.Args[1] 2258 if v_1.Op != OpConst32 { 2259 break 2260 } 2261 if v_1.Type != t { 2262 break 2263 } 2264 c := v_1.AuxInt 2265 v.reset(OpAdd32) 2266 v0 := b.NewValue0(v.Pos, OpConst32, t) 2267 v0.AuxInt = int64(int32(c + d)) 2268 v.AddArg(v0) 2269 v.AddArg(x) 2270 return true 2271 } 2272 return false 2273 } 2274 func rewriteValuegeneric_OpAdd32_30(v *Value) bool { 2275 b := v.Block 2276 _ = b 2277 // match: (Add32 (Const32 <t> [c]) (Sub32 (Const32 <t> [d]) x)) 2278 // cond: 2279 // result: (Sub32 (Const32 <t> [int64(int32(c+d))]) x) 2280 for { 2281 _ = v.Args[1] 2282 v_0 := v.Args[0] 2283 if v_0.Op != OpConst32 { 2284 break 2285 } 2286 t := v_0.Type 2287 c := v_0.AuxInt 2288 v_1 := v.Args[1] 2289 if v_1.Op != OpSub32 { 2290 break 2291 } 2292 _ = v_1.Args[1] 2293 v_1_0 := v_1.Args[0] 2294 if v_1_0.Op != OpConst32 { 2295 break 2296 } 2297 if v_1_0.Type != t { 2298 break 2299 } 2300 d := v_1_0.AuxInt 2301 x := v_1.Args[1] 2302 v.reset(OpSub32) 2303 v0 := b.NewValue0(v.Pos, OpConst32, t) 2304 v0.AuxInt = int64(int32(c + d)) 2305 v.AddArg(v0) 2306 v.AddArg(x) 2307 return true 2308 } 2309 // match: (Add32 (Sub32 (Const32 <t> [d]) x) (Const32 <t> [c])) 2310 // cond: 2311 // result: (Sub32 (Const32 <t> [int64(int32(c+d))]) x) 2312 for { 2313 _ = v.Args[1] 2314 v_0 := v.Args[0] 2315 if v_0.Op != OpSub32 { 2316 break 2317 } 2318 _ = v_0.Args[1] 2319 v_0_0 := v_0.Args[0] 2320 if v_0_0.Op != OpConst32 { 2321 break 2322 } 2323 t := v_0_0.Type 2324 d := v_0_0.AuxInt 2325 x := v_0.Args[1] 2326 v_1 := v.Args[1] 2327 if v_1.Op != OpConst32 { 2328 break 2329 } 2330 if v_1.Type != t { 2331 break 2332 } 2333 c := v_1.AuxInt 2334 v.reset(OpSub32) 2335 v0 := b.NewValue0(v.Pos, OpConst32, t) 2336 v0.AuxInt = int64(int32(c + d)) 2337 v.AddArg(v0) 2338 v.AddArg(x) 2339 return true 2340 } 2341 // match: (Add32 (Const32 <t> [c]) (Sub32 x (Const32 <t> [d]))) 2342 // cond: 2343 // result: (Add32 (Const32 <t> [int64(int32(c-d))]) x) 2344 for { 2345 _ = v.Args[1] 2346 v_0 := v.Args[0] 2347 if v_0.Op != OpConst32 { 2348 break 2349 } 2350 t := v_0.Type 2351 c := v_0.AuxInt 2352 v_1 := v.Args[1] 2353 if v_1.Op != OpSub32 { 2354 break 2355 } 2356 _ = v_1.Args[1] 2357 x := v_1.Args[0] 2358 v_1_1 := v_1.Args[1] 2359 if v_1_1.Op != OpConst32 { 2360 break 2361 } 2362 if v_1_1.Type != t { 2363 break 2364 } 2365 d := v_1_1.AuxInt 2366 v.reset(OpAdd32) 2367 v0 := b.NewValue0(v.Pos, OpConst32, t) 2368 v0.AuxInt = int64(int32(c - d)) 2369 v.AddArg(v0) 2370 v.AddArg(x) 2371 return true 2372 } 2373 // match: (Add32 (Sub32 x (Const32 <t> [d])) (Const32 <t> [c])) 2374 // cond: 2375 // result: (Add32 (Const32 <t> [int64(int32(c-d))]) x) 2376 for { 2377 _ = v.Args[1] 2378 v_0 := v.Args[0] 2379 if v_0.Op != OpSub32 { 2380 break 2381 } 2382 _ = v_0.Args[1] 2383 x := v_0.Args[0] 2384 v_0_1 := v_0.Args[1] 2385 if v_0_1.Op != OpConst32 { 2386 break 2387 } 2388 t := v_0_1.Type 2389 d := v_0_1.AuxInt 2390 v_1 := v.Args[1] 2391 if v_1.Op != OpConst32 { 2392 break 2393 } 2394 if v_1.Type != t { 2395 break 2396 } 2397 c := v_1.AuxInt 2398 v.reset(OpAdd32) 2399 v0 := b.NewValue0(v.Pos, OpConst32, t) 2400 v0.AuxInt = int64(int32(c - d)) 2401 v.AddArg(v0) 2402 v.AddArg(x) 2403 return true 2404 } 2405 return false 2406 } 2407 func rewriteValuegeneric_OpAdd32F_0(v *Value) bool { 2408 // match: (Add32F (Const32F [c]) (Const32F [d])) 2409 // cond: 2410 // result: (Const32F [f2i(float64(i2f32(c) + i2f32(d)))]) 2411 for { 2412 _ = v.Args[1] 2413 v_0 := v.Args[0] 2414 if v_0.Op != OpConst32F { 2415 break 2416 } 2417 c := v_0.AuxInt 2418 v_1 := v.Args[1] 2419 if v_1.Op != OpConst32F { 2420 break 2421 } 2422 d := v_1.AuxInt 2423 v.reset(OpConst32F) 2424 v.AuxInt = f2i(float64(i2f32(c) + i2f32(d))) 2425 return true 2426 } 2427 // match: (Add32F (Const32F [d]) (Const32F [c])) 2428 // cond: 2429 // result: (Const32F [f2i(float64(i2f32(c) + i2f32(d)))]) 2430 for { 2431 _ = v.Args[1] 2432 v_0 := v.Args[0] 2433 if v_0.Op != OpConst32F { 2434 break 2435 } 2436 d := v_0.AuxInt 2437 v_1 := v.Args[1] 2438 if v_1.Op != OpConst32F { 2439 break 2440 } 2441 c := v_1.AuxInt 2442 v.reset(OpConst32F) 2443 v.AuxInt = f2i(float64(i2f32(c) + i2f32(d))) 2444 return true 2445 } 2446 // match: (Add32F x (Const32F [0])) 2447 // cond: 2448 // result: x 2449 for { 2450 _ = v.Args[1] 2451 x := v.Args[0] 2452 v_1 := v.Args[1] 2453 if v_1.Op != OpConst32F { 2454 break 2455 } 2456 if v_1.AuxInt != 0 { 2457 break 2458 } 2459 v.reset(OpCopy) 2460 v.Type = x.Type 2461 v.AddArg(x) 2462 return true 2463 } 2464 // match: (Add32F (Const32F [0]) x) 2465 // cond: 2466 // result: x 2467 for { 2468 _ = v.Args[1] 2469 v_0 := v.Args[0] 2470 if v_0.Op != OpConst32F { 2471 break 2472 } 2473 if v_0.AuxInt != 0 { 2474 break 2475 } 2476 x := v.Args[1] 2477 v.reset(OpCopy) 2478 v.Type = x.Type 2479 v.AddArg(x) 2480 return true 2481 } 2482 return false 2483 } 2484 func rewriteValuegeneric_OpAdd64_0(v *Value) bool { 2485 b := v.Block 2486 _ = b 2487 // match: (Add64 (Const64 [c]) (Const64 [d])) 2488 // cond: 2489 // result: (Const64 [c+d]) 2490 for { 2491 _ = v.Args[1] 2492 v_0 := v.Args[0] 2493 if v_0.Op != OpConst64 { 2494 break 2495 } 2496 c := v_0.AuxInt 2497 v_1 := v.Args[1] 2498 if v_1.Op != OpConst64 { 2499 break 2500 } 2501 d := v_1.AuxInt 2502 v.reset(OpConst64) 2503 v.AuxInt = c + d 2504 return true 2505 } 2506 // match: (Add64 (Const64 [d]) (Const64 [c])) 2507 // cond: 2508 // result: (Const64 [c+d]) 2509 for { 2510 _ = v.Args[1] 2511 v_0 := v.Args[0] 2512 if v_0.Op != OpConst64 { 2513 break 2514 } 2515 d := v_0.AuxInt 2516 v_1 := v.Args[1] 2517 if v_1.Op != OpConst64 { 2518 break 2519 } 2520 c := v_1.AuxInt 2521 v.reset(OpConst64) 2522 v.AuxInt = c + d 2523 return true 2524 } 2525 // match: (Add64 <t> (Mul64 x y) (Mul64 x z)) 2526 // cond: 2527 // result: (Mul64 x (Add64 <t> y z)) 2528 for { 2529 t := v.Type 2530 _ = v.Args[1] 2531 v_0 := v.Args[0] 2532 if v_0.Op != OpMul64 { 2533 break 2534 } 2535 _ = v_0.Args[1] 2536 x := v_0.Args[0] 2537 y := v_0.Args[1] 2538 v_1 := v.Args[1] 2539 if v_1.Op != OpMul64 { 2540 break 2541 } 2542 _ = v_1.Args[1] 2543 if x != v_1.Args[0] { 2544 break 2545 } 2546 z := v_1.Args[1] 2547 v.reset(OpMul64) 2548 v.AddArg(x) 2549 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2550 v0.AddArg(y) 2551 v0.AddArg(z) 2552 v.AddArg(v0) 2553 return true 2554 } 2555 // match: (Add64 <t> (Mul64 y x) (Mul64 x z)) 2556 // cond: 2557 // result: (Mul64 x (Add64 <t> y z)) 2558 for { 2559 t := v.Type 2560 _ = v.Args[1] 2561 v_0 := v.Args[0] 2562 if v_0.Op != OpMul64 { 2563 break 2564 } 2565 _ = v_0.Args[1] 2566 y := v_0.Args[0] 2567 x := v_0.Args[1] 2568 v_1 := v.Args[1] 2569 if v_1.Op != OpMul64 { 2570 break 2571 } 2572 _ = v_1.Args[1] 2573 if x != v_1.Args[0] { 2574 break 2575 } 2576 z := v_1.Args[1] 2577 v.reset(OpMul64) 2578 v.AddArg(x) 2579 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2580 v0.AddArg(y) 2581 v0.AddArg(z) 2582 v.AddArg(v0) 2583 return true 2584 } 2585 // match: (Add64 <t> (Mul64 x y) (Mul64 z x)) 2586 // cond: 2587 // result: (Mul64 x (Add64 <t> y z)) 2588 for { 2589 t := v.Type 2590 _ = v.Args[1] 2591 v_0 := v.Args[0] 2592 if v_0.Op != OpMul64 { 2593 break 2594 } 2595 _ = v_0.Args[1] 2596 x := v_0.Args[0] 2597 y := v_0.Args[1] 2598 v_1 := v.Args[1] 2599 if v_1.Op != OpMul64 { 2600 break 2601 } 2602 _ = v_1.Args[1] 2603 z := v_1.Args[0] 2604 if x != v_1.Args[1] { 2605 break 2606 } 2607 v.reset(OpMul64) 2608 v.AddArg(x) 2609 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2610 v0.AddArg(y) 2611 v0.AddArg(z) 2612 v.AddArg(v0) 2613 return true 2614 } 2615 // match: (Add64 <t> (Mul64 y x) (Mul64 z x)) 2616 // cond: 2617 // result: (Mul64 x (Add64 <t> y z)) 2618 for { 2619 t := v.Type 2620 _ = v.Args[1] 2621 v_0 := v.Args[0] 2622 if v_0.Op != OpMul64 { 2623 break 2624 } 2625 _ = v_0.Args[1] 2626 y := v_0.Args[0] 2627 x := v_0.Args[1] 2628 v_1 := v.Args[1] 2629 if v_1.Op != OpMul64 { 2630 break 2631 } 2632 _ = v_1.Args[1] 2633 z := v_1.Args[0] 2634 if x != v_1.Args[1] { 2635 break 2636 } 2637 v.reset(OpMul64) 2638 v.AddArg(x) 2639 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2640 v0.AddArg(y) 2641 v0.AddArg(z) 2642 v.AddArg(v0) 2643 return true 2644 } 2645 // match: (Add64 <t> (Mul64 x z) (Mul64 x y)) 2646 // cond: 2647 // result: (Mul64 x (Add64 <t> y z)) 2648 for { 2649 t := v.Type 2650 _ = v.Args[1] 2651 v_0 := v.Args[0] 2652 if v_0.Op != OpMul64 { 2653 break 2654 } 2655 _ = v_0.Args[1] 2656 x := v_0.Args[0] 2657 z := v_0.Args[1] 2658 v_1 := v.Args[1] 2659 if v_1.Op != OpMul64 { 2660 break 2661 } 2662 _ = v_1.Args[1] 2663 if x != v_1.Args[0] { 2664 break 2665 } 2666 y := v_1.Args[1] 2667 v.reset(OpMul64) 2668 v.AddArg(x) 2669 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2670 v0.AddArg(y) 2671 v0.AddArg(z) 2672 v.AddArg(v0) 2673 return true 2674 } 2675 // match: (Add64 <t> (Mul64 z x) (Mul64 x y)) 2676 // cond: 2677 // result: (Mul64 x (Add64 <t> y z)) 2678 for { 2679 t := v.Type 2680 _ = v.Args[1] 2681 v_0 := v.Args[0] 2682 if v_0.Op != OpMul64 { 2683 break 2684 } 2685 _ = v_0.Args[1] 2686 z := v_0.Args[0] 2687 x := v_0.Args[1] 2688 v_1 := v.Args[1] 2689 if v_1.Op != OpMul64 { 2690 break 2691 } 2692 _ = v_1.Args[1] 2693 if x != v_1.Args[0] { 2694 break 2695 } 2696 y := v_1.Args[1] 2697 v.reset(OpMul64) 2698 v.AddArg(x) 2699 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2700 v0.AddArg(y) 2701 v0.AddArg(z) 2702 v.AddArg(v0) 2703 return true 2704 } 2705 // match: (Add64 <t> (Mul64 x z) (Mul64 y x)) 2706 // cond: 2707 // result: (Mul64 x (Add64 <t> y z)) 2708 for { 2709 t := v.Type 2710 _ = v.Args[1] 2711 v_0 := v.Args[0] 2712 if v_0.Op != OpMul64 { 2713 break 2714 } 2715 _ = v_0.Args[1] 2716 x := v_0.Args[0] 2717 z := v_0.Args[1] 2718 v_1 := v.Args[1] 2719 if v_1.Op != OpMul64 { 2720 break 2721 } 2722 _ = v_1.Args[1] 2723 y := v_1.Args[0] 2724 if x != v_1.Args[1] { 2725 break 2726 } 2727 v.reset(OpMul64) 2728 v.AddArg(x) 2729 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2730 v0.AddArg(y) 2731 v0.AddArg(z) 2732 v.AddArg(v0) 2733 return true 2734 } 2735 // match: (Add64 <t> (Mul64 z x) (Mul64 y x)) 2736 // cond: 2737 // result: (Mul64 x (Add64 <t> y z)) 2738 for { 2739 t := v.Type 2740 _ = v.Args[1] 2741 v_0 := v.Args[0] 2742 if v_0.Op != OpMul64 { 2743 break 2744 } 2745 _ = v_0.Args[1] 2746 z := v_0.Args[0] 2747 x := v_0.Args[1] 2748 v_1 := v.Args[1] 2749 if v_1.Op != OpMul64 { 2750 break 2751 } 2752 _ = v_1.Args[1] 2753 y := v_1.Args[0] 2754 if x != v_1.Args[1] { 2755 break 2756 } 2757 v.reset(OpMul64) 2758 v.AddArg(x) 2759 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2760 v0.AddArg(y) 2761 v0.AddArg(z) 2762 v.AddArg(v0) 2763 return true 2764 } 2765 return false 2766 } 2767 func rewriteValuegeneric_OpAdd64_10(v *Value) bool { 2768 b := v.Block 2769 _ = b 2770 // match: (Add64 (Const64 [0]) x) 2771 // cond: 2772 // result: x 2773 for { 2774 _ = v.Args[1] 2775 v_0 := v.Args[0] 2776 if v_0.Op != OpConst64 { 2777 break 2778 } 2779 if v_0.AuxInt != 0 { 2780 break 2781 } 2782 x := v.Args[1] 2783 v.reset(OpCopy) 2784 v.Type = x.Type 2785 v.AddArg(x) 2786 return true 2787 } 2788 // match: (Add64 x (Const64 [0])) 2789 // cond: 2790 // result: x 2791 for { 2792 _ = v.Args[1] 2793 x := v.Args[0] 2794 v_1 := v.Args[1] 2795 if v_1.Op != OpConst64 { 2796 break 2797 } 2798 if v_1.AuxInt != 0 { 2799 break 2800 } 2801 v.reset(OpCopy) 2802 v.Type = x.Type 2803 v.AddArg(x) 2804 return true 2805 } 2806 // match: (Add64 (Const64 [1]) (Com64 x)) 2807 // cond: 2808 // result: (Neg64 x) 2809 for { 2810 _ = v.Args[1] 2811 v_0 := v.Args[0] 2812 if v_0.Op != OpConst64 { 2813 break 2814 } 2815 if v_0.AuxInt != 1 { 2816 break 2817 } 2818 v_1 := v.Args[1] 2819 if v_1.Op != OpCom64 { 2820 break 2821 } 2822 x := v_1.Args[0] 2823 v.reset(OpNeg64) 2824 v.AddArg(x) 2825 return true 2826 } 2827 // match: (Add64 (Com64 x) (Const64 [1])) 2828 // cond: 2829 // result: (Neg64 x) 2830 for { 2831 _ = v.Args[1] 2832 v_0 := v.Args[0] 2833 if v_0.Op != OpCom64 { 2834 break 2835 } 2836 x := v_0.Args[0] 2837 v_1 := v.Args[1] 2838 if v_1.Op != OpConst64 { 2839 break 2840 } 2841 if v_1.AuxInt != 1 { 2842 break 2843 } 2844 v.reset(OpNeg64) 2845 v.AddArg(x) 2846 return true 2847 } 2848 // match: (Add64 (Add64 i:(Const64 <t>) z) x) 2849 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 2850 // result: (Add64 i (Add64 <t> z x)) 2851 for { 2852 _ = v.Args[1] 2853 v_0 := v.Args[0] 2854 if v_0.Op != OpAdd64 { 2855 break 2856 } 2857 _ = v_0.Args[1] 2858 i := v_0.Args[0] 2859 if i.Op != OpConst64 { 2860 break 2861 } 2862 t := i.Type 2863 z := v_0.Args[1] 2864 x := v.Args[1] 2865 if !(z.Op != OpConst64 && x.Op != OpConst64) { 2866 break 2867 } 2868 v.reset(OpAdd64) 2869 v.AddArg(i) 2870 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2871 v0.AddArg(z) 2872 v0.AddArg(x) 2873 v.AddArg(v0) 2874 return true 2875 } 2876 // match: (Add64 (Add64 z i:(Const64 <t>)) x) 2877 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 2878 // result: (Add64 i (Add64 <t> z x)) 2879 for { 2880 _ = v.Args[1] 2881 v_0 := v.Args[0] 2882 if v_0.Op != OpAdd64 { 2883 break 2884 } 2885 _ = v_0.Args[1] 2886 z := v_0.Args[0] 2887 i := v_0.Args[1] 2888 if i.Op != OpConst64 { 2889 break 2890 } 2891 t := i.Type 2892 x := v.Args[1] 2893 if !(z.Op != OpConst64 && x.Op != OpConst64) { 2894 break 2895 } 2896 v.reset(OpAdd64) 2897 v.AddArg(i) 2898 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2899 v0.AddArg(z) 2900 v0.AddArg(x) 2901 v.AddArg(v0) 2902 return true 2903 } 2904 // match: (Add64 x (Add64 i:(Const64 <t>) z)) 2905 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 2906 // result: (Add64 i (Add64 <t> z x)) 2907 for { 2908 _ = v.Args[1] 2909 x := v.Args[0] 2910 v_1 := v.Args[1] 2911 if v_1.Op != OpAdd64 { 2912 break 2913 } 2914 _ = v_1.Args[1] 2915 i := v_1.Args[0] 2916 if i.Op != OpConst64 { 2917 break 2918 } 2919 t := i.Type 2920 z := v_1.Args[1] 2921 if !(z.Op != OpConst64 && x.Op != OpConst64) { 2922 break 2923 } 2924 v.reset(OpAdd64) 2925 v.AddArg(i) 2926 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2927 v0.AddArg(z) 2928 v0.AddArg(x) 2929 v.AddArg(v0) 2930 return true 2931 } 2932 // match: (Add64 x (Add64 z i:(Const64 <t>))) 2933 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 2934 // result: (Add64 i (Add64 <t> z x)) 2935 for { 2936 _ = v.Args[1] 2937 x := v.Args[0] 2938 v_1 := v.Args[1] 2939 if v_1.Op != OpAdd64 { 2940 break 2941 } 2942 _ = v_1.Args[1] 2943 z := v_1.Args[0] 2944 i := v_1.Args[1] 2945 if i.Op != OpConst64 { 2946 break 2947 } 2948 t := i.Type 2949 if !(z.Op != OpConst64 && x.Op != OpConst64) { 2950 break 2951 } 2952 v.reset(OpAdd64) 2953 v.AddArg(i) 2954 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2955 v0.AddArg(z) 2956 v0.AddArg(x) 2957 v.AddArg(v0) 2958 return true 2959 } 2960 // match: (Add64 (Sub64 i:(Const64 <t>) z) x) 2961 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 2962 // result: (Add64 i (Sub64 <t> x z)) 2963 for { 2964 _ = v.Args[1] 2965 v_0 := v.Args[0] 2966 if v_0.Op != OpSub64 { 2967 break 2968 } 2969 _ = v_0.Args[1] 2970 i := v_0.Args[0] 2971 if i.Op != OpConst64 { 2972 break 2973 } 2974 t := i.Type 2975 z := v_0.Args[1] 2976 x := v.Args[1] 2977 if !(z.Op != OpConst64 && x.Op != OpConst64) { 2978 break 2979 } 2980 v.reset(OpAdd64) 2981 v.AddArg(i) 2982 v0 := b.NewValue0(v.Pos, OpSub64, t) 2983 v0.AddArg(x) 2984 v0.AddArg(z) 2985 v.AddArg(v0) 2986 return true 2987 } 2988 // match: (Add64 x (Sub64 i:(Const64 <t>) z)) 2989 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 2990 // result: (Add64 i (Sub64 <t> x z)) 2991 for { 2992 _ = v.Args[1] 2993 x := v.Args[0] 2994 v_1 := v.Args[1] 2995 if v_1.Op != OpSub64 { 2996 break 2997 } 2998 _ = v_1.Args[1] 2999 i := v_1.Args[0] 3000 if i.Op != OpConst64 { 3001 break 3002 } 3003 t := i.Type 3004 z := v_1.Args[1] 3005 if !(z.Op != OpConst64 && x.Op != OpConst64) { 3006 break 3007 } 3008 v.reset(OpAdd64) 3009 v.AddArg(i) 3010 v0 := b.NewValue0(v.Pos, OpSub64, t) 3011 v0.AddArg(x) 3012 v0.AddArg(z) 3013 v.AddArg(v0) 3014 return true 3015 } 3016 return false 3017 } 3018 func rewriteValuegeneric_OpAdd64_20(v *Value) bool { 3019 b := v.Block 3020 _ = b 3021 // match: (Add64 x (Sub64 i:(Const64 <t>) z)) 3022 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 3023 // result: (Add64 i (Sub64 <t> x z)) 3024 for { 3025 _ = v.Args[1] 3026 x := v.Args[0] 3027 v_1 := v.Args[1] 3028 if v_1.Op != OpSub64 { 3029 break 3030 } 3031 _ = v_1.Args[1] 3032 i := v_1.Args[0] 3033 if i.Op != OpConst64 { 3034 break 3035 } 3036 t := i.Type 3037 z := v_1.Args[1] 3038 if !(z.Op != OpConst64 && x.Op != OpConst64) { 3039 break 3040 } 3041 v.reset(OpAdd64) 3042 v.AddArg(i) 3043 v0 := b.NewValue0(v.Pos, OpSub64, t) 3044 v0.AddArg(x) 3045 v0.AddArg(z) 3046 v.AddArg(v0) 3047 return true 3048 } 3049 // match: (Add64 (Sub64 i:(Const64 <t>) z) x) 3050 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 3051 // result: (Add64 i (Sub64 <t> x z)) 3052 for { 3053 _ = v.Args[1] 3054 v_0 := v.Args[0] 3055 if v_0.Op != OpSub64 { 3056 break 3057 } 3058 _ = v_0.Args[1] 3059 i := v_0.Args[0] 3060 if i.Op != OpConst64 { 3061 break 3062 } 3063 t := i.Type 3064 z := v_0.Args[1] 3065 x := v.Args[1] 3066 if !(z.Op != OpConst64 && x.Op != OpConst64) { 3067 break 3068 } 3069 v.reset(OpAdd64) 3070 v.AddArg(i) 3071 v0 := b.NewValue0(v.Pos, OpSub64, t) 3072 v0.AddArg(x) 3073 v0.AddArg(z) 3074 v.AddArg(v0) 3075 return true 3076 } 3077 // match: (Add64 (Sub64 z i:(Const64 <t>)) x) 3078 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 3079 // result: (Sub64 (Add64 <t> x z) i) 3080 for { 3081 _ = v.Args[1] 3082 v_0 := v.Args[0] 3083 if v_0.Op != OpSub64 { 3084 break 3085 } 3086 _ = v_0.Args[1] 3087 z := v_0.Args[0] 3088 i := v_0.Args[1] 3089 if i.Op != OpConst64 { 3090 break 3091 } 3092 t := i.Type 3093 x := v.Args[1] 3094 if !(z.Op != OpConst64 && x.Op != OpConst64) { 3095 break 3096 } 3097 v.reset(OpSub64) 3098 v0 := b.NewValue0(v.Pos, OpAdd64, t) 3099 v0.AddArg(x) 3100 v0.AddArg(z) 3101 v.AddArg(v0) 3102 v.AddArg(i) 3103 return true 3104 } 3105 // match: (Add64 x (Sub64 z i:(Const64 <t>))) 3106 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 3107 // result: (Sub64 (Add64 <t> x z) i) 3108 for { 3109 _ = v.Args[1] 3110 x := v.Args[0] 3111 v_1 := v.Args[1] 3112 if v_1.Op != OpSub64 { 3113 break 3114 } 3115 _ = v_1.Args[1] 3116 z := v_1.Args[0] 3117 i := v_1.Args[1] 3118 if i.Op != OpConst64 { 3119 break 3120 } 3121 t := i.Type 3122 if !(z.Op != OpConst64 && x.Op != OpConst64) { 3123 break 3124 } 3125 v.reset(OpSub64) 3126 v0 := b.NewValue0(v.Pos, OpAdd64, t) 3127 v0.AddArg(x) 3128 v0.AddArg(z) 3129 v.AddArg(v0) 3130 v.AddArg(i) 3131 return true 3132 } 3133 // match: (Add64 x (Sub64 z i:(Const64 <t>))) 3134 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 3135 // result: (Sub64 (Add64 <t> x z) i) 3136 for { 3137 _ = v.Args[1] 3138 x := v.Args[0] 3139 v_1 := v.Args[1] 3140 if v_1.Op != OpSub64 { 3141 break 3142 } 3143 _ = v_1.Args[1] 3144 z := v_1.Args[0] 3145 i := v_1.Args[1] 3146 if i.Op != OpConst64 { 3147 break 3148 } 3149 t := i.Type 3150 if !(z.Op != OpConst64 && x.Op != OpConst64) { 3151 break 3152 } 3153 v.reset(OpSub64) 3154 v0 := b.NewValue0(v.Pos, OpAdd64, t) 3155 v0.AddArg(x) 3156 v0.AddArg(z) 3157 v.AddArg(v0) 3158 v.AddArg(i) 3159 return true 3160 } 3161 // match: (Add64 (Sub64 z i:(Const64 <t>)) x) 3162 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 3163 // result: (Sub64 (Add64 <t> x z) i) 3164 for { 3165 _ = v.Args[1] 3166 v_0 := v.Args[0] 3167 if v_0.Op != OpSub64 { 3168 break 3169 } 3170 _ = v_0.Args[1] 3171 z := v_0.Args[0] 3172 i := v_0.Args[1] 3173 if i.Op != OpConst64 { 3174 break 3175 } 3176 t := i.Type 3177 x := v.Args[1] 3178 if !(z.Op != OpConst64 && x.Op != OpConst64) { 3179 break 3180 } 3181 v.reset(OpSub64) 3182 v0 := b.NewValue0(v.Pos, OpAdd64, t) 3183 v0.AddArg(x) 3184 v0.AddArg(z) 3185 v.AddArg(v0) 3186 v.AddArg(i) 3187 return true 3188 } 3189 // match: (Add64 (Const64 <t> [c]) (Add64 (Const64 <t> [d]) x)) 3190 // cond: 3191 // result: (Add64 (Const64 <t> [c+d]) x) 3192 for { 3193 _ = v.Args[1] 3194 v_0 := v.Args[0] 3195 if v_0.Op != OpConst64 { 3196 break 3197 } 3198 t := v_0.Type 3199 c := v_0.AuxInt 3200 v_1 := v.Args[1] 3201 if v_1.Op != OpAdd64 { 3202 break 3203 } 3204 _ = v_1.Args[1] 3205 v_1_0 := v_1.Args[0] 3206 if v_1_0.Op != OpConst64 { 3207 break 3208 } 3209 if v_1_0.Type != t { 3210 break 3211 } 3212 d := v_1_0.AuxInt 3213 x := v_1.Args[1] 3214 v.reset(OpAdd64) 3215 v0 := b.NewValue0(v.Pos, OpConst64, t) 3216 v0.AuxInt = c + d 3217 v.AddArg(v0) 3218 v.AddArg(x) 3219 return true 3220 } 3221 // match: (Add64 (Const64 <t> [c]) (Add64 x (Const64 <t> [d]))) 3222 // cond: 3223 // result: (Add64 (Const64 <t> [c+d]) x) 3224 for { 3225 _ = v.Args[1] 3226 v_0 := v.Args[0] 3227 if v_0.Op != OpConst64 { 3228 break 3229 } 3230 t := v_0.Type 3231 c := v_0.AuxInt 3232 v_1 := v.Args[1] 3233 if v_1.Op != OpAdd64 { 3234 break 3235 } 3236 _ = v_1.Args[1] 3237 x := v_1.Args[0] 3238 v_1_1 := v_1.Args[1] 3239 if v_1_1.Op != OpConst64 { 3240 break 3241 } 3242 if v_1_1.Type != t { 3243 break 3244 } 3245 d := v_1_1.AuxInt 3246 v.reset(OpAdd64) 3247 v0 := b.NewValue0(v.Pos, OpConst64, t) 3248 v0.AuxInt = c + d 3249 v.AddArg(v0) 3250 v.AddArg(x) 3251 return true 3252 } 3253 // match: (Add64 (Add64 (Const64 <t> [d]) x) (Const64 <t> [c])) 3254 // cond: 3255 // result: (Add64 (Const64 <t> [c+d]) x) 3256 for { 3257 _ = v.Args[1] 3258 v_0 := v.Args[0] 3259 if v_0.Op != OpAdd64 { 3260 break 3261 } 3262 _ = v_0.Args[1] 3263 v_0_0 := v_0.Args[0] 3264 if v_0_0.Op != OpConst64 { 3265 break 3266 } 3267 t := v_0_0.Type 3268 d := v_0_0.AuxInt 3269 x := v_0.Args[1] 3270 v_1 := v.Args[1] 3271 if v_1.Op != OpConst64 { 3272 break 3273 } 3274 if v_1.Type != t { 3275 break 3276 } 3277 c := v_1.AuxInt 3278 v.reset(OpAdd64) 3279 v0 := b.NewValue0(v.Pos, OpConst64, t) 3280 v0.AuxInt = c + d 3281 v.AddArg(v0) 3282 v.AddArg(x) 3283 return true 3284 } 3285 // match: (Add64 (Add64 x (Const64 <t> [d])) (Const64 <t> [c])) 3286 // cond: 3287 // result: (Add64 (Const64 <t> [c+d]) x) 3288 for { 3289 _ = v.Args[1] 3290 v_0 := v.Args[0] 3291 if v_0.Op != OpAdd64 { 3292 break 3293 } 3294 _ = v_0.Args[1] 3295 x := v_0.Args[0] 3296 v_0_1 := v_0.Args[1] 3297 if v_0_1.Op != OpConst64 { 3298 break 3299 } 3300 t := v_0_1.Type 3301 d := v_0_1.AuxInt 3302 v_1 := v.Args[1] 3303 if v_1.Op != OpConst64 { 3304 break 3305 } 3306 if v_1.Type != t { 3307 break 3308 } 3309 c := v_1.AuxInt 3310 v.reset(OpAdd64) 3311 v0 := b.NewValue0(v.Pos, OpConst64, t) 3312 v0.AuxInt = c + d 3313 v.AddArg(v0) 3314 v.AddArg(x) 3315 return true 3316 } 3317 return false 3318 } 3319 func rewriteValuegeneric_OpAdd64_30(v *Value) bool { 3320 b := v.Block 3321 _ = b 3322 // match: (Add64 (Const64 <t> [c]) (Sub64 (Const64 <t> [d]) x)) 3323 // cond: 3324 // result: (Sub64 (Const64 <t> [c+d]) x) 3325 for { 3326 _ = v.Args[1] 3327 v_0 := v.Args[0] 3328 if v_0.Op != OpConst64 { 3329 break 3330 } 3331 t := v_0.Type 3332 c := v_0.AuxInt 3333 v_1 := v.Args[1] 3334 if v_1.Op != OpSub64 { 3335 break 3336 } 3337 _ = v_1.Args[1] 3338 v_1_0 := v_1.Args[0] 3339 if v_1_0.Op != OpConst64 { 3340 break 3341 } 3342 if v_1_0.Type != t { 3343 break 3344 } 3345 d := v_1_0.AuxInt 3346 x := v_1.Args[1] 3347 v.reset(OpSub64) 3348 v0 := b.NewValue0(v.Pos, OpConst64, t) 3349 v0.AuxInt = c + d 3350 v.AddArg(v0) 3351 v.AddArg(x) 3352 return true 3353 } 3354 // match: (Add64 (Sub64 (Const64 <t> [d]) x) (Const64 <t> [c])) 3355 // cond: 3356 // result: (Sub64 (Const64 <t> [c+d]) x) 3357 for { 3358 _ = v.Args[1] 3359 v_0 := v.Args[0] 3360 if v_0.Op != OpSub64 { 3361 break 3362 } 3363 _ = v_0.Args[1] 3364 v_0_0 := v_0.Args[0] 3365 if v_0_0.Op != OpConst64 { 3366 break 3367 } 3368 t := v_0_0.Type 3369 d := v_0_0.AuxInt 3370 x := v_0.Args[1] 3371 v_1 := v.Args[1] 3372 if v_1.Op != OpConst64 { 3373 break 3374 } 3375 if v_1.Type != t { 3376 break 3377 } 3378 c := v_1.AuxInt 3379 v.reset(OpSub64) 3380 v0 := b.NewValue0(v.Pos, OpConst64, t) 3381 v0.AuxInt = c + d 3382 v.AddArg(v0) 3383 v.AddArg(x) 3384 return true 3385 } 3386 // match: (Add64 (Const64 <t> [c]) (Sub64 x (Const64 <t> [d]))) 3387 // cond: 3388 // result: (Add64 (Const64 <t> [c-d]) x) 3389 for { 3390 _ = v.Args[1] 3391 v_0 := v.Args[0] 3392 if v_0.Op != OpConst64 { 3393 break 3394 } 3395 t := v_0.Type 3396 c := v_0.AuxInt 3397 v_1 := v.Args[1] 3398 if v_1.Op != OpSub64 { 3399 break 3400 } 3401 _ = v_1.Args[1] 3402 x := v_1.Args[0] 3403 v_1_1 := v_1.Args[1] 3404 if v_1_1.Op != OpConst64 { 3405 break 3406 } 3407 if v_1_1.Type != t { 3408 break 3409 } 3410 d := v_1_1.AuxInt 3411 v.reset(OpAdd64) 3412 v0 := b.NewValue0(v.Pos, OpConst64, t) 3413 v0.AuxInt = c - d 3414 v.AddArg(v0) 3415 v.AddArg(x) 3416 return true 3417 } 3418 // match: (Add64 (Sub64 x (Const64 <t> [d])) (Const64 <t> [c])) 3419 // cond: 3420 // result: (Add64 (Const64 <t> [c-d]) x) 3421 for { 3422 _ = v.Args[1] 3423 v_0 := v.Args[0] 3424 if v_0.Op != OpSub64 { 3425 break 3426 } 3427 _ = v_0.Args[1] 3428 x := v_0.Args[0] 3429 v_0_1 := v_0.Args[1] 3430 if v_0_1.Op != OpConst64 { 3431 break 3432 } 3433 t := v_0_1.Type 3434 d := v_0_1.AuxInt 3435 v_1 := v.Args[1] 3436 if v_1.Op != OpConst64 { 3437 break 3438 } 3439 if v_1.Type != t { 3440 break 3441 } 3442 c := v_1.AuxInt 3443 v.reset(OpAdd64) 3444 v0 := b.NewValue0(v.Pos, OpConst64, t) 3445 v0.AuxInt = c - d 3446 v.AddArg(v0) 3447 v.AddArg(x) 3448 return true 3449 } 3450 return false 3451 } 3452 func rewriteValuegeneric_OpAdd64F_0(v *Value) bool { 3453 // match: (Add64F (Const64F [c]) (Const64F [d])) 3454 // cond: 3455 // result: (Const64F [f2i(i2f(c) + i2f(d))]) 3456 for { 3457 _ = v.Args[1] 3458 v_0 := v.Args[0] 3459 if v_0.Op != OpConst64F { 3460 break 3461 } 3462 c := v_0.AuxInt 3463 v_1 := v.Args[1] 3464 if v_1.Op != OpConst64F { 3465 break 3466 } 3467 d := v_1.AuxInt 3468 v.reset(OpConst64F) 3469 v.AuxInt = f2i(i2f(c) + i2f(d)) 3470 return true 3471 } 3472 // match: (Add64F (Const64F [d]) (Const64F [c])) 3473 // cond: 3474 // result: (Const64F [f2i(i2f(c) + i2f(d))]) 3475 for { 3476 _ = v.Args[1] 3477 v_0 := v.Args[0] 3478 if v_0.Op != OpConst64F { 3479 break 3480 } 3481 d := v_0.AuxInt 3482 v_1 := v.Args[1] 3483 if v_1.Op != OpConst64F { 3484 break 3485 } 3486 c := v_1.AuxInt 3487 v.reset(OpConst64F) 3488 v.AuxInt = f2i(i2f(c) + i2f(d)) 3489 return true 3490 } 3491 // match: (Add64F x (Const64F [0])) 3492 // cond: 3493 // result: x 3494 for { 3495 _ = v.Args[1] 3496 x := v.Args[0] 3497 v_1 := v.Args[1] 3498 if v_1.Op != OpConst64F { 3499 break 3500 } 3501 if v_1.AuxInt != 0 { 3502 break 3503 } 3504 v.reset(OpCopy) 3505 v.Type = x.Type 3506 v.AddArg(x) 3507 return true 3508 } 3509 // match: (Add64F (Const64F [0]) x) 3510 // cond: 3511 // result: x 3512 for { 3513 _ = v.Args[1] 3514 v_0 := v.Args[0] 3515 if v_0.Op != OpConst64F { 3516 break 3517 } 3518 if v_0.AuxInt != 0 { 3519 break 3520 } 3521 x := v.Args[1] 3522 v.reset(OpCopy) 3523 v.Type = x.Type 3524 v.AddArg(x) 3525 return true 3526 } 3527 return false 3528 } 3529 func rewriteValuegeneric_OpAdd8_0(v *Value) bool { 3530 b := v.Block 3531 _ = b 3532 // match: (Add8 (Const8 [c]) (Const8 [d])) 3533 // cond: 3534 // result: (Const8 [int64(int8(c+d))]) 3535 for { 3536 _ = v.Args[1] 3537 v_0 := v.Args[0] 3538 if v_0.Op != OpConst8 { 3539 break 3540 } 3541 c := v_0.AuxInt 3542 v_1 := v.Args[1] 3543 if v_1.Op != OpConst8 { 3544 break 3545 } 3546 d := v_1.AuxInt 3547 v.reset(OpConst8) 3548 v.AuxInt = int64(int8(c + d)) 3549 return true 3550 } 3551 // match: (Add8 (Const8 [d]) (Const8 [c])) 3552 // cond: 3553 // result: (Const8 [int64(int8(c+d))]) 3554 for { 3555 _ = v.Args[1] 3556 v_0 := v.Args[0] 3557 if v_0.Op != OpConst8 { 3558 break 3559 } 3560 d := v_0.AuxInt 3561 v_1 := v.Args[1] 3562 if v_1.Op != OpConst8 { 3563 break 3564 } 3565 c := v_1.AuxInt 3566 v.reset(OpConst8) 3567 v.AuxInt = int64(int8(c + d)) 3568 return true 3569 } 3570 // match: (Add8 <t> (Mul8 x y) (Mul8 x z)) 3571 // cond: 3572 // result: (Mul8 x (Add8 <t> y z)) 3573 for { 3574 t := v.Type 3575 _ = v.Args[1] 3576 v_0 := v.Args[0] 3577 if v_0.Op != OpMul8 { 3578 break 3579 } 3580 _ = v_0.Args[1] 3581 x := v_0.Args[0] 3582 y := v_0.Args[1] 3583 v_1 := v.Args[1] 3584 if v_1.Op != OpMul8 { 3585 break 3586 } 3587 _ = v_1.Args[1] 3588 if x != v_1.Args[0] { 3589 break 3590 } 3591 z := v_1.Args[1] 3592 v.reset(OpMul8) 3593 v.AddArg(x) 3594 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3595 v0.AddArg(y) 3596 v0.AddArg(z) 3597 v.AddArg(v0) 3598 return true 3599 } 3600 // match: (Add8 <t> (Mul8 y x) (Mul8 x z)) 3601 // cond: 3602 // result: (Mul8 x (Add8 <t> y z)) 3603 for { 3604 t := v.Type 3605 _ = v.Args[1] 3606 v_0 := v.Args[0] 3607 if v_0.Op != OpMul8 { 3608 break 3609 } 3610 _ = v_0.Args[1] 3611 y := v_0.Args[0] 3612 x := v_0.Args[1] 3613 v_1 := v.Args[1] 3614 if v_1.Op != OpMul8 { 3615 break 3616 } 3617 _ = v_1.Args[1] 3618 if x != v_1.Args[0] { 3619 break 3620 } 3621 z := v_1.Args[1] 3622 v.reset(OpMul8) 3623 v.AddArg(x) 3624 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3625 v0.AddArg(y) 3626 v0.AddArg(z) 3627 v.AddArg(v0) 3628 return true 3629 } 3630 // match: (Add8 <t> (Mul8 x y) (Mul8 z x)) 3631 // cond: 3632 // result: (Mul8 x (Add8 <t> y z)) 3633 for { 3634 t := v.Type 3635 _ = v.Args[1] 3636 v_0 := v.Args[0] 3637 if v_0.Op != OpMul8 { 3638 break 3639 } 3640 _ = v_0.Args[1] 3641 x := v_0.Args[0] 3642 y := v_0.Args[1] 3643 v_1 := v.Args[1] 3644 if v_1.Op != OpMul8 { 3645 break 3646 } 3647 _ = v_1.Args[1] 3648 z := v_1.Args[0] 3649 if x != v_1.Args[1] { 3650 break 3651 } 3652 v.reset(OpMul8) 3653 v.AddArg(x) 3654 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3655 v0.AddArg(y) 3656 v0.AddArg(z) 3657 v.AddArg(v0) 3658 return true 3659 } 3660 // match: (Add8 <t> (Mul8 y x) (Mul8 z x)) 3661 // cond: 3662 // result: (Mul8 x (Add8 <t> y z)) 3663 for { 3664 t := v.Type 3665 _ = v.Args[1] 3666 v_0 := v.Args[0] 3667 if v_0.Op != OpMul8 { 3668 break 3669 } 3670 _ = v_0.Args[1] 3671 y := v_0.Args[0] 3672 x := v_0.Args[1] 3673 v_1 := v.Args[1] 3674 if v_1.Op != OpMul8 { 3675 break 3676 } 3677 _ = v_1.Args[1] 3678 z := v_1.Args[0] 3679 if x != v_1.Args[1] { 3680 break 3681 } 3682 v.reset(OpMul8) 3683 v.AddArg(x) 3684 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3685 v0.AddArg(y) 3686 v0.AddArg(z) 3687 v.AddArg(v0) 3688 return true 3689 } 3690 // match: (Add8 <t> (Mul8 x z) (Mul8 x y)) 3691 // cond: 3692 // result: (Mul8 x (Add8 <t> y z)) 3693 for { 3694 t := v.Type 3695 _ = v.Args[1] 3696 v_0 := v.Args[0] 3697 if v_0.Op != OpMul8 { 3698 break 3699 } 3700 _ = v_0.Args[1] 3701 x := v_0.Args[0] 3702 z := v_0.Args[1] 3703 v_1 := v.Args[1] 3704 if v_1.Op != OpMul8 { 3705 break 3706 } 3707 _ = v_1.Args[1] 3708 if x != v_1.Args[0] { 3709 break 3710 } 3711 y := v_1.Args[1] 3712 v.reset(OpMul8) 3713 v.AddArg(x) 3714 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3715 v0.AddArg(y) 3716 v0.AddArg(z) 3717 v.AddArg(v0) 3718 return true 3719 } 3720 // match: (Add8 <t> (Mul8 z x) (Mul8 x y)) 3721 // cond: 3722 // result: (Mul8 x (Add8 <t> y z)) 3723 for { 3724 t := v.Type 3725 _ = v.Args[1] 3726 v_0 := v.Args[0] 3727 if v_0.Op != OpMul8 { 3728 break 3729 } 3730 _ = v_0.Args[1] 3731 z := v_0.Args[0] 3732 x := v_0.Args[1] 3733 v_1 := v.Args[1] 3734 if v_1.Op != OpMul8 { 3735 break 3736 } 3737 _ = v_1.Args[1] 3738 if x != v_1.Args[0] { 3739 break 3740 } 3741 y := v_1.Args[1] 3742 v.reset(OpMul8) 3743 v.AddArg(x) 3744 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3745 v0.AddArg(y) 3746 v0.AddArg(z) 3747 v.AddArg(v0) 3748 return true 3749 } 3750 // match: (Add8 <t> (Mul8 x z) (Mul8 y x)) 3751 // cond: 3752 // result: (Mul8 x (Add8 <t> y z)) 3753 for { 3754 t := v.Type 3755 _ = v.Args[1] 3756 v_0 := v.Args[0] 3757 if v_0.Op != OpMul8 { 3758 break 3759 } 3760 _ = v_0.Args[1] 3761 x := v_0.Args[0] 3762 z := v_0.Args[1] 3763 v_1 := v.Args[1] 3764 if v_1.Op != OpMul8 { 3765 break 3766 } 3767 _ = v_1.Args[1] 3768 y := v_1.Args[0] 3769 if x != v_1.Args[1] { 3770 break 3771 } 3772 v.reset(OpMul8) 3773 v.AddArg(x) 3774 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3775 v0.AddArg(y) 3776 v0.AddArg(z) 3777 v.AddArg(v0) 3778 return true 3779 } 3780 // match: (Add8 <t> (Mul8 z x) (Mul8 y x)) 3781 // cond: 3782 // result: (Mul8 x (Add8 <t> y z)) 3783 for { 3784 t := v.Type 3785 _ = v.Args[1] 3786 v_0 := v.Args[0] 3787 if v_0.Op != OpMul8 { 3788 break 3789 } 3790 _ = v_0.Args[1] 3791 z := v_0.Args[0] 3792 x := v_0.Args[1] 3793 v_1 := v.Args[1] 3794 if v_1.Op != OpMul8 { 3795 break 3796 } 3797 _ = v_1.Args[1] 3798 y := v_1.Args[0] 3799 if x != v_1.Args[1] { 3800 break 3801 } 3802 v.reset(OpMul8) 3803 v.AddArg(x) 3804 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3805 v0.AddArg(y) 3806 v0.AddArg(z) 3807 v.AddArg(v0) 3808 return true 3809 } 3810 return false 3811 } 3812 func rewriteValuegeneric_OpAdd8_10(v *Value) bool { 3813 b := v.Block 3814 _ = b 3815 // match: (Add8 (Const8 [0]) x) 3816 // cond: 3817 // result: x 3818 for { 3819 _ = v.Args[1] 3820 v_0 := v.Args[0] 3821 if v_0.Op != OpConst8 { 3822 break 3823 } 3824 if v_0.AuxInt != 0 { 3825 break 3826 } 3827 x := v.Args[1] 3828 v.reset(OpCopy) 3829 v.Type = x.Type 3830 v.AddArg(x) 3831 return true 3832 } 3833 // match: (Add8 x (Const8 [0])) 3834 // cond: 3835 // result: x 3836 for { 3837 _ = v.Args[1] 3838 x := v.Args[0] 3839 v_1 := v.Args[1] 3840 if v_1.Op != OpConst8 { 3841 break 3842 } 3843 if v_1.AuxInt != 0 { 3844 break 3845 } 3846 v.reset(OpCopy) 3847 v.Type = x.Type 3848 v.AddArg(x) 3849 return true 3850 } 3851 // match: (Add8 (Const8 [1]) (Com8 x)) 3852 // cond: 3853 // result: (Neg8 x) 3854 for { 3855 _ = v.Args[1] 3856 v_0 := v.Args[0] 3857 if v_0.Op != OpConst8 { 3858 break 3859 } 3860 if v_0.AuxInt != 1 { 3861 break 3862 } 3863 v_1 := v.Args[1] 3864 if v_1.Op != OpCom8 { 3865 break 3866 } 3867 x := v_1.Args[0] 3868 v.reset(OpNeg8) 3869 v.AddArg(x) 3870 return true 3871 } 3872 // match: (Add8 (Com8 x) (Const8 [1])) 3873 // cond: 3874 // result: (Neg8 x) 3875 for { 3876 _ = v.Args[1] 3877 v_0 := v.Args[0] 3878 if v_0.Op != OpCom8 { 3879 break 3880 } 3881 x := v_0.Args[0] 3882 v_1 := v.Args[1] 3883 if v_1.Op != OpConst8 { 3884 break 3885 } 3886 if v_1.AuxInt != 1 { 3887 break 3888 } 3889 v.reset(OpNeg8) 3890 v.AddArg(x) 3891 return true 3892 } 3893 // match: (Add8 (Add8 i:(Const8 <t>) z) x) 3894 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 3895 // result: (Add8 i (Add8 <t> z x)) 3896 for { 3897 _ = v.Args[1] 3898 v_0 := v.Args[0] 3899 if v_0.Op != OpAdd8 { 3900 break 3901 } 3902 _ = v_0.Args[1] 3903 i := v_0.Args[0] 3904 if i.Op != OpConst8 { 3905 break 3906 } 3907 t := i.Type 3908 z := v_0.Args[1] 3909 x := v.Args[1] 3910 if !(z.Op != OpConst8 && x.Op != OpConst8) { 3911 break 3912 } 3913 v.reset(OpAdd8) 3914 v.AddArg(i) 3915 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3916 v0.AddArg(z) 3917 v0.AddArg(x) 3918 v.AddArg(v0) 3919 return true 3920 } 3921 // match: (Add8 (Add8 z i:(Const8 <t>)) x) 3922 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 3923 // result: (Add8 i (Add8 <t> z x)) 3924 for { 3925 _ = v.Args[1] 3926 v_0 := v.Args[0] 3927 if v_0.Op != OpAdd8 { 3928 break 3929 } 3930 _ = v_0.Args[1] 3931 z := v_0.Args[0] 3932 i := v_0.Args[1] 3933 if i.Op != OpConst8 { 3934 break 3935 } 3936 t := i.Type 3937 x := v.Args[1] 3938 if !(z.Op != OpConst8 && x.Op != OpConst8) { 3939 break 3940 } 3941 v.reset(OpAdd8) 3942 v.AddArg(i) 3943 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3944 v0.AddArg(z) 3945 v0.AddArg(x) 3946 v.AddArg(v0) 3947 return true 3948 } 3949 // match: (Add8 x (Add8 i:(Const8 <t>) z)) 3950 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 3951 // result: (Add8 i (Add8 <t> z x)) 3952 for { 3953 _ = v.Args[1] 3954 x := v.Args[0] 3955 v_1 := v.Args[1] 3956 if v_1.Op != OpAdd8 { 3957 break 3958 } 3959 _ = v_1.Args[1] 3960 i := v_1.Args[0] 3961 if i.Op != OpConst8 { 3962 break 3963 } 3964 t := i.Type 3965 z := v_1.Args[1] 3966 if !(z.Op != OpConst8 && x.Op != OpConst8) { 3967 break 3968 } 3969 v.reset(OpAdd8) 3970 v.AddArg(i) 3971 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3972 v0.AddArg(z) 3973 v0.AddArg(x) 3974 v.AddArg(v0) 3975 return true 3976 } 3977 // match: (Add8 x (Add8 z i:(Const8 <t>))) 3978 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 3979 // result: (Add8 i (Add8 <t> z x)) 3980 for { 3981 _ = v.Args[1] 3982 x := v.Args[0] 3983 v_1 := v.Args[1] 3984 if v_1.Op != OpAdd8 { 3985 break 3986 } 3987 _ = v_1.Args[1] 3988 z := v_1.Args[0] 3989 i := v_1.Args[1] 3990 if i.Op != OpConst8 { 3991 break 3992 } 3993 t := i.Type 3994 if !(z.Op != OpConst8 && x.Op != OpConst8) { 3995 break 3996 } 3997 v.reset(OpAdd8) 3998 v.AddArg(i) 3999 v0 := b.NewValue0(v.Pos, OpAdd8, t) 4000 v0.AddArg(z) 4001 v0.AddArg(x) 4002 v.AddArg(v0) 4003 return true 4004 } 4005 // match: (Add8 (Sub8 i:(Const8 <t>) z) x) 4006 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 4007 // result: (Add8 i (Sub8 <t> x z)) 4008 for { 4009 _ = v.Args[1] 4010 v_0 := v.Args[0] 4011 if v_0.Op != OpSub8 { 4012 break 4013 } 4014 _ = v_0.Args[1] 4015 i := v_0.Args[0] 4016 if i.Op != OpConst8 { 4017 break 4018 } 4019 t := i.Type 4020 z := v_0.Args[1] 4021 x := v.Args[1] 4022 if !(z.Op != OpConst8 && x.Op != OpConst8) { 4023 break 4024 } 4025 v.reset(OpAdd8) 4026 v.AddArg(i) 4027 v0 := b.NewValue0(v.Pos, OpSub8, t) 4028 v0.AddArg(x) 4029 v0.AddArg(z) 4030 v.AddArg(v0) 4031 return true 4032 } 4033 // match: (Add8 x (Sub8 i:(Const8 <t>) z)) 4034 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 4035 // result: (Add8 i (Sub8 <t> x z)) 4036 for { 4037 _ = v.Args[1] 4038 x := v.Args[0] 4039 v_1 := v.Args[1] 4040 if v_1.Op != OpSub8 { 4041 break 4042 } 4043 _ = v_1.Args[1] 4044 i := v_1.Args[0] 4045 if i.Op != OpConst8 { 4046 break 4047 } 4048 t := i.Type 4049 z := v_1.Args[1] 4050 if !(z.Op != OpConst8 && x.Op != OpConst8) { 4051 break 4052 } 4053 v.reset(OpAdd8) 4054 v.AddArg(i) 4055 v0 := b.NewValue0(v.Pos, OpSub8, t) 4056 v0.AddArg(x) 4057 v0.AddArg(z) 4058 v.AddArg(v0) 4059 return true 4060 } 4061 return false 4062 } 4063 func rewriteValuegeneric_OpAdd8_20(v *Value) bool { 4064 b := v.Block 4065 _ = b 4066 // match: (Add8 x (Sub8 i:(Const8 <t>) z)) 4067 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 4068 // result: (Add8 i (Sub8 <t> x z)) 4069 for { 4070 _ = v.Args[1] 4071 x := v.Args[0] 4072 v_1 := v.Args[1] 4073 if v_1.Op != OpSub8 { 4074 break 4075 } 4076 _ = v_1.Args[1] 4077 i := v_1.Args[0] 4078 if i.Op != OpConst8 { 4079 break 4080 } 4081 t := i.Type 4082 z := v_1.Args[1] 4083 if !(z.Op != OpConst8 && x.Op != OpConst8) { 4084 break 4085 } 4086 v.reset(OpAdd8) 4087 v.AddArg(i) 4088 v0 := b.NewValue0(v.Pos, OpSub8, t) 4089 v0.AddArg(x) 4090 v0.AddArg(z) 4091 v.AddArg(v0) 4092 return true 4093 } 4094 // match: (Add8 (Sub8 i:(Const8 <t>) z) x) 4095 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 4096 // result: (Add8 i (Sub8 <t> x z)) 4097 for { 4098 _ = v.Args[1] 4099 v_0 := v.Args[0] 4100 if v_0.Op != OpSub8 { 4101 break 4102 } 4103 _ = v_0.Args[1] 4104 i := v_0.Args[0] 4105 if i.Op != OpConst8 { 4106 break 4107 } 4108 t := i.Type 4109 z := v_0.Args[1] 4110 x := v.Args[1] 4111 if !(z.Op != OpConst8 && x.Op != OpConst8) { 4112 break 4113 } 4114 v.reset(OpAdd8) 4115 v.AddArg(i) 4116 v0 := b.NewValue0(v.Pos, OpSub8, t) 4117 v0.AddArg(x) 4118 v0.AddArg(z) 4119 v.AddArg(v0) 4120 return true 4121 } 4122 // match: (Add8 (Sub8 z i:(Const8 <t>)) x) 4123 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 4124 // result: (Sub8 (Add8 <t> x z) i) 4125 for { 4126 _ = v.Args[1] 4127 v_0 := v.Args[0] 4128 if v_0.Op != OpSub8 { 4129 break 4130 } 4131 _ = v_0.Args[1] 4132 z := v_0.Args[0] 4133 i := v_0.Args[1] 4134 if i.Op != OpConst8 { 4135 break 4136 } 4137 t := i.Type 4138 x := v.Args[1] 4139 if !(z.Op != OpConst8 && x.Op != OpConst8) { 4140 break 4141 } 4142 v.reset(OpSub8) 4143 v0 := b.NewValue0(v.Pos, OpAdd8, t) 4144 v0.AddArg(x) 4145 v0.AddArg(z) 4146 v.AddArg(v0) 4147 v.AddArg(i) 4148 return true 4149 } 4150 // match: (Add8 x (Sub8 z i:(Const8 <t>))) 4151 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 4152 // result: (Sub8 (Add8 <t> x z) i) 4153 for { 4154 _ = v.Args[1] 4155 x := v.Args[0] 4156 v_1 := v.Args[1] 4157 if v_1.Op != OpSub8 { 4158 break 4159 } 4160 _ = v_1.Args[1] 4161 z := v_1.Args[0] 4162 i := v_1.Args[1] 4163 if i.Op != OpConst8 { 4164 break 4165 } 4166 t := i.Type 4167 if !(z.Op != OpConst8 && x.Op != OpConst8) { 4168 break 4169 } 4170 v.reset(OpSub8) 4171 v0 := b.NewValue0(v.Pos, OpAdd8, t) 4172 v0.AddArg(x) 4173 v0.AddArg(z) 4174 v.AddArg(v0) 4175 v.AddArg(i) 4176 return true 4177 } 4178 // match: (Add8 x (Sub8 z i:(Const8 <t>))) 4179 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 4180 // result: (Sub8 (Add8 <t> x z) i) 4181 for { 4182 _ = v.Args[1] 4183 x := v.Args[0] 4184 v_1 := v.Args[1] 4185 if v_1.Op != OpSub8 { 4186 break 4187 } 4188 _ = v_1.Args[1] 4189 z := v_1.Args[0] 4190 i := v_1.Args[1] 4191 if i.Op != OpConst8 { 4192 break 4193 } 4194 t := i.Type 4195 if !(z.Op != OpConst8 && x.Op != OpConst8) { 4196 break 4197 } 4198 v.reset(OpSub8) 4199 v0 := b.NewValue0(v.Pos, OpAdd8, t) 4200 v0.AddArg(x) 4201 v0.AddArg(z) 4202 v.AddArg(v0) 4203 v.AddArg(i) 4204 return true 4205 } 4206 // match: (Add8 (Sub8 z i:(Const8 <t>)) x) 4207 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 4208 // result: (Sub8 (Add8 <t> x z) i) 4209 for { 4210 _ = v.Args[1] 4211 v_0 := v.Args[0] 4212 if v_0.Op != OpSub8 { 4213 break 4214 } 4215 _ = v_0.Args[1] 4216 z := v_0.Args[0] 4217 i := v_0.Args[1] 4218 if i.Op != OpConst8 { 4219 break 4220 } 4221 t := i.Type 4222 x := v.Args[1] 4223 if !(z.Op != OpConst8 && x.Op != OpConst8) { 4224 break 4225 } 4226 v.reset(OpSub8) 4227 v0 := b.NewValue0(v.Pos, OpAdd8, t) 4228 v0.AddArg(x) 4229 v0.AddArg(z) 4230 v.AddArg(v0) 4231 v.AddArg(i) 4232 return true 4233 } 4234 // match: (Add8 (Const8 <t> [c]) (Add8 (Const8 <t> [d]) x)) 4235 // cond: 4236 // result: (Add8 (Const8 <t> [int64(int8(c+d))]) x) 4237 for { 4238 _ = v.Args[1] 4239 v_0 := v.Args[0] 4240 if v_0.Op != OpConst8 { 4241 break 4242 } 4243 t := v_0.Type 4244 c := v_0.AuxInt 4245 v_1 := v.Args[1] 4246 if v_1.Op != OpAdd8 { 4247 break 4248 } 4249 _ = v_1.Args[1] 4250 v_1_0 := v_1.Args[0] 4251 if v_1_0.Op != OpConst8 { 4252 break 4253 } 4254 if v_1_0.Type != t { 4255 break 4256 } 4257 d := v_1_0.AuxInt 4258 x := v_1.Args[1] 4259 v.reset(OpAdd8) 4260 v0 := b.NewValue0(v.Pos, OpConst8, t) 4261 v0.AuxInt = int64(int8(c + d)) 4262 v.AddArg(v0) 4263 v.AddArg(x) 4264 return true 4265 } 4266 // match: (Add8 (Const8 <t> [c]) (Add8 x (Const8 <t> [d]))) 4267 // cond: 4268 // result: (Add8 (Const8 <t> [int64(int8(c+d))]) x) 4269 for { 4270 _ = v.Args[1] 4271 v_0 := v.Args[0] 4272 if v_0.Op != OpConst8 { 4273 break 4274 } 4275 t := v_0.Type 4276 c := v_0.AuxInt 4277 v_1 := v.Args[1] 4278 if v_1.Op != OpAdd8 { 4279 break 4280 } 4281 _ = v_1.Args[1] 4282 x := v_1.Args[0] 4283 v_1_1 := v_1.Args[1] 4284 if v_1_1.Op != OpConst8 { 4285 break 4286 } 4287 if v_1_1.Type != t { 4288 break 4289 } 4290 d := v_1_1.AuxInt 4291 v.reset(OpAdd8) 4292 v0 := b.NewValue0(v.Pos, OpConst8, t) 4293 v0.AuxInt = int64(int8(c + d)) 4294 v.AddArg(v0) 4295 v.AddArg(x) 4296 return true 4297 } 4298 // match: (Add8 (Add8 (Const8 <t> [d]) x) (Const8 <t> [c])) 4299 // cond: 4300 // result: (Add8 (Const8 <t> [int64(int8(c+d))]) x) 4301 for { 4302 _ = v.Args[1] 4303 v_0 := v.Args[0] 4304 if v_0.Op != OpAdd8 { 4305 break 4306 } 4307 _ = v_0.Args[1] 4308 v_0_0 := v_0.Args[0] 4309 if v_0_0.Op != OpConst8 { 4310 break 4311 } 4312 t := v_0_0.Type 4313 d := v_0_0.AuxInt 4314 x := v_0.Args[1] 4315 v_1 := v.Args[1] 4316 if v_1.Op != OpConst8 { 4317 break 4318 } 4319 if v_1.Type != t { 4320 break 4321 } 4322 c := v_1.AuxInt 4323 v.reset(OpAdd8) 4324 v0 := b.NewValue0(v.Pos, OpConst8, t) 4325 v0.AuxInt = int64(int8(c + d)) 4326 v.AddArg(v0) 4327 v.AddArg(x) 4328 return true 4329 } 4330 // match: (Add8 (Add8 x (Const8 <t> [d])) (Const8 <t> [c])) 4331 // cond: 4332 // result: (Add8 (Const8 <t> [int64(int8(c+d))]) x) 4333 for { 4334 _ = v.Args[1] 4335 v_0 := v.Args[0] 4336 if v_0.Op != OpAdd8 { 4337 break 4338 } 4339 _ = v_0.Args[1] 4340 x := v_0.Args[0] 4341 v_0_1 := v_0.Args[1] 4342 if v_0_1.Op != OpConst8 { 4343 break 4344 } 4345 t := v_0_1.Type 4346 d := v_0_1.AuxInt 4347 v_1 := v.Args[1] 4348 if v_1.Op != OpConst8 { 4349 break 4350 } 4351 if v_1.Type != t { 4352 break 4353 } 4354 c := v_1.AuxInt 4355 v.reset(OpAdd8) 4356 v0 := b.NewValue0(v.Pos, OpConst8, t) 4357 v0.AuxInt = int64(int8(c + d)) 4358 v.AddArg(v0) 4359 v.AddArg(x) 4360 return true 4361 } 4362 return false 4363 } 4364 func rewriteValuegeneric_OpAdd8_30(v *Value) bool { 4365 b := v.Block 4366 _ = b 4367 // match: (Add8 (Const8 <t> [c]) (Sub8 (Const8 <t> [d]) x)) 4368 // cond: 4369 // result: (Sub8 (Const8 <t> [int64(int8(c+d))]) x) 4370 for { 4371 _ = v.Args[1] 4372 v_0 := v.Args[0] 4373 if v_0.Op != OpConst8 { 4374 break 4375 } 4376 t := v_0.Type 4377 c := v_0.AuxInt 4378 v_1 := v.Args[1] 4379 if v_1.Op != OpSub8 { 4380 break 4381 } 4382 _ = v_1.Args[1] 4383 v_1_0 := v_1.Args[0] 4384 if v_1_0.Op != OpConst8 { 4385 break 4386 } 4387 if v_1_0.Type != t { 4388 break 4389 } 4390 d := v_1_0.AuxInt 4391 x := v_1.Args[1] 4392 v.reset(OpSub8) 4393 v0 := b.NewValue0(v.Pos, OpConst8, t) 4394 v0.AuxInt = int64(int8(c + d)) 4395 v.AddArg(v0) 4396 v.AddArg(x) 4397 return true 4398 } 4399 // match: (Add8 (Sub8 (Const8 <t> [d]) x) (Const8 <t> [c])) 4400 // cond: 4401 // result: (Sub8 (Const8 <t> [int64(int8(c+d))]) x) 4402 for { 4403 _ = v.Args[1] 4404 v_0 := v.Args[0] 4405 if v_0.Op != OpSub8 { 4406 break 4407 } 4408 _ = v_0.Args[1] 4409 v_0_0 := v_0.Args[0] 4410 if v_0_0.Op != OpConst8 { 4411 break 4412 } 4413 t := v_0_0.Type 4414 d := v_0_0.AuxInt 4415 x := v_0.Args[1] 4416 v_1 := v.Args[1] 4417 if v_1.Op != OpConst8 { 4418 break 4419 } 4420 if v_1.Type != t { 4421 break 4422 } 4423 c := v_1.AuxInt 4424 v.reset(OpSub8) 4425 v0 := b.NewValue0(v.Pos, OpConst8, t) 4426 v0.AuxInt = int64(int8(c + d)) 4427 v.AddArg(v0) 4428 v.AddArg(x) 4429 return true 4430 } 4431 // match: (Add8 (Const8 <t> [c]) (Sub8 x (Const8 <t> [d]))) 4432 // cond: 4433 // result: (Add8 (Const8 <t> [int64(int8(c-d))]) x) 4434 for { 4435 _ = v.Args[1] 4436 v_0 := v.Args[0] 4437 if v_0.Op != OpConst8 { 4438 break 4439 } 4440 t := v_0.Type 4441 c := v_0.AuxInt 4442 v_1 := v.Args[1] 4443 if v_1.Op != OpSub8 { 4444 break 4445 } 4446 _ = v_1.Args[1] 4447 x := v_1.Args[0] 4448 v_1_1 := v_1.Args[1] 4449 if v_1_1.Op != OpConst8 { 4450 break 4451 } 4452 if v_1_1.Type != t { 4453 break 4454 } 4455 d := v_1_1.AuxInt 4456 v.reset(OpAdd8) 4457 v0 := b.NewValue0(v.Pos, OpConst8, t) 4458 v0.AuxInt = int64(int8(c - d)) 4459 v.AddArg(v0) 4460 v.AddArg(x) 4461 return true 4462 } 4463 // match: (Add8 (Sub8 x (Const8 <t> [d])) (Const8 <t> [c])) 4464 // cond: 4465 // result: (Add8 (Const8 <t> [int64(int8(c-d))]) x) 4466 for { 4467 _ = v.Args[1] 4468 v_0 := v.Args[0] 4469 if v_0.Op != OpSub8 { 4470 break 4471 } 4472 _ = v_0.Args[1] 4473 x := v_0.Args[0] 4474 v_0_1 := v_0.Args[1] 4475 if v_0_1.Op != OpConst8 { 4476 break 4477 } 4478 t := v_0_1.Type 4479 d := v_0_1.AuxInt 4480 v_1 := v.Args[1] 4481 if v_1.Op != OpConst8 { 4482 break 4483 } 4484 if v_1.Type != t { 4485 break 4486 } 4487 c := v_1.AuxInt 4488 v.reset(OpAdd8) 4489 v0 := b.NewValue0(v.Pos, OpConst8, t) 4490 v0.AuxInt = int64(int8(c - d)) 4491 v.AddArg(v0) 4492 v.AddArg(x) 4493 return true 4494 } 4495 return false 4496 } 4497 func rewriteValuegeneric_OpAddPtr_0(v *Value) bool { 4498 // match: (AddPtr <t> x (Const64 [c])) 4499 // cond: 4500 // result: (OffPtr <t> x [c]) 4501 for { 4502 t := v.Type 4503 _ = v.Args[1] 4504 x := v.Args[0] 4505 v_1 := v.Args[1] 4506 if v_1.Op != OpConst64 { 4507 break 4508 } 4509 c := v_1.AuxInt 4510 v.reset(OpOffPtr) 4511 v.Type = t 4512 v.AuxInt = c 4513 v.AddArg(x) 4514 return true 4515 } 4516 // match: (AddPtr <t> x (Const32 [c])) 4517 // cond: 4518 // result: (OffPtr <t> x [c]) 4519 for { 4520 t := v.Type 4521 _ = v.Args[1] 4522 x := v.Args[0] 4523 v_1 := v.Args[1] 4524 if v_1.Op != OpConst32 { 4525 break 4526 } 4527 c := v_1.AuxInt 4528 v.reset(OpOffPtr) 4529 v.Type = t 4530 v.AuxInt = c 4531 v.AddArg(x) 4532 return true 4533 } 4534 return false 4535 } 4536 func rewriteValuegeneric_OpAnd16_0(v *Value) bool { 4537 // match: (And16 (Const16 [c]) (Const16 [d])) 4538 // cond: 4539 // result: (Const16 [int64(int16(c&d))]) 4540 for { 4541 _ = v.Args[1] 4542 v_0 := v.Args[0] 4543 if v_0.Op != OpConst16 { 4544 break 4545 } 4546 c := v_0.AuxInt 4547 v_1 := v.Args[1] 4548 if v_1.Op != OpConst16 { 4549 break 4550 } 4551 d := v_1.AuxInt 4552 v.reset(OpConst16) 4553 v.AuxInt = int64(int16(c & d)) 4554 return true 4555 } 4556 // match: (And16 (Const16 [d]) (Const16 [c])) 4557 // cond: 4558 // result: (Const16 [int64(int16(c&d))]) 4559 for { 4560 _ = v.Args[1] 4561 v_0 := v.Args[0] 4562 if v_0.Op != OpConst16 { 4563 break 4564 } 4565 d := v_0.AuxInt 4566 v_1 := v.Args[1] 4567 if v_1.Op != OpConst16 { 4568 break 4569 } 4570 c := v_1.AuxInt 4571 v.reset(OpConst16) 4572 v.AuxInt = int64(int16(c & d)) 4573 return true 4574 } 4575 // match: (And16 x x) 4576 // cond: 4577 // result: x 4578 for { 4579 _ = v.Args[1] 4580 x := v.Args[0] 4581 if x != v.Args[1] { 4582 break 4583 } 4584 v.reset(OpCopy) 4585 v.Type = x.Type 4586 v.AddArg(x) 4587 return true 4588 } 4589 // match: (And16 (Const16 [-1]) x) 4590 // cond: 4591 // result: x 4592 for { 4593 _ = v.Args[1] 4594 v_0 := v.Args[0] 4595 if v_0.Op != OpConst16 { 4596 break 4597 } 4598 if v_0.AuxInt != -1 { 4599 break 4600 } 4601 x := v.Args[1] 4602 v.reset(OpCopy) 4603 v.Type = x.Type 4604 v.AddArg(x) 4605 return true 4606 } 4607 // match: (And16 x (Const16 [-1])) 4608 // cond: 4609 // result: x 4610 for { 4611 _ = v.Args[1] 4612 x := v.Args[0] 4613 v_1 := v.Args[1] 4614 if v_1.Op != OpConst16 { 4615 break 4616 } 4617 if v_1.AuxInt != -1 { 4618 break 4619 } 4620 v.reset(OpCopy) 4621 v.Type = x.Type 4622 v.AddArg(x) 4623 return true 4624 } 4625 // match: (And16 (Const16 [0]) _) 4626 // cond: 4627 // result: (Const16 [0]) 4628 for { 4629 _ = v.Args[1] 4630 v_0 := v.Args[0] 4631 if v_0.Op != OpConst16 { 4632 break 4633 } 4634 if v_0.AuxInt != 0 { 4635 break 4636 } 4637 v.reset(OpConst16) 4638 v.AuxInt = 0 4639 return true 4640 } 4641 // match: (And16 _ (Const16 [0])) 4642 // cond: 4643 // result: (Const16 [0]) 4644 for { 4645 _ = v.Args[1] 4646 v_1 := v.Args[1] 4647 if v_1.Op != OpConst16 { 4648 break 4649 } 4650 if v_1.AuxInt != 0 { 4651 break 4652 } 4653 v.reset(OpConst16) 4654 v.AuxInt = 0 4655 return true 4656 } 4657 // match: (And16 x (And16 x y)) 4658 // cond: 4659 // result: (And16 x y) 4660 for { 4661 _ = v.Args[1] 4662 x := v.Args[0] 4663 v_1 := v.Args[1] 4664 if v_1.Op != OpAnd16 { 4665 break 4666 } 4667 _ = v_1.Args[1] 4668 if x != v_1.Args[0] { 4669 break 4670 } 4671 y := v_1.Args[1] 4672 v.reset(OpAnd16) 4673 v.AddArg(x) 4674 v.AddArg(y) 4675 return true 4676 } 4677 // match: (And16 x (And16 y x)) 4678 // cond: 4679 // result: (And16 x y) 4680 for { 4681 _ = v.Args[1] 4682 x := v.Args[0] 4683 v_1 := v.Args[1] 4684 if v_1.Op != OpAnd16 { 4685 break 4686 } 4687 _ = v_1.Args[1] 4688 y := v_1.Args[0] 4689 if x != v_1.Args[1] { 4690 break 4691 } 4692 v.reset(OpAnd16) 4693 v.AddArg(x) 4694 v.AddArg(y) 4695 return true 4696 } 4697 // match: (And16 (And16 x y) x) 4698 // cond: 4699 // result: (And16 x y) 4700 for { 4701 _ = v.Args[1] 4702 v_0 := v.Args[0] 4703 if v_0.Op != OpAnd16 { 4704 break 4705 } 4706 _ = v_0.Args[1] 4707 x := v_0.Args[0] 4708 y := v_0.Args[1] 4709 if x != v.Args[1] { 4710 break 4711 } 4712 v.reset(OpAnd16) 4713 v.AddArg(x) 4714 v.AddArg(y) 4715 return true 4716 } 4717 return false 4718 } 4719 func rewriteValuegeneric_OpAnd16_10(v *Value) bool { 4720 b := v.Block 4721 _ = b 4722 // match: (And16 (And16 y x) x) 4723 // cond: 4724 // result: (And16 x y) 4725 for { 4726 _ = v.Args[1] 4727 v_0 := v.Args[0] 4728 if v_0.Op != OpAnd16 { 4729 break 4730 } 4731 _ = v_0.Args[1] 4732 y := v_0.Args[0] 4733 x := v_0.Args[1] 4734 if x != v.Args[1] { 4735 break 4736 } 4737 v.reset(OpAnd16) 4738 v.AddArg(x) 4739 v.AddArg(y) 4740 return true 4741 } 4742 // match: (And16 (And16 i:(Const16 <t>) z) x) 4743 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 4744 // result: (And16 i (And16 <t> z x)) 4745 for { 4746 _ = v.Args[1] 4747 v_0 := v.Args[0] 4748 if v_0.Op != OpAnd16 { 4749 break 4750 } 4751 _ = v_0.Args[1] 4752 i := v_0.Args[0] 4753 if i.Op != OpConst16 { 4754 break 4755 } 4756 t := i.Type 4757 z := v_0.Args[1] 4758 x := v.Args[1] 4759 if !(z.Op != OpConst16 && x.Op != OpConst16) { 4760 break 4761 } 4762 v.reset(OpAnd16) 4763 v.AddArg(i) 4764 v0 := b.NewValue0(v.Pos, OpAnd16, t) 4765 v0.AddArg(z) 4766 v0.AddArg(x) 4767 v.AddArg(v0) 4768 return true 4769 } 4770 // match: (And16 (And16 z i:(Const16 <t>)) x) 4771 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 4772 // result: (And16 i (And16 <t> z x)) 4773 for { 4774 _ = v.Args[1] 4775 v_0 := v.Args[0] 4776 if v_0.Op != OpAnd16 { 4777 break 4778 } 4779 _ = v_0.Args[1] 4780 z := v_0.Args[0] 4781 i := v_0.Args[1] 4782 if i.Op != OpConst16 { 4783 break 4784 } 4785 t := i.Type 4786 x := v.Args[1] 4787 if !(z.Op != OpConst16 && x.Op != OpConst16) { 4788 break 4789 } 4790 v.reset(OpAnd16) 4791 v.AddArg(i) 4792 v0 := b.NewValue0(v.Pos, OpAnd16, t) 4793 v0.AddArg(z) 4794 v0.AddArg(x) 4795 v.AddArg(v0) 4796 return true 4797 } 4798 // match: (And16 x (And16 i:(Const16 <t>) z)) 4799 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 4800 // result: (And16 i (And16 <t> z x)) 4801 for { 4802 _ = v.Args[1] 4803 x := v.Args[0] 4804 v_1 := v.Args[1] 4805 if v_1.Op != OpAnd16 { 4806 break 4807 } 4808 _ = v_1.Args[1] 4809 i := v_1.Args[0] 4810 if i.Op != OpConst16 { 4811 break 4812 } 4813 t := i.Type 4814 z := v_1.Args[1] 4815 if !(z.Op != OpConst16 && x.Op != OpConst16) { 4816 break 4817 } 4818 v.reset(OpAnd16) 4819 v.AddArg(i) 4820 v0 := b.NewValue0(v.Pos, OpAnd16, t) 4821 v0.AddArg(z) 4822 v0.AddArg(x) 4823 v.AddArg(v0) 4824 return true 4825 } 4826 // match: (And16 x (And16 z i:(Const16 <t>))) 4827 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 4828 // result: (And16 i (And16 <t> z x)) 4829 for { 4830 _ = v.Args[1] 4831 x := v.Args[0] 4832 v_1 := v.Args[1] 4833 if v_1.Op != OpAnd16 { 4834 break 4835 } 4836 _ = v_1.Args[1] 4837 z := v_1.Args[0] 4838 i := v_1.Args[1] 4839 if i.Op != OpConst16 { 4840 break 4841 } 4842 t := i.Type 4843 if !(z.Op != OpConst16 && x.Op != OpConst16) { 4844 break 4845 } 4846 v.reset(OpAnd16) 4847 v.AddArg(i) 4848 v0 := b.NewValue0(v.Pos, OpAnd16, t) 4849 v0.AddArg(z) 4850 v0.AddArg(x) 4851 v.AddArg(v0) 4852 return true 4853 } 4854 // match: (And16 (Const16 <t> [c]) (And16 (Const16 <t> [d]) x)) 4855 // cond: 4856 // result: (And16 (Const16 <t> [int64(int16(c&d))]) x) 4857 for { 4858 _ = v.Args[1] 4859 v_0 := v.Args[0] 4860 if v_0.Op != OpConst16 { 4861 break 4862 } 4863 t := v_0.Type 4864 c := v_0.AuxInt 4865 v_1 := v.Args[1] 4866 if v_1.Op != OpAnd16 { 4867 break 4868 } 4869 _ = v_1.Args[1] 4870 v_1_0 := v_1.Args[0] 4871 if v_1_0.Op != OpConst16 { 4872 break 4873 } 4874 if v_1_0.Type != t { 4875 break 4876 } 4877 d := v_1_0.AuxInt 4878 x := v_1.Args[1] 4879 v.reset(OpAnd16) 4880 v0 := b.NewValue0(v.Pos, OpConst16, t) 4881 v0.AuxInt = int64(int16(c & d)) 4882 v.AddArg(v0) 4883 v.AddArg(x) 4884 return true 4885 } 4886 // match: (And16 (Const16 <t> [c]) (And16 x (Const16 <t> [d]))) 4887 // cond: 4888 // result: (And16 (Const16 <t> [int64(int16(c&d))]) x) 4889 for { 4890 _ = v.Args[1] 4891 v_0 := v.Args[0] 4892 if v_0.Op != OpConst16 { 4893 break 4894 } 4895 t := v_0.Type 4896 c := v_0.AuxInt 4897 v_1 := v.Args[1] 4898 if v_1.Op != OpAnd16 { 4899 break 4900 } 4901 _ = v_1.Args[1] 4902 x := v_1.Args[0] 4903 v_1_1 := v_1.Args[1] 4904 if v_1_1.Op != OpConst16 { 4905 break 4906 } 4907 if v_1_1.Type != t { 4908 break 4909 } 4910 d := v_1_1.AuxInt 4911 v.reset(OpAnd16) 4912 v0 := b.NewValue0(v.Pos, OpConst16, t) 4913 v0.AuxInt = int64(int16(c & d)) 4914 v.AddArg(v0) 4915 v.AddArg(x) 4916 return true 4917 } 4918 // match: (And16 (And16 (Const16 <t> [d]) x) (Const16 <t> [c])) 4919 // cond: 4920 // result: (And16 (Const16 <t> [int64(int16(c&d))]) x) 4921 for { 4922 _ = v.Args[1] 4923 v_0 := v.Args[0] 4924 if v_0.Op != OpAnd16 { 4925 break 4926 } 4927 _ = v_0.Args[1] 4928 v_0_0 := v_0.Args[0] 4929 if v_0_0.Op != OpConst16 { 4930 break 4931 } 4932 t := v_0_0.Type 4933 d := v_0_0.AuxInt 4934 x := v_0.Args[1] 4935 v_1 := v.Args[1] 4936 if v_1.Op != OpConst16 { 4937 break 4938 } 4939 if v_1.Type != t { 4940 break 4941 } 4942 c := v_1.AuxInt 4943 v.reset(OpAnd16) 4944 v0 := b.NewValue0(v.Pos, OpConst16, t) 4945 v0.AuxInt = int64(int16(c & d)) 4946 v.AddArg(v0) 4947 v.AddArg(x) 4948 return true 4949 } 4950 // match: (And16 (And16 x (Const16 <t> [d])) (Const16 <t> [c])) 4951 // cond: 4952 // result: (And16 (Const16 <t> [int64(int16(c&d))]) x) 4953 for { 4954 _ = v.Args[1] 4955 v_0 := v.Args[0] 4956 if v_0.Op != OpAnd16 { 4957 break 4958 } 4959 _ = v_0.Args[1] 4960 x := v_0.Args[0] 4961 v_0_1 := v_0.Args[1] 4962 if v_0_1.Op != OpConst16 { 4963 break 4964 } 4965 t := v_0_1.Type 4966 d := v_0_1.AuxInt 4967 v_1 := v.Args[1] 4968 if v_1.Op != OpConst16 { 4969 break 4970 } 4971 if v_1.Type != t { 4972 break 4973 } 4974 c := v_1.AuxInt 4975 v.reset(OpAnd16) 4976 v0 := b.NewValue0(v.Pos, OpConst16, t) 4977 v0.AuxInt = int64(int16(c & d)) 4978 v.AddArg(v0) 4979 v.AddArg(x) 4980 return true 4981 } 4982 return false 4983 } 4984 func rewriteValuegeneric_OpAnd32_0(v *Value) bool { 4985 // match: (And32 (Const32 [c]) (Const32 [d])) 4986 // cond: 4987 // result: (Const32 [int64(int32(c&d))]) 4988 for { 4989 _ = v.Args[1] 4990 v_0 := v.Args[0] 4991 if v_0.Op != OpConst32 { 4992 break 4993 } 4994 c := v_0.AuxInt 4995 v_1 := v.Args[1] 4996 if v_1.Op != OpConst32 { 4997 break 4998 } 4999 d := v_1.AuxInt 5000 v.reset(OpConst32) 5001 v.AuxInt = int64(int32(c & d)) 5002 return true 5003 } 5004 // match: (And32 (Const32 [d]) (Const32 [c])) 5005 // cond: 5006 // result: (Const32 [int64(int32(c&d))]) 5007 for { 5008 _ = v.Args[1] 5009 v_0 := v.Args[0] 5010 if v_0.Op != OpConst32 { 5011 break 5012 } 5013 d := v_0.AuxInt 5014 v_1 := v.Args[1] 5015 if v_1.Op != OpConst32 { 5016 break 5017 } 5018 c := v_1.AuxInt 5019 v.reset(OpConst32) 5020 v.AuxInt = int64(int32(c & d)) 5021 return true 5022 } 5023 // match: (And32 x x) 5024 // cond: 5025 // result: x 5026 for { 5027 _ = v.Args[1] 5028 x := v.Args[0] 5029 if x != v.Args[1] { 5030 break 5031 } 5032 v.reset(OpCopy) 5033 v.Type = x.Type 5034 v.AddArg(x) 5035 return true 5036 } 5037 // match: (And32 (Const32 [-1]) x) 5038 // cond: 5039 // result: x 5040 for { 5041 _ = v.Args[1] 5042 v_0 := v.Args[0] 5043 if v_0.Op != OpConst32 { 5044 break 5045 } 5046 if v_0.AuxInt != -1 { 5047 break 5048 } 5049 x := v.Args[1] 5050 v.reset(OpCopy) 5051 v.Type = x.Type 5052 v.AddArg(x) 5053 return true 5054 } 5055 // match: (And32 x (Const32 [-1])) 5056 // cond: 5057 // result: x 5058 for { 5059 _ = v.Args[1] 5060 x := v.Args[0] 5061 v_1 := v.Args[1] 5062 if v_1.Op != OpConst32 { 5063 break 5064 } 5065 if v_1.AuxInt != -1 { 5066 break 5067 } 5068 v.reset(OpCopy) 5069 v.Type = x.Type 5070 v.AddArg(x) 5071 return true 5072 } 5073 // match: (And32 (Const32 [0]) _) 5074 // cond: 5075 // result: (Const32 [0]) 5076 for { 5077 _ = v.Args[1] 5078 v_0 := v.Args[0] 5079 if v_0.Op != OpConst32 { 5080 break 5081 } 5082 if v_0.AuxInt != 0 { 5083 break 5084 } 5085 v.reset(OpConst32) 5086 v.AuxInt = 0 5087 return true 5088 } 5089 // match: (And32 _ (Const32 [0])) 5090 // cond: 5091 // result: (Const32 [0]) 5092 for { 5093 _ = v.Args[1] 5094 v_1 := v.Args[1] 5095 if v_1.Op != OpConst32 { 5096 break 5097 } 5098 if v_1.AuxInt != 0 { 5099 break 5100 } 5101 v.reset(OpConst32) 5102 v.AuxInt = 0 5103 return true 5104 } 5105 // match: (And32 x (And32 x y)) 5106 // cond: 5107 // result: (And32 x y) 5108 for { 5109 _ = v.Args[1] 5110 x := v.Args[0] 5111 v_1 := v.Args[1] 5112 if v_1.Op != OpAnd32 { 5113 break 5114 } 5115 _ = v_1.Args[1] 5116 if x != v_1.Args[0] { 5117 break 5118 } 5119 y := v_1.Args[1] 5120 v.reset(OpAnd32) 5121 v.AddArg(x) 5122 v.AddArg(y) 5123 return true 5124 } 5125 // match: (And32 x (And32 y x)) 5126 // cond: 5127 // result: (And32 x y) 5128 for { 5129 _ = v.Args[1] 5130 x := v.Args[0] 5131 v_1 := v.Args[1] 5132 if v_1.Op != OpAnd32 { 5133 break 5134 } 5135 _ = v_1.Args[1] 5136 y := v_1.Args[0] 5137 if x != v_1.Args[1] { 5138 break 5139 } 5140 v.reset(OpAnd32) 5141 v.AddArg(x) 5142 v.AddArg(y) 5143 return true 5144 } 5145 // match: (And32 (And32 x y) x) 5146 // cond: 5147 // result: (And32 x y) 5148 for { 5149 _ = v.Args[1] 5150 v_0 := v.Args[0] 5151 if v_0.Op != OpAnd32 { 5152 break 5153 } 5154 _ = v_0.Args[1] 5155 x := v_0.Args[0] 5156 y := v_0.Args[1] 5157 if x != v.Args[1] { 5158 break 5159 } 5160 v.reset(OpAnd32) 5161 v.AddArg(x) 5162 v.AddArg(y) 5163 return true 5164 } 5165 return false 5166 } 5167 func rewriteValuegeneric_OpAnd32_10(v *Value) bool { 5168 b := v.Block 5169 _ = b 5170 // match: (And32 (And32 y x) x) 5171 // cond: 5172 // result: (And32 x y) 5173 for { 5174 _ = v.Args[1] 5175 v_0 := v.Args[0] 5176 if v_0.Op != OpAnd32 { 5177 break 5178 } 5179 _ = v_0.Args[1] 5180 y := v_0.Args[0] 5181 x := v_0.Args[1] 5182 if x != v.Args[1] { 5183 break 5184 } 5185 v.reset(OpAnd32) 5186 v.AddArg(x) 5187 v.AddArg(y) 5188 return true 5189 } 5190 // match: (And32 (And32 i:(Const32 <t>) z) x) 5191 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 5192 // result: (And32 i (And32 <t> z x)) 5193 for { 5194 _ = v.Args[1] 5195 v_0 := v.Args[0] 5196 if v_0.Op != OpAnd32 { 5197 break 5198 } 5199 _ = v_0.Args[1] 5200 i := v_0.Args[0] 5201 if i.Op != OpConst32 { 5202 break 5203 } 5204 t := i.Type 5205 z := v_0.Args[1] 5206 x := v.Args[1] 5207 if !(z.Op != OpConst32 && x.Op != OpConst32) { 5208 break 5209 } 5210 v.reset(OpAnd32) 5211 v.AddArg(i) 5212 v0 := b.NewValue0(v.Pos, OpAnd32, t) 5213 v0.AddArg(z) 5214 v0.AddArg(x) 5215 v.AddArg(v0) 5216 return true 5217 } 5218 // match: (And32 (And32 z i:(Const32 <t>)) x) 5219 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 5220 // result: (And32 i (And32 <t> z x)) 5221 for { 5222 _ = v.Args[1] 5223 v_0 := v.Args[0] 5224 if v_0.Op != OpAnd32 { 5225 break 5226 } 5227 _ = v_0.Args[1] 5228 z := v_0.Args[0] 5229 i := v_0.Args[1] 5230 if i.Op != OpConst32 { 5231 break 5232 } 5233 t := i.Type 5234 x := v.Args[1] 5235 if !(z.Op != OpConst32 && x.Op != OpConst32) { 5236 break 5237 } 5238 v.reset(OpAnd32) 5239 v.AddArg(i) 5240 v0 := b.NewValue0(v.Pos, OpAnd32, t) 5241 v0.AddArg(z) 5242 v0.AddArg(x) 5243 v.AddArg(v0) 5244 return true 5245 } 5246 // match: (And32 x (And32 i:(Const32 <t>) z)) 5247 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 5248 // result: (And32 i (And32 <t> z x)) 5249 for { 5250 _ = v.Args[1] 5251 x := v.Args[0] 5252 v_1 := v.Args[1] 5253 if v_1.Op != OpAnd32 { 5254 break 5255 } 5256 _ = v_1.Args[1] 5257 i := v_1.Args[0] 5258 if i.Op != OpConst32 { 5259 break 5260 } 5261 t := i.Type 5262 z := v_1.Args[1] 5263 if !(z.Op != OpConst32 && x.Op != OpConst32) { 5264 break 5265 } 5266 v.reset(OpAnd32) 5267 v.AddArg(i) 5268 v0 := b.NewValue0(v.Pos, OpAnd32, t) 5269 v0.AddArg(z) 5270 v0.AddArg(x) 5271 v.AddArg(v0) 5272 return true 5273 } 5274 // match: (And32 x (And32 z i:(Const32 <t>))) 5275 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 5276 // result: (And32 i (And32 <t> z x)) 5277 for { 5278 _ = v.Args[1] 5279 x := v.Args[0] 5280 v_1 := v.Args[1] 5281 if v_1.Op != OpAnd32 { 5282 break 5283 } 5284 _ = v_1.Args[1] 5285 z := v_1.Args[0] 5286 i := v_1.Args[1] 5287 if i.Op != OpConst32 { 5288 break 5289 } 5290 t := i.Type 5291 if !(z.Op != OpConst32 && x.Op != OpConst32) { 5292 break 5293 } 5294 v.reset(OpAnd32) 5295 v.AddArg(i) 5296 v0 := b.NewValue0(v.Pos, OpAnd32, t) 5297 v0.AddArg(z) 5298 v0.AddArg(x) 5299 v.AddArg(v0) 5300 return true 5301 } 5302 // match: (And32 (Const32 <t> [c]) (And32 (Const32 <t> [d]) x)) 5303 // cond: 5304 // result: (And32 (Const32 <t> [int64(int32(c&d))]) x) 5305 for { 5306 _ = v.Args[1] 5307 v_0 := v.Args[0] 5308 if v_0.Op != OpConst32 { 5309 break 5310 } 5311 t := v_0.Type 5312 c := v_0.AuxInt 5313 v_1 := v.Args[1] 5314 if v_1.Op != OpAnd32 { 5315 break 5316 } 5317 _ = v_1.Args[1] 5318 v_1_0 := v_1.Args[0] 5319 if v_1_0.Op != OpConst32 { 5320 break 5321 } 5322 if v_1_0.Type != t { 5323 break 5324 } 5325 d := v_1_0.AuxInt 5326 x := v_1.Args[1] 5327 v.reset(OpAnd32) 5328 v0 := b.NewValue0(v.Pos, OpConst32, t) 5329 v0.AuxInt = int64(int32(c & d)) 5330 v.AddArg(v0) 5331 v.AddArg(x) 5332 return true 5333 } 5334 // match: (And32 (Const32 <t> [c]) (And32 x (Const32 <t> [d]))) 5335 // cond: 5336 // result: (And32 (Const32 <t> [int64(int32(c&d))]) x) 5337 for { 5338 _ = v.Args[1] 5339 v_0 := v.Args[0] 5340 if v_0.Op != OpConst32 { 5341 break 5342 } 5343 t := v_0.Type 5344 c := v_0.AuxInt 5345 v_1 := v.Args[1] 5346 if v_1.Op != OpAnd32 { 5347 break 5348 } 5349 _ = v_1.Args[1] 5350 x := v_1.Args[0] 5351 v_1_1 := v_1.Args[1] 5352 if v_1_1.Op != OpConst32 { 5353 break 5354 } 5355 if v_1_1.Type != t { 5356 break 5357 } 5358 d := v_1_1.AuxInt 5359 v.reset(OpAnd32) 5360 v0 := b.NewValue0(v.Pos, OpConst32, t) 5361 v0.AuxInt = int64(int32(c & d)) 5362 v.AddArg(v0) 5363 v.AddArg(x) 5364 return true 5365 } 5366 // match: (And32 (And32 (Const32 <t> [d]) x) (Const32 <t> [c])) 5367 // cond: 5368 // result: (And32 (Const32 <t> [int64(int32(c&d))]) x) 5369 for { 5370 _ = v.Args[1] 5371 v_0 := v.Args[0] 5372 if v_0.Op != OpAnd32 { 5373 break 5374 } 5375 _ = v_0.Args[1] 5376 v_0_0 := v_0.Args[0] 5377 if v_0_0.Op != OpConst32 { 5378 break 5379 } 5380 t := v_0_0.Type 5381 d := v_0_0.AuxInt 5382 x := v_0.Args[1] 5383 v_1 := v.Args[1] 5384 if v_1.Op != OpConst32 { 5385 break 5386 } 5387 if v_1.Type != t { 5388 break 5389 } 5390 c := v_1.AuxInt 5391 v.reset(OpAnd32) 5392 v0 := b.NewValue0(v.Pos, OpConst32, t) 5393 v0.AuxInt = int64(int32(c & d)) 5394 v.AddArg(v0) 5395 v.AddArg(x) 5396 return true 5397 } 5398 // match: (And32 (And32 x (Const32 <t> [d])) (Const32 <t> [c])) 5399 // cond: 5400 // result: (And32 (Const32 <t> [int64(int32(c&d))]) x) 5401 for { 5402 _ = v.Args[1] 5403 v_0 := v.Args[0] 5404 if v_0.Op != OpAnd32 { 5405 break 5406 } 5407 _ = v_0.Args[1] 5408 x := v_0.Args[0] 5409 v_0_1 := v_0.Args[1] 5410 if v_0_1.Op != OpConst32 { 5411 break 5412 } 5413 t := v_0_1.Type 5414 d := v_0_1.AuxInt 5415 v_1 := v.Args[1] 5416 if v_1.Op != OpConst32 { 5417 break 5418 } 5419 if v_1.Type != t { 5420 break 5421 } 5422 c := v_1.AuxInt 5423 v.reset(OpAnd32) 5424 v0 := b.NewValue0(v.Pos, OpConst32, t) 5425 v0.AuxInt = int64(int32(c & d)) 5426 v.AddArg(v0) 5427 v.AddArg(x) 5428 return true 5429 } 5430 return false 5431 } 5432 func rewriteValuegeneric_OpAnd64_0(v *Value) bool { 5433 // match: (And64 (Const64 [c]) (Const64 [d])) 5434 // cond: 5435 // result: (Const64 [c&d]) 5436 for { 5437 _ = v.Args[1] 5438 v_0 := v.Args[0] 5439 if v_0.Op != OpConst64 { 5440 break 5441 } 5442 c := v_0.AuxInt 5443 v_1 := v.Args[1] 5444 if v_1.Op != OpConst64 { 5445 break 5446 } 5447 d := v_1.AuxInt 5448 v.reset(OpConst64) 5449 v.AuxInt = c & d 5450 return true 5451 } 5452 // match: (And64 (Const64 [d]) (Const64 [c])) 5453 // cond: 5454 // result: (Const64 [c&d]) 5455 for { 5456 _ = v.Args[1] 5457 v_0 := v.Args[0] 5458 if v_0.Op != OpConst64 { 5459 break 5460 } 5461 d := v_0.AuxInt 5462 v_1 := v.Args[1] 5463 if v_1.Op != OpConst64 { 5464 break 5465 } 5466 c := v_1.AuxInt 5467 v.reset(OpConst64) 5468 v.AuxInt = c & d 5469 return true 5470 } 5471 // match: (And64 x x) 5472 // cond: 5473 // result: x 5474 for { 5475 _ = v.Args[1] 5476 x := v.Args[0] 5477 if x != v.Args[1] { 5478 break 5479 } 5480 v.reset(OpCopy) 5481 v.Type = x.Type 5482 v.AddArg(x) 5483 return true 5484 } 5485 // match: (And64 (Const64 [-1]) x) 5486 // cond: 5487 // result: x 5488 for { 5489 _ = v.Args[1] 5490 v_0 := v.Args[0] 5491 if v_0.Op != OpConst64 { 5492 break 5493 } 5494 if v_0.AuxInt != -1 { 5495 break 5496 } 5497 x := v.Args[1] 5498 v.reset(OpCopy) 5499 v.Type = x.Type 5500 v.AddArg(x) 5501 return true 5502 } 5503 // match: (And64 x (Const64 [-1])) 5504 // cond: 5505 // result: x 5506 for { 5507 _ = v.Args[1] 5508 x := v.Args[0] 5509 v_1 := v.Args[1] 5510 if v_1.Op != OpConst64 { 5511 break 5512 } 5513 if v_1.AuxInt != -1 { 5514 break 5515 } 5516 v.reset(OpCopy) 5517 v.Type = x.Type 5518 v.AddArg(x) 5519 return true 5520 } 5521 // match: (And64 (Const64 [0]) _) 5522 // cond: 5523 // result: (Const64 [0]) 5524 for { 5525 _ = v.Args[1] 5526 v_0 := v.Args[0] 5527 if v_0.Op != OpConst64 { 5528 break 5529 } 5530 if v_0.AuxInt != 0 { 5531 break 5532 } 5533 v.reset(OpConst64) 5534 v.AuxInt = 0 5535 return true 5536 } 5537 // match: (And64 _ (Const64 [0])) 5538 // cond: 5539 // result: (Const64 [0]) 5540 for { 5541 _ = v.Args[1] 5542 v_1 := v.Args[1] 5543 if v_1.Op != OpConst64 { 5544 break 5545 } 5546 if v_1.AuxInt != 0 { 5547 break 5548 } 5549 v.reset(OpConst64) 5550 v.AuxInt = 0 5551 return true 5552 } 5553 // match: (And64 x (And64 x y)) 5554 // cond: 5555 // result: (And64 x y) 5556 for { 5557 _ = v.Args[1] 5558 x := v.Args[0] 5559 v_1 := v.Args[1] 5560 if v_1.Op != OpAnd64 { 5561 break 5562 } 5563 _ = v_1.Args[1] 5564 if x != v_1.Args[0] { 5565 break 5566 } 5567 y := v_1.Args[1] 5568 v.reset(OpAnd64) 5569 v.AddArg(x) 5570 v.AddArg(y) 5571 return true 5572 } 5573 // match: (And64 x (And64 y x)) 5574 // cond: 5575 // result: (And64 x y) 5576 for { 5577 _ = v.Args[1] 5578 x := v.Args[0] 5579 v_1 := v.Args[1] 5580 if v_1.Op != OpAnd64 { 5581 break 5582 } 5583 _ = v_1.Args[1] 5584 y := v_1.Args[0] 5585 if x != v_1.Args[1] { 5586 break 5587 } 5588 v.reset(OpAnd64) 5589 v.AddArg(x) 5590 v.AddArg(y) 5591 return true 5592 } 5593 // match: (And64 (And64 x y) x) 5594 // cond: 5595 // result: (And64 x y) 5596 for { 5597 _ = v.Args[1] 5598 v_0 := v.Args[0] 5599 if v_0.Op != OpAnd64 { 5600 break 5601 } 5602 _ = v_0.Args[1] 5603 x := v_0.Args[0] 5604 y := v_0.Args[1] 5605 if x != v.Args[1] { 5606 break 5607 } 5608 v.reset(OpAnd64) 5609 v.AddArg(x) 5610 v.AddArg(y) 5611 return true 5612 } 5613 return false 5614 } 5615 func rewriteValuegeneric_OpAnd64_10(v *Value) bool { 5616 b := v.Block 5617 _ = b 5618 // match: (And64 (And64 y x) x) 5619 // cond: 5620 // result: (And64 x y) 5621 for { 5622 _ = v.Args[1] 5623 v_0 := v.Args[0] 5624 if v_0.Op != OpAnd64 { 5625 break 5626 } 5627 _ = v_0.Args[1] 5628 y := v_0.Args[0] 5629 x := v_0.Args[1] 5630 if x != v.Args[1] { 5631 break 5632 } 5633 v.reset(OpAnd64) 5634 v.AddArg(x) 5635 v.AddArg(y) 5636 return true 5637 } 5638 // match: (And64 <t> (Const64 [y]) x) 5639 // cond: nlz(y) + nto(y) == 64 && nto(y) >= 32 5640 // result: (Rsh64Ux64 (Lsh64x64 <t> x (Const64 <t> [nlz(y)])) (Const64 <t> [nlz(y)])) 5641 for { 5642 t := v.Type 5643 _ = v.Args[1] 5644 v_0 := v.Args[0] 5645 if v_0.Op != OpConst64 { 5646 break 5647 } 5648 y := v_0.AuxInt 5649 x := v.Args[1] 5650 if !(nlz(y)+nto(y) == 64 && nto(y) >= 32) { 5651 break 5652 } 5653 v.reset(OpRsh64Ux64) 5654 v0 := b.NewValue0(v.Pos, OpLsh64x64, t) 5655 v0.AddArg(x) 5656 v1 := b.NewValue0(v.Pos, OpConst64, t) 5657 v1.AuxInt = nlz(y) 5658 v0.AddArg(v1) 5659 v.AddArg(v0) 5660 v2 := b.NewValue0(v.Pos, OpConst64, t) 5661 v2.AuxInt = nlz(y) 5662 v.AddArg(v2) 5663 return true 5664 } 5665 // match: (And64 <t> x (Const64 [y])) 5666 // cond: nlz(y) + nto(y) == 64 && nto(y) >= 32 5667 // result: (Rsh64Ux64 (Lsh64x64 <t> x (Const64 <t> [nlz(y)])) (Const64 <t> [nlz(y)])) 5668 for { 5669 t := v.Type 5670 _ = v.Args[1] 5671 x := v.Args[0] 5672 v_1 := v.Args[1] 5673 if v_1.Op != OpConst64 { 5674 break 5675 } 5676 y := v_1.AuxInt 5677 if !(nlz(y)+nto(y) == 64 && nto(y) >= 32) { 5678 break 5679 } 5680 v.reset(OpRsh64Ux64) 5681 v0 := b.NewValue0(v.Pos, OpLsh64x64, t) 5682 v0.AddArg(x) 5683 v1 := b.NewValue0(v.Pos, OpConst64, t) 5684 v1.AuxInt = nlz(y) 5685 v0.AddArg(v1) 5686 v.AddArg(v0) 5687 v2 := b.NewValue0(v.Pos, OpConst64, t) 5688 v2.AuxInt = nlz(y) 5689 v.AddArg(v2) 5690 return true 5691 } 5692 // match: (And64 <t> (Const64 [y]) x) 5693 // cond: nlo(y) + ntz(y) == 64 && ntz(y) >= 32 5694 // result: (Lsh64x64 (Rsh64Ux64 <t> x (Const64 <t> [ntz(y)])) (Const64 <t> [ntz(y)])) 5695 for { 5696 t := v.Type 5697 _ = v.Args[1] 5698 v_0 := v.Args[0] 5699 if v_0.Op != OpConst64 { 5700 break 5701 } 5702 y := v_0.AuxInt 5703 x := v.Args[1] 5704 if !(nlo(y)+ntz(y) == 64 && ntz(y) >= 32) { 5705 break 5706 } 5707 v.reset(OpLsh64x64) 5708 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, t) 5709 v0.AddArg(x) 5710 v1 := b.NewValue0(v.Pos, OpConst64, t) 5711 v1.AuxInt = ntz(y) 5712 v0.AddArg(v1) 5713 v.AddArg(v0) 5714 v2 := b.NewValue0(v.Pos, OpConst64, t) 5715 v2.AuxInt = ntz(y) 5716 v.AddArg(v2) 5717 return true 5718 } 5719 // match: (And64 <t> x (Const64 [y])) 5720 // cond: nlo(y) + ntz(y) == 64 && ntz(y) >= 32 5721 // result: (Lsh64x64 (Rsh64Ux64 <t> x (Const64 <t> [ntz(y)])) (Const64 <t> [ntz(y)])) 5722 for { 5723 t := v.Type 5724 _ = v.Args[1] 5725 x := v.Args[0] 5726 v_1 := v.Args[1] 5727 if v_1.Op != OpConst64 { 5728 break 5729 } 5730 y := v_1.AuxInt 5731 if !(nlo(y)+ntz(y) == 64 && ntz(y) >= 32) { 5732 break 5733 } 5734 v.reset(OpLsh64x64) 5735 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, t) 5736 v0.AddArg(x) 5737 v1 := b.NewValue0(v.Pos, OpConst64, t) 5738 v1.AuxInt = ntz(y) 5739 v0.AddArg(v1) 5740 v.AddArg(v0) 5741 v2 := b.NewValue0(v.Pos, OpConst64, t) 5742 v2.AuxInt = ntz(y) 5743 v.AddArg(v2) 5744 return true 5745 } 5746 // match: (And64 (And64 i:(Const64 <t>) z) x) 5747 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 5748 // result: (And64 i (And64 <t> z x)) 5749 for { 5750 _ = v.Args[1] 5751 v_0 := v.Args[0] 5752 if v_0.Op != OpAnd64 { 5753 break 5754 } 5755 _ = v_0.Args[1] 5756 i := v_0.Args[0] 5757 if i.Op != OpConst64 { 5758 break 5759 } 5760 t := i.Type 5761 z := v_0.Args[1] 5762 x := v.Args[1] 5763 if !(z.Op != OpConst64 && x.Op != OpConst64) { 5764 break 5765 } 5766 v.reset(OpAnd64) 5767 v.AddArg(i) 5768 v0 := b.NewValue0(v.Pos, OpAnd64, t) 5769 v0.AddArg(z) 5770 v0.AddArg(x) 5771 v.AddArg(v0) 5772 return true 5773 } 5774 // match: (And64 (And64 z i:(Const64 <t>)) x) 5775 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 5776 // result: (And64 i (And64 <t> z x)) 5777 for { 5778 _ = v.Args[1] 5779 v_0 := v.Args[0] 5780 if v_0.Op != OpAnd64 { 5781 break 5782 } 5783 _ = v_0.Args[1] 5784 z := v_0.Args[0] 5785 i := v_0.Args[1] 5786 if i.Op != OpConst64 { 5787 break 5788 } 5789 t := i.Type 5790 x := v.Args[1] 5791 if !(z.Op != OpConst64 && x.Op != OpConst64) { 5792 break 5793 } 5794 v.reset(OpAnd64) 5795 v.AddArg(i) 5796 v0 := b.NewValue0(v.Pos, OpAnd64, t) 5797 v0.AddArg(z) 5798 v0.AddArg(x) 5799 v.AddArg(v0) 5800 return true 5801 } 5802 // match: (And64 x (And64 i:(Const64 <t>) z)) 5803 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 5804 // result: (And64 i (And64 <t> z x)) 5805 for { 5806 _ = v.Args[1] 5807 x := v.Args[0] 5808 v_1 := v.Args[1] 5809 if v_1.Op != OpAnd64 { 5810 break 5811 } 5812 _ = v_1.Args[1] 5813 i := v_1.Args[0] 5814 if i.Op != OpConst64 { 5815 break 5816 } 5817 t := i.Type 5818 z := v_1.Args[1] 5819 if !(z.Op != OpConst64 && x.Op != OpConst64) { 5820 break 5821 } 5822 v.reset(OpAnd64) 5823 v.AddArg(i) 5824 v0 := b.NewValue0(v.Pos, OpAnd64, t) 5825 v0.AddArg(z) 5826 v0.AddArg(x) 5827 v.AddArg(v0) 5828 return true 5829 } 5830 // match: (And64 x (And64 z i:(Const64 <t>))) 5831 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 5832 // result: (And64 i (And64 <t> z x)) 5833 for { 5834 _ = v.Args[1] 5835 x := v.Args[0] 5836 v_1 := v.Args[1] 5837 if v_1.Op != OpAnd64 { 5838 break 5839 } 5840 _ = v_1.Args[1] 5841 z := v_1.Args[0] 5842 i := v_1.Args[1] 5843 if i.Op != OpConst64 { 5844 break 5845 } 5846 t := i.Type 5847 if !(z.Op != OpConst64 && x.Op != OpConst64) { 5848 break 5849 } 5850 v.reset(OpAnd64) 5851 v.AddArg(i) 5852 v0 := b.NewValue0(v.Pos, OpAnd64, t) 5853 v0.AddArg(z) 5854 v0.AddArg(x) 5855 v.AddArg(v0) 5856 return true 5857 } 5858 // match: (And64 (Const64 <t> [c]) (And64 (Const64 <t> [d]) x)) 5859 // cond: 5860 // result: (And64 (Const64 <t> [c&d]) x) 5861 for { 5862 _ = v.Args[1] 5863 v_0 := v.Args[0] 5864 if v_0.Op != OpConst64 { 5865 break 5866 } 5867 t := v_0.Type 5868 c := v_0.AuxInt 5869 v_1 := v.Args[1] 5870 if v_1.Op != OpAnd64 { 5871 break 5872 } 5873 _ = v_1.Args[1] 5874 v_1_0 := v_1.Args[0] 5875 if v_1_0.Op != OpConst64 { 5876 break 5877 } 5878 if v_1_0.Type != t { 5879 break 5880 } 5881 d := v_1_0.AuxInt 5882 x := v_1.Args[1] 5883 v.reset(OpAnd64) 5884 v0 := b.NewValue0(v.Pos, OpConst64, t) 5885 v0.AuxInt = c & d 5886 v.AddArg(v0) 5887 v.AddArg(x) 5888 return true 5889 } 5890 return false 5891 } 5892 func rewriteValuegeneric_OpAnd64_20(v *Value) bool { 5893 b := v.Block 5894 _ = b 5895 // match: (And64 (Const64 <t> [c]) (And64 x (Const64 <t> [d]))) 5896 // cond: 5897 // result: (And64 (Const64 <t> [c&d]) x) 5898 for { 5899 _ = v.Args[1] 5900 v_0 := v.Args[0] 5901 if v_0.Op != OpConst64 { 5902 break 5903 } 5904 t := v_0.Type 5905 c := v_0.AuxInt 5906 v_1 := v.Args[1] 5907 if v_1.Op != OpAnd64 { 5908 break 5909 } 5910 _ = v_1.Args[1] 5911 x := v_1.Args[0] 5912 v_1_1 := v_1.Args[1] 5913 if v_1_1.Op != OpConst64 { 5914 break 5915 } 5916 if v_1_1.Type != t { 5917 break 5918 } 5919 d := v_1_1.AuxInt 5920 v.reset(OpAnd64) 5921 v0 := b.NewValue0(v.Pos, OpConst64, t) 5922 v0.AuxInt = c & d 5923 v.AddArg(v0) 5924 v.AddArg(x) 5925 return true 5926 } 5927 // match: (And64 (And64 (Const64 <t> [d]) x) (Const64 <t> [c])) 5928 // cond: 5929 // result: (And64 (Const64 <t> [c&d]) x) 5930 for { 5931 _ = v.Args[1] 5932 v_0 := v.Args[0] 5933 if v_0.Op != OpAnd64 { 5934 break 5935 } 5936 _ = v_0.Args[1] 5937 v_0_0 := v_0.Args[0] 5938 if v_0_0.Op != OpConst64 { 5939 break 5940 } 5941 t := v_0_0.Type 5942 d := v_0_0.AuxInt 5943 x := v_0.Args[1] 5944 v_1 := v.Args[1] 5945 if v_1.Op != OpConst64 { 5946 break 5947 } 5948 if v_1.Type != t { 5949 break 5950 } 5951 c := v_1.AuxInt 5952 v.reset(OpAnd64) 5953 v0 := b.NewValue0(v.Pos, OpConst64, t) 5954 v0.AuxInt = c & d 5955 v.AddArg(v0) 5956 v.AddArg(x) 5957 return true 5958 } 5959 // match: (And64 (And64 x (Const64 <t> [d])) (Const64 <t> [c])) 5960 // cond: 5961 // result: (And64 (Const64 <t> [c&d]) x) 5962 for { 5963 _ = v.Args[1] 5964 v_0 := v.Args[0] 5965 if v_0.Op != OpAnd64 { 5966 break 5967 } 5968 _ = v_0.Args[1] 5969 x := v_0.Args[0] 5970 v_0_1 := v_0.Args[1] 5971 if v_0_1.Op != OpConst64 { 5972 break 5973 } 5974 t := v_0_1.Type 5975 d := v_0_1.AuxInt 5976 v_1 := v.Args[1] 5977 if v_1.Op != OpConst64 { 5978 break 5979 } 5980 if v_1.Type != t { 5981 break 5982 } 5983 c := v_1.AuxInt 5984 v.reset(OpAnd64) 5985 v0 := b.NewValue0(v.Pos, OpConst64, t) 5986 v0.AuxInt = c & d 5987 v.AddArg(v0) 5988 v.AddArg(x) 5989 return true 5990 } 5991 return false 5992 } 5993 func rewriteValuegeneric_OpAnd8_0(v *Value) bool { 5994 // match: (And8 (Const8 [c]) (Const8 [d])) 5995 // cond: 5996 // result: (Const8 [int64(int8(c&d))]) 5997 for { 5998 _ = v.Args[1] 5999 v_0 := v.Args[0] 6000 if v_0.Op != OpConst8 { 6001 break 6002 } 6003 c := v_0.AuxInt 6004 v_1 := v.Args[1] 6005 if v_1.Op != OpConst8 { 6006 break 6007 } 6008 d := v_1.AuxInt 6009 v.reset(OpConst8) 6010 v.AuxInt = int64(int8(c & d)) 6011 return true 6012 } 6013 // match: (And8 (Const8 [d]) (Const8 [c])) 6014 // cond: 6015 // result: (Const8 [int64(int8(c&d))]) 6016 for { 6017 _ = v.Args[1] 6018 v_0 := v.Args[0] 6019 if v_0.Op != OpConst8 { 6020 break 6021 } 6022 d := v_0.AuxInt 6023 v_1 := v.Args[1] 6024 if v_1.Op != OpConst8 { 6025 break 6026 } 6027 c := v_1.AuxInt 6028 v.reset(OpConst8) 6029 v.AuxInt = int64(int8(c & d)) 6030 return true 6031 } 6032 // match: (And8 x x) 6033 // cond: 6034 // result: x 6035 for { 6036 _ = v.Args[1] 6037 x := v.Args[0] 6038 if x != v.Args[1] { 6039 break 6040 } 6041 v.reset(OpCopy) 6042 v.Type = x.Type 6043 v.AddArg(x) 6044 return true 6045 } 6046 // match: (And8 (Const8 [-1]) x) 6047 // cond: 6048 // result: x 6049 for { 6050 _ = v.Args[1] 6051 v_0 := v.Args[0] 6052 if v_0.Op != OpConst8 { 6053 break 6054 } 6055 if v_0.AuxInt != -1 { 6056 break 6057 } 6058 x := v.Args[1] 6059 v.reset(OpCopy) 6060 v.Type = x.Type 6061 v.AddArg(x) 6062 return true 6063 } 6064 // match: (And8 x (Const8 [-1])) 6065 // cond: 6066 // result: x 6067 for { 6068 _ = v.Args[1] 6069 x := v.Args[0] 6070 v_1 := v.Args[1] 6071 if v_1.Op != OpConst8 { 6072 break 6073 } 6074 if v_1.AuxInt != -1 { 6075 break 6076 } 6077 v.reset(OpCopy) 6078 v.Type = x.Type 6079 v.AddArg(x) 6080 return true 6081 } 6082 // match: (And8 (Const8 [0]) _) 6083 // cond: 6084 // result: (Const8 [0]) 6085 for { 6086 _ = v.Args[1] 6087 v_0 := v.Args[0] 6088 if v_0.Op != OpConst8 { 6089 break 6090 } 6091 if v_0.AuxInt != 0 { 6092 break 6093 } 6094 v.reset(OpConst8) 6095 v.AuxInt = 0 6096 return true 6097 } 6098 // match: (And8 _ (Const8 [0])) 6099 // cond: 6100 // result: (Const8 [0]) 6101 for { 6102 _ = v.Args[1] 6103 v_1 := v.Args[1] 6104 if v_1.Op != OpConst8 { 6105 break 6106 } 6107 if v_1.AuxInt != 0 { 6108 break 6109 } 6110 v.reset(OpConst8) 6111 v.AuxInt = 0 6112 return true 6113 } 6114 // match: (And8 x (And8 x y)) 6115 // cond: 6116 // result: (And8 x y) 6117 for { 6118 _ = v.Args[1] 6119 x := v.Args[0] 6120 v_1 := v.Args[1] 6121 if v_1.Op != OpAnd8 { 6122 break 6123 } 6124 _ = v_1.Args[1] 6125 if x != v_1.Args[0] { 6126 break 6127 } 6128 y := v_1.Args[1] 6129 v.reset(OpAnd8) 6130 v.AddArg(x) 6131 v.AddArg(y) 6132 return true 6133 } 6134 // match: (And8 x (And8 y x)) 6135 // cond: 6136 // result: (And8 x y) 6137 for { 6138 _ = v.Args[1] 6139 x := v.Args[0] 6140 v_1 := v.Args[1] 6141 if v_1.Op != OpAnd8 { 6142 break 6143 } 6144 _ = v_1.Args[1] 6145 y := v_1.Args[0] 6146 if x != v_1.Args[1] { 6147 break 6148 } 6149 v.reset(OpAnd8) 6150 v.AddArg(x) 6151 v.AddArg(y) 6152 return true 6153 } 6154 // match: (And8 (And8 x y) x) 6155 // cond: 6156 // result: (And8 x y) 6157 for { 6158 _ = v.Args[1] 6159 v_0 := v.Args[0] 6160 if v_0.Op != OpAnd8 { 6161 break 6162 } 6163 _ = v_0.Args[1] 6164 x := v_0.Args[0] 6165 y := v_0.Args[1] 6166 if x != v.Args[1] { 6167 break 6168 } 6169 v.reset(OpAnd8) 6170 v.AddArg(x) 6171 v.AddArg(y) 6172 return true 6173 } 6174 return false 6175 } 6176 func rewriteValuegeneric_OpAnd8_10(v *Value) bool { 6177 b := v.Block 6178 _ = b 6179 // match: (And8 (And8 y x) x) 6180 // cond: 6181 // result: (And8 x y) 6182 for { 6183 _ = v.Args[1] 6184 v_0 := v.Args[0] 6185 if v_0.Op != OpAnd8 { 6186 break 6187 } 6188 _ = v_0.Args[1] 6189 y := v_0.Args[0] 6190 x := v_0.Args[1] 6191 if x != v.Args[1] { 6192 break 6193 } 6194 v.reset(OpAnd8) 6195 v.AddArg(x) 6196 v.AddArg(y) 6197 return true 6198 } 6199 // match: (And8 (And8 i:(Const8 <t>) z) x) 6200 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 6201 // result: (And8 i (And8 <t> z x)) 6202 for { 6203 _ = v.Args[1] 6204 v_0 := v.Args[0] 6205 if v_0.Op != OpAnd8 { 6206 break 6207 } 6208 _ = v_0.Args[1] 6209 i := v_0.Args[0] 6210 if i.Op != OpConst8 { 6211 break 6212 } 6213 t := i.Type 6214 z := v_0.Args[1] 6215 x := v.Args[1] 6216 if !(z.Op != OpConst8 && x.Op != OpConst8) { 6217 break 6218 } 6219 v.reset(OpAnd8) 6220 v.AddArg(i) 6221 v0 := b.NewValue0(v.Pos, OpAnd8, t) 6222 v0.AddArg(z) 6223 v0.AddArg(x) 6224 v.AddArg(v0) 6225 return true 6226 } 6227 // match: (And8 (And8 z i:(Const8 <t>)) x) 6228 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 6229 // result: (And8 i (And8 <t> z x)) 6230 for { 6231 _ = v.Args[1] 6232 v_0 := v.Args[0] 6233 if v_0.Op != OpAnd8 { 6234 break 6235 } 6236 _ = v_0.Args[1] 6237 z := v_0.Args[0] 6238 i := v_0.Args[1] 6239 if i.Op != OpConst8 { 6240 break 6241 } 6242 t := i.Type 6243 x := v.Args[1] 6244 if !(z.Op != OpConst8 && x.Op != OpConst8) { 6245 break 6246 } 6247 v.reset(OpAnd8) 6248 v.AddArg(i) 6249 v0 := b.NewValue0(v.Pos, OpAnd8, t) 6250 v0.AddArg(z) 6251 v0.AddArg(x) 6252 v.AddArg(v0) 6253 return true 6254 } 6255 // match: (And8 x (And8 i:(Const8 <t>) z)) 6256 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 6257 // result: (And8 i (And8 <t> z x)) 6258 for { 6259 _ = v.Args[1] 6260 x := v.Args[0] 6261 v_1 := v.Args[1] 6262 if v_1.Op != OpAnd8 { 6263 break 6264 } 6265 _ = v_1.Args[1] 6266 i := v_1.Args[0] 6267 if i.Op != OpConst8 { 6268 break 6269 } 6270 t := i.Type 6271 z := v_1.Args[1] 6272 if !(z.Op != OpConst8 && x.Op != OpConst8) { 6273 break 6274 } 6275 v.reset(OpAnd8) 6276 v.AddArg(i) 6277 v0 := b.NewValue0(v.Pos, OpAnd8, t) 6278 v0.AddArg(z) 6279 v0.AddArg(x) 6280 v.AddArg(v0) 6281 return true 6282 } 6283 // match: (And8 x (And8 z i:(Const8 <t>))) 6284 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 6285 // result: (And8 i (And8 <t> z x)) 6286 for { 6287 _ = v.Args[1] 6288 x := v.Args[0] 6289 v_1 := v.Args[1] 6290 if v_1.Op != OpAnd8 { 6291 break 6292 } 6293 _ = v_1.Args[1] 6294 z := v_1.Args[0] 6295 i := v_1.Args[1] 6296 if i.Op != OpConst8 { 6297 break 6298 } 6299 t := i.Type 6300 if !(z.Op != OpConst8 && x.Op != OpConst8) { 6301 break 6302 } 6303 v.reset(OpAnd8) 6304 v.AddArg(i) 6305 v0 := b.NewValue0(v.Pos, OpAnd8, t) 6306 v0.AddArg(z) 6307 v0.AddArg(x) 6308 v.AddArg(v0) 6309 return true 6310 } 6311 // match: (And8 (Const8 <t> [c]) (And8 (Const8 <t> [d]) x)) 6312 // cond: 6313 // result: (And8 (Const8 <t> [int64(int8(c&d))]) x) 6314 for { 6315 _ = v.Args[1] 6316 v_0 := v.Args[0] 6317 if v_0.Op != OpConst8 { 6318 break 6319 } 6320 t := v_0.Type 6321 c := v_0.AuxInt 6322 v_1 := v.Args[1] 6323 if v_1.Op != OpAnd8 { 6324 break 6325 } 6326 _ = v_1.Args[1] 6327 v_1_0 := v_1.Args[0] 6328 if v_1_0.Op != OpConst8 { 6329 break 6330 } 6331 if v_1_0.Type != t { 6332 break 6333 } 6334 d := v_1_0.AuxInt 6335 x := v_1.Args[1] 6336 v.reset(OpAnd8) 6337 v0 := b.NewValue0(v.Pos, OpConst8, t) 6338 v0.AuxInt = int64(int8(c & d)) 6339 v.AddArg(v0) 6340 v.AddArg(x) 6341 return true 6342 } 6343 // match: (And8 (Const8 <t> [c]) (And8 x (Const8 <t> [d]))) 6344 // cond: 6345 // result: (And8 (Const8 <t> [int64(int8(c&d))]) x) 6346 for { 6347 _ = v.Args[1] 6348 v_0 := v.Args[0] 6349 if v_0.Op != OpConst8 { 6350 break 6351 } 6352 t := v_0.Type 6353 c := v_0.AuxInt 6354 v_1 := v.Args[1] 6355 if v_1.Op != OpAnd8 { 6356 break 6357 } 6358 _ = v_1.Args[1] 6359 x := v_1.Args[0] 6360 v_1_1 := v_1.Args[1] 6361 if v_1_1.Op != OpConst8 { 6362 break 6363 } 6364 if v_1_1.Type != t { 6365 break 6366 } 6367 d := v_1_1.AuxInt 6368 v.reset(OpAnd8) 6369 v0 := b.NewValue0(v.Pos, OpConst8, t) 6370 v0.AuxInt = int64(int8(c & d)) 6371 v.AddArg(v0) 6372 v.AddArg(x) 6373 return true 6374 } 6375 // match: (And8 (And8 (Const8 <t> [d]) x) (Const8 <t> [c])) 6376 // cond: 6377 // result: (And8 (Const8 <t> [int64(int8(c&d))]) x) 6378 for { 6379 _ = v.Args[1] 6380 v_0 := v.Args[0] 6381 if v_0.Op != OpAnd8 { 6382 break 6383 } 6384 _ = v_0.Args[1] 6385 v_0_0 := v_0.Args[0] 6386 if v_0_0.Op != OpConst8 { 6387 break 6388 } 6389 t := v_0_0.Type 6390 d := v_0_0.AuxInt 6391 x := v_0.Args[1] 6392 v_1 := v.Args[1] 6393 if v_1.Op != OpConst8 { 6394 break 6395 } 6396 if v_1.Type != t { 6397 break 6398 } 6399 c := v_1.AuxInt 6400 v.reset(OpAnd8) 6401 v0 := b.NewValue0(v.Pos, OpConst8, t) 6402 v0.AuxInt = int64(int8(c & d)) 6403 v.AddArg(v0) 6404 v.AddArg(x) 6405 return true 6406 } 6407 // match: (And8 (And8 x (Const8 <t> [d])) (Const8 <t> [c])) 6408 // cond: 6409 // result: (And8 (Const8 <t> [int64(int8(c&d))]) x) 6410 for { 6411 _ = v.Args[1] 6412 v_0 := v.Args[0] 6413 if v_0.Op != OpAnd8 { 6414 break 6415 } 6416 _ = v_0.Args[1] 6417 x := v_0.Args[0] 6418 v_0_1 := v_0.Args[1] 6419 if v_0_1.Op != OpConst8 { 6420 break 6421 } 6422 t := v_0_1.Type 6423 d := v_0_1.AuxInt 6424 v_1 := v.Args[1] 6425 if v_1.Op != OpConst8 { 6426 break 6427 } 6428 if v_1.Type != t { 6429 break 6430 } 6431 c := v_1.AuxInt 6432 v.reset(OpAnd8) 6433 v0 := b.NewValue0(v.Pos, OpConst8, t) 6434 v0.AuxInt = int64(int8(c & d)) 6435 v.AddArg(v0) 6436 v.AddArg(x) 6437 return true 6438 } 6439 return false 6440 } 6441 func rewriteValuegeneric_OpArg_0(v *Value) bool { 6442 b := v.Block 6443 _ = b 6444 config := b.Func.Config 6445 _ = config 6446 fe := b.Func.fe 6447 _ = fe 6448 typ := &b.Func.Config.Types 6449 _ = typ 6450 // match: (Arg {n} [off]) 6451 // cond: v.Type.IsString() 6452 // result: (StringMake (Arg <typ.BytePtr> {n} [off]) (Arg <typ.Int> {n} [off+config.PtrSize])) 6453 for { 6454 off := v.AuxInt 6455 n := v.Aux 6456 if !(v.Type.IsString()) { 6457 break 6458 } 6459 v.reset(OpStringMake) 6460 v0 := b.NewValue0(v.Pos, OpArg, typ.BytePtr) 6461 v0.AuxInt = off 6462 v0.Aux = n 6463 v.AddArg(v0) 6464 v1 := b.NewValue0(v.Pos, OpArg, typ.Int) 6465 v1.AuxInt = off + config.PtrSize 6466 v1.Aux = n 6467 v.AddArg(v1) 6468 return true 6469 } 6470 // match: (Arg {n} [off]) 6471 // cond: v.Type.IsSlice() 6472 // result: (SliceMake (Arg <v.Type.ElemType().PtrTo()> {n} [off]) (Arg <typ.Int> {n} [off+config.PtrSize]) (Arg <typ.Int> {n} [off+2*config.PtrSize])) 6473 for { 6474 off := v.AuxInt 6475 n := v.Aux 6476 if !(v.Type.IsSlice()) { 6477 break 6478 } 6479 v.reset(OpSliceMake) 6480 v0 := b.NewValue0(v.Pos, OpArg, v.Type.ElemType().PtrTo()) 6481 v0.AuxInt = off 6482 v0.Aux = n 6483 v.AddArg(v0) 6484 v1 := b.NewValue0(v.Pos, OpArg, typ.Int) 6485 v1.AuxInt = off + config.PtrSize 6486 v1.Aux = n 6487 v.AddArg(v1) 6488 v2 := b.NewValue0(v.Pos, OpArg, typ.Int) 6489 v2.AuxInt = off + 2*config.PtrSize 6490 v2.Aux = n 6491 v.AddArg(v2) 6492 return true 6493 } 6494 // match: (Arg {n} [off]) 6495 // cond: v.Type.IsInterface() 6496 // result: (IMake (Arg <typ.BytePtr> {n} [off]) (Arg <typ.BytePtr> {n} [off+config.PtrSize])) 6497 for { 6498 off := v.AuxInt 6499 n := v.Aux 6500 if !(v.Type.IsInterface()) { 6501 break 6502 } 6503 v.reset(OpIMake) 6504 v0 := b.NewValue0(v.Pos, OpArg, typ.BytePtr) 6505 v0.AuxInt = off 6506 v0.Aux = n 6507 v.AddArg(v0) 6508 v1 := b.NewValue0(v.Pos, OpArg, typ.BytePtr) 6509 v1.AuxInt = off + config.PtrSize 6510 v1.Aux = n 6511 v.AddArg(v1) 6512 return true 6513 } 6514 // match: (Arg {n} [off]) 6515 // cond: v.Type.IsComplex() && v.Type.Size() == 16 6516 // result: (ComplexMake (Arg <typ.Float64> {n} [off]) (Arg <typ.Float64> {n} [off+8])) 6517 for { 6518 off := v.AuxInt 6519 n := v.Aux 6520 if !(v.Type.IsComplex() && v.Type.Size() == 16) { 6521 break 6522 } 6523 v.reset(OpComplexMake) 6524 v0 := b.NewValue0(v.Pos, OpArg, typ.Float64) 6525 v0.AuxInt = off 6526 v0.Aux = n 6527 v.AddArg(v0) 6528 v1 := b.NewValue0(v.Pos, OpArg, typ.Float64) 6529 v1.AuxInt = off + 8 6530 v1.Aux = n 6531 v.AddArg(v1) 6532 return true 6533 } 6534 // match: (Arg {n} [off]) 6535 // cond: v.Type.IsComplex() && v.Type.Size() == 8 6536 // result: (ComplexMake (Arg <typ.Float32> {n} [off]) (Arg <typ.Float32> {n} [off+4])) 6537 for { 6538 off := v.AuxInt 6539 n := v.Aux 6540 if !(v.Type.IsComplex() && v.Type.Size() == 8) { 6541 break 6542 } 6543 v.reset(OpComplexMake) 6544 v0 := b.NewValue0(v.Pos, OpArg, typ.Float32) 6545 v0.AuxInt = off 6546 v0.Aux = n 6547 v.AddArg(v0) 6548 v1 := b.NewValue0(v.Pos, OpArg, typ.Float32) 6549 v1.AuxInt = off + 4 6550 v1.Aux = n 6551 v.AddArg(v1) 6552 return true 6553 } 6554 // match: (Arg <t>) 6555 // cond: t.IsStruct() && t.NumFields() == 0 && fe.CanSSA(t) 6556 // result: (StructMake0) 6557 for { 6558 t := v.Type 6559 if !(t.IsStruct() && t.NumFields() == 0 && fe.CanSSA(t)) { 6560 break 6561 } 6562 v.reset(OpStructMake0) 6563 return true 6564 } 6565 // match: (Arg <t> {n} [off]) 6566 // cond: t.IsStruct() && t.NumFields() == 1 && fe.CanSSA(t) 6567 // result: (StructMake1 (Arg <t.FieldType(0)> {n} [off+t.FieldOff(0)])) 6568 for { 6569 t := v.Type 6570 off := v.AuxInt 6571 n := v.Aux 6572 if !(t.IsStruct() && t.NumFields() == 1 && fe.CanSSA(t)) { 6573 break 6574 } 6575 v.reset(OpStructMake1) 6576 v0 := b.NewValue0(v.Pos, OpArg, t.FieldType(0)) 6577 v0.AuxInt = off + t.FieldOff(0) 6578 v0.Aux = n 6579 v.AddArg(v0) 6580 return true 6581 } 6582 // match: (Arg <t> {n} [off]) 6583 // cond: t.IsStruct() && t.NumFields() == 2 && fe.CanSSA(t) 6584 // result: (StructMake2 (Arg <t.FieldType(0)> {n} [off+t.FieldOff(0)]) (Arg <t.FieldType(1)> {n} [off+t.FieldOff(1)])) 6585 for { 6586 t := v.Type 6587 off := v.AuxInt 6588 n := v.Aux 6589 if !(t.IsStruct() && t.NumFields() == 2 && fe.CanSSA(t)) { 6590 break 6591 } 6592 v.reset(OpStructMake2) 6593 v0 := b.NewValue0(v.Pos, OpArg, t.FieldType(0)) 6594 v0.AuxInt = off + t.FieldOff(0) 6595 v0.Aux = n 6596 v.AddArg(v0) 6597 v1 := b.NewValue0(v.Pos, OpArg, t.FieldType(1)) 6598 v1.AuxInt = off + t.FieldOff(1) 6599 v1.Aux = n 6600 v.AddArg(v1) 6601 return true 6602 } 6603 // match: (Arg <t> {n} [off]) 6604 // cond: t.IsStruct() && t.NumFields() == 3 && fe.CanSSA(t) 6605 // result: (StructMake3 (Arg <t.FieldType(0)> {n} [off+t.FieldOff(0)]) (Arg <t.FieldType(1)> {n} [off+t.FieldOff(1)]) (Arg <t.FieldType(2)> {n} [off+t.FieldOff(2)])) 6606 for { 6607 t := v.Type 6608 off := v.AuxInt 6609 n := v.Aux 6610 if !(t.IsStruct() && t.NumFields() == 3 && fe.CanSSA(t)) { 6611 break 6612 } 6613 v.reset(OpStructMake3) 6614 v0 := b.NewValue0(v.Pos, OpArg, t.FieldType(0)) 6615 v0.AuxInt = off + t.FieldOff(0) 6616 v0.Aux = n 6617 v.AddArg(v0) 6618 v1 := b.NewValue0(v.Pos, OpArg, t.FieldType(1)) 6619 v1.AuxInt = off + t.FieldOff(1) 6620 v1.Aux = n 6621 v.AddArg(v1) 6622 v2 := b.NewValue0(v.Pos, OpArg, t.FieldType(2)) 6623 v2.AuxInt = off + t.FieldOff(2) 6624 v2.Aux = n 6625 v.AddArg(v2) 6626 return true 6627 } 6628 // match: (Arg <t> {n} [off]) 6629 // cond: t.IsStruct() && t.NumFields() == 4 && fe.CanSSA(t) 6630 // result: (StructMake4 (Arg <t.FieldType(0)> {n} [off+t.FieldOff(0)]) (Arg <t.FieldType(1)> {n} [off+t.FieldOff(1)]) (Arg <t.FieldType(2)> {n} [off+t.FieldOff(2)]) (Arg <t.FieldType(3)> {n} [off+t.FieldOff(3)])) 6631 for { 6632 t := v.Type 6633 off := v.AuxInt 6634 n := v.Aux 6635 if !(t.IsStruct() && t.NumFields() == 4 && fe.CanSSA(t)) { 6636 break 6637 } 6638 v.reset(OpStructMake4) 6639 v0 := b.NewValue0(v.Pos, OpArg, t.FieldType(0)) 6640 v0.AuxInt = off + t.FieldOff(0) 6641 v0.Aux = n 6642 v.AddArg(v0) 6643 v1 := b.NewValue0(v.Pos, OpArg, t.FieldType(1)) 6644 v1.AuxInt = off + t.FieldOff(1) 6645 v1.Aux = n 6646 v.AddArg(v1) 6647 v2 := b.NewValue0(v.Pos, OpArg, t.FieldType(2)) 6648 v2.AuxInt = off + t.FieldOff(2) 6649 v2.Aux = n 6650 v.AddArg(v2) 6651 v3 := b.NewValue0(v.Pos, OpArg, t.FieldType(3)) 6652 v3.AuxInt = off + t.FieldOff(3) 6653 v3.Aux = n 6654 v.AddArg(v3) 6655 return true 6656 } 6657 return false 6658 } 6659 func rewriteValuegeneric_OpArg_10(v *Value) bool { 6660 b := v.Block 6661 _ = b 6662 fe := b.Func.fe 6663 _ = fe 6664 // match: (Arg <t>) 6665 // cond: t.IsArray() && t.NumElem() == 0 6666 // result: (ArrayMake0) 6667 for { 6668 t := v.Type 6669 if !(t.IsArray() && t.NumElem() == 0) { 6670 break 6671 } 6672 v.reset(OpArrayMake0) 6673 return true 6674 } 6675 // match: (Arg <t> {n} [off]) 6676 // cond: t.IsArray() && t.NumElem() == 1 && fe.CanSSA(t) 6677 // result: (ArrayMake1 (Arg <t.ElemType()> {n} [off])) 6678 for { 6679 t := v.Type 6680 off := v.AuxInt 6681 n := v.Aux 6682 if !(t.IsArray() && t.NumElem() == 1 && fe.CanSSA(t)) { 6683 break 6684 } 6685 v.reset(OpArrayMake1) 6686 v0 := b.NewValue0(v.Pos, OpArg, t.ElemType()) 6687 v0.AuxInt = off 6688 v0.Aux = n 6689 v.AddArg(v0) 6690 return true 6691 } 6692 return false 6693 } 6694 func rewriteValuegeneric_OpArraySelect_0(v *Value) bool { 6695 // match: (ArraySelect (ArrayMake1 x)) 6696 // cond: 6697 // result: x 6698 for { 6699 v_0 := v.Args[0] 6700 if v_0.Op != OpArrayMake1 { 6701 break 6702 } 6703 x := v_0.Args[0] 6704 v.reset(OpCopy) 6705 v.Type = x.Type 6706 v.AddArg(x) 6707 return true 6708 } 6709 // match: (ArraySelect [0] x:(IData _)) 6710 // cond: 6711 // result: x 6712 for { 6713 if v.AuxInt != 0 { 6714 break 6715 } 6716 x := v.Args[0] 6717 if x.Op != OpIData { 6718 break 6719 } 6720 v.reset(OpCopy) 6721 v.Type = x.Type 6722 v.AddArg(x) 6723 return true 6724 } 6725 return false 6726 } 6727 func rewriteValuegeneric_OpCom16_0(v *Value) bool { 6728 // match: (Com16 (Com16 x)) 6729 // cond: 6730 // result: x 6731 for { 6732 v_0 := v.Args[0] 6733 if v_0.Op != OpCom16 { 6734 break 6735 } 6736 x := v_0.Args[0] 6737 v.reset(OpCopy) 6738 v.Type = x.Type 6739 v.AddArg(x) 6740 return true 6741 } 6742 // match: (Com16 (Const16 [c])) 6743 // cond: 6744 // result: (Const16 [^c]) 6745 for { 6746 v_0 := v.Args[0] 6747 if v_0.Op != OpConst16 { 6748 break 6749 } 6750 c := v_0.AuxInt 6751 v.reset(OpConst16) 6752 v.AuxInt = ^c 6753 return true 6754 } 6755 return false 6756 } 6757 func rewriteValuegeneric_OpCom32_0(v *Value) bool { 6758 // match: (Com32 (Com32 x)) 6759 // cond: 6760 // result: x 6761 for { 6762 v_0 := v.Args[0] 6763 if v_0.Op != OpCom32 { 6764 break 6765 } 6766 x := v_0.Args[0] 6767 v.reset(OpCopy) 6768 v.Type = x.Type 6769 v.AddArg(x) 6770 return true 6771 } 6772 // match: (Com32 (Const32 [c])) 6773 // cond: 6774 // result: (Const32 [^c]) 6775 for { 6776 v_0 := v.Args[0] 6777 if v_0.Op != OpConst32 { 6778 break 6779 } 6780 c := v_0.AuxInt 6781 v.reset(OpConst32) 6782 v.AuxInt = ^c 6783 return true 6784 } 6785 return false 6786 } 6787 func rewriteValuegeneric_OpCom64_0(v *Value) bool { 6788 // match: (Com64 (Com64 x)) 6789 // cond: 6790 // result: x 6791 for { 6792 v_0 := v.Args[0] 6793 if v_0.Op != OpCom64 { 6794 break 6795 } 6796 x := v_0.Args[0] 6797 v.reset(OpCopy) 6798 v.Type = x.Type 6799 v.AddArg(x) 6800 return true 6801 } 6802 // match: (Com64 (Const64 [c])) 6803 // cond: 6804 // result: (Const64 [^c]) 6805 for { 6806 v_0 := v.Args[0] 6807 if v_0.Op != OpConst64 { 6808 break 6809 } 6810 c := v_0.AuxInt 6811 v.reset(OpConst64) 6812 v.AuxInt = ^c 6813 return true 6814 } 6815 return false 6816 } 6817 func rewriteValuegeneric_OpCom8_0(v *Value) bool { 6818 // match: (Com8 (Com8 x)) 6819 // cond: 6820 // result: x 6821 for { 6822 v_0 := v.Args[0] 6823 if v_0.Op != OpCom8 { 6824 break 6825 } 6826 x := v_0.Args[0] 6827 v.reset(OpCopy) 6828 v.Type = x.Type 6829 v.AddArg(x) 6830 return true 6831 } 6832 // match: (Com8 (Const8 [c])) 6833 // cond: 6834 // result: (Const8 [^c]) 6835 for { 6836 v_0 := v.Args[0] 6837 if v_0.Op != OpConst8 { 6838 break 6839 } 6840 c := v_0.AuxInt 6841 v.reset(OpConst8) 6842 v.AuxInt = ^c 6843 return true 6844 } 6845 return false 6846 } 6847 func rewriteValuegeneric_OpConstInterface_0(v *Value) bool { 6848 b := v.Block 6849 _ = b 6850 typ := &b.Func.Config.Types 6851 _ = typ 6852 // match: (ConstInterface) 6853 // cond: 6854 // result: (IMake (ConstNil <typ.BytePtr>) (ConstNil <typ.BytePtr>)) 6855 for { 6856 v.reset(OpIMake) 6857 v0 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr) 6858 v.AddArg(v0) 6859 v1 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr) 6860 v.AddArg(v1) 6861 return true 6862 } 6863 } 6864 func rewriteValuegeneric_OpConstSlice_0(v *Value) bool { 6865 b := v.Block 6866 _ = b 6867 config := b.Func.Config 6868 _ = config 6869 typ := &b.Func.Config.Types 6870 _ = typ 6871 // match: (ConstSlice) 6872 // cond: config.PtrSize == 4 6873 // result: (SliceMake (ConstNil <v.Type.ElemType().PtrTo()>) (Const32 <typ.Int> [0]) (Const32 <typ.Int> [0])) 6874 for { 6875 if !(config.PtrSize == 4) { 6876 break 6877 } 6878 v.reset(OpSliceMake) 6879 v0 := b.NewValue0(v.Pos, OpConstNil, v.Type.ElemType().PtrTo()) 6880 v.AddArg(v0) 6881 v1 := b.NewValue0(v.Pos, OpConst32, typ.Int) 6882 v1.AuxInt = 0 6883 v.AddArg(v1) 6884 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int) 6885 v2.AuxInt = 0 6886 v.AddArg(v2) 6887 return true 6888 } 6889 // match: (ConstSlice) 6890 // cond: config.PtrSize == 8 6891 // result: (SliceMake (ConstNil <v.Type.ElemType().PtrTo()>) (Const64 <typ.Int> [0]) (Const64 <typ.Int> [0])) 6892 for { 6893 if !(config.PtrSize == 8) { 6894 break 6895 } 6896 v.reset(OpSliceMake) 6897 v0 := b.NewValue0(v.Pos, OpConstNil, v.Type.ElemType().PtrTo()) 6898 v.AddArg(v0) 6899 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int) 6900 v1.AuxInt = 0 6901 v.AddArg(v1) 6902 v2 := b.NewValue0(v.Pos, OpConst64, typ.Int) 6903 v2.AuxInt = 0 6904 v.AddArg(v2) 6905 return true 6906 } 6907 return false 6908 } 6909 func rewriteValuegeneric_OpConstString_0(v *Value) bool { 6910 b := v.Block 6911 _ = b 6912 config := b.Func.Config 6913 _ = config 6914 fe := b.Func.fe 6915 _ = fe 6916 typ := &b.Func.Config.Types 6917 _ = typ 6918 // match: (ConstString {s}) 6919 // cond: config.PtrSize == 4 && s.(string) == "" 6920 // result: (StringMake (ConstNil) (Const32 <typ.Int> [0])) 6921 for { 6922 s := v.Aux 6923 if !(config.PtrSize == 4 && s.(string) == "") { 6924 break 6925 } 6926 v.reset(OpStringMake) 6927 v0 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr) 6928 v.AddArg(v0) 6929 v1 := b.NewValue0(v.Pos, OpConst32, typ.Int) 6930 v1.AuxInt = 0 6931 v.AddArg(v1) 6932 return true 6933 } 6934 // match: (ConstString {s}) 6935 // cond: config.PtrSize == 8 && s.(string) == "" 6936 // result: (StringMake (ConstNil) (Const64 <typ.Int> [0])) 6937 for { 6938 s := v.Aux 6939 if !(config.PtrSize == 8 && s.(string) == "") { 6940 break 6941 } 6942 v.reset(OpStringMake) 6943 v0 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr) 6944 v.AddArg(v0) 6945 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int) 6946 v1.AuxInt = 0 6947 v.AddArg(v1) 6948 return true 6949 } 6950 // match: (ConstString {s}) 6951 // cond: config.PtrSize == 4 && s.(string) != "" 6952 // result: (StringMake (Addr <typ.BytePtr> {fe.StringData(s.(string))} (SB)) (Const32 <typ.Int> [int64(len(s.(string)))])) 6953 for { 6954 s := v.Aux 6955 if !(config.PtrSize == 4 && s.(string) != "") { 6956 break 6957 } 6958 v.reset(OpStringMake) 6959 v0 := b.NewValue0(v.Pos, OpAddr, typ.BytePtr) 6960 v0.Aux = fe.StringData(s.(string)) 6961 v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr) 6962 v0.AddArg(v1) 6963 v.AddArg(v0) 6964 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int) 6965 v2.AuxInt = int64(len(s.(string))) 6966 v.AddArg(v2) 6967 return true 6968 } 6969 // match: (ConstString {s}) 6970 // cond: config.PtrSize == 8 && s.(string) != "" 6971 // result: (StringMake (Addr <typ.BytePtr> {fe.StringData(s.(string))} (SB)) (Const64 <typ.Int> [int64(len(s.(string)))])) 6972 for { 6973 s := v.Aux 6974 if !(config.PtrSize == 8 && s.(string) != "") { 6975 break 6976 } 6977 v.reset(OpStringMake) 6978 v0 := b.NewValue0(v.Pos, OpAddr, typ.BytePtr) 6979 v0.Aux = fe.StringData(s.(string)) 6980 v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr) 6981 v0.AddArg(v1) 6982 v.AddArg(v0) 6983 v2 := b.NewValue0(v.Pos, OpConst64, typ.Int) 6984 v2.AuxInt = int64(len(s.(string))) 6985 v.AddArg(v2) 6986 return true 6987 } 6988 return false 6989 } 6990 func rewriteValuegeneric_OpConvert_0(v *Value) bool { 6991 // match: (Convert (Add64 (Convert ptr mem) off) mem) 6992 // cond: 6993 // result: (Add64 ptr off) 6994 for { 6995 _ = v.Args[1] 6996 v_0 := v.Args[0] 6997 if v_0.Op != OpAdd64 { 6998 break 6999 } 7000 _ = v_0.Args[1] 7001 v_0_0 := v_0.Args[0] 7002 if v_0_0.Op != OpConvert { 7003 break 7004 } 7005 _ = v_0_0.Args[1] 7006 ptr := v_0_0.Args[0] 7007 mem := v_0_0.Args[1] 7008 off := v_0.Args[1] 7009 if mem != v.Args[1] { 7010 break 7011 } 7012 v.reset(OpAdd64) 7013 v.AddArg(ptr) 7014 v.AddArg(off) 7015 return true 7016 } 7017 // match: (Convert (Add64 off (Convert ptr mem)) mem) 7018 // cond: 7019 // result: (Add64 ptr off) 7020 for { 7021 _ = v.Args[1] 7022 v_0 := v.Args[0] 7023 if v_0.Op != OpAdd64 { 7024 break 7025 } 7026 _ = v_0.Args[1] 7027 off := v_0.Args[0] 7028 v_0_1 := v_0.Args[1] 7029 if v_0_1.Op != OpConvert { 7030 break 7031 } 7032 _ = v_0_1.Args[1] 7033 ptr := v_0_1.Args[0] 7034 mem := v_0_1.Args[1] 7035 if mem != v.Args[1] { 7036 break 7037 } 7038 v.reset(OpAdd64) 7039 v.AddArg(ptr) 7040 v.AddArg(off) 7041 return true 7042 } 7043 // match: (Convert (Convert ptr mem) mem) 7044 // cond: 7045 // result: ptr 7046 for { 7047 _ = v.Args[1] 7048 v_0 := v.Args[0] 7049 if v_0.Op != OpConvert { 7050 break 7051 } 7052 _ = v_0.Args[1] 7053 ptr := v_0.Args[0] 7054 mem := v_0.Args[1] 7055 if mem != v.Args[1] { 7056 break 7057 } 7058 v.reset(OpCopy) 7059 v.Type = ptr.Type 7060 v.AddArg(ptr) 7061 return true 7062 } 7063 return false 7064 } 7065 func rewriteValuegeneric_OpCvt32Fto32_0(v *Value) bool { 7066 // match: (Cvt32Fto32 (Const32F [c])) 7067 // cond: 7068 // result: (Const32 [int64(int32(i2f(c)))]) 7069 for { 7070 v_0 := v.Args[0] 7071 if v_0.Op != OpConst32F { 7072 break 7073 } 7074 c := v_0.AuxInt 7075 v.reset(OpConst32) 7076 v.AuxInt = int64(int32(i2f(c))) 7077 return true 7078 } 7079 return false 7080 } 7081 func rewriteValuegeneric_OpCvt32Fto64_0(v *Value) bool { 7082 // match: (Cvt32Fto64 (Const32F [c])) 7083 // cond: 7084 // result: (Const64 [int64(i2f(c))]) 7085 for { 7086 v_0 := v.Args[0] 7087 if v_0.Op != OpConst32F { 7088 break 7089 } 7090 c := v_0.AuxInt 7091 v.reset(OpConst64) 7092 v.AuxInt = int64(i2f(c)) 7093 return true 7094 } 7095 return false 7096 } 7097 func rewriteValuegeneric_OpCvt32Fto64F_0(v *Value) bool { 7098 // match: (Cvt32Fto64F (Const32F [c])) 7099 // cond: 7100 // result: (Const64F [c]) 7101 for { 7102 v_0 := v.Args[0] 7103 if v_0.Op != OpConst32F { 7104 break 7105 } 7106 c := v_0.AuxInt 7107 v.reset(OpConst64F) 7108 v.AuxInt = c 7109 return true 7110 } 7111 return false 7112 } 7113 func rewriteValuegeneric_OpCvt32to32F_0(v *Value) bool { 7114 // match: (Cvt32to32F (Const32 [c])) 7115 // cond: 7116 // result: (Const32F [f2i(float64(float32(int32(c))))]) 7117 for { 7118 v_0 := v.Args[0] 7119 if v_0.Op != OpConst32 { 7120 break 7121 } 7122 c := v_0.AuxInt 7123 v.reset(OpConst32F) 7124 v.AuxInt = f2i(float64(float32(int32(c)))) 7125 return true 7126 } 7127 return false 7128 } 7129 func rewriteValuegeneric_OpCvt32to64F_0(v *Value) bool { 7130 // match: (Cvt32to64F (Const32 [c])) 7131 // cond: 7132 // result: (Const64F [f2i(float64(int32(c)))]) 7133 for { 7134 v_0 := v.Args[0] 7135 if v_0.Op != OpConst32 { 7136 break 7137 } 7138 c := v_0.AuxInt 7139 v.reset(OpConst64F) 7140 v.AuxInt = f2i(float64(int32(c))) 7141 return true 7142 } 7143 return false 7144 } 7145 func rewriteValuegeneric_OpCvt64Fto32_0(v *Value) bool { 7146 // match: (Cvt64Fto32 (Const64F [c])) 7147 // cond: 7148 // result: (Const32 [int64(int32(i2f(c)))]) 7149 for { 7150 v_0 := v.Args[0] 7151 if v_0.Op != OpConst64F { 7152 break 7153 } 7154 c := v_0.AuxInt 7155 v.reset(OpConst32) 7156 v.AuxInt = int64(int32(i2f(c))) 7157 return true 7158 } 7159 return false 7160 } 7161 func rewriteValuegeneric_OpCvt64Fto32F_0(v *Value) bool { 7162 // match: (Cvt64Fto32F (Const64F [c])) 7163 // cond: 7164 // result: (Const32F [f2i(float64(i2f32(c)))]) 7165 for { 7166 v_0 := v.Args[0] 7167 if v_0.Op != OpConst64F { 7168 break 7169 } 7170 c := v_0.AuxInt 7171 v.reset(OpConst32F) 7172 v.AuxInt = f2i(float64(i2f32(c))) 7173 return true 7174 } 7175 return false 7176 } 7177 func rewriteValuegeneric_OpCvt64Fto64_0(v *Value) bool { 7178 // match: (Cvt64Fto64 (Const64F [c])) 7179 // cond: 7180 // result: (Const64 [int64(i2f(c))]) 7181 for { 7182 v_0 := v.Args[0] 7183 if v_0.Op != OpConst64F { 7184 break 7185 } 7186 c := v_0.AuxInt 7187 v.reset(OpConst64) 7188 v.AuxInt = int64(i2f(c)) 7189 return true 7190 } 7191 return false 7192 } 7193 func rewriteValuegeneric_OpCvt64to32F_0(v *Value) bool { 7194 // match: (Cvt64to32F (Const64 [c])) 7195 // cond: 7196 // result: (Const32F [f2i(float64(float32(c)))]) 7197 for { 7198 v_0 := v.Args[0] 7199 if v_0.Op != OpConst64 { 7200 break 7201 } 7202 c := v_0.AuxInt 7203 v.reset(OpConst32F) 7204 v.AuxInt = f2i(float64(float32(c))) 7205 return true 7206 } 7207 return false 7208 } 7209 func rewriteValuegeneric_OpCvt64to64F_0(v *Value) bool { 7210 // match: (Cvt64to64F (Const64 [c])) 7211 // cond: 7212 // result: (Const64F [f2i(float64(c))]) 7213 for { 7214 v_0 := v.Args[0] 7215 if v_0.Op != OpConst64 { 7216 break 7217 } 7218 c := v_0.AuxInt 7219 v.reset(OpConst64F) 7220 v.AuxInt = f2i(float64(c)) 7221 return true 7222 } 7223 return false 7224 } 7225 func rewriteValuegeneric_OpDiv16_0(v *Value) bool { 7226 b := v.Block 7227 _ = b 7228 typ := &b.Func.Config.Types 7229 _ = typ 7230 // match: (Div16 (Const16 [c]) (Const16 [d])) 7231 // cond: d != 0 7232 // result: (Const16 [int64(int16(c)/int16(d))]) 7233 for { 7234 _ = v.Args[1] 7235 v_0 := v.Args[0] 7236 if v_0.Op != OpConst16 { 7237 break 7238 } 7239 c := v_0.AuxInt 7240 v_1 := v.Args[1] 7241 if v_1.Op != OpConst16 { 7242 break 7243 } 7244 d := v_1.AuxInt 7245 if !(d != 0) { 7246 break 7247 } 7248 v.reset(OpConst16) 7249 v.AuxInt = int64(int16(c) / int16(d)) 7250 return true 7251 } 7252 // match: (Div16 n (Const16 [c])) 7253 // cond: isNonNegative(n) && isPowerOfTwo(c&0xffff) 7254 // result: (Rsh16Ux64 n (Const64 <typ.UInt64> [log2(c&0xffff)])) 7255 for { 7256 _ = v.Args[1] 7257 n := v.Args[0] 7258 v_1 := v.Args[1] 7259 if v_1.Op != OpConst16 { 7260 break 7261 } 7262 c := v_1.AuxInt 7263 if !(isNonNegative(n) && isPowerOfTwo(c&0xffff)) { 7264 break 7265 } 7266 v.reset(OpRsh16Ux64) 7267 v.AddArg(n) 7268 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7269 v0.AuxInt = log2(c & 0xffff) 7270 v.AddArg(v0) 7271 return true 7272 } 7273 // match: (Div16 <t> n (Const16 [c])) 7274 // cond: c < 0 && c != -1<<15 7275 // result: (Neg16 (Div16 <t> n (Const16 <t> [-c]))) 7276 for { 7277 t := v.Type 7278 _ = v.Args[1] 7279 n := v.Args[0] 7280 v_1 := v.Args[1] 7281 if v_1.Op != OpConst16 { 7282 break 7283 } 7284 c := v_1.AuxInt 7285 if !(c < 0 && c != -1<<15) { 7286 break 7287 } 7288 v.reset(OpNeg16) 7289 v0 := b.NewValue0(v.Pos, OpDiv16, t) 7290 v0.AddArg(n) 7291 v1 := b.NewValue0(v.Pos, OpConst16, t) 7292 v1.AuxInt = -c 7293 v0.AddArg(v1) 7294 v.AddArg(v0) 7295 return true 7296 } 7297 // match: (Div16 <t> x (Const16 [-1<<15])) 7298 // cond: 7299 // result: (Rsh16Ux64 (And16 <t> x (Neg16 <t> x)) (Const64 <typ.UInt64> [15])) 7300 for { 7301 t := v.Type 7302 _ = v.Args[1] 7303 x := v.Args[0] 7304 v_1 := v.Args[1] 7305 if v_1.Op != OpConst16 { 7306 break 7307 } 7308 if v_1.AuxInt != -1<<15 { 7309 break 7310 } 7311 v.reset(OpRsh16Ux64) 7312 v0 := b.NewValue0(v.Pos, OpAnd16, t) 7313 v0.AddArg(x) 7314 v1 := b.NewValue0(v.Pos, OpNeg16, t) 7315 v1.AddArg(x) 7316 v0.AddArg(v1) 7317 v.AddArg(v0) 7318 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7319 v2.AuxInt = 15 7320 v.AddArg(v2) 7321 return true 7322 } 7323 // match: (Div16 <t> n (Const16 [c])) 7324 // cond: isPowerOfTwo(c) 7325 // result: (Rsh16x64 (Add16 <t> n (Rsh16Ux64 <t> (Rsh16x64 <t> n (Const64 <typ.UInt64> [15])) (Const64 <typ.UInt64> [16-log2(c)]))) (Const64 <typ.UInt64> [log2(c)])) 7326 for { 7327 t := v.Type 7328 _ = v.Args[1] 7329 n := v.Args[0] 7330 v_1 := v.Args[1] 7331 if v_1.Op != OpConst16 { 7332 break 7333 } 7334 c := v_1.AuxInt 7335 if !(isPowerOfTwo(c)) { 7336 break 7337 } 7338 v.reset(OpRsh16x64) 7339 v0 := b.NewValue0(v.Pos, OpAdd16, t) 7340 v0.AddArg(n) 7341 v1 := b.NewValue0(v.Pos, OpRsh16Ux64, t) 7342 v2 := b.NewValue0(v.Pos, OpRsh16x64, t) 7343 v2.AddArg(n) 7344 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7345 v3.AuxInt = 15 7346 v2.AddArg(v3) 7347 v1.AddArg(v2) 7348 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7349 v4.AuxInt = 16 - log2(c) 7350 v1.AddArg(v4) 7351 v0.AddArg(v1) 7352 v.AddArg(v0) 7353 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7354 v5.AuxInt = log2(c) 7355 v.AddArg(v5) 7356 return true 7357 } 7358 // match: (Div16 <t> x (Const16 [c])) 7359 // cond: smagicOK(16,c) 7360 // result: (Sub16 <t> (Rsh32x64 <t> (Mul32 <typ.UInt32> (Const32 <typ.UInt32> [int64(smagic(16,c).m)]) (SignExt16to32 x)) (Const64 <typ.UInt64> [16+smagic(16,c).s])) (Rsh32x64 <t> (SignExt16to32 x) (Const64 <typ.UInt64> [31]))) 7361 for { 7362 t := v.Type 7363 _ = v.Args[1] 7364 x := v.Args[0] 7365 v_1 := v.Args[1] 7366 if v_1.Op != OpConst16 { 7367 break 7368 } 7369 c := v_1.AuxInt 7370 if !(smagicOK(16, c)) { 7371 break 7372 } 7373 v.reset(OpSub16) 7374 v.Type = t 7375 v0 := b.NewValue0(v.Pos, OpRsh32x64, t) 7376 v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) 7377 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 7378 v2.AuxInt = int64(smagic(16, c).m) 7379 v1.AddArg(v2) 7380 v3 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 7381 v3.AddArg(x) 7382 v1.AddArg(v3) 7383 v0.AddArg(v1) 7384 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7385 v4.AuxInt = 16 + smagic(16, c).s 7386 v0.AddArg(v4) 7387 v.AddArg(v0) 7388 v5 := b.NewValue0(v.Pos, OpRsh32x64, t) 7389 v6 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 7390 v6.AddArg(x) 7391 v5.AddArg(v6) 7392 v7 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7393 v7.AuxInt = 31 7394 v5.AddArg(v7) 7395 v.AddArg(v5) 7396 return true 7397 } 7398 return false 7399 } 7400 func rewriteValuegeneric_OpDiv16u_0(v *Value) bool { 7401 b := v.Block 7402 _ = b 7403 config := b.Func.Config 7404 _ = config 7405 typ := &b.Func.Config.Types 7406 _ = typ 7407 // match: (Div16u (Const16 [c]) (Const16 [d])) 7408 // cond: d != 0 7409 // result: (Const16 [int64(int16(uint16(c)/uint16(d)))]) 7410 for { 7411 _ = v.Args[1] 7412 v_0 := v.Args[0] 7413 if v_0.Op != OpConst16 { 7414 break 7415 } 7416 c := v_0.AuxInt 7417 v_1 := v.Args[1] 7418 if v_1.Op != OpConst16 { 7419 break 7420 } 7421 d := v_1.AuxInt 7422 if !(d != 0) { 7423 break 7424 } 7425 v.reset(OpConst16) 7426 v.AuxInt = int64(int16(uint16(c) / uint16(d))) 7427 return true 7428 } 7429 // match: (Div16u n (Const16 [c])) 7430 // cond: isPowerOfTwo(c&0xffff) 7431 // result: (Rsh16Ux64 n (Const64 <typ.UInt64> [log2(c&0xffff)])) 7432 for { 7433 _ = v.Args[1] 7434 n := v.Args[0] 7435 v_1 := v.Args[1] 7436 if v_1.Op != OpConst16 { 7437 break 7438 } 7439 c := v_1.AuxInt 7440 if !(isPowerOfTwo(c & 0xffff)) { 7441 break 7442 } 7443 v.reset(OpRsh16Ux64) 7444 v.AddArg(n) 7445 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7446 v0.AuxInt = log2(c & 0xffff) 7447 v.AddArg(v0) 7448 return true 7449 } 7450 // match: (Div16u x (Const16 [c])) 7451 // cond: umagicOK(16, c) && config.RegSize == 8 7452 // result: (Trunc64to16 (Rsh64Ux64 <typ.UInt64> (Mul64 <typ.UInt64> (Const64 <typ.UInt64> [int64(1<<16+umagic(16,c).m)]) (ZeroExt16to64 x)) (Const64 <typ.UInt64> [16+umagic(16,c).s]))) 7453 for { 7454 _ = v.Args[1] 7455 x := v.Args[0] 7456 v_1 := v.Args[1] 7457 if v_1.Op != OpConst16 { 7458 break 7459 } 7460 c := v_1.AuxInt 7461 if !(umagicOK(16, c) && config.RegSize == 8) { 7462 break 7463 } 7464 v.reset(OpTrunc64to16) 7465 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64) 7466 v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) 7467 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7468 v2.AuxInt = int64(1<<16 + umagic(16, c).m) 7469 v1.AddArg(v2) 7470 v3 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64) 7471 v3.AddArg(x) 7472 v1.AddArg(v3) 7473 v0.AddArg(v1) 7474 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7475 v4.AuxInt = 16 + umagic(16, c).s 7476 v0.AddArg(v4) 7477 v.AddArg(v0) 7478 return true 7479 } 7480 // match: (Div16u x (Const16 [c])) 7481 // cond: umagicOK(16, c) && config.RegSize == 4 && umagic(16,c).m&1 == 0 7482 // result: (Trunc32to16 (Rsh32Ux64 <typ.UInt32> (Mul32 <typ.UInt32> (Const32 <typ.UInt32> [int64(1<<15+umagic(16,c).m/2)]) (ZeroExt16to32 x)) (Const64 <typ.UInt64> [16+umagic(16,c).s-1]))) 7483 for { 7484 _ = v.Args[1] 7485 x := v.Args[0] 7486 v_1 := v.Args[1] 7487 if v_1.Op != OpConst16 { 7488 break 7489 } 7490 c := v_1.AuxInt 7491 if !(umagicOK(16, c) && config.RegSize == 4 && umagic(16, c).m&1 == 0) { 7492 break 7493 } 7494 v.reset(OpTrunc32to16) 7495 v0 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32) 7496 v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) 7497 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 7498 v2.AuxInt = int64(1<<15 + umagic(16, c).m/2) 7499 v1.AddArg(v2) 7500 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 7501 v3.AddArg(x) 7502 v1.AddArg(v3) 7503 v0.AddArg(v1) 7504 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7505 v4.AuxInt = 16 + umagic(16, c).s - 1 7506 v0.AddArg(v4) 7507 v.AddArg(v0) 7508 return true 7509 } 7510 // match: (Div16u x (Const16 [c])) 7511 // cond: umagicOK(16, c) && config.RegSize == 4 && c&1 == 0 7512 // result: (Trunc32to16 (Rsh32Ux64 <typ.UInt32> (Mul32 <typ.UInt32> (Const32 <typ.UInt32> [int64(1<<15+(umagic(16,c).m+1)/2)]) (Rsh32Ux64 <typ.UInt32> (ZeroExt16to32 x) (Const64 <typ.UInt64> [1]))) (Const64 <typ.UInt64> [16+umagic(16,c).s-2]))) 7513 for { 7514 _ = v.Args[1] 7515 x := v.Args[0] 7516 v_1 := v.Args[1] 7517 if v_1.Op != OpConst16 { 7518 break 7519 } 7520 c := v_1.AuxInt 7521 if !(umagicOK(16, c) && config.RegSize == 4 && c&1 == 0) { 7522 break 7523 } 7524 v.reset(OpTrunc32to16) 7525 v0 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32) 7526 v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) 7527 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 7528 v2.AuxInt = int64(1<<15 + (umagic(16, c).m+1)/2) 7529 v1.AddArg(v2) 7530 v3 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32) 7531 v4 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 7532 v4.AddArg(x) 7533 v3.AddArg(v4) 7534 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7535 v5.AuxInt = 1 7536 v3.AddArg(v5) 7537 v1.AddArg(v3) 7538 v0.AddArg(v1) 7539 v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7540 v6.AuxInt = 16 + umagic(16, c).s - 2 7541 v0.AddArg(v6) 7542 v.AddArg(v0) 7543 return true 7544 } 7545 // match: (Div16u x (Const16 [c])) 7546 // cond: umagicOK(16, c) && config.RegSize == 4 7547 // result: (Trunc32to16 (Rsh32Ux64 <typ.UInt32> (Avg32u (Lsh32x64 <typ.UInt32> (ZeroExt16to32 x) (Const64 <typ.UInt64> [16])) (Mul32 <typ.UInt32> (Const32 <typ.UInt32> [int64(umagic(16,c).m)]) (ZeroExt16to32 x))) (Const64 <typ.UInt64> [16+umagic(16,c).s-1]))) 7548 for { 7549 _ = v.Args[1] 7550 x := v.Args[0] 7551 v_1 := v.Args[1] 7552 if v_1.Op != OpConst16 { 7553 break 7554 } 7555 c := v_1.AuxInt 7556 if !(umagicOK(16, c) && config.RegSize == 4) { 7557 break 7558 } 7559 v.reset(OpTrunc32to16) 7560 v0 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32) 7561 v1 := b.NewValue0(v.Pos, OpAvg32u, typ.UInt32) 7562 v2 := b.NewValue0(v.Pos, OpLsh32x64, typ.UInt32) 7563 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 7564 v3.AddArg(x) 7565 v2.AddArg(v3) 7566 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7567 v4.AuxInt = 16 7568 v2.AddArg(v4) 7569 v1.AddArg(v2) 7570 v5 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) 7571 v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 7572 v6.AuxInt = int64(umagic(16, c).m) 7573 v5.AddArg(v6) 7574 v7 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 7575 v7.AddArg(x) 7576 v5.AddArg(v7) 7577 v1.AddArg(v5) 7578 v0.AddArg(v1) 7579 v8 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7580 v8.AuxInt = 16 + umagic(16, c).s - 1 7581 v0.AddArg(v8) 7582 v.AddArg(v0) 7583 return true 7584 } 7585 return false 7586 } 7587 func rewriteValuegeneric_OpDiv32_0(v *Value) bool { 7588 b := v.Block 7589 _ = b 7590 config := b.Func.Config 7591 _ = config 7592 typ := &b.Func.Config.Types 7593 _ = typ 7594 // match: (Div32 (Const32 [c]) (Const32 [d])) 7595 // cond: d != 0 7596 // result: (Const32 [int64(int32(c)/int32(d))]) 7597 for { 7598 _ = v.Args[1] 7599 v_0 := v.Args[0] 7600 if v_0.Op != OpConst32 { 7601 break 7602 } 7603 c := v_0.AuxInt 7604 v_1 := v.Args[1] 7605 if v_1.Op != OpConst32 { 7606 break 7607 } 7608 d := v_1.AuxInt 7609 if !(d != 0) { 7610 break 7611 } 7612 v.reset(OpConst32) 7613 v.AuxInt = int64(int32(c) / int32(d)) 7614 return true 7615 } 7616 // match: (Div32 n (Const32 [c])) 7617 // cond: isNonNegative(n) && isPowerOfTwo(c&0xffffffff) 7618 // result: (Rsh32Ux64 n (Const64 <typ.UInt64> [log2(c&0xffffffff)])) 7619 for { 7620 _ = v.Args[1] 7621 n := v.Args[0] 7622 v_1 := v.Args[1] 7623 if v_1.Op != OpConst32 { 7624 break 7625 } 7626 c := v_1.AuxInt 7627 if !(isNonNegative(n) && isPowerOfTwo(c&0xffffffff)) { 7628 break 7629 } 7630 v.reset(OpRsh32Ux64) 7631 v.AddArg(n) 7632 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7633 v0.AuxInt = log2(c & 0xffffffff) 7634 v.AddArg(v0) 7635 return true 7636 } 7637 // match: (Div32 <t> n (Const32 [c])) 7638 // cond: c < 0 && c != -1<<31 7639 // result: (Neg32 (Div32 <t> n (Const32 <t> [-c]))) 7640 for { 7641 t := v.Type 7642 _ = v.Args[1] 7643 n := v.Args[0] 7644 v_1 := v.Args[1] 7645 if v_1.Op != OpConst32 { 7646 break 7647 } 7648 c := v_1.AuxInt 7649 if !(c < 0 && c != -1<<31) { 7650 break 7651 } 7652 v.reset(OpNeg32) 7653 v0 := b.NewValue0(v.Pos, OpDiv32, t) 7654 v0.AddArg(n) 7655 v1 := b.NewValue0(v.Pos, OpConst32, t) 7656 v1.AuxInt = -c 7657 v0.AddArg(v1) 7658 v.AddArg(v0) 7659 return true 7660 } 7661 // match: (Div32 <t> x (Const32 [-1<<31])) 7662 // cond: 7663 // result: (Rsh32Ux64 (And32 <t> x (Neg32 <t> x)) (Const64 <typ.UInt64> [31])) 7664 for { 7665 t := v.Type 7666 _ = v.Args[1] 7667 x := v.Args[0] 7668 v_1 := v.Args[1] 7669 if v_1.Op != OpConst32 { 7670 break 7671 } 7672 if v_1.AuxInt != -1<<31 { 7673 break 7674 } 7675 v.reset(OpRsh32Ux64) 7676 v0 := b.NewValue0(v.Pos, OpAnd32, t) 7677 v0.AddArg(x) 7678 v1 := b.NewValue0(v.Pos, OpNeg32, t) 7679 v1.AddArg(x) 7680 v0.AddArg(v1) 7681 v.AddArg(v0) 7682 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7683 v2.AuxInt = 31 7684 v.AddArg(v2) 7685 return true 7686 } 7687 // match: (Div32 <t> n (Const32 [c])) 7688 // cond: isPowerOfTwo(c) 7689 // result: (Rsh32x64 (Add32 <t> n (Rsh32Ux64 <t> (Rsh32x64 <t> n (Const64 <typ.UInt64> [31])) (Const64 <typ.UInt64> [32-log2(c)]))) (Const64 <typ.UInt64> [log2(c)])) 7690 for { 7691 t := v.Type 7692 _ = v.Args[1] 7693 n := v.Args[0] 7694 v_1 := v.Args[1] 7695 if v_1.Op != OpConst32 { 7696 break 7697 } 7698 c := v_1.AuxInt 7699 if !(isPowerOfTwo(c)) { 7700 break 7701 } 7702 v.reset(OpRsh32x64) 7703 v0 := b.NewValue0(v.Pos, OpAdd32, t) 7704 v0.AddArg(n) 7705 v1 := b.NewValue0(v.Pos, OpRsh32Ux64, t) 7706 v2 := b.NewValue0(v.Pos, OpRsh32x64, t) 7707 v2.AddArg(n) 7708 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7709 v3.AuxInt = 31 7710 v2.AddArg(v3) 7711 v1.AddArg(v2) 7712 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7713 v4.AuxInt = 32 - log2(c) 7714 v1.AddArg(v4) 7715 v0.AddArg(v1) 7716 v.AddArg(v0) 7717 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7718 v5.AuxInt = log2(c) 7719 v.AddArg(v5) 7720 return true 7721 } 7722 // match: (Div32 <t> x (Const32 [c])) 7723 // cond: smagicOK(32,c) && config.RegSize == 8 7724 // result: (Sub32 <t> (Rsh64x64 <t> (Mul64 <typ.UInt64> (Const64 <typ.UInt64> [int64(smagic(32,c).m)]) (SignExt32to64 x)) (Const64 <typ.UInt64> [32+smagic(32,c).s])) (Rsh64x64 <t> (SignExt32to64 x) (Const64 <typ.UInt64> [63]))) 7725 for { 7726 t := v.Type 7727 _ = v.Args[1] 7728 x := v.Args[0] 7729 v_1 := v.Args[1] 7730 if v_1.Op != OpConst32 { 7731 break 7732 } 7733 c := v_1.AuxInt 7734 if !(smagicOK(32, c) && config.RegSize == 8) { 7735 break 7736 } 7737 v.reset(OpSub32) 7738 v.Type = t 7739 v0 := b.NewValue0(v.Pos, OpRsh64x64, t) 7740 v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) 7741 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7742 v2.AuxInt = int64(smagic(32, c).m) 7743 v1.AddArg(v2) 7744 v3 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64) 7745 v3.AddArg(x) 7746 v1.AddArg(v3) 7747 v0.AddArg(v1) 7748 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7749 v4.AuxInt = 32 + smagic(32, c).s 7750 v0.AddArg(v4) 7751 v.AddArg(v0) 7752 v5 := b.NewValue0(v.Pos, OpRsh64x64, t) 7753 v6 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64) 7754 v6.AddArg(x) 7755 v5.AddArg(v6) 7756 v7 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7757 v7.AuxInt = 63 7758 v5.AddArg(v7) 7759 v.AddArg(v5) 7760 return true 7761 } 7762 // match: (Div32 <t> x (Const32 [c])) 7763 // cond: smagicOK(32,c) && config.RegSize == 4 && smagic(32,c).m&1 == 0 7764 // result: (Sub32 <t> (Rsh32x64 <t> (Hmul32 <t> (Const32 <typ.UInt32> [int64(int32(smagic(32,c).m/2))]) x) (Const64 <typ.UInt64> [smagic(32,c).s-1])) (Rsh32x64 <t> x (Const64 <typ.UInt64> [31]))) 7765 for { 7766 t := v.Type 7767 _ = v.Args[1] 7768 x := v.Args[0] 7769 v_1 := v.Args[1] 7770 if v_1.Op != OpConst32 { 7771 break 7772 } 7773 c := v_1.AuxInt 7774 if !(smagicOK(32, c) && config.RegSize == 4 && smagic(32, c).m&1 == 0) { 7775 break 7776 } 7777 v.reset(OpSub32) 7778 v.Type = t 7779 v0 := b.NewValue0(v.Pos, OpRsh32x64, t) 7780 v1 := b.NewValue0(v.Pos, OpHmul32, t) 7781 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 7782 v2.AuxInt = int64(int32(smagic(32, c).m / 2)) 7783 v1.AddArg(v2) 7784 v1.AddArg(x) 7785 v0.AddArg(v1) 7786 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7787 v3.AuxInt = smagic(32, c).s - 1 7788 v0.AddArg(v3) 7789 v.AddArg(v0) 7790 v4 := b.NewValue0(v.Pos, OpRsh32x64, t) 7791 v4.AddArg(x) 7792 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7793 v5.AuxInt = 31 7794 v4.AddArg(v5) 7795 v.AddArg(v4) 7796 return true 7797 } 7798 // match: (Div32 <t> x (Const32 [c])) 7799 // cond: smagicOK(32,c) && config.RegSize == 4 && smagic(32,c).m&1 != 0 7800 // result: (Sub32 <t> (Rsh32x64 <t> (Add32 <t> (Hmul32 <t> (Const32 <typ.UInt32> [int64(int32(smagic(32,c).m))]) x) x) (Const64 <typ.UInt64> [smagic(32,c).s])) (Rsh32x64 <t> x (Const64 <typ.UInt64> [31]))) 7801 for { 7802 t := v.Type 7803 _ = v.Args[1] 7804 x := v.Args[0] 7805 v_1 := v.Args[1] 7806 if v_1.Op != OpConst32 { 7807 break 7808 } 7809 c := v_1.AuxInt 7810 if !(smagicOK(32, c) && config.RegSize == 4 && smagic(32, c).m&1 != 0) { 7811 break 7812 } 7813 v.reset(OpSub32) 7814 v.Type = t 7815 v0 := b.NewValue0(v.Pos, OpRsh32x64, t) 7816 v1 := b.NewValue0(v.Pos, OpAdd32, t) 7817 v2 := b.NewValue0(v.Pos, OpHmul32, t) 7818 v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 7819 v3.AuxInt = int64(int32(smagic(32, c).m)) 7820 v2.AddArg(v3) 7821 v2.AddArg(x) 7822 v1.AddArg(v2) 7823 v1.AddArg(x) 7824 v0.AddArg(v1) 7825 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7826 v4.AuxInt = smagic(32, c).s 7827 v0.AddArg(v4) 7828 v.AddArg(v0) 7829 v5 := b.NewValue0(v.Pos, OpRsh32x64, t) 7830 v5.AddArg(x) 7831 v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7832 v6.AuxInt = 31 7833 v5.AddArg(v6) 7834 v.AddArg(v5) 7835 return true 7836 } 7837 return false 7838 } 7839 func rewriteValuegeneric_OpDiv32F_0(v *Value) bool { 7840 b := v.Block 7841 _ = b 7842 // match: (Div32F (Const32F [c]) (Const32F [d])) 7843 // cond: 7844 // result: (Const32F [f2i(float64(i2f32(c) / i2f32(d)))]) 7845 for { 7846 _ = v.Args[1] 7847 v_0 := v.Args[0] 7848 if v_0.Op != OpConst32F { 7849 break 7850 } 7851 c := v_0.AuxInt 7852 v_1 := v.Args[1] 7853 if v_1.Op != OpConst32F { 7854 break 7855 } 7856 d := v_1.AuxInt 7857 v.reset(OpConst32F) 7858 v.AuxInt = f2i(float64(i2f32(c) / i2f32(d))) 7859 return true 7860 } 7861 // match: (Div32F x (Const32F <t> [c])) 7862 // cond: reciprocalExact32(float32(i2f(c))) 7863 // result: (Mul32F x (Const32F <t> [f2i(1/i2f(c))])) 7864 for { 7865 _ = v.Args[1] 7866 x := v.Args[0] 7867 v_1 := v.Args[1] 7868 if v_1.Op != OpConst32F { 7869 break 7870 } 7871 t := v_1.Type 7872 c := v_1.AuxInt 7873 if !(reciprocalExact32(float32(i2f(c)))) { 7874 break 7875 } 7876 v.reset(OpMul32F) 7877 v.AddArg(x) 7878 v0 := b.NewValue0(v.Pos, OpConst32F, t) 7879 v0.AuxInt = f2i(1 / i2f(c)) 7880 v.AddArg(v0) 7881 return true 7882 } 7883 return false 7884 } 7885 func rewriteValuegeneric_OpDiv32u_0(v *Value) bool { 7886 b := v.Block 7887 _ = b 7888 config := b.Func.Config 7889 _ = config 7890 typ := &b.Func.Config.Types 7891 _ = typ 7892 // match: (Div32u (Const32 [c]) (Const32 [d])) 7893 // cond: d != 0 7894 // result: (Const32 [int64(int32(uint32(c)/uint32(d)))]) 7895 for { 7896 _ = v.Args[1] 7897 v_0 := v.Args[0] 7898 if v_0.Op != OpConst32 { 7899 break 7900 } 7901 c := v_0.AuxInt 7902 v_1 := v.Args[1] 7903 if v_1.Op != OpConst32 { 7904 break 7905 } 7906 d := v_1.AuxInt 7907 if !(d != 0) { 7908 break 7909 } 7910 v.reset(OpConst32) 7911 v.AuxInt = int64(int32(uint32(c) / uint32(d))) 7912 return true 7913 } 7914 // match: (Div32u n (Const32 [c])) 7915 // cond: isPowerOfTwo(c&0xffffffff) 7916 // result: (Rsh32Ux64 n (Const64 <typ.UInt64> [log2(c&0xffffffff)])) 7917 for { 7918 _ = v.Args[1] 7919 n := v.Args[0] 7920 v_1 := v.Args[1] 7921 if v_1.Op != OpConst32 { 7922 break 7923 } 7924 c := v_1.AuxInt 7925 if !(isPowerOfTwo(c & 0xffffffff)) { 7926 break 7927 } 7928 v.reset(OpRsh32Ux64) 7929 v.AddArg(n) 7930 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7931 v0.AuxInt = log2(c & 0xffffffff) 7932 v.AddArg(v0) 7933 return true 7934 } 7935 // match: (Div32u x (Const32 [c])) 7936 // cond: umagicOK(32, c) && config.RegSize == 4 && umagic(32,c).m&1 == 0 7937 // result: (Rsh32Ux64 <typ.UInt32> (Hmul32u <typ.UInt32> (Const32 <typ.UInt32> [int64(int32(1<<31+umagic(32,c).m/2))]) x) (Const64 <typ.UInt64> [umagic(32,c).s-1])) 7938 for { 7939 _ = v.Args[1] 7940 x := v.Args[0] 7941 v_1 := v.Args[1] 7942 if v_1.Op != OpConst32 { 7943 break 7944 } 7945 c := v_1.AuxInt 7946 if !(umagicOK(32, c) && config.RegSize == 4 && umagic(32, c).m&1 == 0) { 7947 break 7948 } 7949 v.reset(OpRsh32Ux64) 7950 v.Type = typ.UInt32 7951 v0 := b.NewValue0(v.Pos, OpHmul32u, typ.UInt32) 7952 v1 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 7953 v1.AuxInt = int64(int32(1<<31 + umagic(32, c).m/2)) 7954 v0.AddArg(v1) 7955 v0.AddArg(x) 7956 v.AddArg(v0) 7957 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7958 v2.AuxInt = umagic(32, c).s - 1 7959 v.AddArg(v2) 7960 return true 7961 } 7962 // match: (Div32u x (Const32 [c])) 7963 // cond: umagicOK(32, c) && config.RegSize == 4 && c&1 == 0 7964 // result: (Rsh32Ux64 <typ.UInt32> (Hmul32u <typ.UInt32> (Const32 <typ.UInt32> [int64(int32(1<<31+(umagic(32,c).m+1)/2))]) (Rsh32Ux64 <typ.UInt32> x (Const64 <typ.UInt64> [1]))) (Const64 <typ.UInt64> [umagic(32,c).s-2])) 7965 for { 7966 _ = v.Args[1] 7967 x := v.Args[0] 7968 v_1 := v.Args[1] 7969 if v_1.Op != OpConst32 { 7970 break 7971 } 7972 c := v_1.AuxInt 7973 if !(umagicOK(32, c) && config.RegSize == 4 && c&1 == 0) { 7974 break 7975 } 7976 v.reset(OpRsh32Ux64) 7977 v.Type = typ.UInt32 7978 v0 := b.NewValue0(v.Pos, OpHmul32u, typ.UInt32) 7979 v1 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 7980 v1.AuxInt = int64(int32(1<<31 + (umagic(32, c).m+1)/2)) 7981 v0.AddArg(v1) 7982 v2 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32) 7983 v2.AddArg(x) 7984 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7985 v3.AuxInt = 1 7986 v2.AddArg(v3) 7987 v0.AddArg(v2) 7988 v.AddArg(v0) 7989 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7990 v4.AuxInt = umagic(32, c).s - 2 7991 v.AddArg(v4) 7992 return true 7993 } 7994 // match: (Div32u x (Const32 [c])) 7995 // cond: umagicOK(32, c) && config.RegSize == 4 7996 // result: (Rsh32Ux64 <typ.UInt32> (Avg32u x (Hmul32u <typ.UInt32> (Const32 <typ.UInt32> [int64(int32(umagic(32,c).m))]) x)) (Const64 <typ.UInt64> [umagic(32,c).s-1])) 7997 for { 7998 _ = v.Args[1] 7999 x := v.Args[0] 8000 v_1 := v.Args[1] 8001 if v_1.Op != OpConst32 { 8002 break 8003 } 8004 c := v_1.AuxInt 8005 if !(umagicOK(32, c) && config.RegSize == 4) { 8006 break 8007 } 8008 v.reset(OpRsh32Ux64) 8009 v.Type = typ.UInt32 8010 v0 := b.NewValue0(v.Pos, OpAvg32u, typ.UInt32) 8011 v0.AddArg(x) 8012 v1 := b.NewValue0(v.Pos, OpHmul32u, typ.UInt32) 8013 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 8014 v2.AuxInt = int64(int32(umagic(32, c).m)) 8015 v1.AddArg(v2) 8016 v1.AddArg(x) 8017 v0.AddArg(v1) 8018 v.AddArg(v0) 8019 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8020 v3.AuxInt = umagic(32, c).s - 1 8021 v.AddArg(v3) 8022 return true 8023 } 8024 // match: (Div32u x (Const32 [c])) 8025 // cond: umagicOK(32, c) && config.RegSize == 8 && umagic(32,c).m&1 == 0 8026 // result: (Trunc64to32 (Rsh64Ux64 <typ.UInt64> (Mul64 <typ.UInt64> (Const64 <typ.UInt64> [int64(1<<31+umagic(32,c).m/2)]) (ZeroExt32to64 x)) (Const64 <typ.UInt64> [32+umagic(32,c).s-1]))) 8027 for { 8028 _ = v.Args[1] 8029 x := v.Args[0] 8030 v_1 := v.Args[1] 8031 if v_1.Op != OpConst32 { 8032 break 8033 } 8034 c := v_1.AuxInt 8035 if !(umagicOK(32, c) && config.RegSize == 8 && umagic(32, c).m&1 == 0) { 8036 break 8037 } 8038 v.reset(OpTrunc64to32) 8039 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64) 8040 v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) 8041 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8042 v2.AuxInt = int64(1<<31 + umagic(32, c).m/2) 8043 v1.AddArg(v2) 8044 v3 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) 8045 v3.AddArg(x) 8046 v1.AddArg(v3) 8047 v0.AddArg(v1) 8048 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8049 v4.AuxInt = 32 + umagic(32, c).s - 1 8050 v0.AddArg(v4) 8051 v.AddArg(v0) 8052 return true 8053 } 8054 // match: (Div32u x (Const32 [c])) 8055 // cond: umagicOK(32, c) && config.RegSize == 8 && c&1 == 0 8056 // result: (Trunc64to32 (Rsh64Ux64 <typ.UInt64> (Mul64 <typ.UInt64> (Const64 <typ.UInt64> [int64(1<<31+(umagic(32,c).m+1)/2)]) (Rsh64Ux64 <typ.UInt64> (ZeroExt32to64 x) (Const64 <typ.UInt64> [1]))) (Const64 <typ.UInt64> [32+umagic(32,c).s-2]))) 8057 for { 8058 _ = v.Args[1] 8059 x := v.Args[0] 8060 v_1 := v.Args[1] 8061 if v_1.Op != OpConst32 { 8062 break 8063 } 8064 c := v_1.AuxInt 8065 if !(umagicOK(32, c) && config.RegSize == 8 && c&1 == 0) { 8066 break 8067 } 8068 v.reset(OpTrunc64to32) 8069 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64) 8070 v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) 8071 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8072 v2.AuxInt = int64(1<<31 + (umagic(32, c).m+1)/2) 8073 v1.AddArg(v2) 8074 v3 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64) 8075 v4 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) 8076 v4.AddArg(x) 8077 v3.AddArg(v4) 8078 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8079 v5.AuxInt = 1 8080 v3.AddArg(v5) 8081 v1.AddArg(v3) 8082 v0.AddArg(v1) 8083 v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8084 v6.AuxInt = 32 + umagic(32, c).s - 2 8085 v0.AddArg(v6) 8086 v.AddArg(v0) 8087 return true 8088 } 8089 // match: (Div32u x (Const32 [c])) 8090 // cond: umagicOK(32, c) && config.RegSize == 8 8091 // result: (Trunc64to32 (Rsh64Ux64 <typ.UInt64> (Avg64u (Lsh64x64 <typ.UInt64> (ZeroExt32to64 x) (Const64 <typ.UInt64> [32])) (Mul64 <typ.UInt64> (Const64 <typ.UInt32> [int64(umagic(32,c).m)]) (ZeroExt32to64 x))) (Const64 <typ.UInt64> [32+umagic(32,c).s-1]))) 8092 for { 8093 _ = v.Args[1] 8094 x := v.Args[0] 8095 v_1 := v.Args[1] 8096 if v_1.Op != OpConst32 { 8097 break 8098 } 8099 c := v_1.AuxInt 8100 if !(umagicOK(32, c) && config.RegSize == 8) { 8101 break 8102 } 8103 v.reset(OpTrunc64to32) 8104 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64) 8105 v1 := b.NewValue0(v.Pos, OpAvg64u, typ.UInt64) 8106 v2 := b.NewValue0(v.Pos, OpLsh64x64, typ.UInt64) 8107 v3 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) 8108 v3.AddArg(x) 8109 v2.AddArg(v3) 8110 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8111 v4.AuxInt = 32 8112 v2.AddArg(v4) 8113 v1.AddArg(v2) 8114 v5 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) 8115 v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt32) 8116 v6.AuxInt = int64(umagic(32, c).m) 8117 v5.AddArg(v6) 8118 v7 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) 8119 v7.AddArg(x) 8120 v5.AddArg(v7) 8121 v1.AddArg(v5) 8122 v0.AddArg(v1) 8123 v8 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8124 v8.AuxInt = 32 + umagic(32, c).s - 1 8125 v0.AddArg(v8) 8126 v.AddArg(v0) 8127 return true 8128 } 8129 return false 8130 } 8131 func rewriteValuegeneric_OpDiv64_0(v *Value) bool { 8132 b := v.Block 8133 _ = b 8134 typ := &b.Func.Config.Types 8135 _ = typ 8136 // match: (Div64 (Const64 [c]) (Const64 [d])) 8137 // cond: d != 0 8138 // result: (Const64 [c/d]) 8139 for { 8140 _ = v.Args[1] 8141 v_0 := v.Args[0] 8142 if v_0.Op != OpConst64 { 8143 break 8144 } 8145 c := v_0.AuxInt 8146 v_1 := v.Args[1] 8147 if v_1.Op != OpConst64 { 8148 break 8149 } 8150 d := v_1.AuxInt 8151 if !(d != 0) { 8152 break 8153 } 8154 v.reset(OpConst64) 8155 v.AuxInt = c / d 8156 return true 8157 } 8158 // match: (Div64 n (Const64 [c])) 8159 // cond: isNonNegative(n) && isPowerOfTwo(c) 8160 // result: (Rsh64Ux64 n (Const64 <typ.UInt64> [log2(c)])) 8161 for { 8162 _ = v.Args[1] 8163 n := v.Args[0] 8164 v_1 := v.Args[1] 8165 if v_1.Op != OpConst64 { 8166 break 8167 } 8168 c := v_1.AuxInt 8169 if !(isNonNegative(n) && isPowerOfTwo(c)) { 8170 break 8171 } 8172 v.reset(OpRsh64Ux64) 8173 v.AddArg(n) 8174 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8175 v0.AuxInt = log2(c) 8176 v.AddArg(v0) 8177 return true 8178 } 8179 // match: (Div64 n (Const64 [-1<<63])) 8180 // cond: isNonNegative(n) 8181 // result: (Const64 [0]) 8182 for { 8183 _ = v.Args[1] 8184 n := v.Args[0] 8185 v_1 := v.Args[1] 8186 if v_1.Op != OpConst64 { 8187 break 8188 } 8189 if v_1.AuxInt != -1<<63 { 8190 break 8191 } 8192 if !(isNonNegative(n)) { 8193 break 8194 } 8195 v.reset(OpConst64) 8196 v.AuxInt = 0 8197 return true 8198 } 8199 // match: (Div64 <t> n (Const64 [c])) 8200 // cond: c < 0 && c != -1<<63 8201 // result: (Neg64 (Div64 <t> n (Const64 <t> [-c]))) 8202 for { 8203 t := v.Type 8204 _ = v.Args[1] 8205 n := v.Args[0] 8206 v_1 := v.Args[1] 8207 if v_1.Op != OpConst64 { 8208 break 8209 } 8210 c := v_1.AuxInt 8211 if !(c < 0 && c != -1<<63) { 8212 break 8213 } 8214 v.reset(OpNeg64) 8215 v0 := b.NewValue0(v.Pos, OpDiv64, t) 8216 v0.AddArg(n) 8217 v1 := b.NewValue0(v.Pos, OpConst64, t) 8218 v1.AuxInt = -c 8219 v0.AddArg(v1) 8220 v.AddArg(v0) 8221 return true 8222 } 8223 // match: (Div64 <t> x (Const64 [-1<<63])) 8224 // cond: 8225 // result: (Rsh64Ux64 (And64 <t> x (Neg64 <t> x)) (Const64 <typ.UInt64> [63])) 8226 for { 8227 t := v.Type 8228 _ = v.Args[1] 8229 x := v.Args[0] 8230 v_1 := v.Args[1] 8231 if v_1.Op != OpConst64 { 8232 break 8233 } 8234 if v_1.AuxInt != -1<<63 { 8235 break 8236 } 8237 v.reset(OpRsh64Ux64) 8238 v0 := b.NewValue0(v.Pos, OpAnd64, t) 8239 v0.AddArg(x) 8240 v1 := b.NewValue0(v.Pos, OpNeg64, t) 8241 v1.AddArg(x) 8242 v0.AddArg(v1) 8243 v.AddArg(v0) 8244 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8245 v2.AuxInt = 63 8246 v.AddArg(v2) 8247 return true 8248 } 8249 // match: (Div64 <t> n (Const64 [c])) 8250 // cond: isPowerOfTwo(c) 8251 // result: (Rsh64x64 (Add64 <t> n (Rsh64Ux64 <t> (Rsh64x64 <t> n (Const64 <typ.UInt64> [63])) (Const64 <typ.UInt64> [64-log2(c)]))) (Const64 <typ.UInt64> [log2(c)])) 8252 for { 8253 t := v.Type 8254 _ = v.Args[1] 8255 n := v.Args[0] 8256 v_1 := v.Args[1] 8257 if v_1.Op != OpConst64 { 8258 break 8259 } 8260 c := v_1.AuxInt 8261 if !(isPowerOfTwo(c)) { 8262 break 8263 } 8264 v.reset(OpRsh64x64) 8265 v0 := b.NewValue0(v.Pos, OpAdd64, t) 8266 v0.AddArg(n) 8267 v1 := b.NewValue0(v.Pos, OpRsh64Ux64, t) 8268 v2 := b.NewValue0(v.Pos, OpRsh64x64, t) 8269 v2.AddArg(n) 8270 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8271 v3.AuxInt = 63 8272 v2.AddArg(v3) 8273 v1.AddArg(v2) 8274 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8275 v4.AuxInt = 64 - log2(c) 8276 v1.AddArg(v4) 8277 v0.AddArg(v1) 8278 v.AddArg(v0) 8279 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8280 v5.AuxInt = log2(c) 8281 v.AddArg(v5) 8282 return true 8283 } 8284 // match: (Div64 <t> x (Const64 [c])) 8285 // cond: smagicOK(64,c) && smagic(64,c).m&1 == 0 8286 // result: (Sub64 <t> (Rsh64x64 <t> (Hmul64 <t> (Const64 <typ.UInt64> [int64(smagic(64,c).m/2)]) x) (Const64 <typ.UInt64> [smagic(64,c).s-1])) (Rsh64x64 <t> x (Const64 <typ.UInt64> [63]))) 8287 for { 8288 t := v.Type 8289 _ = v.Args[1] 8290 x := v.Args[0] 8291 v_1 := v.Args[1] 8292 if v_1.Op != OpConst64 { 8293 break 8294 } 8295 c := v_1.AuxInt 8296 if !(smagicOK(64, c) && smagic(64, c).m&1 == 0) { 8297 break 8298 } 8299 v.reset(OpSub64) 8300 v.Type = t 8301 v0 := b.NewValue0(v.Pos, OpRsh64x64, t) 8302 v1 := b.NewValue0(v.Pos, OpHmul64, t) 8303 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8304 v2.AuxInt = int64(smagic(64, c).m / 2) 8305 v1.AddArg(v2) 8306 v1.AddArg(x) 8307 v0.AddArg(v1) 8308 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8309 v3.AuxInt = smagic(64, c).s - 1 8310 v0.AddArg(v3) 8311 v.AddArg(v0) 8312 v4 := b.NewValue0(v.Pos, OpRsh64x64, t) 8313 v4.AddArg(x) 8314 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8315 v5.AuxInt = 63 8316 v4.AddArg(v5) 8317 v.AddArg(v4) 8318 return true 8319 } 8320 // match: (Div64 <t> x (Const64 [c])) 8321 // cond: smagicOK(64,c) && smagic(64,c).m&1 != 0 8322 // result: (Sub64 <t> (Rsh64x64 <t> (Add64 <t> (Hmul64 <t> (Const64 <typ.UInt64> [int64(smagic(64,c).m)]) x) x) (Const64 <typ.UInt64> [smagic(64,c).s])) (Rsh64x64 <t> x (Const64 <typ.UInt64> [63]))) 8323 for { 8324 t := v.Type 8325 _ = v.Args[1] 8326 x := v.Args[0] 8327 v_1 := v.Args[1] 8328 if v_1.Op != OpConst64 { 8329 break 8330 } 8331 c := v_1.AuxInt 8332 if !(smagicOK(64, c) && smagic(64, c).m&1 != 0) { 8333 break 8334 } 8335 v.reset(OpSub64) 8336 v.Type = t 8337 v0 := b.NewValue0(v.Pos, OpRsh64x64, t) 8338 v1 := b.NewValue0(v.Pos, OpAdd64, t) 8339 v2 := b.NewValue0(v.Pos, OpHmul64, t) 8340 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8341 v3.AuxInt = int64(smagic(64, c).m) 8342 v2.AddArg(v3) 8343 v2.AddArg(x) 8344 v1.AddArg(v2) 8345 v1.AddArg(x) 8346 v0.AddArg(v1) 8347 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8348 v4.AuxInt = smagic(64, c).s 8349 v0.AddArg(v4) 8350 v.AddArg(v0) 8351 v5 := b.NewValue0(v.Pos, OpRsh64x64, t) 8352 v5.AddArg(x) 8353 v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8354 v6.AuxInt = 63 8355 v5.AddArg(v6) 8356 v.AddArg(v5) 8357 return true 8358 } 8359 return false 8360 } 8361 func rewriteValuegeneric_OpDiv64F_0(v *Value) bool { 8362 b := v.Block 8363 _ = b 8364 // match: (Div64F (Const64F [c]) (Const64F [d])) 8365 // cond: 8366 // result: (Const64F [f2i(i2f(c) / i2f(d))]) 8367 for { 8368 _ = v.Args[1] 8369 v_0 := v.Args[0] 8370 if v_0.Op != OpConst64F { 8371 break 8372 } 8373 c := v_0.AuxInt 8374 v_1 := v.Args[1] 8375 if v_1.Op != OpConst64F { 8376 break 8377 } 8378 d := v_1.AuxInt 8379 v.reset(OpConst64F) 8380 v.AuxInt = f2i(i2f(c) / i2f(d)) 8381 return true 8382 } 8383 // match: (Div64F x (Const64F <t> [c])) 8384 // cond: reciprocalExact64(i2f(c)) 8385 // result: (Mul64F x (Const64F <t> [f2i(1/i2f(c))])) 8386 for { 8387 _ = v.Args[1] 8388 x := v.Args[0] 8389 v_1 := v.Args[1] 8390 if v_1.Op != OpConst64F { 8391 break 8392 } 8393 t := v_1.Type 8394 c := v_1.AuxInt 8395 if !(reciprocalExact64(i2f(c))) { 8396 break 8397 } 8398 v.reset(OpMul64F) 8399 v.AddArg(x) 8400 v0 := b.NewValue0(v.Pos, OpConst64F, t) 8401 v0.AuxInt = f2i(1 / i2f(c)) 8402 v.AddArg(v0) 8403 return true 8404 } 8405 return false 8406 } 8407 func rewriteValuegeneric_OpDiv64u_0(v *Value) bool { 8408 b := v.Block 8409 _ = b 8410 config := b.Func.Config 8411 _ = config 8412 typ := &b.Func.Config.Types 8413 _ = typ 8414 // match: (Div64u (Const64 [c]) (Const64 [d])) 8415 // cond: d != 0 8416 // result: (Const64 [int64(uint64(c)/uint64(d))]) 8417 for { 8418 _ = v.Args[1] 8419 v_0 := v.Args[0] 8420 if v_0.Op != OpConst64 { 8421 break 8422 } 8423 c := v_0.AuxInt 8424 v_1 := v.Args[1] 8425 if v_1.Op != OpConst64 { 8426 break 8427 } 8428 d := v_1.AuxInt 8429 if !(d != 0) { 8430 break 8431 } 8432 v.reset(OpConst64) 8433 v.AuxInt = int64(uint64(c) / uint64(d)) 8434 return true 8435 } 8436 // match: (Div64u n (Const64 [c])) 8437 // cond: isPowerOfTwo(c) 8438 // result: (Rsh64Ux64 n (Const64 <typ.UInt64> [log2(c)])) 8439 for { 8440 _ = v.Args[1] 8441 n := v.Args[0] 8442 v_1 := v.Args[1] 8443 if v_1.Op != OpConst64 { 8444 break 8445 } 8446 c := v_1.AuxInt 8447 if !(isPowerOfTwo(c)) { 8448 break 8449 } 8450 v.reset(OpRsh64Ux64) 8451 v.AddArg(n) 8452 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8453 v0.AuxInt = log2(c) 8454 v.AddArg(v0) 8455 return true 8456 } 8457 // match: (Div64u n (Const64 [-1<<63])) 8458 // cond: 8459 // result: (Rsh64Ux64 n (Const64 <typ.UInt64> [63])) 8460 for { 8461 _ = v.Args[1] 8462 n := v.Args[0] 8463 v_1 := v.Args[1] 8464 if v_1.Op != OpConst64 { 8465 break 8466 } 8467 if v_1.AuxInt != -1<<63 { 8468 break 8469 } 8470 v.reset(OpRsh64Ux64) 8471 v.AddArg(n) 8472 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8473 v0.AuxInt = 63 8474 v.AddArg(v0) 8475 return true 8476 } 8477 // match: (Div64u x (Const64 [c])) 8478 // cond: umagicOK(64, c) && config.RegSize == 8 && umagic(64,c).m&1 == 0 8479 // result: (Rsh64Ux64 <typ.UInt64> (Hmul64u <typ.UInt64> (Const64 <typ.UInt64> [int64(1<<63+umagic(64,c).m/2)]) x) (Const64 <typ.UInt64> [umagic(64,c).s-1])) 8480 for { 8481 _ = v.Args[1] 8482 x := v.Args[0] 8483 v_1 := v.Args[1] 8484 if v_1.Op != OpConst64 { 8485 break 8486 } 8487 c := v_1.AuxInt 8488 if !(umagicOK(64, c) && config.RegSize == 8 && umagic(64, c).m&1 == 0) { 8489 break 8490 } 8491 v.reset(OpRsh64Ux64) 8492 v.Type = typ.UInt64 8493 v0 := b.NewValue0(v.Pos, OpHmul64u, typ.UInt64) 8494 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8495 v1.AuxInt = int64(1<<63 + umagic(64, c).m/2) 8496 v0.AddArg(v1) 8497 v0.AddArg(x) 8498 v.AddArg(v0) 8499 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8500 v2.AuxInt = umagic(64, c).s - 1 8501 v.AddArg(v2) 8502 return true 8503 } 8504 // match: (Div64u x (Const64 [c])) 8505 // cond: umagicOK(64, c) && config.RegSize == 8 && c&1 == 0 8506 // result: (Rsh64Ux64 <typ.UInt64> (Hmul64u <typ.UInt64> (Const64 <typ.UInt64> [int64(1<<63+(umagic(64,c).m+1)/2)]) (Rsh64Ux64 <typ.UInt64> x (Const64 <typ.UInt64> [1]))) (Const64 <typ.UInt64> [umagic(64,c).s-2])) 8507 for { 8508 _ = v.Args[1] 8509 x := v.Args[0] 8510 v_1 := v.Args[1] 8511 if v_1.Op != OpConst64 { 8512 break 8513 } 8514 c := v_1.AuxInt 8515 if !(umagicOK(64, c) && config.RegSize == 8 && c&1 == 0) { 8516 break 8517 } 8518 v.reset(OpRsh64Ux64) 8519 v.Type = typ.UInt64 8520 v0 := b.NewValue0(v.Pos, OpHmul64u, typ.UInt64) 8521 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8522 v1.AuxInt = int64(1<<63 + (umagic(64, c).m+1)/2) 8523 v0.AddArg(v1) 8524 v2 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64) 8525 v2.AddArg(x) 8526 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8527 v3.AuxInt = 1 8528 v2.AddArg(v3) 8529 v0.AddArg(v2) 8530 v.AddArg(v0) 8531 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8532 v4.AuxInt = umagic(64, c).s - 2 8533 v.AddArg(v4) 8534 return true 8535 } 8536 // match: (Div64u x (Const64 [c])) 8537 // cond: umagicOK(64, c) && config.RegSize == 8 8538 // result: (Rsh64Ux64 <typ.UInt64> (Avg64u x (Hmul64u <typ.UInt64> (Const64 <typ.UInt64> [int64(umagic(64,c).m)]) x)) (Const64 <typ.UInt64> [umagic(64,c).s-1])) 8539 for { 8540 _ = v.Args[1] 8541 x := v.Args[0] 8542 v_1 := v.Args[1] 8543 if v_1.Op != OpConst64 { 8544 break 8545 } 8546 c := v_1.AuxInt 8547 if !(umagicOK(64, c) && config.RegSize == 8) { 8548 break 8549 } 8550 v.reset(OpRsh64Ux64) 8551 v.Type = typ.UInt64 8552 v0 := b.NewValue0(v.Pos, OpAvg64u, typ.UInt64) 8553 v0.AddArg(x) 8554 v1 := b.NewValue0(v.Pos, OpHmul64u, typ.UInt64) 8555 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8556 v2.AuxInt = int64(umagic(64, c).m) 8557 v1.AddArg(v2) 8558 v1.AddArg(x) 8559 v0.AddArg(v1) 8560 v.AddArg(v0) 8561 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8562 v3.AuxInt = umagic(64, c).s - 1 8563 v.AddArg(v3) 8564 return true 8565 } 8566 return false 8567 } 8568 func rewriteValuegeneric_OpDiv8_0(v *Value) bool { 8569 b := v.Block 8570 _ = b 8571 typ := &b.Func.Config.Types 8572 _ = typ 8573 // match: (Div8 (Const8 [c]) (Const8 [d])) 8574 // cond: d != 0 8575 // result: (Const8 [int64(int8(c)/int8(d))]) 8576 for { 8577 _ = v.Args[1] 8578 v_0 := v.Args[0] 8579 if v_0.Op != OpConst8 { 8580 break 8581 } 8582 c := v_0.AuxInt 8583 v_1 := v.Args[1] 8584 if v_1.Op != OpConst8 { 8585 break 8586 } 8587 d := v_1.AuxInt 8588 if !(d != 0) { 8589 break 8590 } 8591 v.reset(OpConst8) 8592 v.AuxInt = int64(int8(c) / int8(d)) 8593 return true 8594 } 8595 // match: (Div8 n (Const8 [c])) 8596 // cond: isNonNegative(n) && isPowerOfTwo(c&0xff) 8597 // result: (Rsh8Ux64 n (Const64 <typ.UInt64> [log2(c&0xff)])) 8598 for { 8599 _ = v.Args[1] 8600 n := v.Args[0] 8601 v_1 := v.Args[1] 8602 if v_1.Op != OpConst8 { 8603 break 8604 } 8605 c := v_1.AuxInt 8606 if !(isNonNegative(n) && isPowerOfTwo(c&0xff)) { 8607 break 8608 } 8609 v.reset(OpRsh8Ux64) 8610 v.AddArg(n) 8611 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8612 v0.AuxInt = log2(c & 0xff) 8613 v.AddArg(v0) 8614 return true 8615 } 8616 // match: (Div8 <t> n (Const8 [c])) 8617 // cond: c < 0 && c != -1<<7 8618 // result: (Neg8 (Div8 <t> n (Const8 <t> [-c]))) 8619 for { 8620 t := v.Type 8621 _ = v.Args[1] 8622 n := v.Args[0] 8623 v_1 := v.Args[1] 8624 if v_1.Op != OpConst8 { 8625 break 8626 } 8627 c := v_1.AuxInt 8628 if !(c < 0 && c != -1<<7) { 8629 break 8630 } 8631 v.reset(OpNeg8) 8632 v0 := b.NewValue0(v.Pos, OpDiv8, t) 8633 v0.AddArg(n) 8634 v1 := b.NewValue0(v.Pos, OpConst8, t) 8635 v1.AuxInt = -c 8636 v0.AddArg(v1) 8637 v.AddArg(v0) 8638 return true 8639 } 8640 // match: (Div8 <t> x (Const8 [-1<<7 ])) 8641 // cond: 8642 // result: (Rsh8Ux64 (And8 <t> x (Neg8 <t> x)) (Const64 <typ.UInt64> [7 ])) 8643 for { 8644 t := v.Type 8645 _ = v.Args[1] 8646 x := v.Args[0] 8647 v_1 := v.Args[1] 8648 if v_1.Op != OpConst8 { 8649 break 8650 } 8651 if v_1.AuxInt != -1<<7 { 8652 break 8653 } 8654 v.reset(OpRsh8Ux64) 8655 v0 := b.NewValue0(v.Pos, OpAnd8, t) 8656 v0.AddArg(x) 8657 v1 := b.NewValue0(v.Pos, OpNeg8, t) 8658 v1.AddArg(x) 8659 v0.AddArg(v1) 8660 v.AddArg(v0) 8661 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8662 v2.AuxInt = 7 8663 v.AddArg(v2) 8664 return true 8665 } 8666 // match: (Div8 <t> n (Const8 [c])) 8667 // cond: isPowerOfTwo(c) 8668 // result: (Rsh8x64 (Add8 <t> n (Rsh8Ux64 <t> (Rsh8x64 <t> n (Const64 <typ.UInt64> [ 7])) (Const64 <typ.UInt64> [ 8-log2(c)]))) (Const64 <typ.UInt64> [log2(c)])) 8669 for { 8670 t := v.Type 8671 _ = v.Args[1] 8672 n := v.Args[0] 8673 v_1 := v.Args[1] 8674 if v_1.Op != OpConst8 { 8675 break 8676 } 8677 c := v_1.AuxInt 8678 if !(isPowerOfTwo(c)) { 8679 break 8680 } 8681 v.reset(OpRsh8x64) 8682 v0 := b.NewValue0(v.Pos, OpAdd8, t) 8683 v0.AddArg(n) 8684 v1 := b.NewValue0(v.Pos, OpRsh8Ux64, t) 8685 v2 := b.NewValue0(v.Pos, OpRsh8x64, t) 8686 v2.AddArg(n) 8687 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8688 v3.AuxInt = 7 8689 v2.AddArg(v3) 8690 v1.AddArg(v2) 8691 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8692 v4.AuxInt = 8 - log2(c) 8693 v1.AddArg(v4) 8694 v0.AddArg(v1) 8695 v.AddArg(v0) 8696 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8697 v5.AuxInt = log2(c) 8698 v.AddArg(v5) 8699 return true 8700 } 8701 // match: (Div8 <t> x (Const8 [c])) 8702 // cond: smagicOK(8,c) 8703 // result: (Sub8 <t> (Rsh32x64 <t> (Mul32 <typ.UInt32> (Const32 <typ.UInt32> [int64(smagic(8,c).m)]) (SignExt8to32 x)) (Const64 <typ.UInt64> [8+smagic(8,c).s])) (Rsh32x64 <t> (SignExt8to32 x) (Const64 <typ.UInt64> [31]))) 8704 for { 8705 t := v.Type 8706 _ = v.Args[1] 8707 x := v.Args[0] 8708 v_1 := v.Args[1] 8709 if v_1.Op != OpConst8 { 8710 break 8711 } 8712 c := v_1.AuxInt 8713 if !(smagicOK(8, c)) { 8714 break 8715 } 8716 v.reset(OpSub8) 8717 v.Type = t 8718 v0 := b.NewValue0(v.Pos, OpRsh32x64, t) 8719 v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) 8720 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 8721 v2.AuxInt = int64(smagic(8, c).m) 8722 v1.AddArg(v2) 8723 v3 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 8724 v3.AddArg(x) 8725 v1.AddArg(v3) 8726 v0.AddArg(v1) 8727 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8728 v4.AuxInt = 8 + smagic(8, c).s 8729 v0.AddArg(v4) 8730 v.AddArg(v0) 8731 v5 := b.NewValue0(v.Pos, OpRsh32x64, t) 8732 v6 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 8733 v6.AddArg(x) 8734 v5.AddArg(v6) 8735 v7 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8736 v7.AuxInt = 31 8737 v5.AddArg(v7) 8738 v.AddArg(v5) 8739 return true 8740 } 8741 return false 8742 } 8743 func rewriteValuegeneric_OpDiv8u_0(v *Value) bool { 8744 b := v.Block 8745 _ = b 8746 typ := &b.Func.Config.Types 8747 _ = typ 8748 // match: (Div8u (Const8 [c]) (Const8 [d])) 8749 // cond: d != 0 8750 // result: (Const8 [int64(int8(uint8(c)/uint8(d)))]) 8751 for { 8752 _ = v.Args[1] 8753 v_0 := v.Args[0] 8754 if v_0.Op != OpConst8 { 8755 break 8756 } 8757 c := v_0.AuxInt 8758 v_1 := v.Args[1] 8759 if v_1.Op != OpConst8 { 8760 break 8761 } 8762 d := v_1.AuxInt 8763 if !(d != 0) { 8764 break 8765 } 8766 v.reset(OpConst8) 8767 v.AuxInt = int64(int8(uint8(c) / uint8(d))) 8768 return true 8769 } 8770 // match: (Div8u n (Const8 [c])) 8771 // cond: isPowerOfTwo(c&0xff) 8772 // result: (Rsh8Ux64 n (Const64 <typ.UInt64> [log2(c&0xff)])) 8773 for { 8774 _ = v.Args[1] 8775 n := v.Args[0] 8776 v_1 := v.Args[1] 8777 if v_1.Op != OpConst8 { 8778 break 8779 } 8780 c := v_1.AuxInt 8781 if !(isPowerOfTwo(c & 0xff)) { 8782 break 8783 } 8784 v.reset(OpRsh8Ux64) 8785 v.AddArg(n) 8786 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8787 v0.AuxInt = log2(c & 0xff) 8788 v.AddArg(v0) 8789 return true 8790 } 8791 // match: (Div8u x (Const8 [c])) 8792 // cond: umagicOK(8, c) 8793 // result: (Trunc32to8 (Rsh32Ux64 <typ.UInt32> (Mul32 <typ.UInt32> (Const32 <typ.UInt32> [int64(1<<8+umagic(8,c).m)]) (ZeroExt8to32 x)) (Const64 <typ.UInt64> [8+umagic(8,c).s]))) 8794 for { 8795 _ = v.Args[1] 8796 x := v.Args[0] 8797 v_1 := v.Args[1] 8798 if v_1.Op != OpConst8 { 8799 break 8800 } 8801 c := v_1.AuxInt 8802 if !(umagicOK(8, c)) { 8803 break 8804 } 8805 v.reset(OpTrunc32to8) 8806 v0 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32) 8807 v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) 8808 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 8809 v2.AuxInt = int64(1<<8 + umagic(8, c).m) 8810 v1.AddArg(v2) 8811 v3 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 8812 v3.AddArg(x) 8813 v1.AddArg(v3) 8814 v0.AddArg(v1) 8815 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8816 v4.AuxInt = 8 + umagic(8, c).s 8817 v0.AddArg(v4) 8818 v.AddArg(v0) 8819 return true 8820 } 8821 return false 8822 } 8823 func rewriteValuegeneric_OpEq16_0(v *Value) bool { 8824 b := v.Block 8825 _ = b 8826 // match: (Eq16 x x) 8827 // cond: 8828 // result: (ConstBool [1]) 8829 for { 8830 _ = v.Args[1] 8831 x := v.Args[0] 8832 if x != v.Args[1] { 8833 break 8834 } 8835 v.reset(OpConstBool) 8836 v.AuxInt = 1 8837 return true 8838 } 8839 // match: (Eq16 (Const16 <t> [c]) (Add16 (Const16 <t> [d]) x)) 8840 // cond: 8841 // result: (Eq16 (Const16 <t> [int64(int16(c-d))]) x) 8842 for { 8843 _ = v.Args[1] 8844 v_0 := v.Args[0] 8845 if v_0.Op != OpConst16 { 8846 break 8847 } 8848 t := v_0.Type 8849 c := v_0.AuxInt 8850 v_1 := v.Args[1] 8851 if v_1.Op != OpAdd16 { 8852 break 8853 } 8854 _ = v_1.Args[1] 8855 v_1_0 := v_1.Args[0] 8856 if v_1_0.Op != OpConst16 { 8857 break 8858 } 8859 if v_1_0.Type != t { 8860 break 8861 } 8862 d := v_1_0.AuxInt 8863 x := v_1.Args[1] 8864 v.reset(OpEq16) 8865 v0 := b.NewValue0(v.Pos, OpConst16, t) 8866 v0.AuxInt = int64(int16(c - d)) 8867 v.AddArg(v0) 8868 v.AddArg(x) 8869 return true 8870 } 8871 // match: (Eq16 (Const16 <t> [c]) (Add16 x (Const16 <t> [d]))) 8872 // cond: 8873 // result: (Eq16 (Const16 <t> [int64(int16(c-d))]) x) 8874 for { 8875 _ = v.Args[1] 8876 v_0 := v.Args[0] 8877 if v_0.Op != OpConst16 { 8878 break 8879 } 8880 t := v_0.Type 8881 c := v_0.AuxInt 8882 v_1 := v.Args[1] 8883 if v_1.Op != OpAdd16 { 8884 break 8885 } 8886 _ = v_1.Args[1] 8887 x := v_1.Args[0] 8888 v_1_1 := v_1.Args[1] 8889 if v_1_1.Op != OpConst16 { 8890 break 8891 } 8892 if v_1_1.Type != t { 8893 break 8894 } 8895 d := v_1_1.AuxInt 8896 v.reset(OpEq16) 8897 v0 := b.NewValue0(v.Pos, OpConst16, t) 8898 v0.AuxInt = int64(int16(c - d)) 8899 v.AddArg(v0) 8900 v.AddArg(x) 8901 return true 8902 } 8903 // match: (Eq16 (Add16 (Const16 <t> [d]) x) (Const16 <t> [c])) 8904 // cond: 8905 // result: (Eq16 (Const16 <t> [int64(int16(c-d))]) x) 8906 for { 8907 _ = v.Args[1] 8908 v_0 := v.Args[0] 8909 if v_0.Op != OpAdd16 { 8910 break 8911 } 8912 _ = v_0.Args[1] 8913 v_0_0 := v_0.Args[0] 8914 if v_0_0.Op != OpConst16 { 8915 break 8916 } 8917 t := v_0_0.Type 8918 d := v_0_0.AuxInt 8919 x := v_0.Args[1] 8920 v_1 := v.Args[1] 8921 if v_1.Op != OpConst16 { 8922 break 8923 } 8924 if v_1.Type != t { 8925 break 8926 } 8927 c := v_1.AuxInt 8928 v.reset(OpEq16) 8929 v0 := b.NewValue0(v.Pos, OpConst16, t) 8930 v0.AuxInt = int64(int16(c - d)) 8931 v.AddArg(v0) 8932 v.AddArg(x) 8933 return true 8934 } 8935 // match: (Eq16 (Add16 x (Const16 <t> [d])) (Const16 <t> [c])) 8936 // cond: 8937 // result: (Eq16 (Const16 <t> [int64(int16(c-d))]) x) 8938 for { 8939 _ = v.Args[1] 8940 v_0 := v.Args[0] 8941 if v_0.Op != OpAdd16 { 8942 break 8943 } 8944 _ = v_0.Args[1] 8945 x := v_0.Args[0] 8946 v_0_1 := v_0.Args[1] 8947 if v_0_1.Op != OpConst16 { 8948 break 8949 } 8950 t := v_0_1.Type 8951 d := v_0_1.AuxInt 8952 v_1 := v.Args[1] 8953 if v_1.Op != OpConst16 { 8954 break 8955 } 8956 if v_1.Type != t { 8957 break 8958 } 8959 c := v_1.AuxInt 8960 v.reset(OpEq16) 8961 v0 := b.NewValue0(v.Pos, OpConst16, t) 8962 v0.AuxInt = int64(int16(c - d)) 8963 v.AddArg(v0) 8964 v.AddArg(x) 8965 return true 8966 } 8967 // match: (Eq16 (Const16 [c]) (Const16 [d])) 8968 // cond: 8969 // result: (ConstBool [b2i(c == d)]) 8970 for { 8971 _ = v.Args[1] 8972 v_0 := v.Args[0] 8973 if v_0.Op != OpConst16 { 8974 break 8975 } 8976 c := v_0.AuxInt 8977 v_1 := v.Args[1] 8978 if v_1.Op != OpConst16 { 8979 break 8980 } 8981 d := v_1.AuxInt 8982 v.reset(OpConstBool) 8983 v.AuxInt = b2i(c == d) 8984 return true 8985 } 8986 // match: (Eq16 (Const16 [d]) (Const16 [c])) 8987 // cond: 8988 // result: (ConstBool [b2i(c == d)]) 8989 for { 8990 _ = v.Args[1] 8991 v_0 := v.Args[0] 8992 if v_0.Op != OpConst16 { 8993 break 8994 } 8995 d := v_0.AuxInt 8996 v_1 := v.Args[1] 8997 if v_1.Op != OpConst16 { 8998 break 8999 } 9000 c := v_1.AuxInt 9001 v.reset(OpConstBool) 9002 v.AuxInt = b2i(c == d) 9003 return true 9004 } 9005 return false 9006 } 9007 func rewriteValuegeneric_OpEq32_0(v *Value) bool { 9008 b := v.Block 9009 _ = b 9010 // match: (Eq32 x x) 9011 // cond: 9012 // result: (ConstBool [1]) 9013 for { 9014 _ = v.Args[1] 9015 x := v.Args[0] 9016 if x != v.Args[1] { 9017 break 9018 } 9019 v.reset(OpConstBool) 9020 v.AuxInt = 1 9021 return true 9022 } 9023 // match: (Eq32 (Const32 <t> [c]) (Add32 (Const32 <t> [d]) x)) 9024 // cond: 9025 // result: (Eq32 (Const32 <t> [int64(int32(c-d))]) x) 9026 for { 9027 _ = v.Args[1] 9028 v_0 := v.Args[0] 9029 if v_0.Op != OpConst32 { 9030 break 9031 } 9032 t := v_0.Type 9033 c := v_0.AuxInt 9034 v_1 := v.Args[1] 9035 if v_1.Op != OpAdd32 { 9036 break 9037 } 9038 _ = v_1.Args[1] 9039 v_1_0 := v_1.Args[0] 9040 if v_1_0.Op != OpConst32 { 9041 break 9042 } 9043 if v_1_0.Type != t { 9044 break 9045 } 9046 d := v_1_0.AuxInt 9047 x := v_1.Args[1] 9048 v.reset(OpEq32) 9049 v0 := b.NewValue0(v.Pos, OpConst32, t) 9050 v0.AuxInt = int64(int32(c - d)) 9051 v.AddArg(v0) 9052 v.AddArg(x) 9053 return true 9054 } 9055 // match: (Eq32 (Const32 <t> [c]) (Add32 x (Const32 <t> [d]))) 9056 // cond: 9057 // result: (Eq32 (Const32 <t> [int64(int32(c-d))]) x) 9058 for { 9059 _ = v.Args[1] 9060 v_0 := v.Args[0] 9061 if v_0.Op != OpConst32 { 9062 break 9063 } 9064 t := v_0.Type 9065 c := v_0.AuxInt 9066 v_1 := v.Args[1] 9067 if v_1.Op != OpAdd32 { 9068 break 9069 } 9070 _ = v_1.Args[1] 9071 x := v_1.Args[0] 9072 v_1_1 := v_1.Args[1] 9073 if v_1_1.Op != OpConst32 { 9074 break 9075 } 9076 if v_1_1.Type != t { 9077 break 9078 } 9079 d := v_1_1.AuxInt 9080 v.reset(OpEq32) 9081 v0 := b.NewValue0(v.Pos, OpConst32, t) 9082 v0.AuxInt = int64(int32(c - d)) 9083 v.AddArg(v0) 9084 v.AddArg(x) 9085 return true 9086 } 9087 // match: (Eq32 (Add32 (Const32 <t> [d]) x) (Const32 <t> [c])) 9088 // cond: 9089 // result: (Eq32 (Const32 <t> [int64(int32(c-d))]) x) 9090 for { 9091 _ = v.Args[1] 9092 v_0 := v.Args[0] 9093 if v_0.Op != OpAdd32 { 9094 break 9095 } 9096 _ = v_0.Args[1] 9097 v_0_0 := v_0.Args[0] 9098 if v_0_0.Op != OpConst32 { 9099 break 9100 } 9101 t := v_0_0.Type 9102 d := v_0_0.AuxInt 9103 x := v_0.Args[1] 9104 v_1 := v.Args[1] 9105 if v_1.Op != OpConst32 { 9106 break 9107 } 9108 if v_1.Type != t { 9109 break 9110 } 9111 c := v_1.AuxInt 9112 v.reset(OpEq32) 9113 v0 := b.NewValue0(v.Pos, OpConst32, t) 9114 v0.AuxInt = int64(int32(c - d)) 9115 v.AddArg(v0) 9116 v.AddArg(x) 9117 return true 9118 } 9119 // match: (Eq32 (Add32 x (Const32 <t> [d])) (Const32 <t> [c])) 9120 // cond: 9121 // result: (Eq32 (Const32 <t> [int64(int32(c-d))]) x) 9122 for { 9123 _ = v.Args[1] 9124 v_0 := v.Args[0] 9125 if v_0.Op != OpAdd32 { 9126 break 9127 } 9128 _ = v_0.Args[1] 9129 x := v_0.Args[0] 9130 v_0_1 := v_0.Args[1] 9131 if v_0_1.Op != OpConst32 { 9132 break 9133 } 9134 t := v_0_1.Type 9135 d := v_0_1.AuxInt 9136 v_1 := v.Args[1] 9137 if v_1.Op != OpConst32 { 9138 break 9139 } 9140 if v_1.Type != t { 9141 break 9142 } 9143 c := v_1.AuxInt 9144 v.reset(OpEq32) 9145 v0 := b.NewValue0(v.Pos, OpConst32, t) 9146 v0.AuxInt = int64(int32(c - d)) 9147 v.AddArg(v0) 9148 v.AddArg(x) 9149 return true 9150 } 9151 // match: (Eq32 (Const32 [c]) (Const32 [d])) 9152 // cond: 9153 // result: (ConstBool [b2i(c == d)]) 9154 for { 9155 _ = v.Args[1] 9156 v_0 := v.Args[0] 9157 if v_0.Op != OpConst32 { 9158 break 9159 } 9160 c := v_0.AuxInt 9161 v_1 := v.Args[1] 9162 if v_1.Op != OpConst32 { 9163 break 9164 } 9165 d := v_1.AuxInt 9166 v.reset(OpConstBool) 9167 v.AuxInt = b2i(c == d) 9168 return true 9169 } 9170 // match: (Eq32 (Const32 [d]) (Const32 [c])) 9171 // cond: 9172 // result: (ConstBool [b2i(c == d)]) 9173 for { 9174 _ = v.Args[1] 9175 v_0 := v.Args[0] 9176 if v_0.Op != OpConst32 { 9177 break 9178 } 9179 d := v_0.AuxInt 9180 v_1 := v.Args[1] 9181 if v_1.Op != OpConst32 { 9182 break 9183 } 9184 c := v_1.AuxInt 9185 v.reset(OpConstBool) 9186 v.AuxInt = b2i(c == d) 9187 return true 9188 } 9189 return false 9190 } 9191 func rewriteValuegeneric_OpEq32F_0(v *Value) bool { 9192 // match: (Eq32F (Const32F [c]) (Const32F [d])) 9193 // cond: 9194 // result: (ConstBool [b2i(i2f(c) == i2f(d))]) 9195 for { 9196 _ = v.Args[1] 9197 v_0 := v.Args[0] 9198 if v_0.Op != OpConst32F { 9199 break 9200 } 9201 c := v_0.AuxInt 9202 v_1 := v.Args[1] 9203 if v_1.Op != OpConst32F { 9204 break 9205 } 9206 d := v_1.AuxInt 9207 v.reset(OpConstBool) 9208 v.AuxInt = b2i(i2f(c) == i2f(d)) 9209 return true 9210 } 9211 // match: (Eq32F (Const32F [d]) (Const32F [c])) 9212 // cond: 9213 // result: (ConstBool [b2i(i2f(c) == i2f(d))]) 9214 for { 9215 _ = v.Args[1] 9216 v_0 := v.Args[0] 9217 if v_0.Op != OpConst32F { 9218 break 9219 } 9220 d := v_0.AuxInt 9221 v_1 := v.Args[1] 9222 if v_1.Op != OpConst32F { 9223 break 9224 } 9225 c := v_1.AuxInt 9226 v.reset(OpConstBool) 9227 v.AuxInt = b2i(i2f(c) == i2f(d)) 9228 return true 9229 } 9230 return false 9231 } 9232 func rewriteValuegeneric_OpEq64_0(v *Value) bool { 9233 b := v.Block 9234 _ = b 9235 // match: (Eq64 x x) 9236 // cond: 9237 // result: (ConstBool [1]) 9238 for { 9239 _ = v.Args[1] 9240 x := v.Args[0] 9241 if x != v.Args[1] { 9242 break 9243 } 9244 v.reset(OpConstBool) 9245 v.AuxInt = 1 9246 return true 9247 } 9248 // match: (Eq64 (Const64 <t> [c]) (Add64 (Const64 <t> [d]) x)) 9249 // cond: 9250 // result: (Eq64 (Const64 <t> [c-d]) x) 9251 for { 9252 _ = v.Args[1] 9253 v_0 := v.Args[0] 9254 if v_0.Op != OpConst64 { 9255 break 9256 } 9257 t := v_0.Type 9258 c := v_0.AuxInt 9259 v_1 := v.Args[1] 9260 if v_1.Op != OpAdd64 { 9261 break 9262 } 9263 _ = v_1.Args[1] 9264 v_1_0 := v_1.Args[0] 9265 if v_1_0.Op != OpConst64 { 9266 break 9267 } 9268 if v_1_0.Type != t { 9269 break 9270 } 9271 d := v_1_0.AuxInt 9272 x := v_1.Args[1] 9273 v.reset(OpEq64) 9274 v0 := b.NewValue0(v.Pos, OpConst64, t) 9275 v0.AuxInt = c - d 9276 v.AddArg(v0) 9277 v.AddArg(x) 9278 return true 9279 } 9280 // match: (Eq64 (Const64 <t> [c]) (Add64 x (Const64 <t> [d]))) 9281 // cond: 9282 // result: (Eq64 (Const64 <t> [c-d]) x) 9283 for { 9284 _ = v.Args[1] 9285 v_0 := v.Args[0] 9286 if v_0.Op != OpConst64 { 9287 break 9288 } 9289 t := v_0.Type 9290 c := v_0.AuxInt 9291 v_1 := v.Args[1] 9292 if v_1.Op != OpAdd64 { 9293 break 9294 } 9295 _ = v_1.Args[1] 9296 x := v_1.Args[0] 9297 v_1_1 := v_1.Args[1] 9298 if v_1_1.Op != OpConst64 { 9299 break 9300 } 9301 if v_1_1.Type != t { 9302 break 9303 } 9304 d := v_1_1.AuxInt 9305 v.reset(OpEq64) 9306 v0 := b.NewValue0(v.Pos, OpConst64, t) 9307 v0.AuxInt = c - d 9308 v.AddArg(v0) 9309 v.AddArg(x) 9310 return true 9311 } 9312 // match: (Eq64 (Add64 (Const64 <t> [d]) x) (Const64 <t> [c])) 9313 // cond: 9314 // result: (Eq64 (Const64 <t> [c-d]) x) 9315 for { 9316 _ = v.Args[1] 9317 v_0 := v.Args[0] 9318 if v_0.Op != OpAdd64 { 9319 break 9320 } 9321 _ = v_0.Args[1] 9322 v_0_0 := v_0.Args[0] 9323 if v_0_0.Op != OpConst64 { 9324 break 9325 } 9326 t := v_0_0.Type 9327 d := v_0_0.AuxInt 9328 x := v_0.Args[1] 9329 v_1 := v.Args[1] 9330 if v_1.Op != OpConst64 { 9331 break 9332 } 9333 if v_1.Type != t { 9334 break 9335 } 9336 c := v_1.AuxInt 9337 v.reset(OpEq64) 9338 v0 := b.NewValue0(v.Pos, OpConst64, t) 9339 v0.AuxInt = c - d 9340 v.AddArg(v0) 9341 v.AddArg(x) 9342 return true 9343 } 9344 // match: (Eq64 (Add64 x (Const64 <t> [d])) (Const64 <t> [c])) 9345 // cond: 9346 // result: (Eq64 (Const64 <t> [c-d]) x) 9347 for { 9348 _ = v.Args[1] 9349 v_0 := v.Args[0] 9350 if v_0.Op != OpAdd64 { 9351 break 9352 } 9353 _ = v_0.Args[1] 9354 x := v_0.Args[0] 9355 v_0_1 := v_0.Args[1] 9356 if v_0_1.Op != OpConst64 { 9357 break 9358 } 9359 t := v_0_1.Type 9360 d := v_0_1.AuxInt 9361 v_1 := v.Args[1] 9362 if v_1.Op != OpConst64 { 9363 break 9364 } 9365 if v_1.Type != t { 9366 break 9367 } 9368 c := v_1.AuxInt 9369 v.reset(OpEq64) 9370 v0 := b.NewValue0(v.Pos, OpConst64, t) 9371 v0.AuxInt = c - d 9372 v.AddArg(v0) 9373 v.AddArg(x) 9374 return true 9375 } 9376 // match: (Eq64 (Const64 [c]) (Const64 [d])) 9377 // cond: 9378 // result: (ConstBool [b2i(c == d)]) 9379 for { 9380 _ = v.Args[1] 9381 v_0 := v.Args[0] 9382 if v_0.Op != OpConst64 { 9383 break 9384 } 9385 c := v_0.AuxInt 9386 v_1 := v.Args[1] 9387 if v_1.Op != OpConst64 { 9388 break 9389 } 9390 d := v_1.AuxInt 9391 v.reset(OpConstBool) 9392 v.AuxInt = b2i(c == d) 9393 return true 9394 } 9395 // match: (Eq64 (Const64 [d]) (Const64 [c])) 9396 // cond: 9397 // result: (ConstBool [b2i(c == d)]) 9398 for { 9399 _ = v.Args[1] 9400 v_0 := v.Args[0] 9401 if v_0.Op != OpConst64 { 9402 break 9403 } 9404 d := v_0.AuxInt 9405 v_1 := v.Args[1] 9406 if v_1.Op != OpConst64 { 9407 break 9408 } 9409 c := v_1.AuxInt 9410 v.reset(OpConstBool) 9411 v.AuxInt = b2i(c == d) 9412 return true 9413 } 9414 return false 9415 } 9416 func rewriteValuegeneric_OpEq64F_0(v *Value) bool { 9417 // match: (Eq64F (Const64F [c]) (Const64F [d])) 9418 // cond: 9419 // result: (ConstBool [b2i(i2f(c) == i2f(d))]) 9420 for { 9421 _ = v.Args[1] 9422 v_0 := v.Args[0] 9423 if v_0.Op != OpConst64F { 9424 break 9425 } 9426 c := v_0.AuxInt 9427 v_1 := v.Args[1] 9428 if v_1.Op != OpConst64F { 9429 break 9430 } 9431 d := v_1.AuxInt 9432 v.reset(OpConstBool) 9433 v.AuxInt = b2i(i2f(c) == i2f(d)) 9434 return true 9435 } 9436 // match: (Eq64F (Const64F [d]) (Const64F [c])) 9437 // cond: 9438 // result: (ConstBool [b2i(i2f(c) == i2f(d))]) 9439 for { 9440 _ = v.Args[1] 9441 v_0 := v.Args[0] 9442 if v_0.Op != OpConst64F { 9443 break 9444 } 9445 d := v_0.AuxInt 9446 v_1 := v.Args[1] 9447 if v_1.Op != OpConst64F { 9448 break 9449 } 9450 c := v_1.AuxInt 9451 v.reset(OpConstBool) 9452 v.AuxInt = b2i(i2f(c) == i2f(d)) 9453 return true 9454 } 9455 return false 9456 } 9457 func rewriteValuegeneric_OpEq8_0(v *Value) bool { 9458 b := v.Block 9459 _ = b 9460 // match: (Eq8 x x) 9461 // cond: 9462 // result: (ConstBool [1]) 9463 for { 9464 _ = v.Args[1] 9465 x := v.Args[0] 9466 if x != v.Args[1] { 9467 break 9468 } 9469 v.reset(OpConstBool) 9470 v.AuxInt = 1 9471 return true 9472 } 9473 // match: (Eq8 (Const8 <t> [c]) (Add8 (Const8 <t> [d]) x)) 9474 // cond: 9475 // result: (Eq8 (Const8 <t> [int64(int8(c-d))]) x) 9476 for { 9477 _ = v.Args[1] 9478 v_0 := v.Args[0] 9479 if v_0.Op != OpConst8 { 9480 break 9481 } 9482 t := v_0.Type 9483 c := v_0.AuxInt 9484 v_1 := v.Args[1] 9485 if v_1.Op != OpAdd8 { 9486 break 9487 } 9488 _ = v_1.Args[1] 9489 v_1_0 := v_1.Args[0] 9490 if v_1_0.Op != OpConst8 { 9491 break 9492 } 9493 if v_1_0.Type != t { 9494 break 9495 } 9496 d := v_1_0.AuxInt 9497 x := v_1.Args[1] 9498 v.reset(OpEq8) 9499 v0 := b.NewValue0(v.Pos, OpConst8, t) 9500 v0.AuxInt = int64(int8(c - d)) 9501 v.AddArg(v0) 9502 v.AddArg(x) 9503 return true 9504 } 9505 // match: (Eq8 (Const8 <t> [c]) (Add8 x (Const8 <t> [d]))) 9506 // cond: 9507 // result: (Eq8 (Const8 <t> [int64(int8(c-d))]) x) 9508 for { 9509 _ = v.Args[1] 9510 v_0 := v.Args[0] 9511 if v_0.Op != OpConst8 { 9512 break 9513 } 9514 t := v_0.Type 9515 c := v_0.AuxInt 9516 v_1 := v.Args[1] 9517 if v_1.Op != OpAdd8 { 9518 break 9519 } 9520 _ = v_1.Args[1] 9521 x := v_1.Args[0] 9522 v_1_1 := v_1.Args[1] 9523 if v_1_1.Op != OpConst8 { 9524 break 9525 } 9526 if v_1_1.Type != t { 9527 break 9528 } 9529 d := v_1_1.AuxInt 9530 v.reset(OpEq8) 9531 v0 := b.NewValue0(v.Pos, OpConst8, t) 9532 v0.AuxInt = int64(int8(c - d)) 9533 v.AddArg(v0) 9534 v.AddArg(x) 9535 return true 9536 } 9537 // match: (Eq8 (Add8 (Const8 <t> [d]) x) (Const8 <t> [c])) 9538 // cond: 9539 // result: (Eq8 (Const8 <t> [int64(int8(c-d))]) x) 9540 for { 9541 _ = v.Args[1] 9542 v_0 := v.Args[0] 9543 if v_0.Op != OpAdd8 { 9544 break 9545 } 9546 _ = v_0.Args[1] 9547 v_0_0 := v_0.Args[0] 9548 if v_0_0.Op != OpConst8 { 9549 break 9550 } 9551 t := v_0_0.Type 9552 d := v_0_0.AuxInt 9553 x := v_0.Args[1] 9554 v_1 := v.Args[1] 9555 if v_1.Op != OpConst8 { 9556 break 9557 } 9558 if v_1.Type != t { 9559 break 9560 } 9561 c := v_1.AuxInt 9562 v.reset(OpEq8) 9563 v0 := b.NewValue0(v.Pos, OpConst8, t) 9564 v0.AuxInt = int64(int8(c - d)) 9565 v.AddArg(v0) 9566 v.AddArg(x) 9567 return true 9568 } 9569 // match: (Eq8 (Add8 x (Const8 <t> [d])) (Const8 <t> [c])) 9570 // cond: 9571 // result: (Eq8 (Const8 <t> [int64(int8(c-d))]) x) 9572 for { 9573 _ = v.Args[1] 9574 v_0 := v.Args[0] 9575 if v_0.Op != OpAdd8 { 9576 break 9577 } 9578 _ = v_0.Args[1] 9579 x := v_0.Args[0] 9580 v_0_1 := v_0.Args[1] 9581 if v_0_1.Op != OpConst8 { 9582 break 9583 } 9584 t := v_0_1.Type 9585 d := v_0_1.AuxInt 9586 v_1 := v.Args[1] 9587 if v_1.Op != OpConst8 { 9588 break 9589 } 9590 if v_1.Type != t { 9591 break 9592 } 9593 c := v_1.AuxInt 9594 v.reset(OpEq8) 9595 v0 := b.NewValue0(v.Pos, OpConst8, t) 9596 v0.AuxInt = int64(int8(c - d)) 9597 v.AddArg(v0) 9598 v.AddArg(x) 9599 return true 9600 } 9601 // match: (Eq8 (Const8 [c]) (Const8 [d])) 9602 // cond: 9603 // result: (ConstBool [b2i(c == d)]) 9604 for { 9605 _ = v.Args[1] 9606 v_0 := v.Args[0] 9607 if v_0.Op != OpConst8 { 9608 break 9609 } 9610 c := v_0.AuxInt 9611 v_1 := v.Args[1] 9612 if v_1.Op != OpConst8 { 9613 break 9614 } 9615 d := v_1.AuxInt 9616 v.reset(OpConstBool) 9617 v.AuxInt = b2i(c == d) 9618 return true 9619 } 9620 // match: (Eq8 (Const8 [d]) (Const8 [c])) 9621 // cond: 9622 // result: (ConstBool [b2i(c == d)]) 9623 for { 9624 _ = v.Args[1] 9625 v_0 := v.Args[0] 9626 if v_0.Op != OpConst8 { 9627 break 9628 } 9629 d := v_0.AuxInt 9630 v_1 := v.Args[1] 9631 if v_1.Op != OpConst8 { 9632 break 9633 } 9634 c := v_1.AuxInt 9635 v.reset(OpConstBool) 9636 v.AuxInt = b2i(c == d) 9637 return true 9638 } 9639 return false 9640 } 9641 func rewriteValuegeneric_OpEqB_0(v *Value) bool { 9642 // match: (EqB (ConstBool [c]) (ConstBool [d])) 9643 // cond: 9644 // result: (ConstBool [b2i(c == d)]) 9645 for { 9646 _ = v.Args[1] 9647 v_0 := v.Args[0] 9648 if v_0.Op != OpConstBool { 9649 break 9650 } 9651 c := v_0.AuxInt 9652 v_1 := v.Args[1] 9653 if v_1.Op != OpConstBool { 9654 break 9655 } 9656 d := v_1.AuxInt 9657 v.reset(OpConstBool) 9658 v.AuxInt = b2i(c == d) 9659 return true 9660 } 9661 // match: (EqB (ConstBool [d]) (ConstBool [c])) 9662 // cond: 9663 // result: (ConstBool [b2i(c == d)]) 9664 for { 9665 _ = v.Args[1] 9666 v_0 := v.Args[0] 9667 if v_0.Op != OpConstBool { 9668 break 9669 } 9670 d := v_0.AuxInt 9671 v_1 := v.Args[1] 9672 if v_1.Op != OpConstBool { 9673 break 9674 } 9675 c := v_1.AuxInt 9676 v.reset(OpConstBool) 9677 v.AuxInt = b2i(c == d) 9678 return true 9679 } 9680 // match: (EqB (ConstBool [0]) x) 9681 // cond: 9682 // result: (Not x) 9683 for { 9684 _ = v.Args[1] 9685 v_0 := v.Args[0] 9686 if v_0.Op != OpConstBool { 9687 break 9688 } 9689 if v_0.AuxInt != 0 { 9690 break 9691 } 9692 x := v.Args[1] 9693 v.reset(OpNot) 9694 v.AddArg(x) 9695 return true 9696 } 9697 // match: (EqB x (ConstBool [0])) 9698 // cond: 9699 // result: (Not x) 9700 for { 9701 _ = v.Args[1] 9702 x := v.Args[0] 9703 v_1 := v.Args[1] 9704 if v_1.Op != OpConstBool { 9705 break 9706 } 9707 if v_1.AuxInt != 0 { 9708 break 9709 } 9710 v.reset(OpNot) 9711 v.AddArg(x) 9712 return true 9713 } 9714 // match: (EqB (ConstBool [1]) x) 9715 // cond: 9716 // result: x 9717 for { 9718 _ = v.Args[1] 9719 v_0 := v.Args[0] 9720 if v_0.Op != OpConstBool { 9721 break 9722 } 9723 if v_0.AuxInt != 1 { 9724 break 9725 } 9726 x := v.Args[1] 9727 v.reset(OpCopy) 9728 v.Type = x.Type 9729 v.AddArg(x) 9730 return true 9731 } 9732 // match: (EqB x (ConstBool [1])) 9733 // cond: 9734 // result: x 9735 for { 9736 _ = v.Args[1] 9737 x := v.Args[0] 9738 v_1 := v.Args[1] 9739 if v_1.Op != OpConstBool { 9740 break 9741 } 9742 if v_1.AuxInt != 1 { 9743 break 9744 } 9745 v.reset(OpCopy) 9746 v.Type = x.Type 9747 v.AddArg(x) 9748 return true 9749 } 9750 return false 9751 } 9752 func rewriteValuegeneric_OpEqInter_0(v *Value) bool { 9753 b := v.Block 9754 _ = b 9755 typ := &b.Func.Config.Types 9756 _ = typ 9757 // match: (EqInter x y) 9758 // cond: 9759 // result: (EqPtr (ITab x) (ITab y)) 9760 for { 9761 _ = v.Args[1] 9762 x := v.Args[0] 9763 y := v.Args[1] 9764 v.reset(OpEqPtr) 9765 v0 := b.NewValue0(v.Pos, OpITab, typ.BytePtr) 9766 v0.AddArg(x) 9767 v.AddArg(v0) 9768 v1 := b.NewValue0(v.Pos, OpITab, typ.BytePtr) 9769 v1.AddArg(y) 9770 v.AddArg(v1) 9771 return true 9772 } 9773 } 9774 func rewriteValuegeneric_OpEqPtr_0(v *Value) bool { 9775 b := v.Block 9776 _ = b 9777 typ := &b.Func.Config.Types 9778 _ = typ 9779 // match: (EqPtr p (ConstNil)) 9780 // cond: 9781 // result: (Not (IsNonNil p)) 9782 for { 9783 _ = v.Args[1] 9784 p := v.Args[0] 9785 v_1 := v.Args[1] 9786 if v_1.Op != OpConstNil { 9787 break 9788 } 9789 v.reset(OpNot) 9790 v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool) 9791 v0.AddArg(p) 9792 v.AddArg(v0) 9793 return true 9794 } 9795 // match: (EqPtr (ConstNil) p) 9796 // cond: 9797 // result: (Not (IsNonNil p)) 9798 for { 9799 _ = v.Args[1] 9800 v_0 := v.Args[0] 9801 if v_0.Op != OpConstNil { 9802 break 9803 } 9804 p := v.Args[1] 9805 v.reset(OpNot) 9806 v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool) 9807 v0.AddArg(p) 9808 v.AddArg(v0) 9809 return true 9810 } 9811 // match: (EqPtr x x) 9812 // cond: 9813 // result: (ConstBool [1]) 9814 for { 9815 _ = v.Args[1] 9816 x := v.Args[0] 9817 if x != v.Args[1] { 9818 break 9819 } 9820 v.reset(OpConstBool) 9821 v.AuxInt = 1 9822 return true 9823 } 9824 // match: (EqPtr (Addr {a} x) (Addr {b} x)) 9825 // cond: 9826 // result: (ConstBool [b2i(a == b)]) 9827 for { 9828 _ = v.Args[1] 9829 v_0 := v.Args[0] 9830 if v_0.Op != OpAddr { 9831 break 9832 } 9833 a := v_0.Aux 9834 x := v_0.Args[0] 9835 v_1 := v.Args[1] 9836 if v_1.Op != OpAddr { 9837 break 9838 } 9839 b := v_1.Aux 9840 if x != v_1.Args[0] { 9841 break 9842 } 9843 v.reset(OpConstBool) 9844 v.AuxInt = b2i(a == b) 9845 return true 9846 } 9847 // match: (EqPtr (Addr {b} x) (Addr {a} x)) 9848 // cond: 9849 // result: (ConstBool [b2i(a == b)]) 9850 for { 9851 _ = v.Args[1] 9852 v_0 := v.Args[0] 9853 if v_0.Op != OpAddr { 9854 break 9855 } 9856 b := v_0.Aux 9857 x := v_0.Args[0] 9858 v_1 := v.Args[1] 9859 if v_1.Op != OpAddr { 9860 break 9861 } 9862 a := v_1.Aux 9863 if x != v_1.Args[0] { 9864 break 9865 } 9866 v.reset(OpConstBool) 9867 v.AuxInt = b2i(a == b) 9868 return true 9869 } 9870 return false 9871 } 9872 func rewriteValuegeneric_OpEqSlice_0(v *Value) bool { 9873 b := v.Block 9874 _ = b 9875 typ := &b.Func.Config.Types 9876 _ = typ 9877 // match: (EqSlice x y) 9878 // cond: 9879 // result: (EqPtr (SlicePtr x) (SlicePtr y)) 9880 for { 9881 _ = v.Args[1] 9882 x := v.Args[0] 9883 y := v.Args[1] 9884 v.reset(OpEqPtr) 9885 v0 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr) 9886 v0.AddArg(x) 9887 v.AddArg(v0) 9888 v1 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr) 9889 v1.AddArg(y) 9890 v.AddArg(v1) 9891 return true 9892 } 9893 } 9894 func rewriteValuegeneric_OpGeq16_0(v *Value) bool { 9895 // match: (Geq16 (Const16 [c]) (Const16 [d])) 9896 // cond: 9897 // result: (ConstBool [b2i(c >= d)]) 9898 for { 9899 _ = v.Args[1] 9900 v_0 := v.Args[0] 9901 if v_0.Op != OpConst16 { 9902 break 9903 } 9904 c := v_0.AuxInt 9905 v_1 := v.Args[1] 9906 if v_1.Op != OpConst16 { 9907 break 9908 } 9909 d := v_1.AuxInt 9910 v.reset(OpConstBool) 9911 v.AuxInt = b2i(c >= d) 9912 return true 9913 } 9914 return false 9915 } 9916 func rewriteValuegeneric_OpGeq16U_0(v *Value) bool { 9917 // match: (Geq16U (Const16 [c]) (Const16 [d])) 9918 // cond: 9919 // result: (ConstBool [b2i(uint16(c) >= uint16(d))]) 9920 for { 9921 _ = v.Args[1] 9922 v_0 := v.Args[0] 9923 if v_0.Op != OpConst16 { 9924 break 9925 } 9926 c := v_0.AuxInt 9927 v_1 := v.Args[1] 9928 if v_1.Op != OpConst16 { 9929 break 9930 } 9931 d := v_1.AuxInt 9932 v.reset(OpConstBool) 9933 v.AuxInt = b2i(uint16(c) >= uint16(d)) 9934 return true 9935 } 9936 return false 9937 } 9938 func rewriteValuegeneric_OpGeq32_0(v *Value) bool { 9939 // match: (Geq32 (Const32 [c]) (Const32 [d])) 9940 // cond: 9941 // result: (ConstBool [b2i(c >= d)]) 9942 for { 9943 _ = v.Args[1] 9944 v_0 := v.Args[0] 9945 if v_0.Op != OpConst32 { 9946 break 9947 } 9948 c := v_0.AuxInt 9949 v_1 := v.Args[1] 9950 if v_1.Op != OpConst32 { 9951 break 9952 } 9953 d := v_1.AuxInt 9954 v.reset(OpConstBool) 9955 v.AuxInt = b2i(c >= d) 9956 return true 9957 } 9958 return false 9959 } 9960 func rewriteValuegeneric_OpGeq32F_0(v *Value) bool { 9961 // match: (Geq32F (Const32F [c]) (Const32F [d])) 9962 // cond: 9963 // result: (ConstBool [b2i(i2f(c) >= i2f(d))]) 9964 for { 9965 _ = v.Args[1] 9966 v_0 := v.Args[0] 9967 if v_0.Op != OpConst32F { 9968 break 9969 } 9970 c := v_0.AuxInt 9971 v_1 := v.Args[1] 9972 if v_1.Op != OpConst32F { 9973 break 9974 } 9975 d := v_1.AuxInt 9976 v.reset(OpConstBool) 9977 v.AuxInt = b2i(i2f(c) >= i2f(d)) 9978 return true 9979 } 9980 return false 9981 } 9982 func rewriteValuegeneric_OpGeq32U_0(v *Value) bool { 9983 // match: (Geq32U (Const32 [c]) (Const32 [d])) 9984 // cond: 9985 // result: (ConstBool [b2i(uint32(c) >= uint32(d))]) 9986 for { 9987 _ = v.Args[1] 9988 v_0 := v.Args[0] 9989 if v_0.Op != OpConst32 { 9990 break 9991 } 9992 c := v_0.AuxInt 9993 v_1 := v.Args[1] 9994 if v_1.Op != OpConst32 { 9995 break 9996 } 9997 d := v_1.AuxInt 9998 v.reset(OpConstBool) 9999 v.AuxInt = b2i(uint32(c) >= uint32(d)) 10000 return true 10001 } 10002 return false 10003 } 10004 func rewriteValuegeneric_OpGeq64_0(v *Value) bool { 10005 // match: (Geq64 (Const64 [c]) (Const64 [d])) 10006 // cond: 10007 // result: (ConstBool [b2i(c >= d)]) 10008 for { 10009 _ = v.Args[1] 10010 v_0 := v.Args[0] 10011 if v_0.Op != OpConst64 { 10012 break 10013 } 10014 c := v_0.AuxInt 10015 v_1 := v.Args[1] 10016 if v_1.Op != OpConst64 { 10017 break 10018 } 10019 d := v_1.AuxInt 10020 v.reset(OpConstBool) 10021 v.AuxInt = b2i(c >= d) 10022 return true 10023 } 10024 return false 10025 } 10026 func rewriteValuegeneric_OpGeq64F_0(v *Value) bool { 10027 // match: (Geq64F (Const64F [c]) (Const64F [d])) 10028 // cond: 10029 // result: (ConstBool [b2i(i2f(c) >= i2f(d))]) 10030 for { 10031 _ = v.Args[1] 10032 v_0 := v.Args[0] 10033 if v_0.Op != OpConst64F { 10034 break 10035 } 10036 c := v_0.AuxInt 10037 v_1 := v.Args[1] 10038 if v_1.Op != OpConst64F { 10039 break 10040 } 10041 d := v_1.AuxInt 10042 v.reset(OpConstBool) 10043 v.AuxInt = b2i(i2f(c) >= i2f(d)) 10044 return true 10045 } 10046 return false 10047 } 10048 func rewriteValuegeneric_OpGeq64U_0(v *Value) bool { 10049 // match: (Geq64U (Const64 [c]) (Const64 [d])) 10050 // cond: 10051 // result: (ConstBool [b2i(uint64(c) >= uint64(d))]) 10052 for { 10053 _ = v.Args[1] 10054 v_0 := v.Args[0] 10055 if v_0.Op != OpConst64 { 10056 break 10057 } 10058 c := v_0.AuxInt 10059 v_1 := v.Args[1] 10060 if v_1.Op != OpConst64 { 10061 break 10062 } 10063 d := v_1.AuxInt 10064 v.reset(OpConstBool) 10065 v.AuxInt = b2i(uint64(c) >= uint64(d)) 10066 return true 10067 } 10068 return false 10069 } 10070 func rewriteValuegeneric_OpGeq8_0(v *Value) bool { 10071 // match: (Geq8 (Const8 [c]) (Const8 [d])) 10072 // cond: 10073 // result: (ConstBool [b2i(c >= d)]) 10074 for { 10075 _ = v.Args[1] 10076 v_0 := v.Args[0] 10077 if v_0.Op != OpConst8 { 10078 break 10079 } 10080 c := v_0.AuxInt 10081 v_1 := v.Args[1] 10082 if v_1.Op != OpConst8 { 10083 break 10084 } 10085 d := v_1.AuxInt 10086 v.reset(OpConstBool) 10087 v.AuxInt = b2i(c >= d) 10088 return true 10089 } 10090 return false 10091 } 10092 func rewriteValuegeneric_OpGeq8U_0(v *Value) bool { 10093 // match: (Geq8U (Const8 [c]) (Const8 [d])) 10094 // cond: 10095 // result: (ConstBool [b2i(uint8(c) >= uint8(d))]) 10096 for { 10097 _ = v.Args[1] 10098 v_0 := v.Args[0] 10099 if v_0.Op != OpConst8 { 10100 break 10101 } 10102 c := v_0.AuxInt 10103 v_1 := v.Args[1] 10104 if v_1.Op != OpConst8 { 10105 break 10106 } 10107 d := v_1.AuxInt 10108 v.reset(OpConstBool) 10109 v.AuxInt = b2i(uint8(c) >= uint8(d)) 10110 return true 10111 } 10112 return false 10113 } 10114 func rewriteValuegeneric_OpGreater16_0(v *Value) bool { 10115 // match: (Greater16 (Const16 [c]) (Const16 [d])) 10116 // cond: 10117 // result: (ConstBool [b2i(c > d)]) 10118 for { 10119 _ = v.Args[1] 10120 v_0 := v.Args[0] 10121 if v_0.Op != OpConst16 { 10122 break 10123 } 10124 c := v_0.AuxInt 10125 v_1 := v.Args[1] 10126 if v_1.Op != OpConst16 { 10127 break 10128 } 10129 d := v_1.AuxInt 10130 v.reset(OpConstBool) 10131 v.AuxInt = b2i(c > d) 10132 return true 10133 } 10134 return false 10135 } 10136 func rewriteValuegeneric_OpGreater16U_0(v *Value) bool { 10137 // match: (Greater16U (Const16 [c]) (Const16 [d])) 10138 // cond: 10139 // result: (ConstBool [b2i(uint16(c) > uint16(d))]) 10140 for { 10141 _ = v.Args[1] 10142 v_0 := v.Args[0] 10143 if v_0.Op != OpConst16 { 10144 break 10145 } 10146 c := v_0.AuxInt 10147 v_1 := v.Args[1] 10148 if v_1.Op != OpConst16 { 10149 break 10150 } 10151 d := v_1.AuxInt 10152 v.reset(OpConstBool) 10153 v.AuxInt = b2i(uint16(c) > uint16(d)) 10154 return true 10155 } 10156 return false 10157 } 10158 func rewriteValuegeneric_OpGreater32_0(v *Value) bool { 10159 // match: (Greater32 (Const32 [c]) (Const32 [d])) 10160 // cond: 10161 // result: (ConstBool [b2i(c > d)]) 10162 for { 10163 _ = v.Args[1] 10164 v_0 := v.Args[0] 10165 if v_0.Op != OpConst32 { 10166 break 10167 } 10168 c := v_0.AuxInt 10169 v_1 := v.Args[1] 10170 if v_1.Op != OpConst32 { 10171 break 10172 } 10173 d := v_1.AuxInt 10174 v.reset(OpConstBool) 10175 v.AuxInt = b2i(c > d) 10176 return true 10177 } 10178 return false 10179 } 10180 func rewriteValuegeneric_OpGreater32F_0(v *Value) bool { 10181 // match: (Greater32F (Const32F [c]) (Const32F [d])) 10182 // cond: 10183 // result: (ConstBool [b2i(i2f(c) > i2f(d))]) 10184 for { 10185 _ = v.Args[1] 10186 v_0 := v.Args[0] 10187 if v_0.Op != OpConst32F { 10188 break 10189 } 10190 c := v_0.AuxInt 10191 v_1 := v.Args[1] 10192 if v_1.Op != OpConst32F { 10193 break 10194 } 10195 d := v_1.AuxInt 10196 v.reset(OpConstBool) 10197 v.AuxInt = b2i(i2f(c) > i2f(d)) 10198 return true 10199 } 10200 return false 10201 } 10202 func rewriteValuegeneric_OpGreater32U_0(v *Value) bool { 10203 // match: (Greater32U (Const32 [c]) (Const32 [d])) 10204 // cond: 10205 // result: (ConstBool [b2i(uint32(c) > uint32(d))]) 10206 for { 10207 _ = v.Args[1] 10208 v_0 := v.Args[0] 10209 if v_0.Op != OpConst32 { 10210 break 10211 } 10212 c := v_0.AuxInt 10213 v_1 := v.Args[1] 10214 if v_1.Op != OpConst32 { 10215 break 10216 } 10217 d := v_1.AuxInt 10218 v.reset(OpConstBool) 10219 v.AuxInt = b2i(uint32(c) > uint32(d)) 10220 return true 10221 } 10222 return false 10223 } 10224 func rewriteValuegeneric_OpGreater64_0(v *Value) bool { 10225 // match: (Greater64 (Const64 [c]) (Const64 [d])) 10226 // cond: 10227 // result: (ConstBool [b2i(c > d)]) 10228 for { 10229 _ = v.Args[1] 10230 v_0 := v.Args[0] 10231 if v_0.Op != OpConst64 { 10232 break 10233 } 10234 c := v_0.AuxInt 10235 v_1 := v.Args[1] 10236 if v_1.Op != OpConst64 { 10237 break 10238 } 10239 d := v_1.AuxInt 10240 v.reset(OpConstBool) 10241 v.AuxInt = b2i(c > d) 10242 return true 10243 } 10244 return false 10245 } 10246 func rewriteValuegeneric_OpGreater64F_0(v *Value) bool { 10247 // match: (Greater64F (Const64F [c]) (Const64F [d])) 10248 // cond: 10249 // result: (ConstBool [b2i(i2f(c) > i2f(d))]) 10250 for { 10251 _ = v.Args[1] 10252 v_0 := v.Args[0] 10253 if v_0.Op != OpConst64F { 10254 break 10255 } 10256 c := v_0.AuxInt 10257 v_1 := v.Args[1] 10258 if v_1.Op != OpConst64F { 10259 break 10260 } 10261 d := v_1.AuxInt 10262 v.reset(OpConstBool) 10263 v.AuxInt = b2i(i2f(c) > i2f(d)) 10264 return true 10265 } 10266 return false 10267 } 10268 func rewriteValuegeneric_OpGreater64U_0(v *Value) bool { 10269 // match: (Greater64U (Const64 [c]) (Const64 [d])) 10270 // cond: 10271 // result: (ConstBool [b2i(uint64(c) > uint64(d))]) 10272 for { 10273 _ = v.Args[1] 10274 v_0 := v.Args[0] 10275 if v_0.Op != OpConst64 { 10276 break 10277 } 10278 c := v_0.AuxInt 10279 v_1 := v.Args[1] 10280 if v_1.Op != OpConst64 { 10281 break 10282 } 10283 d := v_1.AuxInt 10284 v.reset(OpConstBool) 10285 v.AuxInt = b2i(uint64(c) > uint64(d)) 10286 return true 10287 } 10288 return false 10289 } 10290 func rewriteValuegeneric_OpGreater8_0(v *Value) bool { 10291 // match: (Greater8 (Const8 [c]) (Const8 [d])) 10292 // cond: 10293 // result: (ConstBool [b2i(c > d)]) 10294 for { 10295 _ = v.Args[1] 10296 v_0 := v.Args[0] 10297 if v_0.Op != OpConst8 { 10298 break 10299 } 10300 c := v_0.AuxInt 10301 v_1 := v.Args[1] 10302 if v_1.Op != OpConst8 { 10303 break 10304 } 10305 d := v_1.AuxInt 10306 v.reset(OpConstBool) 10307 v.AuxInt = b2i(c > d) 10308 return true 10309 } 10310 return false 10311 } 10312 func rewriteValuegeneric_OpGreater8U_0(v *Value) bool { 10313 // match: (Greater8U (Const8 [c]) (Const8 [d])) 10314 // cond: 10315 // result: (ConstBool [b2i(uint8(c) > uint8(d))]) 10316 for { 10317 _ = v.Args[1] 10318 v_0 := v.Args[0] 10319 if v_0.Op != OpConst8 { 10320 break 10321 } 10322 c := v_0.AuxInt 10323 v_1 := v.Args[1] 10324 if v_1.Op != OpConst8 { 10325 break 10326 } 10327 d := v_1.AuxInt 10328 v.reset(OpConstBool) 10329 v.AuxInt = b2i(uint8(c) > uint8(d)) 10330 return true 10331 } 10332 return false 10333 } 10334 func rewriteValuegeneric_OpIMake_0(v *Value) bool { 10335 // match: (IMake typ (StructMake1 val)) 10336 // cond: 10337 // result: (IMake typ val) 10338 for { 10339 _ = v.Args[1] 10340 typ := v.Args[0] 10341 v_1 := v.Args[1] 10342 if v_1.Op != OpStructMake1 { 10343 break 10344 } 10345 val := v_1.Args[0] 10346 v.reset(OpIMake) 10347 v.AddArg(typ) 10348 v.AddArg(val) 10349 return true 10350 } 10351 // match: (IMake typ (ArrayMake1 val)) 10352 // cond: 10353 // result: (IMake typ val) 10354 for { 10355 _ = v.Args[1] 10356 typ := v.Args[0] 10357 v_1 := v.Args[1] 10358 if v_1.Op != OpArrayMake1 { 10359 break 10360 } 10361 val := v_1.Args[0] 10362 v.reset(OpIMake) 10363 v.AddArg(typ) 10364 v.AddArg(val) 10365 return true 10366 } 10367 return false 10368 } 10369 func rewriteValuegeneric_OpInterCall_0(v *Value) bool { 10370 // match: (InterCall [argsize] (Load (OffPtr [off] (ITab (IMake (Addr {itab} (SB)) _))) _) mem) 10371 // cond: devirt(v, itab, off) != nil 10372 // result: (StaticCall [argsize] {devirt(v, itab, off)} mem) 10373 for { 10374 argsize := v.AuxInt 10375 _ = v.Args[1] 10376 v_0 := v.Args[0] 10377 if v_0.Op != OpLoad { 10378 break 10379 } 10380 _ = v_0.Args[1] 10381 v_0_0 := v_0.Args[0] 10382 if v_0_0.Op != OpOffPtr { 10383 break 10384 } 10385 off := v_0_0.AuxInt 10386 v_0_0_0 := v_0_0.Args[0] 10387 if v_0_0_0.Op != OpITab { 10388 break 10389 } 10390 v_0_0_0_0 := v_0_0_0.Args[0] 10391 if v_0_0_0_0.Op != OpIMake { 10392 break 10393 } 10394 _ = v_0_0_0_0.Args[1] 10395 v_0_0_0_0_0 := v_0_0_0_0.Args[0] 10396 if v_0_0_0_0_0.Op != OpAddr { 10397 break 10398 } 10399 itab := v_0_0_0_0_0.Aux 10400 v_0_0_0_0_0_0 := v_0_0_0_0_0.Args[0] 10401 if v_0_0_0_0_0_0.Op != OpSB { 10402 break 10403 } 10404 mem := v.Args[1] 10405 if !(devirt(v, itab, off) != nil) { 10406 break 10407 } 10408 v.reset(OpStaticCall) 10409 v.AuxInt = argsize 10410 v.Aux = devirt(v, itab, off) 10411 v.AddArg(mem) 10412 return true 10413 } 10414 return false 10415 } 10416 func rewriteValuegeneric_OpIsInBounds_0(v *Value) bool { 10417 // match: (IsInBounds (ZeroExt8to32 _) (Const32 [c])) 10418 // cond: (1 << 8) <= c 10419 // result: (ConstBool [1]) 10420 for { 10421 _ = v.Args[1] 10422 v_0 := v.Args[0] 10423 if v_0.Op != OpZeroExt8to32 { 10424 break 10425 } 10426 v_1 := v.Args[1] 10427 if v_1.Op != OpConst32 { 10428 break 10429 } 10430 c := v_1.AuxInt 10431 if !((1 << 8) <= c) { 10432 break 10433 } 10434 v.reset(OpConstBool) 10435 v.AuxInt = 1 10436 return true 10437 } 10438 // match: (IsInBounds (ZeroExt8to64 _) (Const64 [c])) 10439 // cond: (1 << 8) <= c 10440 // result: (ConstBool [1]) 10441 for { 10442 _ = v.Args[1] 10443 v_0 := v.Args[0] 10444 if v_0.Op != OpZeroExt8to64 { 10445 break 10446 } 10447 v_1 := v.Args[1] 10448 if v_1.Op != OpConst64 { 10449 break 10450 } 10451 c := v_1.AuxInt 10452 if !((1 << 8) <= c) { 10453 break 10454 } 10455 v.reset(OpConstBool) 10456 v.AuxInt = 1 10457 return true 10458 } 10459 // match: (IsInBounds (ZeroExt16to32 _) (Const32 [c])) 10460 // cond: (1 << 16) <= c 10461 // result: (ConstBool [1]) 10462 for { 10463 _ = v.Args[1] 10464 v_0 := v.Args[0] 10465 if v_0.Op != OpZeroExt16to32 { 10466 break 10467 } 10468 v_1 := v.Args[1] 10469 if v_1.Op != OpConst32 { 10470 break 10471 } 10472 c := v_1.AuxInt 10473 if !((1 << 16) <= c) { 10474 break 10475 } 10476 v.reset(OpConstBool) 10477 v.AuxInt = 1 10478 return true 10479 } 10480 // match: (IsInBounds (ZeroExt16to64 _) (Const64 [c])) 10481 // cond: (1 << 16) <= c 10482 // result: (ConstBool [1]) 10483 for { 10484 _ = v.Args[1] 10485 v_0 := v.Args[0] 10486 if v_0.Op != OpZeroExt16to64 { 10487 break 10488 } 10489 v_1 := v.Args[1] 10490 if v_1.Op != OpConst64 { 10491 break 10492 } 10493 c := v_1.AuxInt 10494 if !((1 << 16) <= c) { 10495 break 10496 } 10497 v.reset(OpConstBool) 10498 v.AuxInt = 1 10499 return true 10500 } 10501 // match: (IsInBounds x x) 10502 // cond: 10503 // result: (ConstBool [0]) 10504 for { 10505 _ = v.Args[1] 10506 x := v.Args[0] 10507 if x != v.Args[1] { 10508 break 10509 } 10510 v.reset(OpConstBool) 10511 v.AuxInt = 0 10512 return true 10513 } 10514 // match: (IsInBounds (And8 (Const8 [c]) _) (Const8 [d])) 10515 // cond: 0 <= c && c < d 10516 // result: (ConstBool [1]) 10517 for { 10518 _ = v.Args[1] 10519 v_0 := v.Args[0] 10520 if v_0.Op != OpAnd8 { 10521 break 10522 } 10523 _ = v_0.Args[1] 10524 v_0_0 := v_0.Args[0] 10525 if v_0_0.Op != OpConst8 { 10526 break 10527 } 10528 c := v_0_0.AuxInt 10529 v_1 := v.Args[1] 10530 if v_1.Op != OpConst8 { 10531 break 10532 } 10533 d := v_1.AuxInt 10534 if !(0 <= c && c < d) { 10535 break 10536 } 10537 v.reset(OpConstBool) 10538 v.AuxInt = 1 10539 return true 10540 } 10541 // match: (IsInBounds (And8 _ (Const8 [c])) (Const8 [d])) 10542 // cond: 0 <= c && c < d 10543 // result: (ConstBool [1]) 10544 for { 10545 _ = v.Args[1] 10546 v_0 := v.Args[0] 10547 if v_0.Op != OpAnd8 { 10548 break 10549 } 10550 _ = v_0.Args[1] 10551 v_0_1 := v_0.Args[1] 10552 if v_0_1.Op != OpConst8 { 10553 break 10554 } 10555 c := v_0_1.AuxInt 10556 v_1 := v.Args[1] 10557 if v_1.Op != OpConst8 { 10558 break 10559 } 10560 d := v_1.AuxInt 10561 if !(0 <= c && c < d) { 10562 break 10563 } 10564 v.reset(OpConstBool) 10565 v.AuxInt = 1 10566 return true 10567 } 10568 // match: (IsInBounds (ZeroExt8to16 (And8 (Const8 [c]) _)) (Const16 [d])) 10569 // cond: 0 <= c && c < d 10570 // result: (ConstBool [1]) 10571 for { 10572 _ = v.Args[1] 10573 v_0 := v.Args[0] 10574 if v_0.Op != OpZeroExt8to16 { 10575 break 10576 } 10577 v_0_0 := v_0.Args[0] 10578 if v_0_0.Op != OpAnd8 { 10579 break 10580 } 10581 _ = v_0_0.Args[1] 10582 v_0_0_0 := v_0_0.Args[0] 10583 if v_0_0_0.Op != OpConst8 { 10584 break 10585 } 10586 c := v_0_0_0.AuxInt 10587 v_1 := v.Args[1] 10588 if v_1.Op != OpConst16 { 10589 break 10590 } 10591 d := v_1.AuxInt 10592 if !(0 <= c && c < d) { 10593 break 10594 } 10595 v.reset(OpConstBool) 10596 v.AuxInt = 1 10597 return true 10598 } 10599 // match: (IsInBounds (ZeroExt8to16 (And8 _ (Const8 [c]))) (Const16 [d])) 10600 // cond: 0 <= c && c < d 10601 // result: (ConstBool [1]) 10602 for { 10603 _ = v.Args[1] 10604 v_0 := v.Args[0] 10605 if v_0.Op != OpZeroExt8to16 { 10606 break 10607 } 10608 v_0_0 := v_0.Args[0] 10609 if v_0_0.Op != OpAnd8 { 10610 break 10611 } 10612 _ = v_0_0.Args[1] 10613 v_0_0_1 := v_0_0.Args[1] 10614 if v_0_0_1.Op != OpConst8 { 10615 break 10616 } 10617 c := v_0_0_1.AuxInt 10618 v_1 := v.Args[1] 10619 if v_1.Op != OpConst16 { 10620 break 10621 } 10622 d := v_1.AuxInt 10623 if !(0 <= c && c < d) { 10624 break 10625 } 10626 v.reset(OpConstBool) 10627 v.AuxInt = 1 10628 return true 10629 } 10630 // match: (IsInBounds (ZeroExt8to32 (And8 (Const8 [c]) _)) (Const32 [d])) 10631 // cond: 0 <= c && c < d 10632 // result: (ConstBool [1]) 10633 for { 10634 _ = v.Args[1] 10635 v_0 := v.Args[0] 10636 if v_0.Op != OpZeroExt8to32 { 10637 break 10638 } 10639 v_0_0 := v_0.Args[0] 10640 if v_0_0.Op != OpAnd8 { 10641 break 10642 } 10643 _ = v_0_0.Args[1] 10644 v_0_0_0 := v_0_0.Args[0] 10645 if v_0_0_0.Op != OpConst8 { 10646 break 10647 } 10648 c := v_0_0_0.AuxInt 10649 v_1 := v.Args[1] 10650 if v_1.Op != OpConst32 { 10651 break 10652 } 10653 d := v_1.AuxInt 10654 if !(0 <= c && c < d) { 10655 break 10656 } 10657 v.reset(OpConstBool) 10658 v.AuxInt = 1 10659 return true 10660 } 10661 return false 10662 } 10663 func rewriteValuegeneric_OpIsInBounds_10(v *Value) bool { 10664 // match: (IsInBounds (ZeroExt8to32 (And8 _ (Const8 [c]))) (Const32 [d])) 10665 // cond: 0 <= c && c < d 10666 // result: (ConstBool [1]) 10667 for { 10668 _ = v.Args[1] 10669 v_0 := v.Args[0] 10670 if v_0.Op != OpZeroExt8to32 { 10671 break 10672 } 10673 v_0_0 := v_0.Args[0] 10674 if v_0_0.Op != OpAnd8 { 10675 break 10676 } 10677 _ = v_0_0.Args[1] 10678 v_0_0_1 := v_0_0.Args[1] 10679 if v_0_0_1.Op != OpConst8 { 10680 break 10681 } 10682 c := v_0_0_1.AuxInt 10683 v_1 := v.Args[1] 10684 if v_1.Op != OpConst32 { 10685 break 10686 } 10687 d := v_1.AuxInt 10688 if !(0 <= c && c < d) { 10689 break 10690 } 10691 v.reset(OpConstBool) 10692 v.AuxInt = 1 10693 return true 10694 } 10695 // match: (IsInBounds (ZeroExt8to64 (And8 (Const8 [c]) _)) (Const64 [d])) 10696 // cond: 0 <= c && c < d 10697 // result: (ConstBool [1]) 10698 for { 10699 _ = v.Args[1] 10700 v_0 := v.Args[0] 10701 if v_0.Op != OpZeroExt8to64 { 10702 break 10703 } 10704 v_0_0 := v_0.Args[0] 10705 if v_0_0.Op != OpAnd8 { 10706 break 10707 } 10708 _ = v_0_0.Args[1] 10709 v_0_0_0 := v_0_0.Args[0] 10710 if v_0_0_0.Op != OpConst8 { 10711 break 10712 } 10713 c := v_0_0_0.AuxInt 10714 v_1 := v.Args[1] 10715 if v_1.Op != OpConst64 { 10716 break 10717 } 10718 d := v_1.AuxInt 10719 if !(0 <= c && c < d) { 10720 break 10721 } 10722 v.reset(OpConstBool) 10723 v.AuxInt = 1 10724 return true 10725 } 10726 // match: (IsInBounds (ZeroExt8to64 (And8 _ (Const8 [c]))) (Const64 [d])) 10727 // cond: 0 <= c && c < d 10728 // result: (ConstBool [1]) 10729 for { 10730 _ = v.Args[1] 10731 v_0 := v.Args[0] 10732 if v_0.Op != OpZeroExt8to64 { 10733 break 10734 } 10735 v_0_0 := v_0.Args[0] 10736 if v_0_0.Op != OpAnd8 { 10737 break 10738 } 10739 _ = v_0_0.Args[1] 10740 v_0_0_1 := v_0_0.Args[1] 10741 if v_0_0_1.Op != OpConst8 { 10742 break 10743 } 10744 c := v_0_0_1.AuxInt 10745 v_1 := v.Args[1] 10746 if v_1.Op != OpConst64 { 10747 break 10748 } 10749 d := v_1.AuxInt 10750 if !(0 <= c && c < d) { 10751 break 10752 } 10753 v.reset(OpConstBool) 10754 v.AuxInt = 1 10755 return true 10756 } 10757 // match: (IsInBounds (And16 (Const16 [c]) _) (Const16 [d])) 10758 // cond: 0 <= c && c < d 10759 // result: (ConstBool [1]) 10760 for { 10761 _ = v.Args[1] 10762 v_0 := v.Args[0] 10763 if v_0.Op != OpAnd16 { 10764 break 10765 } 10766 _ = v_0.Args[1] 10767 v_0_0 := v_0.Args[0] 10768 if v_0_0.Op != OpConst16 { 10769 break 10770 } 10771 c := v_0_0.AuxInt 10772 v_1 := v.Args[1] 10773 if v_1.Op != OpConst16 { 10774 break 10775 } 10776 d := v_1.AuxInt 10777 if !(0 <= c && c < d) { 10778 break 10779 } 10780 v.reset(OpConstBool) 10781 v.AuxInt = 1 10782 return true 10783 } 10784 // match: (IsInBounds (And16 _ (Const16 [c])) (Const16 [d])) 10785 // cond: 0 <= c && c < d 10786 // result: (ConstBool [1]) 10787 for { 10788 _ = v.Args[1] 10789 v_0 := v.Args[0] 10790 if v_0.Op != OpAnd16 { 10791 break 10792 } 10793 _ = v_0.Args[1] 10794 v_0_1 := v_0.Args[1] 10795 if v_0_1.Op != OpConst16 { 10796 break 10797 } 10798 c := v_0_1.AuxInt 10799 v_1 := v.Args[1] 10800 if v_1.Op != OpConst16 { 10801 break 10802 } 10803 d := v_1.AuxInt 10804 if !(0 <= c && c < d) { 10805 break 10806 } 10807 v.reset(OpConstBool) 10808 v.AuxInt = 1 10809 return true 10810 } 10811 // match: (IsInBounds (ZeroExt16to32 (And16 (Const16 [c]) _)) (Const32 [d])) 10812 // cond: 0 <= c && c < d 10813 // result: (ConstBool [1]) 10814 for { 10815 _ = v.Args[1] 10816 v_0 := v.Args[0] 10817 if v_0.Op != OpZeroExt16to32 { 10818 break 10819 } 10820 v_0_0 := v_0.Args[0] 10821 if v_0_0.Op != OpAnd16 { 10822 break 10823 } 10824 _ = v_0_0.Args[1] 10825 v_0_0_0 := v_0_0.Args[0] 10826 if v_0_0_0.Op != OpConst16 { 10827 break 10828 } 10829 c := v_0_0_0.AuxInt 10830 v_1 := v.Args[1] 10831 if v_1.Op != OpConst32 { 10832 break 10833 } 10834 d := v_1.AuxInt 10835 if !(0 <= c && c < d) { 10836 break 10837 } 10838 v.reset(OpConstBool) 10839 v.AuxInt = 1 10840 return true 10841 } 10842 // match: (IsInBounds (ZeroExt16to32 (And16 _ (Const16 [c]))) (Const32 [d])) 10843 // cond: 0 <= c && c < d 10844 // result: (ConstBool [1]) 10845 for { 10846 _ = v.Args[1] 10847 v_0 := v.Args[0] 10848 if v_0.Op != OpZeroExt16to32 { 10849 break 10850 } 10851 v_0_0 := v_0.Args[0] 10852 if v_0_0.Op != OpAnd16 { 10853 break 10854 } 10855 _ = v_0_0.Args[1] 10856 v_0_0_1 := v_0_0.Args[1] 10857 if v_0_0_1.Op != OpConst16 { 10858 break 10859 } 10860 c := v_0_0_1.AuxInt 10861 v_1 := v.Args[1] 10862 if v_1.Op != OpConst32 { 10863 break 10864 } 10865 d := v_1.AuxInt 10866 if !(0 <= c && c < d) { 10867 break 10868 } 10869 v.reset(OpConstBool) 10870 v.AuxInt = 1 10871 return true 10872 } 10873 // match: (IsInBounds (ZeroExt16to64 (And16 (Const16 [c]) _)) (Const64 [d])) 10874 // cond: 0 <= c && c < d 10875 // result: (ConstBool [1]) 10876 for { 10877 _ = v.Args[1] 10878 v_0 := v.Args[0] 10879 if v_0.Op != OpZeroExt16to64 { 10880 break 10881 } 10882 v_0_0 := v_0.Args[0] 10883 if v_0_0.Op != OpAnd16 { 10884 break 10885 } 10886 _ = v_0_0.Args[1] 10887 v_0_0_0 := v_0_0.Args[0] 10888 if v_0_0_0.Op != OpConst16 { 10889 break 10890 } 10891 c := v_0_0_0.AuxInt 10892 v_1 := v.Args[1] 10893 if v_1.Op != OpConst64 { 10894 break 10895 } 10896 d := v_1.AuxInt 10897 if !(0 <= c && c < d) { 10898 break 10899 } 10900 v.reset(OpConstBool) 10901 v.AuxInt = 1 10902 return true 10903 } 10904 // match: (IsInBounds (ZeroExt16to64 (And16 _ (Const16 [c]))) (Const64 [d])) 10905 // cond: 0 <= c && c < d 10906 // result: (ConstBool [1]) 10907 for { 10908 _ = v.Args[1] 10909 v_0 := v.Args[0] 10910 if v_0.Op != OpZeroExt16to64 { 10911 break 10912 } 10913 v_0_0 := v_0.Args[0] 10914 if v_0_0.Op != OpAnd16 { 10915 break 10916 } 10917 _ = v_0_0.Args[1] 10918 v_0_0_1 := v_0_0.Args[1] 10919 if v_0_0_1.Op != OpConst16 { 10920 break 10921 } 10922 c := v_0_0_1.AuxInt 10923 v_1 := v.Args[1] 10924 if v_1.Op != OpConst64 { 10925 break 10926 } 10927 d := v_1.AuxInt 10928 if !(0 <= c && c < d) { 10929 break 10930 } 10931 v.reset(OpConstBool) 10932 v.AuxInt = 1 10933 return true 10934 } 10935 // match: (IsInBounds (And32 (Const32 [c]) _) (Const32 [d])) 10936 // cond: 0 <= c && c < d 10937 // result: (ConstBool [1]) 10938 for { 10939 _ = v.Args[1] 10940 v_0 := v.Args[0] 10941 if v_0.Op != OpAnd32 { 10942 break 10943 } 10944 _ = v_0.Args[1] 10945 v_0_0 := v_0.Args[0] 10946 if v_0_0.Op != OpConst32 { 10947 break 10948 } 10949 c := v_0_0.AuxInt 10950 v_1 := v.Args[1] 10951 if v_1.Op != OpConst32 { 10952 break 10953 } 10954 d := v_1.AuxInt 10955 if !(0 <= c && c < d) { 10956 break 10957 } 10958 v.reset(OpConstBool) 10959 v.AuxInt = 1 10960 return true 10961 } 10962 return false 10963 } 10964 func rewriteValuegeneric_OpIsInBounds_20(v *Value) bool { 10965 // match: (IsInBounds (And32 _ (Const32 [c])) (Const32 [d])) 10966 // cond: 0 <= c && c < d 10967 // result: (ConstBool [1]) 10968 for { 10969 _ = v.Args[1] 10970 v_0 := v.Args[0] 10971 if v_0.Op != OpAnd32 { 10972 break 10973 } 10974 _ = v_0.Args[1] 10975 v_0_1 := v_0.Args[1] 10976 if v_0_1.Op != OpConst32 { 10977 break 10978 } 10979 c := v_0_1.AuxInt 10980 v_1 := v.Args[1] 10981 if v_1.Op != OpConst32 { 10982 break 10983 } 10984 d := v_1.AuxInt 10985 if !(0 <= c && c < d) { 10986 break 10987 } 10988 v.reset(OpConstBool) 10989 v.AuxInt = 1 10990 return true 10991 } 10992 // match: (IsInBounds (ZeroExt32to64 (And32 (Const32 [c]) _)) (Const64 [d])) 10993 // cond: 0 <= c && c < d 10994 // result: (ConstBool [1]) 10995 for { 10996 _ = v.Args[1] 10997 v_0 := v.Args[0] 10998 if v_0.Op != OpZeroExt32to64 { 10999 break 11000 } 11001 v_0_0 := v_0.Args[0] 11002 if v_0_0.Op != OpAnd32 { 11003 break 11004 } 11005 _ = v_0_0.Args[1] 11006 v_0_0_0 := v_0_0.Args[0] 11007 if v_0_0_0.Op != OpConst32 { 11008 break 11009 } 11010 c := v_0_0_0.AuxInt 11011 v_1 := v.Args[1] 11012 if v_1.Op != OpConst64 { 11013 break 11014 } 11015 d := v_1.AuxInt 11016 if !(0 <= c && c < d) { 11017 break 11018 } 11019 v.reset(OpConstBool) 11020 v.AuxInt = 1 11021 return true 11022 } 11023 // match: (IsInBounds (ZeroExt32to64 (And32 _ (Const32 [c]))) (Const64 [d])) 11024 // cond: 0 <= c && c < d 11025 // result: (ConstBool [1]) 11026 for { 11027 _ = v.Args[1] 11028 v_0 := v.Args[0] 11029 if v_0.Op != OpZeroExt32to64 { 11030 break 11031 } 11032 v_0_0 := v_0.Args[0] 11033 if v_0_0.Op != OpAnd32 { 11034 break 11035 } 11036 _ = v_0_0.Args[1] 11037 v_0_0_1 := v_0_0.Args[1] 11038 if v_0_0_1.Op != OpConst32 { 11039 break 11040 } 11041 c := v_0_0_1.AuxInt 11042 v_1 := v.Args[1] 11043 if v_1.Op != OpConst64 { 11044 break 11045 } 11046 d := v_1.AuxInt 11047 if !(0 <= c && c < d) { 11048 break 11049 } 11050 v.reset(OpConstBool) 11051 v.AuxInt = 1 11052 return true 11053 } 11054 // match: (IsInBounds (And64 (Const64 [c]) _) (Const64 [d])) 11055 // cond: 0 <= c && c < d 11056 // result: (ConstBool [1]) 11057 for { 11058 _ = v.Args[1] 11059 v_0 := v.Args[0] 11060 if v_0.Op != OpAnd64 { 11061 break 11062 } 11063 _ = v_0.Args[1] 11064 v_0_0 := v_0.Args[0] 11065 if v_0_0.Op != OpConst64 { 11066 break 11067 } 11068 c := v_0_0.AuxInt 11069 v_1 := v.Args[1] 11070 if v_1.Op != OpConst64 { 11071 break 11072 } 11073 d := v_1.AuxInt 11074 if !(0 <= c && c < d) { 11075 break 11076 } 11077 v.reset(OpConstBool) 11078 v.AuxInt = 1 11079 return true 11080 } 11081 // match: (IsInBounds (And64 _ (Const64 [c])) (Const64 [d])) 11082 // cond: 0 <= c && c < d 11083 // result: (ConstBool [1]) 11084 for { 11085 _ = v.Args[1] 11086 v_0 := v.Args[0] 11087 if v_0.Op != OpAnd64 { 11088 break 11089 } 11090 _ = v_0.Args[1] 11091 v_0_1 := v_0.Args[1] 11092 if v_0_1.Op != OpConst64 { 11093 break 11094 } 11095 c := v_0_1.AuxInt 11096 v_1 := v.Args[1] 11097 if v_1.Op != OpConst64 { 11098 break 11099 } 11100 d := v_1.AuxInt 11101 if !(0 <= c && c < d) { 11102 break 11103 } 11104 v.reset(OpConstBool) 11105 v.AuxInt = 1 11106 return true 11107 } 11108 // match: (IsInBounds (Const32 [c]) (Const32 [d])) 11109 // cond: 11110 // result: (ConstBool [b2i(0 <= c && c < d)]) 11111 for { 11112 _ = v.Args[1] 11113 v_0 := v.Args[0] 11114 if v_0.Op != OpConst32 { 11115 break 11116 } 11117 c := v_0.AuxInt 11118 v_1 := v.Args[1] 11119 if v_1.Op != OpConst32 { 11120 break 11121 } 11122 d := v_1.AuxInt 11123 v.reset(OpConstBool) 11124 v.AuxInt = b2i(0 <= c && c < d) 11125 return true 11126 } 11127 // match: (IsInBounds (Const64 [c]) (Const64 [d])) 11128 // cond: 11129 // result: (ConstBool [b2i(0 <= c && c < d)]) 11130 for { 11131 _ = v.Args[1] 11132 v_0 := v.Args[0] 11133 if v_0.Op != OpConst64 { 11134 break 11135 } 11136 c := v_0.AuxInt 11137 v_1 := v.Args[1] 11138 if v_1.Op != OpConst64 { 11139 break 11140 } 11141 d := v_1.AuxInt 11142 v.reset(OpConstBool) 11143 v.AuxInt = b2i(0 <= c && c < d) 11144 return true 11145 } 11146 // match: (IsInBounds (Mod32u _ y) y) 11147 // cond: 11148 // result: (ConstBool [1]) 11149 for { 11150 _ = v.Args[1] 11151 v_0 := v.Args[0] 11152 if v_0.Op != OpMod32u { 11153 break 11154 } 11155 _ = v_0.Args[1] 11156 y := v_0.Args[1] 11157 if y != v.Args[1] { 11158 break 11159 } 11160 v.reset(OpConstBool) 11161 v.AuxInt = 1 11162 return true 11163 } 11164 // match: (IsInBounds (Mod64u _ y) y) 11165 // cond: 11166 // result: (ConstBool [1]) 11167 for { 11168 _ = v.Args[1] 11169 v_0 := v.Args[0] 11170 if v_0.Op != OpMod64u { 11171 break 11172 } 11173 _ = v_0.Args[1] 11174 y := v_0.Args[1] 11175 if y != v.Args[1] { 11176 break 11177 } 11178 v.reset(OpConstBool) 11179 v.AuxInt = 1 11180 return true 11181 } 11182 // match: (IsInBounds (ZeroExt8to64 (Rsh8Ux64 _ (Const64 [c]))) (Const64 [d])) 11183 // cond: 0 < c && c < 8 && 1<<uint( 8-c)-1 < d 11184 // result: (ConstBool [1]) 11185 for { 11186 _ = v.Args[1] 11187 v_0 := v.Args[0] 11188 if v_0.Op != OpZeroExt8to64 { 11189 break 11190 } 11191 v_0_0 := v_0.Args[0] 11192 if v_0_0.Op != OpRsh8Ux64 { 11193 break 11194 } 11195 _ = v_0_0.Args[1] 11196 v_0_0_1 := v_0_0.Args[1] 11197 if v_0_0_1.Op != OpConst64 { 11198 break 11199 } 11200 c := v_0_0_1.AuxInt 11201 v_1 := v.Args[1] 11202 if v_1.Op != OpConst64 { 11203 break 11204 } 11205 d := v_1.AuxInt 11206 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) { 11207 break 11208 } 11209 v.reset(OpConstBool) 11210 v.AuxInt = 1 11211 return true 11212 } 11213 return false 11214 } 11215 func rewriteValuegeneric_OpIsInBounds_30(v *Value) bool { 11216 // match: (IsInBounds (ZeroExt8to32 (Rsh8Ux64 _ (Const64 [c]))) (Const32 [d])) 11217 // cond: 0 < c && c < 8 && 1<<uint( 8-c)-1 < d 11218 // result: (ConstBool [1]) 11219 for { 11220 _ = v.Args[1] 11221 v_0 := v.Args[0] 11222 if v_0.Op != OpZeroExt8to32 { 11223 break 11224 } 11225 v_0_0 := v_0.Args[0] 11226 if v_0_0.Op != OpRsh8Ux64 { 11227 break 11228 } 11229 _ = v_0_0.Args[1] 11230 v_0_0_1 := v_0_0.Args[1] 11231 if v_0_0_1.Op != OpConst64 { 11232 break 11233 } 11234 c := v_0_0_1.AuxInt 11235 v_1 := v.Args[1] 11236 if v_1.Op != OpConst32 { 11237 break 11238 } 11239 d := v_1.AuxInt 11240 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) { 11241 break 11242 } 11243 v.reset(OpConstBool) 11244 v.AuxInt = 1 11245 return true 11246 } 11247 // match: (IsInBounds (ZeroExt8to16 (Rsh8Ux64 _ (Const64 [c]))) (Const16 [d])) 11248 // cond: 0 < c && c < 8 && 1<<uint( 8-c)-1 < d 11249 // result: (ConstBool [1]) 11250 for { 11251 _ = v.Args[1] 11252 v_0 := v.Args[0] 11253 if v_0.Op != OpZeroExt8to16 { 11254 break 11255 } 11256 v_0_0 := v_0.Args[0] 11257 if v_0_0.Op != OpRsh8Ux64 { 11258 break 11259 } 11260 _ = v_0_0.Args[1] 11261 v_0_0_1 := v_0_0.Args[1] 11262 if v_0_0_1.Op != OpConst64 { 11263 break 11264 } 11265 c := v_0_0_1.AuxInt 11266 v_1 := v.Args[1] 11267 if v_1.Op != OpConst16 { 11268 break 11269 } 11270 d := v_1.AuxInt 11271 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) { 11272 break 11273 } 11274 v.reset(OpConstBool) 11275 v.AuxInt = 1 11276 return true 11277 } 11278 // match: (IsInBounds (Rsh8Ux64 _ (Const64 [c])) (Const64 [d])) 11279 // cond: 0 < c && c < 8 && 1<<uint( 8-c)-1 < d 11280 // result: (ConstBool [1]) 11281 for { 11282 _ = v.Args[1] 11283 v_0 := v.Args[0] 11284 if v_0.Op != OpRsh8Ux64 { 11285 break 11286 } 11287 _ = v_0.Args[1] 11288 v_0_1 := v_0.Args[1] 11289 if v_0_1.Op != OpConst64 { 11290 break 11291 } 11292 c := v_0_1.AuxInt 11293 v_1 := v.Args[1] 11294 if v_1.Op != OpConst64 { 11295 break 11296 } 11297 d := v_1.AuxInt 11298 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) { 11299 break 11300 } 11301 v.reset(OpConstBool) 11302 v.AuxInt = 1 11303 return true 11304 } 11305 // match: (IsInBounds (ZeroExt16to64 (Rsh16Ux64 _ (Const64 [c]))) (Const64 [d])) 11306 // cond: 0 < c && c < 16 && 1<<uint(16-c)-1 < d 11307 // result: (ConstBool [1]) 11308 for { 11309 _ = v.Args[1] 11310 v_0 := v.Args[0] 11311 if v_0.Op != OpZeroExt16to64 { 11312 break 11313 } 11314 v_0_0 := v_0.Args[0] 11315 if v_0_0.Op != OpRsh16Ux64 { 11316 break 11317 } 11318 _ = v_0_0.Args[1] 11319 v_0_0_1 := v_0_0.Args[1] 11320 if v_0_0_1.Op != OpConst64 { 11321 break 11322 } 11323 c := v_0_0_1.AuxInt 11324 v_1 := v.Args[1] 11325 if v_1.Op != OpConst64 { 11326 break 11327 } 11328 d := v_1.AuxInt 11329 if !(0 < c && c < 16 && 1<<uint(16-c)-1 < d) { 11330 break 11331 } 11332 v.reset(OpConstBool) 11333 v.AuxInt = 1 11334 return true 11335 } 11336 // match: (IsInBounds (ZeroExt16to32 (Rsh16Ux64 _ (Const64 [c]))) (Const64 [d])) 11337 // cond: 0 < c && c < 16 && 1<<uint(16-c)-1 < d 11338 // result: (ConstBool [1]) 11339 for { 11340 _ = v.Args[1] 11341 v_0 := v.Args[0] 11342 if v_0.Op != OpZeroExt16to32 { 11343 break 11344 } 11345 v_0_0 := v_0.Args[0] 11346 if v_0_0.Op != OpRsh16Ux64 { 11347 break 11348 } 11349 _ = v_0_0.Args[1] 11350 v_0_0_1 := v_0_0.Args[1] 11351 if v_0_0_1.Op != OpConst64 { 11352 break 11353 } 11354 c := v_0_0_1.AuxInt 11355 v_1 := v.Args[1] 11356 if v_1.Op != OpConst64 { 11357 break 11358 } 11359 d := v_1.AuxInt 11360 if !(0 < c && c < 16 && 1<<uint(16-c)-1 < d) { 11361 break 11362 } 11363 v.reset(OpConstBool) 11364 v.AuxInt = 1 11365 return true 11366 } 11367 // match: (IsInBounds (Rsh16Ux64 _ (Const64 [c])) (Const64 [d])) 11368 // cond: 0 < c && c < 16 && 1<<uint(16-c)-1 < d 11369 // result: (ConstBool [1]) 11370 for { 11371 _ = v.Args[1] 11372 v_0 := v.Args[0] 11373 if v_0.Op != OpRsh16Ux64 { 11374 break 11375 } 11376 _ = v_0.Args[1] 11377 v_0_1 := v_0.Args[1] 11378 if v_0_1.Op != OpConst64 { 11379 break 11380 } 11381 c := v_0_1.AuxInt 11382 v_1 := v.Args[1] 11383 if v_1.Op != OpConst64 { 11384 break 11385 } 11386 d := v_1.AuxInt 11387 if !(0 < c && c < 16 && 1<<uint(16-c)-1 < d) { 11388 break 11389 } 11390 v.reset(OpConstBool) 11391 v.AuxInt = 1 11392 return true 11393 } 11394 // match: (IsInBounds (ZeroExt32to64 (Rsh32Ux64 _ (Const64 [c]))) (Const64 [d])) 11395 // cond: 0 < c && c < 32 && 1<<uint(32-c)-1 < d 11396 // result: (ConstBool [1]) 11397 for { 11398 _ = v.Args[1] 11399 v_0 := v.Args[0] 11400 if v_0.Op != OpZeroExt32to64 { 11401 break 11402 } 11403 v_0_0 := v_0.Args[0] 11404 if v_0_0.Op != OpRsh32Ux64 { 11405 break 11406 } 11407 _ = v_0_0.Args[1] 11408 v_0_0_1 := v_0_0.Args[1] 11409 if v_0_0_1.Op != OpConst64 { 11410 break 11411 } 11412 c := v_0_0_1.AuxInt 11413 v_1 := v.Args[1] 11414 if v_1.Op != OpConst64 { 11415 break 11416 } 11417 d := v_1.AuxInt 11418 if !(0 < c && c < 32 && 1<<uint(32-c)-1 < d) { 11419 break 11420 } 11421 v.reset(OpConstBool) 11422 v.AuxInt = 1 11423 return true 11424 } 11425 // match: (IsInBounds (Rsh32Ux64 _ (Const64 [c])) (Const64 [d])) 11426 // cond: 0 < c && c < 32 && 1<<uint(32-c)-1 < d 11427 // result: (ConstBool [1]) 11428 for { 11429 _ = v.Args[1] 11430 v_0 := v.Args[0] 11431 if v_0.Op != OpRsh32Ux64 { 11432 break 11433 } 11434 _ = v_0.Args[1] 11435 v_0_1 := v_0.Args[1] 11436 if v_0_1.Op != OpConst64 { 11437 break 11438 } 11439 c := v_0_1.AuxInt 11440 v_1 := v.Args[1] 11441 if v_1.Op != OpConst64 { 11442 break 11443 } 11444 d := v_1.AuxInt 11445 if !(0 < c && c < 32 && 1<<uint(32-c)-1 < d) { 11446 break 11447 } 11448 v.reset(OpConstBool) 11449 v.AuxInt = 1 11450 return true 11451 } 11452 // match: (IsInBounds (Rsh64Ux64 _ (Const64 [c])) (Const64 [d])) 11453 // cond: 0 < c && c < 64 && 1<<uint(64-c)-1 < d 11454 // result: (ConstBool [1]) 11455 for { 11456 _ = v.Args[1] 11457 v_0 := v.Args[0] 11458 if v_0.Op != OpRsh64Ux64 { 11459 break 11460 } 11461 _ = v_0.Args[1] 11462 v_0_1 := v_0.Args[1] 11463 if v_0_1.Op != OpConst64 { 11464 break 11465 } 11466 c := v_0_1.AuxInt 11467 v_1 := v.Args[1] 11468 if v_1.Op != OpConst64 { 11469 break 11470 } 11471 d := v_1.AuxInt 11472 if !(0 < c && c < 64 && 1<<uint(64-c)-1 < d) { 11473 break 11474 } 11475 v.reset(OpConstBool) 11476 v.AuxInt = 1 11477 return true 11478 } 11479 return false 11480 } 11481 func rewriteValuegeneric_OpIsNonNil_0(v *Value) bool { 11482 // match: (IsNonNil (ConstNil)) 11483 // cond: 11484 // result: (ConstBool [0]) 11485 for { 11486 v_0 := v.Args[0] 11487 if v_0.Op != OpConstNil { 11488 break 11489 } 11490 v.reset(OpConstBool) 11491 v.AuxInt = 0 11492 return true 11493 } 11494 return false 11495 } 11496 func rewriteValuegeneric_OpIsSliceInBounds_0(v *Value) bool { 11497 // match: (IsSliceInBounds x x) 11498 // cond: 11499 // result: (ConstBool [1]) 11500 for { 11501 _ = v.Args[1] 11502 x := v.Args[0] 11503 if x != v.Args[1] { 11504 break 11505 } 11506 v.reset(OpConstBool) 11507 v.AuxInt = 1 11508 return true 11509 } 11510 // match: (IsSliceInBounds (And32 (Const32 [c]) _) (Const32 [d])) 11511 // cond: 0 <= c && c <= d 11512 // result: (ConstBool [1]) 11513 for { 11514 _ = v.Args[1] 11515 v_0 := v.Args[0] 11516 if v_0.Op != OpAnd32 { 11517 break 11518 } 11519 _ = v_0.Args[1] 11520 v_0_0 := v_0.Args[0] 11521 if v_0_0.Op != OpConst32 { 11522 break 11523 } 11524 c := v_0_0.AuxInt 11525 v_1 := v.Args[1] 11526 if v_1.Op != OpConst32 { 11527 break 11528 } 11529 d := v_1.AuxInt 11530 if !(0 <= c && c <= d) { 11531 break 11532 } 11533 v.reset(OpConstBool) 11534 v.AuxInt = 1 11535 return true 11536 } 11537 // match: (IsSliceInBounds (And32 _ (Const32 [c])) (Const32 [d])) 11538 // cond: 0 <= c && c <= d 11539 // result: (ConstBool [1]) 11540 for { 11541 _ = v.Args[1] 11542 v_0 := v.Args[0] 11543 if v_0.Op != OpAnd32 { 11544 break 11545 } 11546 _ = v_0.Args[1] 11547 v_0_1 := v_0.Args[1] 11548 if v_0_1.Op != OpConst32 { 11549 break 11550 } 11551 c := v_0_1.AuxInt 11552 v_1 := v.Args[1] 11553 if v_1.Op != OpConst32 { 11554 break 11555 } 11556 d := v_1.AuxInt 11557 if !(0 <= c && c <= d) { 11558 break 11559 } 11560 v.reset(OpConstBool) 11561 v.AuxInt = 1 11562 return true 11563 } 11564 // match: (IsSliceInBounds (And64 (Const64 [c]) _) (Const64 [d])) 11565 // cond: 0 <= c && c <= d 11566 // result: (ConstBool [1]) 11567 for { 11568 _ = v.Args[1] 11569 v_0 := v.Args[0] 11570 if v_0.Op != OpAnd64 { 11571 break 11572 } 11573 _ = v_0.Args[1] 11574 v_0_0 := v_0.Args[0] 11575 if v_0_0.Op != OpConst64 { 11576 break 11577 } 11578 c := v_0_0.AuxInt 11579 v_1 := v.Args[1] 11580 if v_1.Op != OpConst64 { 11581 break 11582 } 11583 d := v_1.AuxInt 11584 if !(0 <= c && c <= d) { 11585 break 11586 } 11587 v.reset(OpConstBool) 11588 v.AuxInt = 1 11589 return true 11590 } 11591 // match: (IsSliceInBounds (And64 _ (Const64 [c])) (Const64 [d])) 11592 // cond: 0 <= c && c <= d 11593 // result: (ConstBool [1]) 11594 for { 11595 _ = v.Args[1] 11596 v_0 := v.Args[0] 11597 if v_0.Op != OpAnd64 { 11598 break 11599 } 11600 _ = v_0.Args[1] 11601 v_0_1 := v_0.Args[1] 11602 if v_0_1.Op != OpConst64 { 11603 break 11604 } 11605 c := v_0_1.AuxInt 11606 v_1 := v.Args[1] 11607 if v_1.Op != OpConst64 { 11608 break 11609 } 11610 d := v_1.AuxInt 11611 if !(0 <= c && c <= d) { 11612 break 11613 } 11614 v.reset(OpConstBool) 11615 v.AuxInt = 1 11616 return true 11617 } 11618 // match: (IsSliceInBounds (Const32 [0]) _) 11619 // cond: 11620 // result: (ConstBool [1]) 11621 for { 11622 _ = v.Args[1] 11623 v_0 := v.Args[0] 11624 if v_0.Op != OpConst32 { 11625 break 11626 } 11627 if v_0.AuxInt != 0 { 11628 break 11629 } 11630 v.reset(OpConstBool) 11631 v.AuxInt = 1 11632 return true 11633 } 11634 // match: (IsSliceInBounds (Const64 [0]) _) 11635 // cond: 11636 // result: (ConstBool [1]) 11637 for { 11638 _ = v.Args[1] 11639 v_0 := v.Args[0] 11640 if v_0.Op != OpConst64 { 11641 break 11642 } 11643 if v_0.AuxInt != 0 { 11644 break 11645 } 11646 v.reset(OpConstBool) 11647 v.AuxInt = 1 11648 return true 11649 } 11650 // match: (IsSliceInBounds (Const32 [c]) (Const32 [d])) 11651 // cond: 11652 // result: (ConstBool [b2i(0 <= c && c <= d)]) 11653 for { 11654 _ = v.Args[1] 11655 v_0 := v.Args[0] 11656 if v_0.Op != OpConst32 { 11657 break 11658 } 11659 c := v_0.AuxInt 11660 v_1 := v.Args[1] 11661 if v_1.Op != OpConst32 { 11662 break 11663 } 11664 d := v_1.AuxInt 11665 v.reset(OpConstBool) 11666 v.AuxInt = b2i(0 <= c && c <= d) 11667 return true 11668 } 11669 // match: (IsSliceInBounds (Const64 [c]) (Const64 [d])) 11670 // cond: 11671 // result: (ConstBool [b2i(0 <= c && c <= d)]) 11672 for { 11673 _ = v.Args[1] 11674 v_0 := v.Args[0] 11675 if v_0.Op != OpConst64 { 11676 break 11677 } 11678 c := v_0.AuxInt 11679 v_1 := v.Args[1] 11680 if v_1.Op != OpConst64 { 11681 break 11682 } 11683 d := v_1.AuxInt 11684 v.reset(OpConstBool) 11685 v.AuxInt = b2i(0 <= c && c <= d) 11686 return true 11687 } 11688 // match: (IsSliceInBounds (SliceLen x) (SliceCap x)) 11689 // cond: 11690 // result: (ConstBool [1]) 11691 for { 11692 _ = v.Args[1] 11693 v_0 := v.Args[0] 11694 if v_0.Op != OpSliceLen { 11695 break 11696 } 11697 x := v_0.Args[0] 11698 v_1 := v.Args[1] 11699 if v_1.Op != OpSliceCap { 11700 break 11701 } 11702 if x != v_1.Args[0] { 11703 break 11704 } 11705 v.reset(OpConstBool) 11706 v.AuxInt = 1 11707 return true 11708 } 11709 return false 11710 } 11711 func rewriteValuegeneric_OpLeq16_0(v *Value) bool { 11712 // match: (Leq16 (Const16 [c]) (Const16 [d])) 11713 // cond: 11714 // result: (ConstBool [b2i(c <= d)]) 11715 for { 11716 _ = v.Args[1] 11717 v_0 := v.Args[0] 11718 if v_0.Op != OpConst16 { 11719 break 11720 } 11721 c := v_0.AuxInt 11722 v_1 := v.Args[1] 11723 if v_1.Op != OpConst16 { 11724 break 11725 } 11726 d := v_1.AuxInt 11727 v.reset(OpConstBool) 11728 v.AuxInt = b2i(c <= d) 11729 return true 11730 } 11731 return false 11732 } 11733 func rewriteValuegeneric_OpLeq16U_0(v *Value) bool { 11734 // match: (Leq16U (Const16 [c]) (Const16 [d])) 11735 // cond: 11736 // result: (ConstBool [b2i(uint16(c) <= uint16(d))]) 11737 for { 11738 _ = v.Args[1] 11739 v_0 := v.Args[0] 11740 if v_0.Op != OpConst16 { 11741 break 11742 } 11743 c := v_0.AuxInt 11744 v_1 := v.Args[1] 11745 if v_1.Op != OpConst16 { 11746 break 11747 } 11748 d := v_1.AuxInt 11749 v.reset(OpConstBool) 11750 v.AuxInt = b2i(uint16(c) <= uint16(d)) 11751 return true 11752 } 11753 return false 11754 } 11755 func rewriteValuegeneric_OpLeq32_0(v *Value) bool { 11756 // match: (Leq32 (Const32 [c]) (Const32 [d])) 11757 // cond: 11758 // result: (ConstBool [b2i(c <= d)]) 11759 for { 11760 _ = v.Args[1] 11761 v_0 := v.Args[0] 11762 if v_0.Op != OpConst32 { 11763 break 11764 } 11765 c := v_0.AuxInt 11766 v_1 := v.Args[1] 11767 if v_1.Op != OpConst32 { 11768 break 11769 } 11770 d := v_1.AuxInt 11771 v.reset(OpConstBool) 11772 v.AuxInt = b2i(c <= d) 11773 return true 11774 } 11775 return false 11776 } 11777 func rewriteValuegeneric_OpLeq32F_0(v *Value) bool { 11778 // match: (Leq32F (Const32F [c]) (Const32F [d])) 11779 // cond: 11780 // result: (ConstBool [b2i(i2f(c) <= i2f(d))]) 11781 for { 11782 _ = v.Args[1] 11783 v_0 := v.Args[0] 11784 if v_0.Op != OpConst32F { 11785 break 11786 } 11787 c := v_0.AuxInt 11788 v_1 := v.Args[1] 11789 if v_1.Op != OpConst32F { 11790 break 11791 } 11792 d := v_1.AuxInt 11793 v.reset(OpConstBool) 11794 v.AuxInt = b2i(i2f(c) <= i2f(d)) 11795 return true 11796 } 11797 return false 11798 } 11799 func rewriteValuegeneric_OpLeq32U_0(v *Value) bool { 11800 // match: (Leq32U (Const32 [c]) (Const32 [d])) 11801 // cond: 11802 // result: (ConstBool [b2i(uint32(c) <= uint32(d))]) 11803 for { 11804 _ = v.Args[1] 11805 v_0 := v.Args[0] 11806 if v_0.Op != OpConst32 { 11807 break 11808 } 11809 c := v_0.AuxInt 11810 v_1 := v.Args[1] 11811 if v_1.Op != OpConst32 { 11812 break 11813 } 11814 d := v_1.AuxInt 11815 v.reset(OpConstBool) 11816 v.AuxInt = b2i(uint32(c) <= uint32(d)) 11817 return true 11818 } 11819 return false 11820 } 11821 func rewriteValuegeneric_OpLeq64_0(v *Value) bool { 11822 // match: (Leq64 (Const64 [c]) (Const64 [d])) 11823 // cond: 11824 // result: (ConstBool [b2i(c <= d)]) 11825 for { 11826 _ = v.Args[1] 11827 v_0 := v.Args[0] 11828 if v_0.Op != OpConst64 { 11829 break 11830 } 11831 c := v_0.AuxInt 11832 v_1 := v.Args[1] 11833 if v_1.Op != OpConst64 { 11834 break 11835 } 11836 d := v_1.AuxInt 11837 v.reset(OpConstBool) 11838 v.AuxInt = b2i(c <= d) 11839 return true 11840 } 11841 return false 11842 } 11843 func rewriteValuegeneric_OpLeq64F_0(v *Value) bool { 11844 // match: (Leq64F (Const64F [c]) (Const64F [d])) 11845 // cond: 11846 // result: (ConstBool [b2i(i2f(c) <= i2f(d))]) 11847 for { 11848 _ = v.Args[1] 11849 v_0 := v.Args[0] 11850 if v_0.Op != OpConst64F { 11851 break 11852 } 11853 c := v_0.AuxInt 11854 v_1 := v.Args[1] 11855 if v_1.Op != OpConst64F { 11856 break 11857 } 11858 d := v_1.AuxInt 11859 v.reset(OpConstBool) 11860 v.AuxInt = b2i(i2f(c) <= i2f(d)) 11861 return true 11862 } 11863 return false 11864 } 11865 func rewriteValuegeneric_OpLeq64U_0(v *Value) bool { 11866 // match: (Leq64U (Const64 [c]) (Const64 [d])) 11867 // cond: 11868 // result: (ConstBool [b2i(uint64(c) <= uint64(d))]) 11869 for { 11870 _ = v.Args[1] 11871 v_0 := v.Args[0] 11872 if v_0.Op != OpConst64 { 11873 break 11874 } 11875 c := v_0.AuxInt 11876 v_1 := v.Args[1] 11877 if v_1.Op != OpConst64 { 11878 break 11879 } 11880 d := v_1.AuxInt 11881 v.reset(OpConstBool) 11882 v.AuxInt = b2i(uint64(c) <= uint64(d)) 11883 return true 11884 } 11885 return false 11886 } 11887 func rewriteValuegeneric_OpLeq8_0(v *Value) bool { 11888 // match: (Leq8 (Const8 [c]) (Const8 [d])) 11889 // cond: 11890 // result: (ConstBool [b2i(c <= d)]) 11891 for { 11892 _ = v.Args[1] 11893 v_0 := v.Args[0] 11894 if v_0.Op != OpConst8 { 11895 break 11896 } 11897 c := v_0.AuxInt 11898 v_1 := v.Args[1] 11899 if v_1.Op != OpConst8 { 11900 break 11901 } 11902 d := v_1.AuxInt 11903 v.reset(OpConstBool) 11904 v.AuxInt = b2i(c <= d) 11905 return true 11906 } 11907 return false 11908 } 11909 func rewriteValuegeneric_OpLeq8U_0(v *Value) bool { 11910 // match: (Leq8U (Const8 [c]) (Const8 [d])) 11911 // cond: 11912 // result: (ConstBool [b2i(uint8(c) <= uint8(d))]) 11913 for { 11914 _ = v.Args[1] 11915 v_0 := v.Args[0] 11916 if v_0.Op != OpConst8 { 11917 break 11918 } 11919 c := v_0.AuxInt 11920 v_1 := v.Args[1] 11921 if v_1.Op != OpConst8 { 11922 break 11923 } 11924 d := v_1.AuxInt 11925 v.reset(OpConstBool) 11926 v.AuxInt = b2i(uint8(c) <= uint8(d)) 11927 return true 11928 } 11929 return false 11930 } 11931 func rewriteValuegeneric_OpLess16_0(v *Value) bool { 11932 // match: (Less16 (Const16 [c]) (Const16 [d])) 11933 // cond: 11934 // result: (ConstBool [b2i(c < d)]) 11935 for { 11936 _ = v.Args[1] 11937 v_0 := v.Args[0] 11938 if v_0.Op != OpConst16 { 11939 break 11940 } 11941 c := v_0.AuxInt 11942 v_1 := v.Args[1] 11943 if v_1.Op != OpConst16 { 11944 break 11945 } 11946 d := v_1.AuxInt 11947 v.reset(OpConstBool) 11948 v.AuxInt = b2i(c < d) 11949 return true 11950 } 11951 return false 11952 } 11953 func rewriteValuegeneric_OpLess16U_0(v *Value) bool { 11954 // match: (Less16U (Const16 [c]) (Const16 [d])) 11955 // cond: 11956 // result: (ConstBool [b2i(uint16(c) < uint16(d))]) 11957 for { 11958 _ = v.Args[1] 11959 v_0 := v.Args[0] 11960 if v_0.Op != OpConst16 { 11961 break 11962 } 11963 c := v_0.AuxInt 11964 v_1 := v.Args[1] 11965 if v_1.Op != OpConst16 { 11966 break 11967 } 11968 d := v_1.AuxInt 11969 v.reset(OpConstBool) 11970 v.AuxInt = b2i(uint16(c) < uint16(d)) 11971 return true 11972 } 11973 return false 11974 } 11975 func rewriteValuegeneric_OpLess32_0(v *Value) bool { 11976 // match: (Less32 (Const32 [c]) (Const32 [d])) 11977 // cond: 11978 // result: (ConstBool [b2i(c < d)]) 11979 for { 11980 _ = v.Args[1] 11981 v_0 := v.Args[0] 11982 if v_0.Op != OpConst32 { 11983 break 11984 } 11985 c := v_0.AuxInt 11986 v_1 := v.Args[1] 11987 if v_1.Op != OpConst32 { 11988 break 11989 } 11990 d := v_1.AuxInt 11991 v.reset(OpConstBool) 11992 v.AuxInt = b2i(c < d) 11993 return true 11994 } 11995 return false 11996 } 11997 func rewriteValuegeneric_OpLess32F_0(v *Value) bool { 11998 // match: (Less32F (Const32F [c]) (Const32F [d])) 11999 // cond: 12000 // result: (ConstBool [b2i(i2f(c) < i2f(d))]) 12001 for { 12002 _ = v.Args[1] 12003 v_0 := v.Args[0] 12004 if v_0.Op != OpConst32F { 12005 break 12006 } 12007 c := v_0.AuxInt 12008 v_1 := v.Args[1] 12009 if v_1.Op != OpConst32F { 12010 break 12011 } 12012 d := v_1.AuxInt 12013 v.reset(OpConstBool) 12014 v.AuxInt = b2i(i2f(c) < i2f(d)) 12015 return true 12016 } 12017 return false 12018 } 12019 func rewriteValuegeneric_OpLess32U_0(v *Value) bool { 12020 // match: (Less32U (Const32 [c]) (Const32 [d])) 12021 // cond: 12022 // result: (ConstBool [b2i(uint32(c) < uint32(d))]) 12023 for { 12024 _ = v.Args[1] 12025 v_0 := v.Args[0] 12026 if v_0.Op != OpConst32 { 12027 break 12028 } 12029 c := v_0.AuxInt 12030 v_1 := v.Args[1] 12031 if v_1.Op != OpConst32 { 12032 break 12033 } 12034 d := v_1.AuxInt 12035 v.reset(OpConstBool) 12036 v.AuxInt = b2i(uint32(c) < uint32(d)) 12037 return true 12038 } 12039 return false 12040 } 12041 func rewriteValuegeneric_OpLess64_0(v *Value) bool { 12042 // match: (Less64 (Const64 [c]) (Const64 [d])) 12043 // cond: 12044 // result: (ConstBool [b2i(c < d)]) 12045 for { 12046 _ = v.Args[1] 12047 v_0 := v.Args[0] 12048 if v_0.Op != OpConst64 { 12049 break 12050 } 12051 c := v_0.AuxInt 12052 v_1 := v.Args[1] 12053 if v_1.Op != OpConst64 { 12054 break 12055 } 12056 d := v_1.AuxInt 12057 v.reset(OpConstBool) 12058 v.AuxInt = b2i(c < d) 12059 return true 12060 } 12061 return false 12062 } 12063 func rewriteValuegeneric_OpLess64F_0(v *Value) bool { 12064 // match: (Less64F (Const64F [c]) (Const64F [d])) 12065 // cond: 12066 // result: (ConstBool [b2i(i2f(c) < i2f(d))]) 12067 for { 12068 _ = v.Args[1] 12069 v_0 := v.Args[0] 12070 if v_0.Op != OpConst64F { 12071 break 12072 } 12073 c := v_0.AuxInt 12074 v_1 := v.Args[1] 12075 if v_1.Op != OpConst64F { 12076 break 12077 } 12078 d := v_1.AuxInt 12079 v.reset(OpConstBool) 12080 v.AuxInt = b2i(i2f(c) < i2f(d)) 12081 return true 12082 } 12083 return false 12084 } 12085 func rewriteValuegeneric_OpLess64U_0(v *Value) bool { 12086 // match: (Less64U (Const64 [c]) (Const64 [d])) 12087 // cond: 12088 // result: (ConstBool [b2i(uint64(c) < uint64(d))]) 12089 for { 12090 _ = v.Args[1] 12091 v_0 := v.Args[0] 12092 if v_0.Op != OpConst64 { 12093 break 12094 } 12095 c := v_0.AuxInt 12096 v_1 := v.Args[1] 12097 if v_1.Op != OpConst64 { 12098 break 12099 } 12100 d := v_1.AuxInt 12101 v.reset(OpConstBool) 12102 v.AuxInt = b2i(uint64(c) < uint64(d)) 12103 return true 12104 } 12105 return false 12106 } 12107 func rewriteValuegeneric_OpLess8_0(v *Value) bool { 12108 // match: (Less8 (Const8 [c]) (Const8 [d])) 12109 // cond: 12110 // result: (ConstBool [b2i(c < d)]) 12111 for { 12112 _ = v.Args[1] 12113 v_0 := v.Args[0] 12114 if v_0.Op != OpConst8 { 12115 break 12116 } 12117 c := v_0.AuxInt 12118 v_1 := v.Args[1] 12119 if v_1.Op != OpConst8 { 12120 break 12121 } 12122 d := v_1.AuxInt 12123 v.reset(OpConstBool) 12124 v.AuxInt = b2i(c < d) 12125 return true 12126 } 12127 return false 12128 } 12129 func rewriteValuegeneric_OpLess8U_0(v *Value) bool { 12130 // match: (Less8U (Const8 [c]) (Const8 [d])) 12131 // cond: 12132 // result: (ConstBool [b2i(uint8(c) < uint8(d))]) 12133 for { 12134 _ = v.Args[1] 12135 v_0 := v.Args[0] 12136 if v_0.Op != OpConst8 { 12137 break 12138 } 12139 c := v_0.AuxInt 12140 v_1 := v.Args[1] 12141 if v_1.Op != OpConst8 { 12142 break 12143 } 12144 d := v_1.AuxInt 12145 v.reset(OpConstBool) 12146 v.AuxInt = b2i(uint8(c) < uint8(d)) 12147 return true 12148 } 12149 return false 12150 } 12151 func rewriteValuegeneric_OpLoad_0(v *Value) bool { 12152 b := v.Block 12153 _ = b 12154 fe := b.Func.fe 12155 _ = fe 12156 // match: (Load <t1> p1 (Store {t2} p2 x _)) 12157 // cond: isSamePtr(p1,p2) && t1.Compare(x.Type) == types.CMPeq && t1.Size() == t2.(*types.Type).Size() 12158 // result: x 12159 for { 12160 t1 := v.Type 12161 _ = v.Args[1] 12162 p1 := v.Args[0] 12163 v_1 := v.Args[1] 12164 if v_1.Op != OpStore { 12165 break 12166 } 12167 t2 := v_1.Aux 12168 _ = v_1.Args[2] 12169 p2 := v_1.Args[0] 12170 x := v_1.Args[1] 12171 if !(isSamePtr(p1, p2) && t1.Compare(x.Type) == types.CMPeq && t1.Size() == t2.(*types.Type).Size()) { 12172 break 12173 } 12174 v.reset(OpCopy) 12175 v.Type = x.Type 12176 v.AddArg(x) 12177 return true 12178 } 12179 // match: (Load <t1> p1 (Store {t2} p2 (Const64 [x]) _)) 12180 // cond: isSamePtr(p1,p2) && t2.(*types.Type).Size() == 8 && is64BitFloat(t1) 12181 // result: (Const64F [x]) 12182 for { 12183 t1 := v.Type 12184 _ = v.Args[1] 12185 p1 := v.Args[0] 12186 v_1 := v.Args[1] 12187 if v_1.Op != OpStore { 12188 break 12189 } 12190 t2 := v_1.Aux 12191 _ = v_1.Args[2] 12192 p2 := v_1.Args[0] 12193 v_1_1 := v_1.Args[1] 12194 if v_1_1.Op != OpConst64 { 12195 break 12196 } 12197 x := v_1_1.AuxInt 12198 if !(isSamePtr(p1, p2) && t2.(*types.Type).Size() == 8 && is64BitFloat(t1)) { 12199 break 12200 } 12201 v.reset(OpConst64F) 12202 v.AuxInt = x 12203 return true 12204 } 12205 // match: (Load <t1> p1 (Store {t2} p2 (Const32 [x]) _)) 12206 // cond: isSamePtr(p1,p2) && t2.(*types.Type).Size() == 4 && is32BitFloat(t1) 12207 // result: (Const32F [f2i(float64(math.Float32frombits(uint32(x))))]) 12208 for { 12209 t1 := v.Type 12210 _ = v.Args[1] 12211 p1 := v.Args[0] 12212 v_1 := v.Args[1] 12213 if v_1.Op != OpStore { 12214 break 12215 } 12216 t2 := v_1.Aux 12217 _ = v_1.Args[2] 12218 p2 := v_1.Args[0] 12219 v_1_1 := v_1.Args[1] 12220 if v_1_1.Op != OpConst32 { 12221 break 12222 } 12223 x := v_1_1.AuxInt 12224 if !(isSamePtr(p1, p2) && t2.(*types.Type).Size() == 4 && is32BitFloat(t1)) { 12225 break 12226 } 12227 v.reset(OpConst32F) 12228 v.AuxInt = f2i(float64(math.Float32frombits(uint32(x)))) 12229 return true 12230 } 12231 // match: (Load <t1> p1 (Store {t2} p2 (Const64F [x]) _)) 12232 // cond: isSamePtr(p1,p2) && t2.(*types.Type).Size() == 8 && is64BitInt(t1) 12233 // result: (Const64 [x]) 12234 for { 12235 t1 := v.Type 12236 _ = v.Args[1] 12237 p1 := v.Args[0] 12238 v_1 := v.Args[1] 12239 if v_1.Op != OpStore { 12240 break 12241 } 12242 t2 := v_1.Aux 12243 _ = v_1.Args[2] 12244 p2 := v_1.Args[0] 12245 v_1_1 := v_1.Args[1] 12246 if v_1_1.Op != OpConst64F { 12247 break 12248 } 12249 x := v_1_1.AuxInt 12250 if !(isSamePtr(p1, p2) && t2.(*types.Type).Size() == 8 && is64BitInt(t1)) { 12251 break 12252 } 12253 v.reset(OpConst64) 12254 v.AuxInt = x 12255 return true 12256 } 12257 // match: (Load <t1> p1 (Store {t2} p2 (Const32F [x]) _)) 12258 // cond: isSamePtr(p1,p2) && t2.(*types.Type).Size() == 4 && is32BitInt(t1) 12259 // result: (Const32 [int64(int32(math.Float32bits(float32(i2f(x)))))]) 12260 for { 12261 t1 := v.Type 12262 _ = v.Args[1] 12263 p1 := v.Args[0] 12264 v_1 := v.Args[1] 12265 if v_1.Op != OpStore { 12266 break 12267 } 12268 t2 := v_1.Aux 12269 _ = v_1.Args[2] 12270 p2 := v_1.Args[0] 12271 v_1_1 := v_1.Args[1] 12272 if v_1_1.Op != OpConst32F { 12273 break 12274 } 12275 x := v_1_1.AuxInt 12276 if !(isSamePtr(p1, p2) && t2.(*types.Type).Size() == 4 && is32BitInt(t1)) { 12277 break 12278 } 12279 v.reset(OpConst32) 12280 v.AuxInt = int64(int32(math.Float32bits(float32(i2f(x))))) 12281 return true 12282 } 12283 // match: (Load <t> _ _) 12284 // cond: t.IsStruct() && t.NumFields() == 0 && fe.CanSSA(t) 12285 // result: (StructMake0) 12286 for { 12287 t := v.Type 12288 _ = v.Args[1] 12289 if !(t.IsStruct() && t.NumFields() == 0 && fe.CanSSA(t)) { 12290 break 12291 } 12292 v.reset(OpStructMake0) 12293 return true 12294 } 12295 // match: (Load <t> ptr mem) 12296 // cond: t.IsStruct() && t.NumFields() == 1 && fe.CanSSA(t) 12297 // result: (StructMake1 (Load <t.FieldType(0)> (OffPtr <t.FieldType(0).PtrTo()> [0] ptr) mem)) 12298 for { 12299 t := v.Type 12300 _ = v.Args[1] 12301 ptr := v.Args[0] 12302 mem := v.Args[1] 12303 if !(t.IsStruct() && t.NumFields() == 1 && fe.CanSSA(t)) { 12304 break 12305 } 12306 v.reset(OpStructMake1) 12307 v0 := b.NewValue0(v.Pos, OpLoad, t.FieldType(0)) 12308 v1 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 12309 v1.AuxInt = 0 12310 v1.AddArg(ptr) 12311 v0.AddArg(v1) 12312 v0.AddArg(mem) 12313 v.AddArg(v0) 12314 return true 12315 } 12316 // match: (Load <t> ptr mem) 12317 // cond: t.IsStruct() && t.NumFields() == 2 && fe.CanSSA(t) 12318 // result: (StructMake2 (Load <t.FieldType(0)> (OffPtr <t.FieldType(0).PtrTo()> [0] ptr) mem) (Load <t.FieldType(1)> (OffPtr <t.FieldType(1).PtrTo()> [t.FieldOff(1)] ptr) mem)) 12319 for { 12320 t := v.Type 12321 _ = v.Args[1] 12322 ptr := v.Args[0] 12323 mem := v.Args[1] 12324 if !(t.IsStruct() && t.NumFields() == 2 && fe.CanSSA(t)) { 12325 break 12326 } 12327 v.reset(OpStructMake2) 12328 v0 := b.NewValue0(v.Pos, OpLoad, t.FieldType(0)) 12329 v1 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 12330 v1.AuxInt = 0 12331 v1.AddArg(ptr) 12332 v0.AddArg(v1) 12333 v0.AddArg(mem) 12334 v.AddArg(v0) 12335 v2 := b.NewValue0(v.Pos, OpLoad, t.FieldType(1)) 12336 v3 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) 12337 v3.AuxInt = t.FieldOff(1) 12338 v3.AddArg(ptr) 12339 v2.AddArg(v3) 12340 v2.AddArg(mem) 12341 v.AddArg(v2) 12342 return true 12343 } 12344 // match: (Load <t> ptr mem) 12345 // cond: t.IsStruct() && t.NumFields() == 3 && fe.CanSSA(t) 12346 // result: (StructMake3 (Load <t.FieldType(0)> (OffPtr <t.FieldType(0).PtrTo()> [0] ptr) mem) (Load <t.FieldType(1)> (OffPtr <t.FieldType(1).PtrTo()> [t.FieldOff(1)] ptr) mem) (Load <t.FieldType(2)> (OffPtr <t.FieldType(2).PtrTo()> [t.FieldOff(2)] ptr) mem)) 12347 for { 12348 t := v.Type 12349 _ = v.Args[1] 12350 ptr := v.Args[0] 12351 mem := v.Args[1] 12352 if !(t.IsStruct() && t.NumFields() == 3 && fe.CanSSA(t)) { 12353 break 12354 } 12355 v.reset(OpStructMake3) 12356 v0 := b.NewValue0(v.Pos, OpLoad, t.FieldType(0)) 12357 v1 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 12358 v1.AuxInt = 0 12359 v1.AddArg(ptr) 12360 v0.AddArg(v1) 12361 v0.AddArg(mem) 12362 v.AddArg(v0) 12363 v2 := b.NewValue0(v.Pos, OpLoad, t.FieldType(1)) 12364 v3 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) 12365 v3.AuxInt = t.FieldOff(1) 12366 v3.AddArg(ptr) 12367 v2.AddArg(v3) 12368 v2.AddArg(mem) 12369 v.AddArg(v2) 12370 v4 := b.NewValue0(v.Pos, OpLoad, t.FieldType(2)) 12371 v5 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(2).PtrTo()) 12372 v5.AuxInt = t.FieldOff(2) 12373 v5.AddArg(ptr) 12374 v4.AddArg(v5) 12375 v4.AddArg(mem) 12376 v.AddArg(v4) 12377 return true 12378 } 12379 // match: (Load <t> ptr mem) 12380 // cond: t.IsStruct() && t.NumFields() == 4 && fe.CanSSA(t) 12381 // result: (StructMake4 (Load <t.FieldType(0)> (OffPtr <t.FieldType(0).PtrTo()> [0] ptr) mem) (Load <t.FieldType(1)> (OffPtr <t.FieldType(1).PtrTo()> [t.FieldOff(1)] ptr) mem) (Load <t.FieldType(2)> (OffPtr <t.FieldType(2).PtrTo()> [t.FieldOff(2)] ptr) mem) (Load <t.FieldType(3)> (OffPtr <t.FieldType(3).PtrTo()> [t.FieldOff(3)] ptr) mem)) 12382 for { 12383 t := v.Type 12384 _ = v.Args[1] 12385 ptr := v.Args[0] 12386 mem := v.Args[1] 12387 if !(t.IsStruct() && t.NumFields() == 4 && fe.CanSSA(t)) { 12388 break 12389 } 12390 v.reset(OpStructMake4) 12391 v0 := b.NewValue0(v.Pos, OpLoad, t.FieldType(0)) 12392 v1 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 12393 v1.AuxInt = 0 12394 v1.AddArg(ptr) 12395 v0.AddArg(v1) 12396 v0.AddArg(mem) 12397 v.AddArg(v0) 12398 v2 := b.NewValue0(v.Pos, OpLoad, t.FieldType(1)) 12399 v3 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) 12400 v3.AuxInt = t.FieldOff(1) 12401 v3.AddArg(ptr) 12402 v2.AddArg(v3) 12403 v2.AddArg(mem) 12404 v.AddArg(v2) 12405 v4 := b.NewValue0(v.Pos, OpLoad, t.FieldType(2)) 12406 v5 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(2).PtrTo()) 12407 v5.AuxInt = t.FieldOff(2) 12408 v5.AddArg(ptr) 12409 v4.AddArg(v5) 12410 v4.AddArg(mem) 12411 v.AddArg(v4) 12412 v6 := b.NewValue0(v.Pos, OpLoad, t.FieldType(3)) 12413 v7 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(3).PtrTo()) 12414 v7.AuxInt = t.FieldOff(3) 12415 v7.AddArg(ptr) 12416 v6.AddArg(v7) 12417 v6.AddArg(mem) 12418 v.AddArg(v6) 12419 return true 12420 } 12421 return false 12422 } 12423 func rewriteValuegeneric_OpLoad_10(v *Value) bool { 12424 b := v.Block 12425 _ = b 12426 fe := b.Func.fe 12427 _ = fe 12428 // match: (Load <t> _ _) 12429 // cond: t.IsArray() && t.NumElem() == 0 12430 // result: (ArrayMake0) 12431 for { 12432 t := v.Type 12433 _ = v.Args[1] 12434 if !(t.IsArray() && t.NumElem() == 0) { 12435 break 12436 } 12437 v.reset(OpArrayMake0) 12438 return true 12439 } 12440 // match: (Load <t> ptr mem) 12441 // cond: t.IsArray() && t.NumElem() == 1 && fe.CanSSA(t) 12442 // result: (ArrayMake1 (Load <t.ElemType()> ptr mem)) 12443 for { 12444 t := v.Type 12445 _ = v.Args[1] 12446 ptr := v.Args[0] 12447 mem := v.Args[1] 12448 if !(t.IsArray() && t.NumElem() == 1 && fe.CanSSA(t)) { 12449 break 12450 } 12451 v.reset(OpArrayMake1) 12452 v0 := b.NewValue0(v.Pos, OpLoad, t.ElemType()) 12453 v0.AddArg(ptr) 12454 v0.AddArg(mem) 12455 v.AddArg(v0) 12456 return true 12457 } 12458 return false 12459 } 12460 func rewriteValuegeneric_OpLsh16x16_0(v *Value) bool { 12461 b := v.Block 12462 _ = b 12463 // match: (Lsh16x16 <t> x (Const16 [c])) 12464 // cond: 12465 // result: (Lsh16x64 x (Const64 <t> [int64(uint16(c))])) 12466 for { 12467 t := v.Type 12468 _ = v.Args[1] 12469 x := v.Args[0] 12470 v_1 := v.Args[1] 12471 if v_1.Op != OpConst16 { 12472 break 12473 } 12474 c := v_1.AuxInt 12475 v.reset(OpLsh16x64) 12476 v.AddArg(x) 12477 v0 := b.NewValue0(v.Pos, OpConst64, t) 12478 v0.AuxInt = int64(uint16(c)) 12479 v.AddArg(v0) 12480 return true 12481 } 12482 // match: (Lsh16x16 (Const16 [0]) _) 12483 // cond: 12484 // result: (Const16 [0]) 12485 for { 12486 _ = v.Args[1] 12487 v_0 := v.Args[0] 12488 if v_0.Op != OpConst16 { 12489 break 12490 } 12491 if v_0.AuxInt != 0 { 12492 break 12493 } 12494 v.reset(OpConst16) 12495 v.AuxInt = 0 12496 return true 12497 } 12498 return false 12499 } 12500 func rewriteValuegeneric_OpLsh16x32_0(v *Value) bool { 12501 b := v.Block 12502 _ = b 12503 // match: (Lsh16x32 <t> x (Const32 [c])) 12504 // cond: 12505 // result: (Lsh16x64 x (Const64 <t> [int64(uint32(c))])) 12506 for { 12507 t := v.Type 12508 _ = v.Args[1] 12509 x := v.Args[0] 12510 v_1 := v.Args[1] 12511 if v_1.Op != OpConst32 { 12512 break 12513 } 12514 c := v_1.AuxInt 12515 v.reset(OpLsh16x64) 12516 v.AddArg(x) 12517 v0 := b.NewValue0(v.Pos, OpConst64, t) 12518 v0.AuxInt = int64(uint32(c)) 12519 v.AddArg(v0) 12520 return true 12521 } 12522 // match: (Lsh16x32 (Const16 [0]) _) 12523 // cond: 12524 // result: (Const16 [0]) 12525 for { 12526 _ = v.Args[1] 12527 v_0 := v.Args[0] 12528 if v_0.Op != OpConst16 { 12529 break 12530 } 12531 if v_0.AuxInt != 0 { 12532 break 12533 } 12534 v.reset(OpConst16) 12535 v.AuxInt = 0 12536 return true 12537 } 12538 return false 12539 } 12540 func rewriteValuegeneric_OpLsh16x64_0(v *Value) bool { 12541 b := v.Block 12542 _ = b 12543 typ := &b.Func.Config.Types 12544 _ = typ 12545 // match: (Lsh16x64 (Const16 [c]) (Const64 [d])) 12546 // cond: 12547 // result: (Const16 [int64(int16(c) << uint64(d))]) 12548 for { 12549 _ = v.Args[1] 12550 v_0 := v.Args[0] 12551 if v_0.Op != OpConst16 { 12552 break 12553 } 12554 c := v_0.AuxInt 12555 v_1 := v.Args[1] 12556 if v_1.Op != OpConst64 { 12557 break 12558 } 12559 d := v_1.AuxInt 12560 v.reset(OpConst16) 12561 v.AuxInt = int64(int16(c) << uint64(d)) 12562 return true 12563 } 12564 // match: (Lsh16x64 x (Const64 [0])) 12565 // cond: 12566 // result: x 12567 for { 12568 _ = v.Args[1] 12569 x := v.Args[0] 12570 v_1 := v.Args[1] 12571 if v_1.Op != OpConst64 { 12572 break 12573 } 12574 if v_1.AuxInt != 0 { 12575 break 12576 } 12577 v.reset(OpCopy) 12578 v.Type = x.Type 12579 v.AddArg(x) 12580 return true 12581 } 12582 // match: (Lsh16x64 (Const16 [0]) _) 12583 // cond: 12584 // result: (Const16 [0]) 12585 for { 12586 _ = v.Args[1] 12587 v_0 := v.Args[0] 12588 if v_0.Op != OpConst16 { 12589 break 12590 } 12591 if v_0.AuxInt != 0 { 12592 break 12593 } 12594 v.reset(OpConst16) 12595 v.AuxInt = 0 12596 return true 12597 } 12598 // match: (Lsh16x64 _ (Const64 [c])) 12599 // cond: uint64(c) >= 16 12600 // result: (Const16 [0]) 12601 for { 12602 _ = v.Args[1] 12603 v_1 := v.Args[1] 12604 if v_1.Op != OpConst64 { 12605 break 12606 } 12607 c := v_1.AuxInt 12608 if !(uint64(c) >= 16) { 12609 break 12610 } 12611 v.reset(OpConst16) 12612 v.AuxInt = 0 12613 return true 12614 } 12615 // match: (Lsh16x64 <t> (Lsh16x64 x (Const64 [c])) (Const64 [d])) 12616 // cond: !uaddOvf(c,d) 12617 // result: (Lsh16x64 x (Const64 <t> [c+d])) 12618 for { 12619 t := v.Type 12620 _ = v.Args[1] 12621 v_0 := v.Args[0] 12622 if v_0.Op != OpLsh16x64 { 12623 break 12624 } 12625 _ = v_0.Args[1] 12626 x := v_0.Args[0] 12627 v_0_1 := v_0.Args[1] 12628 if v_0_1.Op != OpConst64 { 12629 break 12630 } 12631 c := v_0_1.AuxInt 12632 v_1 := v.Args[1] 12633 if v_1.Op != OpConst64 { 12634 break 12635 } 12636 d := v_1.AuxInt 12637 if !(!uaddOvf(c, d)) { 12638 break 12639 } 12640 v.reset(OpLsh16x64) 12641 v.AddArg(x) 12642 v0 := b.NewValue0(v.Pos, OpConst64, t) 12643 v0.AuxInt = c + d 12644 v.AddArg(v0) 12645 return true 12646 } 12647 // match: (Lsh16x64 (Rsh16Ux64 (Lsh16x64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 12648 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 12649 // result: (Lsh16x64 x (Const64 <typ.UInt64> [c1-c2+c3])) 12650 for { 12651 _ = v.Args[1] 12652 v_0 := v.Args[0] 12653 if v_0.Op != OpRsh16Ux64 { 12654 break 12655 } 12656 _ = v_0.Args[1] 12657 v_0_0 := v_0.Args[0] 12658 if v_0_0.Op != OpLsh16x64 { 12659 break 12660 } 12661 _ = v_0_0.Args[1] 12662 x := v_0_0.Args[0] 12663 v_0_0_1 := v_0_0.Args[1] 12664 if v_0_0_1.Op != OpConst64 { 12665 break 12666 } 12667 c1 := v_0_0_1.AuxInt 12668 v_0_1 := v_0.Args[1] 12669 if v_0_1.Op != OpConst64 { 12670 break 12671 } 12672 c2 := v_0_1.AuxInt 12673 v_1 := v.Args[1] 12674 if v_1.Op != OpConst64 { 12675 break 12676 } 12677 c3 := v_1.AuxInt 12678 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 12679 break 12680 } 12681 v.reset(OpLsh16x64) 12682 v.AddArg(x) 12683 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 12684 v0.AuxInt = c1 - c2 + c3 12685 v.AddArg(v0) 12686 return true 12687 } 12688 return false 12689 } 12690 func rewriteValuegeneric_OpLsh16x8_0(v *Value) bool { 12691 b := v.Block 12692 _ = b 12693 // match: (Lsh16x8 <t> x (Const8 [c])) 12694 // cond: 12695 // result: (Lsh16x64 x (Const64 <t> [int64(uint8(c))])) 12696 for { 12697 t := v.Type 12698 _ = v.Args[1] 12699 x := v.Args[0] 12700 v_1 := v.Args[1] 12701 if v_1.Op != OpConst8 { 12702 break 12703 } 12704 c := v_1.AuxInt 12705 v.reset(OpLsh16x64) 12706 v.AddArg(x) 12707 v0 := b.NewValue0(v.Pos, OpConst64, t) 12708 v0.AuxInt = int64(uint8(c)) 12709 v.AddArg(v0) 12710 return true 12711 } 12712 // match: (Lsh16x8 (Const16 [0]) _) 12713 // cond: 12714 // result: (Const16 [0]) 12715 for { 12716 _ = v.Args[1] 12717 v_0 := v.Args[0] 12718 if v_0.Op != OpConst16 { 12719 break 12720 } 12721 if v_0.AuxInt != 0 { 12722 break 12723 } 12724 v.reset(OpConst16) 12725 v.AuxInt = 0 12726 return true 12727 } 12728 return false 12729 } 12730 func rewriteValuegeneric_OpLsh32x16_0(v *Value) bool { 12731 b := v.Block 12732 _ = b 12733 // match: (Lsh32x16 <t> x (Const16 [c])) 12734 // cond: 12735 // result: (Lsh32x64 x (Const64 <t> [int64(uint16(c))])) 12736 for { 12737 t := v.Type 12738 _ = v.Args[1] 12739 x := v.Args[0] 12740 v_1 := v.Args[1] 12741 if v_1.Op != OpConst16 { 12742 break 12743 } 12744 c := v_1.AuxInt 12745 v.reset(OpLsh32x64) 12746 v.AddArg(x) 12747 v0 := b.NewValue0(v.Pos, OpConst64, t) 12748 v0.AuxInt = int64(uint16(c)) 12749 v.AddArg(v0) 12750 return true 12751 } 12752 // match: (Lsh32x16 (Const32 [0]) _) 12753 // cond: 12754 // result: (Const32 [0]) 12755 for { 12756 _ = v.Args[1] 12757 v_0 := v.Args[0] 12758 if v_0.Op != OpConst32 { 12759 break 12760 } 12761 if v_0.AuxInt != 0 { 12762 break 12763 } 12764 v.reset(OpConst32) 12765 v.AuxInt = 0 12766 return true 12767 } 12768 return false 12769 } 12770 func rewriteValuegeneric_OpLsh32x32_0(v *Value) bool { 12771 b := v.Block 12772 _ = b 12773 // match: (Lsh32x32 <t> x (Const32 [c])) 12774 // cond: 12775 // result: (Lsh32x64 x (Const64 <t> [int64(uint32(c))])) 12776 for { 12777 t := v.Type 12778 _ = v.Args[1] 12779 x := v.Args[0] 12780 v_1 := v.Args[1] 12781 if v_1.Op != OpConst32 { 12782 break 12783 } 12784 c := v_1.AuxInt 12785 v.reset(OpLsh32x64) 12786 v.AddArg(x) 12787 v0 := b.NewValue0(v.Pos, OpConst64, t) 12788 v0.AuxInt = int64(uint32(c)) 12789 v.AddArg(v0) 12790 return true 12791 } 12792 // match: (Lsh32x32 (Const32 [0]) _) 12793 // cond: 12794 // result: (Const32 [0]) 12795 for { 12796 _ = v.Args[1] 12797 v_0 := v.Args[0] 12798 if v_0.Op != OpConst32 { 12799 break 12800 } 12801 if v_0.AuxInt != 0 { 12802 break 12803 } 12804 v.reset(OpConst32) 12805 v.AuxInt = 0 12806 return true 12807 } 12808 return false 12809 } 12810 func rewriteValuegeneric_OpLsh32x64_0(v *Value) bool { 12811 b := v.Block 12812 _ = b 12813 typ := &b.Func.Config.Types 12814 _ = typ 12815 // match: (Lsh32x64 (Const32 [c]) (Const64 [d])) 12816 // cond: 12817 // result: (Const32 [int64(int32(c) << uint64(d))]) 12818 for { 12819 _ = v.Args[1] 12820 v_0 := v.Args[0] 12821 if v_0.Op != OpConst32 { 12822 break 12823 } 12824 c := v_0.AuxInt 12825 v_1 := v.Args[1] 12826 if v_1.Op != OpConst64 { 12827 break 12828 } 12829 d := v_1.AuxInt 12830 v.reset(OpConst32) 12831 v.AuxInt = int64(int32(c) << uint64(d)) 12832 return true 12833 } 12834 // match: (Lsh32x64 x (Const64 [0])) 12835 // cond: 12836 // result: x 12837 for { 12838 _ = v.Args[1] 12839 x := v.Args[0] 12840 v_1 := v.Args[1] 12841 if v_1.Op != OpConst64 { 12842 break 12843 } 12844 if v_1.AuxInt != 0 { 12845 break 12846 } 12847 v.reset(OpCopy) 12848 v.Type = x.Type 12849 v.AddArg(x) 12850 return true 12851 } 12852 // match: (Lsh32x64 (Const32 [0]) _) 12853 // cond: 12854 // result: (Const32 [0]) 12855 for { 12856 _ = v.Args[1] 12857 v_0 := v.Args[0] 12858 if v_0.Op != OpConst32 { 12859 break 12860 } 12861 if v_0.AuxInt != 0 { 12862 break 12863 } 12864 v.reset(OpConst32) 12865 v.AuxInt = 0 12866 return true 12867 } 12868 // match: (Lsh32x64 _ (Const64 [c])) 12869 // cond: uint64(c) >= 32 12870 // result: (Const32 [0]) 12871 for { 12872 _ = v.Args[1] 12873 v_1 := v.Args[1] 12874 if v_1.Op != OpConst64 { 12875 break 12876 } 12877 c := v_1.AuxInt 12878 if !(uint64(c) >= 32) { 12879 break 12880 } 12881 v.reset(OpConst32) 12882 v.AuxInt = 0 12883 return true 12884 } 12885 // match: (Lsh32x64 <t> (Lsh32x64 x (Const64 [c])) (Const64 [d])) 12886 // cond: !uaddOvf(c,d) 12887 // result: (Lsh32x64 x (Const64 <t> [c+d])) 12888 for { 12889 t := v.Type 12890 _ = v.Args[1] 12891 v_0 := v.Args[0] 12892 if v_0.Op != OpLsh32x64 { 12893 break 12894 } 12895 _ = v_0.Args[1] 12896 x := v_0.Args[0] 12897 v_0_1 := v_0.Args[1] 12898 if v_0_1.Op != OpConst64 { 12899 break 12900 } 12901 c := v_0_1.AuxInt 12902 v_1 := v.Args[1] 12903 if v_1.Op != OpConst64 { 12904 break 12905 } 12906 d := v_1.AuxInt 12907 if !(!uaddOvf(c, d)) { 12908 break 12909 } 12910 v.reset(OpLsh32x64) 12911 v.AddArg(x) 12912 v0 := b.NewValue0(v.Pos, OpConst64, t) 12913 v0.AuxInt = c + d 12914 v.AddArg(v0) 12915 return true 12916 } 12917 // match: (Lsh32x64 (Rsh32Ux64 (Lsh32x64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 12918 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 12919 // result: (Lsh32x64 x (Const64 <typ.UInt64> [c1-c2+c3])) 12920 for { 12921 _ = v.Args[1] 12922 v_0 := v.Args[0] 12923 if v_0.Op != OpRsh32Ux64 { 12924 break 12925 } 12926 _ = v_0.Args[1] 12927 v_0_0 := v_0.Args[0] 12928 if v_0_0.Op != OpLsh32x64 { 12929 break 12930 } 12931 _ = v_0_0.Args[1] 12932 x := v_0_0.Args[0] 12933 v_0_0_1 := v_0_0.Args[1] 12934 if v_0_0_1.Op != OpConst64 { 12935 break 12936 } 12937 c1 := v_0_0_1.AuxInt 12938 v_0_1 := v_0.Args[1] 12939 if v_0_1.Op != OpConst64 { 12940 break 12941 } 12942 c2 := v_0_1.AuxInt 12943 v_1 := v.Args[1] 12944 if v_1.Op != OpConst64 { 12945 break 12946 } 12947 c3 := v_1.AuxInt 12948 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 12949 break 12950 } 12951 v.reset(OpLsh32x64) 12952 v.AddArg(x) 12953 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 12954 v0.AuxInt = c1 - c2 + c3 12955 v.AddArg(v0) 12956 return true 12957 } 12958 return false 12959 } 12960 func rewriteValuegeneric_OpLsh32x8_0(v *Value) bool { 12961 b := v.Block 12962 _ = b 12963 // match: (Lsh32x8 <t> x (Const8 [c])) 12964 // cond: 12965 // result: (Lsh32x64 x (Const64 <t> [int64(uint8(c))])) 12966 for { 12967 t := v.Type 12968 _ = v.Args[1] 12969 x := v.Args[0] 12970 v_1 := v.Args[1] 12971 if v_1.Op != OpConst8 { 12972 break 12973 } 12974 c := v_1.AuxInt 12975 v.reset(OpLsh32x64) 12976 v.AddArg(x) 12977 v0 := b.NewValue0(v.Pos, OpConst64, t) 12978 v0.AuxInt = int64(uint8(c)) 12979 v.AddArg(v0) 12980 return true 12981 } 12982 // match: (Lsh32x8 (Const32 [0]) _) 12983 // cond: 12984 // result: (Const32 [0]) 12985 for { 12986 _ = v.Args[1] 12987 v_0 := v.Args[0] 12988 if v_0.Op != OpConst32 { 12989 break 12990 } 12991 if v_0.AuxInt != 0 { 12992 break 12993 } 12994 v.reset(OpConst32) 12995 v.AuxInt = 0 12996 return true 12997 } 12998 return false 12999 } 13000 func rewriteValuegeneric_OpLsh64x16_0(v *Value) bool { 13001 b := v.Block 13002 _ = b 13003 // match: (Lsh64x16 <t> x (Const16 [c])) 13004 // cond: 13005 // result: (Lsh64x64 x (Const64 <t> [int64(uint16(c))])) 13006 for { 13007 t := v.Type 13008 _ = v.Args[1] 13009 x := v.Args[0] 13010 v_1 := v.Args[1] 13011 if v_1.Op != OpConst16 { 13012 break 13013 } 13014 c := v_1.AuxInt 13015 v.reset(OpLsh64x64) 13016 v.AddArg(x) 13017 v0 := b.NewValue0(v.Pos, OpConst64, t) 13018 v0.AuxInt = int64(uint16(c)) 13019 v.AddArg(v0) 13020 return true 13021 } 13022 // match: (Lsh64x16 (Const64 [0]) _) 13023 // cond: 13024 // result: (Const64 [0]) 13025 for { 13026 _ = v.Args[1] 13027 v_0 := v.Args[0] 13028 if v_0.Op != OpConst64 { 13029 break 13030 } 13031 if v_0.AuxInt != 0 { 13032 break 13033 } 13034 v.reset(OpConst64) 13035 v.AuxInt = 0 13036 return true 13037 } 13038 return false 13039 } 13040 func rewriteValuegeneric_OpLsh64x32_0(v *Value) bool { 13041 b := v.Block 13042 _ = b 13043 // match: (Lsh64x32 <t> x (Const32 [c])) 13044 // cond: 13045 // result: (Lsh64x64 x (Const64 <t> [int64(uint32(c))])) 13046 for { 13047 t := v.Type 13048 _ = v.Args[1] 13049 x := v.Args[0] 13050 v_1 := v.Args[1] 13051 if v_1.Op != OpConst32 { 13052 break 13053 } 13054 c := v_1.AuxInt 13055 v.reset(OpLsh64x64) 13056 v.AddArg(x) 13057 v0 := b.NewValue0(v.Pos, OpConst64, t) 13058 v0.AuxInt = int64(uint32(c)) 13059 v.AddArg(v0) 13060 return true 13061 } 13062 // match: (Lsh64x32 (Const64 [0]) _) 13063 // cond: 13064 // result: (Const64 [0]) 13065 for { 13066 _ = v.Args[1] 13067 v_0 := v.Args[0] 13068 if v_0.Op != OpConst64 { 13069 break 13070 } 13071 if v_0.AuxInt != 0 { 13072 break 13073 } 13074 v.reset(OpConst64) 13075 v.AuxInt = 0 13076 return true 13077 } 13078 return false 13079 } 13080 func rewriteValuegeneric_OpLsh64x64_0(v *Value) bool { 13081 b := v.Block 13082 _ = b 13083 typ := &b.Func.Config.Types 13084 _ = typ 13085 // match: (Lsh64x64 (Const64 [c]) (Const64 [d])) 13086 // cond: 13087 // result: (Const64 [c << uint64(d)]) 13088 for { 13089 _ = v.Args[1] 13090 v_0 := v.Args[0] 13091 if v_0.Op != OpConst64 { 13092 break 13093 } 13094 c := v_0.AuxInt 13095 v_1 := v.Args[1] 13096 if v_1.Op != OpConst64 { 13097 break 13098 } 13099 d := v_1.AuxInt 13100 v.reset(OpConst64) 13101 v.AuxInt = c << uint64(d) 13102 return true 13103 } 13104 // match: (Lsh64x64 x (Const64 [0])) 13105 // cond: 13106 // result: x 13107 for { 13108 _ = v.Args[1] 13109 x := v.Args[0] 13110 v_1 := v.Args[1] 13111 if v_1.Op != OpConst64 { 13112 break 13113 } 13114 if v_1.AuxInt != 0 { 13115 break 13116 } 13117 v.reset(OpCopy) 13118 v.Type = x.Type 13119 v.AddArg(x) 13120 return true 13121 } 13122 // match: (Lsh64x64 (Const64 [0]) _) 13123 // cond: 13124 // result: (Const64 [0]) 13125 for { 13126 _ = v.Args[1] 13127 v_0 := v.Args[0] 13128 if v_0.Op != OpConst64 { 13129 break 13130 } 13131 if v_0.AuxInt != 0 { 13132 break 13133 } 13134 v.reset(OpConst64) 13135 v.AuxInt = 0 13136 return true 13137 } 13138 // match: (Lsh64x64 _ (Const64 [c])) 13139 // cond: uint64(c) >= 64 13140 // result: (Const64 [0]) 13141 for { 13142 _ = v.Args[1] 13143 v_1 := v.Args[1] 13144 if v_1.Op != OpConst64 { 13145 break 13146 } 13147 c := v_1.AuxInt 13148 if !(uint64(c) >= 64) { 13149 break 13150 } 13151 v.reset(OpConst64) 13152 v.AuxInt = 0 13153 return true 13154 } 13155 // match: (Lsh64x64 <t> (Lsh64x64 x (Const64 [c])) (Const64 [d])) 13156 // cond: !uaddOvf(c,d) 13157 // result: (Lsh64x64 x (Const64 <t> [c+d])) 13158 for { 13159 t := v.Type 13160 _ = v.Args[1] 13161 v_0 := v.Args[0] 13162 if v_0.Op != OpLsh64x64 { 13163 break 13164 } 13165 _ = v_0.Args[1] 13166 x := v_0.Args[0] 13167 v_0_1 := v_0.Args[1] 13168 if v_0_1.Op != OpConst64 { 13169 break 13170 } 13171 c := v_0_1.AuxInt 13172 v_1 := v.Args[1] 13173 if v_1.Op != OpConst64 { 13174 break 13175 } 13176 d := v_1.AuxInt 13177 if !(!uaddOvf(c, d)) { 13178 break 13179 } 13180 v.reset(OpLsh64x64) 13181 v.AddArg(x) 13182 v0 := b.NewValue0(v.Pos, OpConst64, t) 13183 v0.AuxInt = c + d 13184 v.AddArg(v0) 13185 return true 13186 } 13187 // match: (Lsh64x64 (Rsh64Ux64 (Lsh64x64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 13188 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 13189 // result: (Lsh64x64 x (Const64 <typ.UInt64> [c1-c2+c3])) 13190 for { 13191 _ = v.Args[1] 13192 v_0 := v.Args[0] 13193 if v_0.Op != OpRsh64Ux64 { 13194 break 13195 } 13196 _ = v_0.Args[1] 13197 v_0_0 := v_0.Args[0] 13198 if v_0_0.Op != OpLsh64x64 { 13199 break 13200 } 13201 _ = v_0_0.Args[1] 13202 x := v_0_0.Args[0] 13203 v_0_0_1 := v_0_0.Args[1] 13204 if v_0_0_1.Op != OpConst64 { 13205 break 13206 } 13207 c1 := v_0_0_1.AuxInt 13208 v_0_1 := v_0.Args[1] 13209 if v_0_1.Op != OpConst64 { 13210 break 13211 } 13212 c2 := v_0_1.AuxInt 13213 v_1 := v.Args[1] 13214 if v_1.Op != OpConst64 { 13215 break 13216 } 13217 c3 := v_1.AuxInt 13218 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 13219 break 13220 } 13221 v.reset(OpLsh64x64) 13222 v.AddArg(x) 13223 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 13224 v0.AuxInt = c1 - c2 + c3 13225 v.AddArg(v0) 13226 return true 13227 } 13228 return false 13229 } 13230 func rewriteValuegeneric_OpLsh64x8_0(v *Value) bool { 13231 b := v.Block 13232 _ = b 13233 // match: (Lsh64x8 <t> x (Const8 [c])) 13234 // cond: 13235 // result: (Lsh64x64 x (Const64 <t> [int64(uint8(c))])) 13236 for { 13237 t := v.Type 13238 _ = v.Args[1] 13239 x := v.Args[0] 13240 v_1 := v.Args[1] 13241 if v_1.Op != OpConst8 { 13242 break 13243 } 13244 c := v_1.AuxInt 13245 v.reset(OpLsh64x64) 13246 v.AddArg(x) 13247 v0 := b.NewValue0(v.Pos, OpConst64, t) 13248 v0.AuxInt = int64(uint8(c)) 13249 v.AddArg(v0) 13250 return true 13251 } 13252 // match: (Lsh64x8 (Const64 [0]) _) 13253 // cond: 13254 // result: (Const64 [0]) 13255 for { 13256 _ = v.Args[1] 13257 v_0 := v.Args[0] 13258 if v_0.Op != OpConst64 { 13259 break 13260 } 13261 if v_0.AuxInt != 0 { 13262 break 13263 } 13264 v.reset(OpConst64) 13265 v.AuxInt = 0 13266 return true 13267 } 13268 return false 13269 } 13270 func rewriteValuegeneric_OpLsh8x16_0(v *Value) bool { 13271 b := v.Block 13272 _ = b 13273 // match: (Lsh8x16 <t> x (Const16 [c])) 13274 // cond: 13275 // result: (Lsh8x64 x (Const64 <t> [int64(uint16(c))])) 13276 for { 13277 t := v.Type 13278 _ = v.Args[1] 13279 x := v.Args[0] 13280 v_1 := v.Args[1] 13281 if v_1.Op != OpConst16 { 13282 break 13283 } 13284 c := v_1.AuxInt 13285 v.reset(OpLsh8x64) 13286 v.AddArg(x) 13287 v0 := b.NewValue0(v.Pos, OpConst64, t) 13288 v0.AuxInt = int64(uint16(c)) 13289 v.AddArg(v0) 13290 return true 13291 } 13292 // match: (Lsh8x16 (Const8 [0]) _) 13293 // cond: 13294 // result: (Const8 [0]) 13295 for { 13296 _ = v.Args[1] 13297 v_0 := v.Args[0] 13298 if v_0.Op != OpConst8 { 13299 break 13300 } 13301 if v_0.AuxInt != 0 { 13302 break 13303 } 13304 v.reset(OpConst8) 13305 v.AuxInt = 0 13306 return true 13307 } 13308 return false 13309 } 13310 func rewriteValuegeneric_OpLsh8x32_0(v *Value) bool { 13311 b := v.Block 13312 _ = b 13313 // match: (Lsh8x32 <t> x (Const32 [c])) 13314 // cond: 13315 // result: (Lsh8x64 x (Const64 <t> [int64(uint32(c))])) 13316 for { 13317 t := v.Type 13318 _ = v.Args[1] 13319 x := v.Args[0] 13320 v_1 := v.Args[1] 13321 if v_1.Op != OpConst32 { 13322 break 13323 } 13324 c := v_1.AuxInt 13325 v.reset(OpLsh8x64) 13326 v.AddArg(x) 13327 v0 := b.NewValue0(v.Pos, OpConst64, t) 13328 v0.AuxInt = int64(uint32(c)) 13329 v.AddArg(v0) 13330 return true 13331 } 13332 // match: (Lsh8x32 (Const8 [0]) _) 13333 // cond: 13334 // result: (Const8 [0]) 13335 for { 13336 _ = v.Args[1] 13337 v_0 := v.Args[0] 13338 if v_0.Op != OpConst8 { 13339 break 13340 } 13341 if v_0.AuxInt != 0 { 13342 break 13343 } 13344 v.reset(OpConst8) 13345 v.AuxInt = 0 13346 return true 13347 } 13348 return false 13349 } 13350 func rewriteValuegeneric_OpLsh8x64_0(v *Value) bool { 13351 b := v.Block 13352 _ = b 13353 typ := &b.Func.Config.Types 13354 _ = typ 13355 // match: (Lsh8x64 (Const8 [c]) (Const64 [d])) 13356 // cond: 13357 // result: (Const8 [int64(int8(c) << uint64(d))]) 13358 for { 13359 _ = v.Args[1] 13360 v_0 := v.Args[0] 13361 if v_0.Op != OpConst8 { 13362 break 13363 } 13364 c := v_0.AuxInt 13365 v_1 := v.Args[1] 13366 if v_1.Op != OpConst64 { 13367 break 13368 } 13369 d := v_1.AuxInt 13370 v.reset(OpConst8) 13371 v.AuxInt = int64(int8(c) << uint64(d)) 13372 return true 13373 } 13374 // match: (Lsh8x64 x (Const64 [0])) 13375 // cond: 13376 // result: x 13377 for { 13378 _ = v.Args[1] 13379 x := v.Args[0] 13380 v_1 := v.Args[1] 13381 if v_1.Op != OpConst64 { 13382 break 13383 } 13384 if v_1.AuxInt != 0 { 13385 break 13386 } 13387 v.reset(OpCopy) 13388 v.Type = x.Type 13389 v.AddArg(x) 13390 return true 13391 } 13392 // match: (Lsh8x64 (Const8 [0]) _) 13393 // cond: 13394 // result: (Const8 [0]) 13395 for { 13396 _ = v.Args[1] 13397 v_0 := v.Args[0] 13398 if v_0.Op != OpConst8 { 13399 break 13400 } 13401 if v_0.AuxInt != 0 { 13402 break 13403 } 13404 v.reset(OpConst8) 13405 v.AuxInt = 0 13406 return true 13407 } 13408 // match: (Lsh8x64 _ (Const64 [c])) 13409 // cond: uint64(c) >= 8 13410 // result: (Const8 [0]) 13411 for { 13412 _ = v.Args[1] 13413 v_1 := v.Args[1] 13414 if v_1.Op != OpConst64 { 13415 break 13416 } 13417 c := v_1.AuxInt 13418 if !(uint64(c) >= 8) { 13419 break 13420 } 13421 v.reset(OpConst8) 13422 v.AuxInt = 0 13423 return true 13424 } 13425 // match: (Lsh8x64 <t> (Lsh8x64 x (Const64 [c])) (Const64 [d])) 13426 // cond: !uaddOvf(c,d) 13427 // result: (Lsh8x64 x (Const64 <t> [c+d])) 13428 for { 13429 t := v.Type 13430 _ = v.Args[1] 13431 v_0 := v.Args[0] 13432 if v_0.Op != OpLsh8x64 { 13433 break 13434 } 13435 _ = v_0.Args[1] 13436 x := v_0.Args[0] 13437 v_0_1 := v_0.Args[1] 13438 if v_0_1.Op != OpConst64 { 13439 break 13440 } 13441 c := v_0_1.AuxInt 13442 v_1 := v.Args[1] 13443 if v_1.Op != OpConst64 { 13444 break 13445 } 13446 d := v_1.AuxInt 13447 if !(!uaddOvf(c, d)) { 13448 break 13449 } 13450 v.reset(OpLsh8x64) 13451 v.AddArg(x) 13452 v0 := b.NewValue0(v.Pos, OpConst64, t) 13453 v0.AuxInt = c + d 13454 v.AddArg(v0) 13455 return true 13456 } 13457 // match: (Lsh8x64 (Rsh8Ux64 (Lsh8x64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 13458 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 13459 // result: (Lsh8x64 x (Const64 <typ.UInt64> [c1-c2+c3])) 13460 for { 13461 _ = v.Args[1] 13462 v_0 := v.Args[0] 13463 if v_0.Op != OpRsh8Ux64 { 13464 break 13465 } 13466 _ = v_0.Args[1] 13467 v_0_0 := v_0.Args[0] 13468 if v_0_0.Op != OpLsh8x64 { 13469 break 13470 } 13471 _ = v_0_0.Args[1] 13472 x := v_0_0.Args[0] 13473 v_0_0_1 := v_0_0.Args[1] 13474 if v_0_0_1.Op != OpConst64 { 13475 break 13476 } 13477 c1 := v_0_0_1.AuxInt 13478 v_0_1 := v_0.Args[1] 13479 if v_0_1.Op != OpConst64 { 13480 break 13481 } 13482 c2 := v_0_1.AuxInt 13483 v_1 := v.Args[1] 13484 if v_1.Op != OpConst64 { 13485 break 13486 } 13487 c3 := v_1.AuxInt 13488 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 13489 break 13490 } 13491 v.reset(OpLsh8x64) 13492 v.AddArg(x) 13493 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 13494 v0.AuxInt = c1 - c2 + c3 13495 v.AddArg(v0) 13496 return true 13497 } 13498 return false 13499 } 13500 func rewriteValuegeneric_OpLsh8x8_0(v *Value) bool { 13501 b := v.Block 13502 _ = b 13503 // match: (Lsh8x8 <t> x (Const8 [c])) 13504 // cond: 13505 // result: (Lsh8x64 x (Const64 <t> [int64(uint8(c))])) 13506 for { 13507 t := v.Type 13508 _ = v.Args[1] 13509 x := v.Args[0] 13510 v_1 := v.Args[1] 13511 if v_1.Op != OpConst8 { 13512 break 13513 } 13514 c := v_1.AuxInt 13515 v.reset(OpLsh8x64) 13516 v.AddArg(x) 13517 v0 := b.NewValue0(v.Pos, OpConst64, t) 13518 v0.AuxInt = int64(uint8(c)) 13519 v.AddArg(v0) 13520 return true 13521 } 13522 // match: (Lsh8x8 (Const8 [0]) _) 13523 // cond: 13524 // result: (Const8 [0]) 13525 for { 13526 _ = v.Args[1] 13527 v_0 := v.Args[0] 13528 if v_0.Op != OpConst8 { 13529 break 13530 } 13531 if v_0.AuxInt != 0 { 13532 break 13533 } 13534 v.reset(OpConst8) 13535 v.AuxInt = 0 13536 return true 13537 } 13538 return false 13539 } 13540 func rewriteValuegeneric_OpMod16_0(v *Value) bool { 13541 b := v.Block 13542 _ = b 13543 // match: (Mod16 (Const16 [c]) (Const16 [d])) 13544 // cond: d != 0 13545 // result: (Const16 [int64(int16(c % d))]) 13546 for { 13547 _ = v.Args[1] 13548 v_0 := v.Args[0] 13549 if v_0.Op != OpConst16 { 13550 break 13551 } 13552 c := v_0.AuxInt 13553 v_1 := v.Args[1] 13554 if v_1.Op != OpConst16 { 13555 break 13556 } 13557 d := v_1.AuxInt 13558 if !(d != 0) { 13559 break 13560 } 13561 v.reset(OpConst16) 13562 v.AuxInt = int64(int16(c % d)) 13563 return true 13564 } 13565 // match: (Mod16 <t> n (Const16 [c])) 13566 // cond: isNonNegative(n) && isPowerOfTwo(c&0xffff) 13567 // result: (And16 n (Const16 <t> [(c&0xffff)-1])) 13568 for { 13569 t := v.Type 13570 _ = v.Args[1] 13571 n := v.Args[0] 13572 v_1 := v.Args[1] 13573 if v_1.Op != OpConst16 { 13574 break 13575 } 13576 c := v_1.AuxInt 13577 if !(isNonNegative(n) && isPowerOfTwo(c&0xffff)) { 13578 break 13579 } 13580 v.reset(OpAnd16) 13581 v.AddArg(n) 13582 v0 := b.NewValue0(v.Pos, OpConst16, t) 13583 v0.AuxInt = (c & 0xffff) - 1 13584 v.AddArg(v0) 13585 return true 13586 } 13587 // match: (Mod16 <t> n (Const16 [c])) 13588 // cond: c < 0 && c != -1<<15 13589 // result: (Mod16 <t> n (Const16 <t> [-c])) 13590 for { 13591 t := v.Type 13592 _ = v.Args[1] 13593 n := v.Args[0] 13594 v_1 := v.Args[1] 13595 if v_1.Op != OpConst16 { 13596 break 13597 } 13598 c := v_1.AuxInt 13599 if !(c < 0 && c != -1<<15) { 13600 break 13601 } 13602 v.reset(OpMod16) 13603 v.Type = t 13604 v.AddArg(n) 13605 v0 := b.NewValue0(v.Pos, OpConst16, t) 13606 v0.AuxInt = -c 13607 v.AddArg(v0) 13608 return true 13609 } 13610 // match: (Mod16 <t> x (Const16 [c])) 13611 // cond: x.Op != OpConst16 && (c > 0 || c == -1<<15) 13612 // result: (Sub16 x (Mul16 <t> (Div16 <t> x (Const16 <t> [c])) (Const16 <t> [c]))) 13613 for { 13614 t := v.Type 13615 _ = v.Args[1] 13616 x := v.Args[0] 13617 v_1 := v.Args[1] 13618 if v_1.Op != OpConst16 { 13619 break 13620 } 13621 c := v_1.AuxInt 13622 if !(x.Op != OpConst16 && (c > 0 || c == -1<<15)) { 13623 break 13624 } 13625 v.reset(OpSub16) 13626 v.AddArg(x) 13627 v0 := b.NewValue0(v.Pos, OpMul16, t) 13628 v1 := b.NewValue0(v.Pos, OpDiv16, t) 13629 v1.AddArg(x) 13630 v2 := b.NewValue0(v.Pos, OpConst16, t) 13631 v2.AuxInt = c 13632 v1.AddArg(v2) 13633 v0.AddArg(v1) 13634 v3 := b.NewValue0(v.Pos, OpConst16, t) 13635 v3.AuxInt = c 13636 v0.AddArg(v3) 13637 v.AddArg(v0) 13638 return true 13639 } 13640 return false 13641 } 13642 func rewriteValuegeneric_OpMod16u_0(v *Value) bool { 13643 b := v.Block 13644 _ = b 13645 // match: (Mod16u (Const16 [c]) (Const16 [d])) 13646 // cond: d != 0 13647 // result: (Const16 [int64(uint16(c) % uint16(d))]) 13648 for { 13649 _ = v.Args[1] 13650 v_0 := v.Args[0] 13651 if v_0.Op != OpConst16 { 13652 break 13653 } 13654 c := v_0.AuxInt 13655 v_1 := v.Args[1] 13656 if v_1.Op != OpConst16 { 13657 break 13658 } 13659 d := v_1.AuxInt 13660 if !(d != 0) { 13661 break 13662 } 13663 v.reset(OpConst16) 13664 v.AuxInt = int64(uint16(c) % uint16(d)) 13665 return true 13666 } 13667 // match: (Mod16u <t> n (Const16 [c])) 13668 // cond: isPowerOfTwo(c&0xffff) 13669 // result: (And16 n (Const16 <t> [(c&0xffff)-1])) 13670 for { 13671 t := v.Type 13672 _ = v.Args[1] 13673 n := v.Args[0] 13674 v_1 := v.Args[1] 13675 if v_1.Op != OpConst16 { 13676 break 13677 } 13678 c := v_1.AuxInt 13679 if !(isPowerOfTwo(c & 0xffff)) { 13680 break 13681 } 13682 v.reset(OpAnd16) 13683 v.AddArg(n) 13684 v0 := b.NewValue0(v.Pos, OpConst16, t) 13685 v0.AuxInt = (c & 0xffff) - 1 13686 v.AddArg(v0) 13687 return true 13688 } 13689 // match: (Mod16u <t> x (Const16 [c])) 13690 // cond: x.Op != OpConst16 && c > 0 && umagicOK(16,c) 13691 // result: (Sub16 x (Mul16 <t> (Div16u <t> x (Const16 <t> [c])) (Const16 <t> [c]))) 13692 for { 13693 t := v.Type 13694 _ = v.Args[1] 13695 x := v.Args[0] 13696 v_1 := v.Args[1] 13697 if v_1.Op != OpConst16 { 13698 break 13699 } 13700 c := v_1.AuxInt 13701 if !(x.Op != OpConst16 && c > 0 && umagicOK(16, c)) { 13702 break 13703 } 13704 v.reset(OpSub16) 13705 v.AddArg(x) 13706 v0 := b.NewValue0(v.Pos, OpMul16, t) 13707 v1 := b.NewValue0(v.Pos, OpDiv16u, t) 13708 v1.AddArg(x) 13709 v2 := b.NewValue0(v.Pos, OpConst16, t) 13710 v2.AuxInt = c 13711 v1.AddArg(v2) 13712 v0.AddArg(v1) 13713 v3 := b.NewValue0(v.Pos, OpConst16, t) 13714 v3.AuxInt = c 13715 v0.AddArg(v3) 13716 v.AddArg(v0) 13717 return true 13718 } 13719 return false 13720 } 13721 func rewriteValuegeneric_OpMod32_0(v *Value) bool { 13722 b := v.Block 13723 _ = b 13724 // match: (Mod32 (Const32 [c]) (Const32 [d])) 13725 // cond: d != 0 13726 // result: (Const32 [int64(int32(c % d))]) 13727 for { 13728 _ = v.Args[1] 13729 v_0 := v.Args[0] 13730 if v_0.Op != OpConst32 { 13731 break 13732 } 13733 c := v_0.AuxInt 13734 v_1 := v.Args[1] 13735 if v_1.Op != OpConst32 { 13736 break 13737 } 13738 d := v_1.AuxInt 13739 if !(d != 0) { 13740 break 13741 } 13742 v.reset(OpConst32) 13743 v.AuxInt = int64(int32(c % d)) 13744 return true 13745 } 13746 // match: (Mod32 <t> n (Const32 [c])) 13747 // cond: isNonNegative(n) && isPowerOfTwo(c&0xffffffff) 13748 // result: (And32 n (Const32 <t> [(c&0xffffffff)-1])) 13749 for { 13750 t := v.Type 13751 _ = v.Args[1] 13752 n := v.Args[0] 13753 v_1 := v.Args[1] 13754 if v_1.Op != OpConst32 { 13755 break 13756 } 13757 c := v_1.AuxInt 13758 if !(isNonNegative(n) && isPowerOfTwo(c&0xffffffff)) { 13759 break 13760 } 13761 v.reset(OpAnd32) 13762 v.AddArg(n) 13763 v0 := b.NewValue0(v.Pos, OpConst32, t) 13764 v0.AuxInt = (c & 0xffffffff) - 1 13765 v.AddArg(v0) 13766 return true 13767 } 13768 // match: (Mod32 <t> n (Const32 [c])) 13769 // cond: c < 0 && c != -1<<31 13770 // result: (Mod32 <t> n (Const32 <t> [-c])) 13771 for { 13772 t := v.Type 13773 _ = v.Args[1] 13774 n := v.Args[0] 13775 v_1 := v.Args[1] 13776 if v_1.Op != OpConst32 { 13777 break 13778 } 13779 c := v_1.AuxInt 13780 if !(c < 0 && c != -1<<31) { 13781 break 13782 } 13783 v.reset(OpMod32) 13784 v.Type = t 13785 v.AddArg(n) 13786 v0 := b.NewValue0(v.Pos, OpConst32, t) 13787 v0.AuxInt = -c 13788 v.AddArg(v0) 13789 return true 13790 } 13791 // match: (Mod32 <t> x (Const32 [c])) 13792 // cond: x.Op != OpConst32 && (c > 0 || c == -1<<31) 13793 // result: (Sub32 x (Mul32 <t> (Div32 <t> x (Const32 <t> [c])) (Const32 <t> [c]))) 13794 for { 13795 t := v.Type 13796 _ = v.Args[1] 13797 x := v.Args[0] 13798 v_1 := v.Args[1] 13799 if v_1.Op != OpConst32 { 13800 break 13801 } 13802 c := v_1.AuxInt 13803 if !(x.Op != OpConst32 && (c > 0 || c == -1<<31)) { 13804 break 13805 } 13806 v.reset(OpSub32) 13807 v.AddArg(x) 13808 v0 := b.NewValue0(v.Pos, OpMul32, t) 13809 v1 := b.NewValue0(v.Pos, OpDiv32, t) 13810 v1.AddArg(x) 13811 v2 := b.NewValue0(v.Pos, OpConst32, t) 13812 v2.AuxInt = c 13813 v1.AddArg(v2) 13814 v0.AddArg(v1) 13815 v3 := b.NewValue0(v.Pos, OpConst32, t) 13816 v3.AuxInt = c 13817 v0.AddArg(v3) 13818 v.AddArg(v0) 13819 return true 13820 } 13821 return false 13822 } 13823 func rewriteValuegeneric_OpMod32u_0(v *Value) bool { 13824 b := v.Block 13825 _ = b 13826 // match: (Mod32u (Const32 [c]) (Const32 [d])) 13827 // cond: d != 0 13828 // result: (Const32 [int64(uint32(c) % uint32(d))]) 13829 for { 13830 _ = v.Args[1] 13831 v_0 := v.Args[0] 13832 if v_0.Op != OpConst32 { 13833 break 13834 } 13835 c := v_0.AuxInt 13836 v_1 := v.Args[1] 13837 if v_1.Op != OpConst32 { 13838 break 13839 } 13840 d := v_1.AuxInt 13841 if !(d != 0) { 13842 break 13843 } 13844 v.reset(OpConst32) 13845 v.AuxInt = int64(uint32(c) % uint32(d)) 13846 return true 13847 } 13848 // match: (Mod32u <t> n (Const32 [c])) 13849 // cond: isPowerOfTwo(c&0xffffffff) 13850 // result: (And32 n (Const32 <t> [(c&0xffffffff)-1])) 13851 for { 13852 t := v.Type 13853 _ = v.Args[1] 13854 n := v.Args[0] 13855 v_1 := v.Args[1] 13856 if v_1.Op != OpConst32 { 13857 break 13858 } 13859 c := v_1.AuxInt 13860 if !(isPowerOfTwo(c & 0xffffffff)) { 13861 break 13862 } 13863 v.reset(OpAnd32) 13864 v.AddArg(n) 13865 v0 := b.NewValue0(v.Pos, OpConst32, t) 13866 v0.AuxInt = (c & 0xffffffff) - 1 13867 v.AddArg(v0) 13868 return true 13869 } 13870 // match: (Mod32u <t> x (Const32 [c])) 13871 // cond: x.Op != OpConst32 && c > 0 && umagicOK(32,c) 13872 // result: (Sub32 x (Mul32 <t> (Div32u <t> x (Const32 <t> [c])) (Const32 <t> [c]))) 13873 for { 13874 t := v.Type 13875 _ = v.Args[1] 13876 x := v.Args[0] 13877 v_1 := v.Args[1] 13878 if v_1.Op != OpConst32 { 13879 break 13880 } 13881 c := v_1.AuxInt 13882 if !(x.Op != OpConst32 && c > 0 && umagicOK(32, c)) { 13883 break 13884 } 13885 v.reset(OpSub32) 13886 v.AddArg(x) 13887 v0 := b.NewValue0(v.Pos, OpMul32, t) 13888 v1 := b.NewValue0(v.Pos, OpDiv32u, t) 13889 v1.AddArg(x) 13890 v2 := b.NewValue0(v.Pos, OpConst32, t) 13891 v2.AuxInt = c 13892 v1.AddArg(v2) 13893 v0.AddArg(v1) 13894 v3 := b.NewValue0(v.Pos, OpConst32, t) 13895 v3.AuxInt = c 13896 v0.AddArg(v3) 13897 v.AddArg(v0) 13898 return true 13899 } 13900 return false 13901 } 13902 func rewriteValuegeneric_OpMod64_0(v *Value) bool { 13903 b := v.Block 13904 _ = b 13905 // match: (Mod64 (Const64 [c]) (Const64 [d])) 13906 // cond: d != 0 13907 // result: (Const64 [c % d]) 13908 for { 13909 _ = v.Args[1] 13910 v_0 := v.Args[0] 13911 if v_0.Op != OpConst64 { 13912 break 13913 } 13914 c := v_0.AuxInt 13915 v_1 := v.Args[1] 13916 if v_1.Op != OpConst64 { 13917 break 13918 } 13919 d := v_1.AuxInt 13920 if !(d != 0) { 13921 break 13922 } 13923 v.reset(OpConst64) 13924 v.AuxInt = c % d 13925 return true 13926 } 13927 // match: (Mod64 <t> n (Const64 [c])) 13928 // cond: isNonNegative(n) && isPowerOfTwo(c) 13929 // result: (And64 n (Const64 <t> [c-1])) 13930 for { 13931 t := v.Type 13932 _ = v.Args[1] 13933 n := v.Args[0] 13934 v_1 := v.Args[1] 13935 if v_1.Op != OpConst64 { 13936 break 13937 } 13938 c := v_1.AuxInt 13939 if !(isNonNegative(n) && isPowerOfTwo(c)) { 13940 break 13941 } 13942 v.reset(OpAnd64) 13943 v.AddArg(n) 13944 v0 := b.NewValue0(v.Pos, OpConst64, t) 13945 v0.AuxInt = c - 1 13946 v.AddArg(v0) 13947 return true 13948 } 13949 // match: (Mod64 n (Const64 [-1<<63])) 13950 // cond: isNonNegative(n) 13951 // result: n 13952 for { 13953 _ = v.Args[1] 13954 n := v.Args[0] 13955 v_1 := v.Args[1] 13956 if v_1.Op != OpConst64 { 13957 break 13958 } 13959 if v_1.AuxInt != -1<<63 { 13960 break 13961 } 13962 if !(isNonNegative(n)) { 13963 break 13964 } 13965 v.reset(OpCopy) 13966 v.Type = n.Type 13967 v.AddArg(n) 13968 return true 13969 } 13970 // match: (Mod64 <t> n (Const64 [c])) 13971 // cond: c < 0 && c != -1<<63 13972 // result: (Mod64 <t> n (Const64 <t> [-c])) 13973 for { 13974 t := v.Type 13975 _ = v.Args[1] 13976 n := v.Args[0] 13977 v_1 := v.Args[1] 13978 if v_1.Op != OpConst64 { 13979 break 13980 } 13981 c := v_1.AuxInt 13982 if !(c < 0 && c != -1<<63) { 13983 break 13984 } 13985 v.reset(OpMod64) 13986 v.Type = t 13987 v.AddArg(n) 13988 v0 := b.NewValue0(v.Pos, OpConst64, t) 13989 v0.AuxInt = -c 13990 v.AddArg(v0) 13991 return true 13992 } 13993 // match: (Mod64 <t> x (Const64 [c])) 13994 // cond: x.Op != OpConst64 && (c > 0 || c == -1<<63) 13995 // result: (Sub64 x (Mul64 <t> (Div64 <t> x (Const64 <t> [c])) (Const64 <t> [c]))) 13996 for { 13997 t := v.Type 13998 _ = v.Args[1] 13999 x := v.Args[0] 14000 v_1 := v.Args[1] 14001 if v_1.Op != OpConst64 { 14002 break 14003 } 14004 c := v_1.AuxInt 14005 if !(x.Op != OpConst64 && (c > 0 || c == -1<<63)) { 14006 break 14007 } 14008 v.reset(OpSub64) 14009 v.AddArg(x) 14010 v0 := b.NewValue0(v.Pos, OpMul64, t) 14011 v1 := b.NewValue0(v.Pos, OpDiv64, t) 14012 v1.AddArg(x) 14013 v2 := b.NewValue0(v.Pos, OpConst64, t) 14014 v2.AuxInt = c 14015 v1.AddArg(v2) 14016 v0.AddArg(v1) 14017 v3 := b.NewValue0(v.Pos, OpConst64, t) 14018 v3.AuxInt = c 14019 v0.AddArg(v3) 14020 v.AddArg(v0) 14021 return true 14022 } 14023 return false 14024 } 14025 func rewriteValuegeneric_OpMod64u_0(v *Value) bool { 14026 b := v.Block 14027 _ = b 14028 // match: (Mod64u (Const64 [c]) (Const64 [d])) 14029 // cond: d != 0 14030 // result: (Const64 [int64(uint64(c) % uint64(d))]) 14031 for { 14032 _ = v.Args[1] 14033 v_0 := v.Args[0] 14034 if v_0.Op != OpConst64 { 14035 break 14036 } 14037 c := v_0.AuxInt 14038 v_1 := v.Args[1] 14039 if v_1.Op != OpConst64 { 14040 break 14041 } 14042 d := v_1.AuxInt 14043 if !(d != 0) { 14044 break 14045 } 14046 v.reset(OpConst64) 14047 v.AuxInt = int64(uint64(c) % uint64(d)) 14048 return true 14049 } 14050 // match: (Mod64u <t> n (Const64 [c])) 14051 // cond: isPowerOfTwo(c) 14052 // result: (And64 n (Const64 <t> [c-1])) 14053 for { 14054 t := v.Type 14055 _ = v.Args[1] 14056 n := v.Args[0] 14057 v_1 := v.Args[1] 14058 if v_1.Op != OpConst64 { 14059 break 14060 } 14061 c := v_1.AuxInt 14062 if !(isPowerOfTwo(c)) { 14063 break 14064 } 14065 v.reset(OpAnd64) 14066 v.AddArg(n) 14067 v0 := b.NewValue0(v.Pos, OpConst64, t) 14068 v0.AuxInt = c - 1 14069 v.AddArg(v0) 14070 return true 14071 } 14072 // match: (Mod64u <t> n (Const64 [-1<<63])) 14073 // cond: 14074 // result: (And64 n (Const64 <t> [1<<63-1])) 14075 for { 14076 t := v.Type 14077 _ = v.Args[1] 14078 n := v.Args[0] 14079 v_1 := v.Args[1] 14080 if v_1.Op != OpConst64 { 14081 break 14082 } 14083 if v_1.AuxInt != -1<<63 { 14084 break 14085 } 14086 v.reset(OpAnd64) 14087 v.AddArg(n) 14088 v0 := b.NewValue0(v.Pos, OpConst64, t) 14089 v0.AuxInt = 1<<63 - 1 14090 v.AddArg(v0) 14091 return true 14092 } 14093 // match: (Mod64u <t> x (Const64 [c])) 14094 // cond: x.Op != OpConst64 && c > 0 && umagicOK(64,c) 14095 // result: (Sub64 x (Mul64 <t> (Div64u <t> x (Const64 <t> [c])) (Const64 <t> [c]))) 14096 for { 14097 t := v.Type 14098 _ = v.Args[1] 14099 x := v.Args[0] 14100 v_1 := v.Args[1] 14101 if v_1.Op != OpConst64 { 14102 break 14103 } 14104 c := v_1.AuxInt 14105 if !(x.Op != OpConst64 && c > 0 && umagicOK(64, c)) { 14106 break 14107 } 14108 v.reset(OpSub64) 14109 v.AddArg(x) 14110 v0 := b.NewValue0(v.Pos, OpMul64, t) 14111 v1 := b.NewValue0(v.Pos, OpDiv64u, t) 14112 v1.AddArg(x) 14113 v2 := b.NewValue0(v.Pos, OpConst64, t) 14114 v2.AuxInt = c 14115 v1.AddArg(v2) 14116 v0.AddArg(v1) 14117 v3 := b.NewValue0(v.Pos, OpConst64, t) 14118 v3.AuxInt = c 14119 v0.AddArg(v3) 14120 v.AddArg(v0) 14121 return true 14122 } 14123 return false 14124 } 14125 func rewriteValuegeneric_OpMod8_0(v *Value) bool { 14126 b := v.Block 14127 _ = b 14128 // match: (Mod8 (Const8 [c]) (Const8 [d])) 14129 // cond: d != 0 14130 // result: (Const8 [int64(int8(c % d))]) 14131 for { 14132 _ = v.Args[1] 14133 v_0 := v.Args[0] 14134 if v_0.Op != OpConst8 { 14135 break 14136 } 14137 c := v_0.AuxInt 14138 v_1 := v.Args[1] 14139 if v_1.Op != OpConst8 { 14140 break 14141 } 14142 d := v_1.AuxInt 14143 if !(d != 0) { 14144 break 14145 } 14146 v.reset(OpConst8) 14147 v.AuxInt = int64(int8(c % d)) 14148 return true 14149 } 14150 // match: (Mod8 <t> n (Const8 [c])) 14151 // cond: isNonNegative(n) && isPowerOfTwo(c&0xff) 14152 // result: (And8 n (Const8 <t> [(c&0xff)-1])) 14153 for { 14154 t := v.Type 14155 _ = v.Args[1] 14156 n := v.Args[0] 14157 v_1 := v.Args[1] 14158 if v_1.Op != OpConst8 { 14159 break 14160 } 14161 c := v_1.AuxInt 14162 if !(isNonNegative(n) && isPowerOfTwo(c&0xff)) { 14163 break 14164 } 14165 v.reset(OpAnd8) 14166 v.AddArg(n) 14167 v0 := b.NewValue0(v.Pos, OpConst8, t) 14168 v0.AuxInt = (c & 0xff) - 1 14169 v.AddArg(v0) 14170 return true 14171 } 14172 // match: (Mod8 <t> n (Const8 [c])) 14173 // cond: c < 0 && c != -1<<7 14174 // result: (Mod8 <t> n (Const8 <t> [-c])) 14175 for { 14176 t := v.Type 14177 _ = v.Args[1] 14178 n := v.Args[0] 14179 v_1 := v.Args[1] 14180 if v_1.Op != OpConst8 { 14181 break 14182 } 14183 c := v_1.AuxInt 14184 if !(c < 0 && c != -1<<7) { 14185 break 14186 } 14187 v.reset(OpMod8) 14188 v.Type = t 14189 v.AddArg(n) 14190 v0 := b.NewValue0(v.Pos, OpConst8, t) 14191 v0.AuxInt = -c 14192 v.AddArg(v0) 14193 return true 14194 } 14195 // match: (Mod8 <t> x (Const8 [c])) 14196 // cond: x.Op != OpConst8 && (c > 0 || c == -1<<7) 14197 // result: (Sub8 x (Mul8 <t> (Div8 <t> x (Const8 <t> [c])) (Const8 <t> [c]))) 14198 for { 14199 t := v.Type 14200 _ = v.Args[1] 14201 x := v.Args[0] 14202 v_1 := v.Args[1] 14203 if v_1.Op != OpConst8 { 14204 break 14205 } 14206 c := v_1.AuxInt 14207 if !(x.Op != OpConst8 && (c > 0 || c == -1<<7)) { 14208 break 14209 } 14210 v.reset(OpSub8) 14211 v.AddArg(x) 14212 v0 := b.NewValue0(v.Pos, OpMul8, t) 14213 v1 := b.NewValue0(v.Pos, OpDiv8, t) 14214 v1.AddArg(x) 14215 v2 := b.NewValue0(v.Pos, OpConst8, t) 14216 v2.AuxInt = c 14217 v1.AddArg(v2) 14218 v0.AddArg(v1) 14219 v3 := b.NewValue0(v.Pos, OpConst8, t) 14220 v3.AuxInt = c 14221 v0.AddArg(v3) 14222 v.AddArg(v0) 14223 return true 14224 } 14225 return false 14226 } 14227 func rewriteValuegeneric_OpMod8u_0(v *Value) bool { 14228 b := v.Block 14229 _ = b 14230 // match: (Mod8u (Const8 [c]) (Const8 [d])) 14231 // cond: d != 0 14232 // result: (Const8 [int64(uint8(c) % uint8(d))]) 14233 for { 14234 _ = v.Args[1] 14235 v_0 := v.Args[0] 14236 if v_0.Op != OpConst8 { 14237 break 14238 } 14239 c := v_0.AuxInt 14240 v_1 := v.Args[1] 14241 if v_1.Op != OpConst8 { 14242 break 14243 } 14244 d := v_1.AuxInt 14245 if !(d != 0) { 14246 break 14247 } 14248 v.reset(OpConst8) 14249 v.AuxInt = int64(uint8(c) % uint8(d)) 14250 return true 14251 } 14252 // match: (Mod8u <t> n (Const8 [c])) 14253 // cond: isPowerOfTwo(c&0xff) 14254 // result: (And8 n (Const8 <t> [(c&0xff)-1])) 14255 for { 14256 t := v.Type 14257 _ = v.Args[1] 14258 n := v.Args[0] 14259 v_1 := v.Args[1] 14260 if v_1.Op != OpConst8 { 14261 break 14262 } 14263 c := v_1.AuxInt 14264 if !(isPowerOfTwo(c & 0xff)) { 14265 break 14266 } 14267 v.reset(OpAnd8) 14268 v.AddArg(n) 14269 v0 := b.NewValue0(v.Pos, OpConst8, t) 14270 v0.AuxInt = (c & 0xff) - 1 14271 v.AddArg(v0) 14272 return true 14273 } 14274 // match: (Mod8u <t> x (Const8 [c])) 14275 // cond: x.Op != OpConst8 && c > 0 && umagicOK(8 ,c) 14276 // result: (Sub8 x (Mul8 <t> (Div8u <t> x (Const8 <t> [c])) (Const8 <t> [c]))) 14277 for { 14278 t := v.Type 14279 _ = v.Args[1] 14280 x := v.Args[0] 14281 v_1 := v.Args[1] 14282 if v_1.Op != OpConst8 { 14283 break 14284 } 14285 c := v_1.AuxInt 14286 if !(x.Op != OpConst8 && c > 0 && umagicOK(8, c)) { 14287 break 14288 } 14289 v.reset(OpSub8) 14290 v.AddArg(x) 14291 v0 := b.NewValue0(v.Pos, OpMul8, t) 14292 v1 := b.NewValue0(v.Pos, OpDiv8u, t) 14293 v1.AddArg(x) 14294 v2 := b.NewValue0(v.Pos, OpConst8, t) 14295 v2.AuxInt = c 14296 v1.AddArg(v2) 14297 v0.AddArg(v1) 14298 v3 := b.NewValue0(v.Pos, OpConst8, t) 14299 v3.AuxInt = c 14300 v0.AddArg(v3) 14301 v.AddArg(v0) 14302 return true 14303 } 14304 return false 14305 } 14306 func rewriteValuegeneric_OpMul16_0(v *Value) bool { 14307 b := v.Block 14308 _ = b 14309 typ := &b.Func.Config.Types 14310 _ = typ 14311 // match: (Mul16 (Const16 [c]) (Const16 [d])) 14312 // cond: 14313 // result: (Const16 [int64(int16(c*d))]) 14314 for { 14315 _ = v.Args[1] 14316 v_0 := v.Args[0] 14317 if v_0.Op != OpConst16 { 14318 break 14319 } 14320 c := v_0.AuxInt 14321 v_1 := v.Args[1] 14322 if v_1.Op != OpConst16 { 14323 break 14324 } 14325 d := v_1.AuxInt 14326 v.reset(OpConst16) 14327 v.AuxInt = int64(int16(c * d)) 14328 return true 14329 } 14330 // match: (Mul16 (Const16 [d]) (Const16 [c])) 14331 // cond: 14332 // result: (Const16 [int64(int16(c*d))]) 14333 for { 14334 _ = v.Args[1] 14335 v_0 := v.Args[0] 14336 if v_0.Op != OpConst16 { 14337 break 14338 } 14339 d := v_0.AuxInt 14340 v_1 := v.Args[1] 14341 if v_1.Op != OpConst16 { 14342 break 14343 } 14344 c := v_1.AuxInt 14345 v.reset(OpConst16) 14346 v.AuxInt = int64(int16(c * d)) 14347 return true 14348 } 14349 // match: (Mul16 (Const16 [1]) x) 14350 // cond: 14351 // result: x 14352 for { 14353 _ = v.Args[1] 14354 v_0 := v.Args[0] 14355 if v_0.Op != OpConst16 { 14356 break 14357 } 14358 if v_0.AuxInt != 1 { 14359 break 14360 } 14361 x := v.Args[1] 14362 v.reset(OpCopy) 14363 v.Type = x.Type 14364 v.AddArg(x) 14365 return true 14366 } 14367 // match: (Mul16 x (Const16 [1])) 14368 // cond: 14369 // result: x 14370 for { 14371 _ = v.Args[1] 14372 x := v.Args[0] 14373 v_1 := v.Args[1] 14374 if v_1.Op != OpConst16 { 14375 break 14376 } 14377 if v_1.AuxInt != 1 { 14378 break 14379 } 14380 v.reset(OpCopy) 14381 v.Type = x.Type 14382 v.AddArg(x) 14383 return true 14384 } 14385 // match: (Mul16 (Const16 [-1]) x) 14386 // cond: 14387 // result: (Neg16 x) 14388 for { 14389 _ = v.Args[1] 14390 v_0 := v.Args[0] 14391 if v_0.Op != OpConst16 { 14392 break 14393 } 14394 if v_0.AuxInt != -1 { 14395 break 14396 } 14397 x := v.Args[1] 14398 v.reset(OpNeg16) 14399 v.AddArg(x) 14400 return true 14401 } 14402 // match: (Mul16 x (Const16 [-1])) 14403 // cond: 14404 // result: (Neg16 x) 14405 for { 14406 _ = v.Args[1] 14407 x := v.Args[0] 14408 v_1 := v.Args[1] 14409 if v_1.Op != OpConst16 { 14410 break 14411 } 14412 if v_1.AuxInt != -1 { 14413 break 14414 } 14415 v.reset(OpNeg16) 14416 v.AddArg(x) 14417 return true 14418 } 14419 // match: (Mul16 <t> n (Const16 [c])) 14420 // cond: isPowerOfTwo(c) 14421 // result: (Lsh16x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 14422 for { 14423 t := v.Type 14424 _ = v.Args[1] 14425 n := v.Args[0] 14426 v_1 := v.Args[1] 14427 if v_1.Op != OpConst16 { 14428 break 14429 } 14430 c := v_1.AuxInt 14431 if !(isPowerOfTwo(c)) { 14432 break 14433 } 14434 v.reset(OpLsh16x64) 14435 v.Type = t 14436 v.AddArg(n) 14437 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 14438 v0.AuxInt = log2(c) 14439 v.AddArg(v0) 14440 return true 14441 } 14442 // match: (Mul16 <t> (Const16 [c]) n) 14443 // cond: isPowerOfTwo(c) 14444 // result: (Lsh16x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 14445 for { 14446 t := v.Type 14447 _ = v.Args[1] 14448 v_0 := v.Args[0] 14449 if v_0.Op != OpConst16 { 14450 break 14451 } 14452 c := v_0.AuxInt 14453 n := v.Args[1] 14454 if !(isPowerOfTwo(c)) { 14455 break 14456 } 14457 v.reset(OpLsh16x64) 14458 v.Type = t 14459 v.AddArg(n) 14460 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 14461 v0.AuxInt = log2(c) 14462 v.AddArg(v0) 14463 return true 14464 } 14465 // match: (Mul16 <t> n (Const16 [c])) 14466 // cond: t.IsSigned() && isPowerOfTwo(-c) 14467 // result: (Neg16 (Lsh16x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 14468 for { 14469 t := v.Type 14470 _ = v.Args[1] 14471 n := v.Args[0] 14472 v_1 := v.Args[1] 14473 if v_1.Op != OpConst16 { 14474 break 14475 } 14476 c := v_1.AuxInt 14477 if !(t.IsSigned() && isPowerOfTwo(-c)) { 14478 break 14479 } 14480 v.reset(OpNeg16) 14481 v0 := b.NewValue0(v.Pos, OpLsh16x64, t) 14482 v0.AddArg(n) 14483 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 14484 v1.AuxInt = log2(-c) 14485 v0.AddArg(v1) 14486 v.AddArg(v0) 14487 return true 14488 } 14489 // match: (Mul16 <t> (Const16 [c]) n) 14490 // cond: t.IsSigned() && isPowerOfTwo(-c) 14491 // result: (Neg16 (Lsh16x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 14492 for { 14493 t := v.Type 14494 _ = v.Args[1] 14495 v_0 := v.Args[0] 14496 if v_0.Op != OpConst16 { 14497 break 14498 } 14499 c := v_0.AuxInt 14500 n := v.Args[1] 14501 if !(t.IsSigned() && isPowerOfTwo(-c)) { 14502 break 14503 } 14504 v.reset(OpNeg16) 14505 v0 := b.NewValue0(v.Pos, OpLsh16x64, t) 14506 v0.AddArg(n) 14507 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 14508 v1.AuxInt = log2(-c) 14509 v0.AddArg(v1) 14510 v.AddArg(v0) 14511 return true 14512 } 14513 return false 14514 } 14515 func rewriteValuegeneric_OpMul16_10(v *Value) bool { 14516 b := v.Block 14517 _ = b 14518 // match: (Mul16 (Const16 [0]) _) 14519 // cond: 14520 // result: (Const16 [0]) 14521 for { 14522 _ = v.Args[1] 14523 v_0 := v.Args[0] 14524 if v_0.Op != OpConst16 { 14525 break 14526 } 14527 if v_0.AuxInt != 0 { 14528 break 14529 } 14530 v.reset(OpConst16) 14531 v.AuxInt = 0 14532 return true 14533 } 14534 // match: (Mul16 _ (Const16 [0])) 14535 // cond: 14536 // result: (Const16 [0]) 14537 for { 14538 _ = v.Args[1] 14539 v_1 := v.Args[1] 14540 if v_1.Op != OpConst16 { 14541 break 14542 } 14543 if v_1.AuxInt != 0 { 14544 break 14545 } 14546 v.reset(OpConst16) 14547 v.AuxInt = 0 14548 return true 14549 } 14550 // match: (Mul16 (Const16 <t> [c]) (Mul16 (Const16 <t> [d]) x)) 14551 // cond: 14552 // result: (Mul16 (Const16 <t> [int64(int16(c*d))]) x) 14553 for { 14554 _ = v.Args[1] 14555 v_0 := v.Args[0] 14556 if v_0.Op != OpConst16 { 14557 break 14558 } 14559 t := v_0.Type 14560 c := v_0.AuxInt 14561 v_1 := v.Args[1] 14562 if v_1.Op != OpMul16 { 14563 break 14564 } 14565 _ = v_1.Args[1] 14566 v_1_0 := v_1.Args[0] 14567 if v_1_0.Op != OpConst16 { 14568 break 14569 } 14570 if v_1_0.Type != t { 14571 break 14572 } 14573 d := v_1_0.AuxInt 14574 x := v_1.Args[1] 14575 v.reset(OpMul16) 14576 v0 := b.NewValue0(v.Pos, OpConst16, t) 14577 v0.AuxInt = int64(int16(c * d)) 14578 v.AddArg(v0) 14579 v.AddArg(x) 14580 return true 14581 } 14582 // match: (Mul16 (Const16 <t> [c]) (Mul16 x (Const16 <t> [d]))) 14583 // cond: 14584 // result: (Mul16 (Const16 <t> [int64(int16(c*d))]) x) 14585 for { 14586 _ = v.Args[1] 14587 v_0 := v.Args[0] 14588 if v_0.Op != OpConst16 { 14589 break 14590 } 14591 t := v_0.Type 14592 c := v_0.AuxInt 14593 v_1 := v.Args[1] 14594 if v_1.Op != OpMul16 { 14595 break 14596 } 14597 _ = v_1.Args[1] 14598 x := v_1.Args[0] 14599 v_1_1 := v_1.Args[1] 14600 if v_1_1.Op != OpConst16 { 14601 break 14602 } 14603 if v_1_1.Type != t { 14604 break 14605 } 14606 d := v_1_1.AuxInt 14607 v.reset(OpMul16) 14608 v0 := b.NewValue0(v.Pos, OpConst16, t) 14609 v0.AuxInt = int64(int16(c * d)) 14610 v.AddArg(v0) 14611 v.AddArg(x) 14612 return true 14613 } 14614 // match: (Mul16 (Mul16 (Const16 <t> [d]) x) (Const16 <t> [c])) 14615 // cond: 14616 // result: (Mul16 (Const16 <t> [int64(int16(c*d))]) x) 14617 for { 14618 _ = v.Args[1] 14619 v_0 := v.Args[0] 14620 if v_0.Op != OpMul16 { 14621 break 14622 } 14623 _ = v_0.Args[1] 14624 v_0_0 := v_0.Args[0] 14625 if v_0_0.Op != OpConst16 { 14626 break 14627 } 14628 t := v_0_0.Type 14629 d := v_0_0.AuxInt 14630 x := v_0.Args[1] 14631 v_1 := v.Args[1] 14632 if v_1.Op != OpConst16 { 14633 break 14634 } 14635 if v_1.Type != t { 14636 break 14637 } 14638 c := v_1.AuxInt 14639 v.reset(OpMul16) 14640 v0 := b.NewValue0(v.Pos, OpConst16, t) 14641 v0.AuxInt = int64(int16(c * d)) 14642 v.AddArg(v0) 14643 v.AddArg(x) 14644 return true 14645 } 14646 // match: (Mul16 (Mul16 x (Const16 <t> [d])) (Const16 <t> [c])) 14647 // cond: 14648 // result: (Mul16 (Const16 <t> [int64(int16(c*d))]) x) 14649 for { 14650 _ = v.Args[1] 14651 v_0 := v.Args[0] 14652 if v_0.Op != OpMul16 { 14653 break 14654 } 14655 _ = v_0.Args[1] 14656 x := v_0.Args[0] 14657 v_0_1 := v_0.Args[1] 14658 if v_0_1.Op != OpConst16 { 14659 break 14660 } 14661 t := v_0_1.Type 14662 d := v_0_1.AuxInt 14663 v_1 := v.Args[1] 14664 if v_1.Op != OpConst16 { 14665 break 14666 } 14667 if v_1.Type != t { 14668 break 14669 } 14670 c := v_1.AuxInt 14671 v.reset(OpMul16) 14672 v0 := b.NewValue0(v.Pos, OpConst16, t) 14673 v0.AuxInt = int64(int16(c * d)) 14674 v.AddArg(v0) 14675 v.AddArg(x) 14676 return true 14677 } 14678 return false 14679 } 14680 func rewriteValuegeneric_OpMul32_0(v *Value) bool { 14681 b := v.Block 14682 _ = b 14683 typ := &b.Func.Config.Types 14684 _ = typ 14685 // match: (Mul32 (Const32 [c]) (Const32 [d])) 14686 // cond: 14687 // result: (Const32 [int64(int32(c*d))]) 14688 for { 14689 _ = v.Args[1] 14690 v_0 := v.Args[0] 14691 if v_0.Op != OpConst32 { 14692 break 14693 } 14694 c := v_0.AuxInt 14695 v_1 := v.Args[1] 14696 if v_1.Op != OpConst32 { 14697 break 14698 } 14699 d := v_1.AuxInt 14700 v.reset(OpConst32) 14701 v.AuxInt = int64(int32(c * d)) 14702 return true 14703 } 14704 // match: (Mul32 (Const32 [d]) (Const32 [c])) 14705 // cond: 14706 // result: (Const32 [int64(int32(c*d))]) 14707 for { 14708 _ = v.Args[1] 14709 v_0 := v.Args[0] 14710 if v_0.Op != OpConst32 { 14711 break 14712 } 14713 d := v_0.AuxInt 14714 v_1 := v.Args[1] 14715 if v_1.Op != OpConst32 { 14716 break 14717 } 14718 c := v_1.AuxInt 14719 v.reset(OpConst32) 14720 v.AuxInt = int64(int32(c * d)) 14721 return true 14722 } 14723 // match: (Mul32 (Const32 [1]) x) 14724 // cond: 14725 // result: x 14726 for { 14727 _ = v.Args[1] 14728 v_0 := v.Args[0] 14729 if v_0.Op != OpConst32 { 14730 break 14731 } 14732 if v_0.AuxInt != 1 { 14733 break 14734 } 14735 x := v.Args[1] 14736 v.reset(OpCopy) 14737 v.Type = x.Type 14738 v.AddArg(x) 14739 return true 14740 } 14741 // match: (Mul32 x (Const32 [1])) 14742 // cond: 14743 // result: x 14744 for { 14745 _ = v.Args[1] 14746 x := v.Args[0] 14747 v_1 := v.Args[1] 14748 if v_1.Op != OpConst32 { 14749 break 14750 } 14751 if v_1.AuxInt != 1 { 14752 break 14753 } 14754 v.reset(OpCopy) 14755 v.Type = x.Type 14756 v.AddArg(x) 14757 return true 14758 } 14759 // match: (Mul32 (Const32 [-1]) x) 14760 // cond: 14761 // result: (Neg32 x) 14762 for { 14763 _ = v.Args[1] 14764 v_0 := v.Args[0] 14765 if v_0.Op != OpConst32 { 14766 break 14767 } 14768 if v_0.AuxInt != -1 { 14769 break 14770 } 14771 x := v.Args[1] 14772 v.reset(OpNeg32) 14773 v.AddArg(x) 14774 return true 14775 } 14776 // match: (Mul32 x (Const32 [-1])) 14777 // cond: 14778 // result: (Neg32 x) 14779 for { 14780 _ = v.Args[1] 14781 x := v.Args[0] 14782 v_1 := v.Args[1] 14783 if v_1.Op != OpConst32 { 14784 break 14785 } 14786 if v_1.AuxInt != -1 { 14787 break 14788 } 14789 v.reset(OpNeg32) 14790 v.AddArg(x) 14791 return true 14792 } 14793 // match: (Mul32 <t> n (Const32 [c])) 14794 // cond: isPowerOfTwo(c) 14795 // result: (Lsh32x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 14796 for { 14797 t := v.Type 14798 _ = v.Args[1] 14799 n := v.Args[0] 14800 v_1 := v.Args[1] 14801 if v_1.Op != OpConst32 { 14802 break 14803 } 14804 c := v_1.AuxInt 14805 if !(isPowerOfTwo(c)) { 14806 break 14807 } 14808 v.reset(OpLsh32x64) 14809 v.Type = t 14810 v.AddArg(n) 14811 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 14812 v0.AuxInt = log2(c) 14813 v.AddArg(v0) 14814 return true 14815 } 14816 // match: (Mul32 <t> (Const32 [c]) n) 14817 // cond: isPowerOfTwo(c) 14818 // result: (Lsh32x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 14819 for { 14820 t := v.Type 14821 _ = v.Args[1] 14822 v_0 := v.Args[0] 14823 if v_0.Op != OpConst32 { 14824 break 14825 } 14826 c := v_0.AuxInt 14827 n := v.Args[1] 14828 if !(isPowerOfTwo(c)) { 14829 break 14830 } 14831 v.reset(OpLsh32x64) 14832 v.Type = t 14833 v.AddArg(n) 14834 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 14835 v0.AuxInt = log2(c) 14836 v.AddArg(v0) 14837 return true 14838 } 14839 // match: (Mul32 <t> n (Const32 [c])) 14840 // cond: t.IsSigned() && isPowerOfTwo(-c) 14841 // result: (Neg32 (Lsh32x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 14842 for { 14843 t := v.Type 14844 _ = v.Args[1] 14845 n := v.Args[0] 14846 v_1 := v.Args[1] 14847 if v_1.Op != OpConst32 { 14848 break 14849 } 14850 c := v_1.AuxInt 14851 if !(t.IsSigned() && isPowerOfTwo(-c)) { 14852 break 14853 } 14854 v.reset(OpNeg32) 14855 v0 := b.NewValue0(v.Pos, OpLsh32x64, t) 14856 v0.AddArg(n) 14857 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 14858 v1.AuxInt = log2(-c) 14859 v0.AddArg(v1) 14860 v.AddArg(v0) 14861 return true 14862 } 14863 // match: (Mul32 <t> (Const32 [c]) n) 14864 // cond: t.IsSigned() && isPowerOfTwo(-c) 14865 // result: (Neg32 (Lsh32x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 14866 for { 14867 t := v.Type 14868 _ = v.Args[1] 14869 v_0 := v.Args[0] 14870 if v_0.Op != OpConst32 { 14871 break 14872 } 14873 c := v_0.AuxInt 14874 n := v.Args[1] 14875 if !(t.IsSigned() && isPowerOfTwo(-c)) { 14876 break 14877 } 14878 v.reset(OpNeg32) 14879 v0 := b.NewValue0(v.Pos, OpLsh32x64, t) 14880 v0.AddArg(n) 14881 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 14882 v1.AuxInt = log2(-c) 14883 v0.AddArg(v1) 14884 v.AddArg(v0) 14885 return true 14886 } 14887 return false 14888 } 14889 func rewriteValuegeneric_OpMul32_10(v *Value) bool { 14890 b := v.Block 14891 _ = b 14892 // match: (Mul32 (Const32 <t> [c]) (Add32 <t> (Const32 <t> [d]) x)) 14893 // cond: 14894 // result: (Add32 (Const32 <t> [int64(int32(c*d))]) (Mul32 <t> (Const32 <t> [c]) x)) 14895 for { 14896 _ = v.Args[1] 14897 v_0 := v.Args[0] 14898 if v_0.Op != OpConst32 { 14899 break 14900 } 14901 t := v_0.Type 14902 c := v_0.AuxInt 14903 v_1 := v.Args[1] 14904 if v_1.Op != OpAdd32 { 14905 break 14906 } 14907 if v_1.Type != t { 14908 break 14909 } 14910 _ = v_1.Args[1] 14911 v_1_0 := v_1.Args[0] 14912 if v_1_0.Op != OpConst32 { 14913 break 14914 } 14915 if v_1_0.Type != t { 14916 break 14917 } 14918 d := v_1_0.AuxInt 14919 x := v_1.Args[1] 14920 v.reset(OpAdd32) 14921 v0 := b.NewValue0(v.Pos, OpConst32, t) 14922 v0.AuxInt = int64(int32(c * d)) 14923 v.AddArg(v0) 14924 v1 := b.NewValue0(v.Pos, OpMul32, t) 14925 v2 := b.NewValue0(v.Pos, OpConst32, t) 14926 v2.AuxInt = c 14927 v1.AddArg(v2) 14928 v1.AddArg(x) 14929 v.AddArg(v1) 14930 return true 14931 } 14932 // match: (Mul32 (Const32 <t> [c]) (Add32 <t> x (Const32 <t> [d]))) 14933 // cond: 14934 // result: (Add32 (Const32 <t> [int64(int32(c*d))]) (Mul32 <t> (Const32 <t> [c]) x)) 14935 for { 14936 _ = v.Args[1] 14937 v_0 := v.Args[0] 14938 if v_0.Op != OpConst32 { 14939 break 14940 } 14941 t := v_0.Type 14942 c := v_0.AuxInt 14943 v_1 := v.Args[1] 14944 if v_1.Op != OpAdd32 { 14945 break 14946 } 14947 if v_1.Type != t { 14948 break 14949 } 14950 _ = v_1.Args[1] 14951 x := v_1.Args[0] 14952 v_1_1 := v_1.Args[1] 14953 if v_1_1.Op != OpConst32 { 14954 break 14955 } 14956 if v_1_1.Type != t { 14957 break 14958 } 14959 d := v_1_1.AuxInt 14960 v.reset(OpAdd32) 14961 v0 := b.NewValue0(v.Pos, OpConst32, t) 14962 v0.AuxInt = int64(int32(c * d)) 14963 v.AddArg(v0) 14964 v1 := b.NewValue0(v.Pos, OpMul32, t) 14965 v2 := b.NewValue0(v.Pos, OpConst32, t) 14966 v2.AuxInt = c 14967 v1.AddArg(v2) 14968 v1.AddArg(x) 14969 v.AddArg(v1) 14970 return true 14971 } 14972 // match: (Mul32 (Add32 <t> (Const32 <t> [d]) x) (Const32 <t> [c])) 14973 // cond: 14974 // result: (Add32 (Const32 <t> [int64(int32(c*d))]) (Mul32 <t> (Const32 <t> [c]) x)) 14975 for { 14976 _ = v.Args[1] 14977 v_0 := v.Args[0] 14978 if v_0.Op != OpAdd32 { 14979 break 14980 } 14981 t := v_0.Type 14982 _ = v_0.Args[1] 14983 v_0_0 := v_0.Args[0] 14984 if v_0_0.Op != OpConst32 { 14985 break 14986 } 14987 if v_0_0.Type != t { 14988 break 14989 } 14990 d := v_0_0.AuxInt 14991 x := v_0.Args[1] 14992 v_1 := v.Args[1] 14993 if v_1.Op != OpConst32 { 14994 break 14995 } 14996 if v_1.Type != t { 14997 break 14998 } 14999 c := v_1.AuxInt 15000 v.reset(OpAdd32) 15001 v0 := b.NewValue0(v.Pos, OpConst32, t) 15002 v0.AuxInt = int64(int32(c * d)) 15003 v.AddArg(v0) 15004 v1 := b.NewValue0(v.Pos, OpMul32, t) 15005 v2 := b.NewValue0(v.Pos, OpConst32, t) 15006 v2.AuxInt = c 15007 v1.AddArg(v2) 15008 v1.AddArg(x) 15009 v.AddArg(v1) 15010 return true 15011 } 15012 // match: (Mul32 (Add32 <t> x (Const32 <t> [d])) (Const32 <t> [c])) 15013 // cond: 15014 // result: (Add32 (Const32 <t> [int64(int32(c*d))]) (Mul32 <t> (Const32 <t> [c]) x)) 15015 for { 15016 _ = v.Args[1] 15017 v_0 := v.Args[0] 15018 if v_0.Op != OpAdd32 { 15019 break 15020 } 15021 t := v_0.Type 15022 _ = v_0.Args[1] 15023 x := v_0.Args[0] 15024 v_0_1 := v_0.Args[1] 15025 if v_0_1.Op != OpConst32 { 15026 break 15027 } 15028 if v_0_1.Type != t { 15029 break 15030 } 15031 d := v_0_1.AuxInt 15032 v_1 := v.Args[1] 15033 if v_1.Op != OpConst32 { 15034 break 15035 } 15036 if v_1.Type != t { 15037 break 15038 } 15039 c := v_1.AuxInt 15040 v.reset(OpAdd32) 15041 v0 := b.NewValue0(v.Pos, OpConst32, t) 15042 v0.AuxInt = int64(int32(c * d)) 15043 v.AddArg(v0) 15044 v1 := b.NewValue0(v.Pos, OpMul32, t) 15045 v2 := b.NewValue0(v.Pos, OpConst32, t) 15046 v2.AuxInt = c 15047 v1.AddArg(v2) 15048 v1.AddArg(x) 15049 v.AddArg(v1) 15050 return true 15051 } 15052 // match: (Mul32 (Const32 [0]) _) 15053 // cond: 15054 // result: (Const32 [0]) 15055 for { 15056 _ = v.Args[1] 15057 v_0 := v.Args[0] 15058 if v_0.Op != OpConst32 { 15059 break 15060 } 15061 if v_0.AuxInt != 0 { 15062 break 15063 } 15064 v.reset(OpConst32) 15065 v.AuxInt = 0 15066 return true 15067 } 15068 // match: (Mul32 _ (Const32 [0])) 15069 // cond: 15070 // result: (Const32 [0]) 15071 for { 15072 _ = v.Args[1] 15073 v_1 := v.Args[1] 15074 if v_1.Op != OpConst32 { 15075 break 15076 } 15077 if v_1.AuxInt != 0 { 15078 break 15079 } 15080 v.reset(OpConst32) 15081 v.AuxInt = 0 15082 return true 15083 } 15084 // match: (Mul32 (Const32 <t> [c]) (Mul32 (Const32 <t> [d]) x)) 15085 // cond: 15086 // result: (Mul32 (Const32 <t> [int64(int32(c*d))]) x) 15087 for { 15088 _ = v.Args[1] 15089 v_0 := v.Args[0] 15090 if v_0.Op != OpConst32 { 15091 break 15092 } 15093 t := v_0.Type 15094 c := v_0.AuxInt 15095 v_1 := v.Args[1] 15096 if v_1.Op != OpMul32 { 15097 break 15098 } 15099 _ = v_1.Args[1] 15100 v_1_0 := v_1.Args[0] 15101 if v_1_0.Op != OpConst32 { 15102 break 15103 } 15104 if v_1_0.Type != t { 15105 break 15106 } 15107 d := v_1_0.AuxInt 15108 x := v_1.Args[1] 15109 v.reset(OpMul32) 15110 v0 := b.NewValue0(v.Pos, OpConst32, t) 15111 v0.AuxInt = int64(int32(c * d)) 15112 v.AddArg(v0) 15113 v.AddArg(x) 15114 return true 15115 } 15116 // match: (Mul32 (Const32 <t> [c]) (Mul32 x (Const32 <t> [d]))) 15117 // cond: 15118 // result: (Mul32 (Const32 <t> [int64(int32(c*d))]) x) 15119 for { 15120 _ = v.Args[1] 15121 v_0 := v.Args[0] 15122 if v_0.Op != OpConst32 { 15123 break 15124 } 15125 t := v_0.Type 15126 c := v_0.AuxInt 15127 v_1 := v.Args[1] 15128 if v_1.Op != OpMul32 { 15129 break 15130 } 15131 _ = v_1.Args[1] 15132 x := v_1.Args[0] 15133 v_1_1 := v_1.Args[1] 15134 if v_1_1.Op != OpConst32 { 15135 break 15136 } 15137 if v_1_1.Type != t { 15138 break 15139 } 15140 d := v_1_1.AuxInt 15141 v.reset(OpMul32) 15142 v0 := b.NewValue0(v.Pos, OpConst32, t) 15143 v0.AuxInt = int64(int32(c * d)) 15144 v.AddArg(v0) 15145 v.AddArg(x) 15146 return true 15147 } 15148 // match: (Mul32 (Mul32 (Const32 <t> [d]) x) (Const32 <t> [c])) 15149 // cond: 15150 // result: (Mul32 (Const32 <t> [int64(int32(c*d))]) x) 15151 for { 15152 _ = v.Args[1] 15153 v_0 := v.Args[0] 15154 if v_0.Op != OpMul32 { 15155 break 15156 } 15157 _ = v_0.Args[1] 15158 v_0_0 := v_0.Args[0] 15159 if v_0_0.Op != OpConst32 { 15160 break 15161 } 15162 t := v_0_0.Type 15163 d := v_0_0.AuxInt 15164 x := v_0.Args[1] 15165 v_1 := v.Args[1] 15166 if v_1.Op != OpConst32 { 15167 break 15168 } 15169 if v_1.Type != t { 15170 break 15171 } 15172 c := v_1.AuxInt 15173 v.reset(OpMul32) 15174 v0 := b.NewValue0(v.Pos, OpConst32, t) 15175 v0.AuxInt = int64(int32(c * d)) 15176 v.AddArg(v0) 15177 v.AddArg(x) 15178 return true 15179 } 15180 // match: (Mul32 (Mul32 x (Const32 <t> [d])) (Const32 <t> [c])) 15181 // cond: 15182 // result: (Mul32 (Const32 <t> [int64(int32(c*d))]) x) 15183 for { 15184 _ = v.Args[1] 15185 v_0 := v.Args[0] 15186 if v_0.Op != OpMul32 { 15187 break 15188 } 15189 _ = v_0.Args[1] 15190 x := v_0.Args[0] 15191 v_0_1 := v_0.Args[1] 15192 if v_0_1.Op != OpConst32 { 15193 break 15194 } 15195 t := v_0_1.Type 15196 d := v_0_1.AuxInt 15197 v_1 := v.Args[1] 15198 if v_1.Op != OpConst32 { 15199 break 15200 } 15201 if v_1.Type != t { 15202 break 15203 } 15204 c := v_1.AuxInt 15205 v.reset(OpMul32) 15206 v0 := b.NewValue0(v.Pos, OpConst32, t) 15207 v0.AuxInt = int64(int32(c * d)) 15208 v.AddArg(v0) 15209 v.AddArg(x) 15210 return true 15211 } 15212 return false 15213 } 15214 func rewriteValuegeneric_OpMul32F_0(v *Value) bool { 15215 // match: (Mul32F (Const32F [c]) (Const32F [d])) 15216 // cond: 15217 // result: (Const32F [f2i(float64(i2f32(c) * i2f32(d)))]) 15218 for { 15219 _ = v.Args[1] 15220 v_0 := v.Args[0] 15221 if v_0.Op != OpConst32F { 15222 break 15223 } 15224 c := v_0.AuxInt 15225 v_1 := v.Args[1] 15226 if v_1.Op != OpConst32F { 15227 break 15228 } 15229 d := v_1.AuxInt 15230 v.reset(OpConst32F) 15231 v.AuxInt = f2i(float64(i2f32(c) * i2f32(d))) 15232 return true 15233 } 15234 // match: (Mul32F (Const32F [d]) (Const32F [c])) 15235 // cond: 15236 // result: (Const32F [f2i(float64(i2f32(c) * i2f32(d)))]) 15237 for { 15238 _ = v.Args[1] 15239 v_0 := v.Args[0] 15240 if v_0.Op != OpConst32F { 15241 break 15242 } 15243 d := v_0.AuxInt 15244 v_1 := v.Args[1] 15245 if v_1.Op != OpConst32F { 15246 break 15247 } 15248 c := v_1.AuxInt 15249 v.reset(OpConst32F) 15250 v.AuxInt = f2i(float64(i2f32(c) * i2f32(d))) 15251 return true 15252 } 15253 // match: (Mul32F x (Const32F [f2i(1)])) 15254 // cond: 15255 // result: x 15256 for { 15257 _ = v.Args[1] 15258 x := v.Args[0] 15259 v_1 := v.Args[1] 15260 if v_1.Op != OpConst32F { 15261 break 15262 } 15263 if v_1.AuxInt != f2i(1) { 15264 break 15265 } 15266 v.reset(OpCopy) 15267 v.Type = x.Type 15268 v.AddArg(x) 15269 return true 15270 } 15271 // match: (Mul32F (Const32F [f2i(1)]) x) 15272 // cond: 15273 // result: x 15274 for { 15275 _ = v.Args[1] 15276 v_0 := v.Args[0] 15277 if v_0.Op != OpConst32F { 15278 break 15279 } 15280 if v_0.AuxInt != f2i(1) { 15281 break 15282 } 15283 x := v.Args[1] 15284 v.reset(OpCopy) 15285 v.Type = x.Type 15286 v.AddArg(x) 15287 return true 15288 } 15289 // match: (Mul32F x (Const32F [f2i(-1)])) 15290 // cond: 15291 // result: (Neg32F x) 15292 for { 15293 _ = v.Args[1] 15294 x := v.Args[0] 15295 v_1 := v.Args[1] 15296 if v_1.Op != OpConst32F { 15297 break 15298 } 15299 if v_1.AuxInt != f2i(-1) { 15300 break 15301 } 15302 v.reset(OpNeg32F) 15303 v.AddArg(x) 15304 return true 15305 } 15306 // match: (Mul32F (Const32F [f2i(-1)]) x) 15307 // cond: 15308 // result: (Neg32F x) 15309 for { 15310 _ = v.Args[1] 15311 v_0 := v.Args[0] 15312 if v_0.Op != OpConst32F { 15313 break 15314 } 15315 if v_0.AuxInt != f2i(-1) { 15316 break 15317 } 15318 x := v.Args[1] 15319 v.reset(OpNeg32F) 15320 v.AddArg(x) 15321 return true 15322 } 15323 // match: (Mul32F x (Const32F [f2i(2)])) 15324 // cond: 15325 // result: (Add32F x x) 15326 for { 15327 _ = v.Args[1] 15328 x := v.Args[0] 15329 v_1 := v.Args[1] 15330 if v_1.Op != OpConst32F { 15331 break 15332 } 15333 if v_1.AuxInt != f2i(2) { 15334 break 15335 } 15336 v.reset(OpAdd32F) 15337 v.AddArg(x) 15338 v.AddArg(x) 15339 return true 15340 } 15341 // match: (Mul32F (Const32F [f2i(2)]) x) 15342 // cond: 15343 // result: (Add32F x x) 15344 for { 15345 _ = v.Args[1] 15346 v_0 := v.Args[0] 15347 if v_0.Op != OpConst32F { 15348 break 15349 } 15350 if v_0.AuxInt != f2i(2) { 15351 break 15352 } 15353 x := v.Args[1] 15354 v.reset(OpAdd32F) 15355 v.AddArg(x) 15356 v.AddArg(x) 15357 return true 15358 } 15359 return false 15360 } 15361 func rewriteValuegeneric_OpMul64_0(v *Value) bool { 15362 b := v.Block 15363 _ = b 15364 typ := &b.Func.Config.Types 15365 _ = typ 15366 // match: (Mul64 (Const64 [c]) (Const64 [d])) 15367 // cond: 15368 // result: (Const64 [c*d]) 15369 for { 15370 _ = v.Args[1] 15371 v_0 := v.Args[0] 15372 if v_0.Op != OpConst64 { 15373 break 15374 } 15375 c := v_0.AuxInt 15376 v_1 := v.Args[1] 15377 if v_1.Op != OpConst64 { 15378 break 15379 } 15380 d := v_1.AuxInt 15381 v.reset(OpConst64) 15382 v.AuxInt = c * d 15383 return true 15384 } 15385 // match: (Mul64 (Const64 [d]) (Const64 [c])) 15386 // cond: 15387 // result: (Const64 [c*d]) 15388 for { 15389 _ = v.Args[1] 15390 v_0 := v.Args[0] 15391 if v_0.Op != OpConst64 { 15392 break 15393 } 15394 d := v_0.AuxInt 15395 v_1 := v.Args[1] 15396 if v_1.Op != OpConst64 { 15397 break 15398 } 15399 c := v_1.AuxInt 15400 v.reset(OpConst64) 15401 v.AuxInt = c * d 15402 return true 15403 } 15404 // match: (Mul64 (Const64 [1]) x) 15405 // cond: 15406 // result: x 15407 for { 15408 _ = v.Args[1] 15409 v_0 := v.Args[0] 15410 if v_0.Op != OpConst64 { 15411 break 15412 } 15413 if v_0.AuxInt != 1 { 15414 break 15415 } 15416 x := v.Args[1] 15417 v.reset(OpCopy) 15418 v.Type = x.Type 15419 v.AddArg(x) 15420 return true 15421 } 15422 // match: (Mul64 x (Const64 [1])) 15423 // cond: 15424 // result: x 15425 for { 15426 _ = v.Args[1] 15427 x := v.Args[0] 15428 v_1 := v.Args[1] 15429 if v_1.Op != OpConst64 { 15430 break 15431 } 15432 if v_1.AuxInt != 1 { 15433 break 15434 } 15435 v.reset(OpCopy) 15436 v.Type = x.Type 15437 v.AddArg(x) 15438 return true 15439 } 15440 // match: (Mul64 (Const64 [-1]) x) 15441 // cond: 15442 // result: (Neg64 x) 15443 for { 15444 _ = v.Args[1] 15445 v_0 := v.Args[0] 15446 if v_0.Op != OpConst64 { 15447 break 15448 } 15449 if v_0.AuxInt != -1 { 15450 break 15451 } 15452 x := v.Args[1] 15453 v.reset(OpNeg64) 15454 v.AddArg(x) 15455 return true 15456 } 15457 // match: (Mul64 x (Const64 [-1])) 15458 // cond: 15459 // result: (Neg64 x) 15460 for { 15461 _ = v.Args[1] 15462 x := v.Args[0] 15463 v_1 := v.Args[1] 15464 if v_1.Op != OpConst64 { 15465 break 15466 } 15467 if v_1.AuxInt != -1 { 15468 break 15469 } 15470 v.reset(OpNeg64) 15471 v.AddArg(x) 15472 return true 15473 } 15474 // match: (Mul64 <t> n (Const64 [c])) 15475 // cond: isPowerOfTwo(c) 15476 // result: (Lsh64x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 15477 for { 15478 t := v.Type 15479 _ = v.Args[1] 15480 n := v.Args[0] 15481 v_1 := v.Args[1] 15482 if v_1.Op != OpConst64 { 15483 break 15484 } 15485 c := v_1.AuxInt 15486 if !(isPowerOfTwo(c)) { 15487 break 15488 } 15489 v.reset(OpLsh64x64) 15490 v.Type = t 15491 v.AddArg(n) 15492 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 15493 v0.AuxInt = log2(c) 15494 v.AddArg(v0) 15495 return true 15496 } 15497 // match: (Mul64 <t> (Const64 [c]) n) 15498 // cond: isPowerOfTwo(c) 15499 // result: (Lsh64x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 15500 for { 15501 t := v.Type 15502 _ = v.Args[1] 15503 v_0 := v.Args[0] 15504 if v_0.Op != OpConst64 { 15505 break 15506 } 15507 c := v_0.AuxInt 15508 n := v.Args[1] 15509 if !(isPowerOfTwo(c)) { 15510 break 15511 } 15512 v.reset(OpLsh64x64) 15513 v.Type = t 15514 v.AddArg(n) 15515 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 15516 v0.AuxInt = log2(c) 15517 v.AddArg(v0) 15518 return true 15519 } 15520 // match: (Mul64 <t> n (Const64 [c])) 15521 // cond: t.IsSigned() && isPowerOfTwo(-c) 15522 // result: (Neg64 (Lsh64x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 15523 for { 15524 t := v.Type 15525 _ = v.Args[1] 15526 n := v.Args[0] 15527 v_1 := v.Args[1] 15528 if v_1.Op != OpConst64 { 15529 break 15530 } 15531 c := v_1.AuxInt 15532 if !(t.IsSigned() && isPowerOfTwo(-c)) { 15533 break 15534 } 15535 v.reset(OpNeg64) 15536 v0 := b.NewValue0(v.Pos, OpLsh64x64, t) 15537 v0.AddArg(n) 15538 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 15539 v1.AuxInt = log2(-c) 15540 v0.AddArg(v1) 15541 v.AddArg(v0) 15542 return true 15543 } 15544 // match: (Mul64 <t> (Const64 [c]) n) 15545 // cond: t.IsSigned() && isPowerOfTwo(-c) 15546 // result: (Neg64 (Lsh64x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 15547 for { 15548 t := v.Type 15549 _ = v.Args[1] 15550 v_0 := v.Args[0] 15551 if v_0.Op != OpConst64 { 15552 break 15553 } 15554 c := v_0.AuxInt 15555 n := v.Args[1] 15556 if !(t.IsSigned() && isPowerOfTwo(-c)) { 15557 break 15558 } 15559 v.reset(OpNeg64) 15560 v0 := b.NewValue0(v.Pos, OpLsh64x64, t) 15561 v0.AddArg(n) 15562 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 15563 v1.AuxInt = log2(-c) 15564 v0.AddArg(v1) 15565 v.AddArg(v0) 15566 return true 15567 } 15568 return false 15569 } 15570 func rewriteValuegeneric_OpMul64_10(v *Value) bool { 15571 b := v.Block 15572 _ = b 15573 // match: (Mul64 (Const64 <t> [c]) (Add64 <t> (Const64 <t> [d]) x)) 15574 // cond: 15575 // result: (Add64 (Const64 <t> [c*d]) (Mul64 <t> (Const64 <t> [c]) x)) 15576 for { 15577 _ = v.Args[1] 15578 v_0 := v.Args[0] 15579 if v_0.Op != OpConst64 { 15580 break 15581 } 15582 t := v_0.Type 15583 c := v_0.AuxInt 15584 v_1 := v.Args[1] 15585 if v_1.Op != OpAdd64 { 15586 break 15587 } 15588 if v_1.Type != t { 15589 break 15590 } 15591 _ = v_1.Args[1] 15592 v_1_0 := v_1.Args[0] 15593 if v_1_0.Op != OpConst64 { 15594 break 15595 } 15596 if v_1_0.Type != t { 15597 break 15598 } 15599 d := v_1_0.AuxInt 15600 x := v_1.Args[1] 15601 v.reset(OpAdd64) 15602 v0 := b.NewValue0(v.Pos, OpConst64, t) 15603 v0.AuxInt = c * d 15604 v.AddArg(v0) 15605 v1 := b.NewValue0(v.Pos, OpMul64, t) 15606 v2 := b.NewValue0(v.Pos, OpConst64, t) 15607 v2.AuxInt = c 15608 v1.AddArg(v2) 15609 v1.AddArg(x) 15610 v.AddArg(v1) 15611 return true 15612 } 15613 // match: (Mul64 (Const64 <t> [c]) (Add64 <t> x (Const64 <t> [d]))) 15614 // cond: 15615 // result: (Add64 (Const64 <t> [c*d]) (Mul64 <t> (Const64 <t> [c]) x)) 15616 for { 15617 _ = v.Args[1] 15618 v_0 := v.Args[0] 15619 if v_0.Op != OpConst64 { 15620 break 15621 } 15622 t := v_0.Type 15623 c := v_0.AuxInt 15624 v_1 := v.Args[1] 15625 if v_1.Op != OpAdd64 { 15626 break 15627 } 15628 if v_1.Type != t { 15629 break 15630 } 15631 _ = v_1.Args[1] 15632 x := v_1.Args[0] 15633 v_1_1 := v_1.Args[1] 15634 if v_1_1.Op != OpConst64 { 15635 break 15636 } 15637 if v_1_1.Type != t { 15638 break 15639 } 15640 d := v_1_1.AuxInt 15641 v.reset(OpAdd64) 15642 v0 := b.NewValue0(v.Pos, OpConst64, t) 15643 v0.AuxInt = c * d 15644 v.AddArg(v0) 15645 v1 := b.NewValue0(v.Pos, OpMul64, t) 15646 v2 := b.NewValue0(v.Pos, OpConst64, t) 15647 v2.AuxInt = c 15648 v1.AddArg(v2) 15649 v1.AddArg(x) 15650 v.AddArg(v1) 15651 return true 15652 } 15653 // match: (Mul64 (Add64 <t> (Const64 <t> [d]) x) (Const64 <t> [c])) 15654 // cond: 15655 // result: (Add64 (Const64 <t> [c*d]) (Mul64 <t> (Const64 <t> [c]) x)) 15656 for { 15657 _ = v.Args[1] 15658 v_0 := v.Args[0] 15659 if v_0.Op != OpAdd64 { 15660 break 15661 } 15662 t := v_0.Type 15663 _ = v_0.Args[1] 15664 v_0_0 := v_0.Args[0] 15665 if v_0_0.Op != OpConst64 { 15666 break 15667 } 15668 if v_0_0.Type != t { 15669 break 15670 } 15671 d := v_0_0.AuxInt 15672 x := v_0.Args[1] 15673 v_1 := v.Args[1] 15674 if v_1.Op != OpConst64 { 15675 break 15676 } 15677 if v_1.Type != t { 15678 break 15679 } 15680 c := v_1.AuxInt 15681 v.reset(OpAdd64) 15682 v0 := b.NewValue0(v.Pos, OpConst64, t) 15683 v0.AuxInt = c * d 15684 v.AddArg(v0) 15685 v1 := b.NewValue0(v.Pos, OpMul64, t) 15686 v2 := b.NewValue0(v.Pos, OpConst64, t) 15687 v2.AuxInt = c 15688 v1.AddArg(v2) 15689 v1.AddArg(x) 15690 v.AddArg(v1) 15691 return true 15692 } 15693 // match: (Mul64 (Add64 <t> x (Const64 <t> [d])) (Const64 <t> [c])) 15694 // cond: 15695 // result: (Add64 (Const64 <t> [c*d]) (Mul64 <t> (Const64 <t> [c]) x)) 15696 for { 15697 _ = v.Args[1] 15698 v_0 := v.Args[0] 15699 if v_0.Op != OpAdd64 { 15700 break 15701 } 15702 t := v_0.Type 15703 _ = v_0.Args[1] 15704 x := v_0.Args[0] 15705 v_0_1 := v_0.Args[1] 15706 if v_0_1.Op != OpConst64 { 15707 break 15708 } 15709 if v_0_1.Type != t { 15710 break 15711 } 15712 d := v_0_1.AuxInt 15713 v_1 := v.Args[1] 15714 if v_1.Op != OpConst64 { 15715 break 15716 } 15717 if v_1.Type != t { 15718 break 15719 } 15720 c := v_1.AuxInt 15721 v.reset(OpAdd64) 15722 v0 := b.NewValue0(v.Pos, OpConst64, t) 15723 v0.AuxInt = c * d 15724 v.AddArg(v0) 15725 v1 := b.NewValue0(v.Pos, OpMul64, t) 15726 v2 := b.NewValue0(v.Pos, OpConst64, t) 15727 v2.AuxInt = c 15728 v1.AddArg(v2) 15729 v1.AddArg(x) 15730 v.AddArg(v1) 15731 return true 15732 } 15733 // match: (Mul64 (Const64 [0]) _) 15734 // cond: 15735 // result: (Const64 [0]) 15736 for { 15737 _ = v.Args[1] 15738 v_0 := v.Args[0] 15739 if v_0.Op != OpConst64 { 15740 break 15741 } 15742 if v_0.AuxInt != 0 { 15743 break 15744 } 15745 v.reset(OpConst64) 15746 v.AuxInt = 0 15747 return true 15748 } 15749 // match: (Mul64 _ (Const64 [0])) 15750 // cond: 15751 // result: (Const64 [0]) 15752 for { 15753 _ = v.Args[1] 15754 v_1 := v.Args[1] 15755 if v_1.Op != OpConst64 { 15756 break 15757 } 15758 if v_1.AuxInt != 0 { 15759 break 15760 } 15761 v.reset(OpConst64) 15762 v.AuxInt = 0 15763 return true 15764 } 15765 // match: (Mul64 (Const64 <t> [c]) (Mul64 (Const64 <t> [d]) x)) 15766 // cond: 15767 // result: (Mul64 (Const64 <t> [c*d]) x) 15768 for { 15769 _ = v.Args[1] 15770 v_0 := v.Args[0] 15771 if v_0.Op != OpConst64 { 15772 break 15773 } 15774 t := v_0.Type 15775 c := v_0.AuxInt 15776 v_1 := v.Args[1] 15777 if v_1.Op != OpMul64 { 15778 break 15779 } 15780 _ = v_1.Args[1] 15781 v_1_0 := v_1.Args[0] 15782 if v_1_0.Op != OpConst64 { 15783 break 15784 } 15785 if v_1_0.Type != t { 15786 break 15787 } 15788 d := v_1_0.AuxInt 15789 x := v_1.Args[1] 15790 v.reset(OpMul64) 15791 v0 := b.NewValue0(v.Pos, OpConst64, t) 15792 v0.AuxInt = c * d 15793 v.AddArg(v0) 15794 v.AddArg(x) 15795 return true 15796 } 15797 // match: (Mul64 (Const64 <t> [c]) (Mul64 x (Const64 <t> [d]))) 15798 // cond: 15799 // result: (Mul64 (Const64 <t> [c*d]) x) 15800 for { 15801 _ = v.Args[1] 15802 v_0 := v.Args[0] 15803 if v_0.Op != OpConst64 { 15804 break 15805 } 15806 t := v_0.Type 15807 c := v_0.AuxInt 15808 v_1 := v.Args[1] 15809 if v_1.Op != OpMul64 { 15810 break 15811 } 15812 _ = v_1.Args[1] 15813 x := v_1.Args[0] 15814 v_1_1 := v_1.Args[1] 15815 if v_1_1.Op != OpConst64 { 15816 break 15817 } 15818 if v_1_1.Type != t { 15819 break 15820 } 15821 d := v_1_1.AuxInt 15822 v.reset(OpMul64) 15823 v0 := b.NewValue0(v.Pos, OpConst64, t) 15824 v0.AuxInt = c * d 15825 v.AddArg(v0) 15826 v.AddArg(x) 15827 return true 15828 } 15829 // match: (Mul64 (Mul64 (Const64 <t> [d]) x) (Const64 <t> [c])) 15830 // cond: 15831 // result: (Mul64 (Const64 <t> [c*d]) x) 15832 for { 15833 _ = v.Args[1] 15834 v_0 := v.Args[0] 15835 if v_0.Op != OpMul64 { 15836 break 15837 } 15838 _ = v_0.Args[1] 15839 v_0_0 := v_0.Args[0] 15840 if v_0_0.Op != OpConst64 { 15841 break 15842 } 15843 t := v_0_0.Type 15844 d := v_0_0.AuxInt 15845 x := v_0.Args[1] 15846 v_1 := v.Args[1] 15847 if v_1.Op != OpConst64 { 15848 break 15849 } 15850 if v_1.Type != t { 15851 break 15852 } 15853 c := v_1.AuxInt 15854 v.reset(OpMul64) 15855 v0 := b.NewValue0(v.Pos, OpConst64, t) 15856 v0.AuxInt = c * d 15857 v.AddArg(v0) 15858 v.AddArg(x) 15859 return true 15860 } 15861 // match: (Mul64 (Mul64 x (Const64 <t> [d])) (Const64 <t> [c])) 15862 // cond: 15863 // result: (Mul64 (Const64 <t> [c*d]) x) 15864 for { 15865 _ = v.Args[1] 15866 v_0 := v.Args[0] 15867 if v_0.Op != OpMul64 { 15868 break 15869 } 15870 _ = v_0.Args[1] 15871 x := v_0.Args[0] 15872 v_0_1 := v_0.Args[1] 15873 if v_0_1.Op != OpConst64 { 15874 break 15875 } 15876 t := v_0_1.Type 15877 d := v_0_1.AuxInt 15878 v_1 := v.Args[1] 15879 if v_1.Op != OpConst64 { 15880 break 15881 } 15882 if v_1.Type != t { 15883 break 15884 } 15885 c := v_1.AuxInt 15886 v.reset(OpMul64) 15887 v0 := b.NewValue0(v.Pos, OpConst64, t) 15888 v0.AuxInt = c * d 15889 v.AddArg(v0) 15890 v.AddArg(x) 15891 return true 15892 } 15893 return false 15894 } 15895 func rewriteValuegeneric_OpMul64F_0(v *Value) bool { 15896 // match: (Mul64F (Const64F [c]) (Const64F [d])) 15897 // cond: 15898 // result: (Const64F [f2i(i2f(c) * i2f(d))]) 15899 for { 15900 _ = v.Args[1] 15901 v_0 := v.Args[0] 15902 if v_0.Op != OpConst64F { 15903 break 15904 } 15905 c := v_0.AuxInt 15906 v_1 := v.Args[1] 15907 if v_1.Op != OpConst64F { 15908 break 15909 } 15910 d := v_1.AuxInt 15911 v.reset(OpConst64F) 15912 v.AuxInt = f2i(i2f(c) * i2f(d)) 15913 return true 15914 } 15915 // match: (Mul64F (Const64F [d]) (Const64F [c])) 15916 // cond: 15917 // result: (Const64F [f2i(i2f(c) * i2f(d))]) 15918 for { 15919 _ = v.Args[1] 15920 v_0 := v.Args[0] 15921 if v_0.Op != OpConst64F { 15922 break 15923 } 15924 d := v_0.AuxInt 15925 v_1 := v.Args[1] 15926 if v_1.Op != OpConst64F { 15927 break 15928 } 15929 c := v_1.AuxInt 15930 v.reset(OpConst64F) 15931 v.AuxInt = f2i(i2f(c) * i2f(d)) 15932 return true 15933 } 15934 // match: (Mul64F x (Const64F [f2i(1)])) 15935 // cond: 15936 // result: x 15937 for { 15938 _ = v.Args[1] 15939 x := v.Args[0] 15940 v_1 := v.Args[1] 15941 if v_1.Op != OpConst64F { 15942 break 15943 } 15944 if v_1.AuxInt != f2i(1) { 15945 break 15946 } 15947 v.reset(OpCopy) 15948 v.Type = x.Type 15949 v.AddArg(x) 15950 return true 15951 } 15952 // match: (Mul64F (Const64F [f2i(1)]) x) 15953 // cond: 15954 // result: x 15955 for { 15956 _ = v.Args[1] 15957 v_0 := v.Args[0] 15958 if v_0.Op != OpConst64F { 15959 break 15960 } 15961 if v_0.AuxInt != f2i(1) { 15962 break 15963 } 15964 x := v.Args[1] 15965 v.reset(OpCopy) 15966 v.Type = x.Type 15967 v.AddArg(x) 15968 return true 15969 } 15970 // match: (Mul64F x (Const64F [f2i(-1)])) 15971 // cond: 15972 // result: (Neg64F x) 15973 for { 15974 _ = v.Args[1] 15975 x := v.Args[0] 15976 v_1 := v.Args[1] 15977 if v_1.Op != OpConst64F { 15978 break 15979 } 15980 if v_1.AuxInt != f2i(-1) { 15981 break 15982 } 15983 v.reset(OpNeg64F) 15984 v.AddArg(x) 15985 return true 15986 } 15987 // match: (Mul64F (Const64F [f2i(-1)]) x) 15988 // cond: 15989 // result: (Neg64F x) 15990 for { 15991 _ = v.Args[1] 15992 v_0 := v.Args[0] 15993 if v_0.Op != OpConst64F { 15994 break 15995 } 15996 if v_0.AuxInt != f2i(-1) { 15997 break 15998 } 15999 x := v.Args[1] 16000 v.reset(OpNeg64F) 16001 v.AddArg(x) 16002 return true 16003 } 16004 // match: (Mul64F x (Const64F [f2i(2)])) 16005 // cond: 16006 // result: (Add64F x x) 16007 for { 16008 _ = v.Args[1] 16009 x := v.Args[0] 16010 v_1 := v.Args[1] 16011 if v_1.Op != OpConst64F { 16012 break 16013 } 16014 if v_1.AuxInt != f2i(2) { 16015 break 16016 } 16017 v.reset(OpAdd64F) 16018 v.AddArg(x) 16019 v.AddArg(x) 16020 return true 16021 } 16022 // match: (Mul64F (Const64F [f2i(2)]) x) 16023 // cond: 16024 // result: (Add64F x x) 16025 for { 16026 _ = v.Args[1] 16027 v_0 := v.Args[0] 16028 if v_0.Op != OpConst64F { 16029 break 16030 } 16031 if v_0.AuxInt != f2i(2) { 16032 break 16033 } 16034 x := v.Args[1] 16035 v.reset(OpAdd64F) 16036 v.AddArg(x) 16037 v.AddArg(x) 16038 return true 16039 } 16040 return false 16041 } 16042 func rewriteValuegeneric_OpMul8_0(v *Value) bool { 16043 b := v.Block 16044 _ = b 16045 typ := &b.Func.Config.Types 16046 _ = typ 16047 // match: (Mul8 (Const8 [c]) (Const8 [d])) 16048 // cond: 16049 // result: (Const8 [int64(int8(c*d))]) 16050 for { 16051 _ = v.Args[1] 16052 v_0 := v.Args[0] 16053 if v_0.Op != OpConst8 { 16054 break 16055 } 16056 c := v_0.AuxInt 16057 v_1 := v.Args[1] 16058 if v_1.Op != OpConst8 { 16059 break 16060 } 16061 d := v_1.AuxInt 16062 v.reset(OpConst8) 16063 v.AuxInt = int64(int8(c * d)) 16064 return true 16065 } 16066 // match: (Mul8 (Const8 [d]) (Const8 [c])) 16067 // cond: 16068 // result: (Const8 [int64(int8(c*d))]) 16069 for { 16070 _ = v.Args[1] 16071 v_0 := v.Args[0] 16072 if v_0.Op != OpConst8 { 16073 break 16074 } 16075 d := v_0.AuxInt 16076 v_1 := v.Args[1] 16077 if v_1.Op != OpConst8 { 16078 break 16079 } 16080 c := v_1.AuxInt 16081 v.reset(OpConst8) 16082 v.AuxInt = int64(int8(c * d)) 16083 return true 16084 } 16085 // match: (Mul8 (Const8 [1]) x) 16086 // cond: 16087 // result: x 16088 for { 16089 _ = v.Args[1] 16090 v_0 := v.Args[0] 16091 if v_0.Op != OpConst8 { 16092 break 16093 } 16094 if v_0.AuxInt != 1 { 16095 break 16096 } 16097 x := v.Args[1] 16098 v.reset(OpCopy) 16099 v.Type = x.Type 16100 v.AddArg(x) 16101 return true 16102 } 16103 // match: (Mul8 x (Const8 [1])) 16104 // cond: 16105 // result: x 16106 for { 16107 _ = v.Args[1] 16108 x := v.Args[0] 16109 v_1 := v.Args[1] 16110 if v_1.Op != OpConst8 { 16111 break 16112 } 16113 if v_1.AuxInt != 1 { 16114 break 16115 } 16116 v.reset(OpCopy) 16117 v.Type = x.Type 16118 v.AddArg(x) 16119 return true 16120 } 16121 // match: (Mul8 (Const8 [-1]) x) 16122 // cond: 16123 // result: (Neg8 x) 16124 for { 16125 _ = v.Args[1] 16126 v_0 := v.Args[0] 16127 if v_0.Op != OpConst8 { 16128 break 16129 } 16130 if v_0.AuxInt != -1 { 16131 break 16132 } 16133 x := v.Args[1] 16134 v.reset(OpNeg8) 16135 v.AddArg(x) 16136 return true 16137 } 16138 // match: (Mul8 x (Const8 [-1])) 16139 // cond: 16140 // result: (Neg8 x) 16141 for { 16142 _ = v.Args[1] 16143 x := v.Args[0] 16144 v_1 := v.Args[1] 16145 if v_1.Op != OpConst8 { 16146 break 16147 } 16148 if v_1.AuxInt != -1 { 16149 break 16150 } 16151 v.reset(OpNeg8) 16152 v.AddArg(x) 16153 return true 16154 } 16155 // match: (Mul8 <t> n (Const8 [c])) 16156 // cond: isPowerOfTwo(c) 16157 // result: (Lsh8x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 16158 for { 16159 t := v.Type 16160 _ = v.Args[1] 16161 n := v.Args[0] 16162 v_1 := v.Args[1] 16163 if v_1.Op != OpConst8 { 16164 break 16165 } 16166 c := v_1.AuxInt 16167 if !(isPowerOfTwo(c)) { 16168 break 16169 } 16170 v.reset(OpLsh8x64) 16171 v.Type = t 16172 v.AddArg(n) 16173 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 16174 v0.AuxInt = log2(c) 16175 v.AddArg(v0) 16176 return true 16177 } 16178 // match: (Mul8 <t> (Const8 [c]) n) 16179 // cond: isPowerOfTwo(c) 16180 // result: (Lsh8x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 16181 for { 16182 t := v.Type 16183 _ = v.Args[1] 16184 v_0 := v.Args[0] 16185 if v_0.Op != OpConst8 { 16186 break 16187 } 16188 c := v_0.AuxInt 16189 n := v.Args[1] 16190 if !(isPowerOfTwo(c)) { 16191 break 16192 } 16193 v.reset(OpLsh8x64) 16194 v.Type = t 16195 v.AddArg(n) 16196 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 16197 v0.AuxInt = log2(c) 16198 v.AddArg(v0) 16199 return true 16200 } 16201 // match: (Mul8 <t> n (Const8 [c])) 16202 // cond: t.IsSigned() && isPowerOfTwo(-c) 16203 // result: (Neg8 (Lsh8x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 16204 for { 16205 t := v.Type 16206 _ = v.Args[1] 16207 n := v.Args[0] 16208 v_1 := v.Args[1] 16209 if v_1.Op != OpConst8 { 16210 break 16211 } 16212 c := v_1.AuxInt 16213 if !(t.IsSigned() && isPowerOfTwo(-c)) { 16214 break 16215 } 16216 v.reset(OpNeg8) 16217 v0 := b.NewValue0(v.Pos, OpLsh8x64, t) 16218 v0.AddArg(n) 16219 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 16220 v1.AuxInt = log2(-c) 16221 v0.AddArg(v1) 16222 v.AddArg(v0) 16223 return true 16224 } 16225 // match: (Mul8 <t> (Const8 [c]) n) 16226 // cond: t.IsSigned() && isPowerOfTwo(-c) 16227 // result: (Neg8 (Lsh8x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 16228 for { 16229 t := v.Type 16230 _ = v.Args[1] 16231 v_0 := v.Args[0] 16232 if v_0.Op != OpConst8 { 16233 break 16234 } 16235 c := v_0.AuxInt 16236 n := v.Args[1] 16237 if !(t.IsSigned() && isPowerOfTwo(-c)) { 16238 break 16239 } 16240 v.reset(OpNeg8) 16241 v0 := b.NewValue0(v.Pos, OpLsh8x64, t) 16242 v0.AddArg(n) 16243 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 16244 v1.AuxInt = log2(-c) 16245 v0.AddArg(v1) 16246 v.AddArg(v0) 16247 return true 16248 } 16249 return false 16250 } 16251 func rewriteValuegeneric_OpMul8_10(v *Value) bool { 16252 b := v.Block 16253 _ = b 16254 // match: (Mul8 (Const8 [0]) _) 16255 // cond: 16256 // result: (Const8 [0]) 16257 for { 16258 _ = v.Args[1] 16259 v_0 := v.Args[0] 16260 if v_0.Op != OpConst8 { 16261 break 16262 } 16263 if v_0.AuxInt != 0 { 16264 break 16265 } 16266 v.reset(OpConst8) 16267 v.AuxInt = 0 16268 return true 16269 } 16270 // match: (Mul8 _ (Const8 [0])) 16271 // cond: 16272 // result: (Const8 [0]) 16273 for { 16274 _ = v.Args[1] 16275 v_1 := v.Args[1] 16276 if v_1.Op != OpConst8 { 16277 break 16278 } 16279 if v_1.AuxInt != 0 { 16280 break 16281 } 16282 v.reset(OpConst8) 16283 v.AuxInt = 0 16284 return true 16285 } 16286 // match: (Mul8 (Const8 <t> [c]) (Mul8 (Const8 <t> [d]) x)) 16287 // cond: 16288 // result: (Mul8 (Const8 <t> [int64(int8(c*d))]) x) 16289 for { 16290 _ = v.Args[1] 16291 v_0 := v.Args[0] 16292 if v_0.Op != OpConst8 { 16293 break 16294 } 16295 t := v_0.Type 16296 c := v_0.AuxInt 16297 v_1 := v.Args[1] 16298 if v_1.Op != OpMul8 { 16299 break 16300 } 16301 _ = v_1.Args[1] 16302 v_1_0 := v_1.Args[0] 16303 if v_1_0.Op != OpConst8 { 16304 break 16305 } 16306 if v_1_0.Type != t { 16307 break 16308 } 16309 d := v_1_0.AuxInt 16310 x := v_1.Args[1] 16311 v.reset(OpMul8) 16312 v0 := b.NewValue0(v.Pos, OpConst8, t) 16313 v0.AuxInt = int64(int8(c * d)) 16314 v.AddArg(v0) 16315 v.AddArg(x) 16316 return true 16317 } 16318 // match: (Mul8 (Const8 <t> [c]) (Mul8 x (Const8 <t> [d]))) 16319 // cond: 16320 // result: (Mul8 (Const8 <t> [int64(int8(c*d))]) x) 16321 for { 16322 _ = v.Args[1] 16323 v_0 := v.Args[0] 16324 if v_0.Op != OpConst8 { 16325 break 16326 } 16327 t := v_0.Type 16328 c := v_0.AuxInt 16329 v_1 := v.Args[1] 16330 if v_1.Op != OpMul8 { 16331 break 16332 } 16333 _ = v_1.Args[1] 16334 x := v_1.Args[0] 16335 v_1_1 := v_1.Args[1] 16336 if v_1_1.Op != OpConst8 { 16337 break 16338 } 16339 if v_1_1.Type != t { 16340 break 16341 } 16342 d := v_1_1.AuxInt 16343 v.reset(OpMul8) 16344 v0 := b.NewValue0(v.Pos, OpConst8, t) 16345 v0.AuxInt = int64(int8(c * d)) 16346 v.AddArg(v0) 16347 v.AddArg(x) 16348 return true 16349 } 16350 // match: (Mul8 (Mul8 (Const8 <t> [d]) x) (Const8 <t> [c])) 16351 // cond: 16352 // result: (Mul8 (Const8 <t> [int64(int8(c*d))]) x) 16353 for { 16354 _ = v.Args[1] 16355 v_0 := v.Args[0] 16356 if v_0.Op != OpMul8 { 16357 break 16358 } 16359 _ = v_0.Args[1] 16360 v_0_0 := v_0.Args[0] 16361 if v_0_0.Op != OpConst8 { 16362 break 16363 } 16364 t := v_0_0.Type 16365 d := v_0_0.AuxInt 16366 x := v_0.Args[1] 16367 v_1 := v.Args[1] 16368 if v_1.Op != OpConst8 { 16369 break 16370 } 16371 if v_1.Type != t { 16372 break 16373 } 16374 c := v_1.AuxInt 16375 v.reset(OpMul8) 16376 v0 := b.NewValue0(v.Pos, OpConst8, t) 16377 v0.AuxInt = int64(int8(c * d)) 16378 v.AddArg(v0) 16379 v.AddArg(x) 16380 return true 16381 } 16382 // match: (Mul8 (Mul8 x (Const8 <t> [d])) (Const8 <t> [c])) 16383 // cond: 16384 // result: (Mul8 (Const8 <t> [int64(int8(c*d))]) x) 16385 for { 16386 _ = v.Args[1] 16387 v_0 := v.Args[0] 16388 if v_0.Op != OpMul8 { 16389 break 16390 } 16391 _ = v_0.Args[1] 16392 x := v_0.Args[0] 16393 v_0_1 := v_0.Args[1] 16394 if v_0_1.Op != OpConst8 { 16395 break 16396 } 16397 t := v_0_1.Type 16398 d := v_0_1.AuxInt 16399 v_1 := v.Args[1] 16400 if v_1.Op != OpConst8 { 16401 break 16402 } 16403 if v_1.Type != t { 16404 break 16405 } 16406 c := v_1.AuxInt 16407 v.reset(OpMul8) 16408 v0 := b.NewValue0(v.Pos, OpConst8, t) 16409 v0.AuxInt = int64(int8(c * d)) 16410 v.AddArg(v0) 16411 v.AddArg(x) 16412 return true 16413 } 16414 return false 16415 } 16416 func rewriteValuegeneric_OpNeg16_0(v *Value) bool { 16417 // match: (Neg16 (Const16 [c])) 16418 // cond: 16419 // result: (Const16 [int64(-int16(c))]) 16420 for { 16421 v_0 := v.Args[0] 16422 if v_0.Op != OpConst16 { 16423 break 16424 } 16425 c := v_0.AuxInt 16426 v.reset(OpConst16) 16427 v.AuxInt = int64(-int16(c)) 16428 return true 16429 } 16430 // match: (Neg16 (Sub16 x y)) 16431 // cond: 16432 // result: (Sub16 y x) 16433 for { 16434 v_0 := v.Args[0] 16435 if v_0.Op != OpSub16 { 16436 break 16437 } 16438 _ = v_0.Args[1] 16439 x := v_0.Args[0] 16440 y := v_0.Args[1] 16441 v.reset(OpSub16) 16442 v.AddArg(y) 16443 v.AddArg(x) 16444 return true 16445 } 16446 return false 16447 } 16448 func rewriteValuegeneric_OpNeg32_0(v *Value) bool { 16449 // match: (Neg32 (Const32 [c])) 16450 // cond: 16451 // result: (Const32 [int64(-int32(c))]) 16452 for { 16453 v_0 := v.Args[0] 16454 if v_0.Op != OpConst32 { 16455 break 16456 } 16457 c := v_0.AuxInt 16458 v.reset(OpConst32) 16459 v.AuxInt = int64(-int32(c)) 16460 return true 16461 } 16462 // match: (Neg32 (Sub32 x y)) 16463 // cond: 16464 // result: (Sub32 y x) 16465 for { 16466 v_0 := v.Args[0] 16467 if v_0.Op != OpSub32 { 16468 break 16469 } 16470 _ = v_0.Args[1] 16471 x := v_0.Args[0] 16472 y := v_0.Args[1] 16473 v.reset(OpSub32) 16474 v.AddArg(y) 16475 v.AddArg(x) 16476 return true 16477 } 16478 return false 16479 } 16480 func rewriteValuegeneric_OpNeg32F_0(v *Value) bool { 16481 // match: (Neg32F (Const32F [c])) 16482 // cond: i2f(c) != 0 16483 // result: (Const32F [f2i(-i2f(c))]) 16484 for { 16485 v_0 := v.Args[0] 16486 if v_0.Op != OpConst32F { 16487 break 16488 } 16489 c := v_0.AuxInt 16490 if !(i2f(c) != 0) { 16491 break 16492 } 16493 v.reset(OpConst32F) 16494 v.AuxInt = f2i(-i2f(c)) 16495 return true 16496 } 16497 return false 16498 } 16499 func rewriteValuegeneric_OpNeg64_0(v *Value) bool { 16500 // match: (Neg64 (Const64 [c])) 16501 // cond: 16502 // result: (Const64 [-c]) 16503 for { 16504 v_0 := v.Args[0] 16505 if v_0.Op != OpConst64 { 16506 break 16507 } 16508 c := v_0.AuxInt 16509 v.reset(OpConst64) 16510 v.AuxInt = -c 16511 return true 16512 } 16513 // match: (Neg64 (Sub64 x y)) 16514 // cond: 16515 // result: (Sub64 y x) 16516 for { 16517 v_0 := v.Args[0] 16518 if v_0.Op != OpSub64 { 16519 break 16520 } 16521 _ = v_0.Args[1] 16522 x := v_0.Args[0] 16523 y := v_0.Args[1] 16524 v.reset(OpSub64) 16525 v.AddArg(y) 16526 v.AddArg(x) 16527 return true 16528 } 16529 return false 16530 } 16531 func rewriteValuegeneric_OpNeg64F_0(v *Value) bool { 16532 // match: (Neg64F (Const64F [c])) 16533 // cond: i2f(c) != 0 16534 // result: (Const64F [f2i(-i2f(c))]) 16535 for { 16536 v_0 := v.Args[0] 16537 if v_0.Op != OpConst64F { 16538 break 16539 } 16540 c := v_0.AuxInt 16541 if !(i2f(c) != 0) { 16542 break 16543 } 16544 v.reset(OpConst64F) 16545 v.AuxInt = f2i(-i2f(c)) 16546 return true 16547 } 16548 return false 16549 } 16550 func rewriteValuegeneric_OpNeg8_0(v *Value) bool { 16551 // match: (Neg8 (Const8 [c])) 16552 // cond: 16553 // result: (Const8 [int64( -int8(c))]) 16554 for { 16555 v_0 := v.Args[0] 16556 if v_0.Op != OpConst8 { 16557 break 16558 } 16559 c := v_0.AuxInt 16560 v.reset(OpConst8) 16561 v.AuxInt = int64(-int8(c)) 16562 return true 16563 } 16564 // match: (Neg8 (Sub8 x y)) 16565 // cond: 16566 // result: (Sub8 y x) 16567 for { 16568 v_0 := v.Args[0] 16569 if v_0.Op != OpSub8 { 16570 break 16571 } 16572 _ = v_0.Args[1] 16573 x := v_0.Args[0] 16574 y := v_0.Args[1] 16575 v.reset(OpSub8) 16576 v.AddArg(y) 16577 v.AddArg(x) 16578 return true 16579 } 16580 return false 16581 } 16582 func rewriteValuegeneric_OpNeq16_0(v *Value) bool { 16583 b := v.Block 16584 _ = b 16585 // match: (Neq16 x x) 16586 // cond: 16587 // result: (ConstBool [0]) 16588 for { 16589 _ = v.Args[1] 16590 x := v.Args[0] 16591 if x != v.Args[1] { 16592 break 16593 } 16594 v.reset(OpConstBool) 16595 v.AuxInt = 0 16596 return true 16597 } 16598 // match: (Neq16 (Const16 <t> [c]) (Add16 (Const16 <t> [d]) x)) 16599 // cond: 16600 // result: (Neq16 (Const16 <t> [int64(int16(c-d))]) x) 16601 for { 16602 _ = v.Args[1] 16603 v_0 := v.Args[0] 16604 if v_0.Op != OpConst16 { 16605 break 16606 } 16607 t := v_0.Type 16608 c := v_0.AuxInt 16609 v_1 := v.Args[1] 16610 if v_1.Op != OpAdd16 { 16611 break 16612 } 16613 _ = v_1.Args[1] 16614 v_1_0 := v_1.Args[0] 16615 if v_1_0.Op != OpConst16 { 16616 break 16617 } 16618 if v_1_0.Type != t { 16619 break 16620 } 16621 d := v_1_0.AuxInt 16622 x := v_1.Args[1] 16623 v.reset(OpNeq16) 16624 v0 := b.NewValue0(v.Pos, OpConst16, t) 16625 v0.AuxInt = int64(int16(c - d)) 16626 v.AddArg(v0) 16627 v.AddArg(x) 16628 return true 16629 } 16630 // match: (Neq16 (Const16 <t> [c]) (Add16 x (Const16 <t> [d]))) 16631 // cond: 16632 // result: (Neq16 (Const16 <t> [int64(int16(c-d))]) x) 16633 for { 16634 _ = v.Args[1] 16635 v_0 := v.Args[0] 16636 if v_0.Op != OpConst16 { 16637 break 16638 } 16639 t := v_0.Type 16640 c := v_0.AuxInt 16641 v_1 := v.Args[1] 16642 if v_1.Op != OpAdd16 { 16643 break 16644 } 16645 _ = v_1.Args[1] 16646 x := v_1.Args[0] 16647 v_1_1 := v_1.Args[1] 16648 if v_1_1.Op != OpConst16 { 16649 break 16650 } 16651 if v_1_1.Type != t { 16652 break 16653 } 16654 d := v_1_1.AuxInt 16655 v.reset(OpNeq16) 16656 v0 := b.NewValue0(v.Pos, OpConst16, t) 16657 v0.AuxInt = int64(int16(c - d)) 16658 v.AddArg(v0) 16659 v.AddArg(x) 16660 return true 16661 } 16662 // match: (Neq16 (Add16 (Const16 <t> [d]) x) (Const16 <t> [c])) 16663 // cond: 16664 // result: (Neq16 (Const16 <t> [int64(int16(c-d))]) x) 16665 for { 16666 _ = v.Args[1] 16667 v_0 := v.Args[0] 16668 if v_0.Op != OpAdd16 { 16669 break 16670 } 16671 _ = v_0.Args[1] 16672 v_0_0 := v_0.Args[0] 16673 if v_0_0.Op != OpConst16 { 16674 break 16675 } 16676 t := v_0_0.Type 16677 d := v_0_0.AuxInt 16678 x := v_0.Args[1] 16679 v_1 := v.Args[1] 16680 if v_1.Op != OpConst16 { 16681 break 16682 } 16683 if v_1.Type != t { 16684 break 16685 } 16686 c := v_1.AuxInt 16687 v.reset(OpNeq16) 16688 v0 := b.NewValue0(v.Pos, OpConst16, t) 16689 v0.AuxInt = int64(int16(c - d)) 16690 v.AddArg(v0) 16691 v.AddArg(x) 16692 return true 16693 } 16694 // match: (Neq16 (Add16 x (Const16 <t> [d])) (Const16 <t> [c])) 16695 // cond: 16696 // result: (Neq16 (Const16 <t> [int64(int16(c-d))]) x) 16697 for { 16698 _ = v.Args[1] 16699 v_0 := v.Args[0] 16700 if v_0.Op != OpAdd16 { 16701 break 16702 } 16703 _ = v_0.Args[1] 16704 x := v_0.Args[0] 16705 v_0_1 := v_0.Args[1] 16706 if v_0_1.Op != OpConst16 { 16707 break 16708 } 16709 t := v_0_1.Type 16710 d := v_0_1.AuxInt 16711 v_1 := v.Args[1] 16712 if v_1.Op != OpConst16 { 16713 break 16714 } 16715 if v_1.Type != t { 16716 break 16717 } 16718 c := v_1.AuxInt 16719 v.reset(OpNeq16) 16720 v0 := b.NewValue0(v.Pos, OpConst16, t) 16721 v0.AuxInt = int64(int16(c - d)) 16722 v.AddArg(v0) 16723 v.AddArg(x) 16724 return true 16725 } 16726 // match: (Neq16 (Const16 [c]) (Const16 [d])) 16727 // cond: 16728 // result: (ConstBool [b2i(c != d)]) 16729 for { 16730 _ = v.Args[1] 16731 v_0 := v.Args[0] 16732 if v_0.Op != OpConst16 { 16733 break 16734 } 16735 c := v_0.AuxInt 16736 v_1 := v.Args[1] 16737 if v_1.Op != OpConst16 { 16738 break 16739 } 16740 d := v_1.AuxInt 16741 v.reset(OpConstBool) 16742 v.AuxInt = b2i(c != d) 16743 return true 16744 } 16745 // match: (Neq16 (Const16 [d]) (Const16 [c])) 16746 // cond: 16747 // result: (ConstBool [b2i(c != d)]) 16748 for { 16749 _ = v.Args[1] 16750 v_0 := v.Args[0] 16751 if v_0.Op != OpConst16 { 16752 break 16753 } 16754 d := v_0.AuxInt 16755 v_1 := v.Args[1] 16756 if v_1.Op != OpConst16 { 16757 break 16758 } 16759 c := v_1.AuxInt 16760 v.reset(OpConstBool) 16761 v.AuxInt = b2i(c != d) 16762 return true 16763 } 16764 return false 16765 } 16766 func rewriteValuegeneric_OpNeq32_0(v *Value) bool { 16767 b := v.Block 16768 _ = b 16769 // match: (Neq32 x x) 16770 // cond: 16771 // result: (ConstBool [0]) 16772 for { 16773 _ = v.Args[1] 16774 x := v.Args[0] 16775 if x != v.Args[1] { 16776 break 16777 } 16778 v.reset(OpConstBool) 16779 v.AuxInt = 0 16780 return true 16781 } 16782 // match: (Neq32 (Const32 <t> [c]) (Add32 (Const32 <t> [d]) x)) 16783 // cond: 16784 // result: (Neq32 (Const32 <t> [int64(int32(c-d))]) x) 16785 for { 16786 _ = v.Args[1] 16787 v_0 := v.Args[0] 16788 if v_0.Op != OpConst32 { 16789 break 16790 } 16791 t := v_0.Type 16792 c := v_0.AuxInt 16793 v_1 := v.Args[1] 16794 if v_1.Op != OpAdd32 { 16795 break 16796 } 16797 _ = v_1.Args[1] 16798 v_1_0 := v_1.Args[0] 16799 if v_1_0.Op != OpConst32 { 16800 break 16801 } 16802 if v_1_0.Type != t { 16803 break 16804 } 16805 d := v_1_0.AuxInt 16806 x := v_1.Args[1] 16807 v.reset(OpNeq32) 16808 v0 := b.NewValue0(v.Pos, OpConst32, t) 16809 v0.AuxInt = int64(int32(c - d)) 16810 v.AddArg(v0) 16811 v.AddArg(x) 16812 return true 16813 } 16814 // match: (Neq32 (Const32 <t> [c]) (Add32 x (Const32 <t> [d]))) 16815 // cond: 16816 // result: (Neq32 (Const32 <t> [int64(int32(c-d))]) x) 16817 for { 16818 _ = v.Args[1] 16819 v_0 := v.Args[0] 16820 if v_0.Op != OpConst32 { 16821 break 16822 } 16823 t := v_0.Type 16824 c := v_0.AuxInt 16825 v_1 := v.Args[1] 16826 if v_1.Op != OpAdd32 { 16827 break 16828 } 16829 _ = v_1.Args[1] 16830 x := v_1.Args[0] 16831 v_1_1 := v_1.Args[1] 16832 if v_1_1.Op != OpConst32 { 16833 break 16834 } 16835 if v_1_1.Type != t { 16836 break 16837 } 16838 d := v_1_1.AuxInt 16839 v.reset(OpNeq32) 16840 v0 := b.NewValue0(v.Pos, OpConst32, t) 16841 v0.AuxInt = int64(int32(c - d)) 16842 v.AddArg(v0) 16843 v.AddArg(x) 16844 return true 16845 } 16846 // match: (Neq32 (Add32 (Const32 <t> [d]) x) (Const32 <t> [c])) 16847 // cond: 16848 // result: (Neq32 (Const32 <t> [int64(int32(c-d))]) x) 16849 for { 16850 _ = v.Args[1] 16851 v_0 := v.Args[0] 16852 if v_0.Op != OpAdd32 { 16853 break 16854 } 16855 _ = v_0.Args[1] 16856 v_0_0 := v_0.Args[0] 16857 if v_0_0.Op != OpConst32 { 16858 break 16859 } 16860 t := v_0_0.Type 16861 d := v_0_0.AuxInt 16862 x := v_0.Args[1] 16863 v_1 := v.Args[1] 16864 if v_1.Op != OpConst32 { 16865 break 16866 } 16867 if v_1.Type != t { 16868 break 16869 } 16870 c := v_1.AuxInt 16871 v.reset(OpNeq32) 16872 v0 := b.NewValue0(v.Pos, OpConst32, t) 16873 v0.AuxInt = int64(int32(c - d)) 16874 v.AddArg(v0) 16875 v.AddArg(x) 16876 return true 16877 } 16878 // match: (Neq32 (Add32 x (Const32 <t> [d])) (Const32 <t> [c])) 16879 // cond: 16880 // result: (Neq32 (Const32 <t> [int64(int32(c-d))]) x) 16881 for { 16882 _ = v.Args[1] 16883 v_0 := v.Args[0] 16884 if v_0.Op != OpAdd32 { 16885 break 16886 } 16887 _ = v_0.Args[1] 16888 x := v_0.Args[0] 16889 v_0_1 := v_0.Args[1] 16890 if v_0_1.Op != OpConst32 { 16891 break 16892 } 16893 t := v_0_1.Type 16894 d := v_0_1.AuxInt 16895 v_1 := v.Args[1] 16896 if v_1.Op != OpConst32 { 16897 break 16898 } 16899 if v_1.Type != t { 16900 break 16901 } 16902 c := v_1.AuxInt 16903 v.reset(OpNeq32) 16904 v0 := b.NewValue0(v.Pos, OpConst32, t) 16905 v0.AuxInt = int64(int32(c - d)) 16906 v.AddArg(v0) 16907 v.AddArg(x) 16908 return true 16909 } 16910 // match: (Neq32 (Const32 [c]) (Const32 [d])) 16911 // cond: 16912 // result: (ConstBool [b2i(c != d)]) 16913 for { 16914 _ = v.Args[1] 16915 v_0 := v.Args[0] 16916 if v_0.Op != OpConst32 { 16917 break 16918 } 16919 c := v_0.AuxInt 16920 v_1 := v.Args[1] 16921 if v_1.Op != OpConst32 { 16922 break 16923 } 16924 d := v_1.AuxInt 16925 v.reset(OpConstBool) 16926 v.AuxInt = b2i(c != d) 16927 return true 16928 } 16929 // match: (Neq32 (Const32 [d]) (Const32 [c])) 16930 // cond: 16931 // result: (ConstBool [b2i(c != d)]) 16932 for { 16933 _ = v.Args[1] 16934 v_0 := v.Args[0] 16935 if v_0.Op != OpConst32 { 16936 break 16937 } 16938 d := v_0.AuxInt 16939 v_1 := v.Args[1] 16940 if v_1.Op != OpConst32 { 16941 break 16942 } 16943 c := v_1.AuxInt 16944 v.reset(OpConstBool) 16945 v.AuxInt = b2i(c != d) 16946 return true 16947 } 16948 return false 16949 } 16950 func rewriteValuegeneric_OpNeq32F_0(v *Value) bool { 16951 // match: (Neq32F (Const32F [c]) (Const32F [d])) 16952 // cond: 16953 // result: (ConstBool [b2i(i2f(c) != i2f(d))]) 16954 for { 16955 _ = v.Args[1] 16956 v_0 := v.Args[0] 16957 if v_0.Op != OpConst32F { 16958 break 16959 } 16960 c := v_0.AuxInt 16961 v_1 := v.Args[1] 16962 if v_1.Op != OpConst32F { 16963 break 16964 } 16965 d := v_1.AuxInt 16966 v.reset(OpConstBool) 16967 v.AuxInt = b2i(i2f(c) != i2f(d)) 16968 return true 16969 } 16970 // match: (Neq32F (Const32F [d]) (Const32F [c])) 16971 // cond: 16972 // result: (ConstBool [b2i(i2f(c) != i2f(d))]) 16973 for { 16974 _ = v.Args[1] 16975 v_0 := v.Args[0] 16976 if v_0.Op != OpConst32F { 16977 break 16978 } 16979 d := v_0.AuxInt 16980 v_1 := v.Args[1] 16981 if v_1.Op != OpConst32F { 16982 break 16983 } 16984 c := v_1.AuxInt 16985 v.reset(OpConstBool) 16986 v.AuxInt = b2i(i2f(c) != i2f(d)) 16987 return true 16988 } 16989 return false 16990 } 16991 func rewriteValuegeneric_OpNeq64_0(v *Value) bool { 16992 b := v.Block 16993 _ = b 16994 // match: (Neq64 x x) 16995 // cond: 16996 // result: (ConstBool [0]) 16997 for { 16998 _ = v.Args[1] 16999 x := v.Args[0] 17000 if x != v.Args[1] { 17001 break 17002 } 17003 v.reset(OpConstBool) 17004 v.AuxInt = 0 17005 return true 17006 } 17007 // match: (Neq64 (Const64 <t> [c]) (Add64 (Const64 <t> [d]) x)) 17008 // cond: 17009 // result: (Neq64 (Const64 <t> [c-d]) x) 17010 for { 17011 _ = v.Args[1] 17012 v_0 := v.Args[0] 17013 if v_0.Op != OpConst64 { 17014 break 17015 } 17016 t := v_0.Type 17017 c := v_0.AuxInt 17018 v_1 := v.Args[1] 17019 if v_1.Op != OpAdd64 { 17020 break 17021 } 17022 _ = v_1.Args[1] 17023 v_1_0 := v_1.Args[0] 17024 if v_1_0.Op != OpConst64 { 17025 break 17026 } 17027 if v_1_0.Type != t { 17028 break 17029 } 17030 d := v_1_0.AuxInt 17031 x := v_1.Args[1] 17032 v.reset(OpNeq64) 17033 v0 := b.NewValue0(v.Pos, OpConst64, t) 17034 v0.AuxInt = c - d 17035 v.AddArg(v0) 17036 v.AddArg(x) 17037 return true 17038 } 17039 // match: (Neq64 (Const64 <t> [c]) (Add64 x (Const64 <t> [d]))) 17040 // cond: 17041 // result: (Neq64 (Const64 <t> [c-d]) x) 17042 for { 17043 _ = v.Args[1] 17044 v_0 := v.Args[0] 17045 if v_0.Op != OpConst64 { 17046 break 17047 } 17048 t := v_0.Type 17049 c := v_0.AuxInt 17050 v_1 := v.Args[1] 17051 if v_1.Op != OpAdd64 { 17052 break 17053 } 17054 _ = v_1.Args[1] 17055 x := v_1.Args[0] 17056 v_1_1 := v_1.Args[1] 17057 if v_1_1.Op != OpConst64 { 17058 break 17059 } 17060 if v_1_1.Type != t { 17061 break 17062 } 17063 d := v_1_1.AuxInt 17064 v.reset(OpNeq64) 17065 v0 := b.NewValue0(v.Pos, OpConst64, t) 17066 v0.AuxInt = c - d 17067 v.AddArg(v0) 17068 v.AddArg(x) 17069 return true 17070 } 17071 // match: (Neq64 (Add64 (Const64 <t> [d]) x) (Const64 <t> [c])) 17072 // cond: 17073 // result: (Neq64 (Const64 <t> [c-d]) x) 17074 for { 17075 _ = v.Args[1] 17076 v_0 := v.Args[0] 17077 if v_0.Op != OpAdd64 { 17078 break 17079 } 17080 _ = v_0.Args[1] 17081 v_0_0 := v_0.Args[0] 17082 if v_0_0.Op != OpConst64 { 17083 break 17084 } 17085 t := v_0_0.Type 17086 d := v_0_0.AuxInt 17087 x := v_0.Args[1] 17088 v_1 := v.Args[1] 17089 if v_1.Op != OpConst64 { 17090 break 17091 } 17092 if v_1.Type != t { 17093 break 17094 } 17095 c := v_1.AuxInt 17096 v.reset(OpNeq64) 17097 v0 := b.NewValue0(v.Pos, OpConst64, t) 17098 v0.AuxInt = c - d 17099 v.AddArg(v0) 17100 v.AddArg(x) 17101 return true 17102 } 17103 // match: (Neq64 (Add64 x (Const64 <t> [d])) (Const64 <t> [c])) 17104 // cond: 17105 // result: (Neq64 (Const64 <t> [c-d]) x) 17106 for { 17107 _ = v.Args[1] 17108 v_0 := v.Args[0] 17109 if v_0.Op != OpAdd64 { 17110 break 17111 } 17112 _ = v_0.Args[1] 17113 x := v_0.Args[0] 17114 v_0_1 := v_0.Args[1] 17115 if v_0_1.Op != OpConst64 { 17116 break 17117 } 17118 t := v_0_1.Type 17119 d := v_0_1.AuxInt 17120 v_1 := v.Args[1] 17121 if v_1.Op != OpConst64 { 17122 break 17123 } 17124 if v_1.Type != t { 17125 break 17126 } 17127 c := v_1.AuxInt 17128 v.reset(OpNeq64) 17129 v0 := b.NewValue0(v.Pos, OpConst64, t) 17130 v0.AuxInt = c - d 17131 v.AddArg(v0) 17132 v.AddArg(x) 17133 return true 17134 } 17135 // match: (Neq64 (Const64 [c]) (Const64 [d])) 17136 // cond: 17137 // result: (ConstBool [b2i(c != d)]) 17138 for { 17139 _ = v.Args[1] 17140 v_0 := v.Args[0] 17141 if v_0.Op != OpConst64 { 17142 break 17143 } 17144 c := v_0.AuxInt 17145 v_1 := v.Args[1] 17146 if v_1.Op != OpConst64 { 17147 break 17148 } 17149 d := v_1.AuxInt 17150 v.reset(OpConstBool) 17151 v.AuxInt = b2i(c != d) 17152 return true 17153 } 17154 // match: (Neq64 (Const64 [d]) (Const64 [c])) 17155 // cond: 17156 // result: (ConstBool [b2i(c != d)]) 17157 for { 17158 _ = v.Args[1] 17159 v_0 := v.Args[0] 17160 if v_0.Op != OpConst64 { 17161 break 17162 } 17163 d := v_0.AuxInt 17164 v_1 := v.Args[1] 17165 if v_1.Op != OpConst64 { 17166 break 17167 } 17168 c := v_1.AuxInt 17169 v.reset(OpConstBool) 17170 v.AuxInt = b2i(c != d) 17171 return true 17172 } 17173 return false 17174 } 17175 func rewriteValuegeneric_OpNeq64F_0(v *Value) bool { 17176 // match: (Neq64F (Const64F [c]) (Const64F [d])) 17177 // cond: 17178 // result: (ConstBool [b2i(i2f(c) != i2f(d))]) 17179 for { 17180 _ = v.Args[1] 17181 v_0 := v.Args[0] 17182 if v_0.Op != OpConst64F { 17183 break 17184 } 17185 c := v_0.AuxInt 17186 v_1 := v.Args[1] 17187 if v_1.Op != OpConst64F { 17188 break 17189 } 17190 d := v_1.AuxInt 17191 v.reset(OpConstBool) 17192 v.AuxInt = b2i(i2f(c) != i2f(d)) 17193 return true 17194 } 17195 // match: (Neq64F (Const64F [d]) (Const64F [c])) 17196 // cond: 17197 // result: (ConstBool [b2i(i2f(c) != i2f(d))]) 17198 for { 17199 _ = v.Args[1] 17200 v_0 := v.Args[0] 17201 if v_0.Op != OpConst64F { 17202 break 17203 } 17204 d := v_0.AuxInt 17205 v_1 := v.Args[1] 17206 if v_1.Op != OpConst64F { 17207 break 17208 } 17209 c := v_1.AuxInt 17210 v.reset(OpConstBool) 17211 v.AuxInt = b2i(i2f(c) != i2f(d)) 17212 return true 17213 } 17214 return false 17215 } 17216 func rewriteValuegeneric_OpNeq8_0(v *Value) bool { 17217 b := v.Block 17218 _ = b 17219 // match: (Neq8 x x) 17220 // cond: 17221 // result: (ConstBool [0]) 17222 for { 17223 _ = v.Args[1] 17224 x := v.Args[0] 17225 if x != v.Args[1] { 17226 break 17227 } 17228 v.reset(OpConstBool) 17229 v.AuxInt = 0 17230 return true 17231 } 17232 // match: (Neq8 (Const8 <t> [c]) (Add8 (Const8 <t> [d]) x)) 17233 // cond: 17234 // result: (Neq8 (Const8 <t> [int64(int8(c-d))]) x) 17235 for { 17236 _ = v.Args[1] 17237 v_0 := v.Args[0] 17238 if v_0.Op != OpConst8 { 17239 break 17240 } 17241 t := v_0.Type 17242 c := v_0.AuxInt 17243 v_1 := v.Args[1] 17244 if v_1.Op != OpAdd8 { 17245 break 17246 } 17247 _ = v_1.Args[1] 17248 v_1_0 := v_1.Args[0] 17249 if v_1_0.Op != OpConst8 { 17250 break 17251 } 17252 if v_1_0.Type != t { 17253 break 17254 } 17255 d := v_1_0.AuxInt 17256 x := v_1.Args[1] 17257 v.reset(OpNeq8) 17258 v0 := b.NewValue0(v.Pos, OpConst8, t) 17259 v0.AuxInt = int64(int8(c - d)) 17260 v.AddArg(v0) 17261 v.AddArg(x) 17262 return true 17263 } 17264 // match: (Neq8 (Const8 <t> [c]) (Add8 x (Const8 <t> [d]))) 17265 // cond: 17266 // result: (Neq8 (Const8 <t> [int64(int8(c-d))]) x) 17267 for { 17268 _ = v.Args[1] 17269 v_0 := v.Args[0] 17270 if v_0.Op != OpConst8 { 17271 break 17272 } 17273 t := v_0.Type 17274 c := v_0.AuxInt 17275 v_1 := v.Args[1] 17276 if v_1.Op != OpAdd8 { 17277 break 17278 } 17279 _ = v_1.Args[1] 17280 x := v_1.Args[0] 17281 v_1_1 := v_1.Args[1] 17282 if v_1_1.Op != OpConst8 { 17283 break 17284 } 17285 if v_1_1.Type != t { 17286 break 17287 } 17288 d := v_1_1.AuxInt 17289 v.reset(OpNeq8) 17290 v0 := b.NewValue0(v.Pos, OpConst8, t) 17291 v0.AuxInt = int64(int8(c - d)) 17292 v.AddArg(v0) 17293 v.AddArg(x) 17294 return true 17295 } 17296 // match: (Neq8 (Add8 (Const8 <t> [d]) x) (Const8 <t> [c])) 17297 // cond: 17298 // result: (Neq8 (Const8 <t> [int64(int8(c-d))]) x) 17299 for { 17300 _ = v.Args[1] 17301 v_0 := v.Args[0] 17302 if v_0.Op != OpAdd8 { 17303 break 17304 } 17305 _ = v_0.Args[1] 17306 v_0_0 := v_0.Args[0] 17307 if v_0_0.Op != OpConst8 { 17308 break 17309 } 17310 t := v_0_0.Type 17311 d := v_0_0.AuxInt 17312 x := v_0.Args[1] 17313 v_1 := v.Args[1] 17314 if v_1.Op != OpConst8 { 17315 break 17316 } 17317 if v_1.Type != t { 17318 break 17319 } 17320 c := v_1.AuxInt 17321 v.reset(OpNeq8) 17322 v0 := b.NewValue0(v.Pos, OpConst8, t) 17323 v0.AuxInt = int64(int8(c - d)) 17324 v.AddArg(v0) 17325 v.AddArg(x) 17326 return true 17327 } 17328 // match: (Neq8 (Add8 x (Const8 <t> [d])) (Const8 <t> [c])) 17329 // cond: 17330 // result: (Neq8 (Const8 <t> [int64(int8(c-d))]) x) 17331 for { 17332 _ = v.Args[1] 17333 v_0 := v.Args[0] 17334 if v_0.Op != OpAdd8 { 17335 break 17336 } 17337 _ = v_0.Args[1] 17338 x := v_0.Args[0] 17339 v_0_1 := v_0.Args[1] 17340 if v_0_1.Op != OpConst8 { 17341 break 17342 } 17343 t := v_0_1.Type 17344 d := v_0_1.AuxInt 17345 v_1 := v.Args[1] 17346 if v_1.Op != OpConst8 { 17347 break 17348 } 17349 if v_1.Type != t { 17350 break 17351 } 17352 c := v_1.AuxInt 17353 v.reset(OpNeq8) 17354 v0 := b.NewValue0(v.Pos, OpConst8, t) 17355 v0.AuxInt = int64(int8(c - d)) 17356 v.AddArg(v0) 17357 v.AddArg(x) 17358 return true 17359 } 17360 // match: (Neq8 (Const8 [c]) (Const8 [d])) 17361 // cond: 17362 // result: (ConstBool [b2i(c != d)]) 17363 for { 17364 _ = v.Args[1] 17365 v_0 := v.Args[0] 17366 if v_0.Op != OpConst8 { 17367 break 17368 } 17369 c := v_0.AuxInt 17370 v_1 := v.Args[1] 17371 if v_1.Op != OpConst8 { 17372 break 17373 } 17374 d := v_1.AuxInt 17375 v.reset(OpConstBool) 17376 v.AuxInt = b2i(c != d) 17377 return true 17378 } 17379 // match: (Neq8 (Const8 [d]) (Const8 [c])) 17380 // cond: 17381 // result: (ConstBool [b2i(c != d)]) 17382 for { 17383 _ = v.Args[1] 17384 v_0 := v.Args[0] 17385 if v_0.Op != OpConst8 { 17386 break 17387 } 17388 d := v_0.AuxInt 17389 v_1 := v.Args[1] 17390 if v_1.Op != OpConst8 { 17391 break 17392 } 17393 c := v_1.AuxInt 17394 v.reset(OpConstBool) 17395 v.AuxInt = b2i(c != d) 17396 return true 17397 } 17398 return false 17399 } 17400 func rewriteValuegeneric_OpNeqB_0(v *Value) bool { 17401 // match: (NeqB (ConstBool [c]) (ConstBool [d])) 17402 // cond: 17403 // result: (ConstBool [b2i(c != d)]) 17404 for { 17405 _ = v.Args[1] 17406 v_0 := v.Args[0] 17407 if v_0.Op != OpConstBool { 17408 break 17409 } 17410 c := v_0.AuxInt 17411 v_1 := v.Args[1] 17412 if v_1.Op != OpConstBool { 17413 break 17414 } 17415 d := v_1.AuxInt 17416 v.reset(OpConstBool) 17417 v.AuxInt = b2i(c != d) 17418 return true 17419 } 17420 // match: (NeqB (ConstBool [d]) (ConstBool [c])) 17421 // cond: 17422 // result: (ConstBool [b2i(c != d)]) 17423 for { 17424 _ = v.Args[1] 17425 v_0 := v.Args[0] 17426 if v_0.Op != OpConstBool { 17427 break 17428 } 17429 d := v_0.AuxInt 17430 v_1 := v.Args[1] 17431 if v_1.Op != OpConstBool { 17432 break 17433 } 17434 c := v_1.AuxInt 17435 v.reset(OpConstBool) 17436 v.AuxInt = b2i(c != d) 17437 return true 17438 } 17439 // match: (NeqB (ConstBool [0]) x) 17440 // cond: 17441 // result: x 17442 for { 17443 _ = v.Args[1] 17444 v_0 := v.Args[0] 17445 if v_0.Op != OpConstBool { 17446 break 17447 } 17448 if v_0.AuxInt != 0 { 17449 break 17450 } 17451 x := v.Args[1] 17452 v.reset(OpCopy) 17453 v.Type = x.Type 17454 v.AddArg(x) 17455 return true 17456 } 17457 // match: (NeqB x (ConstBool [0])) 17458 // cond: 17459 // result: x 17460 for { 17461 _ = v.Args[1] 17462 x := v.Args[0] 17463 v_1 := v.Args[1] 17464 if v_1.Op != OpConstBool { 17465 break 17466 } 17467 if v_1.AuxInt != 0 { 17468 break 17469 } 17470 v.reset(OpCopy) 17471 v.Type = x.Type 17472 v.AddArg(x) 17473 return true 17474 } 17475 // match: (NeqB (ConstBool [1]) x) 17476 // cond: 17477 // result: (Not x) 17478 for { 17479 _ = v.Args[1] 17480 v_0 := v.Args[0] 17481 if v_0.Op != OpConstBool { 17482 break 17483 } 17484 if v_0.AuxInt != 1 { 17485 break 17486 } 17487 x := v.Args[1] 17488 v.reset(OpNot) 17489 v.AddArg(x) 17490 return true 17491 } 17492 // match: (NeqB x (ConstBool [1])) 17493 // cond: 17494 // result: (Not x) 17495 for { 17496 _ = v.Args[1] 17497 x := v.Args[0] 17498 v_1 := v.Args[1] 17499 if v_1.Op != OpConstBool { 17500 break 17501 } 17502 if v_1.AuxInt != 1 { 17503 break 17504 } 17505 v.reset(OpNot) 17506 v.AddArg(x) 17507 return true 17508 } 17509 // match: (NeqB (Not x) (Not y)) 17510 // cond: 17511 // result: (NeqB x y) 17512 for { 17513 _ = v.Args[1] 17514 v_0 := v.Args[0] 17515 if v_0.Op != OpNot { 17516 break 17517 } 17518 x := v_0.Args[0] 17519 v_1 := v.Args[1] 17520 if v_1.Op != OpNot { 17521 break 17522 } 17523 y := v_1.Args[0] 17524 v.reset(OpNeqB) 17525 v.AddArg(x) 17526 v.AddArg(y) 17527 return true 17528 } 17529 // match: (NeqB (Not y) (Not x)) 17530 // cond: 17531 // result: (NeqB x y) 17532 for { 17533 _ = v.Args[1] 17534 v_0 := v.Args[0] 17535 if v_0.Op != OpNot { 17536 break 17537 } 17538 y := v_0.Args[0] 17539 v_1 := v.Args[1] 17540 if v_1.Op != OpNot { 17541 break 17542 } 17543 x := v_1.Args[0] 17544 v.reset(OpNeqB) 17545 v.AddArg(x) 17546 v.AddArg(y) 17547 return true 17548 } 17549 return false 17550 } 17551 func rewriteValuegeneric_OpNeqInter_0(v *Value) bool { 17552 b := v.Block 17553 _ = b 17554 typ := &b.Func.Config.Types 17555 _ = typ 17556 // match: (NeqInter x y) 17557 // cond: 17558 // result: (NeqPtr (ITab x) (ITab y)) 17559 for { 17560 _ = v.Args[1] 17561 x := v.Args[0] 17562 y := v.Args[1] 17563 v.reset(OpNeqPtr) 17564 v0 := b.NewValue0(v.Pos, OpITab, typ.BytePtr) 17565 v0.AddArg(x) 17566 v.AddArg(v0) 17567 v1 := b.NewValue0(v.Pos, OpITab, typ.BytePtr) 17568 v1.AddArg(y) 17569 v.AddArg(v1) 17570 return true 17571 } 17572 } 17573 func rewriteValuegeneric_OpNeqPtr_0(v *Value) bool { 17574 // match: (NeqPtr p (ConstNil)) 17575 // cond: 17576 // result: (IsNonNil p) 17577 for { 17578 _ = v.Args[1] 17579 p := v.Args[0] 17580 v_1 := v.Args[1] 17581 if v_1.Op != OpConstNil { 17582 break 17583 } 17584 v.reset(OpIsNonNil) 17585 v.AddArg(p) 17586 return true 17587 } 17588 // match: (NeqPtr (ConstNil) p) 17589 // cond: 17590 // result: (IsNonNil p) 17591 for { 17592 _ = v.Args[1] 17593 v_0 := v.Args[0] 17594 if v_0.Op != OpConstNil { 17595 break 17596 } 17597 p := v.Args[1] 17598 v.reset(OpIsNonNil) 17599 v.AddArg(p) 17600 return true 17601 } 17602 return false 17603 } 17604 func rewriteValuegeneric_OpNeqSlice_0(v *Value) bool { 17605 b := v.Block 17606 _ = b 17607 typ := &b.Func.Config.Types 17608 _ = typ 17609 // match: (NeqSlice x y) 17610 // cond: 17611 // result: (NeqPtr (SlicePtr x) (SlicePtr y)) 17612 for { 17613 _ = v.Args[1] 17614 x := v.Args[0] 17615 y := v.Args[1] 17616 v.reset(OpNeqPtr) 17617 v0 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr) 17618 v0.AddArg(x) 17619 v.AddArg(v0) 17620 v1 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr) 17621 v1.AddArg(y) 17622 v.AddArg(v1) 17623 return true 17624 } 17625 } 17626 func rewriteValuegeneric_OpNilCheck_0(v *Value) bool { 17627 b := v.Block 17628 _ = b 17629 config := b.Func.Config 17630 _ = config 17631 fe := b.Func.fe 17632 _ = fe 17633 // match: (NilCheck (GetG mem) mem) 17634 // cond: 17635 // result: mem 17636 for { 17637 _ = v.Args[1] 17638 v_0 := v.Args[0] 17639 if v_0.Op != OpGetG { 17640 break 17641 } 17642 mem := v_0.Args[0] 17643 if mem != v.Args[1] { 17644 break 17645 } 17646 v.reset(OpCopy) 17647 v.Type = mem.Type 17648 v.AddArg(mem) 17649 return true 17650 } 17651 // match: (NilCheck (Load (OffPtr [c] (SP)) (StaticCall {sym} _)) _) 17652 // cond: isSameSym(sym, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize && warnRule(fe.Debug_checknil() && v.Pos.Line() > 1, v, "removed nil check") 17653 // result: (Invalid) 17654 for { 17655 _ = v.Args[1] 17656 v_0 := v.Args[0] 17657 if v_0.Op != OpLoad { 17658 break 17659 } 17660 _ = v_0.Args[1] 17661 v_0_0 := v_0.Args[0] 17662 if v_0_0.Op != OpOffPtr { 17663 break 17664 } 17665 c := v_0_0.AuxInt 17666 v_0_0_0 := v_0_0.Args[0] 17667 if v_0_0_0.Op != OpSP { 17668 break 17669 } 17670 v_0_1 := v_0.Args[1] 17671 if v_0_1.Op != OpStaticCall { 17672 break 17673 } 17674 sym := v_0_1.Aux 17675 if !(isSameSym(sym, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize && warnRule(fe.Debug_checknil() && v.Pos.Line() > 1, v, "removed nil check")) { 17676 break 17677 } 17678 v.reset(OpInvalid) 17679 return true 17680 } 17681 // match: (NilCheck (OffPtr (Load (OffPtr [c] (SP)) (StaticCall {sym} _))) _) 17682 // cond: isSameSym(sym, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize && warnRule(fe.Debug_checknil() && v.Pos.Line() > 1, v, "removed nil check") 17683 // result: (Invalid) 17684 for { 17685 _ = v.Args[1] 17686 v_0 := v.Args[0] 17687 if v_0.Op != OpOffPtr { 17688 break 17689 } 17690 v_0_0 := v_0.Args[0] 17691 if v_0_0.Op != OpLoad { 17692 break 17693 } 17694 _ = v_0_0.Args[1] 17695 v_0_0_0 := v_0_0.Args[0] 17696 if v_0_0_0.Op != OpOffPtr { 17697 break 17698 } 17699 c := v_0_0_0.AuxInt 17700 v_0_0_0_0 := v_0_0_0.Args[0] 17701 if v_0_0_0_0.Op != OpSP { 17702 break 17703 } 17704 v_0_0_1 := v_0_0.Args[1] 17705 if v_0_0_1.Op != OpStaticCall { 17706 break 17707 } 17708 sym := v_0_0_1.Aux 17709 if !(isSameSym(sym, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize && warnRule(fe.Debug_checknil() && v.Pos.Line() > 1, v, "removed nil check")) { 17710 break 17711 } 17712 v.reset(OpInvalid) 17713 return true 17714 } 17715 return false 17716 } 17717 func rewriteValuegeneric_OpNot_0(v *Value) bool { 17718 // match: (Not (Eq64 x y)) 17719 // cond: 17720 // result: (Neq64 x y) 17721 for { 17722 v_0 := v.Args[0] 17723 if v_0.Op != OpEq64 { 17724 break 17725 } 17726 _ = v_0.Args[1] 17727 x := v_0.Args[0] 17728 y := v_0.Args[1] 17729 v.reset(OpNeq64) 17730 v.AddArg(x) 17731 v.AddArg(y) 17732 return true 17733 } 17734 // match: (Not (Eq32 x y)) 17735 // cond: 17736 // result: (Neq32 x y) 17737 for { 17738 v_0 := v.Args[0] 17739 if v_0.Op != OpEq32 { 17740 break 17741 } 17742 _ = v_0.Args[1] 17743 x := v_0.Args[0] 17744 y := v_0.Args[1] 17745 v.reset(OpNeq32) 17746 v.AddArg(x) 17747 v.AddArg(y) 17748 return true 17749 } 17750 // match: (Not (Eq16 x y)) 17751 // cond: 17752 // result: (Neq16 x y) 17753 for { 17754 v_0 := v.Args[0] 17755 if v_0.Op != OpEq16 { 17756 break 17757 } 17758 _ = v_0.Args[1] 17759 x := v_0.Args[0] 17760 y := v_0.Args[1] 17761 v.reset(OpNeq16) 17762 v.AddArg(x) 17763 v.AddArg(y) 17764 return true 17765 } 17766 // match: (Not (Eq8 x y)) 17767 // cond: 17768 // result: (Neq8 x y) 17769 for { 17770 v_0 := v.Args[0] 17771 if v_0.Op != OpEq8 { 17772 break 17773 } 17774 _ = v_0.Args[1] 17775 x := v_0.Args[0] 17776 y := v_0.Args[1] 17777 v.reset(OpNeq8) 17778 v.AddArg(x) 17779 v.AddArg(y) 17780 return true 17781 } 17782 // match: (Not (EqB x y)) 17783 // cond: 17784 // result: (NeqB x y) 17785 for { 17786 v_0 := v.Args[0] 17787 if v_0.Op != OpEqB { 17788 break 17789 } 17790 _ = v_0.Args[1] 17791 x := v_0.Args[0] 17792 y := v_0.Args[1] 17793 v.reset(OpNeqB) 17794 v.AddArg(x) 17795 v.AddArg(y) 17796 return true 17797 } 17798 // match: (Not (Neq64 x y)) 17799 // cond: 17800 // result: (Eq64 x y) 17801 for { 17802 v_0 := v.Args[0] 17803 if v_0.Op != OpNeq64 { 17804 break 17805 } 17806 _ = v_0.Args[1] 17807 x := v_0.Args[0] 17808 y := v_0.Args[1] 17809 v.reset(OpEq64) 17810 v.AddArg(x) 17811 v.AddArg(y) 17812 return true 17813 } 17814 // match: (Not (Neq32 x y)) 17815 // cond: 17816 // result: (Eq32 x y) 17817 for { 17818 v_0 := v.Args[0] 17819 if v_0.Op != OpNeq32 { 17820 break 17821 } 17822 _ = v_0.Args[1] 17823 x := v_0.Args[0] 17824 y := v_0.Args[1] 17825 v.reset(OpEq32) 17826 v.AddArg(x) 17827 v.AddArg(y) 17828 return true 17829 } 17830 // match: (Not (Neq16 x y)) 17831 // cond: 17832 // result: (Eq16 x y) 17833 for { 17834 v_0 := v.Args[0] 17835 if v_0.Op != OpNeq16 { 17836 break 17837 } 17838 _ = v_0.Args[1] 17839 x := v_0.Args[0] 17840 y := v_0.Args[1] 17841 v.reset(OpEq16) 17842 v.AddArg(x) 17843 v.AddArg(y) 17844 return true 17845 } 17846 // match: (Not (Neq8 x y)) 17847 // cond: 17848 // result: (Eq8 x y) 17849 for { 17850 v_0 := v.Args[0] 17851 if v_0.Op != OpNeq8 { 17852 break 17853 } 17854 _ = v_0.Args[1] 17855 x := v_0.Args[0] 17856 y := v_0.Args[1] 17857 v.reset(OpEq8) 17858 v.AddArg(x) 17859 v.AddArg(y) 17860 return true 17861 } 17862 // match: (Not (NeqB x y)) 17863 // cond: 17864 // result: (EqB x y) 17865 for { 17866 v_0 := v.Args[0] 17867 if v_0.Op != OpNeqB { 17868 break 17869 } 17870 _ = v_0.Args[1] 17871 x := v_0.Args[0] 17872 y := v_0.Args[1] 17873 v.reset(OpEqB) 17874 v.AddArg(x) 17875 v.AddArg(y) 17876 return true 17877 } 17878 return false 17879 } 17880 func rewriteValuegeneric_OpNot_10(v *Value) bool { 17881 // match: (Not (Greater64 x y)) 17882 // cond: 17883 // result: (Leq64 x y) 17884 for { 17885 v_0 := v.Args[0] 17886 if v_0.Op != OpGreater64 { 17887 break 17888 } 17889 _ = v_0.Args[1] 17890 x := v_0.Args[0] 17891 y := v_0.Args[1] 17892 v.reset(OpLeq64) 17893 v.AddArg(x) 17894 v.AddArg(y) 17895 return true 17896 } 17897 // match: (Not (Greater32 x y)) 17898 // cond: 17899 // result: (Leq32 x y) 17900 for { 17901 v_0 := v.Args[0] 17902 if v_0.Op != OpGreater32 { 17903 break 17904 } 17905 _ = v_0.Args[1] 17906 x := v_0.Args[0] 17907 y := v_0.Args[1] 17908 v.reset(OpLeq32) 17909 v.AddArg(x) 17910 v.AddArg(y) 17911 return true 17912 } 17913 // match: (Not (Greater16 x y)) 17914 // cond: 17915 // result: (Leq16 x y) 17916 for { 17917 v_0 := v.Args[0] 17918 if v_0.Op != OpGreater16 { 17919 break 17920 } 17921 _ = v_0.Args[1] 17922 x := v_0.Args[0] 17923 y := v_0.Args[1] 17924 v.reset(OpLeq16) 17925 v.AddArg(x) 17926 v.AddArg(y) 17927 return true 17928 } 17929 // match: (Not (Greater8 x y)) 17930 // cond: 17931 // result: (Leq8 x y) 17932 for { 17933 v_0 := v.Args[0] 17934 if v_0.Op != OpGreater8 { 17935 break 17936 } 17937 _ = v_0.Args[1] 17938 x := v_0.Args[0] 17939 y := v_0.Args[1] 17940 v.reset(OpLeq8) 17941 v.AddArg(x) 17942 v.AddArg(y) 17943 return true 17944 } 17945 // match: (Not (Greater64U x y)) 17946 // cond: 17947 // result: (Leq64U x y) 17948 for { 17949 v_0 := v.Args[0] 17950 if v_0.Op != OpGreater64U { 17951 break 17952 } 17953 _ = v_0.Args[1] 17954 x := v_0.Args[0] 17955 y := v_0.Args[1] 17956 v.reset(OpLeq64U) 17957 v.AddArg(x) 17958 v.AddArg(y) 17959 return true 17960 } 17961 // match: (Not (Greater32U x y)) 17962 // cond: 17963 // result: (Leq32U x y) 17964 for { 17965 v_0 := v.Args[0] 17966 if v_0.Op != OpGreater32U { 17967 break 17968 } 17969 _ = v_0.Args[1] 17970 x := v_0.Args[0] 17971 y := v_0.Args[1] 17972 v.reset(OpLeq32U) 17973 v.AddArg(x) 17974 v.AddArg(y) 17975 return true 17976 } 17977 // match: (Not (Greater16U x y)) 17978 // cond: 17979 // result: (Leq16U x y) 17980 for { 17981 v_0 := v.Args[0] 17982 if v_0.Op != OpGreater16U { 17983 break 17984 } 17985 _ = v_0.Args[1] 17986 x := v_0.Args[0] 17987 y := v_0.Args[1] 17988 v.reset(OpLeq16U) 17989 v.AddArg(x) 17990 v.AddArg(y) 17991 return true 17992 } 17993 // match: (Not (Greater8U x y)) 17994 // cond: 17995 // result: (Leq8U x y) 17996 for { 17997 v_0 := v.Args[0] 17998 if v_0.Op != OpGreater8U { 17999 break 18000 } 18001 _ = v_0.Args[1] 18002 x := v_0.Args[0] 18003 y := v_0.Args[1] 18004 v.reset(OpLeq8U) 18005 v.AddArg(x) 18006 v.AddArg(y) 18007 return true 18008 } 18009 // match: (Not (Geq64 x y)) 18010 // cond: 18011 // result: (Less64 x y) 18012 for { 18013 v_0 := v.Args[0] 18014 if v_0.Op != OpGeq64 { 18015 break 18016 } 18017 _ = v_0.Args[1] 18018 x := v_0.Args[0] 18019 y := v_0.Args[1] 18020 v.reset(OpLess64) 18021 v.AddArg(x) 18022 v.AddArg(y) 18023 return true 18024 } 18025 // match: (Not (Geq32 x y)) 18026 // cond: 18027 // result: (Less32 x y) 18028 for { 18029 v_0 := v.Args[0] 18030 if v_0.Op != OpGeq32 { 18031 break 18032 } 18033 _ = v_0.Args[1] 18034 x := v_0.Args[0] 18035 y := v_0.Args[1] 18036 v.reset(OpLess32) 18037 v.AddArg(x) 18038 v.AddArg(y) 18039 return true 18040 } 18041 return false 18042 } 18043 func rewriteValuegeneric_OpNot_20(v *Value) bool { 18044 // match: (Not (Geq16 x y)) 18045 // cond: 18046 // result: (Less16 x y) 18047 for { 18048 v_0 := v.Args[0] 18049 if v_0.Op != OpGeq16 { 18050 break 18051 } 18052 _ = v_0.Args[1] 18053 x := v_0.Args[0] 18054 y := v_0.Args[1] 18055 v.reset(OpLess16) 18056 v.AddArg(x) 18057 v.AddArg(y) 18058 return true 18059 } 18060 // match: (Not (Geq8 x y)) 18061 // cond: 18062 // result: (Less8 x y) 18063 for { 18064 v_0 := v.Args[0] 18065 if v_0.Op != OpGeq8 { 18066 break 18067 } 18068 _ = v_0.Args[1] 18069 x := v_0.Args[0] 18070 y := v_0.Args[1] 18071 v.reset(OpLess8) 18072 v.AddArg(x) 18073 v.AddArg(y) 18074 return true 18075 } 18076 // match: (Not (Geq64U x y)) 18077 // cond: 18078 // result: (Less64U x y) 18079 for { 18080 v_0 := v.Args[0] 18081 if v_0.Op != OpGeq64U { 18082 break 18083 } 18084 _ = v_0.Args[1] 18085 x := v_0.Args[0] 18086 y := v_0.Args[1] 18087 v.reset(OpLess64U) 18088 v.AddArg(x) 18089 v.AddArg(y) 18090 return true 18091 } 18092 // match: (Not (Geq32U x y)) 18093 // cond: 18094 // result: (Less32U x y) 18095 for { 18096 v_0 := v.Args[0] 18097 if v_0.Op != OpGeq32U { 18098 break 18099 } 18100 _ = v_0.Args[1] 18101 x := v_0.Args[0] 18102 y := v_0.Args[1] 18103 v.reset(OpLess32U) 18104 v.AddArg(x) 18105 v.AddArg(y) 18106 return true 18107 } 18108 // match: (Not (Geq16U x y)) 18109 // cond: 18110 // result: (Less16U x y) 18111 for { 18112 v_0 := v.Args[0] 18113 if v_0.Op != OpGeq16U { 18114 break 18115 } 18116 _ = v_0.Args[1] 18117 x := v_0.Args[0] 18118 y := v_0.Args[1] 18119 v.reset(OpLess16U) 18120 v.AddArg(x) 18121 v.AddArg(y) 18122 return true 18123 } 18124 // match: (Not (Geq8U x y)) 18125 // cond: 18126 // result: (Less8U x y) 18127 for { 18128 v_0 := v.Args[0] 18129 if v_0.Op != OpGeq8U { 18130 break 18131 } 18132 _ = v_0.Args[1] 18133 x := v_0.Args[0] 18134 y := v_0.Args[1] 18135 v.reset(OpLess8U) 18136 v.AddArg(x) 18137 v.AddArg(y) 18138 return true 18139 } 18140 // match: (Not (Less64 x y)) 18141 // cond: 18142 // result: (Geq64 x y) 18143 for { 18144 v_0 := v.Args[0] 18145 if v_0.Op != OpLess64 { 18146 break 18147 } 18148 _ = v_0.Args[1] 18149 x := v_0.Args[0] 18150 y := v_0.Args[1] 18151 v.reset(OpGeq64) 18152 v.AddArg(x) 18153 v.AddArg(y) 18154 return true 18155 } 18156 // match: (Not (Less32 x y)) 18157 // cond: 18158 // result: (Geq32 x y) 18159 for { 18160 v_0 := v.Args[0] 18161 if v_0.Op != OpLess32 { 18162 break 18163 } 18164 _ = v_0.Args[1] 18165 x := v_0.Args[0] 18166 y := v_0.Args[1] 18167 v.reset(OpGeq32) 18168 v.AddArg(x) 18169 v.AddArg(y) 18170 return true 18171 } 18172 // match: (Not (Less16 x y)) 18173 // cond: 18174 // result: (Geq16 x y) 18175 for { 18176 v_0 := v.Args[0] 18177 if v_0.Op != OpLess16 { 18178 break 18179 } 18180 _ = v_0.Args[1] 18181 x := v_0.Args[0] 18182 y := v_0.Args[1] 18183 v.reset(OpGeq16) 18184 v.AddArg(x) 18185 v.AddArg(y) 18186 return true 18187 } 18188 // match: (Not (Less8 x y)) 18189 // cond: 18190 // result: (Geq8 x y) 18191 for { 18192 v_0 := v.Args[0] 18193 if v_0.Op != OpLess8 { 18194 break 18195 } 18196 _ = v_0.Args[1] 18197 x := v_0.Args[0] 18198 y := v_0.Args[1] 18199 v.reset(OpGeq8) 18200 v.AddArg(x) 18201 v.AddArg(y) 18202 return true 18203 } 18204 return false 18205 } 18206 func rewriteValuegeneric_OpNot_30(v *Value) bool { 18207 // match: (Not (Less64U x y)) 18208 // cond: 18209 // result: (Geq64U x y) 18210 for { 18211 v_0 := v.Args[0] 18212 if v_0.Op != OpLess64U { 18213 break 18214 } 18215 _ = v_0.Args[1] 18216 x := v_0.Args[0] 18217 y := v_0.Args[1] 18218 v.reset(OpGeq64U) 18219 v.AddArg(x) 18220 v.AddArg(y) 18221 return true 18222 } 18223 // match: (Not (Less32U x y)) 18224 // cond: 18225 // result: (Geq32U x y) 18226 for { 18227 v_0 := v.Args[0] 18228 if v_0.Op != OpLess32U { 18229 break 18230 } 18231 _ = v_0.Args[1] 18232 x := v_0.Args[0] 18233 y := v_0.Args[1] 18234 v.reset(OpGeq32U) 18235 v.AddArg(x) 18236 v.AddArg(y) 18237 return true 18238 } 18239 // match: (Not (Less16U x y)) 18240 // cond: 18241 // result: (Geq16U x y) 18242 for { 18243 v_0 := v.Args[0] 18244 if v_0.Op != OpLess16U { 18245 break 18246 } 18247 _ = v_0.Args[1] 18248 x := v_0.Args[0] 18249 y := v_0.Args[1] 18250 v.reset(OpGeq16U) 18251 v.AddArg(x) 18252 v.AddArg(y) 18253 return true 18254 } 18255 // match: (Not (Less8U x y)) 18256 // cond: 18257 // result: (Geq8U x y) 18258 for { 18259 v_0 := v.Args[0] 18260 if v_0.Op != OpLess8U { 18261 break 18262 } 18263 _ = v_0.Args[1] 18264 x := v_0.Args[0] 18265 y := v_0.Args[1] 18266 v.reset(OpGeq8U) 18267 v.AddArg(x) 18268 v.AddArg(y) 18269 return true 18270 } 18271 // match: (Not (Leq64 x y)) 18272 // cond: 18273 // result: (Greater64 x y) 18274 for { 18275 v_0 := v.Args[0] 18276 if v_0.Op != OpLeq64 { 18277 break 18278 } 18279 _ = v_0.Args[1] 18280 x := v_0.Args[0] 18281 y := v_0.Args[1] 18282 v.reset(OpGreater64) 18283 v.AddArg(x) 18284 v.AddArg(y) 18285 return true 18286 } 18287 // match: (Not (Leq32 x y)) 18288 // cond: 18289 // result: (Greater32 x y) 18290 for { 18291 v_0 := v.Args[0] 18292 if v_0.Op != OpLeq32 { 18293 break 18294 } 18295 _ = v_0.Args[1] 18296 x := v_0.Args[0] 18297 y := v_0.Args[1] 18298 v.reset(OpGreater32) 18299 v.AddArg(x) 18300 v.AddArg(y) 18301 return true 18302 } 18303 // match: (Not (Leq16 x y)) 18304 // cond: 18305 // result: (Greater16 x y) 18306 for { 18307 v_0 := v.Args[0] 18308 if v_0.Op != OpLeq16 { 18309 break 18310 } 18311 _ = v_0.Args[1] 18312 x := v_0.Args[0] 18313 y := v_0.Args[1] 18314 v.reset(OpGreater16) 18315 v.AddArg(x) 18316 v.AddArg(y) 18317 return true 18318 } 18319 // match: (Not (Leq8 x y)) 18320 // cond: 18321 // result: (Greater8 x y) 18322 for { 18323 v_0 := v.Args[0] 18324 if v_0.Op != OpLeq8 { 18325 break 18326 } 18327 _ = v_0.Args[1] 18328 x := v_0.Args[0] 18329 y := v_0.Args[1] 18330 v.reset(OpGreater8) 18331 v.AddArg(x) 18332 v.AddArg(y) 18333 return true 18334 } 18335 // match: (Not (Leq64U x y)) 18336 // cond: 18337 // result: (Greater64U x y) 18338 for { 18339 v_0 := v.Args[0] 18340 if v_0.Op != OpLeq64U { 18341 break 18342 } 18343 _ = v_0.Args[1] 18344 x := v_0.Args[0] 18345 y := v_0.Args[1] 18346 v.reset(OpGreater64U) 18347 v.AddArg(x) 18348 v.AddArg(y) 18349 return true 18350 } 18351 // match: (Not (Leq32U x y)) 18352 // cond: 18353 // result: (Greater32U x y) 18354 for { 18355 v_0 := v.Args[0] 18356 if v_0.Op != OpLeq32U { 18357 break 18358 } 18359 _ = v_0.Args[1] 18360 x := v_0.Args[0] 18361 y := v_0.Args[1] 18362 v.reset(OpGreater32U) 18363 v.AddArg(x) 18364 v.AddArg(y) 18365 return true 18366 } 18367 return false 18368 } 18369 func rewriteValuegeneric_OpNot_40(v *Value) bool { 18370 // match: (Not (Leq16U x y)) 18371 // cond: 18372 // result: (Greater16U x y) 18373 for { 18374 v_0 := v.Args[0] 18375 if v_0.Op != OpLeq16U { 18376 break 18377 } 18378 _ = v_0.Args[1] 18379 x := v_0.Args[0] 18380 y := v_0.Args[1] 18381 v.reset(OpGreater16U) 18382 v.AddArg(x) 18383 v.AddArg(y) 18384 return true 18385 } 18386 // match: (Not (Leq8U x y)) 18387 // cond: 18388 // result: (Greater8U x y) 18389 for { 18390 v_0 := v.Args[0] 18391 if v_0.Op != OpLeq8U { 18392 break 18393 } 18394 _ = v_0.Args[1] 18395 x := v_0.Args[0] 18396 y := v_0.Args[1] 18397 v.reset(OpGreater8U) 18398 v.AddArg(x) 18399 v.AddArg(y) 18400 return true 18401 } 18402 return false 18403 } 18404 func rewriteValuegeneric_OpOffPtr_0(v *Value) bool { 18405 // match: (OffPtr (OffPtr p [b]) [a]) 18406 // cond: 18407 // result: (OffPtr p [a+b]) 18408 for { 18409 a := v.AuxInt 18410 v_0 := v.Args[0] 18411 if v_0.Op != OpOffPtr { 18412 break 18413 } 18414 b := v_0.AuxInt 18415 p := v_0.Args[0] 18416 v.reset(OpOffPtr) 18417 v.AuxInt = a + b 18418 v.AddArg(p) 18419 return true 18420 } 18421 // match: (OffPtr p [0]) 18422 // cond: v.Type.Compare(p.Type) == types.CMPeq 18423 // result: p 18424 for { 18425 if v.AuxInt != 0 { 18426 break 18427 } 18428 p := v.Args[0] 18429 if !(v.Type.Compare(p.Type) == types.CMPeq) { 18430 break 18431 } 18432 v.reset(OpCopy) 18433 v.Type = p.Type 18434 v.AddArg(p) 18435 return true 18436 } 18437 return false 18438 } 18439 func rewriteValuegeneric_OpOr16_0(v *Value) bool { 18440 // match: (Or16 (Const16 [c]) (Const16 [d])) 18441 // cond: 18442 // result: (Const16 [int64(int16(c|d))]) 18443 for { 18444 _ = v.Args[1] 18445 v_0 := v.Args[0] 18446 if v_0.Op != OpConst16 { 18447 break 18448 } 18449 c := v_0.AuxInt 18450 v_1 := v.Args[1] 18451 if v_1.Op != OpConst16 { 18452 break 18453 } 18454 d := v_1.AuxInt 18455 v.reset(OpConst16) 18456 v.AuxInt = int64(int16(c | d)) 18457 return true 18458 } 18459 // match: (Or16 (Const16 [d]) (Const16 [c])) 18460 // cond: 18461 // result: (Const16 [int64(int16(c|d))]) 18462 for { 18463 _ = v.Args[1] 18464 v_0 := v.Args[0] 18465 if v_0.Op != OpConst16 { 18466 break 18467 } 18468 d := v_0.AuxInt 18469 v_1 := v.Args[1] 18470 if v_1.Op != OpConst16 { 18471 break 18472 } 18473 c := v_1.AuxInt 18474 v.reset(OpConst16) 18475 v.AuxInt = int64(int16(c | d)) 18476 return true 18477 } 18478 // match: (Or16 x x) 18479 // cond: 18480 // result: x 18481 for { 18482 _ = v.Args[1] 18483 x := v.Args[0] 18484 if x != v.Args[1] { 18485 break 18486 } 18487 v.reset(OpCopy) 18488 v.Type = x.Type 18489 v.AddArg(x) 18490 return true 18491 } 18492 // match: (Or16 (Const16 [0]) x) 18493 // cond: 18494 // result: x 18495 for { 18496 _ = v.Args[1] 18497 v_0 := v.Args[0] 18498 if v_0.Op != OpConst16 { 18499 break 18500 } 18501 if v_0.AuxInt != 0 { 18502 break 18503 } 18504 x := v.Args[1] 18505 v.reset(OpCopy) 18506 v.Type = x.Type 18507 v.AddArg(x) 18508 return true 18509 } 18510 // match: (Or16 x (Const16 [0])) 18511 // cond: 18512 // result: x 18513 for { 18514 _ = v.Args[1] 18515 x := v.Args[0] 18516 v_1 := v.Args[1] 18517 if v_1.Op != OpConst16 { 18518 break 18519 } 18520 if v_1.AuxInt != 0 { 18521 break 18522 } 18523 v.reset(OpCopy) 18524 v.Type = x.Type 18525 v.AddArg(x) 18526 return true 18527 } 18528 // match: (Or16 (Const16 [-1]) _) 18529 // cond: 18530 // result: (Const16 [-1]) 18531 for { 18532 _ = v.Args[1] 18533 v_0 := v.Args[0] 18534 if v_0.Op != OpConst16 { 18535 break 18536 } 18537 if v_0.AuxInt != -1 { 18538 break 18539 } 18540 v.reset(OpConst16) 18541 v.AuxInt = -1 18542 return true 18543 } 18544 // match: (Or16 _ (Const16 [-1])) 18545 // cond: 18546 // result: (Const16 [-1]) 18547 for { 18548 _ = v.Args[1] 18549 v_1 := v.Args[1] 18550 if v_1.Op != OpConst16 { 18551 break 18552 } 18553 if v_1.AuxInt != -1 { 18554 break 18555 } 18556 v.reset(OpConst16) 18557 v.AuxInt = -1 18558 return true 18559 } 18560 // match: (Or16 x (Or16 x y)) 18561 // cond: 18562 // result: (Or16 x y) 18563 for { 18564 _ = v.Args[1] 18565 x := v.Args[0] 18566 v_1 := v.Args[1] 18567 if v_1.Op != OpOr16 { 18568 break 18569 } 18570 _ = v_1.Args[1] 18571 if x != v_1.Args[0] { 18572 break 18573 } 18574 y := v_1.Args[1] 18575 v.reset(OpOr16) 18576 v.AddArg(x) 18577 v.AddArg(y) 18578 return true 18579 } 18580 // match: (Or16 x (Or16 y x)) 18581 // cond: 18582 // result: (Or16 x y) 18583 for { 18584 _ = v.Args[1] 18585 x := v.Args[0] 18586 v_1 := v.Args[1] 18587 if v_1.Op != OpOr16 { 18588 break 18589 } 18590 _ = v_1.Args[1] 18591 y := v_1.Args[0] 18592 if x != v_1.Args[1] { 18593 break 18594 } 18595 v.reset(OpOr16) 18596 v.AddArg(x) 18597 v.AddArg(y) 18598 return true 18599 } 18600 // match: (Or16 (Or16 x y) x) 18601 // cond: 18602 // result: (Or16 x y) 18603 for { 18604 _ = v.Args[1] 18605 v_0 := v.Args[0] 18606 if v_0.Op != OpOr16 { 18607 break 18608 } 18609 _ = v_0.Args[1] 18610 x := v_0.Args[0] 18611 y := v_0.Args[1] 18612 if x != v.Args[1] { 18613 break 18614 } 18615 v.reset(OpOr16) 18616 v.AddArg(x) 18617 v.AddArg(y) 18618 return true 18619 } 18620 return false 18621 } 18622 func rewriteValuegeneric_OpOr16_10(v *Value) bool { 18623 b := v.Block 18624 _ = b 18625 // match: (Or16 (Or16 y x) x) 18626 // cond: 18627 // result: (Or16 x y) 18628 for { 18629 _ = v.Args[1] 18630 v_0 := v.Args[0] 18631 if v_0.Op != OpOr16 { 18632 break 18633 } 18634 _ = v_0.Args[1] 18635 y := v_0.Args[0] 18636 x := v_0.Args[1] 18637 if x != v.Args[1] { 18638 break 18639 } 18640 v.reset(OpOr16) 18641 v.AddArg(x) 18642 v.AddArg(y) 18643 return true 18644 } 18645 // match: (Or16 (And16 x (Const16 [c2])) (Const16 <t> [c1])) 18646 // cond: ^(c1 | c2) == 0 18647 // result: (Or16 (Const16 <t> [c1]) x) 18648 for { 18649 _ = v.Args[1] 18650 v_0 := v.Args[0] 18651 if v_0.Op != OpAnd16 { 18652 break 18653 } 18654 _ = v_0.Args[1] 18655 x := v_0.Args[0] 18656 v_0_1 := v_0.Args[1] 18657 if v_0_1.Op != OpConst16 { 18658 break 18659 } 18660 c2 := v_0_1.AuxInt 18661 v_1 := v.Args[1] 18662 if v_1.Op != OpConst16 { 18663 break 18664 } 18665 t := v_1.Type 18666 c1 := v_1.AuxInt 18667 if !(^(c1 | c2) == 0) { 18668 break 18669 } 18670 v.reset(OpOr16) 18671 v0 := b.NewValue0(v.Pos, OpConst16, t) 18672 v0.AuxInt = c1 18673 v.AddArg(v0) 18674 v.AddArg(x) 18675 return true 18676 } 18677 // match: (Or16 (And16 (Const16 [c2]) x) (Const16 <t> [c1])) 18678 // cond: ^(c1 | c2) == 0 18679 // result: (Or16 (Const16 <t> [c1]) x) 18680 for { 18681 _ = v.Args[1] 18682 v_0 := v.Args[0] 18683 if v_0.Op != OpAnd16 { 18684 break 18685 } 18686 _ = v_0.Args[1] 18687 v_0_0 := v_0.Args[0] 18688 if v_0_0.Op != OpConst16 { 18689 break 18690 } 18691 c2 := v_0_0.AuxInt 18692 x := v_0.Args[1] 18693 v_1 := v.Args[1] 18694 if v_1.Op != OpConst16 { 18695 break 18696 } 18697 t := v_1.Type 18698 c1 := v_1.AuxInt 18699 if !(^(c1 | c2) == 0) { 18700 break 18701 } 18702 v.reset(OpOr16) 18703 v0 := b.NewValue0(v.Pos, OpConst16, t) 18704 v0.AuxInt = c1 18705 v.AddArg(v0) 18706 v.AddArg(x) 18707 return true 18708 } 18709 // match: (Or16 (Const16 <t> [c1]) (And16 x (Const16 [c2]))) 18710 // cond: ^(c1 | c2) == 0 18711 // result: (Or16 (Const16 <t> [c1]) x) 18712 for { 18713 _ = v.Args[1] 18714 v_0 := v.Args[0] 18715 if v_0.Op != OpConst16 { 18716 break 18717 } 18718 t := v_0.Type 18719 c1 := v_0.AuxInt 18720 v_1 := v.Args[1] 18721 if v_1.Op != OpAnd16 { 18722 break 18723 } 18724 _ = v_1.Args[1] 18725 x := v_1.Args[0] 18726 v_1_1 := v_1.Args[1] 18727 if v_1_1.Op != OpConst16 { 18728 break 18729 } 18730 c2 := v_1_1.AuxInt 18731 if !(^(c1 | c2) == 0) { 18732 break 18733 } 18734 v.reset(OpOr16) 18735 v0 := b.NewValue0(v.Pos, OpConst16, t) 18736 v0.AuxInt = c1 18737 v.AddArg(v0) 18738 v.AddArg(x) 18739 return true 18740 } 18741 // match: (Or16 (Const16 <t> [c1]) (And16 (Const16 [c2]) x)) 18742 // cond: ^(c1 | c2) == 0 18743 // result: (Or16 (Const16 <t> [c1]) x) 18744 for { 18745 _ = v.Args[1] 18746 v_0 := v.Args[0] 18747 if v_0.Op != OpConst16 { 18748 break 18749 } 18750 t := v_0.Type 18751 c1 := v_0.AuxInt 18752 v_1 := v.Args[1] 18753 if v_1.Op != OpAnd16 { 18754 break 18755 } 18756 _ = v_1.Args[1] 18757 v_1_0 := v_1.Args[0] 18758 if v_1_0.Op != OpConst16 { 18759 break 18760 } 18761 c2 := v_1_0.AuxInt 18762 x := v_1.Args[1] 18763 if !(^(c1 | c2) == 0) { 18764 break 18765 } 18766 v.reset(OpOr16) 18767 v0 := b.NewValue0(v.Pos, OpConst16, t) 18768 v0.AuxInt = c1 18769 v.AddArg(v0) 18770 v.AddArg(x) 18771 return true 18772 } 18773 // match: (Or16 (Or16 i:(Const16 <t>) z) x) 18774 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 18775 // result: (Or16 i (Or16 <t> z x)) 18776 for { 18777 _ = v.Args[1] 18778 v_0 := v.Args[0] 18779 if v_0.Op != OpOr16 { 18780 break 18781 } 18782 _ = v_0.Args[1] 18783 i := v_0.Args[0] 18784 if i.Op != OpConst16 { 18785 break 18786 } 18787 t := i.Type 18788 z := v_0.Args[1] 18789 x := v.Args[1] 18790 if !(z.Op != OpConst16 && x.Op != OpConst16) { 18791 break 18792 } 18793 v.reset(OpOr16) 18794 v.AddArg(i) 18795 v0 := b.NewValue0(v.Pos, OpOr16, t) 18796 v0.AddArg(z) 18797 v0.AddArg(x) 18798 v.AddArg(v0) 18799 return true 18800 } 18801 // match: (Or16 (Or16 z i:(Const16 <t>)) x) 18802 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 18803 // result: (Or16 i (Or16 <t> z x)) 18804 for { 18805 _ = v.Args[1] 18806 v_0 := v.Args[0] 18807 if v_0.Op != OpOr16 { 18808 break 18809 } 18810 _ = v_0.Args[1] 18811 z := v_0.Args[0] 18812 i := v_0.Args[1] 18813 if i.Op != OpConst16 { 18814 break 18815 } 18816 t := i.Type 18817 x := v.Args[1] 18818 if !(z.Op != OpConst16 && x.Op != OpConst16) { 18819 break 18820 } 18821 v.reset(OpOr16) 18822 v.AddArg(i) 18823 v0 := b.NewValue0(v.Pos, OpOr16, t) 18824 v0.AddArg(z) 18825 v0.AddArg(x) 18826 v.AddArg(v0) 18827 return true 18828 } 18829 // match: (Or16 x (Or16 i:(Const16 <t>) z)) 18830 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 18831 // result: (Or16 i (Or16 <t> z x)) 18832 for { 18833 _ = v.Args[1] 18834 x := v.Args[0] 18835 v_1 := v.Args[1] 18836 if v_1.Op != OpOr16 { 18837 break 18838 } 18839 _ = v_1.Args[1] 18840 i := v_1.Args[0] 18841 if i.Op != OpConst16 { 18842 break 18843 } 18844 t := i.Type 18845 z := v_1.Args[1] 18846 if !(z.Op != OpConst16 && x.Op != OpConst16) { 18847 break 18848 } 18849 v.reset(OpOr16) 18850 v.AddArg(i) 18851 v0 := b.NewValue0(v.Pos, OpOr16, t) 18852 v0.AddArg(z) 18853 v0.AddArg(x) 18854 v.AddArg(v0) 18855 return true 18856 } 18857 // match: (Or16 x (Or16 z i:(Const16 <t>))) 18858 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 18859 // result: (Or16 i (Or16 <t> z x)) 18860 for { 18861 _ = v.Args[1] 18862 x := v.Args[0] 18863 v_1 := v.Args[1] 18864 if v_1.Op != OpOr16 { 18865 break 18866 } 18867 _ = v_1.Args[1] 18868 z := v_1.Args[0] 18869 i := v_1.Args[1] 18870 if i.Op != OpConst16 { 18871 break 18872 } 18873 t := i.Type 18874 if !(z.Op != OpConst16 && x.Op != OpConst16) { 18875 break 18876 } 18877 v.reset(OpOr16) 18878 v.AddArg(i) 18879 v0 := b.NewValue0(v.Pos, OpOr16, t) 18880 v0.AddArg(z) 18881 v0.AddArg(x) 18882 v.AddArg(v0) 18883 return true 18884 } 18885 // match: (Or16 (Const16 <t> [c]) (Or16 (Const16 <t> [d]) x)) 18886 // cond: 18887 // result: (Or16 (Const16 <t> [int64(int16(c|d))]) x) 18888 for { 18889 _ = v.Args[1] 18890 v_0 := v.Args[0] 18891 if v_0.Op != OpConst16 { 18892 break 18893 } 18894 t := v_0.Type 18895 c := v_0.AuxInt 18896 v_1 := v.Args[1] 18897 if v_1.Op != OpOr16 { 18898 break 18899 } 18900 _ = v_1.Args[1] 18901 v_1_0 := v_1.Args[0] 18902 if v_1_0.Op != OpConst16 { 18903 break 18904 } 18905 if v_1_0.Type != t { 18906 break 18907 } 18908 d := v_1_0.AuxInt 18909 x := v_1.Args[1] 18910 v.reset(OpOr16) 18911 v0 := b.NewValue0(v.Pos, OpConst16, t) 18912 v0.AuxInt = int64(int16(c | d)) 18913 v.AddArg(v0) 18914 v.AddArg(x) 18915 return true 18916 } 18917 return false 18918 } 18919 func rewriteValuegeneric_OpOr16_20(v *Value) bool { 18920 b := v.Block 18921 _ = b 18922 // match: (Or16 (Const16 <t> [c]) (Or16 x (Const16 <t> [d]))) 18923 // cond: 18924 // result: (Or16 (Const16 <t> [int64(int16(c|d))]) x) 18925 for { 18926 _ = v.Args[1] 18927 v_0 := v.Args[0] 18928 if v_0.Op != OpConst16 { 18929 break 18930 } 18931 t := v_0.Type 18932 c := v_0.AuxInt 18933 v_1 := v.Args[1] 18934 if v_1.Op != OpOr16 { 18935 break 18936 } 18937 _ = v_1.Args[1] 18938 x := v_1.Args[0] 18939 v_1_1 := v_1.Args[1] 18940 if v_1_1.Op != OpConst16 { 18941 break 18942 } 18943 if v_1_1.Type != t { 18944 break 18945 } 18946 d := v_1_1.AuxInt 18947 v.reset(OpOr16) 18948 v0 := b.NewValue0(v.Pos, OpConst16, t) 18949 v0.AuxInt = int64(int16(c | d)) 18950 v.AddArg(v0) 18951 v.AddArg(x) 18952 return true 18953 } 18954 // match: (Or16 (Or16 (Const16 <t> [d]) x) (Const16 <t> [c])) 18955 // cond: 18956 // result: (Or16 (Const16 <t> [int64(int16(c|d))]) x) 18957 for { 18958 _ = v.Args[1] 18959 v_0 := v.Args[0] 18960 if v_0.Op != OpOr16 { 18961 break 18962 } 18963 _ = v_0.Args[1] 18964 v_0_0 := v_0.Args[0] 18965 if v_0_0.Op != OpConst16 { 18966 break 18967 } 18968 t := v_0_0.Type 18969 d := v_0_0.AuxInt 18970 x := v_0.Args[1] 18971 v_1 := v.Args[1] 18972 if v_1.Op != OpConst16 { 18973 break 18974 } 18975 if v_1.Type != t { 18976 break 18977 } 18978 c := v_1.AuxInt 18979 v.reset(OpOr16) 18980 v0 := b.NewValue0(v.Pos, OpConst16, t) 18981 v0.AuxInt = int64(int16(c | d)) 18982 v.AddArg(v0) 18983 v.AddArg(x) 18984 return true 18985 } 18986 // match: (Or16 (Or16 x (Const16 <t> [d])) (Const16 <t> [c])) 18987 // cond: 18988 // result: (Or16 (Const16 <t> [int64(int16(c|d))]) x) 18989 for { 18990 _ = v.Args[1] 18991 v_0 := v.Args[0] 18992 if v_0.Op != OpOr16 { 18993 break 18994 } 18995 _ = v_0.Args[1] 18996 x := v_0.Args[0] 18997 v_0_1 := v_0.Args[1] 18998 if v_0_1.Op != OpConst16 { 18999 break 19000 } 19001 t := v_0_1.Type 19002 d := v_0_1.AuxInt 19003 v_1 := v.Args[1] 19004 if v_1.Op != OpConst16 { 19005 break 19006 } 19007 if v_1.Type != t { 19008 break 19009 } 19010 c := v_1.AuxInt 19011 v.reset(OpOr16) 19012 v0 := b.NewValue0(v.Pos, OpConst16, t) 19013 v0.AuxInt = int64(int16(c | d)) 19014 v.AddArg(v0) 19015 v.AddArg(x) 19016 return true 19017 } 19018 return false 19019 } 19020 func rewriteValuegeneric_OpOr32_0(v *Value) bool { 19021 // match: (Or32 (Const32 [c]) (Const32 [d])) 19022 // cond: 19023 // result: (Const32 [int64(int32(c|d))]) 19024 for { 19025 _ = v.Args[1] 19026 v_0 := v.Args[0] 19027 if v_0.Op != OpConst32 { 19028 break 19029 } 19030 c := v_0.AuxInt 19031 v_1 := v.Args[1] 19032 if v_1.Op != OpConst32 { 19033 break 19034 } 19035 d := v_1.AuxInt 19036 v.reset(OpConst32) 19037 v.AuxInt = int64(int32(c | d)) 19038 return true 19039 } 19040 // match: (Or32 (Const32 [d]) (Const32 [c])) 19041 // cond: 19042 // result: (Const32 [int64(int32(c|d))]) 19043 for { 19044 _ = v.Args[1] 19045 v_0 := v.Args[0] 19046 if v_0.Op != OpConst32 { 19047 break 19048 } 19049 d := v_0.AuxInt 19050 v_1 := v.Args[1] 19051 if v_1.Op != OpConst32 { 19052 break 19053 } 19054 c := v_1.AuxInt 19055 v.reset(OpConst32) 19056 v.AuxInt = int64(int32(c | d)) 19057 return true 19058 } 19059 // match: (Or32 x x) 19060 // cond: 19061 // result: x 19062 for { 19063 _ = v.Args[1] 19064 x := v.Args[0] 19065 if x != v.Args[1] { 19066 break 19067 } 19068 v.reset(OpCopy) 19069 v.Type = x.Type 19070 v.AddArg(x) 19071 return true 19072 } 19073 // match: (Or32 (Const32 [0]) x) 19074 // cond: 19075 // result: x 19076 for { 19077 _ = v.Args[1] 19078 v_0 := v.Args[0] 19079 if v_0.Op != OpConst32 { 19080 break 19081 } 19082 if v_0.AuxInt != 0 { 19083 break 19084 } 19085 x := v.Args[1] 19086 v.reset(OpCopy) 19087 v.Type = x.Type 19088 v.AddArg(x) 19089 return true 19090 } 19091 // match: (Or32 x (Const32 [0])) 19092 // cond: 19093 // result: x 19094 for { 19095 _ = v.Args[1] 19096 x := v.Args[0] 19097 v_1 := v.Args[1] 19098 if v_1.Op != OpConst32 { 19099 break 19100 } 19101 if v_1.AuxInt != 0 { 19102 break 19103 } 19104 v.reset(OpCopy) 19105 v.Type = x.Type 19106 v.AddArg(x) 19107 return true 19108 } 19109 // match: (Or32 (Const32 [-1]) _) 19110 // cond: 19111 // result: (Const32 [-1]) 19112 for { 19113 _ = v.Args[1] 19114 v_0 := v.Args[0] 19115 if v_0.Op != OpConst32 { 19116 break 19117 } 19118 if v_0.AuxInt != -1 { 19119 break 19120 } 19121 v.reset(OpConst32) 19122 v.AuxInt = -1 19123 return true 19124 } 19125 // match: (Or32 _ (Const32 [-1])) 19126 // cond: 19127 // result: (Const32 [-1]) 19128 for { 19129 _ = v.Args[1] 19130 v_1 := v.Args[1] 19131 if v_1.Op != OpConst32 { 19132 break 19133 } 19134 if v_1.AuxInt != -1 { 19135 break 19136 } 19137 v.reset(OpConst32) 19138 v.AuxInt = -1 19139 return true 19140 } 19141 // match: (Or32 x (Or32 x y)) 19142 // cond: 19143 // result: (Or32 x y) 19144 for { 19145 _ = v.Args[1] 19146 x := v.Args[0] 19147 v_1 := v.Args[1] 19148 if v_1.Op != OpOr32 { 19149 break 19150 } 19151 _ = v_1.Args[1] 19152 if x != v_1.Args[0] { 19153 break 19154 } 19155 y := v_1.Args[1] 19156 v.reset(OpOr32) 19157 v.AddArg(x) 19158 v.AddArg(y) 19159 return true 19160 } 19161 // match: (Or32 x (Or32 y x)) 19162 // cond: 19163 // result: (Or32 x y) 19164 for { 19165 _ = v.Args[1] 19166 x := v.Args[0] 19167 v_1 := v.Args[1] 19168 if v_1.Op != OpOr32 { 19169 break 19170 } 19171 _ = v_1.Args[1] 19172 y := v_1.Args[0] 19173 if x != v_1.Args[1] { 19174 break 19175 } 19176 v.reset(OpOr32) 19177 v.AddArg(x) 19178 v.AddArg(y) 19179 return true 19180 } 19181 // match: (Or32 (Or32 x y) x) 19182 // cond: 19183 // result: (Or32 x y) 19184 for { 19185 _ = v.Args[1] 19186 v_0 := v.Args[0] 19187 if v_0.Op != OpOr32 { 19188 break 19189 } 19190 _ = v_0.Args[1] 19191 x := v_0.Args[0] 19192 y := v_0.Args[1] 19193 if x != v.Args[1] { 19194 break 19195 } 19196 v.reset(OpOr32) 19197 v.AddArg(x) 19198 v.AddArg(y) 19199 return true 19200 } 19201 return false 19202 } 19203 func rewriteValuegeneric_OpOr32_10(v *Value) bool { 19204 b := v.Block 19205 _ = b 19206 // match: (Or32 (Or32 y x) x) 19207 // cond: 19208 // result: (Or32 x y) 19209 for { 19210 _ = v.Args[1] 19211 v_0 := v.Args[0] 19212 if v_0.Op != OpOr32 { 19213 break 19214 } 19215 _ = v_0.Args[1] 19216 y := v_0.Args[0] 19217 x := v_0.Args[1] 19218 if x != v.Args[1] { 19219 break 19220 } 19221 v.reset(OpOr32) 19222 v.AddArg(x) 19223 v.AddArg(y) 19224 return true 19225 } 19226 // match: (Or32 (And32 x (Const32 [c2])) (Const32 <t> [c1])) 19227 // cond: ^(c1 | c2) == 0 19228 // result: (Or32 (Const32 <t> [c1]) x) 19229 for { 19230 _ = v.Args[1] 19231 v_0 := v.Args[0] 19232 if v_0.Op != OpAnd32 { 19233 break 19234 } 19235 _ = v_0.Args[1] 19236 x := v_0.Args[0] 19237 v_0_1 := v_0.Args[1] 19238 if v_0_1.Op != OpConst32 { 19239 break 19240 } 19241 c2 := v_0_1.AuxInt 19242 v_1 := v.Args[1] 19243 if v_1.Op != OpConst32 { 19244 break 19245 } 19246 t := v_1.Type 19247 c1 := v_1.AuxInt 19248 if !(^(c1 | c2) == 0) { 19249 break 19250 } 19251 v.reset(OpOr32) 19252 v0 := b.NewValue0(v.Pos, OpConst32, t) 19253 v0.AuxInt = c1 19254 v.AddArg(v0) 19255 v.AddArg(x) 19256 return true 19257 } 19258 // match: (Or32 (And32 (Const32 [c2]) x) (Const32 <t> [c1])) 19259 // cond: ^(c1 | c2) == 0 19260 // result: (Or32 (Const32 <t> [c1]) x) 19261 for { 19262 _ = v.Args[1] 19263 v_0 := v.Args[0] 19264 if v_0.Op != OpAnd32 { 19265 break 19266 } 19267 _ = v_0.Args[1] 19268 v_0_0 := v_0.Args[0] 19269 if v_0_0.Op != OpConst32 { 19270 break 19271 } 19272 c2 := v_0_0.AuxInt 19273 x := v_0.Args[1] 19274 v_1 := v.Args[1] 19275 if v_1.Op != OpConst32 { 19276 break 19277 } 19278 t := v_1.Type 19279 c1 := v_1.AuxInt 19280 if !(^(c1 | c2) == 0) { 19281 break 19282 } 19283 v.reset(OpOr32) 19284 v0 := b.NewValue0(v.Pos, OpConst32, t) 19285 v0.AuxInt = c1 19286 v.AddArg(v0) 19287 v.AddArg(x) 19288 return true 19289 } 19290 // match: (Or32 (Const32 <t> [c1]) (And32 x (Const32 [c2]))) 19291 // cond: ^(c1 | c2) == 0 19292 // result: (Or32 (Const32 <t> [c1]) x) 19293 for { 19294 _ = v.Args[1] 19295 v_0 := v.Args[0] 19296 if v_0.Op != OpConst32 { 19297 break 19298 } 19299 t := v_0.Type 19300 c1 := v_0.AuxInt 19301 v_1 := v.Args[1] 19302 if v_1.Op != OpAnd32 { 19303 break 19304 } 19305 _ = v_1.Args[1] 19306 x := v_1.Args[0] 19307 v_1_1 := v_1.Args[1] 19308 if v_1_1.Op != OpConst32 { 19309 break 19310 } 19311 c2 := v_1_1.AuxInt 19312 if !(^(c1 | c2) == 0) { 19313 break 19314 } 19315 v.reset(OpOr32) 19316 v0 := b.NewValue0(v.Pos, OpConst32, t) 19317 v0.AuxInt = c1 19318 v.AddArg(v0) 19319 v.AddArg(x) 19320 return true 19321 } 19322 // match: (Or32 (Const32 <t> [c1]) (And32 (Const32 [c2]) x)) 19323 // cond: ^(c1 | c2) == 0 19324 // result: (Or32 (Const32 <t> [c1]) x) 19325 for { 19326 _ = v.Args[1] 19327 v_0 := v.Args[0] 19328 if v_0.Op != OpConst32 { 19329 break 19330 } 19331 t := v_0.Type 19332 c1 := v_0.AuxInt 19333 v_1 := v.Args[1] 19334 if v_1.Op != OpAnd32 { 19335 break 19336 } 19337 _ = v_1.Args[1] 19338 v_1_0 := v_1.Args[0] 19339 if v_1_0.Op != OpConst32 { 19340 break 19341 } 19342 c2 := v_1_0.AuxInt 19343 x := v_1.Args[1] 19344 if !(^(c1 | c2) == 0) { 19345 break 19346 } 19347 v.reset(OpOr32) 19348 v0 := b.NewValue0(v.Pos, OpConst32, t) 19349 v0.AuxInt = c1 19350 v.AddArg(v0) 19351 v.AddArg(x) 19352 return true 19353 } 19354 // match: (Or32 (Or32 i:(Const32 <t>) z) x) 19355 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 19356 // result: (Or32 i (Or32 <t> z x)) 19357 for { 19358 _ = v.Args[1] 19359 v_0 := v.Args[0] 19360 if v_0.Op != OpOr32 { 19361 break 19362 } 19363 _ = v_0.Args[1] 19364 i := v_0.Args[0] 19365 if i.Op != OpConst32 { 19366 break 19367 } 19368 t := i.Type 19369 z := v_0.Args[1] 19370 x := v.Args[1] 19371 if !(z.Op != OpConst32 && x.Op != OpConst32) { 19372 break 19373 } 19374 v.reset(OpOr32) 19375 v.AddArg(i) 19376 v0 := b.NewValue0(v.Pos, OpOr32, t) 19377 v0.AddArg(z) 19378 v0.AddArg(x) 19379 v.AddArg(v0) 19380 return true 19381 } 19382 // match: (Or32 (Or32 z i:(Const32 <t>)) x) 19383 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 19384 // result: (Or32 i (Or32 <t> z x)) 19385 for { 19386 _ = v.Args[1] 19387 v_0 := v.Args[0] 19388 if v_0.Op != OpOr32 { 19389 break 19390 } 19391 _ = v_0.Args[1] 19392 z := v_0.Args[0] 19393 i := v_0.Args[1] 19394 if i.Op != OpConst32 { 19395 break 19396 } 19397 t := i.Type 19398 x := v.Args[1] 19399 if !(z.Op != OpConst32 && x.Op != OpConst32) { 19400 break 19401 } 19402 v.reset(OpOr32) 19403 v.AddArg(i) 19404 v0 := b.NewValue0(v.Pos, OpOr32, t) 19405 v0.AddArg(z) 19406 v0.AddArg(x) 19407 v.AddArg(v0) 19408 return true 19409 } 19410 // match: (Or32 x (Or32 i:(Const32 <t>) z)) 19411 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 19412 // result: (Or32 i (Or32 <t> z x)) 19413 for { 19414 _ = v.Args[1] 19415 x := v.Args[0] 19416 v_1 := v.Args[1] 19417 if v_1.Op != OpOr32 { 19418 break 19419 } 19420 _ = v_1.Args[1] 19421 i := v_1.Args[0] 19422 if i.Op != OpConst32 { 19423 break 19424 } 19425 t := i.Type 19426 z := v_1.Args[1] 19427 if !(z.Op != OpConst32 && x.Op != OpConst32) { 19428 break 19429 } 19430 v.reset(OpOr32) 19431 v.AddArg(i) 19432 v0 := b.NewValue0(v.Pos, OpOr32, t) 19433 v0.AddArg(z) 19434 v0.AddArg(x) 19435 v.AddArg(v0) 19436 return true 19437 } 19438 // match: (Or32 x (Or32 z i:(Const32 <t>))) 19439 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 19440 // result: (Or32 i (Or32 <t> z x)) 19441 for { 19442 _ = v.Args[1] 19443 x := v.Args[0] 19444 v_1 := v.Args[1] 19445 if v_1.Op != OpOr32 { 19446 break 19447 } 19448 _ = v_1.Args[1] 19449 z := v_1.Args[0] 19450 i := v_1.Args[1] 19451 if i.Op != OpConst32 { 19452 break 19453 } 19454 t := i.Type 19455 if !(z.Op != OpConst32 && x.Op != OpConst32) { 19456 break 19457 } 19458 v.reset(OpOr32) 19459 v.AddArg(i) 19460 v0 := b.NewValue0(v.Pos, OpOr32, t) 19461 v0.AddArg(z) 19462 v0.AddArg(x) 19463 v.AddArg(v0) 19464 return true 19465 } 19466 // match: (Or32 (Const32 <t> [c]) (Or32 (Const32 <t> [d]) x)) 19467 // cond: 19468 // result: (Or32 (Const32 <t> [int64(int32(c|d))]) x) 19469 for { 19470 _ = v.Args[1] 19471 v_0 := v.Args[0] 19472 if v_0.Op != OpConst32 { 19473 break 19474 } 19475 t := v_0.Type 19476 c := v_0.AuxInt 19477 v_1 := v.Args[1] 19478 if v_1.Op != OpOr32 { 19479 break 19480 } 19481 _ = v_1.Args[1] 19482 v_1_0 := v_1.Args[0] 19483 if v_1_0.Op != OpConst32 { 19484 break 19485 } 19486 if v_1_0.Type != t { 19487 break 19488 } 19489 d := v_1_0.AuxInt 19490 x := v_1.Args[1] 19491 v.reset(OpOr32) 19492 v0 := b.NewValue0(v.Pos, OpConst32, t) 19493 v0.AuxInt = int64(int32(c | d)) 19494 v.AddArg(v0) 19495 v.AddArg(x) 19496 return true 19497 } 19498 return false 19499 } 19500 func rewriteValuegeneric_OpOr32_20(v *Value) bool { 19501 b := v.Block 19502 _ = b 19503 // match: (Or32 (Const32 <t> [c]) (Or32 x (Const32 <t> [d]))) 19504 // cond: 19505 // result: (Or32 (Const32 <t> [int64(int32(c|d))]) x) 19506 for { 19507 _ = v.Args[1] 19508 v_0 := v.Args[0] 19509 if v_0.Op != OpConst32 { 19510 break 19511 } 19512 t := v_0.Type 19513 c := v_0.AuxInt 19514 v_1 := v.Args[1] 19515 if v_1.Op != OpOr32 { 19516 break 19517 } 19518 _ = v_1.Args[1] 19519 x := v_1.Args[0] 19520 v_1_1 := v_1.Args[1] 19521 if v_1_1.Op != OpConst32 { 19522 break 19523 } 19524 if v_1_1.Type != t { 19525 break 19526 } 19527 d := v_1_1.AuxInt 19528 v.reset(OpOr32) 19529 v0 := b.NewValue0(v.Pos, OpConst32, t) 19530 v0.AuxInt = int64(int32(c | d)) 19531 v.AddArg(v0) 19532 v.AddArg(x) 19533 return true 19534 } 19535 // match: (Or32 (Or32 (Const32 <t> [d]) x) (Const32 <t> [c])) 19536 // cond: 19537 // result: (Or32 (Const32 <t> [int64(int32(c|d))]) x) 19538 for { 19539 _ = v.Args[1] 19540 v_0 := v.Args[0] 19541 if v_0.Op != OpOr32 { 19542 break 19543 } 19544 _ = v_0.Args[1] 19545 v_0_0 := v_0.Args[0] 19546 if v_0_0.Op != OpConst32 { 19547 break 19548 } 19549 t := v_0_0.Type 19550 d := v_0_0.AuxInt 19551 x := v_0.Args[1] 19552 v_1 := v.Args[1] 19553 if v_1.Op != OpConst32 { 19554 break 19555 } 19556 if v_1.Type != t { 19557 break 19558 } 19559 c := v_1.AuxInt 19560 v.reset(OpOr32) 19561 v0 := b.NewValue0(v.Pos, OpConst32, t) 19562 v0.AuxInt = int64(int32(c | d)) 19563 v.AddArg(v0) 19564 v.AddArg(x) 19565 return true 19566 } 19567 // match: (Or32 (Or32 x (Const32 <t> [d])) (Const32 <t> [c])) 19568 // cond: 19569 // result: (Or32 (Const32 <t> [int64(int32(c|d))]) x) 19570 for { 19571 _ = v.Args[1] 19572 v_0 := v.Args[0] 19573 if v_0.Op != OpOr32 { 19574 break 19575 } 19576 _ = v_0.Args[1] 19577 x := v_0.Args[0] 19578 v_0_1 := v_0.Args[1] 19579 if v_0_1.Op != OpConst32 { 19580 break 19581 } 19582 t := v_0_1.Type 19583 d := v_0_1.AuxInt 19584 v_1 := v.Args[1] 19585 if v_1.Op != OpConst32 { 19586 break 19587 } 19588 if v_1.Type != t { 19589 break 19590 } 19591 c := v_1.AuxInt 19592 v.reset(OpOr32) 19593 v0 := b.NewValue0(v.Pos, OpConst32, t) 19594 v0.AuxInt = int64(int32(c | d)) 19595 v.AddArg(v0) 19596 v.AddArg(x) 19597 return true 19598 } 19599 return false 19600 } 19601 func rewriteValuegeneric_OpOr64_0(v *Value) bool { 19602 // match: (Or64 (Const64 [c]) (Const64 [d])) 19603 // cond: 19604 // result: (Const64 [c|d]) 19605 for { 19606 _ = v.Args[1] 19607 v_0 := v.Args[0] 19608 if v_0.Op != OpConst64 { 19609 break 19610 } 19611 c := v_0.AuxInt 19612 v_1 := v.Args[1] 19613 if v_1.Op != OpConst64 { 19614 break 19615 } 19616 d := v_1.AuxInt 19617 v.reset(OpConst64) 19618 v.AuxInt = c | d 19619 return true 19620 } 19621 // match: (Or64 (Const64 [d]) (Const64 [c])) 19622 // cond: 19623 // result: (Const64 [c|d]) 19624 for { 19625 _ = v.Args[1] 19626 v_0 := v.Args[0] 19627 if v_0.Op != OpConst64 { 19628 break 19629 } 19630 d := v_0.AuxInt 19631 v_1 := v.Args[1] 19632 if v_1.Op != OpConst64 { 19633 break 19634 } 19635 c := v_1.AuxInt 19636 v.reset(OpConst64) 19637 v.AuxInt = c | d 19638 return true 19639 } 19640 // match: (Or64 x x) 19641 // cond: 19642 // result: x 19643 for { 19644 _ = v.Args[1] 19645 x := v.Args[0] 19646 if x != v.Args[1] { 19647 break 19648 } 19649 v.reset(OpCopy) 19650 v.Type = x.Type 19651 v.AddArg(x) 19652 return true 19653 } 19654 // match: (Or64 (Const64 [0]) x) 19655 // cond: 19656 // result: x 19657 for { 19658 _ = v.Args[1] 19659 v_0 := v.Args[0] 19660 if v_0.Op != OpConst64 { 19661 break 19662 } 19663 if v_0.AuxInt != 0 { 19664 break 19665 } 19666 x := v.Args[1] 19667 v.reset(OpCopy) 19668 v.Type = x.Type 19669 v.AddArg(x) 19670 return true 19671 } 19672 // match: (Or64 x (Const64 [0])) 19673 // cond: 19674 // result: x 19675 for { 19676 _ = v.Args[1] 19677 x := v.Args[0] 19678 v_1 := v.Args[1] 19679 if v_1.Op != OpConst64 { 19680 break 19681 } 19682 if v_1.AuxInt != 0 { 19683 break 19684 } 19685 v.reset(OpCopy) 19686 v.Type = x.Type 19687 v.AddArg(x) 19688 return true 19689 } 19690 // match: (Or64 (Const64 [-1]) _) 19691 // cond: 19692 // result: (Const64 [-1]) 19693 for { 19694 _ = v.Args[1] 19695 v_0 := v.Args[0] 19696 if v_0.Op != OpConst64 { 19697 break 19698 } 19699 if v_0.AuxInt != -1 { 19700 break 19701 } 19702 v.reset(OpConst64) 19703 v.AuxInt = -1 19704 return true 19705 } 19706 // match: (Or64 _ (Const64 [-1])) 19707 // cond: 19708 // result: (Const64 [-1]) 19709 for { 19710 _ = v.Args[1] 19711 v_1 := v.Args[1] 19712 if v_1.Op != OpConst64 { 19713 break 19714 } 19715 if v_1.AuxInt != -1 { 19716 break 19717 } 19718 v.reset(OpConst64) 19719 v.AuxInt = -1 19720 return true 19721 } 19722 // match: (Or64 x (Or64 x y)) 19723 // cond: 19724 // result: (Or64 x y) 19725 for { 19726 _ = v.Args[1] 19727 x := v.Args[0] 19728 v_1 := v.Args[1] 19729 if v_1.Op != OpOr64 { 19730 break 19731 } 19732 _ = v_1.Args[1] 19733 if x != v_1.Args[0] { 19734 break 19735 } 19736 y := v_1.Args[1] 19737 v.reset(OpOr64) 19738 v.AddArg(x) 19739 v.AddArg(y) 19740 return true 19741 } 19742 // match: (Or64 x (Or64 y x)) 19743 // cond: 19744 // result: (Or64 x y) 19745 for { 19746 _ = v.Args[1] 19747 x := v.Args[0] 19748 v_1 := v.Args[1] 19749 if v_1.Op != OpOr64 { 19750 break 19751 } 19752 _ = v_1.Args[1] 19753 y := v_1.Args[0] 19754 if x != v_1.Args[1] { 19755 break 19756 } 19757 v.reset(OpOr64) 19758 v.AddArg(x) 19759 v.AddArg(y) 19760 return true 19761 } 19762 // match: (Or64 (Or64 x y) x) 19763 // cond: 19764 // result: (Or64 x y) 19765 for { 19766 _ = v.Args[1] 19767 v_0 := v.Args[0] 19768 if v_0.Op != OpOr64 { 19769 break 19770 } 19771 _ = v_0.Args[1] 19772 x := v_0.Args[0] 19773 y := v_0.Args[1] 19774 if x != v.Args[1] { 19775 break 19776 } 19777 v.reset(OpOr64) 19778 v.AddArg(x) 19779 v.AddArg(y) 19780 return true 19781 } 19782 return false 19783 } 19784 func rewriteValuegeneric_OpOr64_10(v *Value) bool { 19785 b := v.Block 19786 _ = b 19787 // match: (Or64 (Or64 y x) x) 19788 // cond: 19789 // result: (Or64 x y) 19790 for { 19791 _ = v.Args[1] 19792 v_0 := v.Args[0] 19793 if v_0.Op != OpOr64 { 19794 break 19795 } 19796 _ = v_0.Args[1] 19797 y := v_0.Args[0] 19798 x := v_0.Args[1] 19799 if x != v.Args[1] { 19800 break 19801 } 19802 v.reset(OpOr64) 19803 v.AddArg(x) 19804 v.AddArg(y) 19805 return true 19806 } 19807 // match: (Or64 (And64 x (Const64 [c2])) (Const64 <t> [c1])) 19808 // cond: ^(c1 | c2) == 0 19809 // result: (Or64 (Const64 <t> [c1]) x) 19810 for { 19811 _ = v.Args[1] 19812 v_0 := v.Args[0] 19813 if v_0.Op != OpAnd64 { 19814 break 19815 } 19816 _ = v_0.Args[1] 19817 x := v_0.Args[0] 19818 v_0_1 := v_0.Args[1] 19819 if v_0_1.Op != OpConst64 { 19820 break 19821 } 19822 c2 := v_0_1.AuxInt 19823 v_1 := v.Args[1] 19824 if v_1.Op != OpConst64 { 19825 break 19826 } 19827 t := v_1.Type 19828 c1 := v_1.AuxInt 19829 if !(^(c1 | c2) == 0) { 19830 break 19831 } 19832 v.reset(OpOr64) 19833 v0 := b.NewValue0(v.Pos, OpConst64, t) 19834 v0.AuxInt = c1 19835 v.AddArg(v0) 19836 v.AddArg(x) 19837 return true 19838 } 19839 // match: (Or64 (And64 (Const64 [c2]) x) (Const64 <t> [c1])) 19840 // cond: ^(c1 | c2) == 0 19841 // result: (Or64 (Const64 <t> [c1]) x) 19842 for { 19843 _ = v.Args[1] 19844 v_0 := v.Args[0] 19845 if v_0.Op != OpAnd64 { 19846 break 19847 } 19848 _ = v_0.Args[1] 19849 v_0_0 := v_0.Args[0] 19850 if v_0_0.Op != OpConst64 { 19851 break 19852 } 19853 c2 := v_0_0.AuxInt 19854 x := v_0.Args[1] 19855 v_1 := v.Args[1] 19856 if v_1.Op != OpConst64 { 19857 break 19858 } 19859 t := v_1.Type 19860 c1 := v_1.AuxInt 19861 if !(^(c1 | c2) == 0) { 19862 break 19863 } 19864 v.reset(OpOr64) 19865 v0 := b.NewValue0(v.Pos, OpConst64, t) 19866 v0.AuxInt = c1 19867 v.AddArg(v0) 19868 v.AddArg(x) 19869 return true 19870 } 19871 // match: (Or64 (Const64 <t> [c1]) (And64 x (Const64 [c2]))) 19872 // cond: ^(c1 | c2) == 0 19873 // result: (Or64 (Const64 <t> [c1]) x) 19874 for { 19875 _ = v.Args[1] 19876 v_0 := v.Args[0] 19877 if v_0.Op != OpConst64 { 19878 break 19879 } 19880 t := v_0.Type 19881 c1 := v_0.AuxInt 19882 v_1 := v.Args[1] 19883 if v_1.Op != OpAnd64 { 19884 break 19885 } 19886 _ = v_1.Args[1] 19887 x := v_1.Args[0] 19888 v_1_1 := v_1.Args[1] 19889 if v_1_1.Op != OpConst64 { 19890 break 19891 } 19892 c2 := v_1_1.AuxInt 19893 if !(^(c1 | c2) == 0) { 19894 break 19895 } 19896 v.reset(OpOr64) 19897 v0 := b.NewValue0(v.Pos, OpConst64, t) 19898 v0.AuxInt = c1 19899 v.AddArg(v0) 19900 v.AddArg(x) 19901 return true 19902 } 19903 // match: (Or64 (Const64 <t> [c1]) (And64 (Const64 [c2]) x)) 19904 // cond: ^(c1 | c2) == 0 19905 // result: (Or64 (Const64 <t> [c1]) x) 19906 for { 19907 _ = v.Args[1] 19908 v_0 := v.Args[0] 19909 if v_0.Op != OpConst64 { 19910 break 19911 } 19912 t := v_0.Type 19913 c1 := v_0.AuxInt 19914 v_1 := v.Args[1] 19915 if v_1.Op != OpAnd64 { 19916 break 19917 } 19918 _ = v_1.Args[1] 19919 v_1_0 := v_1.Args[0] 19920 if v_1_0.Op != OpConst64 { 19921 break 19922 } 19923 c2 := v_1_0.AuxInt 19924 x := v_1.Args[1] 19925 if !(^(c1 | c2) == 0) { 19926 break 19927 } 19928 v.reset(OpOr64) 19929 v0 := b.NewValue0(v.Pos, OpConst64, t) 19930 v0.AuxInt = c1 19931 v.AddArg(v0) 19932 v.AddArg(x) 19933 return true 19934 } 19935 // match: (Or64 (Or64 i:(Const64 <t>) z) x) 19936 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 19937 // result: (Or64 i (Or64 <t> z x)) 19938 for { 19939 _ = v.Args[1] 19940 v_0 := v.Args[0] 19941 if v_0.Op != OpOr64 { 19942 break 19943 } 19944 _ = v_0.Args[1] 19945 i := v_0.Args[0] 19946 if i.Op != OpConst64 { 19947 break 19948 } 19949 t := i.Type 19950 z := v_0.Args[1] 19951 x := v.Args[1] 19952 if !(z.Op != OpConst64 && x.Op != OpConst64) { 19953 break 19954 } 19955 v.reset(OpOr64) 19956 v.AddArg(i) 19957 v0 := b.NewValue0(v.Pos, OpOr64, t) 19958 v0.AddArg(z) 19959 v0.AddArg(x) 19960 v.AddArg(v0) 19961 return true 19962 } 19963 // match: (Or64 (Or64 z i:(Const64 <t>)) x) 19964 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 19965 // result: (Or64 i (Or64 <t> z x)) 19966 for { 19967 _ = v.Args[1] 19968 v_0 := v.Args[0] 19969 if v_0.Op != OpOr64 { 19970 break 19971 } 19972 _ = v_0.Args[1] 19973 z := v_0.Args[0] 19974 i := v_0.Args[1] 19975 if i.Op != OpConst64 { 19976 break 19977 } 19978 t := i.Type 19979 x := v.Args[1] 19980 if !(z.Op != OpConst64 && x.Op != OpConst64) { 19981 break 19982 } 19983 v.reset(OpOr64) 19984 v.AddArg(i) 19985 v0 := b.NewValue0(v.Pos, OpOr64, t) 19986 v0.AddArg(z) 19987 v0.AddArg(x) 19988 v.AddArg(v0) 19989 return true 19990 } 19991 // match: (Or64 x (Or64 i:(Const64 <t>) z)) 19992 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 19993 // result: (Or64 i (Or64 <t> z x)) 19994 for { 19995 _ = v.Args[1] 19996 x := v.Args[0] 19997 v_1 := v.Args[1] 19998 if v_1.Op != OpOr64 { 19999 break 20000 } 20001 _ = v_1.Args[1] 20002 i := v_1.Args[0] 20003 if i.Op != OpConst64 { 20004 break 20005 } 20006 t := i.Type 20007 z := v_1.Args[1] 20008 if !(z.Op != OpConst64 && x.Op != OpConst64) { 20009 break 20010 } 20011 v.reset(OpOr64) 20012 v.AddArg(i) 20013 v0 := b.NewValue0(v.Pos, OpOr64, t) 20014 v0.AddArg(z) 20015 v0.AddArg(x) 20016 v.AddArg(v0) 20017 return true 20018 } 20019 // match: (Or64 x (Or64 z i:(Const64 <t>))) 20020 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 20021 // result: (Or64 i (Or64 <t> z x)) 20022 for { 20023 _ = v.Args[1] 20024 x := v.Args[0] 20025 v_1 := v.Args[1] 20026 if v_1.Op != OpOr64 { 20027 break 20028 } 20029 _ = v_1.Args[1] 20030 z := v_1.Args[0] 20031 i := v_1.Args[1] 20032 if i.Op != OpConst64 { 20033 break 20034 } 20035 t := i.Type 20036 if !(z.Op != OpConst64 && x.Op != OpConst64) { 20037 break 20038 } 20039 v.reset(OpOr64) 20040 v.AddArg(i) 20041 v0 := b.NewValue0(v.Pos, OpOr64, t) 20042 v0.AddArg(z) 20043 v0.AddArg(x) 20044 v.AddArg(v0) 20045 return true 20046 } 20047 // match: (Or64 (Const64 <t> [c]) (Or64 (Const64 <t> [d]) x)) 20048 // cond: 20049 // result: (Or64 (Const64 <t> [c|d]) x) 20050 for { 20051 _ = v.Args[1] 20052 v_0 := v.Args[0] 20053 if v_0.Op != OpConst64 { 20054 break 20055 } 20056 t := v_0.Type 20057 c := v_0.AuxInt 20058 v_1 := v.Args[1] 20059 if v_1.Op != OpOr64 { 20060 break 20061 } 20062 _ = v_1.Args[1] 20063 v_1_0 := v_1.Args[0] 20064 if v_1_0.Op != OpConst64 { 20065 break 20066 } 20067 if v_1_0.Type != t { 20068 break 20069 } 20070 d := v_1_0.AuxInt 20071 x := v_1.Args[1] 20072 v.reset(OpOr64) 20073 v0 := b.NewValue0(v.Pos, OpConst64, t) 20074 v0.AuxInt = c | d 20075 v.AddArg(v0) 20076 v.AddArg(x) 20077 return true 20078 } 20079 return false 20080 } 20081 func rewriteValuegeneric_OpOr64_20(v *Value) bool { 20082 b := v.Block 20083 _ = b 20084 // match: (Or64 (Const64 <t> [c]) (Or64 x (Const64 <t> [d]))) 20085 // cond: 20086 // result: (Or64 (Const64 <t> [c|d]) x) 20087 for { 20088 _ = v.Args[1] 20089 v_0 := v.Args[0] 20090 if v_0.Op != OpConst64 { 20091 break 20092 } 20093 t := v_0.Type 20094 c := v_0.AuxInt 20095 v_1 := v.Args[1] 20096 if v_1.Op != OpOr64 { 20097 break 20098 } 20099 _ = v_1.Args[1] 20100 x := v_1.Args[0] 20101 v_1_1 := v_1.Args[1] 20102 if v_1_1.Op != OpConst64 { 20103 break 20104 } 20105 if v_1_1.Type != t { 20106 break 20107 } 20108 d := v_1_1.AuxInt 20109 v.reset(OpOr64) 20110 v0 := b.NewValue0(v.Pos, OpConst64, t) 20111 v0.AuxInt = c | d 20112 v.AddArg(v0) 20113 v.AddArg(x) 20114 return true 20115 } 20116 // match: (Or64 (Or64 (Const64 <t> [d]) x) (Const64 <t> [c])) 20117 // cond: 20118 // result: (Or64 (Const64 <t> [c|d]) x) 20119 for { 20120 _ = v.Args[1] 20121 v_0 := v.Args[0] 20122 if v_0.Op != OpOr64 { 20123 break 20124 } 20125 _ = v_0.Args[1] 20126 v_0_0 := v_0.Args[0] 20127 if v_0_0.Op != OpConst64 { 20128 break 20129 } 20130 t := v_0_0.Type 20131 d := v_0_0.AuxInt 20132 x := v_0.Args[1] 20133 v_1 := v.Args[1] 20134 if v_1.Op != OpConst64 { 20135 break 20136 } 20137 if v_1.Type != t { 20138 break 20139 } 20140 c := v_1.AuxInt 20141 v.reset(OpOr64) 20142 v0 := b.NewValue0(v.Pos, OpConst64, t) 20143 v0.AuxInt = c | d 20144 v.AddArg(v0) 20145 v.AddArg(x) 20146 return true 20147 } 20148 // match: (Or64 (Or64 x (Const64 <t> [d])) (Const64 <t> [c])) 20149 // cond: 20150 // result: (Or64 (Const64 <t> [c|d]) x) 20151 for { 20152 _ = v.Args[1] 20153 v_0 := v.Args[0] 20154 if v_0.Op != OpOr64 { 20155 break 20156 } 20157 _ = v_0.Args[1] 20158 x := v_0.Args[0] 20159 v_0_1 := v_0.Args[1] 20160 if v_0_1.Op != OpConst64 { 20161 break 20162 } 20163 t := v_0_1.Type 20164 d := v_0_1.AuxInt 20165 v_1 := v.Args[1] 20166 if v_1.Op != OpConst64 { 20167 break 20168 } 20169 if v_1.Type != t { 20170 break 20171 } 20172 c := v_1.AuxInt 20173 v.reset(OpOr64) 20174 v0 := b.NewValue0(v.Pos, OpConst64, t) 20175 v0.AuxInt = c | d 20176 v.AddArg(v0) 20177 v.AddArg(x) 20178 return true 20179 } 20180 return false 20181 } 20182 func rewriteValuegeneric_OpOr8_0(v *Value) bool { 20183 // match: (Or8 (Const8 [c]) (Const8 [d])) 20184 // cond: 20185 // result: (Const8 [int64(int8(c|d))]) 20186 for { 20187 _ = v.Args[1] 20188 v_0 := v.Args[0] 20189 if v_0.Op != OpConst8 { 20190 break 20191 } 20192 c := v_0.AuxInt 20193 v_1 := v.Args[1] 20194 if v_1.Op != OpConst8 { 20195 break 20196 } 20197 d := v_1.AuxInt 20198 v.reset(OpConst8) 20199 v.AuxInt = int64(int8(c | d)) 20200 return true 20201 } 20202 // match: (Or8 (Const8 [d]) (Const8 [c])) 20203 // cond: 20204 // result: (Const8 [int64(int8(c|d))]) 20205 for { 20206 _ = v.Args[1] 20207 v_0 := v.Args[0] 20208 if v_0.Op != OpConst8 { 20209 break 20210 } 20211 d := v_0.AuxInt 20212 v_1 := v.Args[1] 20213 if v_1.Op != OpConst8 { 20214 break 20215 } 20216 c := v_1.AuxInt 20217 v.reset(OpConst8) 20218 v.AuxInt = int64(int8(c | d)) 20219 return true 20220 } 20221 // match: (Or8 x x) 20222 // cond: 20223 // result: x 20224 for { 20225 _ = v.Args[1] 20226 x := v.Args[0] 20227 if x != v.Args[1] { 20228 break 20229 } 20230 v.reset(OpCopy) 20231 v.Type = x.Type 20232 v.AddArg(x) 20233 return true 20234 } 20235 // match: (Or8 (Const8 [0]) x) 20236 // cond: 20237 // result: x 20238 for { 20239 _ = v.Args[1] 20240 v_0 := v.Args[0] 20241 if v_0.Op != OpConst8 { 20242 break 20243 } 20244 if v_0.AuxInt != 0 { 20245 break 20246 } 20247 x := v.Args[1] 20248 v.reset(OpCopy) 20249 v.Type = x.Type 20250 v.AddArg(x) 20251 return true 20252 } 20253 // match: (Or8 x (Const8 [0])) 20254 // cond: 20255 // result: x 20256 for { 20257 _ = v.Args[1] 20258 x := v.Args[0] 20259 v_1 := v.Args[1] 20260 if v_1.Op != OpConst8 { 20261 break 20262 } 20263 if v_1.AuxInt != 0 { 20264 break 20265 } 20266 v.reset(OpCopy) 20267 v.Type = x.Type 20268 v.AddArg(x) 20269 return true 20270 } 20271 // match: (Or8 (Const8 [-1]) _) 20272 // cond: 20273 // result: (Const8 [-1]) 20274 for { 20275 _ = v.Args[1] 20276 v_0 := v.Args[0] 20277 if v_0.Op != OpConst8 { 20278 break 20279 } 20280 if v_0.AuxInt != -1 { 20281 break 20282 } 20283 v.reset(OpConst8) 20284 v.AuxInt = -1 20285 return true 20286 } 20287 // match: (Or8 _ (Const8 [-1])) 20288 // cond: 20289 // result: (Const8 [-1]) 20290 for { 20291 _ = v.Args[1] 20292 v_1 := v.Args[1] 20293 if v_1.Op != OpConst8 { 20294 break 20295 } 20296 if v_1.AuxInt != -1 { 20297 break 20298 } 20299 v.reset(OpConst8) 20300 v.AuxInt = -1 20301 return true 20302 } 20303 // match: (Or8 x (Or8 x y)) 20304 // cond: 20305 // result: (Or8 x y) 20306 for { 20307 _ = v.Args[1] 20308 x := v.Args[0] 20309 v_1 := v.Args[1] 20310 if v_1.Op != OpOr8 { 20311 break 20312 } 20313 _ = v_1.Args[1] 20314 if x != v_1.Args[0] { 20315 break 20316 } 20317 y := v_1.Args[1] 20318 v.reset(OpOr8) 20319 v.AddArg(x) 20320 v.AddArg(y) 20321 return true 20322 } 20323 // match: (Or8 x (Or8 y x)) 20324 // cond: 20325 // result: (Or8 x y) 20326 for { 20327 _ = v.Args[1] 20328 x := v.Args[0] 20329 v_1 := v.Args[1] 20330 if v_1.Op != OpOr8 { 20331 break 20332 } 20333 _ = v_1.Args[1] 20334 y := v_1.Args[0] 20335 if x != v_1.Args[1] { 20336 break 20337 } 20338 v.reset(OpOr8) 20339 v.AddArg(x) 20340 v.AddArg(y) 20341 return true 20342 } 20343 // match: (Or8 (Or8 x y) x) 20344 // cond: 20345 // result: (Or8 x y) 20346 for { 20347 _ = v.Args[1] 20348 v_0 := v.Args[0] 20349 if v_0.Op != OpOr8 { 20350 break 20351 } 20352 _ = v_0.Args[1] 20353 x := v_0.Args[0] 20354 y := v_0.Args[1] 20355 if x != v.Args[1] { 20356 break 20357 } 20358 v.reset(OpOr8) 20359 v.AddArg(x) 20360 v.AddArg(y) 20361 return true 20362 } 20363 return false 20364 } 20365 func rewriteValuegeneric_OpOr8_10(v *Value) bool { 20366 b := v.Block 20367 _ = b 20368 // match: (Or8 (Or8 y x) x) 20369 // cond: 20370 // result: (Or8 x y) 20371 for { 20372 _ = v.Args[1] 20373 v_0 := v.Args[0] 20374 if v_0.Op != OpOr8 { 20375 break 20376 } 20377 _ = v_0.Args[1] 20378 y := v_0.Args[0] 20379 x := v_0.Args[1] 20380 if x != v.Args[1] { 20381 break 20382 } 20383 v.reset(OpOr8) 20384 v.AddArg(x) 20385 v.AddArg(y) 20386 return true 20387 } 20388 // match: (Or8 (And8 x (Const8 [c2])) (Const8 <t> [c1])) 20389 // cond: ^(c1 | c2) == 0 20390 // result: (Or8 (Const8 <t> [c1]) x) 20391 for { 20392 _ = v.Args[1] 20393 v_0 := v.Args[0] 20394 if v_0.Op != OpAnd8 { 20395 break 20396 } 20397 _ = v_0.Args[1] 20398 x := v_0.Args[0] 20399 v_0_1 := v_0.Args[1] 20400 if v_0_1.Op != OpConst8 { 20401 break 20402 } 20403 c2 := v_0_1.AuxInt 20404 v_1 := v.Args[1] 20405 if v_1.Op != OpConst8 { 20406 break 20407 } 20408 t := v_1.Type 20409 c1 := v_1.AuxInt 20410 if !(^(c1 | c2) == 0) { 20411 break 20412 } 20413 v.reset(OpOr8) 20414 v0 := b.NewValue0(v.Pos, OpConst8, t) 20415 v0.AuxInt = c1 20416 v.AddArg(v0) 20417 v.AddArg(x) 20418 return true 20419 } 20420 // match: (Or8 (And8 (Const8 [c2]) x) (Const8 <t> [c1])) 20421 // cond: ^(c1 | c2) == 0 20422 // result: (Or8 (Const8 <t> [c1]) x) 20423 for { 20424 _ = v.Args[1] 20425 v_0 := v.Args[0] 20426 if v_0.Op != OpAnd8 { 20427 break 20428 } 20429 _ = v_0.Args[1] 20430 v_0_0 := v_0.Args[0] 20431 if v_0_0.Op != OpConst8 { 20432 break 20433 } 20434 c2 := v_0_0.AuxInt 20435 x := v_0.Args[1] 20436 v_1 := v.Args[1] 20437 if v_1.Op != OpConst8 { 20438 break 20439 } 20440 t := v_1.Type 20441 c1 := v_1.AuxInt 20442 if !(^(c1 | c2) == 0) { 20443 break 20444 } 20445 v.reset(OpOr8) 20446 v0 := b.NewValue0(v.Pos, OpConst8, t) 20447 v0.AuxInt = c1 20448 v.AddArg(v0) 20449 v.AddArg(x) 20450 return true 20451 } 20452 // match: (Or8 (Const8 <t> [c1]) (And8 x (Const8 [c2]))) 20453 // cond: ^(c1 | c2) == 0 20454 // result: (Or8 (Const8 <t> [c1]) x) 20455 for { 20456 _ = v.Args[1] 20457 v_0 := v.Args[0] 20458 if v_0.Op != OpConst8 { 20459 break 20460 } 20461 t := v_0.Type 20462 c1 := v_0.AuxInt 20463 v_1 := v.Args[1] 20464 if v_1.Op != OpAnd8 { 20465 break 20466 } 20467 _ = v_1.Args[1] 20468 x := v_1.Args[0] 20469 v_1_1 := v_1.Args[1] 20470 if v_1_1.Op != OpConst8 { 20471 break 20472 } 20473 c2 := v_1_1.AuxInt 20474 if !(^(c1 | c2) == 0) { 20475 break 20476 } 20477 v.reset(OpOr8) 20478 v0 := b.NewValue0(v.Pos, OpConst8, t) 20479 v0.AuxInt = c1 20480 v.AddArg(v0) 20481 v.AddArg(x) 20482 return true 20483 } 20484 // match: (Or8 (Const8 <t> [c1]) (And8 (Const8 [c2]) x)) 20485 // cond: ^(c1 | c2) == 0 20486 // result: (Or8 (Const8 <t> [c1]) x) 20487 for { 20488 _ = v.Args[1] 20489 v_0 := v.Args[0] 20490 if v_0.Op != OpConst8 { 20491 break 20492 } 20493 t := v_0.Type 20494 c1 := v_0.AuxInt 20495 v_1 := v.Args[1] 20496 if v_1.Op != OpAnd8 { 20497 break 20498 } 20499 _ = v_1.Args[1] 20500 v_1_0 := v_1.Args[0] 20501 if v_1_0.Op != OpConst8 { 20502 break 20503 } 20504 c2 := v_1_0.AuxInt 20505 x := v_1.Args[1] 20506 if !(^(c1 | c2) == 0) { 20507 break 20508 } 20509 v.reset(OpOr8) 20510 v0 := b.NewValue0(v.Pos, OpConst8, t) 20511 v0.AuxInt = c1 20512 v.AddArg(v0) 20513 v.AddArg(x) 20514 return true 20515 } 20516 // match: (Or8 (Or8 i:(Const8 <t>) z) x) 20517 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 20518 // result: (Or8 i (Or8 <t> z x)) 20519 for { 20520 _ = v.Args[1] 20521 v_0 := v.Args[0] 20522 if v_0.Op != OpOr8 { 20523 break 20524 } 20525 _ = v_0.Args[1] 20526 i := v_0.Args[0] 20527 if i.Op != OpConst8 { 20528 break 20529 } 20530 t := i.Type 20531 z := v_0.Args[1] 20532 x := v.Args[1] 20533 if !(z.Op != OpConst8 && x.Op != OpConst8) { 20534 break 20535 } 20536 v.reset(OpOr8) 20537 v.AddArg(i) 20538 v0 := b.NewValue0(v.Pos, OpOr8, t) 20539 v0.AddArg(z) 20540 v0.AddArg(x) 20541 v.AddArg(v0) 20542 return true 20543 } 20544 // match: (Or8 (Or8 z i:(Const8 <t>)) x) 20545 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 20546 // result: (Or8 i (Or8 <t> z x)) 20547 for { 20548 _ = v.Args[1] 20549 v_0 := v.Args[0] 20550 if v_0.Op != OpOr8 { 20551 break 20552 } 20553 _ = v_0.Args[1] 20554 z := v_0.Args[0] 20555 i := v_0.Args[1] 20556 if i.Op != OpConst8 { 20557 break 20558 } 20559 t := i.Type 20560 x := v.Args[1] 20561 if !(z.Op != OpConst8 && x.Op != OpConst8) { 20562 break 20563 } 20564 v.reset(OpOr8) 20565 v.AddArg(i) 20566 v0 := b.NewValue0(v.Pos, OpOr8, t) 20567 v0.AddArg(z) 20568 v0.AddArg(x) 20569 v.AddArg(v0) 20570 return true 20571 } 20572 // match: (Or8 x (Or8 i:(Const8 <t>) z)) 20573 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 20574 // result: (Or8 i (Or8 <t> z x)) 20575 for { 20576 _ = v.Args[1] 20577 x := v.Args[0] 20578 v_1 := v.Args[1] 20579 if v_1.Op != OpOr8 { 20580 break 20581 } 20582 _ = v_1.Args[1] 20583 i := v_1.Args[0] 20584 if i.Op != OpConst8 { 20585 break 20586 } 20587 t := i.Type 20588 z := v_1.Args[1] 20589 if !(z.Op != OpConst8 && x.Op != OpConst8) { 20590 break 20591 } 20592 v.reset(OpOr8) 20593 v.AddArg(i) 20594 v0 := b.NewValue0(v.Pos, OpOr8, t) 20595 v0.AddArg(z) 20596 v0.AddArg(x) 20597 v.AddArg(v0) 20598 return true 20599 } 20600 // match: (Or8 x (Or8 z i:(Const8 <t>))) 20601 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 20602 // result: (Or8 i (Or8 <t> z x)) 20603 for { 20604 _ = v.Args[1] 20605 x := v.Args[0] 20606 v_1 := v.Args[1] 20607 if v_1.Op != OpOr8 { 20608 break 20609 } 20610 _ = v_1.Args[1] 20611 z := v_1.Args[0] 20612 i := v_1.Args[1] 20613 if i.Op != OpConst8 { 20614 break 20615 } 20616 t := i.Type 20617 if !(z.Op != OpConst8 && x.Op != OpConst8) { 20618 break 20619 } 20620 v.reset(OpOr8) 20621 v.AddArg(i) 20622 v0 := b.NewValue0(v.Pos, OpOr8, t) 20623 v0.AddArg(z) 20624 v0.AddArg(x) 20625 v.AddArg(v0) 20626 return true 20627 } 20628 // match: (Or8 (Const8 <t> [c]) (Or8 (Const8 <t> [d]) x)) 20629 // cond: 20630 // result: (Or8 (Const8 <t> [int64(int8(c|d))]) x) 20631 for { 20632 _ = v.Args[1] 20633 v_0 := v.Args[0] 20634 if v_0.Op != OpConst8 { 20635 break 20636 } 20637 t := v_0.Type 20638 c := v_0.AuxInt 20639 v_1 := v.Args[1] 20640 if v_1.Op != OpOr8 { 20641 break 20642 } 20643 _ = v_1.Args[1] 20644 v_1_0 := v_1.Args[0] 20645 if v_1_0.Op != OpConst8 { 20646 break 20647 } 20648 if v_1_0.Type != t { 20649 break 20650 } 20651 d := v_1_0.AuxInt 20652 x := v_1.Args[1] 20653 v.reset(OpOr8) 20654 v0 := b.NewValue0(v.Pos, OpConst8, t) 20655 v0.AuxInt = int64(int8(c | d)) 20656 v.AddArg(v0) 20657 v.AddArg(x) 20658 return true 20659 } 20660 return false 20661 } 20662 func rewriteValuegeneric_OpOr8_20(v *Value) bool { 20663 b := v.Block 20664 _ = b 20665 // match: (Or8 (Const8 <t> [c]) (Or8 x (Const8 <t> [d]))) 20666 // cond: 20667 // result: (Or8 (Const8 <t> [int64(int8(c|d))]) x) 20668 for { 20669 _ = v.Args[1] 20670 v_0 := v.Args[0] 20671 if v_0.Op != OpConst8 { 20672 break 20673 } 20674 t := v_0.Type 20675 c := v_0.AuxInt 20676 v_1 := v.Args[1] 20677 if v_1.Op != OpOr8 { 20678 break 20679 } 20680 _ = v_1.Args[1] 20681 x := v_1.Args[0] 20682 v_1_1 := v_1.Args[1] 20683 if v_1_1.Op != OpConst8 { 20684 break 20685 } 20686 if v_1_1.Type != t { 20687 break 20688 } 20689 d := v_1_1.AuxInt 20690 v.reset(OpOr8) 20691 v0 := b.NewValue0(v.Pos, OpConst8, t) 20692 v0.AuxInt = int64(int8(c | d)) 20693 v.AddArg(v0) 20694 v.AddArg(x) 20695 return true 20696 } 20697 // match: (Or8 (Or8 (Const8 <t> [d]) x) (Const8 <t> [c])) 20698 // cond: 20699 // result: (Or8 (Const8 <t> [int64(int8(c|d))]) x) 20700 for { 20701 _ = v.Args[1] 20702 v_0 := v.Args[0] 20703 if v_0.Op != OpOr8 { 20704 break 20705 } 20706 _ = v_0.Args[1] 20707 v_0_0 := v_0.Args[0] 20708 if v_0_0.Op != OpConst8 { 20709 break 20710 } 20711 t := v_0_0.Type 20712 d := v_0_0.AuxInt 20713 x := v_0.Args[1] 20714 v_1 := v.Args[1] 20715 if v_1.Op != OpConst8 { 20716 break 20717 } 20718 if v_1.Type != t { 20719 break 20720 } 20721 c := v_1.AuxInt 20722 v.reset(OpOr8) 20723 v0 := b.NewValue0(v.Pos, OpConst8, t) 20724 v0.AuxInt = int64(int8(c | d)) 20725 v.AddArg(v0) 20726 v.AddArg(x) 20727 return true 20728 } 20729 // match: (Or8 (Or8 x (Const8 <t> [d])) (Const8 <t> [c])) 20730 // cond: 20731 // result: (Or8 (Const8 <t> [int64(int8(c|d))]) x) 20732 for { 20733 _ = v.Args[1] 20734 v_0 := v.Args[0] 20735 if v_0.Op != OpOr8 { 20736 break 20737 } 20738 _ = v_0.Args[1] 20739 x := v_0.Args[0] 20740 v_0_1 := v_0.Args[1] 20741 if v_0_1.Op != OpConst8 { 20742 break 20743 } 20744 t := v_0_1.Type 20745 d := v_0_1.AuxInt 20746 v_1 := v.Args[1] 20747 if v_1.Op != OpConst8 { 20748 break 20749 } 20750 if v_1.Type != t { 20751 break 20752 } 20753 c := v_1.AuxInt 20754 v.reset(OpOr8) 20755 v0 := b.NewValue0(v.Pos, OpConst8, t) 20756 v0.AuxInt = int64(int8(c | d)) 20757 v.AddArg(v0) 20758 v.AddArg(x) 20759 return true 20760 } 20761 return false 20762 } 20763 func rewriteValuegeneric_OpPhi_0(v *Value) bool { 20764 // match: (Phi (Const8 [c]) (Const8 [c])) 20765 // cond: 20766 // result: (Const8 [c]) 20767 for { 20768 _ = v.Args[1] 20769 v_0 := v.Args[0] 20770 if v_0.Op != OpConst8 { 20771 break 20772 } 20773 c := v_0.AuxInt 20774 v_1 := v.Args[1] 20775 if v_1.Op != OpConst8 { 20776 break 20777 } 20778 if v_1.AuxInt != c { 20779 break 20780 } 20781 if len(v.Args) != 2 { 20782 break 20783 } 20784 v.reset(OpConst8) 20785 v.AuxInt = c 20786 return true 20787 } 20788 // match: (Phi (Const16 [c]) (Const16 [c])) 20789 // cond: 20790 // result: (Const16 [c]) 20791 for { 20792 _ = v.Args[1] 20793 v_0 := v.Args[0] 20794 if v_0.Op != OpConst16 { 20795 break 20796 } 20797 c := v_0.AuxInt 20798 v_1 := v.Args[1] 20799 if v_1.Op != OpConst16 { 20800 break 20801 } 20802 if v_1.AuxInt != c { 20803 break 20804 } 20805 if len(v.Args) != 2 { 20806 break 20807 } 20808 v.reset(OpConst16) 20809 v.AuxInt = c 20810 return true 20811 } 20812 // match: (Phi (Const32 [c]) (Const32 [c])) 20813 // cond: 20814 // result: (Const32 [c]) 20815 for { 20816 _ = v.Args[1] 20817 v_0 := v.Args[0] 20818 if v_0.Op != OpConst32 { 20819 break 20820 } 20821 c := v_0.AuxInt 20822 v_1 := v.Args[1] 20823 if v_1.Op != OpConst32 { 20824 break 20825 } 20826 if v_1.AuxInt != c { 20827 break 20828 } 20829 if len(v.Args) != 2 { 20830 break 20831 } 20832 v.reset(OpConst32) 20833 v.AuxInt = c 20834 return true 20835 } 20836 // match: (Phi (Const64 [c]) (Const64 [c])) 20837 // cond: 20838 // result: (Const64 [c]) 20839 for { 20840 _ = v.Args[1] 20841 v_0 := v.Args[0] 20842 if v_0.Op != OpConst64 { 20843 break 20844 } 20845 c := v_0.AuxInt 20846 v_1 := v.Args[1] 20847 if v_1.Op != OpConst64 { 20848 break 20849 } 20850 if v_1.AuxInt != c { 20851 break 20852 } 20853 if len(v.Args) != 2 { 20854 break 20855 } 20856 v.reset(OpConst64) 20857 v.AuxInt = c 20858 return true 20859 } 20860 return false 20861 } 20862 func rewriteValuegeneric_OpPtrIndex_0(v *Value) bool { 20863 b := v.Block 20864 _ = b 20865 config := b.Func.Config 20866 _ = config 20867 typ := &b.Func.Config.Types 20868 _ = typ 20869 // match: (PtrIndex <t> ptr idx) 20870 // cond: config.PtrSize == 4 20871 // result: (AddPtr ptr (Mul32 <typ.Int> idx (Const32 <typ.Int> [t.ElemType().Size()]))) 20872 for { 20873 t := v.Type 20874 _ = v.Args[1] 20875 ptr := v.Args[0] 20876 idx := v.Args[1] 20877 if !(config.PtrSize == 4) { 20878 break 20879 } 20880 v.reset(OpAddPtr) 20881 v.AddArg(ptr) 20882 v0 := b.NewValue0(v.Pos, OpMul32, typ.Int) 20883 v0.AddArg(idx) 20884 v1 := b.NewValue0(v.Pos, OpConst32, typ.Int) 20885 v1.AuxInt = t.ElemType().Size() 20886 v0.AddArg(v1) 20887 v.AddArg(v0) 20888 return true 20889 } 20890 // match: (PtrIndex <t> ptr idx) 20891 // cond: config.PtrSize == 8 20892 // result: (AddPtr ptr (Mul64 <typ.Int> idx (Const64 <typ.Int> [t.ElemType().Size()]))) 20893 for { 20894 t := v.Type 20895 _ = v.Args[1] 20896 ptr := v.Args[0] 20897 idx := v.Args[1] 20898 if !(config.PtrSize == 8) { 20899 break 20900 } 20901 v.reset(OpAddPtr) 20902 v.AddArg(ptr) 20903 v0 := b.NewValue0(v.Pos, OpMul64, typ.Int) 20904 v0.AddArg(idx) 20905 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int) 20906 v1.AuxInt = t.ElemType().Size() 20907 v0.AddArg(v1) 20908 v.AddArg(v0) 20909 return true 20910 } 20911 return false 20912 } 20913 func rewriteValuegeneric_OpRound32F_0(v *Value) bool { 20914 // match: (Round32F x:(Const32F)) 20915 // cond: 20916 // result: x 20917 for { 20918 x := v.Args[0] 20919 if x.Op != OpConst32F { 20920 break 20921 } 20922 v.reset(OpCopy) 20923 v.Type = x.Type 20924 v.AddArg(x) 20925 return true 20926 } 20927 return false 20928 } 20929 func rewriteValuegeneric_OpRound64F_0(v *Value) bool { 20930 // match: (Round64F x:(Const64F)) 20931 // cond: 20932 // result: x 20933 for { 20934 x := v.Args[0] 20935 if x.Op != OpConst64F { 20936 break 20937 } 20938 v.reset(OpCopy) 20939 v.Type = x.Type 20940 v.AddArg(x) 20941 return true 20942 } 20943 return false 20944 } 20945 func rewriteValuegeneric_OpRsh16Ux16_0(v *Value) bool { 20946 b := v.Block 20947 _ = b 20948 // match: (Rsh16Ux16 <t> x (Const16 [c])) 20949 // cond: 20950 // result: (Rsh16Ux64 x (Const64 <t> [int64(uint16(c))])) 20951 for { 20952 t := v.Type 20953 _ = v.Args[1] 20954 x := v.Args[0] 20955 v_1 := v.Args[1] 20956 if v_1.Op != OpConst16 { 20957 break 20958 } 20959 c := v_1.AuxInt 20960 v.reset(OpRsh16Ux64) 20961 v.AddArg(x) 20962 v0 := b.NewValue0(v.Pos, OpConst64, t) 20963 v0.AuxInt = int64(uint16(c)) 20964 v.AddArg(v0) 20965 return true 20966 } 20967 // match: (Rsh16Ux16 (Const16 [0]) _) 20968 // cond: 20969 // result: (Const16 [0]) 20970 for { 20971 _ = v.Args[1] 20972 v_0 := v.Args[0] 20973 if v_0.Op != OpConst16 { 20974 break 20975 } 20976 if v_0.AuxInt != 0 { 20977 break 20978 } 20979 v.reset(OpConst16) 20980 v.AuxInt = 0 20981 return true 20982 } 20983 return false 20984 } 20985 func rewriteValuegeneric_OpRsh16Ux32_0(v *Value) bool { 20986 b := v.Block 20987 _ = b 20988 // match: (Rsh16Ux32 <t> x (Const32 [c])) 20989 // cond: 20990 // result: (Rsh16Ux64 x (Const64 <t> [int64(uint32(c))])) 20991 for { 20992 t := v.Type 20993 _ = v.Args[1] 20994 x := v.Args[0] 20995 v_1 := v.Args[1] 20996 if v_1.Op != OpConst32 { 20997 break 20998 } 20999 c := v_1.AuxInt 21000 v.reset(OpRsh16Ux64) 21001 v.AddArg(x) 21002 v0 := b.NewValue0(v.Pos, OpConst64, t) 21003 v0.AuxInt = int64(uint32(c)) 21004 v.AddArg(v0) 21005 return true 21006 } 21007 // match: (Rsh16Ux32 (Const16 [0]) _) 21008 // cond: 21009 // result: (Const16 [0]) 21010 for { 21011 _ = v.Args[1] 21012 v_0 := v.Args[0] 21013 if v_0.Op != OpConst16 { 21014 break 21015 } 21016 if v_0.AuxInt != 0 { 21017 break 21018 } 21019 v.reset(OpConst16) 21020 v.AuxInt = 0 21021 return true 21022 } 21023 return false 21024 } 21025 func rewriteValuegeneric_OpRsh16Ux64_0(v *Value) bool { 21026 b := v.Block 21027 _ = b 21028 typ := &b.Func.Config.Types 21029 _ = typ 21030 // match: (Rsh16Ux64 (Const16 [c]) (Const64 [d])) 21031 // cond: 21032 // result: (Const16 [int64(int16(uint16(c) >> uint64(d)))]) 21033 for { 21034 _ = v.Args[1] 21035 v_0 := v.Args[0] 21036 if v_0.Op != OpConst16 { 21037 break 21038 } 21039 c := v_0.AuxInt 21040 v_1 := v.Args[1] 21041 if v_1.Op != OpConst64 { 21042 break 21043 } 21044 d := v_1.AuxInt 21045 v.reset(OpConst16) 21046 v.AuxInt = int64(int16(uint16(c) >> uint64(d))) 21047 return true 21048 } 21049 // match: (Rsh16Ux64 x (Const64 [0])) 21050 // cond: 21051 // result: x 21052 for { 21053 _ = v.Args[1] 21054 x := v.Args[0] 21055 v_1 := v.Args[1] 21056 if v_1.Op != OpConst64 { 21057 break 21058 } 21059 if v_1.AuxInt != 0 { 21060 break 21061 } 21062 v.reset(OpCopy) 21063 v.Type = x.Type 21064 v.AddArg(x) 21065 return true 21066 } 21067 // match: (Rsh16Ux64 (Const16 [0]) _) 21068 // cond: 21069 // result: (Const16 [0]) 21070 for { 21071 _ = v.Args[1] 21072 v_0 := v.Args[0] 21073 if v_0.Op != OpConst16 { 21074 break 21075 } 21076 if v_0.AuxInt != 0 { 21077 break 21078 } 21079 v.reset(OpConst16) 21080 v.AuxInt = 0 21081 return true 21082 } 21083 // match: (Rsh16Ux64 _ (Const64 [c])) 21084 // cond: uint64(c) >= 16 21085 // result: (Const16 [0]) 21086 for { 21087 _ = v.Args[1] 21088 v_1 := v.Args[1] 21089 if v_1.Op != OpConst64 { 21090 break 21091 } 21092 c := v_1.AuxInt 21093 if !(uint64(c) >= 16) { 21094 break 21095 } 21096 v.reset(OpConst16) 21097 v.AuxInt = 0 21098 return true 21099 } 21100 // match: (Rsh16Ux64 <t> (Rsh16Ux64 x (Const64 [c])) (Const64 [d])) 21101 // cond: !uaddOvf(c,d) 21102 // result: (Rsh16Ux64 x (Const64 <t> [c+d])) 21103 for { 21104 t := v.Type 21105 _ = v.Args[1] 21106 v_0 := v.Args[0] 21107 if v_0.Op != OpRsh16Ux64 { 21108 break 21109 } 21110 _ = v_0.Args[1] 21111 x := v_0.Args[0] 21112 v_0_1 := v_0.Args[1] 21113 if v_0_1.Op != OpConst64 { 21114 break 21115 } 21116 c := v_0_1.AuxInt 21117 v_1 := v.Args[1] 21118 if v_1.Op != OpConst64 { 21119 break 21120 } 21121 d := v_1.AuxInt 21122 if !(!uaddOvf(c, d)) { 21123 break 21124 } 21125 v.reset(OpRsh16Ux64) 21126 v.AddArg(x) 21127 v0 := b.NewValue0(v.Pos, OpConst64, t) 21128 v0.AuxInt = c + d 21129 v.AddArg(v0) 21130 return true 21131 } 21132 // match: (Rsh16Ux64 (Lsh16x64 (Rsh16Ux64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 21133 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 21134 // result: (Rsh16Ux64 x (Const64 <typ.UInt64> [c1-c2+c3])) 21135 for { 21136 _ = v.Args[1] 21137 v_0 := v.Args[0] 21138 if v_0.Op != OpLsh16x64 { 21139 break 21140 } 21141 _ = v_0.Args[1] 21142 v_0_0 := v_0.Args[0] 21143 if v_0_0.Op != OpRsh16Ux64 { 21144 break 21145 } 21146 _ = v_0_0.Args[1] 21147 x := v_0_0.Args[0] 21148 v_0_0_1 := v_0_0.Args[1] 21149 if v_0_0_1.Op != OpConst64 { 21150 break 21151 } 21152 c1 := v_0_0_1.AuxInt 21153 v_0_1 := v_0.Args[1] 21154 if v_0_1.Op != OpConst64 { 21155 break 21156 } 21157 c2 := v_0_1.AuxInt 21158 v_1 := v.Args[1] 21159 if v_1.Op != OpConst64 { 21160 break 21161 } 21162 c3 := v_1.AuxInt 21163 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 21164 break 21165 } 21166 v.reset(OpRsh16Ux64) 21167 v.AddArg(x) 21168 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 21169 v0.AuxInt = c1 - c2 + c3 21170 v.AddArg(v0) 21171 return true 21172 } 21173 // match: (Rsh16Ux64 (Lsh16x64 x (Const64 [8])) (Const64 [8])) 21174 // cond: 21175 // result: (ZeroExt8to16 (Trunc16to8 <typ.UInt8> x)) 21176 for { 21177 _ = v.Args[1] 21178 v_0 := v.Args[0] 21179 if v_0.Op != OpLsh16x64 { 21180 break 21181 } 21182 _ = v_0.Args[1] 21183 x := v_0.Args[0] 21184 v_0_1 := v_0.Args[1] 21185 if v_0_1.Op != OpConst64 { 21186 break 21187 } 21188 if v_0_1.AuxInt != 8 { 21189 break 21190 } 21191 v_1 := v.Args[1] 21192 if v_1.Op != OpConst64 { 21193 break 21194 } 21195 if v_1.AuxInt != 8 { 21196 break 21197 } 21198 v.reset(OpZeroExt8to16) 21199 v0 := b.NewValue0(v.Pos, OpTrunc16to8, typ.UInt8) 21200 v0.AddArg(x) 21201 v.AddArg(v0) 21202 return true 21203 } 21204 return false 21205 } 21206 func rewriteValuegeneric_OpRsh16Ux8_0(v *Value) bool { 21207 b := v.Block 21208 _ = b 21209 // match: (Rsh16Ux8 <t> x (Const8 [c])) 21210 // cond: 21211 // result: (Rsh16Ux64 x (Const64 <t> [int64(uint8(c))])) 21212 for { 21213 t := v.Type 21214 _ = v.Args[1] 21215 x := v.Args[0] 21216 v_1 := v.Args[1] 21217 if v_1.Op != OpConst8 { 21218 break 21219 } 21220 c := v_1.AuxInt 21221 v.reset(OpRsh16Ux64) 21222 v.AddArg(x) 21223 v0 := b.NewValue0(v.Pos, OpConst64, t) 21224 v0.AuxInt = int64(uint8(c)) 21225 v.AddArg(v0) 21226 return true 21227 } 21228 // match: (Rsh16Ux8 (Const16 [0]) _) 21229 // cond: 21230 // result: (Const16 [0]) 21231 for { 21232 _ = v.Args[1] 21233 v_0 := v.Args[0] 21234 if v_0.Op != OpConst16 { 21235 break 21236 } 21237 if v_0.AuxInt != 0 { 21238 break 21239 } 21240 v.reset(OpConst16) 21241 v.AuxInt = 0 21242 return true 21243 } 21244 return false 21245 } 21246 func rewriteValuegeneric_OpRsh16x16_0(v *Value) bool { 21247 b := v.Block 21248 _ = b 21249 // match: (Rsh16x16 <t> x (Const16 [c])) 21250 // cond: 21251 // result: (Rsh16x64 x (Const64 <t> [int64(uint16(c))])) 21252 for { 21253 t := v.Type 21254 _ = v.Args[1] 21255 x := v.Args[0] 21256 v_1 := v.Args[1] 21257 if v_1.Op != OpConst16 { 21258 break 21259 } 21260 c := v_1.AuxInt 21261 v.reset(OpRsh16x64) 21262 v.AddArg(x) 21263 v0 := b.NewValue0(v.Pos, OpConst64, t) 21264 v0.AuxInt = int64(uint16(c)) 21265 v.AddArg(v0) 21266 return true 21267 } 21268 // match: (Rsh16x16 (Const16 [0]) _) 21269 // cond: 21270 // result: (Const16 [0]) 21271 for { 21272 _ = v.Args[1] 21273 v_0 := v.Args[0] 21274 if v_0.Op != OpConst16 { 21275 break 21276 } 21277 if v_0.AuxInt != 0 { 21278 break 21279 } 21280 v.reset(OpConst16) 21281 v.AuxInt = 0 21282 return true 21283 } 21284 return false 21285 } 21286 func rewriteValuegeneric_OpRsh16x32_0(v *Value) bool { 21287 b := v.Block 21288 _ = b 21289 // match: (Rsh16x32 <t> x (Const32 [c])) 21290 // cond: 21291 // result: (Rsh16x64 x (Const64 <t> [int64(uint32(c))])) 21292 for { 21293 t := v.Type 21294 _ = v.Args[1] 21295 x := v.Args[0] 21296 v_1 := v.Args[1] 21297 if v_1.Op != OpConst32 { 21298 break 21299 } 21300 c := v_1.AuxInt 21301 v.reset(OpRsh16x64) 21302 v.AddArg(x) 21303 v0 := b.NewValue0(v.Pos, OpConst64, t) 21304 v0.AuxInt = int64(uint32(c)) 21305 v.AddArg(v0) 21306 return true 21307 } 21308 // match: (Rsh16x32 (Const16 [0]) _) 21309 // cond: 21310 // result: (Const16 [0]) 21311 for { 21312 _ = v.Args[1] 21313 v_0 := v.Args[0] 21314 if v_0.Op != OpConst16 { 21315 break 21316 } 21317 if v_0.AuxInt != 0 { 21318 break 21319 } 21320 v.reset(OpConst16) 21321 v.AuxInt = 0 21322 return true 21323 } 21324 return false 21325 } 21326 func rewriteValuegeneric_OpRsh16x64_0(v *Value) bool { 21327 b := v.Block 21328 _ = b 21329 typ := &b.Func.Config.Types 21330 _ = typ 21331 // match: (Rsh16x64 (Const16 [c]) (Const64 [d])) 21332 // cond: 21333 // result: (Const16 [int64(int16(c) >> uint64(d))]) 21334 for { 21335 _ = v.Args[1] 21336 v_0 := v.Args[0] 21337 if v_0.Op != OpConst16 { 21338 break 21339 } 21340 c := v_0.AuxInt 21341 v_1 := v.Args[1] 21342 if v_1.Op != OpConst64 { 21343 break 21344 } 21345 d := v_1.AuxInt 21346 v.reset(OpConst16) 21347 v.AuxInt = int64(int16(c) >> uint64(d)) 21348 return true 21349 } 21350 // match: (Rsh16x64 x (Const64 [0])) 21351 // cond: 21352 // result: x 21353 for { 21354 _ = v.Args[1] 21355 x := v.Args[0] 21356 v_1 := v.Args[1] 21357 if v_1.Op != OpConst64 { 21358 break 21359 } 21360 if v_1.AuxInt != 0 { 21361 break 21362 } 21363 v.reset(OpCopy) 21364 v.Type = x.Type 21365 v.AddArg(x) 21366 return true 21367 } 21368 // match: (Rsh16x64 (Const16 [0]) _) 21369 // cond: 21370 // result: (Const16 [0]) 21371 for { 21372 _ = v.Args[1] 21373 v_0 := v.Args[0] 21374 if v_0.Op != OpConst16 { 21375 break 21376 } 21377 if v_0.AuxInt != 0 { 21378 break 21379 } 21380 v.reset(OpConst16) 21381 v.AuxInt = 0 21382 return true 21383 } 21384 // match: (Rsh16x64 <t> (Rsh16x64 x (Const64 [c])) (Const64 [d])) 21385 // cond: !uaddOvf(c,d) 21386 // result: (Rsh16x64 x (Const64 <t> [c+d])) 21387 for { 21388 t := v.Type 21389 _ = v.Args[1] 21390 v_0 := v.Args[0] 21391 if v_0.Op != OpRsh16x64 { 21392 break 21393 } 21394 _ = v_0.Args[1] 21395 x := v_0.Args[0] 21396 v_0_1 := v_0.Args[1] 21397 if v_0_1.Op != OpConst64 { 21398 break 21399 } 21400 c := v_0_1.AuxInt 21401 v_1 := v.Args[1] 21402 if v_1.Op != OpConst64 { 21403 break 21404 } 21405 d := v_1.AuxInt 21406 if !(!uaddOvf(c, d)) { 21407 break 21408 } 21409 v.reset(OpRsh16x64) 21410 v.AddArg(x) 21411 v0 := b.NewValue0(v.Pos, OpConst64, t) 21412 v0.AuxInt = c + d 21413 v.AddArg(v0) 21414 return true 21415 } 21416 // match: (Rsh16x64 (Lsh16x64 x (Const64 [8])) (Const64 [8])) 21417 // cond: 21418 // result: (SignExt8to16 (Trunc16to8 <typ.Int8> x)) 21419 for { 21420 _ = v.Args[1] 21421 v_0 := v.Args[0] 21422 if v_0.Op != OpLsh16x64 { 21423 break 21424 } 21425 _ = v_0.Args[1] 21426 x := v_0.Args[0] 21427 v_0_1 := v_0.Args[1] 21428 if v_0_1.Op != OpConst64 { 21429 break 21430 } 21431 if v_0_1.AuxInt != 8 { 21432 break 21433 } 21434 v_1 := v.Args[1] 21435 if v_1.Op != OpConst64 { 21436 break 21437 } 21438 if v_1.AuxInt != 8 { 21439 break 21440 } 21441 v.reset(OpSignExt8to16) 21442 v0 := b.NewValue0(v.Pos, OpTrunc16to8, typ.Int8) 21443 v0.AddArg(x) 21444 v.AddArg(v0) 21445 return true 21446 } 21447 return false 21448 } 21449 func rewriteValuegeneric_OpRsh16x8_0(v *Value) bool { 21450 b := v.Block 21451 _ = b 21452 // match: (Rsh16x8 <t> x (Const8 [c])) 21453 // cond: 21454 // result: (Rsh16x64 x (Const64 <t> [int64(uint8(c))])) 21455 for { 21456 t := v.Type 21457 _ = v.Args[1] 21458 x := v.Args[0] 21459 v_1 := v.Args[1] 21460 if v_1.Op != OpConst8 { 21461 break 21462 } 21463 c := v_1.AuxInt 21464 v.reset(OpRsh16x64) 21465 v.AddArg(x) 21466 v0 := b.NewValue0(v.Pos, OpConst64, t) 21467 v0.AuxInt = int64(uint8(c)) 21468 v.AddArg(v0) 21469 return true 21470 } 21471 // match: (Rsh16x8 (Const16 [0]) _) 21472 // cond: 21473 // result: (Const16 [0]) 21474 for { 21475 _ = v.Args[1] 21476 v_0 := v.Args[0] 21477 if v_0.Op != OpConst16 { 21478 break 21479 } 21480 if v_0.AuxInt != 0 { 21481 break 21482 } 21483 v.reset(OpConst16) 21484 v.AuxInt = 0 21485 return true 21486 } 21487 return false 21488 } 21489 func rewriteValuegeneric_OpRsh32Ux16_0(v *Value) bool { 21490 b := v.Block 21491 _ = b 21492 // match: (Rsh32Ux16 <t> x (Const16 [c])) 21493 // cond: 21494 // result: (Rsh32Ux64 x (Const64 <t> [int64(uint16(c))])) 21495 for { 21496 t := v.Type 21497 _ = v.Args[1] 21498 x := v.Args[0] 21499 v_1 := v.Args[1] 21500 if v_1.Op != OpConst16 { 21501 break 21502 } 21503 c := v_1.AuxInt 21504 v.reset(OpRsh32Ux64) 21505 v.AddArg(x) 21506 v0 := b.NewValue0(v.Pos, OpConst64, t) 21507 v0.AuxInt = int64(uint16(c)) 21508 v.AddArg(v0) 21509 return true 21510 } 21511 // match: (Rsh32Ux16 (Const32 [0]) _) 21512 // cond: 21513 // result: (Const32 [0]) 21514 for { 21515 _ = v.Args[1] 21516 v_0 := v.Args[0] 21517 if v_0.Op != OpConst32 { 21518 break 21519 } 21520 if v_0.AuxInt != 0 { 21521 break 21522 } 21523 v.reset(OpConst32) 21524 v.AuxInt = 0 21525 return true 21526 } 21527 return false 21528 } 21529 func rewriteValuegeneric_OpRsh32Ux32_0(v *Value) bool { 21530 b := v.Block 21531 _ = b 21532 // match: (Rsh32Ux32 <t> x (Const32 [c])) 21533 // cond: 21534 // result: (Rsh32Ux64 x (Const64 <t> [int64(uint32(c))])) 21535 for { 21536 t := v.Type 21537 _ = v.Args[1] 21538 x := v.Args[0] 21539 v_1 := v.Args[1] 21540 if v_1.Op != OpConst32 { 21541 break 21542 } 21543 c := v_1.AuxInt 21544 v.reset(OpRsh32Ux64) 21545 v.AddArg(x) 21546 v0 := b.NewValue0(v.Pos, OpConst64, t) 21547 v0.AuxInt = int64(uint32(c)) 21548 v.AddArg(v0) 21549 return true 21550 } 21551 // match: (Rsh32Ux32 (Const32 [0]) _) 21552 // cond: 21553 // result: (Const32 [0]) 21554 for { 21555 _ = v.Args[1] 21556 v_0 := v.Args[0] 21557 if v_0.Op != OpConst32 { 21558 break 21559 } 21560 if v_0.AuxInt != 0 { 21561 break 21562 } 21563 v.reset(OpConst32) 21564 v.AuxInt = 0 21565 return true 21566 } 21567 return false 21568 } 21569 func rewriteValuegeneric_OpRsh32Ux64_0(v *Value) bool { 21570 b := v.Block 21571 _ = b 21572 typ := &b.Func.Config.Types 21573 _ = typ 21574 // match: (Rsh32Ux64 (Const32 [c]) (Const64 [d])) 21575 // cond: 21576 // result: (Const32 [int64(int32(uint32(c) >> uint64(d)))]) 21577 for { 21578 _ = v.Args[1] 21579 v_0 := v.Args[0] 21580 if v_0.Op != OpConst32 { 21581 break 21582 } 21583 c := v_0.AuxInt 21584 v_1 := v.Args[1] 21585 if v_1.Op != OpConst64 { 21586 break 21587 } 21588 d := v_1.AuxInt 21589 v.reset(OpConst32) 21590 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 21591 return true 21592 } 21593 // match: (Rsh32Ux64 x (Const64 [0])) 21594 // cond: 21595 // result: x 21596 for { 21597 _ = v.Args[1] 21598 x := v.Args[0] 21599 v_1 := v.Args[1] 21600 if v_1.Op != OpConst64 { 21601 break 21602 } 21603 if v_1.AuxInt != 0 { 21604 break 21605 } 21606 v.reset(OpCopy) 21607 v.Type = x.Type 21608 v.AddArg(x) 21609 return true 21610 } 21611 // match: (Rsh32Ux64 (Const32 [0]) _) 21612 // cond: 21613 // result: (Const32 [0]) 21614 for { 21615 _ = v.Args[1] 21616 v_0 := v.Args[0] 21617 if v_0.Op != OpConst32 { 21618 break 21619 } 21620 if v_0.AuxInt != 0 { 21621 break 21622 } 21623 v.reset(OpConst32) 21624 v.AuxInt = 0 21625 return true 21626 } 21627 // match: (Rsh32Ux64 _ (Const64 [c])) 21628 // cond: uint64(c) >= 32 21629 // result: (Const32 [0]) 21630 for { 21631 _ = v.Args[1] 21632 v_1 := v.Args[1] 21633 if v_1.Op != OpConst64 { 21634 break 21635 } 21636 c := v_1.AuxInt 21637 if !(uint64(c) >= 32) { 21638 break 21639 } 21640 v.reset(OpConst32) 21641 v.AuxInt = 0 21642 return true 21643 } 21644 // match: (Rsh32Ux64 <t> (Rsh32Ux64 x (Const64 [c])) (Const64 [d])) 21645 // cond: !uaddOvf(c,d) 21646 // result: (Rsh32Ux64 x (Const64 <t> [c+d])) 21647 for { 21648 t := v.Type 21649 _ = v.Args[1] 21650 v_0 := v.Args[0] 21651 if v_0.Op != OpRsh32Ux64 { 21652 break 21653 } 21654 _ = v_0.Args[1] 21655 x := v_0.Args[0] 21656 v_0_1 := v_0.Args[1] 21657 if v_0_1.Op != OpConst64 { 21658 break 21659 } 21660 c := v_0_1.AuxInt 21661 v_1 := v.Args[1] 21662 if v_1.Op != OpConst64 { 21663 break 21664 } 21665 d := v_1.AuxInt 21666 if !(!uaddOvf(c, d)) { 21667 break 21668 } 21669 v.reset(OpRsh32Ux64) 21670 v.AddArg(x) 21671 v0 := b.NewValue0(v.Pos, OpConst64, t) 21672 v0.AuxInt = c + d 21673 v.AddArg(v0) 21674 return true 21675 } 21676 // match: (Rsh32Ux64 (Lsh32x64 (Rsh32Ux64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 21677 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 21678 // result: (Rsh32Ux64 x (Const64 <typ.UInt64> [c1-c2+c3])) 21679 for { 21680 _ = v.Args[1] 21681 v_0 := v.Args[0] 21682 if v_0.Op != OpLsh32x64 { 21683 break 21684 } 21685 _ = v_0.Args[1] 21686 v_0_0 := v_0.Args[0] 21687 if v_0_0.Op != OpRsh32Ux64 { 21688 break 21689 } 21690 _ = v_0_0.Args[1] 21691 x := v_0_0.Args[0] 21692 v_0_0_1 := v_0_0.Args[1] 21693 if v_0_0_1.Op != OpConst64 { 21694 break 21695 } 21696 c1 := v_0_0_1.AuxInt 21697 v_0_1 := v_0.Args[1] 21698 if v_0_1.Op != OpConst64 { 21699 break 21700 } 21701 c2 := v_0_1.AuxInt 21702 v_1 := v.Args[1] 21703 if v_1.Op != OpConst64 { 21704 break 21705 } 21706 c3 := v_1.AuxInt 21707 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 21708 break 21709 } 21710 v.reset(OpRsh32Ux64) 21711 v.AddArg(x) 21712 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 21713 v0.AuxInt = c1 - c2 + c3 21714 v.AddArg(v0) 21715 return true 21716 } 21717 // match: (Rsh32Ux64 (Lsh32x64 x (Const64 [24])) (Const64 [24])) 21718 // cond: 21719 // result: (ZeroExt8to32 (Trunc32to8 <typ.UInt8> x)) 21720 for { 21721 _ = v.Args[1] 21722 v_0 := v.Args[0] 21723 if v_0.Op != OpLsh32x64 { 21724 break 21725 } 21726 _ = v_0.Args[1] 21727 x := v_0.Args[0] 21728 v_0_1 := v_0.Args[1] 21729 if v_0_1.Op != OpConst64 { 21730 break 21731 } 21732 if v_0_1.AuxInt != 24 { 21733 break 21734 } 21735 v_1 := v.Args[1] 21736 if v_1.Op != OpConst64 { 21737 break 21738 } 21739 if v_1.AuxInt != 24 { 21740 break 21741 } 21742 v.reset(OpZeroExt8to32) 21743 v0 := b.NewValue0(v.Pos, OpTrunc32to8, typ.UInt8) 21744 v0.AddArg(x) 21745 v.AddArg(v0) 21746 return true 21747 } 21748 // match: (Rsh32Ux64 (Lsh32x64 x (Const64 [16])) (Const64 [16])) 21749 // cond: 21750 // result: (ZeroExt16to32 (Trunc32to16 <typ.UInt16> x)) 21751 for { 21752 _ = v.Args[1] 21753 v_0 := v.Args[0] 21754 if v_0.Op != OpLsh32x64 { 21755 break 21756 } 21757 _ = v_0.Args[1] 21758 x := v_0.Args[0] 21759 v_0_1 := v_0.Args[1] 21760 if v_0_1.Op != OpConst64 { 21761 break 21762 } 21763 if v_0_1.AuxInt != 16 { 21764 break 21765 } 21766 v_1 := v.Args[1] 21767 if v_1.Op != OpConst64 { 21768 break 21769 } 21770 if v_1.AuxInt != 16 { 21771 break 21772 } 21773 v.reset(OpZeroExt16to32) 21774 v0 := b.NewValue0(v.Pos, OpTrunc32to16, typ.UInt16) 21775 v0.AddArg(x) 21776 v.AddArg(v0) 21777 return true 21778 } 21779 return false 21780 } 21781 func rewriteValuegeneric_OpRsh32Ux8_0(v *Value) bool { 21782 b := v.Block 21783 _ = b 21784 // match: (Rsh32Ux8 <t> x (Const8 [c])) 21785 // cond: 21786 // result: (Rsh32Ux64 x (Const64 <t> [int64(uint8(c))])) 21787 for { 21788 t := v.Type 21789 _ = v.Args[1] 21790 x := v.Args[0] 21791 v_1 := v.Args[1] 21792 if v_1.Op != OpConst8 { 21793 break 21794 } 21795 c := v_1.AuxInt 21796 v.reset(OpRsh32Ux64) 21797 v.AddArg(x) 21798 v0 := b.NewValue0(v.Pos, OpConst64, t) 21799 v0.AuxInt = int64(uint8(c)) 21800 v.AddArg(v0) 21801 return true 21802 } 21803 // match: (Rsh32Ux8 (Const32 [0]) _) 21804 // cond: 21805 // result: (Const32 [0]) 21806 for { 21807 _ = v.Args[1] 21808 v_0 := v.Args[0] 21809 if v_0.Op != OpConst32 { 21810 break 21811 } 21812 if v_0.AuxInt != 0 { 21813 break 21814 } 21815 v.reset(OpConst32) 21816 v.AuxInt = 0 21817 return true 21818 } 21819 return false 21820 } 21821 func rewriteValuegeneric_OpRsh32x16_0(v *Value) bool { 21822 b := v.Block 21823 _ = b 21824 // match: (Rsh32x16 <t> x (Const16 [c])) 21825 // cond: 21826 // result: (Rsh32x64 x (Const64 <t> [int64(uint16(c))])) 21827 for { 21828 t := v.Type 21829 _ = v.Args[1] 21830 x := v.Args[0] 21831 v_1 := v.Args[1] 21832 if v_1.Op != OpConst16 { 21833 break 21834 } 21835 c := v_1.AuxInt 21836 v.reset(OpRsh32x64) 21837 v.AddArg(x) 21838 v0 := b.NewValue0(v.Pos, OpConst64, t) 21839 v0.AuxInt = int64(uint16(c)) 21840 v.AddArg(v0) 21841 return true 21842 } 21843 // match: (Rsh32x16 (Const32 [0]) _) 21844 // cond: 21845 // result: (Const32 [0]) 21846 for { 21847 _ = v.Args[1] 21848 v_0 := v.Args[0] 21849 if v_0.Op != OpConst32 { 21850 break 21851 } 21852 if v_0.AuxInt != 0 { 21853 break 21854 } 21855 v.reset(OpConst32) 21856 v.AuxInt = 0 21857 return true 21858 } 21859 return false 21860 } 21861 func rewriteValuegeneric_OpRsh32x32_0(v *Value) bool { 21862 b := v.Block 21863 _ = b 21864 // match: (Rsh32x32 <t> x (Const32 [c])) 21865 // cond: 21866 // result: (Rsh32x64 x (Const64 <t> [int64(uint32(c))])) 21867 for { 21868 t := v.Type 21869 _ = v.Args[1] 21870 x := v.Args[0] 21871 v_1 := v.Args[1] 21872 if v_1.Op != OpConst32 { 21873 break 21874 } 21875 c := v_1.AuxInt 21876 v.reset(OpRsh32x64) 21877 v.AddArg(x) 21878 v0 := b.NewValue0(v.Pos, OpConst64, t) 21879 v0.AuxInt = int64(uint32(c)) 21880 v.AddArg(v0) 21881 return true 21882 } 21883 // match: (Rsh32x32 (Const32 [0]) _) 21884 // cond: 21885 // result: (Const32 [0]) 21886 for { 21887 _ = v.Args[1] 21888 v_0 := v.Args[0] 21889 if v_0.Op != OpConst32 { 21890 break 21891 } 21892 if v_0.AuxInt != 0 { 21893 break 21894 } 21895 v.reset(OpConst32) 21896 v.AuxInt = 0 21897 return true 21898 } 21899 return false 21900 } 21901 func rewriteValuegeneric_OpRsh32x64_0(v *Value) bool { 21902 b := v.Block 21903 _ = b 21904 typ := &b.Func.Config.Types 21905 _ = typ 21906 // match: (Rsh32x64 (Const32 [c]) (Const64 [d])) 21907 // cond: 21908 // result: (Const32 [int64(int32(c) >> uint64(d))]) 21909 for { 21910 _ = v.Args[1] 21911 v_0 := v.Args[0] 21912 if v_0.Op != OpConst32 { 21913 break 21914 } 21915 c := v_0.AuxInt 21916 v_1 := v.Args[1] 21917 if v_1.Op != OpConst64 { 21918 break 21919 } 21920 d := v_1.AuxInt 21921 v.reset(OpConst32) 21922 v.AuxInt = int64(int32(c) >> uint64(d)) 21923 return true 21924 } 21925 // match: (Rsh32x64 x (Const64 [0])) 21926 // cond: 21927 // result: x 21928 for { 21929 _ = v.Args[1] 21930 x := v.Args[0] 21931 v_1 := v.Args[1] 21932 if v_1.Op != OpConst64 { 21933 break 21934 } 21935 if v_1.AuxInt != 0 { 21936 break 21937 } 21938 v.reset(OpCopy) 21939 v.Type = x.Type 21940 v.AddArg(x) 21941 return true 21942 } 21943 // match: (Rsh32x64 (Const32 [0]) _) 21944 // cond: 21945 // result: (Const32 [0]) 21946 for { 21947 _ = v.Args[1] 21948 v_0 := v.Args[0] 21949 if v_0.Op != OpConst32 { 21950 break 21951 } 21952 if v_0.AuxInt != 0 { 21953 break 21954 } 21955 v.reset(OpConst32) 21956 v.AuxInt = 0 21957 return true 21958 } 21959 // match: (Rsh32x64 <t> (Rsh32x64 x (Const64 [c])) (Const64 [d])) 21960 // cond: !uaddOvf(c,d) 21961 // result: (Rsh32x64 x (Const64 <t> [c+d])) 21962 for { 21963 t := v.Type 21964 _ = v.Args[1] 21965 v_0 := v.Args[0] 21966 if v_0.Op != OpRsh32x64 { 21967 break 21968 } 21969 _ = v_0.Args[1] 21970 x := v_0.Args[0] 21971 v_0_1 := v_0.Args[1] 21972 if v_0_1.Op != OpConst64 { 21973 break 21974 } 21975 c := v_0_1.AuxInt 21976 v_1 := v.Args[1] 21977 if v_1.Op != OpConst64 { 21978 break 21979 } 21980 d := v_1.AuxInt 21981 if !(!uaddOvf(c, d)) { 21982 break 21983 } 21984 v.reset(OpRsh32x64) 21985 v.AddArg(x) 21986 v0 := b.NewValue0(v.Pos, OpConst64, t) 21987 v0.AuxInt = c + d 21988 v.AddArg(v0) 21989 return true 21990 } 21991 // match: (Rsh32x64 (Lsh32x64 x (Const64 [24])) (Const64 [24])) 21992 // cond: 21993 // result: (SignExt8to32 (Trunc32to8 <typ.Int8> x)) 21994 for { 21995 _ = v.Args[1] 21996 v_0 := v.Args[0] 21997 if v_0.Op != OpLsh32x64 { 21998 break 21999 } 22000 _ = v_0.Args[1] 22001 x := v_0.Args[0] 22002 v_0_1 := v_0.Args[1] 22003 if v_0_1.Op != OpConst64 { 22004 break 22005 } 22006 if v_0_1.AuxInt != 24 { 22007 break 22008 } 22009 v_1 := v.Args[1] 22010 if v_1.Op != OpConst64 { 22011 break 22012 } 22013 if v_1.AuxInt != 24 { 22014 break 22015 } 22016 v.reset(OpSignExt8to32) 22017 v0 := b.NewValue0(v.Pos, OpTrunc32to8, typ.Int8) 22018 v0.AddArg(x) 22019 v.AddArg(v0) 22020 return true 22021 } 22022 // match: (Rsh32x64 (Lsh32x64 x (Const64 [16])) (Const64 [16])) 22023 // cond: 22024 // result: (SignExt16to32 (Trunc32to16 <typ.Int16> x)) 22025 for { 22026 _ = v.Args[1] 22027 v_0 := v.Args[0] 22028 if v_0.Op != OpLsh32x64 { 22029 break 22030 } 22031 _ = v_0.Args[1] 22032 x := v_0.Args[0] 22033 v_0_1 := v_0.Args[1] 22034 if v_0_1.Op != OpConst64 { 22035 break 22036 } 22037 if v_0_1.AuxInt != 16 { 22038 break 22039 } 22040 v_1 := v.Args[1] 22041 if v_1.Op != OpConst64 { 22042 break 22043 } 22044 if v_1.AuxInt != 16 { 22045 break 22046 } 22047 v.reset(OpSignExt16to32) 22048 v0 := b.NewValue0(v.Pos, OpTrunc32to16, typ.Int16) 22049 v0.AddArg(x) 22050 v.AddArg(v0) 22051 return true 22052 } 22053 return false 22054 } 22055 func rewriteValuegeneric_OpRsh32x8_0(v *Value) bool { 22056 b := v.Block 22057 _ = b 22058 // match: (Rsh32x8 <t> x (Const8 [c])) 22059 // cond: 22060 // result: (Rsh32x64 x (Const64 <t> [int64(uint8(c))])) 22061 for { 22062 t := v.Type 22063 _ = v.Args[1] 22064 x := v.Args[0] 22065 v_1 := v.Args[1] 22066 if v_1.Op != OpConst8 { 22067 break 22068 } 22069 c := v_1.AuxInt 22070 v.reset(OpRsh32x64) 22071 v.AddArg(x) 22072 v0 := b.NewValue0(v.Pos, OpConst64, t) 22073 v0.AuxInt = int64(uint8(c)) 22074 v.AddArg(v0) 22075 return true 22076 } 22077 // match: (Rsh32x8 (Const32 [0]) _) 22078 // cond: 22079 // result: (Const32 [0]) 22080 for { 22081 _ = v.Args[1] 22082 v_0 := v.Args[0] 22083 if v_0.Op != OpConst32 { 22084 break 22085 } 22086 if v_0.AuxInt != 0 { 22087 break 22088 } 22089 v.reset(OpConst32) 22090 v.AuxInt = 0 22091 return true 22092 } 22093 return false 22094 } 22095 func rewriteValuegeneric_OpRsh64Ux16_0(v *Value) bool { 22096 b := v.Block 22097 _ = b 22098 // match: (Rsh64Ux16 <t> x (Const16 [c])) 22099 // cond: 22100 // result: (Rsh64Ux64 x (Const64 <t> [int64(uint16(c))])) 22101 for { 22102 t := v.Type 22103 _ = v.Args[1] 22104 x := v.Args[0] 22105 v_1 := v.Args[1] 22106 if v_1.Op != OpConst16 { 22107 break 22108 } 22109 c := v_1.AuxInt 22110 v.reset(OpRsh64Ux64) 22111 v.AddArg(x) 22112 v0 := b.NewValue0(v.Pos, OpConst64, t) 22113 v0.AuxInt = int64(uint16(c)) 22114 v.AddArg(v0) 22115 return true 22116 } 22117 // match: (Rsh64Ux16 (Const64 [0]) _) 22118 // cond: 22119 // result: (Const64 [0]) 22120 for { 22121 _ = v.Args[1] 22122 v_0 := v.Args[0] 22123 if v_0.Op != OpConst64 { 22124 break 22125 } 22126 if v_0.AuxInt != 0 { 22127 break 22128 } 22129 v.reset(OpConst64) 22130 v.AuxInt = 0 22131 return true 22132 } 22133 return false 22134 } 22135 func rewriteValuegeneric_OpRsh64Ux32_0(v *Value) bool { 22136 b := v.Block 22137 _ = b 22138 // match: (Rsh64Ux32 <t> x (Const32 [c])) 22139 // cond: 22140 // result: (Rsh64Ux64 x (Const64 <t> [int64(uint32(c))])) 22141 for { 22142 t := v.Type 22143 _ = v.Args[1] 22144 x := v.Args[0] 22145 v_1 := v.Args[1] 22146 if v_1.Op != OpConst32 { 22147 break 22148 } 22149 c := v_1.AuxInt 22150 v.reset(OpRsh64Ux64) 22151 v.AddArg(x) 22152 v0 := b.NewValue0(v.Pos, OpConst64, t) 22153 v0.AuxInt = int64(uint32(c)) 22154 v.AddArg(v0) 22155 return true 22156 } 22157 // match: (Rsh64Ux32 (Const64 [0]) _) 22158 // cond: 22159 // result: (Const64 [0]) 22160 for { 22161 _ = v.Args[1] 22162 v_0 := v.Args[0] 22163 if v_0.Op != OpConst64 { 22164 break 22165 } 22166 if v_0.AuxInt != 0 { 22167 break 22168 } 22169 v.reset(OpConst64) 22170 v.AuxInt = 0 22171 return true 22172 } 22173 return false 22174 } 22175 func rewriteValuegeneric_OpRsh64Ux64_0(v *Value) bool { 22176 b := v.Block 22177 _ = b 22178 typ := &b.Func.Config.Types 22179 _ = typ 22180 // match: (Rsh64Ux64 (Const64 [c]) (Const64 [d])) 22181 // cond: 22182 // result: (Const64 [int64(uint64(c) >> uint64(d))]) 22183 for { 22184 _ = v.Args[1] 22185 v_0 := v.Args[0] 22186 if v_0.Op != OpConst64 { 22187 break 22188 } 22189 c := v_0.AuxInt 22190 v_1 := v.Args[1] 22191 if v_1.Op != OpConst64 { 22192 break 22193 } 22194 d := v_1.AuxInt 22195 v.reset(OpConst64) 22196 v.AuxInt = int64(uint64(c) >> uint64(d)) 22197 return true 22198 } 22199 // match: (Rsh64Ux64 x (Const64 [0])) 22200 // cond: 22201 // result: x 22202 for { 22203 _ = v.Args[1] 22204 x := v.Args[0] 22205 v_1 := v.Args[1] 22206 if v_1.Op != OpConst64 { 22207 break 22208 } 22209 if v_1.AuxInt != 0 { 22210 break 22211 } 22212 v.reset(OpCopy) 22213 v.Type = x.Type 22214 v.AddArg(x) 22215 return true 22216 } 22217 // match: (Rsh64Ux64 (Const64 [0]) _) 22218 // cond: 22219 // result: (Const64 [0]) 22220 for { 22221 _ = v.Args[1] 22222 v_0 := v.Args[0] 22223 if v_0.Op != OpConst64 { 22224 break 22225 } 22226 if v_0.AuxInt != 0 { 22227 break 22228 } 22229 v.reset(OpConst64) 22230 v.AuxInt = 0 22231 return true 22232 } 22233 // match: (Rsh64Ux64 _ (Const64 [c])) 22234 // cond: uint64(c) >= 64 22235 // result: (Const64 [0]) 22236 for { 22237 _ = v.Args[1] 22238 v_1 := v.Args[1] 22239 if v_1.Op != OpConst64 { 22240 break 22241 } 22242 c := v_1.AuxInt 22243 if !(uint64(c) >= 64) { 22244 break 22245 } 22246 v.reset(OpConst64) 22247 v.AuxInt = 0 22248 return true 22249 } 22250 // match: (Rsh64Ux64 <t> (Rsh64Ux64 x (Const64 [c])) (Const64 [d])) 22251 // cond: !uaddOvf(c,d) 22252 // result: (Rsh64Ux64 x (Const64 <t> [c+d])) 22253 for { 22254 t := v.Type 22255 _ = v.Args[1] 22256 v_0 := v.Args[0] 22257 if v_0.Op != OpRsh64Ux64 { 22258 break 22259 } 22260 _ = v_0.Args[1] 22261 x := v_0.Args[0] 22262 v_0_1 := v_0.Args[1] 22263 if v_0_1.Op != OpConst64 { 22264 break 22265 } 22266 c := v_0_1.AuxInt 22267 v_1 := v.Args[1] 22268 if v_1.Op != OpConst64 { 22269 break 22270 } 22271 d := v_1.AuxInt 22272 if !(!uaddOvf(c, d)) { 22273 break 22274 } 22275 v.reset(OpRsh64Ux64) 22276 v.AddArg(x) 22277 v0 := b.NewValue0(v.Pos, OpConst64, t) 22278 v0.AuxInt = c + d 22279 v.AddArg(v0) 22280 return true 22281 } 22282 // match: (Rsh64Ux64 (Lsh64x64 (Rsh64Ux64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 22283 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 22284 // result: (Rsh64Ux64 x (Const64 <typ.UInt64> [c1-c2+c3])) 22285 for { 22286 _ = v.Args[1] 22287 v_0 := v.Args[0] 22288 if v_0.Op != OpLsh64x64 { 22289 break 22290 } 22291 _ = v_0.Args[1] 22292 v_0_0 := v_0.Args[0] 22293 if v_0_0.Op != OpRsh64Ux64 { 22294 break 22295 } 22296 _ = v_0_0.Args[1] 22297 x := v_0_0.Args[0] 22298 v_0_0_1 := v_0_0.Args[1] 22299 if v_0_0_1.Op != OpConst64 { 22300 break 22301 } 22302 c1 := v_0_0_1.AuxInt 22303 v_0_1 := v_0.Args[1] 22304 if v_0_1.Op != OpConst64 { 22305 break 22306 } 22307 c2 := v_0_1.AuxInt 22308 v_1 := v.Args[1] 22309 if v_1.Op != OpConst64 { 22310 break 22311 } 22312 c3 := v_1.AuxInt 22313 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 22314 break 22315 } 22316 v.reset(OpRsh64Ux64) 22317 v.AddArg(x) 22318 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 22319 v0.AuxInt = c1 - c2 + c3 22320 v.AddArg(v0) 22321 return true 22322 } 22323 // match: (Rsh64Ux64 (Lsh64x64 x (Const64 [56])) (Const64 [56])) 22324 // cond: 22325 // result: (ZeroExt8to64 (Trunc64to8 <typ.UInt8> x)) 22326 for { 22327 _ = v.Args[1] 22328 v_0 := v.Args[0] 22329 if v_0.Op != OpLsh64x64 { 22330 break 22331 } 22332 _ = v_0.Args[1] 22333 x := v_0.Args[0] 22334 v_0_1 := v_0.Args[1] 22335 if v_0_1.Op != OpConst64 { 22336 break 22337 } 22338 if v_0_1.AuxInt != 56 { 22339 break 22340 } 22341 v_1 := v.Args[1] 22342 if v_1.Op != OpConst64 { 22343 break 22344 } 22345 if v_1.AuxInt != 56 { 22346 break 22347 } 22348 v.reset(OpZeroExt8to64) 22349 v0 := b.NewValue0(v.Pos, OpTrunc64to8, typ.UInt8) 22350 v0.AddArg(x) 22351 v.AddArg(v0) 22352 return true 22353 } 22354 // match: (Rsh64Ux64 (Lsh64x64 x (Const64 [48])) (Const64 [48])) 22355 // cond: 22356 // result: (ZeroExt16to64 (Trunc64to16 <typ.UInt16> x)) 22357 for { 22358 _ = v.Args[1] 22359 v_0 := v.Args[0] 22360 if v_0.Op != OpLsh64x64 { 22361 break 22362 } 22363 _ = v_0.Args[1] 22364 x := v_0.Args[0] 22365 v_0_1 := v_0.Args[1] 22366 if v_0_1.Op != OpConst64 { 22367 break 22368 } 22369 if v_0_1.AuxInt != 48 { 22370 break 22371 } 22372 v_1 := v.Args[1] 22373 if v_1.Op != OpConst64 { 22374 break 22375 } 22376 if v_1.AuxInt != 48 { 22377 break 22378 } 22379 v.reset(OpZeroExt16to64) 22380 v0 := b.NewValue0(v.Pos, OpTrunc64to16, typ.UInt16) 22381 v0.AddArg(x) 22382 v.AddArg(v0) 22383 return true 22384 } 22385 // match: (Rsh64Ux64 (Lsh64x64 x (Const64 [32])) (Const64 [32])) 22386 // cond: 22387 // result: (ZeroExt32to64 (Trunc64to32 <typ.UInt32> x)) 22388 for { 22389 _ = v.Args[1] 22390 v_0 := v.Args[0] 22391 if v_0.Op != OpLsh64x64 { 22392 break 22393 } 22394 _ = v_0.Args[1] 22395 x := v_0.Args[0] 22396 v_0_1 := v_0.Args[1] 22397 if v_0_1.Op != OpConst64 { 22398 break 22399 } 22400 if v_0_1.AuxInt != 32 { 22401 break 22402 } 22403 v_1 := v.Args[1] 22404 if v_1.Op != OpConst64 { 22405 break 22406 } 22407 if v_1.AuxInt != 32 { 22408 break 22409 } 22410 v.reset(OpZeroExt32to64) 22411 v0 := b.NewValue0(v.Pos, OpTrunc64to32, typ.UInt32) 22412 v0.AddArg(x) 22413 v.AddArg(v0) 22414 return true 22415 } 22416 return false 22417 } 22418 func rewriteValuegeneric_OpRsh64Ux8_0(v *Value) bool { 22419 b := v.Block 22420 _ = b 22421 // match: (Rsh64Ux8 <t> x (Const8 [c])) 22422 // cond: 22423 // result: (Rsh64Ux64 x (Const64 <t> [int64(uint8(c))])) 22424 for { 22425 t := v.Type 22426 _ = v.Args[1] 22427 x := v.Args[0] 22428 v_1 := v.Args[1] 22429 if v_1.Op != OpConst8 { 22430 break 22431 } 22432 c := v_1.AuxInt 22433 v.reset(OpRsh64Ux64) 22434 v.AddArg(x) 22435 v0 := b.NewValue0(v.Pos, OpConst64, t) 22436 v0.AuxInt = int64(uint8(c)) 22437 v.AddArg(v0) 22438 return true 22439 } 22440 // match: (Rsh64Ux8 (Const64 [0]) _) 22441 // cond: 22442 // result: (Const64 [0]) 22443 for { 22444 _ = v.Args[1] 22445 v_0 := v.Args[0] 22446 if v_0.Op != OpConst64 { 22447 break 22448 } 22449 if v_0.AuxInt != 0 { 22450 break 22451 } 22452 v.reset(OpConst64) 22453 v.AuxInt = 0 22454 return true 22455 } 22456 return false 22457 } 22458 func rewriteValuegeneric_OpRsh64x16_0(v *Value) bool { 22459 b := v.Block 22460 _ = b 22461 // match: (Rsh64x16 <t> x (Const16 [c])) 22462 // cond: 22463 // result: (Rsh64x64 x (Const64 <t> [int64(uint16(c))])) 22464 for { 22465 t := v.Type 22466 _ = v.Args[1] 22467 x := v.Args[0] 22468 v_1 := v.Args[1] 22469 if v_1.Op != OpConst16 { 22470 break 22471 } 22472 c := v_1.AuxInt 22473 v.reset(OpRsh64x64) 22474 v.AddArg(x) 22475 v0 := b.NewValue0(v.Pos, OpConst64, t) 22476 v0.AuxInt = int64(uint16(c)) 22477 v.AddArg(v0) 22478 return true 22479 } 22480 // match: (Rsh64x16 (Const64 [0]) _) 22481 // cond: 22482 // result: (Const64 [0]) 22483 for { 22484 _ = v.Args[1] 22485 v_0 := v.Args[0] 22486 if v_0.Op != OpConst64 { 22487 break 22488 } 22489 if v_0.AuxInt != 0 { 22490 break 22491 } 22492 v.reset(OpConst64) 22493 v.AuxInt = 0 22494 return true 22495 } 22496 return false 22497 } 22498 func rewriteValuegeneric_OpRsh64x32_0(v *Value) bool { 22499 b := v.Block 22500 _ = b 22501 // match: (Rsh64x32 <t> x (Const32 [c])) 22502 // cond: 22503 // result: (Rsh64x64 x (Const64 <t> [int64(uint32(c))])) 22504 for { 22505 t := v.Type 22506 _ = v.Args[1] 22507 x := v.Args[0] 22508 v_1 := v.Args[1] 22509 if v_1.Op != OpConst32 { 22510 break 22511 } 22512 c := v_1.AuxInt 22513 v.reset(OpRsh64x64) 22514 v.AddArg(x) 22515 v0 := b.NewValue0(v.Pos, OpConst64, t) 22516 v0.AuxInt = int64(uint32(c)) 22517 v.AddArg(v0) 22518 return true 22519 } 22520 // match: (Rsh64x32 (Const64 [0]) _) 22521 // cond: 22522 // result: (Const64 [0]) 22523 for { 22524 _ = v.Args[1] 22525 v_0 := v.Args[0] 22526 if v_0.Op != OpConst64 { 22527 break 22528 } 22529 if v_0.AuxInt != 0 { 22530 break 22531 } 22532 v.reset(OpConst64) 22533 v.AuxInt = 0 22534 return true 22535 } 22536 return false 22537 } 22538 func rewriteValuegeneric_OpRsh64x64_0(v *Value) bool { 22539 b := v.Block 22540 _ = b 22541 typ := &b.Func.Config.Types 22542 _ = typ 22543 // match: (Rsh64x64 (Const64 [c]) (Const64 [d])) 22544 // cond: 22545 // result: (Const64 [c >> uint64(d)]) 22546 for { 22547 _ = v.Args[1] 22548 v_0 := v.Args[0] 22549 if v_0.Op != OpConst64 { 22550 break 22551 } 22552 c := v_0.AuxInt 22553 v_1 := v.Args[1] 22554 if v_1.Op != OpConst64 { 22555 break 22556 } 22557 d := v_1.AuxInt 22558 v.reset(OpConst64) 22559 v.AuxInt = c >> uint64(d) 22560 return true 22561 } 22562 // match: (Rsh64x64 x (Const64 [0])) 22563 // cond: 22564 // result: x 22565 for { 22566 _ = v.Args[1] 22567 x := v.Args[0] 22568 v_1 := v.Args[1] 22569 if v_1.Op != OpConst64 { 22570 break 22571 } 22572 if v_1.AuxInt != 0 { 22573 break 22574 } 22575 v.reset(OpCopy) 22576 v.Type = x.Type 22577 v.AddArg(x) 22578 return true 22579 } 22580 // match: (Rsh64x64 (Const64 [0]) _) 22581 // cond: 22582 // result: (Const64 [0]) 22583 for { 22584 _ = v.Args[1] 22585 v_0 := v.Args[0] 22586 if v_0.Op != OpConst64 { 22587 break 22588 } 22589 if v_0.AuxInt != 0 { 22590 break 22591 } 22592 v.reset(OpConst64) 22593 v.AuxInt = 0 22594 return true 22595 } 22596 // match: (Rsh64x64 <t> (Rsh64x64 x (Const64 [c])) (Const64 [d])) 22597 // cond: !uaddOvf(c,d) 22598 // result: (Rsh64x64 x (Const64 <t> [c+d])) 22599 for { 22600 t := v.Type 22601 _ = v.Args[1] 22602 v_0 := v.Args[0] 22603 if v_0.Op != OpRsh64x64 { 22604 break 22605 } 22606 _ = v_0.Args[1] 22607 x := v_0.Args[0] 22608 v_0_1 := v_0.Args[1] 22609 if v_0_1.Op != OpConst64 { 22610 break 22611 } 22612 c := v_0_1.AuxInt 22613 v_1 := v.Args[1] 22614 if v_1.Op != OpConst64 { 22615 break 22616 } 22617 d := v_1.AuxInt 22618 if !(!uaddOvf(c, d)) { 22619 break 22620 } 22621 v.reset(OpRsh64x64) 22622 v.AddArg(x) 22623 v0 := b.NewValue0(v.Pos, OpConst64, t) 22624 v0.AuxInt = c + d 22625 v.AddArg(v0) 22626 return true 22627 } 22628 // match: (Rsh64x64 (Lsh64x64 x (Const64 [56])) (Const64 [56])) 22629 // cond: 22630 // result: (SignExt8to64 (Trunc64to8 <typ.Int8> x)) 22631 for { 22632 _ = v.Args[1] 22633 v_0 := v.Args[0] 22634 if v_0.Op != OpLsh64x64 { 22635 break 22636 } 22637 _ = v_0.Args[1] 22638 x := v_0.Args[0] 22639 v_0_1 := v_0.Args[1] 22640 if v_0_1.Op != OpConst64 { 22641 break 22642 } 22643 if v_0_1.AuxInt != 56 { 22644 break 22645 } 22646 v_1 := v.Args[1] 22647 if v_1.Op != OpConst64 { 22648 break 22649 } 22650 if v_1.AuxInt != 56 { 22651 break 22652 } 22653 v.reset(OpSignExt8to64) 22654 v0 := b.NewValue0(v.Pos, OpTrunc64to8, typ.Int8) 22655 v0.AddArg(x) 22656 v.AddArg(v0) 22657 return true 22658 } 22659 // match: (Rsh64x64 (Lsh64x64 x (Const64 [48])) (Const64 [48])) 22660 // cond: 22661 // result: (SignExt16to64 (Trunc64to16 <typ.Int16> x)) 22662 for { 22663 _ = v.Args[1] 22664 v_0 := v.Args[0] 22665 if v_0.Op != OpLsh64x64 { 22666 break 22667 } 22668 _ = v_0.Args[1] 22669 x := v_0.Args[0] 22670 v_0_1 := v_0.Args[1] 22671 if v_0_1.Op != OpConst64 { 22672 break 22673 } 22674 if v_0_1.AuxInt != 48 { 22675 break 22676 } 22677 v_1 := v.Args[1] 22678 if v_1.Op != OpConst64 { 22679 break 22680 } 22681 if v_1.AuxInt != 48 { 22682 break 22683 } 22684 v.reset(OpSignExt16to64) 22685 v0 := b.NewValue0(v.Pos, OpTrunc64to16, typ.Int16) 22686 v0.AddArg(x) 22687 v.AddArg(v0) 22688 return true 22689 } 22690 // match: (Rsh64x64 (Lsh64x64 x (Const64 [32])) (Const64 [32])) 22691 // cond: 22692 // result: (SignExt32to64 (Trunc64to32 <typ.Int32> x)) 22693 for { 22694 _ = v.Args[1] 22695 v_0 := v.Args[0] 22696 if v_0.Op != OpLsh64x64 { 22697 break 22698 } 22699 _ = v_0.Args[1] 22700 x := v_0.Args[0] 22701 v_0_1 := v_0.Args[1] 22702 if v_0_1.Op != OpConst64 { 22703 break 22704 } 22705 if v_0_1.AuxInt != 32 { 22706 break 22707 } 22708 v_1 := v.Args[1] 22709 if v_1.Op != OpConst64 { 22710 break 22711 } 22712 if v_1.AuxInt != 32 { 22713 break 22714 } 22715 v.reset(OpSignExt32to64) 22716 v0 := b.NewValue0(v.Pos, OpTrunc64to32, typ.Int32) 22717 v0.AddArg(x) 22718 v.AddArg(v0) 22719 return true 22720 } 22721 return false 22722 } 22723 func rewriteValuegeneric_OpRsh64x8_0(v *Value) bool { 22724 b := v.Block 22725 _ = b 22726 // match: (Rsh64x8 <t> x (Const8 [c])) 22727 // cond: 22728 // result: (Rsh64x64 x (Const64 <t> [int64(uint8(c))])) 22729 for { 22730 t := v.Type 22731 _ = v.Args[1] 22732 x := v.Args[0] 22733 v_1 := v.Args[1] 22734 if v_1.Op != OpConst8 { 22735 break 22736 } 22737 c := v_1.AuxInt 22738 v.reset(OpRsh64x64) 22739 v.AddArg(x) 22740 v0 := b.NewValue0(v.Pos, OpConst64, t) 22741 v0.AuxInt = int64(uint8(c)) 22742 v.AddArg(v0) 22743 return true 22744 } 22745 // match: (Rsh64x8 (Const64 [0]) _) 22746 // cond: 22747 // result: (Const64 [0]) 22748 for { 22749 _ = v.Args[1] 22750 v_0 := v.Args[0] 22751 if v_0.Op != OpConst64 { 22752 break 22753 } 22754 if v_0.AuxInt != 0 { 22755 break 22756 } 22757 v.reset(OpConst64) 22758 v.AuxInt = 0 22759 return true 22760 } 22761 return false 22762 } 22763 func rewriteValuegeneric_OpRsh8Ux16_0(v *Value) bool { 22764 b := v.Block 22765 _ = b 22766 // match: (Rsh8Ux16 <t> x (Const16 [c])) 22767 // cond: 22768 // result: (Rsh8Ux64 x (Const64 <t> [int64(uint16(c))])) 22769 for { 22770 t := v.Type 22771 _ = v.Args[1] 22772 x := v.Args[0] 22773 v_1 := v.Args[1] 22774 if v_1.Op != OpConst16 { 22775 break 22776 } 22777 c := v_1.AuxInt 22778 v.reset(OpRsh8Ux64) 22779 v.AddArg(x) 22780 v0 := b.NewValue0(v.Pos, OpConst64, t) 22781 v0.AuxInt = int64(uint16(c)) 22782 v.AddArg(v0) 22783 return true 22784 } 22785 // match: (Rsh8Ux16 (Const8 [0]) _) 22786 // cond: 22787 // result: (Const8 [0]) 22788 for { 22789 _ = v.Args[1] 22790 v_0 := v.Args[0] 22791 if v_0.Op != OpConst8 { 22792 break 22793 } 22794 if v_0.AuxInt != 0 { 22795 break 22796 } 22797 v.reset(OpConst8) 22798 v.AuxInt = 0 22799 return true 22800 } 22801 return false 22802 } 22803 func rewriteValuegeneric_OpRsh8Ux32_0(v *Value) bool { 22804 b := v.Block 22805 _ = b 22806 // match: (Rsh8Ux32 <t> x (Const32 [c])) 22807 // cond: 22808 // result: (Rsh8Ux64 x (Const64 <t> [int64(uint32(c))])) 22809 for { 22810 t := v.Type 22811 _ = v.Args[1] 22812 x := v.Args[0] 22813 v_1 := v.Args[1] 22814 if v_1.Op != OpConst32 { 22815 break 22816 } 22817 c := v_1.AuxInt 22818 v.reset(OpRsh8Ux64) 22819 v.AddArg(x) 22820 v0 := b.NewValue0(v.Pos, OpConst64, t) 22821 v0.AuxInt = int64(uint32(c)) 22822 v.AddArg(v0) 22823 return true 22824 } 22825 // match: (Rsh8Ux32 (Const8 [0]) _) 22826 // cond: 22827 // result: (Const8 [0]) 22828 for { 22829 _ = v.Args[1] 22830 v_0 := v.Args[0] 22831 if v_0.Op != OpConst8 { 22832 break 22833 } 22834 if v_0.AuxInt != 0 { 22835 break 22836 } 22837 v.reset(OpConst8) 22838 v.AuxInt = 0 22839 return true 22840 } 22841 return false 22842 } 22843 func rewriteValuegeneric_OpRsh8Ux64_0(v *Value) bool { 22844 b := v.Block 22845 _ = b 22846 typ := &b.Func.Config.Types 22847 _ = typ 22848 // match: (Rsh8Ux64 (Const8 [c]) (Const64 [d])) 22849 // cond: 22850 // result: (Const8 [int64(int8(uint8(c) >> uint64(d)))]) 22851 for { 22852 _ = v.Args[1] 22853 v_0 := v.Args[0] 22854 if v_0.Op != OpConst8 { 22855 break 22856 } 22857 c := v_0.AuxInt 22858 v_1 := v.Args[1] 22859 if v_1.Op != OpConst64 { 22860 break 22861 } 22862 d := v_1.AuxInt 22863 v.reset(OpConst8) 22864 v.AuxInt = int64(int8(uint8(c) >> uint64(d))) 22865 return true 22866 } 22867 // match: (Rsh8Ux64 x (Const64 [0])) 22868 // cond: 22869 // result: x 22870 for { 22871 _ = v.Args[1] 22872 x := v.Args[0] 22873 v_1 := v.Args[1] 22874 if v_1.Op != OpConst64 { 22875 break 22876 } 22877 if v_1.AuxInt != 0 { 22878 break 22879 } 22880 v.reset(OpCopy) 22881 v.Type = x.Type 22882 v.AddArg(x) 22883 return true 22884 } 22885 // match: (Rsh8Ux64 (Const8 [0]) _) 22886 // cond: 22887 // result: (Const8 [0]) 22888 for { 22889 _ = v.Args[1] 22890 v_0 := v.Args[0] 22891 if v_0.Op != OpConst8 { 22892 break 22893 } 22894 if v_0.AuxInt != 0 { 22895 break 22896 } 22897 v.reset(OpConst8) 22898 v.AuxInt = 0 22899 return true 22900 } 22901 // match: (Rsh8Ux64 _ (Const64 [c])) 22902 // cond: uint64(c) >= 8 22903 // result: (Const8 [0]) 22904 for { 22905 _ = v.Args[1] 22906 v_1 := v.Args[1] 22907 if v_1.Op != OpConst64 { 22908 break 22909 } 22910 c := v_1.AuxInt 22911 if !(uint64(c) >= 8) { 22912 break 22913 } 22914 v.reset(OpConst8) 22915 v.AuxInt = 0 22916 return true 22917 } 22918 // match: (Rsh8Ux64 <t> (Rsh8Ux64 x (Const64 [c])) (Const64 [d])) 22919 // cond: !uaddOvf(c,d) 22920 // result: (Rsh8Ux64 x (Const64 <t> [c+d])) 22921 for { 22922 t := v.Type 22923 _ = v.Args[1] 22924 v_0 := v.Args[0] 22925 if v_0.Op != OpRsh8Ux64 { 22926 break 22927 } 22928 _ = v_0.Args[1] 22929 x := v_0.Args[0] 22930 v_0_1 := v_0.Args[1] 22931 if v_0_1.Op != OpConst64 { 22932 break 22933 } 22934 c := v_0_1.AuxInt 22935 v_1 := v.Args[1] 22936 if v_1.Op != OpConst64 { 22937 break 22938 } 22939 d := v_1.AuxInt 22940 if !(!uaddOvf(c, d)) { 22941 break 22942 } 22943 v.reset(OpRsh8Ux64) 22944 v.AddArg(x) 22945 v0 := b.NewValue0(v.Pos, OpConst64, t) 22946 v0.AuxInt = c + d 22947 v.AddArg(v0) 22948 return true 22949 } 22950 // match: (Rsh8Ux64 (Lsh8x64 (Rsh8Ux64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 22951 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 22952 // result: (Rsh8Ux64 x (Const64 <typ.UInt64> [c1-c2+c3])) 22953 for { 22954 _ = v.Args[1] 22955 v_0 := v.Args[0] 22956 if v_0.Op != OpLsh8x64 { 22957 break 22958 } 22959 _ = v_0.Args[1] 22960 v_0_0 := v_0.Args[0] 22961 if v_0_0.Op != OpRsh8Ux64 { 22962 break 22963 } 22964 _ = v_0_0.Args[1] 22965 x := v_0_0.Args[0] 22966 v_0_0_1 := v_0_0.Args[1] 22967 if v_0_0_1.Op != OpConst64 { 22968 break 22969 } 22970 c1 := v_0_0_1.AuxInt 22971 v_0_1 := v_0.Args[1] 22972 if v_0_1.Op != OpConst64 { 22973 break 22974 } 22975 c2 := v_0_1.AuxInt 22976 v_1 := v.Args[1] 22977 if v_1.Op != OpConst64 { 22978 break 22979 } 22980 c3 := v_1.AuxInt 22981 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 22982 break 22983 } 22984 v.reset(OpRsh8Ux64) 22985 v.AddArg(x) 22986 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 22987 v0.AuxInt = c1 - c2 + c3 22988 v.AddArg(v0) 22989 return true 22990 } 22991 return false 22992 } 22993 func rewriteValuegeneric_OpRsh8Ux8_0(v *Value) bool { 22994 b := v.Block 22995 _ = b 22996 // match: (Rsh8Ux8 <t> x (Const8 [c])) 22997 // cond: 22998 // result: (Rsh8Ux64 x (Const64 <t> [int64(uint8(c))])) 22999 for { 23000 t := v.Type 23001 _ = v.Args[1] 23002 x := v.Args[0] 23003 v_1 := v.Args[1] 23004 if v_1.Op != OpConst8 { 23005 break 23006 } 23007 c := v_1.AuxInt 23008 v.reset(OpRsh8Ux64) 23009 v.AddArg(x) 23010 v0 := b.NewValue0(v.Pos, OpConst64, t) 23011 v0.AuxInt = int64(uint8(c)) 23012 v.AddArg(v0) 23013 return true 23014 } 23015 // match: (Rsh8Ux8 (Const8 [0]) _) 23016 // cond: 23017 // result: (Const8 [0]) 23018 for { 23019 _ = v.Args[1] 23020 v_0 := v.Args[0] 23021 if v_0.Op != OpConst8 { 23022 break 23023 } 23024 if v_0.AuxInt != 0 { 23025 break 23026 } 23027 v.reset(OpConst8) 23028 v.AuxInt = 0 23029 return true 23030 } 23031 return false 23032 } 23033 func rewriteValuegeneric_OpRsh8x16_0(v *Value) bool { 23034 b := v.Block 23035 _ = b 23036 // match: (Rsh8x16 <t> x (Const16 [c])) 23037 // cond: 23038 // result: (Rsh8x64 x (Const64 <t> [int64(uint16(c))])) 23039 for { 23040 t := v.Type 23041 _ = v.Args[1] 23042 x := v.Args[0] 23043 v_1 := v.Args[1] 23044 if v_1.Op != OpConst16 { 23045 break 23046 } 23047 c := v_1.AuxInt 23048 v.reset(OpRsh8x64) 23049 v.AddArg(x) 23050 v0 := b.NewValue0(v.Pos, OpConst64, t) 23051 v0.AuxInt = int64(uint16(c)) 23052 v.AddArg(v0) 23053 return true 23054 } 23055 // match: (Rsh8x16 (Const8 [0]) _) 23056 // cond: 23057 // result: (Const8 [0]) 23058 for { 23059 _ = v.Args[1] 23060 v_0 := v.Args[0] 23061 if v_0.Op != OpConst8 { 23062 break 23063 } 23064 if v_0.AuxInt != 0 { 23065 break 23066 } 23067 v.reset(OpConst8) 23068 v.AuxInt = 0 23069 return true 23070 } 23071 return false 23072 } 23073 func rewriteValuegeneric_OpRsh8x32_0(v *Value) bool { 23074 b := v.Block 23075 _ = b 23076 // match: (Rsh8x32 <t> x (Const32 [c])) 23077 // cond: 23078 // result: (Rsh8x64 x (Const64 <t> [int64(uint32(c))])) 23079 for { 23080 t := v.Type 23081 _ = v.Args[1] 23082 x := v.Args[0] 23083 v_1 := v.Args[1] 23084 if v_1.Op != OpConst32 { 23085 break 23086 } 23087 c := v_1.AuxInt 23088 v.reset(OpRsh8x64) 23089 v.AddArg(x) 23090 v0 := b.NewValue0(v.Pos, OpConst64, t) 23091 v0.AuxInt = int64(uint32(c)) 23092 v.AddArg(v0) 23093 return true 23094 } 23095 // match: (Rsh8x32 (Const8 [0]) _) 23096 // cond: 23097 // result: (Const8 [0]) 23098 for { 23099 _ = v.Args[1] 23100 v_0 := v.Args[0] 23101 if v_0.Op != OpConst8 { 23102 break 23103 } 23104 if v_0.AuxInt != 0 { 23105 break 23106 } 23107 v.reset(OpConst8) 23108 v.AuxInt = 0 23109 return true 23110 } 23111 return false 23112 } 23113 func rewriteValuegeneric_OpRsh8x64_0(v *Value) bool { 23114 b := v.Block 23115 _ = b 23116 // match: (Rsh8x64 (Const8 [c]) (Const64 [d])) 23117 // cond: 23118 // result: (Const8 [int64(int8(c) >> uint64(d))]) 23119 for { 23120 _ = v.Args[1] 23121 v_0 := v.Args[0] 23122 if v_0.Op != OpConst8 { 23123 break 23124 } 23125 c := v_0.AuxInt 23126 v_1 := v.Args[1] 23127 if v_1.Op != OpConst64 { 23128 break 23129 } 23130 d := v_1.AuxInt 23131 v.reset(OpConst8) 23132 v.AuxInt = int64(int8(c) >> uint64(d)) 23133 return true 23134 } 23135 // match: (Rsh8x64 x (Const64 [0])) 23136 // cond: 23137 // result: x 23138 for { 23139 _ = v.Args[1] 23140 x := v.Args[0] 23141 v_1 := v.Args[1] 23142 if v_1.Op != OpConst64 { 23143 break 23144 } 23145 if v_1.AuxInt != 0 { 23146 break 23147 } 23148 v.reset(OpCopy) 23149 v.Type = x.Type 23150 v.AddArg(x) 23151 return true 23152 } 23153 // match: (Rsh8x64 (Const8 [0]) _) 23154 // cond: 23155 // result: (Const8 [0]) 23156 for { 23157 _ = v.Args[1] 23158 v_0 := v.Args[0] 23159 if v_0.Op != OpConst8 { 23160 break 23161 } 23162 if v_0.AuxInt != 0 { 23163 break 23164 } 23165 v.reset(OpConst8) 23166 v.AuxInt = 0 23167 return true 23168 } 23169 // match: (Rsh8x64 <t> (Rsh8x64 x (Const64 [c])) (Const64 [d])) 23170 // cond: !uaddOvf(c,d) 23171 // result: (Rsh8x64 x (Const64 <t> [c+d])) 23172 for { 23173 t := v.Type 23174 _ = v.Args[1] 23175 v_0 := v.Args[0] 23176 if v_0.Op != OpRsh8x64 { 23177 break 23178 } 23179 _ = v_0.Args[1] 23180 x := v_0.Args[0] 23181 v_0_1 := v_0.Args[1] 23182 if v_0_1.Op != OpConst64 { 23183 break 23184 } 23185 c := v_0_1.AuxInt 23186 v_1 := v.Args[1] 23187 if v_1.Op != OpConst64 { 23188 break 23189 } 23190 d := v_1.AuxInt 23191 if !(!uaddOvf(c, d)) { 23192 break 23193 } 23194 v.reset(OpRsh8x64) 23195 v.AddArg(x) 23196 v0 := b.NewValue0(v.Pos, OpConst64, t) 23197 v0.AuxInt = c + d 23198 v.AddArg(v0) 23199 return true 23200 } 23201 return false 23202 } 23203 func rewriteValuegeneric_OpRsh8x8_0(v *Value) bool { 23204 b := v.Block 23205 _ = b 23206 // match: (Rsh8x8 <t> x (Const8 [c])) 23207 // cond: 23208 // result: (Rsh8x64 x (Const64 <t> [int64(uint8(c))])) 23209 for { 23210 t := v.Type 23211 _ = v.Args[1] 23212 x := v.Args[0] 23213 v_1 := v.Args[1] 23214 if v_1.Op != OpConst8 { 23215 break 23216 } 23217 c := v_1.AuxInt 23218 v.reset(OpRsh8x64) 23219 v.AddArg(x) 23220 v0 := b.NewValue0(v.Pos, OpConst64, t) 23221 v0.AuxInt = int64(uint8(c)) 23222 v.AddArg(v0) 23223 return true 23224 } 23225 // match: (Rsh8x8 (Const8 [0]) _) 23226 // cond: 23227 // result: (Const8 [0]) 23228 for { 23229 _ = v.Args[1] 23230 v_0 := v.Args[0] 23231 if v_0.Op != OpConst8 { 23232 break 23233 } 23234 if v_0.AuxInt != 0 { 23235 break 23236 } 23237 v.reset(OpConst8) 23238 v.AuxInt = 0 23239 return true 23240 } 23241 return false 23242 } 23243 func rewriteValuegeneric_OpSignExt16to32_0(v *Value) bool { 23244 // match: (SignExt16to32 (Const16 [c])) 23245 // cond: 23246 // result: (Const32 [int64( int16(c))]) 23247 for { 23248 v_0 := v.Args[0] 23249 if v_0.Op != OpConst16 { 23250 break 23251 } 23252 c := v_0.AuxInt 23253 v.reset(OpConst32) 23254 v.AuxInt = int64(int16(c)) 23255 return true 23256 } 23257 // match: (SignExt16to32 (Trunc32to16 x:(Rsh32x64 _ (Const64 [s])))) 23258 // cond: s >= 16 23259 // result: x 23260 for { 23261 v_0 := v.Args[0] 23262 if v_0.Op != OpTrunc32to16 { 23263 break 23264 } 23265 x := v_0.Args[0] 23266 if x.Op != OpRsh32x64 { 23267 break 23268 } 23269 _ = x.Args[1] 23270 x_1 := x.Args[1] 23271 if x_1.Op != OpConst64 { 23272 break 23273 } 23274 s := x_1.AuxInt 23275 if !(s >= 16) { 23276 break 23277 } 23278 v.reset(OpCopy) 23279 v.Type = x.Type 23280 v.AddArg(x) 23281 return true 23282 } 23283 return false 23284 } 23285 func rewriteValuegeneric_OpSignExt16to64_0(v *Value) bool { 23286 // match: (SignExt16to64 (Const16 [c])) 23287 // cond: 23288 // result: (Const64 [int64( int16(c))]) 23289 for { 23290 v_0 := v.Args[0] 23291 if v_0.Op != OpConst16 { 23292 break 23293 } 23294 c := v_0.AuxInt 23295 v.reset(OpConst64) 23296 v.AuxInt = int64(int16(c)) 23297 return true 23298 } 23299 // match: (SignExt16to64 (Trunc64to16 x:(Rsh64x64 _ (Const64 [s])))) 23300 // cond: s >= 48 23301 // result: x 23302 for { 23303 v_0 := v.Args[0] 23304 if v_0.Op != OpTrunc64to16 { 23305 break 23306 } 23307 x := v_0.Args[0] 23308 if x.Op != OpRsh64x64 { 23309 break 23310 } 23311 _ = x.Args[1] 23312 x_1 := x.Args[1] 23313 if x_1.Op != OpConst64 { 23314 break 23315 } 23316 s := x_1.AuxInt 23317 if !(s >= 48) { 23318 break 23319 } 23320 v.reset(OpCopy) 23321 v.Type = x.Type 23322 v.AddArg(x) 23323 return true 23324 } 23325 return false 23326 } 23327 func rewriteValuegeneric_OpSignExt32to64_0(v *Value) bool { 23328 // match: (SignExt32to64 (Const32 [c])) 23329 // cond: 23330 // result: (Const64 [int64( int32(c))]) 23331 for { 23332 v_0 := v.Args[0] 23333 if v_0.Op != OpConst32 { 23334 break 23335 } 23336 c := v_0.AuxInt 23337 v.reset(OpConst64) 23338 v.AuxInt = int64(int32(c)) 23339 return true 23340 } 23341 // match: (SignExt32to64 (Trunc64to32 x:(Rsh64x64 _ (Const64 [s])))) 23342 // cond: s >= 32 23343 // result: x 23344 for { 23345 v_0 := v.Args[0] 23346 if v_0.Op != OpTrunc64to32 { 23347 break 23348 } 23349 x := v_0.Args[0] 23350 if x.Op != OpRsh64x64 { 23351 break 23352 } 23353 _ = x.Args[1] 23354 x_1 := x.Args[1] 23355 if x_1.Op != OpConst64 { 23356 break 23357 } 23358 s := x_1.AuxInt 23359 if !(s >= 32) { 23360 break 23361 } 23362 v.reset(OpCopy) 23363 v.Type = x.Type 23364 v.AddArg(x) 23365 return true 23366 } 23367 return false 23368 } 23369 func rewriteValuegeneric_OpSignExt8to16_0(v *Value) bool { 23370 // match: (SignExt8to16 (Const8 [c])) 23371 // cond: 23372 // result: (Const16 [int64( int8(c))]) 23373 for { 23374 v_0 := v.Args[0] 23375 if v_0.Op != OpConst8 { 23376 break 23377 } 23378 c := v_0.AuxInt 23379 v.reset(OpConst16) 23380 v.AuxInt = int64(int8(c)) 23381 return true 23382 } 23383 // match: (SignExt8to16 (Trunc16to8 x:(Rsh16x64 _ (Const64 [s])))) 23384 // cond: s >= 8 23385 // result: x 23386 for { 23387 v_0 := v.Args[0] 23388 if v_0.Op != OpTrunc16to8 { 23389 break 23390 } 23391 x := v_0.Args[0] 23392 if x.Op != OpRsh16x64 { 23393 break 23394 } 23395 _ = x.Args[1] 23396 x_1 := x.Args[1] 23397 if x_1.Op != OpConst64 { 23398 break 23399 } 23400 s := x_1.AuxInt 23401 if !(s >= 8) { 23402 break 23403 } 23404 v.reset(OpCopy) 23405 v.Type = x.Type 23406 v.AddArg(x) 23407 return true 23408 } 23409 return false 23410 } 23411 func rewriteValuegeneric_OpSignExt8to32_0(v *Value) bool { 23412 // match: (SignExt8to32 (Const8 [c])) 23413 // cond: 23414 // result: (Const32 [int64( int8(c))]) 23415 for { 23416 v_0 := v.Args[0] 23417 if v_0.Op != OpConst8 { 23418 break 23419 } 23420 c := v_0.AuxInt 23421 v.reset(OpConst32) 23422 v.AuxInt = int64(int8(c)) 23423 return true 23424 } 23425 // match: (SignExt8to32 (Trunc32to8 x:(Rsh32x64 _ (Const64 [s])))) 23426 // cond: s >= 24 23427 // result: x 23428 for { 23429 v_0 := v.Args[0] 23430 if v_0.Op != OpTrunc32to8 { 23431 break 23432 } 23433 x := v_0.Args[0] 23434 if x.Op != OpRsh32x64 { 23435 break 23436 } 23437 _ = x.Args[1] 23438 x_1 := x.Args[1] 23439 if x_1.Op != OpConst64 { 23440 break 23441 } 23442 s := x_1.AuxInt 23443 if !(s >= 24) { 23444 break 23445 } 23446 v.reset(OpCopy) 23447 v.Type = x.Type 23448 v.AddArg(x) 23449 return true 23450 } 23451 return false 23452 } 23453 func rewriteValuegeneric_OpSignExt8to64_0(v *Value) bool { 23454 // match: (SignExt8to64 (Const8 [c])) 23455 // cond: 23456 // result: (Const64 [int64( int8(c))]) 23457 for { 23458 v_0 := v.Args[0] 23459 if v_0.Op != OpConst8 { 23460 break 23461 } 23462 c := v_0.AuxInt 23463 v.reset(OpConst64) 23464 v.AuxInt = int64(int8(c)) 23465 return true 23466 } 23467 // match: (SignExt8to64 (Trunc64to8 x:(Rsh64x64 _ (Const64 [s])))) 23468 // cond: s >= 56 23469 // result: x 23470 for { 23471 v_0 := v.Args[0] 23472 if v_0.Op != OpTrunc64to8 { 23473 break 23474 } 23475 x := v_0.Args[0] 23476 if x.Op != OpRsh64x64 { 23477 break 23478 } 23479 _ = x.Args[1] 23480 x_1 := x.Args[1] 23481 if x_1.Op != OpConst64 { 23482 break 23483 } 23484 s := x_1.AuxInt 23485 if !(s >= 56) { 23486 break 23487 } 23488 v.reset(OpCopy) 23489 v.Type = x.Type 23490 v.AddArg(x) 23491 return true 23492 } 23493 return false 23494 } 23495 func rewriteValuegeneric_OpSliceCap_0(v *Value) bool { 23496 // match: (SliceCap (SliceMake _ _ (Const64 <t> [c]))) 23497 // cond: 23498 // result: (Const64 <t> [c]) 23499 for { 23500 v_0 := v.Args[0] 23501 if v_0.Op != OpSliceMake { 23502 break 23503 } 23504 _ = v_0.Args[2] 23505 v_0_2 := v_0.Args[2] 23506 if v_0_2.Op != OpConst64 { 23507 break 23508 } 23509 t := v_0_2.Type 23510 c := v_0_2.AuxInt 23511 v.reset(OpConst64) 23512 v.Type = t 23513 v.AuxInt = c 23514 return true 23515 } 23516 // match: (SliceCap (SliceMake _ _ (Const32 <t> [c]))) 23517 // cond: 23518 // result: (Const32 <t> [c]) 23519 for { 23520 v_0 := v.Args[0] 23521 if v_0.Op != OpSliceMake { 23522 break 23523 } 23524 _ = v_0.Args[2] 23525 v_0_2 := v_0.Args[2] 23526 if v_0_2.Op != OpConst32 { 23527 break 23528 } 23529 t := v_0_2.Type 23530 c := v_0_2.AuxInt 23531 v.reset(OpConst32) 23532 v.Type = t 23533 v.AuxInt = c 23534 return true 23535 } 23536 // match: (SliceCap (SliceMake _ _ (SliceCap x))) 23537 // cond: 23538 // result: (SliceCap x) 23539 for { 23540 v_0 := v.Args[0] 23541 if v_0.Op != OpSliceMake { 23542 break 23543 } 23544 _ = v_0.Args[2] 23545 v_0_2 := v_0.Args[2] 23546 if v_0_2.Op != OpSliceCap { 23547 break 23548 } 23549 x := v_0_2.Args[0] 23550 v.reset(OpSliceCap) 23551 v.AddArg(x) 23552 return true 23553 } 23554 // match: (SliceCap (SliceMake _ _ (SliceLen x))) 23555 // cond: 23556 // result: (SliceLen x) 23557 for { 23558 v_0 := v.Args[0] 23559 if v_0.Op != OpSliceMake { 23560 break 23561 } 23562 _ = v_0.Args[2] 23563 v_0_2 := v_0.Args[2] 23564 if v_0_2.Op != OpSliceLen { 23565 break 23566 } 23567 x := v_0_2.Args[0] 23568 v.reset(OpSliceLen) 23569 v.AddArg(x) 23570 return true 23571 } 23572 return false 23573 } 23574 func rewriteValuegeneric_OpSliceLen_0(v *Value) bool { 23575 // match: (SliceLen (SliceMake _ (Const64 <t> [c]) _)) 23576 // cond: 23577 // result: (Const64 <t> [c]) 23578 for { 23579 v_0 := v.Args[0] 23580 if v_0.Op != OpSliceMake { 23581 break 23582 } 23583 _ = v_0.Args[2] 23584 v_0_1 := v_0.Args[1] 23585 if v_0_1.Op != OpConst64 { 23586 break 23587 } 23588 t := v_0_1.Type 23589 c := v_0_1.AuxInt 23590 v.reset(OpConst64) 23591 v.Type = t 23592 v.AuxInt = c 23593 return true 23594 } 23595 // match: (SliceLen (SliceMake _ (Const32 <t> [c]) _)) 23596 // cond: 23597 // result: (Const32 <t> [c]) 23598 for { 23599 v_0 := v.Args[0] 23600 if v_0.Op != OpSliceMake { 23601 break 23602 } 23603 _ = v_0.Args[2] 23604 v_0_1 := v_0.Args[1] 23605 if v_0_1.Op != OpConst32 { 23606 break 23607 } 23608 t := v_0_1.Type 23609 c := v_0_1.AuxInt 23610 v.reset(OpConst32) 23611 v.Type = t 23612 v.AuxInt = c 23613 return true 23614 } 23615 // match: (SliceLen (SliceMake _ (SliceLen x) _)) 23616 // cond: 23617 // result: (SliceLen x) 23618 for { 23619 v_0 := v.Args[0] 23620 if v_0.Op != OpSliceMake { 23621 break 23622 } 23623 _ = v_0.Args[2] 23624 v_0_1 := v_0.Args[1] 23625 if v_0_1.Op != OpSliceLen { 23626 break 23627 } 23628 x := v_0_1.Args[0] 23629 v.reset(OpSliceLen) 23630 v.AddArg(x) 23631 return true 23632 } 23633 return false 23634 } 23635 func rewriteValuegeneric_OpSlicePtr_0(v *Value) bool { 23636 // match: (SlicePtr (SliceMake (SlicePtr x) _ _)) 23637 // cond: 23638 // result: (SlicePtr x) 23639 for { 23640 v_0 := v.Args[0] 23641 if v_0.Op != OpSliceMake { 23642 break 23643 } 23644 _ = v_0.Args[2] 23645 v_0_0 := v_0.Args[0] 23646 if v_0_0.Op != OpSlicePtr { 23647 break 23648 } 23649 x := v_0_0.Args[0] 23650 v.reset(OpSlicePtr) 23651 v.AddArg(x) 23652 return true 23653 } 23654 return false 23655 } 23656 func rewriteValuegeneric_OpSlicemask_0(v *Value) bool { 23657 // match: (Slicemask (Const32 [x])) 23658 // cond: x > 0 23659 // result: (Const32 [-1]) 23660 for { 23661 v_0 := v.Args[0] 23662 if v_0.Op != OpConst32 { 23663 break 23664 } 23665 x := v_0.AuxInt 23666 if !(x > 0) { 23667 break 23668 } 23669 v.reset(OpConst32) 23670 v.AuxInt = -1 23671 return true 23672 } 23673 // match: (Slicemask (Const32 [0])) 23674 // cond: 23675 // result: (Const32 [0]) 23676 for { 23677 v_0 := v.Args[0] 23678 if v_0.Op != OpConst32 { 23679 break 23680 } 23681 if v_0.AuxInt != 0 { 23682 break 23683 } 23684 v.reset(OpConst32) 23685 v.AuxInt = 0 23686 return true 23687 } 23688 // match: (Slicemask (Const64 [x])) 23689 // cond: x > 0 23690 // result: (Const64 [-1]) 23691 for { 23692 v_0 := v.Args[0] 23693 if v_0.Op != OpConst64 { 23694 break 23695 } 23696 x := v_0.AuxInt 23697 if !(x > 0) { 23698 break 23699 } 23700 v.reset(OpConst64) 23701 v.AuxInt = -1 23702 return true 23703 } 23704 // match: (Slicemask (Const64 [0])) 23705 // cond: 23706 // result: (Const64 [0]) 23707 for { 23708 v_0 := v.Args[0] 23709 if v_0.Op != OpConst64 { 23710 break 23711 } 23712 if v_0.AuxInt != 0 { 23713 break 23714 } 23715 v.reset(OpConst64) 23716 v.AuxInt = 0 23717 return true 23718 } 23719 return false 23720 } 23721 func rewriteValuegeneric_OpSqrt_0(v *Value) bool { 23722 // match: (Sqrt (Const64F [c])) 23723 // cond: 23724 // result: (Const64F [f2i(math.Sqrt(i2f(c)))]) 23725 for { 23726 v_0 := v.Args[0] 23727 if v_0.Op != OpConst64F { 23728 break 23729 } 23730 c := v_0.AuxInt 23731 v.reset(OpConst64F) 23732 v.AuxInt = f2i(math.Sqrt(i2f(c))) 23733 return true 23734 } 23735 return false 23736 } 23737 func rewriteValuegeneric_OpStaticCall_0(v *Value) bool { 23738 b := v.Block 23739 _ = b 23740 config := b.Func.Config 23741 _ = config 23742 // match: (StaticCall {sym} s1:(Store _ (Const64 [sz]) s2:(Store _ src s3:(Store {t} _ dst mem)))) 23743 // cond: isSameSym(sym,"runtime.memmove") && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && isInlinableMemmoveSize(sz,config) 23744 // result: (Move {t.(*types.Type).Elem()} [sz] dst src mem) 23745 for { 23746 sym := v.Aux 23747 s1 := v.Args[0] 23748 if s1.Op != OpStore { 23749 break 23750 } 23751 _ = s1.Args[2] 23752 s1_1 := s1.Args[1] 23753 if s1_1.Op != OpConst64 { 23754 break 23755 } 23756 sz := s1_1.AuxInt 23757 s2 := s1.Args[2] 23758 if s2.Op != OpStore { 23759 break 23760 } 23761 _ = s2.Args[2] 23762 src := s2.Args[1] 23763 s3 := s2.Args[2] 23764 if s3.Op != OpStore { 23765 break 23766 } 23767 t := s3.Aux 23768 _ = s3.Args[2] 23769 dst := s3.Args[1] 23770 mem := s3.Args[2] 23771 if !(isSameSym(sym, "runtime.memmove") && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && isInlinableMemmoveSize(sz, config)) { 23772 break 23773 } 23774 v.reset(OpMove) 23775 v.AuxInt = sz 23776 v.Aux = t.(*types.Type).Elem() 23777 v.AddArg(dst) 23778 v.AddArg(src) 23779 v.AddArg(mem) 23780 return true 23781 } 23782 // match: (StaticCall {sym} s1:(Store _ (Const32 [sz]) s2:(Store _ src s3:(Store {t} _ dst mem)))) 23783 // cond: isSameSym(sym,"runtime.memmove") && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && isInlinableMemmoveSize(sz,config) 23784 // result: (Move {t.(*types.Type).Elem()} [sz] dst src mem) 23785 for { 23786 sym := v.Aux 23787 s1 := v.Args[0] 23788 if s1.Op != OpStore { 23789 break 23790 } 23791 _ = s1.Args[2] 23792 s1_1 := s1.Args[1] 23793 if s1_1.Op != OpConst32 { 23794 break 23795 } 23796 sz := s1_1.AuxInt 23797 s2 := s1.Args[2] 23798 if s2.Op != OpStore { 23799 break 23800 } 23801 _ = s2.Args[2] 23802 src := s2.Args[1] 23803 s3 := s2.Args[2] 23804 if s3.Op != OpStore { 23805 break 23806 } 23807 t := s3.Aux 23808 _ = s3.Args[2] 23809 dst := s3.Args[1] 23810 mem := s3.Args[2] 23811 if !(isSameSym(sym, "runtime.memmove") && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && isInlinableMemmoveSize(sz, config)) { 23812 break 23813 } 23814 v.reset(OpMove) 23815 v.AuxInt = sz 23816 v.Aux = t.(*types.Type).Elem() 23817 v.AddArg(dst) 23818 v.AddArg(src) 23819 v.AddArg(mem) 23820 return true 23821 } 23822 return false 23823 } 23824 func rewriteValuegeneric_OpStore_0(v *Value) bool { 23825 b := v.Block 23826 _ = b 23827 fe := b.Func.fe 23828 _ = fe 23829 // match: (Store {t1} p1 (Load <t2> p2 mem) mem) 23830 // cond: isSamePtr(p1, p2) && t2.Size() == t1.(*types.Type).Size() 23831 // result: mem 23832 for { 23833 t1 := v.Aux 23834 _ = v.Args[2] 23835 p1 := v.Args[0] 23836 v_1 := v.Args[1] 23837 if v_1.Op != OpLoad { 23838 break 23839 } 23840 t2 := v_1.Type 23841 _ = v_1.Args[1] 23842 p2 := v_1.Args[0] 23843 mem := v_1.Args[1] 23844 if mem != v.Args[2] { 23845 break 23846 } 23847 if !(isSamePtr(p1, p2) && t2.Size() == t1.(*types.Type).Size()) { 23848 break 23849 } 23850 v.reset(OpCopy) 23851 v.Type = mem.Type 23852 v.AddArg(mem) 23853 return true 23854 } 23855 // match: (Store {t1} (OffPtr [o1] p1) (Load <t2> (OffPtr [o1] p2) oldmem) mem:(Store {t3} (OffPtr [o3] p3) _ oldmem)) 23856 // cond: isSamePtr(p1, p2) && isSamePtr(p1, p3) && t2.Size() == t1.(*types.Type).Size() && !overlap(o1, t2.Size(), o3, t3.(*types.Type).Size()) 23857 // result: mem 23858 for { 23859 t1 := v.Aux 23860 _ = v.Args[2] 23861 v_0 := v.Args[0] 23862 if v_0.Op != OpOffPtr { 23863 break 23864 } 23865 o1 := v_0.AuxInt 23866 p1 := v_0.Args[0] 23867 v_1 := v.Args[1] 23868 if v_1.Op != OpLoad { 23869 break 23870 } 23871 t2 := v_1.Type 23872 _ = v_1.Args[1] 23873 v_1_0 := v_1.Args[0] 23874 if v_1_0.Op != OpOffPtr { 23875 break 23876 } 23877 if v_1_0.AuxInt != o1 { 23878 break 23879 } 23880 p2 := v_1_0.Args[0] 23881 oldmem := v_1.Args[1] 23882 mem := v.Args[2] 23883 if mem.Op != OpStore { 23884 break 23885 } 23886 t3 := mem.Aux 23887 _ = mem.Args[2] 23888 mem_0 := mem.Args[0] 23889 if mem_0.Op != OpOffPtr { 23890 break 23891 } 23892 o3 := mem_0.AuxInt 23893 p3 := mem_0.Args[0] 23894 if oldmem != mem.Args[2] { 23895 break 23896 } 23897 if !(isSamePtr(p1, p2) && isSamePtr(p1, p3) && t2.Size() == t1.(*types.Type).Size() && !overlap(o1, t2.Size(), o3, t3.(*types.Type).Size())) { 23898 break 23899 } 23900 v.reset(OpCopy) 23901 v.Type = mem.Type 23902 v.AddArg(mem) 23903 return true 23904 } 23905 // match: (Store {t1} (OffPtr [o1] p1) (Load <t2> (OffPtr [o1] p2) oldmem) mem:(Store {t3} (OffPtr [o3] p3) _ (Store {t4} (OffPtr [o4] p4) _ oldmem))) 23906 // cond: isSamePtr(p1, p2) && isSamePtr(p1, p3) && isSamePtr(p1, p4) && t2.Size() == t1.(*types.Type).Size() && !overlap(o1, t2.Size(), o3, t3.(*types.Type).Size()) && !overlap(o1, t2.Size(), o4, t4.(*types.Type).Size()) 23907 // result: mem 23908 for { 23909 t1 := v.Aux 23910 _ = v.Args[2] 23911 v_0 := v.Args[0] 23912 if v_0.Op != OpOffPtr { 23913 break 23914 } 23915 o1 := v_0.AuxInt 23916 p1 := v_0.Args[0] 23917 v_1 := v.Args[1] 23918 if v_1.Op != OpLoad { 23919 break 23920 } 23921 t2 := v_1.Type 23922 _ = v_1.Args[1] 23923 v_1_0 := v_1.Args[0] 23924 if v_1_0.Op != OpOffPtr { 23925 break 23926 } 23927 if v_1_0.AuxInt != o1 { 23928 break 23929 } 23930 p2 := v_1_0.Args[0] 23931 oldmem := v_1.Args[1] 23932 mem := v.Args[2] 23933 if mem.Op != OpStore { 23934 break 23935 } 23936 t3 := mem.Aux 23937 _ = mem.Args[2] 23938 mem_0 := mem.Args[0] 23939 if mem_0.Op != OpOffPtr { 23940 break 23941 } 23942 o3 := mem_0.AuxInt 23943 p3 := mem_0.Args[0] 23944 mem_2 := mem.Args[2] 23945 if mem_2.Op != OpStore { 23946 break 23947 } 23948 t4 := mem_2.Aux 23949 _ = mem_2.Args[2] 23950 mem_2_0 := mem_2.Args[0] 23951 if mem_2_0.Op != OpOffPtr { 23952 break 23953 } 23954 o4 := mem_2_0.AuxInt 23955 p4 := mem_2_0.Args[0] 23956 if oldmem != mem_2.Args[2] { 23957 break 23958 } 23959 if !(isSamePtr(p1, p2) && isSamePtr(p1, p3) && isSamePtr(p1, p4) && t2.Size() == t1.(*types.Type).Size() && !overlap(o1, t2.Size(), o3, t3.(*types.Type).Size()) && !overlap(o1, t2.Size(), o4, t4.(*types.Type).Size())) { 23960 break 23961 } 23962 v.reset(OpCopy) 23963 v.Type = mem.Type 23964 v.AddArg(mem) 23965 return true 23966 } 23967 // match: (Store {t1} (OffPtr [o1] p1) (Load <t2> (OffPtr [o1] p2) oldmem) mem:(Store {t3} (OffPtr [o3] p3) _ (Store {t4} (OffPtr [o4] p4) _ (Store {t5} (OffPtr [o5] p5) _ oldmem)))) 23968 // cond: isSamePtr(p1, p2) && isSamePtr(p1, p3) && isSamePtr(p1, p4) && isSamePtr(p1, p5) && t2.Size() == t1.(*types.Type).Size() && !overlap(o1, t2.Size(), o3, t3.(*types.Type).Size()) && !overlap(o1, t2.Size(), o4, t4.(*types.Type).Size()) && !overlap(o1, t2.Size(), o5, t5.(*types.Type).Size()) 23969 // result: mem 23970 for { 23971 t1 := v.Aux 23972 _ = v.Args[2] 23973 v_0 := v.Args[0] 23974 if v_0.Op != OpOffPtr { 23975 break 23976 } 23977 o1 := v_0.AuxInt 23978 p1 := v_0.Args[0] 23979 v_1 := v.Args[1] 23980 if v_1.Op != OpLoad { 23981 break 23982 } 23983 t2 := v_1.Type 23984 _ = v_1.Args[1] 23985 v_1_0 := v_1.Args[0] 23986 if v_1_0.Op != OpOffPtr { 23987 break 23988 } 23989 if v_1_0.AuxInt != o1 { 23990 break 23991 } 23992 p2 := v_1_0.Args[0] 23993 oldmem := v_1.Args[1] 23994 mem := v.Args[2] 23995 if mem.Op != OpStore { 23996 break 23997 } 23998 t3 := mem.Aux 23999 _ = mem.Args[2] 24000 mem_0 := mem.Args[0] 24001 if mem_0.Op != OpOffPtr { 24002 break 24003 } 24004 o3 := mem_0.AuxInt 24005 p3 := mem_0.Args[0] 24006 mem_2 := mem.Args[2] 24007 if mem_2.Op != OpStore { 24008 break 24009 } 24010 t4 := mem_2.Aux 24011 _ = mem_2.Args[2] 24012 mem_2_0 := mem_2.Args[0] 24013 if mem_2_0.Op != OpOffPtr { 24014 break 24015 } 24016 o4 := mem_2_0.AuxInt 24017 p4 := mem_2_0.Args[0] 24018 mem_2_2 := mem_2.Args[2] 24019 if mem_2_2.Op != OpStore { 24020 break 24021 } 24022 t5 := mem_2_2.Aux 24023 _ = mem_2_2.Args[2] 24024 mem_2_2_0 := mem_2_2.Args[0] 24025 if mem_2_2_0.Op != OpOffPtr { 24026 break 24027 } 24028 o5 := mem_2_2_0.AuxInt 24029 p5 := mem_2_2_0.Args[0] 24030 if oldmem != mem_2_2.Args[2] { 24031 break 24032 } 24033 if !(isSamePtr(p1, p2) && isSamePtr(p1, p3) && isSamePtr(p1, p4) && isSamePtr(p1, p5) && t2.Size() == t1.(*types.Type).Size() && !overlap(o1, t2.Size(), o3, t3.(*types.Type).Size()) && !overlap(o1, t2.Size(), o4, t4.(*types.Type).Size()) && !overlap(o1, t2.Size(), o5, t5.(*types.Type).Size())) { 24034 break 24035 } 24036 v.reset(OpCopy) 24037 v.Type = mem.Type 24038 v.AddArg(mem) 24039 return true 24040 } 24041 // match: (Store _ (StructMake0) mem) 24042 // cond: 24043 // result: mem 24044 for { 24045 _ = v.Args[2] 24046 v_1 := v.Args[1] 24047 if v_1.Op != OpStructMake0 { 24048 break 24049 } 24050 mem := v.Args[2] 24051 v.reset(OpCopy) 24052 v.Type = mem.Type 24053 v.AddArg(mem) 24054 return true 24055 } 24056 // match: (Store dst (StructMake1 <t> f0) mem) 24057 // cond: 24058 // result: (Store {t.FieldType(0)} (OffPtr <t.FieldType(0).PtrTo()> [0] dst) f0 mem) 24059 for { 24060 _ = v.Args[2] 24061 dst := v.Args[0] 24062 v_1 := v.Args[1] 24063 if v_1.Op != OpStructMake1 { 24064 break 24065 } 24066 t := v_1.Type 24067 f0 := v_1.Args[0] 24068 mem := v.Args[2] 24069 v.reset(OpStore) 24070 v.Aux = t.FieldType(0) 24071 v0 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 24072 v0.AuxInt = 0 24073 v0.AddArg(dst) 24074 v.AddArg(v0) 24075 v.AddArg(f0) 24076 v.AddArg(mem) 24077 return true 24078 } 24079 // match: (Store dst (StructMake2 <t> f0 f1) mem) 24080 // cond: 24081 // result: (Store {t.FieldType(1)} (OffPtr <t.FieldType(1).PtrTo()> [t.FieldOff(1)] dst) f1 (Store {t.FieldType(0)} (OffPtr <t.FieldType(0).PtrTo()> [0] dst) f0 mem)) 24082 for { 24083 _ = v.Args[2] 24084 dst := v.Args[0] 24085 v_1 := v.Args[1] 24086 if v_1.Op != OpStructMake2 { 24087 break 24088 } 24089 t := v_1.Type 24090 _ = v_1.Args[1] 24091 f0 := v_1.Args[0] 24092 f1 := v_1.Args[1] 24093 mem := v.Args[2] 24094 v.reset(OpStore) 24095 v.Aux = t.FieldType(1) 24096 v0 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) 24097 v0.AuxInt = t.FieldOff(1) 24098 v0.AddArg(dst) 24099 v.AddArg(v0) 24100 v.AddArg(f1) 24101 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) 24102 v1.Aux = t.FieldType(0) 24103 v2 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 24104 v2.AuxInt = 0 24105 v2.AddArg(dst) 24106 v1.AddArg(v2) 24107 v1.AddArg(f0) 24108 v1.AddArg(mem) 24109 v.AddArg(v1) 24110 return true 24111 } 24112 // match: (Store dst (StructMake3 <t> f0 f1 f2) mem) 24113 // cond: 24114 // result: (Store {t.FieldType(2)} (OffPtr <t.FieldType(2).PtrTo()> [t.FieldOff(2)] dst) f2 (Store {t.FieldType(1)} (OffPtr <t.FieldType(1).PtrTo()> [t.FieldOff(1)] dst) f1 (Store {t.FieldType(0)} (OffPtr <t.FieldType(0).PtrTo()> [0] dst) f0 mem))) 24115 for { 24116 _ = v.Args[2] 24117 dst := v.Args[0] 24118 v_1 := v.Args[1] 24119 if v_1.Op != OpStructMake3 { 24120 break 24121 } 24122 t := v_1.Type 24123 _ = v_1.Args[2] 24124 f0 := v_1.Args[0] 24125 f1 := v_1.Args[1] 24126 f2 := v_1.Args[2] 24127 mem := v.Args[2] 24128 v.reset(OpStore) 24129 v.Aux = t.FieldType(2) 24130 v0 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(2).PtrTo()) 24131 v0.AuxInt = t.FieldOff(2) 24132 v0.AddArg(dst) 24133 v.AddArg(v0) 24134 v.AddArg(f2) 24135 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) 24136 v1.Aux = t.FieldType(1) 24137 v2 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) 24138 v2.AuxInt = t.FieldOff(1) 24139 v2.AddArg(dst) 24140 v1.AddArg(v2) 24141 v1.AddArg(f1) 24142 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem) 24143 v3.Aux = t.FieldType(0) 24144 v4 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 24145 v4.AuxInt = 0 24146 v4.AddArg(dst) 24147 v3.AddArg(v4) 24148 v3.AddArg(f0) 24149 v3.AddArg(mem) 24150 v1.AddArg(v3) 24151 v.AddArg(v1) 24152 return true 24153 } 24154 // match: (Store dst (StructMake4 <t> f0 f1 f2 f3) mem) 24155 // cond: 24156 // result: (Store {t.FieldType(3)} (OffPtr <t.FieldType(3).PtrTo()> [t.FieldOff(3)] dst) f3 (Store {t.FieldType(2)} (OffPtr <t.FieldType(2).PtrTo()> [t.FieldOff(2)] dst) f2 (Store {t.FieldType(1)} (OffPtr <t.FieldType(1).PtrTo()> [t.FieldOff(1)] dst) f1 (Store {t.FieldType(0)} (OffPtr <t.FieldType(0).PtrTo()> [0] dst) f0 mem)))) 24157 for { 24158 _ = v.Args[2] 24159 dst := v.Args[0] 24160 v_1 := v.Args[1] 24161 if v_1.Op != OpStructMake4 { 24162 break 24163 } 24164 t := v_1.Type 24165 _ = v_1.Args[3] 24166 f0 := v_1.Args[0] 24167 f1 := v_1.Args[1] 24168 f2 := v_1.Args[2] 24169 f3 := v_1.Args[3] 24170 mem := v.Args[2] 24171 v.reset(OpStore) 24172 v.Aux = t.FieldType(3) 24173 v0 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(3).PtrTo()) 24174 v0.AuxInt = t.FieldOff(3) 24175 v0.AddArg(dst) 24176 v.AddArg(v0) 24177 v.AddArg(f3) 24178 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) 24179 v1.Aux = t.FieldType(2) 24180 v2 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(2).PtrTo()) 24181 v2.AuxInt = t.FieldOff(2) 24182 v2.AddArg(dst) 24183 v1.AddArg(v2) 24184 v1.AddArg(f2) 24185 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem) 24186 v3.Aux = t.FieldType(1) 24187 v4 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) 24188 v4.AuxInt = t.FieldOff(1) 24189 v4.AddArg(dst) 24190 v3.AddArg(v4) 24191 v3.AddArg(f1) 24192 v5 := b.NewValue0(v.Pos, OpStore, types.TypeMem) 24193 v5.Aux = t.FieldType(0) 24194 v6 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 24195 v6.AuxInt = 0 24196 v6.AddArg(dst) 24197 v5.AddArg(v6) 24198 v5.AddArg(f0) 24199 v5.AddArg(mem) 24200 v3.AddArg(v5) 24201 v1.AddArg(v3) 24202 v.AddArg(v1) 24203 return true 24204 } 24205 // match: (Store {t} dst (Load src mem) mem) 24206 // cond: !fe.CanSSA(t.(*types.Type)) 24207 // result: (Move {t} [t.(*types.Type).Size()] dst src mem) 24208 for { 24209 t := v.Aux 24210 _ = v.Args[2] 24211 dst := v.Args[0] 24212 v_1 := v.Args[1] 24213 if v_1.Op != OpLoad { 24214 break 24215 } 24216 _ = v_1.Args[1] 24217 src := v_1.Args[0] 24218 mem := v_1.Args[1] 24219 if mem != v.Args[2] { 24220 break 24221 } 24222 if !(!fe.CanSSA(t.(*types.Type))) { 24223 break 24224 } 24225 v.reset(OpMove) 24226 v.AuxInt = t.(*types.Type).Size() 24227 v.Aux = t 24228 v.AddArg(dst) 24229 v.AddArg(src) 24230 v.AddArg(mem) 24231 return true 24232 } 24233 return false 24234 } 24235 func rewriteValuegeneric_OpStore_10(v *Value) bool { 24236 b := v.Block 24237 _ = b 24238 config := b.Func.Config 24239 _ = config 24240 fe := b.Func.fe 24241 _ = fe 24242 // match: (Store {t} dst (Load src mem) (VarDef {x} mem)) 24243 // cond: !fe.CanSSA(t.(*types.Type)) 24244 // result: (Move {t} [t.(*types.Type).Size()] dst src (VarDef {x} mem)) 24245 for { 24246 t := v.Aux 24247 _ = v.Args[2] 24248 dst := v.Args[0] 24249 v_1 := v.Args[1] 24250 if v_1.Op != OpLoad { 24251 break 24252 } 24253 _ = v_1.Args[1] 24254 src := v_1.Args[0] 24255 mem := v_1.Args[1] 24256 v_2 := v.Args[2] 24257 if v_2.Op != OpVarDef { 24258 break 24259 } 24260 x := v_2.Aux 24261 if mem != v_2.Args[0] { 24262 break 24263 } 24264 if !(!fe.CanSSA(t.(*types.Type))) { 24265 break 24266 } 24267 v.reset(OpMove) 24268 v.AuxInt = t.(*types.Type).Size() 24269 v.Aux = t 24270 v.AddArg(dst) 24271 v.AddArg(src) 24272 v0 := b.NewValue0(v.Pos, OpVarDef, types.TypeMem) 24273 v0.Aux = x 24274 v0.AddArg(mem) 24275 v.AddArg(v0) 24276 return true 24277 } 24278 // match: (Store _ (ArrayMake0) mem) 24279 // cond: 24280 // result: mem 24281 for { 24282 _ = v.Args[2] 24283 v_1 := v.Args[1] 24284 if v_1.Op != OpArrayMake0 { 24285 break 24286 } 24287 mem := v.Args[2] 24288 v.reset(OpCopy) 24289 v.Type = mem.Type 24290 v.AddArg(mem) 24291 return true 24292 } 24293 // match: (Store dst (ArrayMake1 e) mem) 24294 // cond: 24295 // result: (Store {e.Type} dst e mem) 24296 for { 24297 _ = v.Args[2] 24298 dst := v.Args[0] 24299 v_1 := v.Args[1] 24300 if v_1.Op != OpArrayMake1 { 24301 break 24302 } 24303 e := v_1.Args[0] 24304 mem := v.Args[2] 24305 v.reset(OpStore) 24306 v.Aux = e.Type 24307 v.AddArg(dst) 24308 v.AddArg(e) 24309 v.AddArg(mem) 24310 return true 24311 } 24312 // match: (Store (Load (OffPtr [c] (SP)) mem) x mem) 24313 // cond: isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize 24314 // result: mem 24315 for { 24316 _ = v.Args[2] 24317 v_0 := v.Args[0] 24318 if v_0.Op != OpLoad { 24319 break 24320 } 24321 _ = v_0.Args[1] 24322 v_0_0 := v_0.Args[0] 24323 if v_0_0.Op != OpOffPtr { 24324 break 24325 } 24326 c := v_0_0.AuxInt 24327 v_0_0_0 := v_0_0.Args[0] 24328 if v_0_0_0.Op != OpSP { 24329 break 24330 } 24331 mem := v_0.Args[1] 24332 x := v.Args[1] 24333 if mem != v.Args[2] { 24334 break 24335 } 24336 if !(isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize) { 24337 break 24338 } 24339 v.reset(OpCopy) 24340 v.Type = mem.Type 24341 v.AddArg(mem) 24342 return true 24343 } 24344 // match: (Store (OffPtr (Load (OffPtr [c] (SP)) mem)) x mem) 24345 // cond: isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize 24346 // result: mem 24347 for { 24348 _ = v.Args[2] 24349 v_0 := v.Args[0] 24350 if v_0.Op != OpOffPtr { 24351 break 24352 } 24353 v_0_0 := v_0.Args[0] 24354 if v_0_0.Op != OpLoad { 24355 break 24356 } 24357 _ = v_0_0.Args[1] 24358 v_0_0_0 := v_0_0.Args[0] 24359 if v_0_0_0.Op != OpOffPtr { 24360 break 24361 } 24362 c := v_0_0_0.AuxInt 24363 v_0_0_0_0 := v_0_0_0.Args[0] 24364 if v_0_0_0_0.Op != OpSP { 24365 break 24366 } 24367 mem := v_0_0.Args[1] 24368 x := v.Args[1] 24369 if mem != v.Args[2] { 24370 break 24371 } 24372 if !(isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize) { 24373 break 24374 } 24375 v.reset(OpCopy) 24376 v.Type = mem.Type 24377 v.AddArg(mem) 24378 return true 24379 } 24380 return false 24381 } 24382 func rewriteValuegeneric_OpStringLen_0(v *Value) bool { 24383 // match: (StringLen (StringMake _ (Const64 <t> [c]))) 24384 // cond: 24385 // result: (Const64 <t> [c]) 24386 for { 24387 v_0 := v.Args[0] 24388 if v_0.Op != OpStringMake { 24389 break 24390 } 24391 _ = v_0.Args[1] 24392 v_0_1 := v_0.Args[1] 24393 if v_0_1.Op != OpConst64 { 24394 break 24395 } 24396 t := v_0_1.Type 24397 c := v_0_1.AuxInt 24398 v.reset(OpConst64) 24399 v.Type = t 24400 v.AuxInt = c 24401 return true 24402 } 24403 return false 24404 } 24405 func rewriteValuegeneric_OpStringPtr_0(v *Value) bool { 24406 // match: (StringPtr (StringMake (Const64 <t> [c]) _)) 24407 // cond: 24408 // result: (Const64 <t> [c]) 24409 for { 24410 v_0 := v.Args[0] 24411 if v_0.Op != OpStringMake { 24412 break 24413 } 24414 _ = v_0.Args[1] 24415 v_0_0 := v_0.Args[0] 24416 if v_0_0.Op != OpConst64 { 24417 break 24418 } 24419 t := v_0_0.Type 24420 c := v_0_0.AuxInt 24421 v.reset(OpConst64) 24422 v.Type = t 24423 v.AuxInt = c 24424 return true 24425 } 24426 return false 24427 } 24428 func rewriteValuegeneric_OpStructSelect_0(v *Value) bool { 24429 // match: (StructSelect (StructMake1 x)) 24430 // cond: 24431 // result: x 24432 for { 24433 v_0 := v.Args[0] 24434 if v_0.Op != OpStructMake1 { 24435 break 24436 } 24437 x := v_0.Args[0] 24438 v.reset(OpCopy) 24439 v.Type = x.Type 24440 v.AddArg(x) 24441 return true 24442 } 24443 // match: (StructSelect [0] (StructMake2 x _)) 24444 // cond: 24445 // result: x 24446 for { 24447 if v.AuxInt != 0 { 24448 break 24449 } 24450 v_0 := v.Args[0] 24451 if v_0.Op != OpStructMake2 { 24452 break 24453 } 24454 _ = v_0.Args[1] 24455 x := v_0.Args[0] 24456 v.reset(OpCopy) 24457 v.Type = x.Type 24458 v.AddArg(x) 24459 return true 24460 } 24461 // match: (StructSelect [1] (StructMake2 _ x)) 24462 // cond: 24463 // result: x 24464 for { 24465 if v.AuxInt != 1 { 24466 break 24467 } 24468 v_0 := v.Args[0] 24469 if v_0.Op != OpStructMake2 { 24470 break 24471 } 24472 _ = v_0.Args[1] 24473 x := v_0.Args[1] 24474 v.reset(OpCopy) 24475 v.Type = x.Type 24476 v.AddArg(x) 24477 return true 24478 } 24479 // match: (StructSelect [0] (StructMake3 x _ _)) 24480 // cond: 24481 // result: x 24482 for { 24483 if v.AuxInt != 0 { 24484 break 24485 } 24486 v_0 := v.Args[0] 24487 if v_0.Op != OpStructMake3 { 24488 break 24489 } 24490 _ = v_0.Args[2] 24491 x := v_0.Args[0] 24492 v.reset(OpCopy) 24493 v.Type = x.Type 24494 v.AddArg(x) 24495 return true 24496 } 24497 // match: (StructSelect [1] (StructMake3 _ x _)) 24498 // cond: 24499 // result: x 24500 for { 24501 if v.AuxInt != 1 { 24502 break 24503 } 24504 v_0 := v.Args[0] 24505 if v_0.Op != OpStructMake3 { 24506 break 24507 } 24508 _ = v_0.Args[2] 24509 x := v_0.Args[1] 24510 v.reset(OpCopy) 24511 v.Type = x.Type 24512 v.AddArg(x) 24513 return true 24514 } 24515 // match: (StructSelect [2] (StructMake3 _ _ x)) 24516 // cond: 24517 // result: x 24518 for { 24519 if v.AuxInt != 2 { 24520 break 24521 } 24522 v_0 := v.Args[0] 24523 if v_0.Op != OpStructMake3 { 24524 break 24525 } 24526 _ = v_0.Args[2] 24527 x := v_0.Args[2] 24528 v.reset(OpCopy) 24529 v.Type = x.Type 24530 v.AddArg(x) 24531 return true 24532 } 24533 // match: (StructSelect [0] (StructMake4 x _ _ _)) 24534 // cond: 24535 // result: x 24536 for { 24537 if v.AuxInt != 0 { 24538 break 24539 } 24540 v_0 := v.Args[0] 24541 if v_0.Op != OpStructMake4 { 24542 break 24543 } 24544 _ = v_0.Args[3] 24545 x := v_0.Args[0] 24546 v.reset(OpCopy) 24547 v.Type = x.Type 24548 v.AddArg(x) 24549 return true 24550 } 24551 // match: (StructSelect [1] (StructMake4 _ x _ _)) 24552 // cond: 24553 // result: x 24554 for { 24555 if v.AuxInt != 1 { 24556 break 24557 } 24558 v_0 := v.Args[0] 24559 if v_0.Op != OpStructMake4 { 24560 break 24561 } 24562 _ = v_0.Args[3] 24563 x := v_0.Args[1] 24564 v.reset(OpCopy) 24565 v.Type = x.Type 24566 v.AddArg(x) 24567 return true 24568 } 24569 // match: (StructSelect [2] (StructMake4 _ _ x _)) 24570 // cond: 24571 // result: x 24572 for { 24573 if v.AuxInt != 2 { 24574 break 24575 } 24576 v_0 := v.Args[0] 24577 if v_0.Op != OpStructMake4 { 24578 break 24579 } 24580 _ = v_0.Args[3] 24581 x := v_0.Args[2] 24582 v.reset(OpCopy) 24583 v.Type = x.Type 24584 v.AddArg(x) 24585 return true 24586 } 24587 // match: (StructSelect [3] (StructMake4 _ _ _ x)) 24588 // cond: 24589 // result: x 24590 for { 24591 if v.AuxInt != 3 { 24592 break 24593 } 24594 v_0 := v.Args[0] 24595 if v_0.Op != OpStructMake4 { 24596 break 24597 } 24598 _ = v_0.Args[3] 24599 x := v_0.Args[3] 24600 v.reset(OpCopy) 24601 v.Type = x.Type 24602 v.AddArg(x) 24603 return true 24604 } 24605 return false 24606 } 24607 func rewriteValuegeneric_OpStructSelect_10(v *Value) bool { 24608 b := v.Block 24609 _ = b 24610 fe := b.Func.fe 24611 _ = fe 24612 // match: (StructSelect [i] x:(Load <t> ptr mem)) 24613 // cond: !fe.CanSSA(t) 24614 // result: @x.Block (Load <v.Type> (OffPtr <v.Type.PtrTo()> [t.FieldOff(int(i))] ptr) mem) 24615 for { 24616 i := v.AuxInt 24617 x := v.Args[0] 24618 if x.Op != OpLoad { 24619 break 24620 } 24621 t := x.Type 24622 _ = x.Args[1] 24623 ptr := x.Args[0] 24624 mem := x.Args[1] 24625 if !(!fe.CanSSA(t)) { 24626 break 24627 } 24628 b = x.Block 24629 v0 := b.NewValue0(v.Pos, OpLoad, v.Type) 24630 v.reset(OpCopy) 24631 v.AddArg(v0) 24632 v1 := b.NewValue0(v.Pos, OpOffPtr, v.Type.PtrTo()) 24633 v1.AuxInt = t.FieldOff(int(i)) 24634 v1.AddArg(ptr) 24635 v0.AddArg(v1) 24636 v0.AddArg(mem) 24637 return true 24638 } 24639 // match: (StructSelect [0] x:(IData _)) 24640 // cond: 24641 // result: x 24642 for { 24643 if v.AuxInt != 0 { 24644 break 24645 } 24646 x := v.Args[0] 24647 if x.Op != OpIData { 24648 break 24649 } 24650 v.reset(OpCopy) 24651 v.Type = x.Type 24652 v.AddArg(x) 24653 return true 24654 } 24655 return false 24656 } 24657 func rewriteValuegeneric_OpSub16_0(v *Value) bool { 24658 b := v.Block 24659 _ = b 24660 // match: (Sub16 (Const16 [c]) (Const16 [d])) 24661 // cond: 24662 // result: (Const16 [int64(int16(c-d))]) 24663 for { 24664 _ = v.Args[1] 24665 v_0 := v.Args[0] 24666 if v_0.Op != OpConst16 { 24667 break 24668 } 24669 c := v_0.AuxInt 24670 v_1 := v.Args[1] 24671 if v_1.Op != OpConst16 { 24672 break 24673 } 24674 d := v_1.AuxInt 24675 v.reset(OpConst16) 24676 v.AuxInt = int64(int16(c - d)) 24677 return true 24678 } 24679 // match: (Sub16 x (Const16 <t> [c])) 24680 // cond: x.Op != OpConst16 24681 // result: (Add16 (Const16 <t> [int64(int16(-c))]) x) 24682 for { 24683 _ = v.Args[1] 24684 x := v.Args[0] 24685 v_1 := v.Args[1] 24686 if v_1.Op != OpConst16 { 24687 break 24688 } 24689 t := v_1.Type 24690 c := v_1.AuxInt 24691 if !(x.Op != OpConst16) { 24692 break 24693 } 24694 v.reset(OpAdd16) 24695 v0 := b.NewValue0(v.Pos, OpConst16, t) 24696 v0.AuxInt = int64(int16(-c)) 24697 v.AddArg(v0) 24698 v.AddArg(x) 24699 return true 24700 } 24701 // match: (Sub16 <t> (Mul16 x y) (Mul16 x z)) 24702 // cond: 24703 // result: (Mul16 x (Sub16 <t> y z)) 24704 for { 24705 t := v.Type 24706 _ = v.Args[1] 24707 v_0 := v.Args[0] 24708 if v_0.Op != OpMul16 { 24709 break 24710 } 24711 _ = v_0.Args[1] 24712 x := v_0.Args[0] 24713 y := v_0.Args[1] 24714 v_1 := v.Args[1] 24715 if v_1.Op != OpMul16 { 24716 break 24717 } 24718 _ = v_1.Args[1] 24719 if x != v_1.Args[0] { 24720 break 24721 } 24722 z := v_1.Args[1] 24723 v.reset(OpMul16) 24724 v.AddArg(x) 24725 v0 := b.NewValue0(v.Pos, OpSub16, t) 24726 v0.AddArg(y) 24727 v0.AddArg(z) 24728 v.AddArg(v0) 24729 return true 24730 } 24731 // match: (Sub16 <t> (Mul16 y x) (Mul16 x z)) 24732 // cond: 24733 // result: (Mul16 x (Sub16 <t> y z)) 24734 for { 24735 t := v.Type 24736 _ = v.Args[1] 24737 v_0 := v.Args[0] 24738 if v_0.Op != OpMul16 { 24739 break 24740 } 24741 _ = v_0.Args[1] 24742 y := v_0.Args[0] 24743 x := v_0.Args[1] 24744 v_1 := v.Args[1] 24745 if v_1.Op != OpMul16 { 24746 break 24747 } 24748 _ = v_1.Args[1] 24749 if x != v_1.Args[0] { 24750 break 24751 } 24752 z := v_1.Args[1] 24753 v.reset(OpMul16) 24754 v.AddArg(x) 24755 v0 := b.NewValue0(v.Pos, OpSub16, t) 24756 v0.AddArg(y) 24757 v0.AddArg(z) 24758 v.AddArg(v0) 24759 return true 24760 } 24761 // match: (Sub16 <t> (Mul16 x y) (Mul16 z x)) 24762 // cond: 24763 // result: (Mul16 x (Sub16 <t> y z)) 24764 for { 24765 t := v.Type 24766 _ = v.Args[1] 24767 v_0 := v.Args[0] 24768 if v_0.Op != OpMul16 { 24769 break 24770 } 24771 _ = v_0.Args[1] 24772 x := v_0.Args[0] 24773 y := v_0.Args[1] 24774 v_1 := v.Args[1] 24775 if v_1.Op != OpMul16 { 24776 break 24777 } 24778 _ = v_1.Args[1] 24779 z := v_1.Args[0] 24780 if x != v_1.Args[1] { 24781 break 24782 } 24783 v.reset(OpMul16) 24784 v.AddArg(x) 24785 v0 := b.NewValue0(v.Pos, OpSub16, t) 24786 v0.AddArg(y) 24787 v0.AddArg(z) 24788 v.AddArg(v0) 24789 return true 24790 } 24791 // match: (Sub16 <t> (Mul16 y x) (Mul16 z x)) 24792 // cond: 24793 // result: (Mul16 x (Sub16 <t> y z)) 24794 for { 24795 t := v.Type 24796 _ = v.Args[1] 24797 v_0 := v.Args[0] 24798 if v_0.Op != OpMul16 { 24799 break 24800 } 24801 _ = v_0.Args[1] 24802 y := v_0.Args[0] 24803 x := v_0.Args[1] 24804 v_1 := v.Args[1] 24805 if v_1.Op != OpMul16 { 24806 break 24807 } 24808 _ = v_1.Args[1] 24809 z := v_1.Args[0] 24810 if x != v_1.Args[1] { 24811 break 24812 } 24813 v.reset(OpMul16) 24814 v.AddArg(x) 24815 v0 := b.NewValue0(v.Pos, OpSub16, t) 24816 v0.AddArg(y) 24817 v0.AddArg(z) 24818 v.AddArg(v0) 24819 return true 24820 } 24821 // match: (Sub16 x x) 24822 // cond: 24823 // result: (Const16 [0]) 24824 for { 24825 _ = v.Args[1] 24826 x := v.Args[0] 24827 if x != v.Args[1] { 24828 break 24829 } 24830 v.reset(OpConst16) 24831 v.AuxInt = 0 24832 return true 24833 } 24834 // match: (Sub16 (Add16 x y) x) 24835 // cond: 24836 // result: y 24837 for { 24838 _ = v.Args[1] 24839 v_0 := v.Args[0] 24840 if v_0.Op != OpAdd16 { 24841 break 24842 } 24843 _ = v_0.Args[1] 24844 x := v_0.Args[0] 24845 y := v_0.Args[1] 24846 if x != v.Args[1] { 24847 break 24848 } 24849 v.reset(OpCopy) 24850 v.Type = y.Type 24851 v.AddArg(y) 24852 return true 24853 } 24854 // match: (Sub16 (Add16 y x) x) 24855 // cond: 24856 // result: y 24857 for { 24858 _ = v.Args[1] 24859 v_0 := v.Args[0] 24860 if v_0.Op != OpAdd16 { 24861 break 24862 } 24863 _ = v_0.Args[1] 24864 y := v_0.Args[0] 24865 x := v_0.Args[1] 24866 if x != v.Args[1] { 24867 break 24868 } 24869 v.reset(OpCopy) 24870 v.Type = y.Type 24871 v.AddArg(y) 24872 return true 24873 } 24874 // match: (Sub16 (Add16 x y) y) 24875 // cond: 24876 // result: x 24877 for { 24878 _ = v.Args[1] 24879 v_0 := v.Args[0] 24880 if v_0.Op != OpAdd16 { 24881 break 24882 } 24883 _ = v_0.Args[1] 24884 x := v_0.Args[0] 24885 y := v_0.Args[1] 24886 if y != v.Args[1] { 24887 break 24888 } 24889 v.reset(OpCopy) 24890 v.Type = x.Type 24891 v.AddArg(x) 24892 return true 24893 } 24894 return false 24895 } 24896 func rewriteValuegeneric_OpSub16_10(v *Value) bool { 24897 b := v.Block 24898 _ = b 24899 // match: (Sub16 (Add16 y x) y) 24900 // cond: 24901 // result: x 24902 for { 24903 _ = v.Args[1] 24904 v_0 := v.Args[0] 24905 if v_0.Op != OpAdd16 { 24906 break 24907 } 24908 _ = v_0.Args[1] 24909 y := v_0.Args[0] 24910 x := v_0.Args[1] 24911 if y != v.Args[1] { 24912 break 24913 } 24914 v.reset(OpCopy) 24915 v.Type = x.Type 24916 v.AddArg(x) 24917 return true 24918 } 24919 // match: (Sub16 x (Sub16 i:(Const16 <t>) z)) 24920 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 24921 // result: (Sub16 (Add16 <t> x z) i) 24922 for { 24923 _ = v.Args[1] 24924 x := v.Args[0] 24925 v_1 := v.Args[1] 24926 if v_1.Op != OpSub16 { 24927 break 24928 } 24929 _ = v_1.Args[1] 24930 i := v_1.Args[0] 24931 if i.Op != OpConst16 { 24932 break 24933 } 24934 t := i.Type 24935 z := v_1.Args[1] 24936 if !(z.Op != OpConst16 && x.Op != OpConst16) { 24937 break 24938 } 24939 v.reset(OpSub16) 24940 v0 := b.NewValue0(v.Pos, OpAdd16, t) 24941 v0.AddArg(x) 24942 v0.AddArg(z) 24943 v.AddArg(v0) 24944 v.AddArg(i) 24945 return true 24946 } 24947 // match: (Sub16 x (Sub16 z i:(Const16 <t>))) 24948 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 24949 // result: (Add16 i (Sub16 <t> x z)) 24950 for { 24951 _ = v.Args[1] 24952 x := v.Args[0] 24953 v_1 := v.Args[1] 24954 if v_1.Op != OpSub16 { 24955 break 24956 } 24957 _ = v_1.Args[1] 24958 z := v_1.Args[0] 24959 i := v_1.Args[1] 24960 if i.Op != OpConst16 { 24961 break 24962 } 24963 t := i.Type 24964 if !(z.Op != OpConst16 && x.Op != OpConst16) { 24965 break 24966 } 24967 v.reset(OpAdd16) 24968 v.AddArg(i) 24969 v0 := b.NewValue0(v.Pos, OpSub16, t) 24970 v0.AddArg(x) 24971 v0.AddArg(z) 24972 v.AddArg(v0) 24973 return true 24974 } 24975 // match: (Sub16 (Const16 <t> [c]) (Sub16 x (Const16 <t> [d]))) 24976 // cond: 24977 // result: (Sub16 (Const16 <t> [int64(int16(c+d))]) x) 24978 for { 24979 _ = v.Args[1] 24980 v_0 := v.Args[0] 24981 if v_0.Op != OpConst16 { 24982 break 24983 } 24984 t := v_0.Type 24985 c := v_0.AuxInt 24986 v_1 := v.Args[1] 24987 if v_1.Op != OpSub16 { 24988 break 24989 } 24990 _ = v_1.Args[1] 24991 x := v_1.Args[0] 24992 v_1_1 := v_1.Args[1] 24993 if v_1_1.Op != OpConst16 { 24994 break 24995 } 24996 if v_1_1.Type != t { 24997 break 24998 } 24999 d := v_1_1.AuxInt 25000 v.reset(OpSub16) 25001 v0 := b.NewValue0(v.Pos, OpConst16, t) 25002 v0.AuxInt = int64(int16(c + d)) 25003 v.AddArg(v0) 25004 v.AddArg(x) 25005 return true 25006 } 25007 // match: (Sub16 (Const16 <t> [c]) (Sub16 (Const16 <t> [d]) x)) 25008 // cond: 25009 // result: (Add16 (Const16 <t> [int64(int16(c-d))]) x) 25010 for { 25011 _ = v.Args[1] 25012 v_0 := v.Args[0] 25013 if v_0.Op != OpConst16 { 25014 break 25015 } 25016 t := v_0.Type 25017 c := v_0.AuxInt 25018 v_1 := v.Args[1] 25019 if v_1.Op != OpSub16 { 25020 break 25021 } 25022 _ = v_1.Args[1] 25023 v_1_0 := v_1.Args[0] 25024 if v_1_0.Op != OpConst16 { 25025 break 25026 } 25027 if v_1_0.Type != t { 25028 break 25029 } 25030 d := v_1_0.AuxInt 25031 x := v_1.Args[1] 25032 v.reset(OpAdd16) 25033 v0 := b.NewValue0(v.Pos, OpConst16, t) 25034 v0.AuxInt = int64(int16(c - d)) 25035 v.AddArg(v0) 25036 v.AddArg(x) 25037 return true 25038 } 25039 return false 25040 } 25041 func rewriteValuegeneric_OpSub32_0(v *Value) bool { 25042 b := v.Block 25043 _ = b 25044 // match: (Sub32 (Const32 [c]) (Const32 [d])) 25045 // cond: 25046 // result: (Const32 [int64(int32(c-d))]) 25047 for { 25048 _ = v.Args[1] 25049 v_0 := v.Args[0] 25050 if v_0.Op != OpConst32 { 25051 break 25052 } 25053 c := v_0.AuxInt 25054 v_1 := v.Args[1] 25055 if v_1.Op != OpConst32 { 25056 break 25057 } 25058 d := v_1.AuxInt 25059 v.reset(OpConst32) 25060 v.AuxInt = int64(int32(c - d)) 25061 return true 25062 } 25063 // match: (Sub32 x (Const32 <t> [c])) 25064 // cond: x.Op != OpConst32 25065 // result: (Add32 (Const32 <t> [int64(int32(-c))]) x) 25066 for { 25067 _ = v.Args[1] 25068 x := v.Args[0] 25069 v_1 := v.Args[1] 25070 if v_1.Op != OpConst32 { 25071 break 25072 } 25073 t := v_1.Type 25074 c := v_1.AuxInt 25075 if !(x.Op != OpConst32) { 25076 break 25077 } 25078 v.reset(OpAdd32) 25079 v0 := b.NewValue0(v.Pos, OpConst32, t) 25080 v0.AuxInt = int64(int32(-c)) 25081 v.AddArg(v0) 25082 v.AddArg(x) 25083 return true 25084 } 25085 // match: (Sub32 <t> (Mul32 x y) (Mul32 x z)) 25086 // cond: 25087 // result: (Mul32 x (Sub32 <t> y z)) 25088 for { 25089 t := v.Type 25090 _ = v.Args[1] 25091 v_0 := v.Args[0] 25092 if v_0.Op != OpMul32 { 25093 break 25094 } 25095 _ = v_0.Args[1] 25096 x := v_0.Args[0] 25097 y := v_0.Args[1] 25098 v_1 := v.Args[1] 25099 if v_1.Op != OpMul32 { 25100 break 25101 } 25102 _ = v_1.Args[1] 25103 if x != v_1.Args[0] { 25104 break 25105 } 25106 z := v_1.Args[1] 25107 v.reset(OpMul32) 25108 v.AddArg(x) 25109 v0 := b.NewValue0(v.Pos, OpSub32, t) 25110 v0.AddArg(y) 25111 v0.AddArg(z) 25112 v.AddArg(v0) 25113 return true 25114 } 25115 // match: (Sub32 <t> (Mul32 y x) (Mul32 x z)) 25116 // cond: 25117 // result: (Mul32 x (Sub32 <t> y z)) 25118 for { 25119 t := v.Type 25120 _ = v.Args[1] 25121 v_0 := v.Args[0] 25122 if v_0.Op != OpMul32 { 25123 break 25124 } 25125 _ = v_0.Args[1] 25126 y := v_0.Args[0] 25127 x := v_0.Args[1] 25128 v_1 := v.Args[1] 25129 if v_1.Op != OpMul32 { 25130 break 25131 } 25132 _ = v_1.Args[1] 25133 if x != v_1.Args[0] { 25134 break 25135 } 25136 z := v_1.Args[1] 25137 v.reset(OpMul32) 25138 v.AddArg(x) 25139 v0 := b.NewValue0(v.Pos, OpSub32, t) 25140 v0.AddArg(y) 25141 v0.AddArg(z) 25142 v.AddArg(v0) 25143 return true 25144 } 25145 // match: (Sub32 <t> (Mul32 x y) (Mul32 z x)) 25146 // cond: 25147 // result: (Mul32 x (Sub32 <t> y z)) 25148 for { 25149 t := v.Type 25150 _ = v.Args[1] 25151 v_0 := v.Args[0] 25152 if v_0.Op != OpMul32 { 25153 break 25154 } 25155 _ = v_0.Args[1] 25156 x := v_0.Args[0] 25157 y := v_0.Args[1] 25158 v_1 := v.Args[1] 25159 if v_1.Op != OpMul32 { 25160 break 25161 } 25162 _ = v_1.Args[1] 25163 z := v_1.Args[0] 25164 if x != v_1.Args[1] { 25165 break 25166 } 25167 v.reset(OpMul32) 25168 v.AddArg(x) 25169 v0 := b.NewValue0(v.Pos, OpSub32, t) 25170 v0.AddArg(y) 25171 v0.AddArg(z) 25172 v.AddArg(v0) 25173 return true 25174 } 25175 // match: (Sub32 <t> (Mul32 y x) (Mul32 z x)) 25176 // cond: 25177 // result: (Mul32 x (Sub32 <t> y z)) 25178 for { 25179 t := v.Type 25180 _ = v.Args[1] 25181 v_0 := v.Args[0] 25182 if v_0.Op != OpMul32 { 25183 break 25184 } 25185 _ = v_0.Args[1] 25186 y := v_0.Args[0] 25187 x := v_0.Args[1] 25188 v_1 := v.Args[1] 25189 if v_1.Op != OpMul32 { 25190 break 25191 } 25192 _ = v_1.Args[1] 25193 z := v_1.Args[0] 25194 if x != v_1.Args[1] { 25195 break 25196 } 25197 v.reset(OpMul32) 25198 v.AddArg(x) 25199 v0 := b.NewValue0(v.Pos, OpSub32, t) 25200 v0.AddArg(y) 25201 v0.AddArg(z) 25202 v.AddArg(v0) 25203 return true 25204 } 25205 // match: (Sub32 x x) 25206 // cond: 25207 // result: (Const32 [0]) 25208 for { 25209 _ = v.Args[1] 25210 x := v.Args[0] 25211 if x != v.Args[1] { 25212 break 25213 } 25214 v.reset(OpConst32) 25215 v.AuxInt = 0 25216 return true 25217 } 25218 // match: (Sub32 (Add32 x y) x) 25219 // cond: 25220 // result: y 25221 for { 25222 _ = v.Args[1] 25223 v_0 := v.Args[0] 25224 if v_0.Op != OpAdd32 { 25225 break 25226 } 25227 _ = v_0.Args[1] 25228 x := v_0.Args[0] 25229 y := v_0.Args[1] 25230 if x != v.Args[1] { 25231 break 25232 } 25233 v.reset(OpCopy) 25234 v.Type = y.Type 25235 v.AddArg(y) 25236 return true 25237 } 25238 // match: (Sub32 (Add32 y x) x) 25239 // cond: 25240 // result: y 25241 for { 25242 _ = v.Args[1] 25243 v_0 := v.Args[0] 25244 if v_0.Op != OpAdd32 { 25245 break 25246 } 25247 _ = v_0.Args[1] 25248 y := v_0.Args[0] 25249 x := v_0.Args[1] 25250 if x != v.Args[1] { 25251 break 25252 } 25253 v.reset(OpCopy) 25254 v.Type = y.Type 25255 v.AddArg(y) 25256 return true 25257 } 25258 // match: (Sub32 (Add32 x y) y) 25259 // cond: 25260 // result: x 25261 for { 25262 _ = v.Args[1] 25263 v_0 := v.Args[0] 25264 if v_0.Op != OpAdd32 { 25265 break 25266 } 25267 _ = v_0.Args[1] 25268 x := v_0.Args[0] 25269 y := v_0.Args[1] 25270 if y != v.Args[1] { 25271 break 25272 } 25273 v.reset(OpCopy) 25274 v.Type = x.Type 25275 v.AddArg(x) 25276 return true 25277 } 25278 return false 25279 } 25280 func rewriteValuegeneric_OpSub32_10(v *Value) bool { 25281 b := v.Block 25282 _ = b 25283 // match: (Sub32 (Add32 y x) y) 25284 // cond: 25285 // result: x 25286 for { 25287 _ = v.Args[1] 25288 v_0 := v.Args[0] 25289 if v_0.Op != OpAdd32 { 25290 break 25291 } 25292 _ = v_0.Args[1] 25293 y := v_0.Args[0] 25294 x := v_0.Args[1] 25295 if y != v.Args[1] { 25296 break 25297 } 25298 v.reset(OpCopy) 25299 v.Type = x.Type 25300 v.AddArg(x) 25301 return true 25302 } 25303 // match: (Sub32 x (Sub32 i:(Const32 <t>) z)) 25304 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 25305 // result: (Sub32 (Add32 <t> x z) i) 25306 for { 25307 _ = v.Args[1] 25308 x := v.Args[0] 25309 v_1 := v.Args[1] 25310 if v_1.Op != OpSub32 { 25311 break 25312 } 25313 _ = v_1.Args[1] 25314 i := v_1.Args[0] 25315 if i.Op != OpConst32 { 25316 break 25317 } 25318 t := i.Type 25319 z := v_1.Args[1] 25320 if !(z.Op != OpConst32 && x.Op != OpConst32) { 25321 break 25322 } 25323 v.reset(OpSub32) 25324 v0 := b.NewValue0(v.Pos, OpAdd32, t) 25325 v0.AddArg(x) 25326 v0.AddArg(z) 25327 v.AddArg(v0) 25328 v.AddArg(i) 25329 return true 25330 } 25331 // match: (Sub32 x (Sub32 z i:(Const32 <t>))) 25332 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 25333 // result: (Add32 i (Sub32 <t> x z)) 25334 for { 25335 _ = v.Args[1] 25336 x := v.Args[0] 25337 v_1 := v.Args[1] 25338 if v_1.Op != OpSub32 { 25339 break 25340 } 25341 _ = v_1.Args[1] 25342 z := v_1.Args[0] 25343 i := v_1.Args[1] 25344 if i.Op != OpConst32 { 25345 break 25346 } 25347 t := i.Type 25348 if !(z.Op != OpConst32 && x.Op != OpConst32) { 25349 break 25350 } 25351 v.reset(OpAdd32) 25352 v.AddArg(i) 25353 v0 := b.NewValue0(v.Pos, OpSub32, t) 25354 v0.AddArg(x) 25355 v0.AddArg(z) 25356 v.AddArg(v0) 25357 return true 25358 } 25359 // match: (Sub32 (Const32 <t> [c]) (Sub32 x (Const32 <t> [d]))) 25360 // cond: 25361 // result: (Sub32 (Const32 <t> [int64(int32(c+d))]) x) 25362 for { 25363 _ = v.Args[1] 25364 v_0 := v.Args[0] 25365 if v_0.Op != OpConst32 { 25366 break 25367 } 25368 t := v_0.Type 25369 c := v_0.AuxInt 25370 v_1 := v.Args[1] 25371 if v_1.Op != OpSub32 { 25372 break 25373 } 25374 _ = v_1.Args[1] 25375 x := v_1.Args[0] 25376 v_1_1 := v_1.Args[1] 25377 if v_1_1.Op != OpConst32 { 25378 break 25379 } 25380 if v_1_1.Type != t { 25381 break 25382 } 25383 d := v_1_1.AuxInt 25384 v.reset(OpSub32) 25385 v0 := b.NewValue0(v.Pos, OpConst32, t) 25386 v0.AuxInt = int64(int32(c + d)) 25387 v.AddArg(v0) 25388 v.AddArg(x) 25389 return true 25390 } 25391 // match: (Sub32 (Const32 <t> [c]) (Sub32 (Const32 <t> [d]) x)) 25392 // cond: 25393 // result: (Add32 (Const32 <t> [int64(int32(c-d))]) x) 25394 for { 25395 _ = v.Args[1] 25396 v_0 := v.Args[0] 25397 if v_0.Op != OpConst32 { 25398 break 25399 } 25400 t := v_0.Type 25401 c := v_0.AuxInt 25402 v_1 := v.Args[1] 25403 if v_1.Op != OpSub32 { 25404 break 25405 } 25406 _ = v_1.Args[1] 25407 v_1_0 := v_1.Args[0] 25408 if v_1_0.Op != OpConst32 { 25409 break 25410 } 25411 if v_1_0.Type != t { 25412 break 25413 } 25414 d := v_1_0.AuxInt 25415 x := v_1.Args[1] 25416 v.reset(OpAdd32) 25417 v0 := b.NewValue0(v.Pos, OpConst32, t) 25418 v0.AuxInt = int64(int32(c - d)) 25419 v.AddArg(v0) 25420 v.AddArg(x) 25421 return true 25422 } 25423 return false 25424 } 25425 func rewriteValuegeneric_OpSub32F_0(v *Value) bool { 25426 // match: (Sub32F (Const32F [c]) (Const32F [d])) 25427 // cond: 25428 // result: (Const32F [f2i(float64(i2f32(c) - i2f32(d)))]) 25429 for { 25430 _ = v.Args[1] 25431 v_0 := v.Args[0] 25432 if v_0.Op != OpConst32F { 25433 break 25434 } 25435 c := v_0.AuxInt 25436 v_1 := v.Args[1] 25437 if v_1.Op != OpConst32F { 25438 break 25439 } 25440 d := v_1.AuxInt 25441 v.reset(OpConst32F) 25442 v.AuxInt = f2i(float64(i2f32(c) - i2f32(d))) 25443 return true 25444 } 25445 // match: (Sub32F x (Const32F [0])) 25446 // cond: 25447 // result: x 25448 for { 25449 _ = v.Args[1] 25450 x := v.Args[0] 25451 v_1 := v.Args[1] 25452 if v_1.Op != OpConst32F { 25453 break 25454 } 25455 if v_1.AuxInt != 0 { 25456 break 25457 } 25458 v.reset(OpCopy) 25459 v.Type = x.Type 25460 v.AddArg(x) 25461 return true 25462 } 25463 return false 25464 } 25465 func rewriteValuegeneric_OpSub64_0(v *Value) bool { 25466 b := v.Block 25467 _ = b 25468 // match: (Sub64 (Const64 [c]) (Const64 [d])) 25469 // cond: 25470 // result: (Const64 [c-d]) 25471 for { 25472 _ = v.Args[1] 25473 v_0 := v.Args[0] 25474 if v_0.Op != OpConst64 { 25475 break 25476 } 25477 c := v_0.AuxInt 25478 v_1 := v.Args[1] 25479 if v_1.Op != OpConst64 { 25480 break 25481 } 25482 d := v_1.AuxInt 25483 v.reset(OpConst64) 25484 v.AuxInt = c - d 25485 return true 25486 } 25487 // match: (Sub64 x (Const64 <t> [c])) 25488 // cond: x.Op != OpConst64 25489 // result: (Add64 (Const64 <t> [-c]) x) 25490 for { 25491 _ = v.Args[1] 25492 x := v.Args[0] 25493 v_1 := v.Args[1] 25494 if v_1.Op != OpConst64 { 25495 break 25496 } 25497 t := v_1.Type 25498 c := v_1.AuxInt 25499 if !(x.Op != OpConst64) { 25500 break 25501 } 25502 v.reset(OpAdd64) 25503 v0 := b.NewValue0(v.Pos, OpConst64, t) 25504 v0.AuxInt = -c 25505 v.AddArg(v0) 25506 v.AddArg(x) 25507 return true 25508 } 25509 // match: (Sub64 <t> (Mul64 x y) (Mul64 x z)) 25510 // cond: 25511 // result: (Mul64 x (Sub64 <t> y z)) 25512 for { 25513 t := v.Type 25514 _ = v.Args[1] 25515 v_0 := v.Args[0] 25516 if v_0.Op != OpMul64 { 25517 break 25518 } 25519 _ = v_0.Args[1] 25520 x := v_0.Args[0] 25521 y := v_0.Args[1] 25522 v_1 := v.Args[1] 25523 if v_1.Op != OpMul64 { 25524 break 25525 } 25526 _ = v_1.Args[1] 25527 if x != v_1.Args[0] { 25528 break 25529 } 25530 z := v_1.Args[1] 25531 v.reset(OpMul64) 25532 v.AddArg(x) 25533 v0 := b.NewValue0(v.Pos, OpSub64, t) 25534 v0.AddArg(y) 25535 v0.AddArg(z) 25536 v.AddArg(v0) 25537 return true 25538 } 25539 // match: (Sub64 <t> (Mul64 y x) (Mul64 x z)) 25540 // cond: 25541 // result: (Mul64 x (Sub64 <t> y z)) 25542 for { 25543 t := v.Type 25544 _ = v.Args[1] 25545 v_0 := v.Args[0] 25546 if v_0.Op != OpMul64 { 25547 break 25548 } 25549 _ = v_0.Args[1] 25550 y := v_0.Args[0] 25551 x := v_0.Args[1] 25552 v_1 := v.Args[1] 25553 if v_1.Op != OpMul64 { 25554 break 25555 } 25556 _ = v_1.Args[1] 25557 if x != v_1.Args[0] { 25558 break 25559 } 25560 z := v_1.Args[1] 25561 v.reset(OpMul64) 25562 v.AddArg(x) 25563 v0 := b.NewValue0(v.Pos, OpSub64, t) 25564 v0.AddArg(y) 25565 v0.AddArg(z) 25566 v.AddArg(v0) 25567 return true 25568 } 25569 // match: (Sub64 <t> (Mul64 x y) (Mul64 z x)) 25570 // cond: 25571 // result: (Mul64 x (Sub64 <t> y z)) 25572 for { 25573 t := v.Type 25574 _ = v.Args[1] 25575 v_0 := v.Args[0] 25576 if v_0.Op != OpMul64 { 25577 break 25578 } 25579 _ = v_0.Args[1] 25580 x := v_0.Args[0] 25581 y := v_0.Args[1] 25582 v_1 := v.Args[1] 25583 if v_1.Op != OpMul64 { 25584 break 25585 } 25586 _ = v_1.Args[1] 25587 z := v_1.Args[0] 25588 if x != v_1.Args[1] { 25589 break 25590 } 25591 v.reset(OpMul64) 25592 v.AddArg(x) 25593 v0 := b.NewValue0(v.Pos, OpSub64, t) 25594 v0.AddArg(y) 25595 v0.AddArg(z) 25596 v.AddArg(v0) 25597 return true 25598 } 25599 // match: (Sub64 <t> (Mul64 y x) (Mul64 z x)) 25600 // cond: 25601 // result: (Mul64 x (Sub64 <t> y z)) 25602 for { 25603 t := v.Type 25604 _ = v.Args[1] 25605 v_0 := v.Args[0] 25606 if v_0.Op != OpMul64 { 25607 break 25608 } 25609 _ = v_0.Args[1] 25610 y := v_0.Args[0] 25611 x := v_0.Args[1] 25612 v_1 := v.Args[1] 25613 if v_1.Op != OpMul64 { 25614 break 25615 } 25616 _ = v_1.Args[1] 25617 z := v_1.Args[0] 25618 if x != v_1.Args[1] { 25619 break 25620 } 25621 v.reset(OpMul64) 25622 v.AddArg(x) 25623 v0 := b.NewValue0(v.Pos, OpSub64, t) 25624 v0.AddArg(y) 25625 v0.AddArg(z) 25626 v.AddArg(v0) 25627 return true 25628 } 25629 // match: (Sub64 x x) 25630 // cond: 25631 // result: (Const64 [0]) 25632 for { 25633 _ = v.Args[1] 25634 x := v.Args[0] 25635 if x != v.Args[1] { 25636 break 25637 } 25638 v.reset(OpConst64) 25639 v.AuxInt = 0 25640 return true 25641 } 25642 // match: (Sub64 (Add64 x y) x) 25643 // cond: 25644 // result: y 25645 for { 25646 _ = v.Args[1] 25647 v_0 := v.Args[0] 25648 if v_0.Op != OpAdd64 { 25649 break 25650 } 25651 _ = v_0.Args[1] 25652 x := v_0.Args[0] 25653 y := v_0.Args[1] 25654 if x != v.Args[1] { 25655 break 25656 } 25657 v.reset(OpCopy) 25658 v.Type = y.Type 25659 v.AddArg(y) 25660 return true 25661 } 25662 // match: (Sub64 (Add64 y x) x) 25663 // cond: 25664 // result: y 25665 for { 25666 _ = v.Args[1] 25667 v_0 := v.Args[0] 25668 if v_0.Op != OpAdd64 { 25669 break 25670 } 25671 _ = v_0.Args[1] 25672 y := v_0.Args[0] 25673 x := v_0.Args[1] 25674 if x != v.Args[1] { 25675 break 25676 } 25677 v.reset(OpCopy) 25678 v.Type = y.Type 25679 v.AddArg(y) 25680 return true 25681 } 25682 // match: (Sub64 (Add64 x y) y) 25683 // cond: 25684 // result: x 25685 for { 25686 _ = v.Args[1] 25687 v_0 := v.Args[0] 25688 if v_0.Op != OpAdd64 { 25689 break 25690 } 25691 _ = v_0.Args[1] 25692 x := v_0.Args[0] 25693 y := v_0.Args[1] 25694 if y != v.Args[1] { 25695 break 25696 } 25697 v.reset(OpCopy) 25698 v.Type = x.Type 25699 v.AddArg(x) 25700 return true 25701 } 25702 return false 25703 } 25704 func rewriteValuegeneric_OpSub64_10(v *Value) bool { 25705 b := v.Block 25706 _ = b 25707 // match: (Sub64 (Add64 y x) y) 25708 // cond: 25709 // result: x 25710 for { 25711 _ = v.Args[1] 25712 v_0 := v.Args[0] 25713 if v_0.Op != OpAdd64 { 25714 break 25715 } 25716 _ = v_0.Args[1] 25717 y := v_0.Args[0] 25718 x := v_0.Args[1] 25719 if y != v.Args[1] { 25720 break 25721 } 25722 v.reset(OpCopy) 25723 v.Type = x.Type 25724 v.AddArg(x) 25725 return true 25726 } 25727 // match: (Sub64 x (Sub64 i:(Const64 <t>) z)) 25728 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 25729 // result: (Sub64 (Add64 <t> x z) i) 25730 for { 25731 _ = v.Args[1] 25732 x := v.Args[0] 25733 v_1 := v.Args[1] 25734 if v_1.Op != OpSub64 { 25735 break 25736 } 25737 _ = v_1.Args[1] 25738 i := v_1.Args[0] 25739 if i.Op != OpConst64 { 25740 break 25741 } 25742 t := i.Type 25743 z := v_1.Args[1] 25744 if !(z.Op != OpConst64 && x.Op != OpConst64) { 25745 break 25746 } 25747 v.reset(OpSub64) 25748 v0 := b.NewValue0(v.Pos, OpAdd64, t) 25749 v0.AddArg(x) 25750 v0.AddArg(z) 25751 v.AddArg(v0) 25752 v.AddArg(i) 25753 return true 25754 } 25755 // match: (Sub64 x (Sub64 z i:(Const64 <t>))) 25756 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 25757 // result: (Add64 i (Sub64 <t> x z)) 25758 for { 25759 _ = v.Args[1] 25760 x := v.Args[0] 25761 v_1 := v.Args[1] 25762 if v_1.Op != OpSub64 { 25763 break 25764 } 25765 _ = v_1.Args[1] 25766 z := v_1.Args[0] 25767 i := v_1.Args[1] 25768 if i.Op != OpConst64 { 25769 break 25770 } 25771 t := i.Type 25772 if !(z.Op != OpConst64 && x.Op != OpConst64) { 25773 break 25774 } 25775 v.reset(OpAdd64) 25776 v.AddArg(i) 25777 v0 := b.NewValue0(v.Pos, OpSub64, t) 25778 v0.AddArg(x) 25779 v0.AddArg(z) 25780 v.AddArg(v0) 25781 return true 25782 } 25783 // match: (Sub64 (Const64 <t> [c]) (Sub64 x (Const64 <t> [d]))) 25784 // cond: 25785 // result: (Sub64 (Const64 <t> [c+d]) x) 25786 for { 25787 _ = v.Args[1] 25788 v_0 := v.Args[0] 25789 if v_0.Op != OpConst64 { 25790 break 25791 } 25792 t := v_0.Type 25793 c := v_0.AuxInt 25794 v_1 := v.Args[1] 25795 if v_1.Op != OpSub64 { 25796 break 25797 } 25798 _ = v_1.Args[1] 25799 x := v_1.Args[0] 25800 v_1_1 := v_1.Args[1] 25801 if v_1_1.Op != OpConst64 { 25802 break 25803 } 25804 if v_1_1.Type != t { 25805 break 25806 } 25807 d := v_1_1.AuxInt 25808 v.reset(OpSub64) 25809 v0 := b.NewValue0(v.Pos, OpConst64, t) 25810 v0.AuxInt = c + d 25811 v.AddArg(v0) 25812 v.AddArg(x) 25813 return true 25814 } 25815 // match: (Sub64 (Const64 <t> [c]) (Sub64 (Const64 <t> [d]) x)) 25816 // cond: 25817 // result: (Add64 (Const64 <t> [c-d]) x) 25818 for { 25819 _ = v.Args[1] 25820 v_0 := v.Args[0] 25821 if v_0.Op != OpConst64 { 25822 break 25823 } 25824 t := v_0.Type 25825 c := v_0.AuxInt 25826 v_1 := v.Args[1] 25827 if v_1.Op != OpSub64 { 25828 break 25829 } 25830 _ = v_1.Args[1] 25831 v_1_0 := v_1.Args[0] 25832 if v_1_0.Op != OpConst64 { 25833 break 25834 } 25835 if v_1_0.Type != t { 25836 break 25837 } 25838 d := v_1_0.AuxInt 25839 x := v_1.Args[1] 25840 v.reset(OpAdd64) 25841 v0 := b.NewValue0(v.Pos, OpConst64, t) 25842 v0.AuxInt = c - d 25843 v.AddArg(v0) 25844 v.AddArg(x) 25845 return true 25846 } 25847 return false 25848 } 25849 func rewriteValuegeneric_OpSub64F_0(v *Value) bool { 25850 // match: (Sub64F (Const64F [c]) (Const64F [d])) 25851 // cond: 25852 // result: (Const64F [f2i(i2f(c) - i2f(d))]) 25853 for { 25854 _ = v.Args[1] 25855 v_0 := v.Args[0] 25856 if v_0.Op != OpConst64F { 25857 break 25858 } 25859 c := v_0.AuxInt 25860 v_1 := v.Args[1] 25861 if v_1.Op != OpConst64F { 25862 break 25863 } 25864 d := v_1.AuxInt 25865 v.reset(OpConst64F) 25866 v.AuxInt = f2i(i2f(c) - i2f(d)) 25867 return true 25868 } 25869 // match: (Sub64F x (Const64F [0])) 25870 // cond: 25871 // result: x 25872 for { 25873 _ = v.Args[1] 25874 x := v.Args[0] 25875 v_1 := v.Args[1] 25876 if v_1.Op != OpConst64F { 25877 break 25878 } 25879 if v_1.AuxInt != 0 { 25880 break 25881 } 25882 v.reset(OpCopy) 25883 v.Type = x.Type 25884 v.AddArg(x) 25885 return true 25886 } 25887 return false 25888 } 25889 func rewriteValuegeneric_OpSub8_0(v *Value) bool { 25890 b := v.Block 25891 _ = b 25892 // match: (Sub8 (Const8 [c]) (Const8 [d])) 25893 // cond: 25894 // result: (Const8 [int64(int8(c-d))]) 25895 for { 25896 _ = v.Args[1] 25897 v_0 := v.Args[0] 25898 if v_0.Op != OpConst8 { 25899 break 25900 } 25901 c := v_0.AuxInt 25902 v_1 := v.Args[1] 25903 if v_1.Op != OpConst8 { 25904 break 25905 } 25906 d := v_1.AuxInt 25907 v.reset(OpConst8) 25908 v.AuxInt = int64(int8(c - d)) 25909 return true 25910 } 25911 // match: (Sub8 x (Const8 <t> [c])) 25912 // cond: x.Op != OpConst8 25913 // result: (Add8 (Const8 <t> [int64(int8(-c))]) x) 25914 for { 25915 _ = v.Args[1] 25916 x := v.Args[0] 25917 v_1 := v.Args[1] 25918 if v_1.Op != OpConst8 { 25919 break 25920 } 25921 t := v_1.Type 25922 c := v_1.AuxInt 25923 if !(x.Op != OpConst8) { 25924 break 25925 } 25926 v.reset(OpAdd8) 25927 v0 := b.NewValue0(v.Pos, OpConst8, t) 25928 v0.AuxInt = int64(int8(-c)) 25929 v.AddArg(v0) 25930 v.AddArg(x) 25931 return true 25932 } 25933 // match: (Sub8 <t> (Mul8 x y) (Mul8 x z)) 25934 // cond: 25935 // result: (Mul8 x (Sub8 <t> y z)) 25936 for { 25937 t := v.Type 25938 _ = v.Args[1] 25939 v_0 := v.Args[0] 25940 if v_0.Op != OpMul8 { 25941 break 25942 } 25943 _ = v_0.Args[1] 25944 x := v_0.Args[0] 25945 y := v_0.Args[1] 25946 v_1 := v.Args[1] 25947 if v_1.Op != OpMul8 { 25948 break 25949 } 25950 _ = v_1.Args[1] 25951 if x != v_1.Args[0] { 25952 break 25953 } 25954 z := v_1.Args[1] 25955 v.reset(OpMul8) 25956 v.AddArg(x) 25957 v0 := b.NewValue0(v.Pos, OpSub8, t) 25958 v0.AddArg(y) 25959 v0.AddArg(z) 25960 v.AddArg(v0) 25961 return true 25962 } 25963 // match: (Sub8 <t> (Mul8 y x) (Mul8 x z)) 25964 // cond: 25965 // result: (Mul8 x (Sub8 <t> y z)) 25966 for { 25967 t := v.Type 25968 _ = v.Args[1] 25969 v_0 := v.Args[0] 25970 if v_0.Op != OpMul8 { 25971 break 25972 } 25973 _ = v_0.Args[1] 25974 y := v_0.Args[0] 25975 x := v_0.Args[1] 25976 v_1 := v.Args[1] 25977 if v_1.Op != OpMul8 { 25978 break 25979 } 25980 _ = v_1.Args[1] 25981 if x != v_1.Args[0] { 25982 break 25983 } 25984 z := v_1.Args[1] 25985 v.reset(OpMul8) 25986 v.AddArg(x) 25987 v0 := b.NewValue0(v.Pos, OpSub8, t) 25988 v0.AddArg(y) 25989 v0.AddArg(z) 25990 v.AddArg(v0) 25991 return true 25992 } 25993 // match: (Sub8 <t> (Mul8 x y) (Mul8 z x)) 25994 // cond: 25995 // result: (Mul8 x (Sub8 <t> y z)) 25996 for { 25997 t := v.Type 25998 _ = v.Args[1] 25999 v_0 := v.Args[0] 26000 if v_0.Op != OpMul8 { 26001 break 26002 } 26003 _ = v_0.Args[1] 26004 x := v_0.Args[0] 26005 y := v_0.Args[1] 26006 v_1 := v.Args[1] 26007 if v_1.Op != OpMul8 { 26008 break 26009 } 26010 _ = v_1.Args[1] 26011 z := v_1.Args[0] 26012 if x != v_1.Args[1] { 26013 break 26014 } 26015 v.reset(OpMul8) 26016 v.AddArg(x) 26017 v0 := b.NewValue0(v.Pos, OpSub8, t) 26018 v0.AddArg(y) 26019 v0.AddArg(z) 26020 v.AddArg(v0) 26021 return true 26022 } 26023 // match: (Sub8 <t> (Mul8 y x) (Mul8 z x)) 26024 // cond: 26025 // result: (Mul8 x (Sub8 <t> y z)) 26026 for { 26027 t := v.Type 26028 _ = v.Args[1] 26029 v_0 := v.Args[0] 26030 if v_0.Op != OpMul8 { 26031 break 26032 } 26033 _ = v_0.Args[1] 26034 y := v_0.Args[0] 26035 x := v_0.Args[1] 26036 v_1 := v.Args[1] 26037 if v_1.Op != OpMul8 { 26038 break 26039 } 26040 _ = v_1.Args[1] 26041 z := v_1.Args[0] 26042 if x != v_1.Args[1] { 26043 break 26044 } 26045 v.reset(OpMul8) 26046 v.AddArg(x) 26047 v0 := b.NewValue0(v.Pos, OpSub8, t) 26048 v0.AddArg(y) 26049 v0.AddArg(z) 26050 v.AddArg(v0) 26051 return true 26052 } 26053 // match: (Sub8 x x) 26054 // cond: 26055 // result: (Const8 [0]) 26056 for { 26057 _ = v.Args[1] 26058 x := v.Args[0] 26059 if x != v.Args[1] { 26060 break 26061 } 26062 v.reset(OpConst8) 26063 v.AuxInt = 0 26064 return true 26065 } 26066 // match: (Sub8 (Add8 x y) x) 26067 // cond: 26068 // result: y 26069 for { 26070 _ = v.Args[1] 26071 v_0 := v.Args[0] 26072 if v_0.Op != OpAdd8 { 26073 break 26074 } 26075 _ = v_0.Args[1] 26076 x := v_0.Args[0] 26077 y := v_0.Args[1] 26078 if x != v.Args[1] { 26079 break 26080 } 26081 v.reset(OpCopy) 26082 v.Type = y.Type 26083 v.AddArg(y) 26084 return true 26085 } 26086 // match: (Sub8 (Add8 y x) x) 26087 // cond: 26088 // result: y 26089 for { 26090 _ = v.Args[1] 26091 v_0 := v.Args[0] 26092 if v_0.Op != OpAdd8 { 26093 break 26094 } 26095 _ = v_0.Args[1] 26096 y := v_0.Args[0] 26097 x := v_0.Args[1] 26098 if x != v.Args[1] { 26099 break 26100 } 26101 v.reset(OpCopy) 26102 v.Type = y.Type 26103 v.AddArg(y) 26104 return true 26105 } 26106 // match: (Sub8 (Add8 x y) y) 26107 // cond: 26108 // result: x 26109 for { 26110 _ = v.Args[1] 26111 v_0 := v.Args[0] 26112 if v_0.Op != OpAdd8 { 26113 break 26114 } 26115 _ = v_0.Args[1] 26116 x := v_0.Args[0] 26117 y := v_0.Args[1] 26118 if y != v.Args[1] { 26119 break 26120 } 26121 v.reset(OpCopy) 26122 v.Type = x.Type 26123 v.AddArg(x) 26124 return true 26125 } 26126 return false 26127 } 26128 func rewriteValuegeneric_OpSub8_10(v *Value) bool { 26129 b := v.Block 26130 _ = b 26131 // match: (Sub8 (Add8 y x) y) 26132 // cond: 26133 // result: x 26134 for { 26135 _ = v.Args[1] 26136 v_0 := v.Args[0] 26137 if v_0.Op != OpAdd8 { 26138 break 26139 } 26140 _ = v_0.Args[1] 26141 y := v_0.Args[0] 26142 x := v_0.Args[1] 26143 if y != v.Args[1] { 26144 break 26145 } 26146 v.reset(OpCopy) 26147 v.Type = x.Type 26148 v.AddArg(x) 26149 return true 26150 } 26151 // match: (Sub8 x (Sub8 i:(Const8 <t>) z)) 26152 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 26153 // result: (Sub8 (Add8 <t> x z) i) 26154 for { 26155 _ = v.Args[1] 26156 x := v.Args[0] 26157 v_1 := v.Args[1] 26158 if v_1.Op != OpSub8 { 26159 break 26160 } 26161 _ = v_1.Args[1] 26162 i := v_1.Args[0] 26163 if i.Op != OpConst8 { 26164 break 26165 } 26166 t := i.Type 26167 z := v_1.Args[1] 26168 if !(z.Op != OpConst8 && x.Op != OpConst8) { 26169 break 26170 } 26171 v.reset(OpSub8) 26172 v0 := b.NewValue0(v.Pos, OpAdd8, t) 26173 v0.AddArg(x) 26174 v0.AddArg(z) 26175 v.AddArg(v0) 26176 v.AddArg(i) 26177 return true 26178 } 26179 // match: (Sub8 x (Sub8 z i:(Const8 <t>))) 26180 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 26181 // result: (Add8 i (Sub8 <t> x z)) 26182 for { 26183 _ = v.Args[1] 26184 x := v.Args[0] 26185 v_1 := v.Args[1] 26186 if v_1.Op != OpSub8 { 26187 break 26188 } 26189 _ = v_1.Args[1] 26190 z := v_1.Args[0] 26191 i := v_1.Args[1] 26192 if i.Op != OpConst8 { 26193 break 26194 } 26195 t := i.Type 26196 if !(z.Op != OpConst8 && x.Op != OpConst8) { 26197 break 26198 } 26199 v.reset(OpAdd8) 26200 v.AddArg(i) 26201 v0 := b.NewValue0(v.Pos, OpSub8, t) 26202 v0.AddArg(x) 26203 v0.AddArg(z) 26204 v.AddArg(v0) 26205 return true 26206 } 26207 // match: (Sub8 (Const8 <t> [c]) (Sub8 x (Const8 <t> [d]))) 26208 // cond: 26209 // result: (Sub8 (Const8 <t> [int64(int8(c+d))]) x) 26210 for { 26211 _ = v.Args[1] 26212 v_0 := v.Args[0] 26213 if v_0.Op != OpConst8 { 26214 break 26215 } 26216 t := v_0.Type 26217 c := v_0.AuxInt 26218 v_1 := v.Args[1] 26219 if v_1.Op != OpSub8 { 26220 break 26221 } 26222 _ = v_1.Args[1] 26223 x := v_1.Args[0] 26224 v_1_1 := v_1.Args[1] 26225 if v_1_1.Op != OpConst8 { 26226 break 26227 } 26228 if v_1_1.Type != t { 26229 break 26230 } 26231 d := v_1_1.AuxInt 26232 v.reset(OpSub8) 26233 v0 := b.NewValue0(v.Pos, OpConst8, t) 26234 v0.AuxInt = int64(int8(c + d)) 26235 v.AddArg(v0) 26236 v.AddArg(x) 26237 return true 26238 } 26239 // match: (Sub8 (Const8 <t> [c]) (Sub8 (Const8 <t> [d]) x)) 26240 // cond: 26241 // result: (Add8 (Const8 <t> [int64(int8(c-d))]) x) 26242 for { 26243 _ = v.Args[1] 26244 v_0 := v.Args[0] 26245 if v_0.Op != OpConst8 { 26246 break 26247 } 26248 t := v_0.Type 26249 c := v_0.AuxInt 26250 v_1 := v.Args[1] 26251 if v_1.Op != OpSub8 { 26252 break 26253 } 26254 _ = v_1.Args[1] 26255 v_1_0 := v_1.Args[0] 26256 if v_1_0.Op != OpConst8 { 26257 break 26258 } 26259 if v_1_0.Type != t { 26260 break 26261 } 26262 d := v_1_0.AuxInt 26263 x := v_1.Args[1] 26264 v.reset(OpAdd8) 26265 v0 := b.NewValue0(v.Pos, OpConst8, t) 26266 v0.AuxInt = int64(int8(c - d)) 26267 v.AddArg(v0) 26268 v.AddArg(x) 26269 return true 26270 } 26271 return false 26272 } 26273 func rewriteValuegeneric_OpTrunc16to8_0(v *Value) bool { 26274 // match: (Trunc16to8 (Const16 [c])) 26275 // cond: 26276 // result: (Const8 [int64(int8(c))]) 26277 for { 26278 v_0 := v.Args[0] 26279 if v_0.Op != OpConst16 { 26280 break 26281 } 26282 c := v_0.AuxInt 26283 v.reset(OpConst8) 26284 v.AuxInt = int64(int8(c)) 26285 return true 26286 } 26287 // match: (Trunc16to8 (ZeroExt8to16 x)) 26288 // cond: 26289 // result: x 26290 for { 26291 v_0 := v.Args[0] 26292 if v_0.Op != OpZeroExt8to16 { 26293 break 26294 } 26295 x := v_0.Args[0] 26296 v.reset(OpCopy) 26297 v.Type = x.Type 26298 v.AddArg(x) 26299 return true 26300 } 26301 // match: (Trunc16to8 (SignExt8to16 x)) 26302 // cond: 26303 // result: x 26304 for { 26305 v_0 := v.Args[0] 26306 if v_0.Op != OpSignExt8to16 { 26307 break 26308 } 26309 x := v_0.Args[0] 26310 v.reset(OpCopy) 26311 v.Type = x.Type 26312 v.AddArg(x) 26313 return true 26314 } 26315 // match: (Trunc16to8 (And16 (Const16 [y]) x)) 26316 // cond: y&0xFF == 0xFF 26317 // result: (Trunc16to8 x) 26318 for { 26319 v_0 := v.Args[0] 26320 if v_0.Op != OpAnd16 { 26321 break 26322 } 26323 _ = v_0.Args[1] 26324 v_0_0 := v_0.Args[0] 26325 if v_0_0.Op != OpConst16 { 26326 break 26327 } 26328 y := v_0_0.AuxInt 26329 x := v_0.Args[1] 26330 if !(y&0xFF == 0xFF) { 26331 break 26332 } 26333 v.reset(OpTrunc16to8) 26334 v.AddArg(x) 26335 return true 26336 } 26337 // match: (Trunc16to8 (And16 x (Const16 [y]))) 26338 // cond: y&0xFF == 0xFF 26339 // result: (Trunc16to8 x) 26340 for { 26341 v_0 := v.Args[0] 26342 if v_0.Op != OpAnd16 { 26343 break 26344 } 26345 _ = v_0.Args[1] 26346 x := v_0.Args[0] 26347 v_0_1 := v_0.Args[1] 26348 if v_0_1.Op != OpConst16 { 26349 break 26350 } 26351 y := v_0_1.AuxInt 26352 if !(y&0xFF == 0xFF) { 26353 break 26354 } 26355 v.reset(OpTrunc16to8) 26356 v.AddArg(x) 26357 return true 26358 } 26359 return false 26360 } 26361 func rewriteValuegeneric_OpTrunc32to16_0(v *Value) bool { 26362 // match: (Trunc32to16 (Const32 [c])) 26363 // cond: 26364 // result: (Const16 [int64(int16(c))]) 26365 for { 26366 v_0 := v.Args[0] 26367 if v_0.Op != OpConst32 { 26368 break 26369 } 26370 c := v_0.AuxInt 26371 v.reset(OpConst16) 26372 v.AuxInt = int64(int16(c)) 26373 return true 26374 } 26375 // match: (Trunc32to16 (ZeroExt8to32 x)) 26376 // cond: 26377 // result: (ZeroExt8to16 x) 26378 for { 26379 v_0 := v.Args[0] 26380 if v_0.Op != OpZeroExt8to32 { 26381 break 26382 } 26383 x := v_0.Args[0] 26384 v.reset(OpZeroExt8to16) 26385 v.AddArg(x) 26386 return true 26387 } 26388 // match: (Trunc32to16 (ZeroExt16to32 x)) 26389 // cond: 26390 // result: x 26391 for { 26392 v_0 := v.Args[0] 26393 if v_0.Op != OpZeroExt16to32 { 26394 break 26395 } 26396 x := v_0.Args[0] 26397 v.reset(OpCopy) 26398 v.Type = x.Type 26399 v.AddArg(x) 26400 return true 26401 } 26402 // match: (Trunc32to16 (SignExt8to32 x)) 26403 // cond: 26404 // result: (SignExt8to16 x) 26405 for { 26406 v_0 := v.Args[0] 26407 if v_0.Op != OpSignExt8to32 { 26408 break 26409 } 26410 x := v_0.Args[0] 26411 v.reset(OpSignExt8to16) 26412 v.AddArg(x) 26413 return true 26414 } 26415 // match: (Trunc32to16 (SignExt16to32 x)) 26416 // cond: 26417 // result: x 26418 for { 26419 v_0 := v.Args[0] 26420 if v_0.Op != OpSignExt16to32 { 26421 break 26422 } 26423 x := v_0.Args[0] 26424 v.reset(OpCopy) 26425 v.Type = x.Type 26426 v.AddArg(x) 26427 return true 26428 } 26429 // match: (Trunc32to16 (And32 (Const32 [y]) x)) 26430 // cond: y&0xFFFF == 0xFFFF 26431 // result: (Trunc32to16 x) 26432 for { 26433 v_0 := v.Args[0] 26434 if v_0.Op != OpAnd32 { 26435 break 26436 } 26437 _ = v_0.Args[1] 26438 v_0_0 := v_0.Args[0] 26439 if v_0_0.Op != OpConst32 { 26440 break 26441 } 26442 y := v_0_0.AuxInt 26443 x := v_0.Args[1] 26444 if !(y&0xFFFF == 0xFFFF) { 26445 break 26446 } 26447 v.reset(OpTrunc32to16) 26448 v.AddArg(x) 26449 return true 26450 } 26451 // match: (Trunc32to16 (And32 x (Const32 [y]))) 26452 // cond: y&0xFFFF == 0xFFFF 26453 // result: (Trunc32to16 x) 26454 for { 26455 v_0 := v.Args[0] 26456 if v_0.Op != OpAnd32 { 26457 break 26458 } 26459 _ = v_0.Args[1] 26460 x := v_0.Args[0] 26461 v_0_1 := v_0.Args[1] 26462 if v_0_1.Op != OpConst32 { 26463 break 26464 } 26465 y := v_0_1.AuxInt 26466 if !(y&0xFFFF == 0xFFFF) { 26467 break 26468 } 26469 v.reset(OpTrunc32to16) 26470 v.AddArg(x) 26471 return true 26472 } 26473 return false 26474 } 26475 func rewriteValuegeneric_OpTrunc32to8_0(v *Value) bool { 26476 // match: (Trunc32to8 (Const32 [c])) 26477 // cond: 26478 // result: (Const8 [int64(int8(c))]) 26479 for { 26480 v_0 := v.Args[0] 26481 if v_0.Op != OpConst32 { 26482 break 26483 } 26484 c := v_0.AuxInt 26485 v.reset(OpConst8) 26486 v.AuxInt = int64(int8(c)) 26487 return true 26488 } 26489 // match: (Trunc32to8 (ZeroExt8to32 x)) 26490 // cond: 26491 // result: x 26492 for { 26493 v_0 := v.Args[0] 26494 if v_0.Op != OpZeroExt8to32 { 26495 break 26496 } 26497 x := v_0.Args[0] 26498 v.reset(OpCopy) 26499 v.Type = x.Type 26500 v.AddArg(x) 26501 return true 26502 } 26503 // match: (Trunc32to8 (SignExt8to32 x)) 26504 // cond: 26505 // result: x 26506 for { 26507 v_0 := v.Args[0] 26508 if v_0.Op != OpSignExt8to32 { 26509 break 26510 } 26511 x := v_0.Args[0] 26512 v.reset(OpCopy) 26513 v.Type = x.Type 26514 v.AddArg(x) 26515 return true 26516 } 26517 // match: (Trunc32to8 (And32 (Const32 [y]) x)) 26518 // cond: y&0xFF == 0xFF 26519 // result: (Trunc32to8 x) 26520 for { 26521 v_0 := v.Args[0] 26522 if v_0.Op != OpAnd32 { 26523 break 26524 } 26525 _ = v_0.Args[1] 26526 v_0_0 := v_0.Args[0] 26527 if v_0_0.Op != OpConst32 { 26528 break 26529 } 26530 y := v_0_0.AuxInt 26531 x := v_0.Args[1] 26532 if !(y&0xFF == 0xFF) { 26533 break 26534 } 26535 v.reset(OpTrunc32to8) 26536 v.AddArg(x) 26537 return true 26538 } 26539 // match: (Trunc32to8 (And32 x (Const32 [y]))) 26540 // cond: y&0xFF == 0xFF 26541 // result: (Trunc32to8 x) 26542 for { 26543 v_0 := v.Args[0] 26544 if v_0.Op != OpAnd32 { 26545 break 26546 } 26547 _ = v_0.Args[1] 26548 x := v_0.Args[0] 26549 v_0_1 := v_0.Args[1] 26550 if v_0_1.Op != OpConst32 { 26551 break 26552 } 26553 y := v_0_1.AuxInt 26554 if !(y&0xFF == 0xFF) { 26555 break 26556 } 26557 v.reset(OpTrunc32to8) 26558 v.AddArg(x) 26559 return true 26560 } 26561 return false 26562 } 26563 func rewriteValuegeneric_OpTrunc64to16_0(v *Value) bool { 26564 // match: (Trunc64to16 (Const64 [c])) 26565 // cond: 26566 // result: (Const16 [int64(int16(c))]) 26567 for { 26568 v_0 := v.Args[0] 26569 if v_0.Op != OpConst64 { 26570 break 26571 } 26572 c := v_0.AuxInt 26573 v.reset(OpConst16) 26574 v.AuxInt = int64(int16(c)) 26575 return true 26576 } 26577 // match: (Trunc64to16 (ZeroExt8to64 x)) 26578 // cond: 26579 // result: (ZeroExt8to16 x) 26580 for { 26581 v_0 := v.Args[0] 26582 if v_0.Op != OpZeroExt8to64 { 26583 break 26584 } 26585 x := v_0.Args[0] 26586 v.reset(OpZeroExt8to16) 26587 v.AddArg(x) 26588 return true 26589 } 26590 // match: (Trunc64to16 (ZeroExt16to64 x)) 26591 // cond: 26592 // result: x 26593 for { 26594 v_0 := v.Args[0] 26595 if v_0.Op != OpZeroExt16to64 { 26596 break 26597 } 26598 x := v_0.Args[0] 26599 v.reset(OpCopy) 26600 v.Type = x.Type 26601 v.AddArg(x) 26602 return true 26603 } 26604 // match: (Trunc64to16 (SignExt8to64 x)) 26605 // cond: 26606 // result: (SignExt8to16 x) 26607 for { 26608 v_0 := v.Args[0] 26609 if v_0.Op != OpSignExt8to64 { 26610 break 26611 } 26612 x := v_0.Args[0] 26613 v.reset(OpSignExt8to16) 26614 v.AddArg(x) 26615 return true 26616 } 26617 // match: (Trunc64to16 (SignExt16to64 x)) 26618 // cond: 26619 // result: x 26620 for { 26621 v_0 := v.Args[0] 26622 if v_0.Op != OpSignExt16to64 { 26623 break 26624 } 26625 x := v_0.Args[0] 26626 v.reset(OpCopy) 26627 v.Type = x.Type 26628 v.AddArg(x) 26629 return true 26630 } 26631 // match: (Trunc64to16 (And64 (Const64 [y]) x)) 26632 // cond: y&0xFFFF == 0xFFFF 26633 // result: (Trunc64to16 x) 26634 for { 26635 v_0 := v.Args[0] 26636 if v_0.Op != OpAnd64 { 26637 break 26638 } 26639 _ = v_0.Args[1] 26640 v_0_0 := v_0.Args[0] 26641 if v_0_0.Op != OpConst64 { 26642 break 26643 } 26644 y := v_0_0.AuxInt 26645 x := v_0.Args[1] 26646 if !(y&0xFFFF == 0xFFFF) { 26647 break 26648 } 26649 v.reset(OpTrunc64to16) 26650 v.AddArg(x) 26651 return true 26652 } 26653 // match: (Trunc64to16 (And64 x (Const64 [y]))) 26654 // cond: y&0xFFFF == 0xFFFF 26655 // result: (Trunc64to16 x) 26656 for { 26657 v_0 := v.Args[0] 26658 if v_0.Op != OpAnd64 { 26659 break 26660 } 26661 _ = v_0.Args[1] 26662 x := v_0.Args[0] 26663 v_0_1 := v_0.Args[1] 26664 if v_0_1.Op != OpConst64 { 26665 break 26666 } 26667 y := v_0_1.AuxInt 26668 if !(y&0xFFFF == 0xFFFF) { 26669 break 26670 } 26671 v.reset(OpTrunc64to16) 26672 v.AddArg(x) 26673 return true 26674 } 26675 return false 26676 } 26677 func rewriteValuegeneric_OpTrunc64to32_0(v *Value) bool { 26678 // match: (Trunc64to32 (Const64 [c])) 26679 // cond: 26680 // result: (Const32 [int64(int32(c))]) 26681 for { 26682 v_0 := v.Args[0] 26683 if v_0.Op != OpConst64 { 26684 break 26685 } 26686 c := v_0.AuxInt 26687 v.reset(OpConst32) 26688 v.AuxInt = int64(int32(c)) 26689 return true 26690 } 26691 // match: (Trunc64to32 (ZeroExt8to64 x)) 26692 // cond: 26693 // result: (ZeroExt8to32 x) 26694 for { 26695 v_0 := v.Args[0] 26696 if v_0.Op != OpZeroExt8to64 { 26697 break 26698 } 26699 x := v_0.Args[0] 26700 v.reset(OpZeroExt8to32) 26701 v.AddArg(x) 26702 return true 26703 } 26704 // match: (Trunc64to32 (ZeroExt16to64 x)) 26705 // cond: 26706 // result: (ZeroExt16to32 x) 26707 for { 26708 v_0 := v.Args[0] 26709 if v_0.Op != OpZeroExt16to64 { 26710 break 26711 } 26712 x := v_0.Args[0] 26713 v.reset(OpZeroExt16to32) 26714 v.AddArg(x) 26715 return true 26716 } 26717 // match: (Trunc64to32 (ZeroExt32to64 x)) 26718 // cond: 26719 // result: x 26720 for { 26721 v_0 := v.Args[0] 26722 if v_0.Op != OpZeroExt32to64 { 26723 break 26724 } 26725 x := v_0.Args[0] 26726 v.reset(OpCopy) 26727 v.Type = x.Type 26728 v.AddArg(x) 26729 return true 26730 } 26731 // match: (Trunc64to32 (SignExt8to64 x)) 26732 // cond: 26733 // result: (SignExt8to32 x) 26734 for { 26735 v_0 := v.Args[0] 26736 if v_0.Op != OpSignExt8to64 { 26737 break 26738 } 26739 x := v_0.Args[0] 26740 v.reset(OpSignExt8to32) 26741 v.AddArg(x) 26742 return true 26743 } 26744 // match: (Trunc64to32 (SignExt16to64 x)) 26745 // cond: 26746 // result: (SignExt16to32 x) 26747 for { 26748 v_0 := v.Args[0] 26749 if v_0.Op != OpSignExt16to64 { 26750 break 26751 } 26752 x := v_0.Args[0] 26753 v.reset(OpSignExt16to32) 26754 v.AddArg(x) 26755 return true 26756 } 26757 // match: (Trunc64to32 (SignExt32to64 x)) 26758 // cond: 26759 // result: x 26760 for { 26761 v_0 := v.Args[0] 26762 if v_0.Op != OpSignExt32to64 { 26763 break 26764 } 26765 x := v_0.Args[0] 26766 v.reset(OpCopy) 26767 v.Type = x.Type 26768 v.AddArg(x) 26769 return true 26770 } 26771 // match: (Trunc64to32 (And64 (Const64 [y]) x)) 26772 // cond: y&0xFFFFFFFF == 0xFFFFFFFF 26773 // result: (Trunc64to32 x) 26774 for { 26775 v_0 := v.Args[0] 26776 if v_0.Op != OpAnd64 { 26777 break 26778 } 26779 _ = v_0.Args[1] 26780 v_0_0 := v_0.Args[0] 26781 if v_0_0.Op != OpConst64 { 26782 break 26783 } 26784 y := v_0_0.AuxInt 26785 x := v_0.Args[1] 26786 if !(y&0xFFFFFFFF == 0xFFFFFFFF) { 26787 break 26788 } 26789 v.reset(OpTrunc64to32) 26790 v.AddArg(x) 26791 return true 26792 } 26793 // match: (Trunc64to32 (And64 x (Const64 [y]))) 26794 // cond: y&0xFFFFFFFF == 0xFFFFFFFF 26795 // result: (Trunc64to32 x) 26796 for { 26797 v_0 := v.Args[0] 26798 if v_0.Op != OpAnd64 { 26799 break 26800 } 26801 _ = v_0.Args[1] 26802 x := v_0.Args[0] 26803 v_0_1 := v_0.Args[1] 26804 if v_0_1.Op != OpConst64 { 26805 break 26806 } 26807 y := v_0_1.AuxInt 26808 if !(y&0xFFFFFFFF == 0xFFFFFFFF) { 26809 break 26810 } 26811 v.reset(OpTrunc64to32) 26812 v.AddArg(x) 26813 return true 26814 } 26815 return false 26816 } 26817 func rewriteValuegeneric_OpTrunc64to8_0(v *Value) bool { 26818 // match: (Trunc64to8 (Const64 [c])) 26819 // cond: 26820 // result: (Const8 [int64(int8(c))]) 26821 for { 26822 v_0 := v.Args[0] 26823 if v_0.Op != OpConst64 { 26824 break 26825 } 26826 c := v_0.AuxInt 26827 v.reset(OpConst8) 26828 v.AuxInt = int64(int8(c)) 26829 return true 26830 } 26831 // match: (Trunc64to8 (ZeroExt8to64 x)) 26832 // cond: 26833 // result: x 26834 for { 26835 v_0 := v.Args[0] 26836 if v_0.Op != OpZeroExt8to64 { 26837 break 26838 } 26839 x := v_0.Args[0] 26840 v.reset(OpCopy) 26841 v.Type = x.Type 26842 v.AddArg(x) 26843 return true 26844 } 26845 // match: (Trunc64to8 (SignExt8to64 x)) 26846 // cond: 26847 // result: x 26848 for { 26849 v_0 := v.Args[0] 26850 if v_0.Op != OpSignExt8to64 { 26851 break 26852 } 26853 x := v_0.Args[0] 26854 v.reset(OpCopy) 26855 v.Type = x.Type 26856 v.AddArg(x) 26857 return true 26858 } 26859 // match: (Trunc64to8 (And64 (Const64 [y]) x)) 26860 // cond: y&0xFF == 0xFF 26861 // result: (Trunc64to8 x) 26862 for { 26863 v_0 := v.Args[0] 26864 if v_0.Op != OpAnd64 { 26865 break 26866 } 26867 _ = v_0.Args[1] 26868 v_0_0 := v_0.Args[0] 26869 if v_0_0.Op != OpConst64 { 26870 break 26871 } 26872 y := v_0_0.AuxInt 26873 x := v_0.Args[1] 26874 if !(y&0xFF == 0xFF) { 26875 break 26876 } 26877 v.reset(OpTrunc64to8) 26878 v.AddArg(x) 26879 return true 26880 } 26881 // match: (Trunc64to8 (And64 x (Const64 [y]))) 26882 // cond: y&0xFF == 0xFF 26883 // result: (Trunc64to8 x) 26884 for { 26885 v_0 := v.Args[0] 26886 if v_0.Op != OpAnd64 { 26887 break 26888 } 26889 _ = v_0.Args[1] 26890 x := v_0.Args[0] 26891 v_0_1 := v_0.Args[1] 26892 if v_0_1.Op != OpConst64 { 26893 break 26894 } 26895 y := v_0_1.AuxInt 26896 if !(y&0xFF == 0xFF) { 26897 break 26898 } 26899 v.reset(OpTrunc64to8) 26900 v.AddArg(x) 26901 return true 26902 } 26903 return false 26904 } 26905 func rewriteValuegeneric_OpXor16_0(v *Value) bool { 26906 b := v.Block 26907 _ = b 26908 // match: (Xor16 (Const16 [c]) (Const16 [d])) 26909 // cond: 26910 // result: (Const16 [int64(int16(c^d))]) 26911 for { 26912 _ = v.Args[1] 26913 v_0 := v.Args[0] 26914 if v_0.Op != OpConst16 { 26915 break 26916 } 26917 c := v_0.AuxInt 26918 v_1 := v.Args[1] 26919 if v_1.Op != OpConst16 { 26920 break 26921 } 26922 d := v_1.AuxInt 26923 v.reset(OpConst16) 26924 v.AuxInt = int64(int16(c ^ d)) 26925 return true 26926 } 26927 // match: (Xor16 (Const16 [d]) (Const16 [c])) 26928 // cond: 26929 // result: (Const16 [int64(int16(c^d))]) 26930 for { 26931 _ = v.Args[1] 26932 v_0 := v.Args[0] 26933 if v_0.Op != OpConst16 { 26934 break 26935 } 26936 d := v_0.AuxInt 26937 v_1 := v.Args[1] 26938 if v_1.Op != OpConst16 { 26939 break 26940 } 26941 c := v_1.AuxInt 26942 v.reset(OpConst16) 26943 v.AuxInt = int64(int16(c ^ d)) 26944 return true 26945 } 26946 // match: (Xor16 x x) 26947 // cond: 26948 // result: (Const16 [0]) 26949 for { 26950 _ = v.Args[1] 26951 x := v.Args[0] 26952 if x != v.Args[1] { 26953 break 26954 } 26955 v.reset(OpConst16) 26956 v.AuxInt = 0 26957 return true 26958 } 26959 // match: (Xor16 (Const16 [0]) x) 26960 // cond: 26961 // result: x 26962 for { 26963 _ = v.Args[1] 26964 v_0 := v.Args[0] 26965 if v_0.Op != OpConst16 { 26966 break 26967 } 26968 if v_0.AuxInt != 0 { 26969 break 26970 } 26971 x := v.Args[1] 26972 v.reset(OpCopy) 26973 v.Type = x.Type 26974 v.AddArg(x) 26975 return true 26976 } 26977 // match: (Xor16 x (Const16 [0])) 26978 // cond: 26979 // result: x 26980 for { 26981 _ = v.Args[1] 26982 x := v.Args[0] 26983 v_1 := v.Args[1] 26984 if v_1.Op != OpConst16 { 26985 break 26986 } 26987 if v_1.AuxInt != 0 { 26988 break 26989 } 26990 v.reset(OpCopy) 26991 v.Type = x.Type 26992 v.AddArg(x) 26993 return true 26994 } 26995 // match: (Xor16 x (Xor16 x y)) 26996 // cond: 26997 // result: y 26998 for { 26999 _ = v.Args[1] 27000 x := v.Args[0] 27001 v_1 := v.Args[1] 27002 if v_1.Op != OpXor16 { 27003 break 27004 } 27005 _ = v_1.Args[1] 27006 if x != v_1.Args[0] { 27007 break 27008 } 27009 y := v_1.Args[1] 27010 v.reset(OpCopy) 27011 v.Type = y.Type 27012 v.AddArg(y) 27013 return true 27014 } 27015 // match: (Xor16 x (Xor16 y x)) 27016 // cond: 27017 // result: y 27018 for { 27019 _ = v.Args[1] 27020 x := v.Args[0] 27021 v_1 := v.Args[1] 27022 if v_1.Op != OpXor16 { 27023 break 27024 } 27025 _ = v_1.Args[1] 27026 y := v_1.Args[0] 27027 if x != v_1.Args[1] { 27028 break 27029 } 27030 v.reset(OpCopy) 27031 v.Type = y.Type 27032 v.AddArg(y) 27033 return true 27034 } 27035 // match: (Xor16 (Xor16 x y) x) 27036 // cond: 27037 // result: y 27038 for { 27039 _ = v.Args[1] 27040 v_0 := v.Args[0] 27041 if v_0.Op != OpXor16 { 27042 break 27043 } 27044 _ = v_0.Args[1] 27045 x := v_0.Args[0] 27046 y := v_0.Args[1] 27047 if x != v.Args[1] { 27048 break 27049 } 27050 v.reset(OpCopy) 27051 v.Type = y.Type 27052 v.AddArg(y) 27053 return true 27054 } 27055 // match: (Xor16 (Xor16 y x) x) 27056 // cond: 27057 // result: y 27058 for { 27059 _ = v.Args[1] 27060 v_0 := v.Args[0] 27061 if v_0.Op != OpXor16 { 27062 break 27063 } 27064 _ = v_0.Args[1] 27065 y := v_0.Args[0] 27066 x := v_0.Args[1] 27067 if x != v.Args[1] { 27068 break 27069 } 27070 v.reset(OpCopy) 27071 v.Type = y.Type 27072 v.AddArg(y) 27073 return true 27074 } 27075 // match: (Xor16 (Xor16 i:(Const16 <t>) z) x) 27076 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 27077 // result: (Xor16 i (Xor16 <t> z x)) 27078 for { 27079 _ = v.Args[1] 27080 v_0 := v.Args[0] 27081 if v_0.Op != OpXor16 { 27082 break 27083 } 27084 _ = v_0.Args[1] 27085 i := v_0.Args[0] 27086 if i.Op != OpConst16 { 27087 break 27088 } 27089 t := i.Type 27090 z := v_0.Args[1] 27091 x := v.Args[1] 27092 if !(z.Op != OpConst16 && x.Op != OpConst16) { 27093 break 27094 } 27095 v.reset(OpXor16) 27096 v.AddArg(i) 27097 v0 := b.NewValue0(v.Pos, OpXor16, t) 27098 v0.AddArg(z) 27099 v0.AddArg(x) 27100 v.AddArg(v0) 27101 return true 27102 } 27103 return false 27104 } 27105 func rewriteValuegeneric_OpXor16_10(v *Value) bool { 27106 b := v.Block 27107 _ = b 27108 // match: (Xor16 (Xor16 z i:(Const16 <t>)) x) 27109 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 27110 // result: (Xor16 i (Xor16 <t> z x)) 27111 for { 27112 _ = v.Args[1] 27113 v_0 := v.Args[0] 27114 if v_0.Op != OpXor16 { 27115 break 27116 } 27117 _ = v_0.Args[1] 27118 z := v_0.Args[0] 27119 i := v_0.Args[1] 27120 if i.Op != OpConst16 { 27121 break 27122 } 27123 t := i.Type 27124 x := v.Args[1] 27125 if !(z.Op != OpConst16 && x.Op != OpConst16) { 27126 break 27127 } 27128 v.reset(OpXor16) 27129 v.AddArg(i) 27130 v0 := b.NewValue0(v.Pos, OpXor16, t) 27131 v0.AddArg(z) 27132 v0.AddArg(x) 27133 v.AddArg(v0) 27134 return true 27135 } 27136 // match: (Xor16 x (Xor16 i:(Const16 <t>) z)) 27137 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 27138 // result: (Xor16 i (Xor16 <t> z x)) 27139 for { 27140 _ = v.Args[1] 27141 x := v.Args[0] 27142 v_1 := v.Args[1] 27143 if v_1.Op != OpXor16 { 27144 break 27145 } 27146 _ = v_1.Args[1] 27147 i := v_1.Args[0] 27148 if i.Op != OpConst16 { 27149 break 27150 } 27151 t := i.Type 27152 z := v_1.Args[1] 27153 if !(z.Op != OpConst16 && x.Op != OpConst16) { 27154 break 27155 } 27156 v.reset(OpXor16) 27157 v.AddArg(i) 27158 v0 := b.NewValue0(v.Pos, OpXor16, t) 27159 v0.AddArg(z) 27160 v0.AddArg(x) 27161 v.AddArg(v0) 27162 return true 27163 } 27164 // match: (Xor16 x (Xor16 z i:(Const16 <t>))) 27165 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 27166 // result: (Xor16 i (Xor16 <t> z x)) 27167 for { 27168 _ = v.Args[1] 27169 x := v.Args[0] 27170 v_1 := v.Args[1] 27171 if v_1.Op != OpXor16 { 27172 break 27173 } 27174 _ = v_1.Args[1] 27175 z := v_1.Args[0] 27176 i := v_1.Args[1] 27177 if i.Op != OpConst16 { 27178 break 27179 } 27180 t := i.Type 27181 if !(z.Op != OpConst16 && x.Op != OpConst16) { 27182 break 27183 } 27184 v.reset(OpXor16) 27185 v.AddArg(i) 27186 v0 := b.NewValue0(v.Pos, OpXor16, t) 27187 v0.AddArg(z) 27188 v0.AddArg(x) 27189 v.AddArg(v0) 27190 return true 27191 } 27192 // match: (Xor16 (Const16 <t> [c]) (Xor16 (Const16 <t> [d]) x)) 27193 // cond: 27194 // result: (Xor16 (Const16 <t> [int64(int16(c^d))]) x) 27195 for { 27196 _ = v.Args[1] 27197 v_0 := v.Args[0] 27198 if v_0.Op != OpConst16 { 27199 break 27200 } 27201 t := v_0.Type 27202 c := v_0.AuxInt 27203 v_1 := v.Args[1] 27204 if v_1.Op != OpXor16 { 27205 break 27206 } 27207 _ = v_1.Args[1] 27208 v_1_0 := v_1.Args[0] 27209 if v_1_0.Op != OpConst16 { 27210 break 27211 } 27212 if v_1_0.Type != t { 27213 break 27214 } 27215 d := v_1_0.AuxInt 27216 x := v_1.Args[1] 27217 v.reset(OpXor16) 27218 v0 := b.NewValue0(v.Pos, OpConst16, t) 27219 v0.AuxInt = int64(int16(c ^ d)) 27220 v.AddArg(v0) 27221 v.AddArg(x) 27222 return true 27223 } 27224 // match: (Xor16 (Const16 <t> [c]) (Xor16 x (Const16 <t> [d]))) 27225 // cond: 27226 // result: (Xor16 (Const16 <t> [int64(int16(c^d))]) x) 27227 for { 27228 _ = v.Args[1] 27229 v_0 := v.Args[0] 27230 if v_0.Op != OpConst16 { 27231 break 27232 } 27233 t := v_0.Type 27234 c := v_0.AuxInt 27235 v_1 := v.Args[1] 27236 if v_1.Op != OpXor16 { 27237 break 27238 } 27239 _ = v_1.Args[1] 27240 x := v_1.Args[0] 27241 v_1_1 := v_1.Args[1] 27242 if v_1_1.Op != OpConst16 { 27243 break 27244 } 27245 if v_1_1.Type != t { 27246 break 27247 } 27248 d := v_1_1.AuxInt 27249 v.reset(OpXor16) 27250 v0 := b.NewValue0(v.Pos, OpConst16, t) 27251 v0.AuxInt = int64(int16(c ^ d)) 27252 v.AddArg(v0) 27253 v.AddArg(x) 27254 return true 27255 } 27256 // match: (Xor16 (Xor16 (Const16 <t> [d]) x) (Const16 <t> [c])) 27257 // cond: 27258 // result: (Xor16 (Const16 <t> [int64(int16(c^d))]) x) 27259 for { 27260 _ = v.Args[1] 27261 v_0 := v.Args[0] 27262 if v_0.Op != OpXor16 { 27263 break 27264 } 27265 _ = v_0.Args[1] 27266 v_0_0 := v_0.Args[0] 27267 if v_0_0.Op != OpConst16 { 27268 break 27269 } 27270 t := v_0_0.Type 27271 d := v_0_0.AuxInt 27272 x := v_0.Args[1] 27273 v_1 := v.Args[1] 27274 if v_1.Op != OpConst16 { 27275 break 27276 } 27277 if v_1.Type != t { 27278 break 27279 } 27280 c := v_1.AuxInt 27281 v.reset(OpXor16) 27282 v0 := b.NewValue0(v.Pos, OpConst16, t) 27283 v0.AuxInt = int64(int16(c ^ d)) 27284 v.AddArg(v0) 27285 v.AddArg(x) 27286 return true 27287 } 27288 // match: (Xor16 (Xor16 x (Const16 <t> [d])) (Const16 <t> [c])) 27289 // cond: 27290 // result: (Xor16 (Const16 <t> [int64(int16(c^d))]) x) 27291 for { 27292 _ = v.Args[1] 27293 v_0 := v.Args[0] 27294 if v_0.Op != OpXor16 { 27295 break 27296 } 27297 _ = v_0.Args[1] 27298 x := v_0.Args[0] 27299 v_0_1 := v_0.Args[1] 27300 if v_0_1.Op != OpConst16 { 27301 break 27302 } 27303 t := v_0_1.Type 27304 d := v_0_1.AuxInt 27305 v_1 := v.Args[1] 27306 if v_1.Op != OpConst16 { 27307 break 27308 } 27309 if v_1.Type != t { 27310 break 27311 } 27312 c := v_1.AuxInt 27313 v.reset(OpXor16) 27314 v0 := b.NewValue0(v.Pos, OpConst16, t) 27315 v0.AuxInt = int64(int16(c ^ d)) 27316 v.AddArg(v0) 27317 v.AddArg(x) 27318 return true 27319 } 27320 return false 27321 } 27322 func rewriteValuegeneric_OpXor32_0(v *Value) bool { 27323 b := v.Block 27324 _ = b 27325 // match: (Xor32 (Const32 [c]) (Const32 [d])) 27326 // cond: 27327 // result: (Const32 [int64(int32(c^d))]) 27328 for { 27329 _ = v.Args[1] 27330 v_0 := v.Args[0] 27331 if v_0.Op != OpConst32 { 27332 break 27333 } 27334 c := v_0.AuxInt 27335 v_1 := v.Args[1] 27336 if v_1.Op != OpConst32 { 27337 break 27338 } 27339 d := v_1.AuxInt 27340 v.reset(OpConst32) 27341 v.AuxInt = int64(int32(c ^ d)) 27342 return true 27343 } 27344 // match: (Xor32 (Const32 [d]) (Const32 [c])) 27345 // cond: 27346 // result: (Const32 [int64(int32(c^d))]) 27347 for { 27348 _ = v.Args[1] 27349 v_0 := v.Args[0] 27350 if v_0.Op != OpConst32 { 27351 break 27352 } 27353 d := v_0.AuxInt 27354 v_1 := v.Args[1] 27355 if v_1.Op != OpConst32 { 27356 break 27357 } 27358 c := v_1.AuxInt 27359 v.reset(OpConst32) 27360 v.AuxInt = int64(int32(c ^ d)) 27361 return true 27362 } 27363 // match: (Xor32 x x) 27364 // cond: 27365 // result: (Const32 [0]) 27366 for { 27367 _ = v.Args[1] 27368 x := v.Args[0] 27369 if x != v.Args[1] { 27370 break 27371 } 27372 v.reset(OpConst32) 27373 v.AuxInt = 0 27374 return true 27375 } 27376 // match: (Xor32 (Const32 [0]) x) 27377 // cond: 27378 // result: x 27379 for { 27380 _ = v.Args[1] 27381 v_0 := v.Args[0] 27382 if v_0.Op != OpConst32 { 27383 break 27384 } 27385 if v_0.AuxInt != 0 { 27386 break 27387 } 27388 x := v.Args[1] 27389 v.reset(OpCopy) 27390 v.Type = x.Type 27391 v.AddArg(x) 27392 return true 27393 } 27394 // match: (Xor32 x (Const32 [0])) 27395 // cond: 27396 // result: x 27397 for { 27398 _ = v.Args[1] 27399 x := v.Args[0] 27400 v_1 := v.Args[1] 27401 if v_1.Op != OpConst32 { 27402 break 27403 } 27404 if v_1.AuxInt != 0 { 27405 break 27406 } 27407 v.reset(OpCopy) 27408 v.Type = x.Type 27409 v.AddArg(x) 27410 return true 27411 } 27412 // match: (Xor32 x (Xor32 x y)) 27413 // cond: 27414 // result: y 27415 for { 27416 _ = v.Args[1] 27417 x := v.Args[0] 27418 v_1 := v.Args[1] 27419 if v_1.Op != OpXor32 { 27420 break 27421 } 27422 _ = v_1.Args[1] 27423 if x != v_1.Args[0] { 27424 break 27425 } 27426 y := v_1.Args[1] 27427 v.reset(OpCopy) 27428 v.Type = y.Type 27429 v.AddArg(y) 27430 return true 27431 } 27432 // match: (Xor32 x (Xor32 y x)) 27433 // cond: 27434 // result: y 27435 for { 27436 _ = v.Args[1] 27437 x := v.Args[0] 27438 v_1 := v.Args[1] 27439 if v_1.Op != OpXor32 { 27440 break 27441 } 27442 _ = v_1.Args[1] 27443 y := v_1.Args[0] 27444 if x != v_1.Args[1] { 27445 break 27446 } 27447 v.reset(OpCopy) 27448 v.Type = y.Type 27449 v.AddArg(y) 27450 return true 27451 } 27452 // match: (Xor32 (Xor32 x y) x) 27453 // cond: 27454 // result: y 27455 for { 27456 _ = v.Args[1] 27457 v_0 := v.Args[0] 27458 if v_0.Op != OpXor32 { 27459 break 27460 } 27461 _ = v_0.Args[1] 27462 x := v_0.Args[0] 27463 y := v_0.Args[1] 27464 if x != v.Args[1] { 27465 break 27466 } 27467 v.reset(OpCopy) 27468 v.Type = y.Type 27469 v.AddArg(y) 27470 return true 27471 } 27472 // match: (Xor32 (Xor32 y x) x) 27473 // cond: 27474 // result: y 27475 for { 27476 _ = v.Args[1] 27477 v_0 := v.Args[0] 27478 if v_0.Op != OpXor32 { 27479 break 27480 } 27481 _ = v_0.Args[1] 27482 y := v_0.Args[0] 27483 x := v_0.Args[1] 27484 if x != v.Args[1] { 27485 break 27486 } 27487 v.reset(OpCopy) 27488 v.Type = y.Type 27489 v.AddArg(y) 27490 return true 27491 } 27492 // match: (Xor32 (Xor32 i:(Const32 <t>) z) x) 27493 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 27494 // result: (Xor32 i (Xor32 <t> z x)) 27495 for { 27496 _ = v.Args[1] 27497 v_0 := v.Args[0] 27498 if v_0.Op != OpXor32 { 27499 break 27500 } 27501 _ = v_0.Args[1] 27502 i := v_0.Args[0] 27503 if i.Op != OpConst32 { 27504 break 27505 } 27506 t := i.Type 27507 z := v_0.Args[1] 27508 x := v.Args[1] 27509 if !(z.Op != OpConst32 && x.Op != OpConst32) { 27510 break 27511 } 27512 v.reset(OpXor32) 27513 v.AddArg(i) 27514 v0 := b.NewValue0(v.Pos, OpXor32, t) 27515 v0.AddArg(z) 27516 v0.AddArg(x) 27517 v.AddArg(v0) 27518 return true 27519 } 27520 return false 27521 } 27522 func rewriteValuegeneric_OpXor32_10(v *Value) bool { 27523 b := v.Block 27524 _ = b 27525 // match: (Xor32 (Xor32 z i:(Const32 <t>)) x) 27526 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 27527 // result: (Xor32 i (Xor32 <t> z x)) 27528 for { 27529 _ = v.Args[1] 27530 v_0 := v.Args[0] 27531 if v_0.Op != OpXor32 { 27532 break 27533 } 27534 _ = v_0.Args[1] 27535 z := v_0.Args[0] 27536 i := v_0.Args[1] 27537 if i.Op != OpConst32 { 27538 break 27539 } 27540 t := i.Type 27541 x := v.Args[1] 27542 if !(z.Op != OpConst32 && x.Op != OpConst32) { 27543 break 27544 } 27545 v.reset(OpXor32) 27546 v.AddArg(i) 27547 v0 := b.NewValue0(v.Pos, OpXor32, t) 27548 v0.AddArg(z) 27549 v0.AddArg(x) 27550 v.AddArg(v0) 27551 return true 27552 } 27553 // match: (Xor32 x (Xor32 i:(Const32 <t>) z)) 27554 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 27555 // result: (Xor32 i (Xor32 <t> z x)) 27556 for { 27557 _ = v.Args[1] 27558 x := v.Args[0] 27559 v_1 := v.Args[1] 27560 if v_1.Op != OpXor32 { 27561 break 27562 } 27563 _ = v_1.Args[1] 27564 i := v_1.Args[0] 27565 if i.Op != OpConst32 { 27566 break 27567 } 27568 t := i.Type 27569 z := v_1.Args[1] 27570 if !(z.Op != OpConst32 && x.Op != OpConst32) { 27571 break 27572 } 27573 v.reset(OpXor32) 27574 v.AddArg(i) 27575 v0 := b.NewValue0(v.Pos, OpXor32, t) 27576 v0.AddArg(z) 27577 v0.AddArg(x) 27578 v.AddArg(v0) 27579 return true 27580 } 27581 // match: (Xor32 x (Xor32 z i:(Const32 <t>))) 27582 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 27583 // result: (Xor32 i (Xor32 <t> z x)) 27584 for { 27585 _ = v.Args[1] 27586 x := v.Args[0] 27587 v_1 := v.Args[1] 27588 if v_1.Op != OpXor32 { 27589 break 27590 } 27591 _ = v_1.Args[1] 27592 z := v_1.Args[0] 27593 i := v_1.Args[1] 27594 if i.Op != OpConst32 { 27595 break 27596 } 27597 t := i.Type 27598 if !(z.Op != OpConst32 && x.Op != OpConst32) { 27599 break 27600 } 27601 v.reset(OpXor32) 27602 v.AddArg(i) 27603 v0 := b.NewValue0(v.Pos, OpXor32, t) 27604 v0.AddArg(z) 27605 v0.AddArg(x) 27606 v.AddArg(v0) 27607 return true 27608 } 27609 // match: (Xor32 (Const32 <t> [c]) (Xor32 (Const32 <t> [d]) x)) 27610 // cond: 27611 // result: (Xor32 (Const32 <t> [int64(int32(c^d))]) x) 27612 for { 27613 _ = v.Args[1] 27614 v_0 := v.Args[0] 27615 if v_0.Op != OpConst32 { 27616 break 27617 } 27618 t := v_0.Type 27619 c := v_0.AuxInt 27620 v_1 := v.Args[1] 27621 if v_1.Op != OpXor32 { 27622 break 27623 } 27624 _ = v_1.Args[1] 27625 v_1_0 := v_1.Args[0] 27626 if v_1_0.Op != OpConst32 { 27627 break 27628 } 27629 if v_1_0.Type != t { 27630 break 27631 } 27632 d := v_1_0.AuxInt 27633 x := v_1.Args[1] 27634 v.reset(OpXor32) 27635 v0 := b.NewValue0(v.Pos, OpConst32, t) 27636 v0.AuxInt = int64(int32(c ^ d)) 27637 v.AddArg(v0) 27638 v.AddArg(x) 27639 return true 27640 } 27641 // match: (Xor32 (Const32 <t> [c]) (Xor32 x (Const32 <t> [d]))) 27642 // cond: 27643 // result: (Xor32 (Const32 <t> [int64(int32(c^d))]) x) 27644 for { 27645 _ = v.Args[1] 27646 v_0 := v.Args[0] 27647 if v_0.Op != OpConst32 { 27648 break 27649 } 27650 t := v_0.Type 27651 c := v_0.AuxInt 27652 v_1 := v.Args[1] 27653 if v_1.Op != OpXor32 { 27654 break 27655 } 27656 _ = v_1.Args[1] 27657 x := v_1.Args[0] 27658 v_1_1 := v_1.Args[1] 27659 if v_1_1.Op != OpConst32 { 27660 break 27661 } 27662 if v_1_1.Type != t { 27663 break 27664 } 27665 d := v_1_1.AuxInt 27666 v.reset(OpXor32) 27667 v0 := b.NewValue0(v.Pos, OpConst32, t) 27668 v0.AuxInt = int64(int32(c ^ d)) 27669 v.AddArg(v0) 27670 v.AddArg(x) 27671 return true 27672 } 27673 // match: (Xor32 (Xor32 (Const32 <t> [d]) x) (Const32 <t> [c])) 27674 // cond: 27675 // result: (Xor32 (Const32 <t> [int64(int32(c^d))]) x) 27676 for { 27677 _ = v.Args[1] 27678 v_0 := v.Args[0] 27679 if v_0.Op != OpXor32 { 27680 break 27681 } 27682 _ = v_0.Args[1] 27683 v_0_0 := v_0.Args[0] 27684 if v_0_0.Op != OpConst32 { 27685 break 27686 } 27687 t := v_0_0.Type 27688 d := v_0_0.AuxInt 27689 x := v_0.Args[1] 27690 v_1 := v.Args[1] 27691 if v_1.Op != OpConst32 { 27692 break 27693 } 27694 if v_1.Type != t { 27695 break 27696 } 27697 c := v_1.AuxInt 27698 v.reset(OpXor32) 27699 v0 := b.NewValue0(v.Pos, OpConst32, t) 27700 v0.AuxInt = int64(int32(c ^ d)) 27701 v.AddArg(v0) 27702 v.AddArg(x) 27703 return true 27704 } 27705 // match: (Xor32 (Xor32 x (Const32 <t> [d])) (Const32 <t> [c])) 27706 // cond: 27707 // result: (Xor32 (Const32 <t> [int64(int32(c^d))]) x) 27708 for { 27709 _ = v.Args[1] 27710 v_0 := v.Args[0] 27711 if v_0.Op != OpXor32 { 27712 break 27713 } 27714 _ = v_0.Args[1] 27715 x := v_0.Args[0] 27716 v_0_1 := v_0.Args[1] 27717 if v_0_1.Op != OpConst32 { 27718 break 27719 } 27720 t := v_0_1.Type 27721 d := v_0_1.AuxInt 27722 v_1 := v.Args[1] 27723 if v_1.Op != OpConst32 { 27724 break 27725 } 27726 if v_1.Type != t { 27727 break 27728 } 27729 c := v_1.AuxInt 27730 v.reset(OpXor32) 27731 v0 := b.NewValue0(v.Pos, OpConst32, t) 27732 v0.AuxInt = int64(int32(c ^ d)) 27733 v.AddArg(v0) 27734 v.AddArg(x) 27735 return true 27736 } 27737 return false 27738 } 27739 func rewriteValuegeneric_OpXor64_0(v *Value) bool { 27740 b := v.Block 27741 _ = b 27742 // match: (Xor64 (Const64 [c]) (Const64 [d])) 27743 // cond: 27744 // result: (Const64 [c^d]) 27745 for { 27746 _ = v.Args[1] 27747 v_0 := v.Args[0] 27748 if v_0.Op != OpConst64 { 27749 break 27750 } 27751 c := v_0.AuxInt 27752 v_1 := v.Args[1] 27753 if v_1.Op != OpConst64 { 27754 break 27755 } 27756 d := v_1.AuxInt 27757 v.reset(OpConst64) 27758 v.AuxInt = c ^ d 27759 return true 27760 } 27761 // match: (Xor64 (Const64 [d]) (Const64 [c])) 27762 // cond: 27763 // result: (Const64 [c^d]) 27764 for { 27765 _ = v.Args[1] 27766 v_0 := v.Args[0] 27767 if v_0.Op != OpConst64 { 27768 break 27769 } 27770 d := v_0.AuxInt 27771 v_1 := v.Args[1] 27772 if v_1.Op != OpConst64 { 27773 break 27774 } 27775 c := v_1.AuxInt 27776 v.reset(OpConst64) 27777 v.AuxInt = c ^ d 27778 return true 27779 } 27780 // match: (Xor64 x x) 27781 // cond: 27782 // result: (Const64 [0]) 27783 for { 27784 _ = v.Args[1] 27785 x := v.Args[0] 27786 if x != v.Args[1] { 27787 break 27788 } 27789 v.reset(OpConst64) 27790 v.AuxInt = 0 27791 return true 27792 } 27793 // match: (Xor64 (Const64 [0]) x) 27794 // cond: 27795 // result: x 27796 for { 27797 _ = v.Args[1] 27798 v_0 := v.Args[0] 27799 if v_0.Op != OpConst64 { 27800 break 27801 } 27802 if v_0.AuxInt != 0 { 27803 break 27804 } 27805 x := v.Args[1] 27806 v.reset(OpCopy) 27807 v.Type = x.Type 27808 v.AddArg(x) 27809 return true 27810 } 27811 // match: (Xor64 x (Const64 [0])) 27812 // cond: 27813 // result: x 27814 for { 27815 _ = v.Args[1] 27816 x := v.Args[0] 27817 v_1 := v.Args[1] 27818 if v_1.Op != OpConst64 { 27819 break 27820 } 27821 if v_1.AuxInt != 0 { 27822 break 27823 } 27824 v.reset(OpCopy) 27825 v.Type = x.Type 27826 v.AddArg(x) 27827 return true 27828 } 27829 // match: (Xor64 x (Xor64 x y)) 27830 // cond: 27831 // result: y 27832 for { 27833 _ = v.Args[1] 27834 x := v.Args[0] 27835 v_1 := v.Args[1] 27836 if v_1.Op != OpXor64 { 27837 break 27838 } 27839 _ = v_1.Args[1] 27840 if x != v_1.Args[0] { 27841 break 27842 } 27843 y := v_1.Args[1] 27844 v.reset(OpCopy) 27845 v.Type = y.Type 27846 v.AddArg(y) 27847 return true 27848 } 27849 // match: (Xor64 x (Xor64 y x)) 27850 // cond: 27851 // result: y 27852 for { 27853 _ = v.Args[1] 27854 x := v.Args[0] 27855 v_1 := v.Args[1] 27856 if v_1.Op != OpXor64 { 27857 break 27858 } 27859 _ = v_1.Args[1] 27860 y := v_1.Args[0] 27861 if x != v_1.Args[1] { 27862 break 27863 } 27864 v.reset(OpCopy) 27865 v.Type = y.Type 27866 v.AddArg(y) 27867 return true 27868 } 27869 // match: (Xor64 (Xor64 x y) x) 27870 // cond: 27871 // result: y 27872 for { 27873 _ = v.Args[1] 27874 v_0 := v.Args[0] 27875 if v_0.Op != OpXor64 { 27876 break 27877 } 27878 _ = v_0.Args[1] 27879 x := v_0.Args[0] 27880 y := v_0.Args[1] 27881 if x != v.Args[1] { 27882 break 27883 } 27884 v.reset(OpCopy) 27885 v.Type = y.Type 27886 v.AddArg(y) 27887 return true 27888 } 27889 // match: (Xor64 (Xor64 y x) x) 27890 // cond: 27891 // result: y 27892 for { 27893 _ = v.Args[1] 27894 v_0 := v.Args[0] 27895 if v_0.Op != OpXor64 { 27896 break 27897 } 27898 _ = v_0.Args[1] 27899 y := v_0.Args[0] 27900 x := v_0.Args[1] 27901 if x != v.Args[1] { 27902 break 27903 } 27904 v.reset(OpCopy) 27905 v.Type = y.Type 27906 v.AddArg(y) 27907 return true 27908 } 27909 // match: (Xor64 (Xor64 i:(Const64 <t>) z) x) 27910 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 27911 // result: (Xor64 i (Xor64 <t> z x)) 27912 for { 27913 _ = v.Args[1] 27914 v_0 := v.Args[0] 27915 if v_0.Op != OpXor64 { 27916 break 27917 } 27918 _ = v_0.Args[1] 27919 i := v_0.Args[0] 27920 if i.Op != OpConst64 { 27921 break 27922 } 27923 t := i.Type 27924 z := v_0.Args[1] 27925 x := v.Args[1] 27926 if !(z.Op != OpConst64 && x.Op != OpConst64) { 27927 break 27928 } 27929 v.reset(OpXor64) 27930 v.AddArg(i) 27931 v0 := b.NewValue0(v.Pos, OpXor64, t) 27932 v0.AddArg(z) 27933 v0.AddArg(x) 27934 v.AddArg(v0) 27935 return true 27936 } 27937 return false 27938 } 27939 func rewriteValuegeneric_OpXor64_10(v *Value) bool { 27940 b := v.Block 27941 _ = b 27942 // match: (Xor64 (Xor64 z i:(Const64 <t>)) x) 27943 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 27944 // result: (Xor64 i (Xor64 <t> z x)) 27945 for { 27946 _ = v.Args[1] 27947 v_0 := v.Args[0] 27948 if v_0.Op != OpXor64 { 27949 break 27950 } 27951 _ = v_0.Args[1] 27952 z := v_0.Args[0] 27953 i := v_0.Args[1] 27954 if i.Op != OpConst64 { 27955 break 27956 } 27957 t := i.Type 27958 x := v.Args[1] 27959 if !(z.Op != OpConst64 && x.Op != OpConst64) { 27960 break 27961 } 27962 v.reset(OpXor64) 27963 v.AddArg(i) 27964 v0 := b.NewValue0(v.Pos, OpXor64, t) 27965 v0.AddArg(z) 27966 v0.AddArg(x) 27967 v.AddArg(v0) 27968 return true 27969 } 27970 // match: (Xor64 x (Xor64 i:(Const64 <t>) z)) 27971 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 27972 // result: (Xor64 i (Xor64 <t> z x)) 27973 for { 27974 _ = v.Args[1] 27975 x := v.Args[0] 27976 v_1 := v.Args[1] 27977 if v_1.Op != OpXor64 { 27978 break 27979 } 27980 _ = v_1.Args[1] 27981 i := v_1.Args[0] 27982 if i.Op != OpConst64 { 27983 break 27984 } 27985 t := i.Type 27986 z := v_1.Args[1] 27987 if !(z.Op != OpConst64 && x.Op != OpConst64) { 27988 break 27989 } 27990 v.reset(OpXor64) 27991 v.AddArg(i) 27992 v0 := b.NewValue0(v.Pos, OpXor64, t) 27993 v0.AddArg(z) 27994 v0.AddArg(x) 27995 v.AddArg(v0) 27996 return true 27997 } 27998 // match: (Xor64 x (Xor64 z i:(Const64 <t>))) 27999 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 28000 // result: (Xor64 i (Xor64 <t> z x)) 28001 for { 28002 _ = v.Args[1] 28003 x := v.Args[0] 28004 v_1 := v.Args[1] 28005 if v_1.Op != OpXor64 { 28006 break 28007 } 28008 _ = v_1.Args[1] 28009 z := v_1.Args[0] 28010 i := v_1.Args[1] 28011 if i.Op != OpConst64 { 28012 break 28013 } 28014 t := i.Type 28015 if !(z.Op != OpConst64 && x.Op != OpConst64) { 28016 break 28017 } 28018 v.reset(OpXor64) 28019 v.AddArg(i) 28020 v0 := b.NewValue0(v.Pos, OpXor64, t) 28021 v0.AddArg(z) 28022 v0.AddArg(x) 28023 v.AddArg(v0) 28024 return true 28025 } 28026 // match: (Xor64 (Const64 <t> [c]) (Xor64 (Const64 <t> [d]) x)) 28027 // cond: 28028 // result: (Xor64 (Const64 <t> [c^d]) x) 28029 for { 28030 _ = v.Args[1] 28031 v_0 := v.Args[0] 28032 if v_0.Op != OpConst64 { 28033 break 28034 } 28035 t := v_0.Type 28036 c := v_0.AuxInt 28037 v_1 := v.Args[1] 28038 if v_1.Op != OpXor64 { 28039 break 28040 } 28041 _ = v_1.Args[1] 28042 v_1_0 := v_1.Args[0] 28043 if v_1_0.Op != OpConst64 { 28044 break 28045 } 28046 if v_1_0.Type != t { 28047 break 28048 } 28049 d := v_1_0.AuxInt 28050 x := v_1.Args[1] 28051 v.reset(OpXor64) 28052 v0 := b.NewValue0(v.Pos, OpConst64, t) 28053 v0.AuxInt = c ^ d 28054 v.AddArg(v0) 28055 v.AddArg(x) 28056 return true 28057 } 28058 // match: (Xor64 (Const64 <t> [c]) (Xor64 x (Const64 <t> [d]))) 28059 // cond: 28060 // result: (Xor64 (Const64 <t> [c^d]) x) 28061 for { 28062 _ = v.Args[1] 28063 v_0 := v.Args[0] 28064 if v_0.Op != OpConst64 { 28065 break 28066 } 28067 t := v_0.Type 28068 c := v_0.AuxInt 28069 v_1 := v.Args[1] 28070 if v_1.Op != OpXor64 { 28071 break 28072 } 28073 _ = v_1.Args[1] 28074 x := v_1.Args[0] 28075 v_1_1 := v_1.Args[1] 28076 if v_1_1.Op != OpConst64 { 28077 break 28078 } 28079 if v_1_1.Type != t { 28080 break 28081 } 28082 d := v_1_1.AuxInt 28083 v.reset(OpXor64) 28084 v0 := b.NewValue0(v.Pos, OpConst64, t) 28085 v0.AuxInt = c ^ d 28086 v.AddArg(v0) 28087 v.AddArg(x) 28088 return true 28089 } 28090 // match: (Xor64 (Xor64 (Const64 <t> [d]) x) (Const64 <t> [c])) 28091 // cond: 28092 // result: (Xor64 (Const64 <t> [c^d]) x) 28093 for { 28094 _ = v.Args[1] 28095 v_0 := v.Args[0] 28096 if v_0.Op != OpXor64 { 28097 break 28098 } 28099 _ = v_0.Args[1] 28100 v_0_0 := v_0.Args[0] 28101 if v_0_0.Op != OpConst64 { 28102 break 28103 } 28104 t := v_0_0.Type 28105 d := v_0_0.AuxInt 28106 x := v_0.Args[1] 28107 v_1 := v.Args[1] 28108 if v_1.Op != OpConst64 { 28109 break 28110 } 28111 if v_1.Type != t { 28112 break 28113 } 28114 c := v_1.AuxInt 28115 v.reset(OpXor64) 28116 v0 := b.NewValue0(v.Pos, OpConst64, t) 28117 v0.AuxInt = c ^ d 28118 v.AddArg(v0) 28119 v.AddArg(x) 28120 return true 28121 } 28122 // match: (Xor64 (Xor64 x (Const64 <t> [d])) (Const64 <t> [c])) 28123 // cond: 28124 // result: (Xor64 (Const64 <t> [c^d]) x) 28125 for { 28126 _ = v.Args[1] 28127 v_0 := v.Args[0] 28128 if v_0.Op != OpXor64 { 28129 break 28130 } 28131 _ = v_0.Args[1] 28132 x := v_0.Args[0] 28133 v_0_1 := v_0.Args[1] 28134 if v_0_1.Op != OpConst64 { 28135 break 28136 } 28137 t := v_0_1.Type 28138 d := v_0_1.AuxInt 28139 v_1 := v.Args[1] 28140 if v_1.Op != OpConst64 { 28141 break 28142 } 28143 if v_1.Type != t { 28144 break 28145 } 28146 c := v_1.AuxInt 28147 v.reset(OpXor64) 28148 v0 := b.NewValue0(v.Pos, OpConst64, t) 28149 v0.AuxInt = c ^ d 28150 v.AddArg(v0) 28151 v.AddArg(x) 28152 return true 28153 } 28154 return false 28155 } 28156 func rewriteValuegeneric_OpXor8_0(v *Value) bool { 28157 b := v.Block 28158 _ = b 28159 // match: (Xor8 (Const8 [c]) (Const8 [d])) 28160 // cond: 28161 // result: (Const8 [int64(int8(c^d))]) 28162 for { 28163 _ = v.Args[1] 28164 v_0 := v.Args[0] 28165 if v_0.Op != OpConst8 { 28166 break 28167 } 28168 c := v_0.AuxInt 28169 v_1 := v.Args[1] 28170 if v_1.Op != OpConst8 { 28171 break 28172 } 28173 d := v_1.AuxInt 28174 v.reset(OpConst8) 28175 v.AuxInt = int64(int8(c ^ d)) 28176 return true 28177 } 28178 // match: (Xor8 (Const8 [d]) (Const8 [c])) 28179 // cond: 28180 // result: (Const8 [int64(int8(c^d))]) 28181 for { 28182 _ = v.Args[1] 28183 v_0 := v.Args[0] 28184 if v_0.Op != OpConst8 { 28185 break 28186 } 28187 d := v_0.AuxInt 28188 v_1 := v.Args[1] 28189 if v_1.Op != OpConst8 { 28190 break 28191 } 28192 c := v_1.AuxInt 28193 v.reset(OpConst8) 28194 v.AuxInt = int64(int8(c ^ d)) 28195 return true 28196 } 28197 // match: (Xor8 x x) 28198 // cond: 28199 // result: (Const8 [0]) 28200 for { 28201 _ = v.Args[1] 28202 x := v.Args[0] 28203 if x != v.Args[1] { 28204 break 28205 } 28206 v.reset(OpConst8) 28207 v.AuxInt = 0 28208 return true 28209 } 28210 // match: (Xor8 (Const8 [0]) x) 28211 // cond: 28212 // result: x 28213 for { 28214 _ = v.Args[1] 28215 v_0 := v.Args[0] 28216 if v_0.Op != OpConst8 { 28217 break 28218 } 28219 if v_0.AuxInt != 0 { 28220 break 28221 } 28222 x := v.Args[1] 28223 v.reset(OpCopy) 28224 v.Type = x.Type 28225 v.AddArg(x) 28226 return true 28227 } 28228 // match: (Xor8 x (Const8 [0])) 28229 // cond: 28230 // result: x 28231 for { 28232 _ = v.Args[1] 28233 x := v.Args[0] 28234 v_1 := v.Args[1] 28235 if v_1.Op != OpConst8 { 28236 break 28237 } 28238 if v_1.AuxInt != 0 { 28239 break 28240 } 28241 v.reset(OpCopy) 28242 v.Type = x.Type 28243 v.AddArg(x) 28244 return true 28245 } 28246 // match: (Xor8 x (Xor8 x y)) 28247 // cond: 28248 // result: y 28249 for { 28250 _ = v.Args[1] 28251 x := v.Args[0] 28252 v_1 := v.Args[1] 28253 if v_1.Op != OpXor8 { 28254 break 28255 } 28256 _ = v_1.Args[1] 28257 if x != v_1.Args[0] { 28258 break 28259 } 28260 y := v_1.Args[1] 28261 v.reset(OpCopy) 28262 v.Type = y.Type 28263 v.AddArg(y) 28264 return true 28265 } 28266 // match: (Xor8 x (Xor8 y x)) 28267 // cond: 28268 // result: y 28269 for { 28270 _ = v.Args[1] 28271 x := v.Args[0] 28272 v_1 := v.Args[1] 28273 if v_1.Op != OpXor8 { 28274 break 28275 } 28276 _ = v_1.Args[1] 28277 y := v_1.Args[0] 28278 if x != v_1.Args[1] { 28279 break 28280 } 28281 v.reset(OpCopy) 28282 v.Type = y.Type 28283 v.AddArg(y) 28284 return true 28285 } 28286 // match: (Xor8 (Xor8 x y) x) 28287 // cond: 28288 // result: y 28289 for { 28290 _ = v.Args[1] 28291 v_0 := v.Args[0] 28292 if v_0.Op != OpXor8 { 28293 break 28294 } 28295 _ = v_0.Args[1] 28296 x := v_0.Args[0] 28297 y := v_0.Args[1] 28298 if x != v.Args[1] { 28299 break 28300 } 28301 v.reset(OpCopy) 28302 v.Type = y.Type 28303 v.AddArg(y) 28304 return true 28305 } 28306 // match: (Xor8 (Xor8 y x) x) 28307 // cond: 28308 // result: y 28309 for { 28310 _ = v.Args[1] 28311 v_0 := v.Args[0] 28312 if v_0.Op != OpXor8 { 28313 break 28314 } 28315 _ = v_0.Args[1] 28316 y := v_0.Args[0] 28317 x := v_0.Args[1] 28318 if x != v.Args[1] { 28319 break 28320 } 28321 v.reset(OpCopy) 28322 v.Type = y.Type 28323 v.AddArg(y) 28324 return true 28325 } 28326 // match: (Xor8 (Xor8 i:(Const8 <t>) z) x) 28327 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 28328 // result: (Xor8 i (Xor8 <t> z x)) 28329 for { 28330 _ = v.Args[1] 28331 v_0 := v.Args[0] 28332 if v_0.Op != OpXor8 { 28333 break 28334 } 28335 _ = v_0.Args[1] 28336 i := v_0.Args[0] 28337 if i.Op != OpConst8 { 28338 break 28339 } 28340 t := i.Type 28341 z := v_0.Args[1] 28342 x := v.Args[1] 28343 if !(z.Op != OpConst8 && x.Op != OpConst8) { 28344 break 28345 } 28346 v.reset(OpXor8) 28347 v.AddArg(i) 28348 v0 := b.NewValue0(v.Pos, OpXor8, t) 28349 v0.AddArg(z) 28350 v0.AddArg(x) 28351 v.AddArg(v0) 28352 return true 28353 } 28354 return false 28355 } 28356 func rewriteValuegeneric_OpXor8_10(v *Value) bool { 28357 b := v.Block 28358 _ = b 28359 // match: (Xor8 (Xor8 z i:(Const8 <t>)) x) 28360 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 28361 // result: (Xor8 i (Xor8 <t> z x)) 28362 for { 28363 _ = v.Args[1] 28364 v_0 := v.Args[0] 28365 if v_0.Op != OpXor8 { 28366 break 28367 } 28368 _ = v_0.Args[1] 28369 z := v_0.Args[0] 28370 i := v_0.Args[1] 28371 if i.Op != OpConst8 { 28372 break 28373 } 28374 t := i.Type 28375 x := v.Args[1] 28376 if !(z.Op != OpConst8 && x.Op != OpConst8) { 28377 break 28378 } 28379 v.reset(OpXor8) 28380 v.AddArg(i) 28381 v0 := b.NewValue0(v.Pos, OpXor8, t) 28382 v0.AddArg(z) 28383 v0.AddArg(x) 28384 v.AddArg(v0) 28385 return true 28386 } 28387 // match: (Xor8 x (Xor8 i:(Const8 <t>) z)) 28388 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 28389 // result: (Xor8 i (Xor8 <t> z x)) 28390 for { 28391 _ = v.Args[1] 28392 x := v.Args[0] 28393 v_1 := v.Args[1] 28394 if v_1.Op != OpXor8 { 28395 break 28396 } 28397 _ = v_1.Args[1] 28398 i := v_1.Args[0] 28399 if i.Op != OpConst8 { 28400 break 28401 } 28402 t := i.Type 28403 z := v_1.Args[1] 28404 if !(z.Op != OpConst8 && x.Op != OpConst8) { 28405 break 28406 } 28407 v.reset(OpXor8) 28408 v.AddArg(i) 28409 v0 := b.NewValue0(v.Pos, OpXor8, t) 28410 v0.AddArg(z) 28411 v0.AddArg(x) 28412 v.AddArg(v0) 28413 return true 28414 } 28415 // match: (Xor8 x (Xor8 z i:(Const8 <t>))) 28416 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 28417 // result: (Xor8 i (Xor8 <t> z x)) 28418 for { 28419 _ = v.Args[1] 28420 x := v.Args[0] 28421 v_1 := v.Args[1] 28422 if v_1.Op != OpXor8 { 28423 break 28424 } 28425 _ = v_1.Args[1] 28426 z := v_1.Args[0] 28427 i := v_1.Args[1] 28428 if i.Op != OpConst8 { 28429 break 28430 } 28431 t := i.Type 28432 if !(z.Op != OpConst8 && x.Op != OpConst8) { 28433 break 28434 } 28435 v.reset(OpXor8) 28436 v.AddArg(i) 28437 v0 := b.NewValue0(v.Pos, OpXor8, t) 28438 v0.AddArg(z) 28439 v0.AddArg(x) 28440 v.AddArg(v0) 28441 return true 28442 } 28443 // match: (Xor8 (Const8 <t> [c]) (Xor8 (Const8 <t> [d]) x)) 28444 // cond: 28445 // result: (Xor8 (Const8 <t> [int64(int8(c^d))]) x) 28446 for { 28447 _ = v.Args[1] 28448 v_0 := v.Args[0] 28449 if v_0.Op != OpConst8 { 28450 break 28451 } 28452 t := v_0.Type 28453 c := v_0.AuxInt 28454 v_1 := v.Args[1] 28455 if v_1.Op != OpXor8 { 28456 break 28457 } 28458 _ = v_1.Args[1] 28459 v_1_0 := v_1.Args[0] 28460 if v_1_0.Op != OpConst8 { 28461 break 28462 } 28463 if v_1_0.Type != t { 28464 break 28465 } 28466 d := v_1_0.AuxInt 28467 x := v_1.Args[1] 28468 v.reset(OpXor8) 28469 v0 := b.NewValue0(v.Pos, OpConst8, t) 28470 v0.AuxInt = int64(int8(c ^ d)) 28471 v.AddArg(v0) 28472 v.AddArg(x) 28473 return true 28474 } 28475 // match: (Xor8 (Const8 <t> [c]) (Xor8 x (Const8 <t> [d]))) 28476 // cond: 28477 // result: (Xor8 (Const8 <t> [int64(int8(c^d))]) x) 28478 for { 28479 _ = v.Args[1] 28480 v_0 := v.Args[0] 28481 if v_0.Op != OpConst8 { 28482 break 28483 } 28484 t := v_0.Type 28485 c := v_0.AuxInt 28486 v_1 := v.Args[1] 28487 if v_1.Op != OpXor8 { 28488 break 28489 } 28490 _ = v_1.Args[1] 28491 x := v_1.Args[0] 28492 v_1_1 := v_1.Args[1] 28493 if v_1_1.Op != OpConst8 { 28494 break 28495 } 28496 if v_1_1.Type != t { 28497 break 28498 } 28499 d := v_1_1.AuxInt 28500 v.reset(OpXor8) 28501 v0 := b.NewValue0(v.Pos, OpConst8, t) 28502 v0.AuxInt = int64(int8(c ^ d)) 28503 v.AddArg(v0) 28504 v.AddArg(x) 28505 return true 28506 } 28507 // match: (Xor8 (Xor8 (Const8 <t> [d]) x) (Const8 <t> [c])) 28508 // cond: 28509 // result: (Xor8 (Const8 <t> [int64(int8(c^d))]) x) 28510 for { 28511 _ = v.Args[1] 28512 v_0 := v.Args[0] 28513 if v_0.Op != OpXor8 { 28514 break 28515 } 28516 _ = v_0.Args[1] 28517 v_0_0 := v_0.Args[0] 28518 if v_0_0.Op != OpConst8 { 28519 break 28520 } 28521 t := v_0_0.Type 28522 d := v_0_0.AuxInt 28523 x := v_0.Args[1] 28524 v_1 := v.Args[1] 28525 if v_1.Op != OpConst8 { 28526 break 28527 } 28528 if v_1.Type != t { 28529 break 28530 } 28531 c := v_1.AuxInt 28532 v.reset(OpXor8) 28533 v0 := b.NewValue0(v.Pos, OpConst8, t) 28534 v0.AuxInt = int64(int8(c ^ d)) 28535 v.AddArg(v0) 28536 v.AddArg(x) 28537 return true 28538 } 28539 // match: (Xor8 (Xor8 x (Const8 <t> [d])) (Const8 <t> [c])) 28540 // cond: 28541 // result: (Xor8 (Const8 <t> [int64(int8(c^d))]) x) 28542 for { 28543 _ = v.Args[1] 28544 v_0 := v.Args[0] 28545 if v_0.Op != OpXor8 { 28546 break 28547 } 28548 _ = v_0.Args[1] 28549 x := v_0.Args[0] 28550 v_0_1 := v_0.Args[1] 28551 if v_0_1.Op != OpConst8 { 28552 break 28553 } 28554 t := v_0_1.Type 28555 d := v_0_1.AuxInt 28556 v_1 := v.Args[1] 28557 if v_1.Op != OpConst8 { 28558 break 28559 } 28560 if v_1.Type != t { 28561 break 28562 } 28563 c := v_1.AuxInt 28564 v.reset(OpXor8) 28565 v0 := b.NewValue0(v.Pos, OpConst8, t) 28566 v0.AuxInt = int64(int8(c ^ d)) 28567 v.AddArg(v0) 28568 v.AddArg(x) 28569 return true 28570 } 28571 return false 28572 } 28573 func rewriteValuegeneric_OpZero_0(v *Value) bool { 28574 b := v.Block 28575 _ = b 28576 config := b.Func.Config 28577 _ = config 28578 // match: (Zero (Load (OffPtr [c] (SP)) mem) mem) 28579 // cond: mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize 28580 // result: mem 28581 for { 28582 _ = v.Args[1] 28583 v_0 := v.Args[0] 28584 if v_0.Op != OpLoad { 28585 break 28586 } 28587 _ = v_0.Args[1] 28588 v_0_0 := v_0.Args[0] 28589 if v_0_0.Op != OpOffPtr { 28590 break 28591 } 28592 c := v_0_0.AuxInt 28593 v_0_0_0 := v_0_0.Args[0] 28594 if v_0_0_0.Op != OpSP { 28595 break 28596 } 28597 mem := v_0.Args[1] 28598 if mem != v.Args[1] { 28599 break 28600 } 28601 if !(mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize) { 28602 break 28603 } 28604 v.reset(OpCopy) 28605 v.Type = mem.Type 28606 v.AddArg(mem) 28607 return true 28608 } 28609 return false 28610 } 28611 func rewriteValuegeneric_OpZeroExt16to32_0(v *Value) bool { 28612 // match: (ZeroExt16to32 (Const16 [c])) 28613 // cond: 28614 // result: (Const32 [int64(uint16(c))]) 28615 for { 28616 v_0 := v.Args[0] 28617 if v_0.Op != OpConst16 { 28618 break 28619 } 28620 c := v_0.AuxInt 28621 v.reset(OpConst32) 28622 v.AuxInt = int64(uint16(c)) 28623 return true 28624 } 28625 // match: (ZeroExt16to32 (Trunc32to16 x:(Rsh32Ux64 _ (Const64 [s])))) 28626 // cond: s >= 16 28627 // result: x 28628 for { 28629 v_0 := v.Args[0] 28630 if v_0.Op != OpTrunc32to16 { 28631 break 28632 } 28633 x := v_0.Args[0] 28634 if x.Op != OpRsh32Ux64 { 28635 break 28636 } 28637 _ = x.Args[1] 28638 x_1 := x.Args[1] 28639 if x_1.Op != OpConst64 { 28640 break 28641 } 28642 s := x_1.AuxInt 28643 if !(s >= 16) { 28644 break 28645 } 28646 v.reset(OpCopy) 28647 v.Type = x.Type 28648 v.AddArg(x) 28649 return true 28650 } 28651 return false 28652 } 28653 func rewriteValuegeneric_OpZeroExt16to64_0(v *Value) bool { 28654 // match: (ZeroExt16to64 (Const16 [c])) 28655 // cond: 28656 // result: (Const64 [int64(uint16(c))]) 28657 for { 28658 v_0 := v.Args[0] 28659 if v_0.Op != OpConst16 { 28660 break 28661 } 28662 c := v_0.AuxInt 28663 v.reset(OpConst64) 28664 v.AuxInt = int64(uint16(c)) 28665 return true 28666 } 28667 // match: (ZeroExt16to64 (Trunc64to16 x:(Rsh64Ux64 _ (Const64 [s])))) 28668 // cond: s >= 48 28669 // result: x 28670 for { 28671 v_0 := v.Args[0] 28672 if v_0.Op != OpTrunc64to16 { 28673 break 28674 } 28675 x := v_0.Args[0] 28676 if x.Op != OpRsh64Ux64 { 28677 break 28678 } 28679 _ = x.Args[1] 28680 x_1 := x.Args[1] 28681 if x_1.Op != OpConst64 { 28682 break 28683 } 28684 s := x_1.AuxInt 28685 if !(s >= 48) { 28686 break 28687 } 28688 v.reset(OpCopy) 28689 v.Type = x.Type 28690 v.AddArg(x) 28691 return true 28692 } 28693 return false 28694 } 28695 func rewriteValuegeneric_OpZeroExt32to64_0(v *Value) bool { 28696 // match: (ZeroExt32to64 (Const32 [c])) 28697 // cond: 28698 // result: (Const64 [int64(uint32(c))]) 28699 for { 28700 v_0 := v.Args[0] 28701 if v_0.Op != OpConst32 { 28702 break 28703 } 28704 c := v_0.AuxInt 28705 v.reset(OpConst64) 28706 v.AuxInt = int64(uint32(c)) 28707 return true 28708 } 28709 // match: (ZeroExt32to64 (Trunc64to32 x:(Rsh64Ux64 _ (Const64 [s])))) 28710 // cond: s >= 32 28711 // result: x 28712 for { 28713 v_0 := v.Args[0] 28714 if v_0.Op != OpTrunc64to32 { 28715 break 28716 } 28717 x := v_0.Args[0] 28718 if x.Op != OpRsh64Ux64 { 28719 break 28720 } 28721 _ = x.Args[1] 28722 x_1 := x.Args[1] 28723 if x_1.Op != OpConst64 { 28724 break 28725 } 28726 s := x_1.AuxInt 28727 if !(s >= 32) { 28728 break 28729 } 28730 v.reset(OpCopy) 28731 v.Type = x.Type 28732 v.AddArg(x) 28733 return true 28734 } 28735 return false 28736 } 28737 func rewriteValuegeneric_OpZeroExt8to16_0(v *Value) bool { 28738 // match: (ZeroExt8to16 (Const8 [c])) 28739 // cond: 28740 // result: (Const16 [int64( uint8(c))]) 28741 for { 28742 v_0 := v.Args[0] 28743 if v_0.Op != OpConst8 { 28744 break 28745 } 28746 c := v_0.AuxInt 28747 v.reset(OpConst16) 28748 v.AuxInt = int64(uint8(c)) 28749 return true 28750 } 28751 // match: (ZeroExt8to16 (Trunc16to8 x:(Rsh16Ux64 _ (Const64 [s])))) 28752 // cond: s >= 8 28753 // result: x 28754 for { 28755 v_0 := v.Args[0] 28756 if v_0.Op != OpTrunc16to8 { 28757 break 28758 } 28759 x := v_0.Args[0] 28760 if x.Op != OpRsh16Ux64 { 28761 break 28762 } 28763 _ = x.Args[1] 28764 x_1 := x.Args[1] 28765 if x_1.Op != OpConst64 { 28766 break 28767 } 28768 s := x_1.AuxInt 28769 if !(s >= 8) { 28770 break 28771 } 28772 v.reset(OpCopy) 28773 v.Type = x.Type 28774 v.AddArg(x) 28775 return true 28776 } 28777 return false 28778 } 28779 func rewriteValuegeneric_OpZeroExt8to32_0(v *Value) bool { 28780 // match: (ZeroExt8to32 (Const8 [c])) 28781 // cond: 28782 // result: (Const32 [int64( uint8(c))]) 28783 for { 28784 v_0 := v.Args[0] 28785 if v_0.Op != OpConst8 { 28786 break 28787 } 28788 c := v_0.AuxInt 28789 v.reset(OpConst32) 28790 v.AuxInt = int64(uint8(c)) 28791 return true 28792 } 28793 // match: (ZeroExt8to32 (Trunc32to8 x:(Rsh32Ux64 _ (Const64 [s])))) 28794 // cond: s >= 24 28795 // result: x 28796 for { 28797 v_0 := v.Args[0] 28798 if v_0.Op != OpTrunc32to8 { 28799 break 28800 } 28801 x := v_0.Args[0] 28802 if x.Op != OpRsh32Ux64 { 28803 break 28804 } 28805 _ = x.Args[1] 28806 x_1 := x.Args[1] 28807 if x_1.Op != OpConst64 { 28808 break 28809 } 28810 s := x_1.AuxInt 28811 if !(s >= 24) { 28812 break 28813 } 28814 v.reset(OpCopy) 28815 v.Type = x.Type 28816 v.AddArg(x) 28817 return true 28818 } 28819 return false 28820 } 28821 func rewriteValuegeneric_OpZeroExt8to64_0(v *Value) bool { 28822 // match: (ZeroExt8to64 (Const8 [c])) 28823 // cond: 28824 // result: (Const64 [int64( uint8(c))]) 28825 for { 28826 v_0 := v.Args[0] 28827 if v_0.Op != OpConst8 { 28828 break 28829 } 28830 c := v_0.AuxInt 28831 v.reset(OpConst64) 28832 v.AuxInt = int64(uint8(c)) 28833 return true 28834 } 28835 // match: (ZeroExt8to64 (Trunc64to8 x:(Rsh64Ux64 _ (Const64 [s])))) 28836 // cond: s >= 56 28837 // result: x 28838 for { 28839 v_0 := v.Args[0] 28840 if v_0.Op != OpTrunc64to8 { 28841 break 28842 } 28843 x := v_0.Args[0] 28844 if x.Op != OpRsh64Ux64 { 28845 break 28846 } 28847 _ = x.Args[1] 28848 x_1 := x.Args[1] 28849 if x_1.Op != OpConst64 { 28850 break 28851 } 28852 s := x_1.AuxInt 28853 if !(s >= 56) { 28854 break 28855 } 28856 v.reset(OpCopy) 28857 v.Type = x.Type 28858 v.AddArg(x) 28859 return true 28860 } 28861 return false 28862 } 28863 func rewriteBlockgeneric(b *Block) bool { 28864 config := b.Func.Config 28865 _ = config 28866 fe := b.Func.fe 28867 _ = fe 28868 typ := &config.Types 28869 _ = typ 28870 switch b.Kind { 28871 case BlockIf: 28872 // match: (If (Not cond) yes no) 28873 // cond: 28874 // result: (If cond no yes) 28875 for { 28876 v := b.Control 28877 if v.Op != OpNot { 28878 break 28879 } 28880 cond := v.Args[0] 28881 b.Kind = BlockIf 28882 b.SetControl(cond) 28883 b.Aux = nil 28884 b.swapSuccessors() 28885 return true 28886 } 28887 // match: (If (ConstBool [c]) yes no) 28888 // cond: c == 1 28889 // result: (First nil yes no) 28890 for { 28891 v := b.Control 28892 if v.Op != OpConstBool { 28893 break 28894 } 28895 c := v.AuxInt 28896 if !(c == 1) { 28897 break 28898 } 28899 b.Kind = BlockFirst 28900 b.SetControl(nil) 28901 b.Aux = nil 28902 return true 28903 } 28904 // match: (If (ConstBool [c]) yes no) 28905 // cond: c == 0 28906 // result: (First nil no yes) 28907 for { 28908 v := b.Control 28909 if v.Op != OpConstBool { 28910 break 28911 } 28912 c := v.AuxInt 28913 if !(c == 0) { 28914 break 28915 } 28916 b.Kind = BlockFirst 28917 b.SetControl(nil) 28918 b.Aux = nil 28919 b.swapSuccessors() 28920 return true 28921 } 28922 } 28923 return false 28924 }