github.com/mattn/go@v0.0.0-20171011075504-07f7db3ea99f/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 OpStore: 413 return rewriteValuegeneric_OpStore_0(v) || rewriteValuegeneric_OpStore_10(v) 414 case OpStringLen: 415 return rewriteValuegeneric_OpStringLen_0(v) 416 case OpStringPtr: 417 return rewriteValuegeneric_OpStringPtr_0(v) 418 case OpStructSelect: 419 return rewriteValuegeneric_OpStructSelect_0(v) || rewriteValuegeneric_OpStructSelect_10(v) 420 case OpSub16: 421 return rewriteValuegeneric_OpSub16_0(v) || rewriteValuegeneric_OpSub16_10(v) 422 case OpSub32: 423 return rewriteValuegeneric_OpSub32_0(v) || rewriteValuegeneric_OpSub32_10(v) 424 case OpSub32F: 425 return rewriteValuegeneric_OpSub32F_0(v) 426 case OpSub64: 427 return rewriteValuegeneric_OpSub64_0(v) || rewriteValuegeneric_OpSub64_10(v) 428 case OpSub64F: 429 return rewriteValuegeneric_OpSub64F_0(v) 430 case OpSub8: 431 return rewriteValuegeneric_OpSub8_0(v) || rewriteValuegeneric_OpSub8_10(v) 432 case OpTrunc16to8: 433 return rewriteValuegeneric_OpTrunc16to8_0(v) 434 case OpTrunc32to16: 435 return rewriteValuegeneric_OpTrunc32to16_0(v) 436 case OpTrunc32to8: 437 return rewriteValuegeneric_OpTrunc32to8_0(v) 438 case OpTrunc64to16: 439 return rewriteValuegeneric_OpTrunc64to16_0(v) 440 case OpTrunc64to32: 441 return rewriteValuegeneric_OpTrunc64to32_0(v) 442 case OpTrunc64to8: 443 return rewriteValuegeneric_OpTrunc64to8_0(v) 444 case OpXor16: 445 return rewriteValuegeneric_OpXor16_0(v) || rewriteValuegeneric_OpXor16_10(v) 446 case OpXor32: 447 return rewriteValuegeneric_OpXor32_0(v) || rewriteValuegeneric_OpXor32_10(v) 448 case OpXor64: 449 return rewriteValuegeneric_OpXor64_0(v) || rewriteValuegeneric_OpXor64_10(v) 450 case OpXor8: 451 return rewriteValuegeneric_OpXor8_0(v) || rewriteValuegeneric_OpXor8_10(v) 452 case OpZero: 453 return rewriteValuegeneric_OpZero_0(v) 454 case OpZeroExt16to32: 455 return rewriteValuegeneric_OpZeroExt16to32_0(v) 456 case OpZeroExt16to64: 457 return rewriteValuegeneric_OpZeroExt16to64_0(v) 458 case OpZeroExt32to64: 459 return rewriteValuegeneric_OpZeroExt32to64_0(v) 460 case OpZeroExt8to16: 461 return rewriteValuegeneric_OpZeroExt8to16_0(v) 462 case OpZeroExt8to32: 463 return rewriteValuegeneric_OpZeroExt8to32_0(v) 464 case OpZeroExt8to64: 465 return rewriteValuegeneric_OpZeroExt8to64_0(v) 466 } 467 return false 468 } 469 func rewriteValuegeneric_OpAdd16_0(v *Value) bool { 470 b := v.Block 471 _ = b 472 // match: (Add16 (Const16 [c]) (Const16 [d])) 473 // cond: 474 // result: (Const16 [int64(int16(c+d))]) 475 for { 476 _ = v.Args[1] 477 v_0 := v.Args[0] 478 if v_0.Op != OpConst16 { 479 break 480 } 481 c := v_0.AuxInt 482 v_1 := v.Args[1] 483 if v_1.Op != OpConst16 { 484 break 485 } 486 d := v_1.AuxInt 487 v.reset(OpConst16) 488 v.AuxInt = int64(int16(c + d)) 489 return true 490 } 491 // match: (Add16 (Const16 [d]) (Const16 [c])) 492 // cond: 493 // result: (Const16 [int64(int16(c+d))]) 494 for { 495 _ = v.Args[1] 496 v_0 := v.Args[0] 497 if v_0.Op != OpConst16 { 498 break 499 } 500 d := v_0.AuxInt 501 v_1 := v.Args[1] 502 if v_1.Op != OpConst16 { 503 break 504 } 505 c := v_1.AuxInt 506 v.reset(OpConst16) 507 v.AuxInt = int64(int16(c + d)) 508 return true 509 } 510 // match: (Add16 <t> (Mul16 x y) (Mul16 x z)) 511 // cond: 512 // result: (Mul16 x (Add16 <t> y z)) 513 for { 514 t := v.Type 515 _ = v.Args[1] 516 v_0 := v.Args[0] 517 if v_0.Op != OpMul16 { 518 break 519 } 520 _ = v_0.Args[1] 521 x := v_0.Args[0] 522 y := v_0.Args[1] 523 v_1 := v.Args[1] 524 if v_1.Op != OpMul16 { 525 break 526 } 527 _ = v_1.Args[1] 528 if x != v_1.Args[0] { 529 break 530 } 531 z := v_1.Args[1] 532 v.reset(OpMul16) 533 v.AddArg(x) 534 v0 := b.NewValue0(v.Pos, OpAdd16, t) 535 v0.AddArg(y) 536 v0.AddArg(z) 537 v.AddArg(v0) 538 return true 539 } 540 // match: (Add16 <t> (Mul16 y x) (Mul16 x z)) 541 // cond: 542 // result: (Mul16 x (Add16 <t> y z)) 543 for { 544 t := v.Type 545 _ = v.Args[1] 546 v_0 := v.Args[0] 547 if v_0.Op != OpMul16 { 548 break 549 } 550 _ = v_0.Args[1] 551 y := v_0.Args[0] 552 x := v_0.Args[1] 553 v_1 := v.Args[1] 554 if v_1.Op != OpMul16 { 555 break 556 } 557 _ = v_1.Args[1] 558 if x != v_1.Args[0] { 559 break 560 } 561 z := v_1.Args[1] 562 v.reset(OpMul16) 563 v.AddArg(x) 564 v0 := b.NewValue0(v.Pos, OpAdd16, t) 565 v0.AddArg(y) 566 v0.AddArg(z) 567 v.AddArg(v0) 568 return true 569 } 570 // match: (Add16 <t> (Mul16 x y) (Mul16 z x)) 571 // cond: 572 // result: (Mul16 x (Add16 <t> y z)) 573 for { 574 t := v.Type 575 _ = v.Args[1] 576 v_0 := v.Args[0] 577 if v_0.Op != OpMul16 { 578 break 579 } 580 _ = v_0.Args[1] 581 x := v_0.Args[0] 582 y := v_0.Args[1] 583 v_1 := v.Args[1] 584 if v_1.Op != OpMul16 { 585 break 586 } 587 _ = v_1.Args[1] 588 z := v_1.Args[0] 589 if x != v_1.Args[1] { 590 break 591 } 592 v.reset(OpMul16) 593 v.AddArg(x) 594 v0 := b.NewValue0(v.Pos, OpAdd16, t) 595 v0.AddArg(y) 596 v0.AddArg(z) 597 v.AddArg(v0) 598 return true 599 } 600 // match: (Add16 <t> (Mul16 y x) (Mul16 z x)) 601 // cond: 602 // result: (Mul16 x (Add16 <t> y z)) 603 for { 604 t := v.Type 605 _ = v.Args[1] 606 v_0 := v.Args[0] 607 if v_0.Op != OpMul16 { 608 break 609 } 610 _ = v_0.Args[1] 611 y := v_0.Args[0] 612 x := v_0.Args[1] 613 v_1 := v.Args[1] 614 if v_1.Op != OpMul16 { 615 break 616 } 617 _ = v_1.Args[1] 618 z := v_1.Args[0] 619 if x != v_1.Args[1] { 620 break 621 } 622 v.reset(OpMul16) 623 v.AddArg(x) 624 v0 := b.NewValue0(v.Pos, OpAdd16, t) 625 v0.AddArg(y) 626 v0.AddArg(z) 627 v.AddArg(v0) 628 return true 629 } 630 // match: (Add16 <t> (Mul16 x z) (Mul16 x y)) 631 // cond: 632 // result: (Mul16 x (Add16 <t> y z)) 633 for { 634 t := v.Type 635 _ = v.Args[1] 636 v_0 := v.Args[0] 637 if v_0.Op != OpMul16 { 638 break 639 } 640 _ = v_0.Args[1] 641 x := v_0.Args[0] 642 z := v_0.Args[1] 643 v_1 := v.Args[1] 644 if v_1.Op != OpMul16 { 645 break 646 } 647 _ = v_1.Args[1] 648 if x != v_1.Args[0] { 649 break 650 } 651 y := v_1.Args[1] 652 v.reset(OpMul16) 653 v.AddArg(x) 654 v0 := b.NewValue0(v.Pos, OpAdd16, t) 655 v0.AddArg(y) 656 v0.AddArg(z) 657 v.AddArg(v0) 658 return true 659 } 660 // match: (Add16 <t> (Mul16 z x) (Mul16 x y)) 661 // cond: 662 // result: (Mul16 x (Add16 <t> y z)) 663 for { 664 t := v.Type 665 _ = v.Args[1] 666 v_0 := v.Args[0] 667 if v_0.Op != OpMul16 { 668 break 669 } 670 _ = v_0.Args[1] 671 z := v_0.Args[0] 672 x := v_0.Args[1] 673 v_1 := v.Args[1] 674 if v_1.Op != OpMul16 { 675 break 676 } 677 _ = v_1.Args[1] 678 if x != v_1.Args[0] { 679 break 680 } 681 y := v_1.Args[1] 682 v.reset(OpMul16) 683 v.AddArg(x) 684 v0 := b.NewValue0(v.Pos, OpAdd16, t) 685 v0.AddArg(y) 686 v0.AddArg(z) 687 v.AddArg(v0) 688 return true 689 } 690 // match: (Add16 <t> (Mul16 x z) (Mul16 y x)) 691 // cond: 692 // result: (Mul16 x (Add16 <t> y z)) 693 for { 694 t := v.Type 695 _ = v.Args[1] 696 v_0 := v.Args[0] 697 if v_0.Op != OpMul16 { 698 break 699 } 700 _ = v_0.Args[1] 701 x := v_0.Args[0] 702 z := v_0.Args[1] 703 v_1 := v.Args[1] 704 if v_1.Op != OpMul16 { 705 break 706 } 707 _ = v_1.Args[1] 708 y := v_1.Args[0] 709 if x != v_1.Args[1] { 710 break 711 } 712 v.reset(OpMul16) 713 v.AddArg(x) 714 v0 := b.NewValue0(v.Pos, OpAdd16, t) 715 v0.AddArg(y) 716 v0.AddArg(z) 717 v.AddArg(v0) 718 return true 719 } 720 // match: (Add16 <t> (Mul16 z x) (Mul16 y x)) 721 // cond: 722 // result: (Mul16 x (Add16 <t> y z)) 723 for { 724 t := v.Type 725 _ = v.Args[1] 726 v_0 := v.Args[0] 727 if v_0.Op != OpMul16 { 728 break 729 } 730 _ = v_0.Args[1] 731 z := v_0.Args[0] 732 x := v_0.Args[1] 733 v_1 := v.Args[1] 734 if v_1.Op != OpMul16 { 735 break 736 } 737 _ = v_1.Args[1] 738 y := v_1.Args[0] 739 if x != v_1.Args[1] { 740 break 741 } 742 v.reset(OpMul16) 743 v.AddArg(x) 744 v0 := b.NewValue0(v.Pos, OpAdd16, t) 745 v0.AddArg(y) 746 v0.AddArg(z) 747 v.AddArg(v0) 748 return true 749 } 750 return false 751 } 752 func rewriteValuegeneric_OpAdd16_10(v *Value) bool { 753 b := v.Block 754 _ = b 755 // match: (Add16 (Const16 [0]) x) 756 // cond: 757 // result: x 758 for { 759 _ = v.Args[1] 760 v_0 := v.Args[0] 761 if v_0.Op != OpConst16 { 762 break 763 } 764 if v_0.AuxInt != 0 { 765 break 766 } 767 x := v.Args[1] 768 v.reset(OpCopy) 769 v.Type = x.Type 770 v.AddArg(x) 771 return true 772 } 773 // match: (Add16 x (Const16 [0])) 774 // cond: 775 // result: x 776 for { 777 _ = v.Args[1] 778 x := v.Args[0] 779 v_1 := v.Args[1] 780 if v_1.Op != OpConst16 { 781 break 782 } 783 if v_1.AuxInt != 0 { 784 break 785 } 786 v.reset(OpCopy) 787 v.Type = x.Type 788 v.AddArg(x) 789 return true 790 } 791 // match: (Add16 (Const16 [1]) (Com16 x)) 792 // cond: 793 // result: (Neg16 x) 794 for { 795 _ = v.Args[1] 796 v_0 := v.Args[0] 797 if v_0.Op != OpConst16 { 798 break 799 } 800 if v_0.AuxInt != 1 { 801 break 802 } 803 v_1 := v.Args[1] 804 if v_1.Op != OpCom16 { 805 break 806 } 807 x := v_1.Args[0] 808 v.reset(OpNeg16) 809 v.AddArg(x) 810 return true 811 } 812 // match: (Add16 (Com16 x) (Const16 [1])) 813 // cond: 814 // result: (Neg16 x) 815 for { 816 _ = v.Args[1] 817 v_0 := v.Args[0] 818 if v_0.Op != OpCom16 { 819 break 820 } 821 x := v_0.Args[0] 822 v_1 := v.Args[1] 823 if v_1.Op != OpConst16 { 824 break 825 } 826 if v_1.AuxInt != 1 { 827 break 828 } 829 v.reset(OpNeg16) 830 v.AddArg(x) 831 return true 832 } 833 // match: (Add16 (Add16 i:(Const16 <t>) z) x) 834 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 835 // result: (Add16 i (Add16 <t> z x)) 836 for { 837 _ = v.Args[1] 838 v_0 := v.Args[0] 839 if v_0.Op != OpAdd16 { 840 break 841 } 842 _ = v_0.Args[1] 843 i := v_0.Args[0] 844 if i.Op != OpConst16 { 845 break 846 } 847 t := i.Type 848 z := v_0.Args[1] 849 x := v.Args[1] 850 if !(z.Op != OpConst16 && x.Op != OpConst16) { 851 break 852 } 853 v.reset(OpAdd16) 854 v.AddArg(i) 855 v0 := b.NewValue0(v.Pos, OpAdd16, t) 856 v0.AddArg(z) 857 v0.AddArg(x) 858 v.AddArg(v0) 859 return true 860 } 861 // match: (Add16 (Add16 z i:(Const16 <t>)) x) 862 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 863 // result: (Add16 i (Add16 <t> z x)) 864 for { 865 _ = v.Args[1] 866 v_0 := v.Args[0] 867 if v_0.Op != OpAdd16 { 868 break 869 } 870 _ = v_0.Args[1] 871 z := v_0.Args[0] 872 i := v_0.Args[1] 873 if i.Op != OpConst16 { 874 break 875 } 876 t := i.Type 877 x := v.Args[1] 878 if !(z.Op != OpConst16 && x.Op != OpConst16) { 879 break 880 } 881 v.reset(OpAdd16) 882 v.AddArg(i) 883 v0 := b.NewValue0(v.Pos, OpAdd16, t) 884 v0.AddArg(z) 885 v0.AddArg(x) 886 v.AddArg(v0) 887 return true 888 } 889 // match: (Add16 x (Add16 i:(Const16 <t>) z)) 890 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 891 // result: (Add16 i (Add16 <t> z x)) 892 for { 893 _ = v.Args[1] 894 x := v.Args[0] 895 v_1 := v.Args[1] 896 if v_1.Op != OpAdd16 { 897 break 898 } 899 _ = v_1.Args[1] 900 i := v_1.Args[0] 901 if i.Op != OpConst16 { 902 break 903 } 904 t := i.Type 905 z := v_1.Args[1] 906 if !(z.Op != OpConst16 && x.Op != OpConst16) { 907 break 908 } 909 v.reset(OpAdd16) 910 v.AddArg(i) 911 v0 := b.NewValue0(v.Pos, OpAdd16, t) 912 v0.AddArg(z) 913 v0.AddArg(x) 914 v.AddArg(v0) 915 return true 916 } 917 // match: (Add16 x (Add16 z i:(Const16 <t>))) 918 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 919 // result: (Add16 i (Add16 <t> z x)) 920 for { 921 _ = v.Args[1] 922 x := v.Args[0] 923 v_1 := v.Args[1] 924 if v_1.Op != OpAdd16 { 925 break 926 } 927 _ = v_1.Args[1] 928 z := v_1.Args[0] 929 i := v_1.Args[1] 930 if i.Op != OpConst16 { 931 break 932 } 933 t := i.Type 934 if !(z.Op != OpConst16 && x.Op != OpConst16) { 935 break 936 } 937 v.reset(OpAdd16) 938 v.AddArg(i) 939 v0 := b.NewValue0(v.Pos, OpAdd16, t) 940 v0.AddArg(z) 941 v0.AddArg(x) 942 v.AddArg(v0) 943 return true 944 } 945 // match: (Add16 (Sub16 i:(Const16 <t>) z) x) 946 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 947 // result: (Add16 i (Sub16 <t> x z)) 948 for { 949 _ = v.Args[1] 950 v_0 := v.Args[0] 951 if v_0.Op != OpSub16 { 952 break 953 } 954 _ = v_0.Args[1] 955 i := v_0.Args[0] 956 if i.Op != OpConst16 { 957 break 958 } 959 t := i.Type 960 z := v_0.Args[1] 961 x := v.Args[1] 962 if !(z.Op != OpConst16 && x.Op != OpConst16) { 963 break 964 } 965 v.reset(OpAdd16) 966 v.AddArg(i) 967 v0 := b.NewValue0(v.Pos, OpSub16, t) 968 v0.AddArg(x) 969 v0.AddArg(z) 970 v.AddArg(v0) 971 return true 972 } 973 // match: (Add16 x (Sub16 i:(Const16 <t>) z)) 974 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 975 // result: (Add16 i (Sub16 <t> x z)) 976 for { 977 _ = v.Args[1] 978 x := v.Args[0] 979 v_1 := v.Args[1] 980 if v_1.Op != OpSub16 { 981 break 982 } 983 _ = v_1.Args[1] 984 i := v_1.Args[0] 985 if i.Op != OpConst16 { 986 break 987 } 988 t := i.Type 989 z := v_1.Args[1] 990 if !(z.Op != OpConst16 && x.Op != OpConst16) { 991 break 992 } 993 v.reset(OpAdd16) 994 v.AddArg(i) 995 v0 := b.NewValue0(v.Pos, OpSub16, t) 996 v0.AddArg(x) 997 v0.AddArg(z) 998 v.AddArg(v0) 999 return true 1000 } 1001 return false 1002 } 1003 func rewriteValuegeneric_OpAdd16_20(v *Value) bool { 1004 b := v.Block 1005 _ = b 1006 // match: (Add16 x (Sub16 i:(Const16 <t>) z)) 1007 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 1008 // result: (Add16 i (Sub16 <t> x z)) 1009 for { 1010 _ = v.Args[1] 1011 x := v.Args[0] 1012 v_1 := v.Args[1] 1013 if v_1.Op != OpSub16 { 1014 break 1015 } 1016 _ = v_1.Args[1] 1017 i := v_1.Args[0] 1018 if i.Op != OpConst16 { 1019 break 1020 } 1021 t := i.Type 1022 z := v_1.Args[1] 1023 if !(z.Op != OpConst16 && x.Op != OpConst16) { 1024 break 1025 } 1026 v.reset(OpAdd16) 1027 v.AddArg(i) 1028 v0 := b.NewValue0(v.Pos, OpSub16, t) 1029 v0.AddArg(x) 1030 v0.AddArg(z) 1031 v.AddArg(v0) 1032 return true 1033 } 1034 // match: (Add16 (Sub16 i:(Const16 <t>) z) x) 1035 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 1036 // result: (Add16 i (Sub16 <t> x z)) 1037 for { 1038 _ = v.Args[1] 1039 v_0 := v.Args[0] 1040 if v_0.Op != OpSub16 { 1041 break 1042 } 1043 _ = v_0.Args[1] 1044 i := v_0.Args[0] 1045 if i.Op != OpConst16 { 1046 break 1047 } 1048 t := i.Type 1049 z := v_0.Args[1] 1050 x := v.Args[1] 1051 if !(z.Op != OpConst16 && x.Op != OpConst16) { 1052 break 1053 } 1054 v.reset(OpAdd16) 1055 v.AddArg(i) 1056 v0 := b.NewValue0(v.Pos, OpSub16, t) 1057 v0.AddArg(x) 1058 v0.AddArg(z) 1059 v.AddArg(v0) 1060 return true 1061 } 1062 // match: (Add16 (Sub16 z i:(Const16 <t>)) x) 1063 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 1064 // result: (Sub16 (Add16 <t> x z) i) 1065 for { 1066 _ = v.Args[1] 1067 v_0 := v.Args[0] 1068 if v_0.Op != OpSub16 { 1069 break 1070 } 1071 _ = v_0.Args[1] 1072 z := v_0.Args[0] 1073 i := v_0.Args[1] 1074 if i.Op != OpConst16 { 1075 break 1076 } 1077 t := i.Type 1078 x := v.Args[1] 1079 if !(z.Op != OpConst16 && x.Op != OpConst16) { 1080 break 1081 } 1082 v.reset(OpSub16) 1083 v0 := b.NewValue0(v.Pos, OpAdd16, t) 1084 v0.AddArg(x) 1085 v0.AddArg(z) 1086 v.AddArg(v0) 1087 v.AddArg(i) 1088 return true 1089 } 1090 // match: (Add16 x (Sub16 z i:(Const16 <t>))) 1091 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 1092 // result: (Sub16 (Add16 <t> x z) i) 1093 for { 1094 _ = v.Args[1] 1095 x := v.Args[0] 1096 v_1 := v.Args[1] 1097 if v_1.Op != OpSub16 { 1098 break 1099 } 1100 _ = v_1.Args[1] 1101 z := v_1.Args[0] 1102 i := v_1.Args[1] 1103 if i.Op != OpConst16 { 1104 break 1105 } 1106 t := i.Type 1107 if !(z.Op != OpConst16 && x.Op != OpConst16) { 1108 break 1109 } 1110 v.reset(OpSub16) 1111 v0 := b.NewValue0(v.Pos, OpAdd16, t) 1112 v0.AddArg(x) 1113 v0.AddArg(z) 1114 v.AddArg(v0) 1115 v.AddArg(i) 1116 return true 1117 } 1118 // match: (Add16 x (Sub16 z i:(Const16 <t>))) 1119 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 1120 // result: (Sub16 (Add16 <t> x z) i) 1121 for { 1122 _ = v.Args[1] 1123 x := v.Args[0] 1124 v_1 := v.Args[1] 1125 if v_1.Op != OpSub16 { 1126 break 1127 } 1128 _ = v_1.Args[1] 1129 z := v_1.Args[0] 1130 i := v_1.Args[1] 1131 if i.Op != OpConst16 { 1132 break 1133 } 1134 t := i.Type 1135 if !(z.Op != OpConst16 && x.Op != OpConst16) { 1136 break 1137 } 1138 v.reset(OpSub16) 1139 v0 := b.NewValue0(v.Pos, OpAdd16, t) 1140 v0.AddArg(x) 1141 v0.AddArg(z) 1142 v.AddArg(v0) 1143 v.AddArg(i) 1144 return true 1145 } 1146 // match: (Add16 (Sub16 z i:(Const16 <t>)) x) 1147 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 1148 // result: (Sub16 (Add16 <t> x z) i) 1149 for { 1150 _ = v.Args[1] 1151 v_0 := v.Args[0] 1152 if v_0.Op != OpSub16 { 1153 break 1154 } 1155 _ = v_0.Args[1] 1156 z := v_0.Args[0] 1157 i := v_0.Args[1] 1158 if i.Op != OpConst16 { 1159 break 1160 } 1161 t := i.Type 1162 x := v.Args[1] 1163 if !(z.Op != OpConst16 && x.Op != OpConst16) { 1164 break 1165 } 1166 v.reset(OpSub16) 1167 v0 := b.NewValue0(v.Pos, OpAdd16, t) 1168 v0.AddArg(x) 1169 v0.AddArg(z) 1170 v.AddArg(v0) 1171 v.AddArg(i) 1172 return true 1173 } 1174 // match: (Add16 (Const16 <t> [c]) (Add16 (Const16 <t> [d]) x)) 1175 // cond: 1176 // result: (Add16 (Const16 <t> [int64(int16(c+d))]) x) 1177 for { 1178 _ = v.Args[1] 1179 v_0 := v.Args[0] 1180 if v_0.Op != OpConst16 { 1181 break 1182 } 1183 t := v_0.Type 1184 c := v_0.AuxInt 1185 v_1 := v.Args[1] 1186 if v_1.Op != OpAdd16 { 1187 break 1188 } 1189 _ = v_1.Args[1] 1190 v_1_0 := v_1.Args[0] 1191 if v_1_0.Op != OpConst16 { 1192 break 1193 } 1194 if v_1_0.Type != t { 1195 break 1196 } 1197 d := v_1_0.AuxInt 1198 x := v_1.Args[1] 1199 v.reset(OpAdd16) 1200 v0 := b.NewValue0(v.Pos, OpConst16, t) 1201 v0.AuxInt = int64(int16(c + d)) 1202 v.AddArg(v0) 1203 v.AddArg(x) 1204 return true 1205 } 1206 // match: (Add16 (Const16 <t> [c]) (Add16 x (Const16 <t> [d]))) 1207 // cond: 1208 // result: (Add16 (Const16 <t> [int64(int16(c+d))]) x) 1209 for { 1210 _ = v.Args[1] 1211 v_0 := v.Args[0] 1212 if v_0.Op != OpConst16 { 1213 break 1214 } 1215 t := v_0.Type 1216 c := v_0.AuxInt 1217 v_1 := v.Args[1] 1218 if v_1.Op != OpAdd16 { 1219 break 1220 } 1221 _ = v_1.Args[1] 1222 x := v_1.Args[0] 1223 v_1_1 := v_1.Args[1] 1224 if v_1_1.Op != OpConst16 { 1225 break 1226 } 1227 if v_1_1.Type != t { 1228 break 1229 } 1230 d := v_1_1.AuxInt 1231 v.reset(OpAdd16) 1232 v0 := b.NewValue0(v.Pos, OpConst16, t) 1233 v0.AuxInt = int64(int16(c + d)) 1234 v.AddArg(v0) 1235 v.AddArg(x) 1236 return true 1237 } 1238 // match: (Add16 (Add16 (Const16 <t> [d]) x) (Const16 <t> [c])) 1239 // cond: 1240 // result: (Add16 (Const16 <t> [int64(int16(c+d))]) x) 1241 for { 1242 _ = v.Args[1] 1243 v_0 := v.Args[0] 1244 if v_0.Op != OpAdd16 { 1245 break 1246 } 1247 _ = v_0.Args[1] 1248 v_0_0 := v_0.Args[0] 1249 if v_0_0.Op != OpConst16 { 1250 break 1251 } 1252 t := v_0_0.Type 1253 d := v_0_0.AuxInt 1254 x := v_0.Args[1] 1255 v_1 := v.Args[1] 1256 if v_1.Op != OpConst16 { 1257 break 1258 } 1259 if v_1.Type != t { 1260 break 1261 } 1262 c := v_1.AuxInt 1263 v.reset(OpAdd16) 1264 v0 := b.NewValue0(v.Pos, OpConst16, t) 1265 v0.AuxInt = int64(int16(c + d)) 1266 v.AddArg(v0) 1267 v.AddArg(x) 1268 return true 1269 } 1270 // match: (Add16 (Add16 x (Const16 <t> [d])) (Const16 <t> [c])) 1271 // cond: 1272 // result: (Add16 (Const16 <t> [int64(int16(c+d))]) x) 1273 for { 1274 _ = v.Args[1] 1275 v_0 := v.Args[0] 1276 if v_0.Op != OpAdd16 { 1277 break 1278 } 1279 _ = v_0.Args[1] 1280 x := v_0.Args[0] 1281 v_0_1 := v_0.Args[1] 1282 if v_0_1.Op != OpConst16 { 1283 break 1284 } 1285 t := v_0_1.Type 1286 d := v_0_1.AuxInt 1287 v_1 := v.Args[1] 1288 if v_1.Op != OpConst16 { 1289 break 1290 } 1291 if v_1.Type != t { 1292 break 1293 } 1294 c := v_1.AuxInt 1295 v.reset(OpAdd16) 1296 v0 := b.NewValue0(v.Pos, OpConst16, t) 1297 v0.AuxInt = int64(int16(c + d)) 1298 v.AddArg(v0) 1299 v.AddArg(x) 1300 return true 1301 } 1302 return false 1303 } 1304 func rewriteValuegeneric_OpAdd16_30(v *Value) bool { 1305 b := v.Block 1306 _ = b 1307 // match: (Add16 (Const16 <t> [c]) (Sub16 (Const16 <t> [d]) x)) 1308 // cond: 1309 // result: (Sub16 (Const16 <t> [int64(int16(c+d))]) x) 1310 for { 1311 _ = v.Args[1] 1312 v_0 := v.Args[0] 1313 if v_0.Op != OpConst16 { 1314 break 1315 } 1316 t := v_0.Type 1317 c := v_0.AuxInt 1318 v_1 := v.Args[1] 1319 if v_1.Op != OpSub16 { 1320 break 1321 } 1322 _ = v_1.Args[1] 1323 v_1_0 := v_1.Args[0] 1324 if v_1_0.Op != OpConst16 { 1325 break 1326 } 1327 if v_1_0.Type != t { 1328 break 1329 } 1330 d := v_1_0.AuxInt 1331 x := v_1.Args[1] 1332 v.reset(OpSub16) 1333 v0 := b.NewValue0(v.Pos, OpConst16, t) 1334 v0.AuxInt = int64(int16(c + d)) 1335 v.AddArg(v0) 1336 v.AddArg(x) 1337 return true 1338 } 1339 // match: (Add16 (Sub16 (Const16 <t> [d]) x) (Const16 <t> [c])) 1340 // cond: 1341 // result: (Sub16 (Const16 <t> [int64(int16(c+d))]) x) 1342 for { 1343 _ = v.Args[1] 1344 v_0 := v.Args[0] 1345 if v_0.Op != OpSub16 { 1346 break 1347 } 1348 _ = v_0.Args[1] 1349 v_0_0 := v_0.Args[0] 1350 if v_0_0.Op != OpConst16 { 1351 break 1352 } 1353 t := v_0_0.Type 1354 d := v_0_0.AuxInt 1355 x := v_0.Args[1] 1356 v_1 := v.Args[1] 1357 if v_1.Op != OpConst16 { 1358 break 1359 } 1360 if v_1.Type != t { 1361 break 1362 } 1363 c := v_1.AuxInt 1364 v.reset(OpSub16) 1365 v0 := b.NewValue0(v.Pos, OpConst16, t) 1366 v0.AuxInt = int64(int16(c + d)) 1367 v.AddArg(v0) 1368 v.AddArg(x) 1369 return true 1370 } 1371 // match: (Add16 (Const16 <t> [c]) (Sub16 x (Const16 <t> [d]))) 1372 // cond: 1373 // result: (Add16 (Const16 <t> [int64(int16(c-d))]) x) 1374 for { 1375 _ = v.Args[1] 1376 v_0 := v.Args[0] 1377 if v_0.Op != OpConst16 { 1378 break 1379 } 1380 t := v_0.Type 1381 c := v_0.AuxInt 1382 v_1 := v.Args[1] 1383 if v_1.Op != OpSub16 { 1384 break 1385 } 1386 _ = v_1.Args[1] 1387 x := v_1.Args[0] 1388 v_1_1 := v_1.Args[1] 1389 if v_1_1.Op != OpConst16 { 1390 break 1391 } 1392 if v_1_1.Type != t { 1393 break 1394 } 1395 d := v_1_1.AuxInt 1396 v.reset(OpAdd16) 1397 v0 := b.NewValue0(v.Pos, OpConst16, t) 1398 v0.AuxInt = int64(int16(c - d)) 1399 v.AddArg(v0) 1400 v.AddArg(x) 1401 return true 1402 } 1403 // match: (Add16 (Sub16 x (Const16 <t> [d])) (Const16 <t> [c])) 1404 // cond: 1405 // result: (Add16 (Const16 <t> [int64(int16(c-d))]) x) 1406 for { 1407 _ = v.Args[1] 1408 v_0 := v.Args[0] 1409 if v_0.Op != OpSub16 { 1410 break 1411 } 1412 _ = v_0.Args[1] 1413 x := v_0.Args[0] 1414 v_0_1 := v_0.Args[1] 1415 if v_0_1.Op != OpConst16 { 1416 break 1417 } 1418 t := v_0_1.Type 1419 d := v_0_1.AuxInt 1420 v_1 := v.Args[1] 1421 if v_1.Op != OpConst16 { 1422 break 1423 } 1424 if v_1.Type != t { 1425 break 1426 } 1427 c := v_1.AuxInt 1428 v.reset(OpAdd16) 1429 v0 := b.NewValue0(v.Pos, OpConst16, t) 1430 v0.AuxInt = int64(int16(c - d)) 1431 v.AddArg(v0) 1432 v.AddArg(x) 1433 return true 1434 } 1435 return false 1436 } 1437 func rewriteValuegeneric_OpAdd32_0(v *Value) bool { 1438 b := v.Block 1439 _ = b 1440 // match: (Add32 (Const32 [c]) (Const32 [d])) 1441 // cond: 1442 // result: (Const32 [int64(int32(c+d))]) 1443 for { 1444 _ = v.Args[1] 1445 v_0 := v.Args[0] 1446 if v_0.Op != OpConst32 { 1447 break 1448 } 1449 c := v_0.AuxInt 1450 v_1 := v.Args[1] 1451 if v_1.Op != OpConst32 { 1452 break 1453 } 1454 d := v_1.AuxInt 1455 v.reset(OpConst32) 1456 v.AuxInt = int64(int32(c + d)) 1457 return true 1458 } 1459 // match: (Add32 (Const32 [d]) (Const32 [c])) 1460 // cond: 1461 // result: (Const32 [int64(int32(c+d))]) 1462 for { 1463 _ = v.Args[1] 1464 v_0 := v.Args[0] 1465 if v_0.Op != OpConst32 { 1466 break 1467 } 1468 d := v_0.AuxInt 1469 v_1 := v.Args[1] 1470 if v_1.Op != OpConst32 { 1471 break 1472 } 1473 c := v_1.AuxInt 1474 v.reset(OpConst32) 1475 v.AuxInt = int64(int32(c + d)) 1476 return true 1477 } 1478 // match: (Add32 <t> (Mul32 x y) (Mul32 x z)) 1479 // cond: 1480 // result: (Mul32 x (Add32 <t> y z)) 1481 for { 1482 t := v.Type 1483 _ = v.Args[1] 1484 v_0 := v.Args[0] 1485 if v_0.Op != OpMul32 { 1486 break 1487 } 1488 _ = v_0.Args[1] 1489 x := v_0.Args[0] 1490 y := v_0.Args[1] 1491 v_1 := v.Args[1] 1492 if v_1.Op != OpMul32 { 1493 break 1494 } 1495 _ = v_1.Args[1] 1496 if x != v_1.Args[0] { 1497 break 1498 } 1499 z := v_1.Args[1] 1500 v.reset(OpMul32) 1501 v.AddArg(x) 1502 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1503 v0.AddArg(y) 1504 v0.AddArg(z) 1505 v.AddArg(v0) 1506 return true 1507 } 1508 // match: (Add32 <t> (Mul32 y x) (Mul32 x z)) 1509 // cond: 1510 // result: (Mul32 x (Add32 <t> y z)) 1511 for { 1512 t := v.Type 1513 _ = v.Args[1] 1514 v_0 := v.Args[0] 1515 if v_0.Op != OpMul32 { 1516 break 1517 } 1518 _ = v_0.Args[1] 1519 y := v_0.Args[0] 1520 x := v_0.Args[1] 1521 v_1 := v.Args[1] 1522 if v_1.Op != OpMul32 { 1523 break 1524 } 1525 _ = v_1.Args[1] 1526 if x != v_1.Args[0] { 1527 break 1528 } 1529 z := v_1.Args[1] 1530 v.reset(OpMul32) 1531 v.AddArg(x) 1532 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1533 v0.AddArg(y) 1534 v0.AddArg(z) 1535 v.AddArg(v0) 1536 return true 1537 } 1538 // match: (Add32 <t> (Mul32 x y) (Mul32 z x)) 1539 // cond: 1540 // result: (Mul32 x (Add32 <t> y z)) 1541 for { 1542 t := v.Type 1543 _ = v.Args[1] 1544 v_0 := v.Args[0] 1545 if v_0.Op != OpMul32 { 1546 break 1547 } 1548 _ = v_0.Args[1] 1549 x := v_0.Args[0] 1550 y := v_0.Args[1] 1551 v_1 := v.Args[1] 1552 if v_1.Op != OpMul32 { 1553 break 1554 } 1555 _ = v_1.Args[1] 1556 z := v_1.Args[0] 1557 if x != v_1.Args[1] { 1558 break 1559 } 1560 v.reset(OpMul32) 1561 v.AddArg(x) 1562 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1563 v0.AddArg(y) 1564 v0.AddArg(z) 1565 v.AddArg(v0) 1566 return true 1567 } 1568 // match: (Add32 <t> (Mul32 y x) (Mul32 z x)) 1569 // cond: 1570 // result: (Mul32 x (Add32 <t> y z)) 1571 for { 1572 t := v.Type 1573 _ = v.Args[1] 1574 v_0 := v.Args[0] 1575 if v_0.Op != OpMul32 { 1576 break 1577 } 1578 _ = v_0.Args[1] 1579 y := v_0.Args[0] 1580 x := v_0.Args[1] 1581 v_1 := v.Args[1] 1582 if v_1.Op != OpMul32 { 1583 break 1584 } 1585 _ = v_1.Args[1] 1586 z := v_1.Args[0] 1587 if x != v_1.Args[1] { 1588 break 1589 } 1590 v.reset(OpMul32) 1591 v.AddArg(x) 1592 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1593 v0.AddArg(y) 1594 v0.AddArg(z) 1595 v.AddArg(v0) 1596 return true 1597 } 1598 // match: (Add32 <t> (Mul32 x z) (Mul32 x y)) 1599 // cond: 1600 // result: (Mul32 x (Add32 <t> y z)) 1601 for { 1602 t := v.Type 1603 _ = v.Args[1] 1604 v_0 := v.Args[0] 1605 if v_0.Op != OpMul32 { 1606 break 1607 } 1608 _ = v_0.Args[1] 1609 x := v_0.Args[0] 1610 z := v_0.Args[1] 1611 v_1 := v.Args[1] 1612 if v_1.Op != OpMul32 { 1613 break 1614 } 1615 _ = v_1.Args[1] 1616 if x != v_1.Args[0] { 1617 break 1618 } 1619 y := v_1.Args[1] 1620 v.reset(OpMul32) 1621 v.AddArg(x) 1622 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1623 v0.AddArg(y) 1624 v0.AddArg(z) 1625 v.AddArg(v0) 1626 return true 1627 } 1628 // match: (Add32 <t> (Mul32 z x) (Mul32 x y)) 1629 // cond: 1630 // result: (Mul32 x (Add32 <t> y z)) 1631 for { 1632 t := v.Type 1633 _ = v.Args[1] 1634 v_0 := v.Args[0] 1635 if v_0.Op != OpMul32 { 1636 break 1637 } 1638 _ = v_0.Args[1] 1639 z := v_0.Args[0] 1640 x := v_0.Args[1] 1641 v_1 := v.Args[1] 1642 if v_1.Op != OpMul32 { 1643 break 1644 } 1645 _ = v_1.Args[1] 1646 if x != v_1.Args[0] { 1647 break 1648 } 1649 y := v_1.Args[1] 1650 v.reset(OpMul32) 1651 v.AddArg(x) 1652 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1653 v0.AddArg(y) 1654 v0.AddArg(z) 1655 v.AddArg(v0) 1656 return true 1657 } 1658 // match: (Add32 <t> (Mul32 x z) (Mul32 y x)) 1659 // cond: 1660 // result: (Mul32 x (Add32 <t> y z)) 1661 for { 1662 t := v.Type 1663 _ = v.Args[1] 1664 v_0 := v.Args[0] 1665 if v_0.Op != OpMul32 { 1666 break 1667 } 1668 _ = v_0.Args[1] 1669 x := v_0.Args[0] 1670 z := v_0.Args[1] 1671 v_1 := v.Args[1] 1672 if v_1.Op != OpMul32 { 1673 break 1674 } 1675 _ = v_1.Args[1] 1676 y := v_1.Args[0] 1677 if x != v_1.Args[1] { 1678 break 1679 } 1680 v.reset(OpMul32) 1681 v.AddArg(x) 1682 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1683 v0.AddArg(y) 1684 v0.AddArg(z) 1685 v.AddArg(v0) 1686 return true 1687 } 1688 // match: (Add32 <t> (Mul32 z x) (Mul32 y x)) 1689 // cond: 1690 // result: (Mul32 x (Add32 <t> y z)) 1691 for { 1692 t := v.Type 1693 _ = v.Args[1] 1694 v_0 := v.Args[0] 1695 if v_0.Op != OpMul32 { 1696 break 1697 } 1698 _ = v_0.Args[1] 1699 z := v_0.Args[0] 1700 x := v_0.Args[1] 1701 v_1 := v.Args[1] 1702 if v_1.Op != OpMul32 { 1703 break 1704 } 1705 _ = v_1.Args[1] 1706 y := v_1.Args[0] 1707 if x != v_1.Args[1] { 1708 break 1709 } 1710 v.reset(OpMul32) 1711 v.AddArg(x) 1712 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1713 v0.AddArg(y) 1714 v0.AddArg(z) 1715 v.AddArg(v0) 1716 return true 1717 } 1718 return false 1719 } 1720 func rewriteValuegeneric_OpAdd32_10(v *Value) bool { 1721 b := v.Block 1722 _ = b 1723 // match: (Add32 (Const32 [0]) x) 1724 // cond: 1725 // result: x 1726 for { 1727 _ = v.Args[1] 1728 v_0 := v.Args[0] 1729 if v_0.Op != OpConst32 { 1730 break 1731 } 1732 if v_0.AuxInt != 0 { 1733 break 1734 } 1735 x := v.Args[1] 1736 v.reset(OpCopy) 1737 v.Type = x.Type 1738 v.AddArg(x) 1739 return true 1740 } 1741 // match: (Add32 x (Const32 [0])) 1742 // cond: 1743 // result: x 1744 for { 1745 _ = v.Args[1] 1746 x := v.Args[0] 1747 v_1 := v.Args[1] 1748 if v_1.Op != OpConst32 { 1749 break 1750 } 1751 if v_1.AuxInt != 0 { 1752 break 1753 } 1754 v.reset(OpCopy) 1755 v.Type = x.Type 1756 v.AddArg(x) 1757 return true 1758 } 1759 // match: (Add32 (Const32 [1]) (Com32 x)) 1760 // cond: 1761 // result: (Neg32 x) 1762 for { 1763 _ = v.Args[1] 1764 v_0 := v.Args[0] 1765 if v_0.Op != OpConst32 { 1766 break 1767 } 1768 if v_0.AuxInt != 1 { 1769 break 1770 } 1771 v_1 := v.Args[1] 1772 if v_1.Op != OpCom32 { 1773 break 1774 } 1775 x := v_1.Args[0] 1776 v.reset(OpNeg32) 1777 v.AddArg(x) 1778 return true 1779 } 1780 // match: (Add32 (Com32 x) (Const32 [1])) 1781 // cond: 1782 // result: (Neg32 x) 1783 for { 1784 _ = v.Args[1] 1785 v_0 := v.Args[0] 1786 if v_0.Op != OpCom32 { 1787 break 1788 } 1789 x := v_0.Args[0] 1790 v_1 := v.Args[1] 1791 if v_1.Op != OpConst32 { 1792 break 1793 } 1794 if v_1.AuxInt != 1 { 1795 break 1796 } 1797 v.reset(OpNeg32) 1798 v.AddArg(x) 1799 return true 1800 } 1801 // match: (Add32 (Add32 i:(Const32 <t>) z) x) 1802 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1803 // result: (Add32 i (Add32 <t> z x)) 1804 for { 1805 _ = v.Args[1] 1806 v_0 := v.Args[0] 1807 if v_0.Op != OpAdd32 { 1808 break 1809 } 1810 _ = v_0.Args[1] 1811 i := v_0.Args[0] 1812 if i.Op != OpConst32 { 1813 break 1814 } 1815 t := i.Type 1816 z := v_0.Args[1] 1817 x := v.Args[1] 1818 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1819 break 1820 } 1821 v.reset(OpAdd32) 1822 v.AddArg(i) 1823 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1824 v0.AddArg(z) 1825 v0.AddArg(x) 1826 v.AddArg(v0) 1827 return true 1828 } 1829 // match: (Add32 (Add32 z i:(Const32 <t>)) x) 1830 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1831 // result: (Add32 i (Add32 <t> z x)) 1832 for { 1833 _ = v.Args[1] 1834 v_0 := v.Args[0] 1835 if v_0.Op != OpAdd32 { 1836 break 1837 } 1838 _ = v_0.Args[1] 1839 z := v_0.Args[0] 1840 i := v_0.Args[1] 1841 if i.Op != OpConst32 { 1842 break 1843 } 1844 t := i.Type 1845 x := v.Args[1] 1846 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1847 break 1848 } 1849 v.reset(OpAdd32) 1850 v.AddArg(i) 1851 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1852 v0.AddArg(z) 1853 v0.AddArg(x) 1854 v.AddArg(v0) 1855 return true 1856 } 1857 // match: (Add32 x (Add32 i:(Const32 <t>) z)) 1858 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1859 // result: (Add32 i (Add32 <t> z x)) 1860 for { 1861 _ = v.Args[1] 1862 x := v.Args[0] 1863 v_1 := v.Args[1] 1864 if v_1.Op != OpAdd32 { 1865 break 1866 } 1867 _ = v_1.Args[1] 1868 i := v_1.Args[0] 1869 if i.Op != OpConst32 { 1870 break 1871 } 1872 t := i.Type 1873 z := v_1.Args[1] 1874 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1875 break 1876 } 1877 v.reset(OpAdd32) 1878 v.AddArg(i) 1879 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1880 v0.AddArg(z) 1881 v0.AddArg(x) 1882 v.AddArg(v0) 1883 return true 1884 } 1885 // match: (Add32 x (Add32 z i:(Const32 <t>))) 1886 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1887 // result: (Add32 i (Add32 <t> z x)) 1888 for { 1889 _ = v.Args[1] 1890 x := v.Args[0] 1891 v_1 := v.Args[1] 1892 if v_1.Op != OpAdd32 { 1893 break 1894 } 1895 _ = v_1.Args[1] 1896 z := v_1.Args[0] 1897 i := v_1.Args[1] 1898 if i.Op != OpConst32 { 1899 break 1900 } 1901 t := i.Type 1902 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1903 break 1904 } 1905 v.reset(OpAdd32) 1906 v.AddArg(i) 1907 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1908 v0.AddArg(z) 1909 v0.AddArg(x) 1910 v.AddArg(v0) 1911 return true 1912 } 1913 // match: (Add32 (Sub32 i:(Const32 <t>) z) x) 1914 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1915 // result: (Add32 i (Sub32 <t> x z)) 1916 for { 1917 _ = v.Args[1] 1918 v_0 := v.Args[0] 1919 if v_0.Op != OpSub32 { 1920 break 1921 } 1922 _ = v_0.Args[1] 1923 i := v_0.Args[0] 1924 if i.Op != OpConst32 { 1925 break 1926 } 1927 t := i.Type 1928 z := v_0.Args[1] 1929 x := v.Args[1] 1930 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1931 break 1932 } 1933 v.reset(OpAdd32) 1934 v.AddArg(i) 1935 v0 := b.NewValue0(v.Pos, OpSub32, t) 1936 v0.AddArg(x) 1937 v0.AddArg(z) 1938 v.AddArg(v0) 1939 return true 1940 } 1941 // match: (Add32 x (Sub32 i:(Const32 <t>) z)) 1942 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1943 // result: (Add32 i (Sub32 <t> x z)) 1944 for { 1945 _ = v.Args[1] 1946 x := v.Args[0] 1947 v_1 := v.Args[1] 1948 if v_1.Op != OpSub32 { 1949 break 1950 } 1951 _ = v_1.Args[1] 1952 i := v_1.Args[0] 1953 if i.Op != OpConst32 { 1954 break 1955 } 1956 t := i.Type 1957 z := v_1.Args[1] 1958 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1959 break 1960 } 1961 v.reset(OpAdd32) 1962 v.AddArg(i) 1963 v0 := b.NewValue0(v.Pos, OpSub32, t) 1964 v0.AddArg(x) 1965 v0.AddArg(z) 1966 v.AddArg(v0) 1967 return true 1968 } 1969 return false 1970 } 1971 func rewriteValuegeneric_OpAdd32_20(v *Value) bool { 1972 b := v.Block 1973 _ = b 1974 // match: (Add32 x (Sub32 i:(Const32 <t>) z)) 1975 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1976 // result: (Add32 i (Sub32 <t> x z)) 1977 for { 1978 _ = v.Args[1] 1979 x := v.Args[0] 1980 v_1 := v.Args[1] 1981 if v_1.Op != OpSub32 { 1982 break 1983 } 1984 _ = v_1.Args[1] 1985 i := v_1.Args[0] 1986 if i.Op != OpConst32 { 1987 break 1988 } 1989 t := i.Type 1990 z := v_1.Args[1] 1991 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1992 break 1993 } 1994 v.reset(OpAdd32) 1995 v.AddArg(i) 1996 v0 := b.NewValue0(v.Pos, OpSub32, t) 1997 v0.AddArg(x) 1998 v0.AddArg(z) 1999 v.AddArg(v0) 2000 return true 2001 } 2002 // match: (Add32 (Sub32 i:(Const32 <t>) z) x) 2003 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 2004 // result: (Add32 i (Sub32 <t> x z)) 2005 for { 2006 _ = v.Args[1] 2007 v_0 := v.Args[0] 2008 if v_0.Op != OpSub32 { 2009 break 2010 } 2011 _ = v_0.Args[1] 2012 i := v_0.Args[0] 2013 if i.Op != OpConst32 { 2014 break 2015 } 2016 t := i.Type 2017 z := v_0.Args[1] 2018 x := v.Args[1] 2019 if !(z.Op != OpConst32 && x.Op != OpConst32) { 2020 break 2021 } 2022 v.reset(OpAdd32) 2023 v.AddArg(i) 2024 v0 := b.NewValue0(v.Pos, OpSub32, t) 2025 v0.AddArg(x) 2026 v0.AddArg(z) 2027 v.AddArg(v0) 2028 return true 2029 } 2030 // match: (Add32 (Sub32 z i:(Const32 <t>)) x) 2031 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 2032 // result: (Sub32 (Add32 <t> x z) i) 2033 for { 2034 _ = v.Args[1] 2035 v_0 := v.Args[0] 2036 if v_0.Op != OpSub32 { 2037 break 2038 } 2039 _ = v_0.Args[1] 2040 z := v_0.Args[0] 2041 i := v_0.Args[1] 2042 if i.Op != OpConst32 { 2043 break 2044 } 2045 t := i.Type 2046 x := v.Args[1] 2047 if !(z.Op != OpConst32 && x.Op != OpConst32) { 2048 break 2049 } 2050 v.reset(OpSub32) 2051 v0 := b.NewValue0(v.Pos, OpAdd32, t) 2052 v0.AddArg(x) 2053 v0.AddArg(z) 2054 v.AddArg(v0) 2055 v.AddArg(i) 2056 return true 2057 } 2058 // match: (Add32 x (Sub32 z i:(Const32 <t>))) 2059 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 2060 // result: (Sub32 (Add32 <t> x z) i) 2061 for { 2062 _ = v.Args[1] 2063 x := v.Args[0] 2064 v_1 := v.Args[1] 2065 if v_1.Op != OpSub32 { 2066 break 2067 } 2068 _ = v_1.Args[1] 2069 z := v_1.Args[0] 2070 i := v_1.Args[1] 2071 if i.Op != OpConst32 { 2072 break 2073 } 2074 t := i.Type 2075 if !(z.Op != OpConst32 && x.Op != OpConst32) { 2076 break 2077 } 2078 v.reset(OpSub32) 2079 v0 := b.NewValue0(v.Pos, OpAdd32, t) 2080 v0.AddArg(x) 2081 v0.AddArg(z) 2082 v.AddArg(v0) 2083 v.AddArg(i) 2084 return true 2085 } 2086 // match: (Add32 x (Sub32 z i:(Const32 <t>))) 2087 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 2088 // result: (Sub32 (Add32 <t> x z) i) 2089 for { 2090 _ = v.Args[1] 2091 x := v.Args[0] 2092 v_1 := v.Args[1] 2093 if v_1.Op != OpSub32 { 2094 break 2095 } 2096 _ = v_1.Args[1] 2097 z := v_1.Args[0] 2098 i := v_1.Args[1] 2099 if i.Op != OpConst32 { 2100 break 2101 } 2102 t := i.Type 2103 if !(z.Op != OpConst32 && x.Op != OpConst32) { 2104 break 2105 } 2106 v.reset(OpSub32) 2107 v0 := b.NewValue0(v.Pos, OpAdd32, t) 2108 v0.AddArg(x) 2109 v0.AddArg(z) 2110 v.AddArg(v0) 2111 v.AddArg(i) 2112 return true 2113 } 2114 // match: (Add32 (Sub32 z i:(Const32 <t>)) x) 2115 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 2116 // result: (Sub32 (Add32 <t> x z) i) 2117 for { 2118 _ = v.Args[1] 2119 v_0 := v.Args[0] 2120 if v_0.Op != OpSub32 { 2121 break 2122 } 2123 _ = v_0.Args[1] 2124 z := v_0.Args[0] 2125 i := v_0.Args[1] 2126 if i.Op != OpConst32 { 2127 break 2128 } 2129 t := i.Type 2130 x := v.Args[1] 2131 if !(z.Op != OpConst32 && x.Op != OpConst32) { 2132 break 2133 } 2134 v.reset(OpSub32) 2135 v0 := b.NewValue0(v.Pos, OpAdd32, t) 2136 v0.AddArg(x) 2137 v0.AddArg(z) 2138 v.AddArg(v0) 2139 v.AddArg(i) 2140 return true 2141 } 2142 // match: (Add32 (Const32 <t> [c]) (Add32 (Const32 <t> [d]) x)) 2143 // cond: 2144 // result: (Add32 (Const32 <t> [int64(int32(c+d))]) x) 2145 for { 2146 _ = v.Args[1] 2147 v_0 := v.Args[0] 2148 if v_0.Op != OpConst32 { 2149 break 2150 } 2151 t := v_0.Type 2152 c := v_0.AuxInt 2153 v_1 := v.Args[1] 2154 if v_1.Op != OpAdd32 { 2155 break 2156 } 2157 _ = v_1.Args[1] 2158 v_1_0 := v_1.Args[0] 2159 if v_1_0.Op != OpConst32 { 2160 break 2161 } 2162 if v_1_0.Type != t { 2163 break 2164 } 2165 d := v_1_0.AuxInt 2166 x := v_1.Args[1] 2167 v.reset(OpAdd32) 2168 v0 := b.NewValue0(v.Pos, OpConst32, t) 2169 v0.AuxInt = int64(int32(c + d)) 2170 v.AddArg(v0) 2171 v.AddArg(x) 2172 return true 2173 } 2174 // match: (Add32 (Const32 <t> [c]) (Add32 x (Const32 <t> [d]))) 2175 // cond: 2176 // result: (Add32 (Const32 <t> [int64(int32(c+d))]) x) 2177 for { 2178 _ = v.Args[1] 2179 v_0 := v.Args[0] 2180 if v_0.Op != OpConst32 { 2181 break 2182 } 2183 t := v_0.Type 2184 c := v_0.AuxInt 2185 v_1 := v.Args[1] 2186 if v_1.Op != OpAdd32 { 2187 break 2188 } 2189 _ = v_1.Args[1] 2190 x := v_1.Args[0] 2191 v_1_1 := v_1.Args[1] 2192 if v_1_1.Op != OpConst32 { 2193 break 2194 } 2195 if v_1_1.Type != t { 2196 break 2197 } 2198 d := v_1_1.AuxInt 2199 v.reset(OpAdd32) 2200 v0 := b.NewValue0(v.Pos, OpConst32, t) 2201 v0.AuxInt = int64(int32(c + d)) 2202 v.AddArg(v0) 2203 v.AddArg(x) 2204 return true 2205 } 2206 // match: (Add32 (Add32 (Const32 <t> [d]) x) (Const32 <t> [c])) 2207 // cond: 2208 // result: (Add32 (Const32 <t> [int64(int32(c+d))]) x) 2209 for { 2210 _ = v.Args[1] 2211 v_0 := v.Args[0] 2212 if v_0.Op != OpAdd32 { 2213 break 2214 } 2215 _ = v_0.Args[1] 2216 v_0_0 := v_0.Args[0] 2217 if v_0_0.Op != OpConst32 { 2218 break 2219 } 2220 t := v_0_0.Type 2221 d := v_0_0.AuxInt 2222 x := v_0.Args[1] 2223 v_1 := v.Args[1] 2224 if v_1.Op != OpConst32 { 2225 break 2226 } 2227 if v_1.Type != t { 2228 break 2229 } 2230 c := v_1.AuxInt 2231 v.reset(OpAdd32) 2232 v0 := b.NewValue0(v.Pos, OpConst32, t) 2233 v0.AuxInt = int64(int32(c + d)) 2234 v.AddArg(v0) 2235 v.AddArg(x) 2236 return true 2237 } 2238 // match: (Add32 (Add32 x (Const32 <t> [d])) (Const32 <t> [c])) 2239 // cond: 2240 // result: (Add32 (Const32 <t> [int64(int32(c+d))]) x) 2241 for { 2242 _ = v.Args[1] 2243 v_0 := v.Args[0] 2244 if v_0.Op != OpAdd32 { 2245 break 2246 } 2247 _ = v_0.Args[1] 2248 x := v_0.Args[0] 2249 v_0_1 := v_0.Args[1] 2250 if v_0_1.Op != OpConst32 { 2251 break 2252 } 2253 t := v_0_1.Type 2254 d := v_0_1.AuxInt 2255 v_1 := v.Args[1] 2256 if v_1.Op != OpConst32 { 2257 break 2258 } 2259 if v_1.Type != t { 2260 break 2261 } 2262 c := v_1.AuxInt 2263 v.reset(OpAdd32) 2264 v0 := b.NewValue0(v.Pos, OpConst32, t) 2265 v0.AuxInt = int64(int32(c + d)) 2266 v.AddArg(v0) 2267 v.AddArg(x) 2268 return true 2269 } 2270 return false 2271 } 2272 func rewriteValuegeneric_OpAdd32_30(v *Value) bool { 2273 b := v.Block 2274 _ = b 2275 // match: (Add32 (Const32 <t> [c]) (Sub32 (Const32 <t> [d]) x)) 2276 // cond: 2277 // result: (Sub32 (Const32 <t> [int64(int32(c+d))]) x) 2278 for { 2279 _ = v.Args[1] 2280 v_0 := v.Args[0] 2281 if v_0.Op != OpConst32 { 2282 break 2283 } 2284 t := v_0.Type 2285 c := v_0.AuxInt 2286 v_1 := v.Args[1] 2287 if v_1.Op != OpSub32 { 2288 break 2289 } 2290 _ = v_1.Args[1] 2291 v_1_0 := v_1.Args[0] 2292 if v_1_0.Op != OpConst32 { 2293 break 2294 } 2295 if v_1_0.Type != t { 2296 break 2297 } 2298 d := v_1_0.AuxInt 2299 x := v_1.Args[1] 2300 v.reset(OpSub32) 2301 v0 := b.NewValue0(v.Pos, OpConst32, t) 2302 v0.AuxInt = int64(int32(c + d)) 2303 v.AddArg(v0) 2304 v.AddArg(x) 2305 return true 2306 } 2307 // match: (Add32 (Sub32 (Const32 <t> [d]) x) (Const32 <t> [c])) 2308 // cond: 2309 // result: (Sub32 (Const32 <t> [int64(int32(c+d))]) x) 2310 for { 2311 _ = v.Args[1] 2312 v_0 := v.Args[0] 2313 if v_0.Op != OpSub32 { 2314 break 2315 } 2316 _ = v_0.Args[1] 2317 v_0_0 := v_0.Args[0] 2318 if v_0_0.Op != OpConst32 { 2319 break 2320 } 2321 t := v_0_0.Type 2322 d := v_0_0.AuxInt 2323 x := v_0.Args[1] 2324 v_1 := v.Args[1] 2325 if v_1.Op != OpConst32 { 2326 break 2327 } 2328 if v_1.Type != t { 2329 break 2330 } 2331 c := v_1.AuxInt 2332 v.reset(OpSub32) 2333 v0 := b.NewValue0(v.Pos, OpConst32, t) 2334 v0.AuxInt = int64(int32(c + d)) 2335 v.AddArg(v0) 2336 v.AddArg(x) 2337 return true 2338 } 2339 // match: (Add32 (Const32 <t> [c]) (Sub32 x (Const32 <t> [d]))) 2340 // cond: 2341 // result: (Add32 (Const32 <t> [int64(int32(c-d))]) x) 2342 for { 2343 _ = v.Args[1] 2344 v_0 := v.Args[0] 2345 if v_0.Op != OpConst32 { 2346 break 2347 } 2348 t := v_0.Type 2349 c := v_0.AuxInt 2350 v_1 := v.Args[1] 2351 if v_1.Op != OpSub32 { 2352 break 2353 } 2354 _ = v_1.Args[1] 2355 x := v_1.Args[0] 2356 v_1_1 := v_1.Args[1] 2357 if v_1_1.Op != OpConst32 { 2358 break 2359 } 2360 if v_1_1.Type != t { 2361 break 2362 } 2363 d := v_1_1.AuxInt 2364 v.reset(OpAdd32) 2365 v0 := b.NewValue0(v.Pos, OpConst32, t) 2366 v0.AuxInt = int64(int32(c - d)) 2367 v.AddArg(v0) 2368 v.AddArg(x) 2369 return true 2370 } 2371 // match: (Add32 (Sub32 x (Const32 <t> [d])) (Const32 <t> [c])) 2372 // cond: 2373 // result: (Add32 (Const32 <t> [int64(int32(c-d))]) x) 2374 for { 2375 _ = v.Args[1] 2376 v_0 := v.Args[0] 2377 if v_0.Op != OpSub32 { 2378 break 2379 } 2380 _ = v_0.Args[1] 2381 x := v_0.Args[0] 2382 v_0_1 := v_0.Args[1] 2383 if v_0_1.Op != OpConst32 { 2384 break 2385 } 2386 t := v_0_1.Type 2387 d := v_0_1.AuxInt 2388 v_1 := v.Args[1] 2389 if v_1.Op != OpConst32 { 2390 break 2391 } 2392 if v_1.Type != t { 2393 break 2394 } 2395 c := v_1.AuxInt 2396 v.reset(OpAdd32) 2397 v0 := b.NewValue0(v.Pos, OpConst32, t) 2398 v0.AuxInt = int64(int32(c - d)) 2399 v.AddArg(v0) 2400 v.AddArg(x) 2401 return true 2402 } 2403 return false 2404 } 2405 func rewriteValuegeneric_OpAdd32F_0(v *Value) bool { 2406 // match: (Add32F (Const32F [c]) (Const32F [d])) 2407 // cond: 2408 // result: (Const32F [f2i(float64(i2f32(c) + i2f32(d)))]) 2409 for { 2410 _ = v.Args[1] 2411 v_0 := v.Args[0] 2412 if v_0.Op != OpConst32F { 2413 break 2414 } 2415 c := v_0.AuxInt 2416 v_1 := v.Args[1] 2417 if v_1.Op != OpConst32F { 2418 break 2419 } 2420 d := v_1.AuxInt 2421 v.reset(OpConst32F) 2422 v.AuxInt = f2i(float64(i2f32(c) + i2f32(d))) 2423 return true 2424 } 2425 // match: (Add32F (Const32F [d]) (Const32F [c])) 2426 // cond: 2427 // result: (Const32F [f2i(float64(i2f32(c) + i2f32(d)))]) 2428 for { 2429 _ = v.Args[1] 2430 v_0 := v.Args[0] 2431 if v_0.Op != OpConst32F { 2432 break 2433 } 2434 d := v_0.AuxInt 2435 v_1 := v.Args[1] 2436 if v_1.Op != OpConst32F { 2437 break 2438 } 2439 c := v_1.AuxInt 2440 v.reset(OpConst32F) 2441 v.AuxInt = f2i(float64(i2f32(c) + i2f32(d))) 2442 return true 2443 } 2444 // match: (Add32F x (Const32F [0])) 2445 // cond: 2446 // result: x 2447 for { 2448 _ = v.Args[1] 2449 x := v.Args[0] 2450 v_1 := v.Args[1] 2451 if v_1.Op != OpConst32F { 2452 break 2453 } 2454 if v_1.AuxInt != 0 { 2455 break 2456 } 2457 v.reset(OpCopy) 2458 v.Type = x.Type 2459 v.AddArg(x) 2460 return true 2461 } 2462 // match: (Add32F (Const32F [0]) x) 2463 // cond: 2464 // result: x 2465 for { 2466 _ = v.Args[1] 2467 v_0 := v.Args[0] 2468 if v_0.Op != OpConst32F { 2469 break 2470 } 2471 if v_0.AuxInt != 0 { 2472 break 2473 } 2474 x := v.Args[1] 2475 v.reset(OpCopy) 2476 v.Type = x.Type 2477 v.AddArg(x) 2478 return true 2479 } 2480 return false 2481 } 2482 func rewriteValuegeneric_OpAdd64_0(v *Value) bool { 2483 b := v.Block 2484 _ = b 2485 // match: (Add64 (Const64 [c]) (Const64 [d])) 2486 // cond: 2487 // result: (Const64 [c+d]) 2488 for { 2489 _ = v.Args[1] 2490 v_0 := v.Args[0] 2491 if v_0.Op != OpConst64 { 2492 break 2493 } 2494 c := v_0.AuxInt 2495 v_1 := v.Args[1] 2496 if v_1.Op != OpConst64 { 2497 break 2498 } 2499 d := v_1.AuxInt 2500 v.reset(OpConst64) 2501 v.AuxInt = c + d 2502 return true 2503 } 2504 // match: (Add64 (Const64 [d]) (Const64 [c])) 2505 // cond: 2506 // result: (Const64 [c+d]) 2507 for { 2508 _ = v.Args[1] 2509 v_0 := v.Args[0] 2510 if v_0.Op != OpConst64 { 2511 break 2512 } 2513 d := v_0.AuxInt 2514 v_1 := v.Args[1] 2515 if v_1.Op != OpConst64 { 2516 break 2517 } 2518 c := v_1.AuxInt 2519 v.reset(OpConst64) 2520 v.AuxInt = c + d 2521 return true 2522 } 2523 // match: (Add64 <t> (Mul64 x y) (Mul64 x z)) 2524 // cond: 2525 // result: (Mul64 x (Add64 <t> y z)) 2526 for { 2527 t := v.Type 2528 _ = v.Args[1] 2529 v_0 := v.Args[0] 2530 if v_0.Op != OpMul64 { 2531 break 2532 } 2533 _ = v_0.Args[1] 2534 x := v_0.Args[0] 2535 y := v_0.Args[1] 2536 v_1 := v.Args[1] 2537 if v_1.Op != OpMul64 { 2538 break 2539 } 2540 _ = v_1.Args[1] 2541 if x != v_1.Args[0] { 2542 break 2543 } 2544 z := v_1.Args[1] 2545 v.reset(OpMul64) 2546 v.AddArg(x) 2547 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2548 v0.AddArg(y) 2549 v0.AddArg(z) 2550 v.AddArg(v0) 2551 return true 2552 } 2553 // match: (Add64 <t> (Mul64 y x) (Mul64 x z)) 2554 // cond: 2555 // result: (Mul64 x (Add64 <t> y z)) 2556 for { 2557 t := v.Type 2558 _ = v.Args[1] 2559 v_0 := v.Args[0] 2560 if v_0.Op != OpMul64 { 2561 break 2562 } 2563 _ = v_0.Args[1] 2564 y := v_0.Args[0] 2565 x := v_0.Args[1] 2566 v_1 := v.Args[1] 2567 if v_1.Op != OpMul64 { 2568 break 2569 } 2570 _ = v_1.Args[1] 2571 if x != v_1.Args[0] { 2572 break 2573 } 2574 z := v_1.Args[1] 2575 v.reset(OpMul64) 2576 v.AddArg(x) 2577 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2578 v0.AddArg(y) 2579 v0.AddArg(z) 2580 v.AddArg(v0) 2581 return true 2582 } 2583 // match: (Add64 <t> (Mul64 x y) (Mul64 z x)) 2584 // cond: 2585 // result: (Mul64 x (Add64 <t> y z)) 2586 for { 2587 t := v.Type 2588 _ = v.Args[1] 2589 v_0 := v.Args[0] 2590 if v_0.Op != OpMul64 { 2591 break 2592 } 2593 _ = v_0.Args[1] 2594 x := v_0.Args[0] 2595 y := v_0.Args[1] 2596 v_1 := v.Args[1] 2597 if v_1.Op != OpMul64 { 2598 break 2599 } 2600 _ = v_1.Args[1] 2601 z := v_1.Args[0] 2602 if x != v_1.Args[1] { 2603 break 2604 } 2605 v.reset(OpMul64) 2606 v.AddArg(x) 2607 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2608 v0.AddArg(y) 2609 v0.AddArg(z) 2610 v.AddArg(v0) 2611 return true 2612 } 2613 // match: (Add64 <t> (Mul64 y x) (Mul64 z x)) 2614 // cond: 2615 // result: (Mul64 x (Add64 <t> y z)) 2616 for { 2617 t := v.Type 2618 _ = v.Args[1] 2619 v_0 := v.Args[0] 2620 if v_0.Op != OpMul64 { 2621 break 2622 } 2623 _ = v_0.Args[1] 2624 y := v_0.Args[0] 2625 x := v_0.Args[1] 2626 v_1 := v.Args[1] 2627 if v_1.Op != OpMul64 { 2628 break 2629 } 2630 _ = v_1.Args[1] 2631 z := v_1.Args[0] 2632 if x != v_1.Args[1] { 2633 break 2634 } 2635 v.reset(OpMul64) 2636 v.AddArg(x) 2637 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2638 v0.AddArg(y) 2639 v0.AddArg(z) 2640 v.AddArg(v0) 2641 return true 2642 } 2643 // match: (Add64 <t> (Mul64 x z) (Mul64 x y)) 2644 // cond: 2645 // result: (Mul64 x (Add64 <t> y z)) 2646 for { 2647 t := v.Type 2648 _ = v.Args[1] 2649 v_0 := v.Args[0] 2650 if v_0.Op != OpMul64 { 2651 break 2652 } 2653 _ = v_0.Args[1] 2654 x := v_0.Args[0] 2655 z := v_0.Args[1] 2656 v_1 := v.Args[1] 2657 if v_1.Op != OpMul64 { 2658 break 2659 } 2660 _ = v_1.Args[1] 2661 if x != v_1.Args[0] { 2662 break 2663 } 2664 y := v_1.Args[1] 2665 v.reset(OpMul64) 2666 v.AddArg(x) 2667 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2668 v0.AddArg(y) 2669 v0.AddArg(z) 2670 v.AddArg(v0) 2671 return true 2672 } 2673 // match: (Add64 <t> (Mul64 z x) (Mul64 x y)) 2674 // cond: 2675 // result: (Mul64 x (Add64 <t> y z)) 2676 for { 2677 t := v.Type 2678 _ = v.Args[1] 2679 v_0 := v.Args[0] 2680 if v_0.Op != OpMul64 { 2681 break 2682 } 2683 _ = v_0.Args[1] 2684 z := v_0.Args[0] 2685 x := v_0.Args[1] 2686 v_1 := v.Args[1] 2687 if v_1.Op != OpMul64 { 2688 break 2689 } 2690 _ = v_1.Args[1] 2691 if x != v_1.Args[0] { 2692 break 2693 } 2694 y := v_1.Args[1] 2695 v.reset(OpMul64) 2696 v.AddArg(x) 2697 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2698 v0.AddArg(y) 2699 v0.AddArg(z) 2700 v.AddArg(v0) 2701 return true 2702 } 2703 // match: (Add64 <t> (Mul64 x z) (Mul64 y x)) 2704 // cond: 2705 // result: (Mul64 x (Add64 <t> y z)) 2706 for { 2707 t := v.Type 2708 _ = v.Args[1] 2709 v_0 := v.Args[0] 2710 if v_0.Op != OpMul64 { 2711 break 2712 } 2713 _ = v_0.Args[1] 2714 x := v_0.Args[0] 2715 z := v_0.Args[1] 2716 v_1 := v.Args[1] 2717 if v_1.Op != OpMul64 { 2718 break 2719 } 2720 _ = v_1.Args[1] 2721 y := v_1.Args[0] 2722 if x != v_1.Args[1] { 2723 break 2724 } 2725 v.reset(OpMul64) 2726 v.AddArg(x) 2727 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2728 v0.AddArg(y) 2729 v0.AddArg(z) 2730 v.AddArg(v0) 2731 return true 2732 } 2733 // match: (Add64 <t> (Mul64 z x) (Mul64 y x)) 2734 // cond: 2735 // result: (Mul64 x (Add64 <t> y z)) 2736 for { 2737 t := v.Type 2738 _ = v.Args[1] 2739 v_0 := v.Args[0] 2740 if v_0.Op != OpMul64 { 2741 break 2742 } 2743 _ = v_0.Args[1] 2744 z := v_0.Args[0] 2745 x := v_0.Args[1] 2746 v_1 := v.Args[1] 2747 if v_1.Op != OpMul64 { 2748 break 2749 } 2750 _ = v_1.Args[1] 2751 y := v_1.Args[0] 2752 if x != v_1.Args[1] { 2753 break 2754 } 2755 v.reset(OpMul64) 2756 v.AddArg(x) 2757 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2758 v0.AddArg(y) 2759 v0.AddArg(z) 2760 v.AddArg(v0) 2761 return true 2762 } 2763 return false 2764 } 2765 func rewriteValuegeneric_OpAdd64_10(v *Value) bool { 2766 b := v.Block 2767 _ = b 2768 // match: (Add64 (Const64 [0]) x) 2769 // cond: 2770 // result: x 2771 for { 2772 _ = v.Args[1] 2773 v_0 := v.Args[0] 2774 if v_0.Op != OpConst64 { 2775 break 2776 } 2777 if v_0.AuxInt != 0 { 2778 break 2779 } 2780 x := v.Args[1] 2781 v.reset(OpCopy) 2782 v.Type = x.Type 2783 v.AddArg(x) 2784 return true 2785 } 2786 // match: (Add64 x (Const64 [0])) 2787 // cond: 2788 // result: x 2789 for { 2790 _ = v.Args[1] 2791 x := v.Args[0] 2792 v_1 := v.Args[1] 2793 if v_1.Op != OpConst64 { 2794 break 2795 } 2796 if v_1.AuxInt != 0 { 2797 break 2798 } 2799 v.reset(OpCopy) 2800 v.Type = x.Type 2801 v.AddArg(x) 2802 return true 2803 } 2804 // match: (Add64 (Const64 [1]) (Com64 x)) 2805 // cond: 2806 // result: (Neg64 x) 2807 for { 2808 _ = v.Args[1] 2809 v_0 := v.Args[0] 2810 if v_0.Op != OpConst64 { 2811 break 2812 } 2813 if v_0.AuxInt != 1 { 2814 break 2815 } 2816 v_1 := v.Args[1] 2817 if v_1.Op != OpCom64 { 2818 break 2819 } 2820 x := v_1.Args[0] 2821 v.reset(OpNeg64) 2822 v.AddArg(x) 2823 return true 2824 } 2825 // match: (Add64 (Com64 x) (Const64 [1])) 2826 // cond: 2827 // result: (Neg64 x) 2828 for { 2829 _ = v.Args[1] 2830 v_0 := v.Args[0] 2831 if v_0.Op != OpCom64 { 2832 break 2833 } 2834 x := v_0.Args[0] 2835 v_1 := v.Args[1] 2836 if v_1.Op != OpConst64 { 2837 break 2838 } 2839 if v_1.AuxInt != 1 { 2840 break 2841 } 2842 v.reset(OpNeg64) 2843 v.AddArg(x) 2844 return true 2845 } 2846 // match: (Add64 (Add64 i:(Const64 <t>) z) x) 2847 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 2848 // result: (Add64 i (Add64 <t> z x)) 2849 for { 2850 _ = v.Args[1] 2851 v_0 := v.Args[0] 2852 if v_0.Op != OpAdd64 { 2853 break 2854 } 2855 _ = v_0.Args[1] 2856 i := v_0.Args[0] 2857 if i.Op != OpConst64 { 2858 break 2859 } 2860 t := i.Type 2861 z := v_0.Args[1] 2862 x := v.Args[1] 2863 if !(z.Op != OpConst64 && x.Op != OpConst64) { 2864 break 2865 } 2866 v.reset(OpAdd64) 2867 v.AddArg(i) 2868 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2869 v0.AddArg(z) 2870 v0.AddArg(x) 2871 v.AddArg(v0) 2872 return true 2873 } 2874 // match: (Add64 (Add64 z i:(Const64 <t>)) x) 2875 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 2876 // result: (Add64 i (Add64 <t> z x)) 2877 for { 2878 _ = v.Args[1] 2879 v_0 := v.Args[0] 2880 if v_0.Op != OpAdd64 { 2881 break 2882 } 2883 _ = v_0.Args[1] 2884 z := v_0.Args[0] 2885 i := v_0.Args[1] 2886 if i.Op != OpConst64 { 2887 break 2888 } 2889 t := i.Type 2890 x := v.Args[1] 2891 if !(z.Op != OpConst64 && x.Op != OpConst64) { 2892 break 2893 } 2894 v.reset(OpAdd64) 2895 v.AddArg(i) 2896 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2897 v0.AddArg(z) 2898 v0.AddArg(x) 2899 v.AddArg(v0) 2900 return true 2901 } 2902 // match: (Add64 x (Add64 i:(Const64 <t>) z)) 2903 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 2904 // result: (Add64 i (Add64 <t> z x)) 2905 for { 2906 _ = v.Args[1] 2907 x := v.Args[0] 2908 v_1 := v.Args[1] 2909 if v_1.Op != OpAdd64 { 2910 break 2911 } 2912 _ = v_1.Args[1] 2913 i := v_1.Args[0] 2914 if i.Op != OpConst64 { 2915 break 2916 } 2917 t := i.Type 2918 z := v_1.Args[1] 2919 if !(z.Op != OpConst64 && x.Op != OpConst64) { 2920 break 2921 } 2922 v.reset(OpAdd64) 2923 v.AddArg(i) 2924 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2925 v0.AddArg(z) 2926 v0.AddArg(x) 2927 v.AddArg(v0) 2928 return true 2929 } 2930 // match: (Add64 x (Add64 z i:(Const64 <t>))) 2931 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 2932 // result: (Add64 i (Add64 <t> z x)) 2933 for { 2934 _ = v.Args[1] 2935 x := v.Args[0] 2936 v_1 := v.Args[1] 2937 if v_1.Op != OpAdd64 { 2938 break 2939 } 2940 _ = v_1.Args[1] 2941 z := v_1.Args[0] 2942 i := v_1.Args[1] 2943 if i.Op != OpConst64 { 2944 break 2945 } 2946 t := i.Type 2947 if !(z.Op != OpConst64 && x.Op != OpConst64) { 2948 break 2949 } 2950 v.reset(OpAdd64) 2951 v.AddArg(i) 2952 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2953 v0.AddArg(z) 2954 v0.AddArg(x) 2955 v.AddArg(v0) 2956 return true 2957 } 2958 // match: (Add64 (Sub64 i:(Const64 <t>) z) x) 2959 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 2960 // result: (Add64 i (Sub64 <t> x z)) 2961 for { 2962 _ = v.Args[1] 2963 v_0 := v.Args[0] 2964 if v_0.Op != OpSub64 { 2965 break 2966 } 2967 _ = v_0.Args[1] 2968 i := v_0.Args[0] 2969 if i.Op != OpConst64 { 2970 break 2971 } 2972 t := i.Type 2973 z := v_0.Args[1] 2974 x := v.Args[1] 2975 if !(z.Op != OpConst64 && x.Op != OpConst64) { 2976 break 2977 } 2978 v.reset(OpAdd64) 2979 v.AddArg(i) 2980 v0 := b.NewValue0(v.Pos, OpSub64, t) 2981 v0.AddArg(x) 2982 v0.AddArg(z) 2983 v.AddArg(v0) 2984 return true 2985 } 2986 // match: (Add64 x (Sub64 i:(Const64 <t>) z)) 2987 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 2988 // result: (Add64 i (Sub64 <t> x z)) 2989 for { 2990 _ = v.Args[1] 2991 x := v.Args[0] 2992 v_1 := v.Args[1] 2993 if v_1.Op != OpSub64 { 2994 break 2995 } 2996 _ = v_1.Args[1] 2997 i := v_1.Args[0] 2998 if i.Op != OpConst64 { 2999 break 3000 } 3001 t := i.Type 3002 z := v_1.Args[1] 3003 if !(z.Op != OpConst64 && x.Op != OpConst64) { 3004 break 3005 } 3006 v.reset(OpAdd64) 3007 v.AddArg(i) 3008 v0 := b.NewValue0(v.Pos, OpSub64, t) 3009 v0.AddArg(x) 3010 v0.AddArg(z) 3011 v.AddArg(v0) 3012 return true 3013 } 3014 return false 3015 } 3016 func rewriteValuegeneric_OpAdd64_20(v *Value) bool { 3017 b := v.Block 3018 _ = b 3019 // match: (Add64 x (Sub64 i:(Const64 <t>) z)) 3020 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 3021 // result: (Add64 i (Sub64 <t> x z)) 3022 for { 3023 _ = v.Args[1] 3024 x := v.Args[0] 3025 v_1 := v.Args[1] 3026 if v_1.Op != OpSub64 { 3027 break 3028 } 3029 _ = v_1.Args[1] 3030 i := v_1.Args[0] 3031 if i.Op != OpConst64 { 3032 break 3033 } 3034 t := i.Type 3035 z := v_1.Args[1] 3036 if !(z.Op != OpConst64 && x.Op != OpConst64) { 3037 break 3038 } 3039 v.reset(OpAdd64) 3040 v.AddArg(i) 3041 v0 := b.NewValue0(v.Pos, OpSub64, t) 3042 v0.AddArg(x) 3043 v0.AddArg(z) 3044 v.AddArg(v0) 3045 return true 3046 } 3047 // match: (Add64 (Sub64 i:(Const64 <t>) z) x) 3048 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 3049 // result: (Add64 i (Sub64 <t> x z)) 3050 for { 3051 _ = v.Args[1] 3052 v_0 := v.Args[0] 3053 if v_0.Op != OpSub64 { 3054 break 3055 } 3056 _ = v_0.Args[1] 3057 i := v_0.Args[0] 3058 if i.Op != OpConst64 { 3059 break 3060 } 3061 t := i.Type 3062 z := v_0.Args[1] 3063 x := v.Args[1] 3064 if !(z.Op != OpConst64 && x.Op != OpConst64) { 3065 break 3066 } 3067 v.reset(OpAdd64) 3068 v.AddArg(i) 3069 v0 := b.NewValue0(v.Pos, OpSub64, t) 3070 v0.AddArg(x) 3071 v0.AddArg(z) 3072 v.AddArg(v0) 3073 return true 3074 } 3075 // match: (Add64 (Sub64 z i:(Const64 <t>)) x) 3076 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 3077 // result: (Sub64 (Add64 <t> x z) i) 3078 for { 3079 _ = v.Args[1] 3080 v_0 := v.Args[0] 3081 if v_0.Op != OpSub64 { 3082 break 3083 } 3084 _ = v_0.Args[1] 3085 z := v_0.Args[0] 3086 i := v_0.Args[1] 3087 if i.Op != OpConst64 { 3088 break 3089 } 3090 t := i.Type 3091 x := v.Args[1] 3092 if !(z.Op != OpConst64 && x.Op != OpConst64) { 3093 break 3094 } 3095 v.reset(OpSub64) 3096 v0 := b.NewValue0(v.Pos, OpAdd64, t) 3097 v0.AddArg(x) 3098 v0.AddArg(z) 3099 v.AddArg(v0) 3100 v.AddArg(i) 3101 return true 3102 } 3103 // match: (Add64 x (Sub64 z i:(Const64 <t>))) 3104 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 3105 // result: (Sub64 (Add64 <t> x z) i) 3106 for { 3107 _ = v.Args[1] 3108 x := v.Args[0] 3109 v_1 := v.Args[1] 3110 if v_1.Op != OpSub64 { 3111 break 3112 } 3113 _ = v_1.Args[1] 3114 z := v_1.Args[0] 3115 i := v_1.Args[1] 3116 if i.Op != OpConst64 { 3117 break 3118 } 3119 t := i.Type 3120 if !(z.Op != OpConst64 && x.Op != OpConst64) { 3121 break 3122 } 3123 v.reset(OpSub64) 3124 v0 := b.NewValue0(v.Pos, OpAdd64, t) 3125 v0.AddArg(x) 3126 v0.AddArg(z) 3127 v.AddArg(v0) 3128 v.AddArg(i) 3129 return true 3130 } 3131 // match: (Add64 x (Sub64 z i:(Const64 <t>))) 3132 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 3133 // result: (Sub64 (Add64 <t> x z) i) 3134 for { 3135 _ = v.Args[1] 3136 x := v.Args[0] 3137 v_1 := v.Args[1] 3138 if v_1.Op != OpSub64 { 3139 break 3140 } 3141 _ = v_1.Args[1] 3142 z := v_1.Args[0] 3143 i := v_1.Args[1] 3144 if i.Op != OpConst64 { 3145 break 3146 } 3147 t := i.Type 3148 if !(z.Op != OpConst64 && x.Op != OpConst64) { 3149 break 3150 } 3151 v.reset(OpSub64) 3152 v0 := b.NewValue0(v.Pos, OpAdd64, t) 3153 v0.AddArg(x) 3154 v0.AddArg(z) 3155 v.AddArg(v0) 3156 v.AddArg(i) 3157 return true 3158 } 3159 // match: (Add64 (Sub64 z i:(Const64 <t>)) x) 3160 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 3161 // result: (Sub64 (Add64 <t> x z) i) 3162 for { 3163 _ = v.Args[1] 3164 v_0 := v.Args[0] 3165 if v_0.Op != OpSub64 { 3166 break 3167 } 3168 _ = v_0.Args[1] 3169 z := v_0.Args[0] 3170 i := v_0.Args[1] 3171 if i.Op != OpConst64 { 3172 break 3173 } 3174 t := i.Type 3175 x := v.Args[1] 3176 if !(z.Op != OpConst64 && x.Op != OpConst64) { 3177 break 3178 } 3179 v.reset(OpSub64) 3180 v0 := b.NewValue0(v.Pos, OpAdd64, t) 3181 v0.AddArg(x) 3182 v0.AddArg(z) 3183 v.AddArg(v0) 3184 v.AddArg(i) 3185 return true 3186 } 3187 // match: (Add64 (Const64 <t> [c]) (Add64 (Const64 <t> [d]) x)) 3188 // cond: 3189 // result: (Add64 (Const64 <t> [c+d]) x) 3190 for { 3191 _ = v.Args[1] 3192 v_0 := v.Args[0] 3193 if v_0.Op != OpConst64 { 3194 break 3195 } 3196 t := v_0.Type 3197 c := v_0.AuxInt 3198 v_1 := v.Args[1] 3199 if v_1.Op != OpAdd64 { 3200 break 3201 } 3202 _ = v_1.Args[1] 3203 v_1_0 := v_1.Args[0] 3204 if v_1_0.Op != OpConst64 { 3205 break 3206 } 3207 if v_1_0.Type != t { 3208 break 3209 } 3210 d := v_1_0.AuxInt 3211 x := v_1.Args[1] 3212 v.reset(OpAdd64) 3213 v0 := b.NewValue0(v.Pos, OpConst64, t) 3214 v0.AuxInt = c + d 3215 v.AddArg(v0) 3216 v.AddArg(x) 3217 return true 3218 } 3219 // match: (Add64 (Const64 <t> [c]) (Add64 x (Const64 <t> [d]))) 3220 // cond: 3221 // result: (Add64 (Const64 <t> [c+d]) x) 3222 for { 3223 _ = v.Args[1] 3224 v_0 := v.Args[0] 3225 if v_0.Op != OpConst64 { 3226 break 3227 } 3228 t := v_0.Type 3229 c := v_0.AuxInt 3230 v_1 := v.Args[1] 3231 if v_1.Op != OpAdd64 { 3232 break 3233 } 3234 _ = v_1.Args[1] 3235 x := v_1.Args[0] 3236 v_1_1 := v_1.Args[1] 3237 if v_1_1.Op != OpConst64 { 3238 break 3239 } 3240 if v_1_1.Type != t { 3241 break 3242 } 3243 d := v_1_1.AuxInt 3244 v.reset(OpAdd64) 3245 v0 := b.NewValue0(v.Pos, OpConst64, t) 3246 v0.AuxInt = c + d 3247 v.AddArg(v0) 3248 v.AddArg(x) 3249 return true 3250 } 3251 // match: (Add64 (Add64 (Const64 <t> [d]) x) (Const64 <t> [c])) 3252 // cond: 3253 // result: (Add64 (Const64 <t> [c+d]) x) 3254 for { 3255 _ = v.Args[1] 3256 v_0 := v.Args[0] 3257 if v_0.Op != OpAdd64 { 3258 break 3259 } 3260 _ = v_0.Args[1] 3261 v_0_0 := v_0.Args[0] 3262 if v_0_0.Op != OpConst64 { 3263 break 3264 } 3265 t := v_0_0.Type 3266 d := v_0_0.AuxInt 3267 x := v_0.Args[1] 3268 v_1 := v.Args[1] 3269 if v_1.Op != OpConst64 { 3270 break 3271 } 3272 if v_1.Type != t { 3273 break 3274 } 3275 c := v_1.AuxInt 3276 v.reset(OpAdd64) 3277 v0 := b.NewValue0(v.Pos, OpConst64, t) 3278 v0.AuxInt = c + d 3279 v.AddArg(v0) 3280 v.AddArg(x) 3281 return true 3282 } 3283 // match: (Add64 (Add64 x (Const64 <t> [d])) (Const64 <t> [c])) 3284 // cond: 3285 // result: (Add64 (Const64 <t> [c+d]) x) 3286 for { 3287 _ = v.Args[1] 3288 v_0 := v.Args[0] 3289 if v_0.Op != OpAdd64 { 3290 break 3291 } 3292 _ = v_0.Args[1] 3293 x := v_0.Args[0] 3294 v_0_1 := v_0.Args[1] 3295 if v_0_1.Op != OpConst64 { 3296 break 3297 } 3298 t := v_0_1.Type 3299 d := v_0_1.AuxInt 3300 v_1 := v.Args[1] 3301 if v_1.Op != OpConst64 { 3302 break 3303 } 3304 if v_1.Type != t { 3305 break 3306 } 3307 c := v_1.AuxInt 3308 v.reset(OpAdd64) 3309 v0 := b.NewValue0(v.Pos, OpConst64, t) 3310 v0.AuxInt = c + d 3311 v.AddArg(v0) 3312 v.AddArg(x) 3313 return true 3314 } 3315 return false 3316 } 3317 func rewriteValuegeneric_OpAdd64_30(v *Value) bool { 3318 b := v.Block 3319 _ = b 3320 // match: (Add64 (Const64 <t> [c]) (Sub64 (Const64 <t> [d]) x)) 3321 // cond: 3322 // result: (Sub64 (Const64 <t> [c+d]) x) 3323 for { 3324 _ = v.Args[1] 3325 v_0 := v.Args[0] 3326 if v_0.Op != OpConst64 { 3327 break 3328 } 3329 t := v_0.Type 3330 c := v_0.AuxInt 3331 v_1 := v.Args[1] 3332 if v_1.Op != OpSub64 { 3333 break 3334 } 3335 _ = v_1.Args[1] 3336 v_1_0 := v_1.Args[0] 3337 if v_1_0.Op != OpConst64 { 3338 break 3339 } 3340 if v_1_0.Type != t { 3341 break 3342 } 3343 d := v_1_0.AuxInt 3344 x := v_1.Args[1] 3345 v.reset(OpSub64) 3346 v0 := b.NewValue0(v.Pos, OpConst64, t) 3347 v0.AuxInt = c + d 3348 v.AddArg(v0) 3349 v.AddArg(x) 3350 return true 3351 } 3352 // match: (Add64 (Sub64 (Const64 <t> [d]) x) (Const64 <t> [c])) 3353 // cond: 3354 // result: (Sub64 (Const64 <t> [c+d]) x) 3355 for { 3356 _ = v.Args[1] 3357 v_0 := v.Args[0] 3358 if v_0.Op != OpSub64 { 3359 break 3360 } 3361 _ = v_0.Args[1] 3362 v_0_0 := v_0.Args[0] 3363 if v_0_0.Op != OpConst64 { 3364 break 3365 } 3366 t := v_0_0.Type 3367 d := v_0_0.AuxInt 3368 x := v_0.Args[1] 3369 v_1 := v.Args[1] 3370 if v_1.Op != OpConst64 { 3371 break 3372 } 3373 if v_1.Type != t { 3374 break 3375 } 3376 c := v_1.AuxInt 3377 v.reset(OpSub64) 3378 v0 := b.NewValue0(v.Pos, OpConst64, t) 3379 v0.AuxInt = c + d 3380 v.AddArg(v0) 3381 v.AddArg(x) 3382 return true 3383 } 3384 // match: (Add64 (Const64 <t> [c]) (Sub64 x (Const64 <t> [d]))) 3385 // cond: 3386 // result: (Add64 (Const64 <t> [c-d]) x) 3387 for { 3388 _ = v.Args[1] 3389 v_0 := v.Args[0] 3390 if v_0.Op != OpConst64 { 3391 break 3392 } 3393 t := v_0.Type 3394 c := v_0.AuxInt 3395 v_1 := v.Args[1] 3396 if v_1.Op != OpSub64 { 3397 break 3398 } 3399 _ = v_1.Args[1] 3400 x := v_1.Args[0] 3401 v_1_1 := v_1.Args[1] 3402 if v_1_1.Op != OpConst64 { 3403 break 3404 } 3405 if v_1_1.Type != t { 3406 break 3407 } 3408 d := v_1_1.AuxInt 3409 v.reset(OpAdd64) 3410 v0 := b.NewValue0(v.Pos, OpConst64, t) 3411 v0.AuxInt = c - d 3412 v.AddArg(v0) 3413 v.AddArg(x) 3414 return true 3415 } 3416 // match: (Add64 (Sub64 x (Const64 <t> [d])) (Const64 <t> [c])) 3417 // cond: 3418 // result: (Add64 (Const64 <t> [c-d]) x) 3419 for { 3420 _ = v.Args[1] 3421 v_0 := v.Args[0] 3422 if v_0.Op != OpSub64 { 3423 break 3424 } 3425 _ = v_0.Args[1] 3426 x := v_0.Args[0] 3427 v_0_1 := v_0.Args[1] 3428 if v_0_1.Op != OpConst64 { 3429 break 3430 } 3431 t := v_0_1.Type 3432 d := v_0_1.AuxInt 3433 v_1 := v.Args[1] 3434 if v_1.Op != OpConst64 { 3435 break 3436 } 3437 if v_1.Type != t { 3438 break 3439 } 3440 c := v_1.AuxInt 3441 v.reset(OpAdd64) 3442 v0 := b.NewValue0(v.Pos, OpConst64, t) 3443 v0.AuxInt = c - d 3444 v.AddArg(v0) 3445 v.AddArg(x) 3446 return true 3447 } 3448 return false 3449 } 3450 func rewriteValuegeneric_OpAdd64F_0(v *Value) bool { 3451 // match: (Add64F (Const64F [c]) (Const64F [d])) 3452 // cond: 3453 // result: (Const64F [f2i(i2f(c) + i2f(d))]) 3454 for { 3455 _ = v.Args[1] 3456 v_0 := v.Args[0] 3457 if v_0.Op != OpConst64F { 3458 break 3459 } 3460 c := v_0.AuxInt 3461 v_1 := v.Args[1] 3462 if v_1.Op != OpConst64F { 3463 break 3464 } 3465 d := v_1.AuxInt 3466 v.reset(OpConst64F) 3467 v.AuxInt = f2i(i2f(c) + i2f(d)) 3468 return true 3469 } 3470 // match: (Add64F (Const64F [d]) (Const64F [c])) 3471 // cond: 3472 // result: (Const64F [f2i(i2f(c) + i2f(d))]) 3473 for { 3474 _ = v.Args[1] 3475 v_0 := v.Args[0] 3476 if v_0.Op != OpConst64F { 3477 break 3478 } 3479 d := v_0.AuxInt 3480 v_1 := v.Args[1] 3481 if v_1.Op != OpConst64F { 3482 break 3483 } 3484 c := v_1.AuxInt 3485 v.reset(OpConst64F) 3486 v.AuxInt = f2i(i2f(c) + i2f(d)) 3487 return true 3488 } 3489 // match: (Add64F x (Const64F [0])) 3490 // cond: 3491 // result: x 3492 for { 3493 _ = v.Args[1] 3494 x := v.Args[0] 3495 v_1 := v.Args[1] 3496 if v_1.Op != OpConst64F { 3497 break 3498 } 3499 if v_1.AuxInt != 0 { 3500 break 3501 } 3502 v.reset(OpCopy) 3503 v.Type = x.Type 3504 v.AddArg(x) 3505 return true 3506 } 3507 // match: (Add64F (Const64F [0]) x) 3508 // cond: 3509 // result: x 3510 for { 3511 _ = v.Args[1] 3512 v_0 := v.Args[0] 3513 if v_0.Op != OpConst64F { 3514 break 3515 } 3516 if v_0.AuxInt != 0 { 3517 break 3518 } 3519 x := v.Args[1] 3520 v.reset(OpCopy) 3521 v.Type = x.Type 3522 v.AddArg(x) 3523 return true 3524 } 3525 return false 3526 } 3527 func rewriteValuegeneric_OpAdd8_0(v *Value) bool { 3528 b := v.Block 3529 _ = b 3530 // match: (Add8 (Const8 [c]) (Const8 [d])) 3531 // cond: 3532 // result: (Const8 [int64(int8(c+d))]) 3533 for { 3534 _ = v.Args[1] 3535 v_0 := v.Args[0] 3536 if v_0.Op != OpConst8 { 3537 break 3538 } 3539 c := v_0.AuxInt 3540 v_1 := v.Args[1] 3541 if v_1.Op != OpConst8 { 3542 break 3543 } 3544 d := v_1.AuxInt 3545 v.reset(OpConst8) 3546 v.AuxInt = int64(int8(c + d)) 3547 return true 3548 } 3549 // match: (Add8 (Const8 [d]) (Const8 [c])) 3550 // cond: 3551 // result: (Const8 [int64(int8(c+d))]) 3552 for { 3553 _ = v.Args[1] 3554 v_0 := v.Args[0] 3555 if v_0.Op != OpConst8 { 3556 break 3557 } 3558 d := v_0.AuxInt 3559 v_1 := v.Args[1] 3560 if v_1.Op != OpConst8 { 3561 break 3562 } 3563 c := v_1.AuxInt 3564 v.reset(OpConst8) 3565 v.AuxInt = int64(int8(c + d)) 3566 return true 3567 } 3568 // match: (Add8 <t> (Mul8 x y) (Mul8 x z)) 3569 // cond: 3570 // result: (Mul8 x (Add8 <t> y z)) 3571 for { 3572 t := v.Type 3573 _ = v.Args[1] 3574 v_0 := v.Args[0] 3575 if v_0.Op != OpMul8 { 3576 break 3577 } 3578 _ = v_0.Args[1] 3579 x := v_0.Args[0] 3580 y := v_0.Args[1] 3581 v_1 := v.Args[1] 3582 if v_1.Op != OpMul8 { 3583 break 3584 } 3585 _ = v_1.Args[1] 3586 if x != v_1.Args[0] { 3587 break 3588 } 3589 z := v_1.Args[1] 3590 v.reset(OpMul8) 3591 v.AddArg(x) 3592 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3593 v0.AddArg(y) 3594 v0.AddArg(z) 3595 v.AddArg(v0) 3596 return true 3597 } 3598 // match: (Add8 <t> (Mul8 y x) (Mul8 x z)) 3599 // cond: 3600 // result: (Mul8 x (Add8 <t> y z)) 3601 for { 3602 t := v.Type 3603 _ = v.Args[1] 3604 v_0 := v.Args[0] 3605 if v_0.Op != OpMul8 { 3606 break 3607 } 3608 _ = v_0.Args[1] 3609 y := v_0.Args[0] 3610 x := v_0.Args[1] 3611 v_1 := v.Args[1] 3612 if v_1.Op != OpMul8 { 3613 break 3614 } 3615 _ = v_1.Args[1] 3616 if x != v_1.Args[0] { 3617 break 3618 } 3619 z := v_1.Args[1] 3620 v.reset(OpMul8) 3621 v.AddArg(x) 3622 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3623 v0.AddArg(y) 3624 v0.AddArg(z) 3625 v.AddArg(v0) 3626 return true 3627 } 3628 // match: (Add8 <t> (Mul8 x y) (Mul8 z x)) 3629 // cond: 3630 // result: (Mul8 x (Add8 <t> y z)) 3631 for { 3632 t := v.Type 3633 _ = v.Args[1] 3634 v_0 := v.Args[0] 3635 if v_0.Op != OpMul8 { 3636 break 3637 } 3638 _ = v_0.Args[1] 3639 x := v_0.Args[0] 3640 y := v_0.Args[1] 3641 v_1 := v.Args[1] 3642 if v_1.Op != OpMul8 { 3643 break 3644 } 3645 _ = v_1.Args[1] 3646 z := v_1.Args[0] 3647 if x != v_1.Args[1] { 3648 break 3649 } 3650 v.reset(OpMul8) 3651 v.AddArg(x) 3652 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3653 v0.AddArg(y) 3654 v0.AddArg(z) 3655 v.AddArg(v0) 3656 return true 3657 } 3658 // match: (Add8 <t> (Mul8 y x) (Mul8 z x)) 3659 // cond: 3660 // result: (Mul8 x (Add8 <t> y z)) 3661 for { 3662 t := v.Type 3663 _ = v.Args[1] 3664 v_0 := v.Args[0] 3665 if v_0.Op != OpMul8 { 3666 break 3667 } 3668 _ = v_0.Args[1] 3669 y := v_0.Args[0] 3670 x := v_0.Args[1] 3671 v_1 := v.Args[1] 3672 if v_1.Op != OpMul8 { 3673 break 3674 } 3675 _ = v_1.Args[1] 3676 z := v_1.Args[0] 3677 if x != v_1.Args[1] { 3678 break 3679 } 3680 v.reset(OpMul8) 3681 v.AddArg(x) 3682 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3683 v0.AddArg(y) 3684 v0.AddArg(z) 3685 v.AddArg(v0) 3686 return true 3687 } 3688 // match: (Add8 <t> (Mul8 x z) (Mul8 x y)) 3689 // cond: 3690 // result: (Mul8 x (Add8 <t> y z)) 3691 for { 3692 t := v.Type 3693 _ = v.Args[1] 3694 v_0 := v.Args[0] 3695 if v_0.Op != OpMul8 { 3696 break 3697 } 3698 _ = v_0.Args[1] 3699 x := v_0.Args[0] 3700 z := v_0.Args[1] 3701 v_1 := v.Args[1] 3702 if v_1.Op != OpMul8 { 3703 break 3704 } 3705 _ = v_1.Args[1] 3706 if x != v_1.Args[0] { 3707 break 3708 } 3709 y := v_1.Args[1] 3710 v.reset(OpMul8) 3711 v.AddArg(x) 3712 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3713 v0.AddArg(y) 3714 v0.AddArg(z) 3715 v.AddArg(v0) 3716 return true 3717 } 3718 // match: (Add8 <t> (Mul8 z x) (Mul8 x y)) 3719 // cond: 3720 // result: (Mul8 x (Add8 <t> y z)) 3721 for { 3722 t := v.Type 3723 _ = v.Args[1] 3724 v_0 := v.Args[0] 3725 if v_0.Op != OpMul8 { 3726 break 3727 } 3728 _ = v_0.Args[1] 3729 z := v_0.Args[0] 3730 x := v_0.Args[1] 3731 v_1 := v.Args[1] 3732 if v_1.Op != OpMul8 { 3733 break 3734 } 3735 _ = v_1.Args[1] 3736 if x != v_1.Args[0] { 3737 break 3738 } 3739 y := v_1.Args[1] 3740 v.reset(OpMul8) 3741 v.AddArg(x) 3742 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3743 v0.AddArg(y) 3744 v0.AddArg(z) 3745 v.AddArg(v0) 3746 return true 3747 } 3748 // match: (Add8 <t> (Mul8 x z) (Mul8 y x)) 3749 // cond: 3750 // result: (Mul8 x (Add8 <t> y z)) 3751 for { 3752 t := v.Type 3753 _ = v.Args[1] 3754 v_0 := v.Args[0] 3755 if v_0.Op != OpMul8 { 3756 break 3757 } 3758 _ = v_0.Args[1] 3759 x := v_0.Args[0] 3760 z := v_0.Args[1] 3761 v_1 := v.Args[1] 3762 if v_1.Op != OpMul8 { 3763 break 3764 } 3765 _ = v_1.Args[1] 3766 y := v_1.Args[0] 3767 if x != v_1.Args[1] { 3768 break 3769 } 3770 v.reset(OpMul8) 3771 v.AddArg(x) 3772 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3773 v0.AddArg(y) 3774 v0.AddArg(z) 3775 v.AddArg(v0) 3776 return true 3777 } 3778 // match: (Add8 <t> (Mul8 z x) (Mul8 y x)) 3779 // cond: 3780 // result: (Mul8 x (Add8 <t> y z)) 3781 for { 3782 t := v.Type 3783 _ = v.Args[1] 3784 v_0 := v.Args[0] 3785 if v_0.Op != OpMul8 { 3786 break 3787 } 3788 _ = v_0.Args[1] 3789 z := v_0.Args[0] 3790 x := v_0.Args[1] 3791 v_1 := v.Args[1] 3792 if v_1.Op != OpMul8 { 3793 break 3794 } 3795 _ = v_1.Args[1] 3796 y := v_1.Args[0] 3797 if x != v_1.Args[1] { 3798 break 3799 } 3800 v.reset(OpMul8) 3801 v.AddArg(x) 3802 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3803 v0.AddArg(y) 3804 v0.AddArg(z) 3805 v.AddArg(v0) 3806 return true 3807 } 3808 return false 3809 } 3810 func rewriteValuegeneric_OpAdd8_10(v *Value) bool { 3811 b := v.Block 3812 _ = b 3813 // match: (Add8 (Const8 [0]) x) 3814 // cond: 3815 // result: x 3816 for { 3817 _ = v.Args[1] 3818 v_0 := v.Args[0] 3819 if v_0.Op != OpConst8 { 3820 break 3821 } 3822 if v_0.AuxInt != 0 { 3823 break 3824 } 3825 x := v.Args[1] 3826 v.reset(OpCopy) 3827 v.Type = x.Type 3828 v.AddArg(x) 3829 return true 3830 } 3831 // match: (Add8 x (Const8 [0])) 3832 // cond: 3833 // result: x 3834 for { 3835 _ = v.Args[1] 3836 x := v.Args[0] 3837 v_1 := v.Args[1] 3838 if v_1.Op != OpConst8 { 3839 break 3840 } 3841 if v_1.AuxInt != 0 { 3842 break 3843 } 3844 v.reset(OpCopy) 3845 v.Type = x.Type 3846 v.AddArg(x) 3847 return true 3848 } 3849 // match: (Add8 (Const8 [1]) (Com8 x)) 3850 // cond: 3851 // result: (Neg8 x) 3852 for { 3853 _ = v.Args[1] 3854 v_0 := v.Args[0] 3855 if v_0.Op != OpConst8 { 3856 break 3857 } 3858 if v_0.AuxInt != 1 { 3859 break 3860 } 3861 v_1 := v.Args[1] 3862 if v_1.Op != OpCom8 { 3863 break 3864 } 3865 x := v_1.Args[0] 3866 v.reset(OpNeg8) 3867 v.AddArg(x) 3868 return true 3869 } 3870 // match: (Add8 (Com8 x) (Const8 [1])) 3871 // cond: 3872 // result: (Neg8 x) 3873 for { 3874 _ = v.Args[1] 3875 v_0 := v.Args[0] 3876 if v_0.Op != OpCom8 { 3877 break 3878 } 3879 x := v_0.Args[0] 3880 v_1 := v.Args[1] 3881 if v_1.Op != OpConst8 { 3882 break 3883 } 3884 if v_1.AuxInt != 1 { 3885 break 3886 } 3887 v.reset(OpNeg8) 3888 v.AddArg(x) 3889 return true 3890 } 3891 // match: (Add8 (Add8 i:(Const8 <t>) z) x) 3892 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 3893 // result: (Add8 i (Add8 <t> z x)) 3894 for { 3895 _ = v.Args[1] 3896 v_0 := v.Args[0] 3897 if v_0.Op != OpAdd8 { 3898 break 3899 } 3900 _ = v_0.Args[1] 3901 i := v_0.Args[0] 3902 if i.Op != OpConst8 { 3903 break 3904 } 3905 t := i.Type 3906 z := v_0.Args[1] 3907 x := v.Args[1] 3908 if !(z.Op != OpConst8 && x.Op != OpConst8) { 3909 break 3910 } 3911 v.reset(OpAdd8) 3912 v.AddArg(i) 3913 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3914 v0.AddArg(z) 3915 v0.AddArg(x) 3916 v.AddArg(v0) 3917 return true 3918 } 3919 // match: (Add8 (Add8 z i:(Const8 <t>)) x) 3920 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 3921 // result: (Add8 i (Add8 <t> z x)) 3922 for { 3923 _ = v.Args[1] 3924 v_0 := v.Args[0] 3925 if v_0.Op != OpAdd8 { 3926 break 3927 } 3928 _ = v_0.Args[1] 3929 z := v_0.Args[0] 3930 i := v_0.Args[1] 3931 if i.Op != OpConst8 { 3932 break 3933 } 3934 t := i.Type 3935 x := v.Args[1] 3936 if !(z.Op != OpConst8 && x.Op != OpConst8) { 3937 break 3938 } 3939 v.reset(OpAdd8) 3940 v.AddArg(i) 3941 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3942 v0.AddArg(z) 3943 v0.AddArg(x) 3944 v.AddArg(v0) 3945 return true 3946 } 3947 // match: (Add8 x (Add8 i:(Const8 <t>) z)) 3948 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 3949 // result: (Add8 i (Add8 <t> z x)) 3950 for { 3951 _ = v.Args[1] 3952 x := v.Args[0] 3953 v_1 := v.Args[1] 3954 if v_1.Op != OpAdd8 { 3955 break 3956 } 3957 _ = v_1.Args[1] 3958 i := v_1.Args[0] 3959 if i.Op != OpConst8 { 3960 break 3961 } 3962 t := i.Type 3963 z := v_1.Args[1] 3964 if !(z.Op != OpConst8 && x.Op != OpConst8) { 3965 break 3966 } 3967 v.reset(OpAdd8) 3968 v.AddArg(i) 3969 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3970 v0.AddArg(z) 3971 v0.AddArg(x) 3972 v.AddArg(v0) 3973 return true 3974 } 3975 // match: (Add8 x (Add8 z i:(Const8 <t>))) 3976 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 3977 // result: (Add8 i (Add8 <t> z x)) 3978 for { 3979 _ = v.Args[1] 3980 x := v.Args[0] 3981 v_1 := v.Args[1] 3982 if v_1.Op != OpAdd8 { 3983 break 3984 } 3985 _ = v_1.Args[1] 3986 z := v_1.Args[0] 3987 i := v_1.Args[1] 3988 if i.Op != OpConst8 { 3989 break 3990 } 3991 t := i.Type 3992 if !(z.Op != OpConst8 && x.Op != OpConst8) { 3993 break 3994 } 3995 v.reset(OpAdd8) 3996 v.AddArg(i) 3997 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3998 v0.AddArg(z) 3999 v0.AddArg(x) 4000 v.AddArg(v0) 4001 return true 4002 } 4003 // match: (Add8 (Sub8 i:(Const8 <t>) z) x) 4004 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 4005 // result: (Add8 i (Sub8 <t> x z)) 4006 for { 4007 _ = v.Args[1] 4008 v_0 := v.Args[0] 4009 if v_0.Op != OpSub8 { 4010 break 4011 } 4012 _ = v_0.Args[1] 4013 i := v_0.Args[0] 4014 if i.Op != OpConst8 { 4015 break 4016 } 4017 t := i.Type 4018 z := v_0.Args[1] 4019 x := v.Args[1] 4020 if !(z.Op != OpConst8 && x.Op != OpConst8) { 4021 break 4022 } 4023 v.reset(OpAdd8) 4024 v.AddArg(i) 4025 v0 := b.NewValue0(v.Pos, OpSub8, t) 4026 v0.AddArg(x) 4027 v0.AddArg(z) 4028 v.AddArg(v0) 4029 return true 4030 } 4031 // match: (Add8 x (Sub8 i:(Const8 <t>) z)) 4032 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 4033 // result: (Add8 i (Sub8 <t> x z)) 4034 for { 4035 _ = v.Args[1] 4036 x := v.Args[0] 4037 v_1 := v.Args[1] 4038 if v_1.Op != OpSub8 { 4039 break 4040 } 4041 _ = v_1.Args[1] 4042 i := v_1.Args[0] 4043 if i.Op != OpConst8 { 4044 break 4045 } 4046 t := i.Type 4047 z := v_1.Args[1] 4048 if !(z.Op != OpConst8 && x.Op != OpConst8) { 4049 break 4050 } 4051 v.reset(OpAdd8) 4052 v.AddArg(i) 4053 v0 := b.NewValue0(v.Pos, OpSub8, t) 4054 v0.AddArg(x) 4055 v0.AddArg(z) 4056 v.AddArg(v0) 4057 return true 4058 } 4059 return false 4060 } 4061 func rewriteValuegeneric_OpAdd8_20(v *Value) bool { 4062 b := v.Block 4063 _ = b 4064 // match: (Add8 x (Sub8 i:(Const8 <t>) z)) 4065 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 4066 // result: (Add8 i (Sub8 <t> x z)) 4067 for { 4068 _ = v.Args[1] 4069 x := v.Args[0] 4070 v_1 := v.Args[1] 4071 if v_1.Op != OpSub8 { 4072 break 4073 } 4074 _ = v_1.Args[1] 4075 i := v_1.Args[0] 4076 if i.Op != OpConst8 { 4077 break 4078 } 4079 t := i.Type 4080 z := v_1.Args[1] 4081 if !(z.Op != OpConst8 && x.Op != OpConst8) { 4082 break 4083 } 4084 v.reset(OpAdd8) 4085 v.AddArg(i) 4086 v0 := b.NewValue0(v.Pos, OpSub8, t) 4087 v0.AddArg(x) 4088 v0.AddArg(z) 4089 v.AddArg(v0) 4090 return true 4091 } 4092 // match: (Add8 (Sub8 i:(Const8 <t>) z) x) 4093 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 4094 // result: (Add8 i (Sub8 <t> x z)) 4095 for { 4096 _ = v.Args[1] 4097 v_0 := v.Args[0] 4098 if v_0.Op != OpSub8 { 4099 break 4100 } 4101 _ = v_0.Args[1] 4102 i := v_0.Args[0] 4103 if i.Op != OpConst8 { 4104 break 4105 } 4106 t := i.Type 4107 z := v_0.Args[1] 4108 x := v.Args[1] 4109 if !(z.Op != OpConst8 && x.Op != OpConst8) { 4110 break 4111 } 4112 v.reset(OpAdd8) 4113 v.AddArg(i) 4114 v0 := b.NewValue0(v.Pos, OpSub8, t) 4115 v0.AddArg(x) 4116 v0.AddArg(z) 4117 v.AddArg(v0) 4118 return true 4119 } 4120 // match: (Add8 (Sub8 z i:(Const8 <t>)) x) 4121 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 4122 // result: (Sub8 (Add8 <t> x z) i) 4123 for { 4124 _ = v.Args[1] 4125 v_0 := v.Args[0] 4126 if v_0.Op != OpSub8 { 4127 break 4128 } 4129 _ = v_0.Args[1] 4130 z := v_0.Args[0] 4131 i := v_0.Args[1] 4132 if i.Op != OpConst8 { 4133 break 4134 } 4135 t := i.Type 4136 x := v.Args[1] 4137 if !(z.Op != OpConst8 && x.Op != OpConst8) { 4138 break 4139 } 4140 v.reset(OpSub8) 4141 v0 := b.NewValue0(v.Pos, OpAdd8, t) 4142 v0.AddArg(x) 4143 v0.AddArg(z) 4144 v.AddArg(v0) 4145 v.AddArg(i) 4146 return true 4147 } 4148 // match: (Add8 x (Sub8 z i:(Const8 <t>))) 4149 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 4150 // result: (Sub8 (Add8 <t> x z) i) 4151 for { 4152 _ = v.Args[1] 4153 x := v.Args[0] 4154 v_1 := v.Args[1] 4155 if v_1.Op != OpSub8 { 4156 break 4157 } 4158 _ = v_1.Args[1] 4159 z := v_1.Args[0] 4160 i := v_1.Args[1] 4161 if i.Op != OpConst8 { 4162 break 4163 } 4164 t := i.Type 4165 if !(z.Op != OpConst8 && x.Op != OpConst8) { 4166 break 4167 } 4168 v.reset(OpSub8) 4169 v0 := b.NewValue0(v.Pos, OpAdd8, t) 4170 v0.AddArg(x) 4171 v0.AddArg(z) 4172 v.AddArg(v0) 4173 v.AddArg(i) 4174 return true 4175 } 4176 // match: (Add8 x (Sub8 z i:(Const8 <t>))) 4177 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 4178 // result: (Sub8 (Add8 <t> x z) i) 4179 for { 4180 _ = v.Args[1] 4181 x := v.Args[0] 4182 v_1 := v.Args[1] 4183 if v_1.Op != OpSub8 { 4184 break 4185 } 4186 _ = v_1.Args[1] 4187 z := v_1.Args[0] 4188 i := v_1.Args[1] 4189 if i.Op != OpConst8 { 4190 break 4191 } 4192 t := i.Type 4193 if !(z.Op != OpConst8 && x.Op != OpConst8) { 4194 break 4195 } 4196 v.reset(OpSub8) 4197 v0 := b.NewValue0(v.Pos, OpAdd8, t) 4198 v0.AddArg(x) 4199 v0.AddArg(z) 4200 v.AddArg(v0) 4201 v.AddArg(i) 4202 return true 4203 } 4204 // match: (Add8 (Sub8 z i:(Const8 <t>)) x) 4205 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 4206 // result: (Sub8 (Add8 <t> x z) i) 4207 for { 4208 _ = v.Args[1] 4209 v_0 := v.Args[0] 4210 if v_0.Op != OpSub8 { 4211 break 4212 } 4213 _ = v_0.Args[1] 4214 z := v_0.Args[0] 4215 i := v_0.Args[1] 4216 if i.Op != OpConst8 { 4217 break 4218 } 4219 t := i.Type 4220 x := v.Args[1] 4221 if !(z.Op != OpConst8 && x.Op != OpConst8) { 4222 break 4223 } 4224 v.reset(OpSub8) 4225 v0 := b.NewValue0(v.Pos, OpAdd8, t) 4226 v0.AddArg(x) 4227 v0.AddArg(z) 4228 v.AddArg(v0) 4229 v.AddArg(i) 4230 return true 4231 } 4232 // match: (Add8 (Const8 <t> [c]) (Add8 (Const8 <t> [d]) x)) 4233 // cond: 4234 // result: (Add8 (Const8 <t> [int64(int8(c+d))]) x) 4235 for { 4236 _ = v.Args[1] 4237 v_0 := v.Args[0] 4238 if v_0.Op != OpConst8 { 4239 break 4240 } 4241 t := v_0.Type 4242 c := v_0.AuxInt 4243 v_1 := v.Args[1] 4244 if v_1.Op != OpAdd8 { 4245 break 4246 } 4247 _ = v_1.Args[1] 4248 v_1_0 := v_1.Args[0] 4249 if v_1_0.Op != OpConst8 { 4250 break 4251 } 4252 if v_1_0.Type != t { 4253 break 4254 } 4255 d := v_1_0.AuxInt 4256 x := v_1.Args[1] 4257 v.reset(OpAdd8) 4258 v0 := b.NewValue0(v.Pos, OpConst8, t) 4259 v0.AuxInt = int64(int8(c + d)) 4260 v.AddArg(v0) 4261 v.AddArg(x) 4262 return true 4263 } 4264 // match: (Add8 (Const8 <t> [c]) (Add8 x (Const8 <t> [d]))) 4265 // cond: 4266 // result: (Add8 (Const8 <t> [int64(int8(c+d))]) x) 4267 for { 4268 _ = v.Args[1] 4269 v_0 := v.Args[0] 4270 if v_0.Op != OpConst8 { 4271 break 4272 } 4273 t := v_0.Type 4274 c := v_0.AuxInt 4275 v_1 := v.Args[1] 4276 if v_1.Op != OpAdd8 { 4277 break 4278 } 4279 _ = v_1.Args[1] 4280 x := v_1.Args[0] 4281 v_1_1 := v_1.Args[1] 4282 if v_1_1.Op != OpConst8 { 4283 break 4284 } 4285 if v_1_1.Type != t { 4286 break 4287 } 4288 d := v_1_1.AuxInt 4289 v.reset(OpAdd8) 4290 v0 := b.NewValue0(v.Pos, OpConst8, t) 4291 v0.AuxInt = int64(int8(c + d)) 4292 v.AddArg(v0) 4293 v.AddArg(x) 4294 return true 4295 } 4296 // match: (Add8 (Add8 (Const8 <t> [d]) x) (Const8 <t> [c])) 4297 // cond: 4298 // result: (Add8 (Const8 <t> [int64(int8(c+d))]) x) 4299 for { 4300 _ = v.Args[1] 4301 v_0 := v.Args[0] 4302 if v_0.Op != OpAdd8 { 4303 break 4304 } 4305 _ = v_0.Args[1] 4306 v_0_0 := v_0.Args[0] 4307 if v_0_0.Op != OpConst8 { 4308 break 4309 } 4310 t := v_0_0.Type 4311 d := v_0_0.AuxInt 4312 x := v_0.Args[1] 4313 v_1 := v.Args[1] 4314 if v_1.Op != OpConst8 { 4315 break 4316 } 4317 if v_1.Type != t { 4318 break 4319 } 4320 c := v_1.AuxInt 4321 v.reset(OpAdd8) 4322 v0 := b.NewValue0(v.Pos, OpConst8, t) 4323 v0.AuxInt = int64(int8(c + d)) 4324 v.AddArg(v0) 4325 v.AddArg(x) 4326 return true 4327 } 4328 // match: (Add8 (Add8 x (Const8 <t> [d])) (Const8 <t> [c])) 4329 // cond: 4330 // result: (Add8 (Const8 <t> [int64(int8(c+d))]) x) 4331 for { 4332 _ = v.Args[1] 4333 v_0 := v.Args[0] 4334 if v_0.Op != OpAdd8 { 4335 break 4336 } 4337 _ = v_0.Args[1] 4338 x := v_0.Args[0] 4339 v_0_1 := v_0.Args[1] 4340 if v_0_1.Op != OpConst8 { 4341 break 4342 } 4343 t := v_0_1.Type 4344 d := v_0_1.AuxInt 4345 v_1 := v.Args[1] 4346 if v_1.Op != OpConst8 { 4347 break 4348 } 4349 if v_1.Type != t { 4350 break 4351 } 4352 c := v_1.AuxInt 4353 v.reset(OpAdd8) 4354 v0 := b.NewValue0(v.Pos, OpConst8, t) 4355 v0.AuxInt = int64(int8(c + d)) 4356 v.AddArg(v0) 4357 v.AddArg(x) 4358 return true 4359 } 4360 return false 4361 } 4362 func rewriteValuegeneric_OpAdd8_30(v *Value) bool { 4363 b := v.Block 4364 _ = b 4365 // match: (Add8 (Const8 <t> [c]) (Sub8 (Const8 <t> [d]) x)) 4366 // cond: 4367 // result: (Sub8 (Const8 <t> [int64(int8(c+d))]) x) 4368 for { 4369 _ = v.Args[1] 4370 v_0 := v.Args[0] 4371 if v_0.Op != OpConst8 { 4372 break 4373 } 4374 t := v_0.Type 4375 c := v_0.AuxInt 4376 v_1 := v.Args[1] 4377 if v_1.Op != OpSub8 { 4378 break 4379 } 4380 _ = v_1.Args[1] 4381 v_1_0 := v_1.Args[0] 4382 if v_1_0.Op != OpConst8 { 4383 break 4384 } 4385 if v_1_0.Type != t { 4386 break 4387 } 4388 d := v_1_0.AuxInt 4389 x := v_1.Args[1] 4390 v.reset(OpSub8) 4391 v0 := b.NewValue0(v.Pos, OpConst8, t) 4392 v0.AuxInt = int64(int8(c + d)) 4393 v.AddArg(v0) 4394 v.AddArg(x) 4395 return true 4396 } 4397 // match: (Add8 (Sub8 (Const8 <t> [d]) x) (Const8 <t> [c])) 4398 // cond: 4399 // result: (Sub8 (Const8 <t> [int64(int8(c+d))]) x) 4400 for { 4401 _ = v.Args[1] 4402 v_0 := v.Args[0] 4403 if v_0.Op != OpSub8 { 4404 break 4405 } 4406 _ = v_0.Args[1] 4407 v_0_0 := v_0.Args[0] 4408 if v_0_0.Op != OpConst8 { 4409 break 4410 } 4411 t := v_0_0.Type 4412 d := v_0_0.AuxInt 4413 x := v_0.Args[1] 4414 v_1 := v.Args[1] 4415 if v_1.Op != OpConst8 { 4416 break 4417 } 4418 if v_1.Type != t { 4419 break 4420 } 4421 c := v_1.AuxInt 4422 v.reset(OpSub8) 4423 v0 := b.NewValue0(v.Pos, OpConst8, t) 4424 v0.AuxInt = int64(int8(c + d)) 4425 v.AddArg(v0) 4426 v.AddArg(x) 4427 return true 4428 } 4429 // match: (Add8 (Const8 <t> [c]) (Sub8 x (Const8 <t> [d]))) 4430 // cond: 4431 // result: (Add8 (Const8 <t> [int64(int8(c-d))]) x) 4432 for { 4433 _ = v.Args[1] 4434 v_0 := v.Args[0] 4435 if v_0.Op != OpConst8 { 4436 break 4437 } 4438 t := v_0.Type 4439 c := v_0.AuxInt 4440 v_1 := v.Args[1] 4441 if v_1.Op != OpSub8 { 4442 break 4443 } 4444 _ = v_1.Args[1] 4445 x := v_1.Args[0] 4446 v_1_1 := v_1.Args[1] 4447 if v_1_1.Op != OpConst8 { 4448 break 4449 } 4450 if v_1_1.Type != t { 4451 break 4452 } 4453 d := v_1_1.AuxInt 4454 v.reset(OpAdd8) 4455 v0 := b.NewValue0(v.Pos, OpConst8, t) 4456 v0.AuxInt = int64(int8(c - d)) 4457 v.AddArg(v0) 4458 v.AddArg(x) 4459 return true 4460 } 4461 // match: (Add8 (Sub8 x (Const8 <t> [d])) (Const8 <t> [c])) 4462 // cond: 4463 // result: (Add8 (Const8 <t> [int64(int8(c-d))]) x) 4464 for { 4465 _ = v.Args[1] 4466 v_0 := v.Args[0] 4467 if v_0.Op != OpSub8 { 4468 break 4469 } 4470 _ = v_0.Args[1] 4471 x := v_0.Args[0] 4472 v_0_1 := v_0.Args[1] 4473 if v_0_1.Op != OpConst8 { 4474 break 4475 } 4476 t := v_0_1.Type 4477 d := v_0_1.AuxInt 4478 v_1 := v.Args[1] 4479 if v_1.Op != OpConst8 { 4480 break 4481 } 4482 if v_1.Type != t { 4483 break 4484 } 4485 c := v_1.AuxInt 4486 v.reset(OpAdd8) 4487 v0 := b.NewValue0(v.Pos, OpConst8, t) 4488 v0.AuxInt = int64(int8(c - d)) 4489 v.AddArg(v0) 4490 v.AddArg(x) 4491 return true 4492 } 4493 return false 4494 } 4495 func rewriteValuegeneric_OpAddPtr_0(v *Value) bool { 4496 // match: (AddPtr <t> x (Const64 [c])) 4497 // cond: 4498 // result: (OffPtr <t> x [c]) 4499 for { 4500 t := v.Type 4501 _ = v.Args[1] 4502 x := v.Args[0] 4503 v_1 := v.Args[1] 4504 if v_1.Op != OpConst64 { 4505 break 4506 } 4507 c := v_1.AuxInt 4508 v.reset(OpOffPtr) 4509 v.Type = t 4510 v.AuxInt = c 4511 v.AddArg(x) 4512 return true 4513 } 4514 // match: (AddPtr <t> x (Const32 [c])) 4515 // cond: 4516 // result: (OffPtr <t> x [c]) 4517 for { 4518 t := v.Type 4519 _ = v.Args[1] 4520 x := v.Args[0] 4521 v_1 := v.Args[1] 4522 if v_1.Op != OpConst32 { 4523 break 4524 } 4525 c := v_1.AuxInt 4526 v.reset(OpOffPtr) 4527 v.Type = t 4528 v.AuxInt = c 4529 v.AddArg(x) 4530 return true 4531 } 4532 return false 4533 } 4534 func rewriteValuegeneric_OpAnd16_0(v *Value) bool { 4535 // match: (And16 (Const16 [c]) (Const16 [d])) 4536 // cond: 4537 // result: (Const16 [int64(int16(c&d))]) 4538 for { 4539 _ = v.Args[1] 4540 v_0 := v.Args[0] 4541 if v_0.Op != OpConst16 { 4542 break 4543 } 4544 c := v_0.AuxInt 4545 v_1 := v.Args[1] 4546 if v_1.Op != OpConst16 { 4547 break 4548 } 4549 d := v_1.AuxInt 4550 v.reset(OpConst16) 4551 v.AuxInt = int64(int16(c & d)) 4552 return true 4553 } 4554 // match: (And16 (Const16 [d]) (Const16 [c])) 4555 // cond: 4556 // result: (Const16 [int64(int16(c&d))]) 4557 for { 4558 _ = v.Args[1] 4559 v_0 := v.Args[0] 4560 if v_0.Op != OpConst16 { 4561 break 4562 } 4563 d := v_0.AuxInt 4564 v_1 := v.Args[1] 4565 if v_1.Op != OpConst16 { 4566 break 4567 } 4568 c := v_1.AuxInt 4569 v.reset(OpConst16) 4570 v.AuxInt = int64(int16(c & d)) 4571 return true 4572 } 4573 // match: (And16 x x) 4574 // cond: 4575 // result: x 4576 for { 4577 _ = v.Args[1] 4578 x := v.Args[0] 4579 if x != v.Args[1] { 4580 break 4581 } 4582 v.reset(OpCopy) 4583 v.Type = x.Type 4584 v.AddArg(x) 4585 return true 4586 } 4587 // match: (And16 (Const16 [-1]) x) 4588 // cond: 4589 // result: x 4590 for { 4591 _ = v.Args[1] 4592 v_0 := v.Args[0] 4593 if v_0.Op != OpConst16 { 4594 break 4595 } 4596 if v_0.AuxInt != -1 { 4597 break 4598 } 4599 x := v.Args[1] 4600 v.reset(OpCopy) 4601 v.Type = x.Type 4602 v.AddArg(x) 4603 return true 4604 } 4605 // match: (And16 x (Const16 [-1])) 4606 // cond: 4607 // result: x 4608 for { 4609 _ = v.Args[1] 4610 x := v.Args[0] 4611 v_1 := v.Args[1] 4612 if v_1.Op != OpConst16 { 4613 break 4614 } 4615 if v_1.AuxInt != -1 { 4616 break 4617 } 4618 v.reset(OpCopy) 4619 v.Type = x.Type 4620 v.AddArg(x) 4621 return true 4622 } 4623 // match: (And16 (Const16 [0]) _) 4624 // cond: 4625 // result: (Const16 [0]) 4626 for { 4627 _ = v.Args[1] 4628 v_0 := v.Args[0] 4629 if v_0.Op != OpConst16 { 4630 break 4631 } 4632 if v_0.AuxInt != 0 { 4633 break 4634 } 4635 v.reset(OpConst16) 4636 v.AuxInt = 0 4637 return true 4638 } 4639 // match: (And16 _ (Const16 [0])) 4640 // cond: 4641 // result: (Const16 [0]) 4642 for { 4643 _ = v.Args[1] 4644 v_1 := v.Args[1] 4645 if v_1.Op != OpConst16 { 4646 break 4647 } 4648 if v_1.AuxInt != 0 { 4649 break 4650 } 4651 v.reset(OpConst16) 4652 v.AuxInt = 0 4653 return true 4654 } 4655 // match: (And16 x (And16 x y)) 4656 // cond: 4657 // result: (And16 x y) 4658 for { 4659 _ = v.Args[1] 4660 x := v.Args[0] 4661 v_1 := v.Args[1] 4662 if v_1.Op != OpAnd16 { 4663 break 4664 } 4665 _ = v_1.Args[1] 4666 if x != v_1.Args[0] { 4667 break 4668 } 4669 y := v_1.Args[1] 4670 v.reset(OpAnd16) 4671 v.AddArg(x) 4672 v.AddArg(y) 4673 return true 4674 } 4675 // match: (And16 x (And16 y x)) 4676 // cond: 4677 // result: (And16 x y) 4678 for { 4679 _ = v.Args[1] 4680 x := v.Args[0] 4681 v_1 := v.Args[1] 4682 if v_1.Op != OpAnd16 { 4683 break 4684 } 4685 _ = v_1.Args[1] 4686 y := v_1.Args[0] 4687 if x != v_1.Args[1] { 4688 break 4689 } 4690 v.reset(OpAnd16) 4691 v.AddArg(x) 4692 v.AddArg(y) 4693 return true 4694 } 4695 // match: (And16 (And16 x y) x) 4696 // cond: 4697 // result: (And16 x y) 4698 for { 4699 _ = v.Args[1] 4700 v_0 := v.Args[0] 4701 if v_0.Op != OpAnd16 { 4702 break 4703 } 4704 _ = v_0.Args[1] 4705 x := v_0.Args[0] 4706 y := v_0.Args[1] 4707 if x != v.Args[1] { 4708 break 4709 } 4710 v.reset(OpAnd16) 4711 v.AddArg(x) 4712 v.AddArg(y) 4713 return true 4714 } 4715 return false 4716 } 4717 func rewriteValuegeneric_OpAnd16_10(v *Value) bool { 4718 b := v.Block 4719 _ = b 4720 // match: (And16 (And16 y x) x) 4721 // cond: 4722 // result: (And16 x y) 4723 for { 4724 _ = v.Args[1] 4725 v_0 := v.Args[0] 4726 if v_0.Op != OpAnd16 { 4727 break 4728 } 4729 _ = v_0.Args[1] 4730 y := v_0.Args[0] 4731 x := v_0.Args[1] 4732 if x != v.Args[1] { 4733 break 4734 } 4735 v.reset(OpAnd16) 4736 v.AddArg(x) 4737 v.AddArg(y) 4738 return true 4739 } 4740 // match: (And16 (And16 i:(Const16 <t>) z) x) 4741 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 4742 // result: (And16 i (And16 <t> z x)) 4743 for { 4744 _ = v.Args[1] 4745 v_0 := v.Args[0] 4746 if v_0.Op != OpAnd16 { 4747 break 4748 } 4749 _ = v_0.Args[1] 4750 i := v_0.Args[0] 4751 if i.Op != OpConst16 { 4752 break 4753 } 4754 t := i.Type 4755 z := v_0.Args[1] 4756 x := v.Args[1] 4757 if !(z.Op != OpConst16 && x.Op != OpConst16) { 4758 break 4759 } 4760 v.reset(OpAnd16) 4761 v.AddArg(i) 4762 v0 := b.NewValue0(v.Pos, OpAnd16, t) 4763 v0.AddArg(z) 4764 v0.AddArg(x) 4765 v.AddArg(v0) 4766 return true 4767 } 4768 // match: (And16 (And16 z i:(Const16 <t>)) x) 4769 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 4770 // result: (And16 i (And16 <t> z x)) 4771 for { 4772 _ = v.Args[1] 4773 v_0 := v.Args[0] 4774 if v_0.Op != OpAnd16 { 4775 break 4776 } 4777 _ = v_0.Args[1] 4778 z := v_0.Args[0] 4779 i := v_0.Args[1] 4780 if i.Op != OpConst16 { 4781 break 4782 } 4783 t := i.Type 4784 x := v.Args[1] 4785 if !(z.Op != OpConst16 && x.Op != OpConst16) { 4786 break 4787 } 4788 v.reset(OpAnd16) 4789 v.AddArg(i) 4790 v0 := b.NewValue0(v.Pos, OpAnd16, t) 4791 v0.AddArg(z) 4792 v0.AddArg(x) 4793 v.AddArg(v0) 4794 return true 4795 } 4796 // match: (And16 x (And16 i:(Const16 <t>) z)) 4797 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 4798 // result: (And16 i (And16 <t> z x)) 4799 for { 4800 _ = v.Args[1] 4801 x := v.Args[0] 4802 v_1 := v.Args[1] 4803 if v_1.Op != OpAnd16 { 4804 break 4805 } 4806 _ = v_1.Args[1] 4807 i := v_1.Args[0] 4808 if i.Op != OpConst16 { 4809 break 4810 } 4811 t := i.Type 4812 z := v_1.Args[1] 4813 if !(z.Op != OpConst16 && x.Op != OpConst16) { 4814 break 4815 } 4816 v.reset(OpAnd16) 4817 v.AddArg(i) 4818 v0 := b.NewValue0(v.Pos, OpAnd16, t) 4819 v0.AddArg(z) 4820 v0.AddArg(x) 4821 v.AddArg(v0) 4822 return true 4823 } 4824 // match: (And16 x (And16 z i:(Const16 <t>))) 4825 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 4826 // result: (And16 i (And16 <t> z x)) 4827 for { 4828 _ = v.Args[1] 4829 x := v.Args[0] 4830 v_1 := v.Args[1] 4831 if v_1.Op != OpAnd16 { 4832 break 4833 } 4834 _ = v_1.Args[1] 4835 z := v_1.Args[0] 4836 i := v_1.Args[1] 4837 if i.Op != OpConst16 { 4838 break 4839 } 4840 t := i.Type 4841 if !(z.Op != OpConst16 && x.Op != OpConst16) { 4842 break 4843 } 4844 v.reset(OpAnd16) 4845 v.AddArg(i) 4846 v0 := b.NewValue0(v.Pos, OpAnd16, t) 4847 v0.AddArg(z) 4848 v0.AddArg(x) 4849 v.AddArg(v0) 4850 return true 4851 } 4852 // match: (And16 (Const16 <t> [c]) (And16 (Const16 <t> [d]) x)) 4853 // cond: 4854 // result: (And16 (Const16 <t> [int64(int16(c&d))]) x) 4855 for { 4856 _ = v.Args[1] 4857 v_0 := v.Args[0] 4858 if v_0.Op != OpConst16 { 4859 break 4860 } 4861 t := v_0.Type 4862 c := v_0.AuxInt 4863 v_1 := v.Args[1] 4864 if v_1.Op != OpAnd16 { 4865 break 4866 } 4867 _ = v_1.Args[1] 4868 v_1_0 := v_1.Args[0] 4869 if v_1_0.Op != OpConst16 { 4870 break 4871 } 4872 if v_1_0.Type != t { 4873 break 4874 } 4875 d := v_1_0.AuxInt 4876 x := v_1.Args[1] 4877 v.reset(OpAnd16) 4878 v0 := b.NewValue0(v.Pos, OpConst16, t) 4879 v0.AuxInt = int64(int16(c & d)) 4880 v.AddArg(v0) 4881 v.AddArg(x) 4882 return true 4883 } 4884 // match: (And16 (Const16 <t> [c]) (And16 x (Const16 <t> [d]))) 4885 // cond: 4886 // result: (And16 (Const16 <t> [int64(int16(c&d))]) x) 4887 for { 4888 _ = v.Args[1] 4889 v_0 := v.Args[0] 4890 if v_0.Op != OpConst16 { 4891 break 4892 } 4893 t := v_0.Type 4894 c := v_0.AuxInt 4895 v_1 := v.Args[1] 4896 if v_1.Op != OpAnd16 { 4897 break 4898 } 4899 _ = v_1.Args[1] 4900 x := v_1.Args[0] 4901 v_1_1 := v_1.Args[1] 4902 if v_1_1.Op != OpConst16 { 4903 break 4904 } 4905 if v_1_1.Type != t { 4906 break 4907 } 4908 d := v_1_1.AuxInt 4909 v.reset(OpAnd16) 4910 v0 := b.NewValue0(v.Pos, OpConst16, t) 4911 v0.AuxInt = int64(int16(c & d)) 4912 v.AddArg(v0) 4913 v.AddArg(x) 4914 return true 4915 } 4916 // match: (And16 (And16 (Const16 <t> [d]) x) (Const16 <t> [c])) 4917 // cond: 4918 // result: (And16 (Const16 <t> [int64(int16(c&d))]) x) 4919 for { 4920 _ = v.Args[1] 4921 v_0 := v.Args[0] 4922 if v_0.Op != OpAnd16 { 4923 break 4924 } 4925 _ = v_0.Args[1] 4926 v_0_0 := v_0.Args[0] 4927 if v_0_0.Op != OpConst16 { 4928 break 4929 } 4930 t := v_0_0.Type 4931 d := v_0_0.AuxInt 4932 x := v_0.Args[1] 4933 v_1 := v.Args[1] 4934 if v_1.Op != OpConst16 { 4935 break 4936 } 4937 if v_1.Type != t { 4938 break 4939 } 4940 c := v_1.AuxInt 4941 v.reset(OpAnd16) 4942 v0 := b.NewValue0(v.Pos, OpConst16, t) 4943 v0.AuxInt = int64(int16(c & d)) 4944 v.AddArg(v0) 4945 v.AddArg(x) 4946 return true 4947 } 4948 // match: (And16 (And16 x (Const16 <t> [d])) (Const16 <t> [c])) 4949 // cond: 4950 // result: (And16 (Const16 <t> [int64(int16(c&d))]) x) 4951 for { 4952 _ = v.Args[1] 4953 v_0 := v.Args[0] 4954 if v_0.Op != OpAnd16 { 4955 break 4956 } 4957 _ = v_0.Args[1] 4958 x := v_0.Args[0] 4959 v_0_1 := v_0.Args[1] 4960 if v_0_1.Op != OpConst16 { 4961 break 4962 } 4963 t := v_0_1.Type 4964 d := v_0_1.AuxInt 4965 v_1 := v.Args[1] 4966 if v_1.Op != OpConst16 { 4967 break 4968 } 4969 if v_1.Type != t { 4970 break 4971 } 4972 c := v_1.AuxInt 4973 v.reset(OpAnd16) 4974 v0 := b.NewValue0(v.Pos, OpConst16, t) 4975 v0.AuxInt = int64(int16(c & d)) 4976 v.AddArg(v0) 4977 v.AddArg(x) 4978 return true 4979 } 4980 return false 4981 } 4982 func rewriteValuegeneric_OpAnd32_0(v *Value) bool { 4983 // match: (And32 (Const32 [c]) (Const32 [d])) 4984 // cond: 4985 // result: (Const32 [int64(int32(c&d))]) 4986 for { 4987 _ = v.Args[1] 4988 v_0 := v.Args[0] 4989 if v_0.Op != OpConst32 { 4990 break 4991 } 4992 c := v_0.AuxInt 4993 v_1 := v.Args[1] 4994 if v_1.Op != OpConst32 { 4995 break 4996 } 4997 d := v_1.AuxInt 4998 v.reset(OpConst32) 4999 v.AuxInt = int64(int32(c & d)) 5000 return true 5001 } 5002 // match: (And32 (Const32 [d]) (Const32 [c])) 5003 // cond: 5004 // result: (Const32 [int64(int32(c&d))]) 5005 for { 5006 _ = v.Args[1] 5007 v_0 := v.Args[0] 5008 if v_0.Op != OpConst32 { 5009 break 5010 } 5011 d := v_0.AuxInt 5012 v_1 := v.Args[1] 5013 if v_1.Op != OpConst32 { 5014 break 5015 } 5016 c := v_1.AuxInt 5017 v.reset(OpConst32) 5018 v.AuxInt = int64(int32(c & d)) 5019 return true 5020 } 5021 // match: (And32 x x) 5022 // cond: 5023 // result: x 5024 for { 5025 _ = v.Args[1] 5026 x := v.Args[0] 5027 if x != v.Args[1] { 5028 break 5029 } 5030 v.reset(OpCopy) 5031 v.Type = x.Type 5032 v.AddArg(x) 5033 return true 5034 } 5035 // match: (And32 (Const32 [-1]) x) 5036 // cond: 5037 // result: x 5038 for { 5039 _ = v.Args[1] 5040 v_0 := v.Args[0] 5041 if v_0.Op != OpConst32 { 5042 break 5043 } 5044 if v_0.AuxInt != -1 { 5045 break 5046 } 5047 x := v.Args[1] 5048 v.reset(OpCopy) 5049 v.Type = x.Type 5050 v.AddArg(x) 5051 return true 5052 } 5053 // match: (And32 x (Const32 [-1])) 5054 // cond: 5055 // result: x 5056 for { 5057 _ = v.Args[1] 5058 x := v.Args[0] 5059 v_1 := v.Args[1] 5060 if v_1.Op != OpConst32 { 5061 break 5062 } 5063 if v_1.AuxInt != -1 { 5064 break 5065 } 5066 v.reset(OpCopy) 5067 v.Type = x.Type 5068 v.AddArg(x) 5069 return true 5070 } 5071 // match: (And32 (Const32 [0]) _) 5072 // cond: 5073 // result: (Const32 [0]) 5074 for { 5075 _ = v.Args[1] 5076 v_0 := v.Args[0] 5077 if v_0.Op != OpConst32 { 5078 break 5079 } 5080 if v_0.AuxInt != 0 { 5081 break 5082 } 5083 v.reset(OpConst32) 5084 v.AuxInt = 0 5085 return true 5086 } 5087 // match: (And32 _ (Const32 [0])) 5088 // cond: 5089 // result: (Const32 [0]) 5090 for { 5091 _ = v.Args[1] 5092 v_1 := v.Args[1] 5093 if v_1.Op != OpConst32 { 5094 break 5095 } 5096 if v_1.AuxInt != 0 { 5097 break 5098 } 5099 v.reset(OpConst32) 5100 v.AuxInt = 0 5101 return true 5102 } 5103 // match: (And32 x (And32 x y)) 5104 // cond: 5105 // result: (And32 x y) 5106 for { 5107 _ = v.Args[1] 5108 x := v.Args[0] 5109 v_1 := v.Args[1] 5110 if v_1.Op != OpAnd32 { 5111 break 5112 } 5113 _ = v_1.Args[1] 5114 if x != v_1.Args[0] { 5115 break 5116 } 5117 y := v_1.Args[1] 5118 v.reset(OpAnd32) 5119 v.AddArg(x) 5120 v.AddArg(y) 5121 return true 5122 } 5123 // match: (And32 x (And32 y x)) 5124 // cond: 5125 // result: (And32 x y) 5126 for { 5127 _ = v.Args[1] 5128 x := v.Args[0] 5129 v_1 := v.Args[1] 5130 if v_1.Op != OpAnd32 { 5131 break 5132 } 5133 _ = v_1.Args[1] 5134 y := v_1.Args[0] 5135 if x != v_1.Args[1] { 5136 break 5137 } 5138 v.reset(OpAnd32) 5139 v.AddArg(x) 5140 v.AddArg(y) 5141 return true 5142 } 5143 // match: (And32 (And32 x y) x) 5144 // cond: 5145 // result: (And32 x y) 5146 for { 5147 _ = v.Args[1] 5148 v_0 := v.Args[0] 5149 if v_0.Op != OpAnd32 { 5150 break 5151 } 5152 _ = v_0.Args[1] 5153 x := v_0.Args[0] 5154 y := v_0.Args[1] 5155 if x != v.Args[1] { 5156 break 5157 } 5158 v.reset(OpAnd32) 5159 v.AddArg(x) 5160 v.AddArg(y) 5161 return true 5162 } 5163 return false 5164 } 5165 func rewriteValuegeneric_OpAnd32_10(v *Value) bool { 5166 b := v.Block 5167 _ = b 5168 // match: (And32 (And32 y x) x) 5169 // cond: 5170 // result: (And32 x y) 5171 for { 5172 _ = v.Args[1] 5173 v_0 := v.Args[0] 5174 if v_0.Op != OpAnd32 { 5175 break 5176 } 5177 _ = v_0.Args[1] 5178 y := v_0.Args[0] 5179 x := v_0.Args[1] 5180 if x != v.Args[1] { 5181 break 5182 } 5183 v.reset(OpAnd32) 5184 v.AddArg(x) 5185 v.AddArg(y) 5186 return true 5187 } 5188 // match: (And32 (And32 i:(Const32 <t>) z) x) 5189 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 5190 // result: (And32 i (And32 <t> z x)) 5191 for { 5192 _ = v.Args[1] 5193 v_0 := v.Args[0] 5194 if v_0.Op != OpAnd32 { 5195 break 5196 } 5197 _ = v_0.Args[1] 5198 i := v_0.Args[0] 5199 if i.Op != OpConst32 { 5200 break 5201 } 5202 t := i.Type 5203 z := v_0.Args[1] 5204 x := v.Args[1] 5205 if !(z.Op != OpConst32 && x.Op != OpConst32) { 5206 break 5207 } 5208 v.reset(OpAnd32) 5209 v.AddArg(i) 5210 v0 := b.NewValue0(v.Pos, OpAnd32, t) 5211 v0.AddArg(z) 5212 v0.AddArg(x) 5213 v.AddArg(v0) 5214 return true 5215 } 5216 // match: (And32 (And32 z i:(Const32 <t>)) x) 5217 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 5218 // result: (And32 i (And32 <t> z x)) 5219 for { 5220 _ = v.Args[1] 5221 v_0 := v.Args[0] 5222 if v_0.Op != OpAnd32 { 5223 break 5224 } 5225 _ = v_0.Args[1] 5226 z := v_0.Args[0] 5227 i := v_0.Args[1] 5228 if i.Op != OpConst32 { 5229 break 5230 } 5231 t := i.Type 5232 x := v.Args[1] 5233 if !(z.Op != OpConst32 && x.Op != OpConst32) { 5234 break 5235 } 5236 v.reset(OpAnd32) 5237 v.AddArg(i) 5238 v0 := b.NewValue0(v.Pos, OpAnd32, t) 5239 v0.AddArg(z) 5240 v0.AddArg(x) 5241 v.AddArg(v0) 5242 return true 5243 } 5244 // match: (And32 x (And32 i:(Const32 <t>) z)) 5245 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 5246 // result: (And32 i (And32 <t> z x)) 5247 for { 5248 _ = v.Args[1] 5249 x := v.Args[0] 5250 v_1 := v.Args[1] 5251 if v_1.Op != OpAnd32 { 5252 break 5253 } 5254 _ = v_1.Args[1] 5255 i := v_1.Args[0] 5256 if i.Op != OpConst32 { 5257 break 5258 } 5259 t := i.Type 5260 z := v_1.Args[1] 5261 if !(z.Op != OpConst32 && x.Op != OpConst32) { 5262 break 5263 } 5264 v.reset(OpAnd32) 5265 v.AddArg(i) 5266 v0 := b.NewValue0(v.Pos, OpAnd32, t) 5267 v0.AddArg(z) 5268 v0.AddArg(x) 5269 v.AddArg(v0) 5270 return true 5271 } 5272 // match: (And32 x (And32 z i:(Const32 <t>))) 5273 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 5274 // result: (And32 i (And32 <t> z x)) 5275 for { 5276 _ = v.Args[1] 5277 x := v.Args[0] 5278 v_1 := v.Args[1] 5279 if v_1.Op != OpAnd32 { 5280 break 5281 } 5282 _ = v_1.Args[1] 5283 z := v_1.Args[0] 5284 i := v_1.Args[1] 5285 if i.Op != OpConst32 { 5286 break 5287 } 5288 t := i.Type 5289 if !(z.Op != OpConst32 && x.Op != OpConst32) { 5290 break 5291 } 5292 v.reset(OpAnd32) 5293 v.AddArg(i) 5294 v0 := b.NewValue0(v.Pos, OpAnd32, t) 5295 v0.AddArg(z) 5296 v0.AddArg(x) 5297 v.AddArg(v0) 5298 return true 5299 } 5300 // match: (And32 (Const32 <t> [c]) (And32 (Const32 <t> [d]) x)) 5301 // cond: 5302 // result: (And32 (Const32 <t> [int64(int32(c&d))]) x) 5303 for { 5304 _ = v.Args[1] 5305 v_0 := v.Args[0] 5306 if v_0.Op != OpConst32 { 5307 break 5308 } 5309 t := v_0.Type 5310 c := v_0.AuxInt 5311 v_1 := v.Args[1] 5312 if v_1.Op != OpAnd32 { 5313 break 5314 } 5315 _ = v_1.Args[1] 5316 v_1_0 := v_1.Args[0] 5317 if v_1_0.Op != OpConst32 { 5318 break 5319 } 5320 if v_1_0.Type != t { 5321 break 5322 } 5323 d := v_1_0.AuxInt 5324 x := v_1.Args[1] 5325 v.reset(OpAnd32) 5326 v0 := b.NewValue0(v.Pos, OpConst32, t) 5327 v0.AuxInt = int64(int32(c & d)) 5328 v.AddArg(v0) 5329 v.AddArg(x) 5330 return true 5331 } 5332 // match: (And32 (Const32 <t> [c]) (And32 x (Const32 <t> [d]))) 5333 // cond: 5334 // result: (And32 (Const32 <t> [int64(int32(c&d))]) x) 5335 for { 5336 _ = v.Args[1] 5337 v_0 := v.Args[0] 5338 if v_0.Op != OpConst32 { 5339 break 5340 } 5341 t := v_0.Type 5342 c := v_0.AuxInt 5343 v_1 := v.Args[1] 5344 if v_1.Op != OpAnd32 { 5345 break 5346 } 5347 _ = v_1.Args[1] 5348 x := v_1.Args[0] 5349 v_1_1 := v_1.Args[1] 5350 if v_1_1.Op != OpConst32 { 5351 break 5352 } 5353 if v_1_1.Type != t { 5354 break 5355 } 5356 d := v_1_1.AuxInt 5357 v.reset(OpAnd32) 5358 v0 := b.NewValue0(v.Pos, OpConst32, t) 5359 v0.AuxInt = int64(int32(c & d)) 5360 v.AddArg(v0) 5361 v.AddArg(x) 5362 return true 5363 } 5364 // match: (And32 (And32 (Const32 <t> [d]) x) (Const32 <t> [c])) 5365 // cond: 5366 // result: (And32 (Const32 <t> [int64(int32(c&d))]) x) 5367 for { 5368 _ = v.Args[1] 5369 v_0 := v.Args[0] 5370 if v_0.Op != OpAnd32 { 5371 break 5372 } 5373 _ = v_0.Args[1] 5374 v_0_0 := v_0.Args[0] 5375 if v_0_0.Op != OpConst32 { 5376 break 5377 } 5378 t := v_0_0.Type 5379 d := v_0_0.AuxInt 5380 x := v_0.Args[1] 5381 v_1 := v.Args[1] 5382 if v_1.Op != OpConst32 { 5383 break 5384 } 5385 if v_1.Type != t { 5386 break 5387 } 5388 c := v_1.AuxInt 5389 v.reset(OpAnd32) 5390 v0 := b.NewValue0(v.Pos, OpConst32, t) 5391 v0.AuxInt = int64(int32(c & d)) 5392 v.AddArg(v0) 5393 v.AddArg(x) 5394 return true 5395 } 5396 // match: (And32 (And32 x (Const32 <t> [d])) (Const32 <t> [c])) 5397 // cond: 5398 // result: (And32 (Const32 <t> [int64(int32(c&d))]) x) 5399 for { 5400 _ = v.Args[1] 5401 v_0 := v.Args[0] 5402 if v_0.Op != OpAnd32 { 5403 break 5404 } 5405 _ = v_0.Args[1] 5406 x := v_0.Args[0] 5407 v_0_1 := v_0.Args[1] 5408 if v_0_1.Op != OpConst32 { 5409 break 5410 } 5411 t := v_0_1.Type 5412 d := v_0_1.AuxInt 5413 v_1 := v.Args[1] 5414 if v_1.Op != OpConst32 { 5415 break 5416 } 5417 if v_1.Type != t { 5418 break 5419 } 5420 c := v_1.AuxInt 5421 v.reset(OpAnd32) 5422 v0 := b.NewValue0(v.Pos, OpConst32, t) 5423 v0.AuxInt = int64(int32(c & d)) 5424 v.AddArg(v0) 5425 v.AddArg(x) 5426 return true 5427 } 5428 return false 5429 } 5430 func rewriteValuegeneric_OpAnd64_0(v *Value) bool { 5431 // match: (And64 (Const64 [c]) (Const64 [d])) 5432 // cond: 5433 // result: (Const64 [c&d]) 5434 for { 5435 _ = v.Args[1] 5436 v_0 := v.Args[0] 5437 if v_0.Op != OpConst64 { 5438 break 5439 } 5440 c := v_0.AuxInt 5441 v_1 := v.Args[1] 5442 if v_1.Op != OpConst64 { 5443 break 5444 } 5445 d := v_1.AuxInt 5446 v.reset(OpConst64) 5447 v.AuxInt = c & d 5448 return true 5449 } 5450 // match: (And64 (Const64 [d]) (Const64 [c])) 5451 // cond: 5452 // result: (Const64 [c&d]) 5453 for { 5454 _ = v.Args[1] 5455 v_0 := v.Args[0] 5456 if v_0.Op != OpConst64 { 5457 break 5458 } 5459 d := v_0.AuxInt 5460 v_1 := v.Args[1] 5461 if v_1.Op != OpConst64 { 5462 break 5463 } 5464 c := v_1.AuxInt 5465 v.reset(OpConst64) 5466 v.AuxInt = c & d 5467 return true 5468 } 5469 // match: (And64 x x) 5470 // cond: 5471 // result: x 5472 for { 5473 _ = v.Args[1] 5474 x := v.Args[0] 5475 if x != v.Args[1] { 5476 break 5477 } 5478 v.reset(OpCopy) 5479 v.Type = x.Type 5480 v.AddArg(x) 5481 return true 5482 } 5483 // match: (And64 (Const64 [-1]) x) 5484 // cond: 5485 // result: x 5486 for { 5487 _ = v.Args[1] 5488 v_0 := v.Args[0] 5489 if v_0.Op != OpConst64 { 5490 break 5491 } 5492 if v_0.AuxInt != -1 { 5493 break 5494 } 5495 x := v.Args[1] 5496 v.reset(OpCopy) 5497 v.Type = x.Type 5498 v.AddArg(x) 5499 return true 5500 } 5501 // match: (And64 x (Const64 [-1])) 5502 // cond: 5503 // result: x 5504 for { 5505 _ = v.Args[1] 5506 x := v.Args[0] 5507 v_1 := v.Args[1] 5508 if v_1.Op != OpConst64 { 5509 break 5510 } 5511 if v_1.AuxInt != -1 { 5512 break 5513 } 5514 v.reset(OpCopy) 5515 v.Type = x.Type 5516 v.AddArg(x) 5517 return true 5518 } 5519 // match: (And64 (Const64 [0]) _) 5520 // cond: 5521 // result: (Const64 [0]) 5522 for { 5523 _ = v.Args[1] 5524 v_0 := v.Args[0] 5525 if v_0.Op != OpConst64 { 5526 break 5527 } 5528 if v_0.AuxInt != 0 { 5529 break 5530 } 5531 v.reset(OpConst64) 5532 v.AuxInt = 0 5533 return true 5534 } 5535 // match: (And64 _ (Const64 [0])) 5536 // cond: 5537 // result: (Const64 [0]) 5538 for { 5539 _ = v.Args[1] 5540 v_1 := v.Args[1] 5541 if v_1.Op != OpConst64 { 5542 break 5543 } 5544 if v_1.AuxInt != 0 { 5545 break 5546 } 5547 v.reset(OpConst64) 5548 v.AuxInt = 0 5549 return true 5550 } 5551 // match: (And64 x (And64 x y)) 5552 // cond: 5553 // result: (And64 x y) 5554 for { 5555 _ = v.Args[1] 5556 x := v.Args[0] 5557 v_1 := v.Args[1] 5558 if v_1.Op != OpAnd64 { 5559 break 5560 } 5561 _ = v_1.Args[1] 5562 if x != v_1.Args[0] { 5563 break 5564 } 5565 y := v_1.Args[1] 5566 v.reset(OpAnd64) 5567 v.AddArg(x) 5568 v.AddArg(y) 5569 return true 5570 } 5571 // match: (And64 x (And64 y x)) 5572 // cond: 5573 // result: (And64 x y) 5574 for { 5575 _ = v.Args[1] 5576 x := v.Args[0] 5577 v_1 := v.Args[1] 5578 if v_1.Op != OpAnd64 { 5579 break 5580 } 5581 _ = v_1.Args[1] 5582 y := v_1.Args[0] 5583 if x != v_1.Args[1] { 5584 break 5585 } 5586 v.reset(OpAnd64) 5587 v.AddArg(x) 5588 v.AddArg(y) 5589 return true 5590 } 5591 // match: (And64 (And64 x y) x) 5592 // cond: 5593 // result: (And64 x y) 5594 for { 5595 _ = v.Args[1] 5596 v_0 := v.Args[0] 5597 if v_0.Op != OpAnd64 { 5598 break 5599 } 5600 _ = v_0.Args[1] 5601 x := v_0.Args[0] 5602 y := v_0.Args[1] 5603 if x != v.Args[1] { 5604 break 5605 } 5606 v.reset(OpAnd64) 5607 v.AddArg(x) 5608 v.AddArg(y) 5609 return true 5610 } 5611 return false 5612 } 5613 func rewriteValuegeneric_OpAnd64_10(v *Value) bool { 5614 b := v.Block 5615 _ = b 5616 // match: (And64 (And64 y x) x) 5617 // cond: 5618 // result: (And64 x y) 5619 for { 5620 _ = v.Args[1] 5621 v_0 := v.Args[0] 5622 if v_0.Op != OpAnd64 { 5623 break 5624 } 5625 _ = v_0.Args[1] 5626 y := v_0.Args[0] 5627 x := v_0.Args[1] 5628 if x != v.Args[1] { 5629 break 5630 } 5631 v.reset(OpAnd64) 5632 v.AddArg(x) 5633 v.AddArg(y) 5634 return true 5635 } 5636 // match: (And64 <t> (Const64 [y]) x) 5637 // cond: nlz(y) + nto(y) == 64 && nto(y) >= 32 5638 // result: (Rsh64Ux64 (Lsh64x64 <t> x (Const64 <t> [nlz(y)])) (Const64 <t> [nlz(y)])) 5639 for { 5640 t := v.Type 5641 _ = v.Args[1] 5642 v_0 := v.Args[0] 5643 if v_0.Op != OpConst64 { 5644 break 5645 } 5646 y := v_0.AuxInt 5647 x := v.Args[1] 5648 if !(nlz(y)+nto(y) == 64 && nto(y) >= 32) { 5649 break 5650 } 5651 v.reset(OpRsh64Ux64) 5652 v0 := b.NewValue0(v.Pos, OpLsh64x64, t) 5653 v0.AddArg(x) 5654 v1 := b.NewValue0(v.Pos, OpConst64, t) 5655 v1.AuxInt = nlz(y) 5656 v0.AddArg(v1) 5657 v.AddArg(v0) 5658 v2 := b.NewValue0(v.Pos, OpConst64, t) 5659 v2.AuxInt = nlz(y) 5660 v.AddArg(v2) 5661 return true 5662 } 5663 // match: (And64 <t> x (Const64 [y])) 5664 // cond: nlz(y) + nto(y) == 64 && nto(y) >= 32 5665 // result: (Rsh64Ux64 (Lsh64x64 <t> x (Const64 <t> [nlz(y)])) (Const64 <t> [nlz(y)])) 5666 for { 5667 t := v.Type 5668 _ = v.Args[1] 5669 x := v.Args[0] 5670 v_1 := v.Args[1] 5671 if v_1.Op != OpConst64 { 5672 break 5673 } 5674 y := v_1.AuxInt 5675 if !(nlz(y)+nto(y) == 64 && nto(y) >= 32) { 5676 break 5677 } 5678 v.reset(OpRsh64Ux64) 5679 v0 := b.NewValue0(v.Pos, OpLsh64x64, t) 5680 v0.AddArg(x) 5681 v1 := b.NewValue0(v.Pos, OpConst64, t) 5682 v1.AuxInt = nlz(y) 5683 v0.AddArg(v1) 5684 v.AddArg(v0) 5685 v2 := b.NewValue0(v.Pos, OpConst64, t) 5686 v2.AuxInt = nlz(y) 5687 v.AddArg(v2) 5688 return true 5689 } 5690 // match: (And64 <t> (Const64 [y]) x) 5691 // cond: nlo(y) + ntz(y) == 64 && ntz(y) >= 32 5692 // result: (Lsh64x64 (Rsh64Ux64 <t> x (Const64 <t> [ntz(y)])) (Const64 <t> [ntz(y)])) 5693 for { 5694 t := v.Type 5695 _ = v.Args[1] 5696 v_0 := v.Args[0] 5697 if v_0.Op != OpConst64 { 5698 break 5699 } 5700 y := v_0.AuxInt 5701 x := v.Args[1] 5702 if !(nlo(y)+ntz(y) == 64 && ntz(y) >= 32) { 5703 break 5704 } 5705 v.reset(OpLsh64x64) 5706 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, t) 5707 v0.AddArg(x) 5708 v1 := b.NewValue0(v.Pos, OpConst64, t) 5709 v1.AuxInt = ntz(y) 5710 v0.AddArg(v1) 5711 v.AddArg(v0) 5712 v2 := b.NewValue0(v.Pos, OpConst64, t) 5713 v2.AuxInt = ntz(y) 5714 v.AddArg(v2) 5715 return true 5716 } 5717 // match: (And64 <t> x (Const64 [y])) 5718 // cond: nlo(y) + ntz(y) == 64 && ntz(y) >= 32 5719 // result: (Lsh64x64 (Rsh64Ux64 <t> x (Const64 <t> [ntz(y)])) (Const64 <t> [ntz(y)])) 5720 for { 5721 t := v.Type 5722 _ = v.Args[1] 5723 x := v.Args[0] 5724 v_1 := v.Args[1] 5725 if v_1.Op != OpConst64 { 5726 break 5727 } 5728 y := v_1.AuxInt 5729 if !(nlo(y)+ntz(y) == 64 && ntz(y) >= 32) { 5730 break 5731 } 5732 v.reset(OpLsh64x64) 5733 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, t) 5734 v0.AddArg(x) 5735 v1 := b.NewValue0(v.Pos, OpConst64, t) 5736 v1.AuxInt = ntz(y) 5737 v0.AddArg(v1) 5738 v.AddArg(v0) 5739 v2 := b.NewValue0(v.Pos, OpConst64, t) 5740 v2.AuxInt = ntz(y) 5741 v.AddArg(v2) 5742 return true 5743 } 5744 // match: (And64 (And64 i:(Const64 <t>) z) x) 5745 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 5746 // result: (And64 i (And64 <t> z x)) 5747 for { 5748 _ = v.Args[1] 5749 v_0 := v.Args[0] 5750 if v_0.Op != OpAnd64 { 5751 break 5752 } 5753 _ = v_0.Args[1] 5754 i := v_0.Args[0] 5755 if i.Op != OpConst64 { 5756 break 5757 } 5758 t := i.Type 5759 z := v_0.Args[1] 5760 x := v.Args[1] 5761 if !(z.Op != OpConst64 && x.Op != OpConst64) { 5762 break 5763 } 5764 v.reset(OpAnd64) 5765 v.AddArg(i) 5766 v0 := b.NewValue0(v.Pos, OpAnd64, t) 5767 v0.AddArg(z) 5768 v0.AddArg(x) 5769 v.AddArg(v0) 5770 return true 5771 } 5772 // match: (And64 (And64 z i:(Const64 <t>)) x) 5773 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 5774 // result: (And64 i (And64 <t> z x)) 5775 for { 5776 _ = v.Args[1] 5777 v_0 := v.Args[0] 5778 if v_0.Op != OpAnd64 { 5779 break 5780 } 5781 _ = v_0.Args[1] 5782 z := v_0.Args[0] 5783 i := v_0.Args[1] 5784 if i.Op != OpConst64 { 5785 break 5786 } 5787 t := i.Type 5788 x := v.Args[1] 5789 if !(z.Op != OpConst64 && x.Op != OpConst64) { 5790 break 5791 } 5792 v.reset(OpAnd64) 5793 v.AddArg(i) 5794 v0 := b.NewValue0(v.Pos, OpAnd64, t) 5795 v0.AddArg(z) 5796 v0.AddArg(x) 5797 v.AddArg(v0) 5798 return true 5799 } 5800 // match: (And64 x (And64 i:(Const64 <t>) z)) 5801 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 5802 // result: (And64 i (And64 <t> z x)) 5803 for { 5804 _ = v.Args[1] 5805 x := v.Args[0] 5806 v_1 := v.Args[1] 5807 if v_1.Op != OpAnd64 { 5808 break 5809 } 5810 _ = v_1.Args[1] 5811 i := v_1.Args[0] 5812 if i.Op != OpConst64 { 5813 break 5814 } 5815 t := i.Type 5816 z := v_1.Args[1] 5817 if !(z.Op != OpConst64 && x.Op != OpConst64) { 5818 break 5819 } 5820 v.reset(OpAnd64) 5821 v.AddArg(i) 5822 v0 := b.NewValue0(v.Pos, OpAnd64, t) 5823 v0.AddArg(z) 5824 v0.AddArg(x) 5825 v.AddArg(v0) 5826 return true 5827 } 5828 // match: (And64 x (And64 z i:(Const64 <t>))) 5829 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 5830 // result: (And64 i (And64 <t> z x)) 5831 for { 5832 _ = v.Args[1] 5833 x := v.Args[0] 5834 v_1 := v.Args[1] 5835 if v_1.Op != OpAnd64 { 5836 break 5837 } 5838 _ = v_1.Args[1] 5839 z := v_1.Args[0] 5840 i := v_1.Args[1] 5841 if i.Op != OpConst64 { 5842 break 5843 } 5844 t := i.Type 5845 if !(z.Op != OpConst64 && x.Op != OpConst64) { 5846 break 5847 } 5848 v.reset(OpAnd64) 5849 v.AddArg(i) 5850 v0 := b.NewValue0(v.Pos, OpAnd64, t) 5851 v0.AddArg(z) 5852 v0.AddArg(x) 5853 v.AddArg(v0) 5854 return true 5855 } 5856 // match: (And64 (Const64 <t> [c]) (And64 (Const64 <t> [d]) x)) 5857 // cond: 5858 // result: (And64 (Const64 <t> [c&d]) x) 5859 for { 5860 _ = v.Args[1] 5861 v_0 := v.Args[0] 5862 if v_0.Op != OpConst64 { 5863 break 5864 } 5865 t := v_0.Type 5866 c := v_0.AuxInt 5867 v_1 := v.Args[1] 5868 if v_1.Op != OpAnd64 { 5869 break 5870 } 5871 _ = v_1.Args[1] 5872 v_1_0 := v_1.Args[0] 5873 if v_1_0.Op != OpConst64 { 5874 break 5875 } 5876 if v_1_0.Type != t { 5877 break 5878 } 5879 d := v_1_0.AuxInt 5880 x := v_1.Args[1] 5881 v.reset(OpAnd64) 5882 v0 := b.NewValue0(v.Pos, OpConst64, t) 5883 v0.AuxInt = c & d 5884 v.AddArg(v0) 5885 v.AddArg(x) 5886 return true 5887 } 5888 return false 5889 } 5890 func rewriteValuegeneric_OpAnd64_20(v *Value) bool { 5891 b := v.Block 5892 _ = b 5893 // match: (And64 (Const64 <t> [c]) (And64 x (Const64 <t> [d]))) 5894 // cond: 5895 // result: (And64 (Const64 <t> [c&d]) x) 5896 for { 5897 _ = v.Args[1] 5898 v_0 := v.Args[0] 5899 if v_0.Op != OpConst64 { 5900 break 5901 } 5902 t := v_0.Type 5903 c := v_0.AuxInt 5904 v_1 := v.Args[1] 5905 if v_1.Op != OpAnd64 { 5906 break 5907 } 5908 _ = v_1.Args[1] 5909 x := v_1.Args[0] 5910 v_1_1 := v_1.Args[1] 5911 if v_1_1.Op != OpConst64 { 5912 break 5913 } 5914 if v_1_1.Type != t { 5915 break 5916 } 5917 d := v_1_1.AuxInt 5918 v.reset(OpAnd64) 5919 v0 := b.NewValue0(v.Pos, OpConst64, t) 5920 v0.AuxInt = c & d 5921 v.AddArg(v0) 5922 v.AddArg(x) 5923 return true 5924 } 5925 // match: (And64 (And64 (Const64 <t> [d]) x) (Const64 <t> [c])) 5926 // cond: 5927 // result: (And64 (Const64 <t> [c&d]) x) 5928 for { 5929 _ = v.Args[1] 5930 v_0 := v.Args[0] 5931 if v_0.Op != OpAnd64 { 5932 break 5933 } 5934 _ = v_0.Args[1] 5935 v_0_0 := v_0.Args[0] 5936 if v_0_0.Op != OpConst64 { 5937 break 5938 } 5939 t := v_0_0.Type 5940 d := v_0_0.AuxInt 5941 x := v_0.Args[1] 5942 v_1 := v.Args[1] 5943 if v_1.Op != OpConst64 { 5944 break 5945 } 5946 if v_1.Type != t { 5947 break 5948 } 5949 c := v_1.AuxInt 5950 v.reset(OpAnd64) 5951 v0 := b.NewValue0(v.Pos, OpConst64, t) 5952 v0.AuxInt = c & d 5953 v.AddArg(v0) 5954 v.AddArg(x) 5955 return true 5956 } 5957 // match: (And64 (And64 x (Const64 <t> [d])) (Const64 <t> [c])) 5958 // cond: 5959 // result: (And64 (Const64 <t> [c&d]) x) 5960 for { 5961 _ = v.Args[1] 5962 v_0 := v.Args[0] 5963 if v_0.Op != OpAnd64 { 5964 break 5965 } 5966 _ = v_0.Args[1] 5967 x := v_0.Args[0] 5968 v_0_1 := v_0.Args[1] 5969 if v_0_1.Op != OpConst64 { 5970 break 5971 } 5972 t := v_0_1.Type 5973 d := v_0_1.AuxInt 5974 v_1 := v.Args[1] 5975 if v_1.Op != OpConst64 { 5976 break 5977 } 5978 if v_1.Type != t { 5979 break 5980 } 5981 c := v_1.AuxInt 5982 v.reset(OpAnd64) 5983 v0 := b.NewValue0(v.Pos, OpConst64, t) 5984 v0.AuxInt = c & d 5985 v.AddArg(v0) 5986 v.AddArg(x) 5987 return true 5988 } 5989 return false 5990 } 5991 func rewriteValuegeneric_OpAnd8_0(v *Value) bool { 5992 // match: (And8 (Const8 [c]) (Const8 [d])) 5993 // cond: 5994 // result: (Const8 [int64(int8(c&d))]) 5995 for { 5996 _ = v.Args[1] 5997 v_0 := v.Args[0] 5998 if v_0.Op != OpConst8 { 5999 break 6000 } 6001 c := v_0.AuxInt 6002 v_1 := v.Args[1] 6003 if v_1.Op != OpConst8 { 6004 break 6005 } 6006 d := v_1.AuxInt 6007 v.reset(OpConst8) 6008 v.AuxInt = int64(int8(c & d)) 6009 return true 6010 } 6011 // match: (And8 (Const8 [d]) (Const8 [c])) 6012 // cond: 6013 // result: (Const8 [int64(int8(c&d))]) 6014 for { 6015 _ = v.Args[1] 6016 v_0 := v.Args[0] 6017 if v_0.Op != OpConst8 { 6018 break 6019 } 6020 d := v_0.AuxInt 6021 v_1 := v.Args[1] 6022 if v_1.Op != OpConst8 { 6023 break 6024 } 6025 c := v_1.AuxInt 6026 v.reset(OpConst8) 6027 v.AuxInt = int64(int8(c & d)) 6028 return true 6029 } 6030 // match: (And8 x x) 6031 // cond: 6032 // result: x 6033 for { 6034 _ = v.Args[1] 6035 x := v.Args[0] 6036 if x != v.Args[1] { 6037 break 6038 } 6039 v.reset(OpCopy) 6040 v.Type = x.Type 6041 v.AddArg(x) 6042 return true 6043 } 6044 // match: (And8 (Const8 [-1]) x) 6045 // cond: 6046 // result: x 6047 for { 6048 _ = v.Args[1] 6049 v_0 := v.Args[0] 6050 if v_0.Op != OpConst8 { 6051 break 6052 } 6053 if v_0.AuxInt != -1 { 6054 break 6055 } 6056 x := v.Args[1] 6057 v.reset(OpCopy) 6058 v.Type = x.Type 6059 v.AddArg(x) 6060 return true 6061 } 6062 // match: (And8 x (Const8 [-1])) 6063 // cond: 6064 // result: x 6065 for { 6066 _ = v.Args[1] 6067 x := v.Args[0] 6068 v_1 := v.Args[1] 6069 if v_1.Op != OpConst8 { 6070 break 6071 } 6072 if v_1.AuxInt != -1 { 6073 break 6074 } 6075 v.reset(OpCopy) 6076 v.Type = x.Type 6077 v.AddArg(x) 6078 return true 6079 } 6080 // match: (And8 (Const8 [0]) _) 6081 // cond: 6082 // result: (Const8 [0]) 6083 for { 6084 _ = v.Args[1] 6085 v_0 := v.Args[0] 6086 if v_0.Op != OpConst8 { 6087 break 6088 } 6089 if v_0.AuxInt != 0 { 6090 break 6091 } 6092 v.reset(OpConst8) 6093 v.AuxInt = 0 6094 return true 6095 } 6096 // match: (And8 _ (Const8 [0])) 6097 // cond: 6098 // result: (Const8 [0]) 6099 for { 6100 _ = v.Args[1] 6101 v_1 := v.Args[1] 6102 if v_1.Op != OpConst8 { 6103 break 6104 } 6105 if v_1.AuxInt != 0 { 6106 break 6107 } 6108 v.reset(OpConst8) 6109 v.AuxInt = 0 6110 return true 6111 } 6112 // match: (And8 x (And8 x y)) 6113 // cond: 6114 // result: (And8 x y) 6115 for { 6116 _ = v.Args[1] 6117 x := v.Args[0] 6118 v_1 := v.Args[1] 6119 if v_1.Op != OpAnd8 { 6120 break 6121 } 6122 _ = v_1.Args[1] 6123 if x != v_1.Args[0] { 6124 break 6125 } 6126 y := v_1.Args[1] 6127 v.reset(OpAnd8) 6128 v.AddArg(x) 6129 v.AddArg(y) 6130 return true 6131 } 6132 // match: (And8 x (And8 y x)) 6133 // cond: 6134 // result: (And8 x y) 6135 for { 6136 _ = v.Args[1] 6137 x := v.Args[0] 6138 v_1 := v.Args[1] 6139 if v_1.Op != OpAnd8 { 6140 break 6141 } 6142 _ = v_1.Args[1] 6143 y := v_1.Args[0] 6144 if x != v_1.Args[1] { 6145 break 6146 } 6147 v.reset(OpAnd8) 6148 v.AddArg(x) 6149 v.AddArg(y) 6150 return true 6151 } 6152 // match: (And8 (And8 x y) x) 6153 // cond: 6154 // result: (And8 x y) 6155 for { 6156 _ = v.Args[1] 6157 v_0 := v.Args[0] 6158 if v_0.Op != OpAnd8 { 6159 break 6160 } 6161 _ = v_0.Args[1] 6162 x := v_0.Args[0] 6163 y := v_0.Args[1] 6164 if x != v.Args[1] { 6165 break 6166 } 6167 v.reset(OpAnd8) 6168 v.AddArg(x) 6169 v.AddArg(y) 6170 return true 6171 } 6172 return false 6173 } 6174 func rewriteValuegeneric_OpAnd8_10(v *Value) bool { 6175 b := v.Block 6176 _ = b 6177 // match: (And8 (And8 y x) x) 6178 // cond: 6179 // result: (And8 x y) 6180 for { 6181 _ = v.Args[1] 6182 v_0 := v.Args[0] 6183 if v_0.Op != OpAnd8 { 6184 break 6185 } 6186 _ = v_0.Args[1] 6187 y := v_0.Args[0] 6188 x := v_0.Args[1] 6189 if x != v.Args[1] { 6190 break 6191 } 6192 v.reset(OpAnd8) 6193 v.AddArg(x) 6194 v.AddArg(y) 6195 return true 6196 } 6197 // match: (And8 (And8 i:(Const8 <t>) z) x) 6198 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 6199 // result: (And8 i (And8 <t> z x)) 6200 for { 6201 _ = v.Args[1] 6202 v_0 := v.Args[0] 6203 if v_0.Op != OpAnd8 { 6204 break 6205 } 6206 _ = v_0.Args[1] 6207 i := v_0.Args[0] 6208 if i.Op != OpConst8 { 6209 break 6210 } 6211 t := i.Type 6212 z := v_0.Args[1] 6213 x := v.Args[1] 6214 if !(z.Op != OpConst8 && x.Op != OpConst8) { 6215 break 6216 } 6217 v.reset(OpAnd8) 6218 v.AddArg(i) 6219 v0 := b.NewValue0(v.Pos, OpAnd8, t) 6220 v0.AddArg(z) 6221 v0.AddArg(x) 6222 v.AddArg(v0) 6223 return true 6224 } 6225 // match: (And8 (And8 z i:(Const8 <t>)) x) 6226 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 6227 // result: (And8 i (And8 <t> z x)) 6228 for { 6229 _ = v.Args[1] 6230 v_0 := v.Args[0] 6231 if v_0.Op != OpAnd8 { 6232 break 6233 } 6234 _ = v_0.Args[1] 6235 z := v_0.Args[0] 6236 i := v_0.Args[1] 6237 if i.Op != OpConst8 { 6238 break 6239 } 6240 t := i.Type 6241 x := v.Args[1] 6242 if !(z.Op != OpConst8 && x.Op != OpConst8) { 6243 break 6244 } 6245 v.reset(OpAnd8) 6246 v.AddArg(i) 6247 v0 := b.NewValue0(v.Pos, OpAnd8, t) 6248 v0.AddArg(z) 6249 v0.AddArg(x) 6250 v.AddArg(v0) 6251 return true 6252 } 6253 // match: (And8 x (And8 i:(Const8 <t>) z)) 6254 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 6255 // result: (And8 i (And8 <t> z x)) 6256 for { 6257 _ = v.Args[1] 6258 x := v.Args[0] 6259 v_1 := v.Args[1] 6260 if v_1.Op != OpAnd8 { 6261 break 6262 } 6263 _ = v_1.Args[1] 6264 i := v_1.Args[0] 6265 if i.Op != OpConst8 { 6266 break 6267 } 6268 t := i.Type 6269 z := v_1.Args[1] 6270 if !(z.Op != OpConst8 && x.Op != OpConst8) { 6271 break 6272 } 6273 v.reset(OpAnd8) 6274 v.AddArg(i) 6275 v0 := b.NewValue0(v.Pos, OpAnd8, t) 6276 v0.AddArg(z) 6277 v0.AddArg(x) 6278 v.AddArg(v0) 6279 return true 6280 } 6281 // match: (And8 x (And8 z i:(Const8 <t>))) 6282 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 6283 // result: (And8 i (And8 <t> z x)) 6284 for { 6285 _ = v.Args[1] 6286 x := v.Args[0] 6287 v_1 := v.Args[1] 6288 if v_1.Op != OpAnd8 { 6289 break 6290 } 6291 _ = v_1.Args[1] 6292 z := v_1.Args[0] 6293 i := v_1.Args[1] 6294 if i.Op != OpConst8 { 6295 break 6296 } 6297 t := i.Type 6298 if !(z.Op != OpConst8 && x.Op != OpConst8) { 6299 break 6300 } 6301 v.reset(OpAnd8) 6302 v.AddArg(i) 6303 v0 := b.NewValue0(v.Pos, OpAnd8, t) 6304 v0.AddArg(z) 6305 v0.AddArg(x) 6306 v.AddArg(v0) 6307 return true 6308 } 6309 // match: (And8 (Const8 <t> [c]) (And8 (Const8 <t> [d]) x)) 6310 // cond: 6311 // result: (And8 (Const8 <t> [int64(int8(c&d))]) x) 6312 for { 6313 _ = v.Args[1] 6314 v_0 := v.Args[0] 6315 if v_0.Op != OpConst8 { 6316 break 6317 } 6318 t := v_0.Type 6319 c := v_0.AuxInt 6320 v_1 := v.Args[1] 6321 if v_1.Op != OpAnd8 { 6322 break 6323 } 6324 _ = v_1.Args[1] 6325 v_1_0 := v_1.Args[0] 6326 if v_1_0.Op != OpConst8 { 6327 break 6328 } 6329 if v_1_0.Type != t { 6330 break 6331 } 6332 d := v_1_0.AuxInt 6333 x := v_1.Args[1] 6334 v.reset(OpAnd8) 6335 v0 := b.NewValue0(v.Pos, OpConst8, t) 6336 v0.AuxInt = int64(int8(c & d)) 6337 v.AddArg(v0) 6338 v.AddArg(x) 6339 return true 6340 } 6341 // match: (And8 (Const8 <t> [c]) (And8 x (Const8 <t> [d]))) 6342 // cond: 6343 // result: (And8 (Const8 <t> [int64(int8(c&d))]) x) 6344 for { 6345 _ = v.Args[1] 6346 v_0 := v.Args[0] 6347 if v_0.Op != OpConst8 { 6348 break 6349 } 6350 t := v_0.Type 6351 c := v_0.AuxInt 6352 v_1 := v.Args[1] 6353 if v_1.Op != OpAnd8 { 6354 break 6355 } 6356 _ = v_1.Args[1] 6357 x := v_1.Args[0] 6358 v_1_1 := v_1.Args[1] 6359 if v_1_1.Op != OpConst8 { 6360 break 6361 } 6362 if v_1_1.Type != t { 6363 break 6364 } 6365 d := v_1_1.AuxInt 6366 v.reset(OpAnd8) 6367 v0 := b.NewValue0(v.Pos, OpConst8, t) 6368 v0.AuxInt = int64(int8(c & d)) 6369 v.AddArg(v0) 6370 v.AddArg(x) 6371 return true 6372 } 6373 // match: (And8 (And8 (Const8 <t> [d]) x) (Const8 <t> [c])) 6374 // cond: 6375 // result: (And8 (Const8 <t> [int64(int8(c&d))]) x) 6376 for { 6377 _ = v.Args[1] 6378 v_0 := v.Args[0] 6379 if v_0.Op != OpAnd8 { 6380 break 6381 } 6382 _ = v_0.Args[1] 6383 v_0_0 := v_0.Args[0] 6384 if v_0_0.Op != OpConst8 { 6385 break 6386 } 6387 t := v_0_0.Type 6388 d := v_0_0.AuxInt 6389 x := v_0.Args[1] 6390 v_1 := v.Args[1] 6391 if v_1.Op != OpConst8 { 6392 break 6393 } 6394 if v_1.Type != t { 6395 break 6396 } 6397 c := v_1.AuxInt 6398 v.reset(OpAnd8) 6399 v0 := b.NewValue0(v.Pos, OpConst8, t) 6400 v0.AuxInt = int64(int8(c & d)) 6401 v.AddArg(v0) 6402 v.AddArg(x) 6403 return true 6404 } 6405 // match: (And8 (And8 x (Const8 <t> [d])) (Const8 <t> [c])) 6406 // cond: 6407 // result: (And8 (Const8 <t> [int64(int8(c&d))]) x) 6408 for { 6409 _ = v.Args[1] 6410 v_0 := v.Args[0] 6411 if v_0.Op != OpAnd8 { 6412 break 6413 } 6414 _ = v_0.Args[1] 6415 x := v_0.Args[0] 6416 v_0_1 := v_0.Args[1] 6417 if v_0_1.Op != OpConst8 { 6418 break 6419 } 6420 t := v_0_1.Type 6421 d := v_0_1.AuxInt 6422 v_1 := v.Args[1] 6423 if v_1.Op != OpConst8 { 6424 break 6425 } 6426 if v_1.Type != t { 6427 break 6428 } 6429 c := v_1.AuxInt 6430 v.reset(OpAnd8) 6431 v0 := b.NewValue0(v.Pos, OpConst8, t) 6432 v0.AuxInt = int64(int8(c & d)) 6433 v.AddArg(v0) 6434 v.AddArg(x) 6435 return true 6436 } 6437 return false 6438 } 6439 func rewriteValuegeneric_OpArg_0(v *Value) bool { 6440 b := v.Block 6441 _ = b 6442 config := b.Func.Config 6443 _ = config 6444 fe := b.Func.fe 6445 _ = fe 6446 typ := &b.Func.Config.Types 6447 _ = typ 6448 // match: (Arg {n} [off]) 6449 // cond: v.Type.IsString() 6450 // result: (StringMake (Arg <typ.BytePtr> {n} [off]) (Arg <typ.Int> {n} [off+config.PtrSize])) 6451 for { 6452 off := v.AuxInt 6453 n := v.Aux 6454 if !(v.Type.IsString()) { 6455 break 6456 } 6457 v.reset(OpStringMake) 6458 v0 := b.NewValue0(v.Pos, OpArg, typ.BytePtr) 6459 v0.AuxInt = off 6460 v0.Aux = n 6461 v.AddArg(v0) 6462 v1 := b.NewValue0(v.Pos, OpArg, typ.Int) 6463 v1.AuxInt = off + config.PtrSize 6464 v1.Aux = n 6465 v.AddArg(v1) 6466 return true 6467 } 6468 // match: (Arg {n} [off]) 6469 // cond: v.Type.IsSlice() 6470 // result: (SliceMake (Arg <v.Type.ElemType().PtrTo()> {n} [off]) (Arg <typ.Int> {n} [off+config.PtrSize]) (Arg <typ.Int> {n} [off+2*config.PtrSize])) 6471 for { 6472 off := v.AuxInt 6473 n := v.Aux 6474 if !(v.Type.IsSlice()) { 6475 break 6476 } 6477 v.reset(OpSliceMake) 6478 v0 := b.NewValue0(v.Pos, OpArg, v.Type.ElemType().PtrTo()) 6479 v0.AuxInt = off 6480 v0.Aux = n 6481 v.AddArg(v0) 6482 v1 := b.NewValue0(v.Pos, OpArg, typ.Int) 6483 v1.AuxInt = off + config.PtrSize 6484 v1.Aux = n 6485 v.AddArg(v1) 6486 v2 := b.NewValue0(v.Pos, OpArg, typ.Int) 6487 v2.AuxInt = off + 2*config.PtrSize 6488 v2.Aux = n 6489 v.AddArg(v2) 6490 return true 6491 } 6492 // match: (Arg {n} [off]) 6493 // cond: v.Type.IsInterface() 6494 // result: (IMake (Arg <typ.BytePtr> {n} [off]) (Arg <typ.BytePtr> {n} [off+config.PtrSize])) 6495 for { 6496 off := v.AuxInt 6497 n := v.Aux 6498 if !(v.Type.IsInterface()) { 6499 break 6500 } 6501 v.reset(OpIMake) 6502 v0 := b.NewValue0(v.Pos, OpArg, typ.BytePtr) 6503 v0.AuxInt = off 6504 v0.Aux = n 6505 v.AddArg(v0) 6506 v1 := b.NewValue0(v.Pos, OpArg, typ.BytePtr) 6507 v1.AuxInt = off + config.PtrSize 6508 v1.Aux = n 6509 v.AddArg(v1) 6510 return true 6511 } 6512 // match: (Arg {n} [off]) 6513 // cond: v.Type.IsComplex() && v.Type.Size() == 16 6514 // result: (ComplexMake (Arg <typ.Float64> {n} [off]) (Arg <typ.Float64> {n} [off+8])) 6515 for { 6516 off := v.AuxInt 6517 n := v.Aux 6518 if !(v.Type.IsComplex() && v.Type.Size() == 16) { 6519 break 6520 } 6521 v.reset(OpComplexMake) 6522 v0 := b.NewValue0(v.Pos, OpArg, typ.Float64) 6523 v0.AuxInt = off 6524 v0.Aux = n 6525 v.AddArg(v0) 6526 v1 := b.NewValue0(v.Pos, OpArg, typ.Float64) 6527 v1.AuxInt = off + 8 6528 v1.Aux = n 6529 v.AddArg(v1) 6530 return true 6531 } 6532 // match: (Arg {n} [off]) 6533 // cond: v.Type.IsComplex() && v.Type.Size() == 8 6534 // result: (ComplexMake (Arg <typ.Float32> {n} [off]) (Arg <typ.Float32> {n} [off+4])) 6535 for { 6536 off := v.AuxInt 6537 n := v.Aux 6538 if !(v.Type.IsComplex() && v.Type.Size() == 8) { 6539 break 6540 } 6541 v.reset(OpComplexMake) 6542 v0 := b.NewValue0(v.Pos, OpArg, typ.Float32) 6543 v0.AuxInt = off 6544 v0.Aux = n 6545 v.AddArg(v0) 6546 v1 := b.NewValue0(v.Pos, OpArg, typ.Float32) 6547 v1.AuxInt = off + 4 6548 v1.Aux = n 6549 v.AddArg(v1) 6550 return true 6551 } 6552 // match: (Arg <t>) 6553 // cond: t.IsStruct() && t.NumFields() == 0 && fe.CanSSA(t) 6554 // result: (StructMake0) 6555 for { 6556 t := v.Type 6557 if !(t.IsStruct() && t.NumFields() == 0 && fe.CanSSA(t)) { 6558 break 6559 } 6560 v.reset(OpStructMake0) 6561 return true 6562 } 6563 // match: (Arg <t> {n} [off]) 6564 // cond: t.IsStruct() && t.NumFields() == 1 && fe.CanSSA(t) 6565 // result: (StructMake1 (Arg <t.FieldType(0)> {n} [off+t.FieldOff(0)])) 6566 for { 6567 t := v.Type 6568 off := v.AuxInt 6569 n := v.Aux 6570 if !(t.IsStruct() && t.NumFields() == 1 && fe.CanSSA(t)) { 6571 break 6572 } 6573 v.reset(OpStructMake1) 6574 v0 := b.NewValue0(v.Pos, OpArg, t.FieldType(0)) 6575 v0.AuxInt = off + t.FieldOff(0) 6576 v0.Aux = n 6577 v.AddArg(v0) 6578 return true 6579 } 6580 // match: (Arg <t> {n} [off]) 6581 // cond: t.IsStruct() && t.NumFields() == 2 && fe.CanSSA(t) 6582 // result: (StructMake2 (Arg <t.FieldType(0)> {n} [off+t.FieldOff(0)]) (Arg <t.FieldType(1)> {n} [off+t.FieldOff(1)])) 6583 for { 6584 t := v.Type 6585 off := v.AuxInt 6586 n := v.Aux 6587 if !(t.IsStruct() && t.NumFields() == 2 && fe.CanSSA(t)) { 6588 break 6589 } 6590 v.reset(OpStructMake2) 6591 v0 := b.NewValue0(v.Pos, OpArg, t.FieldType(0)) 6592 v0.AuxInt = off + t.FieldOff(0) 6593 v0.Aux = n 6594 v.AddArg(v0) 6595 v1 := b.NewValue0(v.Pos, OpArg, t.FieldType(1)) 6596 v1.AuxInt = off + t.FieldOff(1) 6597 v1.Aux = n 6598 v.AddArg(v1) 6599 return true 6600 } 6601 // match: (Arg <t> {n} [off]) 6602 // cond: t.IsStruct() && t.NumFields() == 3 && fe.CanSSA(t) 6603 // 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)])) 6604 for { 6605 t := v.Type 6606 off := v.AuxInt 6607 n := v.Aux 6608 if !(t.IsStruct() && t.NumFields() == 3 && fe.CanSSA(t)) { 6609 break 6610 } 6611 v.reset(OpStructMake3) 6612 v0 := b.NewValue0(v.Pos, OpArg, t.FieldType(0)) 6613 v0.AuxInt = off + t.FieldOff(0) 6614 v0.Aux = n 6615 v.AddArg(v0) 6616 v1 := b.NewValue0(v.Pos, OpArg, t.FieldType(1)) 6617 v1.AuxInt = off + t.FieldOff(1) 6618 v1.Aux = n 6619 v.AddArg(v1) 6620 v2 := b.NewValue0(v.Pos, OpArg, t.FieldType(2)) 6621 v2.AuxInt = off + t.FieldOff(2) 6622 v2.Aux = n 6623 v.AddArg(v2) 6624 return true 6625 } 6626 // match: (Arg <t> {n} [off]) 6627 // cond: t.IsStruct() && t.NumFields() == 4 && fe.CanSSA(t) 6628 // 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)])) 6629 for { 6630 t := v.Type 6631 off := v.AuxInt 6632 n := v.Aux 6633 if !(t.IsStruct() && t.NumFields() == 4 && fe.CanSSA(t)) { 6634 break 6635 } 6636 v.reset(OpStructMake4) 6637 v0 := b.NewValue0(v.Pos, OpArg, t.FieldType(0)) 6638 v0.AuxInt = off + t.FieldOff(0) 6639 v0.Aux = n 6640 v.AddArg(v0) 6641 v1 := b.NewValue0(v.Pos, OpArg, t.FieldType(1)) 6642 v1.AuxInt = off + t.FieldOff(1) 6643 v1.Aux = n 6644 v.AddArg(v1) 6645 v2 := b.NewValue0(v.Pos, OpArg, t.FieldType(2)) 6646 v2.AuxInt = off + t.FieldOff(2) 6647 v2.Aux = n 6648 v.AddArg(v2) 6649 v3 := b.NewValue0(v.Pos, OpArg, t.FieldType(3)) 6650 v3.AuxInt = off + t.FieldOff(3) 6651 v3.Aux = n 6652 v.AddArg(v3) 6653 return true 6654 } 6655 return false 6656 } 6657 func rewriteValuegeneric_OpArg_10(v *Value) bool { 6658 b := v.Block 6659 _ = b 6660 fe := b.Func.fe 6661 _ = fe 6662 // match: (Arg <t>) 6663 // cond: t.IsArray() && t.NumElem() == 0 6664 // result: (ArrayMake0) 6665 for { 6666 t := v.Type 6667 if !(t.IsArray() && t.NumElem() == 0) { 6668 break 6669 } 6670 v.reset(OpArrayMake0) 6671 return true 6672 } 6673 // match: (Arg <t> {n} [off]) 6674 // cond: t.IsArray() && t.NumElem() == 1 && fe.CanSSA(t) 6675 // result: (ArrayMake1 (Arg <t.ElemType()> {n} [off])) 6676 for { 6677 t := v.Type 6678 off := v.AuxInt 6679 n := v.Aux 6680 if !(t.IsArray() && t.NumElem() == 1 && fe.CanSSA(t)) { 6681 break 6682 } 6683 v.reset(OpArrayMake1) 6684 v0 := b.NewValue0(v.Pos, OpArg, t.ElemType()) 6685 v0.AuxInt = off 6686 v0.Aux = n 6687 v.AddArg(v0) 6688 return true 6689 } 6690 return false 6691 } 6692 func rewriteValuegeneric_OpArraySelect_0(v *Value) bool { 6693 // match: (ArraySelect (ArrayMake1 x)) 6694 // cond: 6695 // result: x 6696 for { 6697 v_0 := v.Args[0] 6698 if v_0.Op != OpArrayMake1 { 6699 break 6700 } 6701 x := v_0.Args[0] 6702 v.reset(OpCopy) 6703 v.Type = x.Type 6704 v.AddArg(x) 6705 return true 6706 } 6707 // match: (ArraySelect [0] (Load ptr mem)) 6708 // cond: 6709 // result: (Load ptr mem) 6710 for { 6711 if v.AuxInt != 0 { 6712 break 6713 } 6714 v_0 := v.Args[0] 6715 if v_0.Op != OpLoad { 6716 break 6717 } 6718 _ = v_0.Args[1] 6719 ptr := v_0.Args[0] 6720 mem := v_0.Args[1] 6721 v.reset(OpLoad) 6722 v.AddArg(ptr) 6723 v.AddArg(mem) 6724 return true 6725 } 6726 // match: (ArraySelect [0] x:(IData _)) 6727 // cond: 6728 // result: x 6729 for { 6730 if v.AuxInt != 0 { 6731 break 6732 } 6733 x := v.Args[0] 6734 if x.Op != OpIData { 6735 break 6736 } 6737 v.reset(OpCopy) 6738 v.Type = x.Type 6739 v.AddArg(x) 6740 return true 6741 } 6742 return false 6743 } 6744 func rewriteValuegeneric_OpCom16_0(v *Value) bool { 6745 // match: (Com16 (Com16 x)) 6746 // cond: 6747 // result: x 6748 for { 6749 v_0 := v.Args[0] 6750 if v_0.Op != OpCom16 { 6751 break 6752 } 6753 x := v_0.Args[0] 6754 v.reset(OpCopy) 6755 v.Type = x.Type 6756 v.AddArg(x) 6757 return true 6758 } 6759 // match: (Com16 (Const16 [c])) 6760 // cond: 6761 // result: (Const16 [^c]) 6762 for { 6763 v_0 := v.Args[0] 6764 if v_0.Op != OpConst16 { 6765 break 6766 } 6767 c := v_0.AuxInt 6768 v.reset(OpConst16) 6769 v.AuxInt = ^c 6770 return true 6771 } 6772 return false 6773 } 6774 func rewriteValuegeneric_OpCom32_0(v *Value) bool { 6775 // match: (Com32 (Com32 x)) 6776 // cond: 6777 // result: x 6778 for { 6779 v_0 := v.Args[0] 6780 if v_0.Op != OpCom32 { 6781 break 6782 } 6783 x := v_0.Args[0] 6784 v.reset(OpCopy) 6785 v.Type = x.Type 6786 v.AddArg(x) 6787 return true 6788 } 6789 // match: (Com32 (Const32 [c])) 6790 // cond: 6791 // result: (Const32 [^c]) 6792 for { 6793 v_0 := v.Args[0] 6794 if v_0.Op != OpConst32 { 6795 break 6796 } 6797 c := v_0.AuxInt 6798 v.reset(OpConst32) 6799 v.AuxInt = ^c 6800 return true 6801 } 6802 return false 6803 } 6804 func rewriteValuegeneric_OpCom64_0(v *Value) bool { 6805 // match: (Com64 (Com64 x)) 6806 // cond: 6807 // result: x 6808 for { 6809 v_0 := v.Args[0] 6810 if v_0.Op != OpCom64 { 6811 break 6812 } 6813 x := v_0.Args[0] 6814 v.reset(OpCopy) 6815 v.Type = x.Type 6816 v.AddArg(x) 6817 return true 6818 } 6819 // match: (Com64 (Const64 [c])) 6820 // cond: 6821 // result: (Const64 [^c]) 6822 for { 6823 v_0 := v.Args[0] 6824 if v_0.Op != OpConst64 { 6825 break 6826 } 6827 c := v_0.AuxInt 6828 v.reset(OpConst64) 6829 v.AuxInt = ^c 6830 return true 6831 } 6832 return false 6833 } 6834 func rewriteValuegeneric_OpCom8_0(v *Value) bool { 6835 // match: (Com8 (Com8 x)) 6836 // cond: 6837 // result: x 6838 for { 6839 v_0 := v.Args[0] 6840 if v_0.Op != OpCom8 { 6841 break 6842 } 6843 x := v_0.Args[0] 6844 v.reset(OpCopy) 6845 v.Type = x.Type 6846 v.AddArg(x) 6847 return true 6848 } 6849 // match: (Com8 (Const8 [c])) 6850 // cond: 6851 // result: (Const8 [^c]) 6852 for { 6853 v_0 := v.Args[0] 6854 if v_0.Op != OpConst8 { 6855 break 6856 } 6857 c := v_0.AuxInt 6858 v.reset(OpConst8) 6859 v.AuxInt = ^c 6860 return true 6861 } 6862 return false 6863 } 6864 func rewriteValuegeneric_OpConstInterface_0(v *Value) bool { 6865 b := v.Block 6866 _ = b 6867 typ := &b.Func.Config.Types 6868 _ = typ 6869 // match: (ConstInterface) 6870 // cond: 6871 // result: (IMake (ConstNil <typ.BytePtr>) (ConstNil <typ.BytePtr>)) 6872 for { 6873 v.reset(OpIMake) 6874 v0 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr) 6875 v.AddArg(v0) 6876 v1 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr) 6877 v.AddArg(v1) 6878 return true 6879 } 6880 } 6881 func rewriteValuegeneric_OpConstSlice_0(v *Value) bool { 6882 b := v.Block 6883 _ = b 6884 config := b.Func.Config 6885 _ = config 6886 typ := &b.Func.Config.Types 6887 _ = typ 6888 // match: (ConstSlice) 6889 // cond: config.PtrSize == 4 6890 // result: (SliceMake (ConstNil <v.Type.ElemType().PtrTo()>) (Const32 <typ.Int> [0]) (Const32 <typ.Int> [0])) 6891 for { 6892 if !(config.PtrSize == 4) { 6893 break 6894 } 6895 v.reset(OpSliceMake) 6896 v0 := b.NewValue0(v.Pos, OpConstNil, v.Type.ElemType().PtrTo()) 6897 v.AddArg(v0) 6898 v1 := b.NewValue0(v.Pos, OpConst32, typ.Int) 6899 v1.AuxInt = 0 6900 v.AddArg(v1) 6901 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int) 6902 v2.AuxInt = 0 6903 v.AddArg(v2) 6904 return true 6905 } 6906 // match: (ConstSlice) 6907 // cond: config.PtrSize == 8 6908 // result: (SliceMake (ConstNil <v.Type.ElemType().PtrTo()>) (Const64 <typ.Int> [0]) (Const64 <typ.Int> [0])) 6909 for { 6910 if !(config.PtrSize == 8) { 6911 break 6912 } 6913 v.reset(OpSliceMake) 6914 v0 := b.NewValue0(v.Pos, OpConstNil, v.Type.ElemType().PtrTo()) 6915 v.AddArg(v0) 6916 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int) 6917 v1.AuxInt = 0 6918 v.AddArg(v1) 6919 v2 := b.NewValue0(v.Pos, OpConst64, typ.Int) 6920 v2.AuxInt = 0 6921 v.AddArg(v2) 6922 return true 6923 } 6924 return false 6925 } 6926 func rewriteValuegeneric_OpConstString_0(v *Value) bool { 6927 b := v.Block 6928 _ = b 6929 config := b.Func.Config 6930 _ = config 6931 fe := b.Func.fe 6932 _ = fe 6933 typ := &b.Func.Config.Types 6934 _ = typ 6935 // match: (ConstString {s}) 6936 // cond: config.PtrSize == 4 && s.(string) == "" 6937 // result: (StringMake (ConstNil) (Const32 <typ.Int> [0])) 6938 for { 6939 s := v.Aux 6940 if !(config.PtrSize == 4 && s.(string) == "") { 6941 break 6942 } 6943 v.reset(OpStringMake) 6944 v0 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr) 6945 v.AddArg(v0) 6946 v1 := b.NewValue0(v.Pos, OpConst32, typ.Int) 6947 v1.AuxInt = 0 6948 v.AddArg(v1) 6949 return true 6950 } 6951 // match: (ConstString {s}) 6952 // cond: config.PtrSize == 8 && s.(string) == "" 6953 // result: (StringMake (ConstNil) (Const64 <typ.Int> [0])) 6954 for { 6955 s := v.Aux 6956 if !(config.PtrSize == 8 && s.(string) == "") { 6957 break 6958 } 6959 v.reset(OpStringMake) 6960 v0 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr) 6961 v.AddArg(v0) 6962 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int) 6963 v1.AuxInt = 0 6964 v.AddArg(v1) 6965 return true 6966 } 6967 // match: (ConstString {s}) 6968 // cond: config.PtrSize == 4 && s.(string) != "" 6969 // result: (StringMake (Addr <typ.BytePtr> {fe.StringData(s.(string))} (SB)) (Const32 <typ.Int> [int64(len(s.(string)))])) 6970 for { 6971 s := v.Aux 6972 if !(config.PtrSize == 4 && s.(string) != "") { 6973 break 6974 } 6975 v.reset(OpStringMake) 6976 v0 := b.NewValue0(v.Pos, OpAddr, typ.BytePtr) 6977 v0.Aux = fe.StringData(s.(string)) 6978 v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr) 6979 v0.AddArg(v1) 6980 v.AddArg(v0) 6981 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int) 6982 v2.AuxInt = int64(len(s.(string))) 6983 v.AddArg(v2) 6984 return true 6985 } 6986 // match: (ConstString {s}) 6987 // cond: config.PtrSize == 8 && s.(string) != "" 6988 // result: (StringMake (Addr <typ.BytePtr> {fe.StringData(s.(string))} (SB)) (Const64 <typ.Int> [int64(len(s.(string)))])) 6989 for { 6990 s := v.Aux 6991 if !(config.PtrSize == 8 && s.(string) != "") { 6992 break 6993 } 6994 v.reset(OpStringMake) 6995 v0 := b.NewValue0(v.Pos, OpAddr, typ.BytePtr) 6996 v0.Aux = fe.StringData(s.(string)) 6997 v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr) 6998 v0.AddArg(v1) 6999 v.AddArg(v0) 7000 v2 := b.NewValue0(v.Pos, OpConst64, typ.Int) 7001 v2.AuxInt = int64(len(s.(string))) 7002 v.AddArg(v2) 7003 return true 7004 } 7005 return false 7006 } 7007 func rewriteValuegeneric_OpConvert_0(v *Value) bool { 7008 // match: (Convert (Add64 (Convert ptr mem) off) mem) 7009 // cond: 7010 // result: (Add64 ptr off) 7011 for { 7012 _ = v.Args[1] 7013 v_0 := v.Args[0] 7014 if v_0.Op != OpAdd64 { 7015 break 7016 } 7017 _ = v_0.Args[1] 7018 v_0_0 := v_0.Args[0] 7019 if v_0_0.Op != OpConvert { 7020 break 7021 } 7022 _ = v_0_0.Args[1] 7023 ptr := v_0_0.Args[0] 7024 mem := v_0_0.Args[1] 7025 off := v_0.Args[1] 7026 if mem != v.Args[1] { 7027 break 7028 } 7029 v.reset(OpAdd64) 7030 v.AddArg(ptr) 7031 v.AddArg(off) 7032 return true 7033 } 7034 // match: (Convert (Add64 off (Convert ptr mem)) mem) 7035 // cond: 7036 // result: (Add64 ptr off) 7037 for { 7038 _ = v.Args[1] 7039 v_0 := v.Args[0] 7040 if v_0.Op != OpAdd64 { 7041 break 7042 } 7043 _ = v_0.Args[1] 7044 off := v_0.Args[0] 7045 v_0_1 := v_0.Args[1] 7046 if v_0_1.Op != OpConvert { 7047 break 7048 } 7049 _ = v_0_1.Args[1] 7050 ptr := v_0_1.Args[0] 7051 mem := v_0_1.Args[1] 7052 if mem != v.Args[1] { 7053 break 7054 } 7055 v.reset(OpAdd64) 7056 v.AddArg(ptr) 7057 v.AddArg(off) 7058 return true 7059 } 7060 // match: (Convert (Convert ptr mem) mem) 7061 // cond: 7062 // result: ptr 7063 for { 7064 _ = v.Args[1] 7065 v_0 := v.Args[0] 7066 if v_0.Op != OpConvert { 7067 break 7068 } 7069 _ = v_0.Args[1] 7070 ptr := v_0.Args[0] 7071 mem := v_0.Args[1] 7072 if mem != v.Args[1] { 7073 break 7074 } 7075 v.reset(OpCopy) 7076 v.Type = ptr.Type 7077 v.AddArg(ptr) 7078 return true 7079 } 7080 return false 7081 } 7082 func rewriteValuegeneric_OpCvt32Fto32_0(v *Value) bool { 7083 // match: (Cvt32Fto32 (Const32F [c])) 7084 // cond: 7085 // result: (Const32 [int64(int32(i2f(c)))]) 7086 for { 7087 v_0 := v.Args[0] 7088 if v_0.Op != OpConst32F { 7089 break 7090 } 7091 c := v_0.AuxInt 7092 v.reset(OpConst32) 7093 v.AuxInt = int64(int32(i2f(c))) 7094 return true 7095 } 7096 return false 7097 } 7098 func rewriteValuegeneric_OpCvt32Fto64_0(v *Value) bool { 7099 // match: (Cvt32Fto64 (Const32F [c])) 7100 // cond: 7101 // result: (Const64 [int64(i2f(c))]) 7102 for { 7103 v_0 := v.Args[0] 7104 if v_0.Op != OpConst32F { 7105 break 7106 } 7107 c := v_0.AuxInt 7108 v.reset(OpConst64) 7109 v.AuxInt = int64(i2f(c)) 7110 return true 7111 } 7112 return false 7113 } 7114 func rewriteValuegeneric_OpCvt32Fto64F_0(v *Value) bool { 7115 // match: (Cvt32Fto64F (Const32F [c])) 7116 // cond: 7117 // result: (Const64F [c]) 7118 for { 7119 v_0 := v.Args[0] 7120 if v_0.Op != OpConst32F { 7121 break 7122 } 7123 c := v_0.AuxInt 7124 v.reset(OpConst64F) 7125 v.AuxInt = c 7126 return true 7127 } 7128 return false 7129 } 7130 func rewriteValuegeneric_OpCvt32to32F_0(v *Value) bool { 7131 // match: (Cvt32to32F (Const32 [c])) 7132 // cond: 7133 // result: (Const32F [f2i(float64(float32(int32(c))))]) 7134 for { 7135 v_0 := v.Args[0] 7136 if v_0.Op != OpConst32 { 7137 break 7138 } 7139 c := v_0.AuxInt 7140 v.reset(OpConst32F) 7141 v.AuxInt = f2i(float64(float32(int32(c)))) 7142 return true 7143 } 7144 return false 7145 } 7146 func rewriteValuegeneric_OpCvt32to64F_0(v *Value) bool { 7147 // match: (Cvt32to64F (Const32 [c])) 7148 // cond: 7149 // result: (Const64F [f2i(float64(int32(c)))]) 7150 for { 7151 v_0 := v.Args[0] 7152 if v_0.Op != OpConst32 { 7153 break 7154 } 7155 c := v_0.AuxInt 7156 v.reset(OpConst64F) 7157 v.AuxInt = f2i(float64(int32(c))) 7158 return true 7159 } 7160 return false 7161 } 7162 func rewriteValuegeneric_OpCvt64Fto32_0(v *Value) bool { 7163 // match: (Cvt64Fto32 (Const64F [c])) 7164 // cond: 7165 // result: (Const32 [int64(int32(i2f(c)))]) 7166 for { 7167 v_0 := v.Args[0] 7168 if v_0.Op != OpConst64F { 7169 break 7170 } 7171 c := v_0.AuxInt 7172 v.reset(OpConst32) 7173 v.AuxInt = int64(int32(i2f(c))) 7174 return true 7175 } 7176 return false 7177 } 7178 func rewriteValuegeneric_OpCvt64Fto32F_0(v *Value) bool { 7179 // match: (Cvt64Fto32F (Const64F [c])) 7180 // cond: 7181 // result: (Const32F [f2i(float64(i2f32(c)))]) 7182 for { 7183 v_0 := v.Args[0] 7184 if v_0.Op != OpConst64F { 7185 break 7186 } 7187 c := v_0.AuxInt 7188 v.reset(OpConst32F) 7189 v.AuxInt = f2i(float64(i2f32(c))) 7190 return true 7191 } 7192 return false 7193 } 7194 func rewriteValuegeneric_OpCvt64Fto64_0(v *Value) bool { 7195 // match: (Cvt64Fto64 (Const64F [c])) 7196 // cond: 7197 // result: (Const64 [int64(i2f(c))]) 7198 for { 7199 v_0 := v.Args[0] 7200 if v_0.Op != OpConst64F { 7201 break 7202 } 7203 c := v_0.AuxInt 7204 v.reset(OpConst64) 7205 v.AuxInt = int64(i2f(c)) 7206 return true 7207 } 7208 return false 7209 } 7210 func rewriteValuegeneric_OpCvt64to32F_0(v *Value) bool { 7211 // match: (Cvt64to32F (Const64 [c])) 7212 // cond: 7213 // result: (Const32F [f2i(float64(float32(c)))]) 7214 for { 7215 v_0 := v.Args[0] 7216 if v_0.Op != OpConst64 { 7217 break 7218 } 7219 c := v_0.AuxInt 7220 v.reset(OpConst32F) 7221 v.AuxInt = f2i(float64(float32(c))) 7222 return true 7223 } 7224 return false 7225 } 7226 func rewriteValuegeneric_OpCvt64to64F_0(v *Value) bool { 7227 // match: (Cvt64to64F (Const64 [c])) 7228 // cond: 7229 // result: (Const64F [f2i(float64(c))]) 7230 for { 7231 v_0 := v.Args[0] 7232 if v_0.Op != OpConst64 { 7233 break 7234 } 7235 c := v_0.AuxInt 7236 v.reset(OpConst64F) 7237 v.AuxInt = f2i(float64(c)) 7238 return true 7239 } 7240 return false 7241 } 7242 func rewriteValuegeneric_OpDiv16_0(v *Value) bool { 7243 b := v.Block 7244 _ = b 7245 typ := &b.Func.Config.Types 7246 _ = typ 7247 // match: (Div16 (Const16 [c]) (Const16 [d])) 7248 // cond: d != 0 7249 // result: (Const16 [int64(int16(c)/int16(d))]) 7250 for { 7251 _ = v.Args[1] 7252 v_0 := v.Args[0] 7253 if v_0.Op != OpConst16 { 7254 break 7255 } 7256 c := v_0.AuxInt 7257 v_1 := v.Args[1] 7258 if v_1.Op != OpConst16 { 7259 break 7260 } 7261 d := v_1.AuxInt 7262 if !(d != 0) { 7263 break 7264 } 7265 v.reset(OpConst16) 7266 v.AuxInt = int64(int16(c) / int16(d)) 7267 return true 7268 } 7269 // match: (Div16 n (Const16 [c])) 7270 // cond: isNonNegative(n) && isPowerOfTwo(c&0xffff) 7271 // result: (Rsh16Ux64 n (Const64 <typ.UInt64> [log2(c&0xffff)])) 7272 for { 7273 _ = v.Args[1] 7274 n := v.Args[0] 7275 v_1 := v.Args[1] 7276 if v_1.Op != OpConst16 { 7277 break 7278 } 7279 c := v_1.AuxInt 7280 if !(isNonNegative(n) && isPowerOfTwo(c&0xffff)) { 7281 break 7282 } 7283 v.reset(OpRsh16Ux64) 7284 v.AddArg(n) 7285 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7286 v0.AuxInt = log2(c & 0xffff) 7287 v.AddArg(v0) 7288 return true 7289 } 7290 // match: (Div16 <t> n (Const16 [c])) 7291 // cond: c < 0 && c != -1<<15 7292 // result: (Neg16 (Div16 <t> n (Const16 <t> [-c]))) 7293 for { 7294 t := v.Type 7295 _ = v.Args[1] 7296 n := v.Args[0] 7297 v_1 := v.Args[1] 7298 if v_1.Op != OpConst16 { 7299 break 7300 } 7301 c := v_1.AuxInt 7302 if !(c < 0 && c != -1<<15) { 7303 break 7304 } 7305 v.reset(OpNeg16) 7306 v0 := b.NewValue0(v.Pos, OpDiv16, t) 7307 v0.AddArg(n) 7308 v1 := b.NewValue0(v.Pos, OpConst16, t) 7309 v1.AuxInt = -c 7310 v0.AddArg(v1) 7311 v.AddArg(v0) 7312 return true 7313 } 7314 // match: (Div16 <t> x (Const16 [-1<<15])) 7315 // cond: 7316 // result: (Rsh16Ux64 (And16 <t> x (Neg16 <t> x)) (Const64 <typ.UInt64> [15])) 7317 for { 7318 t := v.Type 7319 _ = v.Args[1] 7320 x := v.Args[0] 7321 v_1 := v.Args[1] 7322 if v_1.Op != OpConst16 { 7323 break 7324 } 7325 if v_1.AuxInt != -1<<15 { 7326 break 7327 } 7328 v.reset(OpRsh16Ux64) 7329 v0 := b.NewValue0(v.Pos, OpAnd16, t) 7330 v0.AddArg(x) 7331 v1 := b.NewValue0(v.Pos, OpNeg16, t) 7332 v1.AddArg(x) 7333 v0.AddArg(v1) 7334 v.AddArg(v0) 7335 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7336 v2.AuxInt = 15 7337 v.AddArg(v2) 7338 return true 7339 } 7340 // match: (Div16 <t> n (Const16 [c])) 7341 // cond: isPowerOfTwo(c) 7342 // 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)])) 7343 for { 7344 t := v.Type 7345 _ = v.Args[1] 7346 n := v.Args[0] 7347 v_1 := v.Args[1] 7348 if v_1.Op != OpConst16 { 7349 break 7350 } 7351 c := v_1.AuxInt 7352 if !(isPowerOfTwo(c)) { 7353 break 7354 } 7355 v.reset(OpRsh16x64) 7356 v0 := b.NewValue0(v.Pos, OpAdd16, t) 7357 v0.AddArg(n) 7358 v1 := b.NewValue0(v.Pos, OpRsh16Ux64, t) 7359 v2 := b.NewValue0(v.Pos, OpRsh16x64, t) 7360 v2.AddArg(n) 7361 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7362 v3.AuxInt = 15 7363 v2.AddArg(v3) 7364 v1.AddArg(v2) 7365 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7366 v4.AuxInt = 16 - log2(c) 7367 v1.AddArg(v4) 7368 v0.AddArg(v1) 7369 v.AddArg(v0) 7370 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7371 v5.AuxInt = log2(c) 7372 v.AddArg(v5) 7373 return true 7374 } 7375 // match: (Div16 <t> x (Const16 [c])) 7376 // cond: smagicOK(16,c) 7377 // 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]))) 7378 for { 7379 t := v.Type 7380 _ = v.Args[1] 7381 x := v.Args[0] 7382 v_1 := v.Args[1] 7383 if v_1.Op != OpConst16 { 7384 break 7385 } 7386 c := v_1.AuxInt 7387 if !(smagicOK(16, c)) { 7388 break 7389 } 7390 v.reset(OpSub16) 7391 v.Type = t 7392 v0 := b.NewValue0(v.Pos, OpRsh32x64, t) 7393 v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) 7394 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 7395 v2.AuxInt = int64(smagic(16, c).m) 7396 v1.AddArg(v2) 7397 v3 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 7398 v3.AddArg(x) 7399 v1.AddArg(v3) 7400 v0.AddArg(v1) 7401 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7402 v4.AuxInt = 16 + smagic(16, c).s 7403 v0.AddArg(v4) 7404 v.AddArg(v0) 7405 v5 := b.NewValue0(v.Pos, OpRsh32x64, t) 7406 v6 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 7407 v6.AddArg(x) 7408 v5.AddArg(v6) 7409 v7 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7410 v7.AuxInt = 31 7411 v5.AddArg(v7) 7412 v.AddArg(v5) 7413 return true 7414 } 7415 return false 7416 } 7417 func rewriteValuegeneric_OpDiv16u_0(v *Value) bool { 7418 b := v.Block 7419 _ = b 7420 config := b.Func.Config 7421 _ = config 7422 typ := &b.Func.Config.Types 7423 _ = typ 7424 // match: (Div16u (Const16 [c]) (Const16 [d])) 7425 // cond: d != 0 7426 // result: (Const16 [int64(int16(uint16(c)/uint16(d)))]) 7427 for { 7428 _ = v.Args[1] 7429 v_0 := v.Args[0] 7430 if v_0.Op != OpConst16 { 7431 break 7432 } 7433 c := v_0.AuxInt 7434 v_1 := v.Args[1] 7435 if v_1.Op != OpConst16 { 7436 break 7437 } 7438 d := v_1.AuxInt 7439 if !(d != 0) { 7440 break 7441 } 7442 v.reset(OpConst16) 7443 v.AuxInt = int64(int16(uint16(c) / uint16(d))) 7444 return true 7445 } 7446 // match: (Div16u n (Const16 [c])) 7447 // cond: isPowerOfTwo(c&0xffff) 7448 // result: (Rsh16Ux64 n (Const64 <typ.UInt64> [log2(c&0xffff)])) 7449 for { 7450 _ = v.Args[1] 7451 n := v.Args[0] 7452 v_1 := v.Args[1] 7453 if v_1.Op != OpConst16 { 7454 break 7455 } 7456 c := v_1.AuxInt 7457 if !(isPowerOfTwo(c & 0xffff)) { 7458 break 7459 } 7460 v.reset(OpRsh16Ux64) 7461 v.AddArg(n) 7462 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7463 v0.AuxInt = log2(c & 0xffff) 7464 v.AddArg(v0) 7465 return true 7466 } 7467 // match: (Div16u x (Const16 [c])) 7468 // cond: umagicOK(16, c) && config.RegSize == 8 7469 // 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]))) 7470 for { 7471 _ = v.Args[1] 7472 x := v.Args[0] 7473 v_1 := v.Args[1] 7474 if v_1.Op != OpConst16 { 7475 break 7476 } 7477 c := v_1.AuxInt 7478 if !(umagicOK(16, c) && config.RegSize == 8) { 7479 break 7480 } 7481 v.reset(OpTrunc64to16) 7482 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64) 7483 v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) 7484 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7485 v2.AuxInt = int64(1<<16 + umagic(16, c).m) 7486 v1.AddArg(v2) 7487 v3 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64) 7488 v3.AddArg(x) 7489 v1.AddArg(v3) 7490 v0.AddArg(v1) 7491 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7492 v4.AuxInt = 16 + umagic(16, c).s 7493 v0.AddArg(v4) 7494 v.AddArg(v0) 7495 return true 7496 } 7497 // match: (Div16u x (Const16 [c])) 7498 // cond: umagicOK(16, c) && config.RegSize == 4 && umagic(16,c).m&1 == 0 7499 // 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]))) 7500 for { 7501 _ = v.Args[1] 7502 x := v.Args[0] 7503 v_1 := v.Args[1] 7504 if v_1.Op != OpConst16 { 7505 break 7506 } 7507 c := v_1.AuxInt 7508 if !(umagicOK(16, c) && config.RegSize == 4 && umagic(16, c).m&1 == 0) { 7509 break 7510 } 7511 v.reset(OpTrunc32to16) 7512 v0 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32) 7513 v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) 7514 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 7515 v2.AuxInt = int64(1<<15 + umagic(16, c).m/2) 7516 v1.AddArg(v2) 7517 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 7518 v3.AddArg(x) 7519 v1.AddArg(v3) 7520 v0.AddArg(v1) 7521 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7522 v4.AuxInt = 16 + umagic(16, c).s - 1 7523 v0.AddArg(v4) 7524 v.AddArg(v0) 7525 return true 7526 } 7527 // match: (Div16u x (Const16 [c])) 7528 // cond: umagicOK(16, c) && config.RegSize == 4 && c&1 == 0 7529 // 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]))) 7530 for { 7531 _ = v.Args[1] 7532 x := v.Args[0] 7533 v_1 := v.Args[1] 7534 if v_1.Op != OpConst16 { 7535 break 7536 } 7537 c := v_1.AuxInt 7538 if !(umagicOK(16, c) && config.RegSize == 4 && c&1 == 0) { 7539 break 7540 } 7541 v.reset(OpTrunc32to16) 7542 v0 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32) 7543 v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) 7544 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 7545 v2.AuxInt = int64(1<<15 + (umagic(16, c).m+1)/2) 7546 v1.AddArg(v2) 7547 v3 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32) 7548 v4 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 7549 v4.AddArg(x) 7550 v3.AddArg(v4) 7551 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7552 v5.AuxInt = 1 7553 v3.AddArg(v5) 7554 v1.AddArg(v3) 7555 v0.AddArg(v1) 7556 v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7557 v6.AuxInt = 16 + umagic(16, c).s - 2 7558 v0.AddArg(v6) 7559 v.AddArg(v0) 7560 return true 7561 } 7562 // match: (Div16u x (Const16 [c])) 7563 // cond: umagicOK(16, c) && config.RegSize == 4 7564 // 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]))) 7565 for { 7566 _ = v.Args[1] 7567 x := v.Args[0] 7568 v_1 := v.Args[1] 7569 if v_1.Op != OpConst16 { 7570 break 7571 } 7572 c := v_1.AuxInt 7573 if !(umagicOK(16, c) && config.RegSize == 4) { 7574 break 7575 } 7576 v.reset(OpTrunc32to16) 7577 v0 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32) 7578 v1 := b.NewValue0(v.Pos, OpAvg32u, typ.UInt32) 7579 v2 := b.NewValue0(v.Pos, OpLsh32x64, typ.UInt32) 7580 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 7581 v3.AddArg(x) 7582 v2.AddArg(v3) 7583 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7584 v4.AuxInt = 16 7585 v2.AddArg(v4) 7586 v1.AddArg(v2) 7587 v5 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) 7588 v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 7589 v6.AuxInt = int64(umagic(16, c).m) 7590 v5.AddArg(v6) 7591 v7 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 7592 v7.AddArg(x) 7593 v5.AddArg(v7) 7594 v1.AddArg(v5) 7595 v0.AddArg(v1) 7596 v8 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7597 v8.AuxInt = 16 + umagic(16, c).s - 1 7598 v0.AddArg(v8) 7599 v.AddArg(v0) 7600 return true 7601 } 7602 return false 7603 } 7604 func rewriteValuegeneric_OpDiv32_0(v *Value) bool { 7605 b := v.Block 7606 _ = b 7607 config := b.Func.Config 7608 _ = config 7609 typ := &b.Func.Config.Types 7610 _ = typ 7611 // match: (Div32 (Const32 [c]) (Const32 [d])) 7612 // cond: d != 0 7613 // result: (Const32 [int64(int32(c)/int32(d))]) 7614 for { 7615 _ = v.Args[1] 7616 v_0 := v.Args[0] 7617 if v_0.Op != OpConst32 { 7618 break 7619 } 7620 c := v_0.AuxInt 7621 v_1 := v.Args[1] 7622 if v_1.Op != OpConst32 { 7623 break 7624 } 7625 d := v_1.AuxInt 7626 if !(d != 0) { 7627 break 7628 } 7629 v.reset(OpConst32) 7630 v.AuxInt = int64(int32(c) / int32(d)) 7631 return true 7632 } 7633 // match: (Div32 n (Const32 [c])) 7634 // cond: isNonNegative(n) && isPowerOfTwo(c&0xffffffff) 7635 // result: (Rsh32Ux64 n (Const64 <typ.UInt64> [log2(c&0xffffffff)])) 7636 for { 7637 _ = v.Args[1] 7638 n := v.Args[0] 7639 v_1 := v.Args[1] 7640 if v_1.Op != OpConst32 { 7641 break 7642 } 7643 c := v_1.AuxInt 7644 if !(isNonNegative(n) && isPowerOfTwo(c&0xffffffff)) { 7645 break 7646 } 7647 v.reset(OpRsh32Ux64) 7648 v.AddArg(n) 7649 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7650 v0.AuxInt = log2(c & 0xffffffff) 7651 v.AddArg(v0) 7652 return true 7653 } 7654 // match: (Div32 <t> n (Const32 [c])) 7655 // cond: c < 0 && c != -1<<31 7656 // result: (Neg32 (Div32 <t> n (Const32 <t> [-c]))) 7657 for { 7658 t := v.Type 7659 _ = v.Args[1] 7660 n := v.Args[0] 7661 v_1 := v.Args[1] 7662 if v_1.Op != OpConst32 { 7663 break 7664 } 7665 c := v_1.AuxInt 7666 if !(c < 0 && c != -1<<31) { 7667 break 7668 } 7669 v.reset(OpNeg32) 7670 v0 := b.NewValue0(v.Pos, OpDiv32, t) 7671 v0.AddArg(n) 7672 v1 := b.NewValue0(v.Pos, OpConst32, t) 7673 v1.AuxInt = -c 7674 v0.AddArg(v1) 7675 v.AddArg(v0) 7676 return true 7677 } 7678 // match: (Div32 <t> x (Const32 [-1<<31])) 7679 // cond: 7680 // result: (Rsh32Ux64 (And32 <t> x (Neg32 <t> x)) (Const64 <typ.UInt64> [31])) 7681 for { 7682 t := v.Type 7683 _ = v.Args[1] 7684 x := v.Args[0] 7685 v_1 := v.Args[1] 7686 if v_1.Op != OpConst32 { 7687 break 7688 } 7689 if v_1.AuxInt != -1<<31 { 7690 break 7691 } 7692 v.reset(OpRsh32Ux64) 7693 v0 := b.NewValue0(v.Pos, OpAnd32, t) 7694 v0.AddArg(x) 7695 v1 := b.NewValue0(v.Pos, OpNeg32, t) 7696 v1.AddArg(x) 7697 v0.AddArg(v1) 7698 v.AddArg(v0) 7699 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7700 v2.AuxInt = 31 7701 v.AddArg(v2) 7702 return true 7703 } 7704 // match: (Div32 <t> n (Const32 [c])) 7705 // cond: isPowerOfTwo(c) 7706 // 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)])) 7707 for { 7708 t := v.Type 7709 _ = v.Args[1] 7710 n := v.Args[0] 7711 v_1 := v.Args[1] 7712 if v_1.Op != OpConst32 { 7713 break 7714 } 7715 c := v_1.AuxInt 7716 if !(isPowerOfTwo(c)) { 7717 break 7718 } 7719 v.reset(OpRsh32x64) 7720 v0 := b.NewValue0(v.Pos, OpAdd32, t) 7721 v0.AddArg(n) 7722 v1 := b.NewValue0(v.Pos, OpRsh32Ux64, t) 7723 v2 := b.NewValue0(v.Pos, OpRsh32x64, t) 7724 v2.AddArg(n) 7725 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7726 v3.AuxInt = 31 7727 v2.AddArg(v3) 7728 v1.AddArg(v2) 7729 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7730 v4.AuxInt = 32 - log2(c) 7731 v1.AddArg(v4) 7732 v0.AddArg(v1) 7733 v.AddArg(v0) 7734 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7735 v5.AuxInt = log2(c) 7736 v.AddArg(v5) 7737 return true 7738 } 7739 // match: (Div32 <t> x (Const32 [c])) 7740 // cond: smagicOK(32,c) && config.RegSize == 8 7741 // 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]))) 7742 for { 7743 t := v.Type 7744 _ = v.Args[1] 7745 x := v.Args[0] 7746 v_1 := v.Args[1] 7747 if v_1.Op != OpConst32 { 7748 break 7749 } 7750 c := v_1.AuxInt 7751 if !(smagicOK(32, c) && config.RegSize == 8) { 7752 break 7753 } 7754 v.reset(OpSub32) 7755 v.Type = t 7756 v0 := b.NewValue0(v.Pos, OpRsh64x64, t) 7757 v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) 7758 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7759 v2.AuxInt = int64(smagic(32, c).m) 7760 v1.AddArg(v2) 7761 v3 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64) 7762 v3.AddArg(x) 7763 v1.AddArg(v3) 7764 v0.AddArg(v1) 7765 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7766 v4.AuxInt = 32 + smagic(32, c).s 7767 v0.AddArg(v4) 7768 v.AddArg(v0) 7769 v5 := b.NewValue0(v.Pos, OpRsh64x64, t) 7770 v6 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64) 7771 v6.AddArg(x) 7772 v5.AddArg(v6) 7773 v7 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7774 v7.AuxInt = 63 7775 v5.AddArg(v7) 7776 v.AddArg(v5) 7777 return true 7778 } 7779 // match: (Div32 <t> x (Const32 [c])) 7780 // cond: smagicOK(32,c) && config.RegSize == 4 && smagic(32,c).m&1 == 0 7781 // 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]))) 7782 for { 7783 t := v.Type 7784 _ = v.Args[1] 7785 x := v.Args[0] 7786 v_1 := v.Args[1] 7787 if v_1.Op != OpConst32 { 7788 break 7789 } 7790 c := v_1.AuxInt 7791 if !(smagicOK(32, c) && config.RegSize == 4 && smagic(32, c).m&1 == 0) { 7792 break 7793 } 7794 v.reset(OpSub32) 7795 v.Type = t 7796 v0 := b.NewValue0(v.Pos, OpRsh32x64, t) 7797 v1 := b.NewValue0(v.Pos, OpHmul32, t) 7798 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 7799 v2.AuxInt = int64(int32(smagic(32, c).m / 2)) 7800 v1.AddArg(v2) 7801 v1.AddArg(x) 7802 v0.AddArg(v1) 7803 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7804 v3.AuxInt = smagic(32, c).s - 1 7805 v0.AddArg(v3) 7806 v.AddArg(v0) 7807 v4 := b.NewValue0(v.Pos, OpRsh32x64, t) 7808 v4.AddArg(x) 7809 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7810 v5.AuxInt = 31 7811 v4.AddArg(v5) 7812 v.AddArg(v4) 7813 return true 7814 } 7815 // match: (Div32 <t> x (Const32 [c])) 7816 // cond: smagicOK(32,c) && config.RegSize == 4 && smagic(32,c).m&1 != 0 7817 // 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]))) 7818 for { 7819 t := v.Type 7820 _ = v.Args[1] 7821 x := v.Args[0] 7822 v_1 := v.Args[1] 7823 if v_1.Op != OpConst32 { 7824 break 7825 } 7826 c := v_1.AuxInt 7827 if !(smagicOK(32, c) && config.RegSize == 4 && smagic(32, c).m&1 != 0) { 7828 break 7829 } 7830 v.reset(OpSub32) 7831 v.Type = t 7832 v0 := b.NewValue0(v.Pos, OpRsh32x64, t) 7833 v1 := b.NewValue0(v.Pos, OpAdd32, t) 7834 v2 := b.NewValue0(v.Pos, OpHmul32, t) 7835 v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 7836 v3.AuxInt = int64(int32(smagic(32, c).m)) 7837 v2.AddArg(v3) 7838 v2.AddArg(x) 7839 v1.AddArg(v2) 7840 v1.AddArg(x) 7841 v0.AddArg(v1) 7842 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7843 v4.AuxInt = smagic(32, c).s 7844 v0.AddArg(v4) 7845 v.AddArg(v0) 7846 v5 := b.NewValue0(v.Pos, OpRsh32x64, t) 7847 v5.AddArg(x) 7848 v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7849 v6.AuxInt = 31 7850 v5.AddArg(v6) 7851 v.AddArg(v5) 7852 return true 7853 } 7854 return false 7855 } 7856 func rewriteValuegeneric_OpDiv32F_0(v *Value) bool { 7857 b := v.Block 7858 _ = b 7859 // match: (Div32F (Const32F [c]) (Const32F [d])) 7860 // cond: 7861 // result: (Const32F [f2i(float64(i2f32(c) / i2f32(d)))]) 7862 for { 7863 _ = v.Args[1] 7864 v_0 := v.Args[0] 7865 if v_0.Op != OpConst32F { 7866 break 7867 } 7868 c := v_0.AuxInt 7869 v_1 := v.Args[1] 7870 if v_1.Op != OpConst32F { 7871 break 7872 } 7873 d := v_1.AuxInt 7874 v.reset(OpConst32F) 7875 v.AuxInt = f2i(float64(i2f32(c) / i2f32(d))) 7876 return true 7877 } 7878 // match: (Div32F x (Const32F <t> [c])) 7879 // cond: reciprocalExact32(float32(i2f(c))) 7880 // result: (Mul32F x (Const32F <t> [f2i(1/i2f(c))])) 7881 for { 7882 _ = v.Args[1] 7883 x := v.Args[0] 7884 v_1 := v.Args[1] 7885 if v_1.Op != OpConst32F { 7886 break 7887 } 7888 t := v_1.Type 7889 c := v_1.AuxInt 7890 if !(reciprocalExact32(float32(i2f(c)))) { 7891 break 7892 } 7893 v.reset(OpMul32F) 7894 v.AddArg(x) 7895 v0 := b.NewValue0(v.Pos, OpConst32F, t) 7896 v0.AuxInt = f2i(1 / i2f(c)) 7897 v.AddArg(v0) 7898 return true 7899 } 7900 return false 7901 } 7902 func rewriteValuegeneric_OpDiv32u_0(v *Value) bool { 7903 b := v.Block 7904 _ = b 7905 config := b.Func.Config 7906 _ = config 7907 typ := &b.Func.Config.Types 7908 _ = typ 7909 // match: (Div32u (Const32 [c]) (Const32 [d])) 7910 // cond: d != 0 7911 // result: (Const32 [int64(int32(uint32(c)/uint32(d)))]) 7912 for { 7913 _ = v.Args[1] 7914 v_0 := v.Args[0] 7915 if v_0.Op != OpConst32 { 7916 break 7917 } 7918 c := v_0.AuxInt 7919 v_1 := v.Args[1] 7920 if v_1.Op != OpConst32 { 7921 break 7922 } 7923 d := v_1.AuxInt 7924 if !(d != 0) { 7925 break 7926 } 7927 v.reset(OpConst32) 7928 v.AuxInt = int64(int32(uint32(c) / uint32(d))) 7929 return true 7930 } 7931 // match: (Div32u n (Const32 [c])) 7932 // cond: isPowerOfTwo(c&0xffffffff) 7933 // result: (Rsh32Ux64 n (Const64 <typ.UInt64> [log2(c&0xffffffff)])) 7934 for { 7935 _ = v.Args[1] 7936 n := v.Args[0] 7937 v_1 := v.Args[1] 7938 if v_1.Op != OpConst32 { 7939 break 7940 } 7941 c := v_1.AuxInt 7942 if !(isPowerOfTwo(c & 0xffffffff)) { 7943 break 7944 } 7945 v.reset(OpRsh32Ux64) 7946 v.AddArg(n) 7947 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7948 v0.AuxInt = log2(c & 0xffffffff) 7949 v.AddArg(v0) 7950 return true 7951 } 7952 // match: (Div32u x (Const32 [c])) 7953 // cond: umagicOK(32, c) && config.RegSize == 4 && umagic(32,c).m&1 == 0 7954 // 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])) 7955 for { 7956 _ = v.Args[1] 7957 x := v.Args[0] 7958 v_1 := v.Args[1] 7959 if v_1.Op != OpConst32 { 7960 break 7961 } 7962 c := v_1.AuxInt 7963 if !(umagicOK(32, c) && config.RegSize == 4 && umagic(32, c).m&1 == 0) { 7964 break 7965 } 7966 v.reset(OpRsh32Ux64) 7967 v.Type = typ.UInt32 7968 v0 := b.NewValue0(v.Pos, OpHmul32u, typ.UInt32) 7969 v1 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 7970 v1.AuxInt = int64(int32(1<<31 + umagic(32, c).m/2)) 7971 v0.AddArg(v1) 7972 v0.AddArg(x) 7973 v.AddArg(v0) 7974 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7975 v2.AuxInt = umagic(32, c).s - 1 7976 v.AddArg(v2) 7977 return true 7978 } 7979 // match: (Div32u x (Const32 [c])) 7980 // cond: umagicOK(32, c) && config.RegSize == 4 && c&1 == 0 7981 // 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])) 7982 for { 7983 _ = v.Args[1] 7984 x := v.Args[0] 7985 v_1 := v.Args[1] 7986 if v_1.Op != OpConst32 { 7987 break 7988 } 7989 c := v_1.AuxInt 7990 if !(umagicOK(32, c) && config.RegSize == 4 && c&1 == 0) { 7991 break 7992 } 7993 v.reset(OpRsh32Ux64) 7994 v.Type = typ.UInt32 7995 v0 := b.NewValue0(v.Pos, OpHmul32u, typ.UInt32) 7996 v1 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 7997 v1.AuxInt = int64(int32(1<<31 + (umagic(32, c).m+1)/2)) 7998 v0.AddArg(v1) 7999 v2 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32) 8000 v2.AddArg(x) 8001 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8002 v3.AuxInt = 1 8003 v2.AddArg(v3) 8004 v0.AddArg(v2) 8005 v.AddArg(v0) 8006 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8007 v4.AuxInt = umagic(32, c).s - 2 8008 v.AddArg(v4) 8009 return true 8010 } 8011 // match: (Div32u x (Const32 [c])) 8012 // cond: umagicOK(32, c) && config.RegSize == 4 8013 // 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])) 8014 for { 8015 _ = v.Args[1] 8016 x := v.Args[0] 8017 v_1 := v.Args[1] 8018 if v_1.Op != OpConst32 { 8019 break 8020 } 8021 c := v_1.AuxInt 8022 if !(umagicOK(32, c) && config.RegSize == 4) { 8023 break 8024 } 8025 v.reset(OpRsh32Ux64) 8026 v.Type = typ.UInt32 8027 v0 := b.NewValue0(v.Pos, OpAvg32u, typ.UInt32) 8028 v0.AddArg(x) 8029 v1 := b.NewValue0(v.Pos, OpHmul32u, typ.UInt32) 8030 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 8031 v2.AuxInt = int64(int32(umagic(32, c).m)) 8032 v1.AddArg(v2) 8033 v1.AddArg(x) 8034 v0.AddArg(v1) 8035 v.AddArg(v0) 8036 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8037 v3.AuxInt = umagic(32, c).s - 1 8038 v.AddArg(v3) 8039 return true 8040 } 8041 // match: (Div32u x (Const32 [c])) 8042 // cond: umagicOK(32, c) && config.RegSize == 8 && umagic(32,c).m&1 == 0 8043 // 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]))) 8044 for { 8045 _ = v.Args[1] 8046 x := v.Args[0] 8047 v_1 := v.Args[1] 8048 if v_1.Op != OpConst32 { 8049 break 8050 } 8051 c := v_1.AuxInt 8052 if !(umagicOK(32, c) && config.RegSize == 8 && umagic(32, c).m&1 == 0) { 8053 break 8054 } 8055 v.reset(OpTrunc64to32) 8056 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64) 8057 v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) 8058 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8059 v2.AuxInt = int64(1<<31 + umagic(32, c).m/2) 8060 v1.AddArg(v2) 8061 v3 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) 8062 v3.AddArg(x) 8063 v1.AddArg(v3) 8064 v0.AddArg(v1) 8065 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8066 v4.AuxInt = 32 + umagic(32, c).s - 1 8067 v0.AddArg(v4) 8068 v.AddArg(v0) 8069 return true 8070 } 8071 // match: (Div32u x (Const32 [c])) 8072 // cond: umagicOK(32, c) && config.RegSize == 8 && c&1 == 0 8073 // 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]))) 8074 for { 8075 _ = v.Args[1] 8076 x := v.Args[0] 8077 v_1 := v.Args[1] 8078 if v_1.Op != OpConst32 { 8079 break 8080 } 8081 c := v_1.AuxInt 8082 if !(umagicOK(32, c) && config.RegSize == 8 && c&1 == 0) { 8083 break 8084 } 8085 v.reset(OpTrunc64to32) 8086 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64) 8087 v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) 8088 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8089 v2.AuxInt = int64(1<<31 + (umagic(32, c).m+1)/2) 8090 v1.AddArg(v2) 8091 v3 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64) 8092 v4 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) 8093 v4.AddArg(x) 8094 v3.AddArg(v4) 8095 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8096 v5.AuxInt = 1 8097 v3.AddArg(v5) 8098 v1.AddArg(v3) 8099 v0.AddArg(v1) 8100 v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8101 v6.AuxInt = 32 + umagic(32, c).s - 2 8102 v0.AddArg(v6) 8103 v.AddArg(v0) 8104 return true 8105 } 8106 // match: (Div32u x (Const32 [c])) 8107 // cond: umagicOK(32, c) && config.RegSize == 8 8108 // 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]))) 8109 for { 8110 _ = v.Args[1] 8111 x := v.Args[0] 8112 v_1 := v.Args[1] 8113 if v_1.Op != OpConst32 { 8114 break 8115 } 8116 c := v_1.AuxInt 8117 if !(umagicOK(32, c) && config.RegSize == 8) { 8118 break 8119 } 8120 v.reset(OpTrunc64to32) 8121 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64) 8122 v1 := b.NewValue0(v.Pos, OpAvg64u, typ.UInt64) 8123 v2 := b.NewValue0(v.Pos, OpLsh64x64, typ.UInt64) 8124 v3 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) 8125 v3.AddArg(x) 8126 v2.AddArg(v3) 8127 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8128 v4.AuxInt = 32 8129 v2.AddArg(v4) 8130 v1.AddArg(v2) 8131 v5 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) 8132 v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt32) 8133 v6.AuxInt = int64(umagic(32, c).m) 8134 v5.AddArg(v6) 8135 v7 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) 8136 v7.AddArg(x) 8137 v5.AddArg(v7) 8138 v1.AddArg(v5) 8139 v0.AddArg(v1) 8140 v8 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8141 v8.AuxInt = 32 + umagic(32, c).s - 1 8142 v0.AddArg(v8) 8143 v.AddArg(v0) 8144 return true 8145 } 8146 return false 8147 } 8148 func rewriteValuegeneric_OpDiv64_0(v *Value) bool { 8149 b := v.Block 8150 _ = b 8151 typ := &b.Func.Config.Types 8152 _ = typ 8153 // match: (Div64 (Const64 [c]) (Const64 [d])) 8154 // cond: d != 0 8155 // result: (Const64 [c/d]) 8156 for { 8157 _ = v.Args[1] 8158 v_0 := v.Args[0] 8159 if v_0.Op != OpConst64 { 8160 break 8161 } 8162 c := v_0.AuxInt 8163 v_1 := v.Args[1] 8164 if v_1.Op != OpConst64 { 8165 break 8166 } 8167 d := v_1.AuxInt 8168 if !(d != 0) { 8169 break 8170 } 8171 v.reset(OpConst64) 8172 v.AuxInt = c / d 8173 return true 8174 } 8175 // match: (Div64 n (Const64 [c])) 8176 // cond: isNonNegative(n) && isPowerOfTwo(c) 8177 // result: (Rsh64Ux64 n (Const64 <typ.UInt64> [log2(c)])) 8178 for { 8179 _ = v.Args[1] 8180 n := v.Args[0] 8181 v_1 := v.Args[1] 8182 if v_1.Op != OpConst64 { 8183 break 8184 } 8185 c := v_1.AuxInt 8186 if !(isNonNegative(n) && isPowerOfTwo(c)) { 8187 break 8188 } 8189 v.reset(OpRsh64Ux64) 8190 v.AddArg(n) 8191 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8192 v0.AuxInt = log2(c) 8193 v.AddArg(v0) 8194 return true 8195 } 8196 // match: (Div64 n (Const64 [-1<<63])) 8197 // cond: isNonNegative(n) 8198 // result: (Const64 [0]) 8199 for { 8200 _ = v.Args[1] 8201 n := v.Args[0] 8202 v_1 := v.Args[1] 8203 if v_1.Op != OpConst64 { 8204 break 8205 } 8206 if v_1.AuxInt != -1<<63 { 8207 break 8208 } 8209 if !(isNonNegative(n)) { 8210 break 8211 } 8212 v.reset(OpConst64) 8213 v.AuxInt = 0 8214 return true 8215 } 8216 // match: (Div64 <t> n (Const64 [c])) 8217 // cond: c < 0 && c != -1<<63 8218 // result: (Neg64 (Div64 <t> n (Const64 <t> [-c]))) 8219 for { 8220 t := v.Type 8221 _ = v.Args[1] 8222 n := v.Args[0] 8223 v_1 := v.Args[1] 8224 if v_1.Op != OpConst64 { 8225 break 8226 } 8227 c := v_1.AuxInt 8228 if !(c < 0 && c != -1<<63) { 8229 break 8230 } 8231 v.reset(OpNeg64) 8232 v0 := b.NewValue0(v.Pos, OpDiv64, t) 8233 v0.AddArg(n) 8234 v1 := b.NewValue0(v.Pos, OpConst64, t) 8235 v1.AuxInt = -c 8236 v0.AddArg(v1) 8237 v.AddArg(v0) 8238 return true 8239 } 8240 // match: (Div64 <t> x (Const64 [-1<<63])) 8241 // cond: 8242 // result: (Rsh64Ux64 (And64 <t> x (Neg64 <t> x)) (Const64 <typ.UInt64> [63])) 8243 for { 8244 t := v.Type 8245 _ = v.Args[1] 8246 x := v.Args[0] 8247 v_1 := v.Args[1] 8248 if v_1.Op != OpConst64 { 8249 break 8250 } 8251 if v_1.AuxInt != -1<<63 { 8252 break 8253 } 8254 v.reset(OpRsh64Ux64) 8255 v0 := b.NewValue0(v.Pos, OpAnd64, t) 8256 v0.AddArg(x) 8257 v1 := b.NewValue0(v.Pos, OpNeg64, t) 8258 v1.AddArg(x) 8259 v0.AddArg(v1) 8260 v.AddArg(v0) 8261 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8262 v2.AuxInt = 63 8263 v.AddArg(v2) 8264 return true 8265 } 8266 // match: (Div64 <t> n (Const64 [c])) 8267 // cond: isPowerOfTwo(c) 8268 // 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)])) 8269 for { 8270 t := v.Type 8271 _ = v.Args[1] 8272 n := v.Args[0] 8273 v_1 := v.Args[1] 8274 if v_1.Op != OpConst64 { 8275 break 8276 } 8277 c := v_1.AuxInt 8278 if !(isPowerOfTwo(c)) { 8279 break 8280 } 8281 v.reset(OpRsh64x64) 8282 v0 := b.NewValue0(v.Pos, OpAdd64, t) 8283 v0.AddArg(n) 8284 v1 := b.NewValue0(v.Pos, OpRsh64Ux64, t) 8285 v2 := b.NewValue0(v.Pos, OpRsh64x64, t) 8286 v2.AddArg(n) 8287 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8288 v3.AuxInt = 63 8289 v2.AddArg(v3) 8290 v1.AddArg(v2) 8291 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8292 v4.AuxInt = 64 - log2(c) 8293 v1.AddArg(v4) 8294 v0.AddArg(v1) 8295 v.AddArg(v0) 8296 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8297 v5.AuxInt = log2(c) 8298 v.AddArg(v5) 8299 return true 8300 } 8301 // match: (Div64 <t> x (Const64 [c])) 8302 // cond: smagicOK(64,c) && smagic(64,c).m&1 == 0 8303 // 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]))) 8304 for { 8305 t := v.Type 8306 _ = v.Args[1] 8307 x := v.Args[0] 8308 v_1 := v.Args[1] 8309 if v_1.Op != OpConst64 { 8310 break 8311 } 8312 c := v_1.AuxInt 8313 if !(smagicOK(64, c) && smagic(64, c).m&1 == 0) { 8314 break 8315 } 8316 v.reset(OpSub64) 8317 v.Type = t 8318 v0 := b.NewValue0(v.Pos, OpRsh64x64, t) 8319 v1 := b.NewValue0(v.Pos, OpHmul64, t) 8320 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8321 v2.AuxInt = int64(smagic(64, c).m / 2) 8322 v1.AddArg(v2) 8323 v1.AddArg(x) 8324 v0.AddArg(v1) 8325 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8326 v3.AuxInt = smagic(64, c).s - 1 8327 v0.AddArg(v3) 8328 v.AddArg(v0) 8329 v4 := b.NewValue0(v.Pos, OpRsh64x64, t) 8330 v4.AddArg(x) 8331 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8332 v5.AuxInt = 63 8333 v4.AddArg(v5) 8334 v.AddArg(v4) 8335 return true 8336 } 8337 // match: (Div64 <t> x (Const64 [c])) 8338 // cond: smagicOK(64,c) && smagic(64,c).m&1 != 0 8339 // 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]))) 8340 for { 8341 t := v.Type 8342 _ = v.Args[1] 8343 x := v.Args[0] 8344 v_1 := v.Args[1] 8345 if v_1.Op != OpConst64 { 8346 break 8347 } 8348 c := v_1.AuxInt 8349 if !(smagicOK(64, c) && smagic(64, c).m&1 != 0) { 8350 break 8351 } 8352 v.reset(OpSub64) 8353 v.Type = t 8354 v0 := b.NewValue0(v.Pos, OpRsh64x64, t) 8355 v1 := b.NewValue0(v.Pos, OpAdd64, t) 8356 v2 := b.NewValue0(v.Pos, OpHmul64, t) 8357 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8358 v3.AuxInt = int64(smagic(64, c).m) 8359 v2.AddArg(v3) 8360 v2.AddArg(x) 8361 v1.AddArg(v2) 8362 v1.AddArg(x) 8363 v0.AddArg(v1) 8364 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8365 v4.AuxInt = smagic(64, c).s 8366 v0.AddArg(v4) 8367 v.AddArg(v0) 8368 v5 := b.NewValue0(v.Pos, OpRsh64x64, t) 8369 v5.AddArg(x) 8370 v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8371 v6.AuxInt = 63 8372 v5.AddArg(v6) 8373 v.AddArg(v5) 8374 return true 8375 } 8376 return false 8377 } 8378 func rewriteValuegeneric_OpDiv64F_0(v *Value) bool { 8379 b := v.Block 8380 _ = b 8381 // match: (Div64F (Const64F [c]) (Const64F [d])) 8382 // cond: 8383 // result: (Const64F [f2i(i2f(c) / i2f(d))]) 8384 for { 8385 _ = v.Args[1] 8386 v_0 := v.Args[0] 8387 if v_0.Op != OpConst64F { 8388 break 8389 } 8390 c := v_0.AuxInt 8391 v_1 := v.Args[1] 8392 if v_1.Op != OpConst64F { 8393 break 8394 } 8395 d := v_1.AuxInt 8396 v.reset(OpConst64F) 8397 v.AuxInt = f2i(i2f(c) / i2f(d)) 8398 return true 8399 } 8400 // match: (Div64F x (Const64F <t> [c])) 8401 // cond: reciprocalExact64(i2f(c)) 8402 // result: (Mul64F x (Const64F <t> [f2i(1/i2f(c))])) 8403 for { 8404 _ = v.Args[1] 8405 x := v.Args[0] 8406 v_1 := v.Args[1] 8407 if v_1.Op != OpConst64F { 8408 break 8409 } 8410 t := v_1.Type 8411 c := v_1.AuxInt 8412 if !(reciprocalExact64(i2f(c))) { 8413 break 8414 } 8415 v.reset(OpMul64F) 8416 v.AddArg(x) 8417 v0 := b.NewValue0(v.Pos, OpConst64F, t) 8418 v0.AuxInt = f2i(1 / i2f(c)) 8419 v.AddArg(v0) 8420 return true 8421 } 8422 return false 8423 } 8424 func rewriteValuegeneric_OpDiv64u_0(v *Value) bool { 8425 b := v.Block 8426 _ = b 8427 config := b.Func.Config 8428 _ = config 8429 typ := &b.Func.Config.Types 8430 _ = typ 8431 // match: (Div64u (Const64 [c]) (Const64 [d])) 8432 // cond: d != 0 8433 // result: (Const64 [int64(uint64(c)/uint64(d))]) 8434 for { 8435 _ = v.Args[1] 8436 v_0 := v.Args[0] 8437 if v_0.Op != OpConst64 { 8438 break 8439 } 8440 c := v_0.AuxInt 8441 v_1 := v.Args[1] 8442 if v_1.Op != OpConst64 { 8443 break 8444 } 8445 d := v_1.AuxInt 8446 if !(d != 0) { 8447 break 8448 } 8449 v.reset(OpConst64) 8450 v.AuxInt = int64(uint64(c) / uint64(d)) 8451 return true 8452 } 8453 // match: (Div64u n (Const64 [c])) 8454 // cond: isPowerOfTwo(c) 8455 // result: (Rsh64Ux64 n (Const64 <typ.UInt64> [log2(c)])) 8456 for { 8457 _ = v.Args[1] 8458 n := v.Args[0] 8459 v_1 := v.Args[1] 8460 if v_1.Op != OpConst64 { 8461 break 8462 } 8463 c := v_1.AuxInt 8464 if !(isPowerOfTwo(c)) { 8465 break 8466 } 8467 v.reset(OpRsh64Ux64) 8468 v.AddArg(n) 8469 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8470 v0.AuxInt = log2(c) 8471 v.AddArg(v0) 8472 return true 8473 } 8474 // match: (Div64u n (Const64 [-1<<63])) 8475 // cond: 8476 // result: (Rsh64Ux64 n (Const64 <typ.UInt64> [63])) 8477 for { 8478 _ = v.Args[1] 8479 n := v.Args[0] 8480 v_1 := v.Args[1] 8481 if v_1.Op != OpConst64 { 8482 break 8483 } 8484 if v_1.AuxInt != -1<<63 { 8485 break 8486 } 8487 v.reset(OpRsh64Ux64) 8488 v.AddArg(n) 8489 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8490 v0.AuxInt = 63 8491 v.AddArg(v0) 8492 return true 8493 } 8494 // match: (Div64u x (Const64 [c])) 8495 // cond: umagicOK(64, c) && config.RegSize == 8 && umagic(64,c).m&1 == 0 8496 // 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])) 8497 for { 8498 _ = v.Args[1] 8499 x := v.Args[0] 8500 v_1 := v.Args[1] 8501 if v_1.Op != OpConst64 { 8502 break 8503 } 8504 c := v_1.AuxInt 8505 if !(umagicOK(64, c) && config.RegSize == 8 && umagic(64, c).m&1 == 0) { 8506 break 8507 } 8508 v.reset(OpRsh64Ux64) 8509 v.Type = typ.UInt64 8510 v0 := b.NewValue0(v.Pos, OpHmul64u, typ.UInt64) 8511 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8512 v1.AuxInt = int64(1<<63 + umagic(64, c).m/2) 8513 v0.AddArg(v1) 8514 v0.AddArg(x) 8515 v.AddArg(v0) 8516 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8517 v2.AuxInt = umagic(64, c).s - 1 8518 v.AddArg(v2) 8519 return true 8520 } 8521 // match: (Div64u x (Const64 [c])) 8522 // cond: umagicOK(64, c) && config.RegSize == 8 && c&1 == 0 8523 // 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])) 8524 for { 8525 _ = v.Args[1] 8526 x := v.Args[0] 8527 v_1 := v.Args[1] 8528 if v_1.Op != OpConst64 { 8529 break 8530 } 8531 c := v_1.AuxInt 8532 if !(umagicOK(64, c) && config.RegSize == 8 && c&1 == 0) { 8533 break 8534 } 8535 v.reset(OpRsh64Ux64) 8536 v.Type = typ.UInt64 8537 v0 := b.NewValue0(v.Pos, OpHmul64u, typ.UInt64) 8538 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8539 v1.AuxInt = int64(1<<63 + (umagic(64, c).m+1)/2) 8540 v0.AddArg(v1) 8541 v2 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64) 8542 v2.AddArg(x) 8543 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8544 v3.AuxInt = 1 8545 v2.AddArg(v3) 8546 v0.AddArg(v2) 8547 v.AddArg(v0) 8548 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8549 v4.AuxInt = umagic(64, c).s - 2 8550 v.AddArg(v4) 8551 return true 8552 } 8553 // match: (Div64u x (Const64 [c])) 8554 // cond: umagicOK(64, c) && config.RegSize == 8 8555 // 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])) 8556 for { 8557 _ = v.Args[1] 8558 x := v.Args[0] 8559 v_1 := v.Args[1] 8560 if v_1.Op != OpConst64 { 8561 break 8562 } 8563 c := v_1.AuxInt 8564 if !(umagicOK(64, c) && config.RegSize == 8) { 8565 break 8566 } 8567 v.reset(OpRsh64Ux64) 8568 v.Type = typ.UInt64 8569 v0 := b.NewValue0(v.Pos, OpAvg64u, typ.UInt64) 8570 v0.AddArg(x) 8571 v1 := b.NewValue0(v.Pos, OpHmul64u, typ.UInt64) 8572 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8573 v2.AuxInt = int64(umagic(64, c).m) 8574 v1.AddArg(v2) 8575 v1.AddArg(x) 8576 v0.AddArg(v1) 8577 v.AddArg(v0) 8578 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8579 v3.AuxInt = umagic(64, c).s - 1 8580 v.AddArg(v3) 8581 return true 8582 } 8583 return false 8584 } 8585 func rewriteValuegeneric_OpDiv8_0(v *Value) bool { 8586 b := v.Block 8587 _ = b 8588 typ := &b.Func.Config.Types 8589 _ = typ 8590 // match: (Div8 (Const8 [c]) (Const8 [d])) 8591 // cond: d != 0 8592 // result: (Const8 [int64(int8(c)/int8(d))]) 8593 for { 8594 _ = v.Args[1] 8595 v_0 := v.Args[0] 8596 if v_0.Op != OpConst8 { 8597 break 8598 } 8599 c := v_0.AuxInt 8600 v_1 := v.Args[1] 8601 if v_1.Op != OpConst8 { 8602 break 8603 } 8604 d := v_1.AuxInt 8605 if !(d != 0) { 8606 break 8607 } 8608 v.reset(OpConst8) 8609 v.AuxInt = int64(int8(c) / int8(d)) 8610 return true 8611 } 8612 // match: (Div8 n (Const8 [c])) 8613 // cond: isNonNegative(n) && isPowerOfTwo(c&0xff) 8614 // result: (Rsh8Ux64 n (Const64 <typ.UInt64> [log2(c&0xff)])) 8615 for { 8616 _ = v.Args[1] 8617 n := v.Args[0] 8618 v_1 := v.Args[1] 8619 if v_1.Op != OpConst8 { 8620 break 8621 } 8622 c := v_1.AuxInt 8623 if !(isNonNegative(n) && isPowerOfTwo(c&0xff)) { 8624 break 8625 } 8626 v.reset(OpRsh8Ux64) 8627 v.AddArg(n) 8628 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8629 v0.AuxInt = log2(c & 0xff) 8630 v.AddArg(v0) 8631 return true 8632 } 8633 // match: (Div8 <t> n (Const8 [c])) 8634 // cond: c < 0 && c != -1<<7 8635 // result: (Neg8 (Div8 <t> n (Const8 <t> [-c]))) 8636 for { 8637 t := v.Type 8638 _ = v.Args[1] 8639 n := v.Args[0] 8640 v_1 := v.Args[1] 8641 if v_1.Op != OpConst8 { 8642 break 8643 } 8644 c := v_1.AuxInt 8645 if !(c < 0 && c != -1<<7) { 8646 break 8647 } 8648 v.reset(OpNeg8) 8649 v0 := b.NewValue0(v.Pos, OpDiv8, t) 8650 v0.AddArg(n) 8651 v1 := b.NewValue0(v.Pos, OpConst8, t) 8652 v1.AuxInt = -c 8653 v0.AddArg(v1) 8654 v.AddArg(v0) 8655 return true 8656 } 8657 // match: (Div8 <t> x (Const8 [-1<<7 ])) 8658 // cond: 8659 // result: (Rsh8Ux64 (And8 <t> x (Neg8 <t> x)) (Const64 <typ.UInt64> [7 ])) 8660 for { 8661 t := v.Type 8662 _ = v.Args[1] 8663 x := v.Args[0] 8664 v_1 := v.Args[1] 8665 if v_1.Op != OpConst8 { 8666 break 8667 } 8668 if v_1.AuxInt != -1<<7 { 8669 break 8670 } 8671 v.reset(OpRsh8Ux64) 8672 v0 := b.NewValue0(v.Pos, OpAnd8, t) 8673 v0.AddArg(x) 8674 v1 := b.NewValue0(v.Pos, OpNeg8, t) 8675 v1.AddArg(x) 8676 v0.AddArg(v1) 8677 v.AddArg(v0) 8678 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8679 v2.AuxInt = 7 8680 v.AddArg(v2) 8681 return true 8682 } 8683 // match: (Div8 <t> n (Const8 [c])) 8684 // cond: isPowerOfTwo(c) 8685 // 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)])) 8686 for { 8687 t := v.Type 8688 _ = v.Args[1] 8689 n := v.Args[0] 8690 v_1 := v.Args[1] 8691 if v_1.Op != OpConst8 { 8692 break 8693 } 8694 c := v_1.AuxInt 8695 if !(isPowerOfTwo(c)) { 8696 break 8697 } 8698 v.reset(OpRsh8x64) 8699 v0 := b.NewValue0(v.Pos, OpAdd8, t) 8700 v0.AddArg(n) 8701 v1 := b.NewValue0(v.Pos, OpRsh8Ux64, t) 8702 v2 := b.NewValue0(v.Pos, OpRsh8x64, t) 8703 v2.AddArg(n) 8704 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8705 v3.AuxInt = 7 8706 v2.AddArg(v3) 8707 v1.AddArg(v2) 8708 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8709 v4.AuxInt = 8 - log2(c) 8710 v1.AddArg(v4) 8711 v0.AddArg(v1) 8712 v.AddArg(v0) 8713 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8714 v5.AuxInt = log2(c) 8715 v.AddArg(v5) 8716 return true 8717 } 8718 // match: (Div8 <t> x (Const8 [c])) 8719 // cond: smagicOK(8,c) 8720 // 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]))) 8721 for { 8722 t := v.Type 8723 _ = v.Args[1] 8724 x := v.Args[0] 8725 v_1 := v.Args[1] 8726 if v_1.Op != OpConst8 { 8727 break 8728 } 8729 c := v_1.AuxInt 8730 if !(smagicOK(8, c)) { 8731 break 8732 } 8733 v.reset(OpSub8) 8734 v.Type = t 8735 v0 := b.NewValue0(v.Pos, OpRsh32x64, t) 8736 v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) 8737 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 8738 v2.AuxInt = int64(smagic(8, c).m) 8739 v1.AddArg(v2) 8740 v3 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 8741 v3.AddArg(x) 8742 v1.AddArg(v3) 8743 v0.AddArg(v1) 8744 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8745 v4.AuxInt = 8 + smagic(8, c).s 8746 v0.AddArg(v4) 8747 v.AddArg(v0) 8748 v5 := b.NewValue0(v.Pos, OpRsh32x64, t) 8749 v6 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 8750 v6.AddArg(x) 8751 v5.AddArg(v6) 8752 v7 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8753 v7.AuxInt = 31 8754 v5.AddArg(v7) 8755 v.AddArg(v5) 8756 return true 8757 } 8758 return false 8759 } 8760 func rewriteValuegeneric_OpDiv8u_0(v *Value) bool { 8761 b := v.Block 8762 _ = b 8763 typ := &b.Func.Config.Types 8764 _ = typ 8765 // match: (Div8u (Const8 [c]) (Const8 [d])) 8766 // cond: d != 0 8767 // result: (Const8 [int64(int8(uint8(c)/uint8(d)))]) 8768 for { 8769 _ = v.Args[1] 8770 v_0 := v.Args[0] 8771 if v_0.Op != OpConst8 { 8772 break 8773 } 8774 c := v_0.AuxInt 8775 v_1 := v.Args[1] 8776 if v_1.Op != OpConst8 { 8777 break 8778 } 8779 d := v_1.AuxInt 8780 if !(d != 0) { 8781 break 8782 } 8783 v.reset(OpConst8) 8784 v.AuxInt = int64(int8(uint8(c) / uint8(d))) 8785 return true 8786 } 8787 // match: (Div8u n (Const8 [c])) 8788 // cond: isPowerOfTwo(c&0xff) 8789 // result: (Rsh8Ux64 n (Const64 <typ.UInt64> [log2(c&0xff)])) 8790 for { 8791 _ = v.Args[1] 8792 n := v.Args[0] 8793 v_1 := v.Args[1] 8794 if v_1.Op != OpConst8 { 8795 break 8796 } 8797 c := v_1.AuxInt 8798 if !(isPowerOfTwo(c & 0xff)) { 8799 break 8800 } 8801 v.reset(OpRsh8Ux64) 8802 v.AddArg(n) 8803 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8804 v0.AuxInt = log2(c & 0xff) 8805 v.AddArg(v0) 8806 return true 8807 } 8808 // match: (Div8u x (Const8 [c])) 8809 // cond: umagicOK(8, c) 8810 // 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]))) 8811 for { 8812 _ = v.Args[1] 8813 x := v.Args[0] 8814 v_1 := v.Args[1] 8815 if v_1.Op != OpConst8 { 8816 break 8817 } 8818 c := v_1.AuxInt 8819 if !(umagicOK(8, c)) { 8820 break 8821 } 8822 v.reset(OpTrunc32to8) 8823 v0 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32) 8824 v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) 8825 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 8826 v2.AuxInt = int64(1<<8 + umagic(8, c).m) 8827 v1.AddArg(v2) 8828 v3 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 8829 v3.AddArg(x) 8830 v1.AddArg(v3) 8831 v0.AddArg(v1) 8832 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8833 v4.AuxInt = 8 + umagic(8, c).s 8834 v0.AddArg(v4) 8835 v.AddArg(v0) 8836 return true 8837 } 8838 return false 8839 } 8840 func rewriteValuegeneric_OpEq16_0(v *Value) bool { 8841 b := v.Block 8842 _ = b 8843 // match: (Eq16 x x) 8844 // cond: 8845 // result: (ConstBool [1]) 8846 for { 8847 _ = v.Args[1] 8848 x := v.Args[0] 8849 if x != v.Args[1] { 8850 break 8851 } 8852 v.reset(OpConstBool) 8853 v.AuxInt = 1 8854 return true 8855 } 8856 // match: (Eq16 (Const16 <t> [c]) (Add16 (Const16 <t> [d]) x)) 8857 // cond: 8858 // result: (Eq16 (Const16 <t> [int64(int16(c-d))]) x) 8859 for { 8860 _ = v.Args[1] 8861 v_0 := v.Args[0] 8862 if v_0.Op != OpConst16 { 8863 break 8864 } 8865 t := v_0.Type 8866 c := v_0.AuxInt 8867 v_1 := v.Args[1] 8868 if v_1.Op != OpAdd16 { 8869 break 8870 } 8871 _ = v_1.Args[1] 8872 v_1_0 := v_1.Args[0] 8873 if v_1_0.Op != OpConst16 { 8874 break 8875 } 8876 if v_1_0.Type != t { 8877 break 8878 } 8879 d := v_1_0.AuxInt 8880 x := v_1.Args[1] 8881 v.reset(OpEq16) 8882 v0 := b.NewValue0(v.Pos, OpConst16, t) 8883 v0.AuxInt = int64(int16(c - d)) 8884 v.AddArg(v0) 8885 v.AddArg(x) 8886 return true 8887 } 8888 // match: (Eq16 (Const16 <t> [c]) (Add16 x (Const16 <t> [d]))) 8889 // cond: 8890 // result: (Eq16 (Const16 <t> [int64(int16(c-d))]) x) 8891 for { 8892 _ = v.Args[1] 8893 v_0 := v.Args[0] 8894 if v_0.Op != OpConst16 { 8895 break 8896 } 8897 t := v_0.Type 8898 c := v_0.AuxInt 8899 v_1 := v.Args[1] 8900 if v_1.Op != OpAdd16 { 8901 break 8902 } 8903 _ = v_1.Args[1] 8904 x := v_1.Args[0] 8905 v_1_1 := v_1.Args[1] 8906 if v_1_1.Op != OpConst16 { 8907 break 8908 } 8909 if v_1_1.Type != t { 8910 break 8911 } 8912 d := v_1_1.AuxInt 8913 v.reset(OpEq16) 8914 v0 := b.NewValue0(v.Pos, OpConst16, t) 8915 v0.AuxInt = int64(int16(c - d)) 8916 v.AddArg(v0) 8917 v.AddArg(x) 8918 return true 8919 } 8920 // match: (Eq16 (Add16 (Const16 <t> [d]) x) (Const16 <t> [c])) 8921 // cond: 8922 // result: (Eq16 (Const16 <t> [int64(int16(c-d))]) x) 8923 for { 8924 _ = v.Args[1] 8925 v_0 := v.Args[0] 8926 if v_0.Op != OpAdd16 { 8927 break 8928 } 8929 _ = v_0.Args[1] 8930 v_0_0 := v_0.Args[0] 8931 if v_0_0.Op != OpConst16 { 8932 break 8933 } 8934 t := v_0_0.Type 8935 d := v_0_0.AuxInt 8936 x := v_0.Args[1] 8937 v_1 := v.Args[1] 8938 if v_1.Op != OpConst16 { 8939 break 8940 } 8941 if v_1.Type != t { 8942 break 8943 } 8944 c := v_1.AuxInt 8945 v.reset(OpEq16) 8946 v0 := b.NewValue0(v.Pos, OpConst16, t) 8947 v0.AuxInt = int64(int16(c - d)) 8948 v.AddArg(v0) 8949 v.AddArg(x) 8950 return true 8951 } 8952 // match: (Eq16 (Add16 x (Const16 <t> [d])) (Const16 <t> [c])) 8953 // cond: 8954 // result: (Eq16 (Const16 <t> [int64(int16(c-d))]) x) 8955 for { 8956 _ = v.Args[1] 8957 v_0 := v.Args[0] 8958 if v_0.Op != OpAdd16 { 8959 break 8960 } 8961 _ = v_0.Args[1] 8962 x := v_0.Args[0] 8963 v_0_1 := v_0.Args[1] 8964 if v_0_1.Op != OpConst16 { 8965 break 8966 } 8967 t := v_0_1.Type 8968 d := v_0_1.AuxInt 8969 v_1 := v.Args[1] 8970 if v_1.Op != OpConst16 { 8971 break 8972 } 8973 if v_1.Type != t { 8974 break 8975 } 8976 c := v_1.AuxInt 8977 v.reset(OpEq16) 8978 v0 := b.NewValue0(v.Pos, OpConst16, t) 8979 v0.AuxInt = int64(int16(c - d)) 8980 v.AddArg(v0) 8981 v.AddArg(x) 8982 return true 8983 } 8984 // match: (Eq16 (Const16 [c]) (Const16 [d])) 8985 // cond: 8986 // result: (ConstBool [b2i(c == d)]) 8987 for { 8988 _ = v.Args[1] 8989 v_0 := v.Args[0] 8990 if v_0.Op != OpConst16 { 8991 break 8992 } 8993 c := v_0.AuxInt 8994 v_1 := v.Args[1] 8995 if v_1.Op != OpConst16 { 8996 break 8997 } 8998 d := v_1.AuxInt 8999 v.reset(OpConstBool) 9000 v.AuxInt = b2i(c == d) 9001 return true 9002 } 9003 // match: (Eq16 (Const16 [d]) (Const16 [c])) 9004 // cond: 9005 // result: (ConstBool [b2i(c == d)]) 9006 for { 9007 _ = v.Args[1] 9008 v_0 := v.Args[0] 9009 if v_0.Op != OpConst16 { 9010 break 9011 } 9012 d := v_0.AuxInt 9013 v_1 := v.Args[1] 9014 if v_1.Op != OpConst16 { 9015 break 9016 } 9017 c := v_1.AuxInt 9018 v.reset(OpConstBool) 9019 v.AuxInt = b2i(c == d) 9020 return true 9021 } 9022 return false 9023 } 9024 func rewriteValuegeneric_OpEq32_0(v *Value) bool { 9025 b := v.Block 9026 _ = b 9027 // match: (Eq32 x x) 9028 // cond: 9029 // result: (ConstBool [1]) 9030 for { 9031 _ = v.Args[1] 9032 x := v.Args[0] 9033 if x != v.Args[1] { 9034 break 9035 } 9036 v.reset(OpConstBool) 9037 v.AuxInt = 1 9038 return true 9039 } 9040 // match: (Eq32 (Const32 <t> [c]) (Add32 (Const32 <t> [d]) x)) 9041 // cond: 9042 // result: (Eq32 (Const32 <t> [int64(int32(c-d))]) x) 9043 for { 9044 _ = v.Args[1] 9045 v_0 := v.Args[0] 9046 if v_0.Op != OpConst32 { 9047 break 9048 } 9049 t := v_0.Type 9050 c := v_0.AuxInt 9051 v_1 := v.Args[1] 9052 if v_1.Op != OpAdd32 { 9053 break 9054 } 9055 _ = v_1.Args[1] 9056 v_1_0 := v_1.Args[0] 9057 if v_1_0.Op != OpConst32 { 9058 break 9059 } 9060 if v_1_0.Type != t { 9061 break 9062 } 9063 d := v_1_0.AuxInt 9064 x := v_1.Args[1] 9065 v.reset(OpEq32) 9066 v0 := b.NewValue0(v.Pos, OpConst32, t) 9067 v0.AuxInt = int64(int32(c - d)) 9068 v.AddArg(v0) 9069 v.AddArg(x) 9070 return true 9071 } 9072 // match: (Eq32 (Const32 <t> [c]) (Add32 x (Const32 <t> [d]))) 9073 // cond: 9074 // result: (Eq32 (Const32 <t> [int64(int32(c-d))]) x) 9075 for { 9076 _ = v.Args[1] 9077 v_0 := v.Args[0] 9078 if v_0.Op != OpConst32 { 9079 break 9080 } 9081 t := v_0.Type 9082 c := v_0.AuxInt 9083 v_1 := v.Args[1] 9084 if v_1.Op != OpAdd32 { 9085 break 9086 } 9087 _ = v_1.Args[1] 9088 x := v_1.Args[0] 9089 v_1_1 := v_1.Args[1] 9090 if v_1_1.Op != OpConst32 { 9091 break 9092 } 9093 if v_1_1.Type != t { 9094 break 9095 } 9096 d := v_1_1.AuxInt 9097 v.reset(OpEq32) 9098 v0 := b.NewValue0(v.Pos, OpConst32, t) 9099 v0.AuxInt = int64(int32(c - d)) 9100 v.AddArg(v0) 9101 v.AddArg(x) 9102 return true 9103 } 9104 // match: (Eq32 (Add32 (Const32 <t> [d]) x) (Const32 <t> [c])) 9105 // cond: 9106 // result: (Eq32 (Const32 <t> [int64(int32(c-d))]) x) 9107 for { 9108 _ = v.Args[1] 9109 v_0 := v.Args[0] 9110 if v_0.Op != OpAdd32 { 9111 break 9112 } 9113 _ = v_0.Args[1] 9114 v_0_0 := v_0.Args[0] 9115 if v_0_0.Op != OpConst32 { 9116 break 9117 } 9118 t := v_0_0.Type 9119 d := v_0_0.AuxInt 9120 x := v_0.Args[1] 9121 v_1 := v.Args[1] 9122 if v_1.Op != OpConst32 { 9123 break 9124 } 9125 if v_1.Type != t { 9126 break 9127 } 9128 c := v_1.AuxInt 9129 v.reset(OpEq32) 9130 v0 := b.NewValue0(v.Pos, OpConst32, t) 9131 v0.AuxInt = int64(int32(c - d)) 9132 v.AddArg(v0) 9133 v.AddArg(x) 9134 return true 9135 } 9136 // match: (Eq32 (Add32 x (Const32 <t> [d])) (Const32 <t> [c])) 9137 // cond: 9138 // result: (Eq32 (Const32 <t> [int64(int32(c-d))]) x) 9139 for { 9140 _ = v.Args[1] 9141 v_0 := v.Args[0] 9142 if v_0.Op != OpAdd32 { 9143 break 9144 } 9145 _ = v_0.Args[1] 9146 x := v_0.Args[0] 9147 v_0_1 := v_0.Args[1] 9148 if v_0_1.Op != OpConst32 { 9149 break 9150 } 9151 t := v_0_1.Type 9152 d := v_0_1.AuxInt 9153 v_1 := v.Args[1] 9154 if v_1.Op != OpConst32 { 9155 break 9156 } 9157 if v_1.Type != t { 9158 break 9159 } 9160 c := v_1.AuxInt 9161 v.reset(OpEq32) 9162 v0 := b.NewValue0(v.Pos, OpConst32, t) 9163 v0.AuxInt = int64(int32(c - d)) 9164 v.AddArg(v0) 9165 v.AddArg(x) 9166 return true 9167 } 9168 // match: (Eq32 (Const32 [c]) (Const32 [d])) 9169 // cond: 9170 // result: (ConstBool [b2i(c == d)]) 9171 for { 9172 _ = v.Args[1] 9173 v_0 := v.Args[0] 9174 if v_0.Op != OpConst32 { 9175 break 9176 } 9177 c := v_0.AuxInt 9178 v_1 := v.Args[1] 9179 if v_1.Op != OpConst32 { 9180 break 9181 } 9182 d := v_1.AuxInt 9183 v.reset(OpConstBool) 9184 v.AuxInt = b2i(c == d) 9185 return true 9186 } 9187 // match: (Eq32 (Const32 [d]) (Const32 [c])) 9188 // cond: 9189 // result: (ConstBool [b2i(c == d)]) 9190 for { 9191 _ = v.Args[1] 9192 v_0 := v.Args[0] 9193 if v_0.Op != OpConst32 { 9194 break 9195 } 9196 d := v_0.AuxInt 9197 v_1 := v.Args[1] 9198 if v_1.Op != OpConst32 { 9199 break 9200 } 9201 c := v_1.AuxInt 9202 v.reset(OpConstBool) 9203 v.AuxInt = b2i(c == d) 9204 return true 9205 } 9206 return false 9207 } 9208 func rewriteValuegeneric_OpEq32F_0(v *Value) bool { 9209 // match: (Eq32F (Const32F [c]) (Const32F [d])) 9210 // cond: 9211 // result: (ConstBool [b2i(i2f(c) == i2f(d))]) 9212 for { 9213 _ = v.Args[1] 9214 v_0 := v.Args[0] 9215 if v_0.Op != OpConst32F { 9216 break 9217 } 9218 c := v_0.AuxInt 9219 v_1 := v.Args[1] 9220 if v_1.Op != OpConst32F { 9221 break 9222 } 9223 d := v_1.AuxInt 9224 v.reset(OpConstBool) 9225 v.AuxInt = b2i(i2f(c) == i2f(d)) 9226 return true 9227 } 9228 // match: (Eq32F (Const32F [d]) (Const32F [c])) 9229 // cond: 9230 // result: (ConstBool [b2i(i2f(c) == i2f(d))]) 9231 for { 9232 _ = v.Args[1] 9233 v_0 := v.Args[0] 9234 if v_0.Op != OpConst32F { 9235 break 9236 } 9237 d := v_0.AuxInt 9238 v_1 := v.Args[1] 9239 if v_1.Op != OpConst32F { 9240 break 9241 } 9242 c := v_1.AuxInt 9243 v.reset(OpConstBool) 9244 v.AuxInt = b2i(i2f(c) == i2f(d)) 9245 return true 9246 } 9247 return false 9248 } 9249 func rewriteValuegeneric_OpEq64_0(v *Value) bool { 9250 b := v.Block 9251 _ = b 9252 // match: (Eq64 x x) 9253 // cond: 9254 // result: (ConstBool [1]) 9255 for { 9256 _ = v.Args[1] 9257 x := v.Args[0] 9258 if x != v.Args[1] { 9259 break 9260 } 9261 v.reset(OpConstBool) 9262 v.AuxInt = 1 9263 return true 9264 } 9265 // match: (Eq64 (Const64 <t> [c]) (Add64 (Const64 <t> [d]) x)) 9266 // cond: 9267 // result: (Eq64 (Const64 <t> [c-d]) x) 9268 for { 9269 _ = v.Args[1] 9270 v_0 := v.Args[0] 9271 if v_0.Op != OpConst64 { 9272 break 9273 } 9274 t := v_0.Type 9275 c := v_0.AuxInt 9276 v_1 := v.Args[1] 9277 if v_1.Op != OpAdd64 { 9278 break 9279 } 9280 _ = v_1.Args[1] 9281 v_1_0 := v_1.Args[0] 9282 if v_1_0.Op != OpConst64 { 9283 break 9284 } 9285 if v_1_0.Type != t { 9286 break 9287 } 9288 d := v_1_0.AuxInt 9289 x := v_1.Args[1] 9290 v.reset(OpEq64) 9291 v0 := b.NewValue0(v.Pos, OpConst64, t) 9292 v0.AuxInt = c - d 9293 v.AddArg(v0) 9294 v.AddArg(x) 9295 return true 9296 } 9297 // match: (Eq64 (Const64 <t> [c]) (Add64 x (Const64 <t> [d]))) 9298 // cond: 9299 // result: (Eq64 (Const64 <t> [c-d]) x) 9300 for { 9301 _ = v.Args[1] 9302 v_0 := v.Args[0] 9303 if v_0.Op != OpConst64 { 9304 break 9305 } 9306 t := v_0.Type 9307 c := v_0.AuxInt 9308 v_1 := v.Args[1] 9309 if v_1.Op != OpAdd64 { 9310 break 9311 } 9312 _ = v_1.Args[1] 9313 x := v_1.Args[0] 9314 v_1_1 := v_1.Args[1] 9315 if v_1_1.Op != OpConst64 { 9316 break 9317 } 9318 if v_1_1.Type != t { 9319 break 9320 } 9321 d := v_1_1.AuxInt 9322 v.reset(OpEq64) 9323 v0 := b.NewValue0(v.Pos, OpConst64, t) 9324 v0.AuxInt = c - d 9325 v.AddArg(v0) 9326 v.AddArg(x) 9327 return true 9328 } 9329 // match: (Eq64 (Add64 (Const64 <t> [d]) x) (Const64 <t> [c])) 9330 // cond: 9331 // result: (Eq64 (Const64 <t> [c-d]) x) 9332 for { 9333 _ = v.Args[1] 9334 v_0 := v.Args[0] 9335 if v_0.Op != OpAdd64 { 9336 break 9337 } 9338 _ = v_0.Args[1] 9339 v_0_0 := v_0.Args[0] 9340 if v_0_0.Op != OpConst64 { 9341 break 9342 } 9343 t := v_0_0.Type 9344 d := v_0_0.AuxInt 9345 x := v_0.Args[1] 9346 v_1 := v.Args[1] 9347 if v_1.Op != OpConst64 { 9348 break 9349 } 9350 if v_1.Type != t { 9351 break 9352 } 9353 c := v_1.AuxInt 9354 v.reset(OpEq64) 9355 v0 := b.NewValue0(v.Pos, OpConst64, t) 9356 v0.AuxInt = c - d 9357 v.AddArg(v0) 9358 v.AddArg(x) 9359 return true 9360 } 9361 // match: (Eq64 (Add64 x (Const64 <t> [d])) (Const64 <t> [c])) 9362 // cond: 9363 // result: (Eq64 (Const64 <t> [c-d]) x) 9364 for { 9365 _ = v.Args[1] 9366 v_0 := v.Args[0] 9367 if v_0.Op != OpAdd64 { 9368 break 9369 } 9370 _ = v_0.Args[1] 9371 x := v_0.Args[0] 9372 v_0_1 := v_0.Args[1] 9373 if v_0_1.Op != OpConst64 { 9374 break 9375 } 9376 t := v_0_1.Type 9377 d := v_0_1.AuxInt 9378 v_1 := v.Args[1] 9379 if v_1.Op != OpConst64 { 9380 break 9381 } 9382 if v_1.Type != t { 9383 break 9384 } 9385 c := v_1.AuxInt 9386 v.reset(OpEq64) 9387 v0 := b.NewValue0(v.Pos, OpConst64, t) 9388 v0.AuxInt = c - d 9389 v.AddArg(v0) 9390 v.AddArg(x) 9391 return true 9392 } 9393 // match: (Eq64 (Const64 [c]) (Const64 [d])) 9394 // cond: 9395 // result: (ConstBool [b2i(c == d)]) 9396 for { 9397 _ = v.Args[1] 9398 v_0 := v.Args[0] 9399 if v_0.Op != OpConst64 { 9400 break 9401 } 9402 c := v_0.AuxInt 9403 v_1 := v.Args[1] 9404 if v_1.Op != OpConst64 { 9405 break 9406 } 9407 d := v_1.AuxInt 9408 v.reset(OpConstBool) 9409 v.AuxInt = b2i(c == d) 9410 return true 9411 } 9412 // match: (Eq64 (Const64 [d]) (Const64 [c])) 9413 // cond: 9414 // result: (ConstBool [b2i(c == d)]) 9415 for { 9416 _ = v.Args[1] 9417 v_0 := v.Args[0] 9418 if v_0.Op != OpConst64 { 9419 break 9420 } 9421 d := v_0.AuxInt 9422 v_1 := v.Args[1] 9423 if v_1.Op != OpConst64 { 9424 break 9425 } 9426 c := v_1.AuxInt 9427 v.reset(OpConstBool) 9428 v.AuxInt = b2i(c == d) 9429 return true 9430 } 9431 return false 9432 } 9433 func rewriteValuegeneric_OpEq64F_0(v *Value) bool { 9434 // match: (Eq64F (Const64F [c]) (Const64F [d])) 9435 // cond: 9436 // result: (ConstBool [b2i(i2f(c) == i2f(d))]) 9437 for { 9438 _ = v.Args[1] 9439 v_0 := v.Args[0] 9440 if v_0.Op != OpConst64F { 9441 break 9442 } 9443 c := v_0.AuxInt 9444 v_1 := v.Args[1] 9445 if v_1.Op != OpConst64F { 9446 break 9447 } 9448 d := v_1.AuxInt 9449 v.reset(OpConstBool) 9450 v.AuxInt = b2i(i2f(c) == i2f(d)) 9451 return true 9452 } 9453 // match: (Eq64F (Const64F [d]) (Const64F [c])) 9454 // cond: 9455 // result: (ConstBool [b2i(i2f(c) == i2f(d))]) 9456 for { 9457 _ = v.Args[1] 9458 v_0 := v.Args[0] 9459 if v_0.Op != OpConst64F { 9460 break 9461 } 9462 d := v_0.AuxInt 9463 v_1 := v.Args[1] 9464 if v_1.Op != OpConst64F { 9465 break 9466 } 9467 c := v_1.AuxInt 9468 v.reset(OpConstBool) 9469 v.AuxInt = b2i(i2f(c) == i2f(d)) 9470 return true 9471 } 9472 return false 9473 } 9474 func rewriteValuegeneric_OpEq8_0(v *Value) bool { 9475 b := v.Block 9476 _ = b 9477 // match: (Eq8 x x) 9478 // cond: 9479 // result: (ConstBool [1]) 9480 for { 9481 _ = v.Args[1] 9482 x := v.Args[0] 9483 if x != v.Args[1] { 9484 break 9485 } 9486 v.reset(OpConstBool) 9487 v.AuxInt = 1 9488 return true 9489 } 9490 // match: (Eq8 (Const8 <t> [c]) (Add8 (Const8 <t> [d]) x)) 9491 // cond: 9492 // result: (Eq8 (Const8 <t> [int64(int8(c-d))]) x) 9493 for { 9494 _ = v.Args[1] 9495 v_0 := v.Args[0] 9496 if v_0.Op != OpConst8 { 9497 break 9498 } 9499 t := v_0.Type 9500 c := v_0.AuxInt 9501 v_1 := v.Args[1] 9502 if v_1.Op != OpAdd8 { 9503 break 9504 } 9505 _ = v_1.Args[1] 9506 v_1_0 := v_1.Args[0] 9507 if v_1_0.Op != OpConst8 { 9508 break 9509 } 9510 if v_1_0.Type != t { 9511 break 9512 } 9513 d := v_1_0.AuxInt 9514 x := v_1.Args[1] 9515 v.reset(OpEq8) 9516 v0 := b.NewValue0(v.Pos, OpConst8, t) 9517 v0.AuxInt = int64(int8(c - d)) 9518 v.AddArg(v0) 9519 v.AddArg(x) 9520 return true 9521 } 9522 // match: (Eq8 (Const8 <t> [c]) (Add8 x (Const8 <t> [d]))) 9523 // cond: 9524 // result: (Eq8 (Const8 <t> [int64(int8(c-d))]) x) 9525 for { 9526 _ = v.Args[1] 9527 v_0 := v.Args[0] 9528 if v_0.Op != OpConst8 { 9529 break 9530 } 9531 t := v_0.Type 9532 c := v_0.AuxInt 9533 v_1 := v.Args[1] 9534 if v_1.Op != OpAdd8 { 9535 break 9536 } 9537 _ = v_1.Args[1] 9538 x := v_1.Args[0] 9539 v_1_1 := v_1.Args[1] 9540 if v_1_1.Op != OpConst8 { 9541 break 9542 } 9543 if v_1_1.Type != t { 9544 break 9545 } 9546 d := v_1_1.AuxInt 9547 v.reset(OpEq8) 9548 v0 := b.NewValue0(v.Pos, OpConst8, t) 9549 v0.AuxInt = int64(int8(c - d)) 9550 v.AddArg(v0) 9551 v.AddArg(x) 9552 return true 9553 } 9554 // match: (Eq8 (Add8 (Const8 <t> [d]) x) (Const8 <t> [c])) 9555 // cond: 9556 // result: (Eq8 (Const8 <t> [int64(int8(c-d))]) x) 9557 for { 9558 _ = v.Args[1] 9559 v_0 := v.Args[0] 9560 if v_0.Op != OpAdd8 { 9561 break 9562 } 9563 _ = v_0.Args[1] 9564 v_0_0 := v_0.Args[0] 9565 if v_0_0.Op != OpConst8 { 9566 break 9567 } 9568 t := v_0_0.Type 9569 d := v_0_0.AuxInt 9570 x := v_0.Args[1] 9571 v_1 := v.Args[1] 9572 if v_1.Op != OpConst8 { 9573 break 9574 } 9575 if v_1.Type != t { 9576 break 9577 } 9578 c := v_1.AuxInt 9579 v.reset(OpEq8) 9580 v0 := b.NewValue0(v.Pos, OpConst8, t) 9581 v0.AuxInt = int64(int8(c - d)) 9582 v.AddArg(v0) 9583 v.AddArg(x) 9584 return true 9585 } 9586 // match: (Eq8 (Add8 x (Const8 <t> [d])) (Const8 <t> [c])) 9587 // cond: 9588 // result: (Eq8 (Const8 <t> [int64(int8(c-d))]) x) 9589 for { 9590 _ = v.Args[1] 9591 v_0 := v.Args[0] 9592 if v_0.Op != OpAdd8 { 9593 break 9594 } 9595 _ = v_0.Args[1] 9596 x := v_0.Args[0] 9597 v_0_1 := v_0.Args[1] 9598 if v_0_1.Op != OpConst8 { 9599 break 9600 } 9601 t := v_0_1.Type 9602 d := v_0_1.AuxInt 9603 v_1 := v.Args[1] 9604 if v_1.Op != OpConst8 { 9605 break 9606 } 9607 if v_1.Type != t { 9608 break 9609 } 9610 c := v_1.AuxInt 9611 v.reset(OpEq8) 9612 v0 := b.NewValue0(v.Pos, OpConst8, t) 9613 v0.AuxInt = int64(int8(c - d)) 9614 v.AddArg(v0) 9615 v.AddArg(x) 9616 return true 9617 } 9618 // match: (Eq8 (Const8 [c]) (Const8 [d])) 9619 // cond: 9620 // result: (ConstBool [b2i(c == d)]) 9621 for { 9622 _ = v.Args[1] 9623 v_0 := v.Args[0] 9624 if v_0.Op != OpConst8 { 9625 break 9626 } 9627 c := v_0.AuxInt 9628 v_1 := v.Args[1] 9629 if v_1.Op != OpConst8 { 9630 break 9631 } 9632 d := v_1.AuxInt 9633 v.reset(OpConstBool) 9634 v.AuxInt = b2i(c == d) 9635 return true 9636 } 9637 // match: (Eq8 (Const8 [d]) (Const8 [c])) 9638 // cond: 9639 // result: (ConstBool [b2i(c == d)]) 9640 for { 9641 _ = v.Args[1] 9642 v_0 := v.Args[0] 9643 if v_0.Op != OpConst8 { 9644 break 9645 } 9646 d := v_0.AuxInt 9647 v_1 := v.Args[1] 9648 if v_1.Op != OpConst8 { 9649 break 9650 } 9651 c := v_1.AuxInt 9652 v.reset(OpConstBool) 9653 v.AuxInt = b2i(c == d) 9654 return true 9655 } 9656 return false 9657 } 9658 func rewriteValuegeneric_OpEqB_0(v *Value) bool { 9659 // match: (EqB (ConstBool [c]) (ConstBool [d])) 9660 // cond: 9661 // result: (ConstBool [b2i(c == d)]) 9662 for { 9663 _ = v.Args[1] 9664 v_0 := v.Args[0] 9665 if v_0.Op != OpConstBool { 9666 break 9667 } 9668 c := v_0.AuxInt 9669 v_1 := v.Args[1] 9670 if v_1.Op != OpConstBool { 9671 break 9672 } 9673 d := v_1.AuxInt 9674 v.reset(OpConstBool) 9675 v.AuxInt = b2i(c == d) 9676 return true 9677 } 9678 // match: (EqB (ConstBool [d]) (ConstBool [c])) 9679 // cond: 9680 // result: (ConstBool [b2i(c == d)]) 9681 for { 9682 _ = v.Args[1] 9683 v_0 := v.Args[0] 9684 if v_0.Op != OpConstBool { 9685 break 9686 } 9687 d := v_0.AuxInt 9688 v_1 := v.Args[1] 9689 if v_1.Op != OpConstBool { 9690 break 9691 } 9692 c := v_1.AuxInt 9693 v.reset(OpConstBool) 9694 v.AuxInt = b2i(c == d) 9695 return true 9696 } 9697 // match: (EqB (ConstBool [0]) x) 9698 // cond: 9699 // result: (Not x) 9700 for { 9701 _ = v.Args[1] 9702 v_0 := v.Args[0] 9703 if v_0.Op != OpConstBool { 9704 break 9705 } 9706 if v_0.AuxInt != 0 { 9707 break 9708 } 9709 x := v.Args[1] 9710 v.reset(OpNot) 9711 v.AddArg(x) 9712 return true 9713 } 9714 // match: (EqB x (ConstBool [0])) 9715 // cond: 9716 // result: (Not x) 9717 for { 9718 _ = v.Args[1] 9719 x := v.Args[0] 9720 v_1 := v.Args[1] 9721 if v_1.Op != OpConstBool { 9722 break 9723 } 9724 if v_1.AuxInt != 0 { 9725 break 9726 } 9727 v.reset(OpNot) 9728 v.AddArg(x) 9729 return true 9730 } 9731 // match: (EqB (ConstBool [1]) x) 9732 // cond: 9733 // result: x 9734 for { 9735 _ = v.Args[1] 9736 v_0 := v.Args[0] 9737 if v_0.Op != OpConstBool { 9738 break 9739 } 9740 if v_0.AuxInt != 1 { 9741 break 9742 } 9743 x := v.Args[1] 9744 v.reset(OpCopy) 9745 v.Type = x.Type 9746 v.AddArg(x) 9747 return true 9748 } 9749 // match: (EqB x (ConstBool [1])) 9750 // cond: 9751 // result: x 9752 for { 9753 _ = v.Args[1] 9754 x := v.Args[0] 9755 v_1 := v.Args[1] 9756 if v_1.Op != OpConstBool { 9757 break 9758 } 9759 if v_1.AuxInt != 1 { 9760 break 9761 } 9762 v.reset(OpCopy) 9763 v.Type = x.Type 9764 v.AddArg(x) 9765 return true 9766 } 9767 return false 9768 } 9769 func rewriteValuegeneric_OpEqInter_0(v *Value) bool { 9770 b := v.Block 9771 _ = b 9772 typ := &b.Func.Config.Types 9773 _ = typ 9774 // match: (EqInter x y) 9775 // cond: 9776 // result: (EqPtr (ITab x) (ITab y)) 9777 for { 9778 _ = v.Args[1] 9779 x := v.Args[0] 9780 y := v.Args[1] 9781 v.reset(OpEqPtr) 9782 v0 := b.NewValue0(v.Pos, OpITab, typ.BytePtr) 9783 v0.AddArg(x) 9784 v.AddArg(v0) 9785 v1 := b.NewValue0(v.Pos, OpITab, typ.BytePtr) 9786 v1.AddArg(y) 9787 v.AddArg(v1) 9788 return true 9789 } 9790 } 9791 func rewriteValuegeneric_OpEqPtr_0(v *Value) bool { 9792 b := v.Block 9793 _ = b 9794 typ := &b.Func.Config.Types 9795 _ = typ 9796 // match: (EqPtr p (ConstNil)) 9797 // cond: 9798 // result: (Not (IsNonNil p)) 9799 for { 9800 _ = v.Args[1] 9801 p := v.Args[0] 9802 v_1 := v.Args[1] 9803 if v_1.Op != OpConstNil { 9804 break 9805 } 9806 v.reset(OpNot) 9807 v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool) 9808 v0.AddArg(p) 9809 v.AddArg(v0) 9810 return true 9811 } 9812 // match: (EqPtr (ConstNil) p) 9813 // cond: 9814 // result: (Not (IsNonNil p)) 9815 for { 9816 _ = v.Args[1] 9817 v_0 := v.Args[0] 9818 if v_0.Op != OpConstNil { 9819 break 9820 } 9821 p := v.Args[1] 9822 v.reset(OpNot) 9823 v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool) 9824 v0.AddArg(p) 9825 v.AddArg(v0) 9826 return true 9827 } 9828 // match: (EqPtr x x) 9829 // cond: 9830 // result: (ConstBool [1]) 9831 for { 9832 _ = v.Args[1] 9833 x := v.Args[0] 9834 if x != v.Args[1] { 9835 break 9836 } 9837 v.reset(OpConstBool) 9838 v.AuxInt = 1 9839 return true 9840 } 9841 // match: (EqPtr (Addr {a} x) (Addr {b} x)) 9842 // cond: 9843 // result: (ConstBool [b2i(a == b)]) 9844 for { 9845 _ = v.Args[1] 9846 v_0 := v.Args[0] 9847 if v_0.Op != OpAddr { 9848 break 9849 } 9850 a := v_0.Aux 9851 x := v_0.Args[0] 9852 v_1 := v.Args[1] 9853 if v_1.Op != OpAddr { 9854 break 9855 } 9856 b := v_1.Aux 9857 if x != v_1.Args[0] { 9858 break 9859 } 9860 v.reset(OpConstBool) 9861 v.AuxInt = b2i(a == b) 9862 return true 9863 } 9864 // match: (EqPtr (Addr {b} x) (Addr {a} x)) 9865 // cond: 9866 // result: (ConstBool [b2i(a == b)]) 9867 for { 9868 _ = v.Args[1] 9869 v_0 := v.Args[0] 9870 if v_0.Op != OpAddr { 9871 break 9872 } 9873 b := v_0.Aux 9874 x := v_0.Args[0] 9875 v_1 := v.Args[1] 9876 if v_1.Op != OpAddr { 9877 break 9878 } 9879 a := v_1.Aux 9880 if x != v_1.Args[0] { 9881 break 9882 } 9883 v.reset(OpConstBool) 9884 v.AuxInt = b2i(a == b) 9885 return true 9886 } 9887 return false 9888 } 9889 func rewriteValuegeneric_OpEqSlice_0(v *Value) bool { 9890 b := v.Block 9891 _ = b 9892 typ := &b.Func.Config.Types 9893 _ = typ 9894 // match: (EqSlice x y) 9895 // cond: 9896 // result: (EqPtr (SlicePtr x) (SlicePtr y)) 9897 for { 9898 _ = v.Args[1] 9899 x := v.Args[0] 9900 y := v.Args[1] 9901 v.reset(OpEqPtr) 9902 v0 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr) 9903 v0.AddArg(x) 9904 v.AddArg(v0) 9905 v1 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr) 9906 v1.AddArg(y) 9907 v.AddArg(v1) 9908 return true 9909 } 9910 } 9911 func rewriteValuegeneric_OpGeq16_0(v *Value) bool { 9912 // match: (Geq16 (Const16 [c]) (Const16 [d])) 9913 // cond: 9914 // result: (ConstBool [b2i(c >= d)]) 9915 for { 9916 _ = v.Args[1] 9917 v_0 := v.Args[0] 9918 if v_0.Op != OpConst16 { 9919 break 9920 } 9921 c := v_0.AuxInt 9922 v_1 := v.Args[1] 9923 if v_1.Op != OpConst16 { 9924 break 9925 } 9926 d := v_1.AuxInt 9927 v.reset(OpConstBool) 9928 v.AuxInt = b2i(c >= d) 9929 return true 9930 } 9931 return false 9932 } 9933 func rewriteValuegeneric_OpGeq16U_0(v *Value) bool { 9934 // match: (Geq16U (Const16 [c]) (Const16 [d])) 9935 // cond: 9936 // result: (ConstBool [b2i(uint16(c) >= uint16(d))]) 9937 for { 9938 _ = v.Args[1] 9939 v_0 := v.Args[0] 9940 if v_0.Op != OpConst16 { 9941 break 9942 } 9943 c := v_0.AuxInt 9944 v_1 := v.Args[1] 9945 if v_1.Op != OpConst16 { 9946 break 9947 } 9948 d := v_1.AuxInt 9949 v.reset(OpConstBool) 9950 v.AuxInt = b2i(uint16(c) >= uint16(d)) 9951 return true 9952 } 9953 return false 9954 } 9955 func rewriteValuegeneric_OpGeq32_0(v *Value) bool { 9956 // match: (Geq32 (Const32 [c]) (Const32 [d])) 9957 // cond: 9958 // result: (ConstBool [b2i(c >= d)]) 9959 for { 9960 _ = v.Args[1] 9961 v_0 := v.Args[0] 9962 if v_0.Op != OpConst32 { 9963 break 9964 } 9965 c := v_0.AuxInt 9966 v_1 := v.Args[1] 9967 if v_1.Op != OpConst32 { 9968 break 9969 } 9970 d := v_1.AuxInt 9971 v.reset(OpConstBool) 9972 v.AuxInt = b2i(c >= d) 9973 return true 9974 } 9975 return false 9976 } 9977 func rewriteValuegeneric_OpGeq32F_0(v *Value) bool { 9978 // match: (Geq32F (Const32F [c]) (Const32F [d])) 9979 // cond: 9980 // result: (ConstBool [b2i(i2f(c) >= i2f(d))]) 9981 for { 9982 _ = v.Args[1] 9983 v_0 := v.Args[0] 9984 if v_0.Op != OpConst32F { 9985 break 9986 } 9987 c := v_0.AuxInt 9988 v_1 := v.Args[1] 9989 if v_1.Op != OpConst32F { 9990 break 9991 } 9992 d := v_1.AuxInt 9993 v.reset(OpConstBool) 9994 v.AuxInt = b2i(i2f(c) >= i2f(d)) 9995 return true 9996 } 9997 return false 9998 } 9999 func rewriteValuegeneric_OpGeq32U_0(v *Value) bool { 10000 // match: (Geq32U (Const32 [c]) (Const32 [d])) 10001 // cond: 10002 // result: (ConstBool [b2i(uint32(c) >= uint32(d))]) 10003 for { 10004 _ = v.Args[1] 10005 v_0 := v.Args[0] 10006 if v_0.Op != OpConst32 { 10007 break 10008 } 10009 c := v_0.AuxInt 10010 v_1 := v.Args[1] 10011 if v_1.Op != OpConst32 { 10012 break 10013 } 10014 d := v_1.AuxInt 10015 v.reset(OpConstBool) 10016 v.AuxInt = b2i(uint32(c) >= uint32(d)) 10017 return true 10018 } 10019 return false 10020 } 10021 func rewriteValuegeneric_OpGeq64_0(v *Value) bool { 10022 // match: (Geq64 (Const64 [c]) (Const64 [d])) 10023 // cond: 10024 // result: (ConstBool [b2i(c >= d)]) 10025 for { 10026 _ = v.Args[1] 10027 v_0 := v.Args[0] 10028 if v_0.Op != OpConst64 { 10029 break 10030 } 10031 c := v_0.AuxInt 10032 v_1 := v.Args[1] 10033 if v_1.Op != OpConst64 { 10034 break 10035 } 10036 d := v_1.AuxInt 10037 v.reset(OpConstBool) 10038 v.AuxInt = b2i(c >= d) 10039 return true 10040 } 10041 return false 10042 } 10043 func rewriteValuegeneric_OpGeq64F_0(v *Value) bool { 10044 // match: (Geq64F (Const64F [c]) (Const64F [d])) 10045 // cond: 10046 // result: (ConstBool [b2i(i2f(c) >= i2f(d))]) 10047 for { 10048 _ = v.Args[1] 10049 v_0 := v.Args[0] 10050 if v_0.Op != OpConst64F { 10051 break 10052 } 10053 c := v_0.AuxInt 10054 v_1 := v.Args[1] 10055 if v_1.Op != OpConst64F { 10056 break 10057 } 10058 d := v_1.AuxInt 10059 v.reset(OpConstBool) 10060 v.AuxInt = b2i(i2f(c) >= i2f(d)) 10061 return true 10062 } 10063 return false 10064 } 10065 func rewriteValuegeneric_OpGeq64U_0(v *Value) bool { 10066 // match: (Geq64U (Const64 [c]) (Const64 [d])) 10067 // cond: 10068 // result: (ConstBool [b2i(uint64(c) >= uint64(d))]) 10069 for { 10070 _ = v.Args[1] 10071 v_0 := v.Args[0] 10072 if v_0.Op != OpConst64 { 10073 break 10074 } 10075 c := v_0.AuxInt 10076 v_1 := v.Args[1] 10077 if v_1.Op != OpConst64 { 10078 break 10079 } 10080 d := v_1.AuxInt 10081 v.reset(OpConstBool) 10082 v.AuxInt = b2i(uint64(c) >= uint64(d)) 10083 return true 10084 } 10085 return false 10086 } 10087 func rewriteValuegeneric_OpGeq8_0(v *Value) bool { 10088 // match: (Geq8 (Const8 [c]) (Const8 [d])) 10089 // cond: 10090 // result: (ConstBool [b2i(c >= d)]) 10091 for { 10092 _ = v.Args[1] 10093 v_0 := v.Args[0] 10094 if v_0.Op != OpConst8 { 10095 break 10096 } 10097 c := v_0.AuxInt 10098 v_1 := v.Args[1] 10099 if v_1.Op != OpConst8 { 10100 break 10101 } 10102 d := v_1.AuxInt 10103 v.reset(OpConstBool) 10104 v.AuxInt = b2i(c >= d) 10105 return true 10106 } 10107 return false 10108 } 10109 func rewriteValuegeneric_OpGeq8U_0(v *Value) bool { 10110 // match: (Geq8U (Const8 [c]) (Const8 [d])) 10111 // cond: 10112 // result: (ConstBool [b2i(uint8(c) >= uint8(d))]) 10113 for { 10114 _ = v.Args[1] 10115 v_0 := v.Args[0] 10116 if v_0.Op != OpConst8 { 10117 break 10118 } 10119 c := v_0.AuxInt 10120 v_1 := v.Args[1] 10121 if v_1.Op != OpConst8 { 10122 break 10123 } 10124 d := v_1.AuxInt 10125 v.reset(OpConstBool) 10126 v.AuxInt = b2i(uint8(c) >= uint8(d)) 10127 return true 10128 } 10129 return false 10130 } 10131 func rewriteValuegeneric_OpGreater16_0(v *Value) bool { 10132 // match: (Greater16 (Const16 [c]) (Const16 [d])) 10133 // cond: 10134 // result: (ConstBool [b2i(c > d)]) 10135 for { 10136 _ = v.Args[1] 10137 v_0 := v.Args[0] 10138 if v_0.Op != OpConst16 { 10139 break 10140 } 10141 c := v_0.AuxInt 10142 v_1 := v.Args[1] 10143 if v_1.Op != OpConst16 { 10144 break 10145 } 10146 d := v_1.AuxInt 10147 v.reset(OpConstBool) 10148 v.AuxInt = b2i(c > d) 10149 return true 10150 } 10151 return false 10152 } 10153 func rewriteValuegeneric_OpGreater16U_0(v *Value) bool { 10154 // match: (Greater16U (Const16 [c]) (Const16 [d])) 10155 // cond: 10156 // result: (ConstBool [b2i(uint16(c) > uint16(d))]) 10157 for { 10158 _ = v.Args[1] 10159 v_0 := v.Args[0] 10160 if v_0.Op != OpConst16 { 10161 break 10162 } 10163 c := v_0.AuxInt 10164 v_1 := v.Args[1] 10165 if v_1.Op != OpConst16 { 10166 break 10167 } 10168 d := v_1.AuxInt 10169 v.reset(OpConstBool) 10170 v.AuxInt = b2i(uint16(c) > uint16(d)) 10171 return true 10172 } 10173 return false 10174 } 10175 func rewriteValuegeneric_OpGreater32_0(v *Value) bool { 10176 // match: (Greater32 (Const32 [c]) (Const32 [d])) 10177 // cond: 10178 // result: (ConstBool [b2i(c > d)]) 10179 for { 10180 _ = v.Args[1] 10181 v_0 := v.Args[0] 10182 if v_0.Op != OpConst32 { 10183 break 10184 } 10185 c := v_0.AuxInt 10186 v_1 := v.Args[1] 10187 if v_1.Op != OpConst32 { 10188 break 10189 } 10190 d := v_1.AuxInt 10191 v.reset(OpConstBool) 10192 v.AuxInt = b2i(c > d) 10193 return true 10194 } 10195 return false 10196 } 10197 func rewriteValuegeneric_OpGreater32F_0(v *Value) bool { 10198 // match: (Greater32F (Const32F [c]) (Const32F [d])) 10199 // cond: 10200 // result: (ConstBool [b2i(i2f(c) > i2f(d))]) 10201 for { 10202 _ = v.Args[1] 10203 v_0 := v.Args[0] 10204 if v_0.Op != OpConst32F { 10205 break 10206 } 10207 c := v_0.AuxInt 10208 v_1 := v.Args[1] 10209 if v_1.Op != OpConst32F { 10210 break 10211 } 10212 d := v_1.AuxInt 10213 v.reset(OpConstBool) 10214 v.AuxInt = b2i(i2f(c) > i2f(d)) 10215 return true 10216 } 10217 return false 10218 } 10219 func rewriteValuegeneric_OpGreater32U_0(v *Value) bool { 10220 // match: (Greater32U (Const32 [c]) (Const32 [d])) 10221 // cond: 10222 // result: (ConstBool [b2i(uint32(c) > uint32(d))]) 10223 for { 10224 _ = v.Args[1] 10225 v_0 := v.Args[0] 10226 if v_0.Op != OpConst32 { 10227 break 10228 } 10229 c := v_0.AuxInt 10230 v_1 := v.Args[1] 10231 if v_1.Op != OpConst32 { 10232 break 10233 } 10234 d := v_1.AuxInt 10235 v.reset(OpConstBool) 10236 v.AuxInt = b2i(uint32(c) > uint32(d)) 10237 return true 10238 } 10239 return false 10240 } 10241 func rewriteValuegeneric_OpGreater64_0(v *Value) bool { 10242 // match: (Greater64 (Const64 [c]) (Const64 [d])) 10243 // cond: 10244 // result: (ConstBool [b2i(c > d)]) 10245 for { 10246 _ = v.Args[1] 10247 v_0 := v.Args[0] 10248 if v_0.Op != OpConst64 { 10249 break 10250 } 10251 c := v_0.AuxInt 10252 v_1 := v.Args[1] 10253 if v_1.Op != OpConst64 { 10254 break 10255 } 10256 d := v_1.AuxInt 10257 v.reset(OpConstBool) 10258 v.AuxInt = b2i(c > d) 10259 return true 10260 } 10261 return false 10262 } 10263 func rewriteValuegeneric_OpGreater64F_0(v *Value) bool { 10264 // match: (Greater64F (Const64F [c]) (Const64F [d])) 10265 // cond: 10266 // result: (ConstBool [b2i(i2f(c) > i2f(d))]) 10267 for { 10268 _ = v.Args[1] 10269 v_0 := v.Args[0] 10270 if v_0.Op != OpConst64F { 10271 break 10272 } 10273 c := v_0.AuxInt 10274 v_1 := v.Args[1] 10275 if v_1.Op != OpConst64F { 10276 break 10277 } 10278 d := v_1.AuxInt 10279 v.reset(OpConstBool) 10280 v.AuxInt = b2i(i2f(c) > i2f(d)) 10281 return true 10282 } 10283 return false 10284 } 10285 func rewriteValuegeneric_OpGreater64U_0(v *Value) bool { 10286 // match: (Greater64U (Const64 [c]) (Const64 [d])) 10287 // cond: 10288 // result: (ConstBool [b2i(uint64(c) > uint64(d))]) 10289 for { 10290 _ = v.Args[1] 10291 v_0 := v.Args[0] 10292 if v_0.Op != OpConst64 { 10293 break 10294 } 10295 c := v_0.AuxInt 10296 v_1 := v.Args[1] 10297 if v_1.Op != OpConst64 { 10298 break 10299 } 10300 d := v_1.AuxInt 10301 v.reset(OpConstBool) 10302 v.AuxInt = b2i(uint64(c) > uint64(d)) 10303 return true 10304 } 10305 return false 10306 } 10307 func rewriteValuegeneric_OpGreater8_0(v *Value) bool { 10308 // match: (Greater8 (Const8 [c]) (Const8 [d])) 10309 // cond: 10310 // result: (ConstBool [b2i(c > d)]) 10311 for { 10312 _ = v.Args[1] 10313 v_0 := v.Args[0] 10314 if v_0.Op != OpConst8 { 10315 break 10316 } 10317 c := v_0.AuxInt 10318 v_1 := v.Args[1] 10319 if v_1.Op != OpConst8 { 10320 break 10321 } 10322 d := v_1.AuxInt 10323 v.reset(OpConstBool) 10324 v.AuxInt = b2i(c > d) 10325 return true 10326 } 10327 return false 10328 } 10329 func rewriteValuegeneric_OpGreater8U_0(v *Value) bool { 10330 // match: (Greater8U (Const8 [c]) (Const8 [d])) 10331 // cond: 10332 // result: (ConstBool [b2i(uint8(c) > uint8(d))]) 10333 for { 10334 _ = v.Args[1] 10335 v_0 := v.Args[0] 10336 if v_0.Op != OpConst8 { 10337 break 10338 } 10339 c := v_0.AuxInt 10340 v_1 := v.Args[1] 10341 if v_1.Op != OpConst8 { 10342 break 10343 } 10344 d := v_1.AuxInt 10345 v.reset(OpConstBool) 10346 v.AuxInt = b2i(uint8(c) > uint8(d)) 10347 return true 10348 } 10349 return false 10350 } 10351 func rewriteValuegeneric_OpIMake_0(v *Value) bool { 10352 // match: (IMake typ (StructMake1 val)) 10353 // cond: 10354 // result: (IMake typ val) 10355 for { 10356 _ = v.Args[1] 10357 typ := v.Args[0] 10358 v_1 := v.Args[1] 10359 if v_1.Op != OpStructMake1 { 10360 break 10361 } 10362 val := v_1.Args[0] 10363 v.reset(OpIMake) 10364 v.AddArg(typ) 10365 v.AddArg(val) 10366 return true 10367 } 10368 // match: (IMake typ (ArrayMake1 val)) 10369 // cond: 10370 // result: (IMake typ val) 10371 for { 10372 _ = v.Args[1] 10373 typ := v.Args[0] 10374 v_1 := v.Args[1] 10375 if v_1.Op != OpArrayMake1 { 10376 break 10377 } 10378 val := v_1.Args[0] 10379 v.reset(OpIMake) 10380 v.AddArg(typ) 10381 v.AddArg(val) 10382 return true 10383 } 10384 return false 10385 } 10386 func rewriteValuegeneric_OpInterCall_0(v *Value) bool { 10387 // match: (InterCall [argsize] (Load (OffPtr [off] (ITab (IMake (Addr {itab} (SB)) _))) _) mem) 10388 // cond: devirt(v, itab, off) != nil 10389 // result: (StaticCall [argsize] {devirt(v, itab, off)} mem) 10390 for { 10391 argsize := v.AuxInt 10392 _ = v.Args[1] 10393 v_0 := v.Args[0] 10394 if v_0.Op != OpLoad { 10395 break 10396 } 10397 _ = v_0.Args[1] 10398 v_0_0 := v_0.Args[0] 10399 if v_0_0.Op != OpOffPtr { 10400 break 10401 } 10402 off := v_0_0.AuxInt 10403 v_0_0_0 := v_0_0.Args[0] 10404 if v_0_0_0.Op != OpITab { 10405 break 10406 } 10407 v_0_0_0_0 := v_0_0_0.Args[0] 10408 if v_0_0_0_0.Op != OpIMake { 10409 break 10410 } 10411 _ = v_0_0_0_0.Args[1] 10412 v_0_0_0_0_0 := v_0_0_0_0.Args[0] 10413 if v_0_0_0_0_0.Op != OpAddr { 10414 break 10415 } 10416 itab := v_0_0_0_0_0.Aux 10417 v_0_0_0_0_0_0 := v_0_0_0_0_0.Args[0] 10418 if v_0_0_0_0_0_0.Op != OpSB { 10419 break 10420 } 10421 mem := v.Args[1] 10422 if !(devirt(v, itab, off) != nil) { 10423 break 10424 } 10425 v.reset(OpStaticCall) 10426 v.AuxInt = argsize 10427 v.Aux = devirt(v, itab, off) 10428 v.AddArg(mem) 10429 return true 10430 } 10431 return false 10432 } 10433 func rewriteValuegeneric_OpIsInBounds_0(v *Value) bool { 10434 // match: (IsInBounds (ZeroExt8to32 _) (Const32 [c])) 10435 // cond: (1 << 8) <= c 10436 // result: (ConstBool [1]) 10437 for { 10438 _ = v.Args[1] 10439 v_0 := v.Args[0] 10440 if v_0.Op != OpZeroExt8to32 { 10441 break 10442 } 10443 v_1 := v.Args[1] 10444 if v_1.Op != OpConst32 { 10445 break 10446 } 10447 c := v_1.AuxInt 10448 if !((1 << 8) <= c) { 10449 break 10450 } 10451 v.reset(OpConstBool) 10452 v.AuxInt = 1 10453 return true 10454 } 10455 // match: (IsInBounds (ZeroExt8to64 _) (Const64 [c])) 10456 // cond: (1 << 8) <= c 10457 // result: (ConstBool [1]) 10458 for { 10459 _ = v.Args[1] 10460 v_0 := v.Args[0] 10461 if v_0.Op != OpZeroExt8to64 { 10462 break 10463 } 10464 v_1 := v.Args[1] 10465 if v_1.Op != OpConst64 { 10466 break 10467 } 10468 c := v_1.AuxInt 10469 if !((1 << 8) <= c) { 10470 break 10471 } 10472 v.reset(OpConstBool) 10473 v.AuxInt = 1 10474 return true 10475 } 10476 // match: (IsInBounds (ZeroExt16to32 _) (Const32 [c])) 10477 // cond: (1 << 16) <= c 10478 // result: (ConstBool [1]) 10479 for { 10480 _ = v.Args[1] 10481 v_0 := v.Args[0] 10482 if v_0.Op != OpZeroExt16to32 { 10483 break 10484 } 10485 v_1 := v.Args[1] 10486 if v_1.Op != OpConst32 { 10487 break 10488 } 10489 c := v_1.AuxInt 10490 if !((1 << 16) <= c) { 10491 break 10492 } 10493 v.reset(OpConstBool) 10494 v.AuxInt = 1 10495 return true 10496 } 10497 // match: (IsInBounds (ZeroExt16to64 _) (Const64 [c])) 10498 // cond: (1 << 16) <= c 10499 // result: (ConstBool [1]) 10500 for { 10501 _ = v.Args[1] 10502 v_0 := v.Args[0] 10503 if v_0.Op != OpZeroExt16to64 { 10504 break 10505 } 10506 v_1 := v.Args[1] 10507 if v_1.Op != OpConst64 { 10508 break 10509 } 10510 c := v_1.AuxInt 10511 if !((1 << 16) <= c) { 10512 break 10513 } 10514 v.reset(OpConstBool) 10515 v.AuxInt = 1 10516 return true 10517 } 10518 // match: (IsInBounds x x) 10519 // cond: 10520 // result: (ConstBool [0]) 10521 for { 10522 _ = v.Args[1] 10523 x := v.Args[0] 10524 if x != v.Args[1] { 10525 break 10526 } 10527 v.reset(OpConstBool) 10528 v.AuxInt = 0 10529 return true 10530 } 10531 // match: (IsInBounds (And8 (Const8 [c]) _) (Const8 [d])) 10532 // cond: 0 <= c && c < d 10533 // result: (ConstBool [1]) 10534 for { 10535 _ = v.Args[1] 10536 v_0 := v.Args[0] 10537 if v_0.Op != OpAnd8 { 10538 break 10539 } 10540 _ = v_0.Args[1] 10541 v_0_0 := v_0.Args[0] 10542 if v_0_0.Op != OpConst8 { 10543 break 10544 } 10545 c := v_0_0.AuxInt 10546 v_1 := v.Args[1] 10547 if v_1.Op != OpConst8 { 10548 break 10549 } 10550 d := v_1.AuxInt 10551 if !(0 <= c && c < d) { 10552 break 10553 } 10554 v.reset(OpConstBool) 10555 v.AuxInt = 1 10556 return true 10557 } 10558 // match: (IsInBounds (And8 _ (Const8 [c])) (Const8 [d])) 10559 // cond: 0 <= c && c < d 10560 // result: (ConstBool [1]) 10561 for { 10562 _ = v.Args[1] 10563 v_0 := v.Args[0] 10564 if v_0.Op != OpAnd8 { 10565 break 10566 } 10567 _ = v_0.Args[1] 10568 v_0_1 := v_0.Args[1] 10569 if v_0_1.Op != OpConst8 { 10570 break 10571 } 10572 c := v_0_1.AuxInt 10573 v_1 := v.Args[1] 10574 if v_1.Op != OpConst8 { 10575 break 10576 } 10577 d := v_1.AuxInt 10578 if !(0 <= c && c < d) { 10579 break 10580 } 10581 v.reset(OpConstBool) 10582 v.AuxInt = 1 10583 return true 10584 } 10585 // match: (IsInBounds (ZeroExt8to16 (And8 (Const8 [c]) _)) (Const16 [d])) 10586 // cond: 0 <= c && c < d 10587 // result: (ConstBool [1]) 10588 for { 10589 _ = v.Args[1] 10590 v_0 := v.Args[0] 10591 if v_0.Op != OpZeroExt8to16 { 10592 break 10593 } 10594 v_0_0 := v_0.Args[0] 10595 if v_0_0.Op != OpAnd8 { 10596 break 10597 } 10598 _ = v_0_0.Args[1] 10599 v_0_0_0 := v_0_0.Args[0] 10600 if v_0_0_0.Op != OpConst8 { 10601 break 10602 } 10603 c := v_0_0_0.AuxInt 10604 v_1 := v.Args[1] 10605 if v_1.Op != OpConst16 { 10606 break 10607 } 10608 d := v_1.AuxInt 10609 if !(0 <= c && c < d) { 10610 break 10611 } 10612 v.reset(OpConstBool) 10613 v.AuxInt = 1 10614 return true 10615 } 10616 // match: (IsInBounds (ZeroExt8to16 (And8 _ (Const8 [c]))) (Const16 [d])) 10617 // cond: 0 <= c && c < d 10618 // result: (ConstBool [1]) 10619 for { 10620 _ = v.Args[1] 10621 v_0 := v.Args[0] 10622 if v_0.Op != OpZeroExt8to16 { 10623 break 10624 } 10625 v_0_0 := v_0.Args[0] 10626 if v_0_0.Op != OpAnd8 { 10627 break 10628 } 10629 _ = v_0_0.Args[1] 10630 v_0_0_1 := v_0_0.Args[1] 10631 if v_0_0_1.Op != OpConst8 { 10632 break 10633 } 10634 c := v_0_0_1.AuxInt 10635 v_1 := v.Args[1] 10636 if v_1.Op != OpConst16 { 10637 break 10638 } 10639 d := v_1.AuxInt 10640 if !(0 <= c && c < d) { 10641 break 10642 } 10643 v.reset(OpConstBool) 10644 v.AuxInt = 1 10645 return true 10646 } 10647 // match: (IsInBounds (ZeroExt8to32 (And8 (Const8 [c]) _)) (Const32 [d])) 10648 // cond: 0 <= c && c < d 10649 // result: (ConstBool [1]) 10650 for { 10651 _ = v.Args[1] 10652 v_0 := v.Args[0] 10653 if v_0.Op != OpZeroExt8to32 { 10654 break 10655 } 10656 v_0_0 := v_0.Args[0] 10657 if v_0_0.Op != OpAnd8 { 10658 break 10659 } 10660 _ = v_0_0.Args[1] 10661 v_0_0_0 := v_0_0.Args[0] 10662 if v_0_0_0.Op != OpConst8 { 10663 break 10664 } 10665 c := v_0_0_0.AuxInt 10666 v_1 := v.Args[1] 10667 if v_1.Op != OpConst32 { 10668 break 10669 } 10670 d := v_1.AuxInt 10671 if !(0 <= c && c < d) { 10672 break 10673 } 10674 v.reset(OpConstBool) 10675 v.AuxInt = 1 10676 return true 10677 } 10678 return false 10679 } 10680 func rewriteValuegeneric_OpIsInBounds_10(v *Value) bool { 10681 // match: (IsInBounds (ZeroExt8to32 (And8 _ (Const8 [c]))) (Const32 [d])) 10682 // cond: 0 <= c && c < d 10683 // result: (ConstBool [1]) 10684 for { 10685 _ = v.Args[1] 10686 v_0 := v.Args[0] 10687 if v_0.Op != OpZeroExt8to32 { 10688 break 10689 } 10690 v_0_0 := v_0.Args[0] 10691 if v_0_0.Op != OpAnd8 { 10692 break 10693 } 10694 _ = v_0_0.Args[1] 10695 v_0_0_1 := v_0_0.Args[1] 10696 if v_0_0_1.Op != OpConst8 { 10697 break 10698 } 10699 c := v_0_0_1.AuxInt 10700 v_1 := v.Args[1] 10701 if v_1.Op != OpConst32 { 10702 break 10703 } 10704 d := v_1.AuxInt 10705 if !(0 <= c && c < d) { 10706 break 10707 } 10708 v.reset(OpConstBool) 10709 v.AuxInt = 1 10710 return true 10711 } 10712 // match: (IsInBounds (ZeroExt8to64 (And8 (Const8 [c]) _)) (Const64 [d])) 10713 // cond: 0 <= c && c < d 10714 // result: (ConstBool [1]) 10715 for { 10716 _ = v.Args[1] 10717 v_0 := v.Args[0] 10718 if v_0.Op != OpZeroExt8to64 { 10719 break 10720 } 10721 v_0_0 := v_0.Args[0] 10722 if v_0_0.Op != OpAnd8 { 10723 break 10724 } 10725 _ = v_0_0.Args[1] 10726 v_0_0_0 := v_0_0.Args[0] 10727 if v_0_0_0.Op != OpConst8 { 10728 break 10729 } 10730 c := v_0_0_0.AuxInt 10731 v_1 := v.Args[1] 10732 if v_1.Op != OpConst64 { 10733 break 10734 } 10735 d := v_1.AuxInt 10736 if !(0 <= c && c < d) { 10737 break 10738 } 10739 v.reset(OpConstBool) 10740 v.AuxInt = 1 10741 return true 10742 } 10743 // match: (IsInBounds (ZeroExt8to64 (And8 _ (Const8 [c]))) (Const64 [d])) 10744 // cond: 0 <= c && c < d 10745 // result: (ConstBool [1]) 10746 for { 10747 _ = v.Args[1] 10748 v_0 := v.Args[0] 10749 if v_0.Op != OpZeroExt8to64 { 10750 break 10751 } 10752 v_0_0 := v_0.Args[0] 10753 if v_0_0.Op != OpAnd8 { 10754 break 10755 } 10756 _ = v_0_0.Args[1] 10757 v_0_0_1 := v_0_0.Args[1] 10758 if v_0_0_1.Op != OpConst8 { 10759 break 10760 } 10761 c := v_0_0_1.AuxInt 10762 v_1 := v.Args[1] 10763 if v_1.Op != OpConst64 { 10764 break 10765 } 10766 d := v_1.AuxInt 10767 if !(0 <= c && c < d) { 10768 break 10769 } 10770 v.reset(OpConstBool) 10771 v.AuxInt = 1 10772 return true 10773 } 10774 // match: (IsInBounds (And16 (Const16 [c]) _) (Const16 [d])) 10775 // cond: 0 <= c && c < d 10776 // result: (ConstBool [1]) 10777 for { 10778 _ = v.Args[1] 10779 v_0 := v.Args[0] 10780 if v_0.Op != OpAnd16 { 10781 break 10782 } 10783 _ = v_0.Args[1] 10784 v_0_0 := v_0.Args[0] 10785 if v_0_0.Op != OpConst16 { 10786 break 10787 } 10788 c := v_0_0.AuxInt 10789 v_1 := v.Args[1] 10790 if v_1.Op != OpConst16 { 10791 break 10792 } 10793 d := v_1.AuxInt 10794 if !(0 <= c && c < d) { 10795 break 10796 } 10797 v.reset(OpConstBool) 10798 v.AuxInt = 1 10799 return true 10800 } 10801 // match: (IsInBounds (And16 _ (Const16 [c])) (Const16 [d])) 10802 // cond: 0 <= c && c < d 10803 // result: (ConstBool [1]) 10804 for { 10805 _ = v.Args[1] 10806 v_0 := v.Args[0] 10807 if v_0.Op != OpAnd16 { 10808 break 10809 } 10810 _ = v_0.Args[1] 10811 v_0_1 := v_0.Args[1] 10812 if v_0_1.Op != OpConst16 { 10813 break 10814 } 10815 c := v_0_1.AuxInt 10816 v_1 := v.Args[1] 10817 if v_1.Op != OpConst16 { 10818 break 10819 } 10820 d := v_1.AuxInt 10821 if !(0 <= c && c < d) { 10822 break 10823 } 10824 v.reset(OpConstBool) 10825 v.AuxInt = 1 10826 return true 10827 } 10828 // match: (IsInBounds (ZeroExt16to32 (And16 (Const16 [c]) _)) (Const32 [d])) 10829 // cond: 0 <= c && c < d 10830 // result: (ConstBool [1]) 10831 for { 10832 _ = v.Args[1] 10833 v_0 := v.Args[0] 10834 if v_0.Op != OpZeroExt16to32 { 10835 break 10836 } 10837 v_0_0 := v_0.Args[0] 10838 if v_0_0.Op != OpAnd16 { 10839 break 10840 } 10841 _ = v_0_0.Args[1] 10842 v_0_0_0 := v_0_0.Args[0] 10843 if v_0_0_0.Op != OpConst16 { 10844 break 10845 } 10846 c := v_0_0_0.AuxInt 10847 v_1 := v.Args[1] 10848 if v_1.Op != OpConst32 { 10849 break 10850 } 10851 d := v_1.AuxInt 10852 if !(0 <= c && c < d) { 10853 break 10854 } 10855 v.reset(OpConstBool) 10856 v.AuxInt = 1 10857 return true 10858 } 10859 // match: (IsInBounds (ZeroExt16to32 (And16 _ (Const16 [c]))) (Const32 [d])) 10860 // cond: 0 <= c && c < d 10861 // result: (ConstBool [1]) 10862 for { 10863 _ = v.Args[1] 10864 v_0 := v.Args[0] 10865 if v_0.Op != OpZeroExt16to32 { 10866 break 10867 } 10868 v_0_0 := v_0.Args[0] 10869 if v_0_0.Op != OpAnd16 { 10870 break 10871 } 10872 _ = v_0_0.Args[1] 10873 v_0_0_1 := v_0_0.Args[1] 10874 if v_0_0_1.Op != OpConst16 { 10875 break 10876 } 10877 c := v_0_0_1.AuxInt 10878 v_1 := v.Args[1] 10879 if v_1.Op != OpConst32 { 10880 break 10881 } 10882 d := v_1.AuxInt 10883 if !(0 <= c && c < d) { 10884 break 10885 } 10886 v.reset(OpConstBool) 10887 v.AuxInt = 1 10888 return true 10889 } 10890 // match: (IsInBounds (ZeroExt16to64 (And16 (Const16 [c]) _)) (Const64 [d])) 10891 // cond: 0 <= c && c < d 10892 // result: (ConstBool [1]) 10893 for { 10894 _ = v.Args[1] 10895 v_0 := v.Args[0] 10896 if v_0.Op != OpZeroExt16to64 { 10897 break 10898 } 10899 v_0_0 := v_0.Args[0] 10900 if v_0_0.Op != OpAnd16 { 10901 break 10902 } 10903 _ = v_0_0.Args[1] 10904 v_0_0_0 := v_0_0.Args[0] 10905 if v_0_0_0.Op != OpConst16 { 10906 break 10907 } 10908 c := v_0_0_0.AuxInt 10909 v_1 := v.Args[1] 10910 if v_1.Op != OpConst64 { 10911 break 10912 } 10913 d := v_1.AuxInt 10914 if !(0 <= c && c < d) { 10915 break 10916 } 10917 v.reset(OpConstBool) 10918 v.AuxInt = 1 10919 return true 10920 } 10921 // match: (IsInBounds (ZeroExt16to64 (And16 _ (Const16 [c]))) (Const64 [d])) 10922 // cond: 0 <= c && c < d 10923 // result: (ConstBool [1]) 10924 for { 10925 _ = v.Args[1] 10926 v_0 := v.Args[0] 10927 if v_0.Op != OpZeroExt16to64 { 10928 break 10929 } 10930 v_0_0 := v_0.Args[0] 10931 if v_0_0.Op != OpAnd16 { 10932 break 10933 } 10934 _ = v_0_0.Args[1] 10935 v_0_0_1 := v_0_0.Args[1] 10936 if v_0_0_1.Op != OpConst16 { 10937 break 10938 } 10939 c := v_0_0_1.AuxInt 10940 v_1 := v.Args[1] 10941 if v_1.Op != OpConst64 { 10942 break 10943 } 10944 d := v_1.AuxInt 10945 if !(0 <= c && c < d) { 10946 break 10947 } 10948 v.reset(OpConstBool) 10949 v.AuxInt = 1 10950 return true 10951 } 10952 // match: (IsInBounds (And32 (Const32 [c]) _) (Const32 [d])) 10953 // cond: 0 <= c && c < d 10954 // result: (ConstBool [1]) 10955 for { 10956 _ = v.Args[1] 10957 v_0 := v.Args[0] 10958 if v_0.Op != OpAnd32 { 10959 break 10960 } 10961 _ = v_0.Args[1] 10962 v_0_0 := v_0.Args[0] 10963 if v_0_0.Op != OpConst32 { 10964 break 10965 } 10966 c := v_0_0.AuxInt 10967 v_1 := v.Args[1] 10968 if v_1.Op != OpConst32 { 10969 break 10970 } 10971 d := v_1.AuxInt 10972 if !(0 <= c && c < d) { 10973 break 10974 } 10975 v.reset(OpConstBool) 10976 v.AuxInt = 1 10977 return true 10978 } 10979 return false 10980 } 10981 func rewriteValuegeneric_OpIsInBounds_20(v *Value) bool { 10982 // match: (IsInBounds (And32 _ (Const32 [c])) (Const32 [d])) 10983 // cond: 0 <= c && c < d 10984 // result: (ConstBool [1]) 10985 for { 10986 _ = v.Args[1] 10987 v_0 := v.Args[0] 10988 if v_0.Op != OpAnd32 { 10989 break 10990 } 10991 _ = v_0.Args[1] 10992 v_0_1 := v_0.Args[1] 10993 if v_0_1.Op != OpConst32 { 10994 break 10995 } 10996 c := v_0_1.AuxInt 10997 v_1 := v.Args[1] 10998 if v_1.Op != OpConst32 { 10999 break 11000 } 11001 d := v_1.AuxInt 11002 if !(0 <= c && c < d) { 11003 break 11004 } 11005 v.reset(OpConstBool) 11006 v.AuxInt = 1 11007 return true 11008 } 11009 // match: (IsInBounds (ZeroExt32to64 (And32 (Const32 [c]) _)) (Const64 [d])) 11010 // cond: 0 <= c && c < d 11011 // result: (ConstBool [1]) 11012 for { 11013 _ = v.Args[1] 11014 v_0 := v.Args[0] 11015 if v_0.Op != OpZeroExt32to64 { 11016 break 11017 } 11018 v_0_0 := v_0.Args[0] 11019 if v_0_0.Op != OpAnd32 { 11020 break 11021 } 11022 _ = v_0_0.Args[1] 11023 v_0_0_0 := v_0_0.Args[0] 11024 if v_0_0_0.Op != OpConst32 { 11025 break 11026 } 11027 c := v_0_0_0.AuxInt 11028 v_1 := v.Args[1] 11029 if v_1.Op != OpConst64 { 11030 break 11031 } 11032 d := v_1.AuxInt 11033 if !(0 <= c && c < d) { 11034 break 11035 } 11036 v.reset(OpConstBool) 11037 v.AuxInt = 1 11038 return true 11039 } 11040 // match: (IsInBounds (ZeroExt32to64 (And32 _ (Const32 [c]))) (Const64 [d])) 11041 // cond: 0 <= c && c < d 11042 // result: (ConstBool [1]) 11043 for { 11044 _ = v.Args[1] 11045 v_0 := v.Args[0] 11046 if v_0.Op != OpZeroExt32to64 { 11047 break 11048 } 11049 v_0_0 := v_0.Args[0] 11050 if v_0_0.Op != OpAnd32 { 11051 break 11052 } 11053 _ = v_0_0.Args[1] 11054 v_0_0_1 := v_0_0.Args[1] 11055 if v_0_0_1.Op != OpConst32 { 11056 break 11057 } 11058 c := v_0_0_1.AuxInt 11059 v_1 := v.Args[1] 11060 if v_1.Op != OpConst64 { 11061 break 11062 } 11063 d := v_1.AuxInt 11064 if !(0 <= c && c < d) { 11065 break 11066 } 11067 v.reset(OpConstBool) 11068 v.AuxInt = 1 11069 return true 11070 } 11071 // match: (IsInBounds (And64 (Const64 [c]) _) (Const64 [d])) 11072 // cond: 0 <= c && c < d 11073 // result: (ConstBool [1]) 11074 for { 11075 _ = v.Args[1] 11076 v_0 := v.Args[0] 11077 if v_0.Op != OpAnd64 { 11078 break 11079 } 11080 _ = v_0.Args[1] 11081 v_0_0 := v_0.Args[0] 11082 if v_0_0.Op != OpConst64 { 11083 break 11084 } 11085 c := v_0_0.AuxInt 11086 v_1 := v.Args[1] 11087 if v_1.Op != OpConst64 { 11088 break 11089 } 11090 d := v_1.AuxInt 11091 if !(0 <= c && c < d) { 11092 break 11093 } 11094 v.reset(OpConstBool) 11095 v.AuxInt = 1 11096 return true 11097 } 11098 // match: (IsInBounds (And64 _ (Const64 [c])) (Const64 [d])) 11099 // cond: 0 <= c && c < d 11100 // result: (ConstBool [1]) 11101 for { 11102 _ = v.Args[1] 11103 v_0 := v.Args[0] 11104 if v_0.Op != OpAnd64 { 11105 break 11106 } 11107 _ = v_0.Args[1] 11108 v_0_1 := v_0.Args[1] 11109 if v_0_1.Op != OpConst64 { 11110 break 11111 } 11112 c := v_0_1.AuxInt 11113 v_1 := v.Args[1] 11114 if v_1.Op != OpConst64 { 11115 break 11116 } 11117 d := v_1.AuxInt 11118 if !(0 <= c && c < d) { 11119 break 11120 } 11121 v.reset(OpConstBool) 11122 v.AuxInt = 1 11123 return true 11124 } 11125 // match: (IsInBounds (Const32 [c]) (Const32 [d])) 11126 // cond: 11127 // result: (ConstBool [b2i(0 <= c && c < d)]) 11128 for { 11129 _ = v.Args[1] 11130 v_0 := v.Args[0] 11131 if v_0.Op != OpConst32 { 11132 break 11133 } 11134 c := v_0.AuxInt 11135 v_1 := v.Args[1] 11136 if v_1.Op != OpConst32 { 11137 break 11138 } 11139 d := v_1.AuxInt 11140 v.reset(OpConstBool) 11141 v.AuxInt = b2i(0 <= c && c < d) 11142 return true 11143 } 11144 // match: (IsInBounds (Const64 [c]) (Const64 [d])) 11145 // cond: 11146 // result: (ConstBool [b2i(0 <= c && c < d)]) 11147 for { 11148 _ = v.Args[1] 11149 v_0 := v.Args[0] 11150 if v_0.Op != OpConst64 { 11151 break 11152 } 11153 c := v_0.AuxInt 11154 v_1 := v.Args[1] 11155 if v_1.Op != OpConst64 { 11156 break 11157 } 11158 d := v_1.AuxInt 11159 v.reset(OpConstBool) 11160 v.AuxInt = b2i(0 <= c && c < d) 11161 return true 11162 } 11163 // match: (IsInBounds (Mod32u _ y) y) 11164 // cond: 11165 // result: (ConstBool [1]) 11166 for { 11167 _ = v.Args[1] 11168 v_0 := v.Args[0] 11169 if v_0.Op != OpMod32u { 11170 break 11171 } 11172 _ = v_0.Args[1] 11173 y := v_0.Args[1] 11174 if y != v.Args[1] { 11175 break 11176 } 11177 v.reset(OpConstBool) 11178 v.AuxInt = 1 11179 return true 11180 } 11181 // match: (IsInBounds (Mod64u _ y) y) 11182 // cond: 11183 // result: (ConstBool [1]) 11184 for { 11185 _ = v.Args[1] 11186 v_0 := v.Args[0] 11187 if v_0.Op != OpMod64u { 11188 break 11189 } 11190 _ = v_0.Args[1] 11191 y := v_0.Args[1] 11192 if y != v.Args[1] { 11193 break 11194 } 11195 v.reset(OpConstBool) 11196 v.AuxInt = 1 11197 return true 11198 } 11199 // match: (IsInBounds (ZeroExt8to64 (Rsh8Ux64 _ (Const64 [c]))) (Const64 [d])) 11200 // cond: 0 < c && c < 8 && 1<<uint( 8-c)-1 < d 11201 // result: (ConstBool [1]) 11202 for { 11203 _ = v.Args[1] 11204 v_0 := v.Args[0] 11205 if v_0.Op != OpZeroExt8to64 { 11206 break 11207 } 11208 v_0_0 := v_0.Args[0] 11209 if v_0_0.Op != OpRsh8Ux64 { 11210 break 11211 } 11212 _ = v_0_0.Args[1] 11213 v_0_0_1 := v_0_0.Args[1] 11214 if v_0_0_1.Op != OpConst64 { 11215 break 11216 } 11217 c := v_0_0_1.AuxInt 11218 v_1 := v.Args[1] 11219 if v_1.Op != OpConst64 { 11220 break 11221 } 11222 d := v_1.AuxInt 11223 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) { 11224 break 11225 } 11226 v.reset(OpConstBool) 11227 v.AuxInt = 1 11228 return true 11229 } 11230 return false 11231 } 11232 func rewriteValuegeneric_OpIsInBounds_30(v *Value) bool { 11233 // match: (IsInBounds (ZeroExt8to32 (Rsh8Ux64 _ (Const64 [c]))) (Const32 [d])) 11234 // cond: 0 < c && c < 8 && 1<<uint( 8-c)-1 < d 11235 // result: (ConstBool [1]) 11236 for { 11237 _ = v.Args[1] 11238 v_0 := v.Args[0] 11239 if v_0.Op != OpZeroExt8to32 { 11240 break 11241 } 11242 v_0_0 := v_0.Args[0] 11243 if v_0_0.Op != OpRsh8Ux64 { 11244 break 11245 } 11246 _ = v_0_0.Args[1] 11247 v_0_0_1 := v_0_0.Args[1] 11248 if v_0_0_1.Op != OpConst64 { 11249 break 11250 } 11251 c := v_0_0_1.AuxInt 11252 v_1 := v.Args[1] 11253 if v_1.Op != OpConst32 { 11254 break 11255 } 11256 d := v_1.AuxInt 11257 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) { 11258 break 11259 } 11260 v.reset(OpConstBool) 11261 v.AuxInt = 1 11262 return true 11263 } 11264 // match: (IsInBounds (ZeroExt8to16 (Rsh8Ux64 _ (Const64 [c]))) (Const16 [d])) 11265 // cond: 0 < c && c < 8 && 1<<uint( 8-c)-1 < d 11266 // result: (ConstBool [1]) 11267 for { 11268 _ = v.Args[1] 11269 v_0 := v.Args[0] 11270 if v_0.Op != OpZeroExt8to16 { 11271 break 11272 } 11273 v_0_0 := v_0.Args[0] 11274 if v_0_0.Op != OpRsh8Ux64 { 11275 break 11276 } 11277 _ = v_0_0.Args[1] 11278 v_0_0_1 := v_0_0.Args[1] 11279 if v_0_0_1.Op != OpConst64 { 11280 break 11281 } 11282 c := v_0_0_1.AuxInt 11283 v_1 := v.Args[1] 11284 if v_1.Op != OpConst16 { 11285 break 11286 } 11287 d := v_1.AuxInt 11288 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) { 11289 break 11290 } 11291 v.reset(OpConstBool) 11292 v.AuxInt = 1 11293 return true 11294 } 11295 // match: (IsInBounds (Rsh8Ux64 _ (Const64 [c])) (Const64 [d])) 11296 // cond: 0 < c && c < 8 && 1<<uint( 8-c)-1 < d 11297 // result: (ConstBool [1]) 11298 for { 11299 _ = v.Args[1] 11300 v_0 := v.Args[0] 11301 if v_0.Op != OpRsh8Ux64 { 11302 break 11303 } 11304 _ = v_0.Args[1] 11305 v_0_1 := v_0.Args[1] 11306 if v_0_1.Op != OpConst64 { 11307 break 11308 } 11309 c := v_0_1.AuxInt 11310 v_1 := v.Args[1] 11311 if v_1.Op != OpConst64 { 11312 break 11313 } 11314 d := v_1.AuxInt 11315 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) { 11316 break 11317 } 11318 v.reset(OpConstBool) 11319 v.AuxInt = 1 11320 return true 11321 } 11322 // match: (IsInBounds (ZeroExt16to64 (Rsh16Ux64 _ (Const64 [c]))) (Const64 [d])) 11323 // cond: 0 < c && c < 16 && 1<<uint(16-c)-1 < d 11324 // result: (ConstBool [1]) 11325 for { 11326 _ = v.Args[1] 11327 v_0 := v.Args[0] 11328 if v_0.Op != OpZeroExt16to64 { 11329 break 11330 } 11331 v_0_0 := v_0.Args[0] 11332 if v_0_0.Op != OpRsh16Ux64 { 11333 break 11334 } 11335 _ = v_0_0.Args[1] 11336 v_0_0_1 := v_0_0.Args[1] 11337 if v_0_0_1.Op != OpConst64 { 11338 break 11339 } 11340 c := v_0_0_1.AuxInt 11341 v_1 := v.Args[1] 11342 if v_1.Op != OpConst64 { 11343 break 11344 } 11345 d := v_1.AuxInt 11346 if !(0 < c && c < 16 && 1<<uint(16-c)-1 < d) { 11347 break 11348 } 11349 v.reset(OpConstBool) 11350 v.AuxInt = 1 11351 return true 11352 } 11353 // match: (IsInBounds (ZeroExt16to32 (Rsh16Ux64 _ (Const64 [c]))) (Const64 [d])) 11354 // cond: 0 < c && c < 16 && 1<<uint(16-c)-1 < d 11355 // result: (ConstBool [1]) 11356 for { 11357 _ = v.Args[1] 11358 v_0 := v.Args[0] 11359 if v_0.Op != OpZeroExt16to32 { 11360 break 11361 } 11362 v_0_0 := v_0.Args[0] 11363 if v_0_0.Op != OpRsh16Ux64 { 11364 break 11365 } 11366 _ = v_0_0.Args[1] 11367 v_0_0_1 := v_0_0.Args[1] 11368 if v_0_0_1.Op != OpConst64 { 11369 break 11370 } 11371 c := v_0_0_1.AuxInt 11372 v_1 := v.Args[1] 11373 if v_1.Op != OpConst64 { 11374 break 11375 } 11376 d := v_1.AuxInt 11377 if !(0 < c && c < 16 && 1<<uint(16-c)-1 < d) { 11378 break 11379 } 11380 v.reset(OpConstBool) 11381 v.AuxInt = 1 11382 return true 11383 } 11384 // match: (IsInBounds (Rsh16Ux64 _ (Const64 [c])) (Const64 [d])) 11385 // cond: 0 < c && c < 16 && 1<<uint(16-c)-1 < d 11386 // result: (ConstBool [1]) 11387 for { 11388 _ = v.Args[1] 11389 v_0 := v.Args[0] 11390 if v_0.Op != OpRsh16Ux64 { 11391 break 11392 } 11393 _ = v_0.Args[1] 11394 v_0_1 := v_0.Args[1] 11395 if v_0_1.Op != OpConst64 { 11396 break 11397 } 11398 c := v_0_1.AuxInt 11399 v_1 := v.Args[1] 11400 if v_1.Op != OpConst64 { 11401 break 11402 } 11403 d := v_1.AuxInt 11404 if !(0 < c && c < 16 && 1<<uint(16-c)-1 < d) { 11405 break 11406 } 11407 v.reset(OpConstBool) 11408 v.AuxInt = 1 11409 return true 11410 } 11411 // match: (IsInBounds (ZeroExt32to64 (Rsh32Ux64 _ (Const64 [c]))) (Const64 [d])) 11412 // cond: 0 < c && c < 32 && 1<<uint(32-c)-1 < d 11413 // result: (ConstBool [1]) 11414 for { 11415 _ = v.Args[1] 11416 v_0 := v.Args[0] 11417 if v_0.Op != OpZeroExt32to64 { 11418 break 11419 } 11420 v_0_0 := v_0.Args[0] 11421 if v_0_0.Op != OpRsh32Ux64 { 11422 break 11423 } 11424 _ = v_0_0.Args[1] 11425 v_0_0_1 := v_0_0.Args[1] 11426 if v_0_0_1.Op != OpConst64 { 11427 break 11428 } 11429 c := v_0_0_1.AuxInt 11430 v_1 := v.Args[1] 11431 if v_1.Op != OpConst64 { 11432 break 11433 } 11434 d := v_1.AuxInt 11435 if !(0 < c && c < 32 && 1<<uint(32-c)-1 < d) { 11436 break 11437 } 11438 v.reset(OpConstBool) 11439 v.AuxInt = 1 11440 return true 11441 } 11442 // match: (IsInBounds (Rsh32Ux64 _ (Const64 [c])) (Const64 [d])) 11443 // cond: 0 < c && c < 32 && 1<<uint(32-c)-1 < d 11444 // result: (ConstBool [1]) 11445 for { 11446 _ = v.Args[1] 11447 v_0 := v.Args[0] 11448 if v_0.Op != OpRsh32Ux64 { 11449 break 11450 } 11451 _ = v_0.Args[1] 11452 v_0_1 := v_0.Args[1] 11453 if v_0_1.Op != OpConst64 { 11454 break 11455 } 11456 c := v_0_1.AuxInt 11457 v_1 := v.Args[1] 11458 if v_1.Op != OpConst64 { 11459 break 11460 } 11461 d := v_1.AuxInt 11462 if !(0 < c && c < 32 && 1<<uint(32-c)-1 < d) { 11463 break 11464 } 11465 v.reset(OpConstBool) 11466 v.AuxInt = 1 11467 return true 11468 } 11469 // match: (IsInBounds (Rsh64Ux64 _ (Const64 [c])) (Const64 [d])) 11470 // cond: 0 < c && c < 64 && 1<<uint(64-c)-1 < d 11471 // result: (ConstBool [1]) 11472 for { 11473 _ = v.Args[1] 11474 v_0 := v.Args[0] 11475 if v_0.Op != OpRsh64Ux64 { 11476 break 11477 } 11478 _ = v_0.Args[1] 11479 v_0_1 := v_0.Args[1] 11480 if v_0_1.Op != OpConst64 { 11481 break 11482 } 11483 c := v_0_1.AuxInt 11484 v_1 := v.Args[1] 11485 if v_1.Op != OpConst64 { 11486 break 11487 } 11488 d := v_1.AuxInt 11489 if !(0 < c && c < 64 && 1<<uint(64-c)-1 < d) { 11490 break 11491 } 11492 v.reset(OpConstBool) 11493 v.AuxInt = 1 11494 return true 11495 } 11496 return false 11497 } 11498 func rewriteValuegeneric_OpIsNonNil_0(v *Value) bool { 11499 // match: (IsNonNil (ConstNil)) 11500 // cond: 11501 // result: (ConstBool [0]) 11502 for { 11503 v_0 := v.Args[0] 11504 if v_0.Op != OpConstNil { 11505 break 11506 } 11507 v.reset(OpConstBool) 11508 v.AuxInt = 0 11509 return true 11510 } 11511 return false 11512 } 11513 func rewriteValuegeneric_OpIsSliceInBounds_0(v *Value) bool { 11514 // match: (IsSliceInBounds x x) 11515 // cond: 11516 // result: (ConstBool [1]) 11517 for { 11518 _ = v.Args[1] 11519 x := v.Args[0] 11520 if x != v.Args[1] { 11521 break 11522 } 11523 v.reset(OpConstBool) 11524 v.AuxInt = 1 11525 return true 11526 } 11527 // match: (IsSliceInBounds (And32 (Const32 [c]) _) (Const32 [d])) 11528 // cond: 0 <= c && c <= d 11529 // result: (ConstBool [1]) 11530 for { 11531 _ = v.Args[1] 11532 v_0 := v.Args[0] 11533 if v_0.Op != OpAnd32 { 11534 break 11535 } 11536 _ = v_0.Args[1] 11537 v_0_0 := v_0.Args[0] 11538 if v_0_0.Op != OpConst32 { 11539 break 11540 } 11541 c := v_0_0.AuxInt 11542 v_1 := v.Args[1] 11543 if v_1.Op != OpConst32 { 11544 break 11545 } 11546 d := v_1.AuxInt 11547 if !(0 <= c && c <= d) { 11548 break 11549 } 11550 v.reset(OpConstBool) 11551 v.AuxInt = 1 11552 return true 11553 } 11554 // match: (IsSliceInBounds (And32 _ (Const32 [c])) (Const32 [d])) 11555 // cond: 0 <= c && c <= d 11556 // result: (ConstBool [1]) 11557 for { 11558 _ = v.Args[1] 11559 v_0 := v.Args[0] 11560 if v_0.Op != OpAnd32 { 11561 break 11562 } 11563 _ = v_0.Args[1] 11564 v_0_1 := v_0.Args[1] 11565 if v_0_1.Op != OpConst32 { 11566 break 11567 } 11568 c := v_0_1.AuxInt 11569 v_1 := v.Args[1] 11570 if v_1.Op != OpConst32 { 11571 break 11572 } 11573 d := v_1.AuxInt 11574 if !(0 <= c && c <= d) { 11575 break 11576 } 11577 v.reset(OpConstBool) 11578 v.AuxInt = 1 11579 return true 11580 } 11581 // match: (IsSliceInBounds (And64 (Const64 [c]) _) (Const64 [d])) 11582 // cond: 0 <= c && c <= d 11583 // result: (ConstBool [1]) 11584 for { 11585 _ = v.Args[1] 11586 v_0 := v.Args[0] 11587 if v_0.Op != OpAnd64 { 11588 break 11589 } 11590 _ = v_0.Args[1] 11591 v_0_0 := v_0.Args[0] 11592 if v_0_0.Op != OpConst64 { 11593 break 11594 } 11595 c := v_0_0.AuxInt 11596 v_1 := v.Args[1] 11597 if v_1.Op != OpConst64 { 11598 break 11599 } 11600 d := v_1.AuxInt 11601 if !(0 <= c && c <= d) { 11602 break 11603 } 11604 v.reset(OpConstBool) 11605 v.AuxInt = 1 11606 return true 11607 } 11608 // match: (IsSliceInBounds (And64 _ (Const64 [c])) (Const64 [d])) 11609 // cond: 0 <= c && c <= d 11610 // result: (ConstBool [1]) 11611 for { 11612 _ = v.Args[1] 11613 v_0 := v.Args[0] 11614 if v_0.Op != OpAnd64 { 11615 break 11616 } 11617 _ = v_0.Args[1] 11618 v_0_1 := v_0.Args[1] 11619 if v_0_1.Op != OpConst64 { 11620 break 11621 } 11622 c := v_0_1.AuxInt 11623 v_1 := v.Args[1] 11624 if v_1.Op != OpConst64 { 11625 break 11626 } 11627 d := v_1.AuxInt 11628 if !(0 <= c && c <= d) { 11629 break 11630 } 11631 v.reset(OpConstBool) 11632 v.AuxInt = 1 11633 return true 11634 } 11635 // match: (IsSliceInBounds (Const32 [0]) _) 11636 // cond: 11637 // result: (ConstBool [1]) 11638 for { 11639 _ = v.Args[1] 11640 v_0 := v.Args[0] 11641 if v_0.Op != OpConst32 { 11642 break 11643 } 11644 if v_0.AuxInt != 0 { 11645 break 11646 } 11647 v.reset(OpConstBool) 11648 v.AuxInt = 1 11649 return true 11650 } 11651 // match: (IsSliceInBounds (Const64 [0]) _) 11652 // cond: 11653 // result: (ConstBool [1]) 11654 for { 11655 _ = v.Args[1] 11656 v_0 := v.Args[0] 11657 if v_0.Op != OpConst64 { 11658 break 11659 } 11660 if v_0.AuxInt != 0 { 11661 break 11662 } 11663 v.reset(OpConstBool) 11664 v.AuxInt = 1 11665 return true 11666 } 11667 // match: (IsSliceInBounds (Const32 [c]) (Const32 [d])) 11668 // cond: 11669 // result: (ConstBool [b2i(0 <= c && c <= d)]) 11670 for { 11671 _ = v.Args[1] 11672 v_0 := v.Args[0] 11673 if v_0.Op != OpConst32 { 11674 break 11675 } 11676 c := v_0.AuxInt 11677 v_1 := v.Args[1] 11678 if v_1.Op != OpConst32 { 11679 break 11680 } 11681 d := v_1.AuxInt 11682 v.reset(OpConstBool) 11683 v.AuxInt = b2i(0 <= c && c <= d) 11684 return true 11685 } 11686 // match: (IsSliceInBounds (Const64 [c]) (Const64 [d])) 11687 // cond: 11688 // result: (ConstBool [b2i(0 <= c && c <= d)]) 11689 for { 11690 _ = v.Args[1] 11691 v_0 := v.Args[0] 11692 if v_0.Op != OpConst64 { 11693 break 11694 } 11695 c := v_0.AuxInt 11696 v_1 := v.Args[1] 11697 if v_1.Op != OpConst64 { 11698 break 11699 } 11700 d := v_1.AuxInt 11701 v.reset(OpConstBool) 11702 v.AuxInt = b2i(0 <= c && c <= d) 11703 return true 11704 } 11705 // match: (IsSliceInBounds (SliceLen x) (SliceCap x)) 11706 // cond: 11707 // result: (ConstBool [1]) 11708 for { 11709 _ = v.Args[1] 11710 v_0 := v.Args[0] 11711 if v_0.Op != OpSliceLen { 11712 break 11713 } 11714 x := v_0.Args[0] 11715 v_1 := v.Args[1] 11716 if v_1.Op != OpSliceCap { 11717 break 11718 } 11719 if x != v_1.Args[0] { 11720 break 11721 } 11722 v.reset(OpConstBool) 11723 v.AuxInt = 1 11724 return true 11725 } 11726 return false 11727 } 11728 func rewriteValuegeneric_OpLeq16_0(v *Value) bool { 11729 // match: (Leq16 (Const16 [c]) (Const16 [d])) 11730 // cond: 11731 // result: (ConstBool [b2i(c <= d)]) 11732 for { 11733 _ = v.Args[1] 11734 v_0 := v.Args[0] 11735 if v_0.Op != OpConst16 { 11736 break 11737 } 11738 c := v_0.AuxInt 11739 v_1 := v.Args[1] 11740 if v_1.Op != OpConst16 { 11741 break 11742 } 11743 d := v_1.AuxInt 11744 v.reset(OpConstBool) 11745 v.AuxInt = b2i(c <= d) 11746 return true 11747 } 11748 return false 11749 } 11750 func rewriteValuegeneric_OpLeq16U_0(v *Value) bool { 11751 // match: (Leq16U (Const16 [c]) (Const16 [d])) 11752 // cond: 11753 // result: (ConstBool [b2i(uint16(c) <= uint16(d))]) 11754 for { 11755 _ = v.Args[1] 11756 v_0 := v.Args[0] 11757 if v_0.Op != OpConst16 { 11758 break 11759 } 11760 c := v_0.AuxInt 11761 v_1 := v.Args[1] 11762 if v_1.Op != OpConst16 { 11763 break 11764 } 11765 d := v_1.AuxInt 11766 v.reset(OpConstBool) 11767 v.AuxInt = b2i(uint16(c) <= uint16(d)) 11768 return true 11769 } 11770 return false 11771 } 11772 func rewriteValuegeneric_OpLeq32_0(v *Value) bool { 11773 // match: (Leq32 (Const32 [c]) (Const32 [d])) 11774 // cond: 11775 // result: (ConstBool [b2i(c <= d)]) 11776 for { 11777 _ = v.Args[1] 11778 v_0 := v.Args[0] 11779 if v_0.Op != OpConst32 { 11780 break 11781 } 11782 c := v_0.AuxInt 11783 v_1 := v.Args[1] 11784 if v_1.Op != OpConst32 { 11785 break 11786 } 11787 d := v_1.AuxInt 11788 v.reset(OpConstBool) 11789 v.AuxInt = b2i(c <= d) 11790 return true 11791 } 11792 return false 11793 } 11794 func rewriteValuegeneric_OpLeq32F_0(v *Value) bool { 11795 // match: (Leq32F (Const32F [c]) (Const32F [d])) 11796 // cond: 11797 // result: (ConstBool [b2i(i2f(c) <= i2f(d))]) 11798 for { 11799 _ = v.Args[1] 11800 v_0 := v.Args[0] 11801 if v_0.Op != OpConst32F { 11802 break 11803 } 11804 c := v_0.AuxInt 11805 v_1 := v.Args[1] 11806 if v_1.Op != OpConst32F { 11807 break 11808 } 11809 d := v_1.AuxInt 11810 v.reset(OpConstBool) 11811 v.AuxInt = b2i(i2f(c) <= i2f(d)) 11812 return true 11813 } 11814 return false 11815 } 11816 func rewriteValuegeneric_OpLeq32U_0(v *Value) bool { 11817 // match: (Leq32U (Const32 [c]) (Const32 [d])) 11818 // cond: 11819 // result: (ConstBool [b2i(uint32(c) <= uint32(d))]) 11820 for { 11821 _ = v.Args[1] 11822 v_0 := v.Args[0] 11823 if v_0.Op != OpConst32 { 11824 break 11825 } 11826 c := v_0.AuxInt 11827 v_1 := v.Args[1] 11828 if v_1.Op != OpConst32 { 11829 break 11830 } 11831 d := v_1.AuxInt 11832 v.reset(OpConstBool) 11833 v.AuxInt = b2i(uint32(c) <= uint32(d)) 11834 return true 11835 } 11836 return false 11837 } 11838 func rewriteValuegeneric_OpLeq64_0(v *Value) bool { 11839 // match: (Leq64 (Const64 [c]) (Const64 [d])) 11840 // cond: 11841 // result: (ConstBool [b2i(c <= d)]) 11842 for { 11843 _ = v.Args[1] 11844 v_0 := v.Args[0] 11845 if v_0.Op != OpConst64 { 11846 break 11847 } 11848 c := v_0.AuxInt 11849 v_1 := v.Args[1] 11850 if v_1.Op != OpConst64 { 11851 break 11852 } 11853 d := v_1.AuxInt 11854 v.reset(OpConstBool) 11855 v.AuxInt = b2i(c <= d) 11856 return true 11857 } 11858 return false 11859 } 11860 func rewriteValuegeneric_OpLeq64F_0(v *Value) bool { 11861 // match: (Leq64F (Const64F [c]) (Const64F [d])) 11862 // cond: 11863 // result: (ConstBool [b2i(i2f(c) <= i2f(d))]) 11864 for { 11865 _ = v.Args[1] 11866 v_0 := v.Args[0] 11867 if v_0.Op != OpConst64F { 11868 break 11869 } 11870 c := v_0.AuxInt 11871 v_1 := v.Args[1] 11872 if v_1.Op != OpConst64F { 11873 break 11874 } 11875 d := v_1.AuxInt 11876 v.reset(OpConstBool) 11877 v.AuxInt = b2i(i2f(c) <= i2f(d)) 11878 return true 11879 } 11880 return false 11881 } 11882 func rewriteValuegeneric_OpLeq64U_0(v *Value) bool { 11883 // match: (Leq64U (Const64 [c]) (Const64 [d])) 11884 // cond: 11885 // result: (ConstBool [b2i(uint64(c) <= uint64(d))]) 11886 for { 11887 _ = v.Args[1] 11888 v_0 := v.Args[0] 11889 if v_0.Op != OpConst64 { 11890 break 11891 } 11892 c := v_0.AuxInt 11893 v_1 := v.Args[1] 11894 if v_1.Op != OpConst64 { 11895 break 11896 } 11897 d := v_1.AuxInt 11898 v.reset(OpConstBool) 11899 v.AuxInt = b2i(uint64(c) <= uint64(d)) 11900 return true 11901 } 11902 return false 11903 } 11904 func rewriteValuegeneric_OpLeq8_0(v *Value) bool { 11905 // match: (Leq8 (Const8 [c]) (Const8 [d])) 11906 // cond: 11907 // result: (ConstBool [b2i(c <= d)]) 11908 for { 11909 _ = v.Args[1] 11910 v_0 := v.Args[0] 11911 if v_0.Op != OpConst8 { 11912 break 11913 } 11914 c := v_0.AuxInt 11915 v_1 := v.Args[1] 11916 if v_1.Op != OpConst8 { 11917 break 11918 } 11919 d := v_1.AuxInt 11920 v.reset(OpConstBool) 11921 v.AuxInt = b2i(c <= d) 11922 return true 11923 } 11924 return false 11925 } 11926 func rewriteValuegeneric_OpLeq8U_0(v *Value) bool { 11927 // match: (Leq8U (Const8 [c]) (Const8 [d])) 11928 // cond: 11929 // result: (ConstBool [b2i(uint8(c) <= uint8(d))]) 11930 for { 11931 _ = v.Args[1] 11932 v_0 := v.Args[0] 11933 if v_0.Op != OpConst8 { 11934 break 11935 } 11936 c := v_0.AuxInt 11937 v_1 := v.Args[1] 11938 if v_1.Op != OpConst8 { 11939 break 11940 } 11941 d := v_1.AuxInt 11942 v.reset(OpConstBool) 11943 v.AuxInt = b2i(uint8(c) <= uint8(d)) 11944 return true 11945 } 11946 return false 11947 } 11948 func rewriteValuegeneric_OpLess16_0(v *Value) bool { 11949 // match: (Less16 (Const16 [c]) (Const16 [d])) 11950 // cond: 11951 // result: (ConstBool [b2i(c < d)]) 11952 for { 11953 _ = v.Args[1] 11954 v_0 := v.Args[0] 11955 if v_0.Op != OpConst16 { 11956 break 11957 } 11958 c := v_0.AuxInt 11959 v_1 := v.Args[1] 11960 if v_1.Op != OpConst16 { 11961 break 11962 } 11963 d := v_1.AuxInt 11964 v.reset(OpConstBool) 11965 v.AuxInt = b2i(c < d) 11966 return true 11967 } 11968 return false 11969 } 11970 func rewriteValuegeneric_OpLess16U_0(v *Value) bool { 11971 // match: (Less16U (Const16 [c]) (Const16 [d])) 11972 // cond: 11973 // result: (ConstBool [b2i(uint16(c) < uint16(d))]) 11974 for { 11975 _ = v.Args[1] 11976 v_0 := v.Args[0] 11977 if v_0.Op != OpConst16 { 11978 break 11979 } 11980 c := v_0.AuxInt 11981 v_1 := v.Args[1] 11982 if v_1.Op != OpConst16 { 11983 break 11984 } 11985 d := v_1.AuxInt 11986 v.reset(OpConstBool) 11987 v.AuxInt = b2i(uint16(c) < uint16(d)) 11988 return true 11989 } 11990 return false 11991 } 11992 func rewriteValuegeneric_OpLess32_0(v *Value) bool { 11993 // match: (Less32 (Const32 [c]) (Const32 [d])) 11994 // cond: 11995 // result: (ConstBool [b2i(c < d)]) 11996 for { 11997 _ = v.Args[1] 11998 v_0 := v.Args[0] 11999 if v_0.Op != OpConst32 { 12000 break 12001 } 12002 c := v_0.AuxInt 12003 v_1 := v.Args[1] 12004 if v_1.Op != OpConst32 { 12005 break 12006 } 12007 d := v_1.AuxInt 12008 v.reset(OpConstBool) 12009 v.AuxInt = b2i(c < d) 12010 return true 12011 } 12012 return false 12013 } 12014 func rewriteValuegeneric_OpLess32F_0(v *Value) bool { 12015 // match: (Less32F (Const32F [c]) (Const32F [d])) 12016 // cond: 12017 // result: (ConstBool [b2i(i2f(c) < i2f(d))]) 12018 for { 12019 _ = v.Args[1] 12020 v_0 := v.Args[0] 12021 if v_0.Op != OpConst32F { 12022 break 12023 } 12024 c := v_0.AuxInt 12025 v_1 := v.Args[1] 12026 if v_1.Op != OpConst32F { 12027 break 12028 } 12029 d := v_1.AuxInt 12030 v.reset(OpConstBool) 12031 v.AuxInt = b2i(i2f(c) < i2f(d)) 12032 return true 12033 } 12034 return false 12035 } 12036 func rewriteValuegeneric_OpLess32U_0(v *Value) bool { 12037 // match: (Less32U (Const32 [c]) (Const32 [d])) 12038 // cond: 12039 // result: (ConstBool [b2i(uint32(c) < uint32(d))]) 12040 for { 12041 _ = v.Args[1] 12042 v_0 := v.Args[0] 12043 if v_0.Op != OpConst32 { 12044 break 12045 } 12046 c := v_0.AuxInt 12047 v_1 := v.Args[1] 12048 if v_1.Op != OpConst32 { 12049 break 12050 } 12051 d := v_1.AuxInt 12052 v.reset(OpConstBool) 12053 v.AuxInt = b2i(uint32(c) < uint32(d)) 12054 return true 12055 } 12056 return false 12057 } 12058 func rewriteValuegeneric_OpLess64_0(v *Value) bool { 12059 // match: (Less64 (Const64 [c]) (Const64 [d])) 12060 // cond: 12061 // result: (ConstBool [b2i(c < d)]) 12062 for { 12063 _ = v.Args[1] 12064 v_0 := v.Args[0] 12065 if v_0.Op != OpConst64 { 12066 break 12067 } 12068 c := v_0.AuxInt 12069 v_1 := v.Args[1] 12070 if v_1.Op != OpConst64 { 12071 break 12072 } 12073 d := v_1.AuxInt 12074 v.reset(OpConstBool) 12075 v.AuxInt = b2i(c < d) 12076 return true 12077 } 12078 return false 12079 } 12080 func rewriteValuegeneric_OpLess64F_0(v *Value) bool { 12081 // match: (Less64F (Const64F [c]) (Const64F [d])) 12082 // cond: 12083 // result: (ConstBool [b2i(i2f(c) < i2f(d))]) 12084 for { 12085 _ = v.Args[1] 12086 v_0 := v.Args[0] 12087 if v_0.Op != OpConst64F { 12088 break 12089 } 12090 c := v_0.AuxInt 12091 v_1 := v.Args[1] 12092 if v_1.Op != OpConst64F { 12093 break 12094 } 12095 d := v_1.AuxInt 12096 v.reset(OpConstBool) 12097 v.AuxInt = b2i(i2f(c) < i2f(d)) 12098 return true 12099 } 12100 return false 12101 } 12102 func rewriteValuegeneric_OpLess64U_0(v *Value) bool { 12103 // match: (Less64U (Const64 [c]) (Const64 [d])) 12104 // cond: 12105 // result: (ConstBool [b2i(uint64(c) < uint64(d))]) 12106 for { 12107 _ = v.Args[1] 12108 v_0 := v.Args[0] 12109 if v_0.Op != OpConst64 { 12110 break 12111 } 12112 c := v_0.AuxInt 12113 v_1 := v.Args[1] 12114 if v_1.Op != OpConst64 { 12115 break 12116 } 12117 d := v_1.AuxInt 12118 v.reset(OpConstBool) 12119 v.AuxInt = b2i(uint64(c) < uint64(d)) 12120 return true 12121 } 12122 return false 12123 } 12124 func rewriteValuegeneric_OpLess8_0(v *Value) bool { 12125 // match: (Less8 (Const8 [c]) (Const8 [d])) 12126 // cond: 12127 // result: (ConstBool [b2i(c < d)]) 12128 for { 12129 _ = v.Args[1] 12130 v_0 := v.Args[0] 12131 if v_0.Op != OpConst8 { 12132 break 12133 } 12134 c := v_0.AuxInt 12135 v_1 := v.Args[1] 12136 if v_1.Op != OpConst8 { 12137 break 12138 } 12139 d := v_1.AuxInt 12140 v.reset(OpConstBool) 12141 v.AuxInt = b2i(c < d) 12142 return true 12143 } 12144 return false 12145 } 12146 func rewriteValuegeneric_OpLess8U_0(v *Value) bool { 12147 // match: (Less8U (Const8 [c]) (Const8 [d])) 12148 // cond: 12149 // result: (ConstBool [b2i(uint8(c) < uint8(d))]) 12150 for { 12151 _ = v.Args[1] 12152 v_0 := v.Args[0] 12153 if v_0.Op != OpConst8 { 12154 break 12155 } 12156 c := v_0.AuxInt 12157 v_1 := v.Args[1] 12158 if v_1.Op != OpConst8 { 12159 break 12160 } 12161 d := v_1.AuxInt 12162 v.reset(OpConstBool) 12163 v.AuxInt = b2i(uint8(c) < uint8(d)) 12164 return true 12165 } 12166 return false 12167 } 12168 func rewriteValuegeneric_OpLoad_0(v *Value) bool { 12169 b := v.Block 12170 _ = b 12171 fe := b.Func.fe 12172 _ = fe 12173 // match: (Load <t1> p1 (Store {t2} p2 x _)) 12174 // cond: isSamePtr(p1,p2) && t1.Compare(x.Type) == types.CMPeq && t1.Size() == t2.(*types.Type).Size() 12175 // result: x 12176 for { 12177 t1 := v.Type 12178 _ = v.Args[1] 12179 p1 := v.Args[0] 12180 v_1 := v.Args[1] 12181 if v_1.Op != OpStore { 12182 break 12183 } 12184 t2 := v_1.Aux 12185 _ = v_1.Args[2] 12186 p2 := v_1.Args[0] 12187 x := v_1.Args[1] 12188 if !(isSamePtr(p1, p2) && t1.Compare(x.Type) == types.CMPeq && t1.Size() == t2.(*types.Type).Size()) { 12189 break 12190 } 12191 v.reset(OpCopy) 12192 v.Type = x.Type 12193 v.AddArg(x) 12194 return true 12195 } 12196 // match: (Load <t1> p1 (Store {t2} p2 (Const64 [x]) _)) 12197 // cond: isSamePtr(p1,p2) && t2.(*types.Type).Size() == 8 && is64BitFloat(t1) 12198 // result: (Const64F [x]) 12199 for { 12200 t1 := v.Type 12201 _ = v.Args[1] 12202 p1 := v.Args[0] 12203 v_1 := v.Args[1] 12204 if v_1.Op != OpStore { 12205 break 12206 } 12207 t2 := v_1.Aux 12208 _ = v_1.Args[2] 12209 p2 := v_1.Args[0] 12210 v_1_1 := v_1.Args[1] 12211 if v_1_1.Op != OpConst64 { 12212 break 12213 } 12214 x := v_1_1.AuxInt 12215 if !(isSamePtr(p1, p2) && t2.(*types.Type).Size() == 8 && is64BitFloat(t1)) { 12216 break 12217 } 12218 v.reset(OpConst64F) 12219 v.AuxInt = x 12220 return true 12221 } 12222 // match: (Load <t1> p1 (Store {t2} p2 (Const32 [x]) _)) 12223 // cond: isSamePtr(p1,p2) && t2.(*types.Type).Size() == 4 && is32BitFloat(t1) 12224 // result: (Const32F [f2i(float64(math.Float32frombits(uint32(x))))]) 12225 for { 12226 t1 := v.Type 12227 _ = v.Args[1] 12228 p1 := v.Args[0] 12229 v_1 := v.Args[1] 12230 if v_1.Op != OpStore { 12231 break 12232 } 12233 t2 := v_1.Aux 12234 _ = v_1.Args[2] 12235 p2 := v_1.Args[0] 12236 v_1_1 := v_1.Args[1] 12237 if v_1_1.Op != OpConst32 { 12238 break 12239 } 12240 x := v_1_1.AuxInt 12241 if !(isSamePtr(p1, p2) && t2.(*types.Type).Size() == 4 && is32BitFloat(t1)) { 12242 break 12243 } 12244 v.reset(OpConst32F) 12245 v.AuxInt = f2i(float64(math.Float32frombits(uint32(x)))) 12246 return true 12247 } 12248 // match: (Load <t1> p1 (Store {t2} p2 (Const64F [x]) _)) 12249 // cond: isSamePtr(p1,p2) && t2.(*types.Type).Size() == 8 && is64BitInt(t1) 12250 // result: (Const64 [x]) 12251 for { 12252 t1 := v.Type 12253 _ = v.Args[1] 12254 p1 := v.Args[0] 12255 v_1 := v.Args[1] 12256 if v_1.Op != OpStore { 12257 break 12258 } 12259 t2 := v_1.Aux 12260 _ = v_1.Args[2] 12261 p2 := v_1.Args[0] 12262 v_1_1 := v_1.Args[1] 12263 if v_1_1.Op != OpConst64F { 12264 break 12265 } 12266 x := v_1_1.AuxInt 12267 if !(isSamePtr(p1, p2) && t2.(*types.Type).Size() == 8 && is64BitInt(t1)) { 12268 break 12269 } 12270 v.reset(OpConst64) 12271 v.AuxInt = x 12272 return true 12273 } 12274 // match: (Load <t1> p1 (Store {t2} p2 (Const32F [x]) _)) 12275 // cond: isSamePtr(p1,p2) && t2.(*types.Type).Size() == 4 && is32BitInt(t1) 12276 // result: (Const32 [int64(int32(math.Float32bits(float32(i2f(x)))))]) 12277 for { 12278 t1 := v.Type 12279 _ = v.Args[1] 12280 p1 := v.Args[0] 12281 v_1 := v.Args[1] 12282 if v_1.Op != OpStore { 12283 break 12284 } 12285 t2 := v_1.Aux 12286 _ = v_1.Args[2] 12287 p2 := v_1.Args[0] 12288 v_1_1 := v_1.Args[1] 12289 if v_1_1.Op != OpConst32F { 12290 break 12291 } 12292 x := v_1_1.AuxInt 12293 if !(isSamePtr(p1, p2) && t2.(*types.Type).Size() == 4 && is32BitInt(t1)) { 12294 break 12295 } 12296 v.reset(OpConst32) 12297 v.AuxInt = int64(int32(math.Float32bits(float32(i2f(x))))) 12298 return true 12299 } 12300 // match: (Load <t> _ _) 12301 // cond: t.IsStruct() && t.NumFields() == 0 && fe.CanSSA(t) 12302 // result: (StructMake0) 12303 for { 12304 t := v.Type 12305 _ = v.Args[1] 12306 if !(t.IsStruct() && t.NumFields() == 0 && fe.CanSSA(t)) { 12307 break 12308 } 12309 v.reset(OpStructMake0) 12310 return true 12311 } 12312 // match: (Load <t> ptr mem) 12313 // cond: t.IsStruct() && t.NumFields() == 1 && fe.CanSSA(t) 12314 // result: (StructMake1 (Load <t.FieldType(0)> (OffPtr <t.FieldType(0).PtrTo()> [0] ptr) mem)) 12315 for { 12316 t := v.Type 12317 _ = v.Args[1] 12318 ptr := v.Args[0] 12319 mem := v.Args[1] 12320 if !(t.IsStruct() && t.NumFields() == 1 && fe.CanSSA(t)) { 12321 break 12322 } 12323 v.reset(OpStructMake1) 12324 v0 := b.NewValue0(v.Pos, OpLoad, t.FieldType(0)) 12325 v1 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 12326 v1.AuxInt = 0 12327 v1.AddArg(ptr) 12328 v0.AddArg(v1) 12329 v0.AddArg(mem) 12330 v.AddArg(v0) 12331 return true 12332 } 12333 // match: (Load <t> ptr mem) 12334 // cond: t.IsStruct() && t.NumFields() == 2 && fe.CanSSA(t) 12335 // 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)) 12336 for { 12337 t := v.Type 12338 _ = v.Args[1] 12339 ptr := v.Args[0] 12340 mem := v.Args[1] 12341 if !(t.IsStruct() && t.NumFields() == 2 && fe.CanSSA(t)) { 12342 break 12343 } 12344 v.reset(OpStructMake2) 12345 v0 := b.NewValue0(v.Pos, OpLoad, t.FieldType(0)) 12346 v1 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 12347 v1.AuxInt = 0 12348 v1.AddArg(ptr) 12349 v0.AddArg(v1) 12350 v0.AddArg(mem) 12351 v.AddArg(v0) 12352 v2 := b.NewValue0(v.Pos, OpLoad, t.FieldType(1)) 12353 v3 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) 12354 v3.AuxInt = t.FieldOff(1) 12355 v3.AddArg(ptr) 12356 v2.AddArg(v3) 12357 v2.AddArg(mem) 12358 v.AddArg(v2) 12359 return true 12360 } 12361 // match: (Load <t> ptr mem) 12362 // cond: t.IsStruct() && t.NumFields() == 3 && fe.CanSSA(t) 12363 // 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)) 12364 for { 12365 t := v.Type 12366 _ = v.Args[1] 12367 ptr := v.Args[0] 12368 mem := v.Args[1] 12369 if !(t.IsStruct() && t.NumFields() == 3 && fe.CanSSA(t)) { 12370 break 12371 } 12372 v.reset(OpStructMake3) 12373 v0 := b.NewValue0(v.Pos, OpLoad, t.FieldType(0)) 12374 v1 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 12375 v1.AuxInt = 0 12376 v1.AddArg(ptr) 12377 v0.AddArg(v1) 12378 v0.AddArg(mem) 12379 v.AddArg(v0) 12380 v2 := b.NewValue0(v.Pos, OpLoad, t.FieldType(1)) 12381 v3 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) 12382 v3.AuxInt = t.FieldOff(1) 12383 v3.AddArg(ptr) 12384 v2.AddArg(v3) 12385 v2.AddArg(mem) 12386 v.AddArg(v2) 12387 v4 := b.NewValue0(v.Pos, OpLoad, t.FieldType(2)) 12388 v5 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(2).PtrTo()) 12389 v5.AuxInt = t.FieldOff(2) 12390 v5.AddArg(ptr) 12391 v4.AddArg(v5) 12392 v4.AddArg(mem) 12393 v.AddArg(v4) 12394 return true 12395 } 12396 // match: (Load <t> ptr mem) 12397 // cond: t.IsStruct() && t.NumFields() == 4 && fe.CanSSA(t) 12398 // 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)) 12399 for { 12400 t := v.Type 12401 _ = v.Args[1] 12402 ptr := v.Args[0] 12403 mem := v.Args[1] 12404 if !(t.IsStruct() && t.NumFields() == 4 && fe.CanSSA(t)) { 12405 break 12406 } 12407 v.reset(OpStructMake4) 12408 v0 := b.NewValue0(v.Pos, OpLoad, t.FieldType(0)) 12409 v1 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 12410 v1.AuxInt = 0 12411 v1.AddArg(ptr) 12412 v0.AddArg(v1) 12413 v0.AddArg(mem) 12414 v.AddArg(v0) 12415 v2 := b.NewValue0(v.Pos, OpLoad, t.FieldType(1)) 12416 v3 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) 12417 v3.AuxInt = t.FieldOff(1) 12418 v3.AddArg(ptr) 12419 v2.AddArg(v3) 12420 v2.AddArg(mem) 12421 v.AddArg(v2) 12422 v4 := b.NewValue0(v.Pos, OpLoad, t.FieldType(2)) 12423 v5 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(2).PtrTo()) 12424 v5.AuxInt = t.FieldOff(2) 12425 v5.AddArg(ptr) 12426 v4.AddArg(v5) 12427 v4.AddArg(mem) 12428 v.AddArg(v4) 12429 v6 := b.NewValue0(v.Pos, OpLoad, t.FieldType(3)) 12430 v7 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(3).PtrTo()) 12431 v7.AuxInt = t.FieldOff(3) 12432 v7.AddArg(ptr) 12433 v6.AddArg(v7) 12434 v6.AddArg(mem) 12435 v.AddArg(v6) 12436 return true 12437 } 12438 return false 12439 } 12440 func rewriteValuegeneric_OpLoad_10(v *Value) bool { 12441 b := v.Block 12442 _ = b 12443 fe := b.Func.fe 12444 _ = fe 12445 // match: (Load <t> _ _) 12446 // cond: t.IsArray() && t.NumElem() == 0 12447 // result: (ArrayMake0) 12448 for { 12449 t := v.Type 12450 _ = v.Args[1] 12451 if !(t.IsArray() && t.NumElem() == 0) { 12452 break 12453 } 12454 v.reset(OpArrayMake0) 12455 return true 12456 } 12457 // match: (Load <t> ptr mem) 12458 // cond: t.IsArray() && t.NumElem() == 1 && fe.CanSSA(t) 12459 // result: (ArrayMake1 (Load <t.ElemType()> ptr mem)) 12460 for { 12461 t := v.Type 12462 _ = v.Args[1] 12463 ptr := v.Args[0] 12464 mem := v.Args[1] 12465 if !(t.IsArray() && t.NumElem() == 1 && fe.CanSSA(t)) { 12466 break 12467 } 12468 v.reset(OpArrayMake1) 12469 v0 := b.NewValue0(v.Pos, OpLoad, t.ElemType()) 12470 v0.AddArg(ptr) 12471 v0.AddArg(mem) 12472 v.AddArg(v0) 12473 return true 12474 } 12475 return false 12476 } 12477 func rewriteValuegeneric_OpLsh16x16_0(v *Value) bool { 12478 b := v.Block 12479 _ = b 12480 // match: (Lsh16x16 <t> x (Const16 [c])) 12481 // cond: 12482 // result: (Lsh16x64 x (Const64 <t> [int64(uint16(c))])) 12483 for { 12484 t := v.Type 12485 _ = v.Args[1] 12486 x := v.Args[0] 12487 v_1 := v.Args[1] 12488 if v_1.Op != OpConst16 { 12489 break 12490 } 12491 c := v_1.AuxInt 12492 v.reset(OpLsh16x64) 12493 v.AddArg(x) 12494 v0 := b.NewValue0(v.Pos, OpConst64, t) 12495 v0.AuxInt = int64(uint16(c)) 12496 v.AddArg(v0) 12497 return true 12498 } 12499 // match: (Lsh16x16 (Const16 [0]) _) 12500 // cond: 12501 // result: (Const16 [0]) 12502 for { 12503 _ = v.Args[1] 12504 v_0 := v.Args[0] 12505 if v_0.Op != OpConst16 { 12506 break 12507 } 12508 if v_0.AuxInt != 0 { 12509 break 12510 } 12511 v.reset(OpConst16) 12512 v.AuxInt = 0 12513 return true 12514 } 12515 return false 12516 } 12517 func rewriteValuegeneric_OpLsh16x32_0(v *Value) bool { 12518 b := v.Block 12519 _ = b 12520 // match: (Lsh16x32 <t> x (Const32 [c])) 12521 // cond: 12522 // result: (Lsh16x64 x (Const64 <t> [int64(uint32(c))])) 12523 for { 12524 t := v.Type 12525 _ = v.Args[1] 12526 x := v.Args[0] 12527 v_1 := v.Args[1] 12528 if v_1.Op != OpConst32 { 12529 break 12530 } 12531 c := v_1.AuxInt 12532 v.reset(OpLsh16x64) 12533 v.AddArg(x) 12534 v0 := b.NewValue0(v.Pos, OpConst64, t) 12535 v0.AuxInt = int64(uint32(c)) 12536 v.AddArg(v0) 12537 return true 12538 } 12539 // match: (Lsh16x32 (Const16 [0]) _) 12540 // cond: 12541 // result: (Const16 [0]) 12542 for { 12543 _ = v.Args[1] 12544 v_0 := v.Args[0] 12545 if v_0.Op != OpConst16 { 12546 break 12547 } 12548 if v_0.AuxInt != 0 { 12549 break 12550 } 12551 v.reset(OpConst16) 12552 v.AuxInt = 0 12553 return true 12554 } 12555 return false 12556 } 12557 func rewriteValuegeneric_OpLsh16x64_0(v *Value) bool { 12558 b := v.Block 12559 _ = b 12560 typ := &b.Func.Config.Types 12561 _ = typ 12562 // match: (Lsh16x64 (Const16 [c]) (Const64 [d])) 12563 // cond: 12564 // result: (Const16 [int64(int16(c) << uint64(d))]) 12565 for { 12566 _ = v.Args[1] 12567 v_0 := v.Args[0] 12568 if v_0.Op != OpConst16 { 12569 break 12570 } 12571 c := v_0.AuxInt 12572 v_1 := v.Args[1] 12573 if v_1.Op != OpConst64 { 12574 break 12575 } 12576 d := v_1.AuxInt 12577 v.reset(OpConst16) 12578 v.AuxInt = int64(int16(c) << uint64(d)) 12579 return true 12580 } 12581 // match: (Lsh16x64 x (Const64 [0])) 12582 // cond: 12583 // result: x 12584 for { 12585 _ = v.Args[1] 12586 x := v.Args[0] 12587 v_1 := v.Args[1] 12588 if v_1.Op != OpConst64 { 12589 break 12590 } 12591 if v_1.AuxInt != 0 { 12592 break 12593 } 12594 v.reset(OpCopy) 12595 v.Type = x.Type 12596 v.AddArg(x) 12597 return true 12598 } 12599 // match: (Lsh16x64 (Const16 [0]) _) 12600 // cond: 12601 // result: (Const16 [0]) 12602 for { 12603 _ = v.Args[1] 12604 v_0 := v.Args[0] 12605 if v_0.Op != OpConst16 { 12606 break 12607 } 12608 if v_0.AuxInt != 0 { 12609 break 12610 } 12611 v.reset(OpConst16) 12612 v.AuxInt = 0 12613 return true 12614 } 12615 // match: (Lsh16x64 _ (Const64 [c])) 12616 // cond: uint64(c) >= 16 12617 // result: (Const16 [0]) 12618 for { 12619 _ = v.Args[1] 12620 v_1 := v.Args[1] 12621 if v_1.Op != OpConst64 { 12622 break 12623 } 12624 c := v_1.AuxInt 12625 if !(uint64(c) >= 16) { 12626 break 12627 } 12628 v.reset(OpConst16) 12629 v.AuxInt = 0 12630 return true 12631 } 12632 // match: (Lsh16x64 <t> (Lsh16x64 x (Const64 [c])) (Const64 [d])) 12633 // cond: !uaddOvf(c,d) 12634 // result: (Lsh16x64 x (Const64 <t> [c+d])) 12635 for { 12636 t := v.Type 12637 _ = v.Args[1] 12638 v_0 := v.Args[0] 12639 if v_0.Op != OpLsh16x64 { 12640 break 12641 } 12642 _ = v_0.Args[1] 12643 x := v_0.Args[0] 12644 v_0_1 := v_0.Args[1] 12645 if v_0_1.Op != OpConst64 { 12646 break 12647 } 12648 c := v_0_1.AuxInt 12649 v_1 := v.Args[1] 12650 if v_1.Op != OpConst64 { 12651 break 12652 } 12653 d := v_1.AuxInt 12654 if !(!uaddOvf(c, d)) { 12655 break 12656 } 12657 v.reset(OpLsh16x64) 12658 v.AddArg(x) 12659 v0 := b.NewValue0(v.Pos, OpConst64, t) 12660 v0.AuxInt = c + d 12661 v.AddArg(v0) 12662 return true 12663 } 12664 // match: (Lsh16x64 (Rsh16Ux64 (Lsh16x64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 12665 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 12666 // result: (Lsh16x64 x (Const64 <typ.UInt64> [c1-c2+c3])) 12667 for { 12668 _ = v.Args[1] 12669 v_0 := v.Args[0] 12670 if v_0.Op != OpRsh16Ux64 { 12671 break 12672 } 12673 _ = v_0.Args[1] 12674 v_0_0 := v_0.Args[0] 12675 if v_0_0.Op != OpLsh16x64 { 12676 break 12677 } 12678 _ = v_0_0.Args[1] 12679 x := v_0_0.Args[0] 12680 v_0_0_1 := v_0_0.Args[1] 12681 if v_0_0_1.Op != OpConst64 { 12682 break 12683 } 12684 c1 := v_0_0_1.AuxInt 12685 v_0_1 := v_0.Args[1] 12686 if v_0_1.Op != OpConst64 { 12687 break 12688 } 12689 c2 := v_0_1.AuxInt 12690 v_1 := v.Args[1] 12691 if v_1.Op != OpConst64 { 12692 break 12693 } 12694 c3 := v_1.AuxInt 12695 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 12696 break 12697 } 12698 v.reset(OpLsh16x64) 12699 v.AddArg(x) 12700 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 12701 v0.AuxInt = c1 - c2 + c3 12702 v.AddArg(v0) 12703 return true 12704 } 12705 return false 12706 } 12707 func rewriteValuegeneric_OpLsh16x8_0(v *Value) bool { 12708 b := v.Block 12709 _ = b 12710 // match: (Lsh16x8 <t> x (Const8 [c])) 12711 // cond: 12712 // result: (Lsh16x64 x (Const64 <t> [int64(uint8(c))])) 12713 for { 12714 t := v.Type 12715 _ = v.Args[1] 12716 x := v.Args[0] 12717 v_1 := v.Args[1] 12718 if v_1.Op != OpConst8 { 12719 break 12720 } 12721 c := v_1.AuxInt 12722 v.reset(OpLsh16x64) 12723 v.AddArg(x) 12724 v0 := b.NewValue0(v.Pos, OpConst64, t) 12725 v0.AuxInt = int64(uint8(c)) 12726 v.AddArg(v0) 12727 return true 12728 } 12729 // match: (Lsh16x8 (Const16 [0]) _) 12730 // cond: 12731 // result: (Const16 [0]) 12732 for { 12733 _ = v.Args[1] 12734 v_0 := v.Args[0] 12735 if v_0.Op != OpConst16 { 12736 break 12737 } 12738 if v_0.AuxInt != 0 { 12739 break 12740 } 12741 v.reset(OpConst16) 12742 v.AuxInt = 0 12743 return true 12744 } 12745 return false 12746 } 12747 func rewriteValuegeneric_OpLsh32x16_0(v *Value) bool { 12748 b := v.Block 12749 _ = b 12750 // match: (Lsh32x16 <t> x (Const16 [c])) 12751 // cond: 12752 // result: (Lsh32x64 x (Const64 <t> [int64(uint16(c))])) 12753 for { 12754 t := v.Type 12755 _ = v.Args[1] 12756 x := v.Args[0] 12757 v_1 := v.Args[1] 12758 if v_1.Op != OpConst16 { 12759 break 12760 } 12761 c := v_1.AuxInt 12762 v.reset(OpLsh32x64) 12763 v.AddArg(x) 12764 v0 := b.NewValue0(v.Pos, OpConst64, t) 12765 v0.AuxInt = int64(uint16(c)) 12766 v.AddArg(v0) 12767 return true 12768 } 12769 // match: (Lsh32x16 (Const32 [0]) _) 12770 // cond: 12771 // result: (Const32 [0]) 12772 for { 12773 _ = v.Args[1] 12774 v_0 := v.Args[0] 12775 if v_0.Op != OpConst32 { 12776 break 12777 } 12778 if v_0.AuxInt != 0 { 12779 break 12780 } 12781 v.reset(OpConst32) 12782 v.AuxInt = 0 12783 return true 12784 } 12785 return false 12786 } 12787 func rewriteValuegeneric_OpLsh32x32_0(v *Value) bool { 12788 b := v.Block 12789 _ = b 12790 // match: (Lsh32x32 <t> x (Const32 [c])) 12791 // cond: 12792 // result: (Lsh32x64 x (Const64 <t> [int64(uint32(c))])) 12793 for { 12794 t := v.Type 12795 _ = v.Args[1] 12796 x := v.Args[0] 12797 v_1 := v.Args[1] 12798 if v_1.Op != OpConst32 { 12799 break 12800 } 12801 c := v_1.AuxInt 12802 v.reset(OpLsh32x64) 12803 v.AddArg(x) 12804 v0 := b.NewValue0(v.Pos, OpConst64, t) 12805 v0.AuxInt = int64(uint32(c)) 12806 v.AddArg(v0) 12807 return true 12808 } 12809 // match: (Lsh32x32 (Const32 [0]) _) 12810 // cond: 12811 // result: (Const32 [0]) 12812 for { 12813 _ = v.Args[1] 12814 v_0 := v.Args[0] 12815 if v_0.Op != OpConst32 { 12816 break 12817 } 12818 if v_0.AuxInt != 0 { 12819 break 12820 } 12821 v.reset(OpConst32) 12822 v.AuxInt = 0 12823 return true 12824 } 12825 return false 12826 } 12827 func rewriteValuegeneric_OpLsh32x64_0(v *Value) bool { 12828 b := v.Block 12829 _ = b 12830 typ := &b.Func.Config.Types 12831 _ = typ 12832 // match: (Lsh32x64 (Const32 [c]) (Const64 [d])) 12833 // cond: 12834 // result: (Const32 [int64(int32(c) << uint64(d))]) 12835 for { 12836 _ = v.Args[1] 12837 v_0 := v.Args[0] 12838 if v_0.Op != OpConst32 { 12839 break 12840 } 12841 c := v_0.AuxInt 12842 v_1 := v.Args[1] 12843 if v_1.Op != OpConst64 { 12844 break 12845 } 12846 d := v_1.AuxInt 12847 v.reset(OpConst32) 12848 v.AuxInt = int64(int32(c) << uint64(d)) 12849 return true 12850 } 12851 // match: (Lsh32x64 x (Const64 [0])) 12852 // cond: 12853 // result: x 12854 for { 12855 _ = v.Args[1] 12856 x := v.Args[0] 12857 v_1 := v.Args[1] 12858 if v_1.Op != OpConst64 { 12859 break 12860 } 12861 if v_1.AuxInt != 0 { 12862 break 12863 } 12864 v.reset(OpCopy) 12865 v.Type = x.Type 12866 v.AddArg(x) 12867 return true 12868 } 12869 // match: (Lsh32x64 (Const32 [0]) _) 12870 // cond: 12871 // result: (Const32 [0]) 12872 for { 12873 _ = v.Args[1] 12874 v_0 := v.Args[0] 12875 if v_0.Op != OpConst32 { 12876 break 12877 } 12878 if v_0.AuxInt != 0 { 12879 break 12880 } 12881 v.reset(OpConst32) 12882 v.AuxInt = 0 12883 return true 12884 } 12885 // match: (Lsh32x64 _ (Const64 [c])) 12886 // cond: uint64(c) >= 32 12887 // result: (Const32 [0]) 12888 for { 12889 _ = v.Args[1] 12890 v_1 := v.Args[1] 12891 if v_1.Op != OpConst64 { 12892 break 12893 } 12894 c := v_1.AuxInt 12895 if !(uint64(c) >= 32) { 12896 break 12897 } 12898 v.reset(OpConst32) 12899 v.AuxInt = 0 12900 return true 12901 } 12902 // match: (Lsh32x64 <t> (Lsh32x64 x (Const64 [c])) (Const64 [d])) 12903 // cond: !uaddOvf(c,d) 12904 // result: (Lsh32x64 x (Const64 <t> [c+d])) 12905 for { 12906 t := v.Type 12907 _ = v.Args[1] 12908 v_0 := v.Args[0] 12909 if v_0.Op != OpLsh32x64 { 12910 break 12911 } 12912 _ = v_0.Args[1] 12913 x := v_0.Args[0] 12914 v_0_1 := v_0.Args[1] 12915 if v_0_1.Op != OpConst64 { 12916 break 12917 } 12918 c := v_0_1.AuxInt 12919 v_1 := v.Args[1] 12920 if v_1.Op != OpConst64 { 12921 break 12922 } 12923 d := v_1.AuxInt 12924 if !(!uaddOvf(c, d)) { 12925 break 12926 } 12927 v.reset(OpLsh32x64) 12928 v.AddArg(x) 12929 v0 := b.NewValue0(v.Pos, OpConst64, t) 12930 v0.AuxInt = c + d 12931 v.AddArg(v0) 12932 return true 12933 } 12934 // match: (Lsh32x64 (Rsh32Ux64 (Lsh32x64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 12935 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 12936 // result: (Lsh32x64 x (Const64 <typ.UInt64> [c1-c2+c3])) 12937 for { 12938 _ = v.Args[1] 12939 v_0 := v.Args[0] 12940 if v_0.Op != OpRsh32Ux64 { 12941 break 12942 } 12943 _ = v_0.Args[1] 12944 v_0_0 := v_0.Args[0] 12945 if v_0_0.Op != OpLsh32x64 { 12946 break 12947 } 12948 _ = v_0_0.Args[1] 12949 x := v_0_0.Args[0] 12950 v_0_0_1 := v_0_0.Args[1] 12951 if v_0_0_1.Op != OpConst64 { 12952 break 12953 } 12954 c1 := v_0_0_1.AuxInt 12955 v_0_1 := v_0.Args[1] 12956 if v_0_1.Op != OpConst64 { 12957 break 12958 } 12959 c2 := v_0_1.AuxInt 12960 v_1 := v.Args[1] 12961 if v_1.Op != OpConst64 { 12962 break 12963 } 12964 c3 := v_1.AuxInt 12965 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 12966 break 12967 } 12968 v.reset(OpLsh32x64) 12969 v.AddArg(x) 12970 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 12971 v0.AuxInt = c1 - c2 + c3 12972 v.AddArg(v0) 12973 return true 12974 } 12975 return false 12976 } 12977 func rewriteValuegeneric_OpLsh32x8_0(v *Value) bool { 12978 b := v.Block 12979 _ = b 12980 // match: (Lsh32x8 <t> x (Const8 [c])) 12981 // cond: 12982 // result: (Lsh32x64 x (Const64 <t> [int64(uint8(c))])) 12983 for { 12984 t := v.Type 12985 _ = v.Args[1] 12986 x := v.Args[0] 12987 v_1 := v.Args[1] 12988 if v_1.Op != OpConst8 { 12989 break 12990 } 12991 c := v_1.AuxInt 12992 v.reset(OpLsh32x64) 12993 v.AddArg(x) 12994 v0 := b.NewValue0(v.Pos, OpConst64, t) 12995 v0.AuxInt = int64(uint8(c)) 12996 v.AddArg(v0) 12997 return true 12998 } 12999 // match: (Lsh32x8 (Const32 [0]) _) 13000 // cond: 13001 // result: (Const32 [0]) 13002 for { 13003 _ = v.Args[1] 13004 v_0 := v.Args[0] 13005 if v_0.Op != OpConst32 { 13006 break 13007 } 13008 if v_0.AuxInt != 0 { 13009 break 13010 } 13011 v.reset(OpConst32) 13012 v.AuxInt = 0 13013 return true 13014 } 13015 return false 13016 } 13017 func rewriteValuegeneric_OpLsh64x16_0(v *Value) bool { 13018 b := v.Block 13019 _ = b 13020 // match: (Lsh64x16 <t> x (Const16 [c])) 13021 // cond: 13022 // result: (Lsh64x64 x (Const64 <t> [int64(uint16(c))])) 13023 for { 13024 t := v.Type 13025 _ = v.Args[1] 13026 x := v.Args[0] 13027 v_1 := v.Args[1] 13028 if v_1.Op != OpConst16 { 13029 break 13030 } 13031 c := v_1.AuxInt 13032 v.reset(OpLsh64x64) 13033 v.AddArg(x) 13034 v0 := b.NewValue0(v.Pos, OpConst64, t) 13035 v0.AuxInt = int64(uint16(c)) 13036 v.AddArg(v0) 13037 return true 13038 } 13039 // match: (Lsh64x16 (Const64 [0]) _) 13040 // cond: 13041 // result: (Const64 [0]) 13042 for { 13043 _ = v.Args[1] 13044 v_0 := v.Args[0] 13045 if v_0.Op != OpConst64 { 13046 break 13047 } 13048 if v_0.AuxInt != 0 { 13049 break 13050 } 13051 v.reset(OpConst64) 13052 v.AuxInt = 0 13053 return true 13054 } 13055 return false 13056 } 13057 func rewriteValuegeneric_OpLsh64x32_0(v *Value) bool { 13058 b := v.Block 13059 _ = b 13060 // match: (Lsh64x32 <t> x (Const32 [c])) 13061 // cond: 13062 // result: (Lsh64x64 x (Const64 <t> [int64(uint32(c))])) 13063 for { 13064 t := v.Type 13065 _ = v.Args[1] 13066 x := v.Args[0] 13067 v_1 := v.Args[1] 13068 if v_1.Op != OpConst32 { 13069 break 13070 } 13071 c := v_1.AuxInt 13072 v.reset(OpLsh64x64) 13073 v.AddArg(x) 13074 v0 := b.NewValue0(v.Pos, OpConst64, t) 13075 v0.AuxInt = int64(uint32(c)) 13076 v.AddArg(v0) 13077 return true 13078 } 13079 // match: (Lsh64x32 (Const64 [0]) _) 13080 // cond: 13081 // result: (Const64 [0]) 13082 for { 13083 _ = v.Args[1] 13084 v_0 := v.Args[0] 13085 if v_0.Op != OpConst64 { 13086 break 13087 } 13088 if v_0.AuxInt != 0 { 13089 break 13090 } 13091 v.reset(OpConst64) 13092 v.AuxInt = 0 13093 return true 13094 } 13095 return false 13096 } 13097 func rewriteValuegeneric_OpLsh64x64_0(v *Value) bool { 13098 b := v.Block 13099 _ = b 13100 typ := &b.Func.Config.Types 13101 _ = typ 13102 // match: (Lsh64x64 (Const64 [c]) (Const64 [d])) 13103 // cond: 13104 // result: (Const64 [c << uint64(d)]) 13105 for { 13106 _ = v.Args[1] 13107 v_0 := v.Args[0] 13108 if v_0.Op != OpConst64 { 13109 break 13110 } 13111 c := v_0.AuxInt 13112 v_1 := v.Args[1] 13113 if v_1.Op != OpConst64 { 13114 break 13115 } 13116 d := v_1.AuxInt 13117 v.reset(OpConst64) 13118 v.AuxInt = c << uint64(d) 13119 return true 13120 } 13121 // match: (Lsh64x64 x (Const64 [0])) 13122 // cond: 13123 // result: x 13124 for { 13125 _ = v.Args[1] 13126 x := v.Args[0] 13127 v_1 := v.Args[1] 13128 if v_1.Op != OpConst64 { 13129 break 13130 } 13131 if v_1.AuxInt != 0 { 13132 break 13133 } 13134 v.reset(OpCopy) 13135 v.Type = x.Type 13136 v.AddArg(x) 13137 return true 13138 } 13139 // match: (Lsh64x64 (Const64 [0]) _) 13140 // cond: 13141 // result: (Const64 [0]) 13142 for { 13143 _ = v.Args[1] 13144 v_0 := v.Args[0] 13145 if v_0.Op != OpConst64 { 13146 break 13147 } 13148 if v_0.AuxInt != 0 { 13149 break 13150 } 13151 v.reset(OpConst64) 13152 v.AuxInt = 0 13153 return true 13154 } 13155 // match: (Lsh64x64 _ (Const64 [c])) 13156 // cond: uint64(c) >= 64 13157 // result: (Const64 [0]) 13158 for { 13159 _ = v.Args[1] 13160 v_1 := v.Args[1] 13161 if v_1.Op != OpConst64 { 13162 break 13163 } 13164 c := v_1.AuxInt 13165 if !(uint64(c) >= 64) { 13166 break 13167 } 13168 v.reset(OpConst64) 13169 v.AuxInt = 0 13170 return true 13171 } 13172 // match: (Lsh64x64 <t> (Lsh64x64 x (Const64 [c])) (Const64 [d])) 13173 // cond: !uaddOvf(c,d) 13174 // result: (Lsh64x64 x (Const64 <t> [c+d])) 13175 for { 13176 t := v.Type 13177 _ = v.Args[1] 13178 v_0 := v.Args[0] 13179 if v_0.Op != OpLsh64x64 { 13180 break 13181 } 13182 _ = v_0.Args[1] 13183 x := v_0.Args[0] 13184 v_0_1 := v_0.Args[1] 13185 if v_0_1.Op != OpConst64 { 13186 break 13187 } 13188 c := v_0_1.AuxInt 13189 v_1 := v.Args[1] 13190 if v_1.Op != OpConst64 { 13191 break 13192 } 13193 d := v_1.AuxInt 13194 if !(!uaddOvf(c, d)) { 13195 break 13196 } 13197 v.reset(OpLsh64x64) 13198 v.AddArg(x) 13199 v0 := b.NewValue0(v.Pos, OpConst64, t) 13200 v0.AuxInt = c + d 13201 v.AddArg(v0) 13202 return true 13203 } 13204 // match: (Lsh64x64 (Rsh64Ux64 (Lsh64x64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 13205 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 13206 // result: (Lsh64x64 x (Const64 <typ.UInt64> [c1-c2+c3])) 13207 for { 13208 _ = v.Args[1] 13209 v_0 := v.Args[0] 13210 if v_0.Op != OpRsh64Ux64 { 13211 break 13212 } 13213 _ = v_0.Args[1] 13214 v_0_0 := v_0.Args[0] 13215 if v_0_0.Op != OpLsh64x64 { 13216 break 13217 } 13218 _ = v_0_0.Args[1] 13219 x := v_0_0.Args[0] 13220 v_0_0_1 := v_0_0.Args[1] 13221 if v_0_0_1.Op != OpConst64 { 13222 break 13223 } 13224 c1 := v_0_0_1.AuxInt 13225 v_0_1 := v_0.Args[1] 13226 if v_0_1.Op != OpConst64 { 13227 break 13228 } 13229 c2 := v_0_1.AuxInt 13230 v_1 := v.Args[1] 13231 if v_1.Op != OpConst64 { 13232 break 13233 } 13234 c3 := v_1.AuxInt 13235 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 13236 break 13237 } 13238 v.reset(OpLsh64x64) 13239 v.AddArg(x) 13240 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 13241 v0.AuxInt = c1 - c2 + c3 13242 v.AddArg(v0) 13243 return true 13244 } 13245 return false 13246 } 13247 func rewriteValuegeneric_OpLsh64x8_0(v *Value) bool { 13248 b := v.Block 13249 _ = b 13250 // match: (Lsh64x8 <t> x (Const8 [c])) 13251 // cond: 13252 // result: (Lsh64x64 x (Const64 <t> [int64(uint8(c))])) 13253 for { 13254 t := v.Type 13255 _ = v.Args[1] 13256 x := v.Args[0] 13257 v_1 := v.Args[1] 13258 if v_1.Op != OpConst8 { 13259 break 13260 } 13261 c := v_1.AuxInt 13262 v.reset(OpLsh64x64) 13263 v.AddArg(x) 13264 v0 := b.NewValue0(v.Pos, OpConst64, t) 13265 v0.AuxInt = int64(uint8(c)) 13266 v.AddArg(v0) 13267 return true 13268 } 13269 // match: (Lsh64x8 (Const64 [0]) _) 13270 // cond: 13271 // result: (Const64 [0]) 13272 for { 13273 _ = v.Args[1] 13274 v_0 := v.Args[0] 13275 if v_0.Op != OpConst64 { 13276 break 13277 } 13278 if v_0.AuxInt != 0 { 13279 break 13280 } 13281 v.reset(OpConst64) 13282 v.AuxInt = 0 13283 return true 13284 } 13285 return false 13286 } 13287 func rewriteValuegeneric_OpLsh8x16_0(v *Value) bool { 13288 b := v.Block 13289 _ = b 13290 // match: (Lsh8x16 <t> x (Const16 [c])) 13291 // cond: 13292 // result: (Lsh8x64 x (Const64 <t> [int64(uint16(c))])) 13293 for { 13294 t := v.Type 13295 _ = v.Args[1] 13296 x := v.Args[0] 13297 v_1 := v.Args[1] 13298 if v_1.Op != OpConst16 { 13299 break 13300 } 13301 c := v_1.AuxInt 13302 v.reset(OpLsh8x64) 13303 v.AddArg(x) 13304 v0 := b.NewValue0(v.Pos, OpConst64, t) 13305 v0.AuxInt = int64(uint16(c)) 13306 v.AddArg(v0) 13307 return true 13308 } 13309 // match: (Lsh8x16 (Const8 [0]) _) 13310 // cond: 13311 // result: (Const8 [0]) 13312 for { 13313 _ = v.Args[1] 13314 v_0 := v.Args[0] 13315 if v_0.Op != OpConst8 { 13316 break 13317 } 13318 if v_0.AuxInt != 0 { 13319 break 13320 } 13321 v.reset(OpConst8) 13322 v.AuxInt = 0 13323 return true 13324 } 13325 return false 13326 } 13327 func rewriteValuegeneric_OpLsh8x32_0(v *Value) bool { 13328 b := v.Block 13329 _ = b 13330 // match: (Lsh8x32 <t> x (Const32 [c])) 13331 // cond: 13332 // result: (Lsh8x64 x (Const64 <t> [int64(uint32(c))])) 13333 for { 13334 t := v.Type 13335 _ = v.Args[1] 13336 x := v.Args[0] 13337 v_1 := v.Args[1] 13338 if v_1.Op != OpConst32 { 13339 break 13340 } 13341 c := v_1.AuxInt 13342 v.reset(OpLsh8x64) 13343 v.AddArg(x) 13344 v0 := b.NewValue0(v.Pos, OpConst64, t) 13345 v0.AuxInt = int64(uint32(c)) 13346 v.AddArg(v0) 13347 return true 13348 } 13349 // match: (Lsh8x32 (Const8 [0]) _) 13350 // cond: 13351 // result: (Const8 [0]) 13352 for { 13353 _ = v.Args[1] 13354 v_0 := v.Args[0] 13355 if v_0.Op != OpConst8 { 13356 break 13357 } 13358 if v_0.AuxInt != 0 { 13359 break 13360 } 13361 v.reset(OpConst8) 13362 v.AuxInt = 0 13363 return true 13364 } 13365 return false 13366 } 13367 func rewriteValuegeneric_OpLsh8x64_0(v *Value) bool { 13368 b := v.Block 13369 _ = b 13370 typ := &b.Func.Config.Types 13371 _ = typ 13372 // match: (Lsh8x64 (Const8 [c]) (Const64 [d])) 13373 // cond: 13374 // result: (Const8 [int64(int8(c) << uint64(d))]) 13375 for { 13376 _ = v.Args[1] 13377 v_0 := v.Args[0] 13378 if v_0.Op != OpConst8 { 13379 break 13380 } 13381 c := v_0.AuxInt 13382 v_1 := v.Args[1] 13383 if v_1.Op != OpConst64 { 13384 break 13385 } 13386 d := v_1.AuxInt 13387 v.reset(OpConst8) 13388 v.AuxInt = int64(int8(c) << uint64(d)) 13389 return true 13390 } 13391 // match: (Lsh8x64 x (Const64 [0])) 13392 // cond: 13393 // result: x 13394 for { 13395 _ = v.Args[1] 13396 x := v.Args[0] 13397 v_1 := v.Args[1] 13398 if v_1.Op != OpConst64 { 13399 break 13400 } 13401 if v_1.AuxInt != 0 { 13402 break 13403 } 13404 v.reset(OpCopy) 13405 v.Type = x.Type 13406 v.AddArg(x) 13407 return true 13408 } 13409 // match: (Lsh8x64 (Const8 [0]) _) 13410 // cond: 13411 // result: (Const8 [0]) 13412 for { 13413 _ = v.Args[1] 13414 v_0 := v.Args[0] 13415 if v_0.Op != OpConst8 { 13416 break 13417 } 13418 if v_0.AuxInt != 0 { 13419 break 13420 } 13421 v.reset(OpConst8) 13422 v.AuxInt = 0 13423 return true 13424 } 13425 // match: (Lsh8x64 _ (Const64 [c])) 13426 // cond: uint64(c) >= 8 13427 // result: (Const8 [0]) 13428 for { 13429 _ = v.Args[1] 13430 v_1 := v.Args[1] 13431 if v_1.Op != OpConst64 { 13432 break 13433 } 13434 c := v_1.AuxInt 13435 if !(uint64(c) >= 8) { 13436 break 13437 } 13438 v.reset(OpConst8) 13439 v.AuxInt = 0 13440 return true 13441 } 13442 // match: (Lsh8x64 <t> (Lsh8x64 x (Const64 [c])) (Const64 [d])) 13443 // cond: !uaddOvf(c,d) 13444 // result: (Lsh8x64 x (Const64 <t> [c+d])) 13445 for { 13446 t := v.Type 13447 _ = v.Args[1] 13448 v_0 := v.Args[0] 13449 if v_0.Op != OpLsh8x64 { 13450 break 13451 } 13452 _ = v_0.Args[1] 13453 x := v_0.Args[0] 13454 v_0_1 := v_0.Args[1] 13455 if v_0_1.Op != OpConst64 { 13456 break 13457 } 13458 c := v_0_1.AuxInt 13459 v_1 := v.Args[1] 13460 if v_1.Op != OpConst64 { 13461 break 13462 } 13463 d := v_1.AuxInt 13464 if !(!uaddOvf(c, d)) { 13465 break 13466 } 13467 v.reset(OpLsh8x64) 13468 v.AddArg(x) 13469 v0 := b.NewValue0(v.Pos, OpConst64, t) 13470 v0.AuxInt = c + d 13471 v.AddArg(v0) 13472 return true 13473 } 13474 // match: (Lsh8x64 (Rsh8Ux64 (Lsh8x64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 13475 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 13476 // result: (Lsh8x64 x (Const64 <typ.UInt64> [c1-c2+c3])) 13477 for { 13478 _ = v.Args[1] 13479 v_0 := v.Args[0] 13480 if v_0.Op != OpRsh8Ux64 { 13481 break 13482 } 13483 _ = v_0.Args[1] 13484 v_0_0 := v_0.Args[0] 13485 if v_0_0.Op != OpLsh8x64 { 13486 break 13487 } 13488 _ = v_0_0.Args[1] 13489 x := v_0_0.Args[0] 13490 v_0_0_1 := v_0_0.Args[1] 13491 if v_0_0_1.Op != OpConst64 { 13492 break 13493 } 13494 c1 := v_0_0_1.AuxInt 13495 v_0_1 := v_0.Args[1] 13496 if v_0_1.Op != OpConst64 { 13497 break 13498 } 13499 c2 := v_0_1.AuxInt 13500 v_1 := v.Args[1] 13501 if v_1.Op != OpConst64 { 13502 break 13503 } 13504 c3 := v_1.AuxInt 13505 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 13506 break 13507 } 13508 v.reset(OpLsh8x64) 13509 v.AddArg(x) 13510 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 13511 v0.AuxInt = c1 - c2 + c3 13512 v.AddArg(v0) 13513 return true 13514 } 13515 return false 13516 } 13517 func rewriteValuegeneric_OpLsh8x8_0(v *Value) bool { 13518 b := v.Block 13519 _ = b 13520 // match: (Lsh8x8 <t> x (Const8 [c])) 13521 // cond: 13522 // result: (Lsh8x64 x (Const64 <t> [int64(uint8(c))])) 13523 for { 13524 t := v.Type 13525 _ = v.Args[1] 13526 x := v.Args[0] 13527 v_1 := v.Args[1] 13528 if v_1.Op != OpConst8 { 13529 break 13530 } 13531 c := v_1.AuxInt 13532 v.reset(OpLsh8x64) 13533 v.AddArg(x) 13534 v0 := b.NewValue0(v.Pos, OpConst64, t) 13535 v0.AuxInt = int64(uint8(c)) 13536 v.AddArg(v0) 13537 return true 13538 } 13539 // match: (Lsh8x8 (Const8 [0]) _) 13540 // cond: 13541 // result: (Const8 [0]) 13542 for { 13543 _ = v.Args[1] 13544 v_0 := v.Args[0] 13545 if v_0.Op != OpConst8 { 13546 break 13547 } 13548 if v_0.AuxInt != 0 { 13549 break 13550 } 13551 v.reset(OpConst8) 13552 v.AuxInt = 0 13553 return true 13554 } 13555 return false 13556 } 13557 func rewriteValuegeneric_OpMod16_0(v *Value) bool { 13558 b := v.Block 13559 _ = b 13560 // match: (Mod16 (Const16 [c]) (Const16 [d])) 13561 // cond: d != 0 13562 // result: (Const16 [int64(int16(c % d))]) 13563 for { 13564 _ = v.Args[1] 13565 v_0 := v.Args[0] 13566 if v_0.Op != OpConst16 { 13567 break 13568 } 13569 c := v_0.AuxInt 13570 v_1 := v.Args[1] 13571 if v_1.Op != OpConst16 { 13572 break 13573 } 13574 d := v_1.AuxInt 13575 if !(d != 0) { 13576 break 13577 } 13578 v.reset(OpConst16) 13579 v.AuxInt = int64(int16(c % d)) 13580 return true 13581 } 13582 // match: (Mod16 <t> n (Const16 [c])) 13583 // cond: isNonNegative(n) && isPowerOfTwo(c&0xffff) 13584 // result: (And16 n (Const16 <t> [(c&0xffff)-1])) 13585 for { 13586 t := v.Type 13587 _ = v.Args[1] 13588 n := v.Args[0] 13589 v_1 := v.Args[1] 13590 if v_1.Op != OpConst16 { 13591 break 13592 } 13593 c := v_1.AuxInt 13594 if !(isNonNegative(n) && isPowerOfTwo(c&0xffff)) { 13595 break 13596 } 13597 v.reset(OpAnd16) 13598 v.AddArg(n) 13599 v0 := b.NewValue0(v.Pos, OpConst16, t) 13600 v0.AuxInt = (c & 0xffff) - 1 13601 v.AddArg(v0) 13602 return true 13603 } 13604 // match: (Mod16 <t> n (Const16 [c])) 13605 // cond: c < 0 && c != -1<<15 13606 // result: (Mod16 <t> n (Const16 <t> [-c])) 13607 for { 13608 t := v.Type 13609 _ = v.Args[1] 13610 n := v.Args[0] 13611 v_1 := v.Args[1] 13612 if v_1.Op != OpConst16 { 13613 break 13614 } 13615 c := v_1.AuxInt 13616 if !(c < 0 && c != -1<<15) { 13617 break 13618 } 13619 v.reset(OpMod16) 13620 v.Type = t 13621 v.AddArg(n) 13622 v0 := b.NewValue0(v.Pos, OpConst16, t) 13623 v0.AuxInt = -c 13624 v.AddArg(v0) 13625 return true 13626 } 13627 // match: (Mod16 <t> x (Const16 [c])) 13628 // cond: x.Op != OpConst16 && (c > 0 || c == -1<<15) 13629 // result: (Sub16 x (Mul16 <t> (Div16 <t> x (Const16 <t> [c])) (Const16 <t> [c]))) 13630 for { 13631 t := v.Type 13632 _ = v.Args[1] 13633 x := v.Args[0] 13634 v_1 := v.Args[1] 13635 if v_1.Op != OpConst16 { 13636 break 13637 } 13638 c := v_1.AuxInt 13639 if !(x.Op != OpConst16 && (c > 0 || c == -1<<15)) { 13640 break 13641 } 13642 v.reset(OpSub16) 13643 v.AddArg(x) 13644 v0 := b.NewValue0(v.Pos, OpMul16, t) 13645 v1 := b.NewValue0(v.Pos, OpDiv16, t) 13646 v1.AddArg(x) 13647 v2 := b.NewValue0(v.Pos, OpConst16, t) 13648 v2.AuxInt = c 13649 v1.AddArg(v2) 13650 v0.AddArg(v1) 13651 v3 := b.NewValue0(v.Pos, OpConst16, t) 13652 v3.AuxInt = c 13653 v0.AddArg(v3) 13654 v.AddArg(v0) 13655 return true 13656 } 13657 return false 13658 } 13659 func rewriteValuegeneric_OpMod16u_0(v *Value) bool { 13660 b := v.Block 13661 _ = b 13662 // match: (Mod16u (Const16 [c]) (Const16 [d])) 13663 // cond: d != 0 13664 // result: (Const16 [int64(uint16(c) % uint16(d))]) 13665 for { 13666 _ = v.Args[1] 13667 v_0 := v.Args[0] 13668 if v_0.Op != OpConst16 { 13669 break 13670 } 13671 c := v_0.AuxInt 13672 v_1 := v.Args[1] 13673 if v_1.Op != OpConst16 { 13674 break 13675 } 13676 d := v_1.AuxInt 13677 if !(d != 0) { 13678 break 13679 } 13680 v.reset(OpConst16) 13681 v.AuxInt = int64(uint16(c) % uint16(d)) 13682 return true 13683 } 13684 // match: (Mod16u <t> n (Const16 [c])) 13685 // cond: isPowerOfTwo(c&0xffff) 13686 // result: (And16 n (Const16 <t> [(c&0xffff)-1])) 13687 for { 13688 t := v.Type 13689 _ = v.Args[1] 13690 n := v.Args[0] 13691 v_1 := v.Args[1] 13692 if v_1.Op != OpConst16 { 13693 break 13694 } 13695 c := v_1.AuxInt 13696 if !(isPowerOfTwo(c & 0xffff)) { 13697 break 13698 } 13699 v.reset(OpAnd16) 13700 v.AddArg(n) 13701 v0 := b.NewValue0(v.Pos, OpConst16, t) 13702 v0.AuxInt = (c & 0xffff) - 1 13703 v.AddArg(v0) 13704 return true 13705 } 13706 // match: (Mod16u <t> x (Const16 [c])) 13707 // cond: x.Op != OpConst16 && c > 0 && umagicOK(16,c) 13708 // result: (Sub16 x (Mul16 <t> (Div16u <t> x (Const16 <t> [c])) (Const16 <t> [c]))) 13709 for { 13710 t := v.Type 13711 _ = v.Args[1] 13712 x := v.Args[0] 13713 v_1 := v.Args[1] 13714 if v_1.Op != OpConst16 { 13715 break 13716 } 13717 c := v_1.AuxInt 13718 if !(x.Op != OpConst16 && c > 0 && umagicOK(16, c)) { 13719 break 13720 } 13721 v.reset(OpSub16) 13722 v.AddArg(x) 13723 v0 := b.NewValue0(v.Pos, OpMul16, t) 13724 v1 := b.NewValue0(v.Pos, OpDiv16u, t) 13725 v1.AddArg(x) 13726 v2 := b.NewValue0(v.Pos, OpConst16, t) 13727 v2.AuxInt = c 13728 v1.AddArg(v2) 13729 v0.AddArg(v1) 13730 v3 := b.NewValue0(v.Pos, OpConst16, t) 13731 v3.AuxInt = c 13732 v0.AddArg(v3) 13733 v.AddArg(v0) 13734 return true 13735 } 13736 return false 13737 } 13738 func rewriteValuegeneric_OpMod32_0(v *Value) bool { 13739 b := v.Block 13740 _ = b 13741 // match: (Mod32 (Const32 [c]) (Const32 [d])) 13742 // cond: d != 0 13743 // result: (Const32 [int64(int32(c % d))]) 13744 for { 13745 _ = v.Args[1] 13746 v_0 := v.Args[0] 13747 if v_0.Op != OpConst32 { 13748 break 13749 } 13750 c := v_0.AuxInt 13751 v_1 := v.Args[1] 13752 if v_1.Op != OpConst32 { 13753 break 13754 } 13755 d := v_1.AuxInt 13756 if !(d != 0) { 13757 break 13758 } 13759 v.reset(OpConst32) 13760 v.AuxInt = int64(int32(c % d)) 13761 return true 13762 } 13763 // match: (Mod32 <t> n (Const32 [c])) 13764 // cond: isNonNegative(n) && isPowerOfTwo(c&0xffffffff) 13765 // result: (And32 n (Const32 <t> [(c&0xffffffff)-1])) 13766 for { 13767 t := v.Type 13768 _ = v.Args[1] 13769 n := v.Args[0] 13770 v_1 := v.Args[1] 13771 if v_1.Op != OpConst32 { 13772 break 13773 } 13774 c := v_1.AuxInt 13775 if !(isNonNegative(n) && isPowerOfTwo(c&0xffffffff)) { 13776 break 13777 } 13778 v.reset(OpAnd32) 13779 v.AddArg(n) 13780 v0 := b.NewValue0(v.Pos, OpConst32, t) 13781 v0.AuxInt = (c & 0xffffffff) - 1 13782 v.AddArg(v0) 13783 return true 13784 } 13785 // match: (Mod32 <t> n (Const32 [c])) 13786 // cond: c < 0 && c != -1<<31 13787 // result: (Mod32 <t> n (Const32 <t> [-c])) 13788 for { 13789 t := v.Type 13790 _ = v.Args[1] 13791 n := v.Args[0] 13792 v_1 := v.Args[1] 13793 if v_1.Op != OpConst32 { 13794 break 13795 } 13796 c := v_1.AuxInt 13797 if !(c < 0 && c != -1<<31) { 13798 break 13799 } 13800 v.reset(OpMod32) 13801 v.Type = t 13802 v.AddArg(n) 13803 v0 := b.NewValue0(v.Pos, OpConst32, t) 13804 v0.AuxInt = -c 13805 v.AddArg(v0) 13806 return true 13807 } 13808 // match: (Mod32 <t> x (Const32 [c])) 13809 // cond: x.Op != OpConst32 && (c > 0 || c == -1<<31) 13810 // result: (Sub32 x (Mul32 <t> (Div32 <t> x (Const32 <t> [c])) (Const32 <t> [c]))) 13811 for { 13812 t := v.Type 13813 _ = v.Args[1] 13814 x := v.Args[0] 13815 v_1 := v.Args[1] 13816 if v_1.Op != OpConst32 { 13817 break 13818 } 13819 c := v_1.AuxInt 13820 if !(x.Op != OpConst32 && (c > 0 || c == -1<<31)) { 13821 break 13822 } 13823 v.reset(OpSub32) 13824 v.AddArg(x) 13825 v0 := b.NewValue0(v.Pos, OpMul32, t) 13826 v1 := b.NewValue0(v.Pos, OpDiv32, t) 13827 v1.AddArg(x) 13828 v2 := b.NewValue0(v.Pos, OpConst32, t) 13829 v2.AuxInt = c 13830 v1.AddArg(v2) 13831 v0.AddArg(v1) 13832 v3 := b.NewValue0(v.Pos, OpConst32, t) 13833 v3.AuxInt = c 13834 v0.AddArg(v3) 13835 v.AddArg(v0) 13836 return true 13837 } 13838 return false 13839 } 13840 func rewriteValuegeneric_OpMod32u_0(v *Value) bool { 13841 b := v.Block 13842 _ = b 13843 // match: (Mod32u (Const32 [c]) (Const32 [d])) 13844 // cond: d != 0 13845 // result: (Const32 [int64(uint32(c) % uint32(d))]) 13846 for { 13847 _ = v.Args[1] 13848 v_0 := v.Args[0] 13849 if v_0.Op != OpConst32 { 13850 break 13851 } 13852 c := v_0.AuxInt 13853 v_1 := v.Args[1] 13854 if v_1.Op != OpConst32 { 13855 break 13856 } 13857 d := v_1.AuxInt 13858 if !(d != 0) { 13859 break 13860 } 13861 v.reset(OpConst32) 13862 v.AuxInt = int64(uint32(c) % uint32(d)) 13863 return true 13864 } 13865 // match: (Mod32u <t> n (Const32 [c])) 13866 // cond: isPowerOfTwo(c&0xffffffff) 13867 // result: (And32 n (Const32 <t> [(c&0xffffffff)-1])) 13868 for { 13869 t := v.Type 13870 _ = v.Args[1] 13871 n := v.Args[0] 13872 v_1 := v.Args[1] 13873 if v_1.Op != OpConst32 { 13874 break 13875 } 13876 c := v_1.AuxInt 13877 if !(isPowerOfTwo(c & 0xffffffff)) { 13878 break 13879 } 13880 v.reset(OpAnd32) 13881 v.AddArg(n) 13882 v0 := b.NewValue0(v.Pos, OpConst32, t) 13883 v0.AuxInt = (c & 0xffffffff) - 1 13884 v.AddArg(v0) 13885 return true 13886 } 13887 // match: (Mod32u <t> x (Const32 [c])) 13888 // cond: x.Op != OpConst32 && c > 0 && umagicOK(32,c) 13889 // result: (Sub32 x (Mul32 <t> (Div32u <t> x (Const32 <t> [c])) (Const32 <t> [c]))) 13890 for { 13891 t := v.Type 13892 _ = v.Args[1] 13893 x := v.Args[0] 13894 v_1 := v.Args[1] 13895 if v_1.Op != OpConst32 { 13896 break 13897 } 13898 c := v_1.AuxInt 13899 if !(x.Op != OpConst32 && c > 0 && umagicOK(32, c)) { 13900 break 13901 } 13902 v.reset(OpSub32) 13903 v.AddArg(x) 13904 v0 := b.NewValue0(v.Pos, OpMul32, t) 13905 v1 := b.NewValue0(v.Pos, OpDiv32u, t) 13906 v1.AddArg(x) 13907 v2 := b.NewValue0(v.Pos, OpConst32, t) 13908 v2.AuxInt = c 13909 v1.AddArg(v2) 13910 v0.AddArg(v1) 13911 v3 := b.NewValue0(v.Pos, OpConst32, t) 13912 v3.AuxInt = c 13913 v0.AddArg(v3) 13914 v.AddArg(v0) 13915 return true 13916 } 13917 return false 13918 } 13919 func rewriteValuegeneric_OpMod64_0(v *Value) bool { 13920 b := v.Block 13921 _ = b 13922 // match: (Mod64 (Const64 [c]) (Const64 [d])) 13923 // cond: d != 0 13924 // result: (Const64 [c % d]) 13925 for { 13926 _ = v.Args[1] 13927 v_0 := v.Args[0] 13928 if v_0.Op != OpConst64 { 13929 break 13930 } 13931 c := v_0.AuxInt 13932 v_1 := v.Args[1] 13933 if v_1.Op != OpConst64 { 13934 break 13935 } 13936 d := v_1.AuxInt 13937 if !(d != 0) { 13938 break 13939 } 13940 v.reset(OpConst64) 13941 v.AuxInt = c % d 13942 return true 13943 } 13944 // match: (Mod64 <t> n (Const64 [c])) 13945 // cond: isNonNegative(n) && isPowerOfTwo(c) 13946 // result: (And64 n (Const64 <t> [c-1])) 13947 for { 13948 t := v.Type 13949 _ = v.Args[1] 13950 n := v.Args[0] 13951 v_1 := v.Args[1] 13952 if v_1.Op != OpConst64 { 13953 break 13954 } 13955 c := v_1.AuxInt 13956 if !(isNonNegative(n) && isPowerOfTwo(c)) { 13957 break 13958 } 13959 v.reset(OpAnd64) 13960 v.AddArg(n) 13961 v0 := b.NewValue0(v.Pos, OpConst64, t) 13962 v0.AuxInt = c - 1 13963 v.AddArg(v0) 13964 return true 13965 } 13966 // match: (Mod64 n (Const64 [-1<<63])) 13967 // cond: isNonNegative(n) 13968 // result: n 13969 for { 13970 _ = v.Args[1] 13971 n := v.Args[0] 13972 v_1 := v.Args[1] 13973 if v_1.Op != OpConst64 { 13974 break 13975 } 13976 if v_1.AuxInt != -1<<63 { 13977 break 13978 } 13979 if !(isNonNegative(n)) { 13980 break 13981 } 13982 v.reset(OpCopy) 13983 v.Type = n.Type 13984 v.AddArg(n) 13985 return true 13986 } 13987 // match: (Mod64 <t> n (Const64 [c])) 13988 // cond: c < 0 && c != -1<<63 13989 // result: (Mod64 <t> n (Const64 <t> [-c])) 13990 for { 13991 t := v.Type 13992 _ = v.Args[1] 13993 n := v.Args[0] 13994 v_1 := v.Args[1] 13995 if v_1.Op != OpConst64 { 13996 break 13997 } 13998 c := v_1.AuxInt 13999 if !(c < 0 && c != -1<<63) { 14000 break 14001 } 14002 v.reset(OpMod64) 14003 v.Type = t 14004 v.AddArg(n) 14005 v0 := b.NewValue0(v.Pos, OpConst64, t) 14006 v0.AuxInt = -c 14007 v.AddArg(v0) 14008 return true 14009 } 14010 // match: (Mod64 <t> x (Const64 [c])) 14011 // cond: x.Op != OpConst64 && (c > 0 || c == -1<<63) 14012 // result: (Sub64 x (Mul64 <t> (Div64 <t> x (Const64 <t> [c])) (Const64 <t> [c]))) 14013 for { 14014 t := v.Type 14015 _ = v.Args[1] 14016 x := v.Args[0] 14017 v_1 := v.Args[1] 14018 if v_1.Op != OpConst64 { 14019 break 14020 } 14021 c := v_1.AuxInt 14022 if !(x.Op != OpConst64 && (c > 0 || c == -1<<63)) { 14023 break 14024 } 14025 v.reset(OpSub64) 14026 v.AddArg(x) 14027 v0 := b.NewValue0(v.Pos, OpMul64, t) 14028 v1 := b.NewValue0(v.Pos, OpDiv64, t) 14029 v1.AddArg(x) 14030 v2 := b.NewValue0(v.Pos, OpConst64, t) 14031 v2.AuxInt = c 14032 v1.AddArg(v2) 14033 v0.AddArg(v1) 14034 v3 := b.NewValue0(v.Pos, OpConst64, t) 14035 v3.AuxInt = c 14036 v0.AddArg(v3) 14037 v.AddArg(v0) 14038 return true 14039 } 14040 return false 14041 } 14042 func rewriteValuegeneric_OpMod64u_0(v *Value) bool { 14043 b := v.Block 14044 _ = b 14045 // match: (Mod64u (Const64 [c]) (Const64 [d])) 14046 // cond: d != 0 14047 // result: (Const64 [int64(uint64(c) % uint64(d))]) 14048 for { 14049 _ = v.Args[1] 14050 v_0 := v.Args[0] 14051 if v_0.Op != OpConst64 { 14052 break 14053 } 14054 c := v_0.AuxInt 14055 v_1 := v.Args[1] 14056 if v_1.Op != OpConst64 { 14057 break 14058 } 14059 d := v_1.AuxInt 14060 if !(d != 0) { 14061 break 14062 } 14063 v.reset(OpConst64) 14064 v.AuxInt = int64(uint64(c) % uint64(d)) 14065 return true 14066 } 14067 // match: (Mod64u <t> n (Const64 [c])) 14068 // cond: isPowerOfTwo(c) 14069 // result: (And64 n (Const64 <t> [c-1])) 14070 for { 14071 t := v.Type 14072 _ = v.Args[1] 14073 n := v.Args[0] 14074 v_1 := v.Args[1] 14075 if v_1.Op != OpConst64 { 14076 break 14077 } 14078 c := v_1.AuxInt 14079 if !(isPowerOfTwo(c)) { 14080 break 14081 } 14082 v.reset(OpAnd64) 14083 v.AddArg(n) 14084 v0 := b.NewValue0(v.Pos, OpConst64, t) 14085 v0.AuxInt = c - 1 14086 v.AddArg(v0) 14087 return true 14088 } 14089 // match: (Mod64u <t> n (Const64 [-1<<63])) 14090 // cond: 14091 // result: (And64 n (Const64 <t> [1<<63-1])) 14092 for { 14093 t := v.Type 14094 _ = v.Args[1] 14095 n := v.Args[0] 14096 v_1 := v.Args[1] 14097 if v_1.Op != OpConst64 { 14098 break 14099 } 14100 if v_1.AuxInt != -1<<63 { 14101 break 14102 } 14103 v.reset(OpAnd64) 14104 v.AddArg(n) 14105 v0 := b.NewValue0(v.Pos, OpConst64, t) 14106 v0.AuxInt = 1<<63 - 1 14107 v.AddArg(v0) 14108 return true 14109 } 14110 // match: (Mod64u <t> x (Const64 [c])) 14111 // cond: x.Op != OpConst64 && c > 0 && umagicOK(64,c) 14112 // result: (Sub64 x (Mul64 <t> (Div64u <t> x (Const64 <t> [c])) (Const64 <t> [c]))) 14113 for { 14114 t := v.Type 14115 _ = v.Args[1] 14116 x := v.Args[0] 14117 v_1 := v.Args[1] 14118 if v_1.Op != OpConst64 { 14119 break 14120 } 14121 c := v_1.AuxInt 14122 if !(x.Op != OpConst64 && c > 0 && umagicOK(64, c)) { 14123 break 14124 } 14125 v.reset(OpSub64) 14126 v.AddArg(x) 14127 v0 := b.NewValue0(v.Pos, OpMul64, t) 14128 v1 := b.NewValue0(v.Pos, OpDiv64u, t) 14129 v1.AddArg(x) 14130 v2 := b.NewValue0(v.Pos, OpConst64, t) 14131 v2.AuxInt = c 14132 v1.AddArg(v2) 14133 v0.AddArg(v1) 14134 v3 := b.NewValue0(v.Pos, OpConst64, t) 14135 v3.AuxInt = c 14136 v0.AddArg(v3) 14137 v.AddArg(v0) 14138 return true 14139 } 14140 return false 14141 } 14142 func rewriteValuegeneric_OpMod8_0(v *Value) bool { 14143 b := v.Block 14144 _ = b 14145 // match: (Mod8 (Const8 [c]) (Const8 [d])) 14146 // cond: d != 0 14147 // result: (Const8 [int64(int8(c % d))]) 14148 for { 14149 _ = v.Args[1] 14150 v_0 := v.Args[0] 14151 if v_0.Op != OpConst8 { 14152 break 14153 } 14154 c := v_0.AuxInt 14155 v_1 := v.Args[1] 14156 if v_1.Op != OpConst8 { 14157 break 14158 } 14159 d := v_1.AuxInt 14160 if !(d != 0) { 14161 break 14162 } 14163 v.reset(OpConst8) 14164 v.AuxInt = int64(int8(c % d)) 14165 return true 14166 } 14167 // match: (Mod8 <t> n (Const8 [c])) 14168 // cond: isNonNegative(n) && isPowerOfTwo(c&0xff) 14169 // result: (And8 n (Const8 <t> [(c&0xff)-1])) 14170 for { 14171 t := v.Type 14172 _ = v.Args[1] 14173 n := v.Args[0] 14174 v_1 := v.Args[1] 14175 if v_1.Op != OpConst8 { 14176 break 14177 } 14178 c := v_1.AuxInt 14179 if !(isNonNegative(n) && isPowerOfTwo(c&0xff)) { 14180 break 14181 } 14182 v.reset(OpAnd8) 14183 v.AddArg(n) 14184 v0 := b.NewValue0(v.Pos, OpConst8, t) 14185 v0.AuxInt = (c & 0xff) - 1 14186 v.AddArg(v0) 14187 return true 14188 } 14189 // match: (Mod8 <t> n (Const8 [c])) 14190 // cond: c < 0 && c != -1<<7 14191 // result: (Mod8 <t> n (Const8 <t> [-c])) 14192 for { 14193 t := v.Type 14194 _ = v.Args[1] 14195 n := v.Args[0] 14196 v_1 := v.Args[1] 14197 if v_1.Op != OpConst8 { 14198 break 14199 } 14200 c := v_1.AuxInt 14201 if !(c < 0 && c != -1<<7) { 14202 break 14203 } 14204 v.reset(OpMod8) 14205 v.Type = t 14206 v.AddArg(n) 14207 v0 := b.NewValue0(v.Pos, OpConst8, t) 14208 v0.AuxInt = -c 14209 v.AddArg(v0) 14210 return true 14211 } 14212 // match: (Mod8 <t> x (Const8 [c])) 14213 // cond: x.Op != OpConst8 && (c > 0 || c == -1<<7) 14214 // result: (Sub8 x (Mul8 <t> (Div8 <t> x (Const8 <t> [c])) (Const8 <t> [c]))) 14215 for { 14216 t := v.Type 14217 _ = v.Args[1] 14218 x := v.Args[0] 14219 v_1 := v.Args[1] 14220 if v_1.Op != OpConst8 { 14221 break 14222 } 14223 c := v_1.AuxInt 14224 if !(x.Op != OpConst8 && (c > 0 || c == -1<<7)) { 14225 break 14226 } 14227 v.reset(OpSub8) 14228 v.AddArg(x) 14229 v0 := b.NewValue0(v.Pos, OpMul8, t) 14230 v1 := b.NewValue0(v.Pos, OpDiv8, t) 14231 v1.AddArg(x) 14232 v2 := b.NewValue0(v.Pos, OpConst8, t) 14233 v2.AuxInt = c 14234 v1.AddArg(v2) 14235 v0.AddArg(v1) 14236 v3 := b.NewValue0(v.Pos, OpConst8, t) 14237 v3.AuxInt = c 14238 v0.AddArg(v3) 14239 v.AddArg(v0) 14240 return true 14241 } 14242 return false 14243 } 14244 func rewriteValuegeneric_OpMod8u_0(v *Value) bool { 14245 b := v.Block 14246 _ = b 14247 // match: (Mod8u (Const8 [c]) (Const8 [d])) 14248 // cond: d != 0 14249 // result: (Const8 [int64(uint8(c) % uint8(d))]) 14250 for { 14251 _ = v.Args[1] 14252 v_0 := v.Args[0] 14253 if v_0.Op != OpConst8 { 14254 break 14255 } 14256 c := v_0.AuxInt 14257 v_1 := v.Args[1] 14258 if v_1.Op != OpConst8 { 14259 break 14260 } 14261 d := v_1.AuxInt 14262 if !(d != 0) { 14263 break 14264 } 14265 v.reset(OpConst8) 14266 v.AuxInt = int64(uint8(c) % uint8(d)) 14267 return true 14268 } 14269 // match: (Mod8u <t> n (Const8 [c])) 14270 // cond: isPowerOfTwo(c&0xff) 14271 // result: (And8 n (Const8 <t> [(c&0xff)-1])) 14272 for { 14273 t := v.Type 14274 _ = v.Args[1] 14275 n := v.Args[0] 14276 v_1 := v.Args[1] 14277 if v_1.Op != OpConst8 { 14278 break 14279 } 14280 c := v_1.AuxInt 14281 if !(isPowerOfTwo(c & 0xff)) { 14282 break 14283 } 14284 v.reset(OpAnd8) 14285 v.AddArg(n) 14286 v0 := b.NewValue0(v.Pos, OpConst8, t) 14287 v0.AuxInt = (c & 0xff) - 1 14288 v.AddArg(v0) 14289 return true 14290 } 14291 // match: (Mod8u <t> x (Const8 [c])) 14292 // cond: x.Op != OpConst8 && c > 0 && umagicOK(8 ,c) 14293 // result: (Sub8 x (Mul8 <t> (Div8u <t> x (Const8 <t> [c])) (Const8 <t> [c]))) 14294 for { 14295 t := v.Type 14296 _ = v.Args[1] 14297 x := v.Args[0] 14298 v_1 := v.Args[1] 14299 if v_1.Op != OpConst8 { 14300 break 14301 } 14302 c := v_1.AuxInt 14303 if !(x.Op != OpConst8 && c > 0 && umagicOK(8, c)) { 14304 break 14305 } 14306 v.reset(OpSub8) 14307 v.AddArg(x) 14308 v0 := b.NewValue0(v.Pos, OpMul8, t) 14309 v1 := b.NewValue0(v.Pos, OpDiv8u, t) 14310 v1.AddArg(x) 14311 v2 := b.NewValue0(v.Pos, OpConst8, t) 14312 v2.AuxInt = c 14313 v1.AddArg(v2) 14314 v0.AddArg(v1) 14315 v3 := b.NewValue0(v.Pos, OpConst8, t) 14316 v3.AuxInt = c 14317 v0.AddArg(v3) 14318 v.AddArg(v0) 14319 return true 14320 } 14321 return false 14322 } 14323 func rewriteValuegeneric_OpMul16_0(v *Value) bool { 14324 b := v.Block 14325 _ = b 14326 typ := &b.Func.Config.Types 14327 _ = typ 14328 // match: (Mul16 (Const16 [c]) (Const16 [d])) 14329 // cond: 14330 // result: (Const16 [int64(int16(c*d))]) 14331 for { 14332 _ = v.Args[1] 14333 v_0 := v.Args[0] 14334 if v_0.Op != OpConst16 { 14335 break 14336 } 14337 c := v_0.AuxInt 14338 v_1 := v.Args[1] 14339 if v_1.Op != OpConst16 { 14340 break 14341 } 14342 d := v_1.AuxInt 14343 v.reset(OpConst16) 14344 v.AuxInt = int64(int16(c * d)) 14345 return true 14346 } 14347 // match: (Mul16 (Const16 [d]) (Const16 [c])) 14348 // cond: 14349 // result: (Const16 [int64(int16(c*d))]) 14350 for { 14351 _ = v.Args[1] 14352 v_0 := v.Args[0] 14353 if v_0.Op != OpConst16 { 14354 break 14355 } 14356 d := v_0.AuxInt 14357 v_1 := v.Args[1] 14358 if v_1.Op != OpConst16 { 14359 break 14360 } 14361 c := v_1.AuxInt 14362 v.reset(OpConst16) 14363 v.AuxInt = int64(int16(c * d)) 14364 return true 14365 } 14366 // match: (Mul16 (Const16 [1]) x) 14367 // cond: 14368 // result: x 14369 for { 14370 _ = v.Args[1] 14371 v_0 := v.Args[0] 14372 if v_0.Op != OpConst16 { 14373 break 14374 } 14375 if v_0.AuxInt != 1 { 14376 break 14377 } 14378 x := v.Args[1] 14379 v.reset(OpCopy) 14380 v.Type = x.Type 14381 v.AddArg(x) 14382 return true 14383 } 14384 // match: (Mul16 x (Const16 [1])) 14385 // cond: 14386 // result: x 14387 for { 14388 _ = v.Args[1] 14389 x := v.Args[0] 14390 v_1 := v.Args[1] 14391 if v_1.Op != OpConst16 { 14392 break 14393 } 14394 if v_1.AuxInt != 1 { 14395 break 14396 } 14397 v.reset(OpCopy) 14398 v.Type = x.Type 14399 v.AddArg(x) 14400 return true 14401 } 14402 // match: (Mul16 (Const16 [-1]) x) 14403 // cond: 14404 // result: (Neg16 x) 14405 for { 14406 _ = v.Args[1] 14407 v_0 := v.Args[0] 14408 if v_0.Op != OpConst16 { 14409 break 14410 } 14411 if v_0.AuxInt != -1 { 14412 break 14413 } 14414 x := v.Args[1] 14415 v.reset(OpNeg16) 14416 v.AddArg(x) 14417 return true 14418 } 14419 // match: (Mul16 x (Const16 [-1])) 14420 // cond: 14421 // result: (Neg16 x) 14422 for { 14423 _ = v.Args[1] 14424 x := v.Args[0] 14425 v_1 := v.Args[1] 14426 if v_1.Op != OpConst16 { 14427 break 14428 } 14429 if v_1.AuxInt != -1 { 14430 break 14431 } 14432 v.reset(OpNeg16) 14433 v.AddArg(x) 14434 return true 14435 } 14436 // match: (Mul16 <t> n (Const16 [c])) 14437 // cond: isPowerOfTwo(c) 14438 // result: (Lsh16x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 14439 for { 14440 t := v.Type 14441 _ = v.Args[1] 14442 n := v.Args[0] 14443 v_1 := v.Args[1] 14444 if v_1.Op != OpConst16 { 14445 break 14446 } 14447 c := v_1.AuxInt 14448 if !(isPowerOfTwo(c)) { 14449 break 14450 } 14451 v.reset(OpLsh16x64) 14452 v.Type = t 14453 v.AddArg(n) 14454 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 14455 v0.AuxInt = log2(c) 14456 v.AddArg(v0) 14457 return true 14458 } 14459 // match: (Mul16 <t> (Const16 [c]) n) 14460 // cond: isPowerOfTwo(c) 14461 // result: (Lsh16x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 14462 for { 14463 t := v.Type 14464 _ = v.Args[1] 14465 v_0 := v.Args[0] 14466 if v_0.Op != OpConst16 { 14467 break 14468 } 14469 c := v_0.AuxInt 14470 n := v.Args[1] 14471 if !(isPowerOfTwo(c)) { 14472 break 14473 } 14474 v.reset(OpLsh16x64) 14475 v.Type = t 14476 v.AddArg(n) 14477 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 14478 v0.AuxInt = log2(c) 14479 v.AddArg(v0) 14480 return true 14481 } 14482 // match: (Mul16 <t> n (Const16 [c])) 14483 // cond: t.IsSigned() && isPowerOfTwo(-c) 14484 // result: (Neg16 (Lsh16x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 14485 for { 14486 t := v.Type 14487 _ = v.Args[1] 14488 n := v.Args[0] 14489 v_1 := v.Args[1] 14490 if v_1.Op != OpConst16 { 14491 break 14492 } 14493 c := v_1.AuxInt 14494 if !(t.IsSigned() && isPowerOfTwo(-c)) { 14495 break 14496 } 14497 v.reset(OpNeg16) 14498 v0 := b.NewValue0(v.Pos, OpLsh16x64, t) 14499 v0.AddArg(n) 14500 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 14501 v1.AuxInt = log2(-c) 14502 v0.AddArg(v1) 14503 v.AddArg(v0) 14504 return true 14505 } 14506 // match: (Mul16 <t> (Const16 [c]) n) 14507 // cond: t.IsSigned() && isPowerOfTwo(-c) 14508 // result: (Neg16 (Lsh16x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 14509 for { 14510 t := v.Type 14511 _ = v.Args[1] 14512 v_0 := v.Args[0] 14513 if v_0.Op != OpConst16 { 14514 break 14515 } 14516 c := v_0.AuxInt 14517 n := v.Args[1] 14518 if !(t.IsSigned() && isPowerOfTwo(-c)) { 14519 break 14520 } 14521 v.reset(OpNeg16) 14522 v0 := b.NewValue0(v.Pos, OpLsh16x64, t) 14523 v0.AddArg(n) 14524 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 14525 v1.AuxInt = log2(-c) 14526 v0.AddArg(v1) 14527 v.AddArg(v0) 14528 return true 14529 } 14530 return false 14531 } 14532 func rewriteValuegeneric_OpMul16_10(v *Value) bool { 14533 b := v.Block 14534 _ = b 14535 // match: (Mul16 (Const16 [0]) _) 14536 // cond: 14537 // result: (Const16 [0]) 14538 for { 14539 _ = v.Args[1] 14540 v_0 := v.Args[0] 14541 if v_0.Op != OpConst16 { 14542 break 14543 } 14544 if v_0.AuxInt != 0 { 14545 break 14546 } 14547 v.reset(OpConst16) 14548 v.AuxInt = 0 14549 return true 14550 } 14551 // match: (Mul16 _ (Const16 [0])) 14552 // cond: 14553 // result: (Const16 [0]) 14554 for { 14555 _ = v.Args[1] 14556 v_1 := v.Args[1] 14557 if v_1.Op != OpConst16 { 14558 break 14559 } 14560 if v_1.AuxInt != 0 { 14561 break 14562 } 14563 v.reset(OpConst16) 14564 v.AuxInt = 0 14565 return true 14566 } 14567 // match: (Mul16 (Const16 <t> [c]) (Mul16 (Const16 <t> [d]) x)) 14568 // cond: 14569 // result: (Mul16 (Const16 <t> [int64(int16(c*d))]) x) 14570 for { 14571 _ = v.Args[1] 14572 v_0 := v.Args[0] 14573 if v_0.Op != OpConst16 { 14574 break 14575 } 14576 t := v_0.Type 14577 c := v_0.AuxInt 14578 v_1 := v.Args[1] 14579 if v_1.Op != OpMul16 { 14580 break 14581 } 14582 _ = v_1.Args[1] 14583 v_1_0 := v_1.Args[0] 14584 if v_1_0.Op != OpConst16 { 14585 break 14586 } 14587 if v_1_0.Type != t { 14588 break 14589 } 14590 d := v_1_0.AuxInt 14591 x := v_1.Args[1] 14592 v.reset(OpMul16) 14593 v0 := b.NewValue0(v.Pos, OpConst16, t) 14594 v0.AuxInt = int64(int16(c * d)) 14595 v.AddArg(v0) 14596 v.AddArg(x) 14597 return true 14598 } 14599 // match: (Mul16 (Const16 <t> [c]) (Mul16 x (Const16 <t> [d]))) 14600 // cond: 14601 // result: (Mul16 (Const16 <t> [int64(int16(c*d))]) x) 14602 for { 14603 _ = v.Args[1] 14604 v_0 := v.Args[0] 14605 if v_0.Op != OpConst16 { 14606 break 14607 } 14608 t := v_0.Type 14609 c := v_0.AuxInt 14610 v_1 := v.Args[1] 14611 if v_1.Op != OpMul16 { 14612 break 14613 } 14614 _ = v_1.Args[1] 14615 x := v_1.Args[0] 14616 v_1_1 := v_1.Args[1] 14617 if v_1_1.Op != OpConst16 { 14618 break 14619 } 14620 if v_1_1.Type != t { 14621 break 14622 } 14623 d := v_1_1.AuxInt 14624 v.reset(OpMul16) 14625 v0 := b.NewValue0(v.Pos, OpConst16, t) 14626 v0.AuxInt = int64(int16(c * d)) 14627 v.AddArg(v0) 14628 v.AddArg(x) 14629 return true 14630 } 14631 // match: (Mul16 (Mul16 (Const16 <t> [d]) x) (Const16 <t> [c])) 14632 // cond: 14633 // result: (Mul16 (Const16 <t> [int64(int16(c*d))]) x) 14634 for { 14635 _ = v.Args[1] 14636 v_0 := v.Args[0] 14637 if v_0.Op != OpMul16 { 14638 break 14639 } 14640 _ = v_0.Args[1] 14641 v_0_0 := v_0.Args[0] 14642 if v_0_0.Op != OpConst16 { 14643 break 14644 } 14645 t := v_0_0.Type 14646 d := v_0_0.AuxInt 14647 x := v_0.Args[1] 14648 v_1 := v.Args[1] 14649 if v_1.Op != OpConst16 { 14650 break 14651 } 14652 if v_1.Type != t { 14653 break 14654 } 14655 c := v_1.AuxInt 14656 v.reset(OpMul16) 14657 v0 := b.NewValue0(v.Pos, OpConst16, t) 14658 v0.AuxInt = int64(int16(c * d)) 14659 v.AddArg(v0) 14660 v.AddArg(x) 14661 return true 14662 } 14663 // match: (Mul16 (Mul16 x (Const16 <t> [d])) (Const16 <t> [c])) 14664 // cond: 14665 // result: (Mul16 (Const16 <t> [int64(int16(c*d))]) x) 14666 for { 14667 _ = v.Args[1] 14668 v_0 := v.Args[0] 14669 if v_0.Op != OpMul16 { 14670 break 14671 } 14672 _ = v_0.Args[1] 14673 x := v_0.Args[0] 14674 v_0_1 := v_0.Args[1] 14675 if v_0_1.Op != OpConst16 { 14676 break 14677 } 14678 t := v_0_1.Type 14679 d := v_0_1.AuxInt 14680 v_1 := v.Args[1] 14681 if v_1.Op != OpConst16 { 14682 break 14683 } 14684 if v_1.Type != t { 14685 break 14686 } 14687 c := v_1.AuxInt 14688 v.reset(OpMul16) 14689 v0 := b.NewValue0(v.Pos, OpConst16, t) 14690 v0.AuxInt = int64(int16(c * d)) 14691 v.AddArg(v0) 14692 v.AddArg(x) 14693 return true 14694 } 14695 return false 14696 } 14697 func rewriteValuegeneric_OpMul32_0(v *Value) bool { 14698 b := v.Block 14699 _ = b 14700 typ := &b.Func.Config.Types 14701 _ = typ 14702 // match: (Mul32 (Const32 [c]) (Const32 [d])) 14703 // cond: 14704 // result: (Const32 [int64(int32(c*d))]) 14705 for { 14706 _ = v.Args[1] 14707 v_0 := v.Args[0] 14708 if v_0.Op != OpConst32 { 14709 break 14710 } 14711 c := v_0.AuxInt 14712 v_1 := v.Args[1] 14713 if v_1.Op != OpConst32 { 14714 break 14715 } 14716 d := v_1.AuxInt 14717 v.reset(OpConst32) 14718 v.AuxInt = int64(int32(c * d)) 14719 return true 14720 } 14721 // match: (Mul32 (Const32 [d]) (Const32 [c])) 14722 // cond: 14723 // result: (Const32 [int64(int32(c*d))]) 14724 for { 14725 _ = v.Args[1] 14726 v_0 := v.Args[0] 14727 if v_0.Op != OpConst32 { 14728 break 14729 } 14730 d := v_0.AuxInt 14731 v_1 := v.Args[1] 14732 if v_1.Op != OpConst32 { 14733 break 14734 } 14735 c := v_1.AuxInt 14736 v.reset(OpConst32) 14737 v.AuxInt = int64(int32(c * d)) 14738 return true 14739 } 14740 // match: (Mul32 (Const32 [1]) x) 14741 // cond: 14742 // result: x 14743 for { 14744 _ = v.Args[1] 14745 v_0 := v.Args[0] 14746 if v_0.Op != OpConst32 { 14747 break 14748 } 14749 if v_0.AuxInt != 1 { 14750 break 14751 } 14752 x := v.Args[1] 14753 v.reset(OpCopy) 14754 v.Type = x.Type 14755 v.AddArg(x) 14756 return true 14757 } 14758 // match: (Mul32 x (Const32 [1])) 14759 // cond: 14760 // result: x 14761 for { 14762 _ = v.Args[1] 14763 x := v.Args[0] 14764 v_1 := v.Args[1] 14765 if v_1.Op != OpConst32 { 14766 break 14767 } 14768 if v_1.AuxInt != 1 { 14769 break 14770 } 14771 v.reset(OpCopy) 14772 v.Type = x.Type 14773 v.AddArg(x) 14774 return true 14775 } 14776 // match: (Mul32 (Const32 [-1]) x) 14777 // cond: 14778 // result: (Neg32 x) 14779 for { 14780 _ = v.Args[1] 14781 v_0 := v.Args[0] 14782 if v_0.Op != OpConst32 { 14783 break 14784 } 14785 if v_0.AuxInt != -1 { 14786 break 14787 } 14788 x := v.Args[1] 14789 v.reset(OpNeg32) 14790 v.AddArg(x) 14791 return true 14792 } 14793 // match: (Mul32 x (Const32 [-1])) 14794 // cond: 14795 // result: (Neg32 x) 14796 for { 14797 _ = v.Args[1] 14798 x := v.Args[0] 14799 v_1 := v.Args[1] 14800 if v_1.Op != OpConst32 { 14801 break 14802 } 14803 if v_1.AuxInt != -1 { 14804 break 14805 } 14806 v.reset(OpNeg32) 14807 v.AddArg(x) 14808 return true 14809 } 14810 // match: (Mul32 <t> n (Const32 [c])) 14811 // cond: isPowerOfTwo(c) 14812 // result: (Lsh32x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 14813 for { 14814 t := v.Type 14815 _ = v.Args[1] 14816 n := v.Args[0] 14817 v_1 := v.Args[1] 14818 if v_1.Op != OpConst32 { 14819 break 14820 } 14821 c := v_1.AuxInt 14822 if !(isPowerOfTwo(c)) { 14823 break 14824 } 14825 v.reset(OpLsh32x64) 14826 v.Type = t 14827 v.AddArg(n) 14828 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 14829 v0.AuxInt = log2(c) 14830 v.AddArg(v0) 14831 return true 14832 } 14833 // match: (Mul32 <t> (Const32 [c]) n) 14834 // cond: isPowerOfTwo(c) 14835 // result: (Lsh32x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 14836 for { 14837 t := v.Type 14838 _ = v.Args[1] 14839 v_0 := v.Args[0] 14840 if v_0.Op != OpConst32 { 14841 break 14842 } 14843 c := v_0.AuxInt 14844 n := v.Args[1] 14845 if !(isPowerOfTwo(c)) { 14846 break 14847 } 14848 v.reset(OpLsh32x64) 14849 v.Type = t 14850 v.AddArg(n) 14851 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 14852 v0.AuxInt = log2(c) 14853 v.AddArg(v0) 14854 return true 14855 } 14856 // match: (Mul32 <t> n (Const32 [c])) 14857 // cond: t.IsSigned() && isPowerOfTwo(-c) 14858 // result: (Neg32 (Lsh32x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 14859 for { 14860 t := v.Type 14861 _ = v.Args[1] 14862 n := v.Args[0] 14863 v_1 := v.Args[1] 14864 if v_1.Op != OpConst32 { 14865 break 14866 } 14867 c := v_1.AuxInt 14868 if !(t.IsSigned() && isPowerOfTwo(-c)) { 14869 break 14870 } 14871 v.reset(OpNeg32) 14872 v0 := b.NewValue0(v.Pos, OpLsh32x64, t) 14873 v0.AddArg(n) 14874 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 14875 v1.AuxInt = log2(-c) 14876 v0.AddArg(v1) 14877 v.AddArg(v0) 14878 return true 14879 } 14880 // match: (Mul32 <t> (Const32 [c]) n) 14881 // cond: t.IsSigned() && isPowerOfTwo(-c) 14882 // result: (Neg32 (Lsh32x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 14883 for { 14884 t := v.Type 14885 _ = v.Args[1] 14886 v_0 := v.Args[0] 14887 if v_0.Op != OpConst32 { 14888 break 14889 } 14890 c := v_0.AuxInt 14891 n := v.Args[1] 14892 if !(t.IsSigned() && isPowerOfTwo(-c)) { 14893 break 14894 } 14895 v.reset(OpNeg32) 14896 v0 := b.NewValue0(v.Pos, OpLsh32x64, t) 14897 v0.AddArg(n) 14898 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 14899 v1.AuxInt = log2(-c) 14900 v0.AddArg(v1) 14901 v.AddArg(v0) 14902 return true 14903 } 14904 return false 14905 } 14906 func rewriteValuegeneric_OpMul32_10(v *Value) bool { 14907 b := v.Block 14908 _ = b 14909 // match: (Mul32 (Const32 <t> [c]) (Add32 <t> (Const32 <t> [d]) x)) 14910 // cond: 14911 // result: (Add32 (Const32 <t> [int64(int32(c*d))]) (Mul32 <t> (Const32 <t> [c]) x)) 14912 for { 14913 _ = v.Args[1] 14914 v_0 := v.Args[0] 14915 if v_0.Op != OpConst32 { 14916 break 14917 } 14918 t := v_0.Type 14919 c := v_0.AuxInt 14920 v_1 := v.Args[1] 14921 if v_1.Op != OpAdd32 { 14922 break 14923 } 14924 if v_1.Type != t { 14925 break 14926 } 14927 _ = v_1.Args[1] 14928 v_1_0 := v_1.Args[0] 14929 if v_1_0.Op != OpConst32 { 14930 break 14931 } 14932 if v_1_0.Type != t { 14933 break 14934 } 14935 d := v_1_0.AuxInt 14936 x := v_1.Args[1] 14937 v.reset(OpAdd32) 14938 v0 := b.NewValue0(v.Pos, OpConst32, t) 14939 v0.AuxInt = int64(int32(c * d)) 14940 v.AddArg(v0) 14941 v1 := b.NewValue0(v.Pos, OpMul32, t) 14942 v2 := b.NewValue0(v.Pos, OpConst32, t) 14943 v2.AuxInt = c 14944 v1.AddArg(v2) 14945 v1.AddArg(x) 14946 v.AddArg(v1) 14947 return true 14948 } 14949 // match: (Mul32 (Const32 <t> [c]) (Add32 <t> x (Const32 <t> [d]))) 14950 // cond: 14951 // result: (Add32 (Const32 <t> [int64(int32(c*d))]) (Mul32 <t> (Const32 <t> [c]) x)) 14952 for { 14953 _ = v.Args[1] 14954 v_0 := v.Args[0] 14955 if v_0.Op != OpConst32 { 14956 break 14957 } 14958 t := v_0.Type 14959 c := v_0.AuxInt 14960 v_1 := v.Args[1] 14961 if v_1.Op != OpAdd32 { 14962 break 14963 } 14964 if v_1.Type != t { 14965 break 14966 } 14967 _ = v_1.Args[1] 14968 x := v_1.Args[0] 14969 v_1_1 := v_1.Args[1] 14970 if v_1_1.Op != OpConst32 { 14971 break 14972 } 14973 if v_1_1.Type != t { 14974 break 14975 } 14976 d := v_1_1.AuxInt 14977 v.reset(OpAdd32) 14978 v0 := b.NewValue0(v.Pos, OpConst32, t) 14979 v0.AuxInt = int64(int32(c * d)) 14980 v.AddArg(v0) 14981 v1 := b.NewValue0(v.Pos, OpMul32, t) 14982 v2 := b.NewValue0(v.Pos, OpConst32, t) 14983 v2.AuxInt = c 14984 v1.AddArg(v2) 14985 v1.AddArg(x) 14986 v.AddArg(v1) 14987 return true 14988 } 14989 // match: (Mul32 (Add32 <t> (Const32 <t> [d]) x) (Const32 <t> [c])) 14990 // cond: 14991 // result: (Add32 (Const32 <t> [int64(int32(c*d))]) (Mul32 <t> (Const32 <t> [c]) x)) 14992 for { 14993 _ = v.Args[1] 14994 v_0 := v.Args[0] 14995 if v_0.Op != OpAdd32 { 14996 break 14997 } 14998 t := v_0.Type 14999 _ = v_0.Args[1] 15000 v_0_0 := v_0.Args[0] 15001 if v_0_0.Op != OpConst32 { 15002 break 15003 } 15004 if v_0_0.Type != t { 15005 break 15006 } 15007 d := v_0_0.AuxInt 15008 x := v_0.Args[1] 15009 v_1 := v.Args[1] 15010 if v_1.Op != OpConst32 { 15011 break 15012 } 15013 if v_1.Type != t { 15014 break 15015 } 15016 c := v_1.AuxInt 15017 v.reset(OpAdd32) 15018 v0 := b.NewValue0(v.Pos, OpConst32, t) 15019 v0.AuxInt = int64(int32(c * d)) 15020 v.AddArg(v0) 15021 v1 := b.NewValue0(v.Pos, OpMul32, t) 15022 v2 := b.NewValue0(v.Pos, OpConst32, t) 15023 v2.AuxInt = c 15024 v1.AddArg(v2) 15025 v1.AddArg(x) 15026 v.AddArg(v1) 15027 return true 15028 } 15029 // match: (Mul32 (Add32 <t> x (Const32 <t> [d])) (Const32 <t> [c])) 15030 // cond: 15031 // result: (Add32 (Const32 <t> [int64(int32(c*d))]) (Mul32 <t> (Const32 <t> [c]) x)) 15032 for { 15033 _ = v.Args[1] 15034 v_0 := v.Args[0] 15035 if v_0.Op != OpAdd32 { 15036 break 15037 } 15038 t := v_0.Type 15039 _ = v_0.Args[1] 15040 x := v_0.Args[0] 15041 v_0_1 := v_0.Args[1] 15042 if v_0_1.Op != OpConst32 { 15043 break 15044 } 15045 if v_0_1.Type != t { 15046 break 15047 } 15048 d := v_0_1.AuxInt 15049 v_1 := v.Args[1] 15050 if v_1.Op != OpConst32 { 15051 break 15052 } 15053 if v_1.Type != t { 15054 break 15055 } 15056 c := v_1.AuxInt 15057 v.reset(OpAdd32) 15058 v0 := b.NewValue0(v.Pos, OpConst32, t) 15059 v0.AuxInt = int64(int32(c * d)) 15060 v.AddArg(v0) 15061 v1 := b.NewValue0(v.Pos, OpMul32, t) 15062 v2 := b.NewValue0(v.Pos, OpConst32, t) 15063 v2.AuxInt = c 15064 v1.AddArg(v2) 15065 v1.AddArg(x) 15066 v.AddArg(v1) 15067 return true 15068 } 15069 // match: (Mul32 (Const32 [0]) _) 15070 // cond: 15071 // result: (Const32 [0]) 15072 for { 15073 _ = v.Args[1] 15074 v_0 := v.Args[0] 15075 if v_0.Op != OpConst32 { 15076 break 15077 } 15078 if v_0.AuxInt != 0 { 15079 break 15080 } 15081 v.reset(OpConst32) 15082 v.AuxInt = 0 15083 return true 15084 } 15085 // match: (Mul32 _ (Const32 [0])) 15086 // cond: 15087 // result: (Const32 [0]) 15088 for { 15089 _ = v.Args[1] 15090 v_1 := v.Args[1] 15091 if v_1.Op != OpConst32 { 15092 break 15093 } 15094 if v_1.AuxInt != 0 { 15095 break 15096 } 15097 v.reset(OpConst32) 15098 v.AuxInt = 0 15099 return true 15100 } 15101 // match: (Mul32 (Const32 <t> [c]) (Mul32 (Const32 <t> [d]) x)) 15102 // cond: 15103 // result: (Mul32 (Const32 <t> [int64(int32(c*d))]) x) 15104 for { 15105 _ = v.Args[1] 15106 v_0 := v.Args[0] 15107 if v_0.Op != OpConst32 { 15108 break 15109 } 15110 t := v_0.Type 15111 c := v_0.AuxInt 15112 v_1 := v.Args[1] 15113 if v_1.Op != OpMul32 { 15114 break 15115 } 15116 _ = v_1.Args[1] 15117 v_1_0 := v_1.Args[0] 15118 if v_1_0.Op != OpConst32 { 15119 break 15120 } 15121 if v_1_0.Type != t { 15122 break 15123 } 15124 d := v_1_0.AuxInt 15125 x := v_1.Args[1] 15126 v.reset(OpMul32) 15127 v0 := b.NewValue0(v.Pos, OpConst32, t) 15128 v0.AuxInt = int64(int32(c * d)) 15129 v.AddArg(v0) 15130 v.AddArg(x) 15131 return true 15132 } 15133 // match: (Mul32 (Const32 <t> [c]) (Mul32 x (Const32 <t> [d]))) 15134 // cond: 15135 // result: (Mul32 (Const32 <t> [int64(int32(c*d))]) x) 15136 for { 15137 _ = v.Args[1] 15138 v_0 := v.Args[0] 15139 if v_0.Op != OpConst32 { 15140 break 15141 } 15142 t := v_0.Type 15143 c := v_0.AuxInt 15144 v_1 := v.Args[1] 15145 if v_1.Op != OpMul32 { 15146 break 15147 } 15148 _ = v_1.Args[1] 15149 x := v_1.Args[0] 15150 v_1_1 := v_1.Args[1] 15151 if v_1_1.Op != OpConst32 { 15152 break 15153 } 15154 if v_1_1.Type != t { 15155 break 15156 } 15157 d := v_1_1.AuxInt 15158 v.reset(OpMul32) 15159 v0 := b.NewValue0(v.Pos, OpConst32, t) 15160 v0.AuxInt = int64(int32(c * d)) 15161 v.AddArg(v0) 15162 v.AddArg(x) 15163 return true 15164 } 15165 // match: (Mul32 (Mul32 (Const32 <t> [d]) x) (Const32 <t> [c])) 15166 // cond: 15167 // result: (Mul32 (Const32 <t> [int64(int32(c*d))]) x) 15168 for { 15169 _ = v.Args[1] 15170 v_0 := v.Args[0] 15171 if v_0.Op != OpMul32 { 15172 break 15173 } 15174 _ = v_0.Args[1] 15175 v_0_0 := v_0.Args[0] 15176 if v_0_0.Op != OpConst32 { 15177 break 15178 } 15179 t := v_0_0.Type 15180 d := v_0_0.AuxInt 15181 x := v_0.Args[1] 15182 v_1 := v.Args[1] 15183 if v_1.Op != OpConst32 { 15184 break 15185 } 15186 if v_1.Type != t { 15187 break 15188 } 15189 c := v_1.AuxInt 15190 v.reset(OpMul32) 15191 v0 := b.NewValue0(v.Pos, OpConst32, t) 15192 v0.AuxInt = int64(int32(c * d)) 15193 v.AddArg(v0) 15194 v.AddArg(x) 15195 return true 15196 } 15197 // match: (Mul32 (Mul32 x (Const32 <t> [d])) (Const32 <t> [c])) 15198 // cond: 15199 // result: (Mul32 (Const32 <t> [int64(int32(c*d))]) x) 15200 for { 15201 _ = v.Args[1] 15202 v_0 := v.Args[0] 15203 if v_0.Op != OpMul32 { 15204 break 15205 } 15206 _ = v_0.Args[1] 15207 x := v_0.Args[0] 15208 v_0_1 := v_0.Args[1] 15209 if v_0_1.Op != OpConst32 { 15210 break 15211 } 15212 t := v_0_1.Type 15213 d := v_0_1.AuxInt 15214 v_1 := v.Args[1] 15215 if v_1.Op != OpConst32 { 15216 break 15217 } 15218 if v_1.Type != t { 15219 break 15220 } 15221 c := v_1.AuxInt 15222 v.reset(OpMul32) 15223 v0 := b.NewValue0(v.Pos, OpConst32, t) 15224 v0.AuxInt = int64(int32(c * d)) 15225 v.AddArg(v0) 15226 v.AddArg(x) 15227 return true 15228 } 15229 return false 15230 } 15231 func rewriteValuegeneric_OpMul32F_0(v *Value) bool { 15232 // match: (Mul32F (Const32F [c]) (Const32F [d])) 15233 // cond: 15234 // result: (Const32F [f2i(float64(i2f32(c) * i2f32(d)))]) 15235 for { 15236 _ = v.Args[1] 15237 v_0 := v.Args[0] 15238 if v_0.Op != OpConst32F { 15239 break 15240 } 15241 c := v_0.AuxInt 15242 v_1 := v.Args[1] 15243 if v_1.Op != OpConst32F { 15244 break 15245 } 15246 d := v_1.AuxInt 15247 v.reset(OpConst32F) 15248 v.AuxInt = f2i(float64(i2f32(c) * i2f32(d))) 15249 return true 15250 } 15251 // match: (Mul32F (Const32F [d]) (Const32F [c])) 15252 // cond: 15253 // result: (Const32F [f2i(float64(i2f32(c) * i2f32(d)))]) 15254 for { 15255 _ = v.Args[1] 15256 v_0 := v.Args[0] 15257 if v_0.Op != OpConst32F { 15258 break 15259 } 15260 d := v_0.AuxInt 15261 v_1 := v.Args[1] 15262 if v_1.Op != OpConst32F { 15263 break 15264 } 15265 c := v_1.AuxInt 15266 v.reset(OpConst32F) 15267 v.AuxInt = f2i(float64(i2f32(c) * i2f32(d))) 15268 return true 15269 } 15270 // match: (Mul32F x (Const32F [f2i(1)])) 15271 // cond: 15272 // result: x 15273 for { 15274 _ = v.Args[1] 15275 x := v.Args[0] 15276 v_1 := v.Args[1] 15277 if v_1.Op != OpConst32F { 15278 break 15279 } 15280 if v_1.AuxInt != f2i(1) { 15281 break 15282 } 15283 v.reset(OpCopy) 15284 v.Type = x.Type 15285 v.AddArg(x) 15286 return true 15287 } 15288 // match: (Mul32F (Const32F [f2i(1)]) x) 15289 // cond: 15290 // result: x 15291 for { 15292 _ = v.Args[1] 15293 v_0 := v.Args[0] 15294 if v_0.Op != OpConst32F { 15295 break 15296 } 15297 if v_0.AuxInt != f2i(1) { 15298 break 15299 } 15300 x := v.Args[1] 15301 v.reset(OpCopy) 15302 v.Type = x.Type 15303 v.AddArg(x) 15304 return true 15305 } 15306 // match: (Mul32F x (Const32F [f2i(-1)])) 15307 // cond: 15308 // result: (Neg32F x) 15309 for { 15310 _ = v.Args[1] 15311 x := v.Args[0] 15312 v_1 := v.Args[1] 15313 if v_1.Op != OpConst32F { 15314 break 15315 } 15316 if v_1.AuxInt != f2i(-1) { 15317 break 15318 } 15319 v.reset(OpNeg32F) 15320 v.AddArg(x) 15321 return true 15322 } 15323 // match: (Mul32F (Const32F [f2i(-1)]) x) 15324 // cond: 15325 // result: (Neg32F x) 15326 for { 15327 _ = v.Args[1] 15328 v_0 := v.Args[0] 15329 if v_0.Op != OpConst32F { 15330 break 15331 } 15332 if v_0.AuxInt != f2i(-1) { 15333 break 15334 } 15335 x := v.Args[1] 15336 v.reset(OpNeg32F) 15337 v.AddArg(x) 15338 return true 15339 } 15340 // match: (Mul32F x (Const32F [f2i(2)])) 15341 // cond: 15342 // result: (Add32F x x) 15343 for { 15344 _ = v.Args[1] 15345 x := v.Args[0] 15346 v_1 := v.Args[1] 15347 if v_1.Op != OpConst32F { 15348 break 15349 } 15350 if v_1.AuxInt != f2i(2) { 15351 break 15352 } 15353 v.reset(OpAdd32F) 15354 v.AddArg(x) 15355 v.AddArg(x) 15356 return true 15357 } 15358 // match: (Mul32F (Const32F [f2i(2)]) x) 15359 // cond: 15360 // result: (Add32F x x) 15361 for { 15362 _ = v.Args[1] 15363 v_0 := v.Args[0] 15364 if v_0.Op != OpConst32F { 15365 break 15366 } 15367 if v_0.AuxInt != f2i(2) { 15368 break 15369 } 15370 x := v.Args[1] 15371 v.reset(OpAdd32F) 15372 v.AddArg(x) 15373 v.AddArg(x) 15374 return true 15375 } 15376 return false 15377 } 15378 func rewriteValuegeneric_OpMul64_0(v *Value) bool { 15379 b := v.Block 15380 _ = b 15381 typ := &b.Func.Config.Types 15382 _ = typ 15383 // match: (Mul64 (Const64 [c]) (Const64 [d])) 15384 // cond: 15385 // result: (Const64 [c*d]) 15386 for { 15387 _ = v.Args[1] 15388 v_0 := v.Args[0] 15389 if v_0.Op != OpConst64 { 15390 break 15391 } 15392 c := v_0.AuxInt 15393 v_1 := v.Args[1] 15394 if v_1.Op != OpConst64 { 15395 break 15396 } 15397 d := v_1.AuxInt 15398 v.reset(OpConst64) 15399 v.AuxInt = c * d 15400 return true 15401 } 15402 // match: (Mul64 (Const64 [d]) (Const64 [c])) 15403 // cond: 15404 // result: (Const64 [c*d]) 15405 for { 15406 _ = v.Args[1] 15407 v_0 := v.Args[0] 15408 if v_0.Op != OpConst64 { 15409 break 15410 } 15411 d := v_0.AuxInt 15412 v_1 := v.Args[1] 15413 if v_1.Op != OpConst64 { 15414 break 15415 } 15416 c := v_1.AuxInt 15417 v.reset(OpConst64) 15418 v.AuxInt = c * d 15419 return true 15420 } 15421 // match: (Mul64 (Const64 [1]) x) 15422 // cond: 15423 // result: x 15424 for { 15425 _ = v.Args[1] 15426 v_0 := v.Args[0] 15427 if v_0.Op != OpConst64 { 15428 break 15429 } 15430 if v_0.AuxInt != 1 { 15431 break 15432 } 15433 x := v.Args[1] 15434 v.reset(OpCopy) 15435 v.Type = x.Type 15436 v.AddArg(x) 15437 return true 15438 } 15439 // match: (Mul64 x (Const64 [1])) 15440 // cond: 15441 // result: x 15442 for { 15443 _ = v.Args[1] 15444 x := v.Args[0] 15445 v_1 := v.Args[1] 15446 if v_1.Op != OpConst64 { 15447 break 15448 } 15449 if v_1.AuxInt != 1 { 15450 break 15451 } 15452 v.reset(OpCopy) 15453 v.Type = x.Type 15454 v.AddArg(x) 15455 return true 15456 } 15457 // match: (Mul64 (Const64 [-1]) x) 15458 // cond: 15459 // result: (Neg64 x) 15460 for { 15461 _ = v.Args[1] 15462 v_0 := v.Args[0] 15463 if v_0.Op != OpConst64 { 15464 break 15465 } 15466 if v_0.AuxInt != -1 { 15467 break 15468 } 15469 x := v.Args[1] 15470 v.reset(OpNeg64) 15471 v.AddArg(x) 15472 return true 15473 } 15474 // match: (Mul64 x (Const64 [-1])) 15475 // cond: 15476 // result: (Neg64 x) 15477 for { 15478 _ = v.Args[1] 15479 x := v.Args[0] 15480 v_1 := v.Args[1] 15481 if v_1.Op != OpConst64 { 15482 break 15483 } 15484 if v_1.AuxInt != -1 { 15485 break 15486 } 15487 v.reset(OpNeg64) 15488 v.AddArg(x) 15489 return true 15490 } 15491 // match: (Mul64 <t> n (Const64 [c])) 15492 // cond: isPowerOfTwo(c) 15493 // result: (Lsh64x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 15494 for { 15495 t := v.Type 15496 _ = v.Args[1] 15497 n := v.Args[0] 15498 v_1 := v.Args[1] 15499 if v_1.Op != OpConst64 { 15500 break 15501 } 15502 c := v_1.AuxInt 15503 if !(isPowerOfTwo(c)) { 15504 break 15505 } 15506 v.reset(OpLsh64x64) 15507 v.Type = t 15508 v.AddArg(n) 15509 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 15510 v0.AuxInt = log2(c) 15511 v.AddArg(v0) 15512 return true 15513 } 15514 // match: (Mul64 <t> (Const64 [c]) n) 15515 // cond: isPowerOfTwo(c) 15516 // result: (Lsh64x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 15517 for { 15518 t := v.Type 15519 _ = v.Args[1] 15520 v_0 := v.Args[0] 15521 if v_0.Op != OpConst64 { 15522 break 15523 } 15524 c := v_0.AuxInt 15525 n := v.Args[1] 15526 if !(isPowerOfTwo(c)) { 15527 break 15528 } 15529 v.reset(OpLsh64x64) 15530 v.Type = t 15531 v.AddArg(n) 15532 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 15533 v0.AuxInt = log2(c) 15534 v.AddArg(v0) 15535 return true 15536 } 15537 // match: (Mul64 <t> n (Const64 [c])) 15538 // cond: t.IsSigned() && isPowerOfTwo(-c) 15539 // result: (Neg64 (Lsh64x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 15540 for { 15541 t := v.Type 15542 _ = v.Args[1] 15543 n := v.Args[0] 15544 v_1 := v.Args[1] 15545 if v_1.Op != OpConst64 { 15546 break 15547 } 15548 c := v_1.AuxInt 15549 if !(t.IsSigned() && isPowerOfTwo(-c)) { 15550 break 15551 } 15552 v.reset(OpNeg64) 15553 v0 := b.NewValue0(v.Pos, OpLsh64x64, t) 15554 v0.AddArg(n) 15555 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 15556 v1.AuxInt = log2(-c) 15557 v0.AddArg(v1) 15558 v.AddArg(v0) 15559 return true 15560 } 15561 // match: (Mul64 <t> (Const64 [c]) n) 15562 // cond: t.IsSigned() && isPowerOfTwo(-c) 15563 // result: (Neg64 (Lsh64x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 15564 for { 15565 t := v.Type 15566 _ = v.Args[1] 15567 v_0 := v.Args[0] 15568 if v_0.Op != OpConst64 { 15569 break 15570 } 15571 c := v_0.AuxInt 15572 n := v.Args[1] 15573 if !(t.IsSigned() && isPowerOfTwo(-c)) { 15574 break 15575 } 15576 v.reset(OpNeg64) 15577 v0 := b.NewValue0(v.Pos, OpLsh64x64, t) 15578 v0.AddArg(n) 15579 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 15580 v1.AuxInt = log2(-c) 15581 v0.AddArg(v1) 15582 v.AddArg(v0) 15583 return true 15584 } 15585 return false 15586 } 15587 func rewriteValuegeneric_OpMul64_10(v *Value) bool { 15588 b := v.Block 15589 _ = b 15590 // match: (Mul64 (Const64 <t> [c]) (Add64 <t> (Const64 <t> [d]) x)) 15591 // cond: 15592 // result: (Add64 (Const64 <t> [c*d]) (Mul64 <t> (Const64 <t> [c]) x)) 15593 for { 15594 _ = v.Args[1] 15595 v_0 := v.Args[0] 15596 if v_0.Op != OpConst64 { 15597 break 15598 } 15599 t := v_0.Type 15600 c := v_0.AuxInt 15601 v_1 := v.Args[1] 15602 if v_1.Op != OpAdd64 { 15603 break 15604 } 15605 if v_1.Type != t { 15606 break 15607 } 15608 _ = v_1.Args[1] 15609 v_1_0 := v_1.Args[0] 15610 if v_1_0.Op != OpConst64 { 15611 break 15612 } 15613 if v_1_0.Type != t { 15614 break 15615 } 15616 d := v_1_0.AuxInt 15617 x := v_1.Args[1] 15618 v.reset(OpAdd64) 15619 v0 := b.NewValue0(v.Pos, OpConst64, t) 15620 v0.AuxInt = c * d 15621 v.AddArg(v0) 15622 v1 := b.NewValue0(v.Pos, OpMul64, t) 15623 v2 := b.NewValue0(v.Pos, OpConst64, t) 15624 v2.AuxInt = c 15625 v1.AddArg(v2) 15626 v1.AddArg(x) 15627 v.AddArg(v1) 15628 return true 15629 } 15630 // match: (Mul64 (Const64 <t> [c]) (Add64 <t> x (Const64 <t> [d]))) 15631 // cond: 15632 // result: (Add64 (Const64 <t> [c*d]) (Mul64 <t> (Const64 <t> [c]) x)) 15633 for { 15634 _ = v.Args[1] 15635 v_0 := v.Args[0] 15636 if v_0.Op != OpConst64 { 15637 break 15638 } 15639 t := v_0.Type 15640 c := v_0.AuxInt 15641 v_1 := v.Args[1] 15642 if v_1.Op != OpAdd64 { 15643 break 15644 } 15645 if v_1.Type != t { 15646 break 15647 } 15648 _ = v_1.Args[1] 15649 x := v_1.Args[0] 15650 v_1_1 := v_1.Args[1] 15651 if v_1_1.Op != OpConst64 { 15652 break 15653 } 15654 if v_1_1.Type != t { 15655 break 15656 } 15657 d := v_1_1.AuxInt 15658 v.reset(OpAdd64) 15659 v0 := b.NewValue0(v.Pos, OpConst64, t) 15660 v0.AuxInt = c * d 15661 v.AddArg(v0) 15662 v1 := b.NewValue0(v.Pos, OpMul64, t) 15663 v2 := b.NewValue0(v.Pos, OpConst64, t) 15664 v2.AuxInt = c 15665 v1.AddArg(v2) 15666 v1.AddArg(x) 15667 v.AddArg(v1) 15668 return true 15669 } 15670 // match: (Mul64 (Add64 <t> (Const64 <t> [d]) x) (Const64 <t> [c])) 15671 // cond: 15672 // result: (Add64 (Const64 <t> [c*d]) (Mul64 <t> (Const64 <t> [c]) x)) 15673 for { 15674 _ = v.Args[1] 15675 v_0 := v.Args[0] 15676 if v_0.Op != OpAdd64 { 15677 break 15678 } 15679 t := v_0.Type 15680 _ = v_0.Args[1] 15681 v_0_0 := v_0.Args[0] 15682 if v_0_0.Op != OpConst64 { 15683 break 15684 } 15685 if v_0_0.Type != t { 15686 break 15687 } 15688 d := v_0_0.AuxInt 15689 x := v_0.Args[1] 15690 v_1 := v.Args[1] 15691 if v_1.Op != OpConst64 { 15692 break 15693 } 15694 if v_1.Type != t { 15695 break 15696 } 15697 c := v_1.AuxInt 15698 v.reset(OpAdd64) 15699 v0 := b.NewValue0(v.Pos, OpConst64, t) 15700 v0.AuxInt = c * d 15701 v.AddArg(v0) 15702 v1 := b.NewValue0(v.Pos, OpMul64, t) 15703 v2 := b.NewValue0(v.Pos, OpConst64, t) 15704 v2.AuxInt = c 15705 v1.AddArg(v2) 15706 v1.AddArg(x) 15707 v.AddArg(v1) 15708 return true 15709 } 15710 // match: (Mul64 (Add64 <t> x (Const64 <t> [d])) (Const64 <t> [c])) 15711 // cond: 15712 // result: (Add64 (Const64 <t> [c*d]) (Mul64 <t> (Const64 <t> [c]) x)) 15713 for { 15714 _ = v.Args[1] 15715 v_0 := v.Args[0] 15716 if v_0.Op != OpAdd64 { 15717 break 15718 } 15719 t := v_0.Type 15720 _ = v_0.Args[1] 15721 x := v_0.Args[0] 15722 v_0_1 := v_0.Args[1] 15723 if v_0_1.Op != OpConst64 { 15724 break 15725 } 15726 if v_0_1.Type != t { 15727 break 15728 } 15729 d := v_0_1.AuxInt 15730 v_1 := v.Args[1] 15731 if v_1.Op != OpConst64 { 15732 break 15733 } 15734 if v_1.Type != t { 15735 break 15736 } 15737 c := v_1.AuxInt 15738 v.reset(OpAdd64) 15739 v0 := b.NewValue0(v.Pos, OpConst64, t) 15740 v0.AuxInt = c * d 15741 v.AddArg(v0) 15742 v1 := b.NewValue0(v.Pos, OpMul64, t) 15743 v2 := b.NewValue0(v.Pos, OpConst64, t) 15744 v2.AuxInt = c 15745 v1.AddArg(v2) 15746 v1.AddArg(x) 15747 v.AddArg(v1) 15748 return true 15749 } 15750 // match: (Mul64 (Const64 [0]) _) 15751 // cond: 15752 // result: (Const64 [0]) 15753 for { 15754 _ = v.Args[1] 15755 v_0 := v.Args[0] 15756 if v_0.Op != OpConst64 { 15757 break 15758 } 15759 if v_0.AuxInt != 0 { 15760 break 15761 } 15762 v.reset(OpConst64) 15763 v.AuxInt = 0 15764 return true 15765 } 15766 // match: (Mul64 _ (Const64 [0])) 15767 // cond: 15768 // result: (Const64 [0]) 15769 for { 15770 _ = v.Args[1] 15771 v_1 := v.Args[1] 15772 if v_1.Op != OpConst64 { 15773 break 15774 } 15775 if v_1.AuxInt != 0 { 15776 break 15777 } 15778 v.reset(OpConst64) 15779 v.AuxInt = 0 15780 return true 15781 } 15782 // match: (Mul64 (Const64 <t> [c]) (Mul64 (Const64 <t> [d]) x)) 15783 // cond: 15784 // result: (Mul64 (Const64 <t> [c*d]) x) 15785 for { 15786 _ = v.Args[1] 15787 v_0 := v.Args[0] 15788 if v_0.Op != OpConst64 { 15789 break 15790 } 15791 t := v_0.Type 15792 c := v_0.AuxInt 15793 v_1 := v.Args[1] 15794 if v_1.Op != OpMul64 { 15795 break 15796 } 15797 _ = v_1.Args[1] 15798 v_1_0 := v_1.Args[0] 15799 if v_1_0.Op != OpConst64 { 15800 break 15801 } 15802 if v_1_0.Type != t { 15803 break 15804 } 15805 d := v_1_0.AuxInt 15806 x := v_1.Args[1] 15807 v.reset(OpMul64) 15808 v0 := b.NewValue0(v.Pos, OpConst64, t) 15809 v0.AuxInt = c * d 15810 v.AddArg(v0) 15811 v.AddArg(x) 15812 return true 15813 } 15814 // match: (Mul64 (Const64 <t> [c]) (Mul64 x (Const64 <t> [d]))) 15815 // cond: 15816 // result: (Mul64 (Const64 <t> [c*d]) x) 15817 for { 15818 _ = v.Args[1] 15819 v_0 := v.Args[0] 15820 if v_0.Op != OpConst64 { 15821 break 15822 } 15823 t := v_0.Type 15824 c := v_0.AuxInt 15825 v_1 := v.Args[1] 15826 if v_1.Op != OpMul64 { 15827 break 15828 } 15829 _ = v_1.Args[1] 15830 x := v_1.Args[0] 15831 v_1_1 := v_1.Args[1] 15832 if v_1_1.Op != OpConst64 { 15833 break 15834 } 15835 if v_1_1.Type != t { 15836 break 15837 } 15838 d := v_1_1.AuxInt 15839 v.reset(OpMul64) 15840 v0 := b.NewValue0(v.Pos, OpConst64, t) 15841 v0.AuxInt = c * d 15842 v.AddArg(v0) 15843 v.AddArg(x) 15844 return true 15845 } 15846 // match: (Mul64 (Mul64 (Const64 <t> [d]) x) (Const64 <t> [c])) 15847 // cond: 15848 // result: (Mul64 (Const64 <t> [c*d]) x) 15849 for { 15850 _ = v.Args[1] 15851 v_0 := v.Args[0] 15852 if v_0.Op != OpMul64 { 15853 break 15854 } 15855 _ = v_0.Args[1] 15856 v_0_0 := v_0.Args[0] 15857 if v_0_0.Op != OpConst64 { 15858 break 15859 } 15860 t := v_0_0.Type 15861 d := v_0_0.AuxInt 15862 x := v_0.Args[1] 15863 v_1 := v.Args[1] 15864 if v_1.Op != OpConst64 { 15865 break 15866 } 15867 if v_1.Type != t { 15868 break 15869 } 15870 c := v_1.AuxInt 15871 v.reset(OpMul64) 15872 v0 := b.NewValue0(v.Pos, OpConst64, t) 15873 v0.AuxInt = c * d 15874 v.AddArg(v0) 15875 v.AddArg(x) 15876 return true 15877 } 15878 // match: (Mul64 (Mul64 x (Const64 <t> [d])) (Const64 <t> [c])) 15879 // cond: 15880 // result: (Mul64 (Const64 <t> [c*d]) x) 15881 for { 15882 _ = v.Args[1] 15883 v_0 := v.Args[0] 15884 if v_0.Op != OpMul64 { 15885 break 15886 } 15887 _ = v_0.Args[1] 15888 x := v_0.Args[0] 15889 v_0_1 := v_0.Args[1] 15890 if v_0_1.Op != OpConst64 { 15891 break 15892 } 15893 t := v_0_1.Type 15894 d := v_0_1.AuxInt 15895 v_1 := v.Args[1] 15896 if v_1.Op != OpConst64 { 15897 break 15898 } 15899 if v_1.Type != t { 15900 break 15901 } 15902 c := v_1.AuxInt 15903 v.reset(OpMul64) 15904 v0 := b.NewValue0(v.Pos, OpConst64, t) 15905 v0.AuxInt = c * d 15906 v.AddArg(v0) 15907 v.AddArg(x) 15908 return true 15909 } 15910 return false 15911 } 15912 func rewriteValuegeneric_OpMul64F_0(v *Value) bool { 15913 // match: (Mul64F (Const64F [c]) (Const64F [d])) 15914 // cond: 15915 // result: (Const64F [f2i(i2f(c) * i2f(d))]) 15916 for { 15917 _ = v.Args[1] 15918 v_0 := v.Args[0] 15919 if v_0.Op != OpConst64F { 15920 break 15921 } 15922 c := v_0.AuxInt 15923 v_1 := v.Args[1] 15924 if v_1.Op != OpConst64F { 15925 break 15926 } 15927 d := v_1.AuxInt 15928 v.reset(OpConst64F) 15929 v.AuxInt = f2i(i2f(c) * i2f(d)) 15930 return true 15931 } 15932 // match: (Mul64F (Const64F [d]) (Const64F [c])) 15933 // cond: 15934 // result: (Const64F [f2i(i2f(c) * i2f(d))]) 15935 for { 15936 _ = v.Args[1] 15937 v_0 := v.Args[0] 15938 if v_0.Op != OpConst64F { 15939 break 15940 } 15941 d := v_0.AuxInt 15942 v_1 := v.Args[1] 15943 if v_1.Op != OpConst64F { 15944 break 15945 } 15946 c := v_1.AuxInt 15947 v.reset(OpConst64F) 15948 v.AuxInt = f2i(i2f(c) * i2f(d)) 15949 return true 15950 } 15951 // match: (Mul64F x (Const64F [f2i(1)])) 15952 // cond: 15953 // result: x 15954 for { 15955 _ = v.Args[1] 15956 x := v.Args[0] 15957 v_1 := v.Args[1] 15958 if v_1.Op != OpConst64F { 15959 break 15960 } 15961 if v_1.AuxInt != f2i(1) { 15962 break 15963 } 15964 v.reset(OpCopy) 15965 v.Type = x.Type 15966 v.AddArg(x) 15967 return true 15968 } 15969 // match: (Mul64F (Const64F [f2i(1)]) x) 15970 // cond: 15971 // result: x 15972 for { 15973 _ = v.Args[1] 15974 v_0 := v.Args[0] 15975 if v_0.Op != OpConst64F { 15976 break 15977 } 15978 if v_0.AuxInt != f2i(1) { 15979 break 15980 } 15981 x := v.Args[1] 15982 v.reset(OpCopy) 15983 v.Type = x.Type 15984 v.AddArg(x) 15985 return true 15986 } 15987 // match: (Mul64F x (Const64F [f2i(-1)])) 15988 // cond: 15989 // result: (Neg64F x) 15990 for { 15991 _ = v.Args[1] 15992 x := v.Args[0] 15993 v_1 := v.Args[1] 15994 if v_1.Op != OpConst64F { 15995 break 15996 } 15997 if v_1.AuxInt != f2i(-1) { 15998 break 15999 } 16000 v.reset(OpNeg64F) 16001 v.AddArg(x) 16002 return true 16003 } 16004 // match: (Mul64F (Const64F [f2i(-1)]) x) 16005 // cond: 16006 // result: (Neg64F x) 16007 for { 16008 _ = v.Args[1] 16009 v_0 := v.Args[0] 16010 if v_0.Op != OpConst64F { 16011 break 16012 } 16013 if v_0.AuxInt != f2i(-1) { 16014 break 16015 } 16016 x := v.Args[1] 16017 v.reset(OpNeg64F) 16018 v.AddArg(x) 16019 return true 16020 } 16021 // match: (Mul64F x (Const64F [f2i(2)])) 16022 // cond: 16023 // result: (Add64F x x) 16024 for { 16025 _ = v.Args[1] 16026 x := v.Args[0] 16027 v_1 := v.Args[1] 16028 if v_1.Op != OpConst64F { 16029 break 16030 } 16031 if v_1.AuxInt != f2i(2) { 16032 break 16033 } 16034 v.reset(OpAdd64F) 16035 v.AddArg(x) 16036 v.AddArg(x) 16037 return true 16038 } 16039 // match: (Mul64F (Const64F [f2i(2)]) x) 16040 // cond: 16041 // result: (Add64F x x) 16042 for { 16043 _ = v.Args[1] 16044 v_0 := v.Args[0] 16045 if v_0.Op != OpConst64F { 16046 break 16047 } 16048 if v_0.AuxInt != f2i(2) { 16049 break 16050 } 16051 x := v.Args[1] 16052 v.reset(OpAdd64F) 16053 v.AddArg(x) 16054 v.AddArg(x) 16055 return true 16056 } 16057 return false 16058 } 16059 func rewriteValuegeneric_OpMul8_0(v *Value) bool { 16060 b := v.Block 16061 _ = b 16062 typ := &b.Func.Config.Types 16063 _ = typ 16064 // match: (Mul8 (Const8 [c]) (Const8 [d])) 16065 // cond: 16066 // result: (Const8 [int64(int8(c*d))]) 16067 for { 16068 _ = v.Args[1] 16069 v_0 := v.Args[0] 16070 if v_0.Op != OpConst8 { 16071 break 16072 } 16073 c := v_0.AuxInt 16074 v_1 := v.Args[1] 16075 if v_1.Op != OpConst8 { 16076 break 16077 } 16078 d := v_1.AuxInt 16079 v.reset(OpConst8) 16080 v.AuxInt = int64(int8(c * d)) 16081 return true 16082 } 16083 // match: (Mul8 (Const8 [d]) (Const8 [c])) 16084 // cond: 16085 // result: (Const8 [int64(int8(c*d))]) 16086 for { 16087 _ = v.Args[1] 16088 v_0 := v.Args[0] 16089 if v_0.Op != OpConst8 { 16090 break 16091 } 16092 d := v_0.AuxInt 16093 v_1 := v.Args[1] 16094 if v_1.Op != OpConst8 { 16095 break 16096 } 16097 c := v_1.AuxInt 16098 v.reset(OpConst8) 16099 v.AuxInt = int64(int8(c * d)) 16100 return true 16101 } 16102 // match: (Mul8 (Const8 [1]) x) 16103 // cond: 16104 // result: x 16105 for { 16106 _ = v.Args[1] 16107 v_0 := v.Args[0] 16108 if v_0.Op != OpConst8 { 16109 break 16110 } 16111 if v_0.AuxInt != 1 { 16112 break 16113 } 16114 x := v.Args[1] 16115 v.reset(OpCopy) 16116 v.Type = x.Type 16117 v.AddArg(x) 16118 return true 16119 } 16120 // match: (Mul8 x (Const8 [1])) 16121 // cond: 16122 // result: x 16123 for { 16124 _ = v.Args[1] 16125 x := v.Args[0] 16126 v_1 := v.Args[1] 16127 if v_1.Op != OpConst8 { 16128 break 16129 } 16130 if v_1.AuxInt != 1 { 16131 break 16132 } 16133 v.reset(OpCopy) 16134 v.Type = x.Type 16135 v.AddArg(x) 16136 return true 16137 } 16138 // match: (Mul8 (Const8 [-1]) x) 16139 // cond: 16140 // result: (Neg8 x) 16141 for { 16142 _ = v.Args[1] 16143 v_0 := v.Args[0] 16144 if v_0.Op != OpConst8 { 16145 break 16146 } 16147 if v_0.AuxInt != -1 { 16148 break 16149 } 16150 x := v.Args[1] 16151 v.reset(OpNeg8) 16152 v.AddArg(x) 16153 return true 16154 } 16155 // match: (Mul8 x (Const8 [-1])) 16156 // cond: 16157 // result: (Neg8 x) 16158 for { 16159 _ = v.Args[1] 16160 x := v.Args[0] 16161 v_1 := v.Args[1] 16162 if v_1.Op != OpConst8 { 16163 break 16164 } 16165 if v_1.AuxInt != -1 { 16166 break 16167 } 16168 v.reset(OpNeg8) 16169 v.AddArg(x) 16170 return true 16171 } 16172 // match: (Mul8 <t> n (Const8 [c])) 16173 // cond: isPowerOfTwo(c) 16174 // result: (Lsh8x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 16175 for { 16176 t := v.Type 16177 _ = v.Args[1] 16178 n := v.Args[0] 16179 v_1 := v.Args[1] 16180 if v_1.Op != OpConst8 { 16181 break 16182 } 16183 c := v_1.AuxInt 16184 if !(isPowerOfTwo(c)) { 16185 break 16186 } 16187 v.reset(OpLsh8x64) 16188 v.Type = t 16189 v.AddArg(n) 16190 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 16191 v0.AuxInt = log2(c) 16192 v.AddArg(v0) 16193 return true 16194 } 16195 // match: (Mul8 <t> (Const8 [c]) n) 16196 // cond: isPowerOfTwo(c) 16197 // result: (Lsh8x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 16198 for { 16199 t := v.Type 16200 _ = v.Args[1] 16201 v_0 := v.Args[0] 16202 if v_0.Op != OpConst8 { 16203 break 16204 } 16205 c := v_0.AuxInt 16206 n := v.Args[1] 16207 if !(isPowerOfTwo(c)) { 16208 break 16209 } 16210 v.reset(OpLsh8x64) 16211 v.Type = t 16212 v.AddArg(n) 16213 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 16214 v0.AuxInt = log2(c) 16215 v.AddArg(v0) 16216 return true 16217 } 16218 // match: (Mul8 <t> n (Const8 [c])) 16219 // cond: t.IsSigned() && isPowerOfTwo(-c) 16220 // result: (Neg8 (Lsh8x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 16221 for { 16222 t := v.Type 16223 _ = v.Args[1] 16224 n := v.Args[0] 16225 v_1 := v.Args[1] 16226 if v_1.Op != OpConst8 { 16227 break 16228 } 16229 c := v_1.AuxInt 16230 if !(t.IsSigned() && isPowerOfTwo(-c)) { 16231 break 16232 } 16233 v.reset(OpNeg8) 16234 v0 := b.NewValue0(v.Pos, OpLsh8x64, t) 16235 v0.AddArg(n) 16236 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 16237 v1.AuxInt = log2(-c) 16238 v0.AddArg(v1) 16239 v.AddArg(v0) 16240 return true 16241 } 16242 // match: (Mul8 <t> (Const8 [c]) n) 16243 // cond: t.IsSigned() && isPowerOfTwo(-c) 16244 // result: (Neg8 (Lsh8x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 16245 for { 16246 t := v.Type 16247 _ = v.Args[1] 16248 v_0 := v.Args[0] 16249 if v_0.Op != OpConst8 { 16250 break 16251 } 16252 c := v_0.AuxInt 16253 n := v.Args[1] 16254 if !(t.IsSigned() && isPowerOfTwo(-c)) { 16255 break 16256 } 16257 v.reset(OpNeg8) 16258 v0 := b.NewValue0(v.Pos, OpLsh8x64, t) 16259 v0.AddArg(n) 16260 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 16261 v1.AuxInt = log2(-c) 16262 v0.AddArg(v1) 16263 v.AddArg(v0) 16264 return true 16265 } 16266 return false 16267 } 16268 func rewriteValuegeneric_OpMul8_10(v *Value) bool { 16269 b := v.Block 16270 _ = b 16271 // match: (Mul8 (Const8 [0]) _) 16272 // cond: 16273 // result: (Const8 [0]) 16274 for { 16275 _ = v.Args[1] 16276 v_0 := v.Args[0] 16277 if v_0.Op != OpConst8 { 16278 break 16279 } 16280 if v_0.AuxInt != 0 { 16281 break 16282 } 16283 v.reset(OpConst8) 16284 v.AuxInt = 0 16285 return true 16286 } 16287 // match: (Mul8 _ (Const8 [0])) 16288 // cond: 16289 // result: (Const8 [0]) 16290 for { 16291 _ = v.Args[1] 16292 v_1 := v.Args[1] 16293 if v_1.Op != OpConst8 { 16294 break 16295 } 16296 if v_1.AuxInt != 0 { 16297 break 16298 } 16299 v.reset(OpConst8) 16300 v.AuxInt = 0 16301 return true 16302 } 16303 // match: (Mul8 (Const8 <t> [c]) (Mul8 (Const8 <t> [d]) x)) 16304 // cond: 16305 // result: (Mul8 (Const8 <t> [int64(int8(c*d))]) x) 16306 for { 16307 _ = v.Args[1] 16308 v_0 := v.Args[0] 16309 if v_0.Op != OpConst8 { 16310 break 16311 } 16312 t := v_0.Type 16313 c := v_0.AuxInt 16314 v_1 := v.Args[1] 16315 if v_1.Op != OpMul8 { 16316 break 16317 } 16318 _ = v_1.Args[1] 16319 v_1_0 := v_1.Args[0] 16320 if v_1_0.Op != OpConst8 { 16321 break 16322 } 16323 if v_1_0.Type != t { 16324 break 16325 } 16326 d := v_1_0.AuxInt 16327 x := v_1.Args[1] 16328 v.reset(OpMul8) 16329 v0 := b.NewValue0(v.Pos, OpConst8, t) 16330 v0.AuxInt = int64(int8(c * d)) 16331 v.AddArg(v0) 16332 v.AddArg(x) 16333 return true 16334 } 16335 // match: (Mul8 (Const8 <t> [c]) (Mul8 x (Const8 <t> [d]))) 16336 // cond: 16337 // result: (Mul8 (Const8 <t> [int64(int8(c*d))]) x) 16338 for { 16339 _ = v.Args[1] 16340 v_0 := v.Args[0] 16341 if v_0.Op != OpConst8 { 16342 break 16343 } 16344 t := v_0.Type 16345 c := v_0.AuxInt 16346 v_1 := v.Args[1] 16347 if v_1.Op != OpMul8 { 16348 break 16349 } 16350 _ = v_1.Args[1] 16351 x := v_1.Args[0] 16352 v_1_1 := v_1.Args[1] 16353 if v_1_1.Op != OpConst8 { 16354 break 16355 } 16356 if v_1_1.Type != t { 16357 break 16358 } 16359 d := v_1_1.AuxInt 16360 v.reset(OpMul8) 16361 v0 := b.NewValue0(v.Pos, OpConst8, t) 16362 v0.AuxInt = int64(int8(c * d)) 16363 v.AddArg(v0) 16364 v.AddArg(x) 16365 return true 16366 } 16367 // match: (Mul8 (Mul8 (Const8 <t> [d]) x) (Const8 <t> [c])) 16368 // cond: 16369 // result: (Mul8 (Const8 <t> [int64(int8(c*d))]) x) 16370 for { 16371 _ = v.Args[1] 16372 v_0 := v.Args[0] 16373 if v_0.Op != OpMul8 { 16374 break 16375 } 16376 _ = v_0.Args[1] 16377 v_0_0 := v_0.Args[0] 16378 if v_0_0.Op != OpConst8 { 16379 break 16380 } 16381 t := v_0_0.Type 16382 d := v_0_0.AuxInt 16383 x := v_0.Args[1] 16384 v_1 := v.Args[1] 16385 if v_1.Op != OpConst8 { 16386 break 16387 } 16388 if v_1.Type != t { 16389 break 16390 } 16391 c := v_1.AuxInt 16392 v.reset(OpMul8) 16393 v0 := b.NewValue0(v.Pos, OpConst8, t) 16394 v0.AuxInt = int64(int8(c * d)) 16395 v.AddArg(v0) 16396 v.AddArg(x) 16397 return true 16398 } 16399 // match: (Mul8 (Mul8 x (Const8 <t> [d])) (Const8 <t> [c])) 16400 // cond: 16401 // result: (Mul8 (Const8 <t> [int64(int8(c*d))]) x) 16402 for { 16403 _ = v.Args[1] 16404 v_0 := v.Args[0] 16405 if v_0.Op != OpMul8 { 16406 break 16407 } 16408 _ = v_0.Args[1] 16409 x := v_0.Args[0] 16410 v_0_1 := v_0.Args[1] 16411 if v_0_1.Op != OpConst8 { 16412 break 16413 } 16414 t := v_0_1.Type 16415 d := v_0_1.AuxInt 16416 v_1 := v.Args[1] 16417 if v_1.Op != OpConst8 { 16418 break 16419 } 16420 if v_1.Type != t { 16421 break 16422 } 16423 c := v_1.AuxInt 16424 v.reset(OpMul8) 16425 v0 := b.NewValue0(v.Pos, OpConst8, t) 16426 v0.AuxInt = int64(int8(c * d)) 16427 v.AddArg(v0) 16428 v.AddArg(x) 16429 return true 16430 } 16431 return false 16432 } 16433 func rewriteValuegeneric_OpNeg16_0(v *Value) bool { 16434 // match: (Neg16 (Const16 [c])) 16435 // cond: 16436 // result: (Const16 [int64(-int16(c))]) 16437 for { 16438 v_0 := v.Args[0] 16439 if v_0.Op != OpConst16 { 16440 break 16441 } 16442 c := v_0.AuxInt 16443 v.reset(OpConst16) 16444 v.AuxInt = int64(-int16(c)) 16445 return true 16446 } 16447 // match: (Neg16 (Sub16 x y)) 16448 // cond: 16449 // result: (Sub16 y x) 16450 for { 16451 v_0 := v.Args[0] 16452 if v_0.Op != OpSub16 { 16453 break 16454 } 16455 _ = v_0.Args[1] 16456 x := v_0.Args[0] 16457 y := v_0.Args[1] 16458 v.reset(OpSub16) 16459 v.AddArg(y) 16460 v.AddArg(x) 16461 return true 16462 } 16463 return false 16464 } 16465 func rewriteValuegeneric_OpNeg32_0(v *Value) bool { 16466 // match: (Neg32 (Const32 [c])) 16467 // cond: 16468 // result: (Const32 [int64(-int32(c))]) 16469 for { 16470 v_0 := v.Args[0] 16471 if v_0.Op != OpConst32 { 16472 break 16473 } 16474 c := v_0.AuxInt 16475 v.reset(OpConst32) 16476 v.AuxInt = int64(-int32(c)) 16477 return true 16478 } 16479 // match: (Neg32 (Sub32 x y)) 16480 // cond: 16481 // result: (Sub32 y x) 16482 for { 16483 v_0 := v.Args[0] 16484 if v_0.Op != OpSub32 { 16485 break 16486 } 16487 _ = v_0.Args[1] 16488 x := v_0.Args[0] 16489 y := v_0.Args[1] 16490 v.reset(OpSub32) 16491 v.AddArg(y) 16492 v.AddArg(x) 16493 return true 16494 } 16495 return false 16496 } 16497 func rewriteValuegeneric_OpNeg32F_0(v *Value) bool { 16498 // match: (Neg32F (Const32F [c])) 16499 // cond: i2f(c) != 0 16500 // result: (Const32F [f2i(-i2f(c))]) 16501 for { 16502 v_0 := v.Args[0] 16503 if v_0.Op != OpConst32F { 16504 break 16505 } 16506 c := v_0.AuxInt 16507 if !(i2f(c) != 0) { 16508 break 16509 } 16510 v.reset(OpConst32F) 16511 v.AuxInt = f2i(-i2f(c)) 16512 return true 16513 } 16514 return false 16515 } 16516 func rewriteValuegeneric_OpNeg64_0(v *Value) bool { 16517 // match: (Neg64 (Const64 [c])) 16518 // cond: 16519 // result: (Const64 [-c]) 16520 for { 16521 v_0 := v.Args[0] 16522 if v_0.Op != OpConst64 { 16523 break 16524 } 16525 c := v_0.AuxInt 16526 v.reset(OpConst64) 16527 v.AuxInt = -c 16528 return true 16529 } 16530 // match: (Neg64 (Sub64 x y)) 16531 // cond: 16532 // result: (Sub64 y x) 16533 for { 16534 v_0 := v.Args[0] 16535 if v_0.Op != OpSub64 { 16536 break 16537 } 16538 _ = v_0.Args[1] 16539 x := v_0.Args[0] 16540 y := v_0.Args[1] 16541 v.reset(OpSub64) 16542 v.AddArg(y) 16543 v.AddArg(x) 16544 return true 16545 } 16546 return false 16547 } 16548 func rewriteValuegeneric_OpNeg64F_0(v *Value) bool { 16549 // match: (Neg64F (Const64F [c])) 16550 // cond: i2f(c) != 0 16551 // result: (Const64F [f2i(-i2f(c))]) 16552 for { 16553 v_0 := v.Args[0] 16554 if v_0.Op != OpConst64F { 16555 break 16556 } 16557 c := v_0.AuxInt 16558 if !(i2f(c) != 0) { 16559 break 16560 } 16561 v.reset(OpConst64F) 16562 v.AuxInt = f2i(-i2f(c)) 16563 return true 16564 } 16565 return false 16566 } 16567 func rewriteValuegeneric_OpNeg8_0(v *Value) bool { 16568 // match: (Neg8 (Const8 [c])) 16569 // cond: 16570 // result: (Const8 [int64( -int8(c))]) 16571 for { 16572 v_0 := v.Args[0] 16573 if v_0.Op != OpConst8 { 16574 break 16575 } 16576 c := v_0.AuxInt 16577 v.reset(OpConst8) 16578 v.AuxInt = int64(-int8(c)) 16579 return true 16580 } 16581 // match: (Neg8 (Sub8 x y)) 16582 // cond: 16583 // result: (Sub8 y x) 16584 for { 16585 v_0 := v.Args[0] 16586 if v_0.Op != OpSub8 { 16587 break 16588 } 16589 _ = v_0.Args[1] 16590 x := v_0.Args[0] 16591 y := v_0.Args[1] 16592 v.reset(OpSub8) 16593 v.AddArg(y) 16594 v.AddArg(x) 16595 return true 16596 } 16597 return false 16598 } 16599 func rewriteValuegeneric_OpNeq16_0(v *Value) bool { 16600 b := v.Block 16601 _ = b 16602 // match: (Neq16 x x) 16603 // cond: 16604 // result: (ConstBool [0]) 16605 for { 16606 _ = v.Args[1] 16607 x := v.Args[0] 16608 if x != v.Args[1] { 16609 break 16610 } 16611 v.reset(OpConstBool) 16612 v.AuxInt = 0 16613 return true 16614 } 16615 // match: (Neq16 (Const16 <t> [c]) (Add16 (Const16 <t> [d]) x)) 16616 // cond: 16617 // result: (Neq16 (Const16 <t> [int64(int16(c-d))]) x) 16618 for { 16619 _ = v.Args[1] 16620 v_0 := v.Args[0] 16621 if v_0.Op != OpConst16 { 16622 break 16623 } 16624 t := v_0.Type 16625 c := v_0.AuxInt 16626 v_1 := v.Args[1] 16627 if v_1.Op != OpAdd16 { 16628 break 16629 } 16630 _ = v_1.Args[1] 16631 v_1_0 := v_1.Args[0] 16632 if v_1_0.Op != OpConst16 { 16633 break 16634 } 16635 if v_1_0.Type != t { 16636 break 16637 } 16638 d := v_1_0.AuxInt 16639 x := v_1.Args[1] 16640 v.reset(OpNeq16) 16641 v0 := b.NewValue0(v.Pos, OpConst16, t) 16642 v0.AuxInt = int64(int16(c - d)) 16643 v.AddArg(v0) 16644 v.AddArg(x) 16645 return true 16646 } 16647 // match: (Neq16 (Const16 <t> [c]) (Add16 x (Const16 <t> [d]))) 16648 // cond: 16649 // result: (Neq16 (Const16 <t> [int64(int16(c-d))]) x) 16650 for { 16651 _ = v.Args[1] 16652 v_0 := v.Args[0] 16653 if v_0.Op != OpConst16 { 16654 break 16655 } 16656 t := v_0.Type 16657 c := v_0.AuxInt 16658 v_1 := v.Args[1] 16659 if v_1.Op != OpAdd16 { 16660 break 16661 } 16662 _ = v_1.Args[1] 16663 x := v_1.Args[0] 16664 v_1_1 := v_1.Args[1] 16665 if v_1_1.Op != OpConst16 { 16666 break 16667 } 16668 if v_1_1.Type != t { 16669 break 16670 } 16671 d := v_1_1.AuxInt 16672 v.reset(OpNeq16) 16673 v0 := b.NewValue0(v.Pos, OpConst16, t) 16674 v0.AuxInt = int64(int16(c - d)) 16675 v.AddArg(v0) 16676 v.AddArg(x) 16677 return true 16678 } 16679 // match: (Neq16 (Add16 (Const16 <t> [d]) x) (Const16 <t> [c])) 16680 // cond: 16681 // result: (Neq16 (Const16 <t> [int64(int16(c-d))]) x) 16682 for { 16683 _ = v.Args[1] 16684 v_0 := v.Args[0] 16685 if v_0.Op != OpAdd16 { 16686 break 16687 } 16688 _ = v_0.Args[1] 16689 v_0_0 := v_0.Args[0] 16690 if v_0_0.Op != OpConst16 { 16691 break 16692 } 16693 t := v_0_0.Type 16694 d := v_0_0.AuxInt 16695 x := v_0.Args[1] 16696 v_1 := v.Args[1] 16697 if v_1.Op != OpConst16 { 16698 break 16699 } 16700 if v_1.Type != t { 16701 break 16702 } 16703 c := v_1.AuxInt 16704 v.reset(OpNeq16) 16705 v0 := b.NewValue0(v.Pos, OpConst16, t) 16706 v0.AuxInt = int64(int16(c - d)) 16707 v.AddArg(v0) 16708 v.AddArg(x) 16709 return true 16710 } 16711 // match: (Neq16 (Add16 x (Const16 <t> [d])) (Const16 <t> [c])) 16712 // cond: 16713 // result: (Neq16 (Const16 <t> [int64(int16(c-d))]) x) 16714 for { 16715 _ = v.Args[1] 16716 v_0 := v.Args[0] 16717 if v_0.Op != OpAdd16 { 16718 break 16719 } 16720 _ = v_0.Args[1] 16721 x := v_0.Args[0] 16722 v_0_1 := v_0.Args[1] 16723 if v_0_1.Op != OpConst16 { 16724 break 16725 } 16726 t := v_0_1.Type 16727 d := v_0_1.AuxInt 16728 v_1 := v.Args[1] 16729 if v_1.Op != OpConst16 { 16730 break 16731 } 16732 if v_1.Type != t { 16733 break 16734 } 16735 c := v_1.AuxInt 16736 v.reset(OpNeq16) 16737 v0 := b.NewValue0(v.Pos, OpConst16, t) 16738 v0.AuxInt = int64(int16(c - d)) 16739 v.AddArg(v0) 16740 v.AddArg(x) 16741 return true 16742 } 16743 // match: (Neq16 (Const16 [c]) (Const16 [d])) 16744 // cond: 16745 // result: (ConstBool [b2i(c != d)]) 16746 for { 16747 _ = v.Args[1] 16748 v_0 := v.Args[0] 16749 if v_0.Op != OpConst16 { 16750 break 16751 } 16752 c := v_0.AuxInt 16753 v_1 := v.Args[1] 16754 if v_1.Op != OpConst16 { 16755 break 16756 } 16757 d := v_1.AuxInt 16758 v.reset(OpConstBool) 16759 v.AuxInt = b2i(c != d) 16760 return true 16761 } 16762 // match: (Neq16 (Const16 [d]) (Const16 [c])) 16763 // cond: 16764 // result: (ConstBool [b2i(c != d)]) 16765 for { 16766 _ = v.Args[1] 16767 v_0 := v.Args[0] 16768 if v_0.Op != OpConst16 { 16769 break 16770 } 16771 d := v_0.AuxInt 16772 v_1 := v.Args[1] 16773 if v_1.Op != OpConst16 { 16774 break 16775 } 16776 c := v_1.AuxInt 16777 v.reset(OpConstBool) 16778 v.AuxInt = b2i(c != d) 16779 return true 16780 } 16781 return false 16782 } 16783 func rewriteValuegeneric_OpNeq32_0(v *Value) bool { 16784 b := v.Block 16785 _ = b 16786 // match: (Neq32 x x) 16787 // cond: 16788 // result: (ConstBool [0]) 16789 for { 16790 _ = v.Args[1] 16791 x := v.Args[0] 16792 if x != v.Args[1] { 16793 break 16794 } 16795 v.reset(OpConstBool) 16796 v.AuxInt = 0 16797 return true 16798 } 16799 // match: (Neq32 (Const32 <t> [c]) (Add32 (Const32 <t> [d]) x)) 16800 // cond: 16801 // result: (Neq32 (Const32 <t> [int64(int32(c-d))]) x) 16802 for { 16803 _ = v.Args[1] 16804 v_0 := v.Args[0] 16805 if v_0.Op != OpConst32 { 16806 break 16807 } 16808 t := v_0.Type 16809 c := v_0.AuxInt 16810 v_1 := v.Args[1] 16811 if v_1.Op != OpAdd32 { 16812 break 16813 } 16814 _ = v_1.Args[1] 16815 v_1_0 := v_1.Args[0] 16816 if v_1_0.Op != OpConst32 { 16817 break 16818 } 16819 if v_1_0.Type != t { 16820 break 16821 } 16822 d := v_1_0.AuxInt 16823 x := v_1.Args[1] 16824 v.reset(OpNeq32) 16825 v0 := b.NewValue0(v.Pos, OpConst32, t) 16826 v0.AuxInt = int64(int32(c - d)) 16827 v.AddArg(v0) 16828 v.AddArg(x) 16829 return true 16830 } 16831 // match: (Neq32 (Const32 <t> [c]) (Add32 x (Const32 <t> [d]))) 16832 // cond: 16833 // result: (Neq32 (Const32 <t> [int64(int32(c-d))]) x) 16834 for { 16835 _ = v.Args[1] 16836 v_0 := v.Args[0] 16837 if v_0.Op != OpConst32 { 16838 break 16839 } 16840 t := v_0.Type 16841 c := v_0.AuxInt 16842 v_1 := v.Args[1] 16843 if v_1.Op != OpAdd32 { 16844 break 16845 } 16846 _ = v_1.Args[1] 16847 x := v_1.Args[0] 16848 v_1_1 := v_1.Args[1] 16849 if v_1_1.Op != OpConst32 { 16850 break 16851 } 16852 if v_1_1.Type != t { 16853 break 16854 } 16855 d := v_1_1.AuxInt 16856 v.reset(OpNeq32) 16857 v0 := b.NewValue0(v.Pos, OpConst32, t) 16858 v0.AuxInt = int64(int32(c - d)) 16859 v.AddArg(v0) 16860 v.AddArg(x) 16861 return true 16862 } 16863 // match: (Neq32 (Add32 (Const32 <t> [d]) x) (Const32 <t> [c])) 16864 // cond: 16865 // result: (Neq32 (Const32 <t> [int64(int32(c-d))]) x) 16866 for { 16867 _ = v.Args[1] 16868 v_0 := v.Args[0] 16869 if v_0.Op != OpAdd32 { 16870 break 16871 } 16872 _ = v_0.Args[1] 16873 v_0_0 := v_0.Args[0] 16874 if v_0_0.Op != OpConst32 { 16875 break 16876 } 16877 t := v_0_0.Type 16878 d := v_0_0.AuxInt 16879 x := v_0.Args[1] 16880 v_1 := v.Args[1] 16881 if v_1.Op != OpConst32 { 16882 break 16883 } 16884 if v_1.Type != t { 16885 break 16886 } 16887 c := v_1.AuxInt 16888 v.reset(OpNeq32) 16889 v0 := b.NewValue0(v.Pos, OpConst32, t) 16890 v0.AuxInt = int64(int32(c - d)) 16891 v.AddArg(v0) 16892 v.AddArg(x) 16893 return true 16894 } 16895 // match: (Neq32 (Add32 x (Const32 <t> [d])) (Const32 <t> [c])) 16896 // cond: 16897 // result: (Neq32 (Const32 <t> [int64(int32(c-d))]) x) 16898 for { 16899 _ = v.Args[1] 16900 v_0 := v.Args[0] 16901 if v_0.Op != OpAdd32 { 16902 break 16903 } 16904 _ = v_0.Args[1] 16905 x := v_0.Args[0] 16906 v_0_1 := v_0.Args[1] 16907 if v_0_1.Op != OpConst32 { 16908 break 16909 } 16910 t := v_0_1.Type 16911 d := v_0_1.AuxInt 16912 v_1 := v.Args[1] 16913 if v_1.Op != OpConst32 { 16914 break 16915 } 16916 if v_1.Type != t { 16917 break 16918 } 16919 c := v_1.AuxInt 16920 v.reset(OpNeq32) 16921 v0 := b.NewValue0(v.Pos, OpConst32, t) 16922 v0.AuxInt = int64(int32(c - d)) 16923 v.AddArg(v0) 16924 v.AddArg(x) 16925 return true 16926 } 16927 // match: (Neq32 (Const32 [c]) (Const32 [d])) 16928 // cond: 16929 // result: (ConstBool [b2i(c != d)]) 16930 for { 16931 _ = v.Args[1] 16932 v_0 := v.Args[0] 16933 if v_0.Op != OpConst32 { 16934 break 16935 } 16936 c := v_0.AuxInt 16937 v_1 := v.Args[1] 16938 if v_1.Op != OpConst32 { 16939 break 16940 } 16941 d := v_1.AuxInt 16942 v.reset(OpConstBool) 16943 v.AuxInt = b2i(c != d) 16944 return true 16945 } 16946 // match: (Neq32 (Const32 [d]) (Const32 [c])) 16947 // cond: 16948 // result: (ConstBool [b2i(c != d)]) 16949 for { 16950 _ = v.Args[1] 16951 v_0 := v.Args[0] 16952 if v_0.Op != OpConst32 { 16953 break 16954 } 16955 d := v_0.AuxInt 16956 v_1 := v.Args[1] 16957 if v_1.Op != OpConst32 { 16958 break 16959 } 16960 c := v_1.AuxInt 16961 v.reset(OpConstBool) 16962 v.AuxInt = b2i(c != d) 16963 return true 16964 } 16965 return false 16966 } 16967 func rewriteValuegeneric_OpNeq32F_0(v *Value) bool { 16968 // match: (Neq32F (Const32F [c]) (Const32F [d])) 16969 // cond: 16970 // result: (ConstBool [b2i(i2f(c) != i2f(d))]) 16971 for { 16972 _ = v.Args[1] 16973 v_0 := v.Args[0] 16974 if v_0.Op != OpConst32F { 16975 break 16976 } 16977 c := v_0.AuxInt 16978 v_1 := v.Args[1] 16979 if v_1.Op != OpConst32F { 16980 break 16981 } 16982 d := v_1.AuxInt 16983 v.reset(OpConstBool) 16984 v.AuxInt = b2i(i2f(c) != i2f(d)) 16985 return true 16986 } 16987 // match: (Neq32F (Const32F [d]) (Const32F [c])) 16988 // cond: 16989 // result: (ConstBool [b2i(i2f(c) != i2f(d))]) 16990 for { 16991 _ = v.Args[1] 16992 v_0 := v.Args[0] 16993 if v_0.Op != OpConst32F { 16994 break 16995 } 16996 d := v_0.AuxInt 16997 v_1 := v.Args[1] 16998 if v_1.Op != OpConst32F { 16999 break 17000 } 17001 c := v_1.AuxInt 17002 v.reset(OpConstBool) 17003 v.AuxInt = b2i(i2f(c) != i2f(d)) 17004 return true 17005 } 17006 return false 17007 } 17008 func rewriteValuegeneric_OpNeq64_0(v *Value) bool { 17009 b := v.Block 17010 _ = b 17011 // match: (Neq64 x x) 17012 // cond: 17013 // result: (ConstBool [0]) 17014 for { 17015 _ = v.Args[1] 17016 x := v.Args[0] 17017 if x != v.Args[1] { 17018 break 17019 } 17020 v.reset(OpConstBool) 17021 v.AuxInt = 0 17022 return true 17023 } 17024 // match: (Neq64 (Const64 <t> [c]) (Add64 (Const64 <t> [d]) x)) 17025 // cond: 17026 // result: (Neq64 (Const64 <t> [c-d]) x) 17027 for { 17028 _ = v.Args[1] 17029 v_0 := v.Args[0] 17030 if v_0.Op != OpConst64 { 17031 break 17032 } 17033 t := v_0.Type 17034 c := v_0.AuxInt 17035 v_1 := v.Args[1] 17036 if v_1.Op != OpAdd64 { 17037 break 17038 } 17039 _ = v_1.Args[1] 17040 v_1_0 := v_1.Args[0] 17041 if v_1_0.Op != OpConst64 { 17042 break 17043 } 17044 if v_1_0.Type != t { 17045 break 17046 } 17047 d := v_1_0.AuxInt 17048 x := v_1.Args[1] 17049 v.reset(OpNeq64) 17050 v0 := b.NewValue0(v.Pos, OpConst64, t) 17051 v0.AuxInt = c - d 17052 v.AddArg(v0) 17053 v.AddArg(x) 17054 return true 17055 } 17056 // match: (Neq64 (Const64 <t> [c]) (Add64 x (Const64 <t> [d]))) 17057 // cond: 17058 // result: (Neq64 (Const64 <t> [c-d]) x) 17059 for { 17060 _ = v.Args[1] 17061 v_0 := v.Args[0] 17062 if v_0.Op != OpConst64 { 17063 break 17064 } 17065 t := v_0.Type 17066 c := v_0.AuxInt 17067 v_1 := v.Args[1] 17068 if v_1.Op != OpAdd64 { 17069 break 17070 } 17071 _ = v_1.Args[1] 17072 x := v_1.Args[0] 17073 v_1_1 := v_1.Args[1] 17074 if v_1_1.Op != OpConst64 { 17075 break 17076 } 17077 if v_1_1.Type != t { 17078 break 17079 } 17080 d := v_1_1.AuxInt 17081 v.reset(OpNeq64) 17082 v0 := b.NewValue0(v.Pos, OpConst64, t) 17083 v0.AuxInt = c - d 17084 v.AddArg(v0) 17085 v.AddArg(x) 17086 return true 17087 } 17088 // match: (Neq64 (Add64 (Const64 <t> [d]) x) (Const64 <t> [c])) 17089 // cond: 17090 // result: (Neq64 (Const64 <t> [c-d]) x) 17091 for { 17092 _ = v.Args[1] 17093 v_0 := v.Args[0] 17094 if v_0.Op != OpAdd64 { 17095 break 17096 } 17097 _ = v_0.Args[1] 17098 v_0_0 := v_0.Args[0] 17099 if v_0_0.Op != OpConst64 { 17100 break 17101 } 17102 t := v_0_0.Type 17103 d := v_0_0.AuxInt 17104 x := v_0.Args[1] 17105 v_1 := v.Args[1] 17106 if v_1.Op != OpConst64 { 17107 break 17108 } 17109 if v_1.Type != t { 17110 break 17111 } 17112 c := v_1.AuxInt 17113 v.reset(OpNeq64) 17114 v0 := b.NewValue0(v.Pos, OpConst64, t) 17115 v0.AuxInt = c - d 17116 v.AddArg(v0) 17117 v.AddArg(x) 17118 return true 17119 } 17120 // match: (Neq64 (Add64 x (Const64 <t> [d])) (Const64 <t> [c])) 17121 // cond: 17122 // result: (Neq64 (Const64 <t> [c-d]) x) 17123 for { 17124 _ = v.Args[1] 17125 v_0 := v.Args[0] 17126 if v_0.Op != OpAdd64 { 17127 break 17128 } 17129 _ = v_0.Args[1] 17130 x := v_0.Args[0] 17131 v_0_1 := v_0.Args[1] 17132 if v_0_1.Op != OpConst64 { 17133 break 17134 } 17135 t := v_0_1.Type 17136 d := v_0_1.AuxInt 17137 v_1 := v.Args[1] 17138 if v_1.Op != OpConst64 { 17139 break 17140 } 17141 if v_1.Type != t { 17142 break 17143 } 17144 c := v_1.AuxInt 17145 v.reset(OpNeq64) 17146 v0 := b.NewValue0(v.Pos, OpConst64, t) 17147 v0.AuxInt = c - d 17148 v.AddArg(v0) 17149 v.AddArg(x) 17150 return true 17151 } 17152 // match: (Neq64 (Const64 [c]) (Const64 [d])) 17153 // cond: 17154 // result: (ConstBool [b2i(c != d)]) 17155 for { 17156 _ = v.Args[1] 17157 v_0 := v.Args[0] 17158 if v_0.Op != OpConst64 { 17159 break 17160 } 17161 c := v_0.AuxInt 17162 v_1 := v.Args[1] 17163 if v_1.Op != OpConst64 { 17164 break 17165 } 17166 d := v_1.AuxInt 17167 v.reset(OpConstBool) 17168 v.AuxInt = b2i(c != d) 17169 return true 17170 } 17171 // match: (Neq64 (Const64 [d]) (Const64 [c])) 17172 // cond: 17173 // result: (ConstBool [b2i(c != d)]) 17174 for { 17175 _ = v.Args[1] 17176 v_0 := v.Args[0] 17177 if v_0.Op != OpConst64 { 17178 break 17179 } 17180 d := v_0.AuxInt 17181 v_1 := v.Args[1] 17182 if v_1.Op != OpConst64 { 17183 break 17184 } 17185 c := v_1.AuxInt 17186 v.reset(OpConstBool) 17187 v.AuxInt = b2i(c != d) 17188 return true 17189 } 17190 return false 17191 } 17192 func rewriteValuegeneric_OpNeq64F_0(v *Value) bool { 17193 // match: (Neq64F (Const64F [c]) (Const64F [d])) 17194 // cond: 17195 // result: (ConstBool [b2i(i2f(c) != i2f(d))]) 17196 for { 17197 _ = v.Args[1] 17198 v_0 := v.Args[0] 17199 if v_0.Op != OpConst64F { 17200 break 17201 } 17202 c := v_0.AuxInt 17203 v_1 := v.Args[1] 17204 if v_1.Op != OpConst64F { 17205 break 17206 } 17207 d := v_1.AuxInt 17208 v.reset(OpConstBool) 17209 v.AuxInt = b2i(i2f(c) != i2f(d)) 17210 return true 17211 } 17212 // match: (Neq64F (Const64F [d]) (Const64F [c])) 17213 // cond: 17214 // result: (ConstBool [b2i(i2f(c) != i2f(d))]) 17215 for { 17216 _ = v.Args[1] 17217 v_0 := v.Args[0] 17218 if v_0.Op != OpConst64F { 17219 break 17220 } 17221 d := v_0.AuxInt 17222 v_1 := v.Args[1] 17223 if v_1.Op != OpConst64F { 17224 break 17225 } 17226 c := v_1.AuxInt 17227 v.reset(OpConstBool) 17228 v.AuxInt = b2i(i2f(c) != i2f(d)) 17229 return true 17230 } 17231 return false 17232 } 17233 func rewriteValuegeneric_OpNeq8_0(v *Value) bool { 17234 b := v.Block 17235 _ = b 17236 // match: (Neq8 x x) 17237 // cond: 17238 // result: (ConstBool [0]) 17239 for { 17240 _ = v.Args[1] 17241 x := v.Args[0] 17242 if x != v.Args[1] { 17243 break 17244 } 17245 v.reset(OpConstBool) 17246 v.AuxInt = 0 17247 return true 17248 } 17249 // match: (Neq8 (Const8 <t> [c]) (Add8 (Const8 <t> [d]) x)) 17250 // cond: 17251 // result: (Neq8 (Const8 <t> [int64(int8(c-d))]) x) 17252 for { 17253 _ = v.Args[1] 17254 v_0 := v.Args[0] 17255 if v_0.Op != OpConst8 { 17256 break 17257 } 17258 t := v_0.Type 17259 c := v_0.AuxInt 17260 v_1 := v.Args[1] 17261 if v_1.Op != OpAdd8 { 17262 break 17263 } 17264 _ = v_1.Args[1] 17265 v_1_0 := v_1.Args[0] 17266 if v_1_0.Op != OpConst8 { 17267 break 17268 } 17269 if v_1_0.Type != t { 17270 break 17271 } 17272 d := v_1_0.AuxInt 17273 x := v_1.Args[1] 17274 v.reset(OpNeq8) 17275 v0 := b.NewValue0(v.Pos, OpConst8, t) 17276 v0.AuxInt = int64(int8(c - d)) 17277 v.AddArg(v0) 17278 v.AddArg(x) 17279 return true 17280 } 17281 // match: (Neq8 (Const8 <t> [c]) (Add8 x (Const8 <t> [d]))) 17282 // cond: 17283 // result: (Neq8 (Const8 <t> [int64(int8(c-d))]) x) 17284 for { 17285 _ = v.Args[1] 17286 v_0 := v.Args[0] 17287 if v_0.Op != OpConst8 { 17288 break 17289 } 17290 t := v_0.Type 17291 c := v_0.AuxInt 17292 v_1 := v.Args[1] 17293 if v_1.Op != OpAdd8 { 17294 break 17295 } 17296 _ = v_1.Args[1] 17297 x := v_1.Args[0] 17298 v_1_1 := v_1.Args[1] 17299 if v_1_1.Op != OpConst8 { 17300 break 17301 } 17302 if v_1_1.Type != t { 17303 break 17304 } 17305 d := v_1_1.AuxInt 17306 v.reset(OpNeq8) 17307 v0 := b.NewValue0(v.Pos, OpConst8, t) 17308 v0.AuxInt = int64(int8(c - d)) 17309 v.AddArg(v0) 17310 v.AddArg(x) 17311 return true 17312 } 17313 // match: (Neq8 (Add8 (Const8 <t> [d]) x) (Const8 <t> [c])) 17314 // cond: 17315 // result: (Neq8 (Const8 <t> [int64(int8(c-d))]) x) 17316 for { 17317 _ = v.Args[1] 17318 v_0 := v.Args[0] 17319 if v_0.Op != OpAdd8 { 17320 break 17321 } 17322 _ = v_0.Args[1] 17323 v_0_0 := v_0.Args[0] 17324 if v_0_0.Op != OpConst8 { 17325 break 17326 } 17327 t := v_0_0.Type 17328 d := v_0_0.AuxInt 17329 x := v_0.Args[1] 17330 v_1 := v.Args[1] 17331 if v_1.Op != OpConst8 { 17332 break 17333 } 17334 if v_1.Type != t { 17335 break 17336 } 17337 c := v_1.AuxInt 17338 v.reset(OpNeq8) 17339 v0 := b.NewValue0(v.Pos, OpConst8, t) 17340 v0.AuxInt = int64(int8(c - d)) 17341 v.AddArg(v0) 17342 v.AddArg(x) 17343 return true 17344 } 17345 // match: (Neq8 (Add8 x (Const8 <t> [d])) (Const8 <t> [c])) 17346 // cond: 17347 // result: (Neq8 (Const8 <t> [int64(int8(c-d))]) x) 17348 for { 17349 _ = v.Args[1] 17350 v_0 := v.Args[0] 17351 if v_0.Op != OpAdd8 { 17352 break 17353 } 17354 _ = v_0.Args[1] 17355 x := v_0.Args[0] 17356 v_0_1 := v_0.Args[1] 17357 if v_0_1.Op != OpConst8 { 17358 break 17359 } 17360 t := v_0_1.Type 17361 d := v_0_1.AuxInt 17362 v_1 := v.Args[1] 17363 if v_1.Op != OpConst8 { 17364 break 17365 } 17366 if v_1.Type != t { 17367 break 17368 } 17369 c := v_1.AuxInt 17370 v.reset(OpNeq8) 17371 v0 := b.NewValue0(v.Pos, OpConst8, t) 17372 v0.AuxInt = int64(int8(c - d)) 17373 v.AddArg(v0) 17374 v.AddArg(x) 17375 return true 17376 } 17377 // match: (Neq8 (Const8 [c]) (Const8 [d])) 17378 // cond: 17379 // result: (ConstBool [b2i(c != d)]) 17380 for { 17381 _ = v.Args[1] 17382 v_0 := v.Args[0] 17383 if v_0.Op != OpConst8 { 17384 break 17385 } 17386 c := v_0.AuxInt 17387 v_1 := v.Args[1] 17388 if v_1.Op != OpConst8 { 17389 break 17390 } 17391 d := v_1.AuxInt 17392 v.reset(OpConstBool) 17393 v.AuxInt = b2i(c != d) 17394 return true 17395 } 17396 // match: (Neq8 (Const8 [d]) (Const8 [c])) 17397 // cond: 17398 // result: (ConstBool [b2i(c != d)]) 17399 for { 17400 _ = v.Args[1] 17401 v_0 := v.Args[0] 17402 if v_0.Op != OpConst8 { 17403 break 17404 } 17405 d := v_0.AuxInt 17406 v_1 := v.Args[1] 17407 if v_1.Op != OpConst8 { 17408 break 17409 } 17410 c := v_1.AuxInt 17411 v.reset(OpConstBool) 17412 v.AuxInt = b2i(c != d) 17413 return true 17414 } 17415 return false 17416 } 17417 func rewriteValuegeneric_OpNeqB_0(v *Value) bool { 17418 // match: (NeqB (ConstBool [c]) (ConstBool [d])) 17419 // cond: 17420 // result: (ConstBool [b2i(c != d)]) 17421 for { 17422 _ = v.Args[1] 17423 v_0 := v.Args[0] 17424 if v_0.Op != OpConstBool { 17425 break 17426 } 17427 c := v_0.AuxInt 17428 v_1 := v.Args[1] 17429 if v_1.Op != OpConstBool { 17430 break 17431 } 17432 d := v_1.AuxInt 17433 v.reset(OpConstBool) 17434 v.AuxInt = b2i(c != d) 17435 return true 17436 } 17437 // match: (NeqB (ConstBool [d]) (ConstBool [c])) 17438 // cond: 17439 // result: (ConstBool [b2i(c != d)]) 17440 for { 17441 _ = v.Args[1] 17442 v_0 := v.Args[0] 17443 if v_0.Op != OpConstBool { 17444 break 17445 } 17446 d := v_0.AuxInt 17447 v_1 := v.Args[1] 17448 if v_1.Op != OpConstBool { 17449 break 17450 } 17451 c := v_1.AuxInt 17452 v.reset(OpConstBool) 17453 v.AuxInt = b2i(c != d) 17454 return true 17455 } 17456 // match: (NeqB (ConstBool [0]) x) 17457 // cond: 17458 // result: x 17459 for { 17460 _ = v.Args[1] 17461 v_0 := v.Args[0] 17462 if v_0.Op != OpConstBool { 17463 break 17464 } 17465 if v_0.AuxInt != 0 { 17466 break 17467 } 17468 x := v.Args[1] 17469 v.reset(OpCopy) 17470 v.Type = x.Type 17471 v.AddArg(x) 17472 return true 17473 } 17474 // match: (NeqB x (ConstBool [0])) 17475 // cond: 17476 // result: x 17477 for { 17478 _ = v.Args[1] 17479 x := v.Args[0] 17480 v_1 := v.Args[1] 17481 if v_1.Op != OpConstBool { 17482 break 17483 } 17484 if v_1.AuxInt != 0 { 17485 break 17486 } 17487 v.reset(OpCopy) 17488 v.Type = x.Type 17489 v.AddArg(x) 17490 return true 17491 } 17492 // match: (NeqB (ConstBool [1]) x) 17493 // cond: 17494 // result: (Not x) 17495 for { 17496 _ = v.Args[1] 17497 v_0 := v.Args[0] 17498 if v_0.Op != OpConstBool { 17499 break 17500 } 17501 if v_0.AuxInt != 1 { 17502 break 17503 } 17504 x := v.Args[1] 17505 v.reset(OpNot) 17506 v.AddArg(x) 17507 return true 17508 } 17509 // match: (NeqB x (ConstBool [1])) 17510 // cond: 17511 // result: (Not x) 17512 for { 17513 _ = v.Args[1] 17514 x := v.Args[0] 17515 v_1 := v.Args[1] 17516 if v_1.Op != OpConstBool { 17517 break 17518 } 17519 if v_1.AuxInt != 1 { 17520 break 17521 } 17522 v.reset(OpNot) 17523 v.AddArg(x) 17524 return true 17525 } 17526 // match: (NeqB (Not x) (Not y)) 17527 // cond: 17528 // result: (NeqB x y) 17529 for { 17530 _ = v.Args[1] 17531 v_0 := v.Args[0] 17532 if v_0.Op != OpNot { 17533 break 17534 } 17535 x := v_0.Args[0] 17536 v_1 := v.Args[1] 17537 if v_1.Op != OpNot { 17538 break 17539 } 17540 y := v_1.Args[0] 17541 v.reset(OpNeqB) 17542 v.AddArg(x) 17543 v.AddArg(y) 17544 return true 17545 } 17546 // match: (NeqB (Not y) (Not x)) 17547 // cond: 17548 // result: (NeqB x y) 17549 for { 17550 _ = v.Args[1] 17551 v_0 := v.Args[0] 17552 if v_0.Op != OpNot { 17553 break 17554 } 17555 y := v_0.Args[0] 17556 v_1 := v.Args[1] 17557 if v_1.Op != OpNot { 17558 break 17559 } 17560 x := v_1.Args[0] 17561 v.reset(OpNeqB) 17562 v.AddArg(x) 17563 v.AddArg(y) 17564 return true 17565 } 17566 return false 17567 } 17568 func rewriteValuegeneric_OpNeqInter_0(v *Value) bool { 17569 b := v.Block 17570 _ = b 17571 typ := &b.Func.Config.Types 17572 _ = typ 17573 // match: (NeqInter x y) 17574 // cond: 17575 // result: (NeqPtr (ITab x) (ITab y)) 17576 for { 17577 _ = v.Args[1] 17578 x := v.Args[0] 17579 y := v.Args[1] 17580 v.reset(OpNeqPtr) 17581 v0 := b.NewValue0(v.Pos, OpITab, typ.BytePtr) 17582 v0.AddArg(x) 17583 v.AddArg(v0) 17584 v1 := b.NewValue0(v.Pos, OpITab, typ.BytePtr) 17585 v1.AddArg(y) 17586 v.AddArg(v1) 17587 return true 17588 } 17589 } 17590 func rewriteValuegeneric_OpNeqPtr_0(v *Value) bool { 17591 // match: (NeqPtr p (ConstNil)) 17592 // cond: 17593 // result: (IsNonNil p) 17594 for { 17595 _ = v.Args[1] 17596 p := v.Args[0] 17597 v_1 := v.Args[1] 17598 if v_1.Op != OpConstNil { 17599 break 17600 } 17601 v.reset(OpIsNonNil) 17602 v.AddArg(p) 17603 return true 17604 } 17605 // match: (NeqPtr (ConstNil) p) 17606 // cond: 17607 // result: (IsNonNil p) 17608 for { 17609 _ = v.Args[1] 17610 v_0 := v.Args[0] 17611 if v_0.Op != OpConstNil { 17612 break 17613 } 17614 p := v.Args[1] 17615 v.reset(OpIsNonNil) 17616 v.AddArg(p) 17617 return true 17618 } 17619 return false 17620 } 17621 func rewriteValuegeneric_OpNeqSlice_0(v *Value) bool { 17622 b := v.Block 17623 _ = b 17624 typ := &b.Func.Config.Types 17625 _ = typ 17626 // match: (NeqSlice x y) 17627 // cond: 17628 // result: (NeqPtr (SlicePtr x) (SlicePtr y)) 17629 for { 17630 _ = v.Args[1] 17631 x := v.Args[0] 17632 y := v.Args[1] 17633 v.reset(OpNeqPtr) 17634 v0 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr) 17635 v0.AddArg(x) 17636 v.AddArg(v0) 17637 v1 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr) 17638 v1.AddArg(y) 17639 v.AddArg(v1) 17640 return true 17641 } 17642 } 17643 func rewriteValuegeneric_OpNilCheck_0(v *Value) bool { 17644 b := v.Block 17645 _ = b 17646 config := b.Func.Config 17647 _ = config 17648 fe := b.Func.fe 17649 _ = fe 17650 // match: (NilCheck (GetG mem) mem) 17651 // cond: 17652 // result: mem 17653 for { 17654 _ = v.Args[1] 17655 v_0 := v.Args[0] 17656 if v_0.Op != OpGetG { 17657 break 17658 } 17659 mem := v_0.Args[0] 17660 if mem != v.Args[1] { 17661 break 17662 } 17663 v.reset(OpCopy) 17664 v.Type = mem.Type 17665 v.AddArg(mem) 17666 return true 17667 } 17668 // match: (NilCheck (Load (OffPtr [c] (SP)) (StaticCall {sym} _)) _) 17669 // cond: isSameSym(sym, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize && warnRule(fe.Debug_checknil() && v.Pos.Line() > 1, v, "removed nil check") 17670 // result: (Invalid) 17671 for { 17672 _ = v.Args[1] 17673 v_0 := v.Args[0] 17674 if v_0.Op != OpLoad { 17675 break 17676 } 17677 _ = v_0.Args[1] 17678 v_0_0 := v_0.Args[0] 17679 if v_0_0.Op != OpOffPtr { 17680 break 17681 } 17682 c := v_0_0.AuxInt 17683 v_0_0_0 := v_0_0.Args[0] 17684 if v_0_0_0.Op != OpSP { 17685 break 17686 } 17687 v_0_1 := v_0.Args[1] 17688 if v_0_1.Op != OpStaticCall { 17689 break 17690 } 17691 sym := v_0_1.Aux 17692 if !(isSameSym(sym, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize && warnRule(fe.Debug_checknil() && v.Pos.Line() > 1, v, "removed nil check")) { 17693 break 17694 } 17695 v.reset(OpInvalid) 17696 return true 17697 } 17698 // match: (NilCheck (OffPtr (Load (OffPtr [c] (SP)) (StaticCall {sym} _))) _) 17699 // cond: isSameSym(sym, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize && warnRule(fe.Debug_checknil() && v.Pos.Line() > 1, v, "removed nil check") 17700 // result: (Invalid) 17701 for { 17702 _ = v.Args[1] 17703 v_0 := v.Args[0] 17704 if v_0.Op != OpOffPtr { 17705 break 17706 } 17707 v_0_0 := v_0.Args[0] 17708 if v_0_0.Op != OpLoad { 17709 break 17710 } 17711 _ = v_0_0.Args[1] 17712 v_0_0_0 := v_0_0.Args[0] 17713 if v_0_0_0.Op != OpOffPtr { 17714 break 17715 } 17716 c := v_0_0_0.AuxInt 17717 v_0_0_0_0 := v_0_0_0.Args[0] 17718 if v_0_0_0_0.Op != OpSP { 17719 break 17720 } 17721 v_0_0_1 := v_0_0.Args[1] 17722 if v_0_0_1.Op != OpStaticCall { 17723 break 17724 } 17725 sym := v_0_0_1.Aux 17726 if !(isSameSym(sym, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize && warnRule(fe.Debug_checknil() && v.Pos.Line() > 1, v, "removed nil check")) { 17727 break 17728 } 17729 v.reset(OpInvalid) 17730 return true 17731 } 17732 return false 17733 } 17734 func rewriteValuegeneric_OpNot_0(v *Value) bool { 17735 // match: (Not (Eq64 x y)) 17736 // cond: 17737 // result: (Neq64 x y) 17738 for { 17739 v_0 := v.Args[0] 17740 if v_0.Op != OpEq64 { 17741 break 17742 } 17743 _ = v_0.Args[1] 17744 x := v_0.Args[0] 17745 y := v_0.Args[1] 17746 v.reset(OpNeq64) 17747 v.AddArg(x) 17748 v.AddArg(y) 17749 return true 17750 } 17751 // match: (Not (Eq32 x y)) 17752 // cond: 17753 // result: (Neq32 x y) 17754 for { 17755 v_0 := v.Args[0] 17756 if v_0.Op != OpEq32 { 17757 break 17758 } 17759 _ = v_0.Args[1] 17760 x := v_0.Args[0] 17761 y := v_0.Args[1] 17762 v.reset(OpNeq32) 17763 v.AddArg(x) 17764 v.AddArg(y) 17765 return true 17766 } 17767 // match: (Not (Eq16 x y)) 17768 // cond: 17769 // result: (Neq16 x y) 17770 for { 17771 v_0 := v.Args[0] 17772 if v_0.Op != OpEq16 { 17773 break 17774 } 17775 _ = v_0.Args[1] 17776 x := v_0.Args[0] 17777 y := v_0.Args[1] 17778 v.reset(OpNeq16) 17779 v.AddArg(x) 17780 v.AddArg(y) 17781 return true 17782 } 17783 // match: (Not (Eq8 x y)) 17784 // cond: 17785 // result: (Neq8 x y) 17786 for { 17787 v_0 := v.Args[0] 17788 if v_0.Op != OpEq8 { 17789 break 17790 } 17791 _ = v_0.Args[1] 17792 x := v_0.Args[0] 17793 y := v_0.Args[1] 17794 v.reset(OpNeq8) 17795 v.AddArg(x) 17796 v.AddArg(y) 17797 return true 17798 } 17799 // match: (Not (EqB x y)) 17800 // cond: 17801 // result: (NeqB x y) 17802 for { 17803 v_0 := v.Args[0] 17804 if v_0.Op != OpEqB { 17805 break 17806 } 17807 _ = v_0.Args[1] 17808 x := v_0.Args[0] 17809 y := v_0.Args[1] 17810 v.reset(OpNeqB) 17811 v.AddArg(x) 17812 v.AddArg(y) 17813 return true 17814 } 17815 // match: (Not (Neq64 x y)) 17816 // cond: 17817 // result: (Eq64 x y) 17818 for { 17819 v_0 := v.Args[0] 17820 if v_0.Op != OpNeq64 { 17821 break 17822 } 17823 _ = v_0.Args[1] 17824 x := v_0.Args[0] 17825 y := v_0.Args[1] 17826 v.reset(OpEq64) 17827 v.AddArg(x) 17828 v.AddArg(y) 17829 return true 17830 } 17831 // match: (Not (Neq32 x y)) 17832 // cond: 17833 // result: (Eq32 x y) 17834 for { 17835 v_0 := v.Args[0] 17836 if v_0.Op != OpNeq32 { 17837 break 17838 } 17839 _ = v_0.Args[1] 17840 x := v_0.Args[0] 17841 y := v_0.Args[1] 17842 v.reset(OpEq32) 17843 v.AddArg(x) 17844 v.AddArg(y) 17845 return true 17846 } 17847 // match: (Not (Neq16 x y)) 17848 // cond: 17849 // result: (Eq16 x y) 17850 for { 17851 v_0 := v.Args[0] 17852 if v_0.Op != OpNeq16 { 17853 break 17854 } 17855 _ = v_0.Args[1] 17856 x := v_0.Args[0] 17857 y := v_0.Args[1] 17858 v.reset(OpEq16) 17859 v.AddArg(x) 17860 v.AddArg(y) 17861 return true 17862 } 17863 // match: (Not (Neq8 x y)) 17864 // cond: 17865 // result: (Eq8 x y) 17866 for { 17867 v_0 := v.Args[0] 17868 if v_0.Op != OpNeq8 { 17869 break 17870 } 17871 _ = v_0.Args[1] 17872 x := v_0.Args[0] 17873 y := v_0.Args[1] 17874 v.reset(OpEq8) 17875 v.AddArg(x) 17876 v.AddArg(y) 17877 return true 17878 } 17879 // match: (Not (NeqB x y)) 17880 // cond: 17881 // result: (EqB x y) 17882 for { 17883 v_0 := v.Args[0] 17884 if v_0.Op != OpNeqB { 17885 break 17886 } 17887 _ = v_0.Args[1] 17888 x := v_0.Args[0] 17889 y := v_0.Args[1] 17890 v.reset(OpEqB) 17891 v.AddArg(x) 17892 v.AddArg(y) 17893 return true 17894 } 17895 return false 17896 } 17897 func rewriteValuegeneric_OpNot_10(v *Value) bool { 17898 // match: (Not (Greater64 x y)) 17899 // cond: 17900 // result: (Leq64 x y) 17901 for { 17902 v_0 := v.Args[0] 17903 if v_0.Op != OpGreater64 { 17904 break 17905 } 17906 _ = v_0.Args[1] 17907 x := v_0.Args[0] 17908 y := v_0.Args[1] 17909 v.reset(OpLeq64) 17910 v.AddArg(x) 17911 v.AddArg(y) 17912 return true 17913 } 17914 // match: (Not (Greater32 x y)) 17915 // cond: 17916 // result: (Leq32 x y) 17917 for { 17918 v_0 := v.Args[0] 17919 if v_0.Op != OpGreater32 { 17920 break 17921 } 17922 _ = v_0.Args[1] 17923 x := v_0.Args[0] 17924 y := v_0.Args[1] 17925 v.reset(OpLeq32) 17926 v.AddArg(x) 17927 v.AddArg(y) 17928 return true 17929 } 17930 // match: (Not (Greater16 x y)) 17931 // cond: 17932 // result: (Leq16 x y) 17933 for { 17934 v_0 := v.Args[0] 17935 if v_0.Op != OpGreater16 { 17936 break 17937 } 17938 _ = v_0.Args[1] 17939 x := v_0.Args[0] 17940 y := v_0.Args[1] 17941 v.reset(OpLeq16) 17942 v.AddArg(x) 17943 v.AddArg(y) 17944 return true 17945 } 17946 // match: (Not (Greater8 x y)) 17947 // cond: 17948 // result: (Leq8 x y) 17949 for { 17950 v_0 := v.Args[0] 17951 if v_0.Op != OpGreater8 { 17952 break 17953 } 17954 _ = v_0.Args[1] 17955 x := v_0.Args[0] 17956 y := v_0.Args[1] 17957 v.reset(OpLeq8) 17958 v.AddArg(x) 17959 v.AddArg(y) 17960 return true 17961 } 17962 // match: (Not (Greater64U x y)) 17963 // cond: 17964 // result: (Leq64U x y) 17965 for { 17966 v_0 := v.Args[0] 17967 if v_0.Op != OpGreater64U { 17968 break 17969 } 17970 _ = v_0.Args[1] 17971 x := v_0.Args[0] 17972 y := v_0.Args[1] 17973 v.reset(OpLeq64U) 17974 v.AddArg(x) 17975 v.AddArg(y) 17976 return true 17977 } 17978 // match: (Not (Greater32U x y)) 17979 // cond: 17980 // result: (Leq32U x y) 17981 for { 17982 v_0 := v.Args[0] 17983 if v_0.Op != OpGreater32U { 17984 break 17985 } 17986 _ = v_0.Args[1] 17987 x := v_0.Args[0] 17988 y := v_0.Args[1] 17989 v.reset(OpLeq32U) 17990 v.AddArg(x) 17991 v.AddArg(y) 17992 return true 17993 } 17994 // match: (Not (Greater16U x y)) 17995 // cond: 17996 // result: (Leq16U x y) 17997 for { 17998 v_0 := v.Args[0] 17999 if v_0.Op != OpGreater16U { 18000 break 18001 } 18002 _ = v_0.Args[1] 18003 x := v_0.Args[0] 18004 y := v_0.Args[1] 18005 v.reset(OpLeq16U) 18006 v.AddArg(x) 18007 v.AddArg(y) 18008 return true 18009 } 18010 // match: (Not (Greater8U x y)) 18011 // cond: 18012 // result: (Leq8U x y) 18013 for { 18014 v_0 := v.Args[0] 18015 if v_0.Op != OpGreater8U { 18016 break 18017 } 18018 _ = v_0.Args[1] 18019 x := v_0.Args[0] 18020 y := v_0.Args[1] 18021 v.reset(OpLeq8U) 18022 v.AddArg(x) 18023 v.AddArg(y) 18024 return true 18025 } 18026 // match: (Not (Geq64 x y)) 18027 // cond: 18028 // result: (Less64 x y) 18029 for { 18030 v_0 := v.Args[0] 18031 if v_0.Op != OpGeq64 { 18032 break 18033 } 18034 _ = v_0.Args[1] 18035 x := v_0.Args[0] 18036 y := v_0.Args[1] 18037 v.reset(OpLess64) 18038 v.AddArg(x) 18039 v.AddArg(y) 18040 return true 18041 } 18042 // match: (Not (Geq32 x y)) 18043 // cond: 18044 // result: (Less32 x y) 18045 for { 18046 v_0 := v.Args[0] 18047 if v_0.Op != OpGeq32 { 18048 break 18049 } 18050 _ = v_0.Args[1] 18051 x := v_0.Args[0] 18052 y := v_0.Args[1] 18053 v.reset(OpLess32) 18054 v.AddArg(x) 18055 v.AddArg(y) 18056 return true 18057 } 18058 return false 18059 } 18060 func rewriteValuegeneric_OpNot_20(v *Value) bool { 18061 // match: (Not (Geq16 x y)) 18062 // cond: 18063 // result: (Less16 x y) 18064 for { 18065 v_0 := v.Args[0] 18066 if v_0.Op != OpGeq16 { 18067 break 18068 } 18069 _ = v_0.Args[1] 18070 x := v_0.Args[0] 18071 y := v_0.Args[1] 18072 v.reset(OpLess16) 18073 v.AddArg(x) 18074 v.AddArg(y) 18075 return true 18076 } 18077 // match: (Not (Geq8 x y)) 18078 // cond: 18079 // result: (Less8 x y) 18080 for { 18081 v_0 := v.Args[0] 18082 if v_0.Op != OpGeq8 { 18083 break 18084 } 18085 _ = v_0.Args[1] 18086 x := v_0.Args[0] 18087 y := v_0.Args[1] 18088 v.reset(OpLess8) 18089 v.AddArg(x) 18090 v.AddArg(y) 18091 return true 18092 } 18093 // match: (Not (Geq64U x y)) 18094 // cond: 18095 // result: (Less64U x y) 18096 for { 18097 v_0 := v.Args[0] 18098 if v_0.Op != OpGeq64U { 18099 break 18100 } 18101 _ = v_0.Args[1] 18102 x := v_0.Args[0] 18103 y := v_0.Args[1] 18104 v.reset(OpLess64U) 18105 v.AddArg(x) 18106 v.AddArg(y) 18107 return true 18108 } 18109 // match: (Not (Geq32U x y)) 18110 // cond: 18111 // result: (Less32U x y) 18112 for { 18113 v_0 := v.Args[0] 18114 if v_0.Op != OpGeq32U { 18115 break 18116 } 18117 _ = v_0.Args[1] 18118 x := v_0.Args[0] 18119 y := v_0.Args[1] 18120 v.reset(OpLess32U) 18121 v.AddArg(x) 18122 v.AddArg(y) 18123 return true 18124 } 18125 // match: (Not (Geq16U x y)) 18126 // cond: 18127 // result: (Less16U x y) 18128 for { 18129 v_0 := v.Args[0] 18130 if v_0.Op != OpGeq16U { 18131 break 18132 } 18133 _ = v_0.Args[1] 18134 x := v_0.Args[0] 18135 y := v_0.Args[1] 18136 v.reset(OpLess16U) 18137 v.AddArg(x) 18138 v.AddArg(y) 18139 return true 18140 } 18141 // match: (Not (Geq8U x y)) 18142 // cond: 18143 // result: (Less8U x y) 18144 for { 18145 v_0 := v.Args[0] 18146 if v_0.Op != OpGeq8U { 18147 break 18148 } 18149 _ = v_0.Args[1] 18150 x := v_0.Args[0] 18151 y := v_0.Args[1] 18152 v.reset(OpLess8U) 18153 v.AddArg(x) 18154 v.AddArg(y) 18155 return true 18156 } 18157 // match: (Not (Less64 x y)) 18158 // cond: 18159 // result: (Geq64 x y) 18160 for { 18161 v_0 := v.Args[0] 18162 if v_0.Op != OpLess64 { 18163 break 18164 } 18165 _ = v_0.Args[1] 18166 x := v_0.Args[0] 18167 y := v_0.Args[1] 18168 v.reset(OpGeq64) 18169 v.AddArg(x) 18170 v.AddArg(y) 18171 return true 18172 } 18173 // match: (Not (Less32 x y)) 18174 // cond: 18175 // result: (Geq32 x y) 18176 for { 18177 v_0 := v.Args[0] 18178 if v_0.Op != OpLess32 { 18179 break 18180 } 18181 _ = v_0.Args[1] 18182 x := v_0.Args[0] 18183 y := v_0.Args[1] 18184 v.reset(OpGeq32) 18185 v.AddArg(x) 18186 v.AddArg(y) 18187 return true 18188 } 18189 // match: (Not (Less16 x y)) 18190 // cond: 18191 // result: (Geq16 x y) 18192 for { 18193 v_0 := v.Args[0] 18194 if v_0.Op != OpLess16 { 18195 break 18196 } 18197 _ = v_0.Args[1] 18198 x := v_0.Args[0] 18199 y := v_0.Args[1] 18200 v.reset(OpGeq16) 18201 v.AddArg(x) 18202 v.AddArg(y) 18203 return true 18204 } 18205 // match: (Not (Less8 x y)) 18206 // cond: 18207 // result: (Geq8 x y) 18208 for { 18209 v_0 := v.Args[0] 18210 if v_0.Op != OpLess8 { 18211 break 18212 } 18213 _ = v_0.Args[1] 18214 x := v_0.Args[0] 18215 y := v_0.Args[1] 18216 v.reset(OpGeq8) 18217 v.AddArg(x) 18218 v.AddArg(y) 18219 return true 18220 } 18221 return false 18222 } 18223 func rewriteValuegeneric_OpNot_30(v *Value) bool { 18224 // match: (Not (Less64U x y)) 18225 // cond: 18226 // result: (Geq64U x y) 18227 for { 18228 v_0 := v.Args[0] 18229 if v_0.Op != OpLess64U { 18230 break 18231 } 18232 _ = v_0.Args[1] 18233 x := v_0.Args[0] 18234 y := v_0.Args[1] 18235 v.reset(OpGeq64U) 18236 v.AddArg(x) 18237 v.AddArg(y) 18238 return true 18239 } 18240 // match: (Not (Less32U x y)) 18241 // cond: 18242 // result: (Geq32U x y) 18243 for { 18244 v_0 := v.Args[0] 18245 if v_0.Op != OpLess32U { 18246 break 18247 } 18248 _ = v_0.Args[1] 18249 x := v_0.Args[0] 18250 y := v_0.Args[1] 18251 v.reset(OpGeq32U) 18252 v.AddArg(x) 18253 v.AddArg(y) 18254 return true 18255 } 18256 // match: (Not (Less16U x y)) 18257 // cond: 18258 // result: (Geq16U x y) 18259 for { 18260 v_0 := v.Args[0] 18261 if v_0.Op != OpLess16U { 18262 break 18263 } 18264 _ = v_0.Args[1] 18265 x := v_0.Args[0] 18266 y := v_0.Args[1] 18267 v.reset(OpGeq16U) 18268 v.AddArg(x) 18269 v.AddArg(y) 18270 return true 18271 } 18272 // match: (Not (Less8U x y)) 18273 // cond: 18274 // result: (Geq8U x y) 18275 for { 18276 v_0 := v.Args[0] 18277 if v_0.Op != OpLess8U { 18278 break 18279 } 18280 _ = v_0.Args[1] 18281 x := v_0.Args[0] 18282 y := v_0.Args[1] 18283 v.reset(OpGeq8U) 18284 v.AddArg(x) 18285 v.AddArg(y) 18286 return true 18287 } 18288 // match: (Not (Leq64 x y)) 18289 // cond: 18290 // result: (Greater64 x y) 18291 for { 18292 v_0 := v.Args[0] 18293 if v_0.Op != OpLeq64 { 18294 break 18295 } 18296 _ = v_0.Args[1] 18297 x := v_0.Args[0] 18298 y := v_0.Args[1] 18299 v.reset(OpGreater64) 18300 v.AddArg(x) 18301 v.AddArg(y) 18302 return true 18303 } 18304 // match: (Not (Leq32 x y)) 18305 // cond: 18306 // result: (Greater32 x y) 18307 for { 18308 v_0 := v.Args[0] 18309 if v_0.Op != OpLeq32 { 18310 break 18311 } 18312 _ = v_0.Args[1] 18313 x := v_0.Args[0] 18314 y := v_0.Args[1] 18315 v.reset(OpGreater32) 18316 v.AddArg(x) 18317 v.AddArg(y) 18318 return true 18319 } 18320 // match: (Not (Leq16 x y)) 18321 // cond: 18322 // result: (Greater16 x y) 18323 for { 18324 v_0 := v.Args[0] 18325 if v_0.Op != OpLeq16 { 18326 break 18327 } 18328 _ = v_0.Args[1] 18329 x := v_0.Args[0] 18330 y := v_0.Args[1] 18331 v.reset(OpGreater16) 18332 v.AddArg(x) 18333 v.AddArg(y) 18334 return true 18335 } 18336 // match: (Not (Leq8 x y)) 18337 // cond: 18338 // result: (Greater8 x y) 18339 for { 18340 v_0 := v.Args[0] 18341 if v_0.Op != OpLeq8 { 18342 break 18343 } 18344 _ = v_0.Args[1] 18345 x := v_0.Args[0] 18346 y := v_0.Args[1] 18347 v.reset(OpGreater8) 18348 v.AddArg(x) 18349 v.AddArg(y) 18350 return true 18351 } 18352 // match: (Not (Leq64U x y)) 18353 // cond: 18354 // result: (Greater64U x y) 18355 for { 18356 v_0 := v.Args[0] 18357 if v_0.Op != OpLeq64U { 18358 break 18359 } 18360 _ = v_0.Args[1] 18361 x := v_0.Args[0] 18362 y := v_0.Args[1] 18363 v.reset(OpGreater64U) 18364 v.AddArg(x) 18365 v.AddArg(y) 18366 return true 18367 } 18368 // match: (Not (Leq32U x y)) 18369 // cond: 18370 // result: (Greater32U x y) 18371 for { 18372 v_0 := v.Args[0] 18373 if v_0.Op != OpLeq32U { 18374 break 18375 } 18376 _ = v_0.Args[1] 18377 x := v_0.Args[0] 18378 y := v_0.Args[1] 18379 v.reset(OpGreater32U) 18380 v.AddArg(x) 18381 v.AddArg(y) 18382 return true 18383 } 18384 return false 18385 } 18386 func rewriteValuegeneric_OpNot_40(v *Value) bool { 18387 // match: (Not (Leq16U x y)) 18388 // cond: 18389 // result: (Greater16U x y) 18390 for { 18391 v_0 := v.Args[0] 18392 if v_0.Op != OpLeq16U { 18393 break 18394 } 18395 _ = v_0.Args[1] 18396 x := v_0.Args[0] 18397 y := v_0.Args[1] 18398 v.reset(OpGreater16U) 18399 v.AddArg(x) 18400 v.AddArg(y) 18401 return true 18402 } 18403 // match: (Not (Leq8U x y)) 18404 // cond: 18405 // result: (Greater8U x y) 18406 for { 18407 v_0 := v.Args[0] 18408 if v_0.Op != OpLeq8U { 18409 break 18410 } 18411 _ = v_0.Args[1] 18412 x := v_0.Args[0] 18413 y := v_0.Args[1] 18414 v.reset(OpGreater8U) 18415 v.AddArg(x) 18416 v.AddArg(y) 18417 return true 18418 } 18419 return false 18420 } 18421 func rewriteValuegeneric_OpOffPtr_0(v *Value) bool { 18422 // match: (OffPtr (OffPtr p [b]) [a]) 18423 // cond: 18424 // result: (OffPtr p [a+b]) 18425 for { 18426 a := v.AuxInt 18427 v_0 := v.Args[0] 18428 if v_0.Op != OpOffPtr { 18429 break 18430 } 18431 b := v_0.AuxInt 18432 p := v_0.Args[0] 18433 v.reset(OpOffPtr) 18434 v.AuxInt = a + b 18435 v.AddArg(p) 18436 return true 18437 } 18438 // match: (OffPtr p [0]) 18439 // cond: v.Type.Compare(p.Type) == types.CMPeq 18440 // result: p 18441 for { 18442 if v.AuxInt != 0 { 18443 break 18444 } 18445 p := v.Args[0] 18446 if !(v.Type.Compare(p.Type) == types.CMPeq) { 18447 break 18448 } 18449 v.reset(OpCopy) 18450 v.Type = p.Type 18451 v.AddArg(p) 18452 return true 18453 } 18454 return false 18455 } 18456 func rewriteValuegeneric_OpOr16_0(v *Value) bool { 18457 // match: (Or16 (Const16 [c]) (Const16 [d])) 18458 // cond: 18459 // result: (Const16 [int64(int16(c|d))]) 18460 for { 18461 _ = v.Args[1] 18462 v_0 := v.Args[0] 18463 if v_0.Op != OpConst16 { 18464 break 18465 } 18466 c := v_0.AuxInt 18467 v_1 := v.Args[1] 18468 if v_1.Op != OpConst16 { 18469 break 18470 } 18471 d := v_1.AuxInt 18472 v.reset(OpConst16) 18473 v.AuxInt = int64(int16(c | d)) 18474 return true 18475 } 18476 // match: (Or16 (Const16 [d]) (Const16 [c])) 18477 // cond: 18478 // result: (Const16 [int64(int16(c|d))]) 18479 for { 18480 _ = v.Args[1] 18481 v_0 := v.Args[0] 18482 if v_0.Op != OpConst16 { 18483 break 18484 } 18485 d := v_0.AuxInt 18486 v_1 := v.Args[1] 18487 if v_1.Op != OpConst16 { 18488 break 18489 } 18490 c := v_1.AuxInt 18491 v.reset(OpConst16) 18492 v.AuxInt = int64(int16(c | d)) 18493 return true 18494 } 18495 // match: (Or16 x x) 18496 // cond: 18497 // result: x 18498 for { 18499 _ = v.Args[1] 18500 x := v.Args[0] 18501 if x != v.Args[1] { 18502 break 18503 } 18504 v.reset(OpCopy) 18505 v.Type = x.Type 18506 v.AddArg(x) 18507 return true 18508 } 18509 // match: (Or16 (Const16 [0]) x) 18510 // cond: 18511 // result: x 18512 for { 18513 _ = v.Args[1] 18514 v_0 := v.Args[0] 18515 if v_0.Op != OpConst16 { 18516 break 18517 } 18518 if v_0.AuxInt != 0 { 18519 break 18520 } 18521 x := v.Args[1] 18522 v.reset(OpCopy) 18523 v.Type = x.Type 18524 v.AddArg(x) 18525 return true 18526 } 18527 // match: (Or16 x (Const16 [0])) 18528 // cond: 18529 // result: x 18530 for { 18531 _ = v.Args[1] 18532 x := v.Args[0] 18533 v_1 := v.Args[1] 18534 if v_1.Op != OpConst16 { 18535 break 18536 } 18537 if v_1.AuxInt != 0 { 18538 break 18539 } 18540 v.reset(OpCopy) 18541 v.Type = x.Type 18542 v.AddArg(x) 18543 return true 18544 } 18545 // match: (Or16 (Const16 [-1]) _) 18546 // cond: 18547 // result: (Const16 [-1]) 18548 for { 18549 _ = v.Args[1] 18550 v_0 := v.Args[0] 18551 if v_0.Op != OpConst16 { 18552 break 18553 } 18554 if v_0.AuxInt != -1 { 18555 break 18556 } 18557 v.reset(OpConst16) 18558 v.AuxInt = -1 18559 return true 18560 } 18561 // match: (Or16 _ (Const16 [-1])) 18562 // cond: 18563 // result: (Const16 [-1]) 18564 for { 18565 _ = v.Args[1] 18566 v_1 := v.Args[1] 18567 if v_1.Op != OpConst16 { 18568 break 18569 } 18570 if v_1.AuxInt != -1 { 18571 break 18572 } 18573 v.reset(OpConst16) 18574 v.AuxInt = -1 18575 return true 18576 } 18577 // match: (Or16 x (Or16 x y)) 18578 // cond: 18579 // result: (Or16 x y) 18580 for { 18581 _ = v.Args[1] 18582 x := v.Args[0] 18583 v_1 := v.Args[1] 18584 if v_1.Op != OpOr16 { 18585 break 18586 } 18587 _ = v_1.Args[1] 18588 if x != v_1.Args[0] { 18589 break 18590 } 18591 y := v_1.Args[1] 18592 v.reset(OpOr16) 18593 v.AddArg(x) 18594 v.AddArg(y) 18595 return true 18596 } 18597 // match: (Or16 x (Or16 y x)) 18598 // cond: 18599 // result: (Or16 x y) 18600 for { 18601 _ = v.Args[1] 18602 x := v.Args[0] 18603 v_1 := v.Args[1] 18604 if v_1.Op != OpOr16 { 18605 break 18606 } 18607 _ = v_1.Args[1] 18608 y := v_1.Args[0] 18609 if x != v_1.Args[1] { 18610 break 18611 } 18612 v.reset(OpOr16) 18613 v.AddArg(x) 18614 v.AddArg(y) 18615 return true 18616 } 18617 // match: (Or16 (Or16 x y) x) 18618 // cond: 18619 // result: (Or16 x y) 18620 for { 18621 _ = v.Args[1] 18622 v_0 := v.Args[0] 18623 if v_0.Op != OpOr16 { 18624 break 18625 } 18626 _ = v_0.Args[1] 18627 x := v_0.Args[0] 18628 y := v_0.Args[1] 18629 if x != v.Args[1] { 18630 break 18631 } 18632 v.reset(OpOr16) 18633 v.AddArg(x) 18634 v.AddArg(y) 18635 return true 18636 } 18637 return false 18638 } 18639 func rewriteValuegeneric_OpOr16_10(v *Value) bool { 18640 b := v.Block 18641 _ = b 18642 // match: (Or16 (Or16 y x) x) 18643 // cond: 18644 // result: (Or16 x y) 18645 for { 18646 _ = v.Args[1] 18647 v_0 := v.Args[0] 18648 if v_0.Op != OpOr16 { 18649 break 18650 } 18651 _ = v_0.Args[1] 18652 y := v_0.Args[0] 18653 x := v_0.Args[1] 18654 if x != v.Args[1] { 18655 break 18656 } 18657 v.reset(OpOr16) 18658 v.AddArg(x) 18659 v.AddArg(y) 18660 return true 18661 } 18662 // match: (Or16 (And16 x (Const16 [c2])) (Const16 <t> [c1])) 18663 // cond: ^(c1 | c2) == 0 18664 // result: (Or16 (Const16 <t> [c1]) x) 18665 for { 18666 _ = v.Args[1] 18667 v_0 := v.Args[0] 18668 if v_0.Op != OpAnd16 { 18669 break 18670 } 18671 _ = v_0.Args[1] 18672 x := v_0.Args[0] 18673 v_0_1 := v_0.Args[1] 18674 if v_0_1.Op != OpConst16 { 18675 break 18676 } 18677 c2 := v_0_1.AuxInt 18678 v_1 := v.Args[1] 18679 if v_1.Op != OpConst16 { 18680 break 18681 } 18682 t := v_1.Type 18683 c1 := v_1.AuxInt 18684 if !(^(c1 | c2) == 0) { 18685 break 18686 } 18687 v.reset(OpOr16) 18688 v0 := b.NewValue0(v.Pos, OpConst16, t) 18689 v0.AuxInt = c1 18690 v.AddArg(v0) 18691 v.AddArg(x) 18692 return true 18693 } 18694 // match: (Or16 (And16 (Const16 [c2]) x) (Const16 <t> [c1])) 18695 // cond: ^(c1 | c2) == 0 18696 // result: (Or16 (Const16 <t> [c1]) x) 18697 for { 18698 _ = v.Args[1] 18699 v_0 := v.Args[0] 18700 if v_0.Op != OpAnd16 { 18701 break 18702 } 18703 _ = v_0.Args[1] 18704 v_0_0 := v_0.Args[0] 18705 if v_0_0.Op != OpConst16 { 18706 break 18707 } 18708 c2 := v_0_0.AuxInt 18709 x := v_0.Args[1] 18710 v_1 := v.Args[1] 18711 if v_1.Op != OpConst16 { 18712 break 18713 } 18714 t := v_1.Type 18715 c1 := v_1.AuxInt 18716 if !(^(c1 | c2) == 0) { 18717 break 18718 } 18719 v.reset(OpOr16) 18720 v0 := b.NewValue0(v.Pos, OpConst16, t) 18721 v0.AuxInt = c1 18722 v.AddArg(v0) 18723 v.AddArg(x) 18724 return true 18725 } 18726 // match: (Or16 (Const16 <t> [c1]) (And16 x (Const16 [c2]))) 18727 // cond: ^(c1 | c2) == 0 18728 // result: (Or16 (Const16 <t> [c1]) x) 18729 for { 18730 _ = v.Args[1] 18731 v_0 := v.Args[0] 18732 if v_0.Op != OpConst16 { 18733 break 18734 } 18735 t := v_0.Type 18736 c1 := v_0.AuxInt 18737 v_1 := v.Args[1] 18738 if v_1.Op != OpAnd16 { 18739 break 18740 } 18741 _ = v_1.Args[1] 18742 x := v_1.Args[0] 18743 v_1_1 := v_1.Args[1] 18744 if v_1_1.Op != OpConst16 { 18745 break 18746 } 18747 c2 := v_1_1.AuxInt 18748 if !(^(c1 | c2) == 0) { 18749 break 18750 } 18751 v.reset(OpOr16) 18752 v0 := b.NewValue0(v.Pos, OpConst16, t) 18753 v0.AuxInt = c1 18754 v.AddArg(v0) 18755 v.AddArg(x) 18756 return true 18757 } 18758 // match: (Or16 (Const16 <t> [c1]) (And16 (Const16 [c2]) x)) 18759 // cond: ^(c1 | c2) == 0 18760 // result: (Or16 (Const16 <t> [c1]) x) 18761 for { 18762 _ = v.Args[1] 18763 v_0 := v.Args[0] 18764 if v_0.Op != OpConst16 { 18765 break 18766 } 18767 t := v_0.Type 18768 c1 := v_0.AuxInt 18769 v_1 := v.Args[1] 18770 if v_1.Op != OpAnd16 { 18771 break 18772 } 18773 _ = v_1.Args[1] 18774 v_1_0 := v_1.Args[0] 18775 if v_1_0.Op != OpConst16 { 18776 break 18777 } 18778 c2 := v_1_0.AuxInt 18779 x := v_1.Args[1] 18780 if !(^(c1 | c2) == 0) { 18781 break 18782 } 18783 v.reset(OpOr16) 18784 v0 := b.NewValue0(v.Pos, OpConst16, t) 18785 v0.AuxInt = c1 18786 v.AddArg(v0) 18787 v.AddArg(x) 18788 return true 18789 } 18790 // match: (Or16 (Or16 i:(Const16 <t>) z) x) 18791 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 18792 // result: (Or16 i (Or16 <t> z x)) 18793 for { 18794 _ = v.Args[1] 18795 v_0 := v.Args[0] 18796 if v_0.Op != OpOr16 { 18797 break 18798 } 18799 _ = v_0.Args[1] 18800 i := v_0.Args[0] 18801 if i.Op != OpConst16 { 18802 break 18803 } 18804 t := i.Type 18805 z := v_0.Args[1] 18806 x := v.Args[1] 18807 if !(z.Op != OpConst16 && x.Op != OpConst16) { 18808 break 18809 } 18810 v.reset(OpOr16) 18811 v.AddArg(i) 18812 v0 := b.NewValue0(v.Pos, OpOr16, t) 18813 v0.AddArg(z) 18814 v0.AddArg(x) 18815 v.AddArg(v0) 18816 return true 18817 } 18818 // match: (Or16 (Or16 z i:(Const16 <t>)) x) 18819 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 18820 // result: (Or16 i (Or16 <t> z x)) 18821 for { 18822 _ = v.Args[1] 18823 v_0 := v.Args[0] 18824 if v_0.Op != OpOr16 { 18825 break 18826 } 18827 _ = v_0.Args[1] 18828 z := v_0.Args[0] 18829 i := v_0.Args[1] 18830 if i.Op != OpConst16 { 18831 break 18832 } 18833 t := i.Type 18834 x := v.Args[1] 18835 if !(z.Op != OpConst16 && x.Op != OpConst16) { 18836 break 18837 } 18838 v.reset(OpOr16) 18839 v.AddArg(i) 18840 v0 := b.NewValue0(v.Pos, OpOr16, t) 18841 v0.AddArg(z) 18842 v0.AddArg(x) 18843 v.AddArg(v0) 18844 return true 18845 } 18846 // match: (Or16 x (Or16 i:(Const16 <t>) z)) 18847 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 18848 // result: (Or16 i (Or16 <t> z x)) 18849 for { 18850 _ = v.Args[1] 18851 x := v.Args[0] 18852 v_1 := v.Args[1] 18853 if v_1.Op != OpOr16 { 18854 break 18855 } 18856 _ = v_1.Args[1] 18857 i := v_1.Args[0] 18858 if i.Op != OpConst16 { 18859 break 18860 } 18861 t := i.Type 18862 z := v_1.Args[1] 18863 if !(z.Op != OpConst16 && x.Op != OpConst16) { 18864 break 18865 } 18866 v.reset(OpOr16) 18867 v.AddArg(i) 18868 v0 := b.NewValue0(v.Pos, OpOr16, t) 18869 v0.AddArg(z) 18870 v0.AddArg(x) 18871 v.AddArg(v0) 18872 return true 18873 } 18874 // match: (Or16 x (Or16 z i:(Const16 <t>))) 18875 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 18876 // result: (Or16 i (Or16 <t> z x)) 18877 for { 18878 _ = v.Args[1] 18879 x := v.Args[0] 18880 v_1 := v.Args[1] 18881 if v_1.Op != OpOr16 { 18882 break 18883 } 18884 _ = v_1.Args[1] 18885 z := v_1.Args[0] 18886 i := v_1.Args[1] 18887 if i.Op != OpConst16 { 18888 break 18889 } 18890 t := i.Type 18891 if !(z.Op != OpConst16 && x.Op != OpConst16) { 18892 break 18893 } 18894 v.reset(OpOr16) 18895 v.AddArg(i) 18896 v0 := b.NewValue0(v.Pos, OpOr16, t) 18897 v0.AddArg(z) 18898 v0.AddArg(x) 18899 v.AddArg(v0) 18900 return true 18901 } 18902 // match: (Or16 (Const16 <t> [c]) (Or16 (Const16 <t> [d]) x)) 18903 // cond: 18904 // result: (Or16 (Const16 <t> [int64(int16(c|d))]) x) 18905 for { 18906 _ = v.Args[1] 18907 v_0 := v.Args[0] 18908 if v_0.Op != OpConst16 { 18909 break 18910 } 18911 t := v_0.Type 18912 c := v_0.AuxInt 18913 v_1 := v.Args[1] 18914 if v_1.Op != OpOr16 { 18915 break 18916 } 18917 _ = v_1.Args[1] 18918 v_1_0 := v_1.Args[0] 18919 if v_1_0.Op != OpConst16 { 18920 break 18921 } 18922 if v_1_0.Type != t { 18923 break 18924 } 18925 d := v_1_0.AuxInt 18926 x := v_1.Args[1] 18927 v.reset(OpOr16) 18928 v0 := b.NewValue0(v.Pos, OpConst16, t) 18929 v0.AuxInt = int64(int16(c | d)) 18930 v.AddArg(v0) 18931 v.AddArg(x) 18932 return true 18933 } 18934 return false 18935 } 18936 func rewriteValuegeneric_OpOr16_20(v *Value) bool { 18937 b := v.Block 18938 _ = b 18939 // match: (Or16 (Const16 <t> [c]) (Or16 x (Const16 <t> [d]))) 18940 // cond: 18941 // result: (Or16 (Const16 <t> [int64(int16(c|d))]) x) 18942 for { 18943 _ = v.Args[1] 18944 v_0 := v.Args[0] 18945 if v_0.Op != OpConst16 { 18946 break 18947 } 18948 t := v_0.Type 18949 c := v_0.AuxInt 18950 v_1 := v.Args[1] 18951 if v_1.Op != OpOr16 { 18952 break 18953 } 18954 _ = v_1.Args[1] 18955 x := v_1.Args[0] 18956 v_1_1 := v_1.Args[1] 18957 if v_1_1.Op != OpConst16 { 18958 break 18959 } 18960 if v_1_1.Type != t { 18961 break 18962 } 18963 d := v_1_1.AuxInt 18964 v.reset(OpOr16) 18965 v0 := b.NewValue0(v.Pos, OpConst16, t) 18966 v0.AuxInt = int64(int16(c | d)) 18967 v.AddArg(v0) 18968 v.AddArg(x) 18969 return true 18970 } 18971 // match: (Or16 (Or16 (Const16 <t> [d]) x) (Const16 <t> [c])) 18972 // cond: 18973 // result: (Or16 (Const16 <t> [int64(int16(c|d))]) x) 18974 for { 18975 _ = v.Args[1] 18976 v_0 := v.Args[0] 18977 if v_0.Op != OpOr16 { 18978 break 18979 } 18980 _ = v_0.Args[1] 18981 v_0_0 := v_0.Args[0] 18982 if v_0_0.Op != OpConst16 { 18983 break 18984 } 18985 t := v_0_0.Type 18986 d := v_0_0.AuxInt 18987 x := v_0.Args[1] 18988 v_1 := v.Args[1] 18989 if v_1.Op != OpConst16 { 18990 break 18991 } 18992 if v_1.Type != t { 18993 break 18994 } 18995 c := v_1.AuxInt 18996 v.reset(OpOr16) 18997 v0 := b.NewValue0(v.Pos, OpConst16, t) 18998 v0.AuxInt = int64(int16(c | d)) 18999 v.AddArg(v0) 19000 v.AddArg(x) 19001 return true 19002 } 19003 // match: (Or16 (Or16 x (Const16 <t> [d])) (Const16 <t> [c])) 19004 // cond: 19005 // result: (Or16 (Const16 <t> [int64(int16(c|d))]) x) 19006 for { 19007 _ = v.Args[1] 19008 v_0 := v.Args[0] 19009 if v_0.Op != OpOr16 { 19010 break 19011 } 19012 _ = v_0.Args[1] 19013 x := v_0.Args[0] 19014 v_0_1 := v_0.Args[1] 19015 if v_0_1.Op != OpConst16 { 19016 break 19017 } 19018 t := v_0_1.Type 19019 d := v_0_1.AuxInt 19020 v_1 := v.Args[1] 19021 if v_1.Op != OpConst16 { 19022 break 19023 } 19024 if v_1.Type != t { 19025 break 19026 } 19027 c := v_1.AuxInt 19028 v.reset(OpOr16) 19029 v0 := b.NewValue0(v.Pos, OpConst16, t) 19030 v0.AuxInt = int64(int16(c | d)) 19031 v.AddArg(v0) 19032 v.AddArg(x) 19033 return true 19034 } 19035 return false 19036 } 19037 func rewriteValuegeneric_OpOr32_0(v *Value) bool { 19038 // match: (Or32 (Const32 [c]) (Const32 [d])) 19039 // cond: 19040 // result: (Const32 [int64(int32(c|d))]) 19041 for { 19042 _ = v.Args[1] 19043 v_0 := v.Args[0] 19044 if v_0.Op != OpConst32 { 19045 break 19046 } 19047 c := v_0.AuxInt 19048 v_1 := v.Args[1] 19049 if v_1.Op != OpConst32 { 19050 break 19051 } 19052 d := v_1.AuxInt 19053 v.reset(OpConst32) 19054 v.AuxInt = int64(int32(c | d)) 19055 return true 19056 } 19057 // match: (Or32 (Const32 [d]) (Const32 [c])) 19058 // cond: 19059 // result: (Const32 [int64(int32(c|d))]) 19060 for { 19061 _ = v.Args[1] 19062 v_0 := v.Args[0] 19063 if v_0.Op != OpConst32 { 19064 break 19065 } 19066 d := v_0.AuxInt 19067 v_1 := v.Args[1] 19068 if v_1.Op != OpConst32 { 19069 break 19070 } 19071 c := v_1.AuxInt 19072 v.reset(OpConst32) 19073 v.AuxInt = int64(int32(c | d)) 19074 return true 19075 } 19076 // match: (Or32 x x) 19077 // cond: 19078 // result: x 19079 for { 19080 _ = v.Args[1] 19081 x := v.Args[0] 19082 if x != v.Args[1] { 19083 break 19084 } 19085 v.reset(OpCopy) 19086 v.Type = x.Type 19087 v.AddArg(x) 19088 return true 19089 } 19090 // match: (Or32 (Const32 [0]) x) 19091 // cond: 19092 // result: x 19093 for { 19094 _ = v.Args[1] 19095 v_0 := v.Args[0] 19096 if v_0.Op != OpConst32 { 19097 break 19098 } 19099 if v_0.AuxInt != 0 { 19100 break 19101 } 19102 x := v.Args[1] 19103 v.reset(OpCopy) 19104 v.Type = x.Type 19105 v.AddArg(x) 19106 return true 19107 } 19108 // match: (Or32 x (Const32 [0])) 19109 // cond: 19110 // result: x 19111 for { 19112 _ = v.Args[1] 19113 x := v.Args[0] 19114 v_1 := v.Args[1] 19115 if v_1.Op != OpConst32 { 19116 break 19117 } 19118 if v_1.AuxInt != 0 { 19119 break 19120 } 19121 v.reset(OpCopy) 19122 v.Type = x.Type 19123 v.AddArg(x) 19124 return true 19125 } 19126 // match: (Or32 (Const32 [-1]) _) 19127 // cond: 19128 // result: (Const32 [-1]) 19129 for { 19130 _ = v.Args[1] 19131 v_0 := v.Args[0] 19132 if v_0.Op != OpConst32 { 19133 break 19134 } 19135 if v_0.AuxInt != -1 { 19136 break 19137 } 19138 v.reset(OpConst32) 19139 v.AuxInt = -1 19140 return true 19141 } 19142 // match: (Or32 _ (Const32 [-1])) 19143 // cond: 19144 // result: (Const32 [-1]) 19145 for { 19146 _ = v.Args[1] 19147 v_1 := v.Args[1] 19148 if v_1.Op != OpConst32 { 19149 break 19150 } 19151 if v_1.AuxInt != -1 { 19152 break 19153 } 19154 v.reset(OpConst32) 19155 v.AuxInt = -1 19156 return true 19157 } 19158 // match: (Or32 x (Or32 x y)) 19159 // cond: 19160 // result: (Or32 x y) 19161 for { 19162 _ = v.Args[1] 19163 x := v.Args[0] 19164 v_1 := v.Args[1] 19165 if v_1.Op != OpOr32 { 19166 break 19167 } 19168 _ = v_1.Args[1] 19169 if x != v_1.Args[0] { 19170 break 19171 } 19172 y := v_1.Args[1] 19173 v.reset(OpOr32) 19174 v.AddArg(x) 19175 v.AddArg(y) 19176 return true 19177 } 19178 // match: (Or32 x (Or32 y x)) 19179 // cond: 19180 // result: (Or32 x y) 19181 for { 19182 _ = v.Args[1] 19183 x := v.Args[0] 19184 v_1 := v.Args[1] 19185 if v_1.Op != OpOr32 { 19186 break 19187 } 19188 _ = v_1.Args[1] 19189 y := v_1.Args[0] 19190 if x != v_1.Args[1] { 19191 break 19192 } 19193 v.reset(OpOr32) 19194 v.AddArg(x) 19195 v.AddArg(y) 19196 return true 19197 } 19198 // match: (Or32 (Or32 x y) x) 19199 // cond: 19200 // result: (Or32 x y) 19201 for { 19202 _ = v.Args[1] 19203 v_0 := v.Args[0] 19204 if v_0.Op != OpOr32 { 19205 break 19206 } 19207 _ = v_0.Args[1] 19208 x := v_0.Args[0] 19209 y := v_0.Args[1] 19210 if x != v.Args[1] { 19211 break 19212 } 19213 v.reset(OpOr32) 19214 v.AddArg(x) 19215 v.AddArg(y) 19216 return true 19217 } 19218 return false 19219 } 19220 func rewriteValuegeneric_OpOr32_10(v *Value) bool { 19221 b := v.Block 19222 _ = b 19223 // match: (Or32 (Or32 y x) x) 19224 // cond: 19225 // result: (Or32 x y) 19226 for { 19227 _ = v.Args[1] 19228 v_0 := v.Args[0] 19229 if v_0.Op != OpOr32 { 19230 break 19231 } 19232 _ = v_0.Args[1] 19233 y := v_0.Args[0] 19234 x := v_0.Args[1] 19235 if x != v.Args[1] { 19236 break 19237 } 19238 v.reset(OpOr32) 19239 v.AddArg(x) 19240 v.AddArg(y) 19241 return true 19242 } 19243 // match: (Or32 (And32 x (Const32 [c2])) (Const32 <t> [c1])) 19244 // cond: ^(c1 | c2) == 0 19245 // result: (Or32 (Const32 <t> [c1]) x) 19246 for { 19247 _ = v.Args[1] 19248 v_0 := v.Args[0] 19249 if v_0.Op != OpAnd32 { 19250 break 19251 } 19252 _ = v_0.Args[1] 19253 x := v_0.Args[0] 19254 v_0_1 := v_0.Args[1] 19255 if v_0_1.Op != OpConst32 { 19256 break 19257 } 19258 c2 := v_0_1.AuxInt 19259 v_1 := v.Args[1] 19260 if v_1.Op != OpConst32 { 19261 break 19262 } 19263 t := v_1.Type 19264 c1 := v_1.AuxInt 19265 if !(^(c1 | c2) == 0) { 19266 break 19267 } 19268 v.reset(OpOr32) 19269 v0 := b.NewValue0(v.Pos, OpConst32, t) 19270 v0.AuxInt = c1 19271 v.AddArg(v0) 19272 v.AddArg(x) 19273 return true 19274 } 19275 // match: (Or32 (And32 (Const32 [c2]) x) (Const32 <t> [c1])) 19276 // cond: ^(c1 | c2) == 0 19277 // result: (Or32 (Const32 <t> [c1]) x) 19278 for { 19279 _ = v.Args[1] 19280 v_0 := v.Args[0] 19281 if v_0.Op != OpAnd32 { 19282 break 19283 } 19284 _ = v_0.Args[1] 19285 v_0_0 := v_0.Args[0] 19286 if v_0_0.Op != OpConst32 { 19287 break 19288 } 19289 c2 := v_0_0.AuxInt 19290 x := v_0.Args[1] 19291 v_1 := v.Args[1] 19292 if v_1.Op != OpConst32 { 19293 break 19294 } 19295 t := v_1.Type 19296 c1 := v_1.AuxInt 19297 if !(^(c1 | c2) == 0) { 19298 break 19299 } 19300 v.reset(OpOr32) 19301 v0 := b.NewValue0(v.Pos, OpConst32, t) 19302 v0.AuxInt = c1 19303 v.AddArg(v0) 19304 v.AddArg(x) 19305 return true 19306 } 19307 // match: (Or32 (Const32 <t> [c1]) (And32 x (Const32 [c2]))) 19308 // cond: ^(c1 | c2) == 0 19309 // result: (Or32 (Const32 <t> [c1]) x) 19310 for { 19311 _ = v.Args[1] 19312 v_0 := v.Args[0] 19313 if v_0.Op != OpConst32 { 19314 break 19315 } 19316 t := v_0.Type 19317 c1 := v_0.AuxInt 19318 v_1 := v.Args[1] 19319 if v_1.Op != OpAnd32 { 19320 break 19321 } 19322 _ = v_1.Args[1] 19323 x := v_1.Args[0] 19324 v_1_1 := v_1.Args[1] 19325 if v_1_1.Op != OpConst32 { 19326 break 19327 } 19328 c2 := v_1_1.AuxInt 19329 if !(^(c1 | c2) == 0) { 19330 break 19331 } 19332 v.reset(OpOr32) 19333 v0 := b.NewValue0(v.Pos, OpConst32, t) 19334 v0.AuxInt = c1 19335 v.AddArg(v0) 19336 v.AddArg(x) 19337 return true 19338 } 19339 // match: (Or32 (Const32 <t> [c1]) (And32 (Const32 [c2]) x)) 19340 // cond: ^(c1 | c2) == 0 19341 // result: (Or32 (Const32 <t> [c1]) x) 19342 for { 19343 _ = v.Args[1] 19344 v_0 := v.Args[0] 19345 if v_0.Op != OpConst32 { 19346 break 19347 } 19348 t := v_0.Type 19349 c1 := v_0.AuxInt 19350 v_1 := v.Args[1] 19351 if v_1.Op != OpAnd32 { 19352 break 19353 } 19354 _ = v_1.Args[1] 19355 v_1_0 := v_1.Args[0] 19356 if v_1_0.Op != OpConst32 { 19357 break 19358 } 19359 c2 := v_1_0.AuxInt 19360 x := v_1.Args[1] 19361 if !(^(c1 | c2) == 0) { 19362 break 19363 } 19364 v.reset(OpOr32) 19365 v0 := b.NewValue0(v.Pos, OpConst32, t) 19366 v0.AuxInt = c1 19367 v.AddArg(v0) 19368 v.AddArg(x) 19369 return true 19370 } 19371 // match: (Or32 (Or32 i:(Const32 <t>) z) x) 19372 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 19373 // result: (Or32 i (Or32 <t> z x)) 19374 for { 19375 _ = v.Args[1] 19376 v_0 := v.Args[0] 19377 if v_0.Op != OpOr32 { 19378 break 19379 } 19380 _ = v_0.Args[1] 19381 i := v_0.Args[0] 19382 if i.Op != OpConst32 { 19383 break 19384 } 19385 t := i.Type 19386 z := v_0.Args[1] 19387 x := v.Args[1] 19388 if !(z.Op != OpConst32 && x.Op != OpConst32) { 19389 break 19390 } 19391 v.reset(OpOr32) 19392 v.AddArg(i) 19393 v0 := b.NewValue0(v.Pos, OpOr32, t) 19394 v0.AddArg(z) 19395 v0.AddArg(x) 19396 v.AddArg(v0) 19397 return true 19398 } 19399 // match: (Or32 (Or32 z i:(Const32 <t>)) x) 19400 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 19401 // result: (Or32 i (Or32 <t> z x)) 19402 for { 19403 _ = v.Args[1] 19404 v_0 := v.Args[0] 19405 if v_0.Op != OpOr32 { 19406 break 19407 } 19408 _ = v_0.Args[1] 19409 z := v_0.Args[0] 19410 i := v_0.Args[1] 19411 if i.Op != OpConst32 { 19412 break 19413 } 19414 t := i.Type 19415 x := v.Args[1] 19416 if !(z.Op != OpConst32 && x.Op != OpConst32) { 19417 break 19418 } 19419 v.reset(OpOr32) 19420 v.AddArg(i) 19421 v0 := b.NewValue0(v.Pos, OpOr32, t) 19422 v0.AddArg(z) 19423 v0.AddArg(x) 19424 v.AddArg(v0) 19425 return true 19426 } 19427 // match: (Or32 x (Or32 i:(Const32 <t>) z)) 19428 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 19429 // result: (Or32 i (Or32 <t> z x)) 19430 for { 19431 _ = v.Args[1] 19432 x := v.Args[0] 19433 v_1 := v.Args[1] 19434 if v_1.Op != OpOr32 { 19435 break 19436 } 19437 _ = v_1.Args[1] 19438 i := v_1.Args[0] 19439 if i.Op != OpConst32 { 19440 break 19441 } 19442 t := i.Type 19443 z := v_1.Args[1] 19444 if !(z.Op != OpConst32 && x.Op != OpConst32) { 19445 break 19446 } 19447 v.reset(OpOr32) 19448 v.AddArg(i) 19449 v0 := b.NewValue0(v.Pos, OpOr32, t) 19450 v0.AddArg(z) 19451 v0.AddArg(x) 19452 v.AddArg(v0) 19453 return true 19454 } 19455 // match: (Or32 x (Or32 z i:(Const32 <t>))) 19456 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 19457 // result: (Or32 i (Or32 <t> z x)) 19458 for { 19459 _ = v.Args[1] 19460 x := v.Args[0] 19461 v_1 := v.Args[1] 19462 if v_1.Op != OpOr32 { 19463 break 19464 } 19465 _ = v_1.Args[1] 19466 z := v_1.Args[0] 19467 i := v_1.Args[1] 19468 if i.Op != OpConst32 { 19469 break 19470 } 19471 t := i.Type 19472 if !(z.Op != OpConst32 && x.Op != OpConst32) { 19473 break 19474 } 19475 v.reset(OpOr32) 19476 v.AddArg(i) 19477 v0 := b.NewValue0(v.Pos, OpOr32, t) 19478 v0.AddArg(z) 19479 v0.AddArg(x) 19480 v.AddArg(v0) 19481 return true 19482 } 19483 // match: (Or32 (Const32 <t> [c]) (Or32 (Const32 <t> [d]) x)) 19484 // cond: 19485 // result: (Or32 (Const32 <t> [int64(int32(c|d))]) x) 19486 for { 19487 _ = v.Args[1] 19488 v_0 := v.Args[0] 19489 if v_0.Op != OpConst32 { 19490 break 19491 } 19492 t := v_0.Type 19493 c := v_0.AuxInt 19494 v_1 := v.Args[1] 19495 if v_1.Op != OpOr32 { 19496 break 19497 } 19498 _ = v_1.Args[1] 19499 v_1_0 := v_1.Args[0] 19500 if v_1_0.Op != OpConst32 { 19501 break 19502 } 19503 if v_1_0.Type != t { 19504 break 19505 } 19506 d := v_1_0.AuxInt 19507 x := v_1.Args[1] 19508 v.reset(OpOr32) 19509 v0 := b.NewValue0(v.Pos, OpConst32, t) 19510 v0.AuxInt = int64(int32(c | d)) 19511 v.AddArg(v0) 19512 v.AddArg(x) 19513 return true 19514 } 19515 return false 19516 } 19517 func rewriteValuegeneric_OpOr32_20(v *Value) bool { 19518 b := v.Block 19519 _ = b 19520 // match: (Or32 (Const32 <t> [c]) (Or32 x (Const32 <t> [d]))) 19521 // cond: 19522 // result: (Or32 (Const32 <t> [int64(int32(c|d))]) x) 19523 for { 19524 _ = v.Args[1] 19525 v_0 := v.Args[0] 19526 if v_0.Op != OpConst32 { 19527 break 19528 } 19529 t := v_0.Type 19530 c := v_0.AuxInt 19531 v_1 := v.Args[1] 19532 if v_1.Op != OpOr32 { 19533 break 19534 } 19535 _ = v_1.Args[1] 19536 x := v_1.Args[0] 19537 v_1_1 := v_1.Args[1] 19538 if v_1_1.Op != OpConst32 { 19539 break 19540 } 19541 if v_1_1.Type != t { 19542 break 19543 } 19544 d := v_1_1.AuxInt 19545 v.reset(OpOr32) 19546 v0 := b.NewValue0(v.Pos, OpConst32, t) 19547 v0.AuxInt = int64(int32(c | d)) 19548 v.AddArg(v0) 19549 v.AddArg(x) 19550 return true 19551 } 19552 // match: (Or32 (Or32 (Const32 <t> [d]) x) (Const32 <t> [c])) 19553 // cond: 19554 // result: (Or32 (Const32 <t> [int64(int32(c|d))]) x) 19555 for { 19556 _ = v.Args[1] 19557 v_0 := v.Args[0] 19558 if v_0.Op != OpOr32 { 19559 break 19560 } 19561 _ = v_0.Args[1] 19562 v_0_0 := v_0.Args[0] 19563 if v_0_0.Op != OpConst32 { 19564 break 19565 } 19566 t := v_0_0.Type 19567 d := v_0_0.AuxInt 19568 x := v_0.Args[1] 19569 v_1 := v.Args[1] 19570 if v_1.Op != OpConst32 { 19571 break 19572 } 19573 if v_1.Type != t { 19574 break 19575 } 19576 c := v_1.AuxInt 19577 v.reset(OpOr32) 19578 v0 := b.NewValue0(v.Pos, OpConst32, t) 19579 v0.AuxInt = int64(int32(c | d)) 19580 v.AddArg(v0) 19581 v.AddArg(x) 19582 return true 19583 } 19584 // match: (Or32 (Or32 x (Const32 <t> [d])) (Const32 <t> [c])) 19585 // cond: 19586 // result: (Or32 (Const32 <t> [int64(int32(c|d))]) x) 19587 for { 19588 _ = v.Args[1] 19589 v_0 := v.Args[0] 19590 if v_0.Op != OpOr32 { 19591 break 19592 } 19593 _ = v_0.Args[1] 19594 x := v_0.Args[0] 19595 v_0_1 := v_0.Args[1] 19596 if v_0_1.Op != OpConst32 { 19597 break 19598 } 19599 t := v_0_1.Type 19600 d := v_0_1.AuxInt 19601 v_1 := v.Args[1] 19602 if v_1.Op != OpConst32 { 19603 break 19604 } 19605 if v_1.Type != t { 19606 break 19607 } 19608 c := v_1.AuxInt 19609 v.reset(OpOr32) 19610 v0 := b.NewValue0(v.Pos, OpConst32, t) 19611 v0.AuxInt = int64(int32(c | d)) 19612 v.AddArg(v0) 19613 v.AddArg(x) 19614 return true 19615 } 19616 return false 19617 } 19618 func rewriteValuegeneric_OpOr64_0(v *Value) bool { 19619 // match: (Or64 (Const64 [c]) (Const64 [d])) 19620 // cond: 19621 // result: (Const64 [c|d]) 19622 for { 19623 _ = v.Args[1] 19624 v_0 := v.Args[0] 19625 if v_0.Op != OpConst64 { 19626 break 19627 } 19628 c := v_0.AuxInt 19629 v_1 := v.Args[1] 19630 if v_1.Op != OpConst64 { 19631 break 19632 } 19633 d := v_1.AuxInt 19634 v.reset(OpConst64) 19635 v.AuxInt = c | d 19636 return true 19637 } 19638 // match: (Or64 (Const64 [d]) (Const64 [c])) 19639 // cond: 19640 // result: (Const64 [c|d]) 19641 for { 19642 _ = v.Args[1] 19643 v_0 := v.Args[0] 19644 if v_0.Op != OpConst64 { 19645 break 19646 } 19647 d := v_0.AuxInt 19648 v_1 := v.Args[1] 19649 if v_1.Op != OpConst64 { 19650 break 19651 } 19652 c := v_1.AuxInt 19653 v.reset(OpConst64) 19654 v.AuxInt = c | d 19655 return true 19656 } 19657 // match: (Or64 x x) 19658 // cond: 19659 // result: x 19660 for { 19661 _ = v.Args[1] 19662 x := v.Args[0] 19663 if x != v.Args[1] { 19664 break 19665 } 19666 v.reset(OpCopy) 19667 v.Type = x.Type 19668 v.AddArg(x) 19669 return true 19670 } 19671 // match: (Or64 (Const64 [0]) x) 19672 // cond: 19673 // result: x 19674 for { 19675 _ = v.Args[1] 19676 v_0 := v.Args[0] 19677 if v_0.Op != OpConst64 { 19678 break 19679 } 19680 if v_0.AuxInt != 0 { 19681 break 19682 } 19683 x := v.Args[1] 19684 v.reset(OpCopy) 19685 v.Type = x.Type 19686 v.AddArg(x) 19687 return true 19688 } 19689 // match: (Or64 x (Const64 [0])) 19690 // cond: 19691 // result: x 19692 for { 19693 _ = v.Args[1] 19694 x := v.Args[0] 19695 v_1 := v.Args[1] 19696 if v_1.Op != OpConst64 { 19697 break 19698 } 19699 if v_1.AuxInt != 0 { 19700 break 19701 } 19702 v.reset(OpCopy) 19703 v.Type = x.Type 19704 v.AddArg(x) 19705 return true 19706 } 19707 // match: (Or64 (Const64 [-1]) _) 19708 // cond: 19709 // result: (Const64 [-1]) 19710 for { 19711 _ = v.Args[1] 19712 v_0 := v.Args[0] 19713 if v_0.Op != OpConst64 { 19714 break 19715 } 19716 if v_0.AuxInt != -1 { 19717 break 19718 } 19719 v.reset(OpConst64) 19720 v.AuxInt = -1 19721 return true 19722 } 19723 // match: (Or64 _ (Const64 [-1])) 19724 // cond: 19725 // result: (Const64 [-1]) 19726 for { 19727 _ = v.Args[1] 19728 v_1 := v.Args[1] 19729 if v_1.Op != OpConst64 { 19730 break 19731 } 19732 if v_1.AuxInt != -1 { 19733 break 19734 } 19735 v.reset(OpConst64) 19736 v.AuxInt = -1 19737 return true 19738 } 19739 // match: (Or64 x (Or64 x y)) 19740 // cond: 19741 // result: (Or64 x y) 19742 for { 19743 _ = v.Args[1] 19744 x := v.Args[0] 19745 v_1 := v.Args[1] 19746 if v_1.Op != OpOr64 { 19747 break 19748 } 19749 _ = v_1.Args[1] 19750 if x != v_1.Args[0] { 19751 break 19752 } 19753 y := v_1.Args[1] 19754 v.reset(OpOr64) 19755 v.AddArg(x) 19756 v.AddArg(y) 19757 return true 19758 } 19759 // match: (Or64 x (Or64 y x)) 19760 // cond: 19761 // result: (Or64 x y) 19762 for { 19763 _ = v.Args[1] 19764 x := v.Args[0] 19765 v_1 := v.Args[1] 19766 if v_1.Op != OpOr64 { 19767 break 19768 } 19769 _ = v_1.Args[1] 19770 y := v_1.Args[0] 19771 if x != v_1.Args[1] { 19772 break 19773 } 19774 v.reset(OpOr64) 19775 v.AddArg(x) 19776 v.AddArg(y) 19777 return true 19778 } 19779 // match: (Or64 (Or64 x y) x) 19780 // cond: 19781 // result: (Or64 x y) 19782 for { 19783 _ = v.Args[1] 19784 v_0 := v.Args[0] 19785 if v_0.Op != OpOr64 { 19786 break 19787 } 19788 _ = v_0.Args[1] 19789 x := v_0.Args[0] 19790 y := v_0.Args[1] 19791 if x != v.Args[1] { 19792 break 19793 } 19794 v.reset(OpOr64) 19795 v.AddArg(x) 19796 v.AddArg(y) 19797 return true 19798 } 19799 return false 19800 } 19801 func rewriteValuegeneric_OpOr64_10(v *Value) bool { 19802 b := v.Block 19803 _ = b 19804 // match: (Or64 (Or64 y x) x) 19805 // cond: 19806 // result: (Or64 x y) 19807 for { 19808 _ = v.Args[1] 19809 v_0 := v.Args[0] 19810 if v_0.Op != OpOr64 { 19811 break 19812 } 19813 _ = v_0.Args[1] 19814 y := v_0.Args[0] 19815 x := v_0.Args[1] 19816 if x != v.Args[1] { 19817 break 19818 } 19819 v.reset(OpOr64) 19820 v.AddArg(x) 19821 v.AddArg(y) 19822 return true 19823 } 19824 // match: (Or64 (And64 x (Const64 [c2])) (Const64 <t> [c1])) 19825 // cond: ^(c1 | c2) == 0 19826 // result: (Or64 (Const64 <t> [c1]) x) 19827 for { 19828 _ = v.Args[1] 19829 v_0 := v.Args[0] 19830 if v_0.Op != OpAnd64 { 19831 break 19832 } 19833 _ = v_0.Args[1] 19834 x := v_0.Args[0] 19835 v_0_1 := v_0.Args[1] 19836 if v_0_1.Op != OpConst64 { 19837 break 19838 } 19839 c2 := v_0_1.AuxInt 19840 v_1 := v.Args[1] 19841 if v_1.Op != OpConst64 { 19842 break 19843 } 19844 t := v_1.Type 19845 c1 := v_1.AuxInt 19846 if !(^(c1 | c2) == 0) { 19847 break 19848 } 19849 v.reset(OpOr64) 19850 v0 := b.NewValue0(v.Pos, OpConst64, t) 19851 v0.AuxInt = c1 19852 v.AddArg(v0) 19853 v.AddArg(x) 19854 return true 19855 } 19856 // match: (Or64 (And64 (Const64 [c2]) x) (Const64 <t> [c1])) 19857 // cond: ^(c1 | c2) == 0 19858 // result: (Or64 (Const64 <t> [c1]) x) 19859 for { 19860 _ = v.Args[1] 19861 v_0 := v.Args[0] 19862 if v_0.Op != OpAnd64 { 19863 break 19864 } 19865 _ = v_0.Args[1] 19866 v_0_0 := v_0.Args[0] 19867 if v_0_0.Op != OpConst64 { 19868 break 19869 } 19870 c2 := v_0_0.AuxInt 19871 x := v_0.Args[1] 19872 v_1 := v.Args[1] 19873 if v_1.Op != OpConst64 { 19874 break 19875 } 19876 t := v_1.Type 19877 c1 := v_1.AuxInt 19878 if !(^(c1 | c2) == 0) { 19879 break 19880 } 19881 v.reset(OpOr64) 19882 v0 := b.NewValue0(v.Pos, OpConst64, t) 19883 v0.AuxInt = c1 19884 v.AddArg(v0) 19885 v.AddArg(x) 19886 return true 19887 } 19888 // match: (Or64 (Const64 <t> [c1]) (And64 x (Const64 [c2]))) 19889 // cond: ^(c1 | c2) == 0 19890 // result: (Or64 (Const64 <t> [c1]) x) 19891 for { 19892 _ = v.Args[1] 19893 v_0 := v.Args[0] 19894 if v_0.Op != OpConst64 { 19895 break 19896 } 19897 t := v_0.Type 19898 c1 := v_0.AuxInt 19899 v_1 := v.Args[1] 19900 if v_1.Op != OpAnd64 { 19901 break 19902 } 19903 _ = v_1.Args[1] 19904 x := v_1.Args[0] 19905 v_1_1 := v_1.Args[1] 19906 if v_1_1.Op != OpConst64 { 19907 break 19908 } 19909 c2 := v_1_1.AuxInt 19910 if !(^(c1 | c2) == 0) { 19911 break 19912 } 19913 v.reset(OpOr64) 19914 v0 := b.NewValue0(v.Pos, OpConst64, t) 19915 v0.AuxInt = c1 19916 v.AddArg(v0) 19917 v.AddArg(x) 19918 return true 19919 } 19920 // match: (Or64 (Const64 <t> [c1]) (And64 (Const64 [c2]) x)) 19921 // cond: ^(c1 | c2) == 0 19922 // result: (Or64 (Const64 <t> [c1]) x) 19923 for { 19924 _ = v.Args[1] 19925 v_0 := v.Args[0] 19926 if v_0.Op != OpConst64 { 19927 break 19928 } 19929 t := v_0.Type 19930 c1 := v_0.AuxInt 19931 v_1 := v.Args[1] 19932 if v_1.Op != OpAnd64 { 19933 break 19934 } 19935 _ = v_1.Args[1] 19936 v_1_0 := v_1.Args[0] 19937 if v_1_0.Op != OpConst64 { 19938 break 19939 } 19940 c2 := v_1_0.AuxInt 19941 x := v_1.Args[1] 19942 if !(^(c1 | c2) == 0) { 19943 break 19944 } 19945 v.reset(OpOr64) 19946 v0 := b.NewValue0(v.Pos, OpConst64, t) 19947 v0.AuxInt = c1 19948 v.AddArg(v0) 19949 v.AddArg(x) 19950 return true 19951 } 19952 // match: (Or64 (Or64 i:(Const64 <t>) z) x) 19953 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 19954 // result: (Or64 i (Or64 <t> z x)) 19955 for { 19956 _ = v.Args[1] 19957 v_0 := v.Args[0] 19958 if v_0.Op != OpOr64 { 19959 break 19960 } 19961 _ = v_0.Args[1] 19962 i := v_0.Args[0] 19963 if i.Op != OpConst64 { 19964 break 19965 } 19966 t := i.Type 19967 z := v_0.Args[1] 19968 x := v.Args[1] 19969 if !(z.Op != OpConst64 && x.Op != OpConst64) { 19970 break 19971 } 19972 v.reset(OpOr64) 19973 v.AddArg(i) 19974 v0 := b.NewValue0(v.Pos, OpOr64, t) 19975 v0.AddArg(z) 19976 v0.AddArg(x) 19977 v.AddArg(v0) 19978 return true 19979 } 19980 // match: (Or64 (Or64 z i:(Const64 <t>)) x) 19981 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 19982 // result: (Or64 i (Or64 <t> z x)) 19983 for { 19984 _ = v.Args[1] 19985 v_0 := v.Args[0] 19986 if v_0.Op != OpOr64 { 19987 break 19988 } 19989 _ = v_0.Args[1] 19990 z := v_0.Args[0] 19991 i := v_0.Args[1] 19992 if i.Op != OpConst64 { 19993 break 19994 } 19995 t := i.Type 19996 x := v.Args[1] 19997 if !(z.Op != OpConst64 && x.Op != OpConst64) { 19998 break 19999 } 20000 v.reset(OpOr64) 20001 v.AddArg(i) 20002 v0 := b.NewValue0(v.Pos, OpOr64, t) 20003 v0.AddArg(z) 20004 v0.AddArg(x) 20005 v.AddArg(v0) 20006 return true 20007 } 20008 // match: (Or64 x (Or64 i:(Const64 <t>) z)) 20009 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 20010 // result: (Or64 i (Or64 <t> z x)) 20011 for { 20012 _ = v.Args[1] 20013 x := v.Args[0] 20014 v_1 := v.Args[1] 20015 if v_1.Op != OpOr64 { 20016 break 20017 } 20018 _ = v_1.Args[1] 20019 i := v_1.Args[0] 20020 if i.Op != OpConst64 { 20021 break 20022 } 20023 t := i.Type 20024 z := v_1.Args[1] 20025 if !(z.Op != OpConst64 && x.Op != OpConst64) { 20026 break 20027 } 20028 v.reset(OpOr64) 20029 v.AddArg(i) 20030 v0 := b.NewValue0(v.Pos, OpOr64, t) 20031 v0.AddArg(z) 20032 v0.AddArg(x) 20033 v.AddArg(v0) 20034 return true 20035 } 20036 // match: (Or64 x (Or64 z i:(Const64 <t>))) 20037 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 20038 // result: (Or64 i (Or64 <t> z x)) 20039 for { 20040 _ = v.Args[1] 20041 x := v.Args[0] 20042 v_1 := v.Args[1] 20043 if v_1.Op != OpOr64 { 20044 break 20045 } 20046 _ = v_1.Args[1] 20047 z := v_1.Args[0] 20048 i := v_1.Args[1] 20049 if i.Op != OpConst64 { 20050 break 20051 } 20052 t := i.Type 20053 if !(z.Op != OpConst64 && x.Op != OpConst64) { 20054 break 20055 } 20056 v.reset(OpOr64) 20057 v.AddArg(i) 20058 v0 := b.NewValue0(v.Pos, OpOr64, t) 20059 v0.AddArg(z) 20060 v0.AddArg(x) 20061 v.AddArg(v0) 20062 return true 20063 } 20064 // match: (Or64 (Const64 <t> [c]) (Or64 (Const64 <t> [d]) x)) 20065 // cond: 20066 // result: (Or64 (Const64 <t> [c|d]) x) 20067 for { 20068 _ = v.Args[1] 20069 v_0 := v.Args[0] 20070 if v_0.Op != OpConst64 { 20071 break 20072 } 20073 t := v_0.Type 20074 c := v_0.AuxInt 20075 v_1 := v.Args[1] 20076 if v_1.Op != OpOr64 { 20077 break 20078 } 20079 _ = v_1.Args[1] 20080 v_1_0 := v_1.Args[0] 20081 if v_1_0.Op != OpConst64 { 20082 break 20083 } 20084 if v_1_0.Type != t { 20085 break 20086 } 20087 d := v_1_0.AuxInt 20088 x := v_1.Args[1] 20089 v.reset(OpOr64) 20090 v0 := b.NewValue0(v.Pos, OpConst64, t) 20091 v0.AuxInt = c | d 20092 v.AddArg(v0) 20093 v.AddArg(x) 20094 return true 20095 } 20096 return false 20097 } 20098 func rewriteValuegeneric_OpOr64_20(v *Value) bool { 20099 b := v.Block 20100 _ = b 20101 // match: (Or64 (Const64 <t> [c]) (Or64 x (Const64 <t> [d]))) 20102 // cond: 20103 // result: (Or64 (Const64 <t> [c|d]) x) 20104 for { 20105 _ = v.Args[1] 20106 v_0 := v.Args[0] 20107 if v_0.Op != OpConst64 { 20108 break 20109 } 20110 t := v_0.Type 20111 c := v_0.AuxInt 20112 v_1 := v.Args[1] 20113 if v_1.Op != OpOr64 { 20114 break 20115 } 20116 _ = v_1.Args[1] 20117 x := v_1.Args[0] 20118 v_1_1 := v_1.Args[1] 20119 if v_1_1.Op != OpConst64 { 20120 break 20121 } 20122 if v_1_1.Type != t { 20123 break 20124 } 20125 d := v_1_1.AuxInt 20126 v.reset(OpOr64) 20127 v0 := b.NewValue0(v.Pos, OpConst64, t) 20128 v0.AuxInt = c | d 20129 v.AddArg(v0) 20130 v.AddArg(x) 20131 return true 20132 } 20133 // match: (Or64 (Or64 (Const64 <t> [d]) x) (Const64 <t> [c])) 20134 // cond: 20135 // result: (Or64 (Const64 <t> [c|d]) x) 20136 for { 20137 _ = v.Args[1] 20138 v_0 := v.Args[0] 20139 if v_0.Op != OpOr64 { 20140 break 20141 } 20142 _ = v_0.Args[1] 20143 v_0_0 := v_0.Args[0] 20144 if v_0_0.Op != OpConst64 { 20145 break 20146 } 20147 t := v_0_0.Type 20148 d := v_0_0.AuxInt 20149 x := v_0.Args[1] 20150 v_1 := v.Args[1] 20151 if v_1.Op != OpConst64 { 20152 break 20153 } 20154 if v_1.Type != t { 20155 break 20156 } 20157 c := v_1.AuxInt 20158 v.reset(OpOr64) 20159 v0 := b.NewValue0(v.Pos, OpConst64, t) 20160 v0.AuxInt = c | d 20161 v.AddArg(v0) 20162 v.AddArg(x) 20163 return true 20164 } 20165 // match: (Or64 (Or64 x (Const64 <t> [d])) (Const64 <t> [c])) 20166 // cond: 20167 // result: (Or64 (Const64 <t> [c|d]) x) 20168 for { 20169 _ = v.Args[1] 20170 v_0 := v.Args[0] 20171 if v_0.Op != OpOr64 { 20172 break 20173 } 20174 _ = v_0.Args[1] 20175 x := v_0.Args[0] 20176 v_0_1 := v_0.Args[1] 20177 if v_0_1.Op != OpConst64 { 20178 break 20179 } 20180 t := v_0_1.Type 20181 d := v_0_1.AuxInt 20182 v_1 := v.Args[1] 20183 if v_1.Op != OpConst64 { 20184 break 20185 } 20186 if v_1.Type != t { 20187 break 20188 } 20189 c := v_1.AuxInt 20190 v.reset(OpOr64) 20191 v0 := b.NewValue0(v.Pos, OpConst64, t) 20192 v0.AuxInt = c | d 20193 v.AddArg(v0) 20194 v.AddArg(x) 20195 return true 20196 } 20197 return false 20198 } 20199 func rewriteValuegeneric_OpOr8_0(v *Value) bool { 20200 // match: (Or8 (Const8 [c]) (Const8 [d])) 20201 // cond: 20202 // result: (Const8 [int64(int8(c|d))]) 20203 for { 20204 _ = v.Args[1] 20205 v_0 := v.Args[0] 20206 if v_0.Op != OpConst8 { 20207 break 20208 } 20209 c := v_0.AuxInt 20210 v_1 := v.Args[1] 20211 if v_1.Op != OpConst8 { 20212 break 20213 } 20214 d := v_1.AuxInt 20215 v.reset(OpConst8) 20216 v.AuxInt = int64(int8(c | d)) 20217 return true 20218 } 20219 // match: (Or8 (Const8 [d]) (Const8 [c])) 20220 // cond: 20221 // result: (Const8 [int64(int8(c|d))]) 20222 for { 20223 _ = v.Args[1] 20224 v_0 := v.Args[0] 20225 if v_0.Op != OpConst8 { 20226 break 20227 } 20228 d := v_0.AuxInt 20229 v_1 := v.Args[1] 20230 if v_1.Op != OpConst8 { 20231 break 20232 } 20233 c := v_1.AuxInt 20234 v.reset(OpConst8) 20235 v.AuxInt = int64(int8(c | d)) 20236 return true 20237 } 20238 // match: (Or8 x x) 20239 // cond: 20240 // result: x 20241 for { 20242 _ = v.Args[1] 20243 x := v.Args[0] 20244 if x != v.Args[1] { 20245 break 20246 } 20247 v.reset(OpCopy) 20248 v.Type = x.Type 20249 v.AddArg(x) 20250 return true 20251 } 20252 // match: (Or8 (Const8 [0]) x) 20253 // cond: 20254 // result: x 20255 for { 20256 _ = v.Args[1] 20257 v_0 := v.Args[0] 20258 if v_0.Op != OpConst8 { 20259 break 20260 } 20261 if v_0.AuxInt != 0 { 20262 break 20263 } 20264 x := v.Args[1] 20265 v.reset(OpCopy) 20266 v.Type = x.Type 20267 v.AddArg(x) 20268 return true 20269 } 20270 // match: (Or8 x (Const8 [0])) 20271 // cond: 20272 // result: x 20273 for { 20274 _ = v.Args[1] 20275 x := v.Args[0] 20276 v_1 := v.Args[1] 20277 if v_1.Op != OpConst8 { 20278 break 20279 } 20280 if v_1.AuxInt != 0 { 20281 break 20282 } 20283 v.reset(OpCopy) 20284 v.Type = x.Type 20285 v.AddArg(x) 20286 return true 20287 } 20288 // match: (Or8 (Const8 [-1]) _) 20289 // cond: 20290 // result: (Const8 [-1]) 20291 for { 20292 _ = v.Args[1] 20293 v_0 := v.Args[0] 20294 if v_0.Op != OpConst8 { 20295 break 20296 } 20297 if v_0.AuxInt != -1 { 20298 break 20299 } 20300 v.reset(OpConst8) 20301 v.AuxInt = -1 20302 return true 20303 } 20304 // match: (Or8 _ (Const8 [-1])) 20305 // cond: 20306 // result: (Const8 [-1]) 20307 for { 20308 _ = v.Args[1] 20309 v_1 := v.Args[1] 20310 if v_1.Op != OpConst8 { 20311 break 20312 } 20313 if v_1.AuxInt != -1 { 20314 break 20315 } 20316 v.reset(OpConst8) 20317 v.AuxInt = -1 20318 return true 20319 } 20320 // match: (Or8 x (Or8 x y)) 20321 // cond: 20322 // result: (Or8 x y) 20323 for { 20324 _ = v.Args[1] 20325 x := v.Args[0] 20326 v_1 := v.Args[1] 20327 if v_1.Op != OpOr8 { 20328 break 20329 } 20330 _ = v_1.Args[1] 20331 if x != v_1.Args[0] { 20332 break 20333 } 20334 y := v_1.Args[1] 20335 v.reset(OpOr8) 20336 v.AddArg(x) 20337 v.AddArg(y) 20338 return true 20339 } 20340 // match: (Or8 x (Or8 y x)) 20341 // cond: 20342 // result: (Or8 x y) 20343 for { 20344 _ = v.Args[1] 20345 x := v.Args[0] 20346 v_1 := v.Args[1] 20347 if v_1.Op != OpOr8 { 20348 break 20349 } 20350 _ = v_1.Args[1] 20351 y := v_1.Args[0] 20352 if x != v_1.Args[1] { 20353 break 20354 } 20355 v.reset(OpOr8) 20356 v.AddArg(x) 20357 v.AddArg(y) 20358 return true 20359 } 20360 // match: (Or8 (Or8 x y) x) 20361 // cond: 20362 // result: (Or8 x y) 20363 for { 20364 _ = v.Args[1] 20365 v_0 := v.Args[0] 20366 if v_0.Op != OpOr8 { 20367 break 20368 } 20369 _ = v_0.Args[1] 20370 x := v_0.Args[0] 20371 y := v_0.Args[1] 20372 if x != v.Args[1] { 20373 break 20374 } 20375 v.reset(OpOr8) 20376 v.AddArg(x) 20377 v.AddArg(y) 20378 return true 20379 } 20380 return false 20381 } 20382 func rewriteValuegeneric_OpOr8_10(v *Value) bool { 20383 b := v.Block 20384 _ = b 20385 // match: (Or8 (Or8 y x) x) 20386 // cond: 20387 // result: (Or8 x y) 20388 for { 20389 _ = v.Args[1] 20390 v_0 := v.Args[0] 20391 if v_0.Op != OpOr8 { 20392 break 20393 } 20394 _ = v_0.Args[1] 20395 y := v_0.Args[0] 20396 x := v_0.Args[1] 20397 if x != v.Args[1] { 20398 break 20399 } 20400 v.reset(OpOr8) 20401 v.AddArg(x) 20402 v.AddArg(y) 20403 return true 20404 } 20405 // match: (Or8 (And8 x (Const8 [c2])) (Const8 <t> [c1])) 20406 // cond: ^(c1 | c2) == 0 20407 // result: (Or8 (Const8 <t> [c1]) x) 20408 for { 20409 _ = v.Args[1] 20410 v_0 := v.Args[0] 20411 if v_0.Op != OpAnd8 { 20412 break 20413 } 20414 _ = v_0.Args[1] 20415 x := v_0.Args[0] 20416 v_0_1 := v_0.Args[1] 20417 if v_0_1.Op != OpConst8 { 20418 break 20419 } 20420 c2 := v_0_1.AuxInt 20421 v_1 := v.Args[1] 20422 if v_1.Op != OpConst8 { 20423 break 20424 } 20425 t := v_1.Type 20426 c1 := v_1.AuxInt 20427 if !(^(c1 | c2) == 0) { 20428 break 20429 } 20430 v.reset(OpOr8) 20431 v0 := b.NewValue0(v.Pos, OpConst8, t) 20432 v0.AuxInt = c1 20433 v.AddArg(v0) 20434 v.AddArg(x) 20435 return true 20436 } 20437 // match: (Or8 (And8 (Const8 [c2]) x) (Const8 <t> [c1])) 20438 // cond: ^(c1 | c2) == 0 20439 // result: (Or8 (Const8 <t> [c1]) x) 20440 for { 20441 _ = v.Args[1] 20442 v_0 := v.Args[0] 20443 if v_0.Op != OpAnd8 { 20444 break 20445 } 20446 _ = v_0.Args[1] 20447 v_0_0 := v_0.Args[0] 20448 if v_0_0.Op != OpConst8 { 20449 break 20450 } 20451 c2 := v_0_0.AuxInt 20452 x := v_0.Args[1] 20453 v_1 := v.Args[1] 20454 if v_1.Op != OpConst8 { 20455 break 20456 } 20457 t := v_1.Type 20458 c1 := v_1.AuxInt 20459 if !(^(c1 | c2) == 0) { 20460 break 20461 } 20462 v.reset(OpOr8) 20463 v0 := b.NewValue0(v.Pos, OpConst8, t) 20464 v0.AuxInt = c1 20465 v.AddArg(v0) 20466 v.AddArg(x) 20467 return true 20468 } 20469 // match: (Or8 (Const8 <t> [c1]) (And8 x (Const8 [c2]))) 20470 // cond: ^(c1 | c2) == 0 20471 // result: (Or8 (Const8 <t> [c1]) x) 20472 for { 20473 _ = v.Args[1] 20474 v_0 := v.Args[0] 20475 if v_0.Op != OpConst8 { 20476 break 20477 } 20478 t := v_0.Type 20479 c1 := v_0.AuxInt 20480 v_1 := v.Args[1] 20481 if v_1.Op != OpAnd8 { 20482 break 20483 } 20484 _ = v_1.Args[1] 20485 x := v_1.Args[0] 20486 v_1_1 := v_1.Args[1] 20487 if v_1_1.Op != OpConst8 { 20488 break 20489 } 20490 c2 := v_1_1.AuxInt 20491 if !(^(c1 | c2) == 0) { 20492 break 20493 } 20494 v.reset(OpOr8) 20495 v0 := b.NewValue0(v.Pos, OpConst8, t) 20496 v0.AuxInt = c1 20497 v.AddArg(v0) 20498 v.AddArg(x) 20499 return true 20500 } 20501 // match: (Or8 (Const8 <t> [c1]) (And8 (Const8 [c2]) x)) 20502 // cond: ^(c1 | c2) == 0 20503 // result: (Or8 (Const8 <t> [c1]) x) 20504 for { 20505 _ = v.Args[1] 20506 v_0 := v.Args[0] 20507 if v_0.Op != OpConst8 { 20508 break 20509 } 20510 t := v_0.Type 20511 c1 := v_0.AuxInt 20512 v_1 := v.Args[1] 20513 if v_1.Op != OpAnd8 { 20514 break 20515 } 20516 _ = v_1.Args[1] 20517 v_1_0 := v_1.Args[0] 20518 if v_1_0.Op != OpConst8 { 20519 break 20520 } 20521 c2 := v_1_0.AuxInt 20522 x := v_1.Args[1] 20523 if !(^(c1 | c2) == 0) { 20524 break 20525 } 20526 v.reset(OpOr8) 20527 v0 := b.NewValue0(v.Pos, OpConst8, t) 20528 v0.AuxInt = c1 20529 v.AddArg(v0) 20530 v.AddArg(x) 20531 return true 20532 } 20533 // match: (Or8 (Or8 i:(Const8 <t>) z) x) 20534 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 20535 // result: (Or8 i (Or8 <t> z x)) 20536 for { 20537 _ = v.Args[1] 20538 v_0 := v.Args[0] 20539 if v_0.Op != OpOr8 { 20540 break 20541 } 20542 _ = v_0.Args[1] 20543 i := v_0.Args[0] 20544 if i.Op != OpConst8 { 20545 break 20546 } 20547 t := i.Type 20548 z := v_0.Args[1] 20549 x := v.Args[1] 20550 if !(z.Op != OpConst8 && x.Op != OpConst8) { 20551 break 20552 } 20553 v.reset(OpOr8) 20554 v.AddArg(i) 20555 v0 := b.NewValue0(v.Pos, OpOr8, t) 20556 v0.AddArg(z) 20557 v0.AddArg(x) 20558 v.AddArg(v0) 20559 return true 20560 } 20561 // match: (Or8 (Or8 z i:(Const8 <t>)) x) 20562 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 20563 // result: (Or8 i (Or8 <t> z x)) 20564 for { 20565 _ = v.Args[1] 20566 v_0 := v.Args[0] 20567 if v_0.Op != OpOr8 { 20568 break 20569 } 20570 _ = v_0.Args[1] 20571 z := v_0.Args[0] 20572 i := v_0.Args[1] 20573 if i.Op != OpConst8 { 20574 break 20575 } 20576 t := i.Type 20577 x := v.Args[1] 20578 if !(z.Op != OpConst8 && x.Op != OpConst8) { 20579 break 20580 } 20581 v.reset(OpOr8) 20582 v.AddArg(i) 20583 v0 := b.NewValue0(v.Pos, OpOr8, t) 20584 v0.AddArg(z) 20585 v0.AddArg(x) 20586 v.AddArg(v0) 20587 return true 20588 } 20589 // match: (Or8 x (Or8 i:(Const8 <t>) z)) 20590 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 20591 // result: (Or8 i (Or8 <t> z x)) 20592 for { 20593 _ = v.Args[1] 20594 x := v.Args[0] 20595 v_1 := v.Args[1] 20596 if v_1.Op != OpOr8 { 20597 break 20598 } 20599 _ = v_1.Args[1] 20600 i := v_1.Args[0] 20601 if i.Op != OpConst8 { 20602 break 20603 } 20604 t := i.Type 20605 z := v_1.Args[1] 20606 if !(z.Op != OpConst8 && x.Op != OpConst8) { 20607 break 20608 } 20609 v.reset(OpOr8) 20610 v.AddArg(i) 20611 v0 := b.NewValue0(v.Pos, OpOr8, t) 20612 v0.AddArg(z) 20613 v0.AddArg(x) 20614 v.AddArg(v0) 20615 return true 20616 } 20617 // match: (Or8 x (Or8 z i:(Const8 <t>))) 20618 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 20619 // result: (Or8 i (Or8 <t> z x)) 20620 for { 20621 _ = v.Args[1] 20622 x := v.Args[0] 20623 v_1 := v.Args[1] 20624 if v_1.Op != OpOr8 { 20625 break 20626 } 20627 _ = v_1.Args[1] 20628 z := v_1.Args[0] 20629 i := v_1.Args[1] 20630 if i.Op != OpConst8 { 20631 break 20632 } 20633 t := i.Type 20634 if !(z.Op != OpConst8 && x.Op != OpConst8) { 20635 break 20636 } 20637 v.reset(OpOr8) 20638 v.AddArg(i) 20639 v0 := b.NewValue0(v.Pos, OpOr8, t) 20640 v0.AddArg(z) 20641 v0.AddArg(x) 20642 v.AddArg(v0) 20643 return true 20644 } 20645 // match: (Or8 (Const8 <t> [c]) (Or8 (Const8 <t> [d]) x)) 20646 // cond: 20647 // result: (Or8 (Const8 <t> [int64(int8(c|d))]) x) 20648 for { 20649 _ = v.Args[1] 20650 v_0 := v.Args[0] 20651 if v_0.Op != OpConst8 { 20652 break 20653 } 20654 t := v_0.Type 20655 c := v_0.AuxInt 20656 v_1 := v.Args[1] 20657 if v_1.Op != OpOr8 { 20658 break 20659 } 20660 _ = v_1.Args[1] 20661 v_1_0 := v_1.Args[0] 20662 if v_1_0.Op != OpConst8 { 20663 break 20664 } 20665 if v_1_0.Type != t { 20666 break 20667 } 20668 d := v_1_0.AuxInt 20669 x := v_1.Args[1] 20670 v.reset(OpOr8) 20671 v0 := b.NewValue0(v.Pos, OpConst8, t) 20672 v0.AuxInt = int64(int8(c | d)) 20673 v.AddArg(v0) 20674 v.AddArg(x) 20675 return true 20676 } 20677 return false 20678 } 20679 func rewriteValuegeneric_OpOr8_20(v *Value) bool { 20680 b := v.Block 20681 _ = b 20682 // match: (Or8 (Const8 <t> [c]) (Or8 x (Const8 <t> [d]))) 20683 // cond: 20684 // result: (Or8 (Const8 <t> [int64(int8(c|d))]) x) 20685 for { 20686 _ = v.Args[1] 20687 v_0 := v.Args[0] 20688 if v_0.Op != OpConst8 { 20689 break 20690 } 20691 t := v_0.Type 20692 c := v_0.AuxInt 20693 v_1 := v.Args[1] 20694 if v_1.Op != OpOr8 { 20695 break 20696 } 20697 _ = v_1.Args[1] 20698 x := v_1.Args[0] 20699 v_1_1 := v_1.Args[1] 20700 if v_1_1.Op != OpConst8 { 20701 break 20702 } 20703 if v_1_1.Type != t { 20704 break 20705 } 20706 d := v_1_1.AuxInt 20707 v.reset(OpOr8) 20708 v0 := b.NewValue0(v.Pos, OpConst8, t) 20709 v0.AuxInt = int64(int8(c | d)) 20710 v.AddArg(v0) 20711 v.AddArg(x) 20712 return true 20713 } 20714 // match: (Or8 (Or8 (Const8 <t> [d]) x) (Const8 <t> [c])) 20715 // cond: 20716 // result: (Or8 (Const8 <t> [int64(int8(c|d))]) x) 20717 for { 20718 _ = v.Args[1] 20719 v_0 := v.Args[0] 20720 if v_0.Op != OpOr8 { 20721 break 20722 } 20723 _ = v_0.Args[1] 20724 v_0_0 := v_0.Args[0] 20725 if v_0_0.Op != OpConst8 { 20726 break 20727 } 20728 t := v_0_0.Type 20729 d := v_0_0.AuxInt 20730 x := v_0.Args[1] 20731 v_1 := v.Args[1] 20732 if v_1.Op != OpConst8 { 20733 break 20734 } 20735 if v_1.Type != t { 20736 break 20737 } 20738 c := v_1.AuxInt 20739 v.reset(OpOr8) 20740 v0 := b.NewValue0(v.Pos, OpConst8, t) 20741 v0.AuxInt = int64(int8(c | d)) 20742 v.AddArg(v0) 20743 v.AddArg(x) 20744 return true 20745 } 20746 // match: (Or8 (Or8 x (Const8 <t> [d])) (Const8 <t> [c])) 20747 // cond: 20748 // result: (Or8 (Const8 <t> [int64(int8(c|d))]) x) 20749 for { 20750 _ = v.Args[1] 20751 v_0 := v.Args[0] 20752 if v_0.Op != OpOr8 { 20753 break 20754 } 20755 _ = v_0.Args[1] 20756 x := v_0.Args[0] 20757 v_0_1 := v_0.Args[1] 20758 if v_0_1.Op != OpConst8 { 20759 break 20760 } 20761 t := v_0_1.Type 20762 d := v_0_1.AuxInt 20763 v_1 := v.Args[1] 20764 if v_1.Op != OpConst8 { 20765 break 20766 } 20767 if v_1.Type != t { 20768 break 20769 } 20770 c := v_1.AuxInt 20771 v.reset(OpOr8) 20772 v0 := b.NewValue0(v.Pos, OpConst8, t) 20773 v0.AuxInt = int64(int8(c | d)) 20774 v.AddArg(v0) 20775 v.AddArg(x) 20776 return true 20777 } 20778 return false 20779 } 20780 func rewriteValuegeneric_OpPhi_0(v *Value) bool { 20781 // match: (Phi (Const8 [c]) (Const8 [c])) 20782 // cond: 20783 // result: (Const8 [c]) 20784 for { 20785 _ = v.Args[1] 20786 v_0 := v.Args[0] 20787 if v_0.Op != OpConst8 { 20788 break 20789 } 20790 c := v_0.AuxInt 20791 v_1 := v.Args[1] 20792 if v_1.Op != OpConst8 { 20793 break 20794 } 20795 if v_1.AuxInt != c { 20796 break 20797 } 20798 if len(v.Args) != 2 { 20799 break 20800 } 20801 v.reset(OpConst8) 20802 v.AuxInt = c 20803 return true 20804 } 20805 // match: (Phi (Const16 [c]) (Const16 [c])) 20806 // cond: 20807 // result: (Const16 [c]) 20808 for { 20809 _ = v.Args[1] 20810 v_0 := v.Args[0] 20811 if v_0.Op != OpConst16 { 20812 break 20813 } 20814 c := v_0.AuxInt 20815 v_1 := v.Args[1] 20816 if v_1.Op != OpConst16 { 20817 break 20818 } 20819 if v_1.AuxInt != c { 20820 break 20821 } 20822 if len(v.Args) != 2 { 20823 break 20824 } 20825 v.reset(OpConst16) 20826 v.AuxInt = c 20827 return true 20828 } 20829 // match: (Phi (Const32 [c]) (Const32 [c])) 20830 // cond: 20831 // result: (Const32 [c]) 20832 for { 20833 _ = v.Args[1] 20834 v_0 := v.Args[0] 20835 if v_0.Op != OpConst32 { 20836 break 20837 } 20838 c := v_0.AuxInt 20839 v_1 := v.Args[1] 20840 if v_1.Op != OpConst32 { 20841 break 20842 } 20843 if v_1.AuxInt != c { 20844 break 20845 } 20846 if len(v.Args) != 2 { 20847 break 20848 } 20849 v.reset(OpConst32) 20850 v.AuxInt = c 20851 return true 20852 } 20853 // match: (Phi (Const64 [c]) (Const64 [c])) 20854 // cond: 20855 // result: (Const64 [c]) 20856 for { 20857 _ = v.Args[1] 20858 v_0 := v.Args[0] 20859 if v_0.Op != OpConst64 { 20860 break 20861 } 20862 c := v_0.AuxInt 20863 v_1 := v.Args[1] 20864 if v_1.Op != OpConst64 { 20865 break 20866 } 20867 if v_1.AuxInt != c { 20868 break 20869 } 20870 if len(v.Args) != 2 { 20871 break 20872 } 20873 v.reset(OpConst64) 20874 v.AuxInt = c 20875 return true 20876 } 20877 return false 20878 } 20879 func rewriteValuegeneric_OpPtrIndex_0(v *Value) bool { 20880 b := v.Block 20881 _ = b 20882 config := b.Func.Config 20883 _ = config 20884 typ := &b.Func.Config.Types 20885 _ = typ 20886 // match: (PtrIndex <t> ptr idx) 20887 // cond: config.PtrSize == 4 20888 // result: (AddPtr ptr (Mul32 <typ.Int> idx (Const32 <typ.Int> [t.ElemType().Size()]))) 20889 for { 20890 t := v.Type 20891 _ = v.Args[1] 20892 ptr := v.Args[0] 20893 idx := v.Args[1] 20894 if !(config.PtrSize == 4) { 20895 break 20896 } 20897 v.reset(OpAddPtr) 20898 v.AddArg(ptr) 20899 v0 := b.NewValue0(v.Pos, OpMul32, typ.Int) 20900 v0.AddArg(idx) 20901 v1 := b.NewValue0(v.Pos, OpConst32, typ.Int) 20902 v1.AuxInt = t.ElemType().Size() 20903 v0.AddArg(v1) 20904 v.AddArg(v0) 20905 return true 20906 } 20907 // match: (PtrIndex <t> ptr idx) 20908 // cond: config.PtrSize == 8 20909 // result: (AddPtr ptr (Mul64 <typ.Int> idx (Const64 <typ.Int> [t.ElemType().Size()]))) 20910 for { 20911 t := v.Type 20912 _ = v.Args[1] 20913 ptr := v.Args[0] 20914 idx := v.Args[1] 20915 if !(config.PtrSize == 8) { 20916 break 20917 } 20918 v.reset(OpAddPtr) 20919 v.AddArg(ptr) 20920 v0 := b.NewValue0(v.Pos, OpMul64, typ.Int) 20921 v0.AddArg(idx) 20922 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int) 20923 v1.AuxInt = t.ElemType().Size() 20924 v0.AddArg(v1) 20925 v.AddArg(v0) 20926 return true 20927 } 20928 return false 20929 } 20930 func rewriteValuegeneric_OpRound32F_0(v *Value) bool { 20931 // match: (Round32F x:(Const32F)) 20932 // cond: 20933 // result: x 20934 for { 20935 x := v.Args[0] 20936 if x.Op != OpConst32F { 20937 break 20938 } 20939 v.reset(OpCopy) 20940 v.Type = x.Type 20941 v.AddArg(x) 20942 return true 20943 } 20944 return false 20945 } 20946 func rewriteValuegeneric_OpRound64F_0(v *Value) bool { 20947 // match: (Round64F x:(Const64F)) 20948 // cond: 20949 // result: x 20950 for { 20951 x := v.Args[0] 20952 if x.Op != OpConst64F { 20953 break 20954 } 20955 v.reset(OpCopy) 20956 v.Type = x.Type 20957 v.AddArg(x) 20958 return true 20959 } 20960 return false 20961 } 20962 func rewriteValuegeneric_OpRsh16Ux16_0(v *Value) bool { 20963 b := v.Block 20964 _ = b 20965 // match: (Rsh16Ux16 <t> x (Const16 [c])) 20966 // cond: 20967 // result: (Rsh16Ux64 x (Const64 <t> [int64(uint16(c))])) 20968 for { 20969 t := v.Type 20970 _ = v.Args[1] 20971 x := v.Args[0] 20972 v_1 := v.Args[1] 20973 if v_1.Op != OpConst16 { 20974 break 20975 } 20976 c := v_1.AuxInt 20977 v.reset(OpRsh16Ux64) 20978 v.AddArg(x) 20979 v0 := b.NewValue0(v.Pos, OpConst64, t) 20980 v0.AuxInt = int64(uint16(c)) 20981 v.AddArg(v0) 20982 return true 20983 } 20984 // match: (Rsh16Ux16 (Const16 [0]) _) 20985 // cond: 20986 // result: (Const16 [0]) 20987 for { 20988 _ = v.Args[1] 20989 v_0 := v.Args[0] 20990 if v_0.Op != OpConst16 { 20991 break 20992 } 20993 if v_0.AuxInt != 0 { 20994 break 20995 } 20996 v.reset(OpConst16) 20997 v.AuxInt = 0 20998 return true 20999 } 21000 return false 21001 } 21002 func rewriteValuegeneric_OpRsh16Ux32_0(v *Value) bool { 21003 b := v.Block 21004 _ = b 21005 // match: (Rsh16Ux32 <t> x (Const32 [c])) 21006 // cond: 21007 // result: (Rsh16Ux64 x (Const64 <t> [int64(uint32(c))])) 21008 for { 21009 t := v.Type 21010 _ = v.Args[1] 21011 x := v.Args[0] 21012 v_1 := v.Args[1] 21013 if v_1.Op != OpConst32 { 21014 break 21015 } 21016 c := v_1.AuxInt 21017 v.reset(OpRsh16Ux64) 21018 v.AddArg(x) 21019 v0 := b.NewValue0(v.Pos, OpConst64, t) 21020 v0.AuxInt = int64(uint32(c)) 21021 v.AddArg(v0) 21022 return true 21023 } 21024 // match: (Rsh16Ux32 (Const16 [0]) _) 21025 // cond: 21026 // result: (Const16 [0]) 21027 for { 21028 _ = v.Args[1] 21029 v_0 := v.Args[0] 21030 if v_0.Op != OpConst16 { 21031 break 21032 } 21033 if v_0.AuxInt != 0 { 21034 break 21035 } 21036 v.reset(OpConst16) 21037 v.AuxInt = 0 21038 return true 21039 } 21040 return false 21041 } 21042 func rewriteValuegeneric_OpRsh16Ux64_0(v *Value) bool { 21043 b := v.Block 21044 _ = b 21045 typ := &b.Func.Config.Types 21046 _ = typ 21047 // match: (Rsh16Ux64 (Const16 [c]) (Const64 [d])) 21048 // cond: 21049 // result: (Const16 [int64(int16(uint16(c) >> uint64(d)))]) 21050 for { 21051 _ = v.Args[1] 21052 v_0 := v.Args[0] 21053 if v_0.Op != OpConst16 { 21054 break 21055 } 21056 c := v_0.AuxInt 21057 v_1 := v.Args[1] 21058 if v_1.Op != OpConst64 { 21059 break 21060 } 21061 d := v_1.AuxInt 21062 v.reset(OpConst16) 21063 v.AuxInt = int64(int16(uint16(c) >> uint64(d))) 21064 return true 21065 } 21066 // match: (Rsh16Ux64 x (Const64 [0])) 21067 // cond: 21068 // result: x 21069 for { 21070 _ = v.Args[1] 21071 x := v.Args[0] 21072 v_1 := v.Args[1] 21073 if v_1.Op != OpConst64 { 21074 break 21075 } 21076 if v_1.AuxInt != 0 { 21077 break 21078 } 21079 v.reset(OpCopy) 21080 v.Type = x.Type 21081 v.AddArg(x) 21082 return true 21083 } 21084 // match: (Rsh16Ux64 (Const16 [0]) _) 21085 // cond: 21086 // result: (Const16 [0]) 21087 for { 21088 _ = v.Args[1] 21089 v_0 := v.Args[0] 21090 if v_0.Op != OpConst16 { 21091 break 21092 } 21093 if v_0.AuxInt != 0 { 21094 break 21095 } 21096 v.reset(OpConst16) 21097 v.AuxInt = 0 21098 return true 21099 } 21100 // match: (Rsh16Ux64 _ (Const64 [c])) 21101 // cond: uint64(c) >= 16 21102 // result: (Const16 [0]) 21103 for { 21104 _ = v.Args[1] 21105 v_1 := v.Args[1] 21106 if v_1.Op != OpConst64 { 21107 break 21108 } 21109 c := v_1.AuxInt 21110 if !(uint64(c) >= 16) { 21111 break 21112 } 21113 v.reset(OpConst16) 21114 v.AuxInt = 0 21115 return true 21116 } 21117 // match: (Rsh16Ux64 <t> (Rsh16Ux64 x (Const64 [c])) (Const64 [d])) 21118 // cond: !uaddOvf(c,d) 21119 // result: (Rsh16Ux64 x (Const64 <t> [c+d])) 21120 for { 21121 t := v.Type 21122 _ = v.Args[1] 21123 v_0 := v.Args[0] 21124 if v_0.Op != OpRsh16Ux64 { 21125 break 21126 } 21127 _ = v_0.Args[1] 21128 x := v_0.Args[0] 21129 v_0_1 := v_0.Args[1] 21130 if v_0_1.Op != OpConst64 { 21131 break 21132 } 21133 c := v_0_1.AuxInt 21134 v_1 := v.Args[1] 21135 if v_1.Op != OpConst64 { 21136 break 21137 } 21138 d := v_1.AuxInt 21139 if !(!uaddOvf(c, d)) { 21140 break 21141 } 21142 v.reset(OpRsh16Ux64) 21143 v.AddArg(x) 21144 v0 := b.NewValue0(v.Pos, OpConst64, t) 21145 v0.AuxInt = c + d 21146 v.AddArg(v0) 21147 return true 21148 } 21149 // match: (Rsh16Ux64 (Lsh16x64 (Rsh16Ux64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 21150 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 21151 // result: (Rsh16Ux64 x (Const64 <typ.UInt64> [c1-c2+c3])) 21152 for { 21153 _ = v.Args[1] 21154 v_0 := v.Args[0] 21155 if v_0.Op != OpLsh16x64 { 21156 break 21157 } 21158 _ = v_0.Args[1] 21159 v_0_0 := v_0.Args[0] 21160 if v_0_0.Op != OpRsh16Ux64 { 21161 break 21162 } 21163 _ = v_0_0.Args[1] 21164 x := v_0_0.Args[0] 21165 v_0_0_1 := v_0_0.Args[1] 21166 if v_0_0_1.Op != OpConst64 { 21167 break 21168 } 21169 c1 := v_0_0_1.AuxInt 21170 v_0_1 := v_0.Args[1] 21171 if v_0_1.Op != OpConst64 { 21172 break 21173 } 21174 c2 := v_0_1.AuxInt 21175 v_1 := v.Args[1] 21176 if v_1.Op != OpConst64 { 21177 break 21178 } 21179 c3 := v_1.AuxInt 21180 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 21181 break 21182 } 21183 v.reset(OpRsh16Ux64) 21184 v.AddArg(x) 21185 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 21186 v0.AuxInt = c1 - c2 + c3 21187 v.AddArg(v0) 21188 return true 21189 } 21190 // match: (Rsh16Ux64 (Lsh16x64 x (Const64 [8])) (Const64 [8])) 21191 // cond: 21192 // result: (ZeroExt8to16 (Trunc16to8 <typ.UInt8> x)) 21193 for { 21194 _ = v.Args[1] 21195 v_0 := v.Args[0] 21196 if v_0.Op != OpLsh16x64 { 21197 break 21198 } 21199 _ = v_0.Args[1] 21200 x := v_0.Args[0] 21201 v_0_1 := v_0.Args[1] 21202 if v_0_1.Op != OpConst64 { 21203 break 21204 } 21205 if v_0_1.AuxInt != 8 { 21206 break 21207 } 21208 v_1 := v.Args[1] 21209 if v_1.Op != OpConst64 { 21210 break 21211 } 21212 if v_1.AuxInt != 8 { 21213 break 21214 } 21215 v.reset(OpZeroExt8to16) 21216 v0 := b.NewValue0(v.Pos, OpTrunc16to8, typ.UInt8) 21217 v0.AddArg(x) 21218 v.AddArg(v0) 21219 return true 21220 } 21221 return false 21222 } 21223 func rewriteValuegeneric_OpRsh16Ux8_0(v *Value) bool { 21224 b := v.Block 21225 _ = b 21226 // match: (Rsh16Ux8 <t> x (Const8 [c])) 21227 // cond: 21228 // result: (Rsh16Ux64 x (Const64 <t> [int64(uint8(c))])) 21229 for { 21230 t := v.Type 21231 _ = v.Args[1] 21232 x := v.Args[0] 21233 v_1 := v.Args[1] 21234 if v_1.Op != OpConst8 { 21235 break 21236 } 21237 c := v_1.AuxInt 21238 v.reset(OpRsh16Ux64) 21239 v.AddArg(x) 21240 v0 := b.NewValue0(v.Pos, OpConst64, t) 21241 v0.AuxInt = int64(uint8(c)) 21242 v.AddArg(v0) 21243 return true 21244 } 21245 // match: (Rsh16Ux8 (Const16 [0]) _) 21246 // cond: 21247 // result: (Const16 [0]) 21248 for { 21249 _ = v.Args[1] 21250 v_0 := v.Args[0] 21251 if v_0.Op != OpConst16 { 21252 break 21253 } 21254 if v_0.AuxInt != 0 { 21255 break 21256 } 21257 v.reset(OpConst16) 21258 v.AuxInt = 0 21259 return true 21260 } 21261 return false 21262 } 21263 func rewriteValuegeneric_OpRsh16x16_0(v *Value) bool { 21264 b := v.Block 21265 _ = b 21266 // match: (Rsh16x16 <t> x (Const16 [c])) 21267 // cond: 21268 // result: (Rsh16x64 x (Const64 <t> [int64(uint16(c))])) 21269 for { 21270 t := v.Type 21271 _ = v.Args[1] 21272 x := v.Args[0] 21273 v_1 := v.Args[1] 21274 if v_1.Op != OpConst16 { 21275 break 21276 } 21277 c := v_1.AuxInt 21278 v.reset(OpRsh16x64) 21279 v.AddArg(x) 21280 v0 := b.NewValue0(v.Pos, OpConst64, t) 21281 v0.AuxInt = int64(uint16(c)) 21282 v.AddArg(v0) 21283 return true 21284 } 21285 // match: (Rsh16x16 (Const16 [0]) _) 21286 // cond: 21287 // result: (Const16 [0]) 21288 for { 21289 _ = v.Args[1] 21290 v_0 := v.Args[0] 21291 if v_0.Op != OpConst16 { 21292 break 21293 } 21294 if v_0.AuxInt != 0 { 21295 break 21296 } 21297 v.reset(OpConst16) 21298 v.AuxInt = 0 21299 return true 21300 } 21301 return false 21302 } 21303 func rewriteValuegeneric_OpRsh16x32_0(v *Value) bool { 21304 b := v.Block 21305 _ = b 21306 // match: (Rsh16x32 <t> x (Const32 [c])) 21307 // cond: 21308 // result: (Rsh16x64 x (Const64 <t> [int64(uint32(c))])) 21309 for { 21310 t := v.Type 21311 _ = v.Args[1] 21312 x := v.Args[0] 21313 v_1 := v.Args[1] 21314 if v_1.Op != OpConst32 { 21315 break 21316 } 21317 c := v_1.AuxInt 21318 v.reset(OpRsh16x64) 21319 v.AddArg(x) 21320 v0 := b.NewValue0(v.Pos, OpConst64, t) 21321 v0.AuxInt = int64(uint32(c)) 21322 v.AddArg(v0) 21323 return true 21324 } 21325 // match: (Rsh16x32 (Const16 [0]) _) 21326 // cond: 21327 // result: (Const16 [0]) 21328 for { 21329 _ = v.Args[1] 21330 v_0 := v.Args[0] 21331 if v_0.Op != OpConst16 { 21332 break 21333 } 21334 if v_0.AuxInt != 0 { 21335 break 21336 } 21337 v.reset(OpConst16) 21338 v.AuxInt = 0 21339 return true 21340 } 21341 return false 21342 } 21343 func rewriteValuegeneric_OpRsh16x64_0(v *Value) bool { 21344 b := v.Block 21345 _ = b 21346 typ := &b.Func.Config.Types 21347 _ = typ 21348 // match: (Rsh16x64 (Const16 [c]) (Const64 [d])) 21349 // cond: 21350 // result: (Const16 [int64(int16(c) >> uint64(d))]) 21351 for { 21352 _ = v.Args[1] 21353 v_0 := v.Args[0] 21354 if v_0.Op != OpConst16 { 21355 break 21356 } 21357 c := v_0.AuxInt 21358 v_1 := v.Args[1] 21359 if v_1.Op != OpConst64 { 21360 break 21361 } 21362 d := v_1.AuxInt 21363 v.reset(OpConst16) 21364 v.AuxInt = int64(int16(c) >> uint64(d)) 21365 return true 21366 } 21367 // match: (Rsh16x64 x (Const64 [0])) 21368 // cond: 21369 // result: x 21370 for { 21371 _ = v.Args[1] 21372 x := v.Args[0] 21373 v_1 := v.Args[1] 21374 if v_1.Op != OpConst64 { 21375 break 21376 } 21377 if v_1.AuxInt != 0 { 21378 break 21379 } 21380 v.reset(OpCopy) 21381 v.Type = x.Type 21382 v.AddArg(x) 21383 return true 21384 } 21385 // match: (Rsh16x64 (Const16 [0]) _) 21386 // cond: 21387 // result: (Const16 [0]) 21388 for { 21389 _ = v.Args[1] 21390 v_0 := v.Args[0] 21391 if v_0.Op != OpConst16 { 21392 break 21393 } 21394 if v_0.AuxInt != 0 { 21395 break 21396 } 21397 v.reset(OpConst16) 21398 v.AuxInt = 0 21399 return true 21400 } 21401 // match: (Rsh16x64 <t> (Rsh16x64 x (Const64 [c])) (Const64 [d])) 21402 // cond: !uaddOvf(c,d) 21403 // result: (Rsh16x64 x (Const64 <t> [c+d])) 21404 for { 21405 t := v.Type 21406 _ = v.Args[1] 21407 v_0 := v.Args[0] 21408 if v_0.Op != OpRsh16x64 { 21409 break 21410 } 21411 _ = v_0.Args[1] 21412 x := v_0.Args[0] 21413 v_0_1 := v_0.Args[1] 21414 if v_0_1.Op != OpConst64 { 21415 break 21416 } 21417 c := v_0_1.AuxInt 21418 v_1 := v.Args[1] 21419 if v_1.Op != OpConst64 { 21420 break 21421 } 21422 d := v_1.AuxInt 21423 if !(!uaddOvf(c, d)) { 21424 break 21425 } 21426 v.reset(OpRsh16x64) 21427 v.AddArg(x) 21428 v0 := b.NewValue0(v.Pos, OpConst64, t) 21429 v0.AuxInt = c + d 21430 v.AddArg(v0) 21431 return true 21432 } 21433 // match: (Rsh16x64 (Lsh16x64 x (Const64 [8])) (Const64 [8])) 21434 // cond: 21435 // result: (SignExt8to16 (Trunc16to8 <typ.Int8> x)) 21436 for { 21437 _ = v.Args[1] 21438 v_0 := v.Args[0] 21439 if v_0.Op != OpLsh16x64 { 21440 break 21441 } 21442 _ = v_0.Args[1] 21443 x := v_0.Args[0] 21444 v_0_1 := v_0.Args[1] 21445 if v_0_1.Op != OpConst64 { 21446 break 21447 } 21448 if v_0_1.AuxInt != 8 { 21449 break 21450 } 21451 v_1 := v.Args[1] 21452 if v_1.Op != OpConst64 { 21453 break 21454 } 21455 if v_1.AuxInt != 8 { 21456 break 21457 } 21458 v.reset(OpSignExt8to16) 21459 v0 := b.NewValue0(v.Pos, OpTrunc16to8, typ.Int8) 21460 v0.AddArg(x) 21461 v.AddArg(v0) 21462 return true 21463 } 21464 return false 21465 } 21466 func rewriteValuegeneric_OpRsh16x8_0(v *Value) bool { 21467 b := v.Block 21468 _ = b 21469 // match: (Rsh16x8 <t> x (Const8 [c])) 21470 // cond: 21471 // result: (Rsh16x64 x (Const64 <t> [int64(uint8(c))])) 21472 for { 21473 t := v.Type 21474 _ = v.Args[1] 21475 x := v.Args[0] 21476 v_1 := v.Args[1] 21477 if v_1.Op != OpConst8 { 21478 break 21479 } 21480 c := v_1.AuxInt 21481 v.reset(OpRsh16x64) 21482 v.AddArg(x) 21483 v0 := b.NewValue0(v.Pos, OpConst64, t) 21484 v0.AuxInt = int64(uint8(c)) 21485 v.AddArg(v0) 21486 return true 21487 } 21488 // match: (Rsh16x8 (Const16 [0]) _) 21489 // cond: 21490 // result: (Const16 [0]) 21491 for { 21492 _ = v.Args[1] 21493 v_0 := v.Args[0] 21494 if v_0.Op != OpConst16 { 21495 break 21496 } 21497 if v_0.AuxInt != 0 { 21498 break 21499 } 21500 v.reset(OpConst16) 21501 v.AuxInt = 0 21502 return true 21503 } 21504 return false 21505 } 21506 func rewriteValuegeneric_OpRsh32Ux16_0(v *Value) bool { 21507 b := v.Block 21508 _ = b 21509 // match: (Rsh32Ux16 <t> x (Const16 [c])) 21510 // cond: 21511 // result: (Rsh32Ux64 x (Const64 <t> [int64(uint16(c))])) 21512 for { 21513 t := v.Type 21514 _ = v.Args[1] 21515 x := v.Args[0] 21516 v_1 := v.Args[1] 21517 if v_1.Op != OpConst16 { 21518 break 21519 } 21520 c := v_1.AuxInt 21521 v.reset(OpRsh32Ux64) 21522 v.AddArg(x) 21523 v0 := b.NewValue0(v.Pos, OpConst64, t) 21524 v0.AuxInt = int64(uint16(c)) 21525 v.AddArg(v0) 21526 return true 21527 } 21528 // match: (Rsh32Ux16 (Const32 [0]) _) 21529 // cond: 21530 // result: (Const32 [0]) 21531 for { 21532 _ = v.Args[1] 21533 v_0 := v.Args[0] 21534 if v_0.Op != OpConst32 { 21535 break 21536 } 21537 if v_0.AuxInt != 0 { 21538 break 21539 } 21540 v.reset(OpConst32) 21541 v.AuxInt = 0 21542 return true 21543 } 21544 return false 21545 } 21546 func rewriteValuegeneric_OpRsh32Ux32_0(v *Value) bool { 21547 b := v.Block 21548 _ = b 21549 // match: (Rsh32Ux32 <t> x (Const32 [c])) 21550 // cond: 21551 // result: (Rsh32Ux64 x (Const64 <t> [int64(uint32(c))])) 21552 for { 21553 t := v.Type 21554 _ = v.Args[1] 21555 x := v.Args[0] 21556 v_1 := v.Args[1] 21557 if v_1.Op != OpConst32 { 21558 break 21559 } 21560 c := v_1.AuxInt 21561 v.reset(OpRsh32Ux64) 21562 v.AddArg(x) 21563 v0 := b.NewValue0(v.Pos, OpConst64, t) 21564 v0.AuxInt = int64(uint32(c)) 21565 v.AddArg(v0) 21566 return true 21567 } 21568 // match: (Rsh32Ux32 (Const32 [0]) _) 21569 // cond: 21570 // result: (Const32 [0]) 21571 for { 21572 _ = v.Args[1] 21573 v_0 := v.Args[0] 21574 if v_0.Op != OpConst32 { 21575 break 21576 } 21577 if v_0.AuxInt != 0 { 21578 break 21579 } 21580 v.reset(OpConst32) 21581 v.AuxInt = 0 21582 return true 21583 } 21584 return false 21585 } 21586 func rewriteValuegeneric_OpRsh32Ux64_0(v *Value) bool { 21587 b := v.Block 21588 _ = b 21589 typ := &b.Func.Config.Types 21590 _ = typ 21591 // match: (Rsh32Ux64 (Const32 [c]) (Const64 [d])) 21592 // cond: 21593 // result: (Const32 [int64(int32(uint32(c) >> uint64(d)))]) 21594 for { 21595 _ = v.Args[1] 21596 v_0 := v.Args[0] 21597 if v_0.Op != OpConst32 { 21598 break 21599 } 21600 c := v_0.AuxInt 21601 v_1 := v.Args[1] 21602 if v_1.Op != OpConst64 { 21603 break 21604 } 21605 d := v_1.AuxInt 21606 v.reset(OpConst32) 21607 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 21608 return true 21609 } 21610 // match: (Rsh32Ux64 x (Const64 [0])) 21611 // cond: 21612 // result: x 21613 for { 21614 _ = v.Args[1] 21615 x := v.Args[0] 21616 v_1 := v.Args[1] 21617 if v_1.Op != OpConst64 { 21618 break 21619 } 21620 if v_1.AuxInt != 0 { 21621 break 21622 } 21623 v.reset(OpCopy) 21624 v.Type = x.Type 21625 v.AddArg(x) 21626 return true 21627 } 21628 // match: (Rsh32Ux64 (Const32 [0]) _) 21629 // cond: 21630 // result: (Const32 [0]) 21631 for { 21632 _ = v.Args[1] 21633 v_0 := v.Args[0] 21634 if v_0.Op != OpConst32 { 21635 break 21636 } 21637 if v_0.AuxInt != 0 { 21638 break 21639 } 21640 v.reset(OpConst32) 21641 v.AuxInt = 0 21642 return true 21643 } 21644 // match: (Rsh32Ux64 _ (Const64 [c])) 21645 // cond: uint64(c) >= 32 21646 // result: (Const32 [0]) 21647 for { 21648 _ = v.Args[1] 21649 v_1 := v.Args[1] 21650 if v_1.Op != OpConst64 { 21651 break 21652 } 21653 c := v_1.AuxInt 21654 if !(uint64(c) >= 32) { 21655 break 21656 } 21657 v.reset(OpConst32) 21658 v.AuxInt = 0 21659 return true 21660 } 21661 // match: (Rsh32Ux64 <t> (Rsh32Ux64 x (Const64 [c])) (Const64 [d])) 21662 // cond: !uaddOvf(c,d) 21663 // result: (Rsh32Ux64 x (Const64 <t> [c+d])) 21664 for { 21665 t := v.Type 21666 _ = v.Args[1] 21667 v_0 := v.Args[0] 21668 if v_0.Op != OpRsh32Ux64 { 21669 break 21670 } 21671 _ = v_0.Args[1] 21672 x := v_0.Args[0] 21673 v_0_1 := v_0.Args[1] 21674 if v_0_1.Op != OpConst64 { 21675 break 21676 } 21677 c := v_0_1.AuxInt 21678 v_1 := v.Args[1] 21679 if v_1.Op != OpConst64 { 21680 break 21681 } 21682 d := v_1.AuxInt 21683 if !(!uaddOvf(c, d)) { 21684 break 21685 } 21686 v.reset(OpRsh32Ux64) 21687 v.AddArg(x) 21688 v0 := b.NewValue0(v.Pos, OpConst64, t) 21689 v0.AuxInt = c + d 21690 v.AddArg(v0) 21691 return true 21692 } 21693 // match: (Rsh32Ux64 (Lsh32x64 (Rsh32Ux64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 21694 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 21695 // result: (Rsh32Ux64 x (Const64 <typ.UInt64> [c1-c2+c3])) 21696 for { 21697 _ = v.Args[1] 21698 v_0 := v.Args[0] 21699 if v_0.Op != OpLsh32x64 { 21700 break 21701 } 21702 _ = v_0.Args[1] 21703 v_0_0 := v_0.Args[0] 21704 if v_0_0.Op != OpRsh32Ux64 { 21705 break 21706 } 21707 _ = v_0_0.Args[1] 21708 x := v_0_0.Args[0] 21709 v_0_0_1 := v_0_0.Args[1] 21710 if v_0_0_1.Op != OpConst64 { 21711 break 21712 } 21713 c1 := v_0_0_1.AuxInt 21714 v_0_1 := v_0.Args[1] 21715 if v_0_1.Op != OpConst64 { 21716 break 21717 } 21718 c2 := v_0_1.AuxInt 21719 v_1 := v.Args[1] 21720 if v_1.Op != OpConst64 { 21721 break 21722 } 21723 c3 := v_1.AuxInt 21724 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 21725 break 21726 } 21727 v.reset(OpRsh32Ux64) 21728 v.AddArg(x) 21729 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 21730 v0.AuxInt = c1 - c2 + c3 21731 v.AddArg(v0) 21732 return true 21733 } 21734 // match: (Rsh32Ux64 (Lsh32x64 x (Const64 [24])) (Const64 [24])) 21735 // cond: 21736 // result: (ZeroExt8to32 (Trunc32to8 <typ.UInt8> x)) 21737 for { 21738 _ = v.Args[1] 21739 v_0 := v.Args[0] 21740 if v_0.Op != OpLsh32x64 { 21741 break 21742 } 21743 _ = v_0.Args[1] 21744 x := v_0.Args[0] 21745 v_0_1 := v_0.Args[1] 21746 if v_0_1.Op != OpConst64 { 21747 break 21748 } 21749 if v_0_1.AuxInt != 24 { 21750 break 21751 } 21752 v_1 := v.Args[1] 21753 if v_1.Op != OpConst64 { 21754 break 21755 } 21756 if v_1.AuxInt != 24 { 21757 break 21758 } 21759 v.reset(OpZeroExt8to32) 21760 v0 := b.NewValue0(v.Pos, OpTrunc32to8, typ.UInt8) 21761 v0.AddArg(x) 21762 v.AddArg(v0) 21763 return true 21764 } 21765 // match: (Rsh32Ux64 (Lsh32x64 x (Const64 [16])) (Const64 [16])) 21766 // cond: 21767 // result: (ZeroExt16to32 (Trunc32to16 <typ.UInt16> x)) 21768 for { 21769 _ = v.Args[1] 21770 v_0 := v.Args[0] 21771 if v_0.Op != OpLsh32x64 { 21772 break 21773 } 21774 _ = v_0.Args[1] 21775 x := v_0.Args[0] 21776 v_0_1 := v_0.Args[1] 21777 if v_0_1.Op != OpConst64 { 21778 break 21779 } 21780 if v_0_1.AuxInt != 16 { 21781 break 21782 } 21783 v_1 := v.Args[1] 21784 if v_1.Op != OpConst64 { 21785 break 21786 } 21787 if v_1.AuxInt != 16 { 21788 break 21789 } 21790 v.reset(OpZeroExt16to32) 21791 v0 := b.NewValue0(v.Pos, OpTrunc32to16, typ.UInt16) 21792 v0.AddArg(x) 21793 v.AddArg(v0) 21794 return true 21795 } 21796 return false 21797 } 21798 func rewriteValuegeneric_OpRsh32Ux8_0(v *Value) bool { 21799 b := v.Block 21800 _ = b 21801 // match: (Rsh32Ux8 <t> x (Const8 [c])) 21802 // cond: 21803 // result: (Rsh32Ux64 x (Const64 <t> [int64(uint8(c))])) 21804 for { 21805 t := v.Type 21806 _ = v.Args[1] 21807 x := v.Args[0] 21808 v_1 := v.Args[1] 21809 if v_1.Op != OpConst8 { 21810 break 21811 } 21812 c := v_1.AuxInt 21813 v.reset(OpRsh32Ux64) 21814 v.AddArg(x) 21815 v0 := b.NewValue0(v.Pos, OpConst64, t) 21816 v0.AuxInt = int64(uint8(c)) 21817 v.AddArg(v0) 21818 return true 21819 } 21820 // match: (Rsh32Ux8 (Const32 [0]) _) 21821 // cond: 21822 // result: (Const32 [0]) 21823 for { 21824 _ = v.Args[1] 21825 v_0 := v.Args[0] 21826 if v_0.Op != OpConst32 { 21827 break 21828 } 21829 if v_0.AuxInt != 0 { 21830 break 21831 } 21832 v.reset(OpConst32) 21833 v.AuxInt = 0 21834 return true 21835 } 21836 return false 21837 } 21838 func rewriteValuegeneric_OpRsh32x16_0(v *Value) bool { 21839 b := v.Block 21840 _ = b 21841 // match: (Rsh32x16 <t> x (Const16 [c])) 21842 // cond: 21843 // result: (Rsh32x64 x (Const64 <t> [int64(uint16(c))])) 21844 for { 21845 t := v.Type 21846 _ = v.Args[1] 21847 x := v.Args[0] 21848 v_1 := v.Args[1] 21849 if v_1.Op != OpConst16 { 21850 break 21851 } 21852 c := v_1.AuxInt 21853 v.reset(OpRsh32x64) 21854 v.AddArg(x) 21855 v0 := b.NewValue0(v.Pos, OpConst64, t) 21856 v0.AuxInt = int64(uint16(c)) 21857 v.AddArg(v0) 21858 return true 21859 } 21860 // match: (Rsh32x16 (Const32 [0]) _) 21861 // cond: 21862 // result: (Const32 [0]) 21863 for { 21864 _ = v.Args[1] 21865 v_0 := v.Args[0] 21866 if v_0.Op != OpConst32 { 21867 break 21868 } 21869 if v_0.AuxInt != 0 { 21870 break 21871 } 21872 v.reset(OpConst32) 21873 v.AuxInt = 0 21874 return true 21875 } 21876 return false 21877 } 21878 func rewriteValuegeneric_OpRsh32x32_0(v *Value) bool { 21879 b := v.Block 21880 _ = b 21881 // match: (Rsh32x32 <t> x (Const32 [c])) 21882 // cond: 21883 // result: (Rsh32x64 x (Const64 <t> [int64(uint32(c))])) 21884 for { 21885 t := v.Type 21886 _ = v.Args[1] 21887 x := v.Args[0] 21888 v_1 := v.Args[1] 21889 if v_1.Op != OpConst32 { 21890 break 21891 } 21892 c := v_1.AuxInt 21893 v.reset(OpRsh32x64) 21894 v.AddArg(x) 21895 v0 := b.NewValue0(v.Pos, OpConst64, t) 21896 v0.AuxInt = int64(uint32(c)) 21897 v.AddArg(v0) 21898 return true 21899 } 21900 // match: (Rsh32x32 (Const32 [0]) _) 21901 // cond: 21902 // result: (Const32 [0]) 21903 for { 21904 _ = v.Args[1] 21905 v_0 := v.Args[0] 21906 if v_0.Op != OpConst32 { 21907 break 21908 } 21909 if v_0.AuxInt != 0 { 21910 break 21911 } 21912 v.reset(OpConst32) 21913 v.AuxInt = 0 21914 return true 21915 } 21916 return false 21917 } 21918 func rewriteValuegeneric_OpRsh32x64_0(v *Value) bool { 21919 b := v.Block 21920 _ = b 21921 typ := &b.Func.Config.Types 21922 _ = typ 21923 // match: (Rsh32x64 (Const32 [c]) (Const64 [d])) 21924 // cond: 21925 // result: (Const32 [int64(int32(c) >> uint64(d))]) 21926 for { 21927 _ = v.Args[1] 21928 v_0 := v.Args[0] 21929 if v_0.Op != OpConst32 { 21930 break 21931 } 21932 c := v_0.AuxInt 21933 v_1 := v.Args[1] 21934 if v_1.Op != OpConst64 { 21935 break 21936 } 21937 d := v_1.AuxInt 21938 v.reset(OpConst32) 21939 v.AuxInt = int64(int32(c) >> uint64(d)) 21940 return true 21941 } 21942 // match: (Rsh32x64 x (Const64 [0])) 21943 // cond: 21944 // result: x 21945 for { 21946 _ = v.Args[1] 21947 x := v.Args[0] 21948 v_1 := v.Args[1] 21949 if v_1.Op != OpConst64 { 21950 break 21951 } 21952 if v_1.AuxInt != 0 { 21953 break 21954 } 21955 v.reset(OpCopy) 21956 v.Type = x.Type 21957 v.AddArg(x) 21958 return true 21959 } 21960 // match: (Rsh32x64 (Const32 [0]) _) 21961 // cond: 21962 // result: (Const32 [0]) 21963 for { 21964 _ = v.Args[1] 21965 v_0 := v.Args[0] 21966 if v_0.Op != OpConst32 { 21967 break 21968 } 21969 if v_0.AuxInt != 0 { 21970 break 21971 } 21972 v.reset(OpConst32) 21973 v.AuxInt = 0 21974 return true 21975 } 21976 // match: (Rsh32x64 <t> (Rsh32x64 x (Const64 [c])) (Const64 [d])) 21977 // cond: !uaddOvf(c,d) 21978 // result: (Rsh32x64 x (Const64 <t> [c+d])) 21979 for { 21980 t := v.Type 21981 _ = v.Args[1] 21982 v_0 := v.Args[0] 21983 if v_0.Op != OpRsh32x64 { 21984 break 21985 } 21986 _ = v_0.Args[1] 21987 x := v_0.Args[0] 21988 v_0_1 := v_0.Args[1] 21989 if v_0_1.Op != OpConst64 { 21990 break 21991 } 21992 c := v_0_1.AuxInt 21993 v_1 := v.Args[1] 21994 if v_1.Op != OpConst64 { 21995 break 21996 } 21997 d := v_1.AuxInt 21998 if !(!uaddOvf(c, d)) { 21999 break 22000 } 22001 v.reset(OpRsh32x64) 22002 v.AddArg(x) 22003 v0 := b.NewValue0(v.Pos, OpConst64, t) 22004 v0.AuxInt = c + d 22005 v.AddArg(v0) 22006 return true 22007 } 22008 // match: (Rsh32x64 (Lsh32x64 x (Const64 [24])) (Const64 [24])) 22009 // cond: 22010 // result: (SignExt8to32 (Trunc32to8 <typ.Int8> x)) 22011 for { 22012 _ = v.Args[1] 22013 v_0 := v.Args[0] 22014 if v_0.Op != OpLsh32x64 { 22015 break 22016 } 22017 _ = v_0.Args[1] 22018 x := v_0.Args[0] 22019 v_0_1 := v_0.Args[1] 22020 if v_0_1.Op != OpConst64 { 22021 break 22022 } 22023 if v_0_1.AuxInt != 24 { 22024 break 22025 } 22026 v_1 := v.Args[1] 22027 if v_1.Op != OpConst64 { 22028 break 22029 } 22030 if v_1.AuxInt != 24 { 22031 break 22032 } 22033 v.reset(OpSignExt8to32) 22034 v0 := b.NewValue0(v.Pos, OpTrunc32to8, typ.Int8) 22035 v0.AddArg(x) 22036 v.AddArg(v0) 22037 return true 22038 } 22039 // match: (Rsh32x64 (Lsh32x64 x (Const64 [16])) (Const64 [16])) 22040 // cond: 22041 // result: (SignExt16to32 (Trunc32to16 <typ.Int16> x)) 22042 for { 22043 _ = v.Args[1] 22044 v_0 := v.Args[0] 22045 if v_0.Op != OpLsh32x64 { 22046 break 22047 } 22048 _ = v_0.Args[1] 22049 x := v_0.Args[0] 22050 v_0_1 := v_0.Args[1] 22051 if v_0_1.Op != OpConst64 { 22052 break 22053 } 22054 if v_0_1.AuxInt != 16 { 22055 break 22056 } 22057 v_1 := v.Args[1] 22058 if v_1.Op != OpConst64 { 22059 break 22060 } 22061 if v_1.AuxInt != 16 { 22062 break 22063 } 22064 v.reset(OpSignExt16to32) 22065 v0 := b.NewValue0(v.Pos, OpTrunc32to16, typ.Int16) 22066 v0.AddArg(x) 22067 v.AddArg(v0) 22068 return true 22069 } 22070 return false 22071 } 22072 func rewriteValuegeneric_OpRsh32x8_0(v *Value) bool { 22073 b := v.Block 22074 _ = b 22075 // match: (Rsh32x8 <t> x (Const8 [c])) 22076 // cond: 22077 // result: (Rsh32x64 x (Const64 <t> [int64(uint8(c))])) 22078 for { 22079 t := v.Type 22080 _ = v.Args[1] 22081 x := v.Args[0] 22082 v_1 := v.Args[1] 22083 if v_1.Op != OpConst8 { 22084 break 22085 } 22086 c := v_1.AuxInt 22087 v.reset(OpRsh32x64) 22088 v.AddArg(x) 22089 v0 := b.NewValue0(v.Pos, OpConst64, t) 22090 v0.AuxInt = int64(uint8(c)) 22091 v.AddArg(v0) 22092 return true 22093 } 22094 // match: (Rsh32x8 (Const32 [0]) _) 22095 // cond: 22096 // result: (Const32 [0]) 22097 for { 22098 _ = v.Args[1] 22099 v_0 := v.Args[0] 22100 if v_0.Op != OpConst32 { 22101 break 22102 } 22103 if v_0.AuxInt != 0 { 22104 break 22105 } 22106 v.reset(OpConst32) 22107 v.AuxInt = 0 22108 return true 22109 } 22110 return false 22111 } 22112 func rewriteValuegeneric_OpRsh64Ux16_0(v *Value) bool { 22113 b := v.Block 22114 _ = b 22115 // match: (Rsh64Ux16 <t> x (Const16 [c])) 22116 // cond: 22117 // result: (Rsh64Ux64 x (Const64 <t> [int64(uint16(c))])) 22118 for { 22119 t := v.Type 22120 _ = v.Args[1] 22121 x := v.Args[0] 22122 v_1 := v.Args[1] 22123 if v_1.Op != OpConst16 { 22124 break 22125 } 22126 c := v_1.AuxInt 22127 v.reset(OpRsh64Ux64) 22128 v.AddArg(x) 22129 v0 := b.NewValue0(v.Pos, OpConst64, t) 22130 v0.AuxInt = int64(uint16(c)) 22131 v.AddArg(v0) 22132 return true 22133 } 22134 // match: (Rsh64Ux16 (Const64 [0]) _) 22135 // cond: 22136 // result: (Const64 [0]) 22137 for { 22138 _ = v.Args[1] 22139 v_0 := v.Args[0] 22140 if v_0.Op != OpConst64 { 22141 break 22142 } 22143 if v_0.AuxInt != 0 { 22144 break 22145 } 22146 v.reset(OpConst64) 22147 v.AuxInt = 0 22148 return true 22149 } 22150 return false 22151 } 22152 func rewriteValuegeneric_OpRsh64Ux32_0(v *Value) bool { 22153 b := v.Block 22154 _ = b 22155 // match: (Rsh64Ux32 <t> x (Const32 [c])) 22156 // cond: 22157 // result: (Rsh64Ux64 x (Const64 <t> [int64(uint32(c))])) 22158 for { 22159 t := v.Type 22160 _ = v.Args[1] 22161 x := v.Args[0] 22162 v_1 := v.Args[1] 22163 if v_1.Op != OpConst32 { 22164 break 22165 } 22166 c := v_1.AuxInt 22167 v.reset(OpRsh64Ux64) 22168 v.AddArg(x) 22169 v0 := b.NewValue0(v.Pos, OpConst64, t) 22170 v0.AuxInt = int64(uint32(c)) 22171 v.AddArg(v0) 22172 return true 22173 } 22174 // match: (Rsh64Ux32 (Const64 [0]) _) 22175 // cond: 22176 // result: (Const64 [0]) 22177 for { 22178 _ = v.Args[1] 22179 v_0 := v.Args[0] 22180 if v_0.Op != OpConst64 { 22181 break 22182 } 22183 if v_0.AuxInt != 0 { 22184 break 22185 } 22186 v.reset(OpConst64) 22187 v.AuxInt = 0 22188 return true 22189 } 22190 return false 22191 } 22192 func rewriteValuegeneric_OpRsh64Ux64_0(v *Value) bool { 22193 b := v.Block 22194 _ = b 22195 typ := &b.Func.Config.Types 22196 _ = typ 22197 // match: (Rsh64Ux64 (Const64 [c]) (Const64 [d])) 22198 // cond: 22199 // result: (Const64 [int64(uint64(c) >> uint64(d))]) 22200 for { 22201 _ = v.Args[1] 22202 v_0 := v.Args[0] 22203 if v_0.Op != OpConst64 { 22204 break 22205 } 22206 c := v_0.AuxInt 22207 v_1 := v.Args[1] 22208 if v_1.Op != OpConst64 { 22209 break 22210 } 22211 d := v_1.AuxInt 22212 v.reset(OpConst64) 22213 v.AuxInt = int64(uint64(c) >> uint64(d)) 22214 return true 22215 } 22216 // match: (Rsh64Ux64 x (Const64 [0])) 22217 // cond: 22218 // result: x 22219 for { 22220 _ = v.Args[1] 22221 x := v.Args[0] 22222 v_1 := v.Args[1] 22223 if v_1.Op != OpConst64 { 22224 break 22225 } 22226 if v_1.AuxInt != 0 { 22227 break 22228 } 22229 v.reset(OpCopy) 22230 v.Type = x.Type 22231 v.AddArg(x) 22232 return true 22233 } 22234 // match: (Rsh64Ux64 (Const64 [0]) _) 22235 // cond: 22236 // result: (Const64 [0]) 22237 for { 22238 _ = v.Args[1] 22239 v_0 := v.Args[0] 22240 if v_0.Op != OpConst64 { 22241 break 22242 } 22243 if v_0.AuxInt != 0 { 22244 break 22245 } 22246 v.reset(OpConst64) 22247 v.AuxInt = 0 22248 return true 22249 } 22250 // match: (Rsh64Ux64 _ (Const64 [c])) 22251 // cond: uint64(c) >= 64 22252 // result: (Const64 [0]) 22253 for { 22254 _ = v.Args[1] 22255 v_1 := v.Args[1] 22256 if v_1.Op != OpConst64 { 22257 break 22258 } 22259 c := v_1.AuxInt 22260 if !(uint64(c) >= 64) { 22261 break 22262 } 22263 v.reset(OpConst64) 22264 v.AuxInt = 0 22265 return true 22266 } 22267 // match: (Rsh64Ux64 <t> (Rsh64Ux64 x (Const64 [c])) (Const64 [d])) 22268 // cond: !uaddOvf(c,d) 22269 // result: (Rsh64Ux64 x (Const64 <t> [c+d])) 22270 for { 22271 t := v.Type 22272 _ = v.Args[1] 22273 v_0 := v.Args[0] 22274 if v_0.Op != OpRsh64Ux64 { 22275 break 22276 } 22277 _ = v_0.Args[1] 22278 x := v_0.Args[0] 22279 v_0_1 := v_0.Args[1] 22280 if v_0_1.Op != OpConst64 { 22281 break 22282 } 22283 c := v_0_1.AuxInt 22284 v_1 := v.Args[1] 22285 if v_1.Op != OpConst64 { 22286 break 22287 } 22288 d := v_1.AuxInt 22289 if !(!uaddOvf(c, d)) { 22290 break 22291 } 22292 v.reset(OpRsh64Ux64) 22293 v.AddArg(x) 22294 v0 := b.NewValue0(v.Pos, OpConst64, t) 22295 v0.AuxInt = c + d 22296 v.AddArg(v0) 22297 return true 22298 } 22299 // match: (Rsh64Ux64 (Lsh64x64 (Rsh64Ux64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 22300 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 22301 // result: (Rsh64Ux64 x (Const64 <typ.UInt64> [c1-c2+c3])) 22302 for { 22303 _ = v.Args[1] 22304 v_0 := v.Args[0] 22305 if v_0.Op != OpLsh64x64 { 22306 break 22307 } 22308 _ = v_0.Args[1] 22309 v_0_0 := v_0.Args[0] 22310 if v_0_0.Op != OpRsh64Ux64 { 22311 break 22312 } 22313 _ = v_0_0.Args[1] 22314 x := v_0_0.Args[0] 22315 v_0_0_1 := v_0_0.Args[1] 22316 if v_0_0_1.Op != OpConst64 { 22317 break 22318 } 22319 c1 := v_0_0_1.AuxInt 22320 v_0_1 := v_0.Args[1] 22321 if v_0_1.Op != OpConst64 { 22322 break 22323 } 22324 c2 := v_0_1.AuxInt 22325 v_1 := v.Args[1] 22326 if v_1.Op != OpConst64 { 22327 break 22328 } 22329 c3 := v_1.AuxInt 22330 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 22331 break 22332 } 22333 v.reset(OpRsh64Ux64) 22334 v.AddArg(x) 22335 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 22336 v0.AuxInt = c1 - c2 + c3 22337 v.AddArg(v0) 22338 return true 22339 } 22340 // match: (Rsh64Ux64 (Lsh64x64 x (Const64 [56])) (Const64 [56])) 22341 // cond: 22342 // result: (ZeroExt8to64 (Trunc64to8 <typ.UInt8> x)) 22343 for { 22344 _ = v.Args[1] 22345 v_0 := v.Args[0] 22346 if v_0.Op != OpLsh64x64 { 22347 break 22348 } 22349 _ = v_0.Args[1] 22350 x := v_0.Args[0] 22351 v_0_1 := v_0.Args[1] 22352 if v_0_1.Op != OpConst64 { 22353 break 22354 } 22355 if v_0_1.AuxInt != 56 { 22356 break 22357 } 22358 v_1 := v.Args[1] 22359 if v_1.Op != OpConst64 { 22360 break 22361 } 22362 if v_1.AuxInt != 56 { 22363 break 22364 } 22365 v.reset(OpZeroExt8to64) 22366 v0 := b.NewValue0(v.Pos, OpTrunc64to8, typ.UInt8) 22367 v0.AddArg(x) 22368 v.AddArg(v0) 22369 return true 22370 } 22371 // match: (Rsh64Ux64 (Lsh64x64 x (Const64 [48])) (Const64 [48])) 22372 // cond: 22373 // result: (ZeroExt16to64 (Trunc64to16 <typ.UInt16> x)) 22374 for { 22375 _ = v.Args[1] 22376 v_0 := v.Args[0] 22377 if v_0.Op != OpLsh64x64 { 22378 break 22379 } 22380 _ = v_0.Args[1] 22381 x := v_0.Args[0] 22382 v_0_1 := v_0.Args[1] 22383 if v_0_1.Op != OpConst64 { 22384 break 22385 } 22386 if v_0_1.AuxInt != 48 { 22387 break 22388 } 22389 v_1 := v.Args[1] 22390 if v_1.Op != OpConst64 { 22391 break 22392 } 22393 if v_1.AuxInt != 48 { 22394 break 22395 } 22396 v.reset(OpZeroExt16to64) 22397 v0 := b.NewValue0(v.Pos, OpTrunc64to16, typ.UInt16) 22398 v0.AddArg(x) 22399 v.AddArg(v0) 22400 return true 22401 } 22402 // match: (Rsh64Ux64 (Lsh64x64 x (Const64 [32])) (Const64 [32])) 22403 // cond: 22404 // result: (ZeroExt32to64 (Trunc64to32 <typ.UInt32> x)) 22405 for { 22406 _ = v.Args[1] 22407 v_0 := v.Args[0] 22408 if v_0.Op != OpLsh64x64 { 22409 break 22410 } 22411 _ = v_0.Args[1] 22412 x := v_0.Args[0] 22413 v_0_1 := v_0.Args[1] 22414 if v_0_1.Op != OpConst64 { 22415 break 22416 } 22417 if v_0_1.AuxInt != 32 { 22418 break 22419 } 22420 v_1 := v.Args[1] 22421 if v_1.Op != OpConst64 { 22422 break 22423 } 22424 if v_1.AuxInt != 32 { 22425 break 22426 } 22427 v.reset(OpZeroExt32to64) 22428 v0 := b.NewValue0(v.Pos, OpTrunc64to32, typ.UInt32) 22429 v0.AddArg(x) 22430 v.AddArg(v0) 22431 return true 22432 } 22433 return false 22434 } 22435 func rewriteValuegeneric_OpRsh64Ux8_0(v *Value) bool { 22436 b := v.Block 22437 _ = b 22438 // match: (Rsh64Ux8 <t> x (Const8 [c])) 22439 // cond: 22440 // result: (Rsh64Ux64 x (Const64 <t> [int64(uint8(c))])) 22441 for { 22442 t := v.Type 22443 _ = v.Args[1] 22444 x := v.Args[0] 22445 v_1 := v.Args[1] 22446 if v_1.Op != OpConst8 { 22447 break 22448 } 22449 c := v_1.AuxInt 22450 v.reset(OpRsh64Ux64) 22451 v.AddArg(x) 22452 v0 := b.NewValue0(v.Pos, OpConst64, t) 22453 v0.AuxInt = int64(uint8(c)) 22454 v.AddArg(v0) 22455 return true 22456 } 22457 // match: (Rsh64Ux8 (Const64 [0]) _) 22458 // cond: 22459 // result: (Const64 [0]) 22460 for { 22461 _ = v.Args[1] 22462 v_0 := v.Args[0] 22463 if v_0.Op != OpConst64 { 22464 break 22465 } 22466 if v_0.AuxInt != 0 { 22467 break 22468 } 22469 v.reset(OpConst64) 22470 v.AuxInt = 0 22471 return true 22472 } 22473 return false 22474 } 22475 func rewriteValuegeneric_OpRsh64x16_0(v *Value) bool { 22476 b := v.Block 22477 _ = b 22478 // match: (Rsh64x16 <t> x (Const16 [c])) 22479 // cond: 22480 // result: (Rsh64x64 x (Const64 <t> [int64(uint16(c))])) 22481 for { 22482 t := v.Type 22483 _ = v.Args[1] 22484 x := v.Args[0] 22485 v_1 := v.Args[1] 22486 if v_1.Op != OpConst16 { 22487 break 22488 } 22489 c := v_1.AuxInt 22490 v.reset(OpRsh64x64) 22491 v.AddArg(x) 22492 v0 := b.NewValue0(v.Pos, OpConst64, t) 22493 v0.AuxInt = int64(uint16(c)) 22494 v.AddArg(v0) 22495 return true 22496 } 22497 // match: (Rsh64x16 (Const64 [0]) _) 22498 // cond: 22499 // result: (Const64 [0]) 22500 for { 22501 _ = v.Args[1] 22502 v_0 := v.Args[0] 22503 if v_0.Op != OpConst64 { 22504 break 22505 } 22506 if v_0.AuxInt != 0 { 22507 break 22508 } 22509 v.reset(OpConst64) 22510 v.AuxInt = 0 22511 return true 22512 } 22513 return false 22514 } 22515 func rewriteValuegeneric_OpRsh64x32_0(v *Value) bool { 22516 b := v.Block 22517 _ = b 22518 // match: (Rsh64x32 <t> x (Const32 [c])) 22519 // cond: 22520 // result: (Rsh64x64 x (Const64 <t> [int64(uint32(c))])) 22521 for { 22522 t := v.Type 22523 _ = v.Args[1] 22524 x := v.Args[0] 22525 v_1 := v.Args[1] 22526 if v_1.Op != OpConst32 { 22527 break 22528 } 22529 c := v_1.AuxInt 22530 v.reset(OpRsh64x64) 22531 v.AddArg(x) 22532 v0 := b.NewValue0(v.Pos, OpConst64, t) 22533 v0.AuxInt = int64(uint32(c)) 22534 v.AddArg(v0) 22535 return true 22536 } 22537 // match: (Rsh64x32 (Const64 [0]) _) 22538 // cond: 22539 // result: (Const64 [0]) 22540 for { 22541 _ = v.Args[1] 22542 v_0 := v.Args[0] 22543 if v_0.Op != OpConst64 { 22544 break 22545 } 22546 if v_0.AuxInt != 0 { 22547 break 22548 } 22549 v.reset(OpConst64) 22550 v.AuxInt = 0 22551 return true 22552 } 22553 return false 22554 } 22555 func rewriteValuegeneric_OpRsh64x64_0(v *Value) bool { 22556 b := v.Block 22557 _ = b 22558 typ := &b.Func.Config.Types 22559 _ = typ 22560 // match: (Rsh64x64 (Const64 [c]) (Const64 [d])) 22561 // cond: 22562 // result: (Const64 [c >> uint64(d)]) 22563 for { 22564 _ = v.Args[1] 22565 v_0 := v.Args[0] 22566 if v_0.Op != OpConst64 { 22567 break 22568 } 22569 c := v_0.AuxInt 22570 v_1 := v.Args[1] 22571 if v_1.Op != OpConst64 { 22572 break 22573 } 22574 d := v_1.AuxInt 22575 v.reset(OpConst64) 22576 v.AuxInt = c >> uint64(d) 22577 return true 22578 } 22579 // match: (Rsh64x64 x (Const64 [0])) 22580 // cond: 22581 // result: x 22582 for { 22583 _ = v.Args[1] 22584 x := v.Args[0] 22585 v_1 := v.Args[1] 22586 if v_1.Op != OpConst64 { 22587 break 22588 } 22589 if v_1.AuxInt != 0 { 22590 break 22591 } 22592 v.reset(OpCopy) 22593 v.Type = x.Type 22594 v.AddArg(x) 22595 return true 22596 } 22597 // match: (Rsh64x64 (Const64 [0]) _) 22598 // cond: 22599 // result: (Const64 [0]) 22600 for { 22601 _ = v.Args[1] 22602 v_0 := v.Args[0] 22603 if v_0.Op != OpConst64 { 22604 break 22605 } 22606 if v_0.AuxInt != 0 { 22607 break 22608 } 22609 v.reset(OpConst64) 22610 v.AuxInt = 0 22611 return true 22612 } 22613 // match: (Rsh64x64 <t> (Rsh64x64 x (Const64 [c])) (Const64 [d])) 22614 // cond: !uaddOvf(c,d) 22615 // result: (Rsh64x64 x (Const64 <t> [c+d])) 22616 for { 22617 t := v.Type 22618 _ = v.Args[1] 22619 v_0 := v.Args[0] 22620 if v_0.Op != OpRsh64x64 { 22621 break 22622 } 22623 _ = v_0.Args[1] 22624 x := v_0.Args[0] 22625 v_0_1 := v_0.Args[1] 22626 if v_0_1.Op != OpConst64 { 22627 break 22628 } 22629 c := v_0_1.AuxInt 22630 v_1 := v.Args[1] 22631 if v_1.Op != OpConst64 { 22632 break 22633 } 22634 d := v_1.AuxInt 22635 if !(!uaddOvf(c, d)) { 22636 break 22637 } 22638 v.reset(OpRsh64x64) 22639 v.AddArg(x) 22640 v0 := b.NewValue0(v.Pos, OpConst64, t) 22641 v0.AuxInt = c + d 22642 v.AddArg(v0) 22643 return true 22644 } 22645 // match: (Rsh64x64 (Lsh64x64 x (Const64 [56])) (Const64 [56])) 22646 // cond: 22647 // result: (SignExt8to64 (Trunc64to8 <typ.Int8> x)) 22648 for { 22649 _ = v.Args[1] 22650 v_0 := v.Args[0] 22651 if v_0.Op != OpLsh64x64 { 22652 break 22653 } 22654 _ = v_0.Args[1] 22655 x := v_0.Args[0] 22656 v_0_1 := v_0.Args[1] 22657 if v_0_1.Op != OpConst64 { 22658 break 22659 } 22660 if v_0_1.AuxInt != 56 { 22661 break 22662 } 22663 v_1 := v.Args[1] 22664 if v_1.Op != OpConst64 { 22665 break 22666 } 22667 if v_1.AuxInt != 56 { 22668 break 22669 } 22670 v.reset(OpSignExt8to64) 22671 v0 := b.NewValue0(v.Pos, OpTrunc64to8, typ.Int8) 22672 v0.AddArg(x) 22673 v.AddArg(v0) 22674 return true 22675 } 22676 // match: (Rsh64x64 (Lsh64x64 x (Const64 [48])) (Const64 [48])) 22677 // cond: 22678 // result: (SignExt16to64 (Trunc64to16 <typ.Int16> x)) 22679 for { 22680 _ = v.Args[1] 22681 v_0 := v.Args[0] 22682 if v_0.Op != OpLsh64x64 { 22683 break 22684 } 22685 _ = v_0.Args[1] 22686 x := v_0.Args[0] 22687 v_0_1 := v_0.Args[1] 22688 if v_0_1.Op != OpConst64 { 22689 break 22690 } 22691 if v_0_1.AuxInt != 48 { 22692 break 22693 } 22694 v_1 := v.Args[1] 22695 if v_1.Op != OpConst64 { 22696 break 22697 } 22698 if v_1.AuxInt != 48 { 22699 break 22700 } 22701 v.reset(OpSignExt16to64) 22702 v0 := b.NewValue0(v.Pos, OpTrunc64to16, typ.Int16) 22703 v0.AddArg(x) 22704 v.AddArg(v0) 22705 return true 22706 } 22707 // match: (Rsh64x64 (Lsh64x64 x (Const64 [32])) (Const64 [32])) 22708 // cond: 22709 // result: (SignExt32to64 (Trunc64to32 <typ.Int32> x)) 22710 for { 22711 _ = v.Args[1] 22712 v_0 := v.Args[0] 22713 if v_0.Op != OpLsh64x64 { 22714 break 22715 } 22716 _ = v_0.Args[1] 22717 x := v_0.Args[0] 22718 v_0_1 := v_0.Args[1] 22719 if v_0_1.Op != OpConst64 { 22720 break 22721 } 22722 if v_0_1.AuxInt != 32 { 22723 break 22724 } 22725 v_1 := v.Args[1] 22726 if v_1.Op != OpConst64 { 22727 break 22728 } 22729 if v_1.AuxInt != 32 { 22730 break 22731 } 22732 v.reset(OpSignExt32to64) 22733 v0 := b.NewValue0(v.Pos, OpTrunc64to32, typ.Int32) 22734 v0.AddArg(x) 22735 v.AddArg(v0) 22736 return true 22737 } 22738 return false 22739 } 22740 func rewriteValuegeneric_OpRsh64x8_0(v *Value) bool { 22741 b := v.Block 22742 _ = b 22743 // match: (Rsh64x8 <t> x (Const8 [c])) 22744 // cond: 22745 // result: (Rsh64x64 x (Const64 <t> [int64(uint8(c))])) 22746 for { 22747 t := v.Type 22748 _ = v.Args[1] 22749 x := v.Args[0] 22750 v_1 := v.Args[1] 22751 if v_1.Op != OpConst8 { 22752 break 22753 } 22754 c := v_1.AuxInt 22755 v.reset(OpRsh64x64) 22756 v.AddArg(x) 22757 v0 := b.NewValue0(v.Pos, OpConst64, t) 22758 v0.AuxInt = int64(uint8(c)) 22759 v.AddArg(v0) 22760 return true 22761 } 22762 // match: (Rsh64x8 (Const64 [0]) _) 22763 // cond: 22764 // result: (Const64 [0]) 22765 for { 22766 _ = v.Args[1] 22767 v_0 := v.Args[0] 22768 if v_0.Op != OpConst64 { 22769 break 22770 } 22771 if v_0.AuxInt != 0 { 22772 break 22773 } 22774 v.reset(OpConst64) 22775 v.AuxInt = 0 22776 return true 22777 } 22778 return false 22779 } 22780 func rewriteValuegeneric_OpRsh8Ux16_0(v *Value) bool { 22781 b := v.Block 22782 _ = b 22783 // match: (Rsh8Ux16 <t> x (Const16 [c])) 22784 // cond: 22785 // result: (Rsh8Ux64 x (Const64 <t> [int64(uint16(c))])) 22786 for { 22787 t := v.Type 22788 _ = v.Args[1] 22789 x := v.Args[0] 22790 v_1 := v.Args[1] 22791 if v_1.Op != OpConst16 { 22792 break 22793 } 22794 c := v_1.AuxInt 22795 v.reset(OpRsh8Ux64) 22796 v.AddArg(x) 22797 v0 := b.NewValue0(v.Pos, OpConst64, t) 22798 v0.AuxInt = int64(uint16(c)) 22799 v.AddArg(v0) 22800 return true 22801 } 22802 // match: (Rsh8Ux16 (Const8 [0]) _) 22803 // cond: 22804 // result: (Const8 [0]) 22805 for { 22806 _ = v.Args[1] 22807 v_0 := v.Args[0] 22808 if v_0.Op != OpConst8 { 22809 break 22810 } 22811 if v_0.AuxInt != 0 { 22812 break 22813 } 22814 v.reset(OpConst8) 22815 v.AuxInt = 0 22816 return true 22817 } 22818 return false 22819 } 22820 func rewriteValuegeneric_OpRsh8Ux32_0(v *Value) bool { 22821 b := v.Block 22822 _ = b 22823 // match: (Rsh8Ux32 <t> x (Const32 [c])) 22824 // cond: 22825 // result: (Rsh8Ux64 x (Const64 <t> [int64(uint32(c))])) 22826 for { 22827 t := v.Type 22828 _ = v.Args[1] 22829 x := v.Args[0] 22830 v_1 := v.Args[1] 22831 if v_1.Op != OpConst32 { 22832 break 22833 } 22834 c := v_1.AuxInt 22835 v.reset(OpRsh8Ux64) 22836 v.AddArg(x) 22837 v0 := b.NewValue0(v.Pos, OpConst64, t) 22838 v0.AuxInt = int64(uint32(c)) 22839 v.AddArg(v0) 22840 return true 22841 } 22842 // match: (Rsh8Ux32 (Const8 [0]) _) 22843 // cond: 22844 // result: (Const8 [0]) 22845 for { 22846 _ = v.Args[1] 22847 v_0 := v.Args[0] 22848 if v_0.Op != OpConst8 { 22849 break 22850 } 22851 if v_0.AuxInt != 0 { 22852 break 22853 } 22854 v.reset(OpConst8) 22855 v.AuxInt = 0 22856 return true 22857 } 22858 return false 22859 } 22860 func rewriteValuegeneric_OpRsh8Ux64_0(v *Value) bool { 22861 b := v.Block 22862 _ = b 22863 typ := &b.Func.Config.Types 22864 _ = typ 22865 // match: (Rsh8Ux64 (Const8 [c]) (Const64 [d])) 22866 // cond: 22867 // result: (Const8 [int64(int8(uint8(c) >> uint64(d)))]) 22868 for { 22869 _ = v.Args[1] 22870 v_0 := v.Args[0] 22871 if v_0.Op != OpConst8 { 22872 break 22873 } 22874 c := v_0.AuxInt 22875 v_1 := v.Args[1] 22876 if v_1.Op != OpConst64 { 22877 break 22878 } 22879 d := v_1.AuxInt 22880 v.reset(OpConst8) 22881 v.AuxInt = int64(int8(uint8(c) >> uint64(d))) 22882 return true 22883 } 22884 // match: (Rsh8Ux64 x (Const64 [0])) 22885 // cond: 22886 // result: x 22887 for { 22888 _ = v.Args[1] 22889 x := v.Args[0] 22890 v_1 := v.Args[1] 22891 if v_1.Op != OpConst64 { 22892 break 22893 } 22894 if v_1.AuxInt != 0 { 22895 break 22896 } 22897 v.reset(OpCopy) 22898 v.Type = x.Type 22899 v.AddArg(x) 22900 return true 22901 } 22902 // match: (Rsh8Ux64 (Const8 [0]) _) 22903 // cond: 22904 // result: (Const8 [0]) 22905 for { 22906 _ = v.Args[1] 22907 v_0 := v.Args[0] 22908 if v_0.Op != OpConst8 { 22909 break 22910 } 22911 if v_0.AuxInt != 0 { 22912 break 22913 } 22914 v.reset(OpConst8) 22915 v.AuxInt = 0 22916 return true 22917 } 22918 // match: (Rsh8Ux64 _ (Const64 [c])) 22919 // cond: uint64(c) >= 8 22920 // result: (Const8 [0]) 22921 for { 22922 _ = v.Args[1] 22923 v_1 := v.Args[1] 22924 if v_1.Op != OpConst64 { 22925 break 22926 } 22927 c := v_1.AuxInt 22928 if !(uint64(c) >= 8) { 22929 break 22930 } 22931 v.reset(OpConst8) 22932 v.AuxInt = 0 22933 return true 22934 } 22935 // match: (Rsh8Ux64 <t> (Rsh8Ux64 x (Const64 [c])) (Const64 [d])) 22936 // cond: !uaddOvf(c,d) 22937 // result: (Rsh8Ux64 x (Const64 <t> [c+d])) 22938 for { 22939 t := v.Type 22940 _ = v.Args[1] 22941 v_0 := v.Args[0] 22942 if v_0.Op != OpRsh8Ux64 { 22943 break 22944 } 22945 _ = v_0.Args[1] 22946 x := v_0.Args[0] 22947 v_0_1 := v_0.Args[1] 22948 if v_0_1.Op != OpConst64 { 22949 break 22950 } 22951 c := v_0_1.AuxInt 22952 v_1 := v.Args[1] 22953 if v_1.Op != OpConst64 { 22954 break 22955 } 22956 d := v_1.AuxInt 22957 if !(!uaddOvf(c, d)) { 22958 break 22959 } 22960 v.reset(OpRsh8Ux64) 22961 v.AddArg(x) 22962 v0 := b.NewValue0(v.Pos, OpConst64, t) 22963 v0.AuxInt = c + d 22964 v.AddArg(v0) 22965 return true 22966 } 22967 // match: (Rsh8Ux64 (Lsh8x64 (Rsh8Ux64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 22968 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 22969 // result: (Rsh8Ux64 x (Const64 <typ.UInt64> [c1-c2+c3])) 22970 for { 22971 _ = v.Args[1] 22972 v_0 := v.Args[0] 22973 if v_0.Op != OpLsh8x64 { 22974 break 22975 } 22976 _ = v_0.Args[1] 22977 v_0_0 := v_0.Args[0] 22978 if v_0_0.Op != OpRsh8Ux64 { 22979 break 22980 } 22981 _ = v_0_0.Args[1] 22982 x := v_0_0.Args[0] 22983 v_0_0_1 := v_0_0.Args[1] 22984 if v_0_0_1.Op != OpConst64 { 22985 break 22986 } 22987 c1 := v_0_0_1.AuxInt 22988 v_0_1 := v_0.Args[1] 22989 if v_0_1.Op != OpConst64 { 22990 break 22991 } 22992 c2 := v_0_1.AuxInt 22993 v_1 := v.Args[1] 22994 if v_1.Op != OpConst64 { 22995 break 22996 } 22997 c3 := v_1.AuxInt 22998 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 22999 break 23000 } 23001 v.reset(OpRsh8Ux64) 23002 v.AddArg(x) 23003 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 23004 v0.AuxInt = c1 - c2 + c3 23005 v.AddArg(v0) 23006 return true 23007 } 23008 return false 23009 } 23010 func rewriteValuegeneric_OpRsh8Ux8_0(v *Value) bool { 23011 b := v.Block 23012 _ = b 23013 // match: (Rsh8Ux8 <t> x (Const8 [c])) 23014 // cond: 23015 // result: (Rsh8Ux64 x (Const64 <t> [int64(uint8(c))])) 23016 for { 23017 t := v.Type 23018 _ = v.Args[1] 23019 x := v.Args[0] 23020 v_1 := v.Args[1] 23021 if v_1.Op != OpConst8 { 23022 break 23023 } 23024 c := v_1.AuxInt 23025 v.reset(OpRsh8Ux64) 23026 v.AddArg(x) 23027 v0 := b.NewValue0(v.Pos, OpConst64, t) 23028 v0.AuxInt = int64(uint8(c)) 23029 v.AddArg(v0) 23030 return true 23031 } 23032 // match: (Rsh8Ux8 (Const8 [0]) _) 23033 // cond: 23034 // result: (Const8 [0]) 23035 for { 23036 _ = v.Args[1] 23037 v_0 := v.Args[0] 23038 if v_0.Op != OpConst8 { 23039 break 23040 } 23041 if v_0.AuxInt != 0 { 23042 break 23043 } 23044 v.reset(OpConst8) 23045 v.AuxInt = 0 23046 return true 23047 } 23048 return false 23049 } 23050 func rewriteValuegeneric_OpRsh8x16_0(v *Value) bool { 23051 b := v.Block 23052 _ = b 23053 // match: (Rsh8x16 <t> x (Const16 [c])) 23054 // cond: 23055 // result: (Rsh8x64 x (Const64 <t> [int64(uint16(c))])) 23056 for { 23057 t := v.Type 23058 _ = v.Args[1] 23059 x := v.Args[0] 23060 v_1 := v.Args[1] 23061 if v_1.Op != OpConst16 { 23062 break 23063 } 23064 c := v_1.AuxInt 23065 v.reset(OpRsh8x64) 23066 v.AddArg(x) 23067 v0 := b.NewValue0(v.Pos, OpConst64, t) 23068 v0.AuxInt = int64(uint16(c)) 23069 v.AddArg(v0) 23070 return true 23071 } 23072 // match: (Rsh8x16 (Const8 [0]) _) 23073 // cond: 23074 // result: (Const8 [0]) 23075 for { 23076 _ = v.Args[1] 23077 v_0 := v.Args[0] 23078 if v_0.Op != OpConst8 { 23079 break 23080 } 23081 if v_0.AuxInt != 0 { 23082 break 23083 } 23084 v.reset(OpConst8) 23085 v.AuxInt = 0 23086 return true 23087 } 23088 return false 23089 } 23090 func rewriteValuegeneric_OpRsh8x32_0(v *Value) bool { 23091 b := v.Block 23092 _ = b 23093 // match: (Rsh8x32 <t> x (Const32 [c])) 23094 // cond: 23095 // result: (Rsh8x64 x (Const64 <t> [int64(uint32(c))])) 23096 for { 23097 t := v.Type 23098 _ = v.Args[1] 23099 x := v.Args[0] 23100 v_1 := v.Args[1] 23101 if v_1.Op != OpConst32 { 23102 break 23103 } 23104 c := v_1.AuxInt 23105 v.reset(OpRsh8x64) 23106 v.AddArg(x) 23107 v0 := b.NewValue0(v.Pos, OpConst64, t) 23108 v0.AuxInt = int64(uint32(c)) 23109 v.AddArg(v0) 23110 return true 23111 } 23112 // match: (Rsh8x32 (Const8 [0]) _) 23113 // cond: 23114 // result: (Const8 [0]) 23115 for { 23116 _ = v.Args[1] 23117 v_0 := v.Args[0] 23118 if v_0.Op != OpConst8 { 23119 break 23120 } 23121 if v_0.AuxInt != 0 { 23122 break 23123 } 23124 v.reset(OpConst8) 23125 v.AuxInt = 0 23126 return true 23127 } 23128 return false 23129 } 23130 func rewriteValuegeneric_OpRsh8x64_0(v *Value) bool { 23131 b := v.Block 23132 _ = b 23133 // match: (Rsh8x64 (Const8 [c]) (Const64 [d])) 23134 // cond: 23135 // result: (Const8 [int64(int8(c) >> uint64(d))]) 23136 for { 23137 _ = v.Args[1] 23138 v_0 := v.Args[0] 23139 if v_0.Op != OpConst8 { 23140 break 23141 } 23142 c := v_0.AuxInt 23143 v_1 := v.Args[1] 23144 if v_1.Op != OpConst64 { 23145 break 23146 } 23147 d := v_1.AuxInt 23148 v.reset(OpConst8) 23149 v.AuxInt = int64(int8(c) >> uint64(d)) 23150 return true 23151 } 23152 // match: (Rsh8x64 x (Const64 [0])) 23153 // cond: 23154 // result: x 23155 for { 23156 _ = v.Args[1] 23157 x := v.Args[0] 23158 v_1 := v.Args[1] 23159 if v_1.Op != OpConst64 { 23160 break 23161 } 23162 if v_1.AuxInt != 0 { 23163 break 23164 } 23165 v.reset(OpCopy) 23166 v.Type = x.Type 23167 v.AddArg(x) 23168 return true 23169 } 23170 // match: (Rsh8x64 (Const8 [0]) _) 23171 // cond: 23172 // result: (Const8 [0]) 23173 for { 23174 _ = v.Args[1] 23175 v_0 := v.Args[0] 23176 if v_0.Op != OpConst8 { 23177 break 23178 } 23179 if v_0.AuxInt != 0 { 23180 break 23181 } 23182 v.reset(OpConst8) 23183 v.AuxInt = 0 23184 return true 23185 } 23186 // match: (Rsh8x64 <t> (Rsh8x64 x (Const64 [c])) (Const64 [d])) 23187 // cond: !uaddOvf(c,d) 23188 // result: (Rsh8x64 x (Const64 <t> [c+d])) 23189 for { 23190 t := v.Type 23191 _ = v.Args[1] 23192 v_0 := v.Args[0] 23193 if v_0.Op != OpRsh8x64 { 23194 break 23195 } 23196 _ = v_0.Args[1] 23197 x := v_0.Args[0] 23198 v_0_1 := v_0.Args[1] 23199 if v_0_1.Op != OpConst64 { 23200 break 23201 } 23202 c := v_0_1.AuxInt 23203 v_1 := v.Args[1] 23204 if v_1.Op != OpConst64 { 23205 break 23206 } 23207 d := v_1.AuxInt 23208 if !(!uaddOvf(c, d)) { 23209 break 23210 } 23211 v.reset(OpRsh8x64) 23212 v.AddArg(x) 23213 v0 := b.NewValue0(v.Pos, OpConst64, t) 23214 v0.AuxInt = c + d 23215 v.AddArg(v0) 23216 return true 23217 } 23218 return false 23219 } 23220 func rewriteValuegeneric_OpRsh8x8_0(v *Value) bool { 23221 b := v.Block 23222 _ = b 23223 // match: (Rsh8x8 <t> x (Const8 [c])) 23224 // cond: 23225 // result: (Rsh8x64 x (Const64 <t> [int64(uint8(c))])) 23226 for { 23227 t := v.Type 23228 _ = v.Args[1] 23229 x := v.Args[0] 23230 v_1 := v.Args[1] 23231 if v_1.Op != OpConst8 { 23232 break 23233 } 23234 c := v_1.AuxInt 23235 v.reset(OpRsh8x64) 23236 v.AddArg(x) 23237 v0 := b.NewValue0(v.Pos, OpConst64, t) 23238 v0.AuxInt = int64(uint8(c)) 23239 v.AddArg(v0) 23240 return true 23241 } 23242 // match: (Rsh8x8 (Const8 [0]) _) 23243 // cond: 23244 // result: (Const8 [0]) 23245 for { 23246 _ = v.Args[1] 23247 v_0 := v.Args[0] 23248 if v_0.Op != OpConst8 { 23249 break 23250 } 23251 if v_0.AuxInt != 0 { 23252 break 23253 } 23254 v.reset(OpConst8) 23255 v.AuxInt = 0 23256 return true 23257 } 23258 return false 23259 } 23260 func rewriteValuegeneric_OpSignExt16to32_0(v *Value) bool { 23261 // match: (SignExt16to32 (Const16 [c])) 23262 // cond: 23263 // result: (Const32 [int64( int16(c))]) 23264 for { 23265 v_0 := v.Args[0] 23266 if v_0.Op != OpConst16 { 23267 break 23268 } 23269 c := v_0.AuxInt 23270 v.reset(OpConst32) 23271 v.AuxInt = int64(int16(c)) 23272 return true 23273 } 23274 // match: (SignExt16to32 (Trunc32to16 x:(Rsh32x64 _ (Const64 [s])))) 23275 // cond: s >= 16 23276 // result: x 23277 for { 23278 v_0 := v.Args[0] 23279 if v_0.Op != OpTrunc32to16 { 23280 break 23281 } 23282 x := v_0.Args[0] 23283 if x.Op != OpRsh32x64 { 23284 break 23285 } 23286 _ = x.Args[1] 23287 x_1 := x.Args[1] 23288 if x_1.Op != OpConst64 { 23289 break 23290 } 23291 s := x_1.AuxInt 23292 if !(s >= 16) { 23293 break 23294 } 23295 v.reset(OpCopy) 23296 v.Type = x.Type 23297 v.AddArg(x) 23298 return true 23299 } 23300 return false 23301 } 23302 func rewriteValuegeneric_OpSignExt16to64_0(v *Value) bool { 23303 // match: (SignExt16to64 (Const16 [c])) 23304 // cond: 23305 // result: (Const64 [int64( int16(c))]) 23306 for { 23307 v_0 := v.Args[0] 23308 if v_0.Op != OpConst16 { 23309 break 23310 } 23311 c := v_0.AuxInt 23312 v.reset(OpConst64) 23313 v.AuxInt = int64(int16(c)) 23314 return true 23315 } 23316 // match: (SignExt16to64 (Trunc64to16 x:(Rsh64x64 _ (Const64 [s])))) 23317 // cond: s >= 48 23318 // result: x 23319 for { 23320 v_0 := v.Args[0] 23321 if v_0.Op != OpTrunc64to16 { 23322 break 23323 } 23324 x := v_0.Args[0] 23325 if x.Op != OpRsh64x64 { 23326 break 23327 } 23328 _ = x.Args[1] 23329 x_1 := x.Args[1] 23330 if x_1.Op != OpConst64 { 23331 break 23332 } 23333 s := x_1.AuxInt 23334 if !(s >= 48) { 23335 break 23336 } 23337 v.reset(OpCopy) 23338 v.Type = x.Type 23339 v.AddArg(x) 23340 return true 23341 } 23342 return false 23343 } 23344 func rewriteValuegeneric_OpSignExt32to64_0(v *Value) bool { 23345 // match: (SignExt32to64 (Const32 [c])) 23346 // cond: 23347 // result: (Const64 [int64( int32(c))]) 23348 for { 23349 v_0 := v.Args[0] 23350 if v_0.Op != OpConst32 { 23351 break 23352 } 23353 c := v_0.AuxInt 23354 v.reset(OpConst64) 23355 v.AuxInt = int64(int32(c)) 23356 return true 23357 } 23358 // match: (SignExt32to64 (Trunc64to32 x:(Rsh64x64 _ (Const64 [s])))) 23359 // cond: s >= 32 23360 // result: x 23361 for { 23362 v_0 := v.Args[0] 23363 if v_0.Op != OpTrunc64to32 { 23364 break 23365 } 23366 x := v_0.Args[0] 23367 if x.Op != OpRsh64x64 { 23368 break 23369 } 23370 _ = x.Args[1] 23371 x_1 := x.Args[1] 23372 if x_1.Op != OpConst64 { 23373 break 23374 } 23375 s := x_1.AuxInt 23376 if !(s >= 32) { 23377 break 23378 } 23379 v.reset(OpCopy) 23380 v.Type = x.Type 23381 v.AddArg(x) 23382 return true 23383 } 23384 return false 23385 } 23386 func rewriteValuegeneric_OpSignExt8to16_0(v *Value) bool { 23387 // match: (SignExt8to16 (Const8 [c])) 23388 // cond: 23389 // result: (Const16 [int64( int8(c))]) 23390 for { 23391 v_0 := v.Args[0] 23392 if v_0.Op != OpConst8 { 23393 break 23394 } 23395 c := v_0.AuxInt 23396 v.reset(OpConst16) 23397 v.AuxInt = int64(int8(c)) 23398 return true 23399 } 23400 // match: (SignExt8to16 (Trunc16to8 x:(Rsh16x64 _ (Const64 [s])))) 23401 // cond: s >= 8 23402 // result: x 23403 for { 23404 v_0 := v.Args[0] 23405 if v_0.Op != OpTrunc16to8 { 23406 break 23407 } 23408 x := v_0.Args[0] 23409 if x.Op != OpRsh16x64 { 23410 break 23411 } 23412 _ = x.Args[1] 23413 x_1 := x.Args[1] 23414 if x_1.Op != OpConst64 { 23415 break 23416 } 23417 s := x_1.AuxInt 23418 if !(s >= 8) { 23419 break 23420 } 23421 v.reset(OpCopy) 23422 v.Type = x.Type 23423 v.AddArg(x) 23424 return true 23425 } 23426 return false 23427 } 23428 func rewriteValuegeneric_OpSignExt8to32_0(v *Value) bool { 23429 // match: (SignExt8to32 (Const8 [c])) 23430 // cond: 23431 // result: (Const32 [int64( int8(c))]) 23432 for { 23433 v_0 := v.Args[0] 23434 if v_0.Op != OpConst8 { 23435 break 23436 } 23437 c := v_0.AuxInt 23438 v.reset(OpConst32) 23439 v.AuxInt = int64(int8(c)) 23440 return true 23441 } 23442 // match: (SignExt8to32 (Trunc32to8 x:(Rsh32x64 _ (Const64 [s])))) 23443 // cond: s >= 24 23444 // result: x 23445 for { 23446 v_0 := v.Args[0] 23447 if v_0.Op != OpTrunc32to8 { 23448 break 23449 } 23450 x := v_0.Args[0] 23451 if x.Op != OpRsh32x64 { 23452 break 23453 } 23454 _ = x.Args[1] 23455 x_1 := x.Args[1] 23456 if x_1.Op != OpConst64 { 23457 break 23458 } 23459 s := x_1.AuxInt 23460 if !(s >= 24) { 23461 break 23462 } 23463 v.reset(OpCopy) 23464 v.Type = x.Type 23465 v.AddArg(x) 23466 return true 23467 } 23468 return false 23469 } 23470 func rewriteValuegeneric_OpSignExt8to64_0(v *Value) bool { 23471 // match: (SignExt8to64 (Const8 [c])) 23472 // cond: 23473 // result: (Const64 [int64( int8(c))]) 23474 for { 23475 v_0 := v.Args[0] 23476 if v_0.Op != OpConst8 { 23477 break 23478 } 23479 c := v_0.AuxInt 23480 v.reset(OpConst64) 23481 v.AuxInt = int64(int8(c)) 23482 return true 23483 } 23484 // match: (SignExt8to64 (Trunc64to8 x:(Rsh64x64 _ (Const64 [s])))) 23485 // cond: s >= 56 23486 // result: x 23487 for { 23488 v_0 := v.Args[0] 23489 if v_0.Op != OpTrunc64to8 { 23490 break 23491 } 23492 x := v_0.Args[0] 23493 if x.Op != OpRsh64x64 { 23494 break 23495 } 23496 _ = x.Args[1] 23497 x_1 := x.Args[1] 23498 if x_1.Op != OpConst64 { 23499 break 23500 } 23501 s := x_1.AuxInt 23502 if !(s >= 56) { 23503 break 23504 } 23505 v.reset(OpCopy) 23506 v.Type = x.Type 23507 v.AddArg(x) 23508 return true 23509 } 23510 return false 23511 } 23512 func rewriteValuegeneric_OpSliceCap_0(v *Value) bool { 23513 // match: (SliceCap (SliceMake _ _ (Const64 <t> [c]))) 23514 // cond: 23515 // result: (Const64 <t> [c]) 23516 for { 23517 v_0 := v.Args[0] 23518 if v_0.Op != OpSliceMake { 23519 break 23520 } 23521 _ = v_0.Args[2] 23522 v_0_2 := v_0.Args[2] 23523 if v_0_2.Op != OpConst64 { 23524 break 23525 } 23526 t := v_0_2.Type 23527 c := v_0_2.AuxInt 23528 v.reset(OpConst64) 23529 v.Type = t 23530 v.AuxInt = c 23531 return true 23532 } 23533 // match: (SliceCap (SliceMake _ _ (Const32 <t> [c]))) 23534 // cond: 23535 // result: (Const32 <t> [c]) 23536 for { 23537 v_0 := v.Args[0] 23538 if v_0.Op != OpSliceMake { 23539 break 23540 } 23541 _ = v_0.Args[2] 23542 v_0_2 := v_0.Args[2] 23543 if v_0_2.Op != OpConst32 { 23544 break 23545 } 23546 t := v_0_2.Type 23547 c := v_0_2.AuxInt 23548 v.reset(OpConst32) 23549 v.Type = t 23550 v.AuxInt = c 23551 return true 23552 } 23553 // match: (SliceCap (SliceMake _ _ (SliceCap x))) 23554 // cond: 23555 // result: (SliceCap x) 23556 for { 23557 v_0 := v.Args[0] 23558 if v_0.Op != OpSliceMake { 23559 break 23560 } 23561 _ = v_0.Args[2] 23562 v_0_2 := v_0.Args[2] 23563 if v_0_2.Op != OpSliceCap { 23564 break 23565 } 23566 x := v_0_2.Args[0] 23567 v.reset(OpSliceCap) 23568 v.AddArg(x) 23569 return true 23570 } 23571 // match: (SliceCap (SliceMake _ _ (SliceLen x))) 23572 // cond: 23573 // result: (SliceLen x) 23574 for { 23575 v_0 := v.Args[0] 23576 if v_0.Op != OpSliceMake { 23577 break 23578 } 23579 _ = v_0.Args[2] 23580 v_0_2 := v_0.Args[2] 23581 if v_0_2.Op != OpSliceLen { 23582 break 23583 } 23584 x := v_0_2.Args[0] 23585 v.reset(OpSliceLen) 23586 v.AddArg(x) 23587 return true 23588 } 23589 return false 23590 } 23591 func rewriteValuegeneric_OpSliceLen_0(v *Value) bool { 23592 // match: (SliceLen (SliceMake _ (Const64 <t> [c]) _)) 23593 // cond: 23594 // result: (Const64 <t> [c]) 23595 for { 23596 v_0 := v.Args[0] 23597 if v_0.Op != OpSliceMake { 23598 break 23599 } 23600 _ = v_0.Args[2] 23601 v_0_1 := v_0.Args[1] 23602 if v_0_1.Op != OpConst64 { 23603 break 23604 } 23605 t := v_0_1.Type 23606 c := v_0_1.AuxInt 23607 v.reset(OpConst64) 23608 v.Type = t 23609 v.AuxInt = c 23610 return true 23611 } 23612 // match: (SliceLen (SliceMake _ (Const32 <t> [c]) _)) 23613 // cond: 23614 // result: (Const32 <t> [c]) 23615 for { 23616 v_0 := v.Args[0] 23617 if v_0.Op != OpSliceMake { 23618 break 23619 } 23620 _ = v_0.Args[2] 23621 v_0_1 := v_0.Args[1] 23622 if v_0_1.Op != OpConst32 { 23623 break 23624 } 23625 t := v_0_1.Type 23626 c := v_0_1.AuxInt 23627 v.reset(OpConst32) 23628 v.Type = t 23629 v.AuxInt = c 23630 return true 23631 } 23632 // match: (SliceLen (SliceMake _ (SliceLen x) _)) 23633 // cond: 23634 // result: (SliceLen x) 23635 for { 23636 v_0 := v.Args[0] 23637 if v_0.Op != OpSliceMake { 23638 break 23639 } 23640 _ = v_0.Args[2] 23641 v_0_1 := v_0.Args[1] 23642 if v_0_1.Op != OpSliceLen { 23643 break 23644 } 23645 x := v_0_1.Args[0] 23646 v.reset(OpSliceLen) 23647 v.AddArg(x) 23648 return true 23649 } 23650 return false 23651 } 23652 func rewriteValuegeneric_OpSlicePtr_0(v *Value) bool { 23653 // match: (SlicePtr (SliceMake (SlicePtr x) _ _)) 23654 // cond: 23655 // result: (SlicePtr x) 23656 for { 23657 v_0 := v.Args[0] 23658 if v_0.Op != OpSliceMake { 23659 break 23660 } 23661 _ = v_0.Args[2] 23662 v_0_0 := v_0.Args[0] 23663 if v_0_0.Op != OpSlicePtr { 23664 break 23665 } 23666 x := v_0_0.Args[0] 23667 v.reset(OpSlicePtr) 23668 v.AddArg(x) 23669 return true 23670 } 23671 return false 23672 } 23673 func rewriteValuegeneric_OpSlicemask_0(v *Value) bool { 23674 // match: (Slicemask (Const32 [x])) 23675 // cond: x > 0 23676 // result: (Const32 [-1]) 23677 for { 23678 v_0 := v.Args[0] 23679 if v_0.Op != OpConst32 { 23680 break 23681 } 23682 x := v_0.AuxInt 23683 if !(x > 0) { 23684 break 23685 } 23686 v.reset(OpConst32) 23687 v.AuxInt = -1 23688 return true 23689 } 23690 // match: (Slicemask (Const32 [0])) 23691 // cond: 23692 // result: (Const32 [0]) 23693 for { 23694 v_0 := v.Args[0] 23695 if v_0.Op != OpConst32 { 23696 break 23697 } 23698 if v_0.AuxInt != 0 { 23699 break 23700 } 23701 v.reset(OpConst32) 23702 v.AuxInt = 0 23703 return true 23704 } 23705 // match: (Slicemask (Const64 [x])) 23706 // cond: x > 0 23707 // result: (Const64 [-1]) 23708 for { 23709 v_0 := v.Args[0] 23710 if v_0.Op != OpConst64 { 23711 break 23712 } 23713 x := v_0.AuxInt 23714 if !(x > 0) { 23715 break 23716 } 23717 v.reset(OpConst64) 23718 v.AuxInt = -1 23719 return true 23720 } 23721 // match: (Slicemask (Const64 [0])) 23722 // cond: 23723 // result: (Const64 [0]) 23724 for { 23725 v_0 := v.Args[0] 23726 if v_0.Op != OpConst64 { 23727 break 23728 } 23729 if v_0.AuxInt != 0 { 23730 break 23731 } 23732 v.reset(OpConst64) 23733 v.AuxInt = 0 23734 return true 23735 } 23736 return false 23737 } 23738 func rewriteValuegeneric_OpSqrt_0(v *Value) bool { 23739 // match: (Sqrt (Const64F [c])) 23740 // cond: 23741 // result: (Const64F [f2i(math.Sqrt(i2f(c)))]) 23742 for { 23743 v_0 := v.Args[0] 23744 if v_0.Op != OpConst64F { 23745 break 23746 } 23747 c := v_0.AuxInt 23748 v.reset(OpConst64F) 23749 v.AuxInt = f2i(math.Sqrt(i2f(c))) 23750 return true 23751 } 23752 return false 23753 } 23754 func rewriteValuegeneric_OpStore_0(v *Value) bool { 23755 b := v.Block 23756 _ = b 23757 fe := b.Func.fe 23758 _ = fe 23759 // match: (Store {t1} p1 (Load <t2> p2 mem) mem) 23760 // cond: isSamePtr(p1, p2) && t2.Size() == t1.(*types.Type).Size() 23761 // result: mem 23762 for { 23763 t1 := v.Aux 23764 _ = v.Args[2] 23765 p1 := v.Args[0] 23766 v_1 := v.Args[1] 23767 if v_1.Op != OpLoad { 23768 break 23769 } 23770 t2 := v_1.Type 23771 _ = v_1.Args[1] 23772 p2 := v_1.Args[0] 23773 mem := v_1.Args[1] 23774 if mem != v.Args[2] { 23775 break 23776 } 23777 if !(isSamePtr(p1, p2) && t2.Size() == t1.(*types.Type).Size()) { 23778 break 23779 } 23780 v.reset(OpCopy) 23781 v.Type = mem.Type 23782 v.AddArg(mem) 23783 return true 23784 } 23785 // match: (Store {t1} (OffPtr [o1] p1) (Load <t2> (OffPtr [o1] p2) oldmem) mem:(Store {t3} (OffPtr [o3] p3) _ oldmem)) 23786 // cond: isSamePtr(p1, p2) && isSamePtr(p1, p3) && t2.Size() == t1.(*types.Type).Size() && !overlap(o1, t2.Size(), o3, t3.(*types.Type).Size()) 23787 // result: mem 23788 for { 23789 t1 := v.Aux 23790 _ = v.Args[2] 23791 v_0 := v.Args[0] 23792 if v_0.Op != OpOffPtr { 23793 break 23794 } 23795 o1 := v_0.AuxInt 23796 p1 := v_0.Args[0] 23797 v_1 := v.Args[1] 23798 if v_1.Op != OpLoad { 23799 break 23800 } 23801 t2 := v_1.Type 23802 _ = v_1.Args[1] 23803 v_1_0 := v_1.Args[0] 23804 if v_1_0.Op != OpOffPtr { 23805 break 23806 } 23807 if v_1_0.AuxInt != o1 { 23808 break 23809 } 23810 p2 := v_1_0.Args[0] 23811 oldmem := v_1.Args[1] 23812 mem := v.Args[2] 23813 if mem.Op != OpStore { 23814 break 23815 } 23816 t3 := mem.Aux 23817 _ = mem.Args[2] 23818 mem_0 := mem.Args[0] 23819 if mem_0.Op != OpOffPtr { 23820 break 23821 } 23822 o3 := mem_0.AuxInt 23823 p3 := mem_0.Args[0] 23824 if oldmem != mem.Args[2] { 23825 break 23826 } 23827 if !(isSamePtr(p1, p2) && isSamePtr(p1, p3) && t2.Size() == t1.(*types.Type).Size() && !overlap(o1, t2.Size(), o3, t3.(*types.Type).Size())) { 23828 break 23829 } 23830 v.reset(OpCopy) 23831 v.Type = mem.Type 23832 v.AddArg(mem) 23833 return true 23834 } 23835 // match: (Store {t1} (OffPtr [o1] p1) (Load <t2> (OffPtr [o1] p2) oldmem) mem:(Store {t3} (OffPtr [o3] p3) _ (Store {t4} (OffPtr [o4] p4) _ oldmem))) 23836 // 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()) 23837 // result: mem 23838 for { 23839 t1 := v.Aux 23840 _ = v.Args[2] 23841 v_0 := v.Args[0] 23842 if v_0.Op != OpOffPtr { 23843 break 23844 } 23845 o1 := v_0.AuxInt 23846 p1 := v_0.Args[0] 23847 v_1 := v.Args[1] 23848 if v_1.Op != OpLoad { 23849 break 23850 } 23851 t2 := v_1.Type 23852 _ = v_1.Args[1] 23853 v_1_0 := v_1.Args[0] 23854 if v_1_0.Op != OpOffPtr { 23855 break 23856 } 23857 if v_1_0.AuxInt != o1 { 23858 break 23859 } 23860 p2 := v_1_0.Args[0] 23861 oldmem := v_1.Args[1] 23862 mem := v.Args[2] 23863 if mem.Op != OpStore { 23864 break 23865 } 23866 t3 := mem.Aux 23867 _ = mem.Args[2] 23868 mem_0 := mem.Args[0] 23869 if mem_0.Op != OpOffPtr { 23870 break 23871 } 23872 o3 := mem_0.AuxInt 23873 p3 := mem_0.Args[0] 23874 mem_2 := mem.Args[2] 23875 if mem_2.Op != OpStore { 23876 break 23877 } 23878 t4 := mem_2.Aux 23879 _ = mem_2.Args[2] 23880 mem_2_0 := mem_2.Args[0] 23881 if mem_2_0.Op != OpOffPtr { 23882 break 23883 } 23884 o4 := mem_2_0.AuxInt 23885 p4 := mem_2_0.Args[0] 23886 if oldmem != mem_2.Args[2] { 23887 break 23888 } 23889 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())) { 23890 break 23891 } 23892 v.reset(OpCopy) 23893 v.Type = mem.Type 23894 v.AddArg(mem) 23895 return true 23896 } 23897 // 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)))) 23898 // 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()) 23899 // result: mem 23900 for { 23901 t1 := v.Aux 23902 _ = v.Args[2] 23903 v_0 := v.Args[0] 23904 if v_0.Op != OpOffPtr { 23905 break 23906 } 23907 o1 := v_0.AuxInt 23908 p1 := v_0.Args[0] 23909 v_1 := v.Args[1] 23910 if v_1.Op != OpLoad { 23911 break 23912 } 23913 t2 := v_1.Type 23914 _ = v_1.Args[1] 23915 v_1_0 := v_1.Args[0] 23916 if v_1_0.Op != OpOffPtr { 23917 break 23918 } 23919 if v_1_0.AuxInt != o1 { 23920 break 23921 } 23922 p2 := v_1_0.Args[0] 23923 oldmem := v_1.Args[1] 23924 mem := v.Args[2] 23925 if mem.Op != OpStore { 23926 break 23927 } 23928 t3 := mem.Aux 23929 _ = mem.Args[2] 23930 mem_0 := mem.Args[0] 23931 if mem_0.Op != OpOffPtr { 23932 break 23933 } 23934 o3 := mem_0.AuxInt 23935 p3 := mem_0.Args[0] 23936 mem_2 := mem.Args[2] 23937 if mem_2.Op != OpStore { 23938 break 23939 } 23940 t4 := mem_2.Aux 23941 _ = mem_2.Args[2] 23942 mem_2_0 := mem_2.Args[0] 23943 if mem_2_0.Op != OpOffPtr { 23944 break 23945 } 23946 o4 := mem_2_0.AuxInt 23947 p4 := mem_2_0.Args[0] 23948 mem_2_2 := mem_2.Args[2] 23949 if mem_2_2.Op != OpStore { 23950 break 23951 } 23952 t5 := mem_2_2.Aux 23953 _ = mem_2_2.Args[2] 23954 mem_2_2_0 := mem_2_2.Args[0] 23955 if mem_2_2_0.Op != OpOffPtr { 23956 break 23957 } 23958 o5 := mem_2_2_0.AuxInt 23959 p5 := mem_2_2_0.Args[0] 23960 if oldmem != mem_2_2.Args[2] { 23961 break 23962 } 23963 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())) { 23964 break 23965 } 23966 v.reset(OpCopy) 23967 v.Type = mem.Type 23968 v.AddArg(mem) 23969 return true 23970 } 23971 // match: (Store _ (StructMake0) mem) 23972 // cond: 23973 // result: mem 23974 for { 23975 _ = v.Args[2] 23976 v_1 := v.Args[1] 23977 if v_1.Op != OpStructMake0 { 23978 break 23979 } 23980 mem := v.Args[2] 23981 v.reset(OpCopy) 23982 v.Type = mem.Type 23983 v.AddArg(mem) 23984 return true 23985 } 23986 // match: (Store dst (StructMake1 <t> f0) mem) 23987 // cond: 23988 // result: (Store {t.FieldType(0)} (OffPtr <t.FieldType(0).PtrTo()> [0] dst) f0 mem) 23989 for { 23990 _ = v.Args[2] 23991 dst := v.Args[0] 23992 v_1 := v.Args[1] 23993 if v_1.Op != OpStructMake1 { 23994 break 23995 } 23996 t := v_1.Type 23997 f0 := v_1.Args[0] 23998 mem := v.Args[2] 23999 v.reset(OpStore) 24000 v.Aux = t.FieldType(0) 24001 v0 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 24002 v0.AuxInt = 0 24003 v0.AddArg(dst) 24004 v.AddArg(v0) 24005 v.AddArg(f0) 24006 v.AddArg(mem) 24007 return true 24008 } 24009 // match: (Store dst (StructMake2 <t> f0 f1) mem) 24010 // cond: 24011 // 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)) 24012 for { 24013 _ = v.Args[2] 24014 dst := v.Args[0] 24015 v_1 := v.Args[1] 24016 if v_1.Op != OpStructMake2 { 24017 break 24018 } 24019 t := v_1.Type 24020 _ = v_1.Args[1] 24021 f0 := v_1.Args[0] 24022 f1 := v_1.Args[1] 24023 mem := v.Args[2] 24024 v.reset(OpStore) 24025 v.Aux = t.FieldType(1) 24026 v0 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) 24027 v0.AuxInt = t.FieldOff(1) 24028 v0.AddArg(dst) 24029 v.AddArg(v0) 24030 v.AddArg(f1) 24031 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) 24032 v1.Aux = t.FieldType(0) 24033 v2 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 24034 v2.AuxInt = 0 24035 v2.AddArg(dst) 24036 v1.AddArg(v2) 24037 v1.AddArg(f0) 24038 v1.AddArg(mem) 24039 v.AddArg(v1) 24040 return true 24041 } 24042 // match: (Store dst (StructMake3 <t> f0 f1 f2) mem) 24043 // cond: 24044 // 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))) 24045 for { 24046 _ = v.Args[2] 24047 dst := v.Args[0] 24048 v_1 := v.Args[1] 24049 if v_1.Op != OpStructMake3 { 24050 break 24051 } 24052 t := v_1.Type 24053 _ = v_1.Args[2] 24054 f0 := v_1.Args[0] 24055 f1 := v_1.Args[1] 24056 f2 := v_1.Args[2] 24057 mem := v.Args[2] 24058 v.reset(OpStore) 24059 v.Aux = t.FieldType(2) 24060 v0 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(2).PtrTo()) 24061 v0.AuxInt = t.FieldOff(2) 24062 v0.AddArg(dst) 24063 v.AddArg(v0) 24064 v.AddArg(f2) 24065 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) 24066 v1.Aux = t.FieldType(1) 24067 v2 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) 24068 v2.AuxInt = t.FieldOff(1) 24069 v2.AddArg(dst) 24070 v1.AddArg(v2) 24071 v1.AddArg(f1) 24072 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem) 24073 v3.Aux = t.FieldType(0) 24074 v4 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 24075 v4.AuxInt = 0 24076 v4.AddArg(dst) 24077 v3.AddArg(v4) 24078 v3.AddArg(f0) 24079 v3.AddArg(mem) 24080 v1.AddArg(v3) 24081 v.AddArg(v1) 24082 return true 24083 } 24084 // match: (Store dst (StructMake4 <t> f0 f1 f2 f3) mem) 24085 // cond: 24086 // 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)))) 24087 for { 24088 _ = v.Args[2] 24089 dst := v.Args[0] 24090 v_1 := v.Args[1] 24091 if v_1.Op != OpStructMake4 { 24092 break 24093 } 24094 t := v_1.Type 24095 _ = v_1.Args[3] 24096 f0 := v_1.Args[0] 24097 f1 := v_1.Args[1] 24098 f2 := v_1.Args[2] 24099 f3 := v_1.Args[3] 24100 mem := v.Args[2] 24101 v.reset(OpStore) 24102 v.Aux = t.FieldType(3) 24103 v0 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(3).PtrTo()) 24104 v0.AuxInt = t.FieldOff(3) 24105 v0.AddArg(dst) 24106 v.AddArg(v0) 24107 v.AddArg(f3) 24108 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) 24109 v1.Aux = t.FieldType(2) 24110 v2 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(2).PtrTo()) 24111 v2.AuxInt = t.FieldOff(2) 24112 v2.AddArg(dst) 24113 v1.AddArg(v2) 24114 v1.AddArg(f2) 24115 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem) 24116 v3.Aux = t.FieldType(1) 24117 v4 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) 24118 v4.AuxInt = t.FieldOff(1) 24119 v4.AddArg(dst) 24120 v3.AddArg(v4) 24121 v3.AddArg(f1) 24122 v5 := b.NewValue0(v.Pos, OpStore, types.TypeMem) 24123 v5.Aux = t.FieldType(0) 24124 v6 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 24125 v6.AuxInt = 0 24126 v6.AddArg(dst) 24127 v5.AddArg(v6) 24128 v5.AddArg(f0) 24129 v5.AddArg(mem) 24130 v3.AddArg(v5) 24131 v1.AddArg(v3) 24132 v.AddArg(v1) 24133 return true 24134 } 24135 // match: (Store {t} dst (Load src mem) mem) 24136 // cond: !fe.CanSSA(t.(*types.Type)) 24137 // result: (Move {t} [t.(*types.Type).Size()] dst src mem) 24138 for { 24139 t := v.Aux 24140 _ = v.Args[2] 24141 dst := v.Args[0] 24142 v_1 := v.Args[1] 24143 if v_1.Op != OpLoad { 24144 break 24145 } 24146 _ = v_1.Args[1] 24147 src := v_1.Args[0] 24148 mem := v_1.Args[1] 24149 if mem != v.Args[2] { 24150 break 24151 } 24152 if !(!fe.CanSSA(t.(*types.Type))) { 24153 break 24154 } 24155 v.reset(OpMove) 24156 v.AuxInt = t.(*types.Type).Size() 24157 v.Aux = t 24158 v.AddArg(dst) 24159 v.AddArg(src) 24160 v.AddArg(mem) 24161 return true 24162 } 24163 return false 24164 } 24165 func rewriteValuegeneric_OpStore_10(v *Value) bool { 24166 b := v.Block 24167 _ = b 24168 config := b.Func.Config 24169 _ = config 24170 fe := b.Func.fe 24171 _ = fe 24172 // match: (Store {t} dst (Load src mem) (VarDef {x} mem)) 24173 // cond: !fe.CanSSA(t.(*types.Type)) 24174 // result: (Move {t} [t.(*types.Type).Size()] dst src (VarDef {x} mem)) 24175 for { 24176 t := v.Aux 24177 _ = v.Args[2] 24178 dst := v.Args[0] 24179 v_1 := v.Args[1] 24180 if v_1.Op != OpLoad { 24181 break 24182 } 24183 _ = v_1.Args[1] 24184 src := v_1.Args[0] 24185 mem := v_1.Args[1] 24186 v_2 := v.Args[2] 24187 if v_2.Op != OpVarDef { 24188 break 24189 } 24190 x := v_2.Aux 24191 if mem != v_2.Args[0] { 24192 break 24193 } 24194 if !(!fe.CanSSA(t.(*types.Type))) { 24195 break 24196 } 24197 v.reset(OpMove) 24198 v.AuxInt = t.(*types.Type).Size() 24199 v.Aux = t 24200 v.AddArg(dst) 24201 v.AddArg(src) 24202 v0 := b.NewValue0(v.Pos, OpVarDef, types.TypeMem) 24203 v0.Aux = x 24204 v0.AddArg(mem) 24205 v.AddArg(v0) 24206 return true 24207 } 24208 // match: (Store _ (ArrayMake0) mem) 24209 // cond: 24210 // result: mem 24211 for { 24212 _ = v.Args[2] 24213 v_1 := v.Args[1] 24214 if v_1.Op != OpArrayMake0 { 24215 break 24216 } 24217 mem := v.Args[2] 24218 v.reset(OpCopy) 24219 v.Type = mem.Type 24220 v.AddArg(mem) 24221 return true 24222 } 24223 // match: (Store dst (ArrayMake1 e) mem) 24224 // cond: 24225 // result: (Store {e.Type} dst e mem) 24226 for { 24227 _ = v.Args[2] 24228 dst := v.Args[0] 24229 v_1 := v.Args[1] 24230 if v_1.Op != OpArrayMake1 { 24231 break 24232 } 24233 e := v_1.Args[0] 24234 mem := v.Args[2] 24235 v.reset(OpStore) 24236 v.Aux = e.Type 24237 v.AddArg(dst) 24238 v.AddArg(e) 24239 v.AddArg(mem) 24240 return true 24241 } 24242 // match: (Store (Load (OffPtr [c] (SP)) mem) x mem) 24243 // cond: isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize 24244 // result: mem 24245 for { 24246 _ = v.Args[2] 24247 v_0 := v.Args[0] 24248 if v_0.Op != OpLoad { 24249 break 24250 } 24251 _ = v_0.Args[1] 24252 v_0_0 := v_0.Args[0] 24253 if v_0_0.Op != OpOffPtr { 24254 break 24255 } 24256 c := v_0_0.AuxInt 24257 v_0_0_0 := v_0_0.Args[0] 24258 if v_0_0_0.Op != OpSP { 24259 break 24260 } 24261 mem := v_0.Args[1] 24262 x := v.Args[1] 24263 if mem != v.Args[2] { 24264 break 24265 } 24266 if !(isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize) { 24267 break 24268 } 24269 v.reset(OpCopy) 24270 v.Type = mem.Type 24271 v.AddArg(mem) 24272 return true 24273 } 24274 // match: (Store (OffPtr (Load (OffPtr [c] (SP)) mem)) x mem) 24275 // cond: isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize 24276 // result: mem 24277 for { 24278 _ = v.Args[2] 24279 v_0 := v.Args[0] 24280 if v_0.Op != OpOffPtr { 24281 break 24282 } 24283 v_0_0 := v_0.Args[0] 24284 if v_0_0.Op != OpLoad { 24285 break 24286 } 24287 _ = v_0_0.Args[1] 24288 v_0_0_0 := v_0_0.Args[0] 24289 if v_0_0_0.Op != OpOffPtr { 24290 break 24291 } 24292 c := v_0_0_0.AuxInt 24293 v_0_0_0_0 := v_0_0_0.Args[0] 24294 if v_0_0_0_0.Op != OpSP { 24295 break 24296 } 24297 mem := v_0_0.Args[1] 24298 x := v.Args[1] 24299 if mem != v.Args[2] { 24300 break 24301 } 24302 if !(isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize) { 24303 break 24304 } 24305 v.reset(OpCopy) 24306 v.Type = mem.Type 24307 v.AddArg(mem) 24308 return true 24309 } 24310 return false 24311 } 24312 func rewriteValuegeneric_OpStringLen_0(v *Value) bool { 24313 // match: (StringLen (StringMake _ (Const64 <t> [c]))) 24314 // cond: 24315 // result: (Const64 <t> [c]) 24316 for { 24317 v_0 := v.Args[0] 24318 if v_0.Op != OpStringMake { 24319 break 24320 } 24321 _ = v_0.Args[1] 24322 v_0_1 := v_0.Args[1] 24323 if v_0_1.Op != OpConst64 { 24324 break 24325 } 24326 t := v_0_1.Type 24327 c := v_0_1.AuxInt 24328 v.reset(OpConst64) 24329 v.Type = t 24330 v.AuxInt = c 24331 return true 24332 } 24333 return false 24334 } 24335 func rewriteValuegeneric_OpStringPtr_0(v *Value) bool { 24336 // match: (StringPtr (StringMake (Const64 <t> [c]) _)) 24337 // cond: 24338 // result: (Const64 <t> [c]) 24339 for { 24340 v_0 := v.Args[0] 24341 if v_0.Op != OpStringMake { 24342 break 24343 } 24344 _ = v_0.Args[1] 24345 v_0_0 := v_0.Args[0] 24346 if v_0_0.Op != OpConst64 { 24347 break 24348 } 24349 t := v_0_0.Type 24350 c := v_0_0.AuxInt 24351 v.reset(OpConst64) 24352 v.Type = t 24353 v.AuxInt = c 24354 return true 24355 } 24356 return false 24357 } 24358 func rewriteValuegeneric_OpStructSelect_0(v *Value) bool { 24359 // match: (StructSelect (StructMake1 x)) 24360 // cond: 24361 // result: x 24362 for { 24363 v_0 := v.Args[0] 24364 if v_0.Op != OpStructMake1 { 24365 break 24366 } 24367 x := v_0.Args[0] 24368 v.reset(OpCopy) 24369 v.Type = x.Type 24370 v.AddArg(x) 24371 return true 24372 } 24373 // match: (StructSelect [0] (StructMake2 x _)) 24374 // cond: 24375 // result: x 24376 for { 24377 if v.AuxInt != 0 { 24378 break 24379 } 24380 v_0 := v.Args[0] 24381 if v_0.Op != OpStructMake2 { 24382 break 24383 } 24384 _ = v_0.Args[1] 24385 x := v_0.Args[0] 24386 v.reset(OpCopy) 24387 v.Type = x.Type 24388 v.AddArg(x) 24389 return true 24390 } 24391 // match: (StructSelect [1] (StructMake2 _ x)) 24392 // cond: 24393 // result: x 24394 for { 24395 if v.AuxInt != 1 { 24396 break 24397 } 24398 v_0 := v.Args[0] 24399 if v_0.Op != OpStructMake2 { 24400 break 24401 } 24402 _ = v_0.Args[1] 24403 x := v_0.Args[1] 24404 v.reset(OpCopy) 24405 v.Type = x.Type 24406 v.AddArg(x) 24407 return true 24408 } 24409 // match: (StructSelect [0] (StructMake3 x _ _)) 24410 // cond: 24411 // result: x 24412 for { 24413 if v.AuxInt != 0 { 24414 break 24415 } 24416 v_0 := v.Args[0] 24417 if v_0.Op != OpStructMake3 { 24418 break 24419 } 24420 _ = v_0.Args[2] 24421 x := v_0.Args[0] 24422 v.reset(OpCopy) 24423 v.Type = x.Type 24424 v.AddArg(x) 24425 return true 24426 } 24427 // match: (StructSelect [1] (StructMake3 _ x _)) 24428 // cond: 24429 // result: x 24430 for { 24431 if v.AuxInt != 1 { 24432 break 24433 } 24434 v_0 := v.Args[0] 24435 if v_0.Op != OpStructMake3 { 24436 break 24437 } 24438 _ = v_0.Args[2] 24439 x := v_0.Args[1] 24440 v.reset(OpCopy) 24441 v.Type = x.Type 24442 v.AddArg(x) 24443 return true 24444 } 24445 // match: (StructSelect [2] (StructMake3 _ _ x)) 24446 // cond: 24447 // result: x 24448 for { 24449 if v.AuxInt != 2 { 24450 break 24451 } 24452 v_0 := v.Args[0] 24453 if v_0.Op != OpStructMake3 { 24454 break 24455 } 24456 _ = v_0.Args[2] 24457 x := v_0.Args[2] 24458 v.reset(OpCopy) 24459 v.Type = x.Type 24460 v.AddArg(x) 24461 return true 24462 } 24463 // match: (StructSelect [0] (StructMake4 x _ _ _)) 24464 // cond: 24465 // result: x 24466 for { 24467 if v.AuxInt != 0 { 24468 break 24469 } 24470 v_0 := v.Args[0] 24471 if v_0.Op != OpStructMake4 { 24472 break 24473 } 24474 _ = v_0.Args[3] 24475 x := v_0.Args[0] 24476 v.reset(OpCopy) 24477 v.Type = x.Type 24478 v.AddArg(x) 24479 return true 24480 } 24481 // match: (StructSelect [1] (StructMake4 _ x _ _)) 24482 // cond: 24483 // result: x 24484 for { 24485 if v.AuxInt != 1 { 24486 break 24487 } 24488 v_0 := v.Args[0] 24489 if v_0.Op != OpStructMake4 { 24490 break 24491 } 24492 _ = v_0.Args[3] 24493 x := v_0.Args[1] 24494 v.reset(OpCopy) 24495 v.Type = x.Type 24496 v.AddArg(x) 24497 return true 24498 } 24499 // match: (StructSelect [2] (StructMake4 _ _ x _)) 24500 // cond: 24501 // result: x 24502 for { 24503 if v.AuxInt != 2 { 24504 break 24505 } 24506 v_0 := v.Args[0] 24507 if v_0.Op != OpStructMake4 { 24508 break 24509 } 24510 _ = v_0.Args[3] 24511 x := v_0.Args[2] 24512 v.reset(OpCopy) 24513 v.Type = x.Type 24514 v.AddArg(x) 24515 return true 24516 } 24517 // match: (StructSelect [3] (StructMake4 _ _ _ x)) 24518 // cond: 24519 // result: x 24520 for { 24521 if v.AuxInt != 3 { 24522 break 24523 } 24524 v_0 := v.Args[0] 24525 if v_0.Op != OpStructMake4 { 24526 break 24527 } 24528 _ = v_0.Args[3] 24529 x := v_0.Args[3] 24530 v.reset(OpCopy) 24531 v.Type = x.Type 24532 v.AddArg(x) 24533 return true 24534 } 24535 return false 24536 } 24537 func rewriteValuegeneric_OpStructSelect_10(v *Value) bool { 24538 b := v.Block 24539 _ = b 24540 fe := b.Func.fe 24541 _ = fe 24542 // match: (StructSelect [i] x:(Load <t> ptr mem)) 24543 // cond: !fe.CanSSA(t) 24544 // result: @x.Block (Load <v.Type> (OffPtr <v.Type.PtrTo()> [t.FieldOff(int(i))] ptr) mem) 24545 for { 24546 i := v.AuxInt 24547 x := v.Args[0] 24548 if x.Op != OpLoad { 24549 break 24550 } 24551 t := x.Type 24552 _ = x.Args[1] 24553 ptr := x.Args[0] 24554 mem := x.Args[1] 24555 if !(!fe.CanSSA(t)) { 24556 break 24557 } 24558 b = x.Block 24559 v0 := b.NewValue0(v.Pos, OpLoad, v.Type) 24560 v.reset(OpCopy) 24561 v.AddArg(v0) 24562 v1 := b.NewValue0(v.Pos, OpOffPtr, v.Type.PtrTo()) 24563 v1.AuxInt = t.FieldOff(int(i)) 24564 v1.AddArg(ptr) 24565 v0.AddArg(v1) 24566 v0.AddArg(mem) 24567 return true 24568 } 24569 // match: (StructSelect [0] x:(IData _)) 24570 // cond: 24571 // result: x 24572 for { 24573 if v.AuxInt != 0 { 24574 break 24575 } 24576 x := v.Args[0] 24577 if x.Op != OpIData { 24578 break 24579 } 24580 v.reset(OpCopy) 24581 v.Type = x.Type 24582 v.AddArg(x) 24583 return true 24584 } 24585 return false 24586 } 24587 func rewriteValuegeneric_OpSub16_0(v *Value) bool { 24588 b := v.Block 24589 _ = b 24590 // match: (Sub16 (Const16 [c]) (Const16 [d])) 24591 // cond: 24592 // result: (Const16 [int64(int16(c-d))]) 24593 for { 24594 _ = v.Args[1] 24595 v_0 := v.Args[0] 24596 if v_0.Op != OpConst16 { 24597 break 24598 } 24599 c := v_0.AuxInt 24600 v_1 := v.Args[1] 24601 if v_1.Op != OpConst16 { 24602 break 24603 } 24604 d := v_1.AuxInt 24605 v.reset(OpConst16) 24606 v.AuxInt = int64(int16(c - d)) 24607 return true 24608 } 24609 // match: (Sub16 x (Const16 <t> [c])) 24610 // cond: x.Op != OpConst16 24611 // result: (Add16 (Const16 <t> [int64(int16(-c))]) x) 24612 for { 24613 _ = v.Args[1] 24614 x := v.Args[0] 24615 v_1 := v.Args[1] 24616 if v_1.Op != OpConst16 { 24617 break 24618 } 24619 t := v_1.Type 24620 c := v_1.AuxInt 24621 if !(x.Op != OpConst16) { 24622 break 24623 } 24624 v.reset(OpAdd16) 24625 v0 := b.NewValue0(v.Pos, OpConst16, t) 24626 v0.AuxInt = int64(int16(-c)) 24627 v.AddArg(v0) 24628 v.AddArg(x) 24629 return true 24630 } 24631 // match: (Sub16 <t> (Mul16 x y) (Mul16 x z)) 24632 // cond: 24633 // result: (Mul16 x (Sub16 <t> y z)) 24634 for { 24635 t := v.Type 24636 _ = v.Args[1] 24637 v_0 := v.Args[0] 24638 if v_0.Op != OpMul16 { 24639 break 24640 } 24641 _ = v_0.Args[1] 24642 x := v_0.Args[0] 24643 y := v_0.Args[1] 24644 v_1 := v.Args[1] 24645 if v_1.Op != OpMul16 { 24646 break 24647 } 24648 _ = v_1.Args[1] 24649 if x != v_1.Args[0] { 24650 break 24651 } 24652 z := v_1.Args[1] 24653 v.reset(OpMul16) 24654 v.AddArg(x) 24655 v0 := b.NewValue0(v.Pos, OpSub16, t) 24656 v0.AddArg(y) 24657 v0.AddArg(z) 24658 v.AddArg(v0) 24659 return true 24660 } 24661 // match: (Sub16 <t> (Mul16 y x) (Mul16 x z)) 24662 // cond: 24663 // result: (Mul16 x (Sub16 <t> y z)) 24664 for { 24665 t := v.Type 24666 _ = v.Args[1] 24667 v_0 := v.Args[0] 24668 if v_0.Op != OpMul16 { 24669 break 24670 } 24671 _ = v_0.Args[1] 24672 y := v_0.Args[0] 24673 x := v_0.Args[1] 24674 v_1 := v.Args[1] 24675 if v_1.Op != OpMul16 { 24676 break 24677 } 24678 _ = v_1.Args[1] 24679 if x != v_1.Args[0] { 24680 break 24681 } 24682 z := v_1.Args[1] 24683 v.reset(OpMul16) 24684 v.AddArg(x) 24685 v0 := b.NewValue0(v.Pos, OpSub16, t) 24686 v0.AddArg(y) 24687 v0.AddArg(z) 24688 v.AddArg(v0) 24689 return true 24690 } 24691 // match: (Sub16 <t> (Mul16 x y) (Mul16 z x)) 24692 // cond: 24693 // result: (Mul16 x (Sub16 <t> y z)) 24694 for { 24695 t := v.Type 24696 _ = v.Args[1] 24697 v_0 := v.Args[0] 24698 if v_0.Op != OpMul16 { 24699 break 24700 } 24701 _ = v_0.Args[1] 24702 x := v_0.Args[0] 24703 y := v_0.Args[1] 24704 v_1 := v.Args[1] 24705 if v_1.Op != OpMul16 { 24706 break 24707 } 24708 _ = v_1.Args[1] 24709 z := v_1.Args[0] 24710 if x != v_1.Args[1] { 24711 break 24712 } 24713 v.reset(OpMul16) 24714 v.AddArg(x) 24715 v0 := b.NewValue0(v.Pos, OpSub16, t) 24716 v0.AddArg(y) 24717 v0.AddArg(z) 24718 v.AddArg(v0) 24719 return true 24720 } 24721 // match: (Sub16 <t> (Mul16 y x) (Mul16 z x)) 24722 // cond: 24723 // result: (Mul16 x (Sub16 <t> y z)) 24724 for { 24725 t := v.Type 24726 _ = v.Args[1] 24727 v_0 := v.Args[0] 24728 if v_0.Op != OpMul16 { 24729 break 24730 } 24731 _ = v_0.Args[1] 24732 y := v_0.Args[0] 24733 x := v_0.Args[1] 24734 v_1 := v.Args[1] 24735 if v_1.Op != OpMul16 { 24736 break 24737 } 24738 _ = v_1.Args[1] 24739 z := v_1.Args[0] 24740 if x != v_1.Args[1] { 24741 break 24742 } 24743 v.reset(OpMul16) 24744 v.AddArg(x) 24745 v0 := b.NewValue0(v.Pos, OpSub16, t) 24746 v0.AddArg(y) 24747 v0.AddArg(z) 24748 v.AddArg(v0) 24749 return true 24750 } 24751 // match: (Sub16 x x) 24752 // cond: 24753 // result: (Const16 [0]) 24754 for { 24755 _ = v.Args[1] 24756 x := v.Args[0] 24757 if x != v.Args[1] { 24758 break 24759 } 24760 v.reset(OpConst16) 24761 v.AuxInt = 0 24762 return true 24763 } 24764 // match: (Sub16 (Add16 x y) x) 24765 // cond: 24766 // result: y 24767 for { 24768 _ = v.Args[1] 24769 v_0 := v.Args[0] 24770 if v_0.Op != OpAdd16 { 24771 break 24772 } 24773 _ = v_0.Args[1] 24774 x := v_0.Args[0] 24775 y := v_0.Args[1] 24776 if x != v.Args[1] { 24777 break 24778 } 24779 v.reset(OpCopy) 24780 v.Type = y.Type 24781 v.AddArg(y) 24782 return true 24783 } 24784 // match: (Sub16 (Add16 y x) x) 24785 // cond: 24786 // result: y 24787 for { 24788 _ = v.Args[1] 24789 v_0 := v.Args[0] 24790 if v_0.Op != OpAdd16 { 24791 break 24792 } 24793 _ = v_0.Args[1] 24794 y := v_0.Args[0] 24795 x := v_0.Args[1] 24796 if x != v.Args[1] { 24797 break 24798 } 24799 v.reset(OpCopy) 24800 v.Type = y.Type 24801 v.AddArg(y) 24802 return true 24803 } 24804 // match: (Sub16 (Add16 x y) y) 24805 // cond: 24806 // result: x 24807 for { 24808 _ = v.Args[1] 24809 v_0 := v.Args[0] 24810 if v_0.Op != OpAdd16 { 24811 break 24812 } 24813 _ = v_0.Args[1] 24814 x := v_0.Args[0] 24815 y := v_0.Args[1] 24816 if y != v.Args[1] { 24817 break 24818 } 24819 v.reset(OpCopy) 24820 v.Type = x.Type 24821 v.AddArg(x) 24822 return true 24823 } 24824 return false 24825 } 24826 func rewriteValuegeneric_OpSub16_10(v *Value) bool { 24827 b := v.Block 24828 _ = b 24829 // match: (Sub16 (Add16 y x) y) 24830 // cond: 24831 // result: x 24832 for { 24833 _ = v.Args[1] 24834 v_0 := v.Args[0] 24835 if v_0.Op != OpAdd16 { 24836 break 24837 } 24838 _ = v_0.Args[1] 24839 y := v_0.Args[0] 24840 x := v_0.Args[1] 24841 if y != v.Args[1] { 24842 break 24843 } 24844 v.reset(OpCopy) 24845 v.Type = x.Type 24846 v.AddArg(x) 24847 return true 24848 } 24849 // match: (Sub16 x (Sub16 i:(Const16 <t>) z)) 24850 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 24851 // result: (Sub16 (Add16 <t> x z) i) 24852 for { 24853 _ = v.Args[1] 24854 x := v.Args[0] 24855 v_1 := v.Args[1] 24856 if v_1.Op != OpSub16 { 24857 break 24858 } 24859 _ = v_1.Args[1] 24860 i := v_1.Args[0] 24861 if i.Op != OpConst16 { 24862 break 24863 } 24864 t := i.Type 24865 z := v_1.Args[1] 24866 if !(z.Op != OpConst16 && x.Op != OpConst16) { 24867 break 24868 } 24869 v.reset(OpSub16) 24870 v0 := b.NewValue0(v.Pos, OpAdd16, t) 24871 v0.AddArg(x) 24872 v0.AddArg(z) 24873 v.AddArg(v0) 24874 v.AddArg(i) 24875 return true 24876 } 24877 // match: (Sub16 x (Sub16 z i:(Const16 <t>))) 24878 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 24879 // result: (Add16 i (Sub16 <t> x z)) 24880 for { 24881 _ = v.Args[1] 24882 x := v.Args[0] 24883 v_1 := v.Args[1] 24884 if v_1.Op != OpSub16 { 24885 break 24886 } 24887 _ = v_1.Args[1] 24888 z := v_1.Args[0] 24889 i := v_1.Args[1] 24890 if i.Op != OpConst16 { 24891 break 24892 } 24893 t := i.Type 24894 if !(z.Op != OpConst16 && x.Op != OpConst16) { 24895 break 24896 } 24897 v.reset(OpAdd16) 24898 v.AddArg(i) 24899 v0 := b.NewValue0(v.Pos, OpSub16, t) 24900 v0.AddArg(x) 24901 v0.AddArg(z) 24902 v.AddArg(v0) 24903 return true 24904 } 24905 // match: (Sub16 (Const16 <t> [c]) (Sub16 x (Const16 <t> [d]))) 24906 // cond: 24907 // result: (Sub16 (Const16 <t> [int64(int16(c+d))]) x) 24908 for { 24909 _ = v.Args[1] 24910 v_0 := v.Args[0] 24911 if v_0.Op != OpConst16 { 24912 break 24913 } 24914 t := v_0.Type 24915 c := v_0.AuxInt 24916 v_1 := v.Args[1] 24917 if v_1.Op != OpSub16 { 24918 break 24919 } 24920 _ = v_1.Args[1] 24921 x := v_1.Args[0] 24922 v_1_1 := v_1.Args[1] 24923 if v_1_1.Op != OpConst16 { 24924 break 24925 } 24926 if v_1_1.Type != t { 24927 break 24928 } 24929 d := v_1_1.AuxInt 24930 v.reset(OpSub16) 24931 v0 := b.NewValue0(v.Pos, OpConst16, t) 24932 v0.AuxInt = int64(int16(c + d)) 24933 v.AddArg(v0) 24934 v.AddArg(x) 24935 return true 24936 } 24937 // match: (Sub16 (Const16 <t> [c]) (Sub16 (Const16 <t> [d]) x)) 24938 // cond: 24939 // result: (Add16 (Const16 <t> [int64(int16(c-d))]) x) 24940 for { 24941 _ = v.Args[1] 24942 v_0 := v.Args[0] 24943 if v_0.Op != OpConst16 { 24944 break 24945 } 24946 t := v_0.Type 24947 c := v_0.AuxInt 24948 v_1 := v.Args[1] 24949 if v_1.Op != OpSub16 { 24950 break 24951 } 24952 _ = v_1.Args[1] 24953 v_1_0 := v_1.Args[0] 24954 if v_1_0.Op != OpConst16 { 24955 break 24956 } 24957 if v_1_0.Type != t { 24958 break 24959 } 24960 d := v_1_0.AuxInt 24961 x := v_1.Args[1] 24962 v.reset(OpAdd16) 24963 v0 := b.NewValue0(v.Pos, OpConst16, t) 24964 v0.AuxInt = int64(int16(c - d)) 24965 v.AddArg(v0) 24966 v.AddArg(x) 24967 return true 24968 } 24969 return false 24970 } 24971 func rewriteValuegeneric_OpSub32_0(v *Value) bool { 24972 b := v.Block 24973 _ = b 24974 // match: (Sub32 (Const32 [c]) (Const32 [d])) 24975 // cond: 24976 // result: (Const32 [int64(int32(c-d))]) 24977 for { 24978 _ = v.Args[1] 24979 v_0 := v.Args[0] 24980 if v_0.Op != OpConst32 { 24981 break 24982 } 24983 c := v_0.AuxInt 24984 v_1 := v.Args[1] 24985 if v_1.Op != OpConst32 { 24986 break 24987 } 24988 d := v_1.AuxInt 24989 v.reset(OpConst32) 24990 v.AuxInt = int64(int32(c - d)) 24991 return true 24992 } 24993 // match: (Sub32 x (Const32 <t> [c])) 24994 // cond: x.Op != OpConst32 24995 // result: (Add32 (Const32 <t> [int64(int32(-c))]) x) 24996 for { 24997 _ = v.Args[1] 24998 x := v.Args[0] 24999 v_1 := v.Args[1] 25000 if v_1.Op != OpConst32 { 25001 break 25002 } 25003 t := v_1.Type 25004 c := v_1.AuxInt 25005 if !(x.Op != OpConst32) { 25006 break 25007 } 25008 v.reset(OpAdd32) 25009 v0 := b.NewValue0(v.Pos, OpConst32, t) 25010 v0.AuxInt = int64(int32(-c)) 25011 v.AddArg(v0) 25012 v.AddArg(x) 25013 return true 25014 } 25015 // match: (Sub32 <t> (Mul32 x y) (Mul32 x z)) 25016 // cond: 25017 // result: (Mul32 x (Sub32 <t> y z)) 25018 for { 25019 t := v.Type 25020 _ = v.Args[1] 25021 v_0 := v.Args[0] 25022 if v_0.Op != OpMul32 { 25023 break 25024 } 25025 _ = v_0.Args[1] 25026 x := v_0.Args[0] 25027 y := v_0.Args[1] 25028 v_1 := v.Args[1] 25029 if v_1.Op != OpMul32 { 25030 break 25031 } 25032 _ = v_1.Args[1] 25033 if x != v_1.Args[0] { 25034 break 25035 } 25036 z := v_1.Args[1] 25037 v.reset(OpMul32) 25038 v.AddArg(x) 25039 v0 := b.NewValue0(v.Pos, OpSub32, t) 25040 v0.AddArg(y) 25041 v0.AddArg(z) 25042 v.AddArg(v0) 25043 return true 25044 } 25045 // match: (Sub32 <t> (Mul32 y x) (Mul32 x z)) 25046 // cond: 25047 // result: (Mul32 x (Sub32 <t> y z)) 25048 for { 25049 t := v.Type 25050 _ = v.Args[1] 25051 v_0 := v.Args[0] 25052 if v_0.Op != OpMul32 { 25053 break 25054 } 25055 _ = v_0.Args[1] 25056 y := v_0.Args[0] 25057 x := v_0.Args[1] 25058 v_1 := v.Args[1] 25059 if v_1.Op != OpMul32 { 25060 break 25061 } 25062 _ = v_1.Args[1] 25063 if x != v_1.Args[0] { 25064 break 25065 } 25066 z := v_1.Args[1] 25067 v.reset(OpMul32) 25068 v.AddArg(x) 25069 v0 := b.NewValue0(v.Pos, OpSub32, t) 25070 v0.AddArg(y) 25071 v0.AddArg(z) 25072 v.AddArg(v0) 25073 return true 25074 } 25075 // match: (Sub32 <t> (Mul32 x y) (Mul32 z x)) 25076 // cond: 25077 // result: (Mul32 x (Sub32 <t> y z)) 25078 for { 25079 t := v.Type 25080 _ = v.Args[1] 25081 v_0 := v.Args[0] 25082 if v_0.Op != OpMul32 { 25083 break 25084 } 25085 _ = v_0.Args[1] 25086 x := v_0.Args[0] 25087 y := v_0.Args[1] 25088 v_1 := v.Args[1] 25089 if v_1.Op != OpMul32 { 25090 break 25091 } 25092 _ = v_1.Args[1] 25093 z := v_1.Args[0] 25094 if x != v_1.Args[1] { 25095 break 25096 } 25097 v.reset(OpMul32) 25098 v.AddArg(x) 25099 v0 := b.NewValue0(v.Pos, OpSub32, t) 25100 v0.AddArg(y) 25101 v0.AddArg(z) 25102 v.AddArg(v0) 25103 return true 25104 } 25105 // match: (Sub32 <t> (Mul32 y x) (Mul32 z x)) 25106 // cond: 25107 // result: (Mul32 x (Sub32 <t> y z)) 25108 for { 25109 t := v.Type 25110 _ = v.Args[1] 25111 v_0 := v.Args[0] 25112 if v_0.Op != OpMul32 { 25113 break 25114 } 25115 _ = v_0.Args[1] 25116 y := v_0.Args[0] 25117 x := v_0.Args[1] 25118 v_1 := v.Args[1] 25119 if v_1.Op != OpMul32 { 25120 break 25121 } 25122 _ = v_1.Args[1] 25123 z := v_1.Args[0] 25124 if x != v_1.Args[1] { 25125 break 25126 } 25127 v.reset(OpMul32) 25128 v.AddArg(x) 25129 v0 := b.NewValue0(v.Pos, OpSub32, t) 25130 v0.AddArg(y) 25131 v0.AddArg(z) 25132 v.AddArg(v0) 25133 return true 25134 } 25135 // match: (Sub32 x x) 25136 // cond: 25137 // result: (Const32 [0]) 25138 for { 25139 _ = v.Args[1] 25140 x := v.Args[0] 25141 if x != v.Args[1] { 25142 break 25143 } 25144 v.reset(OpConst32) 25145 v.AuxInt = 0 25146 return true 25147 } 25148 // match: (Sub32 (Add32 x y) x) 25149 // cond: 25150 // result: y 25151 for { 25152 _ = v.Args[1] 25153 v_0 := v.Args[0] 25154 if v_0.Op != OpAdd32 { 25155 break 25156 } 25157 _ = v_0.Args[1] 25158 x := v_0.Args[0] 25159 y := v_0.Args[1] 25160 if x != v.Args[1] { 25161 break 25162 } 25163 v.reset(OpCopy) 25164 v.Type = y.Type 25165 v.AddArg(y) 25166 return true 25167 } 25168 // match: (Sub32 (Add32 y x) x) 25169 // cond: 25170 // result: y 25171 for { 25172 _ = v.Args[1] 25173 v_0 := v.Args[0] 25174 if v_0.Op != OpAdd32 { 25175 break 25176 } 25177 _ = v_0.Args[1] 25178 y := v_0.Args[0] 25179 x := v_0.Args[1] 25180 if x != v.Args[1] { 25181 break 25182 } 25183 v.reset(OpCopy) 25184 v.Type = y.Type 25185 v.AddArg(y) 25186 return true 25187 } 25188 // match: (Sub32 (Add32 x y) y) 25189 // cond: 25190 // result: x 25191 for { 25192 _ = v.Args[1] 25193 v_0 := v.Args[0] 25194 if v_0.Op != OpAdd32 { 25195 break 25196 } 25197 _ = v_0.Args[1] 25198 x := v_0.Args[0] 25199 y := v_0.Args[1] 25200 if y != v.Args[1] { 25201 break 25202 } 25203 v.reset(OpCopy) 25204 v.Type = x.Type 25205 v.AddArg(x) 25206 return true 25207 } 25208 return false 25209 } 25210 func rewriteValuegeneric_OpSub32_10(v *Value) bool { 25211 b := v.Block 25212 _ = b 25213 // match: (Sub32 (Add32 y x) y) 25214 // cond: 25215 // result: x 25216 for { 25217 _ = v.Args[1] 25218 v_0 := v.Args[0] 25219 if v_0.Op != OpAdd32 { 25220 break 25221 } 25222 _ = v_0.Args[1] 25223 y := v_0.Args[0] 25224 x := v_0.Args[1] 25225 if y != v.Args[1] { 25226 break 25227 } 25228 v.reset(OpCopy) 25229 v.Type = x.Type 25230 v.AddArg(x) 25231 return true 25232 } 25233 // match: (Sub32 x (Sub32 i:(Const32 <t>) z)) 25234 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 25235 // result: (Sub32 (Add32 <t> x z) i) 25236 for { 25237 _ = v.Args[1] 25238 x := v.Args[0] 25239 v_1 := v.Args[1] 25240 if v_1.Op != OpSub32 { 25241 break 25242 } 25243 _ = v_1.Args[1] 25244 i := v_1.Args[0] 25245 if i.Op != OpConst32 { 25246 break 25247 } 25248 t := i.Type 25249 z := v_1.Args[1] 25250 if !(z.Op != OpConst32 && x.Op != OpConst32) { 25251 break 25252 } 25253 v.reset(OpSub32) 25254 v0 := b.NewValue0(v.Pos, OpAdd32, t) 25255 v0.AddArg(x) 25256 v0.AddArg(z) 25257 v.AddArg(v0) 25258 v.AddArg(i) 25259 return true 25260 } 25261 // match: (Sub32 x (Sub32 z i:(Const32 <t>))) 25262 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 25263 // result: (Add32 i (Sub32 <t> x z)) 25264 for { 25265 _ = v.Args[1] 25266 x := v.Args[0] 25267 v_1 := v.Args[1] 25268 if v_1.Op != OpSub32 { 25269 break 25270 } 25271 _ = v_1.Args[1] 25272 z := v_1.Args[0] 25273 i := v_1.Args[1] 25274 if i.Op != OpConst32 { 25275 break 25276 } 25277 t := i.Type 25278 if !(z.Op != OpConst32 && x.Op != OpConst32) { 25279 break 25280 } 25281 v.reset(OpAdd32) 25282 v.AddArg(i) 25283 v0 := b.NewValue0(v.Pos, OpSub32, t) 25284 v0.AddArg(x) 25285 v0.AddArg(z) 25286 v.AddArg(v0) 25287 return true 25288 } 25289 // match: (Sub32 (Const32 <t> [c]) (Sub32 x (Const32 <t> [d]))) 25290 // cond: 25291 // result: (Sub32 (Const32 <t> [int64(int32(c+d))]) x) 25292 for { 25293 _ = v.Args[1] 25294 v_0 := v.Args[0] 25295 if v_0.Op != OpConst32 { 25296 break 25297 } 25298 t := v_0.Type 25299 c := v_0.AuxInt 25300 v_1 := v.Args[1] 25301 if v_1.Op != OpSub32 { 25302 break 25303 } 25304 _ = v_1.Args[1] 25305 x := v_1.Args[0] 25306 v_1_1 := v_1.Args[1] 25307 if v_1_1.Op != OpConst32 { 25308 break 25309 } 25310 if v_1_1.Type != t { 25311 break 25312 } 25313 d := v_1_1.AuxInt 25314 v.reset(OpSub32) 25315 v0 := b.NewValue0(v.Pos, OpConst32, t) 25316 v0.AuxInt = int64(int32(c + d)) 25317 v.AddArg(v0) 25318 v.AddArg(x) 25319 return true 25320 } 25321 // match: (Sub32 (Const32 <t> [c]) (Sub32 (Const32 <t> [d]) x)) 25322 // cond: 25323 // result: (Add32 (Const32 <t> [int64(int32(c-d))]) x) 25324 for { 25325 _ = v.Args[1] 25326 v_0 := v.Args[0] 25327 if v_0.Op != OpConst32 { 25328 break 25329 } 25330 t := v_0.Type 25331 c := v_0.AuxInt 25332 v_1 := v.Args[1] 25333 if v_1.Op != OpSub32 { 25334 break 25335 } 25336 _ = v_1.Args[1] 25337 v_1_0 := v_1.Args[0] 25338 if v_1_0.Op != OpConst32 { 25339 break 25340 } 25341 if v_1_0.Type != t { 25342 break 25343 } 25344 d := v_1_0.AuxInt 25345 x := v_1.Args[1] 25346 v.reset(OpAdd32) 25347 v0 := b.NewValue0(v.Pos, OpConst32, t) 25348 v0.AuxInt = int64(int32(c - d)) 25349 v.AddArg(v0) 25350 v.AddArg(x) 25351 return true 25352 } 25353 return false 25354 } 25355 func rewriteValuegeneric_OpSub32F_0(v *Value) bool { 25356 // match: (Sub32F (Const32F [c]) (Const32F [d])) 25357 // cond: 25358 // result: (Const32F [f2i(float64(i2f32(c) - i2f32(d)))]) 25359 for { 25360 _ = v.Args[1] 25361 v_0 := v.Args[0] 25362 if v_0.Op != OpConst32F { 25363 break 25364 } 25365 c := v_0.AuxInt 25366 v_1 := v.Args[1] 25367 if v_1.Op != OpConst32F { 25368 break 25369 } 25370 d := v_1.AuxInt 25371 v.reset(OpConst32F) 25372 v.AuxInt = f2i(float64(i2f32(c) - i2f32(d))) 25373 return true 25374 } 25375 // match: (Sub32F x (Const32F [0])) 25376 // cond: 25377 // result: x 25378 for { 25379 _ = v.Args[1] 25380 x := v.Args[0] 25381 v_1 := v.Args[1] 25382 if v_1.Op != OpConst32F { 25383 break 25384 } 25385 if v_1.AuxInt != 0 { 25386 break 25387 } 25388 v.reset(OpCopy) 25389 v.Type = x.Type 25390 v.AddArg(x) 25391 return true 25392 } 25393 return false 25394 } 25395 func rewriteValuegeneric_OpSub64_0(v *Value) bool { 25396 b := v.Block 25397 _ = b 25398 // match: (Sub64 (Const64 [c]) (Const64 [d])) 25399 // cond: 25400 // result: (Const64 [c-d]) 25401 for { 25402 _ = v.Args[1] 25403 v_0 := v.Args[0] 25404 if v_0.Op != OpConst64 { 25405 break 25406 } 25407 c := v_0.AuxInt 25408 v_1 := v.Args[1] 25409 if v_1.Op != OpConst64 { 25410 break 25411 } 25412 d := v_1.AuxInt 25413 v.reset(OpConst64) 25414 v.AuxInt = c - d 25415 return true 25416 } 25417 // match: (Sub64 x (Const64 <t> [c])) 25418 // cond: x.Op != OpConst64 25419 // result: (Add64 (Const64 <t> [-c]) x) 25420 for { 25421 _ = v.Args[1] 25422 x := v.Args[0] 25423 v_1 := v.Args[1] 25424 if v_1.Op != OpConst64 { 25425 break 25426 } 25427 t := v_1.Type 25428 c := v_1.AuxInt 25429 if !(x.Op != OpConst64) { 25430 break 25431 } 25432 v.reset(OpAdd64) 25433 v0 := b.NewValue0(v.Pos, OpConst64, t) 25434 v0.AuxInt = -c 25435 v.AddArg(v0) 25436 v.AddArg(x) 25437 return true 25438 } 25439 // match: (Sub64 <t> (Mul64 x y) (Mul64 x z)) 25440 // cond: 25441 // result: (Mul64 x (Sub64 <t> y z)) 25442 for { 25443 t := v.Type 25444 _ = v.Args[1] 25445 v_0 := v.Args[0] 25446 if v_0.Op != OpMul64 { 25447 break 25448 } 25449 _ = v_0.Args[1] 25450 x := v_0.Args[0] 25451 y := v_0.Args[1] 25452 v_1 := v.Args[1] 25453 if v_1.Op != OpMul64 { 25454 break 25455 } 25456 _ = v_1.Args[1] 25457 if x != v_1.Args[0] { 25458 break 25459 } 25460 z := v_1.Args[1] 25461 v.reset(OpMul64) 25462 v.AddArg(x) 25463 v0 := b.NewValue0(v.Pos, OpSub64, t) 25464 v0.AddArg(y) 25465 v0.AddArg(z) 25466 v.AddArg(v0) 25467 return true 25468 } 25469 // match: (Sub64 <t> (Mul64 y x) (Mul64 x z)) 25470 // cond: 25471 // result: (Mul64 x (Sub64 <t> y z)) 25472 for { 25473 t := v.Type 25474 _ = v.Args[1] 25475 v_0 := v.Args[0] 25476 if v_0.Op != OpMul64 { 25477 break 25478 } 25479 _ = v_0.Args[1] 25480 y := v_0.Args[0] 25481 x := v_0.Args[1] 25482 v_1 := v.Args[1] 25483 if v_1.Op != OpMul64 { 25484 break 25485 } 25486 _ = v_1.Args[1] 25487 if x != v_1.Args[0] { 25488 break 25489 } 25490 z := v_1.Args[1] 25491 v.reset(OpMul64) 25492 v.AddArg(x) 25493 v0 := b.NewValue0(v.Pos, OpSub64, t) 25494 v0.AddArg(y) 25495 v0.AddArg(z) 25496 v.AddArg(v0) 25497 return true 25498 } 25499 // match: (Sub64 <t> (Mul64 x y) (Mul64 z x)) 25500 // cond: 25501 // result: (Mul64 x (Sub64 <t> y z)) 25502 for { 25503 t := v.Type 25504 _ = v.Args[1] 25505 v_0 := v.Args[0] 25506 if v_0.Op != OpMul64 { 25507 break 25508 } 25509 _ = v_0.Args[1] 25510 x := v_0.Args[0] 25511 y := v_0.Args[1] 25512 v_1 := v.Args[1] 25513 if v_1.Op != OpMul64 { 25514 break 25515 } 25516 _ = v_1.Args[1] 25517 z := v_1.Args[0] 25518 if x != v_1.Args[1] { 25519 break 25520 } 25521 v.reset(OpMul64) 25522 v.AddArg(x) 25523 v0 := b.NewValue0(v.Pos, OpSub64, t) 25524 v0.AddArg(y) 25525 v0.AddArg(z) 25526 v.AddArg(v0) 25527 return true 25528 } 25529 // match: (Sub64 <t> (Mul64 y x) (Mul64 z x)) 25530 // cond: 25531 // result: (Mul64 x (Sub64 <t> y z)) 25532 for { 25533 t := v.Type 25534 _ = v.Args[1] 25535 v_0 := v.Args[0] 25536 if v_0.Op != OpMul64 { 25537 break 25538 } 25539 _ = v_0.Args[1] 25540 y := v_0.Args[0] 25541 x := v_0.Args[1] 25542 v_1 := v.Args[1] 25543 if v_1.Op != OpMul64 { 25544 break 25545 } 25546 _ = v_1.Args[1] 25547 z := v_1.Args[0] 25548 if x != v_1.Args[1] { 25549 break 25550 } 25551 v.reset(OpMul64) 25552 v.AddArg(x) 25553 v0 := b.NewValue0(v.Pos, OpSub64, t) 25554 v0.AddArg(y) 25555 v0.AddArg(z) 25556 v.AddArg(v0) 25557 return true 25558 } 25559 // match: (Sub64 x x) 25560 // cond: 25561 // result: (Const64 [0]) 25562 for { 25563 _ = v.Args[1] 25564 x := v.Args[0] 25565 if x != v.Args[1] { 25566 break 25567 } 25568 v.reset(OpConst64) 25569 v.AuxInt = 0 25570 return true 25571 } 25572 // match: (Sub64 (Add64 x y) x) 25573 // cond: 25574 // result: y 25575 for { 25576 _ = v.Args[1] 25577 v_0 := v.Args[0] 25578 if v_0.Op != OpAdd64 { 25579 break 25580 } 25581 _ = v_0.Args[1] 25582 x := v_0.Args[0] 25583 y := v_0.Args[1] 25584 if x != v.Args[1] { 25585 break 25586 } 25587 v.reset(OpCopy) 25588 v.Type = y.Type 25589 v.AddArg(y) 25590 return true 25591 } 25592 // match: (Sub64 (Add64 y x) x) 25593 // cond: 25594 // result: y 25595 for { 25596 _ = v.Args[1] 25597 v_0 := v.Args[0] 25598 if v_0.Op != OpAdd64 { 25599 break 25600 } 25601 _ = v_0.Args[1] 25602 y := v_0.Args[0] 25603 x := v_0.Args[1] 25604 if x != v.Args[1] { 25605 break 25606 } 25607 v.reset(OpCopy) 25608 v.Type = y.Type 25609 v.AddArg(y) 25610 return true 25611 } 25612 // match: (Sub64 (Add64 x y) y) 25613 // cond: 25614 // result: x 25615 for { 25616 _ = v.Args[1] 25617 v_0 := v.Args[0] 25618 if v_0.Op != OpAdd64 { 25619 break 25620 } 25621 _ = v_0.Args[1] 25622 x := v_0.Args[0] 25623 y := v_0.Args[1] 25624 if y != v.Args[1] { 25625 break 25626 } 25627 v.reset(OpCopy) 25628 v.Type = x.Type 25629 v.AddArg(x) 25630 return true 25631 } 25632 return false 25633 } 25634 func rewriteValuegeneric_OpSub64_10(v *Value) bool { 25635 b := v.Block 25636 _ = b 25637 // match: (Sub64 (Add64 y x) y) 25638 // cond: 25639 // result: x 25640 for { 25641 _ = v.Args[1] 25642 v_0 := v.Args[0] 25643 if v_0.Op != OpAdd64 { 25644 break 25645 } 25646 _ = v_0.Args[1] 25647 y := v_0.Args[0] 25648 x := v_0.Args[1] 25649 if y != v.Args[1] { 25650 break 25651 } 25652 v.reset(OpCopy) 25653 v.Type = x.Type 25654 v.AddArg(x) 25655 return true 25656 } 25657 // match: (Sub64 x (Sub64 i:(Const64 <t>) z)) 25658 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 25659 // result: (Sub64 (Add64 <t> x z) i) 25660 for { 25661 _ = v.Args[1] 25662 x := v.Args[0] 25663 v_1 := v.Args[1] 25664 if v_1.Op != OpSub64 { 25665 break 25666 } 25667 _ = v_1.Args[1] 25668 i := v_1.Args[0] 25669 if i.Op != OpConst64 { 25670 break 25671 } 25672 t := i.Type 25673 z := v_1.Args[1] 25674 if !(z.Op != OpConst64 && x.Op != OpConst64) { 25675 break 25676 } 25677 v.reset(OpSub64) 25678 v0 := b.NewValue0(v.Pos, OpAdd64, t) 25679 v0.AddArg(x) 25680 v0.AddArg(z) 25681 v.AddArg(v0) 25682 v.AddArg(i) 25683 return true 25684 } 25685 // match: (Sub64 x (Sub64 z i:(Const64 <t>))) 25686 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 25687 // result: (Add64 i (Sub64 <t> x z)) 25688 for { 25689 _ = v.Args[1] 25690 x := v.Args[0] 25691 v_1 := v.Args[1] 25692 if v_1.Op != OpSub64 { 25693 break 25694 } 25695 _ = v_1.Args[1] 25696 z := v_1.Args[0] 25697 i := v_1.Args[1] 25698 if i.Op != OpConst64 { 25699 break 25700 } 25701 t := i.Type 25702 if !(z.Op != OpConst64 && x.Op != OpConst64) { 25703 break 25704 } 25705 v.reset(OpAdd64) 25706 v.AddArg(i) 25707 v0 := b.NewValue0(v.Pos, OpSub64, t) 25708 v0.AddArg(x) 25709 v0.AddArg(z) 25710 v.AddArg(v0) 25711 return true 25712 } 25713 // match: (Sub64 (Const64 <t> [c]) (Sub64 x (Const64 <t> [d]))) 25714 // cond: 25715 // result: (Sub64 (Const64 <t> [c+d]) x) 25716 for { 25717 _ = v.Args[1] 25718 v_0 := v.Args[0] 25719 if v_0.Op != OpConst64 { 25720 break 25721 } 25722 t := v_0.Type 25723 c := v_0.AuxInt 25724 v_1 := v.Args[1] 25725 if v_1.Op != OpSub64 { 25726 break 25727 } 25728 _ = v_1.Args[1] 25729 x := v_1.Args[0] 25730 v_1_1 := v_1.Args[1] 25731 if v_1_1.Op != OpConst64 { 25732 break 25733 } 25734 if v_1_1.Type != t { 25735 break 25736 } 25737 d := v_1_1.AuxInt 25738 v.reset(OpSub64) 25739 v0 := b.NewValue0(v.Pos, OpConst64, t) 25740 v0.AuxInt = c + d 25741 v.AddArg(v0) 25742 v.AddArg(x) 25743 return true 25744 } 25745 // match: (Sub64 (Const64 <t> [c]) (Sub64 (Const64 <t> [d]) x)) 25746 // cond: 25747 // result: (Add64 (Const64 <t> [c-d]) x) 25748 for { 25749 _ = v.Args[1] 25750 v_0 := v.Args[0] 25751 if v_0.Op != OpConst64 { 25752 break 25753 } 25754 t := v_0.Type 25755 c := v_0.AuxInt 25756 v_1 := v.Args[1] 25757 if v_1.Op != OpSub64 { 25758 break 25759 } 25760 _ = v_1.Args[1] 25761 v_1_0 := v_1.Args[0] 25762 if v_1_0.Op != OpConst64 { 25763 break 25764 } 25765 if v_1_0.Type != t { 25766 break 25767 } 25768 d := v_1_0.AuxInt 25769 x := v_1.Args[1] 25770 v.reset(OpAdd64) 25771 v0 := b.NewValue0(v.Pos, OpConst64, t) 25772 v0.AuxInt = c - d 25773 v.AddArg(v0) 25774 v.AddArg(x) 25775 return true 25776 } 25777 return false 25778 } 25779 func rewriteValuegeneric_OpSub64F_0(v *Value) bool { 25780 // match: (Sub64F (Const64F [c]) (Const64F [d])) 25781 // cond: 25782 // result: (Const64F [f2i(i2f(c) - i2f(d))]) 25783 for { 25784 _ = v.Args[1] 25785 v_0 := v.Args[0] 25786 if v_0.Op != OpConst64F { 25787 break 25788 } 25789 c := v_0.AuxInt 25790 v_1 := v.Args[1] 25791 if v_1.Op != OpConst64F { 25792 break 25793 } 25794 d := v_1.AuxInt 25795 v.reset(OpConst64F) 25796 v.AuxInt = f2i(i2f(c) - i2f(d)) 25797 return true 25798 } 25799 // match: (Sub64F x (Const64F [0])) 25800 // cond: 25801 // result: x 25802 for { 25803 _ = v.Args[1] 25804 x := v.Args[0] 25805 v_1 := v.Args[1] 25806 if v_1.Op != OpConst64F { 25807 break 25808 } 25809 if v_1.AuxInt != 0 { 25810 break 25811 } 25812 v.reset(OpCopy) 25813 v.Type = x.Type 25814 v.AddArg(x) 25815 return true 25816 } 25817 return false 25818 } 25819 func rewriteValuegeneric_OpSub8_0(v *Value) bool { 25820 b := v.Block 25821 _ = b 25822 // match: (Sub8 (Const8 [c]) (Const8 [d])) 25823 // cond: 25824 // result: (Const8 [int64(int8(c-d))]) 25825 for { 25826 _ = v.Args[1] 25827 v_0 := v.Args[0] 25828 if v_0.Op != OpConst8 { 25829 break 25830 } 25831 c := v_0.AuxInt 25832 v_1 := v.Args[1] 25833 if v_1.Op != OpConst8 { 25834 break 25835 } 25836 d := v_1.AuxInt 25837 v.reset(OpConst8) 25838 v.AuxInt = int64(int8(c - d)) 25839 return true 25840 } 25841 // match: (Sub8 x (Const8 <t> [c])) 25842 // cond: x.Op != OpConst8 25843 // result: (Add8 (Const8 <t> [int64(int8(-c))]) x) 25844 for { 25845 _ = v.Args[1] 25846 x := v.Args[0] 25847 v_1 := v.Args[1] 25848 if v_1.Op != OpConst8 { 25849 break 25850 } 25851 t := v_1.Type 25852 c := v_1.AuxInt 25853 if !(x.Op != OpConst8) { 25854 break 25855 } 25856 v.reset(OpAdd8) 25857 v0 := b.NewValue0(v.Pos, OpConst8, t) 25858 v0.AuxInt = int64(int8(-c)) 25859 v.AddArg(v0) 25860 v.AddArg(x) 25861 return true 25862 } 25863 // match: (Sub8 <t> (Mul8 x y) (Mul8 x z)) 25864 // cond: 25865 // result: (Mul8 x (Sub8 <t> y z)) 25866 for { 25867 t := v.Type 25868 _ = v.Args[1] 25869 v_0 := v.Args[0] 25870 if v_0.Op != OpMul8 { 25871 break 25872 } 25873 _ = v_0.Args[1] 25874 x := v_0.Args[0] 25875 y := v_0.Args[1] 25876 v_1 := v.Args[1] 25877 if v_1.Op != OpMul8 { 25878 break 25879 } 25880 _ = v_1.Args[1] 25881 if x != v_1.Args[0] { 25882 break 25883 } 25884 z := v_1.Args[1] 25885 v.reset(OpMul8) 25886 v.AddArg(x) 25887 v0 := b.NewValue0(v.Pos, OpSub8, t) 25888 v0.AddArg(y) 25889 v0.AddArg(z) 25890 v.AddArg(v0) 25891 return true 25892 } 25893 // match: (Sub8 <t> (Mul8 y x) (Mul8 x z)) 25894 // cond: 25895 // result: (Mul8 x (Sub8 <t> y z)) 25896 for { 25897 t := v.Type 25898 _ = v.Args[1] 25899 v_0 := v.Args[0] 25900 if v_0.Op != OpMul8 { 25901 break 25902 } 25903 _ = v_0.Args[1] 25904 y := v_0.Args[0] 25905 x := v_0.Args[1] 25906 v_1 := v.Args[1] 25907 if v_1.Op != OpMul8 { 25908 break 25909 } 25910 _ = v_1.Args[1] 25911 if x != v_1.Args[0] { 25912 break 25913 } 25914 z := v_1.Args[1] 25915 v.reset(OpMul8) 25916 v.AddArg(x) 25917 v0 := b.NewValue0(v.Pos, OpSub8, t) 25918 v0.AddArg(y) 25919 v0.AddArg(z) 25920 v.AddArg(v0) 25921 return true 25922 } 25923 // match: (Sub8 <t> (Mul8 x y) (Mul8 z x)) 25924 // cond: 25925 // result: (Mul8 x (Sub8 <t> y z)) 25926 for { 25927 t := v.Type 25928 _ = v.Args[1] 25929 v_0 := v.Args[0] 25930 if v_0.Op != OpMul8 { 25931 break 25932 } 25933 _ = v_0.Args[1] 25934 x := v_0.Args[0] 25935 y := v_0.Args[1] 25936 v_1 := v.Args[1] 25937 if v_1.Op != OpMul8 { 25938 break 25939 } 25940 _ = v_1.Args[1] 25941 z := v_1.Args[0] 25942 if x != v_1.Args[1] { 25943 break 25944 } 25945 v.reset(OpMul8) 25946 v.AddArg(x) 25947 v0 := b.NewValue0(v.Pos, OpSub8, t) 25948 v0.AddArg(y) 25949 v0.AddArg(z) 25950 v.AddArg(v0) 25951 return true 25952 } 25953 // match: (Sub8 <t> (Mul8 y x) (Mul8 z x)) 25954 // cond: 25955 // result: (Mul8 x (Sub8 <t> y z)) 25956 for { 25957 t := v.Type 25958 _ = v.Args[1] 25959 v_0 := v.Args[0] 25960 if v_0.Op != OpMul8 { 25961 break 25962 } 25963 _ = v_0.Args[1] 25964 y := v_0.Args[0] 25965 x := v_0.Args[1] 25966 v_1 := v.Args[1] 25967 if v_1.Op != OpMul8 { 25968 break 25969 } 25970 _ = v_1.Args[1] 25971 z := v_1.Args[0] 25972 if x != v_1.Args[1] { 25973 break 25974 } 25975 v.reset(OpMul8) 25976 v.AddArg(x) 25977 v0 := b.NewValue0(v.Pos, OpSub8, t) 25978 v0.AddArg(y) 25979 v0.AddArg(z) 25980 v.AddArg(v0) 25981 return true 25982 } 25983 // match: (Sub8 x x) 25984 // cond: 25985 // result: (Const8 [0]) 25986 for { 25987 _ = v.Args[1] 25988 x := v.Args[0] 25989 if x != v.Args[1] { 25990 break 25991 } 25992 v.reset(OpConst8) 25993 v.AuxInt = 0 25994 return true 25995 } 25996 // match: (Sub8 (Add8 x y) x) 25997 // cond: 25998 // result: y 25999 for { 26000 _ = v.Args[1] 26001 v_0 := v.Args[0] 26002 if v_0.Op != OpAdd8 { 26003 break 26004 } 26005 _ = v_0.Args[1] 26006 x := v_0.Args[0] 26007 y := v_0.Args[1] 26008 if x != v.Args[1] { 26009 break 26010 } 26011 v.reset(OpCopy) 26012 v.Type = y.Type 26013 v.AddArg(y) 26014 return true 26015 } 26016 // match: (Sub8 (Add8 y x) x) 26017 // cond: 26018 // result: y 26019 for { 26020 _ = v.Args[1] 26021 v_0 := v.Args[0] 26022 if v_0.Op != OpAdd8 { 26023 break 26024 } 26025 _ = v_0.Args[1] 26026 y := v_0.Args[0] 26027 x := v_0.Args[1] 26028 if x != v.Args[1] { 26029 break 26030 } 26031 v.reset(OpCopy) 26032 v.Type = y.Type 26033 v.AddArg(y) 26034 return true 26035 } 26036 // match: (Sub8 (Add8 x y) y) 26037 // cond: 26038 // result: x 26039 for { 26040 _ = v.Args[1] 26041 v_0 := v.Args[0] 26042 if v_0.Op != OpAdd8 { 26043 break 26044 } 26045 _ = v_0.Args[1] 26046 x := v_0.Args[0] 26047 y := v_0.Args[1] 26048 if y != v.Args[1] { 26049 break 26050 } 26051 v.reset(OpCopy) 26052 v.Type = x.Type 26053 v.AddArg(x) 26054 return true 26055 } 26056 return false 26057 } 26058 func rewriteValuegeneric_OpSub8_10(v *Value) bool { 26059 b := v.Block 26060 _ = b 26061 // match: (Sub8 (Add8 y x) y) 26062 // cond: 26063 // result: x 26064 for { 26065 _ = v.Args[1] 26066 v_0 := v.Args[0] 26067 if v_0.Op != OpAdd8 { 26068 break 26069 } 26070 _ = v_0.Args[1] 26071 y := v_0.Args[0] 26072 x := v_0.Args[1] 26073 if y != v.Args[1] { 26074 break 26075 } 26076 v.reset(OpCopy) 26077 v.Type = x.Type 26078 v.AddArg(x) 26079 return true 26080 } 26081 // match: (Sub8 x (Sub8 i:(Const8 <t>) z)) 26082 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 26083 // result: (Sub8 (Add8 <t> x z) i) 26084 for { 26085 _ = v.Args[1] 26086 x := v.Args[0] 26087 v_1 := v.Args[1] 26088 if v_1.Op != OpSub8 { 26089 break 26090 } 26091 _ = v_1.Args[1] 26092 i := v_1.Args[0] 26093 if i.Op != OpConst8 { 26094 break 26095 } 26096 t := i.Type 26097 z := v_1.Args[1] 26098 if !(z.Op != OpConst8 && x.Op != OpConst8) { 26099 break 26100 } 26101 v.reset(OpSub8) 26102 v0 := b.NewValue0(v.Pos, OpAdd8, t) 26103 v0.AddArg(x) 26104 v0.AddArg(z) 26105 v.AddArg(v0) 26106 v.AddArg(i) 26107 return true 26108 } 26109 // match: (Sub8 x (Sub8 z i:(Const8 <t>))) 26110 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 26111 // result: (Add8 i (Sub8 <t> x z)) 26112 for { 26113 _ = v.Args[1] 26114 x := v.Args[0] 26115 v_1 := v.Args[1] 26116 if v_1.Op != OpSub8 { 26117 break 26118 } 26119 _ = v_1.Args[1] 26120 z := v_1.Args[0] 26121 i := v_1.Args[1] 26122 if i.Op != OpConst8 { 26123 break 26124 } 26125 t := i.Type 26126 if !(z.Op != OpConst8 && x.Op != OpConst8) { 26127 break 26128 } 26129 v.reset(OpAdd8) 26130 v.AddArg(i) 26131 v0 := b.NewValue0(v.Pos, OpSub8, t) 26132 v0.AddArg(x) 26133 v0.AddArg(z) 26134 v.AddArg(v0) 26135 return true 26136 } 26137 // match: (Sub8 (Const8 <t> [c]) (Sub8 x (Const8 <t> [d]))) 26138 // cond: 26139 // result: (Sub8 (Const8 <t> [int64(int8(c+d))]) x) 26140 for { 26141 _ = v.Args[1] 26142 v_0 := v.Args[0] 26143 if v_0.Op != OpConst8 { 26144 break 26145 } 26146 t := v_0.Type 26147 c := v_0.AuxInt 26148 v_1 := v.Args[1] 26149 if v_1.Op != OpSub8 { 26150 break 26151 } 26152 _ = v_1.Args[1] 26153 x := v_1.Args[0] 26154 v_1_1 := v_1.Args[1] 26155 if v_1_1.Op != OpConst8 { 26156 break 26157 } 26158 if v_1_1.Type != t { 26159 break 26160 } 26161 d := v_1_1.AuxInt 26162 v.reset(OpSub8) 26163 v0 := b.NewValue0(v.Pos, OpConst8, t) 26164 v0.AuxInt = int64(int8(c + d)) 26165 v.AddArg(v0) 26166 v.AddArg(x) 26167 return true 26168 } 26169 // match: (Sub8 (Const8 <t> [c]) (Sub8 (Const8 <t> [d]) x)) 26170 // cond: 26171 // result: (Add8 (Const8 <t> [int64(int8(c-d))]) x) 26172 for { 26173 _ = v.Args[1] 26174 v_0 := v.Args[0] 26175 if v_0.Op != OpConst8 { 26176 break 26177 } 26178 t := v_0.Type 26179 c := v_0.AuxInt 26180 v_1 := v.Args[1] 26181 if v_1.Op != OpSub8 { 26182 break 26183 } 26184 _ = v_1.Args[1] 26185 v_1_0 := v_1.Args[0] 26186 if v_1_0.Op != OpConst8 { 26187 break 26188 } 26189 if v_1_0.Type != t { 26190 break 26191 } 26192 d := v_1_0.AuxInt 26193 x := v_1.Args[1] 26194 v.reset(OpAdd8) 26195 v0 := b.NewValue0(v.Pos, OpConst8, t) 26196 v0.AuxInt = int64(int8(c - d)) 26197 v.AddArg(v0) 26198 v.AddArg(x) 26199 return true 26200 } 26201 return false 26202 } 26203 func rewriteValuegeneric_OpTrunc16to8_0(v *Value) bool { 26204 // match: (Trunc16to8 (Const16 [c])) 26205 // cond: 26206 // result: (Const8 [int64(int8(c))]) 26207 for { 26208 v_0 := v.Args[0] 26209 if v_0.Op != OpConst16 { 26210 break 26211 } 26212 c := v_0.AuxInt 26213 v.reset(OpConst8) 26214 v.AuxInt = int64(int8(c)) 26215 return true 26216 } 26217 // match: (Trunc16to8 (ZeroExt8to16 x)) 26218 // cond: 26219 // result: x 26220 for { 26221 v_0 := v.Args[0] 26222 if v_0.Op != OpZeroExt8to16 { 26223 break 26224 } 26225 x := v_0.Args[0] 26226 v.reset(OpCopy) 26227 v.Type = x.Type 26228 v.AddArg(x) 26229 return true 26230 } 26231 // match: (Trunc16to8 (SignExt8to16 x)) 26232 // cond: 26233 // result: x 26234 for { 26235 v_0 := v.Args[0] 26236 if v_0.Op != OpSignExt8to16 { 26237 break 26238 } 26239 x := v_0.Args[0] 26240 v.reset(OpCopy) 26241 v.Type = x.Type 26242 v.AddArg(x) 26243 return true 26244 } 26245 // match: (Trunc16to8 (And16 (Const16 [y]) x)) 26246 // cond: y&0xFF == 0xFF 26247 // result: (Trunc16to8 x) 26248 for { 26249 v_0 := v.Args[0] 26250 if v_0.Op != OpAnd16 { 26251 break 26252 } 26253 _ = v_0.Args[1] 26254 v_0_0 := v_0.Args[0] 26255 if v_0_0.Op != OpConst16 { 26256 break 26257 } 26258 y := v_0_0.AuxInt 26259 x := v_0.Args[1] 26260 if !(y&0xFF == 0xFF) { 26261 break 26262 } 26263 v.reset(OpTrunc16to8) 26264 v.AddArg(x) 26265 return true 26266 } 26267 // match: (Trunc16to8 (And16 x (Const16 [y]))) 26268 // cond: y&0xFF == 0xFF 26269 // result: (Trunc16to8 x) 26270 for { 26271 v_0 := v.Args[0] 26272 if v_0.Op != OpAnd16 { 26273 break 26274 } 26275 _ = v_0.Args[1] 26276 x := v_0.Args[0] 26277 v_0_1 := v_0.Args[1] 26278 if v_0_1.Op != OpConst16 { 26279 break 26280 } 26281 y := v_0_1.AuxInt 26282 if !(y&0xFF == 0xFF) { 26283 break 26284 } 26285 v.reset(OpTrunc16to8) 26286 v.AddArg(x) 26287 return true 26288 } 26289 return false 26290 } 26291 func rewriteValuegeneric_OpTrunc32to16_0(v *Value) bool { 26292 // match: (Trunc32to16 (Const32 [c])) 26293 // cond: 26294 // result: (Const16 [int64(int16(c))]) 26295 for { 26296 v_0 := v.Args[0] 26297 if v_0.Op != OpConst32 { 26298 break 26299 } 26300 c := v_0.AuxInt 26301 v.reset(OpConst16) 26302 v.AuxInt = int64(int16(c)) 26303 return true 26304 } 26305 // match: (Trunc32to16 (ZeroExt8to32 x)) 26306 // cond: 26307 // result: (ZeroExt8to16 x) 26308 for { 26309 v_0 := v.Args[0] 26310 if v_0.Op != OpZeroExt8to32 { 26311 break 26312 } 26313 x := v_0.Args[0] 26314 v.reset(OpZeroExt8to16) 26315 v.AddArg(x) 26316 return true 26317 } 26318 // match: (Trunc32to16 (ZeroExt16to32 x)) 26319 // cond: 26320 // result: x 26321 for { 26322 v_0 := v.Args[0] 26323 if v_0.Op != OpZeroExt16to32 { 26324 break 26325 } 26326 x := v_0.Args[0] 26327 v.reset(OpCopy) 26328 v.Type = x.Type 26329 v.AddArg(x) 26330 return true 26331 } 26332 // match: (Trunc32to16 (SignExt8to32 x)) 26333 // cond: 26334 // result: (SignExt8to16 x) 26335 for { 26336 v_0 := v.Args[0] 26337 if v_0.Op != OpSignExt8to32 { 26338 break 26339 } 26340 x := v_0.Args[0] 26341 v.reset(OpSignExt8to16) 26342 v.AddArg(x) 26343 return true 26344 } 26345 // match: (Trunc32to16 (SignExt16to32 x)) 26346 // cond: 26347 // result: x 26348 for { 26349 v_0 := v.Args[0] 26350 if v_0.Op != OpSignExt16to32 { 26351 break 26352 } 26353 x := v_0.Args[0] 26354 v.reset(OpCopy) 26355 v.Type = x.Type 26356 v.AddArg(x) 26357 return true 26358 } 26359 // match: (Trunc32to16 (And32 (Const32 [y]) x)) 26360 // cond: y&0xFFFF == 0xFFFF 26361 // result: (Trunc32to16 x) 26362 for { 26363 v_0 := v.Args[0] 26364 if v_0.Op != OpAnd32 { 26365 break 26366 } 26367 _ = v_0.Args[1] 26368 v_0_0 := v_0.Args[0] 26369 if v_0_0.Op != OpConst32 { 26370 break 26371 } 26372 y := v_0_0.AuxInt 26373 x := v_0.Args[1] 26374 if !(y&0xFFFF == 0xFFFF) { 26375 break 26376 } 26377 v.reset(OpTrunc32to16) 26378 v.AddArg(x) 26379 return true 26380 } 26381 // match: (Trunc32to16 (And32 x (Const32 [y]))) 26382 // cond: y&0xFFFF == 0xFFFF 26383 // result: (Trunc32to16 x) 26384 for { 26385 v_0 := v.Args[0] 26386 if v_0.Op != OpAnd32 { 26387 break 26388 } 26389 _ = v_0.Args[1] 26390 x := v_0.Args[0] 26391 v_0_1 := v_0.Args[1] 26392 if v_0_1.Op != OpConst32 { 26393 break 26394 } 26395 y := v_0_1.AuxInt 26396 if !(y&0xFFFF == 0xFFFF) { 26397 break 26398 } 26399 v.reset(OpTrunc32to16) 26400 v.AddArg(x) 26401 return true 26402 } 26403 return false 26404 } 26405 func rewriteValuegeneric_OpTrunc32to8_0(v *Value) bool { 26406 // match: (Trunc32to8 (Const32 [c])) 26407 // cond: 26408 // result: (Const8 [int64(int8(c))]) 26409 for { 26410 v_0 := v.Args[0] 26411 if v_0.Op != OpConst32 { 26412 break 26413 } 26414 c := v_0.AuxInt 26415 v.reset(OpConst8) 26416 v.AuxInt = int64(int8(c)) 26417 return true 26418 } 26419 // match: (Trunc32to8 (ZeroExt8to32 x)) 26420 // cond: 26421 // result: x 26422 for { 26423 v_0 := v.Args[0] 26424 if v_0.Op != OpZeroExt8to32 { 26425 break 26426 } 26427 x := v_0.Args[0] 26428 v.reset(OpCopy) 26429 v.Type = x.Type 26430 v.AddArg(x) 26431 return true 26432 } 26433 // match: (Trunc32to8 (SignExt8to32 x)) 26434 // cond: 26435 // result: x 26436 for { 26437 v_0 := v.Args[0] 26438 if v_0.Op != OpSignExt8to32 { 26439 break 26440 } 26441 x := v_0.Args[0] 26442 v.reset(OpCopy) 26443 v.Type = x.Type 26444 v.AddArg(x) 26445 return true 26446 } 26447 // match: (Trunc32to8 (And32 (Const32 [y]) x)) 26448 // cond: y&0xFF == 0xFF 26449 // result: (Trunc32to8 x) 26450 for { 26451 v_0 := v.Args[0] 26452 if v_0.Op != OpAnd32 { 26453 break 26454 } 26455 _ = v_0.Args[1] 26456 v_0_0 := v_0.Args[0] 26457 if v_0_0.Op != OpConst32 { 26458 break 26459 } 26460 y := v_0_0.AuxInt 26461 x := v_0.Args[1] 26462 if !(y&0xFF == 0xFF) { 26463 break 26464 } 26465 v.reset(OpTrunc32to8) 26466 v.AddArg(x) 26467 return true 26468 } 26469 // match: (Trunc32to8 (And32 x (Const32 [y]))) 26470 // cond: y&0xFF == 0xFF 26471 // result: (Trunc32to8 x) 26472 for { 26473 v_0 := v.Args[0] 26474 if v_0.Op != OpAnd32 { 26475 break 26476 } 26477 _ = v_0.Args[1] 26478 x := v_0.Args[0] 26479 v_0_1 := v_0.Args[1] 26480 if v_0_1.Op != OpConst32 { 26481 break 26482 } 26483 y := v_0_1.AuxInt 26484 if !(y&0xFF == 0xFF) { 26485 break 26486 } 26487 v.reset(OpTrunc32to8) 26488 v.AddArg(x) 26489 return true 26490 } 26491 return false 26492 } 26493 func rewriteValuegeneric_OpTrunc64to16_0(v *Value) bool { 26494 // match: (Trunc64to16 (Const64 [c])) 26495 // cond: 26496 // result: (Const16 [int64(int16(c))]) 26497 for { 26498 v_0 := v.Args[0] 26499 if v_0.Op != OpConst64 { 26500 break 26501 } 26502 c := v_0.AuxInt 26503 v.reset(OpConst16) 26504 v.AuxInt = int64(int16(c)) 26505 return true 26506 } 26507 // match: (Trunc64to16 (ZeroExt8to64 x)) 26508 // cond: 26509 // result: (ZeroExt8to16 x) 26510 for { 26511 v_0 := v.Args[0] 26512 if v_0.Op != OpZeroExt8to64 { 26513 break 26514 } 26515 x := v_0.Args[0] 26516 v.reset(OpZeroExt8to16) 26517 v.AddArg(x) 26518 return true 26519 } 26520 // match: (Trunc64to16 (ZeroExt16to64 x)) 26521 // cond: 26522 // result: x 26523 for { 26524 v_0 := v.Args[0] 26525 if v_0.Op != OpZeroExt16to64 { 26526 break 26527 } 26528 x := v_0.Args[0] 26529 v.reset(OpCopy) 26530 v.Type = x.Type 26531 v.AddArg(x) 26532 return true 26533 } 26534 // match: (Trunc64to16 (SignExt8to64 x)) 26535 // cond: 26536 // result: (SignExt8to16 x) 26537 for { 26538 v_0 := v.Args[0] 26539 if v_0.Op != OpSignExt8to64 { 26540 break 26541 } 26542 x := v_0.Args[0] 26543 v.reset(OpSignExt8to16) 26544 v.AddArg(x) 26545 return true 26546 } 26547 // match: (Trunc64to16 (SignExt16to64 x)) 26548 // cond: 26549 // result: x 26550 for { 26551 v_0 := v.Args[0] 26552 if v_0.Op != OpSignExt16to64 { 26553 break 26554 } 26555 x := v_0.Args[0] 26556 v.reset(OpCopy) 26557 v.Type = x.Type 26558 v.AddArg(x) 26559 return true 26560 } 26561 // match: (Trunc64to16 (And64 (Const64 [y]) x)) 26562 // cond: y&0xFFFF == 0xFFFF 26563 // result: (Trunc64to16 x) 26564 for { 26565 v_0 := v.Args[0] 26566 if v_0.Op != OpAnd64 { 26567 break 26568 } 26569 _ = v_0.Args[1] 26570 v_0_0 := v_0.Args[0] 26571 if v_0_0.Op != OpConst64 { 26572 break 26573 } 26574 y := v_0_0.AuxInt 26575 x := v_0.Args[1] 26576 if !(y&0xFFFF == 0xFFFF) { 26577 break 26578 } 26579 v.reset(OpTrunc64to16) 26580 v.AddArg(x) 26581 return true 26582 } 26583 // match: (Trunc64to16 (And64 x (Const64 [y]))) 26584 // cond: y&0xFFFF == 0xFFFF 26585 // result: (Trunc64to16 x) 26586 for { 26587 v_0 := v.Args[0] 26588 if v_0.Op != OpAnd64 { 26589 break 26590 } 26591 _ = v_0.Args[1] 26592 x := v_0.Args[0] 26593 v_0_1 := v_0.Args[1] 26594 if v_0_1.Op != OpConst64 { 26595 break 26596 } 26597 y := v_0_1.AuxInt 26598 if !(y&0xFFFF == 0xFFFF) { 26599 break 26600 } 26601 v.reset(OpTrunc64to16) 26602 v.AddArg(x) 26603 return true 26604 } 26605 return false 26606 } 26607 func rewriteValuegeneric_OpTrunc64to32_0(v *Value) bool { 26608 // match: (Trunc64to32 (Const64 [c])) 26609 // cond: 26610 // result: (Const32 [int64(int32(c))]) 26611 for { 26612 v_0 := v.Args[0] 26613 if v_0.Op != OpConst64 { 26614 break 26615 } 26616 c := v_0.AuxInt 26617 v.reset(OpConst32) 26618 v.AuxInt = int64(int32(c)) 26619 return true 26620 } 26621 // match: (Trunc64to32 (ZeroExt8to64 x)) 26622 // cond: 26623 // result: (ZeroExt8to32 x) 26624 for { 26625 v_0 := v.Args[0] 26626 if v_0.Op != OpZeroExt8to64 { 26627 break 26628 } 26629 x := v_0.Args[0] 26630 v.reset(OpZeroExt8to32) 26631 v.AddArg(x) 26632 return true 26633 } 26634 // match: (Trunc64to32 (ZeroExt16to64 x)) 26635 // cond: 26636 // result: (ZeroExt16to32 x) 26637 for { 26638 v_0 := v.Args[0] 26639 if v_0.Op != OpZeroExt16to64 { 26640 break 26641 } 26642 x := v_0.Args[0] 26643 v.reset(OpZeroExt16to32) 26644 v.AddArg(x) 26645 return true 26646 } 26647 // match: (Trunc64to32 (ZeroExt32to64 x)) 26648 // cond: 26649 // result: x 26650 for { 26651 v_0 := v.Args[0] 26652 if v_0.Op != OpZeroExt32to64 { 26653 break 26654 } 26655 x := v_0.Args[0] 26656 v.reset(OpCopy) 26657 v.Type = x.Type 26658 v.AddArg(x) 26659 return true 26660 } 26661 // match: (Trunc64to32 (SignExt8to64 x)) 26662 // cond: 26663 // result: (SignExt8to32 x) 26664 for { 26665 v_0 := v.Args[0] 26666 if v_0.Op != OpSignExt8to64 { 26667 break 26668 } 26669 x := v_0.Args[0] 26670 v.reset(OpSignExt8to32) 26671 v.AddArg(x) 26672 return true 26673 } 26674 // match: (Trunc64to32 (SignExt16to64 x)) 26675 // cond: 26676 // result: (SignExt16to32 x) 26677 for { 26678 v_0 := v.Args[0] 26679 if v_0.Op != OpSignExt16to64 { 26680 break 26681 } 26682 x := v_0.Args[0] 26683 v.reset(OpSignExt16to32) 26684 v.AddArg(x) 26685 return true 26686 } 26687 // match: (Trunc64to32 (SignExt32to64 x)) 26688 // cond: 26689 // result: x 26690 for { 26691 v_0 := v.Args[0] 26692 if v_0.Op != OpSignExt32to64 { 26693 break 26694 } 26695 x := v_0.Args[0] 26696 v.reset(OpCopy) 26697 v.Type = x.Type 26698 v.AddArg(x) 26699 return true 26700 } 26701 // match: (Trunc64to32 (And64 (Const64 [y]) x)) 26702 // cond: y&0xFFFFFFFF == 0xFFFFFFFF 26703 // result: (Trunc64to32 x) 26704 for { 26705 v_0 := v.Args[0] 26706 if v_0.Op != OpAnd64 { 26707 break 26708 } 26709 _ = v_0.Args[1] 26710 v_0_0 := v_0.Args[0] 26711 if v_0_0.Op != OpConst64 { 26712 break 26713 } 26714 y := v_0_0.AuxInt 26715 x := v_0.Args[1] 26716 if !(y&0xFFFFFFFF == 0xFFFFFFFF) { 26717 break 26718 } 26719 v.reset(OpTrunc64to32) 26720 v.AddArg(x) 26721 return true 26722 } 26723 // match: (Trunc64to32 (And64 x (Const64 [y]))) 26724 // cond: y&0xFFFFFFFF == 0xFFFFFFFF 26725 // result: (Trunc64to32 x) 26726 for { 26727 v_0 := v.Args[0] 26728 if v_0.Op != OpAnd64 { 26729 break 26730 } 26731 _ = v_0.Args[1] 26732 x := v_0.Args[0] 26733 v_0_1 := v_0.Args[1] 26734 if v_0_1.Op != OpConst64 { 26735 break 26736 } 26737 y := v_0_1.AuxInt 26738 if !(y&0xFFFFFFFF == 0xFFFFFFFF) { 26739 break 26740 } 26741 v.reset(OpTrunc64to32) 26742 v.AddArg(x) 26743 return true 26744 } 26745 return false 26746 } 26747 func rewriteValuegeneric_OpTrunc64to8_0(v *Value) bool { 26748 // match: (Trunc64to8 (Const64 [c])) 26749 // cond: 26750 // result: (Const8 [int64(int8(c))]) 26751 for { 26752 v_0 := v.Args[0] 26753 if v_0.Op != OpConst64 { 26754 break 26755 } 26756 c := v_0.AuxInt 26757 v.reset(OpConst8) 26758 v.AuxInt = int64(int8(c)) 26759 return true 26760 } 26761 // match: (Trunc64to8 (ZeroExt8to64 x)) 26762 // cond: 26763 // result: x 26764 for { 26765 v_0 := v.Args[0] 26766 if v_0.Op != OpZeroExt8to64 { 26767 break 26768 } 26769 x := v_0.Args[0] 26770 v.reset(OpCopy) 26771 v.Type = x.Type 26772 v.AddArg(x) 26773 return true 26774 } 26775 // match: (Trunc64to8 (SignExt8to64 x)) 26776 // cond: 26777 // result: x 26778 for { 26779 v_0 := v.Args[0] 26780 if v_0.Op != OpSignExt8to64 { 26781 break 26782 } 26783 x := v_0.Args[0] 26784 v.reset(OpCopy) 26785 v.Type = x.Type 26786 v.AddArg(x) 26787 return true 26788 } 26789 // match: (Trunc64to8 (And64 (Const64 [y]) x)) 26790 // cond: y&0xFF == 0xFF 26791 // result: (Trunc64to8 x) 26792 for { 26793 v_0 := v.Args[0] 26794 if v_0.Op != OpAnd64 { 26795 break 26796 } 26797 _ = v_0.Args[1] 26798 v_0_0 := v_0.Args[0] 26799 if v_0_0.Op != OpConst64 { 26800 break 26801 } 26802 y := v_0_0.AuxInt 26803 x := v_0.Args[1] 26804 if !(y&0xFF == 0xFF) { 26805 break 26806 } 26807 v.reset(OpTrunc64to8) 26808 v.AddArg(x) 26809 return true 26810 } 26811 // match: (Trunc64to8 (And64 x (Const64 [y]))) 26812 // cond: y&0xFF == 0xFF 26813 // result: (Trunc64to8 x) 26814 for { 26815 v_0 := v.Args[0] 26816 if v_0.Op != OpAnd64 { 26817 break 26818 } 26819 _ = v_0.Args[1] 26820 x := v_0.Args[0] 26821 v_0_1 := v_0.Args[1] 26822 if v_0_1.Op != OpConst64 { 26823 break 26824 } 26825 y := v_0_1.AuxInt 26826 if !(y&0xFF == 0xFF) { 26827 break 26828 } 26829 v.reset(OpTrunc64to8) 26830 v.AddArg(x) 26831 return true 26832 } 26833 return false 26834 } 26835 func rewriteValuegeneric_OpXor16_0(v *Value) bool { 26836 b := v.Block 26837 _ = b 26838 // match: (Xor16 (Const16 [c]) (Const16 [d])) 26839 // cond: 26840 // result: (Const16 [int64(int16(c^d))]) 26841 for { 26842 _ = v.Args[1] 26843 v_0 := v.Args[0] 26844 if v_0.Op != OpConst16 { 26845 break 26846 } 26847 c := v_0.AuxInt 26848 v_1 := v.Args[1] 26849 if v_1.Op != OpConst16 { 26850 break 26851 } 26852 d := v_1.AuxInt 26853 v.reset(OpConst16) 26854 v.AuxInt = int64(int16(c ^ d)) 26855 return true 26856 } 26857 // match: (Xor16 (Const16 [d]) (Const16 [c])) 26858 // cond: 26859 // result: (Const16 [int64(int16(c^d))]) 26860 for { 26861 _ = v.Args[1] 26862 v_0 := v.Args[0] 26863 if v_0.Op != OpConst16 { 26864 break 26865 } 26866 d := v_0.AuxInt 26867 v_1 := v.Args[1] 26868 if v_1.Op != OpConst16 { 26869 break 26870 } 26871 c := v_1.AuxInt 26872 v.reset(OpConst16) 26873 v.AuxInt = int64(int16(c ^ d)) 26874 return true 26875 } 26876 // match: (Xor16 x x) 26877 // cond: 26878 // result: (Const16 [0]) 26879 for { 26880 _ = v.Args[1] 26881 x := v.Args[0] 26882 if x != v.Args[1] { 26883 break 26884 } 26885 v.reset(OpConst16) 26886 v.AuxInt = 0 26887 return true 26888 } 26889 // match: (Xor16 (Const16 [0]) x) 26890 // cond: 26891 // result: x 26892 for { 26893 _ = v.Args[1] 26894 v_0 := v.Args[0] 26895 if v_0.Op != OpConst16 { 26896 break 26897 } 26898 if v_0.AuxInt != 0 { 26899 break 26900 } 26901 x := v.Args[1] 26902 v.reset(OpCopy) 26903 v.Type = x.Type 26904 v.AddArg(x) 26905 return true 26906 } 26907 // match: (Xor16 x (Const16 [0])) 26908 // cond: 26909 // result: x 26910 for { 26911 _ = v.Args[1] 26912 x := v.Args[0] 26913 v_1 := v.Args[1] 26914 if v_1.Op != OpConst16 { 26915 break 26916 } 26917 if v_1.AuxInt != 0 { 26918 break 26919 } 26920 v.reset(OpCopy) 26921 v.Type = x.Type 26922 v.AddArg(x) 26923 return true 26924 } 26925 // match: (Xor16 x (Xor16 x y)) 26926 // cond: 26927 // result: y 26928 for { 26929 _ = v.Args[1] 26930 x := v.Args[0] 26931 v_1 := v.Args[1] 26932 if v_1.Op != OpXor16 { 26933 break 26934 } 26935 _ = v_1.Args[1] 26936 if x != v_1.Args[0] { 26937 break 26938 } 26939 y := v_1.Args[1] 26940 v.reset(OpCopy) 26941 v.Type = y.Type 26942 v.AddArg(y) 26943 return true 26944 } 26945 // match: (Xor16 x (Xor16 y x)) 26946 // cond: 26947 // result: y 26948 for { 26949 _ = v.Args[1] 26950 x := v.Args[0] 26951 v_1 := v.Args[1] 26952 if v_1.Op != OpXor16 { 26953 break 26954 } 26955 _ = v_1.Args[1] 26956 y := v_1.Args[0] 26957 if x != v_1.Args[1] { 26958 break 26959 } 26960 v.reset(OpCopy) 26961 v.Type = y.Type 26962 v.AddArg(y) 26963 return true 26964 } 26965 // match: (Xor16 (Xor16 x y) x) 26966 // cond: 26967 // result: y 26968 for { 26969 _ = v.Args[1] 26970 v_0 := v.Args[0] 26971 if v_0.Op != OpXor16 { 26972 break 26973 } 26974 _ = v_0.Args[1] 26975 x := v_0.Args[0] 26976 y := v_0.Args[1] 26977 if x != v.Args[1] { 26978 break 26979 } 26980 v.reset(OpCopy) 26981 v.Type = y.Type 26982 v.AddArg(y) 26983 return true 26984 } 26985 // match: (Xor16 (Xor16 y x) x) 26986 // cond: 26987 // result: y 26988 for { 26989 _ = v.Args[1] 26990 v_0 := v.Args[0] 26991 if v_0.Op != OpXor16 { 26992 break 26993 } 26994 _ = v_0.Args[1] 26995 y := v_0.Args[0] 26996 x := v_0.Args[1] 26997 if x != v.Args[1] { 26998 break 26999 } 27000 v.reset(OpCopy) 27001 v.Type = y.Type 27002 v.AddArg(y) 27003 return true 27004 } 27005 // match: (Xor16 (Xor16 i:(Const16 <t>) z) x) 27006 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 27007 // result: (Xor16 i (Xor16 <t> z x)) 27008 for { 27009 _ = v.Args[1] 27010 v_0 := v.Args[0] 27011 if v_0.Op != OpXor16 { 27012 break 27013 } 27014 _ = v_0.Args[1] 27015 i := v_0.Args[0] 27016 if i.Op != OpConst16 { 27017 break 27018 } 27019 t := i.Type 27020 z := v_0.Args[1] 27021 x := v.Args[1] 27022 if !(z.Op != OpConst16 && x.Op != OpConst16) { 27023 break 27024 } 27025 v.reset(OpXor16) 27026 v.AddArg(i) 27027 v0 := b.NewValue0(v.Pos, OpXor16, t) 27028 v0.AddArg(z) 27029 v0.AddArg(x) 27030 v.AddArg(v0) 27031 return true 27032 } 27033 return false 27034 } 27035 func rewriteValuegeneric_OpXor16_10(v *Value) bool { 27036 b := v.Block 27037 _ = b 27038 // match: (Xor16 (Xor16 z i:(Const16 <t>)) x) 27039 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 27040 // result: (Xor16 i (Xor16 <t> z x)) 27041 for { 27042 _ = v.Args[1] 27043 v_0 := v.Args[0] 27044 if v_0.Op != OpXor16 { 27045 break 27046 } 27047 _ = v_0.Args[1] 27048 z := v_0.Args[0] 27049 i := v_0.Args[1] 27050 if i.Op != OpConst16 { 27051 break 27052 } 27053 t := i.Type 27054 x := v.Args[1] 27055 if !(z.Op != OpConst16 && x.Op != OpConst16) { 27056 break 27057 } 27058 v.reset(OpXor16) 27059 v.AddArg(i) 27060 v0 := b.NewValue0(v.Pos, OpXor16, t) 27061 v0.AddArg(z) 27062 v0.AddArg(x) 27063 v.AddArg(v0) 27064 return true 27065 } 27066 // match: (Xor16 x (Xor16 i:(Const16 <t>) z)) 27067 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 27068 // result: (Xor16 i (Xor16 <t> z x)) 27069 for { 27070 _ = v.Args[1] 27071 x := v.Args[0] 27072 v_1 := v.Args[1] 27073 if v_1.Op != OpXor16 { 27074 break 27075 } 27076 _ = v_1.Args[1] 27077 i := v_1.Args[0] 27078 if i.Op != OpConst16 { 27079 break 27080 } 27081 t := i.Type 27082 z := v_1.Args[1] 27083 if !(z.Op != OpConst16 && x.Op != OpConst16) { 27084 break 27085 } 27086 v.reset(OpXor16) 27087 v.AddArg(i) 27088 v0 := b.NewValue0(v.Pos, OpXor16, t) 27089 v0.AddArg(z) 27090 v0.AddArg(x) 27091 v.AddArg(v0) 27092 return true 27093 } 27094 // match: (Xor16 x (Xor16 z i:(Const16 <t>))) 27095 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 27096 // result: (Xor16 i (Xor16 <t> z x)) 27097 for { 27098 _ = v.Args[1] 27099 x := v.Args[0] 27100 v_1 := v.Args[1] 27101 if v_1.Op != OpXor16 { 27102 break 27103 } 27104 _ = v_1.Args[1] 27105 z := v_1.Args[0] 27106 i := v_1.Args[1] 27107 if i.Op != OpConst16 { 27108 break 27109 } 27110 t := i.Type 27111 if !(z.Op != OpConst16 && x.Op != OpConst16) { 27112 break 27113 } 27114 v.reset(OpXor16) 27115 v.AddArg(i) 27116 v0 := b.NewValue0(v.Pos, OpXor16, t) 27117 v0.AddArg(z) 27118 v0.AddArg(x) 27119 v.AddArg(v0) 27120 return true 27121 } 27122 // match: (Xor16 (Const16 <t> [c]) (Xor16 (Const16 <t> [d]) x)) 27123 // cond: 27124 // result: (Xor16 (Const16 <t> [int64(int16(c^d))]) x) 27125 for { 27126 _ = v.Args[1] 27127 v_0 := v.Args[0] 27128 if v_0.Op != OpConst16 { 27129 break 27130 } 27131 t := v_0.Type 27132 c := v_0.AuxInt 27133 v_1 := v.Args[1] 27134 if v_1.Op != OpXor16 { 27135 break 27136 } 27137 _ = v_1.Args[1] 27138 v_1_0 := v_1.Args[0] 27139 if v_1_0.Op != OpConst16 { 27140 break 27141 } 27142 if v_1_0.Type != t { 27143 break 27144 } 27145 d := v_1_0.AuxInt 27146 x := v_1.Args[1] 27147 v.reset(OpXor16) 27148 v0 := b.NewValue0(v.Pos, OpConst16, t) 27149 v0.AuxInt = int64(int16(c ^ d)) 27150 v.AddArg(v0) 27151 v.AddArg(x) 27152 return true 27153 } 27154 // match: (Xor16 (Const16 <t> [c]) (Xor16 x (Const16 <t> [d]))) 27155 // cond: 27156 // result: (Xor16 (Const16 <t> [int64(int16(c^d))]) x) 27157 for { 27158 _ = v.Args[1] 27159 v_0 := v.Args[0] 27160 if v_0.Op != OpConst16 { 27161 break 27162 } 27163 t := v_0.Type 27164 c := v_0.AuxInt 27165 v_1 := v.Args[1] 27166 if v_1.Op != OpXor16 { 27167 break 27168 } 27169 _ = v_1.Args[1] 27170 x := v_1.Args[0] 27171 v_1_1 := v_1.Args[1] 27172 if v_1_1.Op != OpConst16 { 27173 break 27174 } 27175 if v_1_1.Type != t { 27176 break 27177 } 27178 d := v_1_1.AuxInt 27179 v.reset(OpXor16) 27180 v0 := b.NewValue0(v.Pos, OpConst16, t) 27181 v0.AuxInt = int64(int16(c ^ d)) 27182 v.AddArg(v0) 27183 v.AddArg(x) 27184 return true 27185 } 27186 // match: (Xor16 (Xor16 (Const16 <t> [d]) x) (Const16 <t> [c])) 27187 // cond: 27188 // result: (Xor16 (Const16 <t> [int64(int16(c^d))]) x) 27189 for { 27190 _ = v.Args[1] 27191 v_0 := v.Args[0] 27192 if v_0.Op != OpXor16 { 27193 break 27194 } 27195 _ = v_0.Args[1] 27196 v_0_0 := v_0.Args[0] 27197 if v_0_0.Op != OpConst16 { 27198 break 27199 } 27200 t := v_0_0.Type 27201 d := v_0_0.AuxInt 27202 x := v_0.Args[1] 27203 v_1 := v.Args[1] 27204 if v_1.Op != OpConst16 { 27205 break 27206 } 27207 if v_1.Type != t { 27208 break 27209 } 27210 c := v_1.AuxInt 27211 v.reset(OpXor16) 27212 v0 := b.NewValue0(v.Pos, OpConst16, t) 27213 v0.AuxInt = int64(int16(c ^ d)) 27214 v.AddArg(v0) 27215 v.AddArg(x) 27216 return true 27217 } 27218 // match: (Xor16 (Xor16 x (Const16 <t> [d])) (Const16 <t> [c])) 27219 // cond: 27220 // result: (Xor16 (Const16 <t> [int64(int16(c^d))]) x) 27221 for { 27222 _ = v.Args[1] 27223 v_0 := v.Args[0] 27224 if v_0.Op != OpXor16 { 27225 break 27226 } 27227 _ = v_0.Args[1] 27228 x := v_0.Args[0] 27229 v_0_1 := v_0.Args[1] 27230 if v_0_1.Op != OpConst16 { 27231 break 27232 } 27233 t := v_0_1.Type 27234 d := v_0_1.AuxInt 27235 v_1 := v.Args[1] 27236 if v_1.Op != OpConst16 { 27237 break 27238 } 27239 if v_1.Type != t { 27240 break 27241 } 27242 c := v_1.AuxInt 27243 v.reset(OpXor16) 27244 v0 := b.NewValue0(v.Pos, OpConst16, t) 27245 v0.AuxInt = int64(int16(c ^ d)) 27246 v.AddArg(v0) 27247 v.AddArg(x) 27248 return true 27249 } 27250 return false 27251 } 27252 func rewriteValuegeneric_OpXor32_0(v *Value) bool { 27253 b := v.Block 27254 _ = b 27255 // match: (Xor32 (Const32 [c]) (Const32 [d])) 27256 // cond: 27257 // result: (Const32 [int64(int32(c^d))]) 27258 for { 27259 _ = v.Args[1] 27260 v_0 := v.Args[0] 27261 if v_0.Op != OpConst32 { 27262 break 27263 } 27264 c := v_0.AuxInt 27265 v_1 := v.Args[1] 27266 if v_1.Op != OpConst32 { 27267 break 27268 } 27269 d := v_1.AuxInt 27270 v.reset(OpConst32) 27271 v.AuxInt = int64(int32(c ^ d)) 27272 return true 27273 } 27274 // match: (Xor32 (Const32 [d]) (Const32 [c])) 27275 // cond: 27276 // result: (Const32 [int64(int32(c^d))]) 27277 for { 27278 _ = v.Args[1] 27279 v_0 := v.Args[0] 27280 if v_0.Op != OpConst32 { 27281 break 27282 } 27283 d := v_0.AuxInt 27284 v_1 := v.Args[1] 27285 if v_1.Op != OpConst32 { 27286 break 27287 } 27288 c := v_1.AuxInt 27289 v.reset(OpConst32) 27290 v.AuxInt = int64(int32(c ^ d)) 27291 return true 27292 } 27293 // match: (Xor32 x x) 27294 // cond: 27295 // result: (Const32 [0]) 27296 for { 27297 _ = v.Args[1] 27298 x := v.Args[0] 27299 if x != v.Args[1] { 27300 break 27301 } 27302 v.reset(OpConst32) 27303 v.AuxInt = 0 27304 return true 27305 } 27306 // match: (Xor32 (Const32 [0]) x) 27307 // cond: 27308 // result: x 27309 for { 27310 _ = v.Args[1] 27311 v_0 := v.Args[0] 27312 if v_0.Op != OpConst32 { 27313 break 27314 } 27315 if v_0.AuxInt != 0 { 27316 break 27317 } 27318 x := v.Args[1] 27319 v.reset(OpCopy) 27320 v.Type = x.Type 27321 v.AddArg(x) 27322 return true 27323 } 27324 // match: (Xor32 x (Const32 [0])) 27325 // cond: 27326 // result: x 27327 for { 27328 _ = v.Args[1] 27329 x := v.Args[0] 27330 v_1 := v.Args[1] 27331 if v_1.Op != OpConst32 { 27332 break 27333 } 27334 if v_1.AuxInt != 0 { 27335 break 27336 } 27337 v.reset(OpCopy) 27338 v.Type = x.Type 27339 v.AddArg(x) 27340 return true 27341 } 27342 // match: (Xor32 x (Xor32 x y)) 27343 // cond: 27344 // result: y 27345 for { 27346 _ = v.Args[1] 27347 x := v.Args[0] 27348 v_1 := v.Args[1] 27349 if v_1.Op != OpXor32 { 27350 break 27351 } 27352 _ = v_1.Args[1] 27353 if x != v_1.Args[0] { 27354 break 27355 } 27356 y := v_1.Args[1] 27357 v.reset(OpCopy) 27358 v.Type = y.Type 27359 v.AddArg(y) 27360 return true 27361 } 27362 // match: (Xor32 x (Xor32 y x)) 27363 // cond: 27364 // result: y 27365 for { 27366 _ = v.Args[1] 27367 x := v.Args[0] 27368 v_1 := v.Args[1] 27369 if v_1.Op != OpXor32 { 27370 break 27371 } 27372 _ = v_1.Args[1] 27373 y := v_1.Args[0] 27374 if x != v_1.Args[1] { 27375 break 27376 } 27377 v.reset(OpCopy) 27378 v.Type = y.Type 27379 v.AddArg(y) 27380 return true 27381 } 27382 // match: (Xor32 (Xor32 x y) x) 27383 // cond: 27384 // result: y 27385 for { 27386 _ = v.Args[1] 27387 v_0 := v.Args[0] 27388 if v_0.Op != OpXor32 { 27389 break 27390 } 27391 _ = v_0.Args[1] 27392 x := v_0.Args[0] 27393 y := v_0.Args[1] 27394 if x != v.Args[1] { 27395 break 27396 } 27397 v.reset(OpCopy) 27398 v.Type = y.Type 27399 v.AddArg(y) 27400 return true 27401 } 27402 // match: (Xor32 (Xor32 y x) x) 27403 // cond: 27404 // result: y 27405 for { 27406 _ = v.Args[1] 27407 v_0 := v.Args[0] 27408 if v_0.Op != OpXor32 { 27409 break 27410 } 27411 _ = v_0.Args[1] 27412 y := v_0.Args[0] 27413 x := v_0.Args[1] 27414 if x != v.Args[1] { 27415 break 27416 } 27417 v.reset(OpCopy) 27418 v.Type = y.Type 27419 v.AddArg(y) 27420 return true 27421 } 27422 // match: (Xor32 (Xor32 i:(Const32 <t>) z) x) 27423 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 27424 // result: (Xor32 i (Xor32 <t> z x)) 27425 for { 27426 _ = v.Args[1] 27427 v_0 := v.Args[0] 27428 if v_0.Op != OpXor32 { 27429 break 27430 } 27431 _ = v_0.Args[1] 27432 i := v_0.Args[0] 27433 if i.Op != OpConst32 { 27434 break 27435 } 27436 t := i.Type 27437 z := v_0.Args[1] 27438 x := v.Args[1] 27439 if !(z.Op != OpConst32 && x.Op != OpConst32) { 27440 break 27441 } 27442 v.reset(OpXor32) 27443 v.AddArg(i) 27444 v0 := b.NewValue0(v.Pos, OpXor32, t) 27445 v0.AddArg(z) 27446 v0.AddArg(x) 27447 v.AddArg(v0) 27448 return true 27449 } 27450 return false 27451 } 27452 func rewriteValuegeneric_OpXor32_10(v *Value) bool { 27453 b := v.Block 27454 _ = b 27455 // match: (Xor32 (Xor32 z i:(Const32 <t>)) x) 27456 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 27457 // result: (Xor32 i (Xor32 <t> z x)) 27458 for { 27459 _ = v.Args[1] 27460 v_0 := v.Args[0] 27461 if v_0.Op != OpXor32 { 27462 break 27463 } 27464 _ = v_0.Args[1] 27465 z := v_0.Args[0] 27466 i := v_0.Args[1] 27467 if i.Op != OpConst32 { 27468 break 27469 } 27470 t := i.Type 27471 x := v.Args[1] 27472 if !(z.Op != OpConst32 && x.Op != OpConst32) { 27473 break 27474 } 27475 v.reset(OpXor32) 27476 v.AddArg(i) 27477 v0 := b.NewValue0(v.Pos, OpXor32, t) 27478 v0.AddArg(z) 27479 v0.AddArg(x) 27480 v.AddArg(v0) 27481 return true 27482 } 27483 // match: (Xor32 x (Xor32 i:(Const32 <t>) z)) 27484 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 27485 // result: (Xor32 i (Xor32 <t> z x)) 27486 for { 27487 _ = v.Args[1] 27488 x := v.Args[0] 27489 v_1 := v.Args[1] 27490 if v_1.Op != OpXor32 { 27491 break 27492 } 27493 _ = v_1.Args[1] 27494 i := v_1.Args[0] 27495 if i.Op != OpConst32 { 27496 break 27497 } 27498 t := i.Type 27499 z := v_1.Args[1] 27500 if !(z.Op != OpConst32 && x.Op != OpConst32) { 27501 break 27502 } 27503 v.reset(OpXor32) 27504 v.AddArg(i) 27505 v0 := b.NewValue0(v.Pos, OpXor32, t) 27506 v0.AddArg(z) 27507 v0.AddArg(x) 27508 v.AddArg(v0) 27509 return true 27510 } 27511 // match: (Xor32 x (Xor32 z i:(Const32 <t>))) 27512 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 27513 // result: (Xor32 i (Xor32 <t> z x)) 27514 for { 27515 _ = v.Args[1] 27516 x := v.Args[0] 27517 v_1 := v.Args[1] 27518 if v_1.Op != OpXor32 { 27519 break 27520 } 27521 _ = v_1.Args[1] 27522 z := v_1.Args[0] 27523 i := v_1.Args[1] 27524 if i.Op != OpConst32 { 27525 break 27526 } 27527 t := i.Type 27528 if !(z.Op != OpConst32 && x.Op != OpConst32) { 27529 break 27530 } 27531 v.reset(OpXor32) 27532 v.AddArg(i) 27533 v0 := b.NewValue0(v.Pos, OpXor32, t) 27534 v0.AddArg(z) 27535 v0.AddArg(x) 27536 v.AddArg(v0) 27537 return true 27538 } 27539 // match: (Xor32 (Const32 <t> [c]) (Xor32 (Const32 <t> [d]) x)) 27540 // cond: 27541 // result: (Xor32 (Const32 <t> [int64(int32(c^d))]) x) 27542 for { 27543 _ = v.Args[1] 27544 v_0 := v.Args[0] 27545 if v_0.Op != OpConst32 { 27546 break 27547 } 27548 t := v_0.Type 27549 c := v_0.AuxInt 27550 v_1 := v.Args[1] 27551 if v_1.Op != OpXor32 { 27552 break 27553 } 27554 _ = v_1.Args[1] 27555 v_1_0 := v_1.Args[0] 27556 if v_1_0.Op != OpConst32 { 27557 break 27558 } 27559 if v_1_0.Type != t { 27560 break 27561 } 27562 d := v_1_0.AuxInt 27563 x := v_1.Args[1] 27564 v.reset(OpXor32) 27565 v0 := b.NewValue0(v.Pos, OpConst32, t) 27566 v0.AuxInt = int64(int32(c ^ d)) 27567 v.AddArg(v0) 27568 v.AddArg(x) 27569 return true 27570 } 27571 // match: (Xor32 (Const32 <t> [c]) (Xor32 x (Const32 <t> [d]))) 27572 // cond: 27573 // result: (Xor32 (Const32 <t> [int64(int32(c^d))]) x) 27574 for { 27575 _ = v.Args[1] 27576 v_0 := v.Args[0] 27577 if v_0.Op != OpConst32 { 27578 break 27579 } 27580 t := v_0.Type 27581 c := v_0.AuxInt 27582 v_1 := v.Args[1] 27583 if v_1.Op != OpXor32 { 27584 break 27585 } 27586 _ = v_1.Args[1] 27587 x := v_1.Args[0] 27588 v_1_1 := v_1.Args[1] 27589 if v_1_1.Op != OpConst32 { 27590 break 27591 } 27592 if v_1_1.Type != t { 27593 break 27594 } 27595 d := v_1_1.AuxInt 27596 v.reset(OpXor32) 27597 v0 := b.NewValue0(v.Pos, OpConst32, t) 27598 v0.AuxInt = int64(int32(c ^ d)) 27599 v.AddArg(v0) 27600 v.AddArg(x) 27601 return true 27602 } 27603 // match: (Xor32 (Xor32 (Const32 <t> [d]) x) (Const32 <t> [c])) 27604 // cond: 27605 // result: (Xor32 (Const32 <t> [int64(int32(c^d))]) x) 27606 for { 27607 _ = v.Args[1] 27608 v_0 := v.Args[0] 27609 if v_0.Op != OpXor32 { 27610 break 27611 } 27612 _ = v_0.Args[1] 27613 v_0_0 := v_0.Args[0] 27614 if v_0_0.Op != OpConst32 { 27615 break 27616 } 27617 t := v_0_0.Type 27618 d := v_0_0.AuxInt 27619 x := v_0.Args[1] 27620 v_1 := v.Args[1] 27621 if v_1.Op != OpConst32 { 27622 break 27623 } 27624 if v_1.Type != t { 27625 break 27626 } 27627 c := v_1.AuxInt 27628 v.reset(OpXor32) 27629 v0 := b.NewValue0(v.Pos, OpConst32, t) 27630 v0.AuxInt = int64(int32(c ^ d)) 27631 v.AddArg(v0) 27632 v.AddArg(x) 27633 return true 27634 } 27635 // match: (Xor32 (Xor32 x (Const32 <t> [d])) (Const32 <t> [c])) 27636 // cond: 27637 // result: (Xor32 (Const32 <t> [int64(int32(c^d))]) x) 27638 for { 27639 _ = v.Args[1] 27640 v_0 := v.Args[0] 27641 if v_0.Op != OpXor32 { 27642 break 27643 } 27644 _ = v_0.Args[1] 27645 x := v_0.Args[0] 27646 v_0_1 := v_0.Args[1] 27647 if v_0_1.Op != OpConst32 { 27648 break 27649 } 27650 t := v_0_1.Type 27651 d := v_0_1.AuxInt 27652 v_1 := v.Args[1] 27653 if v_1.Op != OpConst32 { 27654 break 27655 } 27656 if v_1.Type != t { 27657 break 27658 } 27659 c := v_1.AuxInt 27660 v.reset(OpXor32) 27661 v0 := b.NewValue0(v.Pos, OpConst32, t) 27662 v0.AuxInt = int64(int32(c ^ d)) 27663 v.AddArg(v0) 27664 v.AddArg(x) 27665 return true 27666 } 27667 return false 27668 } 27669 func rewriteValuegeneric_OpXor64_0(v *Value) bool { 27670 b := v.Block 27671 _ = b 27672 // match: (Xor64 (Const64 [c]) (Const64 [d])) 27673 // cond: 27674 // result: (Const64 [c^d]) 27675 for { 27676 _ = v.Args[1] 27677 v_0 := v.Args[0] 27678 if v_0.Op != OpConst64 { 27679 break 27680 } 27681 c := v_0.AuxInt 27682 v_1 := v.Args[1] 27683 if v_1.Op != OpConst64 { 27684 break 27685 } 27686 d := v_1.AuxInt 27687 v.reset(OpConst64) 27688 v.AuxInt = c ^ d 27689 return true 27690 } 27691 // match: (Xor64 (Const64 [d]) (Const64 [c])) 27692 // cond: 27693 // result: (Const64 [c^d]) 27694 for { 27695 _ = v.Args[1] 27696 v_0 := v.Args[0] 27697 if v_0.Op != OpConst64 { 27698 break 27699 } 27700 d := v_0.AuxInt 27701 v_1 := v.Args[1] 27702 if v_1.Op != OpConst64 { 27703 break 27704 } 27705 c := v_1.AuxInt 27706 v.reset(OpConst64) 27707 v.AuxInt = c ^ d 27708 return true 27709 } 27710 // match: (Xor64 x x) 27711 // cond: 27712 // result: (Const64 [0]) 27713 for { 27714 _ = v.Args[1] 27715 x := v.Args[0] 27716 if x != v.Args[1] { 27717 break 27718 } 27719 v.reset(OpConst64) 27720 v.AuxInt = 0 27721 return true 27722 } 27723 // match: (Xor64 (Const64 [0]) x) 27724 // cond: 27725 // result: x 27726 for { 27727 _ = v.Args[1] 27728 v_0 := v.Args[0] 27729 if v_0.Op != OpConst64 { 27730 break 27731 } 27732 if v_0.AuxInt != 0 { 27733 break 27734 } 27735 x := v.Args[1] 27736 v.reset(OpCopy) 27737 v.Type = x.Type 27738 v.AddArg(x) 27739 return true 27740 } 27741 // match: (Xor64 x (Const64 [0])) 27742 // cond: 27743 // result: x 27744 for { 27745 _ = v.Args[1] 27746 x := v.Args[0] 27747 v_1 := v.Args[1] 27748 if v_1.Op != OpConst64 { 27749 break 27750 } 27751 if v_1.AuxInt != 0 { 27752 break 27753 } 27754 v.reset(OpCopy) 27755 v.Type = x.Type 27756 v.AddArg(x) 27757 return true 27758 } 27759 // match: (Xor64 x (Xor64 x y)) 27760 // cond: 27761 // result: y 27762 for { 27763 _ = v.Args[1] 27764 x := v.Args[0] 27765 v_1 := v.Args[1] 27766 if v_1.Op != OpXor64 { 27767 break 27768 } 27769 _ = v_1.Args[1] 27770 if x != v_1.Args[0] { 27771 break 27772 } 27773 y := v_1.Args[1] 27774 v.reset(OpCopy) 27775 v.Type = y.Type 27776 v.AddArg(y) 27777 return true 27778 } 27779 // match: (Xor64 x (Xor64 y x)) 27780 // cond: 27781 // result: y 27782 for { 27783 _ = v.Args[1] 27784 x := v.Args[0] 27785 v_1 := v.Args[1] 27786 if v_1.Op != OpXor64 { 27787 break 27788 } 27789 _ = v_1.Args[1] 27790 y := v_1.Args[0] 27791 if x != v_1.Args[1] { 27792 break 27793 } 27794 v.reset(OpCopy) 27795 v.Type = y.Type 27796 v.AddArg(y) 27797 return true 27798 } 27799 // match: (Xor64 (Xor64 x y) x) 27800 // cond: 27801 // result: y 27802 for { 27803 _ = v.Args[1] 27804 v_0 := v.Args[0] 27805 if v_0.Op != OpXor64 { 27806 break 27807 } 27808 _ = v_0.Args[1] 27809 x := v_0.Args[0] 27810 y := v_0.Args[1] 27811 if x != v.Args[1] { 27812 break 27813 } 27814 v.reset(OpCopy) 27815 v.Type = y.Type 27816 v.AddArg(y) 27817 return true 27818 } 27819 // match: (Xor64 (Xor64 y x) x) 27820 // cond: 27821 // result: y 27822 for { 27823 _ = v.Args[1] 27824 v_0 := v.Args[0] 27825 if v_0.Op != OpXor64 { 27826 break 27827 } 27828 _ = v_0.Args[1] 27829 y := v_0.Args[0] 27830 x := v_0.Args[1] 27831 if x != v.Args[1] { 27832 break 27833 } 27834 v.reset(OpCopy) 27835 v.Type = y.Type 27836 v.AddArg(y) 27837 return true 27838 } 27839 // match: (Xor64 (Xor64 i:(Const64 <t>) z) x) 27840 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 27841 // result: (Xor64 i (Xor64 <t> z x)) 27842 for { 27843 _ = v.Args[1] 27844 v_0 := v.Args[0] 27845 if v_0.Op != OpXor64 { 27846 break 27847 } 27848 _ = v_0.Args[1] 27849 i := v_0.Args[0] 27850 if i.Op != OpConst64 { 27851 break 27852 } 27853 t := i.Type 27854 z := v_0.Args[1] 27855 x := v.Args[1] 27856 if !(z.Op != OpConst64 && x.Op != OpConst64) { 27857 break 27858 } 27859 v.reset(OpXor64) 27860 v.AddArg(i) 27861 v0 := b.NewValue0(v.Pos, OpXor64, t) 27862 v0.AddArg(z) 27863 v0.AddArg(x) 27864 v.AddArg(v0) 27865 return true 27866 } 27867 return false 27868 } 27869 func rewriteValuegeneric_OpXor64_10(v *Value) bool { 27870 b := v.Block 27871 _ = b 27872 // match: (Xor64 (Xor64 z i:(Const64 <t>)) x) 27873 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 27874 // result: (Xor64 i (Xor64 <t> z x)) 27875 for { 27876 _ = v.Args[1] 27877 v_0 := v.Args[0] 27878 if v_0.Op != OpXor64 { 27879 break 27880 } 27881 _ = v_0.Args[1] 27882 z := v_0.Args[0] 27883 i := v_0.Args[1] 27884 if i.Op != OpConst64 { 27885 break 27886 } 27887 t := i.Type 27888 x := v.Args[1] 27889 if !(z.Op != OpConst64 && x.Op != OpConst64) { 27890 break 27891 } 27892 v.reset(OpXor64) 27893 v.AddArg(i) 27894 v0 := b.NewValue0(v.Pos, OpXor64, t) 27895 v0.AddArg(z) 27896 v0.AddArg(x) 27897 v.AddArg(v0) 27898 return true 27899 } 27900 // match: (Xor64 x (Xor64 i:(Const64 <t>) z)) 27901 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 27902 // result: (Xor64 i (Xor64 <t> z x)) 27903 for { 27904 _ = v.Args[1] 27905 x := v.Args[0] 27906 v_1 := v.Args[1] 27907 if v_1.Op != OpXor64 { 27908 break 27909 } 27910 _ = v_1.Args[1] 27911 i := v_1.Args[0] 27912 if i.Op != OpConst64 { 27913 break 27914 } 27915 t := i.Type 27916 z := v_1.Args[1] 27917 if !(z.Op != OpConst64 && x.Op != OpConst64) { 27918 break 27919 } 27920 v.reset(OpXor64) 27921 v.AddArg(i) 27922 v0 := b.NewValue0(v.Pos, OpXor64, t) 27923 v0.AddArg(z) 27924 v0.AddArg(x) 27925 v.AddArg(v0) 27926 return true 27927 } 27928 // match: (Xor64 x (Xor64 z i:(Const64 <t>))) 27929 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 27930 // result: (Xor64 i (Xor64 <t> z x)) 27931 for { 27932 _ = v.Args[1] 27933 x := v.Args[0] 27934 v_1 := v.Args[1] 27935 if v_1.Op != OpXor64 { 27936 break 27937 } 27938 _ = v_1.Args[1] 27939 z := v_1.Args[0] 27940 i := v_1.Args[1] 27941 if i.Op != OpConst64 { 27942 break 27943 } 27944 t := i.Type 27945 if !(z.Op != OpConst64 && x.Op != OpConst64) { 27946 break 27947 } 27948 v.reset(OpXor64) 27949 v.AddArg(i) 27950 v0 := b.NewValue0(v.Pos, OpXor64, t) 27951 v0.AddArg(z) 27952 v0.AddArg(x) 27953 v.AddArg(v0) 27954 return true 27955 } 27956 // match: (Xor64 (Const64 <t> [c]) (Xor64 (Const64 <t> [d]) x)) 27957 // cond: 27958 // result: (Xor64 (Const64 <t> [c^d]) x) 27959 for { 27960 _ = v.Args[1] 27961 v_0 := v.Args[0] 27962 if v_0.Op != OpConst64 { 27963 break 27964 } 27965 t := v_0.Type 27966 c := v_0.AuxInt 27967 v_1 := v.Args[1] 27968 if v_1.Op != OpXor64 { 27969 break 27970 } 27971 _ = v_1.Args[1] 27972 v_1_0 := v_1.Args[0] 27973 if v_1_0.Op != OpConst64 { 27974 break 27975 } 27976 if v_1_0.Type != t { 27977 break 27978 } 27979 d := v_1_0.AuxInt 27980 x := v_1.Args[1] 27981 v.reset(OpXor64) 27982 v0 := b.NewValue0(v.Pos, OpConst64, t) 27983 v0.AuxInt = c ^ d 27984 v.AddArg(v0) 27985 v.AddArg(x) 27986 return true 27987 } 27988 // match: (Xor64 (Const64 <t> [c]) (Xor64 x (Const64 <t> [d]))) 27989 // cond: 27990 // result: (Xor64 (Const64 <t> [c^d]) x) 27991 for { 27992 _ = v.Args[1] 27993 v_0 := v.Args[0] 27994 if v_0.Op != OpConst64 { 27995 break 27996 } 27997 t := v_0.Type 27998 c := v_0.AuxInt 27999 v_1 := v.Args[1] 28000 if v_1.Op != OpXor64 { 28001 break 28002 } 28003 _ = v_1.Args[1] 28004 x := v_1.Args[0] 28005 v_1_1 := v_1.Args[1] 28006 if v_1_1.Op != OpConst64 { 28007 break 28008 } 28009 if v_1_1.Type != t { 28010 break 28011 } 28012 d := v_1_1.AuxInt 28013 v.reset(OpXor64) 28014 v0 := b.NewValue0(v.Pos, OpConst64, t) 28015 v0.AuxInt = c ^ d 28016 v.AddArg(v0) 28017 v.AddArg(x) 28018 return true 28019 } 28020 // match: (Xor64 (Xor64 (Const64 <t> [d]) x) (Const64 <t> [c])) 28021 // cond: 28022 // result: (Xor64 (Const64 <t> [c^d]) x) 28023 for { 28024 _ = v.Args[1] 28025 v_0 := v.Args[0] 28026 if v_0.Op != OpXor64 { 28027 break 28028 } 28029 _ = v_0.Args[1] 28030 v_0_0 := v_0.Args[0] 28031 if v_0_0.Op != OpConst64 { 28032 break 28033 } 28034 t := v_0_0.Type 28035 d := v_0_0.AuxInt 28036 x := v_0.Args[1] 28037 v_1 := v.Args[1] 28038 if v_1.Op != OpConst64 { 28039 break 28040 } 28041 if v_1.Type != t { 28042 break 28043 } 28044 c := v_1.AuxInt 28045 v.reset(OpXor64) 28046 v0 := b.NewValue0(v.Pos, OpConst64, t) 28047 v0.AuxInt = c ^ d 28048 v.AddArg(v0) 28049 v.AddArg(x) 28050 return true 28051 } 28052 // match: (Xor64 (Xor64 x (Const64 <t> [d])) (Const64 <t> [c])) 28053 // cond: 28054 // result: (Xor64 (Const64 <t> [c^d]) x) 28055 for { 28056 _ = v.Args[1] 28057 v_0 := v.Args[0] 28058 if v_0.Op != OpXor64 { 28059 break 28060 } 28061 _ = v_0.Args[1] 28062 x := v_0.Args[0] 28063 v_0_1 := v_0.Args[1] 28064 if v_0_1.Op != OpConst64 { 28065 break 28066 } 28067 t := v_0_1.Type 28068 d := v_0_1.AuxInt 28069 v_1 := v.Args[1] 28070 if v_1.Op != OpConst64 { 28071 break 28072 } 28073 if v_1.Type != t { 28074 break 28075 } 28076 c := v_1.AuxInt 28077 v.reset(OpXor64) 28078 v0 := b.NewValue0(v.Pos, OpConst64, t) 28079 v0.AuxInt = c ^ d 28080 v.AddArg(v0) 28081 v.AddArg(x) 28082 return true 28083 } 28084 return false 28085 } 28086 func rewriteValuegeneric_OpXor8_0(v *Value) bool { 28087 b := v.Block 28088 _ = b 28089 // match: (Xor8 (Const8 [c]) (Const8 [d])) 28090 // cond: 28091 // result: (Const8 [int64(int8(c^d))]) 28092 for { 28093 _ = v.Args[1] 28094 v_0 := v.Args[0] 28095 if v_0.Op != OpConst8 { 28096 break 28097 } 28098 c := v_0.AuxInt 28099 v_1 := v.Args[1] 28100 if v_1.Op != OpConst8 { 28101 break 28102 } 28103 d := v_1.AuxInt 28104 v.reset(OpConst8) 28105 v.AuxInt = int64(int8(c ^ d)) 28106 return true 28107 } 28108 // match: (Xor8 (Const8 [d]) (Const8 [c])) 28109 // cond: 28110 // result: (Const8 [int64(int8(c^d))]) 28111 for { 28112 _ = v.Args[1] 28113 v_0 := v.Args[0] 28114 if v_0.Op != OpConst8 { 28115 break 28116 } 28117 d := v_0.AuxInt 28118 v_1 := v.Args[1] 28119 if v_1.Op != OpConst8 { 28120 break 28121 } 28122 c := v_1.AuxInt 28123 v.reset(OpConst8) 28124 v.AuxInt = int64(int8(c ^ d)) 28125 return true 28126 } 28127 // match: (Xor8 x x) 28128 // cond: 28129 // result: (Const8 [0]) 28130 for { 28131 _ = v.Args[1] 28132 x := v.Args[0] 28133 if x != v.Args[1] { 28134 break 28135 } 28136 v.reset(OpConst8) 28137 v.AuxInt = 0 28138 return true 28139 } 28140 // match: (Xor8 (Const8 [0]) x) 28141 // cond: 28142 // result: x 28143 for { 28144 _ = v.Args[1] 28145 v_0 := v.Args[0] 28146 if v_0.Op != OpConst8 { 28147 break 28148 } 28149 if v_0.AuxInt != 0 { 28150 break 28151 } 28152 x := v.Args[1] 28153 v.reset(OpCopy) 28154 v.Type = x.Type 28155 v.AddArg(x) 28156 return true 28157 } 28158 // match: (Xor8 x (Const8 [0])) 28159 // cond: 28160 // result: x 28161 for { 28162 _ = v.Args[1] 28163 x := v.Args[0] 28164 v_1 := v.Args[1] 28165 if v_1.Op != OpConst8 { 28166 break 28167 } 28168 if v_1.AuxInt != 0 { 28169 break 28170 } 28171 v.reset(OpCopy) 28172 v.Type = x.Type 28173 v.AddArg(x) 28174 return true 28175 } 28176 // match: (Xor8 x (Xor8 x y)) 28177 // cond: 28178 // result: y 28179 for { 28180 _ = v.Args[1] 28181 x := v.Args[0] 28182 v_1 := v.Args[1] 28183 if v_1.Op != OpXor8 { 28184 break 28185 } 28186 _ = v_1.Args[1] 28187 if x != v_1.Args[0] { 28188 break 28189 } 28190 y := v_1.Args[1] 28191 v.reset(OpCopy) 28192 v.Type = y.Type 28193 v.AddArg(y) 28194 return true 28195 } 28196 // match: (Xor8 x (Xor8 y x)) 28197 // cond: 28198 // result: y 28199 for { 28200 _ = v.Args[1] 28201 x := v.Args[0] 28202 v_1 := v.Args[1] 28203 if v_1.Op != OpXor8 { 28204 break 28205 } 28206 _ = v_1.Args[1] 28207 y := v_1.Args[0] 28208 if x != v_1.Args[1] { 28209 break 28210 } 28211 v.reset(OpCopy) 28212 v.Type = y.Type 28213 v.AddArg(y) 28214 return true 28215 } 28216 // match: (Xor8 (Xor8 x y) x) 28217 // cond: 28218 // result: y 28219 for { 28220 _ = v.Args[1] 28221 v_0 := v.Args[0] 28222 if v_0.Op != OpXor8 { 28223 break 28224 } 28225 _ = v_0.Args[1] 28226 x := v_0.Args[0] 28227 y := v_0.Args[1] 28228 if x != v.Args[1] { 28229 break 28230 } 28231 v.reset(OpCopy) 28232 v.Type = y.Type 28233 v.AddArg(y) 28234 return true 28235 } 28236 // match: (Xor8 (Xor8 y x) x) 28237 // cond: 28238 // result: y 28239 for { 28240 _ = v.Args[1] 28241 v_0 := v.Args[0] 28242 if v_0.Op != OpXor8 { 28243 break 28244 } 28245 _ = v_0.Args[1] 28246 y := v_0.Args[0] 28247 x := v_0.Args[1] 28248 if x != v.Args[1] { 28249 break 28250 } 28251 v.reset(OpCopy) 28252 v.Type = y.Type 28253 v.AddArg(y) 28254 return true 28255 } 28256 // match: (Xor8 (Xor8 i:(Const8 <t>) z) x) 28257 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 28258 // result: (Xor8 i (Xor8 <t> z x)) 28259 for { 28260 _ = v.Args[1] 28261 v_0 := v.Args[0] 28262 if v_0.Op != OpXor8 { 28263 break 28264 } 28265 _ = v_0.Args[1] 28266 i := v_0.Args[0] 28267 if i.Op != OpConst8 { 28268 break 28269 } 28270 t := i.Type 28271 z := v_0.Args[1] 28272 x := v.Args[1] 28273 if !(z.Op != OpConst8 && x.Op != OpConst8) { 28274 break 28275 } 28276 v.reset(OpXor8) 28277 v.AddArg(i) 28278 v0 := b.NewValue0(v.Pos, OpXor8, t) 28279 v0.AddArg(z) 28280 v0.AddArg(x) 28281 v.AddArg(v0) 28282 return true 28283 } 28284 return false 28285 } 28286 func rewriteValuegeneric_OpXor8_10(v *Value) bool { 28287 b := v.Block 28288 _ = b 28289 // match: (Xor8 (Xor8 z i:(Const8 <t>)) x) 28290 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 28291 // result: (Xor8 i (Xor8 <t> z x)) 28292 for { 28293 _ = v.Args[1] 28294 v_0 := v.Args[0] 28295 if v_0.Op != OpXor8 { 28296 break 28297 } 28298 _ = v_0.Args[1] 28299 z := v_0.Args[0] 28300 i := v_0.Args[1] 28301 if i.Op != OpConst8 { 28302 break 28303 } 28304 t := i.Type 28305 x := v.Args[1] 28306 if !(z.Op != OpConst8 && x.Op != OpConst8) { 28307 break 28308 } 28309 v.reset(OpXor8) 28310 v.AddArg(i) 28311 v0 := b.NewValue0(v.Pos, OpXor8, t) 28312 v0.AddArg(z) 28313 v0.AddArg(x) 28314 v.AddArg(v0) 28315 return true 28316 } 28317 // match: (Xor8 x (Xor8 i:(Const8 <t>) z)) 28318 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 28319 // result: (Xor8 i (Xor8 <t> z x)) 28320 for { 28321 _ = v.Args[1] 28322 x := v.Args[0] 28323 v_1 := v.Args[1] 28324 if v_1.Op != OpXor8 { 28325 break 28326 } 28327 _ = v_1.Args[1] 28328 i := v_1.Args[0] 28329 if i.Op != OpConst8 { 28330 break 28331 } 28332 t := i.Type 28333 z := v_1.Args[1] 28334 if !(z.Op != OpConst8 && x.Op != OpConst8) { 28335 break 28336 } 28337 v.reset(OpXor8) 28338 v.AddArg(i) 28339 v0 := b.NewValue0(v.Pos, OpXor8, t) 28340 v0.AddArg(z) 28341 v0.AddArg(x) 28342 v.AddArg(v0) 28343 return true 28344 } 28345 // match: (Xor8 x (Xor8 z i:(Const8 <t>))) 28346 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 28347 // result: (Xor8 i (Xor8 <t> z x)) 28348 for { 28349 _ = v.Args[1] 28350 x := v.Args[0] 28351 v_1 := v.Args[1] 28352 if v_1.Op != OpXor8 { 28353 break 28354 } 28355 _ = v_1.Args[1] 28356 z := v_1.Args[0] 28357 i := v_1.Args[1] 28358 if i.Op != OpConst8 { 28359 break 28360 } 28361 t := i.Type 28362 if !(z.Op != OpConst8 && x.Op != OpConst8) { 28363 break 28364 } 28365 v.reset(OpXor8) 28366 v.AddArg(i) 28367 v0 := b.NewValue0(v.Pos, OpXor8, t) 28368 v0.AddArg(z) 28369 v0.AddArg(x) 28370 v.AddArg(v0) 28371 return true 28372 } 28373 // match: (Xor8 (Const8 <t> [c]) (Xor8 (Const8 <t> [d]) x)) 28374 // cond: 28375 // result: (Xor8 (Const8 <t> [int64(int8(c^d))]) x) 28376 for { 28377 _ = v.Args[1] 28378 v_0 := v.Args[0] 28379 if v_0.Op != OpConst8 { 28380 break 28381 } 28382 t := v_0.Type 28383 c := v_0.AuxInt 28384 v_1 := v.Args[1] 28385 if v_1.Op != OpXor8 { 28386 break 28387 } 28388 _ = v_1.Args[1] 28389 v_1_0 := v_1.Args[0] 28390 if v_1_0.Op != OpConst8 { 28391 break 28392 } 28393 if v_1_0.Type != t { 28394 break 28395 } 28396 d := v_1_0.AuxInt 28397 x := v_1.Args[1] 28398 v.reset(OpXor8) 28399 v0 := b.NewValue0(v.Pos, OpConst8, t) 28400 v0.AuxInt = int64(int8(c ^ d)) 28401 v.AddArg(v0) 28402 v.AddArg(x) 28403 return true 28404 } 28405 // match: (Xor8 (Const8 <t> [c]) (Xor8 x (Const8 <t> [d]))) 28406 // cond: 28407 // result: (Xor8 (Const8 <t> [int64(int8(c^d))]) x) 28408 for { 28409 _ = v.Args[1] 28410 v_0 := v.Args[0] 28411 if v_0.Op != OpConst8 { 28412 break 28413 } 28414 t := v_0.Type 28415 c := v_0.AuxInt 28416 v_1 := v.Args[1] 28417 if v_1.Op != OpXor8 { 28418 break 28419 } 28420 _ = v_1.Args[1] 28421 x := v_1.Args[0] 28422 v_1_1 := v_1.Args[1] 28423 if v_1_1.Op != OpConst8 { 28424 break 28425 } 28426 if v_1_1.Type != t { 28427 break 28428 } 28429 d := v_1_1.AuxInt 28430 v.reset(OpXor8) 28431 v0 := b.NewValue0(v.Pos, OpConst8, t) 28432 v0.AuxInt = int64(int8(c ^ d)) 28433 v.AddArg(v0) 28434 v.AddArg(x) 28435 return true 28436 } 28437 // match: (Xor8 (Xor8 (Const8 <t> [d]) x) (Const8 <t> [c])) 28438 // cond: 28439 // result: (Xor8 (Const8 <t> [int64(int8(c^d))]) x) 28440 for { 28441 _ = v.Args[1] 28442 v_0 := v.Args[0] 28443 if v_0.Op != OpXor8 { 28444 break 28445 } 28446 _ = v_0.Args[1] 28447 v_0_0 := v_0.Args[0] 28448 if v_0_0.Op != OpConst8 { 28449 break 28450 } 28451 t := v_0_0.Type 28452 d := v_0_0.AuxInt 28453 x := v_0.Args[1] 28454 v_1 := v.Args[1] 28455 if v_1.Op != OpConst8 { 28456 break 28457 } 28458 if v_1.Type != t { 28459 break 28460 } 28461 c := v_1.AuxInt 28462 v.reset(OpXor8) 28463 v0 := b.NewValue0(v.Pos, OpConst8, t) 28464 v0.AuxInt = int64(int8(c ^ d)) 28465 v.AddArg(v0) 28466 v.AddArg(x) 28467 return true 28468 } 28469 // match: (Xor8 (Xor8 x (Const8 <t> [d])) (Const8 <t> [c])) 28470 // cond: 28471 // result: (Xor8 (Const8 <t> [int64(int8(c^d))]) x) 28472 for { 28473 _ = v.Args[1] 28474 v_0 := v.Args[0] 28475 if v_0.Op != OpXor8 { 28476 break 28477 } 28478 _ = v_0.Args[1] 28479 x := v_0.Args[0] 28480 v_0_1 := v_0.Args[1] 28481 if v_0_1.Op != OpConst8 { 28482 break 28483 } 28484 t := v_0_1.Type 28485 d := v_0_1.AuxInt 28486 v_1 := v.Args[1] 28487 if v_1.Op != OpConst8 { 28488 break 28489 } 28490 if v_1.Type != t { 28491 break 28492 } 28493 c := v_1.AuxInt 28494 v.reset(OpXor8) 28495 v0 := b.NewValue0(v.Pos, OpConst8, t) 28496 v0.AuxInt = int64(int8(c ^ d)) 28497 v.AddArg(v0) 28498 v.AddArg(x) 28499 return true 28500 } 28501 return false 28502 } 28503 func rewriteValuegeneric_OpZero_0(v *Value) bool { 28504 b := v.Block 28505 _ = b 28506 config := b.Func.Config 28507 _ = config 28508 // match: (Zero (Load (OffPtr [c] (SP)) mem) mem) 28509 // cond: mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize 28510 // result: mem 28511 for { 28512 _ = v.Args[1] 28513 v_0 := v.Args[0] 28514 if v_0.Op != OpLoad { 28515 break 28516 } 28517 _ = v_0.Args[1] 28518 v_0_0 := v_0.Args[0] 28519 if v_0_0.Op != OpOffPtr { 28520 break 28521 } 28522 c := v_0_0.AuxInt 28523 v_0_0_0 := v_0_0.Args[0] 28524 if v_0_0_0.Op != OpSP { 28525 break 28526 } 28527 mem := v_0.Args[1] 28528 if mem != v.Args[1] { 28529 break 28530 } 28531 if !(mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize) { 28532 break 28533 } 28534 v.reset(OpCopy) 28535 v.Type = mem.Type 28536 v.AddArg(mem) 28537 return true 28538 } 28539 return false 28540 } 28541 func rewriteValuegeneric_OpZeroExt16to32_0(v *Value) bool { 28542 // match: (ZeroExt16to32 (Const16 [c])) 28543 // cond: 28544 // result: (Const32 [int64(uint16(c))]) 28545 for { 28546 v_0 := v.Args[0] 28547 if v_0.Op != OpConst16 { 28548 break 28549 } 28550 c := v_0.AuxInt 28551 v.reset(OpConst32) 28552 v.AuxInt = int64(uint16(c)) 28553 return true 28554 } 28555 // match: (ZeroExt16to32 (Trunc32to16 x:(Rsh32Ux64 _ (Const64 [s])))) 28556 // cond: s >= 16 28557 // result: x 28558 for { 28559 v_0 := v.Args[0] 28560 if v_0.Op != OpTrunc32to16 { 28561 break 28562 } 28563 x := v_0.Args[0] 28564 if x.Op != OpRsh32Ux64 { 28565 break 28566 } 28567 _ = x.Args[1] 28568 x_1 := x.Args[1] 28569 if x_1.Op != OpConst64 { 28570 break 28571 } 28572 s := x_1.AuxInt 28573 if !(s >= 16) { 28574 break 28575 } 28576 v.reset(OpCopy) 28577 v.Type = x.Type 28578 v.AddArg(x) 28579 return true 28580 } 28581 return false 28582 } 28583 func rewriteValuegeneric_OpZeroExt16to64_0(v *Value) bool { 28584 // match: (ZeroExt16to64 (Const16 [c])) 28585 // cond: 28586 // result: (Const64 [int64(uint16(c))]) 28587 for { 28588 v_0 := v.Args[0] 28589 if v_0.Op != OpConst16 { 28590 break 28591 } 28592 c := v_0.AuxInt 28593 v.reset(OpConst64) 28594 v.AuxInt = int64(uint16(c)) 28595 return true 28596 } 28597 // match: (ZeroExt16to64 (Trunc64to16 x:(Rsh64Ux64 _ (Const64 [s])))) 28598 // cond: s >= 48 28599 // result: x 28600 for { 28601 v_0 := v.Args[0] 28602 if v_0.Op != OpTrunc64to16 { 28603 break 28604 } 28605 x := v_0.Args[0] 28606 if x.Op != OpRsh64Ux64 { 28607 break 28608 } 28609 _ = x.Args[1] 28610 x_1 := x.Args[1] 28611 if x_1.Op != OpConst64 { 28612 break 28613 } 28614 s := x_1.AuxInt 28615 if !(s >= 48) { 28616 break 28617 } 28618 v.reset(OpCopy) 28619 v.Type = x.Type 28620 v.AddArg(x) 28621 return true 28622 } 28623 return false 28624 } 28625 func rewriteValuegeneric_OpZeroExt32to64_0(v *Value) bool { 28626 // match: (ZeroExt32to64 (Const32 [c])) 28627 // cond: 28628 // result: (Const64 [int64(uint32(c))]) 28629 for { 28630 v_0 := v.Args[0] 28631 if v_0.Op != OpConst32 { 28632 break 28633 } 28634 c := v_0.AuxInt 28635 v.reset(OpConst64) 28636 v.AuxInt = int64(uint32(c)) 28637 return true 28638 } 28639 // match: (ZeroExt32to64 (Trunc64to32 x:(Rsh64Ux64 _ (Const64 [s])))) 28640 // cond: s >= 32 28641 // result: x 28642 for { 28643 v_0 := v.Args[0] 28644 if v_0.Op != OpTrunc64to32 { 28645 break 28646 } 28647 x := v_0.Args[0] 28648 if x.Op != OpRsh64Ux64 { 28649 break 28650 } 28651 _ = x.Args[1] 28652 x_1 := x.Args[1] 28653 if x_1.Op != OpConst64 { 28654 break 28655 } 28656 s := x_1.AuxInt 28657 if !(s >= 32) { 28658 break 28659 } 28660 v.reset(OpCopy) 28661 v.Type = x.Type 28662 v.AddArg(x) 28663 return true 28664 } 28665 return false 28666 } 28667 func rewriteValuegeneric_OpZeroExt8to16_0(v *Value) bool { 28668 // match: (ZeroExt8to16 (Const8 [c])) 28669 // cond: 28670 // result: (Const16 [int64( uint8(c))]) 28671 for { 28672 v_0 := v.Args[0] 28673 if v_0.Op != OpConst8 { 28674 break 28675 } 28676 c := v_0.AuxInt 28677 v.reset(OpConst16) 28678 v.AuxInt = int64(uint8(c)) 28679 return true 28680 } 28681 // match: (ZeroExt8to16 (Trunc16to8 x:(Rsh16Ux64 _ (Const64 [s])))) 28682 // cond: s >= 8 28683 // result: x 28684 for { 28685 v_0 := v.Args[0] 28686 if v_0.Op != OpTrunc16to8 { 28687 break 28688 } 28689 x := v_0.Args[0] 28690 if x.Op != OpRsh16Ux64 { 28691 break 28692 } 28693 _ = x.Args[1] 28694 x_1 := x.Args[1] 28695 if x_1.Op != OpConst64 { 28696 break 28697 } 28698 s := x_1.AuxInt 28699 if !(s >= 8) { 28700 break 28701 } 28702 v.reset(OpCopy) 28703 v.Type = x.Type 28704 v.AddArg(x) 28705 return true 28706 } 28707 return false 28708 } 28709 func rewriteValuegeneric_OpZeroExt8to32_0(v *Value) bool { 28710 // match: (ZeroExt8to32 (Const8 [c])) 28711 // cond: 28712 // result: (Const32 [int64( uint8(c))]) 28713 for { 28714 v_0 := v.Args[0] 28715 if v_0.Op != OpConst8 { 28716 break 28717 } 28718 c := v_0.AuxInt 28719 v.reset(OpConst32) 28720 v.AuxInt = int64(uint8(c)) 28721 return true 28722 } 28723 // match: (ZeroExt8to32 (Trunc32to8 x:(Rsh32Ux64 _ (Const64 [s])))) 28724 // cond: s >= 24 28725 // result: x 28726 for { 28727 v_0 := v.Args[0] 28728 if v_0.Op != OpTrunc32to8 { 28729 break 28730 } 28731 x := v_0.Args[0] 28732 if x.Op != OpRsh32Ux64 { 28733 break 28734 } 28735 _ = x.Args[1] 28736 x_1 := x.Args[1] 28737 if x_1.Op != OpConst64 { 28738 break 28739 } 28740 s := x_1.AuxInt 28741 if !(s >= 24) { 28742 break 28743 } 28744 v.reset(OpCopy) 28745 v.Type = x.Type 28746 v.AddArg(x) 28747 return true 28748 } 28749 return false 28750 } 28751 func rewriteValuegeneric_OpZeroExt8to64_0(v *Value) bool { 28752 // match: (ZeroExt8to64 (Const8 [c])) 28753 // cond: 28754 // result: (Const64 [int64( uint8(c))]) 28755 for { 28756 v_0 := v.Args[0] 28757 if v_0.Op != OpConst8 { 28758 break 28759 } 28760 c := v_0.AuxInt 28761 v.reset(OpConst64) 28762 v.AuxInt = int64(uint8(c)) 28763 return true 28764 } 28765 // match: (ZeroExt8to64 (Trunc64to8 x:(Rsh64Ux64 _ (Const64 [s])))) 28766 // cond: s >= 56 28767 // result: x 28768 for { 28769 v_0 := v.Args[0] 28770 if v_0.Op != OpTrunc64to8 { 28771 break 28772 } 28773 x := v_0.Args[0] 28774 if x.Op != OpRsh64Ux64 { 28775 break 28776 } 28777 _ = x.Args[1] 28778 x_1 := x.Args[1] 28779 if x_1.Op != OpConst64 { 28780 break 28781 } 28782 s := x_1.AuxInt 28783 if !(s >= 56) { 28784 break 28785 } 28786 v.reset(OpCopy) 28787 v.Type = x.Type 28788 v.AddArg(x) 28789 return true 28790 } 28791 return false 28792 } 28793 func rewriteBlockgeneric(b *Block) bool { 28794 config := b.Func.Config 28795 _ = config 28796 fe := b.Func.fe 28797 _ = fe 28798 typ := &config.Types 28799 _ = typ 28800 switch b.Kind { 28801 case BlockIf: 28802 // match: (If (Not cond) yes no) 28803 // cond: 28804 // result: (If cond no yes) 28805 for { 28806 v := b.Control 28807 if v.Op != OpNot { 28808 break 28809 } 28810 cond := v.Args[0] 28811 b.Kind = BlockIf 28812 b.SetControl(cond) 28813 b.Aux = nil 28814 b.swapSuccessors() 28815 return true 28816 } 28817 // match: (If (ConstBool [c]) yes no) 28818 // cond: c == 1 28819 // result: (First nil yes no) 28820 for { 28821 v := b.Control 28822 if v.Op != OpConstBool { 28823 break 28824 } 28825 c := v.AuxInt 28826 if !(c == 1) { 28827 break 28828 } 28829 b.Kind = BlockFirst 28830 b.SetControl(nil) 28831 b.Aux = nil 28832 return true 28833 } 28834 // match: (If (ConstBool [c]) yes no) 28835 // cond: c == 0 28836 // result: (First nil no yes) 28837 for { 28838 v := b.Control 28839 if v.Op != OpConstBool { 28840 break 28841 } 28842 c := v.AuxInt 28843 if !(c == 0) { 28844 break 28845 } 28846 b.Kind = BlockFirst 28847 b.SetControl(nil) 28848 b.Aux = nil 28849 b.swapSuccessors() 28850 return true 28851 } 28852 } 28853 return false 28854 }