github.com/corona10/go@v0.0.0-20180224231303-7a218942be57/src/cmd/compile/internal/ssa/rewritegeneric.go (about) 1 // Code generated from gen/generic.rules; DO NOT EDIT. 2 // generated with: cd gen; go run *.go 3 4 package ssa 5 6 import "math" 7 import "cmd/internal/obj" 8 import "cmd/internal/objabi" 9 import "cmd/compile/internal/types" 10 11 var _ = math.MinInt8 // in case not otherwise used 12 var _ = obj.ANOP // in case not otherwise used 13 var _ = objabi.GOROOT // in case not otherwise used 14 var _ = types.TypeMem // in case not otherwise used 15 16 func rewriteValuegeneric(v *Value) bool { 17 switch v.Op { 18 case OpAdd16: 19 return rewriteValuegeneric_OpAdd16_0(v) || rewriteValuegeneric_OpAdd16_10(v) || rewriteValuegeneric_OpAdd16_20(v) || rewriteValuegeneric_OpAdd16_30(v) 20 case OpAdd32: 21 return rewriteValuegeneric_OpAdd32_0(v) || rewriteValuegeneric_OpAdd32_10(v) || rewriteValuegeneric_OpAdd32_20(v) || rewriteValuegeneric_OpAdd32_30(v) 22 case OpAdd32F: 23 return rewriteValuegeneric_OpAdd32F_0(v) 24 case OpAdd64: 25 return rewriteValuegeneric_OpAdd64_0(v) || rewriteValuegeneric_OpAdd64_10(v) || rewriteValuegeneric_OpAdd64_20(v) || rewriteValuegeneric_OpAdd64_30(v) 26 case OpAdd64F: 27 return rewriteValuegeneric_OpAdd64F_0(v) 28 case OpAdd8: 29 return rewriteValuegeneric_OpAdd8_0(v) || rewriteValuegeneric_OpAdd8_10(v) || rewriteValuegeneric_OpAdd8_20(v) || rewriteValuegeneric_OpAdd8_30(v) 30 case OpAddPtr: 31 return rewriteValuegeneric_OpAddPtr_0(v) 32 case OpAnd16: 33 return rewriteValuegeneric_OpAnd16_0(v) || rewriteValuegeneric_OpAnd16_10(v) 34 case OpAnd32: 35 return rewriteValuegeneric_OpAnd32_0(v) || rewriteValuegeneric_OpAnd32_10(v) 36 case OpAnd64: 37 return rewriteValuegeneric_OpAnd64_0(v) || rewriteValuegeneric_OpAnd64_10(v) || rewriteValuegeneric_OpAnd64_20(v) 38 case OpAnd8: 39 return rewriteValuegeneric_OpAnd8_0(v) || rewriteValuegeneric_OpAnd8_10(v) 40 case OpArg: 41 return rewriteValuegeneric_OpArg_0(v) || rewriteValuegeneric_OpArg_10(v) 42 case OpArraySelect: 43 return rewriteValuegeneric_OpArraySelect_0(v) 44 case OpCom16: 45 return rewriteValuegeneric_OpCom16_0(v) 46 case OpCom32: 47 return rewriteValuegeneric_OpCom32_0(v) 48 case OpCom64: 49 return rewriteValuegeneric_OpCom64_0(v) 50 case OpCom8: 51 return rewriteValuegeneric_OpCom8_0(v) 52 case OpConstInterface: 53 return rewriteValuegeneric_OpConstInterface_0(v) 54 case OpConstSlice: 55 return rewriteValuegeneric_OpConstSlice_0(v) 56 case OpConstString: 57 return rewriteValuegeneric_OpConstString_0(v) 58 case OpConvert: 59 return rewriteValuegeneric_OpConvert_0(v) 60 case OpCvt32Fto32: 61 return rewriteValuegeneric_OpCvt32Fto32_0(v) 62 case OpCvt32Fto64: 63 return rewriteValuegeneric_OpCvt32Fto64_0(v) 64 case OpCvt32Fto64F: 65 return rewriteValuegeneric_OpCvt32Fto64F_0(v) 66 case OpCvt32to32F: 67 return rewriteValuegeneric_OpCvt32to32F_0(v) 68 case OpCvt32to64F: 69 return rewriteValuegeneric_OpCvt32to64F_0(v) 70 case OpCvt64Fto32: 71 return rewriteValuegeneric_OpCvt64Fto32_0(v) 72 case OpCvt64Fto32F: 73 return rewriteValuegeneric_OpCvt64Fto32F_0(v) 74 case OpCvt64Fto64: 75 return rewriteValuegeneric_OpCvt64Fto64_0(v) 76 case OpCvt64to32F: 77 return rewriteValuegeneric_OpCvt64to32F_0(v) 78 case OpCvt64to64F: 79 return rewriteValuegeneric_OpCvt64to64F_0(v) 80 case OpDiv16: 81 return rewriteValuegeneric_OpDiv16_0(v) 82 case OpDiv16u: 83 return rewriteValuegeneric_OpDiv16u_0(v) 84 case OpDiv32: 85 return rewriteValuegeneric_OpDiv32_0(v) 86 case OpDiv32F: 87 return rewriteValuegeneric_OpDiv32F_0(v) 88 case OpDiv32u: 89 return rewriteValuegeneric_OpDiv32u_0(v) 90 case OpDiv64: 91 return rewriteValuegeneric_OpDiv64_0(v) 92 case OpDiv64F: 93 return rewriteValuegeneric_OpDiv64F_0(v) 94 case OpDiv64u: 95 return rewriteValuegeneric_OpDiv64u_0(v) 96 case OpDiv8: 97 return rewriteValuegeneric_OpDiv8_0(v) 98 case OpDiv8u: 99 return rewriteValuegeneric_OpDiv8u_0(v) 100 case OpEq16: 101 return rewriteValuegeneric_OpEq16_0(v) 102 case OpEq32: 103 return rewriteValuegeneric_OpEq32_0(v) 104 case OpEq32F: 105 return rewriteValuegeneric_OpEq32F_0(v) 106 case OpEq64: 107 return rewriteValuegeneric_OpEq64_0(v) 108 case OpEq64F: 109 return rewriteValuegeneric_OpEq64F_0(v) 110 case OpEq8: 111 return rewriteValuegeneric_OpEq8_0(v) 112 case OpEqB: 113 return rewriteValuegeneric_OpEqB_0(v) 114 case OpEqInter: 115 return rewriteValuegeneric_OpEqInter_0(v) 116 case OpEqPtr: 117 return rewriteValuegeneric_OpEqPtr_0(v) 118 case OpEqSlice: 119 return rewriteValuegeneric_OpEqSlice_0(v) 120 case OpGeq16: 121 return rewriteValuegeneric_OpGeq16_0(v) 122 case OpGeq16U: 123 return rewriteValuegeneric_OpGeq16U_0(v) 124 case OpGeq32: 125 return rewriteValuegeneric_OpGeq32_0(v) 126 case OpGeq32F: 127 return rewriteValuegeneric_OpGeq32F_0(v) 128 case OpGeq32U: 129 return rewriteValuegeneric_OpGeq32U_0(v) 130 case OpGeq64: 131 return rewriteValuegeneric_OpGeq64_0(v) 132 case OpGeq64F: 133 return rewriteValuegeneric_OpGeq64F_0(v) 134 case OpGeq64U: 135 return rewriteValuegeneric_OpGeq64U_0(v) 136 case OpGeq8: 137 return rewriteValuegeneric_OpGeq8_0(v) 138 case OpGeq8U: 139 return rewriteValuegeneric_OpGeq8U_0(v) 140 case OpGreater16: 141 return rewriteValuegeneric_OpGreater16_0(v) 142 case OpGreater16U: 143 return rewriteValuegeneric_OpGreater16U_0(v) 144 case OpGreater32: 145 return rewriteValuegeneric_OpGreater32_0(v) 146 case OpGreater32F: 147 return rewriteValuegeneric_OpGreater32F_0(v) 148 case OpGreater32U: 149 return rewriteValuegeneric_OpGreater32U_0(v) 150 case OpGreater64: 151 return rewriteValuegeneric_OpGreater64_0(v) 152 case OpGreater64F: 153 return rewriteValuegeneric_OpGreater64F_0(v) 154 case OpGreater64U: 155 return rewriteValuegeneric_OpGreater64U_0(v) 156 case OpGreater8: 157 return rewriteValuegeneric_OpGreater8_0(v) 158 case OpGreater8U: 159 return rewriteValuegeneric_OpGreater8U_0(v) 160 case OpIMake: 161 return rewriteValuegeneric_OpIMake_0(v) 162 case OpInterCall: 163 return rewriteValuegeneric_OpInterCall_0(v) 164 case OpIsInBounds: 165 return rewriteValuegeneric_OpIsInBounds_0(v) || rewriteValuegeneric_OpIsInBounds_10(v) || rewriteValuegeneric_OpIsInBounds_20(v) || rewriteValuegeneric_OpIsInBounds_30(v) 166 case OpIsNonNil: 167 return rewriteValuegeneric_OpIsNonNil_0(v) 168 case OpIsSliceInBounds: 169 return rewriteValuegeneric_OpIsSliceInBounds_0(v) 170 case OpLeq16: 171 return rewriteValuegeneric_OpLeq16_0(v) 172 case OpLeq16U: 173 return rewriteValuegeneric_OpLeq16U_0(v) 174 case OpLeq32: 175 return rewriteValuegeneric_OpLeq32_0(v) 176 case OpLeq32F: 177 return rewriteValuegeneric_OpLeq32F_0(v) 178 case OpLeq32U: 179 return rewriteValuegeneric_OpLeq32U_0(v) 180 case OpLeq64: 181 return rewriteValuegeneric_OpLeq64_0(v) 182 case OpLeq64F: 183 return rewriteValuegeneric_OpLeq64F_0(v) 184 case OpLeq64U: 185 return rewriteValuegeneric_OpLeq64U_0(v) 186 case OpLeq8: 187 return rewriteValuegeneric_OpLeq8_0(v) 188 case OpLeq8U: 189 return rewriteValuegeneric_OpLeq8U_0(v) 190 case OpLess16: 191 return rewriteValuegeneric_OpLess16_0(v) 192 case OpLess16U: 193 return rewriteValuegeneric_OpLess16U_0(v) 194 case OpLess32: 195 return rewriteValuegeneric_OpLess32_0(v) 196 case OpLess32F: 197 return rewriteValuegeneric_OpLess32F_0(v) 198 case OpLess32U: 199 return rewriteValuegeneric_OpLess32U_0(v) 200 case OpLess64: 201 return rewriteValuegeneric_OpLess64_0(v) 202 case OpLess64F: 203 return rewriteValuegeneric_OpLess64F_0(v) 204 case OpLess64U: 205 return rewriteValuegeneric_OpLess64U_0(v) 206 case OpLess8: 207 return rewriteValuegeneric_OpLess8_0(v) 208 case OpLess8U: 209 return rewriteValuegeneric_OpLess8U_0(v) 210 case OpLoad: 211 return rewriteValuegeneric_OpLoad_0(v) || rewriteValuegeneric_OpLoad_10(v) 212 case OpLsh16x16: 213 return rewriteValuegeneric_OpLsh16x16_0(v) 214 case OpLsh16x32: 215 return rewriteValuegeneric_OpLsh16x32_0(v) 216 case OpLsh16x64: 217 return rewriteValuegeneric_OpLsh16x64_0(v) 218 case OpLsh16x8: 219 return rewriteValuegeneric_OpLsh16x8_0(v) 220 case OpLsh32x16: 221 return rewriteValuegeneric_OpLsh32x16_0(v) 222 case OpLsh32x32: 223 return rewriteValuegeneric_OpLsh32x32_0(v) 224 case OpLsh32x64: 225 return rewriteValuegeneric_OpLsh32x64_0(v) 226 case OpLsh32x8: 227 return rewriteValuegeneric_OpLsh32x8_0(v) 228 case OpLsh64x16: 229 return rewriteValuegeneric_OpLsh64x16_0(v) 230 case OpLsh64x32: 231 return rewriteValuegeneric_OpLsh64x32_0(v) 232 case OpLsh64x64: 233 return rewriteValuegeneric_OpLsh64x64_0(v) 234 case OpLsh64x8: 235 return rewriteValuegeneric_OpLsh64x8_0(v) 236 case OpLsh8x16: 237 return rewriteValuegeneric_OpLsh8x16_0(v) 238 case OpLsh8x32: 239 return rewriteValuegeneric_OpLsh8x32_0(v) 240 case OpLsh8x64: 241 return rewriteValuegeneric_OpLsh8x64_0(v) 242 case OpLsh8x8: 243 return rewriteValuegeneric_OpLsh8x8_0(v) 244 case OpMod16: 245 return rewriteValuegeneric_OpMod16_0(v) 246 case OpMod16u: 247 return rewriteValuegeneric_OpMod16u_0(v) 248 case OpMod32: 249 return rewriteValuegeneric_OpMod32_0(v) 250 case OpMod32u: 251 return rewriteValuegeneric_OpMod32u_0(v) 252 case OpMod64: 253 return rewriteValuegeneric_OpMod64_0(v) 254 case OpMod64u: 255 return rewriteValuegeneric_OpMod64u_0(v) 256 case OpMod8: 257 return rewriteValuegeneric_OpMod8_0(v) 258 case OpMod8u: 259 return rewriteValuegeneric_OpMod8u_0(v) 260 case OpMul16: 261 return rewriteValuegeneric_OpMul16_0(v) || rewriteValuegeneric_OpMul16_10(v) 262 case OpMul32: 263 return rewriteValuegeneric_OpMul32_0(v) || rewriteValuegeneric_OpMul32_10(v) 264 case OpMul32F: 265 return rewriteValuegeneric_OpMul32F_0(v) 266 case OpMul64: 267 return rewriteValuegeneric_OpMul64_0(v) || rewriteValuegeneric_OpMul64_10(v) 268 case OpMul64F: 269 return rewriteValuegeneric_OpMul64F_0(v) 270 case OpMul8: 271 return rewriteValuegeneric_OpMul8_0(v) || rewriteValuegeneric_OpMul8_10(v) 272 case OpNeg16: 273 return rewriteValuegeneric_OpNeg16_0(v) 274 case OpNeg32: 275 return rewriteValuegeneric_OpNeg32_0(v) 276 case OpNeg32F: 277 return rewriteValuegeneric_OpNeg32F_0(v) 278 case OpNeg64: 279 return rewriteValuegeneric_OpNeg64_0(v) 280 case OpNeg64F: 281 return rewriteValuegeneric_OpNeg64F_0(v) 282 case OpNeg8: 283 return rewriteValuegeneric_OpNeg8_0(v) 284 case OpNeq16: 285 return rewriteValuegeneric_OpNeq16_0(v) 286 case OpNeq32: 287 return rewriteValuegeneric_OpNeq32_0(v) 288 case OpNeq32F: 289 return rewriteValuegeneric_OpNeq32F_0(v) 290 case OpNeq64: 291 return rewriteValuegeneric_OpNeq64_0(v) 292 case OpNeq64F: 293 return rewriteValuegeneric_OpNeq64F_0(v) 294 case OpNeq8: 295 return rewriteValuegeneric_OpNeq8_0(v) 296 case OpNeqB: 297 return rewriteValuegeneric_OpNeqB_0(v) 298 case OpNeqInter: 299 return rewriteValuegeneric_OpNeqInter_0(v) 300 case OpNeqPtr: 301 return rewriteValuegeneric_OpNeqPtr_0(v) 302 case OpNeqSlice: 303 return rewriteValuegeneric_OpNeqSlice_0(v) 304 case OpNilCheck: 305 return rewriteValuegeneric_OpNilCheck_0(v) 306 case OpNot: 307 return rewriteValuegeneric_OpNot_0(v) || rewriteValuegeneric_OpNot_10(v) || rewriteValuegeneric_OpNot_20(v) || rewriteValuegeneric_OpNot_30(v) || rewriteValuegeneric_OpNot_40(v) 308 case OpOffPtr: 309 return rewriteValuegeneric_OpOffPtr_0(v) 310 case OpOr16: 311 return rewriteValuegeneric_OpOr16_0(v) || rewriteValuegeneric_OpOr16_10(v) || rewriteValuegeneric_OpOr16_20(v) 312 case OpOr32: 313 return rewriteValuegeneric_OpOr32_0(v) || rewriteValuegeneric_OpOr32_10(v) || rewriteValuegeneric_OpOr32_20(v) 314 case OpOr64: 315 return rewriteValuegeneric_OpOr64_0(v) || rewriteValuegeneric_OpOr64_10(v) || rewriteValuegeneric_OpOr64_20(v) 316 case OpOr8: 317 return rewriteValuegeneric_OpOr8_0(v) || rewriteValuegeneric_OpOr8_10(v) || rewriteValuegeneric_OpOr8_20(v) 318 case OpPhi: 319 return rewriteValuegeneric_OpPhi_0(v) 320 case OpPtrIndex: 321 return rewriteValuegeneric_OpPtrIndex_0(v) 322 case OpRound32F: 323 return rewriteValuegeneric_OpRound32F_0(v) 324 case OpRound64F: 325 return rewriteValuegeneric_OpRound64F_0(v) 326 case OpRsh16Ux16: 327 return rewriteValuegeneric_OpRsh16Ux16_0(v) 328 case OpRsh16Ux32: 329 return rewriteValuegeneric_OpRsh16Ux32_0(v) 330 case OpRsh16Ux64: 331 return rewriteValuegeneric_OpRsh16Ux64_0(v) 332 case OpRsh16Ux8: 333 return rewriteValuegeneric_OpRsh16Ux8_0(v) 334 case OpRsh16x16: 335 return rewriteValuegeneric_OpRsh16x16_0(v) 336 case OpRsh16x32: 337 return rewriteValuegeneric_OpRsh16x32_0(v) 338 case OpRsh16x64: 339 return rewriteValuegeneric_OpRsh16x64_0(v) 340 case OpRsh16x8: 341 return rewriteValuegeneric_OpRsh16x8_0(v) 342 case OpRsh32Ux16: 343 return rewriteValuegeneric_OpRsh32Ux16_0(v) 344 case OpRsh32Ux32: 345 return rewriteValuegeneric_OpRsh32Ux32_0(v) 346 case OpRsh32Ux64: 347 return rewriteValuegeneric_OpRsh32Ux64_0(v) 348 case OpRsh32Ux8: 349 return rewriteValuegeneric_OpRsh32Ux8_0(v) 350 case OpRsh32x16: 351 return rewriteValuegeneric_OpRsh32x16_0(v) 352 case OpRsh32x32: 353 return rewriteValuegeneric_OpRsh32x32_0(v) 354 case OpRsh32x64: 355 return rewriteValuegeneric_OpRsh32x64_0(v) 356 case OpRsh32x8: 357 return rewriteValuegeneric_OpRsh32x8_0(v) 358 case OpRsh64Ux16: 359 return rewriteValuegeneric_OpRsh64Ux16_0(v) 360 case OpRsh64Ux32: 361 return rewriteValuegeneric_OpRsh64Ux32_0(v) 362 case OpRsh64Ux64: 363 return rewriteValuegeneric_OpRsh64Ux64_0(v) 364 case OpRsh64Ux8: 365 return rewriteValuegeneric_OpRsh64Ux8_0(v) 366 case OpRsh64x16: 367 return rewriteValuegeneric_OpRsh64x16_0(v) 368 case OpRsh64x32: 369 return rewriteValuegeneric_OpRsh64x32_0(v) 370 case OpRsh64x64: 371 return rewriteValuegeneric_OpRsh64x64_0(v) 372 case OpRsh64x8: 373 return rewriteValuegeneric_OpRsh64x8_0(v) 374 case OpRsh8Ux16: 375 return rewriteValuegeneric_OpRsh8Ux16_0(v) 376 case OpRsh8Ux32: 377 return rewriteValuegeneric_OpRsh8Ux32_0(v) 378 case OpRsh8Ux64: 379 return rewriteValuegeneric_OpRsh8Ux64_0(v) 380 case OpRsh8Ux8: 381 return rewriteValuegeneric_OpRsh8Ux8_0(v) 382 case OpRsh8x16: 383 return rewriteValuegeneric_OpRsh8x16_0(v) 384 case OpRsh8x32: 385 return rewriteValuegeneric_OpRsh8x32_0(v) 386 case OpRsh8x64: 387 return rewriteValuegeneric_OpRsh8x64_0(v) 388 case OpRsh8x8: 389 return rewriteValuegeneric_OpRsh8x8_0(v) 390 case OpSignExt16to32: 391 return rewriteValuegeneric_OpSignExt16to32_0(v) 392 case OpSignExt16to64: 393 return rewriteValuegeneric_OpSignExt16to64_0(v) 394 case OpSignExt32to64: 395 return rewriteValuegeneric_OpSignExt32to64_0(v) 396 case OpSignExt8to16: 397 return rewriteValuegeneric_OpSignExt8to16_0(v) 398 case OpSignExt8to32: 399 return rewriteValuegeneric_OpSignExt8to32_0(v) 400 case OpSignExt8to64: 401 return rewriteValuegeneric_OpSignExt8to64_0(v) 402 case OpSliceCap: 403 return rewriteValuegeneric_OpSliceCap_0(v) 404 case OpSliceLen: 405 return rewriteValuegeneric_OpSliceLen_0(v) 406 case OpSlicePtr: 407 return rewriteValuegeneric_OpSlicePtr_0(v) 408 case OpSlicemask: 409 return rewriteValuegeneric_OpSlicemask_0(v) 410 case OpSqrt: 411 return rewriteValuegeneric_OpSqrt_0(v) 412 case OpStaticCall: 413 return rewriteValuegeneric_OpStaticCall_0(v) 414 case OpStore: 415 return rewriteValuegeneric_OpStore_0(v) || rewriteValuegeneric_OpStore_10(v) 416 case OpStringLen: 417 return rewriteValuegeneric_OpStringLen_0(v) 418 case OpStringPtr: 419 return rewriteValuegeneric_OpStringPtr_0(v) 420 case OpStructSelect: 421 return rewriteValuegeneric_OpStructSelect_0(v) || rewriteValuegeneric_OpStructSelect_10(v) 422 case OpSub16: 423 return rewriteValuegeneric_OpSub16_0(v) || rewriteValuegeneric_OpSub16_10(v) 424 case OpSub32: 425 return rewriteValuegeneric_OpSub32_0(v) || rewriteValuegeneric_OpSub32_10(v) 426 case OpSub32F: 427 return rewriteValuegeneric_OpSub32F_0(v) 428 case OpSub64: 429 return rewriteValuegeneric_OpSub64_0(v) || rewriteValuegeneric_OpSub64_10(v) 430 case OpSub64F: 431 return rewriteValuegeneric_OpSub64F_0(v) 432 case OpSub8: 433 return rewriteValuegeneric_OpSub8_0(v) || rewriteValuegeneric_OpSub8_10(v) 434 case OpTrunc16to8: 435 return rewriteValuegeneric_OpTrunc16to8_0(v) 436 case OpTrunc32to16: 437 return rewriteValuegeneric_OpTrunc32to16_0(v) 438 case OpTrunc32to8: 439 return rewriteValuegeneric_OpTrunc32to8_0(v) 440 case OpTrunc64to16: 441 return rewriteValuegeneric_OpTrunc64to16_0(v) 442 case OpTrunc64to32: 443 return rewriteValuegeneric_OpTrunc64to32_0(v) 444 case OpTrunc64to8: 445 return rewriteValuegeneric_OpTrunc64to8_0(v) 446 case OpXor16: 447 return rewriteValuegeneric_OpXor16_0(v) || rewriteValuegeneric_OpXor16_10(v) 448 case OpXor32: 449 return rewriteValuegeneric_OpXor32_0(v) || rewriteValuegeneric_OpXor32_10(v) 450 case OpXor64: 451 return rewriteValuegeneric_OpXor64_0(v) || rewriteValuegeneric_OpXor64_10(v) 452 case OpXor8: 453 return rewriteValuegeneric_OpXor8_0(v) || rewriteValuegeneric_OpXor8_10(v) 454 case OpZero: 455 return rewriteValuegeneric_OpZero_0(v) 456 case OpZeroExt16to32: 457 return rewriteValuegeneric_OpZeroExt16to32_0(v) 458 case OpZeroExt16to64: 459 return rewriteValuegeneric_OpZeroExt16to64_0(v) 460 case OpZeroExt32to64: 461 return rewriteValuegeneric_OpZeroExt32to64_0(v) 462 case OpZeroExt8to16: 463 return rewriteValuegeneric_OpZeroExt8to16_0(v) 464 case OpZeroExt8to32: 465 return rewriteValuegeneric_OpZeroExt8to32_0(v) 466 case OpZeroExt8to64: 467 return rewriteValuegeneric_OpZeroExt8to64_0(v) 468 } 469 return false 470 } 471 func rewriteValuegeneric_OpAdd16_0(v *Value) bool { 472 b := v.Block 473 _ = b 474 // match: (Add16 (Const16 [c]) (Const16 [d])) 475 // cond: 476 // result: (Const16 [int64(int16(c+d))]) 477 for { 478 _ = v.Args[1] 479 v_0 := v.Args[0] 480 if v_0.Op != OpConst16 { 481 break 482 } 483 c := v_0.AuxInt 484 v_1 := v.Args[1] 485 if v_1.Op != OpConst16 { 486 break 487 } 488 d := v_1.AuxInt 489 v.reset(OpConst16) 490 v.AuxInt = int64(int16(c + d)) 491 return true 492 } 493 // match: (Add16 (Const16 [d]) (Const16 [c])) 494 // cond: 495 // result: (Const16 [int64(int16(c+d))]) 496 for { 497 _ = v.Args[1] 498 v_0 := v.Args[0] 499 if v_0.Op != OpConst16 { 500 break 501 } 502 d := v_0.AuxInt 503 v_1 := v.Args[1] 504 if v_1.Op != OpConst16 { 505 break 506 } 507 c := v_1.AuxInt 508 v.reset(OpConst16) 509 v.AuxInt = int64(int16(c + d)) 510 return true 511 } 512 // match: (Add16 <t> (Mul16 x y) (Mul16 x z)) 513 // cond: 514 // result: (Mul16 x (Add16 <t> y z)) 515 for { 516 t := v.Type 517 _ = v.Args[1] 518 v_0 := v.Args[0] 519 if v_0.Op != OpMul16 { 520 break 521 } 522 _ = v_0.Args[1] 523 x := v_0.Args[0] 524 y := v_0.Args[1] 525 v_1 := v.Args[1] 526 if v_1.Op != OpMul16 { 527 break 528 } 529 _ = v_1.Args[1] 530 if x != v_1.Args[0] { 531 break 532 } 533 z := v_1.Args[1] 534 v.reset(OpMul16) 535 v.AddArg(x) 536 v0 := b.NewValue0(v.Pos, OpAdd16, t) 537 v0.AddArg(y) 538 v0.AddArg(z) 539 v.AddArg(v0) 540 return true 541 } 542 // match: (Add16 <t> (Mul16 y x) (Mul16 x z)) 543 // cond: 544 // result: (Mul16 x (Add16 <t> y z)) 545 for { 546 t := v.Type 547 _ = v.Args[1] 548 v_0 := v.Args[0] 549 if v_0.Op != OpMul16 { 550 break 551 } 552 _ = v_0.Args[1] 553 y := v_0.Args[0] 554 x := v_0.Args[1] 555 v_1 := v.Args[1] 556 if v_1.Op != OpMul16 { 557 break 558 } 559 _ = v_1.Args[1] 560 if x != v_1.Args[0] { 561 break 562 } 563 z := v_1.Args[1] 564 v.reset(OpMul16) 565 v.AddArg(x) 566 v0 := b.NewValue0(v.Pos, OpAdd16, t) 567 v0.AddArg(y) 568 v0.AddArg(z) 569 v.AddArg(v0) 570 return true 571 } 572 // match: (Add16 <t> (Mul16 x y) (Mul16 z x)) 573 // cond: 574 // result: (Mul16 x (Add16 <t> y z)) 575 for { 576 t := v.Type 577 _ = v.Args[1] 578 v_0 := v.Args[0] 579 if v_0.Op != OpMul16 { 580 break 581 } 582 _ = v_0.Args[1] 583 x := v_0.Args[0] 584 y := v_0.Args[1] 585 v_1 := v.Args[1] 586 if v_1.Op != OpMul16 { 587 break 588 } 589 _ = v_1.Args[1] 590 z := v_1.Args[0] 591 if x != v_1.Args[1] { 592 break 593 } 594 v.reset(OpMul16) 595 v.AddArg(x) 596 v0 := b.NewValue0(v.Pos, OpAdd16, t) 597 v0.AddArg(y) 598 v0.AddArg(z) 599 v.AddArg(v0) 600 return true 601 } 602 // match: (Add16 <t> (Mul16 y x) (Mul16 z x)) 603 // cond: 604 // result: (Mul16 x (Add16 <t> y z)) 605 for { 606 t := v.Type 607 _ = v.Args[1] 608 v_0 := v.Args[0] 609 if v_0.Op != OpMul16 { 610 break 611 } 612 _ = v_0.Args[1] 613 y := v_0.Args[0] 614 x := v_0.Args[1] 615 v_1 := v.Args[1] 616 if v_1.Op != OpMul16 { 617 break 618 } 619 _ = v_1.Args[1] 620 z := v_1.Args[0] 621 if x != v_1.Args[1] { 622 break 623 } 624 v.reset(OpMul16) 625 v.AddArg(x) 626 v0 := b.NewValue0(v.Pos, OpAdd16, t) 627 v0.AddArg(y) 628 v0.AddArg(z) 629 v.AddArg(v0) 630 return true 631 } 632 // match: (Add16 <t> (Mul16 x z) (Mul16 x y)) 633 // cond: 634 // result: (Mul16 x (Add16 <t> y z)) 635 for { 636 t := v.Type 637 _ = v.Args[1] 638 v_0 := v.Args[0] 639 if v_0.Op != OpMul16 { 640 break 641 } 642 _ = v_0.Args[1] 643 x := v_0.Args[0] 644 z := v_0.Args[1] 645 v_1 := v.Args[1] 646 if v_1.Op != OpMul16 { 647 break 648 } 649 _ = v_1.Args[1] 650 if x != v_1.Args[0] { 651 break 652 } 653 y := v_1.Args[1] 654 v.reset(OpMul16) 655 v.AddArg(x) 656 v0 := b.NewValue0(v.Pos, OpAdd16, t) 657 v0.AddArg(y) 658 v0.AddArg(z) 659 v.AddArg(v0) 660 return true 661 } 662 // match: (Add16 <t> (Mul16 z x) (Mul16 x y)) 663 // cond: 664 // result: (Mul16 x (Add16 <t> y z)) 665 for { 666 t := v.Type 667 _ = v.Args[1] 668 v_0 := v.Args[0] 669 if v_0.Op != OpMul16 { 670 break 671 } 672 _ = v_0.Args[1] 673 z := v_0.Args[0] 674 x := v_0.Args[1] 675 v_1 := v.Args[1] 676 if v_1.Op != OpMul16 { 677 break 678 } 679 _ = v_1.Args[1] 680 if x != v_1.Args[0] { 681 break 682 } 683 y := v_1.Args[1] 684 v.reset(OpMul16) 685 v.AddArg(x) 686 v0 := b.NewValue0(v.Pos, OpAdd16, t) 687 v0.AddArg(y) 688 v0.AddArg(z) 689 v.AddArg(v0) 690 return true 691 } 692 // match: (Add16 <t> (Mul16 x z) (Mul16 y x)) 693 // cond: 694 // result: (Mul16 x (Add16 <t> y z)) 695 for { 696 t := v.Type 697 _ = v.Args[1] 698 v_0 := v.Args[0] 699 if v_0.Op != OpMul16 { 700 break 701 } 702 _ = v_0.Args[1] 703 x := v_0.Args[0] 704 z := v_0.Args[1] 705 v_1 := v.Args[1] 706 if v_1.Op != OpMul16 { 707 break 708 } 709 _ = v_1.Args[1] 710 y := v_1.Args[0] 711 if x != v_1.Args[1] { 712 break 713 } 714 v.reset(OpMul16) 715 v.AddArg(x) 716 v0 := b.NewValue0(v.Pos, OpAdd16, t) 717 v0.AddArg(y) 718 v0.AddArg(z) 719 v.AddArg(v0) 720 return true 721 } 722 // match: (Add16 <t> (Mul16 z x) (Mul16 y x)) 723 // cond: 724 // result: (Mul16 x (Add16 <t> y z)) 725 for { 726 t := v.Type 727 _ = v.Args[1] 728 v_0 := v.Args[0] 729 if v_0.Op != OpMul16 { 730 break 731 } 732 _ = v_0.Args[1] 733 z := v_0.Args[0] 734 x := v_0.Args[1] 735 v_1 := v.Args[1] 736 if v_1.Op != OpMul16 { 737 break 738 } 739 _ = v_1.Args[1] 740 y := v_1.Args[0] 741 if x != v_1.Args[1] { 742 break 743 } 744 v.reset(OpMul16) 745 v.AddArg(x) 746 v0 := b.NewValue0(v.Pos, OpAdd16, t) 747 v0.AddArg(y) 748 v0.AddArg(z) 749 v.AddArg(v0) 750 return true 751 } 752 return false 753 } 754 func rewriteValuegeneric_OpAdd16_10(v *Value) bool { 755 b := v.Block 756 _ = b 757 // match: (Add16 (Const16 [0]) x) 758 // cond: 759 // result: x 760 for { 761 _ = v.Args[1] 762 v_0 := v.Args[0] 763 if v_0.Op != OpConst16 { 764 break 765 } 766 if v_0.AuxInt != 0 { 767 break 768 } 769 x := v.Args[1] 770 v.reset(OpCopy) 771 v.Type = x.Type 772 v.AddArg(x) 773 return true 774 } 775 // match: (Add16 x (Const16 [0])) 776 // cond: 777 // result: x 778 for { 779 _ = v.Args[1] 780 x := v.Args[0] 781 v_1 := v.Args[1] 782 if v_1.Op != OpConst16 { 783 break 784 } 785 if v_1.AuxInt != 0 { 786 break 787 } 788 v.reset(OpCopy) 789 v.Type = x.Type 790 v.AddArg(x) 791 return true 792 } 793 // match: (Add16 (Const16 [1]) (Com16 x)) 794 // cond: 795 // result: (Neg16 x) 796 for { 797 _ = v.Args[1] 798 v_0 := v.Args[0] 799 if v_0.Op != OpConst16 { 800 break 801 } 802 if v_0.AuxInt != 1 { 803 break 804 } 805 v_1 := v.Args[1] 806 if v_1.Op != OpCom16 { 807 break 808 } 809 x := v_1.Args[0] 810 v.reset(OpNeg16) 811 v.AddArg(x) 812 return true 813 } 814 // match: (Add16 (Com16 x) (Const16 [1])) 815 // cond: 816 // result: (Neg16 x) 817 for { 818 _ = v.Args[1] 819 v_0 := v.Args[0] 820 if v_0.Op != OpCom16 { 821 break 822 } 823 x := v_0.Args[0] 824 v_1 := v.Args[1] 825 if v_1.Op != OpConst16 { 826 break 827 } 828 if v_1.AuxInt != 1 { 829 break 830 } 831 v.reset(OpNeg16) 832 v.AddArg(x) 833 return true 834 } 835 // match: (Add16 (Add16 i:(Const16 <t>) z) x) 836 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 837 // result: (Add16 i (Add16 <t> z x)) 838 for { 839 _ = v.Args[1] 840 v_0 := v.Args[0] 841 if v_0.Op != OpAdd16 { 842 break 843 } 844 _ = v_0.Args[1] 845 i := v_0.Args[0] 846 if i.Op != OpConst16 { 847 break 848 } 849 t := i.Type 850 z := v_0.Args[1] 851 x := v.Args[1] 852 if !(z.Op != OpConst16 && x.Op != OpConst16) { 853 break 854 } 855 v.reset(OpAdd16) 856 v.AddArg(i) 857 v0 := b.NewValue0(v.Pos, OpAdd16, t) 858 v0.AddArg(z) 859 v0.AddArg(x) 860 v.AddArg(v0) 861 return true 862 } 863 // match: (Add16 (Add16 z i:(Const16 <t>)) x) 864 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 865 // result: (Add16 i (Add16 <t> z x)) 866 for { 867 _ = v.Args[1] 868 v_0 := v.Args[0] 869 if v_0.Op != OpAdd16 { 870 break 871 } 872 _ = v_0.Args[1] 873 z := v_0.Args[0] 874 i := v_0.Args[1] 875 if i.Op != OpConst16 { 876 break 877 } 878 t := i.Type 879 x := v.Args[1] 880 if !(z.Op != OpConst16 && x.Op != OpConst16) { 881 break 882 } 883 v.reset(OpAdd16) 884 v.AddArg(i) 885 v0 := b.NewValue0(v.Pos, OpAdd16, t) 886 v0.AddArg(z) 887 v0.AddArg(x) 888 v.AddArg(v0) 889 return true 890 } 891 // match: (Add16 x (Add16 i:(Const16 <t>) z)) 892 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 893 // result: (Add16 i (Add16 <t> z x)) 894 for { 895 _ = v.Args[1] 896 x := v.Args[0] 897 v_1 := v.Args[1] 898 if v_1.Op != OpAdd16 { 899 break 900 } 901 _ = v_1.Args[1] 902 i := v_1.Args[0] 903 if i.Op != OpConst16 { 904 break 905 } 906 t := i.Type 907 z := v_1.Args[1] 908 if !(z.Op != OpConst16 && x.Op != OpConst16) { 909 break 910 } 911 v.reset(OpAdd16) 912 v.AddArg(i) 913 v0 := b.NewValue0(v.Pos, OpAdd16, t) 914 v0.AddArg(z) 915 v0.AddArg(x) 916 v.AddArg(v0) 917 return true 918 } 919 // match: (Add16 x (Add16 z i:(Const16 <t>))) 920 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 921 // result: (Add16 i (Add16 <t> z x)) 922 for { 923 _ = v.Args[1] 924 x := v.Args[0] 925 v_1 := v.Args[1] 926 if v_1.Op != OpAdd16 { 927 break 928 } 929 _ = v_1.Args[1] 930 z := v_1.Args[0] 931 i := v_1.Args[1] 932 if i.Op != OpConst16 { 933 break 934 } 935 t := i.Type 936 if !(z.Op != OpConst16 && x.Op != OpConst16) { 937 break 938 } 939 v.reset(OpAdd16) 940 v.AddArg(i) 941 v0 := b.NewValue0(v.Pos, OpAdd16, t) 942 v0.AddArg(z) 943 v0.AddArg(x) 944 v.AddArg(v0) 945 return true 946 } 947 // match: (Add16 (Sub16 i:(Const16 <t>) z) x) 948 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 949 // result: (Add16 i (Sub16 <t> x z)) 950 for { 951 _ = v.Args[1] 952 v_0 := v.Args[0] 953 if v_0.Op != OpSub16 { 954 break 955 } 956 _ = v_0.Args[1] 957 i := v_0.Args[0] 958 if i.Op != OpConst16 { 959 break 960 } 961 t := i.Type 962 z := v_0.Args[1] 963 x := v.Args[1] 964 if !(z.Op != OpConst16 && x.Op != OpConst16) { 965 break 966 } 967 v.reset(OpAdd16) 968 v.AddArg(i) 969 v0 := b.NewValue0(v.Pos, OpSub16, t) 970 v0.AddArg(x) 971 v0.AddArg(z) 972 v.AddArg(v0) 973 return true 974 } 975 // match: (Add16 x (Sub16 i:(Const16 <t>) z)) 976 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 977 // result: (Add16 i (Sub16 <t> x z)) 978 for { 979 _ = v.Args[1] 980 x := v.Args[0] 981 v_1 := v.Args[1] 982 if v_1.Op != OpSub16 { 983 break 984 } 985 _ = v_1.Args[1] 986 i := v_1.Args[0] 987 if i.Op != OpConst16 { 988 break 989 } 990 t := i.Type 991 z := v_1.Args[1] 992 if !(z.Op != OpConst16 && x.Op != OpConst16) { 993 break 994 } 995 v.reset(OpAdd16) 996 v.AddArg(i) 997 v0 := b.NewValue0(v.Pos, OpSub16, t) 998 v0.AddArg(x) 999 v0.AddArg(z) 1000 v.AddArg(v0) 1001 return true 1002 } 1003 return false 1004 } 1005 func rewriteValuegeneric_OpAdd16_20(v *Value) bool { 1006 b := v.Block 1007 _ = b 1008 // match: (Add16 x (Sub16 i:(Const16 <t>) z)) 1009 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 1010 // result: (Add16 i (Sub16 <t> x z)) 1011 for { 1012 _ = v.Args[1] 1013 x := v.Args[0] 1014 v_1 := v.Args[1] 1015 if v_1.Op != OpSub16 { 1016 break 1017 } 1018 _ = v_1.Args[1] 1019 i := v_1.Args[0] 1020 if i.Op != OpConst16 { 1021 break 1022 } 1023 t := i.Type 1024 z := v_1.Args[1] 1025 if !(z.Op != OpConst16 && x.Op != OpConst16) { 1026 break 1027 } 1028 v.reset(OpAdd16) 1029 v.AddArg(i) 1030 v0 := b.NewValue0(v.Pos, OpSub16, t) 1031 v0.AddArg(x) 1032 v0.AddArg(z) 1033 v.AddArg(v0) 1034 return true 1035 } 1036 // match: (Add16 (Sub16 i:(Const16 <t>) z) x) 1037 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 1038 // result: (Add16 i (Sub16 <t> x z)) 1039 for { 1040 _ = v.Args[1] 1041 v_0 := v.Args[0] 1042 if v_0.Op != OpSub16 { 1043 break 1044 } 1045 _ = v_0.Args[1] 1046 i := v_0.Args[0] 1047 if i.Op != OpConst16 { 1048 break 1049 } 1050 t := i.Type 1051 z := v_0.Args[1] 1052 x := v.Args[1] 1053 if !(z.Op != OpConst16 && x.Op != OpConst16) { 1054 break 1055 } 1056 v.reset(OpAdd16) 1057 v.AddArg(i) 1058 v0 := b.NewValue0(v.Pos, OpSub16, t) 1059 v0.AddArg(x) 1060 v0.AddArg(z) 1061 v.AddArg(v0) 1062 return true 1063 } 1064 // match: (Add16 (Sub16 z i:(Const16 <t>)) x) 1065 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 1066 // result: (Sub16 (Add16 <t> x z) i) 1067 for { 1068 _ = v.Args[1] 1069 v_0 := v.Args[0] 1070 if v_0.Op != OpSub16 { 1071 break 1072 } 1073 _ = v_0.Args[1] 1074 z := v_0.Args[0] 1075 i := v_0.Args[1] 1076 if i.Op != OpConst16 { 1077 break 1078 } 1079 t := i.Type 1080 x := v.Args[1] 1081 if !(z.Op != OpConst16 && x.Op != OpConst16) { 1082 break 1083 } 1084 v.reset(OpSub16) 1085 v0 := b.NewValue0(v.Pos, OpAdd16, t) 1086 v0.AddArg(x) 1087 v0.AddArg(z) 1088 v.AddArg(v0) 1089 v.AddArg(i) 1090 return true 1091 } 1092 // match: (Add16 x (Sub16 z i:(Const16 <t>))) 1093 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 1094 // result: (Sub16 (Add16 <t> x z) i) 1095 for { 1096 _ = v.Args[1] 1097 x := v.Args[0] 1098 v_1 := v.Args[1] 1099 if v_1.Op != OpSub16 { 1100 break 1101 } 1102 _ = v_1.Args[1] 1103 z := v_1.Args[0] 1104 i := v_1.Args[1] 1105 if i.Op != OpConst16 { 1106 break 1107 } 1108 t := i.Type 1109 if !(z.Op != OpConst16 && x.Op != OpConst16) { 1110 break 1111 } 1112 v.reset(OpSub16) 1113 v0 := b.NewValue0(v.Pos, OpAdd16, t) 1114 v0.AddArg(x) 1115 v0.AddArg(z) 1116 v.AddArg(v0) 1117 v.AddArg(i) 1118 return true 1119 } 1120 // match: (Add16 x (Sub16 z i:(Const16 <t>))) 1121 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 1122 // result: (Sub16 (Add16 <t> x z) i) 1123 for { 1124 _ = v.Args[1] 1125 x := v.Args[0] 1126 v_1 := v.Args[1] 1127 if v_1.Op != OpSub16 { 1128 break 1129 } 1130 _ = v_1.Args[1] 1131 z := v_1.Args[0] 1132 i := v_1.Args[1] 1133 if i.Op != OpConst16 { 1134 break 1135 } 1136 t := i.Type 1137 if !(z.Op != OpConst16 && x.Op != OpConst16) { 1138 break 1139 } 1140 v.reset(OpSub16) 1141 v0 := b.NewValue0(v.Pos, OpAdd16, t) 1142 v0.AddArg(x) 1143 v0.AddArg(z) 1144 v.AddArg(v0) 1145 v.AddArg(i) 1146 return true 1147 } 1148 // match: (Add16 (Sub16 z i:(Const16 <t>)) x) 1149 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 1150 // result: (Sub16 (Add16 <t> x z) i) 1151 for { 1152 _ = v.Args[1] 1153 v_0 := v.Args[0] 1154 if v_0.Op != OpSub16 { 1155 break 1156 } 1157 _ = v_0.Args[1] 1158 z := v_0.Args[0] 1159 i := v_0.Args[1] 1160 if i.Op != OpConst16 { 1161 break 1162 } 1163 t := i.Type 1164 x := v.Args[1] 1165 if !(z.Op != OpConst16 && x.Op != OpConst16) { 1166 break 1167 } 1168 v.reset(OpSub16) 1169 v0 := b.NewValue0(v.Pos, OpAdd16, t) 1170 v0.AddArg(x) 1171 v0.AddArg(z) 1172 v.AddArg(v0) 1173 v.AddArg(i) 1174 return true 1175 } 1176 // match: (Add16 (Const16 <t> [c]) (Add16 (Const16 <t> [d]) x)) 1177 // cond: 1178 // result: (Add16 (Const16 <t> [int64(int16(c+d))]) x) 1179 for { 1180 _ = v.Args[1] 1181 v_0 := v.Args[0] 1182 if v_0.Op != OpConst16 { 1183 break 1184 } 1185 t := v_0.Type 1186 c := v_0.AuxInt 1187 v_1 := v.Args[1] 1188 if v_1.Op != OpAdd16 { 1189 break 1190 } 1191 _ = v_1.Args[1] 1192 v_1_0 := v_1.Args[0] 1193 if v_1_0.Op != OpConst16 { 1194 break 1195 } 1196 if v_1_0.Type != t { 1197 break 1198 } 1199 d := v_1_0.AuxInt 1200 x := v_1.Args[1] 1201 v.reset(OpAdd16) 1202 v0 := b.NewValue0(v.Pos, OpConst16, t) 1203 v0.AuxInt = int64(int16(c + d)) 1204 v.AddArg(v0) 1205 v.AddArg(x) 1206 return true 1207 } 1208 // match: (Add16 (Const16 <t> [c]) (Add16 x (Const16 <t> [d]))) 1209 // cond: 1210 // result: (Add16 (Const16 <t> [int64(int16(c+d))]) x) 1211 for { 1212 _ = v.Args[1] 1213 v_0 := v.Args[0] 1214 if v_0.Op != OpConst16 { 1215 break 1216 } 1217 t := v_0.Type 1218 c := v_0.AuxInt 1219 v_1 := v.Args[1] 1220 if v_1.Op != OpAdd16 { 1221 break 1222 } 1223 _ = v_1.Args[1] 1224 x := v_1.Args[0] 1225 v_1_1 := v_1.Args[1] 1226 if v_1_1.Op != OpConst16 { 1227 break 1228 } 1229 if v_1_1.Type != t { 1230 break 1231 } 1232 d := v_1_1.AuxInt 1233 v.reset(OpAdd16) 1234 v0 := b.NewValue0(v.Pos, OpConst16, t) 1235 v0.AuxInt = int64(int16(c + d)) 1236 v.AddArg(v0) 1237 v.AddArg(x) 1238 return true 1239 } 1240 // match: (Add16 (Add16 (Const16 <t> [d]) x) (Const16 <t> [c])) 1241 // cond: 1242 // result: (Add16 (Const16 <t> [int64(int16(c+d))]) x) 1243 for { 1244 _ = v.Args[1] 1245 v_0 := v.Args[0] 1246 if v_0.Op != OpAdd16 { 1247 break 1248 } 1249 _ = v_0.Args[1] 1250 v_0_0 := v_0.Args[0] 1251 if v_0_0.Op != OpConst16 { 1252 break 1253 } 1254 t := v_0_0.Type 1255 d := v_0_0.AuxInt 1256 x := v_0.Args[1] 1257 v_1 := v.Args[1] 1258 if v_1.Op != OpConst16 { 1259 break 1260 } 1261 if v_1.Type != t { 1262 break 1263 } 1264 c := v_1.AuxInt 1265 v.reset(OpAdd16) 1266 v0 := b.NewValue0(v.Pos, OpConst16, t) 1267 v0.AuxInt = int64(int16(c + d)) 1268 v.AddArg(v0) 1269 v.AddArg(x) 1270 return true 1271 } 1272 // match: (Add16 (Add16 x (Const16 <t> [d])) (Const16 <t> [c])) 1273 // cond: 1274 // result: (Add16 (Const16 <t> [int64(int16(c+d))]) x) 1275 for { 1276 _ = v.Args[1] 1277 v_0 := v.Args[0] 1278 if v_0.Op != OpAdd16 { 1279 break 1280 } 1281 _ = v_0.Args[1] 1282 x := v_0.Args[0] 1283 v_0_1 := v_0.Args[1] 1284 if v_0_1.Op != OpConst16 { 1285 break 1286 } 1287 t := v_0_1.Type 1288 d := v_0_1.AuxInt 1289 v_1 := v.Args[1] 1290 if v_1.Op != OpConst16 { 1291 break 1292 } 1293 if v_1.Type != t { 1294 break 1295 } 1296 c := v_1.AuxInt 1297 v.reset(OpAdd16) 1298 v0 := b.NewValue0(v.Pos, OpConst16, t) 1299 v0.AuxInt = int64(int16(c + d)) 1300 v.AddArg(v0) 1301 v.AddArg(x) 1302 return true 1303 } 1304 return false 1305 } 1306 func rewriteValuegeneric_OpAdd16_30(v *Value) bool { 1307 b := v.Block 1308 _ = b 1309 // match: (Add16 (Const16 <t> [c]) (Sub16 (Const16 <t> [d]) x)) 1310 // cond: 1311 // result: (Sub16 (Const16 <t> [int64(int16(c+d))]) x) 1312 for { 1313 _ = v.Args[1] 1314 v_0 := v.Args[0] 1315 if v_0.Op != OpConst16 { 1316 break 1317 } 1318 t := v_0.Type 1319 c := v_0.AuxInt 1320 v_1 := v.Args[1] 1321 if v_1.Op != OpSub16 { 1322 break 1323 } 1324 _ = v_1.Args[1] 1325 v_1_0 := v_1.Args[0] 1326 if v_1_0.Op != OpConst16 { 1327 break 1328 } 1329 if v_1_0.Type != t { 1330 break 1331 } 1332 d := v_1_0.AuxInt 1333 x := v_1.Args[1] 1334 v.reset(OpSub16) 1335 v0 := b.NewValue0(v.Pos, OpConst16, t) 1336 v0.AuxInt = int64(int16(c + d)) 1337 v.AddArg(v0) 1338 v.AddArg(x) 1339 return true 1340 } 1341 // match: (Add16 (Sub16 (Const16 <t> [d]) x) (Const16 <t> [c])) 1342 // cond: 1343 // result: (Sub16 (Const16 <t> [int64(int16(c+d))]) x) 1344 for { 1345 _ = v.Args[1] 1346 v_0 := v.Args[0] 1347 if v_0.Op != OpSub16 { 1348 break 1349 } 1350 _ = v_0.Args[1] 1351 v_0_0 := v_0.Args[0] 1352 if v_0_0.Op != OpConst16 { 1353 break 1354 } 1355 t := v_0_0.Type 1356 d := v_0_0.AuxInt 1357 x := v_0.Args[1] 1358 v_1 := v.Args[1] 1359 if v_1.Op != OpConst16 { 1360 break 1361 } 1362 if v_1.Type != t { 1363 break 1364 } 1365 c := v_1.AuxInt 1366 v.reset(OpSub16) 1367 v0 := b.NewValue0(v.Pos, OpConst16, t) 1368 v0.AuxInt = int64(int16(c + d)) 1369 v.AddArg(v0) 1370 v.AddArg(x) 1371 return true 1372 } 1373 // match: (Add16 (Const16 <t> [c]) (Sub16 x (Const16 <t> [d]))) 1374 // cond: 1375 // result: (Add16 (Const16 <t> [int64(int16(c-d))]) x) 1376 for { 1377 _ = v.Args[1] 1378 v_0 := v.Args[0] 1379 if v_0.Op != OpConst16 { 1380 break 1381 } 1382 t := v_0.Type 1383 c := v_0.AuxInt 1384 v_1 := v.Args[1] 1385 if v_1.Op != OpSub16 { 1386 break 1387 } 1388 _ = v_1.Args[1] 1389 x := v_1.Args[0] 1390 v_1_1 := v_1.Args[1] 1391 if v_1_1.Op != OpConst16 { 1392 break 1393 } 1394 if v_1_1.Type != t { 1395 break 1396 } 1397 d := v_1_1.AuxInt 1398 v.reset(OpAdd16) 1399 v0 := b.NewValue0(v.Pos, OpConst16, t) 1400 v0.AuxInt = int64(int16(c - d)) 1401 v.AddArg(v0) 1402 v.AddArg(x) 1403 return true 1404 } 1405 // match: (Add16 (Sub16 x (Const16 <t> [d])) (Const16 <t> [c])) 1406 // cond: 1407 // result: (Add16 (Const16 <t> [int64(int16(c-d))]) x) 1408 for { 1409 _ = v.Args[1] 1410 v_0 := v.Args[0] 1411 if v_0.Op != OpSub16 { 1412 break 1413 } 1414 _ = v_0.Args[1] 1415 x := v_0.Args[0] 1416 v_0_1 := v_0.Args[1] 1417 if v_0_1.Op != OpConst16 { 1418 break 1419 } 1420 t := v_0_1.Type 1421 d := v_0_1.AuxInt 1422 v_1 := v.Args[1] 1423 if v_1.Op != OpConst16 { 1424 break 1425 } 1426 if v_1.Type != t { 1427 break 1428 } 1429 c := v_1.AuxInt 1430 v.reset(OpAdd16) 1431 v0 := b.NewValue0(v.Pos, OpConst16, t) 1432 v0.AuxInt = int64(int16(c - d)) 1433 v.AddArg(v0) 1434 v.AddArg(x) 1435 return true 1436 } 1437 return false 1438 } 1439 func rewriteValuegeneric_OpAdd32_0(v *Value) bool { 1440 b := v.Block 1441 _ = b 1442 // match: (Add32 (Const32 [c]) (Const32 [d])) 1443 // cond: 1444 // result: (Const32 [int64(int32(c+d))]) 1445 for { 1446 _ = v.Args[1] 1447 v_0 := v.Args[0] 1448 if v_0.Op != OpConst32 { 1449 break 1450 } 1451 c := v_0.AuxInt 1452 v_1 := v.Args[1] 1453 if v_1.Op != OpConst32 { 1454 break 1455 } 1456 d := v_1.AuxInt 1457 v.reset(OpConst32) 1458 v.AuxInt = int64(int32(c + d)) 1459 return true 1460 } 1461 // match: (Add32 (Const32 [d]) (Const32 [c])) 1462 // cond: 1463 // result: (Const32 [int64(int32(c+d))]) 1464 for { 1465 _ = v.Args[1] 1466 v_0 := v.Args[0] 1467 if v_0.Op != OpConst32 { 1468 break 1469 } 1470 d := v_0.AuxInt 1471 v_1 := v.Args[1] 1472 if v_1.Op != OpConst32 { 1473 break 1474 } 1475 c := v_1.AuxInt 1476 v.reset(OpConst32) 1477 v.AuxInt = int64(int32(c + d)) 1478 return true 1479 } 1480 // match: (Add32 <t> (Mul32 x y) (Mul32 x z)) 1481 // cond: 1482 // result: (Mul32 x (Add32 <t> y z)) 1483 for { 1484 t := v.Type 1485 _ = v.Args[1] 1486 v_0 := v.Args[0] 1487 if v_0.Op != OpMul32 { 1488 break 1489 } 1490 _ = v_0.Args[1] 1491 x := v_0.Args[0] 1492 y := v_0.Args[1] 1493 v_1 := v.Args[1] 1494 if v_1.Op != OpMul32 { 1495 break 1496 } 1497 _ = v_1.Args[1] 1498 if x != v_1.Args[0] { 1499 break 1500 } 1501 z := v_1.Args[1] 1502 v.reset(OpMul32) 1503 v.AddArg(x) 1504 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1505 v0.AddArg(y) 1506 v0.AddArg(z) 1507 v.AddArg(v0) 1508 return true 1509 } 1510 // match: (Add32 <t> (Mul32 y x) (Mul32 x z)) 1511 // cond: 1512 // result: (Mul32 x (Add32 <t> y z)) 1513 for { 1514 t := v.Type 1515 _ = v.Args[1] 1516 v_0 := v.Args[0] 1517 if v_0.Op != OpMul32 { 1518 break 1519 } 1520 _ = v_0.Args[1] 1521 y := v_0.Args[0] 1522 x := v_0.Args[1] 1523 v_1 := v.Args[1] 1524 if v_1.Op != OpMul32 { 1525 break 1526 } 1527 _ = v_1.Args[1] 1528 if x != v_1.Args[0] { 1529 break 1530 } 1531 z := v_1.Args[1] 1532 v.reset(OpMul32) 1533 v.AddArg(x) 1534 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1535 v0.AddArg(y) 1536 v0.AddArg(z) 1537 v.AddArg(v0) 1538 return true 1539 } 1540 // match: (Add32 <t> (Mul32 x y) (Mul32 z x)) 1541 // cond: 1542 // result: (Mul32 x (Add32 <t> y z)) 1543 for { 1544 t := v.Type 1545 _ = v.Args[1] 1546 v_0 := v.Args[0] 1547 if v_0.Op != OpMul32 { 1548 break 1549 } 1550 _ = v_0.Args[1] 1551 x := v_0.Args[0] 1552 y := v_0.Args[1] 1553 v_1 := v.Args[1] 1554 if v_1.Op != OpMul32 { 1555 break 1556 } 1557 _ = v_1.Args[1] 1558 z := v_1.Args[0] 1559 if x != v_1.Args[1] { 1560 break 1561 } 1562 v.reset(OpMul32) 1563 v.AddArg(x) 1564 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1565 v0.AddArg(y) 1566 v0.AddArg(z) 1567 v.AddArg(v0) 1568 return true 1569 } 1570 // match: (Add32 <t> (Mul32 y x) (Mul32 z x)) 1571 // cond: 1572 // result: (Mul32 x (Add32 <t> y z)) 1573 for { 1574 t := v.Type 1575 _ = v.Args[1] 1576 v_0 := v.Args[0] 1577 if v_0.Op != OpMul32 { 1578 break 1579 } 1580 _ = v_0.Args[1] 1581 y := v_0.Args[0] 1582 x := v_0.Args[1] 1583 v_1 := v.Args[1] 1584 if v_1.Op != OpMul32 { 1585 break 1586 } 1587 _ = v_1.Args[1] 1588 z := v_1.Args[0] 1589 if x != v_1.Args[1] { 1590 break 1591 } 1592 v.reset(OpMul32) 1593 v.AddArg(x) 1594 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1595 v0.AddArg(y) 1596 v0.AddArg(z) 1597 v.AddArg(v0) 1598 return true 1599 } 1600 // match: (Add32 <t> (Mul32 x z) (Mul32 x y)) 1601 // cond: 1602 // result: (Mul32 x (Add32 <t> y z)) 1603 for { 1604 t := v.Type 1605 _ = v.Args[1] 1606 v_0 := v.Args[0] 1607 if v_0.Op != OpMul32 { 1608 break 1609 } 1610 _ = v_0.Args[1] 1611 x := v_0.Args[0] 1612 z := v_0.Args[1] 1613 v_1 := v.Args[1] 1614 if v_1.Op != OpMul32 { 1615 break 1616 } 1617 _ = v_1.Args[1] 1618 if x != v_1.Args[0] { 1619 break 1620 } 1621 y := v_1.Args[1] 1622 v.reset(OpMul32) 1623 v.AddArg(x) 1624 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1625 v0.AddArg(y) 1626 v0.AddArg(z) 1627 v.AddArg(v0) 1628 return true 1629 } 1630 // match: (Add32 <t> (Mul32 z x) (Mul32 x y)) 1631 // cond: 1632 // result: (Mul32 x (Add32 <t> y z)) 1633 for { 1634 t := v.Type 1635 _ = v.Args[1] 1636 v_0 := v.Args[0] 1637 if v_0.Op != OpMul32 { 1638 break 1639 } 1640 _ = v_0.Args[1] 1641 z := v_0.Args[0] 1642 x := v_0.Args[1] 1643 v_1 := v.Args[1] 1644 if v_1.Op != OpMul32 { 1645 break 1646 } 1647 _ = v_1.Args[1] 1648 if x != v_1.Args[0] { 1649 break 1650 } 1651 y := v_1.Args[1] 1652 v.reset(OpMul32) 1653 v.AddArg(x) 1654 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1655 v0.AddArg(y) 1656 v0.AddArg(z) 1657 v.AddArg(v0) 1658 return true 1659 } 1660 // match: (Add32 <t> (Mul32 x z) (Mul32 y x)) 1661 // cond: 1662 // result: (Mul32 x (Add32 <t> y z)) 1663 for { 1664 t := v.Type 1665 _ = v.Args[1] 1666 v_0 := v.Args[0] 1667 if v_0.Op != OpMul32 { 1668 break 1669 } 1670 _ = v_0.Args[1] 1671 x := v_0.Args[0] 1672 z := v_0.Args[1] 1673 v_1 := v.Args[1] 1674 if v_1.Op != OpMul32 { 1675 break 1676 } 1677 _ = v_1.Args[1] 1678 y := v_1.Args[0] 1679 if x != v_1.Args[1] { 1680 break 1681 } 1682 v.reset(OpMul32) 1683 v.AddArg(x) 1684 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1685 v0.AddArg(y) 1686 v0.AddArg(z) 1687 v.AddArg(v0) 1688 return true 1689 } 1690 // match: (Add32 <t> (Mul32 z x) (Mul32 y x)) 1691 // cond: 1692 // result: (Mul32 x (Add32 <t> y z)) 1693 for { 1694 t := v.Type 1695 _ = v.Args[1] 1696 v_0 := v.Args[0] 1697 if v_0.Op != OpMul32 { 1698 break 1699 } 1700 _ = v_0.Args[1] 1701 z := v_0.Args[0] 1702 x := v_0.Args[1] 1703 v_1 := v.Args[1] 1704 if v_1.Op != OpMul32 { 1705 break 1706 } 1707 _ = v_1.Args[1] 1708 y := v_1.Args[0] 1709 if x != v_1.Args[1] { 1710 break 1711 } 1712 v.reset(OpMul32) 1713 v.AddArg(x) 1714 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1715 v0.AddArg(y) 1716 v0.AddArg(z) 1717 v.AddArg(v0) 1718 return true 1719 } 1720 return false 1721 } 1722 func rewriteValuegeneric_OpAdd32_10(v *Value) bool { 1723 b := v.Block 1724 _ = b 1725 // match: (Add32 (Const32 [0]) x) 1726 // cond: 1727 // result: x 1728 for { 1729 _ = v.Args[1] 1730 v_0 := v.Args[0] 1731 if v_0.Op != OpConst32 { 1732 break 1733 } 1734 if v_0.AuxInt != 0 { 1735 break 1736 } 1737 x := v.Args[1] 1738 v.reset(OpCopy) 1739 v.Type = x.Type 1740 v.AddArg(x) 1741 return true 1742 } 1743 // match: (Add32 x (Const32 [0])) 1744 // cond: 1745 // result: x 1746 for { 1747 _ = v.Args[1] 1748 x := v.Args[0] 1749 v_1 := v.Args[1] 1750 if v_1.Op != OpConst32 { 1751 break 1752 } 1753 if v_1.AuxInt != 0 { 1754 break 1755 } 1756 v.reset(OpCopy) 1757 v.Type = x.Type 1758 v.AddArg(x) 1759 return true 1760 } 1761 // match: (Add32 (Const32 [1]) (Com32 x)) 1762 // cond: 1763 // result: (Neg32 x) 1764 for { 1765 _ = v.Args[1] 1766 v_0 := v.Args[0] 1767 if v_0.Op != OpConst32 { 1768 break 1769 } 1770 if v_0.AuxInt != 1 { 1771 break 1772 } 1773 v_1 := v.Args[1] 1774 if v_1.Op != OpCom32 { 1775 break 1776 } 1777 x := v_1.Args[0] 1778 v.reset(OpNeg32) 1779 v.AddArg(x) 1780 return true 1781 } 1782 // match: (Add32 (Com32 x) (Const32 [1])) 1783 // cond: 1784 // result: (Neg32 x) 1785 for { 1786 _ = v.Args[1] 1787 v_0 := v.Args[0] 1788 if v_0.Op != OpCom32 { 1789 break 1790 } 1791 x := v_0.Args[0] 1792 v_1 := v.Args[1] 1793 if v_1.Op != OpConst32 { 1794 break 1795 } 1796 if v_1.AuxInt != 1 { 1797 break 1798 } 1799 v.reset(OpNeg32) 1800 v.AddArg(x) 1801 return true 1802 } 1803 // match: (Add32 (Add32 i:(Const32 <t>) z) x) 1804 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1805 // result: (Add32 i (Add32 <t> z x)) 1806 for { 1807 _ = v.Args[1] 1808 v_0 := v.Args[0] 1809 if v_0.Op != OpAdd32 { 1810 break 1811 } 1812 _ = v_0.Args[1] 1813 i := v_0.Args[0] 1814 if i.Op != OpConst32 { 1815 break 1816 } 1817 t := i.Type 1818 z := v_0.Args[1] 1819 x := v.Args[1] 1820 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1821 break 1822 } 1823 v.reset(OpAdd32) 1824 v.AddArg(i) 1825 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1826 v0.AddArg(z) 1827 v0.AddArg(x) 1828 v.AddArg(v0) 1829 return true 1830 } 1831 // match: (Add32 (Add32 z i:(Const32 <t>)) x) 1832 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1833 // result: (Add32 i (Add32 <t> z x)) 1834 for { 1835 _ = v.Args[1] 1836 v_0 := v.Args[0] 1837 if v_0.Op != OpAdd32 { 1838 break 1839 } 1840 _ = v_0.Args[1] 1841 z := v_0.Args[0] 1842 i := v_0.Args[1] 1843 if i.Op != OpConst32 { 1844 break 1845 } 1846 t := i.Type 1847 x := v.Args[1] 1848 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1849 break 1850 } 1851 v.reset(OpAdd32) 1852 v.AddArg(i) 1853 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1854 v0.AddArg(z) 1855 v0.AddArg(x) 1856 v.AddArg(v0) 1857 return true 1858 } 1859 // match: (Add32 x (Add32 i:(Const32 <t>) z)) 1860 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1861 // result: (Add32 i (Add32 <t> z x)) 1862 for { 1863 _ = v.Args[1] 1864 x := v.Args[0] 1865 v_1 := v.Args[1] 1866 if v_1.Op != OpAdd32 { 1867 break 1868 } 1869 _ = v_1.Args[1] 1870 i := v_1.Args[0] 1871 if i.Op != OpConst32 { 1872 break 1873 } 1874 t := i.Type 1875 z := v_1.Args[1] 1876 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1877 break 1878 } 1879 v.reset(OpAdd32) 1880 v.AddArg(i) 1881 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1882 v0.AddArg(z) 1883 v0.AddArg(x) 1884 v.AddArg(v0) 1885 return true 1886 } 1887 // match: (Add32 x (Add32 z i:(Const32 <t>))) 1888 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1889 // result: (Add32 i (Add32 <t> z x)) 1890 for { 1891 _ = v.Args[1] 1892 x := v.Args[0] 1893 v_1 := v.Args[1] 1894 if v_1.Op != OpAdd32 { 1895 break 1896 } 1897 _ = v_1.Args[1] 1898 z := v_1.Args[0] 1899 i := v_1.Args[1] 1900 if i.Op != OpConst32 { 1901 break 1902 } 1903 t := i.Type 1904 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1905 break 1906 } 1907 v.reset(OpAdd32) 1908 v.AddArg(i) 1909 v0 := b.NewValue0(v.Pos, OpAdd32, t) 1910 v0.AddArg(z) 1911 v0.AddArg(x) 1912 v.AddArg(v0) 1913 return true 1914 } 1915 // match: (Add32 (Sub32 i:(Const32 <t>) z) x) 1916 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1917 // result: (Add32 i (Sub32 <t> x z)) 1918 for { 1919 _ = v.Args[1] 1920 v_0 := v.Args[0] 1921 if v_0.Op != OpSub32 { 1922 break 1923 } 1924 _ = v_0.Args[1] 1925 i := v_0.Args[0] 1926 if i.Op != OpConst32 { 1927 break 1928 } 1929 t := i.Type 1930 z := v_0.Args[1] 1931 x := v.Args[1] 1932 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1933 break 1934 } 1935 v.reset(OpAdd32) 1936 v.AddArg(i) 1937 v0 := b.NewValue0(v.Pos, OpSub32, t) 1938 v0.AddArg(x) 1939 v0.AddArg(z) 1940 v.AddArg(v0) 1941 return true 1942 } 1943 // match: (Add32 x (Sub32 i:(Const32 <t>) z)) 1944 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1945 // result: (Add32 i (Sub32 <t> x z)) 1946 for { 1947 _ = v.Args[1] 1948 x := v.Args[0] 1949 v_1 := v.Args[1] 1950 if v_1.Op != OpSub32 { 1951 break 1952 } 1953 _ = v_1.Args[1] 1954 i := v_1.Args[0] 1955 if i.Op != OpConst32 { 1956 break 1957 } 1958 t := i.Type 1959 z := v_1.Args[1] 1960 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1961 break 1962 } 1963 v.reset(OpAdd32) 1964 v.AddArg(i) 1965 v0 := b.NewValue0(v.Pos, OpSub32, t) 1966 v0.AddArg(x) 1967 v0.AddArg(z) 1968 v.AddArg(v0) 1969 return true 1970 } 1971 return false 1972 } 1973 func rewriteValuegeneric_OpAdd32_20(v *Value) bool { 1974 b := v.Block 1975 _ = b 1976 // match: (Add32 x (Sub32 i:(Const32 <t>) z)) 1977 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 1978 // result: (Add32 i (Sub32 <t> x z)) 1979 for { 1980 _ = v.Args[1] 1981 x := v.Args[0] 1982 v_1 := v.Args[1] 1983 if v_1.Op != OpSub32 { 1984 break 1985 } 1986 _ = v_1.Args[1] 1987 i := v_1.Args[0] 1988 if i.Op != OpConst32 { 1989 break 1990 } 1991 t := i.Type 1992 z := v_1.Args[1] 1993 if !(z.Op != OpConst32 && x.Op != OpConst32) { 1994 break 1995 } 1996 v.reset(OpAdd32) 1997 v.AddArg(i) 1998 v0 := b.NewValue0(v.Pos, OpSub32, t) 1999 v0.AddArg(x) 2000 v0.AddArg(z) 2001 v.AddArg(v0) 2002 return true 2003 } 2004 // match: (Add32 (Sub32 i:(Const32 <t>) z) x) 2005 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 2006 // result: (Add32 i (Sub32 <t> x z)) 2007 for { 2008 _ = v.Args[1] 2009 v_0 := v.Args[0] 2010 if v_0.Op != OpSub32 { 2011 break 2012 } 2013 _ = v_0.Args[1] 2014 i := v_0.Args[0] 2015 if i.Op != OpConst32 { 2016 break 2017 } 2018 t := i.Type 2019 z := v_0.Args[1] 2020 x := v.Args[1] 2021 if !(z.Op != OpConst32 && x.Op != OpConst32) { 2022 break 2023 } 2024 v.reset(OpAdd32) 2025 v.AddArg(i) 2026 v0 := b.NewValue0(v.Pos, OpSub32, t) 2027 v0.AddArg(x) 2028 v0.AddArg(z) 2029 v.AddArg(v0) 2030 return true 2031 } 2032 // match: (Add32 (Sub32 z i:(Const32 <t>)) x) 2033 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 2034 // result: (Sub32 (Add32 <t> x z) i) 2035 for { 2036 _ = v.Args[1] 2037 v_0 := v.Args[0] 2038 if v_0.Op != OpSub32 { 2039 break 2040 } 2041 _ = v_0.Args[1] 2042 z := v_0.Args[0] 2043 i := v_0.Args[1] 2044 if i.Op != OpConst32 { 2045 break 2046 } 2047 t := i.Type 2048 x := v.Args[1] 2049 if !(z.Op != OpConst32 && x.Op != OpConst32) { 2050 break 2051 } 2052 v.reset(OpSub32) 2053 v0 := b.NewValue0(v.Pos, OpAdd32, t) 2054 v0.AddArg(x) 2055 v0.AddArg(z) 2056 v.AddArg(v0) 2057 v.AddArg(i) 2058 return true 2059 } 2060 // match: (Add32 x (Sub32 z i:(Const32 <t>))) 2061 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 2062 // result: (Sub32 (Add32 <t> x z) i) 2063 for { 2064 _ = v.Args[1] 2065 x := v.Args[0] 2066 v_1 := v.Args[1] 2067 if v_1.Op != OpSub32 { 2068 break 2069 } 2070 _ = v_1.Args[1] 2071 z := v_1.Args[0] 2072 i := v_1.Args[1] 2073 if i.Op != OpConst32 { 2074 break 2075 } 2076 t := i.Type 2077 if !(z.Op != OpConst32 && x.Op != OpConst32) { 2078 break 2079 } 2080 v.reset(OpSub32) 2081 v0 := b.NewValue0(v.Pos, OpAdd32, t) 2082 v0.AddArg(x) 2083 v0.AddArg(z) 2084 v.AddArg(v0) 2085 v.AddArg(i) 2086 return true 2087 } 2088 // match: (Add32 x (Sub32 z i:(Const32 <t>))) 2089 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 2090 // result: (Sub32 (Add32 <t> x z) i) 2091 for { 2092 _ = v.Args[1] 2093 x := v.Args[0] 2094 v_1 := v.Args[1] 2095 if v_1.Op != OpSub32 { 2096 break 2097 } 2098 _ = v_1.Args[1] 2099 z := v_1.Args[0] 2100 i := v_1.Args[1] 2101 if i.Op != OpConst32 { 2102 break 2103 } 2104 t := i.Type 2105 if !(z.Op != OpConst32 && x.Op != OpConst32) { 2106 break 2107 } 2108 v.reset(OpSub32) 2109 v0 := b.NewValue0(v.Pos, OpAdd32, t) 2110 v0.AddArg(x) 2111 v0.AddArg(z) 2112 v.AddArg(v0) 2113 v.AddArg(i) 2114 return true 2115 } 2116 // match: (Add32 (Sub32 z i:(Const32 <t>)) x) 2117 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 2118 // result: (Sub32 (Add32 <t> x z) i) 2119 for { 2120 _ = v.Args[1] 2121 v_0 := v.Args[0] 2122 if v_0.Op != OpSub32 { 2123 break 2124 } 2125 _ = v_0.Args[1] 2126 z := v_0.Args[0] 2127 i := v_0.Args[1] 2128 if i.Op != OpConst32 { 2129 break 2130 } 2131 t := i.Type 2132 x := v.Args[1] 2133 if !(z.Op != OpConst32 && x.Op != OpConst32) { 2134 break 2135 } 2136 v.reset(OpSub32) 2137 v0 := b.NewValue0(v.Pos, OpAdd32, t) 2138 v0.AddArg(x) 2139 v0.AddArg(z) 2140 v.AddArg(v0) 2141 v.AddArg(i) 2142 return true 2143 } 2144 // match: (Add32 (Const32 <t> [c]) (Add32 (Const32 <t> [d]) x)) 2145 // cond: 2146 // result: (Add32 (Const32 <t> [int64(int32(c+d))]) x) 2147 for { 2148 _ = v.Args[1] 2149 v_0 := v.Args[0] 2150 if v_0.Op != OpConst32 { 2151 break 2152 } 2153 t := v_0.Type 2154 c := v_0.AuxInt 2155 v_1 := v.Args[1] 2156 if v_1.Op != OpAdd32 { 2157 break 2158 } 2159 _ = v_1.Args[1] 2160 v_1_0 := v_1.Args[0] 2161 if v_1_0.Op != OpConst32 { 2162 break 2163 } 2164 if v_1_0.Type != t { 2165 break 2166 } 2167 d := v_1_0.AuxInt 2168 x := v_1.Args[1] 2169 v.reset(OpAdd32) 2170 v0 := b.NewValue0(v.Pos, OpConst32, t) 2171 v0.AuxInt = int64(int32(c + d)) 2172 v.AddArg(v0) 2173 v.AddArg(x) 2174 return true 2175 } 2176 // match: (Add32 (Const32 <t> [c]) (Add32 x (Const32 <t> [d]))) 2177 // cond: 2178 // result: (Add32 (Const32 <t> [int64(int32(c+d))]) x) 2179 for { 2180 _ = v.Args[1] 2181 v_0 := v.Args[0] 2182 if v_0.Op != OpConst32 { 2183 break 2184 } 2185 t := v_0.Type 2186 c := v_0.AuxInt 2187 v_1 := v.Args[1] 2188 if v_1.Op != OpAdd32 { 2189 break 2190 } 2191 _ = v_1.Args[1] 2192 x := v_1.Args[0] 2193 v_1_1 := v_1.Args[1] 2194 if v_1_1.Op != OpConst32 { 2195 break 2196 } 2197 if v_1_1.Type != t { 2198 break 2199 } 2200 d := v_1_1.AuxInt 2201 v.reset(OpAdd32) 2202 v0 := b.NewValue0(v.Pos, OpConst32, t) 2203 v0.AuxInt = int64(int32(c + d)) 2204 v.AddArg(v0) 2205 v.AddArg(x) 2206 return true 2207 } 2208 // match: (Add32 (Add32 (Const32 <t> [d]) x) (Const32 <t> [c])) 2209 // cond: 2210 // result: (Add32 (Const32 <t> [int64(int32(c+d))]) x) 2211 for { 2212 _ = v.Args[1] 2213 v_0 := v.Args[0] 2214 if v_0.Op != OpAdd32 { 2215 break 2216 } 2217 _ = v_0.Args[1] 2218 v_0_0 := v_0.Args[0] 2219 if v_0_0.Op != OpConst32 { 2220 break 2221 } 2222 t := v_0_0.Type 2223 d := v_0_0.AuxInt 2224 x := v_0.Args[1] 2225 v_1 := v.Args[1] 2226 if v_1.Op != OpConst32 { 2227 break 2228 } 2229 if v_1.Type != t { 2230 break 2231 } 2232 c := v_1.AuxInt 2233 v.reset(OpAdd32) 2234 v0 := b.NewValue0(v.Pos, OpConst32, t) 2235 v0.AuxInt = int64(int32(c + d)) 2236 v.AddArg(v0) 2237 v.AddArg(x) 2238 return true 2239 } 2240 // match: (Add32 (Add32 x (Const32 <t> [d])) (Const32 <t> [c])) 2241 // cond: 2242 // result: (Add32 (Const32 <t> [int64(int32(c+d))]) x) 2243 for { 2244 _ = v.Args[1] 2245 v_0 := v.Args[0] 2246 if v_0.Op != OpAdd32 { 2247 break 2248 } 2249 _ = v_0.Args[1] 2250 x := v_0.Args[0] 2251 v_0_1 := v_0.Args[1] 2252 if v_0_1.Op != OpConst32 { 2253 break 2254 } 2255 t := v_0_1.Type 2256 d := v_0_1.AuxInt 2257 v_1 := v.Args[1] 2258 if v_1.Op != OpConst32 { 2259 break 2260 } 2261 if v_1.Type != t { 2262 break 2263 } 2264 c := v_1.AuxInt 2265 v.reset(OpAdd32) 2266 v0 := b.NewValue0(v.Pos, OpConst32, t) 2267 v0.AuxInt = int64(int32(c + d)) 2268 v.AddArg(v0) 2269 v.AddArg(x) 2270 return true 2271 } 2272 return false 2273 } 2274 func rewriteValuegeneric_OpAdd32_30(v *Value) bool { 2275 b := v.Block 2276 _ = b 2277 // match: (Add32 (Const32 <t> [c]) (Sub32 (Const32 <t> [d]) x)) 2278 // cond: 2279 // result: (Sub32 (Const32 <t> [int64(int32(c+d))]) x) 2280 for { 2281 _ = v.Args[1] 2282 v_0 := v.Args[0] 2283 if v_0.Op != OpConst32 { 2284 break 2285 } 2286 t := v_0.Type 2287 c := v_0.AuxInt 2288 v_1 := v.Args[1] 2289 if v_1.Op != OpSub32 { 2290 break 2291 } 2292 _ = v_1.Args[1] 2293 v_1_0 := v_1.Args[0] 2294 if v_1_0.Op != OpConst32 { 2295 break 2296 } 2297 if v_1_0.Type != t { 2298 break 2299 } 2300 d := v_1_0.AuxInt 2301 x := v_1.Args[1] 2302 v.reset(OpSub32) 2303 v0 := b.NewValue0(v.Pos, OpConst32, t) 2304 v0.AuxInt = int64(int32(c + d)) 2305 v.AddArg(v0) 2306 v.AddArg(x) 2307 return true 2308 } 2309 // match: (Add32 (Sub32 (Const32 <t> [d]) x) (Const32 <t> [c])) 2310 // cond: 2311 // result: (Sub32 (Const32 <t> [int64(int32(c+d))]) x) 2312 for { 2313 _ = v.Args[1] 2314 v_0 := v.Args[0] 2315 if v_0.Op != OpSub32 { 2316 break 2317 } 2318 _ = v_0.Args[1] 2319 v_0_0 := v_0.Args[0] 2320 if v_0_0.Op != OpConst32 { 2321 break 2322 } 2323 t := v_0_0.Type 2324 d := v_0_0.AuxInt 2325 x := v_0.Args[1] 2326 v_1 := v.Args[1] 2327 if v_1.Op != OpConst32 { 2328 break 2329 } 2330 if v_1.Type != t { 2331 break 2332 } 2333 c := v_1.AuxInt 2334 v.reset(OpSub32) 2335 v0 := b.NewValue0(v.Pos, OpConst32, t) 2336 v0.AuxInt = int64(int32(c + d)) 2337 v.AddArg(v0) 2338 v.AddArg(x) 2339 return true 2340 } 2341 // match: (Add32 (Const32 <t> [c]) (Sub32 x (Const32 <t> [d]))) 2342 // cond: 2343 // result: (Add32 (Const32 <t> [int64(int32(c-d))]) x) 2344 for { 2345 _ = v.Args[1] 2346 v_0 := v.Args[0] 2347 if v_0.Op != OpConst32 { 2348 break 2349 } 2350 t := v_0.Type 2351 c := v_0.AuxInt 2352 v_1 := v.Args[1] 2353 if v_1.Op != OpSub32 { 2354 break 2355 } 2356 _ = v_1.Args[1] 2357 x := v_1.Args[0] 2358 v_1_1 := v_1.Args[1] 2359 if v_1_1.Op != OpConst32 { 2360 break 2361 } 2362 if v_1_1.Type != t { 2363 break 2364 } 2365 d := v_1_1.AuxInt 2366 v.reset(OpAdd32) 2367 v0 := b.NewValue0(v.Pos, OpConst32, t) 2368 v0.AuxInt = int64(int32(c - d)) 2369 v.AddArg(v0) 2370 v.AddArg(x) 2371 return true 2372 } 2373 // match: (Add32 (Sub32 x (Const32 <t> [d])) (Const32 <t> [c])) 2374 // cond: 2375 // result: (Add32 (Const32 <t> [int64(int32(c-d))]) x) 2376 for { 2377 _ = v.Args[1] 2378 v_0 := v.Args[0] 2379 if v_0.Op != OpSub32 { 2380 break 2381 } 2382 _ = v_0.Args[1] 2383 x := v_0.Args[0] 2384 v_0_1 := v_0.Args[1] 2385 if v_0_1.Op != OpConst32 { 2386 break 2387 } 2388 t := v_0_1.Type 2389 d := v_0_1.AuxInt 2390 v_1 := v.Args[1] 2391 if v_1.Op != OpConst32 { 2392 break 2393 } 2394 if v_1.Type != t { 2395 break 2396 } 2397 c := v_1.AuxInt 2398 v.reset(OpAdd32) 2399 v0 := b.NewValue0(v.Pos, OpConst32, t) 2400 v0.AuxInt = int64(int32(c - d)) 2401 v.AddArg(v0) 2402 v.AddArg(x) 2403 return true 2404 } 2405 return false 2406 } 2407 func rewriteValuegeneric_OpAdd32F_0(v *Value) bool { 2408 // match: (Add32F (Const32F [c]) (Const32F [d])) 2409 // cond: 2410 // result: (Const32F [f2i(float64(i2f32(c) + i2f32(d)))]) 2411 for { 2412 _ = v.Args[1] 2413 v_0 := v.Args[0] 2414 if v_0.Op != OpConst32F { 2415 break 2416 } 2417 c := v_0.AuxInt 2418 v_1 := v.Args[1] 2419 if v_1.Op != OpConst32F { 2420 break 2421 } 2422 d := v_1.AuxInt 2423 v.reset(OpConst32F) 2424 v.AuxInt = f2i(float64(i2f32(c) + i2f32(d))) 2425 return true 2426 } 2427 // match: (Add32F (Const32F [d]) (Const32F [c])) 2428 // cond: 2429 // result: (Const32F [f2i(float64(i2f32(c) + i2f32(d)))]) 2430 for { 2431 _ = v.Args[1] 2432 v_0 := v.Args[0] 2433 if v_0.Op != OpConst32F { 2434 break 2435 } 2436 d := v_0.AuxInt 2437 v_1 := v.Args[1] 2438 if v_1.Op != OpConst32F { 2439 break 2440 } 2441 c := v_1.AuxInt 2442 v.reset(OpConst32F) 2443 v.AuxInt = f2i(float64(i2f32(c) + i2f32(d))) 2444 return true 2445 } 2446 // match: (Add32F x (Const32F [0])) 2447 // cond: 2448 // result: x 2449 for { 2450 _ = v.Args[1] 2451 x := v.Args[0] 2452 v_1 := v.Args[1] 2453 if v_1.Op != OpConst32F { 2454 break 2455 } 2456 if v_1.AuxInt != 0 { 2457 break 2458 } 2459 v.reset(OpCopy) 2460 v.Type = x.Type 2461 v.AddArg(x) 2462 return true 2463 } 2464 // match: (Add32F (Const32F [0]) x) 2465 // cond: 2466 // result: x 2467 for { 2468 _ = v.Args[1] 2469 v_0 := v.Args[0] 2470 if v_0.Op != OpConst32F { 2471 break 2472 } 2473 if v_0.AuxInt != 0 { 2474 break 2475 } 2476 x := v.Args[1] 2477 v.reset(OpCopy) 2478 v.Type = x.Type 2479 v.AddArg(x) 2480 return true 2481 } 2482 return false 2483 } 2484 func rewriteValuegeneric_OpAdd64_0(v *Value) bool { 2485 b := v.Block 2486 _ = b 2487 // match: (Add64 (Const64 [c]) (Const64 [d])) 2488 // cond: 2489 // result: (Const64 [c+d]) 2490 for { 2491 _ = v.Args[1] 2492 v_0 := v.Args[0] 2493 if v_0.Op != OpConst64 { 2494 break 2495 } 2496 c := v_0.AuxInt 2497 v_1 := v.Args[1] 2498 if v_1.Op != OpConst64 { 2499 break 2500 } 2501 d := v_1.AuxInt 2502 v.reset(OpConst64) 2503 v.AuxInt = c + d 2504 return true 2505 } 2506 // match: (Add64 (Const64 [d]) (Const64 [c])) 2507 // cond: 2508 // result: (Const64 [c+d]) 2509 for { 2510 _ = v.Args[1] 2511 v_0 := v.Args[0] 2512 if v_0.Op != OpConst64 { 2513 break 2514 } 2515 d := v_0.AuxInt 2516 v_1 := v.Args[1] 2517 if v_1.Op != OpConst64 { 2518 break 2519 } 2520 c := v_1.AuxInt 2521 v.reset(OpConst64) 2522 v.AuxInt = c + d 2523 return true 2524 } 2525 // match: (Add64 <t> (Mul64 x y) (Mul64 x z)) 2526 // cond: 2527 // result: (Mul64 x (Add64 <t> y z)) 2528 for { 2529 t := v.Type 2530 _ = v.Args[1] 2531 v_0 := v.Args[0] 2532 if v_0.Op != OpMul64 { 2533 break 2534 } 2535 _ = v_0.Args[1] 2536 x := v_0.Args[0] 2537 y := v_0.Args[1] 2538 v_1 := v.Args[1] 2539 if v_1.Op != OpMul64 { 2540 break 2541 } 2542 _ = v_1.Args[1] 2543 if x != v_1.Args[0] { 2544 break 2545 } 2546 z := v_1.Args[1] 2547 v.reset(OpMul64) 2548 v.AddArg(x) 2549 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2550 v0.AddArg(y) 2551 v0.AddArg(z) 2552 v.AddArg(v0) 2553 return true 2554 } 2555 // match: (Add64 <t> (Mul64 y x) (Mul64 x z)) 2556 // cond: 2557 // result: (Mul64 x (Add64 <t> y z)) 2558 for { 2559 t := v.Type 2560 _ = v.Args[1] 2561 v_0 := v.Args[0] 2562 if v_0.Op != OpMul64 { 2563 break 2564 } 2565 _ = v_0.Args[1] 2566 y := v_0.Args[0] 2567 x := v_0.Args[1] 2568 v_1 := v.Args[1] 2569 if v_1.Op != OpMul64 { 2570 break 2571 } 2572 _ = v_1.Args[1] 2573 if x != v_1.Args[0] { 2574 break 2575 } 2576 z := v_1.Args[1] 2577 v.reset(OpMul64) 2578 v.AddArg(x) 2579 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2580 v0.AddArg(y) 2581 v0.AddArg(z) 2582 v.AddArg(v0) 2583 return true 2584 } 2585 // match: (Add64 <t> (Mul64 x y) (Mul64 z x)) 2586 // cond: 2587 // result: (Mul64 x (Add64 <t> y z)) 2588 for { 2589 t := v.Type 2590 _ = v.Args[1] 2591 v_0 := v.Args[0] 2592 if v_0.Op != OpMul64 { 2593 break 2594 } 2595 _ = v_0.Args[1] 2596 x := v_0.Args[0] 2597 y := v_0.Args[1] 2598 v_1 := v.Args[1] 2599 if v_1.Op != OpMul64 { 2600 break 2601 } 2602 _ = v_1.Args[1] 2603 z := v_1.Args[0] 2604 if x != v_1.Args[1] { 2605 break 2606 } 2607 v.reset(OpMul64) 2608 v.AddArg(x) 2609 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2610 v0.AddArg(y) 2611 v0.AddArg(z) 2612 v.AddArg(v0) 2613 return true 2614 } 2615 // match: (Add64 <t> (Mul64 y x) (Mul64 z x)) 2616 // cond: 2617 // result: (Mul64 x (Add64 <t> y z)) 2618 for { 2619 t := v.Type 2620 _ = v.Args[1] 2621 v_0 := v.Args[0] 2622 if v_0.Op != OpMul64 { 2623 break 2624 } 2625 _ = v_0.Args[1] 2626 y := v_0.Args[0] 2627 x := v_0.Args[1] 2628 v_1 := v.Args[1] 2629 if v_1.Op != OpMul64 { 2630 break 2631 } 2632 _ = v_1.Args[1] 2633 z := v_1.Args[0] 2634 if x != v_1.Args[1] { 2635 break 2636 } 2637 v.reset(OpMul64) 2638 v.AddArg(x) 2639 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2640 v0.AddArg(y) 2641 v0.AddArg(z) 2642 v.AddArg(v0) 2643 return true 2644 } 2645 // match: (Add64 <t> (Mul64 x z) (Mul64 x y)) 2646 // cond: 2647 // result: (Mul64 x (Add64 <t> y z)) 2648 for { 2649 t := v.Type 2650 _ = v.Args[1] 2651 v_0 := v.Args[0] 2652 if v_0.Op != OpMul64 { 2653 break 2654 } 2655 _ = v_0.Args[1] 2656 x := v_0.Args[0] 2657 z := v_0.Args[1] 2658 v_1 := v.Args[1] 2659 if v_1.Op != OpMul64 { 2660 break 2661 } 2662 _ = v_1.Args[1] 2663 if x != v_1.Args[0] { 2664 break 2665 } 2666 y := v_1.Args[1] 2667 v.reset(OpMul64) 2668 v.AddArg(x) 2669 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2670 v0.AddArg(y) 2671 v0.AddArg(z) 2672 v.AddArg(v0) 2673 return true 2674 } 2675 // match: (Add64 <t> (Mul64 z x) (Mul64 x y)) 2676 // cond: 2677 // result: (Mul64 x (Add64 <t> y z)) 2678 for { 2679 t := v.Type 2680 _ = v.Args[1] 2681 v_0 := v.Args[0] 2682 if v_0.Op != OpMul64 { 2683 break 2684 } 2685 _ = v_0.Args[1] 2686 z := v_0.Args[0] 2687 x := v_0.Args[1] 2688 v_1 := v.Args[1] 2689 if v_1.Op != OpMul64 { 2690 break 2691 } 2692 _ = v_1.Args[1] 2693 if x != v_1.Args[0] { 2694 break 2695 } 2696 y := v_1.Args[1] 2697 v.reset(OpMul64) 2698 v.AddArg(x) 2699 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2700 v0.AddArg(y) 2701 v0.AddArg(z) 2702 v.AddArg(v0) 2703 return true 2704 } 2705 // match: (Add64 <t> (Mul64 x z) (Mul64 y x)) 2706 // cond: 2707 // result: (Mul64 x (Add64 <t> y z)) 2708 for { 2709 t := v.Type 2710 _ = v.Args[1] 2711 v_0 := v.Args[0] 2712 if v_0.Op != OpMul64 { 2713 break 2714 } 2715 _ = v_0.Args[1] 2716 x := v_0.Args[0] 2717 z := v_0.Args[1] 2718 v_1 := v.Args[1] 2719 if v_1.Op != OpMul64 { 2720 break 2721 } 2722 _ = v_1.Args[1] 2723 y := v_1.Args[0] 2724 if x != v_1.Args[1] { 2725 break 2726 } 2727 v.reset(OpMul64) 2728 v.AddArg(x) 2729 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2730 v0.AddArg(y) 2731 v0.AddArg(z) 2732 v.AddArg(v0) 2733 return true 2734 } 2735 // match: (Add64 <t> (Mul64 z x) (Mul64 y x)) 2736 // cond: 2737 // result: (Mul64 x (Add64 <t> y z)) 2738 for { 2739 t := v.Type 2740 _ = v.Args[1] 2741 v_0 := v.Args[0] 2742 if v_0.Op != OpMul64 { 2743 break 2744 } 2745 _ = v_0.Args[1] 2746 z := v_0.Args[0] 2747 x := v_0.Args[1] 2748 v_1 := v.Args[1] 2749 if v_1.Op != OpMul64 { 2750 break 2751 } 2752 _ = v_1.Args[1] 2753 y := v_1.Args[0] 2754 if x != v_1.Args[1] { 2755 break 2756 } 2757 v.reset(OpMul64) 2758 v.AddArg(x) 2759 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2760 v0.AddArg(y) 2761 v0.AddArg(z) 2762 v.AddArg(v0) 2763 return true 2764 } 2765 return false 2766 } 2767 func rewriteValuegeneric_OpAdd64_10(v *Value) bool { 2768 b := v.Block 2769 _ = b 2770 // match: (Add64 (Const64 [0]) x) 2771 // cond: 2772 // result: x 2773 for { 2774 _ = v.Args[1] 2775 v_0 := v.Args[0] 2776 if v_0.Op != OpConst64 { 2777 break 2778 } 2779 if v_0.AuxInt != 0 { 2780 break 2781 } 2782 x := v.Args[1] 2783 v.reset(OpCopy) 2784 v.Type = x.Type 2785 v.AddArg(x) 2786 return true 2787 } 2788 // match: (Add64 x (Const64 [0])) 2789 // cond: 2790 // result: x 2791 for { 2792 _ = v.Args[1] 2793 x := v.Args[0] 2794 v_1 := v.Args[1] 2795 if v_1.Op != OpConst64 { 2796 break 2797 } 2798 if v_1.AuxInt != 0 { 2799 break 2800 } 2801 v.reset(OpCopy) 2802 v.Type = x.Type 2803 v.AddArg(x) 2804 return true 2805 } 2806 // match: (Add64 (Const64 [1]) (Com64 x)) 2807 // cond: 2808 // result: (Neg64 x) 2809 for { 2810 _ = v.Args[1] 2811 v_0 := v.Args[0] 2812 if v_0.Op != OpConst64 { 2813 break 2814 } 2815 if v_0.AuxInt != 1 { 2816 break 2817 } 2818 v_1 := v.Args[1] 2819 if v_1.Op != OpCom64 { 2820 break 2821 } 2822 x := v_1.Args[0] 2823 v.reset(OpNeg64) 2824 v.AddArg(x) 2825 return true 2826 } 2827 // match: (Add64 (Com64 x) (Const64 [1])) 2828 // cond: 2829 // result: (Neg64 x) 2830 for { 2831 _ = v.Args[1] 2832 v_0 := v.Args[0] 2833 if v_0.Op != OpCom64 { 2834 break 2835 } 2836 x := v_0.Args[0] 2837 v_1 := v.Args[1] 2838 if v_1.Op != OpConst64 { 2839 break 2840 } 2841 if v_1.AuxInt != 1 { 2842 break 2843 } 2844 v.reset(OpNeg64) 2845 v.AddArg(x) 2846 return true 2847 } 2848 // match: (Add64 (Add64 i:(Const64 <t>) z) x) 2849 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 2850 // result: (Add64 i (Add64 <t> z x)) 2851 for { 2852 _ = v.Args[1] 2853 v_0 := v.Args[0] 2854 if v_0.Op != OpAdd64 { 2855 break 2856 } 2857 _ = v_0.Args[1] 2858 i := v_0.Args[0] 2859 if i.Op != OpConst64 { 2860 break 2861 } 2862 t := i.Type 2863 z := v_0.Args[1] 2864 x := v.Args[1] 2865 if !(z.Op != OpConst64 && x.Op != OpConst64) { 2866 break 2867 } 2868 v.reset(OpAdd64) 2869 v.AddArg(i) 2870 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2871 v0.AddArg(z) 2872 v0.AddArg(x) 2873 v.AddArg(v0) 2874 return true 2875 } 2876 // match: (Add64 (Add64 z i:(Const64 <t>)) x) 2877 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 2878 // result: (Add64 i (Add64 <t> z x)) 2879 for { 2880 _ = v.Args[1] 2881 v_0 := v.Args[0] 2882 if v_0.Op != OpAdd64 { 2883 break 2884 } 2885 _ = v_0.Args[1] 2886 z := v_0.Args[0] 2887 i := v_0.Args[1] 2888 if i.Op != OpConst64 { 2889 break 2890 } 2891 t := i.Type 2892 x := v.Args[1] 2893 if !(z.Op != OpConst64 && x.Op != OpConst64) { 2894 break 2895 } 2896 v.reset(OpAdd64) 2897 v.AddArg(i) 2898 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2899 v0.AddArg(z) 2900 v0.AddArg(x) 2901 v.AddArg(v0) 2902 return true 2903 } 2904 // match: (Add64 x (Add64 i:(Const64 <t>) z)) 2905 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 2906 // result: (Add64 i (Add64 <t> z x)) 2907 for { 2908 _ = v.Args[1] 2909 x := v.Args[0] 2910 v_1 := v.Args[1] 2911 if v_1.Op != OpAdd64 { 2912 break 2913 } 2914 _ = v_1.Args[1] 2915 i := v_1.Args[0] 2916 if i.Op != OpConst64 { 2917 break 2918 } 2919 t := i.Type 2920 z := v_1.Args[1] 2921 if !(z.Op != OpConst64 && x.Op != OpConst64) { 2922 break 2923 } 2924 v.reset(OpAdd64) 2925 v.AddArg(i) 2926 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2927 v0.AddArg(z) 2928 v0.AddArg(x) 2929 v.AddArg(v0) 2930 return true 2931 } 2932 // match: (Add64 x (Add64 z i:(Const64 <t>))) 2933 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 2934 // result: (Add64 i (Add64 <t> z x)) 2935 for { 2936 _ = v.Args[1] 2937 x := v.Args[0] 2938 v_1 := v.Args[1] 2939 if v_1.Op != OpAdd64 { 2940 break 2941 } 2942 _ = v_1.Args[1] 2943 z := v_1.Args[0] 2944 i := v_1.Args[1] 2945 if i.Op != OpConst64 { 2946 break 2947 } 2948 t := i.Type 2949 if !(z.Op != OpConst64 && x.Op != OpConst64) { 2950 break 2951 } 2952 v.reset(OpAdd64) 2953 v.AddArg(i) 2954 v0 := b.NewValue0(v.Pos, OpAdd64, t) 2955 v0.AddArg(z) 2956 v0.AddArg(x) 2957 v.AddArg(v0) 2958 return true 2959 } 2960 // match: (Add64 (Sub64 i:(Const64 <t>) z) x) 2961 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 2962 // result: (Add64 i (Sub64 <t> x z)) 2963 for { 2964 _ = v.Args[1] 2965 v_0 := v.Args[0] 2966 if v_0.Op != OpSub64 { 2967 break 2968 } 2969 _ = v_0.Args[1] 2970 i := v_0.Args[0] 2971 if i.Op != OpConst64 { 2972 break 2973 } 2974 t := i.Type 2975 z := v_0.Args[1] 2976 x := v.Args[1] 2977 if !(z.Op != OpConst64 && x.Op != OpConst64) { 2978 break 2979 } 2980 v.reset(OpAdd64) 2981 v.AddArg(i) 2982 v0 := b.NewValue0(v.Pos, OpSub64, t) 2983 v0.AddArg(x) 2984 v0.AddArg(z) 2985 v.AddArg(v0) 2986 return true 2987 } 2988 // match: (Add64 x (Sub64 i:(Const64 <t>) z)) 2989 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 2990 // result: (Add64 i (Sub64 <t> x z)) 2991 for { 2992 _ = v.Args[1] 2993 x := v.Args[0] 2994 v_1 := v.Args[1] 2995 if v_1.Op != OpSub64 { 2996 break 2997 } 2998 _ = v_1.Args[1] 2999 i := v_1.Args[0] 3000 if i.Op != OpConst64 { 3001 break 3002 } 3003 t := i.Type 3004 z := v_1.Args[1] 3005 if !(z.Op != OpConst64 && x.Op != OpConst64) { 3006 break 3007 } 3008 v.reset(OpAdd64) 3009 v.AddArg(i) 3010 v0 := b.NewValue0(v.Pos, OpSub64, t) 3011 v0.AddArg(x) 3012 v0.AddArg(z) 3013 v.AddArg(v0) 3014 return true 3015 } 3016 return false 3017 } 3018 func rewriteValuegeneric_OpAdd64_20(v *Value) bool { 3019 b := v.Block 3020 _ = b 3021 // match: (Add64 x (Sub64 i:(Const64 <t>) z)) 3022 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 3023 // result: (Add64 i (Sub64 <t> x z)) 3024 for { 3025 _ = v.Args[1] 3026 x := v.Args[0] 3027 v_1 := v.Args[1] 3028 if v_1.Op != OpSub64 { 3029 break 3030 } 3031 _ = v_1.Args[1] 3032 i := v_1.Args[0] 3033 if i.Op != OpConst64 { 3034 break 3035 } 3036 t := i.Type 3037 z := v_1.Args[1] 3038 if !(z.Op != OpConst64 && x.Op != OpConst64) { 3039 break 3040 } 3041 v.reset(OpAdd64) 3042 v.AddArg(i) 3043 v0 := b.NewValue0(v.Pos, OpSub64, t) 3044 v0.AddArg(x) 3045 v0.AddArg(z) 3046 v.AddArg(v0) 3047 return true 3048 } 3049 // match: (Add64 (Sub64 i:(Const64 <t>) z) x) 3050 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 3051 // result: (Add64 i (Sub64 <t> x z)) 3052 for { 3053 _ = v.Args[1] 3054 v_0 := v.Args[0] 3055 if v_0.Op != OpSub64 { 3056 break 3057 } 3058 _ = v_0.Args[1] 3059 i := v_0.Args[0] 3060 if i.Op != OpConst64 { 3061 break 3062 } 3063 t := i.Type 3064 z := v_0.Args[1] 3065 x := v.Args[1] 3066 if !(z.Op != OpConst64 && x.Op != OpConst64) { 3067 break 3068 } 3069 v.reset(OpAdd64) 3070 v.AddArg(i) 3071 v0 := b.NewValue0(v.Pos, OpSub64, t) 3072 v0.AddArg(x) 3073 v0.AddArg(z) 3074 v.AddArg(v0) 3075 return true 3076 } 3077 // match: (Add64 (Sub64 z i:(Const64 <t>)) x) 3078 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 3079 // result: (Sub64 (Add64 <t> x z) i) 3080 for { 3081 _ = v.Args[1] 3082 v_0 := v.Args[0] 3083 if v_0.Op != OpSub64 { 3084 break 3085 } 3086 _ = v_0.Args[1] 3087 z := v_0.Args[0] 3088 i := v_0.Args[1] 3089 if i.Op != OpConst64 { 3090 break 3091 } 3092 t := i.Type 3093 x := v.Args[1] 3094 if !(z.Op != OpConst64 && x.Op != OpConst64) { 3095 break 3096 } 3097 v.reset(OpSub64) 3098 v0 := b.NewValue0(v.Pos, OpAdd64, t) 3099 v0.AddArg(x) 3100 v0.AddArg(z) 3101 v.AddArg(v0) 3102 v.AddArg(i) 3103 return true 3104 } 3105 // match: (Add64 x (Sub64 z i:(Const64 <t>))) 3106 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 3107 // result: (Sub64 (Add64 <t> x z) i) 3108 for { 3109 _ = v.Args[1] 3110 x := v.Args[0] 3111 v_1 := v.Args[1] 3112 if v_1.Op != OpSub64 { 3113 break 3114 } 3115 _ = v_1.Args[1] 3116 z := v_1.Args[0] 3117 i := v_1.Args[1] 3118 if i.Op != OpConst64 { 3119 break 3120 } 3121 t := i.Type 3122 if !(z.Op != OpConst64 && x.Op != OpConst64) { 3123 break 3124 } 3125 v.reset(OpSub64) 3126 v0 := b.NewValue0(v.Pos, OpAdd64, t) 3127 v0.AddArg(x) 3128 v0.AddArg(z) 3129 v.AddArg(v0) 3130 v.AddArg(i) 3131 return true 3132 } 3133 // match: (Add64 x (Sub64 z i:(Const64 <t>))) 3134 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 3135 // result: (Sub64 (Add64 <t> x z) i) 3136 for { 3137 _ = v.Args[1] 3138 x := v.Args[0] 3139 v_1 := v.Args[1] 3140 if v_1.Op != OpSub64 { 3141 break 3142 } 3143 _ = v_1.Args[1] 3144 z := v_1.Args[0] 3145 i := v_1.Args[1] 3146 if i.Op != OpConst64 { 3147 break 3148 } 3149 t := i.Type 3150 if !(z.Op != OpConst64 && x.Op != OpConst64) { 3151 break 3152 } 3153 v.reset(OpSub64) 3154 v0 := b.NewValue0(v.Pos, OpAdd64, t) 3155 v0.AddArg(x) 3156 v0.AddArg(z) 3157 v.AddArg(v0) 3158 v.AddArg(i) 3159 return true 3160 } 3161 // match: (Add64 (Sub64 z i:(Const64 <t>)) x) 3162 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 3163 // result: (Sub64 (Add64 <t> x z) i) 3164 for { 3165 _ = v.Args[1] 3166 v_0 := v.Args[0] 3167 if v_0.Op != OpSub64 { 3168 break 3169 } 3170 _ = v_0.Args[1] 3171 z := v_0.Args[0] 3172 i := v_0.Args[1] 3173 if i.Op != OpConst64 { 3174 break 3175 } 3176 t := i.Type 3177 x := v.Args[1] 3178 if !(z.Op != OpConst64 && x.Op != OpConst64) { 3179 break 3180 } 3181 v.reset(OpSub64) 3182 v0 := b.NewValue0(v.Pos, OpAdd64, t) 3183 v0.AddArg(x) 3184 v0.AddArg(z) 3185 v.AddArg(v0) 3186 v.AddArg(i) 3187 return true 3188 } 3189 // match: (Add64 (Const64 <t> [c]) (Add64 (Const64 <t> [d]) x)) 3190 // cond: 3191 // result: (Add64 (Const64 <t> [c+d]) x) 3192 for { 3193 _ = v.Args[1] 3194 v_0 := v.Args[0] 3195 if v_0.Op != OpConst64 { 3196 break 3197 } 3198 t := v_0.Type 3199 c := v_0.AuxInt 3200 v_1 := v.Args[1] 3201 if v_1.Op != OpAdd64 { 3202 break 3203 } 3204 _ = v_1.Args[1] 3205 v_1_0 := v_1.Args[0] 3206 if v_1_0.Op != OpConst64 { 3207 break 3208 } 3209 if v_1_0.Type != t { 3210 break 3211 } 3212 d := v_1_0.AuxInt 3213 x := v_1.Args[1] 3214 v.reset(OpAdd64) 3215 v0 := b.NewValue0(v.Pos, OpConst64, t) 3216 v0.AuxInt = c + d 3217 v.AddArg(v0) 3218 v.AddArg(x) 3219 return true 3220 } 3221 // match: (Add64 (Const64 <t> [c]) (Add64 x (Const64 <t> [d]))) 3222 // cond: 3223 // result: (Add64 (Const64 <t> [c+d]) x) 3224 for { 3225 _ = v.Args[1] 3226 v_0 := v.Args[0] 3227 if v_0.Op != OpConst64 { 3228 break 3229 } 3230 t := v_0.Type 3231 c := v_0.AuxInt 3232 v_1 := v.Args[1] 3233 if v_1.Op != OpAdd64 { 3234 break 3235 } 3236 _ = v_1.Args[1] 3237 x := v_1.Args[0] 3238 v_1_1 := v_1.Args[1] 3239 if v_1_1.Op != OpConst64 { 3240 break 3241 } 3242 if v_1_1.Type != t { 3243 break 3244 } 3245 d := v_1_1.AuxInt 3246 v.reset(OpAdd64) 3247 v0 := b.NewValue0(v.Pos, OpConst64, t) 3248 v0.AuxInt = c + d 3249 v.AddArg(v0) 3250 v.AddArg(x) 3251 return true 3252 } 3253 // match: (Add64 (Add64 (Const64 <t> [d]) x) (Const64 <t> [c])) 3254 // cond: 3255 // result: (Add64 (Const64 <t> [c+d]) x) 3256 for { 3257 _ = v.Args[1] 3258 v_0 := v.Args[0] 3259 if v_0.Op != OpAdd64 { 3260 break 3261 } 3262 _ = v_0.Args[1] 3263 v_0_0 := v_0.Args[0] 3264 if v_0_0.Op != OpConst64 { 3265 break 3266 } 3267 t := v_0_0.Type 3268 d := v_0_0.AuxInt 3269 x := v_0.Args[1] 3270 v_1 := v.Args[1] 3271 if v_1.Op != OpConst64 { 3272 break 3273 } 3274 if v_1.Type != t { 3275 break 3276 } 3277 c := v_1.AuxInt 3278 v.reset(OpAdd64) 3279 v0 := b.NewValue0(v.Pos, OpConst64, t) 3280 v0.AuxInt = c + d 3281 v.AddArg(v0) 3282 v.AddArg(x) 3283 return true 3284 } 3285 // match: (Add64 (Add64 x (Const64 <t> [d])) (Const64 <t> [c])) 3286 // cond: 3287 // result: (Add64 (Const64 <t> [c+d]) x) 3288 for { 3289 _ = v.Args[1] 3290 v_0 := v.Args[0] 3291 if v_0.Op != OpAdd64 { 3292 break 3293 } 3294 _ = v_0.Args[1] 3295 x := v_0.Args[0] 3296 v_0_1 := v_0.Args[1] 3297 if v_0_1.Op != OpConst64 { 3298 break 3299 } 3300 t := v_0_1.Type 3301 d := v_0_1.AuxInt 3302 v_1 := v.Args[1] 3303 if v_1.Op != OpConst64 { 3304 break 3305 } 3306 if v_1.Type != t { 3307 break 3308 } 3309 c := v_1.AuxInt 3310 v.reset(OpAdd64) 3311 v0 := b.NewValue0(v.Pos, OpConst64, t) 3312 v0.AuxInt = c + d 3313 v.AddArg(v0) 3314 v.AddArg(x) 3315 return true 3316 } 3317 return false 3318 } 3319 func rewriteValuegeneric_OpAdd64_30(v *Value) bool { 3320 b := v.Block 3321 _ = b 3322 // match: (Add64 (Const64 <t> [c]) (Sub64 (Const64 <t> [d]) x)) 3323 // cond: 3324 // result: (Sub64 (Const64 <t> [c+d]) x) 3325 for { 3326 _ = v.Args[1] 3327 v_0 := v.Args[0] 3328 if v_0.Op != OpConst64 { 3329 break 3330 } 3331 t := v_0.Type 3332 c := v_0.AuxInt 3333 v_1 := v.Args[1] 3334 if v_1.Op != OpSub64 { 3335 break 3336 } 3337 _ = v_1.Args[1] 3338 v_1_0 := v_1.Args[0] 3339 if v_1_0.Op != OpConst64 { 3340 break 3341 } 3342 if v_1_0.Type != t { 3343 break 3344 } 3345 d := v_1_0.AuxInt 3346 x := v_1.Args[1] 3347 v.reset(OpSub64) 3348 v0 := b.NewValue0(v.Pos, OpConst64, t) 3349 v0.AuxInt = c + d 3350 v.AddArg(v0) 3351 v.AddArg(x) 3352 return true 3353 } 3354 // match: (Add64 (Sub64 (Const64 <t> [d]) x) (Const64 <t> [c])) 3355 // cond: 3356 // result: (Sub64 (Const64 <t> [c+d]) x) 3357 for { 3358 _ = v.Args[1] 3359 v_0 := v.Args[0] 3360 if v_0.Op != OpSub64 { 3361 break 3362 } 3363 _ = v_0.Args[1] 3364 v_0_0 := v_0.Args[0] 3365 if v_0_0.Op != OpConst64 { 3366 break 3367 } 3368 t := v_0_0.Type 3369 d := v_0_0.AuxInt 3370 x := v_0.Args[1] 3371 v_1 := v.Args[1] 3372 if v_1.Op != OpConst64 { 3373 break 3374 } 3375 if v_1.Type != t { 3376 break 3377 } 3378 c := v_1.AuxInt 3379 v.reset(OpSub64) 3380 v0 := b.NewValue0(v.Pos, OpConst64, t) 3381 v0.AuxInt = c + d 3382 v.AddArg(v0) 3383 v.AddArg(x) 3384 return true 3385 } 3386 // match: (Add64 (Const64 <t> [c]) (Sub64 x (Const64 <t> [d]))) 3387 // cond: 3388 // result: (Add64 (Const64 <t> [c-d]) x) 3389 for { 3390 _ = v.Args[1] 3391 v_0 := v.Args[0] 3392 if v_0.Op != OpConst64 { 3393 break 3394 } 3395 t := v_0.Type 3396 c := v_0.AuxInt 3397 v_1 := v.Args[1] 3398 if v_1.Op != OpSub64 { 3399 break 3400 } 3401 _ = v_1.Args[1] 3402 x := v_1.Args[0] 3403 v_1_1 := v_1.Args[1] 3404 if v_1_1.Op != OpConst64 { 3405 break 3406 } 3407 if v_1_1.Type != t { 3408 break 3409 } 3410 d := v_1_1.AuxInt 3411 v.reset(OpAdd64) 3412 v0 := b.NewValue0(v.Pos, OpConst64, t) 3413 v0.AuxInt = c - d 3414 v.AddArg(v0) 3415 v.AddArg(x) 3416 return true 3417 } 3418 // match: (Add64 (Sub64 x (Const64 <t> [d])) (Const64 <t> [c])) 3419 // cond: 3420 // result: (Add64 (Const64 <t> [c-d]) x) 3421 for { 3422 _ = v.Args[1] 3423 v_0 := v.Args[0] 3424 if v_0.Op != OpSub64 { 3425 break 3426 } 3427 _ = v_0.Args[1] 3428 x := v_0.Args[0] 3429 v_0_1 := v_0.Args[1] 3430 if v_0_1.Op != OpConst64 { 3431 break 3432 } 3433 t := v_0_1.Type 3434 d := v_0_1.AuxInt 3435 v_1 := v.Args[1] 3436 if v_1.Op != OpConst64 { 3437 break 3438 } 3439 if v_1.Type != t { 3440 break 3441 } 3442 c := v_1.AuxInt 3443 v.reset(OpAdd64) 3444 v0 := b.NewValue0(v.Pos, OpConst64, t) 3445 v0.AuxInt = c - d 3446 v.AddArg(v0) 3447 v.AddArg(x) 3448 return true 3449 } 3450 return false 3451 } 3452 func rewriteValuegeneric_OpAdd64F_0(v *Value) bool { 3453 // match: (Add64F (Const64F [c]) (Const64F [d])) 3454 // cond: 3455 // result: (Const64F [f2i(i2f(c) + i2f(d))]) 3456 for { 3457 _ = v.Args[1] 3458 v_0 := v.Args[0] 3459 if v_0.Op != OpConst64F { 3460 break 3461 } 3462 c := v_0.AuxInt 3463 v_1 := v.Args[1] 3464 if v_1.Op != OpConst64F { 3465 break 3466 } 3467 d := v_1.AuxInt 3468 v.reset(OpConst64F) 3469 v.AuxInt = f2i(i2f(c) + i2f(d)) 3470 return true 3471 } 3472 // match: (Add64F (Const64F [d]) (Const64F [c])) 3473 // cond: 3474 // result: (Const64F [f2i(i2f(c) + i2f(d))]) 3475 for { 3476 _ = v.Args[1] 3477 v_0 := v.Args[0] 3478 if v_0.Op != OpConst64F { 3479 break 3480 } 3481 d := v_0.AuxInt 3482 v_1 := v.Args[1] 3483 if v_1.Op != OpConst64F { 3484 break 3485 } 3486 c := v_1.AuxInt 3487 v.reset(OpConst64F) 3488 v.AuxInt = f2i(i2f(c) + i2f(d)) 3489 return true 3490 } 3491 // match: (Add64F x (Const64F [0])) 3492 // cond: 3493 // result: x 3494 for { 3495 _ = v.Args[1] 3496 x := v.Args[0] 3497 v_1 := v.Args[1] 3498 if v_1.Op != OpConst64F { 3499 break 3500 } 3501 if v_1.AuxInt != 0 { 3502 break 3503 } 3504 v.reset(OpCopy) 3505 v.Type = x.Type 3506 v.AddArg(x) 3507 return true 3508 } 3509 // match: (Add64F (Const64F [0]) x) 3510 // cond: 3511 // result: x 3512 for { 3513 _ = v.Args[1] 3514 v_0 := v.Args[0] 3515 if v_0.Op != OpConst64F { 3516 break 3517 } 3518 if v_0.AuxInt != 0 { 3519 break 3520 } 3521 x := v.Args[1] 3522 v.reset(OpCopy) 3523 v.Type = x.Type 3524 v.AddArg(x) 3525 return true 3526 } 3527 return false 3528 } 3529 func rewriteValuegeneric_OpAdd8_0(v *Value) bool { 3530 b := v.Block 3531 _ = b 3532 // match: (Add8 (Const8 [c]) (Const8 [d])) 3533 // cond: 3534 // result: (Const8 [int64(int8(c+d))]) 3535 for { 3536 _ = v.Args[1] 3537 v_0 := v.Args[0] 3538 if v_0.Op != OpConst8 { 3539 break 3540 } 3541 c := v_0.AuxInt 3542 v_1 := v.Args[1] 3543 if v_1.Op != OpConst8 { 3544 break 3545 } 3546 d := v_1.AuxInt 3547 v.reset(OpConst8) 3548 v.AuxInt = int64(int8(c + d)) 3549 return true 3550 } 3551 // match: (Add8 (Const8 [d]) (Const8 [c])) 3552 // cond: 3553 // result: (Const8 [int64(int8(c+d))]) 3554 for { 3555 _ = v.Args[1] 3556 v_0 := v.Args[0] 3557 if v_0.Op != OpConst8 { 3558 break 3559 } 3560 d := v_0.AuxInt 3561 v_1 := v.Args[1] 3562 if v_1.Op != OpConst8 { 3563 break 3564 } 3565 c := v_1.AuxInt 3566 v.reset(OpConst8) 3567 v.AuxInt = int64(int8(c + d)) 3568 return true 3569 } 3570 // match: (Add8 <t> (Mul8 x y) (Mul8 x z)) 3571 // cond: 3572 // result: (Mul8 x (Add8 <t> y z)) 3573 for { 3574 t := v.Type 3575 _ = v.Args[1] 3576 v_0 := v.Args[0] 3577 if v_0.Op != OpMul8 { 3578 break 3579 } 3580 _ = v_0.Args[1] 3581 x := v_0.Args[0] 3582 y := v_0.Args[1] 3583 v_1 := v.Args[1] 3584 if v_1.Op != OpMul8 { 3585 break 3586 } 3587 _ = v_1.Args[1] 3588 if x != v_1.Args[0] { 3589 break 3590 } 3591 z := v_1.Args[1] 3592 v.reset(OpMul8) 3593 v.AddArg(x) 3594 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3595 v0.AddArg(y) 3596 v0.AddArg(z) 3597 v.AddArg(v0) 3598 return true 3599 } 3600 // match: (Add8 <t> (Mul8 y x) (Mul8 x z)) 3601 // cond: 3602 // result: (Mul8 x (Add8 <t> y z)) 3603 for { 3604 t := v.Type 3605 _ = v.Args[1] 3606 v_0 := v.Args[0] 3607 if v_0.Op != OpMul8 { 3608 break 3609 } 3610 _ = v_0.Args[1] 3611 y := v_0.Args[0] 3612 x := v_0.Args[1] 3613 v_1 := v.Args[1] 3614 if v_1.Op != OpMul8 { 3615 break 3616 } 3617 _ = v_1.Args[1] 3618 if x != v_1.Args[0] { 3619 break 3620 } 3621 z := v_1.Args[1] 3622 v.reset(OpMul8) 3623 v.AddArg(x) 3624 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3625 v0.AddArg(y) 3626 v0.AddArg(z) 3627 v.AddArg(v0) 3628 return true 3629 } 3630 // match: (Add8 <t> (Mul8 x y) (Mul8 z x)) 3631 // cond: 3632 // result: (Mul8 x (Add8 <t> y z)) 3633 for { 3634 t := v.Type 3635 _ = v.Args[1] 3636 v_0 := v.Args[0] 3637 if v_0.Op != OpMul8 { 3638 break 3639 } 3640 _ = v_0.Args[1] 3641 x := v_0.Args[0] 3642 y := v_0.Args[1] 3643 v_1 := v.Args[1] 3644 if v_1.Op != OpMul8 { 3645 break 3646 } 3647 _ = v_1.Args[1] 3648 z := v_1.Args[0] 3649 if x != v_1.Args[1] { 3650 break 3651 } 3652 v.reset(OpMul8) 3653 v.AddArg(x) 3654 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3655 v0.AddArg(y) 3656 v0.AddArg(z) 3657 v.AddArg(v0) 3658 return true 3659 } 3660 // match: (Add8 <t> (Mul8 y x) (Mul8 z x)) 3661 // cond: 3662 // result: (Mul8 x (Add8 <t> y z)) 3663 for { 3664 t := v.Type 3665 _ = v.Args[1] 3666 v_0 := v.Args[0] 3667 if v_0.Op != OpMul8 { 3668 break 3669 } 3670 _ = v_0.Args[1] 3671 y := v_0.Args[0] 3672 x := v_0.Args[1] 3673 v_1 := v.Args[1] 3674 if v_1.Op != OpMul8 { 3675 break 3676 } 3677 _ = v_1.Args[1] 3678 z := v_1.Args[0] 3679 if x != v_1.Args[1] { 3680 break 3681 } 3682 v.reset(OpMul8) 3683 v.AddArg(x) 3684 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3685 v0.AddArg(y) 3686 v0.AddArg(z) 3687 v.AddArg(v0) 3688 return true 3689 } 3690 // match: (Add8 <t> (Mul8 x z) (Mul8 x y)) 3691 // cond: 3692 // result: (Mul8 x (Add8 <t> y z)) 3693 for { 3694 t := v.Type 3695 _ = v.Args[1] 3696 v_0 := v.Args[0] 3697 if v_0.Op != OpMul8 { 3698 break 3699 } 3700 _ = v_0.Args[1] 3701 x := v_0.Args[0] 3702 z := v_0.Args[1] 3703 v_1 := v.Args[1] 3704 if v_1.Op != OpMul8 { 3705 break 3706 } 3707 _ = v_1.Args[1] 3708 if x != v_1.Args[0] { 3709 break 3710 } 3711 y := v_1.Args[1] 3712 v.reset(OpMul8) 3713 v.AddArg(x) 3714 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3715 v0.AddArg(y) 3716 v0.AddArg(z) 3717 v.AddArg(v0) 3718 return true 3719 } 3720 // match: (Add8 <t> (Mul8 z x) (Mul8 x y)) 3721 // cond: 3722 // result: (Mul8 x (Add8 <t> y z)) 3723 for { 3724 t := v.Type 3725 _ = v.Args[1] 3726 v_0 := v.Args[0] 3727 if v_0.Op != OpMul8 { 3728 break 3729 } 3730 _ = v_0.Args[1] 3731 z := v_0.Args[0] 3732 x := v_0.Args[1] 3733 v_1 := v.Args[1] 3734 if v_1.Op != OpMul8 { 3735 break 3736 } 3737 _ = v_1.Args[1] 3738 if x != v_1.Args[0] { 3739 break 3740 } 3741 y := v_1.Args[1] 3742 v.reset(OpMul8) 3743 v.AddArg(x) 3744 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3745 v0.AddArg(y) 3746 v0.AddArg(z) 3747 v.AddArg(v0) 3748 return true 3749 } 3750 // match: (Add8 <t> (Mul8 x z) (Mul8 y x)) 3751 // cond: 3752 // result: (Mul8 x (Add8 <t> y z)) 3753 for { 3754 t := v.Type 3755 _ = v.Args[1] 3756 v_0 := v.Args[0] 3757 if v_0.Op != OpMul8 { 3758 break 3759 } 3760 _ = v_0.Args[1] 3761 x := v_0.Args[0] 3762 z := v_0.Args[1] 3763 v_1 := v.Args[1] 3764 if v_1.Op != OpMul8 { 3765 break 3766 } 3767 _ = v_1.Args[1] 3768 y := v_1.Args[0] 3769 if x != v_1.Args[1] { 3770 break 3771 } 3772 v.reset(OpMul8) 3773 v.AddArg(x) 3774 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3775 v0.AddArg(y) 3776 v0.AddArg(z) 3777 v.AddArg(v0) 3778 return true 3779 } 3780 // match: (Add8 <t> (Mul8 z x) (Mul8 y x)) 3781 // cond: 3782 // result: (Mul8 x (Add8 <t> y z)) 3783 for { 3784 t := v.Type 3785 _ = v.Args[1] 3786 v_0 := v.Args[0] 3787 if v_0.Op != OpMul8 { 3788 break 3789 } 3790 _ = v_0.Args[1] 3791 z := v_0.Args[0] 3792 x := v_0.Args[1] 3793 v_1 := v.Args[1] 3794 if v_1.Op != OpMul8 { 3795 break 3796 } 3797 _ = v_1.Args[1] 3798 y := v_1.Args[0] 3799 if x != v_1.Args[1] { 3800 break 3801 } 3802 v.reset(OpMul8) 3803 v.AddArg(x) 3804 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3805 v0.AddArg(y) 3806 v0.AddArg(z) 3807 v.AddArg(v0) 3808 return true 3809 } 3810 return false 3811 } 3812 func rewriteValuegeneric_OpAdd8_10(v *Value) bool { 3813 b := v.Block 3814 _ = b 3815 // match: (Add8 (Const8 [0]) x) 3816 // cond: 3817 // result: x 3818 for { 3819 _ = v.Args[1] 3820 v_0 := v.Args[0] 3821 if v_0.Op != OpConst8 { 3822 break 3823 } 3824 if v_0.AuxInt != 0 { 3825 break 3826 } 3827 x := v.Args[1] 3828 v.reset(OpCopy) 3829 v.Type = x.Type 3830 v.AddArg(x) 3831 return true 3832 } 3833 // match: (Add8 x (Const8 [0])) 3834 // cond: 3835 // result: x 3836 for { 3837 _ = v.Args[1] 3838 x := v.Args[0] 3839 v_1 := v.Args[1] 3840 if v_1.Op != OpConst8 { 3841 break 3842 } 3843 if v_1.AuxInt != 0 { 3844 break 3845 } 3846 v.reset(OpCopy) 3847 v.Type = x.Type 3848 v.AddArg(x) 3849 return true 3850 } 3851 // match: (Add8 (Const8 [1]) (Com8 x)) 3852 // cond: 3853 // result: (Neg8 x) 3854 for { 3855 _ = v.Args[1] 3856 v_0 := v.Args[0] 3857 if v_0.Op != OpConst8 { 3858 break 3859 } 3860 if v_0.AuxInt != 1 { 3861 break 3862 } 3863 v_1 := v.Args[1] 3864 if v_1.Op != OpCom8 { 3865 break 3866 } 3867 x := v_1.Args[0] 3868 v.reset(OpNeg8) 3869 v.AddArg(x) 3870 return true 3871 } 3872 // match: (Add8 (Com8 x) (Const8 [1])) 3873 // cond: 3874 // result: (Neg8 x) 3875 for { 3876 _ = v.Args[1] 3877 v_0 := v.Args[0] 3878 if v_0.Op != OpCom8 { 3879 break 3880 } 3881 x := v_0.Args[0] 3882 v_1 := v.Args[1] 3883 if v_1.Op != OpConst8 { 3884 break 3885 } 3886 if v_1.AuxInt != 1 { 3887 break 3888 } 3889 v.reset(OpNeg8) 3890 v.AddArg(x) 3891 return true 3892 } 3893 // match: (Add8 (Add8 i:(Const8 <t>) z) x) 3894 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 3895 // result: (Add8 i (Add8 <t> z x)) 3896 for { 3897 _ = v.Args[1] 3898 v_0 := v.Args[0] 3899 if v_0.Op != OpAdd8 { 3900 break 3901 } 3902 _ = v_0.Args[1] 3903 i := v_0.Args[0] 3904 if i.Op != OpConst8 { 3905 break 3906 } 3907 t := i.Type 3908 z := v_0.Args[1] 3909 x := v.Args[1] 3910 if !(z.Op != OpConst8 && x.Op != OpConst8) { 3911 break 3912 } 3913 v.reset(OpAdd8) 3914 v.AddArg(i) 3915 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3916 v0.AddArg(z) 3917 v0.AddArg(x) 3918 v.AddArg(v0) 3919 return true 3920 } 3921 // match: (Add8 (Add8 z i:(Const8 <t>)) x) 3922 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 3923 // result: (Add8 i (Add8 <t> z x)) 3924 for { 3925 _ = v.Args[1] 3926 v_0 := v.Args[0] 3927 if v_0.Op != OpAdd8 { 3928 break 3929 } 3930 _ = v_0.Args[1] 3931 z := v_0.Args[0] 3932 i := v_0.Args[1] 3933 if i.Op != OpConst8 { 3934 break 3935 } 3936 t := i.Type 3937 x := v.Args[1] 3938 if !(z.Op != OpConst8 && x.Op != OpConst8) { 3939 break 3940 } 3941 v.reset(OpAdd8) 3942 v.AddArg(i) 3943 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3944 v0.AddArg(z) 3945 v0.AddArg(x) 3946 v.AddArg(v0) 3947 return true 3948 } 3949 // match: (Add8 x (Add8 i:(Const8 <t>) z)) 3950 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 3951 // result: (Add8 i (Add8 <t> z x)) 3952 for { 3953 _ = v.Args[1] 3954 x := v.Args[0] 3955 v_1 := v.Args[1] 3956 if v_1.Op != OpAdd8 { 3957 break 3958 } 3959 _ = v_1.Args[1] 3960 i := v_1.Args[0] 3961 if i.Op != OpConst8 { 3962 break 3963 } 3964 t := i.Type 3965 z := v_1.Args[1] 3966 if !(z.Op != OpConst8 && x.Op != OpConst8) { 3967 break 3968 } 3969 v.reset(OpAdd8) 3970 v.AddArg(i) 3971 v0 := b.NewValue0(v.Pos, OpAdd8, t) 3972 v0.AddArg(z) 3973 v0.AddArg(x) 3974 v.AddArg(v0) 3975 return true 3976 } 3977 // match: (Add8 x (Add8 z i:(Const8 <t>))) 3978 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 3979 // result: (Add8 i (Add8 <t> z x)) 3980 for { 3981 _ = v.Args[1] 3982 x := v.Args[0] 3983 v_1 := v.Args[1] 3984 if v_1.Op != OpAdd8 { 3985 break 3986 } 3987 _ = v_1.Args[1] 3988 z := v_1.Args[0] 3989 i := v_1.Args[1] 3990 if i.Op != OpConst8 { 3991 break 3992 } 3993 t := i.Type 3994 if !(z.Op != OpConst8 && x.Op != OpConst8) { 3995 break 3996 } 3997 v.reset(OpAdd8) 3998 v.AddArg(i) 3999 v0 := b.NewValue0(v.Pos, OpAdd8, t) 4000 v0.AddArg(z) 4001 v0.AddArg(x) 4002 v.AddArg(v0) 4003 return true 4004 } 4005 // match: (Add8 (Sub8 i:(Const8 <t>) z) x) 4006 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 4007 // result: (Add8 i (Sub8 <t> x z)) 4008 for { 4009 _ = v.Args[1] 4010 v_0 := v.Args[0] 4011 if v_0.Op != OpSub8 { 4012 break 4013 } 4014 _ = v_0.Args[1] 4015 i := v_0.Args[0] 4016 if i.Op != OpConst8 { 4017 break 4018 } 4019 t := i.Type 4020 z := v_0.Args[1] 4021 x := v.Args[1] 4022 if !(z.Op != OpConst8 && x.Op != OpConst8) { 4023 break 4024 } 4025 v.reset(OpAdd8) 4026 v.AddArg(i) 4027 v0 := b.NewValue0(v.Pos, OpSub8, t) 4028 v0.AddArg(x) 4029 v0.AddArg(z) 4030 v.AddArg(v0) 4031 return true 4032 } 4033 // match: (Add8 x (Sub8 i:(Const8 <t>) z)) 4034 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 4035 // result: (Add8 i (Sub8 <t> x z)) 4036 for { 4037 _ = v.Args[1] 4038 x := v.Args[0] 4039 v_1 := v.Args[1] 4040 if v_1.Op != OpSub8 { 4041 break 4042 } 4043 _ = v_1.Args[1] 4044 i := v_1.Args[0] 4045 if i.Op != OpConst8 { 4046 break 4047 } 4048 t := i.Type 4049 z := v_1.Args[1] 4050 if !(z.Op != OpConst8 && x.Op != OpConst8) { 4051 break 4052 } 4053 v.reset(OpAdd8) 4054 v.AddArg(i) 4055 v0 := b.NewValue0(v.Pos, OpSub8, t) 4056 v0.AddArg(x) 4057 v0.AddArg(z) 4058 v.AddArg(v0) 4059 return true 4060 } 4061 return false 4062 } 4063 func rewriteValuegeneric_OpAdd8_20(v *Value) bool { 4064 b := v.Block 4065 _ = b 4066 // match: (Add8 x (Sub8 i:(Const8 <t>) z)) 4067 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 4068 // result: (Add8 i (Sub8 <t> x z)) 4069 for { 4070 _ = v.Args[1] 4071 x := v.Args[0] 4072 v_1 := v.Args[1] 4073 if v_1.Op != OpSub8 { 4074 break 4075 } 4076 _ = v_1.Args[1] 4077 i := v_1.Args[0] 4078 if i.Op != OpConst8 { 4079 break 4080 } 4081 t := i.Type 4082 z := v_1.Args[1] 4083 if !(z.Op != OpConst8 && x.Op != OpConst8) { 4084 break 4085 } 4086 v.reset(OpAdd8) 4087 v.AddArg(i) 4088 v0 := b.NewValue0(v.Pos, OpSub8, t) 4089 v0.AddArg(x) 4090 v0.AddArg(z) 4091 v.AddArg(v0) 4092 return true 4093 } 4094 // match: (Add8 (Sub8 i:(Const8 <t>) z) x) 4095 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 4096 // result: (Add8 i (Sub8 <t> x z)) 4097 for { 4098 _ = v.Args[1] 4099 v_0 := v.Args[0] 4100 if v_0.Op != OpSub8 { 4101 break 4102 } 4103 _ = v_0.Args[1] 4104 i := v_0.Args[0] 4105 if i.Op != OpConst8 { 4106 break 4107 } 4108 t := i.Type 4109 z := v_0.Args[1] 4110 x := v.Args[1] 4111 if !(z.Op != OpConst8 && x.Op != OpConst8) { 4112 break 4113 } 4114 v.reset(OpAdd8) 4115 v.AddArg(i) 4116 v0 := b.NewValue0(v.Pos, OpSub8, t) 4117 v0.AddArg(x) 4118 v0.AddArg(z) 4119 v.AddArg(v0) 4120 return true 4121 } 4122 // match: (Add8 (Sub8 z i:(Const8 <t>)) x) 4123 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 4124 // result: (Sub8 (Add8 <t> x z) i) 4125 for { 4126 _ = v.Args[1] 4127 v_0 := v.Args[0] 4128 if v_0.Op != OpSub8 { 4129 break 4130 } 4131 _ = v_0.Args[1] 4132 z := v_0.Args[0] 4133 i := v_0.Args[1] 4134 if i.Op != OpConst8 { 4135 break 4136 } 4137 t := i.Type 4138 x := v.Args[1] 4139 if !(z.Op != OpConst8 && x.Op != OpConst8) { 4140 break 4141 } 4142 v.reset(OpSub8) 4143 v0 := b.NewValue0(v.Pos, OpAdd8, t) 4144 v0.AddArg(x) 4145 v0.AddArg(z) 4146 v.AddArg(v0) 4147 v.AddArg(i) 4148 return true 4149 } 4150 // match: (Add8 x (Sub8 z i:(Const8 <t>))) 4151 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 4152 // result: (Sub8 (Add8 <t> x z) i) 4153 for { 4154 _ = v.Args[1] 4155 x := v.Args[0] 4156 v_1 := v.Args[1] 4157 if v_1.Op != OpSub8 { 4158 break 4159 } 4160 _ = v_1.Args[1] 4161 z := v_1.Args[0] 4162 i := v_1.Args[1] 4163 if i.Op != OpConst8 { 4164 break 4165 } 4166 t := i.Type 4167 if !(z.Op != OpConst8 && x.Op != OpConst8) { 4168 break 4169 } 4170 v.reset(OpSub8) 4171 v0 := b.NewValue0(v.Pos, OpAdd8, t) 4172 v0.AddArg(x) 4173 v0.AddArg(z) 4174 v.AddArg(v0) 4175 v.AddArg(i) 4176 return true 4177 } 4178 // match: (Add8 x (Sub8 z i:(Const8 <t>))) 4179 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 4180 // result: (Sub8 (Add8 <t> x z) i) 4181 for { 4182 _ = v.Args[1] 4183 x := v.Args[0] 4184 v_1 := v.Args[1] 4185 if v_1.Op != OpSub8 { 4186 break 4187 } 4188 _ = v_1.Args[1] 4189 z := v_1.Args[0] 4190 i := v_1.Args[1] 4191 if i.Op != OpConst8 { 4192 break 4193 } 4194 t := i.Type 4195 if !(z.Op != OpConst8 && x.Op != OpConst8) { 4196 break 4197 } 4198 v.reset(OpSub8) 4199 v0 := b.NewValue0(v.Pos, OpAdd8, t) 4200 v0.AddArg(x) 4201 v0.AddArg(z) 4202 v.AddArg(v0) 4203 v.AddArg(i) 4204 return true 4205 } 4206 // match: (Add8 (Sub8 z i:(Const8 <t>)) x) 4207 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 4208 // result: (Sub8 (Add8 <t> x z) i) 4209 for { 4210 _ = v.Args[1] 4211 v_0 := v.Args[0] 4212 if v_0.Op != OpSub8 { 4213 break 4214 } 4215 _ = v_0.Args[1] 4216 z := v_0.Args[0] 4217 i := v_0.Args[1] 4218 if i.Op != OpConst8 { 4219 break 4220 } 4221 t := i.Type 4222 x := v.Args[1] 4223 if !(z.Op != OpConst8 && x.Op != OpConst8) { 4224 break 4225 } 4226 v.reset(OpSub8) 4227 v0 := b.NewValue0(v.Pos, OpAdd8, t) 4228 v0.AddArg(x) 4229 v0.AddArg(z) 4230 v.AddArg(v0) 4231 v.AddArg(i) 4232 return true 4233 } 4234 // match: (Add8 (Const8 <t> [c]) (Add8 (Const8 <t> [d]) x)) 4235 // cond: 4236 // result: (Add8 (Const8 <t> [int64(int8(c+d))]) x) 4237 for { 4238 _ = v.Args[1] 4239 v_0 := v.Args[0] 4240 if v_0.Op != OpConst8 { 4241 break 4242 } 4243 t := v_0.Type 4244 c := v_0.AuxInt 4245 v_1 := v.Args[1] 4246 if v_1.Op != OpAdd8 { 4247 break 4248 } 4249 _ = v_1.Args[1] 4250 v_1_0 := v_1.Args[0] 4251 if v_1_0.Op != OpConst8 { 4252 break 4253 } 4254 if v_1_0.Type != t { 4255 break 4256 } 4257 d := v_1_0.AuxInt 4258 x := v_1.Args[1] 4259 v.reset(OpAdd8) 4260 v0 := b.NewValue0(v.Pos, OpConst8, t) 4261 v0.AuxInt = int64(int8(c + d)) 4262 v.AddArg(v0) 4263 v.AddArg(x) 4264 return true 4265 } 4266 // match: (Add8 (Const8 <t> [c]) (Add8 x (Const8 <t> [d]))) 4267 // cond: 4268 // result: (Add8 (Const8 <t> [int64(int8(c+d))]) x) 4269 for { 4270 _ = v.Args[1] 4271 v_0 := v.Args[0] 4272 if v_0.Op != OpConst8 { 4273 break 4274 } 4275 t := v_0.Type 4276 c := v_0.AuxInt 4277 v_1 := v.Args[1] 4278 if v_1.Op != OpAdd8 { 4279 break 4280 } 4281 _ = v_1.Args[1] 4282 x := v_1.Args[0] 4283 v_1_1 := v_1.Args[1] 4284 if v_1_1.Op != OpConst8 { 4285 break 4286 } 4287 if v_1_1.Type != t { 4288 break 4289 } 4290 d := v_1_1.AuxInt 4291 v.reset(OpAdd8) 4292 v0 := b.NewValue0(v.Pos, OpConst8, t) 4293 v0.AuxInt = int64(int8(c + d)) 4294 v.AddArg(v0) 4295 v.AddArg(x) 4296 return true 4297 } 4298 // match: (Add8 (Add8 (Const8 <t> [d]) x) (Const8 <t> [c])) 4299 // cond: 4300 // result: (Add8 (Const8 <t> [int64(int8(c+d))]) x) 4301 for { 4302 _ = v.Args[1] 4303 v_0 := v.Args[0] 4304 if v_0.Op != OpAdd8 { 4305 break 4306 } 4307 _ = v_0.Args[1] 4308 v_0_0 := v_0.Args[0] 4309 if v_0_0.Op != OpConst8 { 4310 break 4311 } 4312 t := v_0_0.Type 4313 d := v_0_0.AuxInt 4314 x := v_0.Args[1] 4315 v_1 := v.Args[1] 4316 if v_1.Op != OpConst8 { 4317 break 4318 } 4319 if v_1.Type != t { 4320 break 4321 } 4322 c := v_1.AuxInt 4323 v.reset(OpAdd8) 4324 v0 := b.NewValue0(v.Pos, OpConst8, t) 4325 v0.AuxInt = int64(int8(c + d)) 4326 v.AddArg(v0) 4327 v.AddArg(x) 4328 return true 4329 } 4330 // match: (Add8 (Add8 x (Const8 <t> [d])) (Const8 <t> [c])) 4331 // cond: 4332 // result: (Add8 (Const8 <t> [int64(int8(c+d))]) x) 4333 for { 4334 _ = v.Args[1] 4335 v_0 := v.Args[0] 4336 if v_0.Op != OpAdd8 { 4337 break 4338 } 4339 _ = v_0.Args[1] 4340 x := v_0.Args[0] 4341 v_0_1 := v_0.Args[1] 4342 if v_0_1.Op != OpConst8 { 4343 break 4344 } 4345 t := v_0_1.Type 4346 d := v_0_1.AuxInt 4347 v_1 := v.Args[1] 4348 if v_1.Op != OpConst8 { 4349 break 4350 } 4351 if v_1.Type != t { 4352 break 4353 } 4354 c := v_1.AuxInt 4355 v.reset(OpAdd8) 4356 v0 := b.NewValue0(v.Pos, OpConst8, t) 4357 v0.AuxInt = int64(int8(c + d)) 4358 v.AddArg(v0) 4359 v.AddArg(x) 4360 return true 4361 } 4362 return false 4363 } 4364 func rewriteValuegeneric_OpAdd8_30(v *Value) bool { 4365 b := v.Block 4366 _ = b 4367 // match: (Add8 (Const8 <t> [c]) (Sub8 (Const8 <t> [d]) x)) 4368 // cond: 4369 // result: (Sub8 (Const8 <t> [int64(int8(c+d))]) x) 4370 for { 4371 _ = v.Args[1] 4372 v_0 := v.Args[0] 4373 if v_0.Op != OpConst8 { 4374 break 4375 } 4376 t := v_0.Type 4377 c := v_0.AuxInt 4378 v_1 := v.Args[1] 4379 if v_1.Op != OpSub8 { 4380 break 4381 } 4382 _ = v_1.Args[1] 4383 v_1_0 := v_1.Args[0] 4384 if v_1_0.Op != OpConst8 { 4385 break 4386 } 4387 if v_1_0.Type != t { 4388 break 4389 } 4390 d := v_1_0.AuxInt 4391 x := v_1.Args[1] 4392 v.reset(OpSub8) 4393 v0 := b.NewValue0(v.Pos, OpConst8, t) 4394 v0.AuxInt = int64(int8(c + d)) 4395 v.AddArg(v0) 4396 v.AddArg(x) 4397 return true 4398 } 4399 // match: (Add8 (Sub8 (Const8 <t> [d]) x) (Const8 <t> [c])) 4400 // cond: 4401 // result: (Sub8 (Const8 <t> [int64(int8(c+d))]) x) 4402 for { 4403 _ = v.Args[1] 4404 v_0 := v.Args[0] 4405 if v_0.Op != OpSub8 { 4406 break 4407 } 4408 _ = v_0.Args[1] 4409 v_0_0 := v_0.Args[0] 4410 if v_0_0.Op != OpConst8 { 4411 break 4412 } 4413 t := v_0_0.Type 4414 d := v_0_0.AuxInt 4415 x := v_0.Args[1] 4416 v_1 := v.Args[1] 4417 if v_1.Op != OpConst8 { 4418 break 4419 } 4420 if v_1.Type != t { 4421 break 4422 } 4423 c := v_1.AuxInt 4424 v.reset(OpSub8) 4425 v0 := b.NewValue0(v.Pos, OpConst8, t) 4426 v0.AuxInt = int64(int8(c + d)) 4427 v.AddArg(v0) 4428 v.AddArg(x) 4429 return true 4430 } 4431 // match: (Add8 (Const8 <t> [c]) (Sub8 x (Const8 <t> [d]))) 4432 // cond: 4433 // result: (Add8 (Const8 <t> [int64(int8(c-d))]) x) 4434 for { 4435 _ = v.Args[1] 4436 v_0 := v.Args[0] 4437 if v_0.Op != OpConst8 { 4438 break 4439 } 4440 t := v_0.Type 4441 c := v_0.AuxInt 4442 v_1 := v.Args[1] 4443 if v_1.Op != OpSub8 { 4444 break 4445 } 4446 _ = v_1.Args[1] 4447 x := v_1.Args[0] 4448 v_1_1 := v_1.Args[1] 4449 if v_1_1.Op != OpConst8 { 4450 break 4451 } 4452 if v_1_1.Type != t { 4453 break 4454 } 4455 d := v_1_1.AuxInt 4456 v.reset(OpAdd8) 4457 v0 := b.NewValue0(v.Pos, OpConst8, t) 4458 v0.AuxInt = int64(int8(c - d)) 4459 v.AddArg(v0) 4460 v.AddArg(x) 4461 return true 4462 } 4463 // match: (Add8 (Sub8 x (Const8 <t> [d])) (Const8 <t> [c])) 4464 // cond: 4465 // result: (Add8 (Const8 <t> [int64(int8(c-d))]) x) 4466 for { 4467 _ = v.Args[1] 4468 v_0 := v.Args[0] 4469 if v_0.Op != OpSub8 { 4470 break 4471 } 4472 _ = v_0.Args[1] 4473 x := v_0.Args[0] 4474 v_0_1 := v_0.Args[1] 4475 if v_0_1.Op != OpConst8 { 4476 break 4477 } 4478 t := v_0_1.Type 4479 d := v_0_1.AuxInt 4480 v_1 := v.Args[1] 4481 if v_1.Op != OpConst8 { 4482 break 4483 } 4484 if v_1.Type != t { 4485 break 4486 } 4487 c := v_1.AuxInt 4488 v.reset(OpAdd8) 4489 v0 := b.NewValue0(v.Pos, OpConst8, t) 4490 v0.AuxInt = int64(int8(c - d)) 4491 v.AddArg(v0) 4492 v.AddArg(x) 4493 return true 4494 } 4495 return false 4496 } 4497 func rewriteValuegeneric_OpAddPtr_0(v *Value) bool { 4498 // match: (AddPtr <t> x (Const64 [c])) 4499 // cond: 4500 // result: (OffPtr <t> x [c]) 4501 for { 4502 t := v.Type 4503 _ = v.Args[1] 4504 x := v.Args[0] 4505 v_1 := v.Args[1] 4506 if v_1.Op != OpConst64 { 4507 break 4508 } 4509 c := v_1.AuxInt 4510 v.reset(OpOffPtr) 4511 v.Type = t 4512 v.AuxInt = c 4513 v.AddArg(x) 4514 return true 4515 } 4516 // match: (AddPtr <t> x (Const32 [c])) 4517 // cond: 4518 // result: (OffPtr <t> x [c]) 4519 for { 4520 t := v.Type 4521 _ = v.Args[1] 4522 x := v.Args[0] 4523 v_1 := v.Args[1] 4524 if v_1.Op != OpConst32 { 4525 break 4526 } 4527 c := v_1.AuxInt 4528 v.reset(OpOffPtr) 4529 v.Type = t 4530 v.AuxInt = c 4531 v.AddArg(x) 4532 return true 4533 } 4534 return false 4535 } 4536 func rewriteValuegeneric_OpAnd16_0(v *Value) bool { 4537 // match: (And16 (Const16 [c]) (Const16 [d])) 4538 // cond: 4539 // result: (Const16 [int64(int16(c&d))]) 4540 for { 4541 _ = v.Args[1] 4542 v_0 := v.Args[0] 4543 if v_0.Op != OpConst16 { 4544 break 4545 } 4546 c := v_0.AuxInt 4547 v_1 := v.Args[1] 4548 if v_1.Op != OpConst16 { 4549 break 4550 } 4551 d := v_1.AuxInt 4552 v.reset(OpConst16) 4553 v.AuxInt = int64(int16(c & d)) 4554 return true 4555 } 4556 // match: (And16 (Const16 [d]) (Const16 [c])) 4557 // cond: 4558 // result: (Const16 [int64(int16(c&d))]) 4559 for { 4560 _ = v.Args[1] 4561 v_0 := v.Args[0] 4562 if v_0.Op != OpConst16 { 4563 break 4564 } 4565 d := v_0.AuxInt 4566 v_1 := v.Args[1] 4567 if v_1.Op != OpConst16 { 4568 break 4569 } 4570 c := v_1.AuxInt 4571 v.reset(OpConst16) 4572 v.AuxInt = int64(int16(c & d)) 4573 return true 4574 } 4575 // match: (And16 x x) 4576 // cond: 4577 // result: x 4578 for { 4579 _ = v.Args[1] 4580 x := v.Args[0] 4581 if x != v.Args[1] { 4582 break 4583 } 4584 v.reset(OpCopy) 4585 v.Type = x.Type 4586 v.AddArg(x) 4587 return true 4588 } 4589 // match: (And16 (Const16 [-1]) x) 4590 // cond: 4591 // result: x 4592 for { 4593 _ = v.Args[1] 4594 v_0 := v.Args[0] 4595 if v_0.Op != OpConst16 { 4596 break 4597 } 4598 if v_0.AuxInt != -1 { 4599 break 4600 } 4601 x := v.Args[1] 4602 v.reset(OpCopy) 4603 v.Type = x.Type 4604 v.AddArg(x) 4605 return true 4606 } 4607 // match: (And16 x (Const16 [-1])) 4608 // cond: 4609 // result: x 4610 for { 4611 _ = v.Args[1] 4612 x := v.Args[0] 4613 v_1 := v.Args[1] 4614 if v_1.Op != OpConst16 { 4615 break 4616 } 4617 if v_1.AuxInt != -1 { 4618 break 4619 } 4620 v.reset(OpCopy) 4621 v.Type = x.Type 4622 v.AddArg(x) 4623 return true 4624 } 4625 // match: (And16 (Const16 [0]) _) 4626 // cond: 4627 // result: (Const16 [0]) 4628 for { 4629 _ = v.Args[1] 4630 v_0 := v.Args[0] 4631 if v_0.Op != OpConst16 { 4632 break 4633 } 4634 if v_0.AuxInt != 0 { 4635 break 4636 } 4637 v.reset(OpConst16) 4638 v.AuxInt = 0 4639 return true 4640 } 4641 // match: (And16 _ (Const16 [0])) 4642 // cond: 4643 // result: (Const16 [0]) 4644 for { 4645 _ = v.Args[1] 4646 v_1 := v.Args[1] 4647 if v_1.Op != OpConst16 { 4648 break 4649 } 4650 if v_1.AuxInt != 0 { 4651 break 4652 } 4653 v.reset(OpConst16) 4654 v.AuxInt = 0 4655 return true 4656 } 4657 // match: (And16 x (And16 x y)) 4658 // cond: 4659 // result: (And16 x y) 4660 for { 4661 _ = v.Args[1] 4662 x := v.Args[0] 4663 v_1 := v.Args[1] 4664 if v_1.Op != OpAnd16 { 4665 break 4666 } 4667 _ = v_1.Args[1] 4668 if x != v_1.Args[0] { 4669 break 4670 } 4671 y := v_1.Args[1] 4672 v.reset(OpAnd16) 4673 v.AddArg(x) 4674 v.AddArg(y) 4675 return true 4676 } 4677 // match: (And16 x (And16 y x)) 4678 // cond: 4679 // result: (And16 x y) 4680 for { 4681 _ = v.Args[1] 4682 x := v.Args[0] 4683 v_1 := v.Args[1] 4684 if v_1.Op != OpAnd16 { 4685 break 4686 } 4687 _ = v_1.Args[1] 4688 y := v_1.Args[0] 4689 if x != v_1.Args[1] { 4690 break 4691 } 4692 v.reset(OpAnd16) 4693 v.AddArg(x) 4694 v.AddArg(y) 4695 return true 4696 } 4697 // match: (And16 (And16 x y) x) 4698 // cond: 4699 // result: (And16 x y) 4700 for { 4701 _ = v.Args[1] 4702 v_0 := v.Args[0] 4703 if v_0.Op != OpAnd16 { 4704 break 4705 } 4706 _ = v_0.Args[1] 4707 x := v_0.Args[0] 4708 y := v_0.Args[1] 4709 if x != v.Args[1] { 4710 break 4711 } 4712 v.reset(OpAnd16) 4713 v.AddArg(x) 4714 v.AddArg(y) 4715 return true 4716 } 4717 return false 4718 } 4719 func rewriteValuegeneric_OpAnd16_10(v *Value) bool { 4720 b := v.Block 4721 _ = b 4722 // match: (And16 (And16 y x) x) 4723 // cond: 4724 // result: (And16 x y) 4725 for { 4726 _ = v.Args[1] 4727 v_0 := v.Args[0] 4728 if v_0.Op != OpAnd16 { 4729 break 4730 } 4731 _ = v_0.Args[1] 4732 y := v_0.Args[0] 4733 x := v_0.Args[1] 4734 if x != v.Args[1] { 4735 break 4736 } 4737 v.reset(OpAnd16) 4738 v.AddArg(x) 4739 v.AddArg(y) 4740 return true 4741 } 4742 // match: (And16 (And16 i:(Const16 <t>) z) x) 4743 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 4744 // result: (And16 i (And16 <t> z x)) 4745 for { 4746 _ = v.Args[1] 4747 v_0 := v.Args[0] 4748 if v_0.Op != OpAnd16 { 4749 break 4750 } 4751 _ = v_0.Args[1] 4752 i := v_0.Args[0] 4753 if i.Op != OpConst16 { 4754 break 4755 } 4756 t := i.Type 4757 z := v_0.Args[1] 4758 x := v.Args[1] 4759 if !(z.Op != OpConst16 && x.Op != OpConst16) { 4760 break 4761 } 4762 v.reset(OpAnd16) 4763 v.AddArg(i) 4764 v0 := b.NewValue0(v.Pos, OpAnd16, t) 4765 v0.AddArg(z) 4766 v0.AddArg(x) 4767 v.AddArg(v0) 4768 return true 4769 } 4770 // match: (And16 (And16 z i:(Const16 <t>)) x) 4771 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 4772 // result: (And16 i (And16 <t> z x)) 4773 for { 4774 _ = v.Args[1] 4775 v_0 := v.Args[0] 4776 if v_0.Op != OpAnd16 { 4777 break 4778 } 4779 _ = v_0.Args[1] 4780 z := v_0.Args[0] 4781 i := v_0.Args[1] 4782 if i.Op != OpConst16 { 4783 break 4784 } 4785 t := i.Type 4786 x := v.Args[1] 4787 if !(z.Op != OpConst16 && x.Op != OpConst16) { 4788 break 4789 } 4790 v.reset(OpAnd16) 4791 v.AddArg(i) 4792 v0 := b.NewValue0(v.Pos, OpAnd16, t) 4793 v0.AddArg(z) 4794 v0.AddArg(x) 4795 v.AddArg(v0) 4796 return true 4797 } 4798 // match: (And16 x (And16 i:(Const16 <t>) z)) 4799 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 4800 // result: (And16 i (And16 <t> z x)) 4801 for { 4802 _ = v.Args[1] 4803 x := v.Args[0] 4804 v_1 := v.Args[1] 4805 if v_1.Op != OpAnd16 { 4806 break 4807 } 4808 _ = v_1.Args[1] 4809 i := v_1.Args[0] 4810 if i.Op != OpConst16 { 4811 break 4812 } 4813 t := i.Type 4814 z := v_1.Args[1] 4815 if !(z.Op != OpConst16 && x.Op != OpConst16) { 4816 break 4817 } 4818 v.reset(OpAnd16) 4819 v.AddArg(i) 4820 v0 := b.NewValue0(v.Pos, OpAnd16, t) 4821 v0.AddArg(z) 4822 v0.AddArg(x) 4823 v.AddArg(v0) 4824 return true 4825 } 4826 // match: (And16 x (And16 z i:(Const16 <t>))) 4827 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 4828 // result: (And16 i (And16 <t> z x)) 4829 for { 4830 _ = v.Args[1] 4831 x := v.Args[0] 4832 v_1 := v.Args[1] 4833 if v_1.Op != OpAnd16 { 4834 break 4835 } 4836 _ = v_1.Args[1] 4837 z := v_1.Args[0] 4838 i := v_1.Args[1] 4839 if i.Op != OpConst16 { 4840 break 4841 } 4842 t := i.Type 4843 if !(z.Op != OpConst16 && x.Op != OpConst16) { 4844 break 4845 } 4846 v.reset(OpAnd16) 4847 v.AddArg(i) 4848 v0 := b.NewValue0(v.Pos, OpAnd16, t) 4849 v0.AddArg(z) 4850 v0.AddArg(x) 4851 v.AddArg(v0) 4852 return true 4853 } 4854 // match: (And16 (Const16 <t> [c]) (And16 (Const16 <t> [d]) x)) 4855 // cond: 4856 // result: (And16 (Const16 <t> [int64(int16(c&d))]) x) 4857 for { 4858 _ = v.Args[1] 4859 v_0 := v.Args[0] 4860 if v_0.Op != OpConst16 { 4861 break 4862 } 4863 t := v_0.Type 4864 c := v_0.AuxInt 4865 v_1 := v.Args[1] 4866 if v_1.Op != OpAnd16 { 4867 break 4868 } 4869 _ = v_1.Args[1] 4870 v_1_0 := v_1.Args[0] 4871 if v_1_0.Op != OpConst16 { 4872 break 4873 } 4874 if v_1_0.Type != t { 4875 break 4876 } 4877 d := v_1_0.AuxInt 4878 x := v_1.Args[1] 4879 v.reset(OpAnd16) 4880 v0 := b.NewValue0(v.Pos, OpConst16, t) 4881 v0.AuxInt = int64(int16(c & d)) 4882 v.AddArg(v0) 4883 v.AddArg(x) 4884 return true 4885 } 4886 // match: (And16 (Const16 <t> [c]) (And16 x (Const16 <t> [d]))) 4887 // cond: 4888 // result: (And16 (Const16 <t> [int64(int16(c&d))]) x) 4889 for { 4890 _ = v.Args[1] 4891 v_0 := v.Args[0] 4892 if v_0.Op != OpConst16 { 4893 break 4894 } 4895 t := v_0.Type 4896 c := v_0.AuxInt 4897 v_1 := v.Args[1] 4898 if v_1.Op != OpAnd16 { 4899 break 4900 } 4901 _ = v_1.Args[1] 4902 x := v_1.Args[0] 4903 v_1_1 := v_1.Args[1] 4904 if v_1_1.Op != OpConst16 { 4905 break 4906 } 4907 if v_1_1.Type != t { 4908 break 4909 } 4910 d := v_1_1.AuxInt 4911 v.reset(OpAnd16) 4912 v0 := b.NewValue0(v.Pos, OpConst16, t) 4913 v0.AuxInt = int64(int16(c & d)) 4914 v.AddArg(v0) 4915 v.AddArg(x) 4916 return true 4917 } 4918 // match: (And16 (And16 (Const16 <t> [d]) x) (Const16 <t> [c])) 4919 // cond: 4920 // result: (And16 (Const16 <t> [int64(int16(c&d))]) x) 4921 for { 4922 _ = v.Args[1] 4923 v_0 := v.Args[0] 4924 if v_0.Op != OpAnd16 { 4925 break 4926 } 4927 _ = v_0.Args[1] 4928 v_0_0 := v_0.Args[0] 4929 if v_0_0.Op != OpConst16 { 4930 break 4931 } 4932 t := v_0_0.Type 4933 d := v_0_0.AuxInt 4934 x := v_0.Args[1] 4935 v_1 := v.Args[1] 4936 if v_1.Op != OpConst16 { 4937 break 4938 } 4939 if v_1.Type != t { 4940 break 4941 } 4942 c := v_1.AuxInt 4943 v.reset(OpAnd16) 4944 v0 := b.NewValue0(v.Pos, OpConst16, t) 4945 v0.AuxInt = int64(int16(c & d)) 4946 v.AddArg(v0) 4947 v.AddArg(x) 4948 return true 4949 } 4950 // match: (And16 (And16 x (Const16 <t> [d])) (Const16 <t> [c])) 4951 // cond: 4952 // result: (And16 (Const16 <t> [int64(int16(c&d))]) x) 4953 for { 4954 _ = v.Args[1] 4955 v_0 := v.Args[0] 4956 if v_0.Op != OpAnd16 { 4957 break 4958 } 4959 _ = v_0.Args[1] 4960 x := v_0.Args[0] 4961 v_0_1 := v_0.Args[1] 4962 if v_0_1.Op != OpConst16 { 4963 break 4964 } 4965 t := v_0_1.Type 4966 d := v_0_1.AuxInt 4967 v_1 := v.Args[1] 4968 if v_1.Op != OpConst16 { 4969 break 4970 } 4971 if v_1.Type != t { 4972 break 4973 } 4974 c := v_1.AuxInt 4975 v.reset(OpAnd16) 4976 v0 := b.NewValue0(v.Pos, OpConst16, t) 4977 v0.AuxInt = int64(int16(c & d)) 4978 v.AddArg(v0) 4979 v.AddArg(x) 4980 return true 4981 } 4982 return false 4983 } 4984 func rewriteValuegeneric_OpAnd32_0(v *Value) bool { 4985 // match: (And32 (Const32 [c]) (Const32 [d])) 4986 // cond: 4987 // result: (Const32 [int64(int32(c&d))]) 4988 for { 4989 _ = v.Args[1] 4990 v_0 := v.Args[0] 4991 if v_0.Op != OpConst32 { 4992 break 4993 } 4994 c := v_0.AuxInt 4995 v_1 := v.Args[1] 4996 if v_1.Op != OpConst32 { 4997 break 4998 } 4999 d := v_1.AuxInt 5000 v.reset(OpConst32) 5001 v.AuxInt = int64(int32(c & d)) 5002 return true 5003 } 5004 // match: (And32 (Const32 [d]) (Const32 [c])) 5005 // cond: 5006 // result: (Const32 [int64(int32(c&d))]) 5007 for { 5008 _ = v.Args[1] 5009 v_0 := v.Args[0] 5010 if v_0.Op != OpConst32 { 5011 break 5012 } 5013 d := v_0.AuxInt 5014 v_1 := v.Args[1] 5015 if v_1.Op != OpConst32 { 5016 break 5017 } 5018 c := v_1.AuxInt 5019 v.reset(OpConst32) 5020 v.AuxInt = int64(int32(c & d)) 5021 return true 5022 } 5023 // match: (And32 x x) 5024 // cond: 5025 // result: x 5026 for { 5027 _ = v.Args[1] 5028 x := v.Args[0] 5029 if x != v.Args[1] { 5030 break 5031 } 5032 v.reset(OpCopy) 5033 v.Type = x.Type 5034 v.AddArg(x) 5035 return true 5036 } 5037 // match: (And32 (Const32 [-1]) x) 5038 // cond: 5039 // result: x 5040 for { 5041 _ = v.Args[1] 5042 v_0 := v.Args[0] 5043 if v_0.Op != OpConst32 { 5044 break 5045 } 5046 if v_0.AuxInt != -1 { 5047 break 5048 } 5049 x := v.Args[1] 5050 v.reset(OpCopy) 5051 v.Type = x.Type 5052 v.AddArg(x) 5053 return true 5054 } 5055 // match: (And32 x (Const32 [-1])) 5056 // cond: 5057 // result: x 5058 for { 5059 _ = v.Args[1] 5060 x := v.Args[0] 5061 v_1 := v.Args[1] 5062 if v_1.Op != OpConst32 { 5063 break 5064 } 5065 if v_1.AuxInt != -1 { 5066 break 5067 } 5068 v.reset(OpCopy) 5069 v.Type = x.Type 5070 v.AddArg(x) 5071 return true 5072 } 5073 // match: (And32 (Const32 [0]) _) 5074 // cond: 5075 // result: (Const32 [0]) 5076 for { 5077 _ = v.Args[1] 5078 v_0 := v.Args[0] 5079 if v_0.Op != OpConst32 { 5080 break 5081 } 5082 if v_0.AuxInt != 0 { 5083 break 5084 } 5085 v.reset(OpConst32) 5086 v.AuxInt = 0 5087 return true 5088 } 5089 // match: (And32 _ (Const32 [0])) 5090 // cond: 5091 // result: (Const32 [0]) 5092 for { 5093 _ = v.Args[1] 5094 v_1 := v.Args[1] 5095 if v_1.Op != OpConst32 { 5096 break 5097 } 5098 if v_1.AuxInt != 0 { 5099 break 5100 } 5101 v.reset(OpConst32) 5102 v.AuxInt = 0 5103 return true 5104 } 5105 // match: (And32 x (And32 x y)) 5106 // cond: 5107 // result: (And32 x y) 5108 for { 5109 _ = v.Args[1] 5110 x := v.Args[0] 5111 v_1 := v.Args[1] 5112 if v_1.Op != OpAnd32 { 5113 break 5114 } 5115 _ = v_1.Args[1] 5116 if x != v_1.Args[0] { 5117 break 5118 } 5119 y := v_1.Args[1] 5120 v.reset(OpAnd32) 5121 v.AddArg(x) 5122 v.AddArg(y) 5123 return true 5124 } 5125 // match: (And32 x (And32 y x)) 5126 // cond: 5127 // result: (And32 x y) 5128 for { 5129 _ = v.Args[1] 5130 x := v.Args[0] 5131 v_1 := v.Args[1] 5132 if v_1.Op != OpAnd32 { 5133 break 5134 } 5135 _ = v_1.Args[1] 5136 y := v_1.Args[0] 5137 if x != v_1.Args[1] { 5138 break 5139 } 5140 v.reset(OpAnd32) 5141 v.AddArg(x) 5142 v.AddArg(y) 5143 return true 5144 } 5145 // match: (And32 (And32 x y) x) 5146 // cond: 5147 // result: (And32 x y) 5148 for { 5149 _ = v.Args[1] 5150 v_0 := v.Args[0] 5151 if v_0.Op != OpAnd32 { 5152 break 5153 } 5154 _ = v_0.Args[1] 5155 x := v_0.Args[0] 5156 y := v_0.Args[1] 5157 if x != v.Args[1] { 5158 break 5159 } 5160 v.reset(OpAnd32) 5161 v.AddArg(x) 5162 v.AddArg(y) 5163 return true 5164 } 5165 return false 5166 } 5167 func rewriteValuegeneric_OpAnd32_10(v *Value) bool { 5168 b := v.Block 5169 _ = b 5170 // match: (And32 (And32 y x) x) 5171 // cond: 5172 // result: (And32 x y) 5173 for { 5174 _ = v.Args[1] 5175 v_0 := v.Args[0] 5176 if v_0.Op != OpAnd32 { 5177 break 5178 } 5179 _ = v_0.Args[1] 5180 y := v_0.Args[0] 5181 x := v_0.Args[1] 5182 if x != v.Args[1] { 5183 break 5184 } 5185 v.reset(OpAnd32) 5186 v.AddArg(x) 5187 v.AddArg(y) 5188 return true 5189 } 5190 // match: (And32 (And32 i:(Const32 <t>) z) x) 5191 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 5192 // result: (And32 i (And32 <t> z x)) 5193 for { 5194 _ = v.Args[1] 5195 v_0 := v.Args[0] 5196 if v_0.Op != OpAnd32 { 5197 break 5198 } 5199 _ = v_0.Args[1] 5200 i := v_0.Args[0] 5201 if i.Op != OpConst32 { 5202 break 5203 } 5204 t := i.Type 5205 z := v_0.Args[1] 5206 x := v.Args[1] 5207 if !(z.Op != OpConst32 && x.Op != OpConst32) { 5208 break 5209 } 5210 v.reset(OpAnd32) 5211 v.AddArg(i) 5212 v0 := b.NewValue0(v.Pos, OpAnd32, t) 5213 v0.AddArg(z) 5214 v0.AddArg(x) 5215 v.AddArg(v0) 5216 return true 5217 } 5218 // match: (And32 (And32 z i:(Const32 <t>)) x) 5219 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 5220 // result: (And32 i (And32 <t> z x)) 5221 for { 5222 _ = v.Args[1] 5223 v_0 := v.Args[0] 5224 if v_0.Op != OpAnd32 { 5225 break 5226 } 5227 _ = v_0.Args[1] 5228 z := v_0.Args[0] 5229 i := v_0.Args[1] 5230 if i.Op != OpConst32 { 5231 break 5232 } 5233 t := i.Type 5234 x := v.Args[1] 5235 if !(z.Op != OpConst32 && x.Op != OpConst32) { 5236 break 5237 } 5238 v.reset(OpAnd32) 5239 v.AddArg(i) 5240 v0 := b.NewValue0(v.Pos, OpAnd32, t) 5241 v0.AddArg(z) 5242 v0.AddArg(x) 5243 v.AddArg(v0) 5244 return true 5245 } 5246 // match: (And32 x (And32 i:(Const32 <t>) z)) 5247 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 5248 // result: (And32 i (And32 <t> z x)) 5249 for { 5250 _ = v.Args[1] 5251 x := v.Args[0] 5252 v_1 := v.Args[1] 5253 if v_1.Op != OpAnd32 { 5254 break 5255 } 5256 _ = v_1.Args[1] 5257 i := v_1.Args[0] 5258 if i.Op != OpConst32 { 5259 break 5260 } 5261 t := i.Type 5262 z := v_1.Args[1] 5263 if !(z.Op != OpConst32 && x.Op != OpConst32) { 5264 break 5265 } 5266 v.reset(OpAnd32) 5267 v.AddArg(i) 5268 v0 := b.NewValue0(v.Pos, OpAnd32, t) 5269 v0.AddArg(z) 5270 v0.AddArg(x) 5271 v.AddArg(v0) 5272 return true 5273 } 5274 // match: (And32 x (And32 z i:(Const32 <t>))) 5275 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 5276 // result: (And32 i (And32 <t> z x)) 5277 for { 5278 _ = v.Args[1] 5279 x := v.Args[0] 5280 v_1 := v.Args[1] 5281 if v_1.Op != OpAnd32 { 5282 break 5283 } 5284 _ = v_1.Args[1] 5285 z := v_1.Args[0] 5286 i := v_1.Args[1] 5287 if i.Op != OpConst32 { 5288 break 5289 } 5290 t := i.Type 5291 if !(z.Op != OpConst32 && x.Op != OpConst32) { 5292 break 5293 } 5294 v.reset(OpAnd32) 5295 v.AddArg(i) 5296 v0 := b.NewValue0(v.Pos, OpAnd32, t) 5297 v0.AddArg(z) 5298 v0.AddArg(x) 5299 v.AddArg(v0) 5300 return true 5301 } 5302 // match: (And32 (Const32 <t> [c]) (And32 (Const32 <t> [d]) x)) 5303 // cond: 5304 // result: (And32 (Const32 <t> [int64(int32(c&d))]) x) 5305 for { 5306 _ = v.Args[1] 5307 v_0 := v.Args[0] 5308 if v_0.Op != OpConst32 { 5309 break 5310 } 5311 t := v_0.Type 5312 c := v_0.AuxInt 5313 v_1 := v.Args[1] 5314 if v_1.Op != OpAnd32 { 5315 break 5316 } 5317 _ = v_1.Args[1] 5318 v_1_0 := v_1.Args[0] 5319 if v_1_0.Op != OpConst32 { 5320 break 5321 } 5322 if v_1_0.Type != t { 5323 break 5324 } 5325 d := v_1_0.AuxInt 5326 x := v_1.Args[1] 5327 v.reset(OpAnd32) 5328 v0 := b.NewValue0(v.Pos, OpConst32, t) 5329 v0.AuxInt = int64(int32(c & d)) 5330 v.AddArg(v0) 5331 v.AddArg(x) 5332 return true 5333 } 5334 // match: (And32 (Const32 <t> [c]) (And32 x (Const32 <t> [d]))) 5335 // cond: 5336 // result: (And32 (Const32 <t> [int64(int32(c&d))]) x) 5337 for { 5338 _ = v.Args[1] 5339 v_0 := v.Args[0] 5340 if v_0.Op != OpConst32 { 5341 break 5342 } 5343 t := v_0.Type 5344 c := v_0.AuxInt 5345 v_1 := v.Args[1] 5346 if v_1.Op != OpAnd32 { 5347 break 5348 } 5349 _ = v_1.Args[1] 5350 x := v_1.Args[0] 5351 v_1_1 := v_1.Args[1] 5352 if v_1_1.Op != OpConst32 { 5353 break 5354 } 5355 if v_1_1.Type != t { 5356 break 5357 } 5358 d := v_1_1.AuxInt 5359 v.reset(OpAnd32) 5360 v0 := b.NewValue0(v.Pos, OpConst32, t) 5361 v0.AuxInt = int64(int32(c & d)) 5362 v.AddArg(v0) 5363 v.AddArg(x) 5364 return true 5365 } 5366 // match: (And32 (And32 (Const32 <t> [d]) x) (Const32 <t> [c])) 5367 // cond: 5368 // result: (And32 (Const32 <t> [int64(int32(c&d))]) x) 5369 for { 5370 _ = v.Args[1] 5371 v_0 := v.Args[0] 5372 if v_0.Op != OpAnd32 { 5373 break 5374 } 5375 _ = v_0.Args[1] 5376 v_0_0 := v_0.Args[0] 5377 if v_0_0.Op != OpConst32 { 5378 break 5379 } 5380 t := v_0_0.Type 5381 d := v_0_0.AuxInt 5382 x := v_0.Args[1] 5383 v_1 := v.Args[1] 5384 if v_1.Op != OpConst32 { 5385 break 5386 } 5387 if v_1.Type != t { 5388 break 5389 } 5390 c := v_1.AuxInt 5391 v.reset(OpAnd32) 5392 v0 := b.NewValue0(v.Pos, OpConst32, t) 5393 v0.AuxInt = int64(int32(c & d)) 5394 v.AddArg(v0) 5395 v.AddArg(x) 5396 return true 5397 } 5398 // match: (And32 (And32 x (Const32 <t> [d])) (Const32 <t> [c])) 5399 // cond: 5400 // result: (And32 (Const32 <t> [int64(int32(c&d))]) x) 5401 for { 5402 _ = v.Args[1] 5403 v_0 := v.Args[0] 5404 if v_0.Op != OpAnd32 { 5405 break 5406 } 5407 _ = v_0.Args[1] 5408 x := v_0.Args[0] 5409 v_0_1 := v_0.Args[1] 5410 if v_0_1.Op != OpConst32 { 5411 break 5412 } 5413 t := v_0_1.Type 5414 d := v_0_1.AuxInt 5415 v_1 := v.Args[1] 5416 if v_1.Op != OpConst32 { 5417 break 5418 } 5419 if v_1.Type != t { 5420 break 5421 } 5422 c := v_1.AuxInt 5423 v.reset(OpAnd32) 5424 v0 := b.NewValue0(v.Pos, OpConst32, t) 5425 v0.AuxInt = int64(int32(c & d)) 5426 v.AddArg(v0) 5427 v.AddArg(x) 5428 return true 5429 } 5430 return false 5431 } 5432 func rewriteValuegeneric_OpAnd64_0(v *Value) bool { 5433 // match: (And64 (Const64 [c]) (Const64 [d])) 5434 // cond: 5435 // result: (Const64 [c&d]) 5436 for { 5437 _ = v.Args[1] 5438 v_0 := v.Args[0] 5439 if v_0.Op != OpConst64 { 5440 break 5441 } 5442 c := v_0.AuxInt 5443 v_1 := v.Args[1] 5444 if v_1.Op != OpConst64 { 5445 break 5446 } 5447 d := v_1.AuxInt 5448 v.reset(OpConst64) 5449 v.AuxInt = c & d 5450 return true 5451 } 5452 // match: (And64 (Const64 [d]) (Const64 [c])) 5453 // cond: 5454 // result: (Const64 [c&d]) 5455 for { 5456 _ = v.Args[1] 5457 v_0 := v.Args[0] 5458 if v_0.Op != OpConst64 { 5459 break 5460 } 5461 d := v_0.AuxInt 5462 v_1 := v.Args[1] 5463 if v_1.Op != OpConst64 { 5464 break 5465 } 5466 c := v_1.AuxInt 5467 v.reset(OpConst64) 5468 v.AuxInt = c & d 5469 return true 5470 } 5471 // match: (And64 x x) 5472 // cond: 5473 // result: x 5474 for { 5475 _ = v.Args[1] 5476 x := v.Args[0] 5477 if x != v.Args[1] { 5478 break 5479 } 5480 v.reset(OpCopy) 5481 v.Type = x.Type 5482 v.AddArg(x) 5483 return true 5484 } 5485 // match: (And64 (Const64 [-1]) x) 5486 // cond: 5487 // result: x 5488 for { 5489 _ = v.Args[1] 5490 v_0 := v.Args[0] 5491 if v_0.Op != OpConst64 { 5492 break 5493 } 5494 if v_0.AuxInt != -1 { 5495 break 5496 } 5497 x := v.Args[1] 5498 v.reset(OpCopy) 5499 v.Type = x.Type 5500 v.AddArg(x) 5501 return true 5502 } 5503 // match: (And64 x (Const64 [-1])) 5504 // cond: 5505 // result: x 5506 for { 5507 _ = v.Args[1] 5508 x := v.Args[0] 5509 v_1 := v.Args[1] 5510 if v_1.Op != OpConst64 { 5511 break 5512 } 5513 if v_1.AuxInt != -1 { 5514 break 5515 } 5516 v.reset(OpCopy) 5517 v.Type = x.Type 5518 v.AddArg(x) 5519 return true 5520 } 5521 // match: (And64 (Const64 [0]) _) 5522 // cond: 5523 // result: (Const64 [0]) 5524 for { 5525 _ = v.Args[1] 5526 v_0 := v.Args[0] 5527 if v_0.Op != OpConst64 { 5528 break 5529 } 5530 if v_0.AuxInt != 0 { 5531 break 5532 } 5533 v.reset(OpConst64) 5534 v.AuxInt = 0 5535 return true 5536 } 5537 // match: (And64 _ (Const64 [0])) 5538 // cond: 5539 // result: (Const64 [0]) 5540 for { 5541 _ = v.Args[1] 5542 v_1 := v.Args[1] 5543 if v_1.Op != OpConst64 { 5544 break 5545 } 5546 if v_1.AuxInt != 0 { 5547 break 5548 } 5549 v.reset(OpConst64) 5550 v.AuxInt = 0 5551 return true 5552 } 5553 // match: (And64 x (And64 x y)) 5554 // cond: 5555 // result: (And64 x y) 5556 for { 5557 _ = v.Args[1] 5558 x := v.Args[0] 5559 v_1 := v.Args[1] 5560 if v_1.Op != OpAnd64 { 5561 break 5562 } 5563 _ = v_1.Args[1] 5564 if x != v_1.Args[0] { 5565 break 5566 } 5567 y := v_1.Args[1] 5568 v.reset(OpAnd64) 5569 v.AddArg(x) 5570 v.AddArg(y) 5571 return true 5572 } 5573 // match: (And64 x (And64 y x)) 5574 // cond: 5575 // result: (And64 x y) 5576 for { 5577 _ = v.Args[1] 5578 x := v.Args[0] 5579 v_1 := v.Args[1] 5580 if v_1.Op != OpAnd64 { 5581 break 5582 } 5583 _ = v_1.Args[1] 5584 y := v_1.Args[0] 5585 if x != v_1.Args[1] { 5586 break 5587 } 5588 v.reset(OpAnd64) 5589 v.AddArg(x) 5590 v.AddArg(y) 5591 return true 5592 } 5593 // match: (And64 (And64 x y) x) 5594 // cond: 5595 // result: (And64 x y) 5596 for { 5597 _ = v.Args[1] 5598 v_0 := v.Args[0] 5599 if v_0.Op != OpAnd64 { 5600 break 5601 } 5602 _ = v_0.Args[1] 5603 x := v_0.Args[0] 5604 y := v_0.Args[1] 5605 if x != v.Args[1] { 5606 break 5607 } 5608 v.reset(OpAnd64) 5609 v.AddArg(x) 5610 v.AddArg(y) 5611 return true 5612 } 5613 return false 5614 } 5615 func rewriteValuegeneric_OpAnd64_10(v *Value) bool { 5616 b := v.Block 5617 _ = b 5618 // match: (And64 (And64 y x) x) 5619 // cond: 5620 // result: (And64 x y) 5621 for { 5622 _ = v.Args[1] 5623 v_0 := v.Args[0] 5624 if v_0.Op != OpAnd64 { 5625 break 5626 } 5627 _ = v_0.Args[1] 5628 y := v_0.Args[0] 5629 x := v_0.Args[1] 5630 if x != v.Args[1] { 5631 break 5632 } 5633 v.reset(OpAnd64) 5634 v.AddArg(x) 5635 v.AddArg(y) 5636 return true 5637 } 5638 // match: (And64 <t> (Const64 [y]) x) 5639 // cond: nlz(y) + nto(y) == 64 && nto(y) >= 32 5640 // result: (Rsh64Ux64 (Lsh64x64 <t> x (Const64 <t> [nlz(y)])) (Const64 <t> [nlz(y)])) 5641 for { 5642 t := v.Type 5643 _ = v.Args[1] 5644 v_0 := v.Args[0] 5645 if v_0.Op != OpConst64 { 5646 break 5647 } 5648 y := v_0.AuxInt 5649 x := v.Args[1] 5650 if !(nlz(y)+nto(y) == 64 && nto(y) >= 32) { 5651 break 5652 } 5653 v.reset(OpRsh64Ux64) 5654 v0 := b.NewValue0(v.Pos, OpLsh64x64, t) 5655 v0.AddArg(x) 5656 v1 := b.NewValue0(v.Pos, OpConst64, t) 5657 v1.AuxInt = nlz(y) 5658 v0.AddArg(v1) 5659 v.AddArg(v0) 5660 v2 := b.NewValue0(v.Pos, OpConst64, t) 5661 v2.AuxInt = nlz(y) 5662 v.AddArg(v2) 5663 return true 5664 } 5665 // match: (And64 <t> x (Const64 [y])) 5666 // cond: nlz(y) + nto(y) == 64 && nto(y) >= 32 5667 // result: (Rsh64Ux64 (Lsh64x64 <t> x (Const64 <t> [nlz(y)])) (Const64 <t> [nlz(y)])) 5668 for { 5669 t := v.Type 5670 _ = v.Args[1] 5671 x := v.Args[0] 5672 v_1 := v.Args[1] 5673 if v_1.Op != OpConst64 { 5674 break 5675 } 5676 y := v_1.AuxInt 5677 if !(nlz(y)+nto(y) == 64 && nto(y) >= 32) { 5678 break 5679 } 5680 v.reset(OpRsh64Ux64) 5681 v0 := b.NewValue0(v.Pos, OpLsh64x64, t) 5682 v0.AddArg(x) 5683 v1 := b.NewValue0(v.Pos, OpConst64, t) 5684 v1.AuxInt = nlz(y) 5685 v0.AddArg(v1) 5686 v.AddArg(v0) 5687 v2 := b.NewValue0(v.Pos, OpConst64, t) 5688 v2.AuxInt = nlz(y) 5689 v.AddArg(v2) 5690 return true 5691 } 5692 // match: (And64 <t> (Const64 [y]) x) 5693 // cond: nlo(y) + ntz(y) == 64 && ntz(y) >= 32 5694 // result: (Lsh64x64 (Rsh64Ux64 <t> x (Const64 <t> [ntz(y)])) (Const64 <t> [ntz(y)])) 5695 for { 5696 t := v.Type 5697 _ = v.Args[1] 5698 v_0 := v.Args[0] 5699 if v_0.Op != OpConst64 { 5700 break 5701 } 5702 y := v_0.AuxInt 5703 x := v.Args[1] 5704 if !(nlo(y)+ntz(y) == 64 && ntz(y) >= 32) { 5705 break 5706 } 5707 v.reset(OpLsh64x64) 5708 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, t) 5709 v0.AddArg(x) 5710 v1 := b.NewValue0(v.Pos, OpConst64, t) 5711 v1.AuxInt = ntz(y) 5712 v0.AddArg(v1) 5713 v.AddArg(v0) 5714 v2 := b.NewValue0(v.Pos, OpConst64, t) 5715 v2.AuxInt = ntz(y) 5716 v.AddArg(v2) 5717 return true 5718 } 5719 // match: (And64 <t> x (Const64 [y])) 5720 // cond: nlo(y) + ntz(y) == 64 && ntz(y) >= 32 5721 // result: (Lsh64x64 (Rsh64Ux64 <t> x (Const64 <t> [ntz(y)])) (Const64 <t> [ntz(y)])) 5722 for { 5723 t := v.Type 5724 _ = v.Args[1] 5725 x := v.Args[0] 5726 v_1 := v.Args[1] 5727 if v_1.Op != OpConst64 { 5728 break 5729 } 5730 y := v_1.AuxInt 5731 if !(nlo(y)+ntz(y) == 64 && ntz(y) >= 32) { 5732 break 5733 } 5734 v.reset(OpLsh64x64) 5735 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, t) 5736 v0.AddArg(x) 5737 v1 := b.NewValue0(v.Pos, OpConst64, t) 5738 v1.AuxInt = ntz(y) 5739 v0.AddArg(v1) 5740 v.AddArg(v0) 5741 v2 := b.NewValue0(v.Pos, OpConst64, t) 5742 v2.AuxInt = ntz(y) 5743 v.AddArg(v2) 5744 return true 5745 } 5746 // match: (And64 (And64 i:(Const64 <t>) z) x) 5747 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 5748 // result: (And64 i (And64 <t> z x)) 5749 for { 5750 _ = v.Args[1] 5751 v_0 := v.Args[0] 5752 if v_0.Op != OpAnd64 { 5753 break 5754 } 5755 _ = v_0.Args[1] 5756 i := v_0.Args[0] 5757 if i.Op != OpConst64 { 5758 break 5759 } 5760 t := i.Type 5761 z := v_0.Args[1] 5762 x := v.Args[1] 5763 if !(z.Op != OpConst64 && x.Op != OpConst64) { 5764 break 5765 } 5766 v.reset(OpAnd64) 5767 v.AddArg(i) 5768 v0 := b.NewValue0(v.Pos, OpAnd64, t) 5769 v0.AddArg(z) 5770 v0.AddArg(x) 5771 v.AddArg(v0) 5772 return true 5773 } 5774 // match: (And64 (And64 z i:(Const64 <t>)) x) 5775 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 5776 // result: (And64 i (And64 <t> z x)) 5777 for { 5778 _ = v.Args[1] 5779 v_0 := v.Args[0] 5780 if v_0.Op != OpAnd64 { 5781 break 5782 } 5783 _ = v_0.Args[1] 5784 z := v_0.Args[0] 5785 i := v_0.Args[1] 5786 if i.Op != OpConst64 { 5787 break 5788 } 5789 t := i.Type 5790 x := v.Args[1] 5791 if !(z.Op != OpConst64 && x.Op != OpConst64) { 5792 break 5793 } 5794 v.reset(OpAnd64) 5795 v.AddArg(i) 5796 v0 := b.NewValue0(v.Pos, OpAnd64, t) 5797 v0.AddArg(z) 5798 v0.AddArg(x) 5799 v.AddArg(v0) 5800 return true 5801 } 5802 // match: (And64 x (And64 i:(Const64 <t>) z)) 5803 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 5804 // result: (And64 i (And64 <t> z x)) 5805 for { 5806 _ = v.Args[1] 5807 x := v.Args[0] 5808 v_1 := v.Args[1] 5809 if v_1.Op != OpAnd64 { 5810 break 5811 } 5812 _ = v_1.Args[1] 5813 i := v_1.Args[0] 5814 if i.Op != OpConst64 { 5815 break 5816 } 5817 t := i.Type 5818 z := v_1.Args[1] 5819 if !(z.Op != OpConst64 && x.Op != OpConst64) { 5820 break 5821 } 5822 v.reset(OpAnd64) 5823 v.AddArg(i) 5824 v0 := b.NewValue0(v.Pos, OpAnd64, t) 5825 v0.AddArg(z) 5826 v0.AddArg(x) 5827 v.AddArg(v0) 5828 return true 5829 } 5830 // match: (And64 x (And64 z i:(Const64 <t>))) 5831 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 5832 // result: (And64 i (And64 <t> z x)) 5833 for { 5834 _ = v.Args[1] 5835 x := v.Args[0] 5836 v_1 := v.Args[1] 5837 if v_1.Op != OpAnd64 { 5838 break 5839 } 5840 _ = v_1.Args[1] 5841 z := v_1.Args[0] 5842 i := v_1.Args[1] 5843 if i.Op != OpConst64 { 5844 break 5845 } 5846 t := i.Type 5847 if !(z.Op != OpConst64 && x.Op != OpConst64) { 5848 break 5849 } 5850 v.reset(OpAnd64) 5851 v.AddArg(i) 5852 v0 := b.NewValue0(v.Pos, OpAnd64, t) 5853 v0.AddArg(z) 5854 v0.AddArg(x) 5855 v.AddArg(v0) 5856 return true 5857 } 5858 // match: (And64 (Const64 <t> [c]) (And64 (Const64 <t> [d]) x)) 5859 // cond: 5860 // result: (And64 (Const64 <t> [c&d]) x) 5861 for { 5862 _ = v.Args[1] 5863 v_0 := v.Args[0] 5864 if v_0.Op != OpConst64 { 5865 break 5866 } 5867 t := v_0.Type 5868 c := v_0.AuxInt 5869 v_1 := v.Args[1] 5870 if v_1.Op != OpAnd64 { 5871 break 5872 } 5873 _ = v_1.Args[1] 5874 v_1_0 := v_1.Args[0] 5875 if v_1_0.Op != OpConst64 { 5876 break 5877 } 5878 if v_1_0.Type != t { 5879 break 5880 } 5881 d := v_1_0.AuxInt 5882 x := v_1.Args[1] 5883 v.reset(OpAnd64) 5884 v0 := b.NewValue0(v.Pos, OpConst64, t) 5885 v0.AuxInt = c & d 5886 v.AddArg(v0) 5887 v.AddArg(x) 5888 return true 5889 } 5890 return false 5891 } 5892 func rewriteValuegeneric_OpAnd64_20(v *Value) bool { 5893 b := v.Block 5894 _ = b 5895 // match: (And64 (Const64 <t> [c]) (And64 x (Const64 <t> [d]))) 5896 // cond: 5897 // result: (And64 (Const64 <t> [c&d]) x) 5898 for { 5899 _ = v.Args[1] 5900 v_0 := v.Args[0] 5901 if v_0.Op != OpConst64 { 5902 break 5903 } 5904 t := v_0.Type 5905 c := v_0.AuxInt 5906 v_1 := v.Args[1] 5907 if v_1.Op != OpAnd64 { 5908 break 5909 } 5910 _ = v_1.Args[1] 5911 x := v_1.Args[0] 5912 v_1_1 := v_1.Args[1] 5913 if v_1_1.Op != OpConst64 { 5914 break 5915 } 5916 if v_1_1.Type != t { 5917 break 5918 } 5919 d := v_1_1.AuxInt 5920 v.reset(OpAnd64) 5921 v0 := b.NewValue0(v.Pos, OpConst64, t) 5922 v0.AuxInt = c & d 5923 v.AddArg(v0) 5924 v.AddArg(x) 5925 return true 5926 } 5927 // match: (And64 (And64 (Const64 <t> [d]) x) (Const64 <t> [c])) 5928 // cond: 5929 // result: (And64 (Const64 <t> [c&d]) x) 5930 for { 5931 _ = v.Args[1] 5932 v_0 := v.Args[0] 5933 if v_0.Op != OpAnd64 { 5934 break 5935 } 5936 _ = v_0.Args[1] 5937 v_0_0 := v_0.Args[0] 5938 if v_0_0.Op != OpConst64 { 5939 break 5940 } 5941 t := v_0_0.Type 5942 d := v_0_0.AuxInt 5943 x := v_0.Args[1] 5944 v_1 := v.Args[1] 5945 if v_1.Op != OpConst64 { 5946 break 5947 } 5948 if v_1.Type != t { 5949 break 5950 } 5951 c := v_1.AuxInt 5952 v.reset(OpAnd64) 5953 v0 := b.NewValue0(v.Pos, OpConst64, t) 5954 v0.AuxInt = c & d 5955 v.AddArg(v0) 5956 v.AddArg(x) 5957 return true 5958 } 5959 // match: (And64 (And64 x (Const64 <t> [d])) (Const64 <t> [c])) 5960 // cond: 5961 // result: (And64 (Const64 <t> [c&d]) x) 5962 for { 5963 _ = v.Args[1] 5964 v_0 := v.Args[0] 5965 if v_0.Op != OpAnd64 { 5966 break 5967 } 5968 _ = v_0.Args[1] 5969 x := v_0.Args[0] 5970 v_0_1 := v_0.Args[1] 5971 if v_0_1.Op != OpConst64 { 5972 break 5973 } 5974 t := v_0_1.Type 5975 d := v_0_1.AuxInt 5976 v_1 := v.Args[1] 5977 if v_1.Op != OpConst64 { 5978 break 5979 } 5980 if v_1.Type != t { 5981 break 5982 } 5983 c := v_1.AuxInt 5984 v.reset(OpAnd64) 5985 v0 := b.NewValue0(v.Pos, OpConst64, t) 5986 v0.AuxInt = c & d 5987 v.AddArg(v0) 5988 v.AddArg(x) 5989 return true 5990 } 5991 return false 5992 } 5993 func rewriteValuegeneric_OpAnd8_0(v *Value) bool { 5994 // match: (And8 (Const8 [c]) (Const8 [d])) 5995 // cond: 5996 // result: (Const8 [int64(int8(c&d))]) 5997 for { 5998 _ = v.Args[1] 5999 v_0 := v.Args[0] 6000 if v_0.Op != OpConst8 { 6001 break 6002 } 6003 c := v_0.AuxInt 6004 v_1 := v.Args[1] 6005 if v_1.Op != OpConst8 { 6006 break 6007 } 6008 d := v_1.AuxInt 6009 v.reset(OpConst8) 6010 v.AuxInt = int64(int8(c & d)) 6011 return true 6012 } 6013 // match: (And8 (Const8 [d]) (Const8 [c])) 6014 // cond: 6015 // result: (Const8 [int64(int8(c&d))]) 6016 for { 6017 _ = v.Args[1] 6018 v_0 := v.Args[0] 6019 if v_0.Op != OpConst8 { 6020 break 6021 } 6022 d := v_0.AuxInt 6023 v_1 := v.Args[1] 6024 if v_1.Op != OpConst8 { 6025 break 6026 } 6027 c := v_1.AuxInt 6028 v.reset(OpConst8) 6029 v.AuxInt = int64(int8(c & d)) 6030 return true 6031 } 6032 // match: (And8 x x) 6033 // cond: 6034 // result: x 6035 for { 6036 _ = v.Args[1] 6037 x := v.Args[0] 6038 if x != v.Args[1] { 6039 break 6040 } 6041 v.reset(OpCopy) 6042 v.Type = x.Type 6043 v.AddArg(x) 6044 return true 6045 } 6046 // match: (And8 (Const8 [-1]) x) 6047 // cond: 6048 // result: x 6049 for { 6050 _ = v.Args[1] 6051 v_0 := v.Args[0] 6052 if v_0.Op != OpConst8 { 6053 break 6054 } 6055 if v_0.AuxInt != -1 { 6056 break 6057 } 6058 x := v.Args[1] 6059 v.reset(OpCopy) 6060 v.Type = x.Type 6061 v.AddArg(x) 6062 return true 6063 } 6064 // match: (And8 x (Const8 [-1])) 6065 // cond: 6066 // result: x 6067 for { 6068 _ = v.Args[1] 6069 x := v.Args[0] 6070 v_1 := v.Args[1] 6071 if v_1.Op != OpConst8 { 6072 break 6073 } 6074 if v_1.AuxInt != -1 { 6075 break 6076 } 6077 v.reset(OpCopy) 6078 v.Type = x.Type 6079 v.AddArg(x) 6080 return true 6081 } 6082 // match: (And8 (Const8 [0]) _) 6083 // cond: 6084 // result: (Const8 [0]) 6085 for { 6086 _ = v.Args[1] 6087 v_0 := v.Args[0] 6088 if v_0.Op != OpConst8 { 6089 break 6090 } 6091 if v_0.AuxInt != 0 { 6092 break 6093 } 6094 v.reset(OpConst8) 6095 v.AuxInt = 0 6096 return true 6097 } 6098 // match: (And8 _ (Const8 [0])) 6099 // cond: 6100 // result: (Const8 [0]) 6101 for { 6102 _ = v.Args[1] 6103 v_1 := v.Args[1] 6104 if v_1.Op != OpConst8 { 6105 break 6106 } 6107 if v_1.AuxInt != 0 { 6108 break 6109 } 6110 v.reset(OpConst8) 6111 v.AuxInt = 0 6112 return true 6113 } 6114 // match: (And8 x (And8 x y)) 6115 // cond: 6116 // result: (And8 x y) 6117 for { 6118 _ = v.Args[1] 6119 x := v.Args[0] 6120 v_1 := v.Args[1] 6121 if v_1.Op != OpAnd8 { 6122 break 6123 } 6124 _ = v_1.Args[1] 6125 if x != v_1.Args[0] { 6126 break 6127 } 6128 y := v_1.Args[1] 6129 v.reset(OpAnd8) 6130 v.AddArg(x) 6131 v.AddArg(y) 6132 return true 6133 } 6134 // match: (And8 x (And8 y x)) 6135 // cond: 6136 // result: (And8 x y) 6137 for { 6138 _ = v.Args[1] 6139 x := v.Args[0] 6140 v_1 := v.Args[1] 6141 if v_1.Op != OpAnd8 { 6142 break 6143 } 6144 _ = v_1.Args[1] 6145 y := v_1.Args[0] 6146 if x != v_1.Args[1] { 6147 break 6148 } 6149 v.reset(OpAnd8) 6150 v.AddArg(x) 6151 v.AddArg(y) 6152 return true 6153 } 6154 // match: (And8 (And8 x y) x) 6155 // cond: 6156 // result: (And8 x y) 6157 for { 6158 _ = v.Args[1] 6159 v_0 := v.Args[0] 6160 if v_0.Op != OpAnd8 { 6161 break 6162 } 6163 _ = v_0.Args[1] 6164 x := v_0.Args[0] 6165 y := v_0.Args[1] 6166 if x != v.Args[1] { 6167 break 6168 } 6169 v.reset(OpAnd8) 6170 v.AddArg(x) 6171 v.AddArg(y) 6172 return true 6173 } 6174 return false 6175 } 6176 func rewriteValuegeneric_OpAnd8_10(v *Value) bool { 6177 b := v.Block 6178 _ = b 6179 // match: (And8 (And8 y x) x) 6180 // cond: 6181 // result: (And8 x y) 6182 for { 6183 _ = v.Args[1] 6184 v_0 := v.Args[0] 6185 if v_0.Op != OpAnd8 { 6186 break 6187 } 6188 _ = v_0.Args[1] 6189 y := v_0.Args[0] 6190 x := v_0.Args[1] 6191 if x != v.Args[1] { 6192 break 6193 } 6194 v.reset(OpAnd8) 6195 v.AddArg(x) 6196 v.AddArg(y) 6197 return true 6198 } 6199 // match: (And8 (And8 i:(Const8 <t>) z) x) 6200 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 6201 // result: (And8 i (And8 <t> z x)) 6202 for { 6203 _ = v.Args[1] 6204 v_0 := v.Args[0] 6205 if v_0.Op != OpAnd8 { 6206 break 6207 } 6208 _ = v_0.Args[1] 6209 i := v_0.Args[0] 6210 if i.Op != OpConst8 { 6211 break 6212 } 6213 t := i.Type 6214 z := v_0.Args[1] 6215 x := v.Args[1] 6216 if !(z.Op != OpConst8 && x.Op != OpConst8) { 6217 break 6218 } 6219 v.reset(OpAnd8) 6220 v.AddArg(i) 6221 v0 := b.NewValue0(v.Pos, OpAnd8, t) 6222 v0.AddArg(z) 6223 v0.AddArg(x) 6224 v.AddArg(v0) 6225 return true 6226 } 6227 // match: (And8 (And8 z i:(Const8 <t>)) x) 6228 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 6229 // result: (And8 i (And8 <t> z x)) 6230 for { 6231 _ = v.Args[1] 6232 v_0 := v.Args[0] 6233 if v_0.Op != OpAnd8 { 6234 break 6235 } 6236 _ = v_0.Args[1] 6237 z := v_0.Args[0] 6238 i := v_0.Args[1] 6239 if i.Op != OpConst8 { 6240 break 6241 } 6242 t := i.Type 6243 x := v.Args[1] 6244 if !(z.Op != OpConst8 && x.Op != OpConst8) { 6245 break 6246 } 6247 v.reset(OpAnd8) 6248 v.AddArg(i) 6249 v0 := b.NewValue0(v.Pos, OpAnd8, t) 6250 v0.AddArg(z) 6251 v0.AddArg(x) 6252 v.AddArg(v0) 6253 return true 6254 } 6255 // match: (And8 x (And8 i:(Const8 <t>) z)) 6256 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 6257 // result: (And8 i (And8 <t> z x)) 6258 for { 6259 _ = v.Args[1] 6260 x := v.Args[0] 6261 v_1 := v.Args[1] 6262 if v_1.Op != OpAnd8 { 6263 break 6264 } 6265 _ = v_1.Args[1] 6266 i := v_1.Args[0] 6267 if i.Op != OpConst8 { 6268 break 6269 } 6270 t := i.Type 6271 z := v_1.Args[1] 6272 if !(z.Op != OpConst8 && x.Op != OpConst8) { 6273 break 6274 } 6275 v.reset(OpAnd8) 6276 v.AddArg(i) 6277 v0 := b.NewValue0(v.Pos, OpAnd8, t) 6278 v0.AddArg(z) 6279 v0.AddArg(x) 6280 v.AddArg(v0) 6281 return true 6282 } 6283 // match: (And8 x (And8 z i:(Const8 <t>))) 6284 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 6285 // result: (And8 i (And8 <t> z x)) 6286 for { 6287 _ = v.Args[1] 6288 x := v.Args[0] 6289 v_1 := v.Args[1] 6290 if v_1.Op != OpAnd8 { 6291 break 6292 } 6293 _ = v_1.Args[1] 6294 z := v_1.Args[0] 6295 i := v_1.Args[1] 6296 if i.Op != OpConst8 { 6297 break 6298 } 6299 t := i.Type 6300 if !(z.Op != OpConst8 && x.Op != OpConst8) { 6301 break 6302 } 6303 v.reset(OpAnd8) 6304 v.AddArg(i) 6305 v0 := b.NewValue0(v.Pos, OpAnd8, t) 6306 v0.AddArg(z) 6307 v0.AddArg(x) 6308 v.AddArg(v0) 6309 return true 6310 } 6311 // match: (And8 (Const8 <t> [c]) (And8 (Const8 <t> [d]) x)) 6312 // cond: 6313 // result: (And8 (Const8 <t> [int64(int8(c&d))]) x) 6314 for { 6315 _ = v.Args[1] 6316 v_0 := v.Args[0] 6317 if v_0.Op != OpConst8 { 6318 break 6319 } 6320 t := v_0.Type 6321 c := v_0.AuxInt 6322 v_1 := v.Args[1] 6323 if v_1.Op != OpAnd8 { 6324 break 6325 } 6326 _ = v_1.Args[1] 6327 v_1_0 := v_1.Args[0] 6328 if v_1_0.Op != OpConst8 { 6329 break 6330 } 6331 if v_1_0.Type != t { 6332 break 6333 } 6334 d := v_1_0.AuxInt 6335 x := v_1.Args[1] 6336 v.reset(OpAnd8) 6337 v0 := b.NewValue0(v.Pos, OpConst8, t) 6338 v0.AuxInt = int64(int8(c & d)) 6339 v.AddArg(v0) 6340 v.AddArg(x) 6341 return true 6342 } 6343 // match: (And8 (Const8 <t> [c]) (And8 x (Const8 <t> [d]))) 6344 // cond: 6345 // result: (And8 (Const8 <t> [int64(int8(c&d))]) x) 6346 for { 6347 _ = v.Args[1] 6348 v_0 := v.Args[0] 6349 if v_0.Op != OpConst8 { 6350 break 6351 } 6352 t := v_0.Type 6353 c := v_0.AuxInt 6354 v_1 := v.Args[1] 6355 if v_1.Op != OpAnd8 { 6356 break 6357 } 6358 _ = v_1.Args[1] 6359 x := v_1.Args[0] 6360 v_1_1 := v_1.Args[1] 6361 if v_1_1.Op != OpConst8 { 6362 break 6363 } 6364 if v_1_1.Type != t { 6365 break 6366 } 6367 d := v_1_1.AuxInt 6368 v.reset(OpAnd8) 6369 v0 := b.NewValue0(v.Pos, OpConst8, t) 6370 v0.AuxInt = int64(int8(c & d)) 6371 v.AddArg(v0) 6372 v.AddArg(x) 6373 return true 6374 } 6375 // match: (And8 (And8 (Const8 <t> [d]) x) (Const8 <t> [c])) 6376 // cond: 6377 // result: (And8 (Const8 <t> [int64(int8(c&d))]) x) 6378 for { 6379 _ = v.Args[1] 6380 v_0 := v.Args[0] 6381 if v_0.Op != OpAnd8 { 6382 break 6383 } 6384 _ = v_0.Args[1] 6385 v_0_0 := v_0.Args[0] 6386 if v_0_0.Op != OpConst8 { 6387 break 6388 } 6389 t := v_0_0.Type 6390 d := v_0_0.AuxInt 6391 x := v_0.Args[1] 6392 v_1 := v.Args[1] 6393 if v_1.Op != OpConst8 { 6394 break 6395 } 6396 if v_1.Type != t { 6397 break 6398 } 6399 c := v_1.AuxInt 6400 v.reset(OpAnd8) 6401 v0 := b.NewValue0(v.Pos, OpConst8, t) 6402 v0.AuxInt = int64(int8(c & d)) 6403 v.AddArg(v0) 6404 v.AddArg(x) 6405 return true 6406 } 6407 // match: (And8 (And8 x (Const8 <t> [d])) (Const8 <t> [c])) 6408 // cond: 6409 // result: (And8 (Const8 <t> [int64(int8(c&d))]) x) 6410 for { 6411 _ = v.Args[1] 6412 v_0 := v.Args[0] 6413 if v_0.Op != OpAnd8 { 6414 break 6415 } 6416 _ = v_0.Args[1] 6417 x := v_0.Args[0] 6418 v_0_1 := v_0.Args[1] 6419 if v_0_1.Op != OpConst8 { 6420 break 6421 } 6422 t := v_0_1.Type 6423 d := v_0_1.AuxInt 6424 v_1 := v.Args[1] 6425 if v_1.Op != OpConst8 { 6426 break 6427 } 6428 if v_1.Type != t { 6429 break 6430 } 6431 c := v_1.AuxInt 6432 v.reset(OpAnd8) 6433 v0 := b.NewValue0(v.Pos, OpConst8, t) 6434 v0.AuxInt = int64(int8(c & d)) 6435 v.AddArg(v0) 6436 v.AddArg(x) 6437 return true 6438 } 6439 return false 6440 } 6441 func rewriteValuegeneric_OpArg_0(v *Value) bool { 6442 b := v.Block 6443 _ = b 6444 config := b.Func.Config 6445 _ = config 6446 fe := b.Func.fe 6447 _ = fe 6448 typ := &b.Func.Config.Types 6449 _ = typ 6450 // match: (Arg {n} [off]) 6451 // cond: v.Type.IsString() 6452 // result: (StringMake (Arg <typ.BytePtr> {n} [off]) (Arg <typ.Int> {n} [off+config.PtrSize])) 6453 for { 6454 off := v.AuxInt 6455 n := v.Aux 6456 if !(v.Type.IsString()) { 6457 break 6458 } 6459 v.reset(OpStringMake) 6460 v0 := b.NewValue0(v.Pos, OpArg, typ.BytePtr) 6461 v0.AuxInt = off 6462 v0.Aux = n 6463 v.AddArg(v0) 6464 v1 := b.NewValue0(v.Pos, OpArg, typ.Int) 6465 v1.AuxInt = off + config.PtrSize 6466 v1.Aux = n 6467 v.AddArg(v1) 6468 return true 6469 } 6470 // match: (Arg {n} [off]) 6471 // cond: v.Type.IsSlice() 6472 // result: (SliceMake (Arg <v.Type.ElemType().PtrTo()> {n} [off]) (Arg <typ.Int> {n} [off+config.PtrSize]) (Arg <typ.Int> {n} [off+2*config.PtrSize])) 6473 for { 6474 off := v.AuxInt 6475 n := v.Aux 6476 if !(v.Type.IsSlice()) { 6477 break 6478 } 6479 v.reset(OpSliceMake) 6480 v0 := b.NewValue0(v.Pos, OpArg, v.Type.ElemType().PtrTo()) 6481 v0.AuxInt = off 6482 v0.Aux = n 6483 v.AddArg(v0) 6484 v1 := b.NewValue0(v.Pos, OpArg, typ.Int) 6485 v1.AuxInt = off + config.PtrSize 6486 v1.Aux = n 6487 v.AddArg(v1) 6488 v2 := b.NewValue0(v.Pos, OpArg, typ.Int) 6489 v2.AuxInt = off + 2*config.PtrSize 6490 v2.Aux = n 6491 v.AddArg(v2) 6492 return true 6493 } 6494 // match: (Arg {n} [off]) 6495 // cond: v.Type.IsInterface() 6496 // result: (IMake (Arg <typ.BytePtr> {n} [off]) (Arg <typ.BytePtr> {n} [off+config.PtrSize])) 6497 for { 6498 off := v.AuxInt 6499 n := v.Aux 6500 if !(v.Type.IsInterface()) { 6501 break 6502 } 6503 v.reset(OpIMake) 6504 v0 := b.NewValue0(v.Pos, OpArg, typ.BytePtr) 6505 v0.AuxInt = off 6506 v0.Aux = n 6507 v.AddArg(v0) 6508 v1 := b.NewValue0(v.Pos, OpArg, typ.BytePtr) 6509 v1.AuxInt = off + config.PtrSize 6510 v1.Aux = n 6511 v.AddArg(v1) 6512 return true 6513 } 6514 // match: (Arg {n} [off]) 6515 // cond: v.Type.IsComplex() && v.Type.Size() == 16 6516 // result: (ComplexMake (Arg <typ.Float64> {n} [off]) (Arg <typ.Float64> {n} [off+8])) 6517 for { 6518 off := v.AuxInt 6519 n := v.Aux 6520 if !(v.Type.IsComplex() && v.Type.Size() == 16) { 6521 break 6522 } 6523 v.reset(OpComplexMake) 6524 v0 := b.NewValue0(v.Pos, OpArg, typ.Float64) 6525 v0.AuxInt = off 6526 v0.Aux = n 6527 v.AddArg(v0) 6528 v1 := b.NewValue0(v.Pos, OpArg, typ.Float64) 6529 v1.AuxInt = off + 8 6530 v1.Aux = n 6531 v.AddArg(v1) 6532 return true 6533 } 6534 // match: (Arg {n} [off]) 6535 // cond: v.Type.IsComplex() && v.Type.Size() == 8 6536 // result: (ComplexMake (Arg <typ.Float32> {n} [off]) (Arg <typ.Float32> {n} [off+4])) 6537 for { 6538 off := v.AuxInt 6539 n := v.Aux 6540 if !(v.Type.IsComplex() && v.Type.Size() == 8) { 6541 break 6542 } 6543 v.reset(OpComplexMake) 6544 v0 := b.NewValue0(v.Pos, OpArg, typ.Float32) 6545 v0.AuxInt = off 6546 v0.Aux = n 6547 v.AddArg(v0) 6548 v1 := b.NewValue0(v.Pos, OpArg, typ.Float32) 6549 v1.AuxInt = off + 4 6550 v1.Aux = n 6551 v.AddArg(v1) 6552 return true 6553 } 6554 // match: (Arg <t>) 6555 // cond: t.IsStruct() && t.NumFields() == 0 && fe.CanSSA(t) 6556 // result: (StructMake0) 6557 for { 6558 t := v.Type 6559 if !(t.IsStruct() && t.NumFields() == 0 && fe.CanSSA(t)) { 6560 break 6561 } 6562 v.reset(OpStructMake0) 6563 return true 6564 } 6565 // match: (Arg <t> {n} [off]) 6566 // cond: t.IsStruct() && t.NumFields() == 1 && fe.CanSSA(t) 6567 // result: (StructMake1 (Arg <t.FieldType(0)> {n} [off+t.FieldOff(0)])) 6568 for { 6569 t := v.Type 6570 off := v.AuxInt 6571 n := v.Aux 6572 if !(t.IsStruct() && t.NumFields() == 1 && fe.CanSSA(t)) { 6573 break 6574 } 6575 v.reset(OpStructMake1) 6576 v0 := b.NewValue0(v.Pos, OpArg, t.FieldType(0)) 6577 v0.AuxInt = off + t.FieldOff(0) 6578 v0.Aux = n 6579 v.AddArg(v0) 6580 return true 6581 } 6582 // match: (Arg <t> {n} [off]) 6583 // cond: t.IsStruct() && t.NumFields() == 2 && fe.CanSSA(t) 6584 // result: (StructMake2 (Arg <t.FieldType(0)> {n} [off+t.FieldOff(0)]) (Arg <t.FieldType(1)> {n} [off+t.FieldOff(1)])) 6585 for { 6586 t := v.Type 6587 off := v.AuxInt 6588 n := v.Aux 6589 if !(t.IsStruct() && t.NumFields() == 2 && fe.CanSSA(t)) { 6590 break 6591 } 6592 v.reset(OpStructMake2) 6593 v0 := b.NewValue0(v.Pos, OpArg, t.FieldType(0)) 6594 v0.AuxInt = off + t.FieldOff(0) 6595 v0.Aux = n 6596 v.AddArg(v0) 6597 v1 := b.NewValue0(v.Pos, OpArg, t.FieldType(1)) 6598 v1.AuxInt = off + t.FieldOff(1) 6599 v1.Aux = n 6600 v.AddArg(v1) 6601 return true 6602 } 6603 // match: (Arg <t> {n} [off]) 6604 // cond: t.IsStruct() && t.NumFields() == 3 && fe.CanSSA(t) 6605 // result: (StructMake3 (Arg <t.FieldType(0)> {n} [off+t.FieldOff(0)]) (Arg <t.FieldType(1)> {n} [off+t.FieldOff(1)]) (Arg <t.FieldType(2)> {n} [off+t.FieldOff(2)])) 6606 for { 6607 t := v.Type 6608 off := v.AuxInt 6609 n := v.Aux 6610 if !(t.IsStruct() && t.NumFields() == 3 && fe.CanSSA(t)) { 6611 break 6612 } 6613 v.reset(OpStructMake3) 6614 v0 := b.NewValue0(v.Pos, OpArg, t.FieldType(0)) 6615 v0.AuxInt = off + t.FieldOff(0) 6616 v0.Aux = n 6617 v.AddArg(v0) 6618 v1 := b.NewValue0(v.Pos, OpArg, t.FieldType(1)) 6619 v1.AuxInt = off + t.FieldOff(1) 6620 v1.Aux = n 6621 v.AddArg(v1) 6622 v2 := b.NewValue0(v.Pos, OpArg, t.FieldType(2)) 6623 v2.AuxInt = off + t.FieldOff(2) 6624 v2.Aux = n 6625 v.AddArg(v2) 6626 return true 6627 } 6628 // match: (Arg <t> {n} [off]) 6629 // cond: t.IsStruct() && t.NumFields() == 4 && fe.CanSSA(t) 6630 // result: (StructMake4 (Arg <t.FieldType(0)> {n} [off+t.FieldOff(0)]) (Arg <t.FieldType(1)> {n} [off+t.FieldOff(1)]) (Arg <t.FieldType(2)> {n} [off+t.FieldOff(2)]) (Arg <t.FieldType(3)> {n} [off+t.FieldOff(3)])) 6631 for { 6632 t := v.Type 6633 off := v.AuxInt 6634 n := v.Aux 6635 if !(t.IsStruct() && t.NumFields() == 4 && fe.CanSSA(t)) { 6636 break 6637 } 6638 v.reset(OpStructMake4) 6639 v0 := b.NewValue0(v.Pos, OpArg, t.FieldType(0)) 6640 v0.AuxInt = off + t.FieldOff(0) 6641 v0.Aux = n 6642 v.AddArg(v0) 6643 v1 := b.NewValue0(v.Pos, OpArg, t.FieldType(1)) 6644 v1.AuxInt = off + t.FieldOff(1) 6645 v1.Aux = n 6646 v.AddArg(v1) 6647 v2 := b.NewValue0(v.Pos, OpArg, t.FieldType(2)) 6648 v2.AuxInt = off + t.FieldOff(2) 6649 v2.Aux = n 6650 v.AddArg(v2) 6651 v3 := b.NewValue0(v.Pos, OpArg, t.FieldType(3)) 6652 v3.AuxInt = off + t.FieldOff(3) 6653 v3.Aux = n 6654 v.AddArg(v3) 6655 return true 6656 } 6657 return false 6658 } 6659 func rewriteValuegeneric_OpArg_10(v *Value) bool { 6660 b := v.Block 6661 _ = b 6662 fe := b.Func.fe 6663 _ = fe 6664 // match: (Arg <t>) 6665 // cond: t.IsArray() && t.NumElem() == 0 6666 // result: (ArrayMake0) 6667 for { 6668 t := v.Type 6669 if !(t.IsArray() && t.NumElem() == 0) { 6670 break 6671 } 6672 v.reset(OpArrayMake0) 6673 return true 6674 } 6675 // match: (Arg <t> {n} [off]) 6676 // cond: t.IsArray() && t.NumElem() == 1 && fe.CanSSA(t) 6677 // result: (ArrayMake1 (Arg <t.ElemType()> {n} [off])) 6678 for { 6679 t := v.Type 6680 off := v.AuxInt 6681 n := v.Aux 6682 if !(t.IsArray() && t.NumElem() == 1 && fe.CanSSA(t)) { 6683 break 6684 } 6685 v.reset(OpArrayMake1) 6686 v0 := b.NewValue0(v.Pos, OpArg, t.ElemType()) 6687 v0.AuxInt = off 6688 v0.Aux = n 6689 v.AddArg(v0) 6690 return true 6691 } 6692 return false 6693 } 6694 func rewriteValuegeneric_OpArraySelect_0(v *Value) bool { 6695 // match: (ArraySelect (ArrayMake1 x)) 6696 // cond: 6697 // result: x 6698 for { 6699 v_0 := v.Args[0] 6700 if v_0.Op != OpArrayMake1 { 6701 break 6702 } 6703 x := v_0.Args[0] 6704 v.reset(OpCopy) 6705 v.Type = x.Type 6706 v.AddArg(x) 6707 return true 6708 } 6709 // match: (ArraySelect [0] x:(IData _)) 6710 // cond: 6711 // result: x 6712 for { 6713 if v.AuxInt != 0 { 6714 break 6715 } 6716 x := v.Args[0] 6717 if x.Op != OpIData { 6718 break 6719 } 6720 v.reset(OpCopy) 6721 v.Type = x.Type 6722 v.AddArg(x) 6723 return true 6724 } 6725 return false 6726 } 6727 func rewriteValuegeneric_OpCom16_0(v *Value) bool { 6728 // match: (Com16 (Com16 x)) 6729 // cond: 6730 // result: x 6731 for { 6732 v_0 := v.Args[0] 6733 if v_0.Op != OpCom16 { 6734 break 6735 } 6736 x := v_0.Args[0] 6737 v.reset(OpCopy) 6738 v.Type = x.Type 6739 v.AddArg(x) 6740 return true 6741 } 6742 // match: (Com16 (Const16 [c])) 6743 // cond: 6744 // result: (Const16 [^c]) 6745 for { 6746 v_0 := v.Args[0] 6747 if v_0.Op != OpConst16 { 6748 break 6749 } 6750 c := v_0.AuxInt 6751 v.reset(OpConst16) 6752 v.AuxInt = ^c 6753 return true 6754 } 6755 return false 6756 } 6757 func rewriteValuegeneric_OpCom32_0(v *Value) bool { 6758 // match: (Com32 (Com32 x)) 6759 // cond: 6760 // result: x 6761 for { 6762 v_0 := v.Args[0] 6763 if v_0.Op != OpCom32 { 6764 break 6765 } 6766 x := v_0.Args[0] 6767 v.reset(OpCopy) 6768 v.Type = x.Type 6769 v.AddArg(x) 6770 return true 6771 } 6772 // match: (Com32 (Const32 [c])) 6773 // cond: 6774 // result: (Const32 [^c]) 6775 for { 6776 v_0 := v.Args[0] 6777 if v_0.Op != OpConst32 { 6778 break 6779 } 6780 c := v_0.AuxInt 6781 v.reset(OpConst32) 6782 v.AuxInt = ^c 6783 return true 6784 } 6785 return false 6786 } 6787 func rewriteValuegeneric_OpCom64_0(v *Value) bool { 6788 // match: (Com64 (Com64 x)) 6789 // cond: 6790 // result: x 6791 for { 6792 v_0 := v.Args[0] 6793 if v_0.Op != OpCom64 { 6794 break 6795 } 6796 x := v_0.Args[0] 6797 v.reset(OpCopy) 6798 v.Type = x.Type 6799 v.AddArg(x) 6800 return true 6801 } 6802 // match: (Com64 (Const64 [c])) 6803 // cond: 6804 // result: (Const64 [^c]) 6805 for { 6806 v_0 := v.Args[0] 6807 if v_0.Op != OpConst64 { 6808 break 6809 } 6810 c := v_0.AuxInt 6811 v.reset(OpConst64) 6812 v.AuxInt = ^c 6813 return true 6814 } 6815 return false 6816 } 6817 func rewriteValuegeneric_OpCom8_0(v *Value) bool { 6818 // match: (Com8 (Com8 x)) 6819 // cond: 6820 // result: x 6821 for { 6822 v_0 := v.Args[0] 6823 if v_0.Op != OpCom8 { 6824 break 6825 } 6826 x := v_0.Args[0] 6827 v.reset(OpCopy) 6828 v.Type = x.Type 6829 v.AddArg(x) 6830 return true 6831 } 6832 // match: (Com8 (Const8 [c])) 6833 // cond: 6834 // result: (Const8 [^c]) 6835 for { 6836 v_0 := v.Args[0] 6837 if v_0.Op != OpConst8 { 6838 break 6839 } 6840 c := v_0.AuxInt 6841 v.reset(OpConst8) 6842 v.AuxInt = ^c 6843 return true 6844 } 6845 return false 6846 } 6847 func rewriteValuegeneric_OpConstInterface_0(v *Value) bool { 6848 b := v.Block 6849 _ = b 6850 typ := &b.Func.Config.Types 6851 _ = typ 6852 // match: (ConstInterface) 6853 // cond: 6854 // result: (IMake (ConstNil <typ.BytePtr>) (ConstNil <typ.BytePtr>)) 6855 for { 6856 v.reset(OpIMake) 6857 v0 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr) 6858 v.AddArg(v0) 6859 v1 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr) 6860 v.AddArg(v1) 6861 return true 6862 } 6863 } 6864 func rewriteValuegeneric_OpConstSlice_0(v *Value) bool { 6865 b := v.Block 6866 _ = b 6867 config := b.Func.Config 6868 _ = config 6869 typ := &b.Func.Config.Types 6870 _ = typ 6871 // match: (ConstSlice) 6872 // cond: config.PtrSize == 4 6873 // result: (SliceMake (ConstNil <v.Type.ElemType().PtrTo()>) (Const32 <typ.Int> [0]) (Const32 <typ.Int> [0])) 6874 for { 6875 if !(config.PtrSize == 4) { 6876 break 6877 } 6878 v.reset(OpSliceMake) 6879 v0 := b.NewValue0(v.Pos, OpConstNil, v.Type.ElemType().PtrTo()) 6880 v.AddArg(v0) 6881 v1 := b.NewValue0(v.Pos, OpConst32, typ.Int) 6882 v1.AuxInt = 0 6883 v.AddArg(v1) 6884 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int) 6885 v2.AuxInt = 0 6886 v.AddArg(v2) 6887 return true 6888 } 6889 // match: (ConstSlice) 6890 // cond: config.PtrSize == 8 6891 // result: (SliceMake (ConstNil <v.Type.ElemType().PtrTo()>) (Const64 <typ.Int> [0]) (Const64 <typ.Int> [0])) 6892 for { 6893 if !(config.PtrSize == 8) { 6894 break 6895 } 6896 v.reset(OpSliceMake) 6897 v0 := b.NewValue0(v.Pos, OpConstNil, v.Type.ElemType().PtrTo()) 6898 v.AddArg(v0) 6899 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int) 6900 v1.AuxInt = 0 6901 v.AddArg(v1) 6902 v2 := b.NewValue0(v.Pos, OpConst64, typ.Int) 6903 v2.AuxInt = 0 6904 v.AddArg(v2) 6905 return true 6906 } 6907 return false 6908 } 6909 func rewriteValuegeneric_OpConstString_0(v *Value) bool { 6910 b := v.Block 6911 _ = b 6912 config := b.Func.Config 6913 _ = config 6914 fe := b.Func.fe 6915 _ = fe 6916 typ := &b.Func.Config.Types 6917 _ = typ 6918 // match: (ConstString {s}) 6919 // cond: config.PtrSize == 4 && s.(string) == "" 6920 // result: (StringMake (ConstNil) (Const32 <typ.Int> [0])) 6921 for { 6922 s := v.Aux 6923 if !(config.PtrSize == 4 && s.(string) == "") { 6924 break 6925 } 6926 v.reset(OpStringMake) 6927 v0 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr) 6928 v.AddArg(v0) 6929 v1 := b.NewValue0(v.Pos, OpConst32, typ.Int) 6930 v1.AuxInt = 0 6931 v.AddArg(v1) 6932 return true 6933 } 6934 // match: (ConstString {s}) 6935 // cond: config.PtrSize == 8 && s.(string) == "" 6936 // result: (StringMake (ConstNil) (Const64 <typ.Int> [0])) 6937 for { 6938 s := v.Aux 6939 if !(config.PtrSize == 8 && s.(string) == "") { 6940 break 6941 } 6942 v.reset(OpStringMake) 6943 v0 := b.NewValue0(v.Pos, OpConstNil, typ.BytePtr) 6944 v.AddArg(v0) 6945 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int) 6946 v1.AuxInt = 0 6947 v.AddArg(v1) 6948 return true 6949 } 6950 // match: (ConstString {s}) 6951 // cond: config.PtrSize == 4 && s.(string) != "" 6952 // result: (StringMake (Addr <typ.BytePtr> {fe.StringData(s.(string))} (SB)) (Const32 <typ.Int> [int64(len(s.(string)))])) 6953 for { 6954 s := v.Aux 6955 if !(config.PtrSize == 4 && s.(string) != "") { 6956 break 6957 } 6958 v.reset(OpStringMake) 6959 v0 := b.NewValue0(v.Pos, OpAddr, typ.BytePtr) 6960 v0.Aux = fe.StringData(s.(string)) 6961 v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr) 6962 v0.AddArg(v1) 6963 v.AddArg(v0) 6964 v2 := b.NewValue0(v.Pos, OpConst32, typ.Int) 6965 v2.AuxInt = int64(len(s.(string))) 6966 v.AddArg(v2) 6967 return true 6968 } 6969 // match: (ConstString {s}) 6970 // cond: config.PtrSize == 8 && s.(string) != "" 6971 // result: (StringMake (Addr <typ.BytePtr> {fe.StringData(s.(string))} (SB)) (Const64 <typ.Int> [int64(len(s.(string)))])) 6972 for { 6973 s := v.Aux 6974 if !(config.PtrSize == 8 && s.(string) != "") { 6975 break 6976 } 6977 v.reset(OpStringMake) 6978 v0 := b.NewValue0(v.Pos, OpAddr, typ.BytePtr) 6979 v0.Aux = fe.StringData(s.(string)) 6980 v1 := b.NewValue0(v.Pos, OpSB, typ.Uintptr) 6981 v0.AddArg(v1) 6982 v.AddArg(v0) 6983 v2 := b.NewValue0(v.Pos, OpConst64, typ.Int) 6984 v2.AuxInt = int64(len(s.(string))) 6985 v.AddArg(v2) 6986 return true 6987 } 6988 return false 6989 } 6990 func rewriteValuegeneric_OpConvert_0(v *Value) bool { 6991 // match: (Convert (Add64 (Convert ptr mem) off) mem) 6992 // cond: 6993 // result: (Add64 ptr off) 6994 for { 6995 _ = v.Args[1] 6996 v_0 := v.Args[0] 6997 if v_0.Op != OpAdd64 { 6998 break 6999 } 7000 _ = v_0.Args[1] 7001 v_0_0 := v_0.Args[0] 7002 if v_0_0.Op != OpConvert { 7003 break 7004 } 7005 _ = v_0_0.Args[1] 7006 ptr := v_0_0.Args[0] 7007 mem := v_0_0.Args[1] 7008 off := v_0.Args[1] 7009 if mem != v.Args[1] { 7010 break 7011 } 7012 v.reset(OpAdd64) 7013 v.AddArg(ptr) 7014 v.AddArg(off) 7015 return true 7016 } 7017 // match: (Convert (Add64 off (Convert ptr mem)) mem) 7018 // cond: 7019 // result: (Add64 ptr off) 7020 for { 7021 _ = v.Args[1] 7022 v_0 := v.Args[0] 7023 if v_0.Op != OpAdd64 { 7024 break 7025 } 7026 _ = v_0.Args[1] 7027 off := v_0.Args[0] 7028 v_0_1 := v_0.Args[1] 7029 if v_0_1.Op != OpConvert { 7030 break 7031 } 7032 _ = v_0_1.Args[1] 7033 ptr := v_0_1.Args[0] 7034 mem := v_0_1.Args[1] 7035 if mem != v.Args[1] { 7036 break 7037 } 7038 v.reset(OpAdd64) 7039 v.AddArg(ptr) 7040 v.AddArg(off) 7041 return true 7042 } 7043 // match: (Convert (Convert ptr mem) mem) 7044 // cond: 7045 // result: ptr 7046 for { 7047 _ = v.Args[1] 7048 v_0 := v.Args[0] 7049 if v_0.Op != OpConvert { 7050 break 7051 } 7052 _ = v_0.Args[1] 7053 ptr := v_0.Args[0] 7054 mem := v_0.Args[1] 7055 if mem != v.Args[1] { 7056 break 7057 } 7058 v.reset(OpCopy) 7059 v.Type = ptr.Type 7060 v.AddArg(ptr) 7061 return true 7062 } 7063 return false 7064 } 7065 func rewriteValuegeneric_OpCvt32Fto32_0(v *Value) bool { 7066 // match: (Cvt32Fto32 (Const32F [c])) 7067 // cond: 7068 // result: (Const32 [int64(int32(i2f(c)))]) 7069 for { 7070 v_0 := v.Args[0] 7071 if v_0.Op != OpConst32F { 7072 break 7073 } 7074 c := v_0.AuxInt 7075 v.reset(OpConst32) 7076 v.AuxInt = int64(int32(i2f(c))) 7077 return true 7078 } 7079 return false 7080 } 7081 func rewriteValuegeneric_OpCvt32Fto64_0(v *Value) bool { 7082 // match: (Cvt32Fto64 (Const32F [c])) 7083 // cond: 7084 // result: (Const64 [int64(i2f(c))]) 7085 for { 7086 v_0 := v.Args[0] 7087 if v_0.Op != OpConst32F { 7088 break 7089 } 7090 c := v_0.AuxInt 7091 v.reset(OpConst64) 7092 v.AuxInt = int64(i2f(c)) 7093 return true 7094 } 7095 return false 7096 } 7097 func rewriteValuegeneric_OpCvt32Fto64F_0(v *Value) bool { 7098 // match: (Cvt32Fto64F (Const32F [c])) 7099 // cond: 7100 // result: (Const64F [c]) 7101 for { 7102 v_0 := v.Args[0] 7103 if v_0.Op != OpConst32F { 7104 break 7105 } 7106 c := v_0.AuxInt 7107 v.reset(OpConst64F) 7108 v.AuxInt = c 7109 return true 7110 } 7111 return false 7112 } 7113 func rewriteValuegeneric_OpCvt32to32F_0(v *Value) bool { 7114 // match: (Cvt32to32F (Const32 [c])) 7115 // cond: 7116 // result: (Const32F [f2i(float64(float32(int32(c))))]) 7117 for { 7118 v_0 := v.Args[0] 7119 if v_0.Op != OpConst32 { 7120 break 7121 } 7122 c := v_0.AuxInt 7123 v.reset(OpConst32F) 7124 v.AuxInt = f2i(float64(float32(int32(c)))) 7125 return true 7126 } 7127 return false 7128 } 7129 func rewriteValuegeneric_OpCvt32to64F_0(v *Value) bool { 7130 // match: (Cvt32to64F (Const32 [c])) 7131 // cond: 7132 // result: (Const64F [f2i(float64(int32(c)))]) 7133 for { 7134 v_0 := v.Args[0] 7135 if v_0.Op != OpConst32 { 7136 break 7137 } 7138 c := v_0.AuxInt 7139 v.reset(OpConst64F) 7140 v.AuxInt = f2i(float64(int32(c))) 7141 return true 7142 } 7143 return false 7144 } 7145 func rewriteValuegeneric_OpCvt64Fto32_0(v *Value) bool { 7146 // match: (Cvt64Fto32 (Const64F [c])) 7147 // cond: 7148 // result: (Const32 [int64(int32(i2f(c)))]) 7149 for { 7150 v_0 := v.Args[0] 7151 if v_0.Op != OpConst64F { 7152 break 7153 } 7154 c := v_0.AuxInt 7155 v.reset(OpConst32) 7156 v.AuxInt = int64(int32(i2f(c))) 7157 return true 7158 } 7159 return false 7160 } 7161 func rewriteValuegeneric_OpCvt64Fto32F_0(v *Value) bool { 7162 // match: (Cvt64Fto32F (Const64F [c])) 7163 // cond: 7164 // result: (Const32F [f2i(float64(i2f32(c)))]) 7165 for { 7166 v_0 := v.Args[0] 7167 if v_0.Op != OpConst64F { 7168 break 7169 } 7170 c := v_0.AuxInt 7171 v.reset(OpConst32F) 7172 v.AuxInt = f2i(float64(i2f32(c))) 7173 return true 7174 } 7175 return false 7176 } 7177 func rewriteValuegeneric_OpCvt64Fto64_0(v *Value) bool { 7178 // match: (Cvt64Fto64 (Const64F [c])) 7179 // cond: 7180 // result: (Const64 [int64(i2f(c))]) 7181 for { 7182 v_0 := v.Args[0] 7183 if v_0.Op != OpConst64F { 7184 break 7185 } 7186 c := v_0.AuxInt 7187 v.reset(OpConst64) 7188 v.AuxInt = int64(i2f(c)) 7189 return true 7190 } 7191 return false 7192 } 7193 func rewriteValuegeneric_OpCvt64to32F_0(v *Value) bool { 7194 // match: (Cvt64to32F (Const64 [c])) 7195 // cond: 7196 // result: (Const32F [f2i(float64(float32(c)))]) 7197 for { 7198 v_0 := v.Args[0] 7199 if v_0.Op != OpConst64 { 7200 break 7201 } 7202 c := v_0.AuxInt 7203 v.reset(OpConst32F) 7204 v.AuxInt = f2i(float64(float32(c))) 7205 return true 7206 } 7207 return false 7208 } 7209 func rewriteValuegeneric_OpCvt64to64F_0(v *Value) bool { 7210 // match: (Cvt64to64F (Const64 [c])) 7211 // cond: 7212 // result: (Const64F [f2i(float64(c))]) 7213 for { 7214 v_0 := v.Args[0] 7215 if v_0.Op != OpConst64 { 7216 break 7217 } 7218 c := v_0.AuxInt 7219 v.reset(OpConst64F) 7220 v.AuxInt = f2i(float64(c)) 7221 return true 7222 } 7223 return false 7224 } 7225 func rewriteValuegeneric_OpDiv16_0(v *Value) bool { 7226 b := v.Block 7227 _ = b 7228 typ := &b.Func.Config.Types 7229 _ = typ 7230 // match: (Div16 (Const16 [c]) (Const16 [d])) 7231 // cond: d != 0 7232 // result: (Const16 [int64(int16(c)/int16(d))]) 7233 for { 7234 _ = v.Args[1] 7235 v_0 := v.Args[0] 7236 if v_0.Op != OpConst16 { 7237 break 7238 } 7239 c := v_0.AuxInt 7240 v_1 := v.Args[1] 7241 if v_1.Op != OpConst16 { 7242 break 7243 } 7244 d := v_1.AuxInt 7245 if !(d != 0) { 7246 break 7247 } 7248 v.reset(OpConst16) 7249 v.AuxInt = int64(int16(c) / int16(d)) 7250 return true 7251 } 7252 // match: (Div16 n (Const16 [c])) 7253 // cond: isNonNegative(n) && isPowerOfTwo(c&0xffff) 7254 // result: (Rsh16Ux64 n (Const64 <typ.UInt64> [log2(c&0xffff)])) 7255 for { 7256 _ = v.Args[1] 7257 n := v.Args[0] 7258 v_1 := v.Args[1] 7259 if v_1.Op != OpConst16 { 7260 break 7261 } 7262 c := v_1.AuxInt 7263 if !(isNonNegative(n) && isPowerOfTwo(c&0xffff)) { 7264 break 7265 } 7266 v.reset(OpRsh16Ux64) 7267 v.AddArg(n) 7268 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7269 v0.AuxInt = log2(c & 0xffff) 7270 v.AddArg(v0) 7271 return true 7272 } 7273 // match: (Div16 <t> n (Const16 [c])) 7274 // cond: c < 0 && c != -1<<15 7275 // result: (Neg16 (Div16 <t> n (Const16 <t> [-c]))) 7276 for { 7277 t := v.Type 7278 _ = v.Args[1] 7279 n := v.Args[0] 7280 v_1 := v.Args[1] 7281 if v_1.Op != OpConst16 { 7282 break 7283 } 7284 c := v_1.AuxInt 7285 if !(c < 0 && c != -1<<15) { 7286 break 7287 } 7288 v.reset(OpNeg16) 7289 v0 := b.NewValue0(v.Pos, OpDiv16, t) 7290 v0.AddArg(n) 7291 v1 := b.NewValue0(v.Pos, OpConst16, t) 7292 v1.AuxInt = -c 7293 v0.AddArg(v1) 7294 v.AddArg(v0) 7295 return true 7296 } 7297 // match: (Div16 <t> x (Const16 [-1<<15])) 7298 // cond: 7299 // result: (Rsh16Ux64 (And16 <t> x (Neg16 <t> x)) (Const64 <typ.UInt64> [15])) 7300 for { 7301 t := v.Type 7302 _ = v.Args[1] 7303 x := v.Args[0] 7304 v_1 := v.Args[1] 7305 if v_1.Op != OpConst16 { 7306 break 7307 } 7308 if v_1.AuxInt != -1<<15 { 7309 break 7310 } 7311 v.reset(OpRsh16Ux64) 7312 v0 := b.NewValue0(v.Pos, OpAnd16, t) 7313 v0.AddArg(x) 7314 v1 := b.NewValue0(v.Pos, OpNeg16, t) 7315 v1.AddArg(x) 7316 v0.AddArg(v1) 7317 v.AddArg(v0) 7318 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7319 v2.AuxInt = 15 7320 v.AddArg(v2) 7321 return true 7322 } 7323 // match: (Div16 <t> n (Const16 [c])) 7324 // cond: isPowerOfTwo(c) 7325 // result: (Rsh16x64 (Add16 <t> n (Rsh16Ux64 <t> (Rsh16x64 <t> n (Const64 <typ.UInt64> [15])) (Const64 <typ.UInt64> [16-log2(c)]))) (Const64 <typ.UInt64> [log2(c)])) 7326 for { 7327 t := v.Type 7328 _ = v.Args[1] 7329 n := v.Args[0] 7330 v_1 := v.Args[1] 7331 if v_1.Op != OpConst16 { 7332 break 7333 } 7334 c := v_1.AuxInt 7335 if !(isPowerOfTwo(c)) { 7336 break 7337 } 7338 v.reset(OpRsh16x64) 7339 v0 := b.NewValue0(v.Pos, OpAdd16, t) 7340 v0.AddArg(n) 7341 v1 := b.NewValue0(v.Pos, OpRsh16Ux64, t) 7342 v2 := b.NewValue0(v.Pos, OpRsh16x64, t) 7343 v2.AddArg(n) 7344 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7345 v3.AuxInt = 15 7346 v2.AddArg(v3) 7347 v1.AddArg(v2) 7348 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7349 v4.AuxInt = 16 - log2(c) 7350 v1.AddArg(v4) 7351 v0.AddArg(v1) 7352 v.AddArg(v0) 7353 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7354 v5.AuxInt = log2(c) 7355 v.AddArg(v5) 7356 return true 7357 } 7358 // match: (Div16 <t> x (Const16 [c])) 7359 // cond: smagicOK(16,c) 7360 // result: (Sub16 <t> (Rsh32x64 <t> (Mul32 <typ.UInt32> (Const32 <typ.UInt32> [int64(smagic(16,c).m)]) (SignExt16to32 x)) (Const64 <typ.UInt64> [16+smagic(16,c).s])) (Rsh32x64 <t> (SignExt16to32 x) (Const64 <typ.UInt64> [31]))) 7361 for { 7362 t := v.Type 7363 _ = v.Args[1] 7364 x := v.Args[0] 7365 v_1 := v.Args[1] 7366 if v_1.Op != OpConst16 { 7367 break 7368 } 7369 c := v_1.AuxInt 7370 if !(smagicOK(16, c)) { 7371 break 7372 } 7373 v.reset(OpSub16) 7374 v.Type = t 7375 v0 := b.NewValue0(v.Pos, OpRsh32x64, t) 7376 v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) 7377 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 7378 v2.AuxInt = int64(smagic(16, c).m) 7379 v1.AddArg(v2) 7380 v3 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 7381 v3.AddArg(x) 7382 v1.AddArg(v3) 7383 v0.AddArg(v1) 7384 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7385 v4.AuxInt = 16 + smagic(16, c).s 7386 v0.AddArg(v4) 7387 v.AddArg(v0) 7388 v5 := b.NewValue0(v.Pos, OpRsh32x64, t) 7389 v6 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) 7390 v6.AddArg(x) 7391 v5.AddArg(v6) 7392 v7 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7393 v7.AuxInt = 31 7394 v5.AddArg(v7) 7395 v.AddArg(v5) 7396 return true 7397 } 7398 return false 7399 } 7400 func rewriteValuegeneric_OpDiv16u_0(v *Value) bool { 7401 b := v.Block 7402 _ = b 7403 config := b.Func.Config 7404 _ = config 7405 typ := &b.Func.Config.Types 7406 _ = typ 7407 // match: (Div16u (Const16 [c]) (Const16 [d])) 7408 // cond: d != 0 7409 // result: (Const16 [int64(int16(uint16(c)/uint16(d)))]) 7410 for { 7411 _ = v.Args[1] 7412 v_0 := v.Args[0] 7413 if v_0.Op != OpConst16 { 7414 break 7415 } 7416 c := v_0.AuxInt 7417 v_1 := v.Args[1] 7418 if v_1.Op != OpConst16 { 7419 break 7420 } 7421 d := v_1.AuxInt 7422 if !(d != 0) { 7423 break 7424 } 7425 v.reset(OpConst16) 7426 v.AuxInt = int64(int16(uint16(c) / uint16(d))) 7427 return true 7428 } 7429 // match: (Div16u n (Const16 [c])) 7430 // cond: isPowerOfTwo(c&0xffff) 7431 // result: (Rsh16Ux64 n (Const64 <typ.UInt64> [log2(c&0xffff)])) 7432 for { 7433 _ = v.Args[1] 7434 n := v.Args[0] 7435 v_1 := v.Args[1] 7436 if v_1.Op != OpConst16 { 7437 break 7438 } 7439 c := v_1.AuxInt 7440 if !(isPowerOfTwo(c & 0xffff)) { 7441 break 7442 } 7443 v.reset(OpRsh16Ux64) 7444 v.AddArg(n) 7445 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7446 v0.AuxInt = log2(c & 0xffff) 7447 v.AddArg(v0) 7448 return true 7449 } 7450 // match: (Div16u x (Const16 [c])) 7451 // cond: umagicOK(16, c) && config.RegSize == 8 7452 // result: (Trunc64to16 (Rsh64Ux64 <typ.UInt64> (Mul64 <typ.UInt64> (Const64 <typ.UInt64> [int64(1<<16+umagic(16,c).m)]) (ZeroExt16to64 x)) (Const64 <typ.UInt64> [16+umagic(16,c).s]))) 7453 for { 7454 _ = v.Args[1] 7455 x := v.Args[0] 7456 v_1 := v.Args[1] 7457 if v_1.Op != OpConst16 { 7458 break 7459 } 7460 c := v_1.AuxInt 7461 if !(umagicOK(16, c) && config.RegSize == 8) { 7462 break 7463 } 7464 v.reset(OpTrunc64to16) 7465 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64) 7466 v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) 7467 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7468 v2.AuxInt = int64(1<<16 + umagic(16, c).m) 7469 v1.AddArg(v2) 7470 v3 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64) 7471 v3.AddArg(x) 7472 v1.AddArg(v3) 7473 v0.AddArg(v1) 7474 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7475 v4.AuxInt = 16 + umagic(16, c).s 7476 v0.AddArg(v4) 7477 v.AddArg(v0) 7478 return true 7479 } 7480 // match: (Div16u x (Const16 [c])) 7481 // cond: umagicOK(16, c) && config.RegSize == 4 && umagic(16,c).m&1 == 0 7482 // result: (Trunc32to16 (Rsh32Ux64 <typ.UInt32> (Mul32 <typ.UInt32> (Const32 <typ.UInt32> [int64(1<<15+umagic(16,c).m/2)]) (ZeroExt16to32 x)) (Const64 <typ.UInt64> [16+umagic(16,c).s-1]))) 7483 for { 7484 _ = v.Args[1] 7485 x := v.Args[0] 7486 v_1 := v.Args[1] 7487 if v_1.Op != OpConst16 { 7488 break 7489 } 7490 c := v_1.AuxInt 7491 if !(umagicOK(16, c) && config.RegSize == 4 && umagic(16, c).m&1 == 0) { 7492 break 7493 } 7494 v.reset(OpTrunc32to16) 7495 v0 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32) 7496 v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) 7497 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 7498 v2.AuxInt = int64(1<<15 + umagic(16, c).m/2) 7499 v1.AddArg(v2) 7500 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 7501 v3.AddArg(x) 7502 v1.AddArg(v3) 7503 v0.AddArg(v1) 7504 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7505 v4.AuxInt = 16 + umagic(16, c).s - 1 7506 v0.AddArg(v4) 7507 v.AddArg(v0) 7508 return true 7509 } 7510 // match: (Div16u x (Const16 [c])) 7511 // cond: umagicOK(16, c) && config.RegSize == 4 && c&1 == 0 7512 // result: (Trunc32to16 (Rsh32Ux64 <typ.UInt32> (Mul32 <typ.UInt32> (Const32 <typ.UInt32> [int64(1<<15+(umagic(16,c).m+1)/2)]) (Rsh32Ux64 <typ.UInt32> (ZeroExt16to32 x) (Const64 <typ.UInt64> [1]))) (Const64 <typ.UInt64> [16+umagic(16,c).s-2]))) 7513 for { 7514 _ = v.Args[1] 7515 x := v.Args[0] 7516 v_1 := v.Args[1] 7517 if v_1.Op != OpConst16 { 7518 break 7519 } 7520 c := v_1.AuxInt 7521 if !(umagicOK(16, c) && config.RegSize == 4 && c&1 == 0) { 7522 break 7523 } 7524 v.reset(OpTrunc32to16) 7525 v0 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32) 7526 v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) 7527 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 7528 v2.AuxInt = int64(1<<15 + (umagic(16, c).m+1)/2) 7529 v1.AddArg(v2) 7530 v3 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32) 7531 v4 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 7532 v4.AddArg(x) 7533 v3.AddArg(v4) 7534 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7535 v5.AuxInt = 1 7536 v3.AddArg(v5) 7537 v1.AddArg(v3) 7538 v0.AddArg(v1) 7539 v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7540 v6.AuxInt = 16 + umagic(16, c).s - 2 7541 v0.AddArg(v6) 7542 v.AddArg(v0) 7543 return true 7544 } 7545 // match: (Div16u x (Const16 [c])) 7546 // cond: umagicOK(16, c) && config.RegSize == 4 7547 // result: (Trunc32to16 (Rsh32Ux64 <typ.UInt32> (Avg32u (Lsh32x64 <typ.UInt32> (ZeroExt16to32 x) (Const64 <typ.UInt64> [16])) (Mul32 <typ.UInt32> (Const32 <typ.UInt32> [int64(umagic(16,c).m)]) (ZeroExt16to32 x))) (Const64 <typ.UInt64> [16+umagic(16,c).s-1]))) 7548 for { 7549 _ = v.Args[1] 7550 x := v.Args[0] 7551 v_1 := v.Args[1] 7552 if v_1.Op != OpConst16 { 7553 break 7554 } 7555 c := v_1.AuxInt 7556 if !(umagicOK(16, c) && config.RegSize == 4) { 7557 break 7558 } 7559 v.reset(OpTrunc32to16) 7560 v0 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32) 7561 v1 := b.NewValue0(v.Pos, OpAvg32u, typ.UInt32) 7562 v2 := b.NewValue0(v.Pos, OpLsh32x64, typ.UInt32) 7563 v3 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 7564 v3.AddArg(x) 7565 v2.AddArg(v3) 7566 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7567 v4.AuxInt = 16 7568 v2.AddArg(v4) 7569 v1.AddArg(v2) 7570 v5 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) 7571 v6 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 7572 v6.AuxInt = int64(umagic(16, c).m) 7573 v5.AddArg(v6) 7574 v7 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) 7575 v7.AddArg(x) 7576 v5.AddArg(v7) 7577 v1.AddArg(v5) 7578 v0.AddArg(v1) 7579 v8 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7580 v8.AuxInt = 16 + umagic(16, c).s - 1 7581 v0.AddArg(v8) 7582 v.AddArg(v0) 7583 return true 7584 } 7585 return false 7586 } 7587 func rewriteValuegeneric_OpDiv32_0(v *Value) bool { 7588 b := v.Block 7589 _ = b 7590 config := b.Func.Config 7591 _ = config 7592 typ := &b.Func.Config.Types 7593 _ = typ 7594 // match: (Div32 (Const32 [c]) (Const32 [d])) 7595 // cond: d != 0 7596 // result: (Const32 [int64(int32(c)/int32(d))]) 7597 for { 7598 _ = v.Args[1] 7599 v_0 := v.Args[0] 7600 if v_0.Op != OpConst32 { 7601 break 7602 } 7603 c := v_0.AuxInt 7604 v_1 := v.Args[1] 7605 if v_1.Op != OpConst32 { 7606 break 7607 } 7608 d := v_1.AuxInt 7609 if !(d != 0) { 7610 break 7611 } 7612 v.reset(OpConst32) 7613 v.AuxInt = int64(int32(c) / int32(d)) 7614 return true 7615 } 7616 // match: (Div32 n (Const32 [c])) 7617 // cond: isNonNegative(n) && isPowerOfTwo(c&0xffffffff) 7618 // result: (Rsh32Ux64 n (Const64 <typ.UInt64> [log2(c&0xffffffff)])) 7619 for { 7620 _ = v.Args[1] 7621 n := v.Args[0] 7622 v_1 := v.Args[1] 7623 if v_1.Op != OpConst32 { 7624 break 7625 } 7626 c := v_1.AuxInt 7627 if !(isNonNegative(n) && isPowerOfTwo(c&0xffffffff)) { 7628 break 7629 } 7630 v.reset(OpRsh32Ux64) 7631 v.AddArg(n) 7632 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7633 v0.AuxInt = log2(c & 0xffffffff) 7634 v.AddArg(v0) 7635 return true 7636 } 7637 // match: (Div32 <t> n (Const32 [c])) 7638 // cond: c < 0 && c != -1<<31 7639 // result: (Neg32 (Div32 <t> n (Const32 <t> [-c]))) 7640 for { 7641 t := v.Type 7642 _ = v.Args[1] 7643 n := v.Args[0] 7644 v_1 := v.Args[1] 7645 if v_1.Op != OpConst32 { 7646 break 7647 } 7648 c := v_1.AuxInt 7649 if !(c < 0 && c != -1<<31) { 7650 break 7651 } 7652 v.reset(OpNeg32) 7653 v0 := b.NewValue0(v.Pos, OpDiv32, t) 7654 v0.AddArg(n) 7655 v1 := b.NewValue0(v.Pos, OpConst32, t) 7656 v1.AuxInt = -c 7657 v0.AddArg(v1) 7658 v.AddArg(v0) 7659 return true 7660 } 7661 // match: (Div32 <t> x (Const32 [-1<<31])) 7662 // cond: 7663 // result: (Rsh32Ux64 (And32 <t> x (Neg32 <t> x)) (Const64 <typ.UInt64> [31])) 7664 for { 7665 t := v.Type 7666 _ = v.Args[1] 7667 x := v.Args[0] 7668 v_1 := v.Args[1] 7669 if v_1.Op != OpConst32 { 7670 break 7671 } 7672 if v_1.AuxInt != -1<<31 { 7673 break 7674 } 7675 v.reset(OpRsh32Ux64) 7676 v0 := b.NewValue0(v.Pos, OpAnd32, t) 7677 v0.AddArg(x) 7678 v1 := b.NewValue0(v.Pos, OpNeg32, t) 7679 v1.AddArg(x) 7680 v0.AddArg(v1) 7681 v.AddArg(v0) 7682 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7683 v2.AuxInt = 31 7684 v.AddArg(v2) 7685 return true 7686 } 7687 // match: (Div32 <t> n (Const32 [c])) 7688 // cond: isPowerOfTwo(c) 7689 // result: (Rsh32x64 (Add32 <t> n (Rsh32Ux64 <t> (Rsh32x64 <t> n (Const64 <typ.UInt64> [31])) (Const64 <typ.UInt64> [32-log2(c)]))) (Const64 <typ.UInt64> [log2(c)])) 7690 for { 7691 t := v.Type 7692 _ = v.Args[1] 7693 n := v.Args[0] 7694 v_1 := v.Args[1] 7695 if v_1.Op != OpConst32 { 7696 break 7697 } 7698 c := v_1.AuxInt 7699 if !(isPowerOfTwo(c)) { 7700 break 7701 } 7702 v.reset(OpRsh32x64) 7703 v0 := b.NewValue0(v.Pos, OpAdd32, t) 7704 v0.AddArg(n) 7705 v1 := b.NewValue0(v.Pos, OpRsh32Ux64, t) 7706 v2 := b.NewValue0(v.Pos, OpRsh32x64, t) 7707 v2.AddArg(n) 7708 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7709 v3.AuxInt = 31 7710 v2.AddArg(v3) 7711 v1.AddArg(v2) 7712 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7713 v4.AuxInt = 32 - log2(c) 7714 v1.AddArg(v4) 7715 v0.AddArg(v1) 7716 v.AddArg(v0) 7717 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7718 v5.AuxInt = log2(c) 7719 v.AddArg(v5) 7720 return true 7721 } 7722 // match: (Div32 <t> x (Const32 [c])) 7723 // cond: smagicOK(32,c) && config.RegSize == 8 7724 // result: (Sub32 <t> (Rsh64x64 <t> (Mul64 <typ.UInt64> (Const64 <typ.UInt64> [int64(smagic(32,c).m)]) (SignExt32to64 x)) (Const64 <typ.UInt64> [32+smagic(32,c).s])) (Rsh64x64 <t> (SignExt32to64 x) (Const64 <typ.UInt64> [63]))) 7725 for { 7726 t := v.Type 7727 _ = v.Args[1] 7728 x := v.Args[0] 7729 v_1 := v.Args[1] 7730 if v_1.Op != OpConst32 { 7731 break 7732 } 7733 c := v_1.AuxInt 7734 if !(smagicOK(32, c) && config.RegSize == 8) { 7735 break 7736 } 7737 v.reset(OpSub32) 7738 v.Type = t 7739 v0 := b.NewValue0(v.Pos, OpRsh64x64, t) 7740 v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) 7741 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7742 v2.AuxInt = int64(smagic(32, c).m) 7743 v1.AddArg(v2) 7744 v3 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64) 7745 v3.AddArg(x) 7746 v1.AddArg(v3) 7747 v0.AddArg(v1) 7748 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7749 v4.AuxInt = 32 + smagic(32, c).s 7750 v0.AddArg(v4) 7751 v.AddArg(v0) 7752 v5 := b.NewValue0(v.Pos, OpRsh64x64, t) 7753 v6 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64) 7754 v6.AddArg(x) 7755 v5.AddArg(v6) 7756 v7 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7757 v7.AuxInt = 63 7758 v5.AddArg(v7) 7759 v.AddArg(v5) 7760 return true 7761 } 7762 // match: (Div32 <t> x (Const32 [c])) 7763 // cond: smagicOK(32,c) && config.RegSize == 4 && smagic(32,c).m&1 == 0 7764 // result: (Sub32 <t> (Rsh32x64 <t> (Hmul32 <t> (Const32 <typ.UInt32> [int64(int32(smagic(32,c).m/2))]) x) (Const64 <typ.UInt64> [smagic(32,c).s-1])) (Rsh32x64 <t> x (Const64 <typ.UInt64> [31]))) 7765 for { 7766 t := v.Type 7767 _ = v.Args[1] 7768 x := v.Args[0] 7769 v_1 := v.Args[1] 7770 if v_1.Op != OpConst32 { 7771 break 7772 } 7773 c := v_1.AuxInt 7774 if !(smagicOK(32, c) && config.RegSize == 4 && smagic(32, c).m&1 == 0) { 7775 break 7776 } 7777 v.reset(OpSub32) 7778 v.Type = t 7779 v0 := b.NewValue0(v.Pos, OpRsh32x64, t) 7780 v1 := b.NewValue0(v.Pos, OpHmul32, t) 7781 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 7782 v2.AuxInt = int64(int32(smagic(32, c).m / 2)) 7783 v1.AddArg(v2) 7784 v1.AddArg(x) 7785 v0.AddArg(v1) 7786 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7787 v3.AuxInt = smagic(32, c).s - 1 7788 v0.AddArg(v3) 7789 v.AddArg(v0) 7790 v4 := b.NewValue0(v.Pos, OpRsh32x64, t) 7791 v4.AddArg(x) 7792 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7793 v5.AuxInt = 31 7794 v4.AddArg(v5) 7795 v.AddArg(v4) 7796 return true 7797 } 7798 // match: (Div32 <t> x (Const32 [c])) 7799 // cond: smagicOK(32,c) && config.RegSize == 4 && smagic(32,c).m&1 != 0 7800 // result: (Sub32 <t> (Rsh32x64 <t> (Add32 <t> (Hmul32 <t> (Const32 <typ.UInt32> [int64(int32(smagic(32,c).m))]) x) x) (Const64 <typ.UInt64> [smagic(32,c).s])) (Rsh32x64 <t> x (Const64 <typ.UInt64> [31]))) 7801 for { 7802 t := v.Type 7803 _ = v.Args[1] 7804 x := v.Args[0] 7805 v_1 := v.Args[1] 7806 if v_1.Op != OpConst32 { 7807 break 7808 } 7809 c := v_1.AuxInt 7810 if !(smagicOK(32, c) && config.RegSize == 4 && smagic(32, c).m&1 != 0) { 7811 break 7812 } 7813 v.reset(OpSub32) 7814 v.Type = t 7815 v0 := b.NewValue0(v.Pos, OpRsh32x64, t) 7816 v1 := b.NewValue0(v.Pos, OpAdd32, t) 7817 v2 := b.NewValue0(v.Pos, OpHmul32, t) 7818 v3 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 7819 v3.AuxInt = int64(int32(smagic(32, c).m)) 7820 v2.AddArg(v3) 7821 v2.AddArg(x) 7822 v1.AddArg(v2) 7823 v1.AddArg(x) 7824 v0.AddArg(v1) 7825 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7826 v4.AuxInt = smagic(32, c).s 7827 v0.AddArg(v4) 7828 v.AddArg(v0) 7829 v5 := b.NewValue0(v.Pos, OpRsh32x64, t) 7830 v5.AddArg(x) 7831 v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7832 v6.AuxInt = 31 7833 v5.AddArg(v6) 7834 v.AddArg(v5) 7835 return true 7836 } 7837 return false 7838 } 7839 func rewriteValuegeneric_OpDiv32F_0(v *Value) bool { 7840 b := v.Block 7841 _ = b 7842 // match: (Div32F (Const32F [c]) (Const32F [d])) 7843 // cond: 7844 // result: (Const32F [f2i(float64(i2f32(c) / i2f32(d)))]) 7845 for { 7846 _ = v.Args[1] 7847 v_0 := v.Args[0] 7848 if v_0.Op != OpConst32F { 7849 break 7850 } 7851 c := v_0.AuxInt 7852 v_1 := v.Args[1] 7853 if v_1.Op != OpConst32F { 7854 break 7855 } 7856 d := v_1.AuxInt 7857 v.reset(OpConst32F) 7858 v.AuxInt = f2i(float64(i2f32(c) / i2f32(d))) 7859 return true 7860 } 7861 // match: (Div32F x (Const32F <t> [c])) 7862 // cond: reciprocalExact32(float32(i2f(c))) 7863 // result: (Mul32F x (Const32F <t> [f2i(1/i2f(c))])) 7864 for { 7865 _ = v.Args[1] 7866 x := v.Args[0] 7867 v_1 := v.Args[1] 7868 if v_1.Op != OpConst32F { 7869 break 7870 } 7871 t := v_1.Type 7872 c := v_1.AuxInt 7873 if !(reciprocalExact32(float32(i2f(c)))) { 7874 break 7875 } 7876 v.reset(OpMul32F) 7877 v.AddArg(x) 7878 v0 := b.NewValue0(v.Pos, OpConst32F, t) 7879 v0.AuxInt = f2i(1 / i2f(c)) 7880 v.AddArg(v0) 7881 return true 7882 } 7883 return false 7884 } 7885 func rewriteValuegeneric_OpDiv32u_0(v *Value) bool { 7886 b := v.Block 7887 _ = b 7888 config := b.Func.Config 7889 _ = config 7890 typ := &b.Func.Config.Types 7891 _ = typ 7892 // match: (Div32u (Const32 [c]) (Const32 [d])) 7893 // cond: d != 0 7894 // result: (Const32 [int64(int32(uint32(c)/uint32(d)))]) 7895 for { 7896 _ = v.Args[1] 7897 v_0 := v.Args[0] 7898 if v_0.Op != OpConst32 { 7899 break 7900 } 7901 c := v_0.AuxInt 7902 v_1 := v.Args[1] 7903 if v_1.Op != OpConst32 { 7904 break 7905 } 7906 d := v_1.AuxInt 7907 if !(d != 0) { 7908 break 7909 } 7910 v.reset(OpConst32) 7911 v.AuxInt = int64(int32(uint32(c) / uint32(d))) 7912 return true 7913 } 7914 // match: (Div32u n (Const32 [c])) 7915 // cond: isPowerOfTwo(c&0xffffffff) 7916 // result: (Rsh32Ux64 n (Const64 <typ.UInt64> [log2(c&0xffffffff)])) 7917 for { 7918 _ = v.Args[1] 7919 n := v.Args[0] 7920 v_1 := v.Args[1] 7921 if v_1.Op != OpConst32 { 7922 break 7923 } 7924 c := v_1.AuxInt 7925 if !(isPowerOfTwo(c & 0xffffffff)) { 7926 break 7927 } 7928 v.reset(OpRsh32Ux64) 7929 v.AddArg(n) 7930 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7931 v0.AuxInt = log2(c & 0xffffffff) 7932 v.AddArg(v0) 7933 return true 7934 } 7935 // match: (Div32u x (Const32 [c])) 7936 // cond: umagicOK(32, c) && config.RegSize == 4 && umagic(32,c).m&1 == 0 7937 // result: (Rsh32Ux64 <typ.UInt32> (Hmul32u <typ.UInt32> (Const32 <typ.UInt32> [int64(int32(1<<31+umagic(32,c).m/2))]) x) (Const64 <typ.UInt64> [umagic(32,c).s-1])) 7938 for { 7939 _ = v.Args[1] 7940 x := v.Args[0] 7941 v_1 := v.Args[1] 7942 if v_1.Op != OpConst32 { 7943 break 7944 } 7945 c := v_1.AuxInt 7946 if !(umagicOK(32, c) && config.RegSize == 4 && umagic(32, c).m&1 == 0) { 7947 break 7948 } 7949 v.reset(OpRsh32Ux64) 7950 v.Type = typ.UInt32 7951 v0 := b.NewValue0(v.Pos, OpHmul32u, typ.UInt32) 7952 v1 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 7953 v1.AuxInt = int64(int32(1<<31 + umagic(32, c).m/2)) 7954 v0.AddArg(v1) 7955 v0.AddArg(x) 7956 v.AddArg(v0) 7957 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7958 v2.AuxInt = umagic(32, c).s - 1 7959 v.AddArg(v2) 7960 return true 7961 } 7962 // match: (Div32u x (Const32 [c])) 7963 // cond: umagicOK(32, c) && config.RegSize == 4 && c&1 == 0 7964 // result: (Rsh32Ux64 <typ.UInt32> (Hmul32u <typ.UInt32> (Const32 <typ.UInt32> [int64(int32(1<<31+(umagic(32,c).m+1)/2))]) (Rsh32Ux64 <typ.UInt32> x (Const64 <typ.UInt64> [1]))) (Const64 <typ.UInt64> [umagic(32,c).s-2])) 7965 for { 7966 _ = v.Args[1] 7967 x := v.Args[0] 7968 v_1 := v.Args[1] 7969 if v_1.Op != OpConst32 { 7970 break 7971 } 7972 c := v_1.AuxInt 7973 if !(umagicOK(32, c) && config.RegSize == 4 && c&1 == 0) { 7974 break 7975 } 7976 v.reset(OpRsh32Ux64) 7977 v.Type = typ.UInt32 7978 v0 := b.NewValue0(v.Pos, OpHmul32u, typ.UInt32) 7979 v1 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 7980 v1.AuxInt = int64(int32(1<<31 + (umagic(32, c).m+1)/2)) 7981 v0.AddArg(v1) 7982 v2 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32) 7983 v2.AddArg(x) 7984 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7985 v3.AuxInt = 1 7986 v2.AddArg(v3) 7987 v0.AddArg(v2) 7988 v.AddArg(v0) 7989 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 7990 v4.AuxInt = umagic(32, c).s - 2 7991 v.AddArg(v4) 7992 return true 7993 } 7994 // match: (Div32u x (Const32 [c])) 7995 // cond: umagicOK(32, c) && config.RegSize == 4 7996 // result: (Rsh32Ux64 <typ.UInt32> (Avg32u x (Hmul32u <typ.UInt32> (Const32 <typ.UInt32> [int64(int32(umagic(32,c).m))]) x)) (Const64 <typ.UInt64> [umagic(32,c).s-1])) 7997 for { 7998 _ = v.Args[1] 7999 x := v.Args[0] 8000 v_1 := v.Args[1] 8001 if v_1.Op != OpConst32 { 8002 break 8003 } 8004 c := v_1.AuxInt 8005 if !(umagicOK(32, c) && config.RegSize == 4) { 8006 break 8007 } 8008 v.reset(OpRsh32Ux64) 8009 v.Type = typ.UInt32 8010 v0 := b.NewValue0(v.Pos, OpAvg32u, typ.UInt32) 8011 v0.AddArg(x) 8012 v1 := b.NewValue0(v.Pos, OpHmul32u, typ.UInt32) 8013 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 8014 v2.AuxInt = int64(int32(umagic(32, c).m)) 8015 v1.AddArg(v2) 8016 v1.AddArg(x) 8017 v0.AddArg(v1) 8018 v.AddArg(v0) 8019 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8020 v3.AuxInt = umagic(32, c).s - 1 8021 v.AddArg(v3) 8022 return true 8023 } 8024 // match: (Div32u x (Const32 [c])) 8025 // cond: umagicOK(32, c) && config.RegSize == 8 && umagic(32,c).m&1 == 0 8026 // result: (Trunc64to32 (Rsh64Ux64 <typ.UInt64> (Mul64 <typ.UInt64> (Const64 <typ.UInt64> [int64(1<<31+umagic(32,c).m/2)]) (ZeroExt32to64 x)) (Const64 <typ.UInt64> [32+umagic(32,c).s-1]))) 8027 for { 8028 _ = v.Args[1] 8029 x := v.Args[0] 8030 v_1 := v.Args[1] 8031 if v_1.Op != OpConst32 { 8032 break 8033 } 8034 c := v_1.AuxInt 8035 if !(umagicOK(32, c) && config.RegSize == 8 && umagic(32, c).m&1 == 0) { 8036 break 8037 } 8038 v.reset(OpTrunc64to32) 8039 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64) 8040 v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) 8041 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8042 v2.AuxInt = int64(1<<31 + umagic(32, c).m/2) 8043 v1.AddArg(v2) 8044 v3 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) 8045 v3.AddArg(x) 8046 v1.AddArg(v3) 8047 v0.AddArg(v1) 8048 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8049 v4.AuxInt = 32 + umagic(32, c).s - 1 8050 v0.AddArg(v4) 8051 v.AddArg(v0) 8052 return true 8053 } 8054 // match: (Div32u x (Const32 [c])) 8055 // cond: umagicOK(32, c) && config.RegSize == 8 && c&1 == 0 8056 // result: (Trunc64to32 (Rsh64Ux64 <typ.UInt64> (Mul64 <typ.UInt64> (Const64 <typ.UInt64> [int64(1<<31+(umagic(32,c).m+1)/2)]) (Rsh64Ux64 <typ.UInt64> (ZeroExt32to64 x) (Const64 <typ.UInt64> [1]))) (Const64 <typ.UInt64> [32+umagic(32,c).s-2]))) 8057 for { 8058 _ = v.Args[1] 8059 x := v.Args[0] 8060 v_1 := v.Args[1] 8061 if v_1.Op != OpConst32 { 8062 break 8063 } 8064 c := v_1.AuxInt 8065 if !(umagicOK(32, c) && config.RegSize == 8 && c&1 == 0) { 8066 break 8067 } 8068 v.reset(OpTrunc64to32) 8069 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64) 8070 v1 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) 8071 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8072 v2.AuxInt = int64(1<<31 + (umagic(32, c).m+1)/2) 8073 v1.AddArg(v2) 8074 v3 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64) 8075 v4 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) 8076 v4.AddArg(x) 8077 v3.AddArg(v4) 8078 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8079 v5.AuxInt = 1 8080 v3.AddArg(v5) 8081 v1.AddArg(v3) 8082 v0.AddArg(v1) 8083 v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8084 v6.AuxInt = 32 + umagic(32, c).s - 2 8085 v0.AddArg(v6) 8086 v.AddArg(v0) 8087 return true 8088 } 8089 // match: (Div32u x (Const32 [c])) 8090 // cond: umagicOK(32, c) && config.RegSize == 8 8091 // result: (Trunc64to32 (Rsh64Ux64 <typ.UInt64> (Avg64u (Lsh64x64 <typ.UInt64> (ZeroExt32to64 x) (Const64 <typ.UInt64> [32])) (Mul64 <typ.UInt64> (Const64 <typ.UInt32> [int64(umagic(32,c).m)]) (ZeroExt32to64 x))) (Const64 <typ.UInt64> [32+umagic(32,c).s-1]))) 8092 for { 8093 _ = v.Args[1] 8094 x := v.Args[0] 8095 v_1 := v.Args[1] 8096 if v_1.Op != OpConst32 { 8097 break 8098 } 8099 c := v_1.AuxInt 8100 if !(umagicOK(32, c) && config.RegSize == 8) { 8101 break 8102 } 8103 v.reset(OpTrunc64to32) 8104 v0 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64) 8105 v1 := b.NewValue0(v.Pos, OpAvg64u, typ.UInt64) 8106 v2 := b.NewValue0(v.Pos, OpLsh64x64, typ.UInt64) 8107 v3 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) 8108 v3.AddArg(x) 8109 v2.AddArg(v3) 8110 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8111 v4.AuxInt = 32 8112 v2.AddArg(v4) 8113 v1.AddArg(v2) 8114 v5 := b.NewValue0(v.Pos, OpMul64, typ.UInt64) 8115 v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt32) 8116 v6.AuxInt = int64(umagic(32, c).m) 8117 v5.AddArg(v6) 8118 v7 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) 8119 v7.AddArg(x) 8120 v5.AddArg(v7) 8121 v1.AddArg(v5) 8122 v0.AddArg(v1) 8123 v8 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8124 v8.AuxInt = 32 + umagic(32, c).s - 1 8125 v0.AddArg(v8) 8126 v.AddArg(v0) 8127 return true 8128 } 8129 return false 8130 } 8131 func rewriteValuegeneric_OpDiv64_0(v *Value) bool { 8132 b := v.Block 8133 _ = b 8134 typ := &b.Func.Config.Types 8135 _ = typ 8136 // match: (Div64 (Const64 [c]) (Const64 [d])) 8137 // cond: d != 0 8138 // result: (Const64 [c/d]) 8139 for { 8140 _ = v.Args[1] 8141 v_0 := v.Args[0] 8142 if v_0.Op != OpConst64 { 8143 break 8144 } 8145 c := v_0.AuxInt 8146 v_1 := v.Args[1] 8147 if v_1.Op != OpConst64 { 8148 break 8149 } 8150 d := v_1.AuxInt 8151 if !(d != 0) { 8152 break 8153 } 8154 v.reset(OpConst64) 8155 v.AuxInt = c / d 8156 return true 8157 } 8158 // match: (Div64 n (Const64 [c])) 8159 // cond: isNonNegative(n) && isPowerOfTwo(c) 8160 // result: (Rsh64Ux64 n (Const64 <typ.UInt64> [log2(c)])) 8161 for { 8162 _ = v.Args[1] 8163 n := v.Args[0] 8164 v_1 := v.Args[1] 8165 if v_1.Op != OpConst64 { 8166 break 8167 } 8168 c := v_1.AuxInt 8169 if !(isNonNegative(n) && isPowerOfTwo(c)) { 8170 break 8171 } 8172 v.reset(OpRsh64Ux64) 8173 v.AddArg(n) 8174 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8175 v0.AuxInt = log2(c) 8176 v.AddArg(v0) 8177 return true 8178 } 8179 // match: (Div64 n (Const64 [-1<<63])) 8180 // cond: isNonNegative(n) 8181 // result: (Const64 [0]) 8182 for { 8183 _ = v.Args[1] 8184 n := v.Args[0] 8185 v_1 := v.Args[1] 8186 if v_1.Op != OpConst64 { 8187 break 8188 } 8189 if v_1.AuxInt != -1<<63 { 8190 break 8191 } 8192 if !(isNonNegative(n)) { 8193 break 8194 } 8195 v.reset(OpConst64) 8196 v.AuxInt = 0 8197 return true 8198 } 8199 // match: (Div64 <t> n (Const64 [c])) 8200 // cond: c < 0 && c != -1<<63 8201 // result: (Neg64 (Div64 <t> n (Const64 <t> [-c]))) 8202 for { 8203 t := v.Type 8204 _ = v.Args[1] 8205 n := v.Args[0] 8206 v_1 := v.Args[1] 8207 if v_1.Op != OpConst64 { 8208 break 8209 } 8210 c := v_1.AuxInt 8211 if !(c < 0 && c != -1<<63) { 8212 break 8213 } 8214 v.reset(OpNeg64) 8215 v0 := b.NewValue0(v.Pos, OpDiv64, t) 8216 v0.AddArg(n) 8217 v1 := b.NewValue0(v.Pos, OpConst64, t) 8218 v1.AuxInt = -c 8219 v0.AddArg(v1) 8220 v.AddArg(v0) 8221 return true 8222 } 8223 // match: (Div64 <t> x (Const64 [-1<<63])) 8224 // cond: 8225 // result: (Rsh64Ux64 (And64 <t> x (Neg64 <t> x)) (Const64 <typ.UInt64> [63])) 8226 for { 8227 t := v.Type 8228 _ = v.Args[1] 8229 x := v.Args[0] 8230 v_1 := v.Args[1] 8231 if v_1.Op != OpConst64 { 8232 break 8233 } 8234 if v_1.AuxInt != -1<<63 { 8235 break 8236 } 8237 v.reset(OpRsh64Ux64) 8238 v0 := b.NewValue0(v.Pos, OpAnd64, t) 8239 v0.AddArg(x) 8240 v1 := b.NewValue0(v.Pos, OpNeg64, t) 8241 v1.AddArg(x) 8242 v0.AddArg(v1) 8243 v.AddArg(v0) 8244 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8245 v2.AuxInt = 63 8246 v.AddArg(v2) 8247 return true 8248 } 8249 // match: (Div64 <t> n (Const64 [c])) 8250 // cond: isPowerOfTwo(c) 8251 // result: (Rsh64x64 (Add64 <t> n (Rsh64Ux64 <t> (Rsh64x64 <t> n (Const64 <typ.UInt64> [63])) (Const64 <typ.UInt64> [64-log2(c)]))) (Const64 <typ.UInt64> [log2(c)])) 8252 for { 8253 t := v.Type 8254 _ = v.Args[1] 8255 n := v.Args[0] 8256 v_1 := v.Args[1] 8257 if v_1.Op != OpConst64 { 8258 break 8259 } 8260 c := v_1.AuxInt 8261 if !(isPowerOfTwo(c)) { 8262 break 8263 } 8264 v.reset(OpRsh64x64) 8265 v0 := b.NewValue0(v.Pos, OpAdd64, t) 8266 v0.AddArg(n) 8267 v1 := b.NewValue0(v.Pos, OpRsh64Ux64, t) 8268 v2 := b.NewValue0(v.Pos, OpRsh64x64, t) 8269 v2.AddArg(n) 8270 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8271 v3.AuxInt = 63 8272 v2.AddArg(v3) 8273 v1.AddArg(v2) 8274 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8275 v4.AuxInt = 64 - log2(c) 8276 v1.AddArg(v4) 8277 v0.AddArg(v1) 8278 v.AddArg(v0) 8279 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8280 v5.AuxInt = log2(c) 8281 v.AddArg(v5) 8282 return true 8283 } 8284 // match: (Div64 <t> x (Const64 [c])) 8285 // cond: smagicOK(64,c) && smagic(64,c).m&1 == 0 8286 // result: (Sub64 <t> (Rsh64x64 <t> (Hmul64 <t> (Const64 <typ.UInt64> [int64(smagic(64,c).m/2)]) x) (Const64 <typ.UInt64> [smagic(64,c).s-1])) (Rsh64x64 <t> x (Const64 <typ.UInt64> [63]))) 8287 for { 8288 t := v.Type 8289 _ = v.Args[1] 8290 x := v.Args[0] 8291 v_1 := v.Args[1] 8292 if v_1.Op != OpConst64 { 8293 break 8294 } 8295 c := v_1.AuxInt 8296 if !(smagicOK(64, c) && smagic(64, c).m&1 == 0) { 8297 break 8298 } 8299 v.reset(OpSub64) 8300 v.Type = t 8301 v0 := b.NewValue0(v.Pos, OpRsh64x64, t) 8302 v1 := b.NewValue0(v.Pos, OpHmul64, t) 8303 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8304 v2.AuxInt = int64(smagic(64, c).m / 2) 8305 v1.AddArg(v2) 8306 v1.AddArg(x) 8307 v0.AddArg(v1) 8308 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8309 v3.AuxInt = smagic(64, c).s - 1 8310 v0.AddArg(v3) 8311 v.AddArg(v0) 8312 v4 := b.NewValue0(v.Pos, OpRsh64x64, t) 8313 v4.AddArg(x) 8314 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8315 v5.AuxInt = 63 8316 v4.AddArg(v5) 8317 v.AddArg(v4) 8318 return true 8319 } 8320 // match: (Div64 <t> x (Const64 [c])) 8321 // cond: smagicOK(64,c) && smagic(64,c).m&1 != 0 8322 // result: (Sub64 <t> (Rsh64x64 <t> (Add64 <t> (Hmul64 <t> (Const64 <typ.UInt64> [int64(smagic(64,c).m)]) x) x) (Const64 <typ.UInt64> [smagic(64,c).s])) (Rsh64x64 <t> x (Const64 <typ.UInt64> [63]))) 8323 for { 8324 t := v.Type 8325 _ = v.Args[1] 8326 x := v.Args[0] 8327 v_1 := v.Args[1] 8328 if v_1.Op != OpConst64 { 8329 break 8330 } 8331 c := v_1.AuxInt 8332 if !(smagicOK(64, c) && smagic(64, c).m&1 != 0) { 8333 break 8334 } 8335 v.reset(OpSub64) 8336 v.Type = t 8337 v0 := b.NewValue0(v.Pos, OpRsh64x64, t) 8338 v1 := b.NewValue0(v.Pos, OpAdd64, t) 8339 v2 := b.NewValue0(v.Pos, OpHmul64, t) 8340 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8341 v3.AuxInt = int64(smagic(64, c).m) 8342 v2.AddArg(v3) 8343 v2.AddArg(x) 8344 v1.AddArg(v2) 8345 v1.AddArg(x) 8346 v0.AddArg(v1) 8347 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8348 v4.AuxInt = smagic(64, c).s 8349 v0.AddArg(v4) 8350 v.AddArg(v0) 8351 v5 := b.NewValue0(v.Pos, OpRsh64x64, t) 8352 v5.AddArg(x) 8353 v6 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8354 v6.AuxInt = 63 8355 v5.AddArg(v6) 8356 v.AddArg(v5) 8357 return true 8358 } 8359 return false 8360 } 8361 func rewriteValuegeneric_OpDiv64F_0(v *Value) bool { 8362 b := v.Block 8363 _ = b 8364 // match: (Div64F (Const64F [c]) (Const64F [d])) 8365 // cond: 8366 // result: (Const64F [f2i(i2f(c) / i2f(d))]) 8367 for { 8368 _ = v.Args[1] 8369 v_0 := v.Args[0] 8370 if v_0.Op != OpConst64F { 8371 break 8372 } 8373 c := v_0.AuxInt 8374 v_1 := v.Args[1] 8375 if v_1.Op != OpConst64F { 8376 break 8377 } 8378 d := v_1.AuxInt 8379 v.reset(OpConst64F) 8380 v.AuxInt = f2i(i2f(c) / i2f(d)) 8381 return true 8382 } 8383 // match: (Div64F x (Const64F <t> [c])) 8384 // cond: reciprocalExact64(i2f(c)) 8385 // result: (Mul64F x (Const64F <t> [f2i(1/i2f(c))])) 8386 for { 8387 _ = v.Args[1] 8388 x := v.Args[0] 8389 v_1 := v.Args[1] 8390 if v_1.Op != OpConst64F { 8391 break 8392 } 8393 t := v_1.Type 8394 c := v_1.AuxInt 8395 if !(reciprocalExact64(i2f(c))) { 8396 break 8397 } 8398 v.reset(OpMul64F) 8399 v.AddArg(x) 8400 v0 := b.NewValue0(v.Pos, OpConst64F, t) 8401 v0.AuxInt = f2i(1 / i2f(c)) 8402 v.AddArg(v0) 8403 return true 8404 } 8405 return false 8406 } 8407 func rewriteValuegeneric_OpDiv64u_0(v *Value) bool { 8408 b := v.Block 8409 _ = b 8410 config := b.Func.Config 8411 _ = config 8412 typ := &b.Func.Config.Types 8413 _ = typ 8414 // match: (Div64u (Const64 [c]) (Const64 [d])) 8415 // cond: d != 0 8416 // result: (Const64 [int64(uint64(c)/uint64(d))]) 8417 for { 8418 _ = v.Args[1] 8419 v_0 := v.Args[0] 8420 if v_0.Op != OpConst64 { 8421 break 8422 } 8423 c := v_0.AuxInt 8424 v_1 := v.Args[1] 8425 if v_1.Op != OpConst64 { 8426 break 8427 } 8428 d := v_1.AuxInt 8429 if !(d != 0) { 8430 break 8431 } 8432 v.reset(OpConst64) 8433 v.AuxInt = int64(uint64(c) / uint64(d)) 8434 return true 8435 } 8436 // match: (Div64u n (Const64 [c])) 8437 // cond: isPowerOfTwo(c) 8438 // result: (Rsh64Ux64 n (Const64 <typ.UInt64> [log2(c)])) 8439 for { 8440 _ = v.Args[1] 8441 n := v.Args[0] 8442 v_1 := v.Args[1] 8443 if v_1.Op != OpConst64 { 8444 break 8445 } 8446 c := v_1.AuxInt 8447 if !(isPowerOfTwo(c)) { 8448 break 8449 } 8450 v.reset(OpRsh64Ux64) 8451 v.AddArg(n) 8452 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8453 v0.AuxInt = log2(c) 8454 v.AddArg(v0) 8455 return true 8456 } 8457 // match: (Div64u n (Const64 [-1<<63])) 8458 // cond: 8459 // result: (Rsh64Ux64 n (Const64 <typ.UInt64> [63])) 8460 for { 8461 _ = v.Args[1] 8462 n := v.Args[0] 8463 v_1 := v.Args[1] 8464 if v_1.Op != OpConst64 { 8465 break 8466 } 8467 if v_1.AuxInt != -1<<63 { 8468 break 8469 } 8470 v.reset(OpRsh64Ux64) 8471 v.AddArg(n) 8472 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8473 v0.AuxInt = 63 8474 v.AddArg(v0) 8475 return true 8476 } 8477 // match: (Div64u x (Const64 [c])) 8478 // cond: umagicOK(64, c) && config.RegSize == 8 && umagic(64,c).m&1 == 0 8479 // result: (Rsh64Ux64 <typ.UInt64> (Hmul64u <typ.UInt64> (Const64 <typ.UInt64> [int64(1<<63+umagic(64,c).m/2)]) x) (Const64 <typ.UInt64> [umagic(64,c).s-1])) 8480 for { 8481 _ = v.Args[1] 8482 x := v.Args[0] 8483 v_1 := v.Args[1] 8484 if v_1.Op != OpConst64 { 8485 break 8486 } 8487 c := v_1.AuxInt 8488 if !(umagicOK(64, c) && config.RegSize == 8 && umagic(64, c).m&1 == 0) { 8489 break 8490 } 8491 v.reset(OpRsh64Ux64) 8492 v.Type = typ.UInt64 8493 v0 := b.NewValue0(v.Pos, OpHmul64u, typ.UInt64) 8494 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8495 v1.AuxInt = int64(1<<63 + umagic(64, c).m/2) 8496 v0.AddArg(v1) 8497 v0.AddArg(x) 8498 v.AddArg(v0) 8499 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8500 v2.AuxInt = umagic(64, c).s - 1 8501 v.AddArg(v2) 8502 return true 8503 } 8504 // match: (Div64u x (Const64 [c])) 8505 // cond: umagicOK(64, c) && config.RegSize == 8 && c&1 == 0 8506 // result: (Rsh64Ux64 <typ.UInt64> (Hmul64u <typ.UInt64> (Const64 <typ.UInt64> [int64(1<<63+(umagic(64,c).m+1)/2)]) (Rsh64Ux64 <typ.UInt64> x (Const64 <typ.UInt64> [1]))) (Const64 <typ.UInt64> [umagic(64,c).s-2])) 8507 for { 8508 _ = v.Args[1] 8509 x := v.Args[0] 8510 v_1 := v.Args[1] 8511 if v_1.Op != OpConst64 { 8512 break 8513 } 8514 c := v_1.AuxInt 8515 if !(umagicOK(64, c) && config.RegSize == 8 && c&1 == 0) { 8516 break 8517 } 8518 v.reset(OpRsh64Ux64) 8519 v.Type = typ.UInt64 8520 v0 := b.NewValue0(v.Pos, OpHmul64u, typ.UInt64) 8521 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8522 v1.AuxInt = int64(1<<63 + (umagic(64, c).m+1)/2) 8523 v0.AddArg(v1) 8524 v2 := b.NewValue0(v.Pos, OpRsh64Ux64, typ.UInt64) 8525 v2.AddArg(x) 8526 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8527 v3.AuxInt = 1 8528 v2.AddArg(v3) 8529 v0.AddArg(v2) 8530 v.AddArg(v0) 8531 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8532 v4.AuxInt = umagic(64, c).s - 2 8533 v.AddArg(v4) 8534 return true 8535 } 8536 // match: (Div64u x (Const64 [c])) 8537 // cond: umagicOK(64, c) && config.RegSize == 8 8538 // result: (Rsh64Ux64 <typ.UInt64> (Avg64u x (Hmul64u <typ.UInt64> (Const64 <typ.UInt64> [int64(umagic(64,c).m)]) x)) (Const64 <typ.UInt64> [umagic(64,c).s-1])) 8539 for { 8540 _ = v.Args[1] 8541 x := v.Args[0] 8542 v_1 := v.Args[1] 8543 if v_1.Op != OpConst64 { 8544 break 8545 } 8546 c := v_1.AuxInt 8547 if !(umagicOK(64, c) && config.RegSize == 8) { 8548 break 8549 } 8550 v.reset(OpRsh64Ux64) 8551 v.Type = typ.UInt64 8552 v0 := b.NewValue0(v.Pos, OpAvg64u, typ.UInt64) 8553 v0.AddArg(x) 8554 v1 := b.NewValue0(v.Pos, OpHmul64u, typ.UInt64) 8555 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8556 v2.AuxInt = int64(umagic(64, c).m) 8557 v1.AddArg(v2) 8558 v1.AddArg(x) 8559 v0.AddArg(v1) 8560 v.AddArg(v0) 8561 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8562 v3.AuxInt = umagic(64, c).s - 1 8563 v.AddArg(v3) 8564 return true 8565 } 8566 return false 8567 } 8568 func rewriteValuegeneric_OpDiv8_0(v *Value) bool { 8569 b := v.Block 8570 _ = b 8571 typ := &b.Func.Config.Types 8572 _ = typ 8573 // match: (Div8 (Const8 [c]) (Const8 [d])) 8574 // cond: d != 0 8575 // result: (Const8 [int64(int8(c)/int8(d))]) 8576 for { 8577 _ = v.Args[1] 8578 v_0 := v.Args[0] 8579 if v_0.Op != OpConst8 { 8580 break 8581 } 8582 c := v_0.AuxInt 8583 v_1 := v.Args[1] 8584 if v_1.Op != OpConst8 { 8585 break 8586 } 8587 d := v_1.AuxInt 8588 if !(d != 0) { 8589 break 8590 } 8591 v.reset(OpConst8) 8592 v.AuxInt = int64(int8(c) / int8(d)) 8593 return true 8594 } 8595 // match: (Div8 n (Const8 [c])) 8596 // cond: isNonNegative(n) && isPowerOfTwo(c&0xff) 8597 // result: (Rsh8Ux64 n (Const64 <typ.UInt64> [log2(c&0xff)])) 8598 for { 8599 _ = v.Args[1] 8600 n := v.Args[0] 8601 v_1 := v.Args[1] 8602 if v_1.Op != OpConst8 { 8603 break 8604 } 8605 c := v_1.AuxInt 8606 if !(isNonNegative(n) && isPowerOfTwo(c&0xff)) { 8607 break 8608 } 8609 v.reset(OpRsh8Ux64) 8610 v.AddArg(n) 8611 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8612 v0.AuxInt = log2(c & 0xff) 8613 v.AddArg(v0) 8614 return true 8615 } 8616 // match: (Div8 <t> n (Const8 [c])) 8617 // cond: c < 0 && c != -1<<7 8618 // result: (Neg8 (Div8 <t> n (Const8 <t> [-c]))) 8619 for { 8620 t := v.Type 8621 _ = v.Args[1] 8622 n := v.Args[0] 8623 v_1 := v.Args[1] 8624 if v_1.Op != OpConst8 { 8625 break 8626 } 8627 c := v_1.AuxInt 8628 if !(c < 0 && c != -1<<7) { 8629 break 8630 } 8631 v.reset(OpNeg8) 8632 v0 := b.NewValue0(v.Pos, OpDiv8, t) 8633 v0.AddArg(n) 8634 v1 := b.NewValue0(v.Pos, OpConst8, t) 8635 v1.AuxInt = -c 8636 v0.AddArg(v1) 8637 v.AddArg(v0) 8638 return true 8639 } 8640 // match: (Div8 <t> x (Const8 [-1<<7 ])) 8641 // cond: 8642 // result: (Rsh8Ux64 (And8 <t> x (Neg8 <t> x)) (Const64 <typ.UInt64> [7 ])) 8643 for { 8644 t := v.Type 8645 _ = v.Args[1] 8646 x := v.Args[0] 8647 v_1 := v.Args[1] 8648 if v_1.Op != OpConst8 { 8649 break 8650 } 8651 if v_1.AuxInt != -1<<7 { 8652 break 8653 } 8654 v.reset(OpRsh8Ux64) 8655 v0 := b.NewValue0(v.Pos, OpAnd8, t) 8656 v0.AddArg(x) 8657 v1 := b.NewValue0(v.Pos, OpNeg8, t) 8658 v1.AddArg(x) 8659 v0.AddArg(v1) 8660 v.AddArg(v0) 8661 v2 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8662 v2.AuxInt = 7 8663 v.AddArg(v2) 8664 return true 8665 } 8666 // match: (Div8 <t> n (Const8 [c])) 8667 // cond: isPowerOfTwo(c) 8668 // result: (Rsh8x64 (Add8 <t> n (Rsh8Ux64 <t> (Rsh8x64 <t> n (Const64 <typ.UInt64> [ 7])) (Const64 <typ.UInt64> [ 8-log2(c)]))) (Const64 <typ.UInt64> [log2(c)])) 8669 for { 8670 t := v.Type 8671 _ = v.Args[1] 8672 n := v.Args[0] 8673 v_1 := v.Args[1] 8674 if v_1.Op != OpConst8 { 8675 break 8676 } 8677 c := v_1.AuxInt 8678 if !(isPowerOfTwo(c)) { 8679 break 8680 } 8681 v.reset(OpRsh8x64) 8682 v0 := b.NewValue0(v.Pos, OpAdd8, t) 8683 v0.AddArg(n) 8684 v1 := b.NewValue0(v.Pos, OpRsh8Ux64, t) 8685 v2 := b.NewValue0(v.Pos, OpRsh8x64, t) 8686 v2.AddArg(n) 8687 v3 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8688 v3.AuxInt = 7 8689 v2.AddArg(v3) 8690 v1.AddArg(v2) 8691 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8692 v4.AuxInt = 8 - log2(c) 8693 v1.AddArg(v4) 8694 v0.AddArg(v1) 8695 v.AddArg(v0) 8696 v5 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8697 v5.AuxInt = log2(c) 8698 v.AddArg(v5) 8699 return true 8700 } 8701 // match: (Div8 <t> x (Const8 [c])) 8702 // cond: smagicOK(8,c) 8703 // result: (Sub8 <t> (Rsh32x64 <t> (Mul32 <typ.UInt32> (Const32 <typ.UInt32> [int64(smagic(8,c).m)]) (SignExt8to32 x)) (Const64 <typ.UInt64> [8+smagic(8,c).s])) (Rsh32x64 <t> (SignExt8to32 x) (Const64 <typ.UInt64> [31]))) 8704 for { 8705 t := v.Type 8706 _ = v.Args[1] 8707 x := v.Args[0] 8708 v_1 := v.Args[1] 8709 if v_1.Op != OpConst8 { 8710 break 8711 } 8712 c := v_1.AuxInt 8713 if !(smagicOK(8, c)) { 8714 break 8715 } 8716 v.reset(OpSub8) 8717 v.Type = t 8718 v0 := b.NewValue0(v.Pos, OpRsh32x64, t) 8719 v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) 8720 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 8721 v2.AuxInt = int64(smagic(8, c).m) 8722 v1.AddArg(v2) 8723 v3 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 8724 v3.AddArg(x) 8725 v1.AddArg(v3) 8726 v0.AddArg(v1) 8727 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8728 v4.AuxInt = 8 + smagic(8, c).s 8729 v0.AddArg(v4) 8730 v.AddArg(v0) 8731 v5 := b.NewValue0(v.Pos, OpRsh32x64, t) 8732 v6 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) 8733 v6.AddArg(x) 8734 v5.AddArg(v6) 8735 v7 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8736 v7.AuxInt = 31 8737 v5.AddArg(v7) 8738 v.AddArg(v5) 8739 return true 8740 } 8741 return false 8742 } 8743 func rewriteValuegeneric_OpDiv8u_0(v *Value) bool { 8744 b := v.Block 8745 _ = b 8746 typ := &b.Func.Config.Types 8747 _ = typ 8748 // match: (Div8u (Const8 [c]) (Const8 [d])) 8749 // cond: d != 0 8750 // result: (Const8 [int64(int8(uint8(c)/uint8(d)))]) 8751 for { 8752 _ = v.Args[1] 8753 v_0 := v.Args[0] 8754 if v_0.Op != OpConst8 { 8755 break 8756 } 8757 c := v_0.AuxInt 8758 v_1 := v.Args[1] 8759 if v_1.Op != OpConst8 { 8760 break 8761 } 8762 d := v_1.AuxInt 8763 if !(d != 0) { 8764 break 8765 } 8766 v.reset(OpConst8) 8767 v.AuxInt = int64(int8(uint8(c) / uint8(d))) 8768 return true 8769 } 8770 // match: (Div8u n (Const8 [c])) 8771 // cond: isPowerOfTwo(c&0xff) 8772 // result: (Rsh8Ux64 n (Const64 <typ.UInt64> [log2(c&0xff)])) 8773 for { 8774 _ = v.Args[1] 8775 n := v.Args[0] 8776 v_1 := v.Args[1] 8777 if v_1.Op != OpConst8 { 8778 break 8779 } 8780 c := v_1.AuxInt 8781 if !(isPowerOfTwo(c & 0xff)) { 8782 break 8783 } 8784 v.reset(OpRsh8Ux64) 8785 v.AddArg(n) 8786 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8787 v0.AuxInt = log2(c & 0xff) 8788 v.AddArg(v0) 8789 return true 8790 } 8791 // match: (Div8u x (Const8 [c])) 8792 // cond: umagicOK(8, c) 8793 // result: (Trunc32to8 (Rsh32Ux64 <typ.UInt32> (Mul32 <typ.UInt32> (Const32 <typ.UInt32> [int64(1<<8+umagic(8,c).m)]) (ZeroExt8to32 x)) (Const64 <typ.UInt64> [8+umagic(8,c).s]))) 8794 for { 8795 _ = v.Args[1] 8796 x := v.Args[0] 8797 v_1 := v.Args[1] 8798 if v_1.Op != OpConst8 { 8799 break 8800 } 8801 c := v_1.AuxInt 8802 if !(umagicOK(8, c)) { 8803 break 8804 } 8805 v.reset(OpTrunc32to8) 8806 v0 := b.NewValue0(v.Pos, OpRsh32Ux64, typ.UInt32) 8807 v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) 8808 v2 := b.NewValue0(v.Pos, OpConst32, typ.UInt32) 8809 v2.AuxInt = int64(1<<8 + umagic(8, c).m) 8810 v1.AddArg(v2) 8811 v3 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) 8812 v3.AddArg(x) 8813 v1.AddArg(v3) 8814 v0.AddArg(v1) 8815 v4 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 8816 v4.AuxInt = 8 + umagic(8, c).s 8817 v0.AddArg(v4) 8818 v.AddArg(v0) 8819 return true 8820 } 8821 return false 8822 } 8823 func rewriteValuegeneric_OpEq16_0(v *Value) bool { 8824 b := v.Block 8825 _ = b 8826 // match: (Eq16 x x) 8827 // cond: 8828 // result: (ConstBool [1]) 8829 for { 8830 _ = v.Args[1] 8831 x := v.Args[0] 8832 if x != v.Args[1] { 8833 break 8834 } 8835 v.reset(OpConstBool) 8836 v.AuxInt = 1 8837 return true 8838 } 8839 // match: (Eq16 (Const16 <t> [c]) (Add16 (Const16 <t> [d]) x)) 8840 // cond: 8841 // result: (Eq16 (Const16 <t> [int64(int16(c-d))]) x) 8842 for { 8843 _ = v.Args[1] 8844 v_0 := v.Args[0] 8845 if v_0.Op != OpConst16 { 8846 break 8847 } 8848 t := v_0.Type 8849 c := v_0.AuxInt 8850 v_1 := v.Args[1] 8851 if v_1.Op != OpAdd16 { 8852 break 8853 } 8854 _ = v_1.Args[1] 8855 v_1_0 := v_1.Args[0] 8856 if v_1_0.Op != OpConst16 { 8857 break 8858 } 8859 if v_1_0.Type != t { 8860 break 8861 } 8862 d := v_1_0.AuxInt 8863 x := v_1.Args[1] 8864 v.reset(OpEq16) 8865 v0 := b.NewValue0(v.Pos, OpConst16, t) 8866 v0.AuxInt = int64(int16(c - d)) 8867 v.AddArg(v0) 8868 v.AddArg(x) 8869 return true 8870 } 8871 // match: (Eq16 (Const16 <t> [c]) (Add16 x (Const16 <t> [d]))) 8872 // cond: 8873 // result: (Eq16 (Const16 <t> [int64(int16(c-d))]) x) 8874 for { 8875 _ = v.Args[1] 8876 v_0 := v.Args[0] 8877 if v_0.Op != OpConst16 { 8878 break 8879 } 8880 t := v_0.Type 8881 c := v_0.AuxInt 8882 v_1 := v.Args[1] 8883 if v_1.Op != OpAdd16 { 8884 break 8885 } 8886 _ = v_1.Args[1] 8887 x := v_1.Args[0] 8888 v_1_1 := v_1.Args[1] 8889 if v_1_1.Op != OpConst16 { 8890 break 8891 } 8892 if v_1_1.Type != t { 8893 break 8894 } 8895 d := v_1_1.AuxInt 8896 v.reset(OpEq16) 8897 v0 := b.NewValue0(v.Pos, OpConst16, t) 8898 v0.AuxInt = int64(int16(c - d)) 8899 v.AddArg(v0) 8900 v.AddArg(x) 8901 return true 8902 } 8903 // match: (Eq16 (Add16 (Const16 <t> [d]) x) (Const16 <t> [c])) 8904 // cond: 8905 // result: (Eq16 (Const16 <t> [int64(int16(c-d))]) x) 8906 for { 8907 _ = v.Args[1] 8908 v_0 := v.Args[0] 8909 if v_0.Op != OpAdd16 { 8910 break 8911 } 8912 _ = v_0.Args[1] 8913 v_0_0 := v_0.Args[0] 8914 if v_0_0.Op != OpConst16 { 8915 break 8916 } 8917 t := v_0_0.Type 8918 d := v_0_0.AuxInt 8919 x := v_0.Args[1] 8920 v_1 := v.Args[1] 8921 if v_1.Op != OpConst16 { 8922 break 8923 } 8924 if v_1.Type != t { 8925 break 8926 } 8927 c := v_1.AuxInt 8928 v.reset(OpEq16) 8929 v0 := b.NewValue0(v.Pos, OpConst16, t) 8930 v0.AuxInt = int64(int16(c - d)) 8931 v.AddArg(v0) 8932 v.AddArg(x) 8933 return true 8934 } 8935 // match: (Eq16 (Add16 x (Const16 <t> [d])) (Const16 <t> [c])) 8936 // cond: 8937 // result: (Eq16 (Const16 <t> [int64(int16(c-d))]) x) 8938 for { 8939 _ = v.Args[1] 8940 v_0 := v.Args[0] 8941 if v_0.Op != OpAdd16 { 8942 break 8943 } 8944 _ = v_0.Args[1] 8945 x := v_0.Args[0] 8946 v_0_1 := v_0.Args[1] 8947 if v_0_1.Op != OpConst16 { 8948 break 8949 } 8950 t := v_0_1.Type 8951 d := v_0_1.AuxInt 8952 v_1 := v.Args[1] 8953 if v_1.Op != OpConst16 { 8954 break 8955 } 8956 if v_1.Type != t { 8957 break 8958 } 8959 c := v_1.AuxInt 8960 v.reset(OpEq16) 8961 v0 := b.NewValue0(v.Pos, OpConst16, t) 8962 v0.AuxInt = int64(int16(c - d)) 8963 v.AddArg(v0) 8964 v.AddArg(x) 8965 return true 8966 } 8967 // match: (Eq16 (Const16 [c]) (Const16 [d])) 8968 // cond: 8969 // result: (ConstBool [b2i(c == d)]) 8970 for { 8971 _ = v.Args[1] 8972 v_0 := v.Args[0] 8973 if v_0.Op != OpConst16 { 8974 break 8975 } 8976 c := v_0.AuxInt 8977 v_1 := v.Args[1] 8978 if v_1.Op != OpConst16 { 8979 break 8980 } 8981 d := v_1.AuxInt 8982 v.reset(OpConstBool) 8983 v.AuxInt = b2i(c == d) 8984 return true 8985 } 8986 // match: (Eq16 (Const16 [d]) (Const16 [c])) 8987 // cond: 8988 // result: (ConstBool [b2i(c == d)]) 8989 for { 8990 _ = v.Args[1] 8991 v_0 := v.Args[0] 8992 if v_0.Op != OpConst16 { 8993 break 8994 } 8995 d := v_0.AuxInt 8996 v_1 := v.Args[1] 8997 if v_1.Op != OpConst16 { 8998 break 8999 } 9000 c := v_1.AuxInt 9001 v.reset(OpConstBool) 9002 v.AuxInt = b2i(c == d) 9003 return true 9004 } 9005 return false 9006 } 9007 func rewriteValuegeneric_OpEq32_0(v *Value) bool { 9008 b := v.Block 9009 _ = b 9010 // match: (Eq32 x x) 9011 // cond: 9012 // result: (ConstBool [1]) 9013 for { 9014 _ = v.Args[1] 9015 x := v.Args[0] 9016 if x != v.Args[1] { 9017 break 9018 } 9019 v.reset(OpConstBool) 9020 v.AuxInt = 1 9021 return true 9022 } 9023 // match: (Eq32 (Const32 <t> [c]) (Add32 (Const32 <t> [d]) x)) 9024 // cond: 9025 // result: (Eq32 (Const32 <t> [int64(int32(c-d))]) x) 9026 for { 9027 _ = v.Args[1] 9028 v_0 := v.Args[0] 9029 if v_0.Op != OpConst32 { 9030 break 9031 } 9032 t := v_0.Type 9033 c := v_0.AuxInt 9034 v_1 := v.Args[1] 9035 if v_1.Op != OpAdd32 { 9036 break 9037 } 9038 _ = v_1.Args[1] 9039 v_1_0 := v_1.Args[0] 9040 if v_1_0.Op != OpConst32 { 9041 break 9042 } 9043 if v_1_0.Type != t { 9044 break 9045 } 9046 d := v_1_0.AuxInt 9047 x := v_1.Args[1] 9048 v.reset(OpEq32) 9049 v0 := b.NewValue0(v.Pos, OpConst32, t) 9050 v0.AuxInt = int64(int32(c - d)) 9051 v.AddArg(v0) 9052 v.AddArg(x) 9053 return true 9054 } 9055 // match: (Eq32 (Const32 <t> [c]) (Add32 x (Const32 <t> [d]))) 9056 // cond: 9057 // result: (Eq32 (Const32 <t> [int64(int32(c-d))]) x) 9058 for { 9059 _ = v.Args[1] 9060 v_0 := v.Args[0] 9061 if v_0.Op != OpConst32 { 9062 break 9063 } 9064 t := v_0.Type 9065 c := v_0.AuxInt 9066 v_1 := v.Args[1] 9067 if v_1.Op != OpAdd32 { 9068 break 9069 } 9070 _ = v_1.Args[1] 9071 x := v_1.Args[0] 9072 v_1_1 := v_1.Args[1] 9073 if v_1_1.Op != OpConst32 { 9074 break 9075 } 9076 if v_1_1.Type != t { 9077 break 9078 } 9079 d := v_1_1.AuxInt 9080 v.reset(OpEq32) 9081 v0 := b.NewValue0(v.Pos, OpConst32, t) 9082 v0.AuxInt = int64(int32(c - d)) 9083 v.AddArg(v0) 9084 v.AddArg(x) 9085 return true 9086 } 9087 // match: (Eq32 (Add32 (Const32 <t> [d]) x) (Const32 <t> [c])) 9088 // cond: 9089 // result: (Eq32 (Const32 <t> [int64(int32(c-d))]) x) 9090 for { 9091 _ = v.Args[1] 9092 v_0 := v.Args[0] 9093 if v_0.Op != OpAdd32 { 9094 break 9095 } 9096 _ = v_0.Args[1] 9097 v_0_0 := v_0.Args[0] 9098 if v_0_0.Op != OpConst32 { 9099 break 9100 } 9101 t := v_0_0.Type 9102 d := v_0_0.AuxInt 9103 x := v_0.Args[1] 9104 v_1 := v.Args[1] 9105 if v_1.Op != OpConst32 { 9106 break 9107 } 9108 if v_1.Type != t { 9109 break 9110 } 9111 c := v_1.AuxInt 9112 v.reset(OpEq32) 9113 v0 := b.NewValue0(v.Pos, OpConst32, t) 9114 v0.AuxInt = int64(int32(c - d)) 9115 v.AddArg(v0) 9116 v.AddArg(x) 9117 return true 9118 } 9119 // match: (Eq32 (Add32 x (Const32 <t> [d])) (Const32 <t> [c])) 9120 // cond: 9121 // result: (Eq32 (Const32 <t> [int64(int32(c-d))]) x) 9122 for { 9123 _ = v.Args[1] 9124 v_0 := v.Args[0] 9125 if v_0.Op != OpAdd32 { 9126 break 9127 } 9128 _ = v_0.Args[1] 9129 x := v_0.Args[0] 9130 v_0_1 := v_0.Args[1] 9131 if v_0_1.Op != OpConst32 { 9132 break 9133 } 9134 t := v_0_1.Type 9135 d := v_0_1.AuxInt 9136 v_1 := v.Args[1] 9137 if v_1.Op != OpConst32 { 9138 break 9139 } 9140 if v_1.Type != t { 9141 break 9142 } 9143 c := v_1.AuxInt 9144 v.reset(OpEq32) 9145 v0 := b.NewValue0(v.Pos, OpConst32, t) 9146 v0.AuxInt = int64(int32(c - d)) 9147 v.AddArg(v0) 9148 v.AddArg(x) 9149 return true 9150 } 9151 // match: (Eq32 (Const32 [c]) (Const32 [d])) 9152 // cond: 9153 // result: (ConstBool [b2i(c == d)]) 9154 for { 9155 _ = v.Args[1] 9156 v_0 := v.Args[0] 9157 if v_0.Op != OpConst32 { 9158 break 9159 } 9160 c := v_0.AuxInt 9161 v_1 := v.Args[1] 9162 if v_1.Op != OpConst32 { 9163 break 9164 } 9165 d := v_1.AuxInt 9166 v.reset(OpConstBool) 9167 v.AuxInt = b2i(c == d) 9168 return true 9169 } 9170 // match: (Eq32 (Const32 [d]) (Const32 [c])) 9171 // cond: 9172 // result: (ConstBool [b2i(c == d)]) 9173 for { 9174 _ = v.Args[1] 9175 v_0 := v.Args[0] 9176 if v_0.Op != OpConst32 { 9177 break 9178 } 9179 d := v_0.AuxInt 9180 v_1 := v.Args[1] 9181 if v_1.Op != OpConst32 { 9182 break 9183 } 9184 c := v_1.AuxInt 9185 v.reset(OpConstBool) 9186 v.AuxInt = b2i(c == d) 9187 return true 9188 } 9189 return false 9190 } 9191 func rewriteValuegeneric_OpEq32F_0(v *Value) bool { 9192 // match: (Eq32F (Const32F [c]) (Const32F [d])) 9193 // cond: 9194 // result: (ConstBool [b2i(i2f(c) == i2f(d))]) 9195 for { 9196 _ = v.Args[1] 9197 v_0 := v.Args[0] 9198 if v_0.Op != OpConst32F { 9199 break 9200 } 9201 c := v_0.AuxInt 9202 v_1 := v.Args[1] 9203 if v_1.Op != OpConst32F { 9204 break 9205 } 9206 d := v_1.AuxInt 9207 v.reset(OpConstBool) 9208 v.AuxInt = b2i(i2f(c) == i2f(d)) 9209 return true 9210 } 9211 // match: (Eq32F (Const32F [d]) (Const32F [c])) 9212 // cond: 9213 // result: (ConstBool [b2i(i2f(c) == i2f(d))]) 9214 for { 9215 _ = v.Args[1] 9216 v_0 := v.Args[0] 9217 if v_0.Op != OpConst32F { 9218 break 9219 } 9220 d := v_0.AuxInt 9221 v_1 := v.Args[1] 9222 if v_1.Op != OpConst32F { 9223 break 9224 } 9225 c := v_1.AuxInt 9226 v.reset(OpConstBool) 9227 v.AuxInt = b2i(i2f(c) == i2f(d)) 9228 return true 9229 } 9230 return false 9231 } 9232 func rewriteValuegeneric_OpEq64_0(v *Value) bool { 9233 b := v.Block 9234 _ = b 9235 // match: (Eq64 x x) 9236 // cond: 9237 // result: (ConstBool [1]) 9238 for { 9239 _ = v.Args[1] 9240 x := v.Args[0] 9241 if x != v.Args[1] { 9242 break 9243 } 9244 v.reset(OpConstBool) 9245 v.AuxInt = 1 9246 return true 9247 } 9248 // match: (Eq64 (Const64 <t> [c]) (Add64 (Const64 <t> [d]) x)) 9249 // cond: 9250 // result: (Eq64 (Const64 <t> [c-d]) x) 9251 for { 9252 _ = v.Args[1] 9253 v_0 := v.Args[0] 9254 if v_0.Op != OpConst64 { 9255 break 9256 } 9257 t := v_0.Type 9258 c := v_0.AuxInt 9259 v_1 := v.Args[1] 9260 if v_1.Op != OpAdd64 { 9261 break 9262 } 9263 _ = v_1.Args[1] 9264 v_1_0 := v_1.Args[0] 9265 if v_1_0.Op != OpConst64 { 9266 break 9267 } 9268 if v_1_0.Type != t { 9269 break 9270 } 9271 d := v_1_0.AuxInt 9272 x := v_1.Args[1] 9273 v.reset(OpEq64) 9274 v0 := b.NewValue0(v.Pos, OpConst64, t) 9275 v0.AuxInt = c - d 9276 v.AddArg(v0) 9277 v.AddArg(x) 9278 return true 9279 } 9280 // match: (Eq64 (Const64 <t> [c]) (Add64 x (Const64 <t> [d]))) 9281 // cond: 9282 // result: (Eq64 (Const64 <t> [c-d]) x) 9283 for { 9284 _ = v.Args[1] 9285 v_0 := v.Args[0] 9286 if v_0.Op != OpConst64 { 9287 break 9288 } 9289 t := v_0.Type 9290 c := v_0.AuxInt 9291 v_1 := v.Args[1] 9292 if v_1.Op != OpAdd64 { 9293 break 9294 } 9295 _ = v_1.Args[1] 9296 x := v_1.Args[0] 9297 v_1_1 := v_1.Args[1] 9298 if v_1_1.Op != OpConst64 { 9299 break 9300 } 9301 if v_1_1.Type != t { 9302 break 9303 } 9304 d := v_1_1.AuxInt 9305 v.reset(OpEq64) 9306 v0 := b.NewValue0(v.Pos, OpConst64, t) 9307 v0.AuxInt = c - d 9308 v.AddArg(v0) 9309 v.AddArg(x) 9310 return true 9311 } 9312 // match: (Eq64 (Add64 (Const64 <t> [d]) x) (Const64 <t> [c])) 9313 // cond: 9314 // result: (Eq64 (Const64 <t> [c-d]) x) 9315 for { 9316 _ = v.Args[1] 9317 v_0 := v.Args[0] 9318 if v_0.Op != OpAdd64 { 9319 break 9320 } 9321 _ = v_0.Args[1] 9322 v_0_0 := v_0.Args[0] 9323 if v_0_0.Op != OpConst64 { 9324 break 9325 } 9326 t := v_0_0.Type 9327 d := v_0_0.AuxInt 9328 x := v_0.Args[1] 9329 v_1 := v.Args[1] 9330 if v_1.Op != OpConst64 { 9331 break 9332 } 9333 if v_1.Type != t { 9334 break 9335 } 9336 c := v_1.AuxInt 9337 v.reset(OpEq64) 9338 v0 := b.NewValue0(v.Pos, OpConst64, t) 9339 v0.AuxInt = c - d 9340 v.AddArg(v0) 9341 v.AddArg(x) 9342 return true 9343 } 9344 // match: (Eq64 (Add64 x (Const64 <t> [d])) (Const64 <t> [c])) 9345 // cond: 9346 // result: (Eq64 (Const64 <t> [c-d]) x) 9347 for { 9348 _ = v.Args[1] 9349 v_0 := v.Args[0] 9350 if v_0.Op != OpAdd64 { 9351 break 9352 } 9353 _ = v_0.Args[1] 9354 x := v_0.Args[0] 9355 v_0_1 := v_0.Args[1] 9356 if v_0_1.Op != OpConst64 { 9357 break 9358 } 9359 t := v_0_1.Type 9360 d := v_0_1.AuxInt 9361 v_1 := v.Args[1] 9362 if v_1.Op != OpConst64 { 9363 break 9364 } 9365 if v_1.Type != t { 9366 break 9367 } 9368 c := v_1.AuxInt 9369 v.reset(OpEq64) 9370 v0 := b.NewValue0(v.Pos, OpConst64, t) 9371 v0.AuxInt = c - d 9372 v.AddArg(v0) 9373 v.AddArg(x) 9374 return true 9375 } 9376 // match: (Eq64 (Const64 [c]) (Const64 [d])) 9377 // cond: 9378 // result: (ConstBool [b2i(c == d)]) 9379 for { 9380 _ = v.Args[1] 9381 v_0 := v.Args[0] 9382 if v_0.Op != OpConst64 { 9383 break 9384 } 9385 c := v_0.AuxInt 9386 v_1 := v.Args[1] 9387 if v_1.Op != OpConst64 { 9388 break 9389 } 9390 d := v_1.AuxInt 9391 v.reset(OpConstBool) 9392 v.AuxInt = b2i(c == d) 9393 return true 9394 } 9395 // match: (Eq64 (Const64 [d]) (Const64 [c])) 9396 // cond: 9397 // result: (ConstBool [b2i(c == d)]) 9398 for { 9399 _ = v.Args[1] 9400 v_0 := v.Args[0] 9401 if v_0.Op != OpConst64 { 9402 break 9403 } 9404 d := v_0.AuxInt 9405 v_1 := v.Args[1] 9406 if v_1.Op != OpConst64 { 9407 break 9408 } 9409 c := v_1.AuxInt 9410 v.reset(OpConstBool) 9411 v.AuxInt = b2i(c == d) 9412 return true 9413 } 9414 return false 9415 } 9416 func rewriteValuegeneric_OpEq64F_0(v *Value) bool { 9417 // match: (Eq64F (Const64F [c]) (Const64F [d])) 9418 // cond: 9419 // result: (ConstBool [b2i(i2f(c) == i2f(d))]) 9420 for { 9421 _ = v.Args[1] 9422 v_0 := v.Args[0] 9423 if v_0.Op != OpConst64F { 9424 break 9425 } 9426 c := v_0.AuxInt 9427 v_1 := v.Args[1] 9428 if v_1.Op != OpConst64F { 9429 break 9430 } 9431 d := v_1.AuxInt 9432 v.reset(OpConstBool) 9433 v.AuxInt = b2i(i2f(c) == i2f(d)) 9434 return true 9435 } 9436 // match: (Eq64F (Const64F [d]) (Const64F [c])) 9437 // cond: 9438 // result: (ConstBool [b2i(i2f(c) == i2f(d))]) 9439 for { 9440 _ = v.Args[1] 9441 v_0 := v.Args[0] 9442 if v_0.Op != OpConst64F { 9443 break 9444 } 9445 d := v_0.AuxInt 9446 v_1 := v.Args[1] 9447 if v_1.Op != OpConst64F { 9448 break 9449 } 9450 c := v_1.AuxInt 9451 v.reset(OpConstBool) 9452 v.AuxInt = b2i(i2f(c) == i2f(d)) 9453 return true 9454 } 9455 return false 9456 } 9457 func rewriteValuegeneric_OpEq8_0(v *Value) bool { 9458 b := v.Block 9459 _ = b 9460 // match: (Eq8 x x) 9461 // cond: 9462 // result: (ConstBool [1]) 9463 for { 9464 _ = v.Args[1] 9465 x := v.Args[0] 9466 if x != v.Args[1] { 9467 break 9468 } 9469 v.reset(OpConstBool) 9470 v.AuxInt = 1 9471 return true 9472 } 9473 // match: (Eq8 (Const8 <t> [c]) (Add8 (Const8 <t> [d]) x)) 9474 // cond: 9475 // result: (Eq8 (Const8 <t> [int64(int8(c-d))]) x) 9476 for { 9477 _ = v.Args[1] 9478 v_0 := v.Args[0] 9479 if v_0.Op != OpConst8 { 9480 break 9481 } 9482 t := v_0.Type 9483 c := v_0.AuxInt 9484 v_1 := v.Args[1] 9485 if v_1.Op != OpAdd8 { 9486 break 9487 } 9488 _ = v_1.Args[1] 9489 v_1_0 := v_1.Args[0] 9490 if v_1_0.Op != OpConst8 { 9491 break 9492 } 9493 if v_1_0.Type != t { 9494 break 9495 } 9496 d := v_1_0.AuxInt 9497 x := v_1.Args[1] 9498 v.reset(OpEq8) 9499 v0 := b.NewValue0(v.Pos, OpConst8, t) 9500 v0.AuxInt = int64(int8(c - d)) 9501 v.AddArg(v0) 9502 v.AddArg(x) 9503 return true 9504 } 9505 // match: (Eq8 (Const8 <t> [c]) (Add8 x (Const8 <t> [d]))) 9506 // cond: 9507 // result: (Eq8 (Const8 <t> [int64(int8(c-d))]) x) 9508 for { 9509 _ = v.Args[1] 9510 v_0 := v.Args[0] 9511 if v_0.Op != OpConst8 { 9512 break 9513 } 9514 t := v_0.Type 9515 c := v_0.AuxInt 9516 v_1 := v.Args[1] 9517 if v_1.Op != OpAdd8 { 9518 break 9519 } 9520 _ = v_1.Args[1] 9521 x := v_1.Args[0] 9522 v_1_1 := v_1.Args[1] 9523 if v_1_1.Op != OpConst8 { 9524 break 9525 } 9526 if v_1_1.Type != t { 9527 break 9528 } 9529 d := v_1_1.AuxInt 9530 v.reset(OpEq8) 9531 v0 := b.NewValue0(v.Pos, OpConst8, t) 9532 v0.AuxInt = int64(int8(c - d)) 9533 v.AddArg(v0) 9534 v.AddArg(x) 9535 return true 9536 } 9537 // match: (Eq8 (Add8 (Const8 <t> [d]) x) (Const8 <t> [c])) 9538 // cond: 9539 // result: (Eq8 (Const8 <t> [int64(int8(c-d))]) x) 9540 for { 9541 _ = v.Args[1] 9542 v_0 := v.Args[0] 9543 if v_0.Op != OpAdd8 { 9544 break 9545 } 9546 _ = v_0.Args[1] 9547 v_0_0 := v_0.Args[0] 9548 if v_0_0.Op != OpConst8 { 9549 break 9550 } 9551 t := v_0_0.Type 9552 d := v_0_0.AuxInt 9553 x := v_0.Args[1] 9554 v_1 := v.Args[1] 9555 if v_1.Op != OpConst8 { 9556 break 9557 } 9558 if v_1.Type != t { 9559 break 9560 } 9561 c := v_1.AuxInt 9562 v.reset(OpEq8) 9563 v0 := b.NewValue0(v.Pos, OpConst8, t) 9564 v0.AuxInt = int64(int8(c - d)) 9565 v.AddArg(v0) 9566 v.AddArg(x) 9567 return true 9568 } 9569 // match: (Eq8 (Add8 x (Const8 <t> [d])) (Const8 <t> [c])) 9570 // cond: 9571 // result: (Eq8 (Const8 <t> [int64(int8(c-d))]) x) 9572 for { 9573 _ = v.Args[1] 9574 v_0 := v.Args[0] 9575 if v_0.Op != OpAdd8 { 9576 break 9577 } 9578 _ = v_0.Args[1] 9579 x := v_0.Args[0] 9580 v_0_1 := v_0.Args[1] 9581 if v_0_1.Op != OpConst8 { 9582 break 9583 } 9584 t := v_0_1.Type 9585 d := v_0_1.AuxInt 9586 v_1 := v.Args[1] 9587 if v_1.Op != OpConst8 { 9588 break 9589 } 9590 if v_1.Type != t { 9591 break 9592 } 9593 c := v_1.AuxInt 9594 v.reset(OpEq8) 9595 v0 := b.NewValue0(v.Pos, OpConst8, t) 9596 v0.AuxInt = int64(int8(c - d)) 9597 v.AddArg(v0) 9598 v.AddArg(x) 9599 return true 9600 } 9601 // match: (Eq8 (Const8 [c]) (Const8 [d])) 9602 // cond: 9603 // result: (ConstBool [b2i(c == d)]) 9604 for { 9605 _ = v.Args[1] 9606 v_0 := v.Args[0] 9607 if v_0.Op != OpConst8 { 9608 break 9609 } 9610 c := v_0.AuxInt 9611 v_1 := v.Args[1] 9612 if v_1.Op != OpConst8 { 9613 break 9614 } 9615 d := v_1.AuxInt 9616 v.reset(OpConstBool) 9617 v.AuxInt = b2i(c == d) 9618 return true 9619 } 9620 // match: (Eq8 (Const8 [d]) (Const8 [c])) 9621 // cond: 9622 // result: (ConstBool [b2i(c == d)]) 9623 for { 9624 _ = v.Args[1] 9625 v_0 := v.Args[0] 9626 if v_0.Op != OpConst8 { 9627 break 9628 } 9629 d := v_0.AuxInt 9630 v_1 := v.Args[1] 9631 if v_1.Op != OpConst8 { 9632 break 9633 } 9634 c := v_1.AuxInt 9635 v.reset(OpConstBool) 9636 v.AuxInt = b2i(c == d) 9637 return true 9638 } 9639 return false 9640 } 9641 func rewriteValuegeneric_OpEqB_0(v *Value) bool { 9642 // match: (EqB (ConstBool [c]) (ConstBool [d])) 9643 // cond: 9644 // result: (ConstBool [b2i(c == d)]) 9645 for { 9646 _ = v.Args[1] 9647 v_0 := v.Args[0] 9648 if v_0.Op != OpConstBool { 9649 break 9650 } 9651 c := v_0.AuxInt 9652 v_1 := v.Args[1] 9653 if v_1.Op != OpConstBool { 9654 break 9655 } 9656 d := v_1.AuxInt 9657 v.reset(OpConstBool) 9658 v.AuxInt = b2i(c == d) 9659 return true 9660 } 9661 // match: (EqB (ConstBool [d]) (ConstBool [c])) 9662 // cond: 9663 // result: (ConstBool [b2i(c == d)]) 9664 for { 9665 _ = v.Args[1] 9666 v_0 := v.Args[0] 9667 if v_0.Op != OpConstBool { 9668 break 9669 } 9670 d := v_0.AuxInt 9671 v_1 := v.Args[1] 9672 if v_1.Op != OpConstBool { 9673 break 9674 } 9675 c := v_1.AuxInt 9676 v.reset(OpConstBool) 9677 v.AuxInt = b2i(c == d) 9678 return true 9679 } 9680 // match: (EqB (ConstBool [0]) x) 9681 // cond: 9682 // result: (Not x) 9683 for { 9684 _ = v.Args[1] 9685 v_0 := v.Args[0] 9686 if v_0.Op != OpConstBool { 9687 break 9688 } 9689 if v_0.AuxInt != 0 { 9690 break 9691 } 9692 x := v.Args[1] 9693 v.reset(OpNot) 9694 v.AddArg(x) 9695 return true 9696 } 9697 // match: (EqB x (ConstBool [0])) 9698 // cond: 9699 // result: (Not x) 9700 for { 9701 _ = v.Args[1] 9702 x := v.Args[0] 9703 v_1 := v.Args[1] 9704 if v_1.Op != OpConstBool { 9705 break 9706 } 9707 if v_1.AuxInt != 0 { 9708 break 9709 } 9710 v.reset(OpNot) 9711 v.AddArg(x) 9712 return true 9713 } 9714 // match: (EqB (ConstBool [1]) x) 9715 // cond: 9716 // result: x 9717 for { 9718 _ = v.Args[1] 9719 v_0 := v.Args[0] 9720 if v_0.Op != OpConstBool { 9721 break 9722 } 9723 if v_0.AuxInt != 1 { 9724 break 9725 } 9726 x := v.Args[1] 9727 v.reset(OpCopy) 9728 v.Type = x.Type 9729 v.AddArg(x) 9730 return true 9731 } 9732 // match: (EqB x (ConstBool [1])) 9733 // cond: 9734 // result: x 9735 for { 9736 _ = v.Args[1] 9737 x := v.Args[0] 9738 v_1 := v.Args[1] 9739 if v_1.Op != OpConstBool { 9740 break 9741 } 9742 if v_1.AuxInt != 1 { 9743 break 9744 } 9745 v.reset(OpCopy) 9746 v.Type = x.Type 9747 v.AddArg(x) 9748 return true 9749 } 9750 return false 9751 } 9752 func rewriteValuegeneric_OpEqInter_0(v *Value) bool { 9753 b := v.Block 9754 _ = b 9755 typ := &b.Func.Config.Types 9756 _ = typ 9757 // match: (EqInter x y) 9758 // cond: 9759 // result: (EqPtr (ITab x) (ITab y)) 9760 for { 9761 _ = v.Args[1] 9762 x := v.Args[0] 9763 y := v.Args[1] 9764 v.reset(OpEqPtr) 9765 v0 := b.NewValue0(v.Pos, OpITab, typ.BytePtr) 9766 v0.AddArg(x) 9767 v.AddArg(v0) 9768 v1 := b.NewValue0(v.Pos, OpITab, typ.BytePtr) 9769 v1.AddArg(y) 9770 v.AddArg(v1) 9771 return true 9772 } 9773 } 9774 func rewriteValuegeneric_OpEqPtr_0(v *Value) bool { 9775 b := v.Block 9776 _ = b 9777 typ := &b.Func.Config.Types 9778 _ = typ 9779 // match: (EqPtr p (ConstNil)) 9780 // cond: 9781 // result: (Not (IsNonNil p)) 9782 for { 9783 _ = v.Args[1] 9784 p := v.Args[0] 9785 v_1 := v.Args[1] 9786 if v_1.Op != OpConstNil { 9787 break 9788 } 9789 v.reset(OpNot) 9790 v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool) 9791 v0.AddArg(p) 9792 v.AddArg(v0) 9793 return true 9794 } 9795 // match: (EqPtr (ConstNil) p) 9796 // cond: 9797 // result: (Not (IsNonNil p)) 9798 for { 9799 _ = v.Args[1] 9800 v_0 := v.Args[0] 9801 if v_0.Op != OpConstNil { 9802 break 9803 } 9804 p := v.Args[1] 9805 v.reset(OpNot) 9806 v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool) 9807 v0.AddArg(p) 9808 v.AddArg(v0) 9809 return true 9810 } 9811 // match: (EqPtr x x) 9812 // cond: 9813 // result: (ConstBool [1]) 9814 for { 9815 _ = v.Args[1] 9816 x := v.Args[0] 9817 if x != v.Args[1] { 9818 break 9819 } 9820 v.reset(OpConstBool) 9821 v.AuxInt = 1 9822 return true 9823 } 9824 // match: (EqPtr (Addr {a} x) (Addr {b} x)) 9825 // cond: 9826 // result: (ConstBool [b2i(a == b)]) 9827 for { 9828 _ = v.Args[1] 9829 v_0 := v.Args[0] 9830 if v_0.Op != OpAddr { 9831 break 9832 } 9833 a := v_0.Aux 9834 x := v_0.Args[0] 9835 v_1 := v.Args[1] 9836 if v_1.Op != OpAddr { 9837 break 9838 } 9839 b := v_1.Aux 9840 if x != v_1.Args[0] { 9841 break 9842 } 9843 v.reset(OpConstBool) 9844 v.AuxInt = b2i(a == b) 9845 return true 9846 } 9847 // match: (EqPtr (Addr {b} x) (Addr {a} x)) 9848 // cond: 9849 // result: (ConstBool [b2i(a == b)]) 9850 for { 9851 _ = v.Args[1] 9852 v_0 := v.Args[0] 9853 if v_0.Op != OpAddr { 9854 break 9855 } 9856 b := v_0.Aux 9857 x := v_0.Args[0] 9858 v_1 := v.Args[1] 9859 if v_1.Op != OpAddr { 9860 break 9861 } 9862 a := v_1.Aux 9863 if x != v_1.Args[0] { 9864 break 9865 } 9866 v.reset(OpConstBool) 9867 v.AuxInt = b2i(a == b) 9868 return true 9869 } 9870 return false 9871 } 9872 func rewriteValuegeneric_OpEqSlice_0(v *Value) bool { 9873 b := v.Block 9874 _ = b 9875 typ := &b.Func.Config.Types 9876 _ = typ 9877 // match: (EqSlice x y) 9878 // cond: 9879 // result: (EqPtr (SlicePtr x) (SlicePtr y)) 9880 for { 9881 _ = v.Args[1] 9882 x := v.Args[0] 9883 y := v.Args[1] 9884 v.reset(OpEqPtr) 9885 v0 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr) 9886 v0.AddArg(x) 9887 v.AddArg(v0) 9888 v1 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr) 9889 v1.AddArg(y) 9890 v.AddArg(v1) 9891 return true 9892 } 9893 } 9894 func rewriteValuegeneric_OpGeq16_0(v *Value) bool { 9895 // match: (Geq16 (Const16 [c]) (Const16 [d])) 9896 // cond: 9897 // result: (ConstBool [b2i(c >= d)]) 9898 for { 9899 _ = v.Args[1] 9900 v_0 := v.Args[0] 9901 if v_0.Op != OpConst16 { 9902 break 9903 } 9904 c := v_0.AuxInt 9905 v_1 := v.Args[1] 9906 if v_1.Op != OpConst16 { 9907 break 9908 } 9909 d := v_1.AuxInt 9910 v.reset(OpConstBool) 9911 v.AuxInt = b2i(c >= d) 9912 return true 9913 } 9914 return false 9915 } 9916 func rewriteValuegeneric_OpGeq16U_0(v *Value) bool { 9917 // match: (Geq16U (Const16 [c]) (Const16 [d])) 9918 // cond: 9919 // result: (ConstBool [b2i(uint16(c) >= uint16(d))]) 9920 for { 9921 _ = v.Args[1] 9922 v_0 := v.Args[0] 9923 if v_0.Op != OpConst16 { 9924 break 9925 } 9926 c := v_0.AuxInt 9927 v_1 := v.Args[1] 9928 if v_1.Op != OpConst16 { 9929 break 9930 } 9931 d := v_1.AuxInt 9932 v.reset(OpConstBool) 9933 v.AuxInt = b2i(uint16(c) >= uint16(d)) 9934 return true 9935 } 9936 return false 9937 } 9938 func rewriteValuegeneric_OpGeq32_0(v *Value) bool { 9939 // match: (Geq32 (Const32 [c]) (Const32 [d])) 9940 // cond: 9941 // result: (ConstBool [b2i(c >= d)]) 9942 for { 9943 _ = v.Args[1] 9944 v_0 := v.Args[0] 9945 if v_0.Op != OpConst32 { 9946 break 9947 } 9948 c := v_0.AuxInt 9949 v_1 := v.Args[1] 9950 if v_1.Op != OpConst32 { 9951 break 9952 } 9953 d := v_1.AuxInt 9954 v.reset(OpConstBool) 9955 v.AuxInt = b2i(c >= d) 9956 return true 9957 } 9958 return false 9959 } 9960 func rewriteValuegeneric_OpGeq32F_0(v *Value) bool { 9961 // match: (Geq32F (Const32F [c]) (Const32F [d])) 9962 // cond: 9963 // result: (ConstBool [b2i(i2f(c) >= i2f(d))]) 9964 for { 9965 _ = v.Args[1] 9966 v_0 := v.Args[0] 9967 if v_0.Op != OpConst32F { 9968 break 9969 } 9970 c := v_0.AuxInt 9971 v_1 := v.Args[1] 9972 if v_1.Op != OpConst32F { 9973 break 9974 } 9975 d := v_1.AuxInt 9976 v.reset(OpConstBool) 9977 v.AuxInt = b2i(i2f(c) >= i2f(d)) 9978 return true 9979 } 9980 return false 9981 } 9982 func rewriteValuegeneric_OpGeq32U_0(v *Value) bool { 9983 // match: (Geq32U (Const32 [c]) (Const32 [d])) 9984 // cond: 9985 // result: (ConstBool [b2i(uint32(c) >= uint32(d))]) 9986 for { 9987 _ = v.Args[1] 9988 v_0 := v.Args[0] 9989 if v_0.Op != OpConst32 { 9990 break 9991 } 9992 c := v_0.AuxInt 9993 v_1 := v.Args[1] 9994 if v_1.Op != OpConst32 { 9995 break 9996 } 9997 d := v_1.AuxInt 9998 v.reset(OpConstBool) 9999 v.AuxInt = b2i(uint32(c) >= uint32(d)) 10000 return true 10001 } 10002 return false 10003 } 10004 func rewriteValuegeneric_OpGeq64_0(v *Value) bool { 10005 // match: (Geq64 (Const64 [c]) (Const64 [d])) 10006 // cond: 10007 // result: (ConstBool [b2i(c >= d)]) 10008 for { 10009 _ = v.Args[1] 10010 v_0 := v.Args[0] 10011 if v_0.Op != OpConst64 { 10012 break 10013 } 10014 c := v_0.AuxInt 10015 v_1 := v.Args[1] 10016 if v_1.Op != OpConst64 { 10017 break 10018 } 10019 d := v_1.AuxInt 10020 v.reset(OpConstBool) 10021 v.AuxInt = b2i(c >= d) 10022 return true 10023 } 10024 return false 10025 } 10026 func rewriteValuegeneric_OpGeq64F_0(v *Value) bool { 10027 // match: (Geq64F (Const64F [c]) (Const64F [d])) 10028 // cond: 10029 // result: (ConstBool [b2i(i2f(c) >= i2f(d))]) 10030 for { 10031 _ = v.Args[1] 10032 v_0 := v.Args[0] 10033 if v_0.Op != OpConst64F { 10034 break 10035 } 10036 c := v_0.AuxInt 10037 v_1 := v.Args[1] 10038 if v_1.Op != OpConst64F { 10039 break 10040 } 10041 d := v_1.AuxInt 10042 v.reset(OpConstBool) 10043 v.AuxInt = b2i(i2f(c) >= i2f(d)) 10044 return true 10045 } 10046 return false 10047 } 10048 func rewriteValuegeneric_OpGeq64U_0(v *Value) bool { 10049 // match: (Geq64U (Const64 [c]) (Const64 [d])) 10050 // cond: 10051 // result: (ConstBool [b2i(uint64(c) >= uint64(d))]) 10052 for { 10053 _ = v.Args[1] 10054 v_0 := v.Args[0] 10055 if v_0.Op != OpConst64 { 10056 break 10057 } 10058 c := v_0.AuxInt 10059 v_1 := v.Args[1] 10060 if v_1.Op != OpConst64 { 10061 break 10062 } 10063 d := v_1.AuxInt 10064 v.reset(OpConstBool) 10065 v.AuxInt = b2i(uint64(c) >= uint64(d)) 10066 return true 10067 } 10068 return false 10069 } 10070 func rewriteValuegeneric_OpGeq8_0(v *Value) bool { 10071 // match: (Geq8 (Const8 [c]) (Const8 [d])) 10072 // cond: 10073 // result: (ConstBool [b2i(c >= d)]) 10074 for { 10075 _ = v.Args[1] 10076 v_0 := v.Args[0] 10077 if v_0.Op != OpConst8 { 10078 break 10079 } 10080 c := v_0.AuxInt 10081 v_1 := v.Args[1] 10082 if v_1.Op != OpConst8 { 10083 break 10084 } 10085 d := v_1.AuxInt 10086 v.reset(OpConstBool) 10087 v.AuxInt = b2i(c >= d) 10088 return true 10089 } 10090 return false 10091 } 10092 func rewriteValuegeneric_OpGeq8U_0(v *Value) bool { 10093 // match: (Geq8U (Const8 [c]) (Const8 [d])) 10094 // cond: 10095 // result: (ConstBool [b2i(uint8(c) >= uint8(d))]) 10096 for { 10097 _ = v.Args[1] 10098 v_0 := v.Args[0] 10099 if v_0.Op != OpConst8 { 10100 break 10101 } 10102 c := v_0.AuxInt 10103 v_1 := v.Args[1] 10104 if v_1.Op != OpConst8 { 10105 break 10106 } 10107 d := v_1.AuxInt 10108 v.reset(OpConstBool) 10109 v.AuxInt = b2i(uint8(c) >= uint8(d)) 10110 return true 10111 } 10112 return false 10113 } 10114 func rewriteValuegeneric_OpGreater16_0(v *Value) bool { 10115 // match: (Greater16 (Const16 [c]) (Const16 [d])) 10116 // cond: 10117 // result: (ConstBool [b2i(c > d)]) 10118 for { 10119 _ = v.Args[1] 10120 v_0 := v.Args[0] 10121 if v_0.Op != OpConst16 { 10122 break 10123 } 10124 c := v_0.AuxInt 10125 v_1 := v.Args[1] 10126 if v_1.Op != OpConst16 { 10127 break 10128 } 10129 d := v_1.AuxInt 10130 v.reset(OpConstBool) 10131 v.AuxInt = b2i(c > d) 10132 return true 10133 } 10134 return false 10135 } 10136 func rewriteValuegeneric_OpGreater16U_0(v *Value) bool { 10137 // match: (Greater16U (Const16 [c]) (Const16 [d])) 10138 // cond: 10139 // result: (ConstBool [b2i(uint16(c) > uint16(d))]) 10140 for { 10141 _ = v.Args[1] 10142 v_0 := v.Args[0] 10143 if v_0.Op != OpConst16 { 10144 break 10145 } 10146 c := v_0.AuxInt 10147 v_1 := v.Args[1] 10148 if v_1.Op != OpConst16 { 10149 break 10150 } 10151 d := v_1.AuxInt 10152 v.reset(OpConstBool) 10153 v.AuxInt = b2i(uint16(c) > uint16(d)) 10154 return true 10155 } 10156 return false 10157 } 10158 func rewriteValuegeneric_OpGreater32_0(v *Value) bool { 10159 // match: (Greater32 (Const32 [c]) (Const32 [d])) 10160 // cond: 10161 // result: (ConstBool [b2i(c > d)]) 10162 for { 10163 _ = v.Args[1] 10164 v_0 := v.Args[0] 10165 if v_0.Op != OpConst32 { 10166 break 10167 } 10168 c := v_0.AuxInt 10169 v_1 := v.Args[1] 10170 if v_1.Op != OpConst32 { 10171 break 10172 } 10173 d := v_1.AuxInt 10174 v.reset(OpConstBool) 10175 v.AuxInt = b2i(c > d) 10176 return true 10177 } 10178 return false 10179 } 10180 func rewriteValuegeneric_OpGreater32F_0(v *Value) bool { 10181 // match: (Greater32F (Const32F [c]) (Const32F [d])) 10182 // cond: 10183 // result: (ConstBool [b2i(i2f(c) > i2f(d))]) 10184 for { 10185 _ = v.Args[1] 10186 v_0 := v.Args[0] 10187 if v_0.Op != OpConst32F { 10188 break 10189 } 10190 c := v_0.AuxInt 10191 v_1 := v.Args[1] 10192 if v_1.Op != OpConst32F { 10193 break 10194 } 10195 d := v_1.AuxInt 10196 v.reset(OpConstBool) 10197 v.AuxInt = b2i(i2f(c) > i2f(d)) 10198 return true 10199 } 10200 return false 10201 } 10202 func rewriteValuegeneric_OpGreater32U_0(v *Value) bool { 10203 // match: (Greater32U (Const32 [c]) (Const32 [d])) 10204 // cond: 10205 // result: (ConstBool [b2i(uint32(c) > uint32(d))]) 10206 for { 10207 _ = v.Args[1] 10208 v_0 := v.Args[0] 10209 if v_0.Op != OpConst32 { 10210 break 10211 } 10212 c := v_0.AuxInt 10213 v_1 := v.Args[1] 10214 if v_1.Op != OpConst32 { 10215 break 10216 } 10217 d := v_1.AuxInt 10218 v.reset(OpConstBool) 10219 v.AuxInt = b2i(uint32(c) > uint32(d)) 10220 return true 10221 } 10222 return false 10223 } 10224 func rewriteValuegeneric_OpGreater64_0(v *Value) bool { 10225 // match: (Greater64 (Const64 [c]) (Const64 [d])) 10226 // cond: 10227 // result: (ConstBool [b2i(c > d)]) 10228 for { 10229 _ = v.Args[1] 10230 v_0 := v.Args[0] 10231 if v_0.Op != OpConst64 { 10232 break 10233 } 10234 c := v_0.AuxInt 10235 v_1 := v.Args[1] 10236 if v_1.Op != OpConst64 { 10237 break 10238 } 10239 d := v_1.AuxInt 10240 v.reset(OpConstBool) 10241 v.AuxInt = b2i(c > d) 10242 return true 10243 } 10244 return false 10245 } 10246 func rewriteValuegeneric_OpGreater64F_0(v *Value) bool { 10247 // match: (Greater64F (Const64F [c]) (Const64F [d])) 10248 // cond: 10249 // result: (ConstBool [b2i(i2f(c) > i2f(d))]) 10250 for { 10251 _ = v.Args[1] 10252 v_0 := v.Args[0] 10253 if v_0.Op != OpConst64F { 10254 break 10255 } 10256 c := v_0.AuxInt 10257 v_1 := v.Args[1] 10258 if v_1.Op != OpConst64F { 10259 break 10260 } 10261 d := v_1.AuxInt 10262 v.reset(OpConstBool) 10263 v.AuxInt = b2i(i2f(c) > i2f(d)) 10264 return true 10265 } 10266 return false 10267 } 10268 func rewriteValuegeneric_OpGreater64U_0(v *Value) bool { 10269 // match: (Greater64U (Const64 [c]) (Const64 [d])) 10270 // cond: 10271 // result: (ConstBool [b2i(uint64(c) > uint64(d))]) 10272 for { 10273 _ = v.Args[1] 10274 v_0 := v.Args[0] 10275 if v_0.Op != OpConst64 { 10276 break 10277 } 10278 c := v_0.AuxInt 10279 v_1 := v.Args[1] 10280 if v_1.Op != OpConst64 { 10281 break 10282 } 10283 d := v_1.AuxInt 10284 v.reset(OpConstBool) 10285 v.AuxInt = b2i(uint64(c) > uint64(d)) 10286 return true 10287 } 10288 return false 10289 } 10290 func rewriteValuegeneric_OpGreater8_0(v *Value) bool { 10291 // match: (Greater8 (Const8 [c]) (Const8 [d])) 10292 // cond: 10293 // result: (ConstBool [b2i(c > d)]) 10294 for { 10295 _ = v.Args[1] 10296 v_0 := v.Args[0] 10297 if v_0.Op != OpConst8 { 10298 break 10299 } 10300 c := v_0.AuxInt 10301 v_1 := v.Args[1] 10302 if v_1.Op != OpConst8 { 10303 break 10304 } 10305 d := v_1.AuxInt 10306 v.reset(OpConstBool) 10307 v.AuxInt = b2i(c > d) 10308 return true 10309 } 10310 return false 10311 } 10312 func rewriteValuegeneric_OpGreater8U_0(v *Value) bool { 10313 // match: (Greater8U (Const8 [c]) (Const8 [d])) 10314 // cond: 10315 // result: (ConstBool [b2i(uint8(c) > uint8(d))]) 10316 for { 10317 _ = v.Args[1] 10318 v_0 := v.Args[0] 10319 if v_0.Op != OpConst8 { 10320 break 10321 } 10322 c := v_0.AuxInt 10323 v_1 := v.Args[1] 10324 if v_1.Op != OpConst8 { 10325 break 10326 } 10327 d := v_1.AuxInt 10328 v.reset(OpConstBool) 10329 v.AuxInt = b2i(uint8(c) > uint8(d)) 10330 return true 10331 } 10332 return false 10333 } 10334 func rewriteValuegeneric_OpIMake_0(v *Value) bool { 10335 // match: (IMake typ (StructMake1 val)) 10336 // cond: 10337 // result: (IMake typ val) 10338 for { 10339 _ = v.Args[1] 10340 typ := v.Args[0] 10341 v_1 := v.Args[1] 10342 if v_1.Op != OpStructMake1 { 10343 break 10344 } 10345 val := v_1.Args[0] 10346 v.reset(OpIMake) 10347 v.AddArg(typ) 10348 v.AddArg(val) 10349 return true 10350 } 10351 // match: (IMake typ (ArrayMake1 val)) 10352 // cond: 10353 // result: (IMake typ val) 10354 for { 10355 _ = v.Args[1] 10356 typ := v.Args[0] 10357 v_1 := v.Args[1] 10358 if v_1.Op != OpArrayMake1 { 10359 break 10360 } 10361 val := v_1.Args[0] 10362 v.reset(OpIMake) 10363 v.AddArg(typ) 10364 v.AddArg(val) 10365 return true 10366 } 10367 return false 10368 } 10369 func rewriteValuegeneric_OpInterCall_0(v *Value) bool { 10370 // match: (InterCall [argsize] (Load (OffPtr [off] (ITab (IMake (Addr {itab} (SB)) _))) _) mem) 10371 // cond: devirt(v, itab, off) != nil 10372 // result: (StaticCall [argsize] {devirt(v, itab, off)} mem) 10373 for { 10374 argsize := v.AuxInt 10375 _ = v.Args[1] 10376 v_0 := v.Args[0] 10377 if v_0.Op != OpLoad { 10378 break 10379 } 10380 _ = v_0.Args[1] 10381 v_0_0 := v_0.Args[0] 10382 if v_0_0.Op != OpOffPtr { 10383 break 10384 } 10385 off := v_0_0.AuxInt 10386 v_0_0_0 := v_0_0.Args[0] 10387 if v_0_0_0.Op != OpITab { 10388 break 10389 } 10390 v_0_0_0_0 := v_0_0_0.Args[0] 10391 if v_0_0_0_0.Op != OpIMake { 10392 break 10393 } 10394 _ = v_0_0_0_0.Args[1] 10395 v_0_0_0_0_0 := v_0_0_0_0.Args[0] 10396 if v_0_0_0_0_0.Op != OpAddr { 10397 break 10398 } 10399 itab := v_0_0_0_0_0.Aux 10400 v_0_0_0_0_0_0 := v_0_0_0_0_0.Args[0] 10401 if v_0_0_0_0_0_0.Op != OpSB { 10402 break 10403 } 10404 mem := v.Args[1] 10405 if !(devirt(v, itab, off) != nil) { 10406 break 10407 } 10408 v.reset(OpStaticCall) 10409 v.AuxInt = argsize 10410 v.Aux = devirt(v, itab, off) 10411 v.AddArg(mem) 10412 return true 10413 } 10414 return false 10415 } 10416 func rewriteValuegeneric_OpIsInBounds_0(v *Value) bool { 10417 // match: (IsInBounds (ZeroExt8to32 _) (Const32 [c])) 10418 // cond: (1 << 8) <= c 10419 // result: (ConstBool [1]) 10420 for { 10421 _ = v.Args[1] 10422 v_0 := v.Args[0] 10423 if v_0.Op != OpZeroExt8to32 { 10424 break 10425 } 10426 v_1 := v.Args[1] 10427 if v_1.Op != OpConst32 { 10428 break 10429 } 10430 c := v_1.AuxInt 10431 if !((1 << 8) <= c) { 10432 break 10433 } 10434 v.reset(OpConstBool) 10435 v.AuxInt = 1 10436 return true 10437 } 10438 // match: (IsInBounds (ZeroExt8to64 _) (Const64 [c])) 10439 // cond: (1 << 8) <= c 10440 // result: (ConstBool [1]) 10441 for { 10442 _ = v.Args[1] 10443 v_0 := v.Args[0] 10444 if v_0.Op != OpZeroExt8to64 { 10445 break 10446 } 10447 v_1 := v.Args[1] 10448 if v_1.Op != OpConst64 { 10449 break 10450 } 10451 c := v_1.AuxInt 10452 if !((1 << 8) <= c) { 10453 break 10454 } 10455 v.reset(OpConstBool) 10456 v.AuxInt = 1 10457 return true 10458 } 10459 // match: (IsInBounds (ZeroExt16to32 _) (Const32 [c])) 10460 // cond: (1 << 16) <= c 10461 // result: (ConstBool [1]) 10462 for { 10463 _ = v.Args[1] 10464 v_0 := v.Args[0] 10465 if v_0.Op != OpZeroExt16to32 { 10466 break 10467 } 10468 v_1 := v.Args[1] 10469 if v_1.Op != OpConst32 { 10470 break 10471 } 10472 c := v_1.AuxInt 10473 if !((1 << 16) <= c) { 10474 break 10475 } 10476 v.reset(OpConstBool) 10477 v.AuxInt = 1 10478 return true 10479 } 10480 // match: (IsInBounds (ZeroExt16to64 _) (Const64 [c])) 10481 // cond: (1 << 16) <= c 10482 // result: (ConstBool [1]) 10483 for { 10484 _ = v.Args[1] 10485 v_0 := v.Args[0] 10486 if v_0.Op != OpZeroExt16to64 { 10487 break 10488 } 10489 v_1 := v.Args[1] 10490 if v_1.Op != OpConst64 { 10491 break 10492 } 10493 c := v_1.AuxInt 10494 if !((1 << 16) <= c) { 10495 break 10496 } 10497 v.reset(OpConstBool) 10498 v.AuxInt = 1 10499 return true 10500 } 10501 // match: (IsInBounds x x) 10502 // cond: 10503 // result: (ConstBool [0]) 10504 for { 10505 _ = v.Args[1] 10506 x := v.Args[0] 10507 if x != v.Args[1] { 10508 break 10509 } 10510 v.reset(OpConstBool) 10511 v.AuxInt = 0 10512 return true 10513 } 10514 // match: (IsInBounds (And8 (Const8 [c]) _) (Const8 [d])) 10515 // cond: 0 <= c && c < d 10516 // result: (ConstBool [1]) 10517 for { 10518 _ = v.Args[1] 10519 v_0 := v.Args[0] 10520 if v_0.Op != OpAnd8 { 10521 break 10522 } 10523 _ = v_0.Args[1] 10524 v_0_0 := v_0.Args[0] 10525 if v_0_0.Op != OpConst8 { 10526 break 10527 } 10528 c := v_0_0.AuxInt 10529 v_1 := v.Args[1] 10530 if v_1.Op != OpConst8 { 10531 break 10532 } 10533 d := v_1.AuxInt 10534 if !(0 <= c && c < d) { 10535 break 10536 } 10537 v.reset(OpConstBool) 10538 v.AuxInt = 1 10539 return true 10540 } 10541 // match: (IsInBounds (And8 _ (Const8 [c])) (Const8 [d])) 10542 // cond: 0 <= c && c < d 10543 // result: (ConstBool [1]) 10544 for { 10545 _ = v.Args[1] 10546 v_0 := v.Args[0] 10547 if v_0.Op != OpAnd8 { 10548 break 10549 } 10550 _ = v_0.Args[1] 10551 v_0_1 := v_0.Args[1] 10552 if v_0_1.Op != OpConst8 { 10553 break 10554 } 10555 c := v_0_1.AuxInt 10556 v_1 := v.Args[1] 10557 if v_1.Op != OpConst8 { 10558 break 10559 } 10560 d := v_1.AuxInt 10561 if !(0 <= c && c < d) { 10562 break 10563 } 10564 v.reset(OpConstBool) 10565 v.AuxInt = 1 10566 return true 10567 } 10568 // match: (IsInBounds (ZeroExt8to16 (And8 (Const8 [c]) _)) (Const16 [d])) 10569 // cond: 0 <= c && c < d 10570 // result: (ConstBool [1]) 10571 for { 10572 _ = v.Args[1] 10573 v_0 := v.Args[0] 10574 if v_0.Op != OpZeroExt8to16 { 10575 break 10576 } 10577 v_0_0 := v_0.Args[0] 10578 if v_0_0.Op != OpAnd8 { 10579 break 10580 } 10581 _ = v_0_0.Args[1] 10582 v_0_0_0 := v_0_0.Args[0] 10583 if v_0_0_0.Op != OpConst8 { 10584 break 10585 } 10586 c := v_0_0_0.AuxInt 10587 v_1 := v.Args[1] 10588 if v_1.Op != OpConst16 { 10589 break 10590 } 10591 d := v_1.AuxInt 10592 if !(0 <= c && c < d) { 10593 break 10594 } 10595 v.reset(OpConstBool) 10596 v.AuxInt = 1 10597 return true 10598 } 10599 // match: (IsInBounds (ZeroExt8to16 (And8 _ (Const8 [c]))) (Const16 [d])) 10600 // cond: 0 <= c && c < d 10601 // result: (ConstBool [1]) 10602 for { 10603 _ = v.Args[1] 10604 v_0 := v.Args[0] 10605 if v_0.Op != OpZeroExt8to16 { 10606 break 10607 } 10608 v_0_0 := v_0.Args[0] 10609 if v_0_0.Op != OpAnd8 { 10610 break 10611 } 10612 _ = v_0_0.Args[1] 10613 v_0_0_1 := v_0_0.Args[1] 10614 if v_0_0_1.Op != OpConst8 { 10615 break 10616 } 10617 c := v_0_0_1.AuxInt 10618 v_1 := v.Args[1] 10619 if v_1.Op != OpConst16 { 10620 break 10621 } 10622 d := v_1.AuxInt 10623 if !(0 <= c && c < d) { 10624 break 10625 } 10626 v.reset(OpConstBool) 10627 v.AuxInt = 1 10628 return true 10629 } 10630 // match: (IsInBounds (ZeroExt8to32 (And8 (Const8 [c]) _)) (Const32 [d])) 10631 // cond: 0 <= c && c < d 10632 // result: (ConstBool [1]) 10633 for { 10634 _ = v.Args[1] 10635 v_0 := v.Args[0] 10636 if v_0.Op != OpZeroExt8to32 { 10637 break 10638 } 10639 v_0_0 := v_0.Args[0] 10640 if v_0_0.Op != OpAnd8 { 10641 break 10642 } 10643 _ = v_0_0.Args[1] 10644 v_0_0_0 := v_0_0.Args[0] 10645 if v_0_0_0.Op != OpConst8 { 10646 break 10647 } 10648 c := v_0_0_0.AuxInt 10649 v_1 := v.Args[1] 10650 if v_1.Op != OpConst32 { 10651 break 10652 } 10653 d := v_1.AuxInt 10654 if !(0 <= c && c < d) { 10655 break 10656 } 10657 v.reset(OpConstBool) 10658 v.AuxInt = 1 10659 return true 10660 } 10661 return false 10662 } 10663 func rewriteValuegeneric_OpIsInBounds_10(v *Value) bool { 10664 // match: (IsInBounds (ZeroExt8to32 (And8 _ (Const8 [c]))) (Const32 [d])) 10665 // cond: 0 <= c && c < d 10666 // result: (ConstBool [1]) 10667 for { 10668 _ = v.Args[1] 10669 v_0 := v.Args[0] 10670 if v_0.Op != OpZeroExt8to32 { 10671 break 10672 } 10673 v_0_0 := v_0.Args[0] 10674 if v_0_0.Op != OpAnd8 { 10675 break 10676 } 10677 _ = v_0_0.Args[1] 10678 v_0_0_1 := v_0_0.Args[1] 10679 if v_0_0_1.Op != OpConst8 { 10680 break 10681 } 10682 c := v_0_0_1.AuxInt 10683 v_1 := v.Args[1] 10684 if v_1.Op != OpConst32 { 10685 break 10686 } 10687 d := v_1.AuxInt 10688 if !(0 <= c && c < d) { 10689 break 10690 } 10691 v.reset(OpConstBool) 10692 v.AuxInt = 1 10693 return true 10694 } 10695 // match: (IsInBounds (ZeroExt8to64 (And8 (Const8 [c]) _)) (Const64 [d])) 10696 // cond: 0 <= c && c < d 10697 // result: (ConstBool [1]) 10698 for { 10699 _ = v.Args[1] 10700 v_0 := v.Args[0] 10701 if v_0.Op != OpZeroExt8to64 { 10702 break 10703 } 10704 v_0_0 := v_0.Args[0] 10705 if v_0_0.Op != OpAnd8 { 10706 break 10707 } 10708 _ = v_0_0.Args[1] 10709 v_0_0_0 := v_0_0.Args[0] 10710 if v_0_0_0.Op != OpConst8 { 10711 break 10712 } 10713 c := v_0_0_0.AuxInt 10714 v_1 := v.Args[1] 10715 if v_1.Op != OpConst64 { 10716 break 10717 } 10718 d := v_1.AuxInt 10719 if !(0 <= c && c < d) { 10720 break 10721 } 10722 v.reset(OpConstBool) 10723 v.AuxInt = 1 10724 return true 10725 } 10726 // match: (IsInBounds (ZeroExt8to64 (And8 _ (Const8 [c]))) (Const64 [d])) 10727 // cond: 0 <= c && c < d 10728 // result: (ConstBool [1]) 10729 for { 10730 _ = v.Args[1] 10731 v_0 := v.Args[0] 10732 if v_0.Op != OpZeroExt8to64 { 10733 break 10734 } 10735 v_0_0 := v_0.Args[0] 10736 if v_0_0.Op != OpAnd8 { 10737 break 10738 } 10739 _ = v_0_0.Args[1] 10740 v_0_0_1 := v_0_0.Args[1] 10741 if v_0_0_1.Op != OpConst8 { 10742 break 10743 } 10744 c := v_0_0_1.AuxInt 10745 v_1 := v.Args[1] 10746 if v_1.Op != OpConst64 { 10747 break 10748 } 10749 d := v_1.AuxInt 10750 if !(0 <= c && c < d) { 10751 break 10752 } 10753 v.reset(OpConstBool) 10754 v.AuxInt = 1 10755 return true 10756 } 10757 // match: (IsInBounds (And16 (Const16 [c]) _) (Const16 [d])) 10758 // cond: 0 <= c && c < d 10759 // result: (ConstBool [1]) 10760 for { 10761 _ = v.Args[1] 10762 v_0 := v.Args[0] 10763 if v_0.Op != OpAnd16 { 10764 break 10765 } 10766 _ = v_0.Args[1] 10767 v_0_0 := v_0.Args[0] 10768 if v_0_0.Op != OpConst16 { 10769 break 10770 } 10771 c := v_0_0.AuxInt 10772 v_1 := v.Args[1] 10773 if v_1.Op != OpConst16 { 10774 break 10775 } 10776 d := v_1.AuxInt 10777 if !(0 <= c && c < d) { 10778 break 10779 } 10780 v.reset(OpConstBool) 10781 v.AuxInt = 1 10782 return true 10783 } 10784 // match: (IsInBounds (And16 _ (Const16 [c])) (Const16 [d])) 10785 // cond: 0 <= c && c < d 10786 // result: (ConstBool [1]) 10787 for { 10788 _ = v.Args[1] 10789 v_0 := v.Args[0] 10790 if v_0.Op != OpAnd16 { 10791 break 10792 } 10793 _ = v_0.Args[1] 10794 v_0_1 := v_0.Args[1] 10795 if v_0_1.Op != OpConst16 { 10796 break 10797 } 10798 c := v_0_1.AuxInt 10799 v_1 := v.Args[1] 10800 if v_1.Op != OpConst16 { 10801 break 10802 } 10803 d := v_1.AuxInt 10804 if !(0 <= c && c < d) { 10805 break 10806 } 10807 v.reset(OpConstBool) 10808 v.AuxInt = 1 10809 return true 10810 } 10811 // match: (IsInBounds (ZeroExt16to32 (And16 (Const16 [c]) _)) (Const32 [d])) 10812 // cond: 0 <= c && c < d 10813 // result: (ConstBool [1]) 10814 for { 10815 _ = v.Args[1] 10816 v_0 := v.Args[0] 10817 if v_0.Op != OpZeroExt16to32 { 10818 break 10819 } 10820 v_0_0 := v_0.Args[0] 10821 if v_0_0.Op != OpAnd16 { 10822 break 10823 } 10824 _ = v_0_0.Args[1] 10825 v_0_0_0 := v_0_0.Args[0] 10826 if v_0_0_0.Op != OpConst16 { 10827 break 10828 } 10829 c := v_0_0_0.AuxInt 10830 v_1 := v.Args[1] 10831 if v_1.Op != OpConst32 { 10832 break 10833 } 10834 d := v_1.AuxInt 10835 if !(0 <= c && c < d) { 10836 break 10837 } 10838 v.reset(OpConstBool) 10839 v.AuxInt = 1 10840 return true 10841 } 10842 // match: (IsInBounds (ZeroExt16to32 (And16 _ (Const16 [c]))) (Const32 [d])) 10843 // cond: 0 <= c && c < d 10844 // result: (ConstBool [1]) 10845 for { 10846 _ = v.Args[1] 10847 v_0 := v.Args[0] 10848 if v_0.Op != OpZeroExt16to32 { 10849 break 10850 } 10851 v_0_0 := v_0.Args[0] 10852 if v_0_0.Op != OpAnd16 { 10853 break 10854 } 10855 _ = v_0_0.Args[1] 10856 v_0_0_1 := v_0_0.Args[1] 10857 if v_0_0_1.Op != OpConst16 { 10858 break 10859 } 10860 c := v_0_0_1.AuxInt 10861 v_1 := v.Args[1] 10862 if v_1.Op != OpConst32 { 10863 break 10864 } 10865 d := v_1.AuxInt 10866 if !(0 <= c && c < d) { 10867 break 10868 } 10869 v.reset(OpConstBool) 10870 v.AuxInt = 1 10871 return true 10872 } 10873 // match: (IsInBounds (ZeroExt16to64 (And16 (Const16 [c]) _)) (Const64 [d])) 10874 // cond: 0 <= c && c < d 10875 // result: (ConstBool [1]) 10876 for { 10877 _ = v.Args[1] 10878 v_0 := v.Args[0] 10879 if v_0.Op != OpZeroExt16to64 { 10880 break 10881 } 10882 v_0_0 := v_0.Args[0] 10883 if v_0_0.Op != OpAnd16 { 10884 break 10885 } 10886 _ = v_0_0.Args[1] 10887 v_0_0_0 := v_0_0.Args[0] 10888 if v_0_0_0.Op != OpConst16 { 10889 break 10890 } 10891 c := v_0_0_0.AuxInt 10892 v_1 := v.Args[1] 10893 if v_1.Op != OpConst64 { 10894 break 10895 } 10896 d := v_1.AuxInt 10897 if !(0 <= c && c < d) { 10898 break 10899 } 10900 v.reset(OpConstBool) 10901 v.AuxInt = 1 10902 return true 10903 } 10904 // match: (IsInBounds (ZeroExt16to64 (And16 _ (Const16 [c]))) (Const64 [d])) 10905 // cond: 0 <= c && c < d 10906 // result: (ConstBool [1]) 10907 for { 10908 _ = v.Args[1] 10909 v_0 := v.Args[0] 10910 if v_0.Op != OpZeroExt16to64 { 10911 break 10912 } 10913 v_0_0 := v_0.Args[0] 10914 if v_0_0.Op != OpAnd16 { 10915 break 10916 } 10917 _ = v_0_0.Args[1] 10918 v_0_0_1 := v_0_0.Args[1] 10919 if v_0_0_1.Op != OpConst16 { 10920 break 10921 } 10922 c := v_0_0_1.AuxInt 10923 v_1 := v.Args[1] 10924 if v_1.Op != OpConst64 { 10925 break 10926 } 10927 d := v_1.AuxInt 10928 if !(0 <= c && c < d) { 10929 break 10930 } 10931 v.reset(OpConstBool) 10932 v.AuxInt = 1 10933 return true 10934 } 10935 // match: (IsInBounds (And32 (Const32 [c]) _) (Const32 [d])) 10936 // cond: 0 <= c && c < d 10937 // result: (ConstBool [1]) 10938 for { 10939 _ = v.Args[1] 10940 v_0 := v.Args[0] 10941 if v_0.Op != OpAnd32 { 10942 break 10943 } 10944 _ = v_0.Args[1] 10945 v_0_0 := v_0.Args[0] 10946 if v_0_0.Op != OpConst32 { 10947 break 10948 } 10949 c := v_0_0.AuxInt 10950 v_1 := v.Args[1] 10951 if v_1.Op != OpConst32 { 10952 break 10953 } 10954 d := v_1.AuxInt 10955 if !(0 <= c && c < d) { 10956 break 10957 } 10958 v.reset(OpConstBool) 10959 v.AuxInt = 1 10960 return true 10961 } 10962 return false 10963 } 10964 func rewriteValuegeneric_OpIsInBounds_20(v *Value) bool { 10965 // match: (IsInBounds (And32 _ (Const32 [c])) (Const32 [d])) 10966 // cond: 0 <= c && c < d 10967 // result: (ConstBool [1]) 10968 for { 10969 _ = v.Args[1] 10970 v_0 := v.Args[0] 10971 if v_0.Op != OpAnd32 { 10972 break 10973 } 10974 _ = v_0.Args[1] 10975 v_0_1 := v_0.Args[1] 10976 if v_0_1.Op != OpConst32 { 10977 break 10978 } 10979 c := v_0_1.AuxInt 10980 v_1 := v.Args[1] 10981 if v_1.Op != OpConst32 { 10982 break 10983 } 10984 d := v_1.AuxInt 10985 if !(0 <= c && c < d) { 10986 break 10987 } 10988 v.reset(OpConstBool) 10989 v.AuxInt = 1 10990 return true 10991 } 10992 // match: (IsInBounds (ZeroExt32to64 (And32 (Const32 [c]) _)) (Const64 [d])) 10993 // cond: 0 <= c && c < d 10994 // result: (ConstBool [1]) 10995 for { 10996 _ = v.Args[1] 10997 v_0 := v.Args[0] 10998 if v_0.Op != OpZeroExt32to64 { 10999 break 11000 } 11001 v_0_0 := v_0.Args[0] 11002 if v_0_0.Op != OpAnd32 { 11003 break 11004 } 11005 _ = v_0_0.Args[1] 11006 v_0_0_0 := v_0_0.Args[0] 11007 if v_0_0_0.Op != OpConst32 { 11008 break 11009 } 11010 c := v_0_0_0.AuxInt 11011 v_1 := v.Args[1] 11012 if v_1.Op != OpConst64 { 11013 break 11014 } 11015 d := v_1.AuxInt 11016 if !(0 <= c && c < d) { 11017 break 11018 } 11019 v.reset(OpConstBool) 11020 v.AuxInt = 1 11021 return true 11022 } 11023 // match: (IsInBounds (ZeroExt32to64 (And32 _ (Const32 [c]))) (Const64 [d])) 11024 // cond: 0 <= c && c < d 11025 // result: (ConstBool [1]) 11026 for { 11027 _ = v.Args[1] 11028 v_0 := v.Args[0] 11029 if v_0.Op != OpZeroExt32to64 { 11030 break 11031 } 11032 v_0_0 := v_0.Args[0] 11033 if v_0_0.Op != OpAnd32 { 11034 break 11035 } 11036 _ = v_0_0.Args[1] 11037 v_0_0_1 := v_0_0.Args[1] 11038 if v_0_0_1.Op != OpConst32 { 11039 break 11040 } 11041 c := v_0_0_1.AuxInt 11042 v_1 := v.Args[1] 11043 if v_1.Op != OpConst64 { 11044 break 11045 } 11046 d := v_1.AuxInt 11047 if !(0 <= c && c < d) { 11048 break 11049 } 11050 v.reset(OpConstBool) 11051 v.AuxInt = 1 11052 return true 11053 } 11054 // match: (IsInBounds (And64 (Const64 [c]) _) (Const64 [d])) 11055 // cond: 0 <= c && c < d 11056 // result: (ConstBool [1]) 11057 for { 11058 _ = v.Args[1] 11059 v_0 := v.Args[0] 11060 if v_0.Op != OpAnd64 { 11061 break 11062 } 11063 _ = v_0.Args[1] 11064 v_0_0 := v_0.Args[0] 11065 if v_0_0.Op != OpConst64 { 11066 break 11067 } 11068 c := v_0_0.AuxInt 11069 v_1 := v.Args[1] 11070 if v_1.Op != OpConst64 { 11071 break 11072 } 11073 d := v_1.AuxInt 11074 if !(0 <= c && c < d) { 11075 break 11076 } 11077 v.reset(OpConstBool) 11078 v.AuxInt = 1 11079 return true 11080 } 11081 // match: (IsInBounds (And64 _ (Const64 [c])) (Const64 [d])) 11082 // cond: 0 <= c && c < d 11083 // result: (ConstBool [1]) 11084 for { 11085 _ = v.Args[1] 11086 v_0 := v.Args[0] 11087 if v_0.Op != OpAnd64 { 11088 break 11089 } 11090 _ = v_0.Args[1] 11091 v_0_1 := v_0.Args[1] 11092 if v_0_1.Op != OpConst64 { 11093 break 11094 } 11095 c := v_0_1.AuxInt 11096 v_1 := v.Args[1] 11097 if v_1.Op != OpConst64 { 11098 break 11099 } 11100 d := v_1.AuxInt 11101 if !(0 <= c && c < d) { 11102 break 11103 } 11104 v.reset(OpConstBool) 11105 v.AuxInt = 1 11106 return true 11107 } 11108 // match: (IsInBounds (Const32 [c]) (Const32 [d])) 11109 // cond: 11110 // result: (ConstBool [b2i(0 <= c && c < d)]) 11111 for { 11112 _ = v.Args[1] 11113 v_0 := v.Args[0] 11114 if v_0.Op != OpConst32 { 11115 break 11116 } 11117 c := v_0.AuxInt 11118 v_1 := v.Args[1] 11119 if v_1.Op != OpConst32 { 11120 break 11121 } 11122 d := v_1.AuxInt 11123 v.reset(OpConstBool) 11124 v.AuxInt = b2i(0 <= c && c < d) 11125 return true 11126 } 11127 // match: (IsInBounds (Const64 [c]) (Const64 [d])) 11128 // cond: 11129 // result: (ConstBool [b2i(0 <= c && c < d)]) 11130 for { 11131 _ = v.Args[1] 11132 v_0 := v.Args[0] 11133 if v_0.Op != OpConst64 { 11134 break 11135 } 11136 c := v_0.AuxInt 11137 v_1 := v.Args[1] 11138 if v_1.Op != OpConst64 { 11139 break 11140 } 11141 d := v_1.AuxInt 11142 v.reset(OpConstBool) 11143 v.AuxInt = b2i(0 <= c && c < d) 11144 return true 11145 } 11146 // match: (IsInBounds (Mod32u _ y) y) 11147 // cond: 11148 // result: (ConstBool [1]) 11149 for { 11150 _ = v.Args[1] 11151 v_0 := v.Args[0] 11152 if v_0.Op != OpMod32u { 11153 break 11154 } 11155 _ = v_0.Args[1] 11156 y := v_0.Args[1] 11157 if y != v.Args[1] { 11158 break 11159 } 11160 v.reset(OpConstBool) 11161 v.AuxInt = 1 11162 return true 11163 } 11164 // match: (IsInBounds (Mod64u _ y) y) 11165 // cond: 11166 // result: (ConstBool [1]) 11167 for { 11168 _ = v.Args[1] 11169 v_0 := v.Args[0] 11170 if v_0.Op != OpMod64u { 11171 break 11172 } 11173 _ = v_0.Args[1] 11174 y := v_0.Args[1] 11175 if y != v.Args[1] { 11176 break 11177 } 11178 v.reset(OpConstBool) 11179 v.AuxInt = 1 11180 return true 11181 } 11182 // match: (IsInBounds (ZeroExt8to64 (Rsh8Ux64 _ (Const64 [c]))) (Const64 [d])) 11183 // cond: 0 < c && c < 8 && 1<<uint( 8-c)-1 < d 11184 // result: (ConstBool [1]) 11185 for { 11186 _ = v.Args[1] 11187 v_0 := v.Args[0] 11188 if v_0.Op != OpZeroExt8to64 { 11189 break 11190 } 11191 v_0_0 := v_0.Args[0] 11192 if v_0_0.Op != OpRsh8Ux64 { 11193 break 11194 } 11195 _ = v_0_0.Args[1] 11196 v_0_0_1 := v_0_0.Args[1] 11197 if v_0_0_1.Op != OpConst64 { 11198 break 11199 } 11200 c := v_0_0_1.AuxInt 11201 v_1 := v.Args[1] 11202 if v_1.Op != OpConst64 { 11203 break 11204 } 11205 d := v_1.AuxInt 11206 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) { 11207 break 11208 } 11209 v.reset(OpConstBool) 11210 v.AuxInt = 1 11211 return true 11212 } 11213 return false 11214 } 11215 func rewriteValuegeneric_OpIsInBounds_30(v *Value) bool { 11216 // match: (IsInBounds (ZeroExt8to32 (Rsh8Ux64 _ (Const64 [c]))) (Const32 [d])) 11217 // cond: 0 < c && c < 8 && 1<<uint( 8-c)-1 < d 11218 // result: (ConstBool [1]) 11219 for { 11220 _ = v.Args[1] 11221 v_0 := v.Args[0] 11222 if v_0.Op != OpZeroExt8to32 { 11223 break 11224 } 11225 v_0_0 := v_0.Args[0] 11226 if v_0_0.Op != OpRsh8Ux64 { 11227 break 11228 } 11229 _ = v_0_0.Args[1] 11230 v_0_0_1 := v_0_0.Args[1] 11231 if v_0_0_1.Op != OpConst64 { 11232 break 11233 } 11234 c := v_0_0_1.AuxInt 11235 v_1 := v.Args[1] 11236 if v_1.Op != OpConst32 { 11237 break 11238 } 11239 d := v_1.AuxInt 11240 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) { 11241 break 11242 } 11243 v.reset(OpConstBool) 11244 v.AuxInt = 1 11245 return true 11246 } 11247 // match: (IsInBounds (ZeroExt8to16 (Rsh8Ux64 _ (Const64 [c]))) (Const16 [d])) 11248 // cond: 0 < c && c < 8 && 1<<uint( 8-c)-1 < d 11249 // result: (ConstBool [1]) 11250 for { 11251 _ = v.Args[1] 11252 v_0 := v.Args[0] 11253 if v_0.Op != OpZeroExt8to16 { 11254 break 11255 } 11256 v_0_0 := v_0.Args[0] 11257 if v_0_0.Op != OpRsh8Ux64 { 11258 break 11259 } 11260 _ = v_0_0.Args[1] 11261 v_0_0_1 := v_0_0.Args[1] 11262 if v_0_0_1.Op != OpConst64 { 11263 break 11264 } 11265 c := v_0_0_1.AuxInt 11266 v_1 := v.Args[1] 11267 if v_1.Op != OpConst16 { 11268 break 11269 } 11270 d := v_1.AuxInt 11271 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) { 11272 break 11273 } 11274 v.reset(OpConstBool) 11275 v.AuxInt = 1 11276 return true 11277 } 11278 // match: (IsInBounds (Rsh8Ux64 _ (Const64 [c])) (Const64 [d])) 11279 // cond: 0 < c && c < 8 && 1<<uint( 8-c)-1 < d 11280 // result: (ConstBool [1]) 11281 for { 11282 _ = v.Args[1] 11283 v_0 := v.Args[0] 11284 if v_0.Op != OpRsh8Ux64 { 11285 break 11286 } 11287 _ = v_0.Args[1] 11288 v_0_1 := v_0.Args[1] 11289 if v_0_1.Op != OpConst64 { 11290 break 11291 } 11292 c := v_0_1.AuxInt 11293 v_1 := v.Args[1] 11294 if v_1.Op != OpConst64 { 11295 break 11296 } 11297 d := v_1.AuxInt 11298 if !(0 < c && c < 8 && 1<<uint(8-c)-1 < d) { 11299 break 11300 } 11301 v.reset(OpConstBool) 11302 v.AuxInt = 1 11303 return true 11304 } 11305 // match: (IsInBounds (ZeroExt16to64 (Rsh16Ux64 _ (Const64 [c]))) (Const64 [d])) 11306 // cond: 0 < c && c < 16 && 1<<uint(16-c)-1 < d 11307 // result: (ConstBool [1]) 11308 for { 11309 _ = v.Args[1] 11310 v_0 := v.Args[0] 11311 if v_0.Op != OpZeroExt16to64 { 11312 break 11313 } 11314 v_0_0 := v_0.Args[0] 11315 if v_0_0.Op != OpRsh16Ux64 { 11316 break 11317 } 11318 _ = v_0_0.Args[1] 11319 v_0_0_1 := v_0_0.Args[1] 11320 if v_0_0_1.Op != OpConst64 { 11321 break 11322 } 11323 c := v_0_0_1.AuxInt 11324 v_1 := v.Args[1] 11325 if v_1.Op != OpConst64 { 11326 break 11327 } 11328 d := v_1.AuxInt 11329 if !(0 < c && c < 16 && 1<<uint(16-c)-1 < d) { 11330 break 11331 } 11332 v.reset(OpConstBool) 11333 v.AuxInt = 1 11334 return true 11335 } 11336 // match: (IsInBounds (ZeroExt16to32 (Rsh16Ux64 _ (Const64 [c]))) (Const64 [d])) 11337 // cond: 0 < c && c < 16 && 1<<uint(16-c)-1 < d 11338 // result: (ConstBool [1]) 11339 for { 11340 _ = v.Args[1] 11341 v_0 := v.Args[0] 11342 if v_0.Op != OpZeroExt16to32 { 11343 break 11344 } 11345 v_0_0 := v_0.Args[0] 11346 if v_0_0.Op != OpRsh16Ux64 { 11347 break 11348 } 11349 _ = v_0_0.Args[1] 11350 v_0_0_1 := v_0_0.Args[1] 11351 if v_0_0_1.Op != OpConst64 { 11352 break 11353 } 11354 c := v_0_0_1.AuxInt 11355 v_1 := v.Args[1] 11356 if v_1.Op != OpConst64 { 11357 break 11358 } 11359 d := v_1.AuxInt 11360 if !(0 < c && c < 16 && 1<<uint(16-c)-1 < d) { 11361 break 11362 } 11363 v.reset(OpConstBool) 11364 v.AuxInt = 1 11365 return true 11366 } 11367 // match: (IsInBounds (Rsh16Ux64 _ (Const64 [c])) (Const64 [d])) 11368 // cond: 0 < c && c < 16 && 1<<uint(16-c)-1 < d 11369 // result: (ConstBool [1]) 11370 for { 11371 _ = v.Args[1] 11372 v_0 := v.Args[0] 11373 if v_0.Op != OpRsh16Ux64 { 11374 break 11375 } 11376 _ = v_0.Args[1] 11377 v_0_1 := v_0.Args[1] 11378 if v_0_1.Op != OpConst64 { 11379 break 11380 } 11381 c := v_0_1.AuxInt 11382 v_1 := v.Args[1] 11383 if v_1.Op != OpConst64 { 11384 break 11385 } 11386 d := v_1.AuxInt 11387 if !(0 < c && c < 16 && 1<<uint(16-c)-1 < d) { 11388 break 11389 } 11390 v.reset(OpConstBool) 11391 v.AuxInt = 1 11392 return true 11393 } 11394 // match: (IsInBounds (ZeroExt32to64 (Rsh32Ux64 _ (Const64 [c]))) (Const64 [d])) 11395 // cond: 0 < c && c < 32 && 1<<uint(32-c)-1 < d 11396 // result: (ConstBool [1]) 11397 for { 11398 _ = v.Args[1] 11399 v_0 := v.Args[0] 11400 if v_0.Op != OpZeroExt32to64 { 11401 break 11402 } 11403 v_0_0 := v_0.Args[0] 11404 if v_0_0.Op != OpRsh32Ux64 { 11405 break 11406 } 11407 _ = v_0_0.Args[1] 11408 v_0_0_1 := v_0_0.Args[1] 11409 if v_0_0_1.Op != OpConst64 { 11410 break 11411 } 11412 c := v_0_0_1.AuxInt 11413 v_1 := v.Args[1] 11414 if v_1.Op != OpConst64 { 11415 break 11416 } 11417 d := v_1.AuxInt 11418 if !(0 < c && c < 32 && 1<<uint(32-c)-1 < d) { 11419 break 11420 } 11421 v.reset(OpConstBool) 11422 v.AuxInt = 1 11423 return true 11424 } 11425 // match: (IsInBounds (Rsh32Ux64 _ (Const64 [c])) (Const64 [d])) 11426 // cond: 0 < c && c < 32 && 1<<uint(32-c)-1 < d 11427 // result: (ConstBool [1]) 11428 for { 11429 _ = v.Args[1] 11430 v_0 := v.Args[0] 11431 if v_0.Op != OpRsh32Ux64 { 11432 break 11433 } 11434 _ = v_0.Args[1] 11435 v_0_1 := v_0.Args[1] 11436 if v_0_1.Op != OpConst64 { 11437 break 11438 } 11439 c := v_0_1.AuxInt 11440 v_1 := v.Args[1] 11441 if v_1.Op != OpConst64 { 11442 break 11443 } 11444 d := v_1.AuxInt 11445 if !(0 < c && c < 32 && 1<<uint(32-c)-1 < d) { 11446 break 11447 } 11448 v.reset(OpConstBool) 11449 v.AuxInt = 1 11450 return true 11451 } 11452 // match: (IsInBounds (Rsh64Ux64 _ (Const64 [c])) (Const64 [d])) 11453 // cond: 0 < c && c < 64 && 1<<uint(64-c)-1 < d 11454 // result: (ConstBool [1]) 11455 for { 11456 _ = v.Args[1] 11457 v_0 := v.Args[0] 11458 if v_0.Op != OpRsh64Ux64 { 11459 break 11460 } 11461 _ = v_0.Args[1] 11462 v_0_1 := v_0.Args[1] 11463 if v_0_1.Op != OpConst64 { 11464 break 11465 } 11466 c := v_0_1.AuxInt 11467 v_1 := v.Args[1] 11468 if v_1.Op != OpConst64 { 11469 break 11470 } 11471 d := v_1.AuxInt 11472 if !(0 < c && c < 64 && 1<<uint(64-c)-1 < d) { 11473 break 11474 } 11475 v.reset(OpConstBool) 11476 v.AuxInt = 1 11477 return true 11478 } 11479 return false 11480 } 11481 func rewriteValuegeneric_OpIsNonNil_0(v *Value) bool { 11482 // match: (IsNonNil (ConstNil)) 11483 // cond: 11484 // result: (ConstBool [0]) 11485 for { 11486 v_0 := v.Args[0] 11487 if v_0.Op != OpConstNil { 11488 break 11489 } 11490 v.reset(OpConstBool) 11491 v.AuxInt = 0 11492 return true 11493 } 11494 return false 11495 } 11496 func rewriteValuegeneric_OpIsSliceInBounds_0(v *Value) bool { 11497 // match: (IsSliceInBounds x x) 11498 // cond: 11499 // result: (ConstBool [1]) 11500 for { 11501 _ = v.Args[1] 11502 x := v.Args[0] 11503 if x != v.Args[1] { 11504 break 11505 } 11506 v.reset(OpConstBool) 11507 v.AuxInt = 1 11508 return true 11509 } 11510 // match: (IsSliceInBounds (And32 (Const32 [c]) _) (Const32 [d])) 11511 // cond: 0 <= c && c <= d 11512 // result: (ConstBool [1]) 11513 for { 11514 _ = v.Args[1] 11515 v_0 := v.Args[0] 11516 if v_0.Op != OpAnd32 { 11517 break 11518 } 11519 _ = v_0.Args[1] 11520 v_0_0 := v_0.Args[0] 11521 if v_0_0.Op != OpConst32 { 11522 break 11523 } 11524 c := v_0_0.AuxInt 11525 v_1 := v.Args[1] 11526 if v_1.Op != OpConst32 { 11527 break 11528 } 11529 d := v_1.AuxInt 11530 if !(0 <= c && c <= d) { 11531 break 11532 } 11533 v.reset(OpConstBool) 11534 v.AuxInt = 1 11535 return true 11536 } 11537 // match: (IsSliceInBounds (And32 _ (Const32 [c])) (Const32 [d])) 11538 // cond: 0 <= c && c <= d 11539 // result: (ConstBool [1]) 11540 for { 11541 _ = v.Args[1] 11542 v_0 := v.Args[0] 11543 if v_0.Op != OpAnd32 { 11544 break 11545 } 11546 _ = v_0.Args[1] 11547 v_0_1 := v_0.Args[1] 11548 if v_0_1.Op != OpConst32 { 11549 break 11550 } 11551 c := v_0_1.AuxInt 11552 v_1 := v.Args[1] 11553 if v_1.Op != OpConst32 { 11554 break 11555 } 11556 d := v_1.AuxInt 11557 if !(0 <= c && c <= d) { 11558 break 11559 } 11560 v.reset(OpConstBool) 11561 v.AuxInt = 1 11562 return true 11563 } 11564 // match: (IsSliceInBounds (And64 (Const64 [c]) _) (Const64 [d])) 11565 // cond: 0 <= c && c <= d 11566 // result: (ConstBool [1]) 11567 for { 11568 _ = v.Args[1] 11569 v_0 := v.Args[0] 11570 if v_0.Op != OpAnd64 { 11571 break 11572 } 11573 _ = v_0.Args[1] 11574 v_0_0 := v_0.Args[0] 11575 if v_0_0.Op != OpConst64 { 11576 break 11577 } 11578 c := v_0_0.AuxInt 11579 v_1 := v.Args[1] 11580 if v_1.Op != OpConst64 { 11581 break 11582 } 11583 d := v_1.AuxInt 11584 if !(0 <= c && c <= d) { 11585 break 11586 } 11587 v.reset(OpConstBool) 11588 v.AuxInt = 1 11589 return true 11590 } 11591 // match: (IsSliceInBounds (And64 _ (Const64 [c])) (Const64 [d])) 11592 // cond: 0 <= c && c <= d 11593 // result: (ConstBool [1]) 11594 for { 11595 _ = v.Args[1] 11596 v_0 := v.Args[0] 11597 if v_0.Op != OpAnd64 { 11598 break 11599 } 11600 _ = v_0.Args[1] 11601 v_0_1 := v_0.Args[1] 11602 if v_0_1.Op != OpConst64 { 11603 break 11604 } 11605 c := v_0_1.AuxInt 11606 v_1 := v.Args[1] 11607 if v_1.Op != OpConst64 { 11608 break 11609 } 11610 d := v_1.AuxInt 11611 if !(0 <= c && c <= d) { 11612 break 11613 } 11614 v.reset(OpConstBool) 11615 v.AuxInt = 1 11616 return true 11617 } 11618 // match: (IsSliceInBounds (Const32 [0]) _) 11619 // cond: 11620 // result: (ConstBool [1]) 11621 for { 11622 _ = v.Args[1] 11623 v_0 := v.Args[0] 11624 if v_0.Op != OpConst32 { 11625 break 11626 } 11627 if v_0.AuxInt != 0 { 11628 break 11629 } 11630 v.reset(OpConstBool) 11631 v.AuxInt = 1 11632 return true 11633 } 11634 // match: (IsSliceInBounds (Const64 [0]) _) 11635 // cond: 11636 // result: (ConstBool [1]) 11637 for { 11638 _ = v.Args[1] 11639 v_0 := v.Args[0] 11640 if v_0.Op != OpConst64 { 11641 break 11642 } 11643 if v_0.AuxInt != 0 { 11644 break 11645 } 11646 v.reset(OpConstBool) 11647 v.AuxInt = 1 11648 return true 11649 } 11650 // match: (IsSliceInBounds (Const32 [c]) (Const32 [d])) 11651 // cond: 11652 // result: (ConstBool [b2i(0 <= c && c <= d)]) 11653 for { 11654 _ = v.Args[1] 11655 v_0 := v.Args[0] 11656 if v_0.Op != OpConst32 { 11657 break 11658 } 11659 c := v_0.AuxInt 11660 v_1 := v.Args[1] 11661 if v_1.Op != OpConst32 { 11662 break 11663 } 11664 d := v_1.AuxInt 11665 v.reset(OpConstBool) 11666 v.AuxInt = b2i(0 <= c && c <= d) 11667 return true 11668 } 11669 // match: (IsSliceInBounds (Const64 [c]) (Const64 [d])) 11670 // cond: 11671 // result: (ConstBool [b2i(0 <= c && c <= d)]) 11672 for { 11673 _ = v.Args[1] 11674 v_0 := v.Args[0] 11675 if v_0.Op != OpConst64 { 11676 break 11677 } 11678 c := v_0.AuxInt 11679 v_1 := v.Args[1] 11680 if v_1.Op != OpConst64 { 11681 break 11682 } 11683 d := v_1.AuxInt 11684 v.reset(OpConstBool) 11685 v.AuxInt = b2i(0 <= c && c <= d) 11686 return true 11687 } 11688 // match: (IsSliceInBounds (SliceLen x) (SliceCap x)) 11689 // cond: 11690 // result: (ConstBool [1]) 11691 for { 11692 _ = v.Args[1] 11693 v_0 := v.Args[0] 11694 if v_0.Op != OpSliceLen { 11695 break 11696 } 11697 x := v_0.Args[0] 11698 v_1 := v.Args[1] 11699 if v_1.Op != OpSliceCap { 11700 break 11701 } 11702 if x != v_1.Args[0] { 11703 break 11704 } 11705 v.reset(OpConstBool) 11706 v.AuxInt = 1 11707 return true 11708 } 11709 return false 11710 } 11711 func rewriteValuegeneric_OpLeq16_0(v *Value) bool { 11712 // match: (Leq16 (Const16 [c]) (Const16 [d])) 11713 // cond: 11714 // result: (ConstBool [b2i(c <= d)]) 11715 for { 11716 _ = v.Args[1] 11717 v_0 := v.Args[0] 11718 if v_0.Op != OpConst16 { 11719 break 11720 } 11721 c := v_0.AuxInt 11722 v_1 := v.Args[1] 11723 if v_1.Op != OpConst16 { 11724 break 11725 } 11726 d := v_1.AuxInt 11727 v.reset(OpConstBool) 11728 v.AuxInt = b2i(c <= d) 11729 return true 11730 } 11731 return false 11732 } 11733 func rewriteValuegeneric_OpLeq16U_0(v *Value) bool { 11734 // match: (Leq16U (Const16 [c]) (Const16 [d])) 11735 // cond: 11736 // result: (ConstBool [b2i(uint16(c) <= uint16(d))]) 11737 for { 11738 _ = v.Args[1] 11739 v_0 := v.Args[0] 11740 if v_0.Op != OpConst16 { 11741 break 11742 } 11743 c := v_0.AuxInt 11744 v_1 := v.Args[1] 11745 if v_1.Op != OpConst16 { 11746 break 11747 } 11748 d := v_1.AuxInt 11749 v.reset(OpConstBool) 11750 v.AuxInt = b2i(uint16(c) <= uint16(d)) 11751 return true 11752 } 11753 return false 11754 } 11755 func rewriteValuegeneric_OpLeq32_0(v *Value) bool { 11756 // match: (Leq32 (Const32 [c]) (Const32 [d])) 11757 // cond: 11758 // result: (ConstBool [b2i(c <= d)]) 11759 for { 11760 _ = v.Args[1] 11761 v_0 := v.Args[0] 11762 if v_0.Op != OpConst32 { 11763 break 11764 } 11765 c := v_0.AuxInt 11766 v_1 := v.Args[1] 11767 if v_1.Op != OpConst32 { 11768 break 11769 } 11770 d := v_1.AuxInt 11771 v.reset(OpConstBool) 11772 v.AuxInt = b2i(c <= d) 11773 return true 11774 } 11775 return false 11776 } 11777 func rewriteValuegeneric_OpLeq32F_0(v *Value) bool { 11778 // match: (Leq32F (Const32F [c]) (Const32F [d])) 11779 // cond: 11780 // result: (ConstBool [b2i(i2f(c) <= i2f(d))]) 11781 for { 11782 _ = v.Args[1] 11783 v_0 := v.Args[0] 11784 if v_0.Op != OpConst32F { 11785 break 11786 } 11787 c := v_0.AuxInt 11788 v_1 := v.Args[1] 11789 if v_1.Op != OpConst32F { 11790 break 11791 } 11792 d := v_1.AuxInt 11793 v.reset(OpConstBool) 11794 v.AuxInt = b2i(i2f(c) <= i2f(d)) 11795 return true 11796 } 11797 return false 11798 } 11799 func rewriteValuegeneric_OpLeq32U_0(v *Value) bool { 11800 // match: (Leq32U (Const32 [c]) (Const32 [d])) 11801 // cond: 11802 // result: (ConstBool [b2i(uint32(c) <= uint32(d))]) 11803 for { 11804 _ = v.Args[1] 11805 v_0 := v.Args[0] 11806 if v_0.Op != OpConst32 { 11807 break 11808 } 11809 c := v_0.AuxInt 11810 v_1 := v.Args[1] 11811 if v_1.Op != OpConst32 { 11812 break 11813 } 11814 d := v_1.AuxInt 11815 v.reset(OpConstBool) 11816 v.AuxInt = b2i(uint32(c) <= uint32(d)) 11817 return true 11818 } 11819 return false 11820 } 11821 func rewriteValuegeneric_OpLeq64_0(v *Value) bool { 11822 // match: (Leq64 (Const64 [c]) (Const64 [d])) 11823 // cond: 11824 // result: (ConstBool [b2i(c <= d)]) 11825 for { 11826 _ = v.Args[1] 11827 v_0 := v.Args[0] 11828 if v_0.Op != OpConst64 { 11829 break 11830 } 11831 c := v_0.AuxInt 11832 v_1 := v.Args[1] 11833 if v_1.Op != OpConst64 { 11834 break 11835 } 11836 d := v_1.AuxInt 11837 v.reset(OpConstBool) 11838 v.AuxInt = b2i(c <= d) 11839 return true 11840 } 11841 return false 11842 } 11843 func rewriteValuegeneric_OpLeq64F_0(v *Value) bool { 11844 // match: (Leq64F (Const64F [c]) (Const64F [d])) 11845 // cond: 11846 // result: (ConstBool [b2i(i2f(c) <= i2f(d))]) 11847 for { 11848 _ = v.Args[1] 11849 v_0 := v.Args[0] 11850 if v_0.Op != OpConst64F { 11851 break 11852 } 11853 c := v_0.AuxInt 11854 v_1 := v.Args[1] 11855 if v_1.Op != OpConst64F { 11856 break 11857 } 11858 d := v_1.AuxInt 11859 v.reset(OpConstBool) 11860 v.AuxInt = b2i(i2f(c) <= i2f(d)) 11861 return true 11862 } 11863 return false 11864 } 11865 func rewriteValuegeneric_OpLeq64U_0(v *Value) bool { 11866 // match: (Leq64U (Const64 [c]) (Const64 [d])) 11867 // cond: 11868 // result: (ConstBool [b2i(uint64(c) <= uint64(d))]) 11869 for { 11870 _ = v.Args[1] 11871 v_0 := v.Args[0] 11872 if v_0.Op != OpConst64 { 11873 break 11874 } 11875 c := v_0.AuxInt 11876 v_1 := v.Args[1] 11877 if v_1.Op != OpConst64 { 11878 break 11879 } 11880 d := v_1.AuxInt 11881 v.reset(OpConstBool) 11882 v.AuxInt = b2i(uint64(c) <= uint64(d)) 11883 return true 11884 } 11885 return false 11886 } 11887 func rewriteValuegeneric_OpLeq8_0(v *Value) bool { 11888 // match: (Leq8 (Const8 [c]) (Const8 [d])) 11889 // cond: 11890 // result: (ConstBool [b2i(c <= d)]) 11891 for { 11892 _ = v.Args[1] 11893 v_0 := v.Args[0] 11894 if v_0.Op != OpConst8 { 11895 break 11896 } 11897 c := v_0.AuxInt 11898 v_1 := v.Args[1] 11899 if v_1.Op != OpConst8 { 11900 break 11901 } 11902 d := v_1.AuxInt 11903 v.reset(OpConstBool) 11904 v.AuxInt = b2i(c <= d) 11905 return true 11906 } 11907 return false 11908 } 11909 func rewriteValuegeneric_OpLeq8U_0(v *Value) bool { 11910 // match: (Leq8U (Const8 [c]) (Const8 [d])) 11911 // cond: 11912 // result: (ConstBool [b2i(uint8(c) <= uint8(d))]) 11913 for { 11914 _ = v.Args[1] 11915 v_0 := v.Args[0] 11916 if v_0.Op != OpConst8 { 11917 break 11918 } 11919 c := v_0.AuxInt 11920 v_1 := v.Args[1] 11921 if v_1.Op != OpConst8 { 11922 break 11923 } 11924 d := v_1.AuxInt 11925 v.reset(OpConstBool) 11926 v.AuxInt = b2i(uint8(c) <= uint8(d)) 11927 return true 11928 } 11929 return false 11930 } 11931 func rewriteValuegeneric_OpLess16_0(v *Value) bool { 11932 // match: (Less16 (Const16 [c]) (Const16 [d])) 11933 // cond: 11934 // result: (ConstBool [b2i(c < d)]) 11935 for { 11936 _ = v.Args[1] 11937 v_0 := v.Args[0] 11938 if v_0.Op != OpConst16 { 11939 break 11940 } 11941 c := v_0.AuxInt 11942 v_1 := v.Args[1] 11943 if v_1.Op != OpConst16 { 11944 break 11945 } 11946 d := v_1.AuxInt 11947 v.reset(OpConstBool) 11948 v.AuxInt = b2i(c < d) 11949 return true 11950 } 11951 return false 11952 } 11953 func rewriteValuegeneric_OpLess16U_0(v *Value) bool { 11954 // match: (Less16U (Const16 [c]) (Const16 [d])) 11955 // cond: 11956 // result: (ConstBool [b2i(uint16(c) < uint16(d))]) 11957 for { 11958 _ = v.Args[1] 11959 v_0 := v.Args[0] 11960 if v_0.Op != OpConst16 { 11961 break 11962 } 11963 c := v_0.AuxInt 11964 v_1 := v.Args[1] 11965 if v_1.Op != OpConst16 { 11966 break 11967 } 11968 d := v_1.AuxInt 11969 v.reset(OpConstBool) 11970 v.AuxInt = b2i(uint16(c) < uint16(d)) 11971 return true 11972 } 11973 return false 11974 } 11975 func rewriteValuegeneric_OpLess32_0(v *Value) bool { 11976 // match: (Less32 (Const32 [c]) (Const32 [d])) 11977 // cond: 11978 // result: (ConstBool [b2i(c < d)]) 11979 for { 11980 _ = v.Args[1] 11981 v_0 := v.Args[0] 11982 if v_0.Op != OpConst32 { 11983 break 11984 } 11985 c := v_0.AuxInt 11986 v_1 := v.Args[1] 11987 if v_1.Op != OpConst32 { 11988 break 11989 } 11990 d := v_1.AuxInt 11991 v.reset(OpConstBool) 11992 v.AuxInt = b2i(c < d) 11993 return true 11994 } 11995 return false 11996 } 11997 func rewriteValuegeneric_OpLess32F_0(v *Value) bool { 11998 // match: (Less32F (Const32F [c]) (Const32F [d])) 11999 // cond: 12000 // result: (ConstBool [b2i(i2f(c) < i2f(d))]) 12001 for { 12002 _ = v.Args[1] 12003 v_0 := v.Args[0] 12004 if v_0.Op != OpConst32F { 12005 break 12006 } 12007 c := v_0.AuxInt 12008 v_1 := v.Args[1] 12009 if v_1.Op != OpConst32F { 12010 break 12011 } 12012 d := v_1.AuxInt 12013 v.reset(OpConstBool) 12014 v.AuxInt = b2i(i2f(c) < i2f(d)) 12015 return true 12016 } 12017 return false 12018 } 12019 func rewriteValuegeneric_OpLess32U_0(v *Value) bool { 12020 // match: (Less32U (Const32 [c]) (Const32 [d])) 12021 // cond: 12022 // result: (ConstBool [b2i(uint32(c) < uint32(d))]) 12023 for { 12024 _ = v.Args[1] 12025 v_0 := v.Args[0] 12026 if v_0.Op != OpConst32 { 12027 break 12028 } 12029 c := v_0.AuxInt 12030 v_1 := v.Args[1] 12031 if v_1.Op != OpConst32 { 12032 break 12033 } 12034 d := v_1.AuxInt 12035 v.reset(OpConstBool) 12036 v.AuxInt = b2i(uint32(c) < uint32(d)) 12037 return true 12038 } 12039 return false 12040 } 12041 func rewriteValuegeneric_OpLess64_0(v *Value) bool { 12042 // match: (Less64 (Const64 [c]) (Const64 [d])) 12043 // cond: 12044 // result: (ConstBool [b2i(c < d)]) 12045 for { 12046 _ = v.Args[1] 12047 v_0 := v.Args[0] 12048 if v_0.Op != OpConst64 { 12049 break 12050 } 12051 c := v_0.AuxInt 12052 v_1 := v.Args[1] 12053 if v_1.Op != OpConst64 { 12054 break 12055 } 12056 d := v_1.AuxInt 12057 v.reset(OpConstBool) 12058 v.AuxInt = b2i(c < d) 12059 return true 12060 } 12061 return false 12062 } 12063 func rewriteValuegeneric_OpLess64F_0(v *Value) bool { 12064 // match: (Less64F (Const64F [c]) (Const64F [d])) 12065 // cond: 12066 // result: (ConstBool [b2i(i2f(c) < i2f(d))]) 12067 for { 12068 _ = v.Args[1] 12069 v_0 := v.Args[0] 12070 if v_0.Op != OpConst64F { 12071 break 12072 } 12073 c := v_0.AuxInt 12074 v_1 := v.Args[1] 12075 if v_1.Op != OpConst64F { 12076 break 12077 } 12078 d := v_1.AuxInt 12079 v.reset(OpConstBool) 12080 v.AuxInt = b2i(i2f(c) < i2f(d)) 12081 return true 12082 } 12083 return false 12084 } 12085 func rewriteValuegeneric_OpLess64U_0(v *Value) bool { 12086 // match: (Less64U (Const64 [c]) (Const64 [d])) 12087 // cond: 12088 // result: (ConstBool [b2i(uint64(c) < uint64(d))]) 12089 for { 12090 _ = v.Args[1] 12091 v_0 := v.Args[0] 12092 if v_0.Op != OpConst64 { 12093 break 12094 } 12095 c := v_0.AuxInt 12096 v_1 := v.Args[1] 12097 if v_1.Op != OpConst64 { 12098 break 12099 } 12100 d := v_1.AuxInt 12101 v.reset(OpConstBool) 12102 v.AuxInt = b2i(uint64(c) < uint64(d)) 12103 return true 12104 } 12105 return false 12106 } 12107 func rewriteValuegeneric_OpLess8_0(v *Value) bool { 12108 // match: (Less8 (Const8 [c]) (Const8 [d])) 12109 // cond: 12110 // result: (ConstBool [b2i(c < d)]) 12111 for { 12112 _ = v.Args[1] 12113 v_0 := v.Args[0] 12114 if v_0.Op != OpConst8 { 12115 break 12116 } 12117 c := v_0.AuxInt 12118 v_1 := v.Args[1] 12119 if v_1.Op != OpConst8 { 12120 break 12121 } 12122 d := v_1.AuxInt 12123 v.reset(OpConstBool) 12124 v.AuxInt = b2i(c < d) 12125 return true 12126 } 12127 return false 12128 } 12129 func rewriteValuegeneric_OpLess8U_0(v *Value) bool { 12130 // match: (Less8U (Const8 [c]) (Const8 [d])) 12131 // cond: 12132 // result: (ConstBool [b2i(uint8(c) < uint8(d))]) 12133 for { 12134 _ = v.Args[1] 12135 v_0 := v.Args[0] 12136 if v_0.Op != OpConst8 { 12137 break 12138 } 12139 c := v_0.AuxInt 12140 v_1 := v.Args[1] 12141 if v_1.Op != OpConst8 { 12142 break 12143 } 12144 d := v_1.AuxInt 12145 v.reset(OpConstBool) 12146 v.AuxInt = b2i(uint8(c) < uint8(d)) 12147 return true 12148 } 12149 return false 12150 } 12151 func rewriteValuegeneric_OpLoad_0(v *Value) bool { 12152 b := v.Block 12153 _ = b 12154 fe := b.Func.fe 12155 _ = fe 12156 // match: (Load <t1> p1 (Store {t2} p2 x _)) 12157 // cond: isSamePtr(p1,p2) && t1.Compare(x.Type) == types.CMPeq && t1.Size() == t2.(*types.Type).Size() 12158 // result: x 12159 for { 12160 t1 := v.Type 12161 _ = v.Args[1] 12162 p1 := v.Args[0] 12163 v_1 := v.Args[1] 12164 if v_1.Op != OpStore { 12165 break 12166 } 12167 t2 := v_1.Aux 12168 _ = v_1.Args[2] 12169 p2 := v_1.Args[0] 12170 x := v_1.Args[1] 12171 if !(isSamePtr(p1, p2) && t1.Compare(x.Type) == types.CMPeq && t1.Size() == t2.(*types.Type).Size()) { 12172 break 12173 } 12174 v.reset(OpCopy) 12175 v.Type = x.Type 12176 v.AddArg(x) 12177 return true 12178 } 12179 // match: (Load <t1> p1 (Store {t2} p2 (Const64 [x]) _)) 12180 // cond: isSamePtr(p1,p2) && t2.(*types.Type).Size() == 8 && is64BitFloat(t1) 12181 // result: (Const64F [x]) 12182 for { 12183 t1 := v.Type 12184 _ = v.Args[1] 12185 p1 := v.Args[0] 12186 v_1 := v.Args[1] 12187 if v_1.Op != OpStore { 12188 break 12189 } 12190 t2 := v_1.Aux 12191 _ = v_1.Args[2] 12192 p2 := v_1.Args[0] 12193 v_1_1 := v_1.Args[1] 12194 if v_1_1.Op != OpConst64 { 12195 break 12196 } 12197 x := v_1_1.AuxInt 12198 if !(isSamePtr(p1, p2) && t2.(*types.Type).Size() == 8 && is64BitFloat(t1)) { 12199 break 12200 } 12201 v.reset(OpConst64F) 12202 v.AuxInt = x 12203 return true 12204 } 12205 // match: (Load <t1> p1 (Store {t2} p2 (Const32 [x]) _)) 12206 // cond: isSamePtr(p1,p2) && t2.(*types.Type).Size() == 4 && is32BitFloat(t1) 12207 // result: (Const32F [f2i(float64(math.Float32frombits(uint32(x))))]) 12208 for { 12209 t1 := v.Type 12210 _ = v.Args[1] 12211 p1 := v.Args[0] 12212 v_1 := v.Args[1] 12213 if v_1.Op != OpStore { 12214 break 12215 } 12216 t2 := v_1.Aux 12217 _ = v_1.Args[2] 12218 p2 := v_1.Args[0] 12219 v_1_1 := v_1.Args[1] 12220 if v_1_1.Op != OpConst32 { 12221 break 12222 } 12223 x := v_1_1.AuxInt 12224 if !(isSamePtr(p1, p2) && t2.(*types.Type).Size() == 4 && is32BitFloat(t1)) { 12225 break 12226 } 12227 v.reset(OpConst32F) 12228 v.AuxInt = f2i(float64(math.Float32frombits(uint32(x)))) 12229 return true 12230 } 12231 // match: (Load <t1> p1 (Store {t2} p2 (Const64F [x]) _)) 12232 // cond: isSamePtr(p1,p2) && t2.(*types.Type).Size() == 8 && is64BitInt(t1) 12233 // result: (Const64 [x]) 12234 for { 12235 t1 := v.Type 12236 _ = v.Args[1] 12237 p1 := v.Args[0] 12238 v_1 := v.Args[1] 12239 if v_1.Op != OpStore { 12240 break 12241 } 12242 t2 := v_1.Aux 12243 _ = v_1.Args[2] 12244 p2 := v_1.Args[0] 12245 v_1_1 := v_1.Args[1] 12246 if v_1_1.Op != OpConst64F { 12247 break 12248 } 12249 x := v_1_1.AuxInt 12250 if !(isSamePtr(p1, p2) && t2.(*types.Type).Size() == 8 && is64BitInt(t1)) { 12251 break 12252 } 12253 v.reset(OpConst64) 12254 v.AuxInt = x 12255 return true 12256 } 12257 // match: (Load <t1> p1 (Store {t2} p2 (Const32F [x]) _)) 12258 // cond: isSamePtr(p1,p2) && t2.(*types.Type).Size() == 4 && is32BitInt(t1) 12259 // result: (Const32 [int64(int32(math.Float32bits(float32(i2f(x)))))]) 12260 for { 12261 t1 := v.Type 12262 _ = v.Args[1] 12263 p1 := v.Args[0] 12264 v_1 := v.Args[1] 12265 if v_1.Op != OpStore { 12266 break 12267 } 12268 t2 := v_1.Aux 12269 _ = v_1.Args[2] 12270 p2 := v_1.Args[0] 12271 v_1_1 := v_1.Args[1] 12272 if v_1_1.Op != OpConst32F { 12273 break 12274 } 12275 x := v_1_1.AuxInt 12276 if !(isSamePtr(p1, p2) && t2.(*types.Type).Size() == 4 && is32BitInt(t1)) { 12277 break 12278 } 12279 v.reset(OpConst32) 12280 v.AuxInt = int64(int32(math.Float32bits(float32(i2f(x))))) 12281 return true 12282 } 12283 // match: (Load <t> _ _) 12284 // cond: t.IsStruct() && t.NumFields() == 0 && fe.CanSSA(t) 12285 // result: (StructMake0) 12286 for { 12287 t := v.Type 12288 _ = v.Args[1] 12289 if !(t.IsStruct() && t.NumFields() == 0 && fe.CanSSA(t)) { 12290 break 12291 } 12292 v.reset(OpStructMake0) 12293 return true 12294 } 12295 // match: (Load <t> ptr mem) 12296 // cond: t.IsStruct() && t.NumFields() == 1 && fe.CanSSA(t) 12297 // result: (StructMake1 (Load <t.FieldType(0)> (OffPtr <t.FieldType(0).PtrTo()> [0] ptr) mem)) 12298 for { 12299 t := v.Type 12300 _ = v.Args[1] 12301 ptr := v.Args[0] 12302 mem := v.Args[1] 12303 if !(t.IsStruct() && t.NumFields() == 1 && fe.CanSSA(t)) { 12304 break 12305 } 12306 v.reset(OpStructMake1) 12307 v0 := b.NewValue0(v.Pos, OpLoad, t.FieldType(0)) 12308 v1 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 12309 v1.AuxInt = 0 12310 v1.AddArg(ptr) 12311 v0.AddArg(v1) 12312 v0.AddArg(mem) 12313 v.AddArg(v0) 12314 return true 12315 } 12316 // match: (Load <t> ptr mem) 12317 // cond: t.IsStruct() && t.NumFields() == 2 && fe.CanSSA(t) 12318 // result: (StructMake2 (Load <t.FieldType(0)> (OffPtr <t.FieldType(0).PtrTo()> [0] ptr) mem) (Load <t.FieldType(1)> (OffPtr <t.FieldType(1).PtrTo()> [t.FieldOff(1)] ptr) mem)) 12319 for { 12320 t := v.Type 12321 _ = v.Args[1] 12322 ptr := v.Args[0] 12323 mem := v.Args[1] 12324 if !(t.IsStruct() && t.NumFields() == 2 && fe.CanSSA(t)) { 12325 break 12326 } 12327 v.reset(OpStructMake2) 12328 v0 := b.NewValue0(v.Pos, OpLoad, t.FieldType(0)) 12329 v1 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 12330 v1.AuxInt = 0 12331 v1.AddArg(ptr) 12332 v0.AddArg(v1) 12333 v0.AddArg(mem) 12334 v.AddArg(v0) 12335 v2 := b.NewValue0(v.Pos, OpLoad, t.FieldType(1)) 12336 v3 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) 12337 v3.AuxInt = t.FieldOff(1) 12338 v3.AddArg(ptr) 12339 v2.AddArg(v3) 12340 v2.AddArg(mem) 12341 v.AddArg(v2) 12342 return true 12343 } 12344 // match: (Load <t> ptr mem) 12345 // cond: t.IsStruct() && t.NumFields() == 3 && fe.CanSSA(t) 12346 // result: (StructMake3 (Load <t.FieldType(0)> (OffPtr <t.FieldType(0).PtrTo()> [0] ptr) mem) (Load <t.FieldType(1)> (OffPtr <t.FieldType(1).PtrTo()> [t.FieldOff(1)] ptr) mem) (Load <t.FieldType(2)> (OffPtr <t.FieldType(2).PtrTo()> [t.FieldOff(2)] ptr) mem)) 12347 for { 12348 t := v.Type 12349 _ = v.Args[1] 12350 ptr := v.Args[0] 12351 mem := v.Args[1] 12352 if !(t.IsStruct() && t.NumFields() == 3 && fe.CanSSA(t)) { 12353 break 12354 } 12355 v.reset(OpStructMake3) 12356 v0 := b.NewValue0(v.Pos, OpLoad, t.FieldType(0)) 12357 v1 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 12358 v1.AuxInt = 0 12359 v1.AddArg(ptr) 12360 v0.AddArg(v1) 12361 v0.AddArg(mem) 12362 v.AddArg(v0) 12363 v2 := b.NewValue0(v.Pos, OpLoad, t.FieldType(1)) 12364 v3 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) 12365 v3.AuxInt = t.FieldOff(1) 12366 v3.AddArg(ptr) 12367 v2.AddArg(v3) 12368 v2.AddArg(mem) 12369 v.AddArg(v2) 12370 v4 := b.NewValue0(v.Pos, OpLoad, t.FieldType(2)) 12371 v5 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(2).PtrTo()) 12372 v5.AuxInt = t.FieldOff(2) 12373 v5.AddArg(ptr) 12374 v4.AddArg(v5) 12375 v4.AddArg(mem) 12376 v.AddArg(v4) 12377 return true 12378 } 12379 // match: (Load <t> ptr mem) 12380 // cond: t.IsStruct() && t.NumFields() == 4 && fe.CanSSA(t) 12381 // result: (StructMake4 (Load <t.FieldType(0)> (OffPtr <t.FieldType(0).PtrTo()> [0] ptr) mem) (Load <t.FieldType(1)> (OffPtr <t.FieldType(1).PtrTo()> [t.FieldOff(1)] ptr) mem) (Load <t.FieldType(2)> (OffPtr <t.FieldType(2).PtrTo()> [t.FieldOff(2)] ptr) mem) (Load <t.FieldType(3)> (OffPtr <t.FieldType(3).PtrTo()> [t.FieldOff(3)] ptr) mem)) 12382 for { 12383 t := v.Type 12384 _ = v.Args[1] 12385 ptr := v.Args[0] 12386 mem := v.Args[1] 12387 if !(t.IsStruct() && t.NumFields() == 4 && fe.CanSSA(t)) { 12388 break 12389 } 12390 v.reset(OpStructMake4) 12391 v0 := b.NewValue0(v.Pos, OpLoad, t.FieldType(0)) 12392 v1 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 12393 v1.AuxInt = 0 12394 v1.AddArg(ptr) 12395 v0.AddArg(v1) 12396 v0.AddArg(mem) 12397 v.AddArg(v0) 12398 v2 := b.NewValue0(v.Pos, OpLoad, t.FieldType(1)) 12399 v3 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) 12400 v3.AuxInt = t.FieldOff(1) 12401 v3.AddArg(ptr) 12402 v2.AddArg(v3) 12403 v2.AddArg(mem) 12404 v.AddArg(v2) 12405 v4 := b.NewValue0(v.Pos, OpLoad, t.FieldType(2)) 12406 v5 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(2).PtrTo()) 12407 v5.AuxInt = t.FieldOff(2) 12408 v5.AddArg(ptr) 12409 v4.AddArg(v5) 12410 v4.AddArg(mem) 12411 v.AddArg(v4) 12412 v6 := b.NewValue0(v.Pos, OpLoad, t.FieldType(3)) 12413 v7 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(3).PtrTo()) 12414 v7.AuxInt = t.FieldOff(3) 12415 v7.AddArg(ptr) 12416 v6.AddArg(v7) 12417 v6.AddArg(mem) 12418 v.AddArg(v6) 12419 return true 12420 } 12421 return false 12422 } 12423 func rewriteValuegeneric_OpLoad_10(v *Value) bool { 12424 b := v.Block 12425 _ = b 12426 fe := b.Func.fe 12427 _ = fe 12428 // match: (Load <t> _ _) 12429 // cond: t.IsArray() && t.NumElem() == 0 12430 // result: (ArrayMake0) 12431 for { 12432 t := v.Type 12433 _ = v.Args[1] 12434 if !(t.IsArray() && t.NumElem() == 0) { 12435 break 12436 } 12437 v.reset(OpArrayMake0) 12438 return true 12439 } 12440 // match: (Load <t> ptr mem) 12441 // cond: t.IsArray() && t.NumElem() == 1 && fe.CanSSA(t) 12442 // result: (ArrayMake1 (Load <t.ElemType()> ptr mem)) 12443 for { 12444 t := v.Type 12445 _ = v.Args[1] 12446 ptr := v.Args[0] 12447 mem := v.Args[1] 12448 if !(t.IsArray() && t.NumElem() == 1 && fe.CanSSA(t)) { 12449 break 12450 } 12451 v.reset(OpArrayMake1) 12452 v0 := b.NewValue0(v.Pos, OpLoad, t.ElemType()) 12453 v0.AddArg(ptr) 12454 v0.AddArg(mem) 12455 v.AddArg(v0) 12456 return true 12457 } 12458 return false 12459 } 12460 func rewriteValuegeneric_OpLsh16x16_0(v *Value) bool { 12461 b := v.Block 12462 _ = b 12463 // match: (Lsh16x16 <t> x (Const16 [c])) 12464 // cond: 12465 // result: (Lsh16x64 x (Const64 <t> [int64(uint16(c))])) 12466 for { 12467 t := v.Type 12468 _ = v.Args[1] 12469 x := v.Args[0] 12470 v_1 := v.Args[1] 12471 if v_1.Op != OpConst16 { 12472 break 12473 } 12474 c := v_1.AuxInt 12475 v.reset(OpLsh16x64) 12476 v.AddArg(x) 12477 v0 := b.NewValue0(v.Pos, OpConst64, t) 12478 v0.AuxInt = int64(uint16(c)) 12479 v.AddArg(v0) 12480 return true 12481 } 12482 // match: (Lsh16x16 (Const16 [0]) _) 12483 // cond: 12484 // result: (Const16 [0]) 12485 for { 12486 _ = v.Args[1] 12487 v_0 := v.Args[0] 12488 if v_0.Op != OpConst16 { 12489 break 12490 } 12491 if v_0.AuxInt != 0 { 12492 break 12493 } 12494 v.reset(OpConst16) 12495 v.AuxInt = 0 12496 return true 12497 } 12498 return false 12499 } 12500 func rewriteValuegeneric_OpLsh16x32_0(v *Value) bool { 12501 b := v.Block 12502 _ = b 12503 // match: (Lsh16x32 <t> x (Const32 [c])) 12504 // cond: 12505 // result: (Lsh16x64 x (Const64 <t> [int64(uint32(c))])) 12506 for { 12507 t := v.Type 12508 _ = v.Args[1] 12509 x := v.Args[0] 12510 v_1 := v.Args[1] 12511 if v_1.Op != OpConst32 { 12512 break 12513 } 12514 c := v_1.AuxInt 12515 v.reset(OpLsh16x64) 12516 v.AddArg(x) 12517 v0 := b.NewValue0(v.Pos, OpConst64, t) 12518 v0.AuxInt = int64(uint32(c)) 12519 v.AddArg(v0) 12520 return true 12521 } 12522 // match: (Lsh16x32 (Const16 [0]) _) 12523 // cond: 12524 // result: (Const16 [0]) 12525 for { 12526 _ = v.Args[1] 12527 v_0 := v.Args[0] 12528 if v_0.Op != OpConst16 { 12529 break 12530 } 12531 if v_0.AuxInt != 0 { 12532 break 12533 } 12534 v.reset(OpConst16) 12535 v.AuxInt = 0 12536 return true 12537 } 12538 return false 12539 } 12540 func rewriteValuegeneric_OpLsh16x64_0(v *Value) bool { 12541 b := v.Block 12542 _ = b 12543 typ := &b.Func.Config.Types 12544 _ = typ 12545 // match: (Lsh16x64 (Const16 [c]) (Const64 [d])) 12546 // cond: 12547 // result: (Const16 [int64(int16(c) << uint64(d))]) 12548 for { 12549 _ = v.Args[1] 12550 v_0 := v.Args[0] 12551 if v_0.Op != OpConst16 { 12552 break 12553 } 12554 c := v_0.AuxInt 12555 v_1 := v.Args[1] 12556 if v_1.Op != OpConst64 { 12557 break 12558 } 12559 d := v_1.AuxInt 12560 v.reset(OpConst16) 12561 v.AuxInt = int64(int16(c) << uint64(d)) 12562 return true 12563 } 12564 // match: (Lsh16x64 x (Const64 [0])) 12565 // cond: 12566 // result: x 12567 for { 12568 _ = v.Args[1] 12569 x := v.Args[0] 12570 v_1 := v.Args[1] 12571 if v_1.Op != OpConst64 { 12572 break 12573 } 12574 if v_1.AuxInt != 0 { 12575 break 12576 } 12577 v.reset(OpCopy) 12578 v.Type = x.Type 12579 v.AddArg(x) 12580 return true 12581 } 12582 // match: (Lsh16x64 (Const16 [0]) _) 12583 // cond: 12584 // result: (Const16 [0]) 12585 for { 12586 _ = v.Args[1] 12587 v_0 := v.Args[0] 12588 if v_0.Op != OpConst16 { 12589 break 12590 } 12591 if v_0.AuxInt != 0 { 12592 break 12593 } 12594 v.reset(OpConst16) 12595 v.AuxInt = 0 12596 return true 12597 } 12598 // match: (Lsh16x64 _ (Const64 [c])) 12599 // cond: uint64(c) >= 16 12600 // result: (Const16 [0]) 12601 for { 12602 _ = v.Args[1] 12603 v_1 := v.Args[1] 12604 if v_1.Op != OpConst64 { 12605 break 12606 } 12607 c := v_1.AuxInt 12608 if !(uint64(c) >= 16) { 12609 break 12610 } 12611 v.reset(OpConst16) 12612 v.AuxInt = 0 12613 return true 12614 } 12615 // match: (Lsh16x64 <t> (Lsh16x64 x (Const64 [c])) (Const64 [d])) 12616 // cond: !uaddOvf(c,d) 12617 // result: (Lsh16x64 x (Const64 <t> [c+d])) 12618 for { 12619 t := v.Type 12620 _ = v.Args[1] 12621 v_0 := v.Args[0] 12622 if v_0.Op != OpLsh16x64 { 12623 break 12624 } 12625 _ = v_0.Args[1] 12626 x := v_0.Args[0] 12627 v_0_1 := v_0.Args[1] 12628 if v_0_1.Op != OpConst64 { 12629 break 12630 } 12631 c := v_0_1.AuxInt 12632 v_1 := v.Args[1] 12633 if v_1.Op != OpConst64 { 12634 break 12635 } 12636 d := v_1.AuxInt 12637 if !(!uaddOvf(c, d)) { 12638 break 12639 } 12640 v.reset(OpLsh16x64) 12641 v.AddArg(x) 12642 v0 := b.NewValue0(v.Pos, OpConst64, t) 12643 v0.AuxInt = c + d 12644 v.AddArg(v0) 12645 return true 12646 } 12647 // match: (Lsh16x64 (Rsh16Ux64 (Lsh16x64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 12648 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 12649 // result: (Lsh16x64 x (Const64 <typ.UInt64> [c1-c2+c3])) 12650 for { 12651 _ = v.Args[1] 12652 v_0 := v.Args[0] 12653 if v_0.Op != OpRsh16Ux64 { 12654 break 12655 } 12656 _ = v_0.Args[1] 12657 v_0_0 := v_0.Args[0] 12658 if v_0_0.Op != OpLsh16x64 { 12659 break 12660 } 12661 _ = v_0_0.Args[1] 12662 x := v_0_0.Args[0] 12663 v_0_0_1 := v_0_0.Args[1] 12664 if v_0_0_1.Op != OpConst64 { 12665 break 12666 } 12667 c1 := v_0_0_1.AuxInt 12668 v_0_1 := v_0.Args[1] 12669 if v_0_1.Op != OpConst64 { 12670 break 12671 } 12672 c2 := v_0_1.AuxInt 12673 v_1 := v.Args[1] 12674 if v_1.Op != OpConst64 { 12675 break 12676 } 12677 c3 := v_1.AuxInt 12678 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 12679 break 12680 } 12681 v.reset(OpLsh16x64) 12682 v.AddArg(x) 12683 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 12684 v0.AuxInt = c1 - c2 + c3 12685 v.AddArg(v0) 12686 return true 12687 } 12688 return false 12689 } 12690 func rewriteValuegeneric_OpLsh16x8_0(v *Value) bool { 12691 b := v.Block 12692 _ = b 12693 // match: (Lsh16x8 <t> x (Const8 [c])) 12694 // cond: 12695 // result: (Lsh16x64 x (Const64 <t> [int64(uint8(c))])) 12696 for { 12697 t := v.Type 12698 _ = v.Args[1] 12699 x := v.Args[0] 12700 v_1 := v.Args[1] 12701 if v_1.Op != OpConst8 { 12702 break 12703 } 12704 c := v_1.AuxInt 12705 v.reset(OpLsh16x64) 12706 v.AddArg(x) 12707 v0 := b.NewValue0(v.Pos, OpConst64, t) 12708 v0.AuxInt = int64(uint8(c)) 12709 v.AddArg(v0) 12710 return true 12711 } 12712 // match: (Lsh16x8 (Const16 [0]) _) 12713 // cond: 12714 // result: (Const16 [0]) 12715 for { 12716 _ = v.Args[1] 12717 v_0 := v.Args[0] 12718 if v_0.Op != OpConst16 { 12719 break 12720 } 12721 if v_0.AuxInt != 0 { 12722 break 12723 } 12724 v.reset(OpConst16) 12725 v.AuxInt = 0 12726 return true 12727 } 12728 return false 12729 } 12730 func rewriteValuegeneric_OpLsh32x16_0(v *Value) bool { 12731 b := v.Block 12732 _ = b 12733 // match: (Lsh32x16 <t> x (Const16 [c])) 12734 // cond: 12735 // result: (Lsh32x64 x (Const64 <t> [int64(uint16(c))])) 12736 for { 12737 t := v.Type 12738 _ = v.Args[1] 12739 x := v.Args[0] 12740 v_1 := v.Args[1] 12741 if v_1.Op != OpConst16 { 12742 break 12743 } 12744 c := v_1.AuxInt 12745 v.reset(OpLsh32x64) 12746 v.AddArg(x) 12747 v0 := b.NewValue0(v.Pos, OpConst64, t) 12748 v0.AuxInt = int64(uint16(c)) 12749 v.AddArg(v0) 12750 return true 12751 } 12752 // match: (Lsh32x16 (Const32 [0]) _) 12753 // cond: 12754 // result: (Const32 [0]) 12755 for { 12756 _ = v.Args[1] 12757 v_0 := v.Args[0] 12758 if v_0.Op != OpConst32 { 12759 break 12760 } 12761 if v_0.AuxInt != 0 { 12762 break 12763 } 12764 v.reset(OpConst32) 12765 v.AuxInt = 0 12766 return true 12767 } 12768 return false 12769 } 12770 func rewriteValuegeneric_OpLsh32x32_0(v *Value) bool { 12771 b := v.Block 12772 _ = b 12773 // match: (Lsh32x32 <t> x (Const32 [c])) 12774 // cond: 12775 // result: (Lsh32x64 x (Const64 <t> [int64(uint32(c))])) 12776 for { 12777 t := v.Type 12778 _ = v.Args[1] 12779 x := v.Args[0] 12780 v_1 := v.Args[1] 12781 if v_1.Op != OpConst32 { 12782 break 12783 } 12784 c := v_1.AuxInt 12785 v.reset(OpLsh32x64) 12786 v.AddArg(x) 12787 v0 := b.NewValue0(v.Pos, OpConst64, t) 12788 v0.AuxInt = int64(uint32(c)) 12789 v.AddArg(v0) 12790 return true 12791 } 12792 // match: (Lsh32x32 (Const32 [0]) _) 12793 // cond: 12794 // result: (Const32 [0]) 12795 for { 12796 _ = v.Args[1] 12797 v_0 := v.Args[0] 12798 if v_0.Op != OpConst32 { 12799 break 12800 } 12801 if v_0.AuxInt != 0 { 12802 break 12803 } 12804 v.reset(OpConst32) 12805 v.AuxInt = 0 12806 return true 12807 } 12808 return false 12809 } 12810 func rewriteValuegeneric_OpLsh32x64_0(v *Value) bool { 12811 b := v.Block 12812 _ = b 12813 typ := &b.Func.Config.Types 12814 _ = typ 12815 // match: (Lsh32x64 (Const32 [c]) (Const64 [d])) 12816 // cond: 12817 // result: (Const32 [int64(int32(c) << uint64(d))]) 12818 for { 12819 _ = v.Args[1] 12820 v_0 := v.Args[0] 12821 if v_0.Op != OpConst32 { 12822 break 12823 } 12824 c := v_0.AuxInt 12825 v_1 := v.Args[1] 12826 if v_1.Op != OpConst64 { 12827 break 12828 } 12829 d := v_1.AuxInt 12830 v.reset(OpConst32) 12831 v.AuxInt = int64(int32(c) << uint64(d)) 12832 return true 12833 } 12834 // match: (Lsh32x64 x (Const64 [0])) 12835 // cond: 12836 // result: x 12837 for { 12838 _ = v.Args[1] 12839 x := v.Args[0] 12840 v_1 := v.Args[1] 12841 if v_1.Op != OpConst64 { 12842 break 12843 } 12844 if v_1.AuxInt != 0 { 12845 break 12846 } 12847 v.reset(OpCopy) 12848 v.Type = x.Type 12849 v.AddArg(x) 12850 return true 12851 } 12852 // match: (Lsh32x64 (Const32 [0]) _) 12853 // cond: 12854 // result: (Const32 [0]) 12855 for { 12856 _ = v.Args[1] 12857 v_0 := v.Args[0] 12858 if v_0.Op != OpConst32 { 12859 break 12860 } 12861 if v_0.AuxInt != 0 { 12862 break 12863 } 12864 v.reset(OpConst32) 12865 v.AuxInt = 0 12866 return true 12867 } 12868 // match: (Lsh32x64 _ (Const64 [c])) 12869 // cond: uint64(c) >= 32 12870 // result: (Const32 [0]) 12871 for { 12872 _ = v.Args[1] 12873 v_1 := v.Args[1] 12874 if v_1.Op != OpConst64 { 12875 break 12876 } 12877 c := v_1.AuxInt 12878 if !(uint64(c) >= 32) { 12879 break 12880 } 12881 v.reset(OpConst32) 12882 v.AuxInt = 0 12883 return true 12884 } 12885 // match: (Lsh32x64 <t> (Lsh32x64 x (Const64 [c])) (Const64 [d])) 12886 // cond: !uaddOvf(c,d) 12887 // result: (Lsh32x64 x (Const64 <t> [c+d])) 12888 for { 12889 t := v.Type 12890 _ = v.Args[1] 12891 v_0 := v.Args[0] 12892 if v_0.Op != OpLsh32x64 { 12893 break 12894 } 12895 _ = v_0.Args[1] 12896 x := v_0.Args[0] 12897 v_0_1 := v_0.Args[1] 12898 if v_0_1.Op != OpConst64 { 12899 break 12900 } 12901 c := v_0_1.AuxInt 12902 v_1 := v.Args[1] 12903 if v_1.Op != OpConst64 { 12904 break 12905 } 12906 d := v_1.AuxInt 12907 if !(!uaddOvf(c, d)) { 12908 break 12909 } 12910 v.reset(OpLsh32x64) 12911 v.AddArg(x) 12912 v0 := b.NewValue0(v.Pos, OpConst64, t) 12913 v0.AuxInt = c + d 12914 v.AddArg(v0) 12915 return true 12916 } 12917 // match: (Lsh32x64 (Rsh32Ux64 (Lsh32x64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 12918 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 12919 // result: (Lsh32x64 x (Const64 <typ.UInt64> [c1-c2+c3])) 12920 for { 12921 _ = v.Args[1] 12922 v_0 := v.Args[0] 12923 if v_0.Op != OpRsh32Ux64 { 12924 break 12925 } 12926 _ = v_0.Args[1] 12927 v_0_0 := v_0.Args[0] 12928 if v_0_0.Op != OpLsh32x64 { 12929 break 12930 } 12931 _ = v_0_0.Args[1] 12932 x := v_0_0.Args[0] 12933 v_0_0_1 := v_0_0.Args[1] 12934 if v_0_0_1.Op != OpConst64 { 12935 break 12936 } 12937 c1 := v_0_0_1.AuxInt 12938 v_0_1 := v_0.Args[1] 12939 if v_0_1.Op != OpConst64 { 12940 break 12941 } 12942 c2 := v_0_1.AuxInt 12943 v_1 := v.Args[1] 12944 if v_1.Op != OpConst64 { 12945 break 12946 } 12947 c3 := v_1.AuxInt 12948 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 12949 break 12950 } 12951 v.reset(OpLsh32x64) 12952 v.AddArg(x) 12953 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 12954 v0.AuxInt = c1 - c2 + c3 12955 v.AddArg(v0) 12956 return true 12957 } 12958 return false 12959 } 12960 func rewriteValuegeneric_OpLsh32x8_0(v *Value) bool { 12961 b := v.Block 12962 _ = b 12963 // match: (Lsh32x8 <t> x (Const8 [c])) 12964 // cond: 12965 // result: (Lsh32x64 x (Const64 <t> [int64(uint8(c))])) 12966 for { 12967 t := v.Type 12968 _ = v.Args[1] 12969 x := v.Args[0] 12970 v_1 := v.Args[1] 12971 if v_1.Op != OpConst8 { 12972 break 12973 } 12974 c := v_1.AuxInt 12975 v.reset(OpLsh32x64) 12976 v.AddArg(x) 12977 v0 := b.NewValue0(v.Pos, OpConst64, t) 12978 v0.AuxInt = int64(uint8(c)) 12979 v.AddArg(v0) 12980 return true 12981 } 12982 // match: (Lsh32x8 (Const32 [0]) _) 12983 // cond: 12984 // result: (Const32 [0]) 12985 for { 12986 _ = v.Args[1] 12987 v_0 := v.Args[0] 12988 if v_0.Op != OpConst32 { 12989 break 12990 } 12991 if v_0.AuxInt != 0 { 12992 break 12993 } 12994 v.reset(OpConst32) 12995 v.AuxInt = 0 12996 return true 12997 } 12998 return false 12999 } 13000 func rewriteValuegeneric_OpLsh64x16_0(v *Value) bool { 13001 b := v.Block 13002 _ = b 13003 // match: (Lsh64x16 <t> x (Const16 [c])) 13004 // cond: 13005 // result: (Lsh64x64 x (Const64 <t> [int64(uint16(c))])) 13006 for { 13007 t := v.Type 13008 _ = v.Args[1] 13009 x := v.Args[0] 13010 v_1 := v.Args[1] 13011 if v_1.Op != OpConst16 { 13012 break 13013 } 13014 c := v_1.AuxInt 13015 v.reset(OpLsh64x64) 13016 v.AddArg(x) 13017 v0 := b.NewValue0(v.Pos, OpConst64, t) 13018 v0.AuxInt = int64(uint16(c)) 13019 v.AddArg(v0) 13020 return true 13021 } 13022 // match: (Lsh64x16 (Const64 [0]) _) 13023 // cond: 13024 // result: (Const64 [0]) 13025 for { 13026 _ = v.Args[1] 13027 v_0 := v.Args[0] 13028 if v_0.Op != OpConst64 { 13029 break 13030 } 13031 if v_0.AuxInt != 0 { 13032 break 13033 } 13034 v.reset(OpConst64) 13035 v.AuxInt = 0 13036 return true 13037 } 13038 return false 13039 } 13040 func rewriteValuegeneric_OpLsh64x32_0(v *Value) bool { 13041 b := v.Block 13042 _ = b 13043 // match: (Lsh64x32 <t> x (Const32 [c])) 13044 // cond: 13045 // result: (Lsh64x64 x (Const64 <t> [int64(uint32(c))])) 13046 for { 13047 t := v.Type 13048 _ = v.Args[1] 13049 x := v.Args[0] 13050 v_1 := v.Args[1] 13051 if v_1.Op != OpConst32 { 13052 break 13053 } 13054 c := v_1.AuxInt 13055 v.reset(OpLsh64x64) 13056 v.AddArg(x) 13057 v0 := b.NewValue0(v.Pos, OpConst64, t) 13058 v0.AuxInt = int64(uint32(c)) 13059 v.AddArg(v0) 13060 return true 13061 } 13062 // match: (Lsh64x32 (Const64 [0]) _) 13063 // cond: 13064 // result: (Const64 [0]) 13065 for { 13066 _ = v.Args[1] 13067 v_0 := v.Args[0] 13068 if v_0.Op != OpConst64 { 13069 break 13070 } 13071 if v_0.AuxInt != 0 { 13072 break 13073 } 13074 v.reset(OpConst64) 13075 v.AuxInt = 0 13076 return true 13077 } 13078 return false 13079 } 13080 func rewriteValuegeneric_OpLsh64x64_0(v *Value) bool { 13081 b := v.Block 13082 _ = b 13083 typ := &b.Func.Config.Types 13084 _ = typ 13085 // match: (Lsh64x64 (Const64 [c]) (Const64 [d])) 13086 // cond: 13087 // result: (Const64 [c << uint64(d)]) 13088 for { 13089 _ = v.Args[1] 13090 v_0 := v.Args[0] 13091 if v_0.Op != OpConst64 { 13092 break 13093 } 13094 c := v_0.AuxInt 13095 v_1 := v.Args[1] 13096 if v_1.Op != OpConst64 { 13097 break 13098 } 13099 d := v_1.AuxInt 13100 v.reset(OpConst64) 13101 v.AuxInt = c << uint64(d) 13102 return true 13103 } 13104 // match: (Lsh64x64 x (Const64 [0])) 13105 // cond: 13106 // result: x 13107 for { 13108 _ = v.Args[1] 13109 x := v.Args[0] 13110 v_1 := v.Args[1] 13111 if v_1.Op != OpConst64 { 13112 break 13113 } 13114 if v_1.AuxInt != 0 { 13115 break 13116 } 13117 v.reset(OpCopy) 13118 v.Type = x.Type 13119 v.AddArg(x) 13120 return true 13121 } 13122 // match: (Lsh64x64 (Const64 [0]) _) 13123 // cond: 13124 // result: (Const64 [0]) 13125 for { 13126 _ = v.Args[1] 13127 v_0 := v.Args[0] 13128 if v_0.Op != OpConst64 { 13129 break 13130 } 13131 if v_0.AuxInt != 0 { 13132 break 13133 } 13134 v.reset(OpConst64) 13135 v.AuxInt = 0 13136 return true 13137 } 13138 // match: (Lsh64x64 _ (Const64 [c])) 13139 // cond: uint64(c) >= 64 13140 // result: (Const64 [0]) 13141 for { 13142 _ = v.Args[1] 13143 v_1 := v.Args[1] 13144 if v_1.Op != OpConst64 { 13145 break 13146 } 13147 c := v_1.AuxInt 13148 if !(uint64(c) >= 64) { 13149 break 13150 } 13151 v.reset(OpConst64) 13152 v.AuxInt = 0 13153 return true 13154 } 13155 // match: (Lsh64x64 <t> (Lsh64x64 x (Const64 [c])) (Const64 [d])) 13156 // cond: !uaddOvf(c,d) 13157 // result: (Lsh64x64 x (Const64 <t> [c+d])) 13158 for { 13159 t := v.Type 13160 _ = v.Args[1] 13161 v_0 := v.Args[0] 13162 if v_0.Op != OpLsh64x64 { 13163 break 13164 } 13165 _ = v_0.Args[1] 13166 x := v_0.Args[0] 13167 v_0_1 := v_0.Args[1] 13168 if v_0_1.Op != OpConst64 { 13169 break 13170 } 13171 c := v_0_1.AuxInt 13172 v_1 := v.Args[1] 13173 if v_1.Op != OpConst64 { 13174 break 13175 } 13176 d := v_1.AuxInt 13177 if !(!uaddOvf(c, d)) { 13178 break 13179 } 13180 v.reset(OpLsh64x64) 13181 v.AddArg(x) 13182 v0 := b.NewValue0(v.Pos, OpConst64, t) 13183 v0.AuxInt = c + d 13184 v.AddArg(v0) 13185 return true 13186 } 13187 // match: (Lsh64x64 (Rsh64Ux64 (Lsh64x64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 13188 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 13189 // result: (Lsh64x64 x (Const64 <typ.UInt64> [c1-c2+c3])) 13190 for { 13191 _ = v.Args[1] 13192 v_0 := v.Args[0] 13193 if v_0.Op != OpRsh64Ux64 { 13194 break 13195 } 13196 _ = v_0.Args[1] 13197 v_0_0 := v_0.Args[0] 13198 if v_0_0.Op != OpLsh64x64 { 13199 break 13200 } 13201 _ = v_0_0.Args[1] 13202 x := v_0_0.Args[0] 13203 v_0_0_1 := v_0_0.Args[1] 13204 if v_0_0_1.Op != OpConst64 { 13205 break 13206 } 13207 c1 := v_0_0_1.AuxInt 13208 v_0_1 := v_0.Args[1] 13209 if v_0_1.Op != OpConst64 { 13210 break 13211 } 13212 c2 := v_0_1.AuxInt 13213 v_1 := v.Args[1] 13214 if v_1.Op != OpConst64 { 13215 break 13216 } 13217 c3 := v_1.AuxInt 13218 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 13219 break 13220 } 13221 v.reset(OpLsh64x64) 13222 v.AddArg(x) 13223 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 13224 v0.AuxInt = c1 - c2 + c3 13225 v.AddArg(v0) 13226 return true 13227 } 13228 return false 13229 } 13230 func rewriteValuegeneric_OpLsh64x8_0(v *Value) bool { 13231 b := v.Block 13232 _ = b 13233 // match: (Lsh64x8 <t> x (Const8 [c])) 13234 // cond: 13235 // result: (Lsh64x64 x (Const64 <t> [int64(uint8(c))])) 13236 for { 13237 t := v.Type 13238 _ = v.Args[1] 13239 x := v.Args[0] 13240 v_1 := v.Args[1] 13241 if v_1.Op != OpConst8 { 13242 break 13243 } 13244 c := v_1.AuxInt 13245 v.reset(OpLsh64x64) 13246 v.AddArg(x) 13247 v0 := b.NewValue0(v.Pos, OpConst64, t) 13248 v0.AuxInt = int64(uint8(c)) 13249 v.AddArg(v0) 13250 return true 13251 } 13252 // match: (Lsh64x8 (Const64 [0]) _) 13253 // cond: 13254 // result: (Const64 [0]) 13255 for { 13256 _ = v.Args[1] 13257 v_0 := v.Args[0] 13258 if v_0.Op != OpConst64 { 13259 break 13260 } 13261 if v_0.AuxInt != 0 { 13262 break 13263 } 13264 v.reset(OpConst64) 13265 v.AuxInt = 0 13266 return true 13267 } 13268 return false 13269 } 13270 func rewriteValuegeneric_OpLsh8x16_0(v *Value) bool { 13271 b := v.Block 13272 _ = b 13273 // match: (Lsh8x16 <t> x (Const16 [c])) 13274 // cond: 13275 // result: (Lsh8x64 x (Const64 <t> [int64(uint16(c))])) 13276 for { 13277 t := v.Type 13278 _ = v.Args[1] 13279 x := v.Args[0] 13280 v_1 := v.Args[1] 13281 if v_1.Op != OpConst16 { 13282 break 13283 } 13284 c := v_1.AuxInt 13285 v.reset(OpLsh8x64) 13286 v.AddArg(x) 13287 v0 := b.NewValue0(v.Pos, OpConst64, t) 13288 v0.AuxInt = int64(uint16(c)) 13289 v.AddArg(v0) 13290 return true 13291 } 13292 // match: (Lsh8x16 (Const8 [0]) _) 13293 // cond: 13294 // result: (Const8 [0]) 13295 for { 13296 _ = v.Args[1] 13297 v_0 := v.Args[0] 13298 if v_0.Op != OpConst8 { 13299 break 13300 } 13301 if v_0.AuxInt != 0 { 13302 break 13303 } 13304 v.reset(OpConst8) 13305 v.AuxInt = 0 13306 return true 13307 } 13308 return false 13309 } 13310 func rewriteValuegeneric_OpLsh8x32_0(v *Value) bool { 13311 b := v.Block 13312 _ = b 13313 // match: (Lsh8x32 <t> x (Const32 [c])) 13314 // cond: 13315 // result: (Lsh8x64 x (Const64 <t> [int64(uint32(c))])) 13316 for { 13317 t := v.Type 13318 _ = v.Args[1] 13319 x := v.Args[0] 13320 v_1 := v.Args[1] 13321 if v_1.Op != OpConst32 { 13322 break 13323 } 13324 c := v_1.AuxInt 13325 v.reset(OpLsh8x64) 13326 v.AddArg(x) 13327 v0 := b.NewValue0(v.Pos, OpConst64, t) 13328 v0.AuxInt = int64(uint32(c)) 13329 v.AddArg(v0) 13330 return true 13331 } 13332 // match: (Lsh8x32 (Const8 [0]) _) 13333 // cond: 13334 // result: (Const8 [0]) 13335 for { 13336 _ = v.Args[1] 13337 v_0 := v.Args[0] 13338 if v_0.Op != OpConst8 { 13339 break 13340 } 13341 if v_0.AuxInt != 0 { 13342 break 13343 } 13344 v.reset(OpConst8) 13345 v.AuxInt = 0 13346 return true 13347 } 13348 return false 13349 } 13350 func rewriteValuegeneric_OpLsh8x64_0(v *Value) bool { 13351 b := v.Block 13352 _ = b 13353 typ := &b.Func.Config.Types 13354 _ = typ 13355 // match: (Lsh8x64 (Const8 [c]) (Const64 [d])) 13356 // cond: 13357 // result: (Const8 [int64(int8(c) << uint64(d))]) 13358 for { 13359 _ = v.Args[1] 13360 v_0 := v.Args[0] 13361 if v_0.Op != OpConst8 { 13362 break 13363 } 13364 c := v_0.AuxInt 13365 v_1 := v.Args[1] 13366 if v_1.Op != OpConst64 { 13367 break 13368 } 13369 d := v_1.AuxInt 13370 v.reset(OpConst8) 13371 v.AuxInt = int64(int8(c) << uint64(d)) 13372 return true 13373 } 13374 // match: (Lsh8x64 x (Const64 [0])) 13375 // cond: 13376 // result: x 13377 for { 13378 _ = v.Args[1] 13379 x := v.Args[0] 13380 v_1 := v.Args[1] 13381 if v_1.Op != OpConst64 { 13382 break 13383 } 13384 if v_1.AuxInt != 0 { 13385 break 13386 } 13387 v.reset(OpCopy) 13388 v.Type = x.Type 13389 v.AddArg(x) 13390 return true 13391 } 13392 // match: (Lsh8x64 (Const8 [0]) _) 13393 // cond: 13394 // result: (Const8 [0]) 13395 for { 13396 _ = v.Args[1] 13397 v_0 := v.Args[0] 13398 if v_0.Op != OpConst8 { 13399 break 13400 } 13401 if v_0.AuxInt != 0 { 13402 break 13403 } 13404 v.reset(OpConst8) 13405 v.AuxInt = 0 13406 return true 13407 } 13408 // match: (Lsh8x64 _ (Const64 [c])) 13409 // cond: uint64(c) >= 8 13410 // result: (Const8 [0]) 13411 for { 13412 _ = v.Args[1] 13413 v_1 := v.Args[1] 13414 if v_1.Op != OpConst64 { 13415 break 13416 } 13417 c := v_1.AuxInt 13418 if !(uint64(c) >= 8) { 13419 break 13420 } 13421 v.reset(OpConst8) 13422 v.AuxInt = 0 13423 return true 13424 } 13425 // match: (Lsh8x64 <t> (Lsh8x64 x (Const64 [c])) (Const64 [d])) 13426 // cond: !uaddOvf(c,d) 13427 // result: (Lsh8x64 x (Const64 <t> [c+d])) 13428 for { 13429 t := v.Type 13430 _ = v.Args[1] 13431 v_0 := v.Args[0] 13432 if v_0.Op != OpLsh8x64 { 13433 break 13434 } 13435 _ = v_0.Args[1] 13436 x := v_0.Args[0] 13437 v_0_1 := v_0.Args[1] 13438 if v_0_1.Op != OpConst64 { 13439 break 13440 } 13441 c := v_0_1.AuxInt 13442 v_1 := v.Args[1] 13443 if v_1.Op != OpConst64 { 13444 break 13445 } 13446 d := v_1.AuxInt 13447 if !(!uaddOvf(c, d)) { 13448 break 13449 } 13450 v.reset(OpLsh8x64) 13451 v.AddArg(x) 13452 v0 := b.NewValue0(v.Pos, OpConst64, t) 13453 v0.AuxInt = c + d 13454 v.AddArg(v0) 13455 return true 13456 } 13457 // match: (Lsh8x64 (Rsh8Ux64 (Lsh8x64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 13458 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 13459 // result: (Lsh8x64 x (Const64 <typ.UInt64> [c1-c2+c3])) 13460 for { 13461 _ = v.Args[1] 13462 v_0 := v.Args[0] 13463 if v_0.Op != OpRsh8Ux64 { 13464 break 13465 } 13466 _ = v_0.Args[1] 13467 v_0_0 := v_0.Args[0] 13468 if v_0_0.Op != OpLsh8x64 { 13469 break 13470 } 13471 _ = v_0_0.Args[1] 13472 x := v_0_0.Args[0] 13473 v_0_0_1 := v_0_0.Args[1] 13474 if v_0_0_1.Op != OpConst64 { 13475 break 13476 } 13477 c1 := v_0_0_1.AuxInt 13478 v_0_1 := v_0.Args[1] 13479 if v_0_1.Op != OpConst64 { 13480 break 13481 } 13482 c2 := v_0_1.AuxInt 13483 v_1 := v.Args[1] 13484 if v_1.Op != OpConst64 { 13485 break 13486 } 13487 c3 := v_1.AuxInt 13488 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 13489 break 13490 } 13491 v.reset(OpLsh8x64) 13492 v.AddArg(x) 13493 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 13494 v0.AuxInt = c1 - c2 + c3 13495 v.AddArg(v0) 13496 return true 13497 } 13498 return false 13499 } 13500 func rewriteValuegeneric_OpLsh8x8_0(v *Value) bool { 13501 b := v.Block 13502 _ = b 13503 // match: (Lsh8x8 <t> x (Const8 [c])) 13504 // cond: 13505 // result: (Lsh8x64 x (Const64 <t> [int64(uint8(c))])) 13506 for { 13507 t := v.Type 13508 _ = v.Args[1] 13509 x := v.Args[0] 13510 v_1 := v.Args[1] 13511 if v_1.Op != OpConst8 { 13512 break 13513 } 13514 c := v_1.AuxInt 13515 v.reset(OpLsh8x64) 13516 v.AddArg(x) 13517 v0 := b.NewValue0(v.Pos, OpConst64, t) 13518 v0.AuxInt = int64(uint8(c)) 13519 v.AddArg(v0) 13520 return true 13521 } 13522 // match: (Lsh8x8 (Const8 [0]) _) 13523 // cond: 13524 // result: (Const8 [0]) 13525 for { 13526 _ = v.Args[1] 13527 v_0 := v.Args[0] 13528 if v_0.Op != OpConst8 { 13529 break 13530 } 13531 if v_0.AuxInt != 0 { 13532 break 13533 } 13534 v.reset(OpConst8) 13535 v.AuxInt = 0 13536 return true 13537 } 13538 return false 13539 } 13540 func rewriteValuegeneric_OpMod16_0(v *Value) bool { 13541 b := v.Block 13542 _ = b 13543 // match: (Mod16 (Const16 [c]) (Const16 [d])) 13544 // cond: d != 0 13545 // result: (Const16 [int64(int16(c % d))]) 13546 for { 13547 _ = v.Args[1] 13548 v_0 := v.Args[0] 13549 if v_0.Op != OpConst16 { 13550 break 13551 } 13552 c := v_0.AuxInt 13553 v_1 := v.Args[1] 13554 if v_1.Op != OpConst16 { 13555 break 13556 } 13557 d := v_1.AuxInt 13558 if !(d != 0) { 13559 break 13560 } 13561 v.reset(OpConst16) 13562 v.AuxInt = int64(int16(c % d)) 13563 return true 13564 } 13565 // match: (Mod16 <t> n (Const16 [c])) 13566 // cond: isNonNegative(n) && isPowerOfTwo(c&0xffff) 13567 // result: (And16 n (Const16 <t> [(c&0xffff)-1])) 13568 for { 13569 t := v.Type 13570 _ = v.Args[1] 13571 n := v.Args[0] 13572 v_1 := v.Args[1] 13573 if v_1.Op != OpConst16 { 13574 break 13575 } 13576 c := v_1.AuxInt 13577 if !(isNonNegative(n) && isPowerOfTwo(c&0xffff)) { 13578 break 13579 } 13580 v.reset(OpAnd16) 13581 v.AddArg(n) 13582 v0 := b.NewValue0(v.Pos, OpConst16, t) 13583 v0.AuxInt = (c & 0xffff) - 1 13584 v.AddArg(v0) 13585 return true 13586 } 13587 // match: (Mod16 <t> n (Const16 [c])) 13588 // cond: c < 0 && c != -1<<15 13589 // result: (Mod16 <t> n (Const16 <t> [-c])) 13590 for { 13591 t := v.Type 13592 _ = v.Args[1] 13593 n := v.Args[0] 13594 v_1 := v.Args[1] 13595 if v_1.Op != OpConst16 { 13596 break 13597 } 13598 c := v_1.AuxInt 13599 if !(c < 0 && c != -1<<15) { 13600 break 13601 } 13602 v.reset(OpMod16) 13603 v.Type = t 13604 v.AddArg(n) 13605 v0 := b.NewValue0(v.Pos, OpConst16, t) 13606 v0.AuxInt = -c 13607 v.AddArg(v0) 13608 return true 13609 } 13610 // match: (Mod16 <t> x (Const16 [c])) 13611 // cond: x.Op != OpConst16 && (c > 0 || c == -1<<15) 13612 // result: (Sub16 x (Mul16 <t> (Div16 <t> x (Const16 <t> [c])) (Const16 <t> [c]))) 13613 for { 13614 t := v.Type 13615 _ = v.Args[1] 13616 x := v.Args[0] 13617 v_1 := v.Args[1] 13618 if v_1.Op != OpConst16 { 13619 break 13620 } 13621 c := v_1.AuxInt 13622 if !(x.Op != OpConst16 && (c > 0 || c == -1<<15)) { 13623 break 13624 } 13625 v.reset(OpSub16) 13626 v.AddArg(x) 13627 v0 := b.NewValue0(v.Pos, OpMul16, t) 13628 v1 := b.NewValue0(v.Pos, OpDiv16, t) 13629 v1.AddArg(x) 13630 v2 := b.NewValue0(v.Pos, OpConst16, t) 13631 v2.AuxInt = c 13632 v1.AddArg(v2) 13633 v0.AddArg(v1) 13634 v3 := b.NewValue0(v.Pos, OpConst16, t) 13635 v3.AuxInt = c 13636 v0.AddArg(v3) 13637 v.AddArg(v0) 13638 return true 13639 } 13640 return false 13641 } 13642 func rewriteValuegeneric_OpMod16u_0(v *Value) bool { 13643 b := v.Block 13644 _ = b 13645 // match: (Mod16u (Const16 [c]) (Const16 [d])) 13646 // cond: d != 0 13647 // result: (Const16 [int64(uint16(c) % uint16(d))]) 13648 for { 13649 _ = v.Args[1] 13650 v_0 := v.Args[0] 13651 if v_0.Op != OpConst16 { 13652 break 13653 } 13654 c := v_0.AuxInt 13655 v_1 := v.Args[1] 13656 if v_1.Op != OpConst16 { 13657 break 13658 } 13659 d := v_1.AuxInt 13660 if !(d != 0) { 13661 break 13662 } 13663 v.reset(OpConst16) 13664 v.AuxInt = int64(uint16(c) % uint16(d)) 13665 return true 13666 } 13667 // match: (Mod16u <t> n (Const16 [c])) 13668 // cond: isPowerOfTwo(c&0xffff) 13669 // result: (And16 n (Const16 <t> [(c&0xffff)-1])) 13670 for { 13671 t := v.Type 13672 _ = v.Args[1] 13673 n := v.Args[0] 13674 v_1 := v.Args[1] 13675 if v_1.Op != OpConst16 { 13676 break 13677 } 13678 c := v_1.AuxInt 13679 if !(isPowerOfTwo(c & 0xffff)) { 13680 break 13681 } 13682 v.reset(OpAnd16) 13683 v.AddArg(n) 13684 v0 := b.NewValue0(v.Pos, OpConst16, t) 13685 v0.AuxInt = (c & 0xffff) - 1 13686 v.AddArg(v0) 13687 return true 13688 } 13689 // match: (Mod16u <t> x (Const16 [c])) 13690 // cond: x.Op != OpConst16 && c > 0 && umagicOK(16,c) 13691 // result: (Sub16 x (Mul16 <t> (Div16u <t> x (Const16 <t> [c])) (Const16 <t> [c]))) 13692 for { 13693 t := v.Type 13694 _ = v.Args[1] 13695 x := v.Args[0] 13696 v_1 := v.Args[1] 13697 if v_1.Op != OpConst16 { 13698 break 13699 } 13700 c := v_1.AuxInt 13701 if !(x.Op != OpConst16 && c > 0 && umagicOK(16, c)) { 13702 break 13703 } 13704 v.reset(OpSub16) 13705 v.AddArg(x) 13706 v0 := b.NewValue0(v.Pos, OpMul16, t) 13707 v1 := b.NewValue0(v.Pos, OpDiv16u, t) 13708 v1.AddArg(x) 13709 v2 := b.NewValue0(v.Pos, OpConst16, t) 13710 v2.AuxInt = c 13711 v1.AddArg(v2) 13712 v0.AddArg(v1) 13713 v3 := b.NewValue0(v.Pos, OpConst16, t) 13714 v3.AuxInt = c 13715 v0.AddArg(v3) 13716 v.AddArg(v0) 13717 return true 13718 } 13719 return false 13720 } 13721 func rewriteValuegeneric_OpMod32_0(v *Value) bool { 13722 b := v.Block 13723 _ = b 13724 // match: (Mod32 (Const32 [c]) (Const32 [d])) 13725 // cond: d != 0 13726 // result: (Const32 [int64(int32(c % d))]) 13727 for { 13728 _ = v.Args[1] 13729 v_0 := v.Args[0] 13730 if v_0.Op != OpConst32 { 13731 break 13732 } 13733 c := v_0.AuxInt 13734 v_1 := v.Args[1] 13735 if v_1.Op != OpConst32 { 13736 break 13737 } 13738 d := v_1.AuxInt 13739 if !(d != 0) { 13740 break 13741 } 13742 v.reset(OpConst32) 13743 v.AuxInt = int64(int32(c % d)) 13744 return true 13745 } 13746 // match: (Mod32 <t> n (Const32 [c])) 13747 // cond: isNonNegative(n) && isPowerOfTwo(c&0xffffffff) 13748 // result: (And32 n (Const32 <t> [(c&0xffffffff)-1])) 13749 for { 13750 t := v.Type 13751 _ = v.Args[1] 13752 n := v.Args[0] 13753 v_1 := v.Args[1] 13754 if v_1.Op != OpConst32 { 13755 break 13756 } 13757 c := v_1.AuxInt 13758 if !(isNonNegative(n) && isPowerOfTwo(c&0xffffffff)) { 13759 break 13760 } 13761 v.reset(OpAnd32) 13762 v.AddArg(n) 13763 v0 := b.NewValue0(v.Pos, OpConst32, t) 13764 v0.AuxInt = (c & 0xffffffff) - 1 13765 v.AddArg(v0) 13766 return true 13767 } 13768 // match: (Mod32 <t> n (Const32 [c])) 13769 // cond: c < 0 && c != -1<<31 13770 // result: (Mod32 <t> n (Const32 <t> [-c])) 13771 for { 13772 t := v.Type 13773 _ = v.Args[1] 13774 n := v.Args[0] 13775 v_1 := v.Args[1] 13776 if v_1.Op != OpConst32 { 13777 break 13778 } 13779 c := v_1.AuxInt 13780 if !(c < 0 && c != -1<<31) { 13781 break 13782 } 13783 v.reset(OpMod32) 13784 v.Type = t 13785 v.AddArg(n) 13786 v0 := b.NewValue0(v.Pos, OpConst32, t) 13787 v0.AuxInt = -c 13788 v.AddArg(v0) 13789 return true 13790 } 13791 // match: (Mod32 <t> x (Const32 [c])) 13792 // cond: x.Op != OpConst32 && (c > 0 || c == -1<<31) 13793 // result: (Sub32 x (Mul32 <t> (Div32 <t> x (Const32 <t> [c])) (Const32 <t> [c]))) 13794 for { 13795 t := v.Type 13796 _ = v.Args[1] 13797 x := v.Args[0] 13798 v_1 := v.Args[1] 13799 if v_1.Op != OpConst32 { 13800 break 13801 } 13802 c := v_1.AuxInt 13803 if !(x.Op != OpConst32 && (c > 0 || c == -1<<31)) { 13804 break 13805 } 13806 v.reset(OpSub32) 13807 v.AddArg(x) 13808 v0 := b.NewValue0(v.Pos, OpMul32, t) 13809 v1 := b.NewValue0(v.Pos, OpDiv32, t) 13810 v1.AddArg(x) 13811 v2 := b.NewValue0(v.Pos, OpConst32, t) 13812 v2.AuxInt = c 13813 v1.AddArg(v2) 13814 v0.AddArg(v1) 13815 v3 := b.NewValue0(v.Pos, OpConst32, t) 13816 v3.AuxInt = c 13817 v0.AddArg(v3) 13818 v.AddArg(v0) 13819 return true 13820 } 13821 return false 13822 } 13823 func rewriteValuegeneric_OpMod32u_0(v *Value) bool { 13824 b := v.Block 13825 _ = b 13826 // match: (Mod32u (Const32 [c]) (Const32 [d])) 13827 // cond: d != 0 13828 // result: (Const32 [int64(uint32(c) % uint32(d))]) 13829 for { 13830 _ = v.Args[1] 13831 v_0 := v.Args[0] 13832 if v_0.Op != OpConst32 { 13833 break 13834 } 13835 c := v_0.AuxInt 13836 v_1 := v.Args[1] 13837 if v_1.Op != OpConst32 { 13838 break 13839 } 13840 d := v_1.AuxInt 13841 if !(d != 0) { 13842 break 13843 } 13844 v.reset(OpConst32) 13845 v.AuxInt = int64(uint32(c) % uint32(d)) 13846 return true 13847 } 13848 // match: (Mod32u <t> n (Const32 [c])) 13849 // cond: isPowerOfTwo(c&0xffffffff) 13850 // result: (And32 n (Const32 <t> [(c&0xffffffff)-1])) 13851 for { 13852 t := v.Type 13853 _ = v.Args[1] 13854 n := v.Args[0] 13855 v_1 := v.Args[1] 13856 if v_1.Op != OpConst32 { 13857 break 13858 } 13859 c := v_1.AuxInt 13860 if !(isPowerOfTwo(c & 0xffffffff)) { 13861 break 13862 } 13863 v.reset(OpAnd32) 13864 v.AddArg(n) 13865 v0 := b.NewValue0(v.Pos, OpConst32, t) 13866 v0.AuxInt = (c & 0xffffffff) - 1 13867 v.AddArg(v0) 13868 return true 13869 } 13870 // match: (Mod32u <t> x (Const32 [c])) 13871 // cond: x.Op != OpConst32 && c > 0 && umagicOK(32,c) 13872 // result: (Sub32 x (Mul32 <t> (Div32u <t> x (Const32 <t> [c])) (Const32 <t> [c]))) 13873 for { 13874 t := v.Type 13875 _ = v.Args[1] 13876 x := v.Args[0] 13877 v_1 := v.Args[1] 13878 if v_1.Op != OpConst32 { 13879 break 13880 } 13881 c := v_1.AuxInt 13882 if !(x.Op != OpConst32 && c > 0 && umagicOK(32, c)) { 13883 break 13884 } 13885 v.reset(OpSub32) 13886 v.AddArg(x) 13887 v0 := b.NewValue0(v.Pos, OpMul32, t) 13888 v1 := b.NewValue0(v.Pos, OpDiv32u, t) 13889 v1.AddArg(x) 13890 v2 := b.NewValue0(v.Pos, OpConst32, t) 13891 v2.AuxInt = c 13892 v1.AddArg(v2) 13893 v0.AddArg(v1) 13894 v3 := b.NewValue0(v.Pos, OpConst32, t) 13895 v3.AuxInt = c 13896 v0.AddArg(v3) 13897 v.AddArg(v0) 13898 return true 13899 } 13900 return false 13901 } 13902 func rewriteValuegeneric_OpMod64_0(v *Value) bool { 13903 b := v.Block 13904 _ = b 13905 // match: (Mod64 (Const64 [c]) (Const64 [d])) 13906 // cond: d != 0 13907 // result: (Const64 [c % d]) 13908 for { 13909 _ = v.Args[1] 13910 v_0 := v.Args[0] 13911 if v_0.Op != OpConst64 { 13912 break 13913 } 13914 c := v_0.AuxInt 13915 v_1 := v.Args[1] 13916 if v_1.Op != OpConst64 { 13917 break 13918 } 13919 d := v_1.AuxInt 13920 if !(d != 0) { 13921 break 13922 } 13923 v.reset(OpConst64) 13924 v.AuxInt = c % d 13925 return true 13926 } 13927 // match: (Mod64 <t> n (Const64 [c])) 13928 // cond: isNonNegative(n) && isPowerOfTwo(c) 13929 // result: (And64 n (Const64 <t> [c-1])) 13930 for { 13931 t := v.Type 13932 _ = v.Args[1] 13933 n := v.Args[0] 13934 v_1 := v.Args[1] 13935 if v_1.Op != OpConst64 { 13936 break 13937 } 13938 c := v_1.AuxInt 13939 if !(isNonNegative(n) && isPowerOfTwo(c)) { 13940 break 13941 } 13942 v.reset(OpAnd64) 13943 v.AddArg(n) 13944 v0 := b.NewValue0(v.Pos, OpConst64, t) 13945 v0.AuxInt = c - 1 13946 v.AddArg(v0) 13947 return true 13948 } 13949 // match: (Mod64 n (Const64 [-1<<63])) 13950 // cond: isNonNegative(n) 13951 // result: n 13952 for { 13953 _ = v.Args[1] 13954 n := v.Args[0] 13955 v_1 := v.Args[1] 13956 if v_1.Op != OpConst64 { 13957 break 13958 } 13959 if v_1.AuxInt != -1<<63 { 13960 break 13961 } 13962 if !(isNonNegative(n)) { 13963 break 13964 } 13965 v.reset(OpCopy) 13966 v.Type = n.Type 13967 v.AddArg(n) 13968 return true 13969 } 13970 // match: (Mod64 <t> n (Const64 [c])) 13971 // cond: c < 0 && c != -1<<63 13972 // result: (Mod64 <t> n (Const64 <t> [-c])) 13973 for { 13974 t := v.Type 13975 _ = v.Args[1] 13976 n := v.Args[0] 13977 v_1 := v.Args[1] 13978 if v_1.Op != OpConst64 { 13979 break 13980 } 13981 c := v_1.AuxInt 13982 if !(c < 0 && c != -1<<63) { 13983 break 13984 } 13985 v.reset(OpMod64) 13986 v.Type = t 13987 v.AddArg(n) 13988 v0 := b.NewValue0(v.Pos, OpConst64, t) 13989 v0.AuxInt = -c 13990 v.AddArg(v0) 13991 return true 13992 } 13993 // match: (Mod64 <t> x (Const64 [c])) 13994 // cond: x.Op != OpConst64 && (c > 0 || c == -1<<63) 13995 // result: (Sub64 x (Mul64 <t> (Div64 <t> x (Const64 <t> [c])) (Const64 <t> [c]))) 13996 for { 13997 t := v.Type 13998 _ = v.Args[1] 13999 x := v.Args[0] 14000 v_1 := v.Args[1] 14001 if v_1.Op != OpConst64 { 14002 break 14003 } 14004 c := v_1.AuxInt 14005 if !(x.Op != OpConst64 && (c > 0 || c == -1<<63)) { 14006 break 14007 } 14008 v.reset(OpSub64) 14009 v.AddArg(x) 14010 v0 := b.NewValue0(v.Pos, OpMul64, t) 14011 v1 := b.NewValue0(v.Pos, OpDiv64, t) 14012 v1.AddArg(x) 14013 v2 := b.NewValue0(v.Pos, OpConst64, t) 14014 v2.AuxInt = c 14015 v1.AddArg(v2) 14016 v0.AddArg(v1) 14017 v3 := b.NewValue0(v.Pos, OpConst64, t) 14018 v3.AuxInt = c 14019 v0.AddArg(v3) 14020 v.AddArg(v0) 14021 return true 14022 } 14023 return false 14024 } 14025 func rewriteValuegeneric_OpMod64u_0(v *Value) bool { 14026 b := v.Block 14027 _ = b 14028 // match: (Mod64u (Const64 [c]) (Const64 [d])) 14029 // cond: d != 0 14030 // result: (Const64 [int64(uint64(c) % uint64(d))]) 14031 for { 14032 _ = v.Args[1] 14033 v_0 := v.Args[0] 14034 if v_0.Op != OpConst64 { 14035 break 14036 } 14037 c := v_0.AuxInt 14038 v_1 := v.Args[1] 14039 if v_1.Op != OpConst64 { 14040 break 14041 } 14042 d := v_1.AuxInt 14043 if !(d != 0) { 14044 break 14045 } 14046 v.reset(OpConst64) 14047 v.AuxInt = int64(uint64(c) % uint64(d)) 14048 return true 14049 } 14050 // match: (Mod64u <t> n (Const64 [c])) 14051 // cond: isPowerOfTwo(c) 14052 // result: (And64 n (Const64 <t> [c-1])) 14053 for { 14054 t := v.Type 14055 _ = v.Args[1] 14056 n := v.Args[0] 14057 v_1 := v.Args[1] 14058 if v_1.Op != OpConst64 { 14059 break 14060 } 14061 c := v_1.AuxInt 14062 if !(isPowerOfTwo(c)) { 14063 break 14064 } 14065 v.reset(OpAnd64) 14066 v.AddArg(n) 14067 v0 := b.NewValue0(v.Pos, OpConst64, t) 14068 v0.AuxInt = c - 1 14069 v.AddArg(v0) 14070 return true 14071 } 14072 // match: (Mod64u <t> n (Const64 [-1<<63])) 14073 // cond: 14074 // result: (And64 n (Const64 <t> [1<<63-1])) 14075 for { 14076 t := v.Type 14077 _ = v.Args[1] 14078 n := v.Args[0] 14079 v_1 := v.Args[1] 14080 if v_1.Op != OpConst64 { 14081 break 14082 } 14083 if v_1.AuxInt != -1<<63 { 14084 break 14085 } 14086 v.reset(OpAnd64) 14087 v.AddArg(n) 14088 v0 := b.NewValue0(v.Pos, OpConst64, t) 14089 v0.AuxInt = 1<<63 - 1 14090 v.AddArg(v0) 14091 return true 14092 } 14093 // match: (Mod64u <t> x (Const64 [c])) 14094 // cond: x.Op != OpConst64 && c > 0 && umagicOK(64,c) 14095 // result: (Sub64 x (Mul64 <t> (Div64u <t> x (Const64 <t> [c])) (Const64 <t> [c]))) 14096 for { 14097 t := v.Type 14098 _ = v.Args[1] 14099 x := v.Args[0] 14100 v_1 := v.Args[1] 14101 if v_1.Op != OpConst64 { 14102 break 14103 } 14104 c := v_1.AuxInt 14105 if !(x.Op != OpConst64 && c > 0 && umagicOK(64, c)) { 14106 break 14107 } 14108 v.reset(OpSub64) 14109 v.AddArg(x) 14110 v0 := b.NewValue0(v.Pos, OpMul64, t) 14111 v1 := b.NewValue0(v.Pos, OpDiv64u, t) 14112 v1.AddArg(x) 14113 v2 := b.NewValue0(v.Pos, OpConst64, t) 14114 v2.AuxInt = c 14115 v1.AddArg(v2) 14116 v0.AddArg(v1) 14117 v3 := b.NewValue0(v.Pos, OpConst64, t) 14118 v3.AuxInt = c 14119 v0.AddArg(v3) 14120 v.AddArg(v0) 14121 return true 14122 } 14123 return false 14124 } 14125 func rewriteValuegeneric_OpMod8_0(v *Value) bool { 14126 b := v.Block 14127 _ = b 14128 // match: (Mod8 (Const8 [c]) (Const8 [d])) 14129 // cond: d != 0 14130 // result: (Const8 [int64(int8(c % d))]) 14131 for { 14132 _ = v.Args[1] 14133 v_0 := v.Args[0] 14134 if v_0.Op != OpConst8 { 14135 break 14136 } 14137 c := v_0.AuxInt 14138 v_1 := v.Args[1] 14139 if v_1.Op != OpConst8 { 14140 break 14141 } 14142 d := v_1.AuxInt 14143 if !(d != 0) { 14144 break 14145 } 14146 v.reset(OpConst8) 14147 v.AuxInt = int64(int8(c % d)) 14148 return true 14149 } 14150 // match: (Mod8 <t> n (Const8 [c])) 14151 // cond: isNonNegative(n) && isPowerOfTwo(c&0xff) 14152 // result: (And8 n (Const8 <t> [(c&0xff)-1])) 14153 for { 14154 t := v.Type 14155 _ = v.Args[1] 14156 n := v.Args[0] 14157 v_1 := v.Args[1] 14158 if v_1.Op != OpConst8 { 14159 break 14160 } 14161 c := v_1.AuxInt 14162 if !(isNonNegative(n) && isPowerOfTwo(c&0xff)) { 14163 break 14164 } 14165 v.reset(OpAnd8) 14166 v.AddArg(n) 14167 v0 := b.NewValue0(v.Pos, OpConst8, t) 14168 v0.AuxInt = (c & 0xff) - 1 14169 v.AddArg(v0) 14170 return true 14171 } 14172 // match: (Mod8 <t> n (Const8 [c])) 14173 // cond: c < 0 && c != -1<<7 14174 // result: (Mod8 <t> n (Const8 <t> [-c])) 14175 for { 14176 t := v.Type 14177 _ = v.Args[1] 14178 n := v.Args[0] 14179 v_1 := v.Args[1] 14180 if v_1.Op != OpConst8 { 14181 break 14182 } 14183 c := v_1.AuxInt 14184 if !(c < 0 && c != -1<<7) { 14185 break 14186 } 14187 v.reset(OpMod8) 14188 v.Type = t 14189 v.AddArg(n) 14190 v0 := b.NewValue0(v.Pos, OpConst8, t) 14191 v0.AuxInt = -c 14192 v.AddArg(v0) 14193 return true 14194 } 14195 // match: (Mod8 <t> x (Const8 [c])) 14196 // cond: x.Op != OpConst8 && (c > 0 || c == -1<<7) 14197 // result: (Sub8 x (Mul8 <t> (Div8 <t> x (Const8 <t> [c])) (Const8 <t> [c]))) 14198 for { 14199 t := v.Type 14200 _ = v.Args[1] 14201 x := v.Args[0] 14202 v_1 := v.Args[1] 14203 if v_1.Op != OpConst8 { 14204 break 14205 } 14206 c := v_1.AuxInt 14207 if !(x.Op != OpConst8 && (c > 0 || c == -1<<7)) { 14208 break 14209 } 14210 v.reset(OpSub8) 14211 v.AddArg(x) 14212 v0 := b.NewValue0(v.Pos, OpMul8, t) 14213 v1 := b.NewValue0(v.Pos, OpDiv8, t) 14214 v1.AddArg(x) 14215 v2 := b.NewValue0(v.Pos, OpConst8, t) 14216 v2.AuxInt = c 14217 v1.AddArg(v2) 14218 v0.AddArg(v1) 14219 v3 := b.NewValue0(v.Pos, OpConst8, t) 14220 v3.AuxInt = c 14221 v0.AddArg(v3) 14222 v.AddArg(v0) 14223 return true 14224 } 14225 return false 14226 } 14227 func rewriteValuegeneric_OpMod8u_0(v *Value) bool { 14228 b := v.Block 14229 _ = b 14230 // match: (Mod8u (Const8 [c]) (Const8 [d])) 14231 // cond: d != 0 14232 // result: (Const8 [int64(uint8(c) % uint8(d))]) 14233 for { 14234 _ = v.Args[1] 14235 v_0 := v.Args[0] 14236 if v_0.Op != OpConst8 { 14237 break 14238 } 14239 c := v_0.AuxInt 14240 v_1 := v.Args[1] 14241 if v_1.Op != OpConst8 { 14242 break 14243 } 14244 d := v_1.AuxInt 14245 if !(d != 0) { 14246 break 14247 } 14248 v.reset(OpConst8) 14249 v.AuxInt = int64(uint8(c) % uint8(d)) 14250 return true 14251 } 14252 // match: (Mod8u <t> n (Const8 [c])) 14253 // cond: isPowerOfTwo(c&0xff) 14254 // result: (And8 n (Const8 <t> [(c&0xff)-1])) 14255 for { 14256 t := v.Type 14257 _ = v.Args[1] 14258 n := v.Args[0] 14259 v_1 := v.Args[1] 14260 if v_1.Op != OpConst8 { 14261 break 14262 } 14263 c := v_1.AuxInt 14264 if !(isPowerOfTwo(c & 0xff)) { 14265 break 14266 } 14267 v.reset(OpAnd8) 14268 v.AddArg(n) 14269 v0 := b.NewValue0(v.Pos, OpConst8, t) 14270 v0.AuxInt = (c & 0xff) - 1 14271 v.AddArg(v0) 14272 return true 14273 } 14274 // match: (Mod8u <t> x (Const8 [c])) 14275 // cond: x.Op != OpConst8 && c > 0 && umagicOK(8 ,c) 14276 // result: (Sub8 x (Mul8 <t> (Div8u <t> x (Const8 <t> [c])) (Const8 <t> [c]))) 14277 for { 14278 t := v.Type 14279 _ = v.Args[1] 14280 x := v.Args[0] 14281 v_1 := v.Args[1] 14282 if v_1.Op != OpConst8 { 14283 break 14284 } 14285 c := v_1.AuxInt 14286 if !(x.Op != OpConst8 && c > 0 && umagicOK(8, c)) { 14287 break 14288 } 14289 v.reset(OpSub8) 14290 v.AddArg(x) 14291 v0 := b.NewValue0(v.Pos, OpMul8, t) 14292 v1 := b.NewValue0(v.Pos, OpDiv8u, t) 14293 v1.AddArg(x) 14294 v2 := b.NewValue0(v.Pos, OpConst8, t) 14295 v2.AuxInt = c 14296 v1.AddArg(v2) 14297 v0.AddArg(v1) 14298 v3 := b.NewValue0(v.Pos, OpConst8, t) 14299 v3.AuxInt = c 14300 v0.AddArg(v3) 14301 v.AddArg(v0) 14302 return true 14303 } 14304 return false 14305 } 14306 func rewriteValuegeneric_OpMul16_0(v *Value) bool { 14307 b := v.Block 14308 _ = b 14309 typ := &b.Func.Config.Types 14310 _ = typ 14311 // match: (Mul16 (Const16 [c]) (Const16 [d])) 14312 // cond: 14313 // result: (Const16 [int64(int16(c*d))]) 14314 for { 14315 _ = v.Args[1] 14316 v_0 := v.Args[0] 14317 if v_0.Op != OpConst16 { 14318 break 14319 } 14320 c := v_0.AuxInt 14321 v_1 := v.Args[1] 14322 if v_1.Op != OpConst16 { 14323 break 14324 } 14325 d := v_1.AuxInt 14326 v.reset(OpConst16) 14327 v.AuxInt = int64(int16(c * d)) 14328 return true 14329 } 14330 // match: (Mul16 (Const16 [d]) (Const16 [c])) 14331 // cond: 14332 // result: (Const16 [int64(int16(c*d))]) 14333 for { 14334 _ = v.Args[1] 14335 v_0 := v.Args[0] 14336 if v_0.Op != OpConst16 { 14337 break 14338 } 14339 d := v_0.AuxInt 14340 v_1 := v.Args[1] 14341 if v_1.Op != OpConst16 { 14342 break 14343 } 14344 c := v_1.AuxInt 14345 v.reset(OpConst16) 14346 v.AuxInt = int64(int16(c * d)) 14347 return true 14348 } 14349 // match: (Mul16 (Const16 [1]) x) 14350 // cond: 14351 // result: x 14352 for { 14353 _ = v.Args[1] 14354 v_0 := v.Args[0] 14355 if v_0.Op != OpConst16 { 14356 break 14357 } 14358 if v_0.AuxInt != 1 { 14359 break 14360 } 14361 x := v.Args[1] 14362 v.reset(OpCopy) 14363 v.Type = x.Type 14364 v.AddArg(x) 14365 return true 14366 } 14367 // match: (Mul16 x (Const16 [1])) 14368 // cond: 14369 // result: x 14370 for { 14371 _ = v.Args[1] 14372 x := v.Args[0] 14373 v_1 := v.Args[1] 14374 if v_1.Op != OpConst16 { 14375 break 14376 } 14377 if v_1.AuxInt != 1 { 14378 break 14379 } 14380 v.reset(OpCopy) 14381 v.Type = x.Type 14382 v.AddArg(x) 14383 return true 14384 } 14385 // match: (Mul16 (Const16 [-1]) x) 14386 // cond: 14387 // result: (Neg16 x) 14388 for { 14389 _ = v.Args[1] 14390 v_0 := v.Args[0] 14391 if v_0.Op != OpConst16 { 14392 break 14393 } 14394 if v_0.AuxInt != -1 { 14395 break 14396 } 14397 x := v.Args[1] 14398 v.reset(OpNeg16) 14399 v.AddArg(x) 14400 return true 14401 } 14402 // match: (Mul16 x (Const16 [-1])) 14403 // cond: 14404 // result: (Neg16 x) 14405 for { 14406 _ = v.Args[1] 14407 x := v.Args[0] 14408 v_1 := v.Args[1] 14409 if v_1.Op != OpConst16 { 14410 break 14411 } 14412 if v_1.AuxInt != -1 { 14413 break 14414 } 14415 v.reset(OpNeg16) 14416 v.AddArg(x) 14417 return true 14418 } 14419 // match: (Mul16 <t> n (Const16 [c])) 14420 // cond: isPowerOfTwo(c) 14421 // result: (Lsh16x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 14422 for { 14423 t := v.Type 14424 _ = v.Args[1] 14425 n := v.Args[0] 14426 v_1 := v.Args[1] 14427 if v_1.Op != OpConst16 { 14428 break 14429 } 14430 c := v_1.AuxInt 14431 if !(isPowerOfTwo(c)) { 14432 break 14433 } 14434 v.reset(OpLsh16x64) 14435 v.Type = t 14436 v.AddArg(n) 14437 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 14438 v0.AuxInt = log2(c) 14439 v.AddArg(v0) 14440 return true 14441 } 14442 // match: (Mul16 <t> (Const16 [c]) n) 14443 // cond: isPowerOfTwo(c) 14444 // result: (Lsh16x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 14445 for { 14446 t := v.Type 14447 _ = v.Args[1] 14448 v_0 := v.Args[0] 14449 if v_0.Op != OpConst16 { 14450 break 14451 } 14452 c := v_0.AuxInt 14453 n := v.Args[1] 14454 if !(isPowerOfTwo(c)) { 14455 break 14456 } 14457 v.reset(OpLsh16x64) 14458 v.Type = t 14459 v.AddArg(n) 14460 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 14461 v0.AuxInt = log2(c) 14462 v.AddArg(v0) 14463 return true 14464 } 14465 // match: (Mul16 <t> n (Const16 [c])) 14466 // cond: t.IsSigned() && isPowerOfTwo(-c) 14467 // result: (Neg16 (Lsh16x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 14468 for { 14469 t := v.Type 14470 _ = v.Args[1] 14471 n := v.Args[0] 14472 v_1 := v.Args[1] 14473 if v_1.Op != OpConst16 { 14474 break 14475 } 14476 c := v_1.AuxInt 14477 if !(t.IsSigned() && isPowerOfTwo(-c)) { 14478 break 14479 } 14480 v.reset(OpNeg16) 14481 v0 := b.NewValue0(v.Pos, OpLsh16x64, t) 14482 v0.AddArg(n) 14483 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 14484 v1.AuxInt = log2(-c) 14485 v0.AddArg(v1) 14486 v.AddArg(v0) 14487 return true 14488 } 14489 // match: (Mul16 <t> (Const16 [c]) n) 14490 // cond: t.IsSigned() && isPowerOfTwo(-c) 14491 // result: (Neg16 (Lsh16x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 14492 for { 14493 t := v.Type 14494 _ = v.Args[1] 14495 v_0 := v.Args[0] 14496 if v_0.Op != OpConst16 { 14497 break 14498 } 14499 c := v_0.AuxInt 14500 n := v.Args[1] 14501 if !(t.IsSigned() && isPowerOfTwo(-c)) { 14502 break 14503 } 14504 v.reset(OpNeg16) 14505 v0 := b.NewValue0(v.Pos, OpLsh16x64, t) 14506 v0.AddArg(n) 14507 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 14508 v1.AuxInt = log2(-c) 14509 v0.AddArg(v1) 14510 v.AddArg(v0) 14511 return true 14512 } 14513 return false 14514 } 14515 func rewriteValuegeneric_OpMul16_10(v *Value) bool { 14516 b := v.Block 14517 _ = b 14518 // match: (Mul16 (Const16 [0]) _) 14519 // cond: 14520 // result: (Const16 [0]) 14521 for { 14522 _ = v.Args[1] 14523 v_0 := v.Args[0] 14524 if v_0.Op != OpConst16 { 14525 break 14526 } 14527 if v_0.AuxInt != 0 { 14528 break 14529 } 14530 v.reset(OpConst16) 14531 v.AuxInt = 0 14532 return true 14533 } 14534 // match: (Mul16 _ (Const16 [0])) 14535 // cond: 14536 // result: (Const16 [0]) 14537 for { 14538 _ = v.Args[1] 14539 v_1 := v.Args[1] 14540 if v_1.Op != OpConst16 { 14541 break 14542 } 14543 if v_1.AuxInt != 0 { 14544 break 14545 } 14546 v.reset(OpConst16) 14547 v.AuxInt = 0 14548 return true 14549 } 14550 // match: (Mul16 (Const16 <t> [c]) (Mul16 (Const16 <t> [d]) x)) 14551 // cond: 14552 // result: (Mul16 (Const16 <t> [int64(int16(c*d))]) x) 14553 for { 14554 _ = v.Args[1] 14555 v_0 := v.Args[0] 14556 if v_0.Op != OpConst16 { 14557 break 14558 } 14559 t := v_0.Type 14560 c := v_0.AuxInt 14561 v_1 := v.Args[1] 14562 if v_1.Op != OpMul16 { 14563 break 14564 } 14565 _ = v_1.Args[1] 14566 v_1_0 := v_1.Args[0] 14567 if v_1_0.Op != OpConst16 { 14568 break 14569 } 14570 if v_1_0.Type != t { 14571 break 14572 } 14573 d := v_1_0.AuxInt 14574 x := v_1.Args[1] 14575 v.reset(OpMul16) 14576 v0 := b.NewValue0(v.Pos, OpConst16, t) 14577 v0.AuxInt = int64(int16(c * d)) 14578 v.AddArg(v0) 14579 v.AddArg(x) 14580 return true 14581 } 14582 // match: (Mul16 (Const16 <t> [c]) (Mul16 x (Const16 <t> [d]))) 14583 // cond: 14584 // result: (Mul16 (Const16 <t> [int64(int16(c*d))]) x) 14585 for { 14586 _ = v.Args[1] 14587 v_0 := v.Args[0] 14588 if v_0.Op != OpConst16 { 14589 break 14590 } 14591 t := v_0.Type 14592 c := v_0.AuxInt 14593 v_1 := v.Args[1] 14594 if v_1.Op != OpMul16 { 14595 break 14596 } 14597 _ = v_1.Args[1] 14598 x := v_1.Args[0] 14599 v_1_1 := v_1.Args[1] 14600 if v_1_1.Op != OpConst16 { 14601 break 14602 } 14603 if v_1_1.Type != t { 14604 break 14605 } 14606 d := v_1_1.AuxInt 14607 v.reset(OpMul16) 14608 v0 := b.NewValue0(v.Pos, OpConst16, t) 14609 v0.AuxInt = int64(int16(c * d)) 14610 v.AddArg(v0) 14611 v.AddArg(x) 14612 return true 14613 } 14614 // match: (Mul16 (Mul16 (Const16 <t> [d]) x) (Const16 <t> [c])) 14615 // cond: 14616 // result: (Mul16 (Const16 <t> [int64(int16(c*d))]) x) 14617 for { 14618 _ = v.Args[1] 14619 v_0 := v.Args[0] 14620 if v_0.Op != OpMul16 { 14621 break 14622 } 14623 _ = v_0.Args[1] 14624 v_0_0 := v_0.Args[0] 14625 if v_0_0.Op != OpConst16 { 14626 break 14627 } 14628 t := v_0_0.Type 14629 d := v_0_0.AuxInt 14630 x := v_0.Args[1] 14631 v_1 := v.Args[1] 14632 if v_1.Op != OpConst16 { 14633 break 14634 } 14635 if v_1.Type != t { 14636 break 14637 } 14638 c := v_1.AuxInt 14639 v.reset(OpMul16) 14640 v0 := b.NewValue0(v.Pos, OpConst16, t) 14641 v0.AuxInt = int64(int16(c * d)) 14642 v.AddArg(v0) 14643 v.AddArg(x) 14644 return true 14645 } 14646 // match: (Mul16 (Mul16 x (Const16 <t> [d])) (Const16 <t> [c])) 14647 // cond: 14648 // result: (Mul16 (Const16 <t> [int64(int16(c*d))]) x) 14649 for { 14650 _ = v.Args[1] 14651 v_0 := v.Args[0] 14652 if v_0.Op != OpMul16 { 14653 break 14654 } 14655 _ = v_0.Args[1] 14656 x := v_0.Args[0] 14657 v_0_1 := v_0.Args[1] 14658 if v_0_1.Op != OpConst16 { 14659 break 14660 } 14661 t := v_0_1.Type 14662 d := v_0_1.AuxInt 14663 v_1 := v.Args[1] 14664 if v_1.Op != OpConst16 { 14665 break 14666 } 14667 if v_1.Type != t { 14668 break 14669 } 14670 c := v_1.AuxInt 14671 v.reset(OpMul16) 14672 v0 := b.NewValue0(v.Pos, OpConst16, t) 14673 v0.AuxInt = int64(int16(c * d)) 14674 v.AddArg(v0) 14675 v.AddArg(x) 14676 return true 14677 } 14678 return false 14679 } 14680 func rewriteValuegeneric_OpMul32_0(v *Value) bool { 14681 b := v.Block 14682 _ = b 14683 typ := &b.Func.Config.Types 14684 _ = typ 14685 // match: (Mul32 (Const32 [c]) (Const32 [d])) 14686 // cond: 14687 // result: (Const32 [int64(int32(c*d))]) 14688 for { 14689 _ = v.Args[1] 14690 v_0 := v.Args[0] 14691 if v_0.Op != OpConst32 { 14692 break 14693 } 14694 c := v_0.AuxInt 14695 v_1 := v.Args[1] 14696 if v_1.Op != OpConst32 { 14697 break 14698 } 14699 d := v_1.AuxInt 14700 v.reset(OpConst32) 14701 v.AuxInt = int64(int32(c * d)) 14702 return true 14703 } 14704 // match: (Mul32 (Const32 [d]) (Const32 [c])) 14705 // cond: 14706 // result: (Const32 [int64(int32(c*d))]) 14707 for { 14708 _ = v.Args[1] 14709 v_0 := v.Args[0] 14710 if v_0.Op != OpConst32 { 14711 break 14712 } 14713 d := v_0.AuxInt 14714 v_1 := v.Args[1] 14715 if v_1.Op != OpConst32 { 14716 break 14717 } 14718 c := v_1.AuxInt 14719 v.reset(OpConst32) 14720 v.AuxInt = int64(int32(c * d)) 14721 return true 14722 } 14723 // match: (Mul32 (Const32 [1]) x) 14724 // cond: 14725 // result: x 14726 for { 14727 _ = v.Args[1] 14728 v_0 := v.Args[0] 14729 if v_0.Op != OpConst32 { 14730 break 14731 } 14732 if v_0.AuxInt != 1 { 14733 break 14734 } 14735 x := v.Args[1] 14736 v.reset(OpCopy) 14737 v.Type = x.Type 14738 v.AddArg(x) 14739 return true 14740 } 14741 // match: (Mul32 x (Const32 [1])) 14742 // cond: 14743 // result: x 14744 for { 14745 _ = v.Args[1] 14746 x := v.Args[0] 14747 v_1 := v.Args[1] 14748 if v_1.Op != OpConst32 { 14749 break 14750 } 14751 if v_1.AuxInt != 1 { 14752 break 14753 } 14754 v.reset(OpCopy) 14755 v.Type = x.Type 14756 v.AddArg(x) 14757 return true 14758 } 14759 // match: (Mul32 (Const32 [-1]) x) 14760 // cond: 14761 // result: (Neg32 x) 14762 for { 14763 _ = v.Args[1] 14764 v_0 := v.Args[0] 14765 if v_0.Op != OpConst32 { 14766 break 14767 } 14768 if v_0.AuxInt != -1 { 14769 break 14770 } 14771 x := v.Args[1] 14772 v.reset(OpNeg32) 14773 v.AddArg(x) 14774 return true 14775 } 14776 // match: (Mul32 x (Const32 [-1])) 14777 // cond: 14778 // result: (Neg32 x) 14779 for { 14780 _ = v.Args[1] 14781 x := v.Args[0] 14782 v_1 := v.Args[1] 14783 if v_1.Op != OpConst32 { 14784 break 14785 } 14786 if v_1.AuxInt != -1 { 14787 break 14788 } 14789 v.reset(OpNeg32) 14790 v.AddArg(x) 14791 return true 14792 } 14793 // match: (Mul32 <t> n (Const32 [c])) 14794 // cond: isPowerOfTwo(c) 14795 // result: (Lsh32x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 14796 for { 14797 t := v.Type 14798 _ = v.Args[1] 14799 n := v.Args[0] 14800 v_1 := v.Args[1] 14801 if v_1.Op != OpConst32 { 14802 break 14803 } 14804 c := v_1.AuxInt 14805 if !(isPowerOfTwo(c)) { 14806 break 14807 } 14808 v.reset(OpLsh32x64) 14809 v.Type = t 14810 v.AddArg(n) 14811 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 14812 v0.AuxInt = log2(c) 14813 v.AddArg(v0) 14814 return true 14815 } 14816 // match: (Mul32 <t> (Const32 [c]) n) 14817 // cond: isPowerOfTwo(c) 14818 // result: (Lsh32x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 14819 for { 14820 t := v.Type 14821 _ = v.Args[1] 14822 v_0 := v.Args[0] 14823 if v_0.Op != OpConst32 { 14824 break 14825 } 14826 c := v_0.AuxInt 14827 n := v.Args[1] 14828 if !(isPowerOfTwo(c)) { 14829 break 14830 } 14831 v.reset(OpLsh32x64) 14832 v.Type = t 14833 v.AddArg(n) 14834 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 14835 v0.AuxInt = log2(c) 14836 v.AddArg(v0) 14837 return true 14838 } 14839 // match: (Mul32 <t> n (Const32 [c])) 14840 // cond: t.IsSigned() && isPowerOfTwo(-c) 14841 // result: (Neg32 (Lsh32x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 14842 for { 14843 t := v.Type 14844 _ = v.Args[1] 14845 n := v.Args[0] 14846 v_1 := v.Args[1] 14847 if v_1.Op != OpConst32 { 14848 break 14849 } 14850 c := v_1.AuxInt 14851 if !(t.IsSigned() && isPowerOfTwo(-c)) { 14852 break 14853 } 14854 v.reset(OpNeg32) 14855 v0 := b.NewValue0(v.Pos, OpLsh32x64, t) 14856 v0.AddArg(n) 14857 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 14858 v1.AuxInt = log2(-c) 14859 v0.AddArg(v1) 14860 v.AddArg(v0) 14861 return true 14862 } 14863 // match: (Mul32 <t> (Const32 [c]) n) 14864 // cond: t.IsSigned() && isPowerOfTwo(-c) 14865 // result: (Neg32 (Lsh32x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 14866 for { 14867 t := v.Type 14868 _ = v.Args[1] 14869 v_0 := v.Args[0] 14870 if v_0.Op != OpConst32 { 14871 break 14872 } 14873 c := v_0.AuxInt 14874 n := v.Args[1] 14875 if !(t.IsSigned() && isPowerOfTwo(-c)) { 14876 break 14877 } 14878 v.reset(OpNeg32) 14879 v0 := b.NewValue0(v.Pos, OpLsh32x64, t) 14880 v0.AddArg(n) 14881 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 14882 v1.AuxInt = log2(-c) 14883 v0.AddArg(v1) 14884 v.AddArg(v0) 14885 return true 14886 } 14887 return false 14888 } 14889 func rewriteValuegeneric_OpMul32_10(v *Value) bool { 14890 b := v.Block 14891 _ = b 14892 // match: (Mul32 (Const32 <t> [c]) (Add32 <t> (Const32 <t> [d]) x)) 14893 // cond: 14894 // result: (Add32 (Const32 <t> [int64(int32(c*d))]) (Mul32 <t> (Const32 <t> [c]) x)) 14895 for { 14896 _ = v.Args[1] 14897 v_0 := v.Args[0] 14898 if v_0.Op != OpConst32 { 14899 break 14900 } 14901 t := v_0.Type 14902 c := v_0.AuxInt 14903 v_1 := v.Args[1] 14904 if v_1.Op != OpAdd32 { 14905 break 14906 } 14907 if v_1.Type != t { 14908 break 14909 } 14910 _ = v_1.Args[1] 14911 v_1_0 := v_1.Args[0] 14912 if v_1_0.Op != OpConst32 { 14913 break 14914 } 14915 if v_1_0.Type != t { 14916 break 14917 } 14918 d := v_1_0.AuxInt 14919 x := v_1.Args[1] 14920 v.reset(OpAdd32) 14921 v0 := b.NewValue0(v.Pos, OpConst32, t) 14922 v0.AuxInt = int64(int32(c * d)) 14923 v.AddArg(v0) 14924 v1 := b.NewValue0(v.Pos, OpMul32, t) 14925 v2 := b.NewValue0(v.Pos, OpConst32, t) 14926 v2.AuxInt = c 14927 v1.AddArg(v2) 14928 v1.AddArg(x) 14929 v.AddArg(v1) 14930 return true 14931 } 14932 // match: (Mul32 (Const32 <t> [c]) (Add32 <t> x (Const32 <t> [d]))) 14933 // cond: 14934 // result: (Add32 (Const32 <t> [int64(int32(c*d))]) (Mul32 <t> (Const32 <t> [c]) x)) 14935 for { 14936 _ = v.Args[1] 14937 v_0 := v.Args[0] 14938 if v_0.Op != OpConst32 { 14939 break 14940 } 14941 t := v_0.Type 14942 c := v_0.AuxInt 14943 v_1 := v.Args[1] 14944 if v_1.Op != OpAdd32 { 14945 break 14946 } 14947 if v_1.Type != t { 14948 break 14949 } 14950 _ = v_1.Args[1] 14951 x := v_1.Args[0] 14952 v_1_1 := v_1.Args[1] 14953 if v_1_1.Op != OpConst32 { 14954 break 14955 } 14956 if v_1_1.Type != t { 14957 break 14958 } 14959 d := v_1_1.AuxInt 14960 v.reset(OpAdd32) 14961 v0 := b.NewValue0(v.Pos, OpConst32, t) 14962 v0.AuxInt = int64(int32(c * d)) 14963 v.AddArg(v0) 14964 v1 := b.NewValue0(v.Pos, OpMul32, t) 14965 v2 := b.NewValue0(v.Pos, OpConst32, t) 14966 v2.AuxInt = c 14967 v1.AddArg(v2) 14968 v1.AddArg(x) 14969 v.AddArg(v1) 14970 return true 14971 } 14972 // match: (Mul32 (Add32 <t> (Const32 <t> [d]) x) (Const32 <t> [c])) 14973 // cond: 14974 // result: (Add32 (Const32 <t> [int64(int32(c*d))]) (Mul32 <t> (Const32 <t> [c]) x)) 14975 for { 14976 _ = v.Args[1] 14977 v_0 := v.Args[0] 14978 if v_0.Op != OpAdd32 { 14979 break 14980 } 14981 t := v_0.Type 14982 _ = v_0.Args[1] 14983 v_0_0 := v_0.Args[0] 14984 if v_0_0.Op != OpConst32 { 14985 break 14986 } 14987 if v_0_0.Type != t { 14988 break 14989 } 14990 d := v_0_0.AuxInt 14991 x := v_0.Args[1] 14992 v_1 := v.Args[1] 14993 if v_1.Op != OpConst32 { 14994 break 14995 } 14996 if v_1.Type != t { 14997 break 14998 } 14999 c := v_1.AuxInt 15000 v.reset(OpAdd32) 15001 v0 := b.NewValue0(v.Pos, OpConst32, t) 15002 v0.AuxInt = int64(int32(c * d)) 15003 v.AddArg(v0) 15004 v1 := b.NewValue0(v.Pos, OpMul32, t) 15005 v2 := b.NewValue0(v.Pos, OpConst32, t) 15006 v2.AuxInt = c 15007 v1.AddArg(v2) 15008 v1.AddArg(x) 15009 v.AddArg(v1) 15010 return true 15011 } 15012 // match: (Mul32 (Add32 <t> x (Const32 <t> [d])) (Const32 <t> [c])) 15013 // cond: 15014 // result: (Add32 (Const32 <t> [int64(int32(c*d))]) (Mul32 <t> (Const32 <t> [c]) x)) 15015 for { 15016 _ = v.Args[1] 15017 v_0 := v.Args[0] 15018 if v_0.Op != OpAdd32 { 15019 break 15020 } 15021 t := v_0.Type 15022 _ = v_0.Args[1] 15023 x := v_0.Args[0] 15024 v_0_1 := v_0.Args[1] 15025 if v_0_1.Op != OpConst32 { 15026 break 15027 } 15028 if v_0_1.Type != t { 15029 break 15030 } 15031 d := v_0_1.AuxInt 15032 v_1 := v.Args[1] 15033 if v_1.Op != OpConst32 { 15034 break 15035 } 15036 if v_1.Type != t { 15037 break 15038 } 15039 c := v_1.AuxInt 15040 v.reset(OpAdd32) 15041 v0 := b.NewValue0(v.Pos, OpConst32, t) 15042 v0.AuxInt = int64(int32(c * d)) 15043 v.AddArg(v0) 15044 v1 := b.NewValue0(v.Pos, OpMul32, t) 15045 v2 := b.NewValue0(v.Pos, OpConst32, t) 15046 v2.AuxInt = c 15047 v1.AddArg(v2) 15048 v1.AddArg(x) 15049 v.AddArg(v1) 15050 return true 15051 } 15052 // match: (Mul32 (Const32 [0]) _) 15053 // cond: 15054 // result: (Const32 [0]) 15055 for { 15056 _ = v.Args[1] 15057 v_0 := v.Args[0] 15058 if v_0.Op != OpConst32 { 15059 break 15060 } 15061 if v_0.AuxInt != 0 { 15062 break 15063 } 15064 v.reset(OpConst32) 15065 v.AuxInt = 0 15066 return true 15067 } 15068 // match: (Mul32 _ (Const32 [0])) 15069 // cond: 15070 // result: (Const32 [0]) 15071 for { 15072 _ = v.Args[1] 15073 v_1 := v.Args[1] 15074 if v_1.Op != OpConst32 { 15075 break 15076 } 15077 if v_1.AuxInt != 0 { 15078 break 15079 } 15080 v.reset(OpConst32) 15081 v.AuxInt = 0 15082 return true 15083 } 15084 // match: (Mul32 (Const32 <t> [c]) (Mul32 (Const32 <t> [d]) x)) 15085 // cond: 15086 // result: (Mul32 (Const32 <t> [int64(int32(c*d))]) x) 15087 for { 15088 _ = v.Args[1] 15089 v_0 := v.Args[0] 15090 if v_0.Op != OpConst32 { 15091 break 15092 } 15093 t := v_0.Type 15094 c := v_0.AuxInt 15095 v_1 := v.Args[1] 15096 if v_1.Op != OpMul32 { 15097 break 15098 } 15099 _ = v_1.Args[1] 15100 v_1_0 := v_1.Args[0] 15101 if v_1_0.Op != OpConst32 { 15102 break 15103 } 15104 if v_1_0.Type != t { 15105 break 15106 } 15107 d := v_1_0.AuxInt 15108 x := v_1.Args[1] 15109 v.reset(OpMul32) 15110 v0 := b.NewValue0(v.Pos, OpConst32, t) 15111 v0.AuxInt = int64(int32(c * d)) 15112 v.AddArg(v0) 15113 v.AddArg(x) 15114 return true 15115 } 15116 // match: (Mul32 (Const32 <t> [c]) (Mul32 x (Const32 <t> [d]))) 15117 // cond: 15118 // result: (Mul32 (Const32 <t> [int64(int32(c*d))]) x) 15119 for { 15120 _ = v.Args[1] 15121 v_0 := v.Args[0] 15122 if v_0.Op != OpConst32 { 15123 break 15124 } 15125 t := v_0.Type 15126 c := v_0.AuxInt 15127 v_1 := v.Args[1] 15128 if v_1.Op != OpMul32 { 15129 break 15130 } 15131 _ = v_1.Args[1] 15132 x := v_1.Args[0] 15133 v_1_1 := v_1.Args[1] 15134 if v_1_1.Op != OpConst32 { 15135 break 15136 } 15137 if v_1_1.Type != t { 15138 break 15139 } 15140 d := v_1_1.AuxInt 15141 v.reset(OpMul32) 15142 v0 := b.NewValue0(v.Pos, OpConst32, t) 15143 v0.AuxInt = int64(int32(c * d)) 15144 v.AddArg(v0) 15145 v.AddArg(x) 15146 return true 15147 } 15148 // match: (Mul32 (Mul32 (Const32 <t> [d]) x) (Const32 <t> [c])) 15149 // cond: 15150 // result: (Mul32 (Const32 <t> [int64(int32(c*d))]) x) 15151 for { 15152 _ = v.Args[1] 15153 v_0 := v.Args[0] 15154 if v_0.Op != OpMul32 { 15155 break 15156 } 15157 _ = v_0.Args[1] 15158 v_0_0 := v_0.Args[0] 15159 if v_0_0.Op != OpConst32 { 15160 break 15161 } 15162 t := v_0_0.Type 15163 d := v_0_0.AuxInt 15164 x := v_0.Args[1] 15165 v_1 := v.Args[1] 15166 if v_1.Op != OpConst32 { 15167 break 15168 } 15169 if v_1.Type != t { 15170 break 15171 } 15172 c := v_1.AuxInt 15173 v.reset(OpMul32) 15174 v0 := b.NewValue0(v.Pos, OpConst32, t) 15175 v0.AuxInt = int64(int32(c * d)) 15176 v.AddArg(v0) 15177 v.AddArg(x) 15178 return true 15179 } 15180 // match: (Mul32 (Mul32 x (Const32 <t> [d])) (Const32 <t> [c])) 15181 // cond: 15182 // result: (Mul32 (Const32 <t> [int64(int32(c*d))]) x) 15183 for { 15184 _ = v.Args[1] 15185 v_0 := v.Args[0] 15186 if v_0.Op != OpMul32 { 15187 break 15188 } 15189 _ = v_0.Args[1] 15190 x := v_0.Args[0] 15191 v_0_1 := v_0.Args[1] 15192 if v_0_1.Op != OpConst32 { 15193 break 15194 } 15195 t := v_0_1.Type 15196 d := v_0_1.AuxInt 15197 v_1 := v.Args[1] 15198 if v_1.Op != OpConst32 { 15199 break 15200 } 15201 if v_1.Type != t { 15202 break 15203 } 15204 c := v_1.AuxInt 15205 v.reset(OpMul32) 15206 v0 := b.NewValue0(v.Pos, OpConst32, t) 15207 v0.AuxInt = int64(int32(c * d)) 15208 v.AddArg(v0) 15209 v.AddArg(x) 15210 return true 15211 } 15212 return false 15213 } 15214 func rewriteValuegeneric_OpMul32F_0(v *Value) bool { 15215 // match: (Mul32F (Const32F [c]) (Const32F [d])) 15216 // cond: 15217 // result: (Const32F [f2i(float64(i2f32(c) * i2f32(d)))]) 15218 for { 15219 _ = v.Args[1] 15220 v_0 := v.Args[0] 15221 if v_0.Op != OpConst32F { 15222 break 15223 } 15224 c := v_0.AuxInt 15225 v_1 := v.Args[1] 15226 if v_1.Op != OpConst32F { 15227 break 15228 } 15229 d := v_1.AuxInt 15230 v.reset(OpConst32F) 15231 v.AuxInt = f2i(float64(i2f32(c) * i2f32(d))) 15232 return true 15233 } 15234 // match: (Mul32F (Const32F [d]) (Const32F [c])) 15235 // cond: 15236 // result: (Const32F [f2i(float64(i2f32(c) * i2f32(d)))]) 15237 for { 15238 _ = v.Args[1] 15239 v_0 := v.Args[0] 15240 if v_0.Op != OpConst32F { 15241 break 15242 } 15243 d := v_0.AuxInt 15244 v_1 := v.Args[1] 15245 if v_1.Op != OpConst32F { 15246 break 15247 } 15248 c := v_1.AuxInt 15249 v.reset(OpConst32F) 15250 v.AuxInt = f2i(float64(i2f32(c) * i2f32(d))) 15251 return true 15252 } 15253 // match: (Mul32F x (Const32F [f2i(1)])) 15254 // cond: 15255 // result: x 15256 for { 15257 _ = v.Args[1] 15258 x := v.Args[0] 15259 v_1 := v.Args[1] 15260 if v_1.Op != OpConst32F { 15261 break 15262 } 15263 if v_1.AuxInt != f2i(1) { 15264 break 15265 } 15266 v.reset(OpCopy) 15267 v.Type = x.Type 15268 v.AddArg(x) 15269 return true 15270 } 15271 // match: (Mul32F (Const32F [f2i(1)]) x) 15272 // cond: 15273 // result: x 15274 for { 15275 _ = v.Args[1] 15276 v_0 := v.Args[0] 15277 if v_0.Op != OpConst32F { 15278 break 15279 } 15280 if v_0.AuxInt != f2i(1) { 15281 break 15282 } 15283 x := v.Args[1] 15284 v.reset(OpCopy) 15285 v.Type = x.Type 15286 v.AddArg(x) 15287 return true 15288 } 15289 // match: (Mul32F x (Const32F [f2i(-1)])) 15290 // cond: 15291 // result: (Neg32F x) 15292 for { 15293 _ = v.Args[1] 15294 x := v.Args[0] 15295 v_1 := v.Args[1] 15296 if v_1.Op != OpConst32F { 15297 break 15298 } 15299 if v_1.AuxInt != f2i(-1) { 15300 break 15301 } 15302 v.reset(OpNeg32F) 15303 v.AddArg(x) 15304 return true 15305 } 15306 // match: (Mul32F (Const32F [f2i(-1)]) x) 15307 // cond: 15308 // result: (Neg32F x) 15309 for { 15310 _ = v.Args[1] 15311 v_0 := v.Args[0] 15312 if v_0.Op != OpConst32F { 15313 break 15314 } 15315 if v_0.AuxInt != f2i(-1) { 15316 break 15317 } 15318 x := v.Args[1] 15319 v.reset(OpNeg32F) 15320 v.AddArg(x) 15321 return true 15322 } 15323 // match: (Mul32F x (Const32F [f2i(2)])) 15324 // cond: 15325 // result: (Add32F x x) 15326 for { 15327 _ = v.Args[1] 15328 x := v.Args[0] 15329 v_1 := v.Args[1] 15330 if v_1.Op != OpConst32F { 15331 break 15332 } 15333 if v_1.AuxInt != f2i(2) { 15334 break 15335 } 15336 v.reset(OpAdd32F) 15337 v.AddArg(x) 15338 v.AddArg(x) 15339 return true 15340 } 15341 // match: (Mul32F (Const32F [f2i(2)]) x) 15342 // cond: 15343 // result: (Add32F x x) 15344 for { 15345 _ = v.Args[1] 15346 v_0 := v.Args[0] 15347 if v_0.Op != OpConst32F { 15348 break 15349 } 15350 if v_0.AuxInt != f2i(2) { 15351 break 15352 } 15353 x := v.Args[1] 15354 v.reset(OpAdd32F) 15355 v.AddArg(x) 15356 v.AddArg(x) 15357 return true 15358 } 15359 return false 15360 } 15361 func rewriteValuegeneric_OpMul64_0(v *Value) bool { 15362 b := v.Block 15363 _ = b 15364 typ := &b.Func.Config.Types 15365 _ = typ 15366 // match: (Mul64 (Const64 [c]) (Const64 [d])) 15367 // cond: 15368 // result: (Const64 [c*d]) 15369 for { 15370 _ = v.Args[1] 15371 v_0 := v.Args[0] 15372 if v_0.Op != OpConst64 { 15373 break 15374 } 15375 c := v_0.AuxInt 15376 v_1 := v.Args[1] 15377 if v_1.Op != OpConst64 { 15378 break 15379 } 15380 d := v_1.AuxInt 15381 v.reset(OpConst64) 15382 v.AuxInt = c * d 15383 return true 15384 } 15385 // match: (Mul64 (Const64 [d]) (Const64 [c])) 15386 // cond: 15387 // result: (Const64 [c*d]) 15388 for { 15389 _ = v.Args[1] 15390 v_0 := v.Args[0] 15391 if v_0.Op != OpConst64 { 15392 break 15393 } 15394 d := v_0.AuxInt 15395 v_1 := v.Args[1] 15396 if v_1.Op != OpConst64 { 15397 break 15398 } 15399 c := v_1.AuxInt 15400 v.reset(OpConst64) 15401 v.AuxInt = c * d 15402 return true 15403 } 15404 // match: (Mul64 (Const64 [1]) x) 15405 // cond: 15406 // result: x 15407 for { 15408 _ = v.Args[1] 15409 v_0 := v.Args[0] 15410 if v_0.Op != OpConst64 { 15411 break 15412 } 15413 if v_0.AuxInt != 1 { 15414 break 15415 } 15416 x := v.Args[1] 15417 v.reset(OpCopy) 15418 v.Type = x.Type 15419 v.AddArg(x) 15420 return true 15421 } 15422 // match: (Mul64 x (Const64 [1])) 15423 // cond: 15424 // result: x 15425 for { 15426 _ = v.Args[1] 15427 x := v.Args[0] 15428 v_1 := v.Args[1] 15429 if v_1.Op != OpConst64 { 15430 break 15431 } 15432 if v_1.AuxInt != 1 { 15433 break 15434 } 15435 v.reset(OpCopy) 15436 v.Type = x.Type 15437 v.AddArg(x) 15438 return true 15439 } 15440 // match: (Mul64 (Const64 [-1]) x) 15441 // cond: 15442 // result: (Neg64 x) 15443 for { 15444 _ = v.Args[1] 15445 v_0 := v.Args[0] 15446 if v_0.Op != OpConst64 { 15447 break 15448 } 15449 if v_0.AuxInt != -1 { 15450 break 15451 } 15452 x := v.Args[1] 15453 v.reset(OpNeg64) 15454 v.AddArg(x) 15455 return true 15456 } 15457 // match: (Mul64 x (Const64 [-1])) 15458 // cond: 15459 // result: (Neg64 x) 15460 for { 15461 _ = v.Args[1] 15462 x := v.Args[0] 15463 v_1 := v.Args[1] 15464 if v_1.Op != OpConst64 { 15465 break 15466 } 15467 if v_1.AuxInt != -1 { 15468 break 15469 } 15470 v.reset(OpNeg64) 15471 v.AddArg(x) 15472 return true 15473 } 15474 // match: (Mul64 <t> n (Const64 [c])) 15475 // cond: isPowerOfTwo(c) 15476 // result: (Lsh64x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 15477 for { 15478 t := v.Type 15479 _ = v.Args[1] 15480 n := v.Args[0] 15481 v_1 := v.Args[1] 15482 if v_1.Op != OpConst64 { 15483 break 15484 } 15485 c := v_1.AuxInt 15486 if !(isPowerOfTwo(c)) { 15487 break 15488 } 15489 v.reset(OpLsh64x64) 15490 v.Type = t 15491 v.AddArg(n) 15492 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 15493 v0.AuxInt = log2(c) 15494 v.AddArg(v0) 15495 return true 15496 } 15497 // match: (Mul64 <t> (Const64 [c]) n) 15498 // cond: isPowerOfTwo(c) 15499 // result: (Lsh64x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 15500 for { 15501 t := v.Type 15502 _ = v.Args[1] 15503 v_0 := v.Args[0] 15504 if v_0.Op != OpConst64 { 15505 break 15506 } 15507 c := v_0.AuxInt 15508 n := v.Args[1] 15509 if !(isPowerOfTwo(c)) { 15510 break 15511 } 15512 v.reset(OpLsh64x64) 15513 v.Type = t 15514 v.AddArg(n) 15515 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 15516 v0.AuxInt = log2(c) 15517 v.AddArg(v0) 15518 return true 15519 } 15520 // match: (Mul64 <t> n (Const64 [c])) 15521 // cond: t.IsSigned() && isPowerOfTwo(-c) 15522 // result: (Neg64 (Lsh64x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 15523 for { 15524 t := v.Type 15525 _ = v.Args[1] 15526 n := v.Args[0] 15527 v_1 := v.Args[1] 15528 if v_1.Op != OpConst64 { 15529 break 15530 } 15531 c := v_1.AuxInt 15532 if !(t.IsSigned() && isPowerOfTwo(-c)) { 15533 break 15534 } 15535 v.reset(OpNeg64) 15536 v0 := b.NewValue0(v.Pos, OpLsh64x64, t) 15537 v0.AddArg(n) 15538 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 15539 v1.AuxInt = log2(-c) 15540 v0.AddArg(v1) 15541 v.AddArg(v0) 15542 return true 15543 } 15544 // match: (Mul64 <t> (Const64 [c]) n) 15545 // cond: t.IsSigned() && isPowerOfTwo(-c) 15546 // result: (Neg64 (Lsh64x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 15547 for { 15548 t := v.Type 15549 _ = v.Args[1] 15550 v_0 := v.Args[0] 15551 if v_0.Op != OpConst64 { 15552 break 15553 } 15554 c := v_0.AuxInt 15555 n := v.Args[1] 15556 if !(t.IsSigned() && isPowerOfTwo(-c)) { 15557 break 15558 } 15559 v.reset(OpNeg64) 15560 v0 := b.NewValue0(v.Pos, OpLsh64x64, t) 15561 v0.AddArg(n) 15562 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 15563 v1.AuxInt = log2(-c) 15564 v0.AddArg(v1) 15565 v.AddArg(v0) 15566 return true 15567 } 15568 return false 15569 } 15570 func rewriteValuegeneric_OpMul64_10(v *Value) bool { 15571 b := v.Block 15572 _ = b 15573 // match: (Mul64 (Const64 <t> [c]) (Add64 <t> (Const64 <t> [d]) x)) 15574 // cond: 15575 // result: (Add64 (Const64 <t> [c*d]) (Mul64 <t> (Const64 <t> [c]) x)) 15576 for { 15577 _ = v.Args[1] 15578 v_0 := v.Args[0] 15579 if v_0.Op != OpConst64 { 15580 break 15581 } 15582 t := v_0.Type 15583 c := v_0.AuxInt 15584 v_1 := v.Args[1] 15585 if v_1.Op != OpAdd64 { 15586 break 15587 } 15588 if v_1.Type != t { 15589 break 15590 } 15591 _ = v_1.Args[1] 15592 v_1_0 := v_1.Args[0] 15593 if v_1_0.Op != OpConst64 { 15594 break 15595 } 15596 if v_1_0.Type != t { 15597 break 15598 } 15599 d := v_1_0.AuxInt 15600 x := v_1.Args[1] 15601 v.reset(OpAdd64) 15602 v0 := b.NewValue0(v.Pos, OpConst64, t) 15603 v0.AuxInt = c * d 15604 v.AddArg(v0) 15605 v1 := b.NewValue0(v.Pos, OpMul64, t) 15606 v2 := b.NewValue0(v.Pos, OpConst64, t) 15607 v2.AuxInt = c 15608 v1.AddArg(v2) 15609 v1.AddArg(x) 15610 v.AddArg(v1) 15611 return true 15612 } 15613 // match: (Mul64 (Const64 <t> [c]) (Add64 <t> x (Const64 <t> [d]))) 15614 // cond: 15615 // result: (Add64 (Const64 <t> [c*d]) (Mul64 <t> (Const64 <t> [c]) x)) 15616 for { 15617 _ = v.Args[1] 15618 v_0 := v.Args[0] 15619 if v_0.Op != OpConst64 { 15620 break 15621 } 15622 t := v_0.Type 15623 c := v_0.AuxInt 15624 v_1 := v.Args[1] 15625 if v_1.Op != OpAdd64 { 15626 break 15627 } 15628 if v_1.Type != t { 15629 break 15630 } 15631 _ = v_1.Args[1] 15632 x := v_1.Args[0] 15633 v_1_1 := v_1.Args[1] 15634 if v_1_1.Op != OpConst64 { 15635 break 15636 } 15637 if v_1_1.Type != t { 15638 break 15639 } 15640 d := v_1_1.AuxInt 15641 v.reset(OpAdd64) 15642 v0 := b.NewValue0(v.Pos, OpConst64, t) 15643 v0.AuxInt = c * d 15644 v.AddArg(v0) 15645 v1 := b.NewValue0(v.Pos, OpMul64, t) 15646 v2 := b.NewValue0(v.Pos, OpConst64, t) 15647 v2.AuxInt = c 15648 v1.AddArg(v2) 15649 v1.AddArg(x) 15650 v.AddArg(v1) 15651 return true 15652 } 15653 // match: (Mul64 (Add64 <t> (Const64 <t> [d]) x) (Const64 <t> [c])) 15654 // cond: 15655 // result: (Add64 (Const64 <t> [c*d]) (Mul64 <t> (Const64 <t> [c]) x)) 15656 for { 15657 _ = v.Args[1] 15658 v_0 := v.Args[0] 15659 if v_0.Op != OpAdd64 { 15660 break 15661 } 15662 t := v_0.Type 15663 _ = v_0.Args[1] 15664 v_0_0 := v_0.Args[0] 15665 if v_0_0.Op != OpConst64 { 15666 break 15667 } 15668 if v_0_0.Type != t { 15669 break 15670 } 15671 d := v_0_0.AuxInt 15672 x := v_0.Args[1] 15673 v_1 := v.Args[1] 15674 if v_1.Op != OpConst64 { 15675 break 15676 } 15677 if v_1.Type != t { 15678 break 15679 } 15680 c := v_1.AuxInt 15681 v.reset(OpAdd64) 15682 v0 := b.NewValue0(v.Pos, OpConst64, t) 15683 v0.AuxInt = c * d 15684 v.AddArg(v0) 15685 v1 := b.NewValue0(v.Pos, OpMul64, t) 15686 v2 := b.NewValue0(v.Pos, OpConst64, t) 15687 v2.AuxInt = c 15688 v1.AddArg(v2) 15689 v1.AddArg(x) 15690 v.AddArg(v1) 15691 return true 15692 } 15693 // match: (Mul64 (Add64 <t> x (Const64 <t> [d])) (Const64 <t> [c])) 15694 // cond: 15695 // result: (Add64 (Const64 <t> [c*d]) (Mul64 <t> (Const64 <t> [c]) x)) 15696 for { 15697 _ = v.Args[1] 15698 v_0 := v.Args[0] 15699 if v_0.Op != OpAdd64 { 15700 break 15701 } 15702 t := v_0.Type 15703 _ = v_0.Args[1] 15704 x := v_0.Args[0] 15705 v_0_1 := v_0.Args[1] 15706 if v_0_1.Op != OpConst64 { 15707 break 15708 } 15709 if v_0_1.Type != t { 15710 break 15711 } 15712 d := v_0_1.AuxInt 15713 v_1 := v.Args[1] 15714 if v_1.Op != OpConst64 { 15715 break 15716 } 15717 if v_1.Type != t { 15718 break 15719 } 15720 c := v_1.AuxInt 15721 v.reset(OpAdd64) 15722 v0 := b.NewValue0(v.Pos, OpConst64, t) 15723 v0.AuxInt = c * d 15724 v.AddArg(v0) 15725 v1 := b.NewValue0(v.Pos, OpMul64, t) 15726 v2 := b.NewValue0(v.Pos, OpConst64, t) 15727 v2.AuxInt = c 15728 v1.AddArg(v2) 15729 v1.AddArg(x) 15730 v.AddArg(v1) 15731 return true 15732 } 15733 // match: (Mul64 (Const64 [0]) _) 15734 // cond: 15735 // result: (Const64 [0]) 15736 for { 15737 _ = v.Args[1] 15738 v_0 := v.Args[0] 15739 if v_0.Op != OpConst64 { 15740 break 15741 } 15742 if v_0.AuxInt != 0 { 15743 break 15744 } 15745 v.reset(OpConst64) 15746 v.AuxInt = 0 15747 return true 15748 } 15749 // match: (Mul64 _ (Const64 [0])) 15750 // cond: 15751 // result: (Const64 [0]) 15752 for { 15753 _ = v.Args[1] 15754 v_1 := v.Args[1] 15755 if v_1.Op != OpConst64 { 15756 break 15757 } 15758 if v_1.AuxInt != 0 { 15759 break 15760 } 15761 v.reset(OpConst64) 15762 v.AuxInt = 0 15763 return true 15764 } 15765 // match: (Mul64 (Const64 <t> [c]) (Mul64 (Const64 <t> [d]) x)) 15766 // cond: 15767 // result: (Mul64 (Const64 <t> [c*d]) x) 15768 for { 15769 _ = v.Args[1] 15770 v_0 := v.Args[0] 15771 if v_0.Op != OpConst64 { 15772 break 15773 } 15774 t := v_0.Type 15775 c := v_0.AuxInt 15776 v_1 := v.Args[1] 15777 if v_1.Op != OpMul64 { 15778 break 15779 } 15780 _ = v_1.Args[1] 15781 v_1_0 := v_1.Args[0] 15782 if v_1_0.Op != OpConst64 { 15783 break 15784 } 15785 if v_1_0.Type != t { 15786 break 15787 } 15788 d := v_1_0.AuxInt 15789 x := v_1.Args[1] 15790 v.reset(OpMul64) 15791 v0 := b.NewValue0(v.Pos, OpConst64, t) 15792 v0.AuxInt = c * d 15793 v.AddArg(v0) 15794 v.AddArg(x) 15795 return true 15796 } 15797 // match: (Mul64 (Const64 <t> [c]) (Mul64 x (Const64 <t> [d]))) 15798 // cond: 15799 // result: (Mul64 (Const64 <t> [c*d]) x) 15800 for { 15801 _ = v.Args[1] 15802 v_0 := v.Args[0] 15803 if v_0.Op != OpConst64 { 15804 break 15805 } 15806 t := v_0.Type 15807 c := v_0.AuxInt 15808 v_1 := v.Args[1] 15809 if v_1.Op != OpMul64 { 15810 break 15811 } 15812 _ = v_1.Args[1] 15813 x := v_1.Args[0] 15814 v_1_1 := v_1.Args[1] 15815 if v_1_1.Op != OpConst64 { 15816 break 15817 } 15818 if v_1_1.Type != t { 15819 break 15820 } 15821 d := v_1_1.AuxInt 15822 v.reset(OpMul64) 15823 v0 := b.NewValue0(v.Pos, OpConst64, t) 15824 v0.AuxInt = c * d 15825 v.AddArg(v0) 15826 v.AddArg(x) 15827 return true 15828 } 15829 // match: (Mul64 (Mul64 (Const64 <t> [d]) x) (Const64 <t> [c])) 15830 // cond: 15831 // result: (Mul64 (Const64 <t> [c*d]) x) 15832 for { 15833 _ = v.Args[1] 15834 v_0 := v.Args[0] 15835 if v_0.Op != OpMul64 { 15836 break 15837 } 15838 _ = v_0.Args[1] 15839 v_0_0 := v_0.Args[0] 15840 if v_0_0.Op != OpConst64 { 15841 break 15842 } 15843 t := v_0_0.Type 15844 d := v_0_0.AuxInt 15845 x := v_0.Args[1] 15846 v_1 := v.Args[1] 15847 if v_1.Op != OpConst64 { 15848 break 15849 } 15850 if v_1.Type != t { 15851 break 15852 } 15853 c := v_1.AuxInt 15854 v.reset(OpMul64) 15855 v0 := b.NewValue0(v.Pos, OpConst64, t) 15856 v0.AuxInt = c * d 15857 v.AddArg(v0) 15858 v.AddArg(x) 15859 return true 15860 } 15861 // match: (Mul64 (Mul64 x (Const64 <t> [d])) (Const64 <t> [c])) 15862 // cond: 15863 // result: (Mul64 (Const64 <t> [c*d]) x) 15864 for { 15865 _ = v.Args[1] 15866 v_0 := v.Args[0] 15867 if v_0.Op != OpMul64 { 15868 break 15869 } 15870 _ = v_0.Args[1] 15871 x := v_0.Args[0] 15872 v_0_1 := v_0.Args[1] 15873 if v_0_1.Op != OpConst64 { 15874 break 15875 } 15876 t := v_0_1.Type 15877 d := v_0_1.AuxInt 15878 v_1 := v.Args[1] 15879 if v_1.Op != OpConst64 { 15880 break 15881 } 15882 if v_1.Type != t { 15883 break 15884 } 15885 c := v_1.AuxInt 15886 v.reset(OpMul64) 15887 v0 := b.NewValue0(v.Pos, OpConst64, t) 15888 v0.AuxInt = c * d 15889 v.AddArg(v0) 15890 v.AddArg(x) 15891 return true 15892 } 15893 return false 15894 } 15895 func rewriteValuegeneric_OpMul64F_0(v *Value) bool { 15896 // match: (Mul64F (Const64F [c]) (Const64F [d])) 15897 // cond: 15898 // result: (Const64F [f2i(i2f(c) * i2f(d))]) 15899 for { 15900 _ = v.Args[1] 15901 v_0 := v.Args[0] 15902 if v_0.Op != OpConst64F { 15903 break 15904 } 15905 c := v_0.AuxInt 15906 v_1 := v.Args[1] 15907 if v_1.Op != OpConst64F { 15908 break 15909 } 15910 d := v_1.AuxInt 15911 v.reset(OpConst64F) 15912 v.AuxInt = f2i(i2f(c) * i2f(d)) 15913 return true 15914 } 15915 // match: (Mul64F (Const64F [d]) (Const64F [c])) 15916 // cond: 15917 // result: (Const64F [f2i(i2f(c) * i2f(d))]) 15918 for { 15919 _ = v.Args[1] 15920 v_0 := v.Args[0] 15921 if v_0.Op != OpConst64F { 15922 break 15923 } 15924 d := v_0.AuxInt 15925 v_1 := v.Args[1] 15926 if v_1.Op != OpConst64F { 15927 break 15928 } 15929 c := v_1.AuxInt 15930 v.reset(OpConst64F) 15931 v.AuxInt = f2i(i2f(c) * i2f(d)) 15932 return true 15933 } 15934 // match: (Mul64F x (Const64F [f2i(1)])) 15935 // cond: 15936 // result: x 15937 for { 15938 _ = v.Args[1] 15939 x := v.Args[0] 15940 v_1 := v.Args[1] 15941 if v_1.Op != OpConst64F { 15942 break 15943 } 15944 if v_1.AuxInt != f2i(1) { 15945 break 15946 } 15947 v.reset(OpCopy) 15948 v.Type = x.Type 15949 v.AddArg(x) 15950 return true 15951 } 15952 // match: (Mul64F (Const64F [f2i(1)]) x) 15953 // cond: 15954 // result: x 15955 for { 15956 _ = v.Args[1] 15957 v_0 := v.Args[0] 15958 if v_0.Op != OpConst64F { 15959 break 15960 } 15961 if v_0.AuxInt != f2i(1) { 15962 break 15963 } 15964 x := v.Args[1] 15965 v.reset(OpCopy) 15966 v.Type = x.Type 15967 v.AddArg(x) 15968 return true 15969 } 15970 // match: (Mul64F x (Const64F [f2i(-1)])) 15971 // cond: 15972 // result: (Neg64F x) 15973 for { 15974 _ = v.Args[1] 15975 x := v.Args[0] 15976 v_1 := v.Args[1] 15977 if v_1.Op != OpConst64F { 15978 break 15979 } 15980 if v_1.AuxInt != f2i(-1) { 15981 break 15982 } 15983 v.reset(OpNeg64F) 15984 v.AddArg(x) 15985 return true 15986 } 15987 // match: (Mul64F (Const64F [f2i(-1)]) x) 15988 // cond: 15989 // result: (Neg64F x) 15990 for { 15991 _ = v.Args[1] 15992 v_0 := v.Args[0] 15993 if v_0.Op != OpConst64F { 15994 break 15995 } 15996 if v_0.AuxInt != f2i(-1) { 15997 break 15998 } 15999 x := v.Args[1] 16000 v.reset(OpNeg64F) 16001 v.AddArg(x) 16002 return true 16003 } 16004 // match: (Mul64F x (Const64F [f2i(2)])) 16005 // cond: 16006 // result: (Add64F x x) 16007 for { 16008 _ = v.Args[1] 16009 x := v.Args[0] 16010 v_1 := v.Args[1] 16011 if v_1.Op != OpConst64F { 16012 break 16013 } 16014 if v_1.AuxInt != f2i(2) { 16015 break 16016 } 16017 v.reset(OpAdd64F) 16018 v.AddArg(x) 16019 v.AddArg(x) 16020 return true 16021 } 16022 // match: (Mul64F (Const64F [f2i(2)]) x) 16023 // cond: 16024 // result: (Add64F x x) 16025 for { 16026 _ = v.Args[1] 16027 v_0 := v.Args[0] 16028 if v_0.Op != OpConst64F { 16029 break 16030 } 16031 if v_0.AuxInt != f2i(2) { 16032 break 16033 } 16034 x := v.Args[1] 16035 v.reset(OpAdd64F) 16036 v.AddArg(x) 16037 v.AddArg(x) 16038 return true 16039 } 16040 return false 16041 } 16042 func rewriteValuegeneric_OpMul8_0(v *Value) bool { 16043 b := v.Block 16044 _ = b 16045 typ := &b.Func.Config.Types 16046 _ = typ 16047 // match: (Mul8 (Const8 [c]) (Const8 [d])) 16048 // cond: 16049 // result: (Const8 [int64(int8(c*d))]) 16050 for { 16051 _ = v.Args[1] 16052 v_0 := v.Args[0] 16053 if v_0.Op != OpConst8 { 16054 break 16055 } 16056 c := v_0.AuxInt 16057 v_1 := v.Args[1] 16058 if v_1.Op != OpConst8 { 16059 break 16060 } 16061 d := v_1.AuxInt 16062 v.reset(OpConst8) 16063 v.AuxInt = int64(int8(c * d)) 16064 return true 16065 } 16066 // match: (Mul8 (Const8 [d]) (Const8 [c])) 16067 // cond: 16068 // result: (Const8 [int64(int8(c*d))]) 16069 for { 16070 _ = v.Args[1] 16071 v_0 := v.Args[0] 16072 if v_0.Op != OpConst8 { 16073 break 16074 } 16075 d := v_0.AuxInt 16076 v_1 := v.Args[1] 16077 if v_1.Op != OpConst8 { 16078 break 16079 } 16080 c := v_1.AuxInt 16081 v.reset(OpConst8) 16082 v.AuxInt = int64(int8(c * d)) 16083 return true 16084 } 16085 // match: (Mul8 (Const8 [1]) x) 16086 // cond: 16087 // result: x 16088 for { 16089 _ = v.Args[1] 16090 v_0 := v.Args[0] 16091 if v_0.Op != OpConst8 { 16092 break 16093 } 16094 if v_0.AuxInt != 1 { 16095 break 16096 } 16097 x := v.Args[1] 16098 v.reset(OpCopy) 16099 v.Type = x.Type 16100 v.AddArg(x) 16101 return true 16102 } 16103 // match: (Mul8 x (Const8 [1])) 16104 // cond: 16105 // result: x 16106 for { 16107 _ = v.Args[1] 16108 x := v.Args[0] 16109 v_1 := v.Args[1] 16110 if v_1.Op != OpConst8 { 16111 break 16112 } 16113 if v_1.AuxInt != 1 { 16114 break 16115 } 16116 v.reset(OpCopy) 16117 v.Type = x.Type 16118 v.AddArg(x) 16119 return true 16120 } 16121 // match: (Mul8 (Const8 [-1]) x) 16122 // cond: 16123 // result: (Neg8 x) 16124 for { 16125 _ = v.Args[1] 16126 v_0 := v.Args[0] 16127 if v_0.Op != OpConst8 { 16128 break 16129 } 16130 if v_0.AuxInt != -1 { 16131 break 16132 } 16133 x := v.Args[1] 16134 v.reset(OpNeg8) 16135 v.AddArg(x) 16136 return true 16137 } 16138 // match: (Mul8 x (Const8 [-1])) 16139 // cond: 16140 // result: (Neg8 x) 16141 for { 16142 _ = v.Args[1] 16143 x := v.Args[0] 16144 v_1 := v.Args[1] 16145 if v_1.Op != OpConst8 { 16146 break 16147 } 16148 if v_1.AuxInt != -1 { 16149 break 16150 } 16151 v.reset(OpNeg8) 16152 v.AddArg(x) 16153 return true 16154 } 16155 // match: (Mul8 <t> n (Const8 [c])) 16156 // cond: isPowerOfTwo(c) 16157 // result: (Lsh8x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 16158 for { 16159 t := v.Type 16160 _ = v.Args[1] 16161 n := v.Args[0] 16162 v_1 := v.Args[1] 16163 if v_1.Op != OpConst8 { 16164 break 16165 } 16166 c := v_1.AuxInt 16167 if !(isPowerOfTwo(c)) { 16168 break 16169 } 16170 v.reset(OpLsh8x64) 16171 v.Type = t 16172 v.AddArg(n) 16173 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 16174 v0.AuxInt = log2(c) 16175 v.AddArg(v0) 16176 return true 16177 } 16178 // match: (Mul8 <t> (Const8 [c]) n) 16179 // cond: isPowerOfTwo(c) 16180 // result: (Lsh8x64 <t> n (Const64 <typ.UInt64> [log2(c)])) 16181 for { 16182 t := v.Type 16183 _ = v.Args[1] 16184 v_0 := v.Args[0] 16185 if v_0.Op != OpConst8 { 16186 break 16187 } 16188 c := v_0.AuxInt 16189 n := v.Args[1] 16190 if !(isPowerOfTwo(c)) { 16191 break 16192 } 16193 v.reset(OpLsh8x64) 16194 v.Type = t 16195 v.AddArg(n) 16196 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 16197 v0.AuxInt = log2(c) 16198 v.AddArg(v0) 16199 return true 16200 } 16201 // match: (Mul8 <t> n (Const8 [c])) 16202 // cond: t.IsSigned() && isPowerOfTwo(-c) 16203 // result: (Neg8 (Lsh8x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 16204 for { 16205 t := v.Type 16206 _ = v.Args[1] 16207 n := v.Args[0] 16208 v_1 := v.Args[1] 16209 if v_1.Op != OpConst8 { 16210 break 16211 } 16212 c := v_1.AuxInt 16213 if !(t.IsSigned() && isPowerOfTwo(-c)) { 16214 break 16215 } 16216 v.reset(OpNeg8) 16217 v0 := b.NewValue0(v.Pos, OpLsh8x64, t) 16218 v0.AddArg(n) 16219 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 16220 v1.AuxInt = log2(-c) 16221 v0.AddArg(v1) 16222 v.AddArg(v0) 16223 return true 16224 } 16225 // match: (Mul8 <t> (Const8 [c]) n) 16226 // cond: t.IsSigned() && isPowerOfTwo(-c) 16227 // result: (Neg8 (Lsh8x64 <t> n (Const64 <typ.UInt64> [log2(-c)]))) 16228 for { 16229 t := v.Type 16230 _ = v.Args[1] 16231 v_0 := v.Args[0] 16232 if v_0.Op != OpConst8 { 16233 break 16234 } 16235 c := v_0.AuxInt 16236 n := v.Args[1] 16237 if !(t.IsSigned() && isPowerOfTwo(-c)) { 16238 break 16239 } 16240 v.reset(OpNeg8) 16241 v0 := b.NewValue0(v.Pos, OpLsh8x64, t) 16242 v0.AddArg(n) 16243 v1 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 16244 v1.AuxInt = log2(-c) 16245 v0.AddArg(v1) 16246 v.AddArg(v0) 16247 return true 16248 } 16249 return false 16250 } 16251 func rewriteValuegeneric_OpMul8_10(v *Value) bool { 16252 b := v.Block 16253 _ = b 16254 // match: (Mul8 (Const8 [0]) _) 16255 // cond: 16256 // result: (Const8 [0]) 16257 for { 16258 _ = v.Args[1] 16259 v_0 := v.Args[0] 16260 if v_0.Op != OpConst8 { 16261 break 16262 } 16263 if v_0.AuxInt != 0 { 16264 break 16265 } 16266 v.reset(OpConst8) 16267 v.AuxInt = 0 16268 return true 16269 } 16270 // match: (Mul8 _ (Const8 [0])) 16271 // cond: 16272 // result: (Const8 [0]) 16273 for { 16274 _ = v.Args[1] 16275 v_1 := v.Args[1] 16276 if v_1.Op != OpConst8 { 16277 break 16278 } 16279 if v_1.AuxInt != 0 { 16280 break 16281 } 16282 v.reset(OpConst8) 16283 v.AuxInt = 0 16284 return true 16285 } 16286 // match: (Mul8 (Const8 <t> [c]) (Mul8 (Const8 <t> [d]) x)) 16287 // cond: 16288 // result: (Mul8 (Const8 <t> [int64(int8(c*d))]) x) 16289 for { 16290 _ = v.Args[1] 16291 v_0 := v.Args[0] 16292 if v_0.Op != OpConst8 { 16293 break 16294 } 16295 t := v_0.Type 16296 c := v_0.AuxInt 16297 v_1 := v.Args[1] 16298 if v_1.Op != OpMul8 { 16299 break 16300 } 16301 _ = v_1.Args[1] 16302 v_1_0 := v_1.Args[0] 16303 if v_1_0.Op != OpConst8 { 16304 break 16305 } 16306 if v_1_0.Type != t { 16307 break 16308 } 16309 d := v_1_0.AuxInt 16310 x := v_1.Args[1] 16311 v.reset(OpMul8) 16312 v0 := b.NewValue0(v.Pos, OpConst8, t) 16313 v0.AuxInt = int64(int8(c * d)) 16314 v.AddArg(v0) 16315 v.AddArg(x) 16316 return true 16317 } 16318 // match: (Mul8 (Const8 <t> [c]) (Mul8 x (Const8 <t> [d]))) 16319 // cond: 16320 // result: (Mul8 (Const8 <t> [int64(int8(c*d))]) x) 16321 for { 16322 _ = v.Args[1] 16323 v_0 := v.Args[0] 16324 if v_0.Op != OpConst8 { 16325 break 16326 } 16327 t := v_0.Type 16328 c := v_0.AuxInt 16329 v_1 := v.Args[1] 16330 if v_1.Op != OpMul8 { 16331 break 16332 } 16333 _ = v_1.Args[1] 16334 x := v_1.Args[0] 16335 v_1_1 := v_1.Args[1] 16336 if v_1_1.Op != OpConst8 { 16337 break 16338 } 16339 if v_1_1.Type != t { 16340 break 16341 } 16342 d := v_1_1.AuxInt 16343 v.reset(OpMul8) 16344 v0 := b.NewValue0(v.Pos, OpConst8, t) 16345 v0.AuxInt = int64(int8(c * d)) 16346 v.AddArg(v0) 16347 v.AddArg(x) 16348 return true 16349 } 16350 // match: (Mul8 (Mul8 (Const8 <t> [d]) x) (Const8 <t> [c])) 16351 // cond: 16352 // result: (Mul8 (Const8 <t> [int64(int8(c*d))]) x) 16353 for { 16354 _ = v.Args[1] 16355 v_0 := v.Args[0] 16356 if v_0.Op != OpMul8 { 16357 break 16358 } 16359 _ = v_0.Args[1] 16360 v_0_0 := v_0.Args[0] 16361 if v_0_0.Op != OpConst8 { 16362 break 16363 } 16364 t := v_0_0.Type 16365 d := v_0_0.AuxInt 16366 x := v_0.Args[1] 16367 v_1 := v.Args[1] 16368 if v_1.Op != OpConst8 { 16369 break 16370 } 16371 if v_1.Type != t { 16372 break 16373 } 16374 c := v_1.AuxInt 16375 v.reset(OpMul8) 16376 v0 := b.NewValue0(v.Pos, OpConst8, t) 16377 v0.AuxInt = int64(int8(c * d)) 16378 v.AddArg(v0) 16379 v.AddArg(x) 16380 return true 16381 } 16382 // match: (Mul8 (Mul8 x (Const8 <t> [d])) (Const8 <t> [c])) 16383 // cond: 16384 // result: (Mul8 (Const8 <t> [int64(int8(c*d))]) x) 16385 for { 16386 _ = v.Args[1] 16387 v_0 := v.Args[0] 16388 if v_0.Op != OpMul8 { 16389 break 16390 } 16391 _ = v_0.Args[1] 16392 x := v_0.Args[0] 16393 v_0_1 := v_0.Args[1] 16394 if v_0_1.Op != OpConst8 { 16395 break 16396 } 16397 t := v_0_1.Type 16398 d := v_0_1.AuxInt 16399 v_1 := v.Args[1] 16400 if v_1.Op != OpConst8 { 16401 break 16402 } 16403 if v_1.Type != t { 16404 break 16405 } 16406 c := v_1.AuxInt 16407 v.reset(OpMul8) 16408 v0 := b.NewValue0(v.Pos, OpConst8, t) 16409 v0.AuxInt = int64(int8(c * d)) 16410 v.AddArg(v0) 16411 v.AddArg(x) 16412 return true 16413 } 16414 return false 16415 } 16416 func rewriteValuegeneric_OpNeg16_0(v *Value) bool { 16417 // match: (Neg16 (Const16 [c])) 16418 // cond: 16419 // result: (Const16 [int64(-int16(c))]) 16420 for { 16421 v_0 := v.Args[0] 16422 if v_0.Op != OpConst16 { 16423 break 16424 } 16425 c := v_0.AuxInt 16426 v.reset(OpConst16) 16427 v.AuxInt = int64(-int16(c)) 16428 return true 16429 } 16430 // match: (Neg16 (Sub16 x y)) 16431 // cond: 16432 // result: (Sub16 y x) 16433 for { 16434 v_0 := v.Args[0] 16435 if v_0.Op != OpSub16 { 16436 break 16437 } 16438 _ = v_0.Args[1] 16439 x := v_0.Args[0] 16440 y := v_0.Args[1] 16441 v.reset(OpSub16) 16442 v.AddArg(y) 16443 v.AddArg(x) 16444 return true 16445 } 16446 return false 16447 } 16448 func rewriteValuegeneric_OpNeg32_0(v *Value) bool { 16449 // match: (Neg32 (Const32 [c])) 16450 // cond: 16451 // result: (Const32 [int64(-int32(c))]) 16452 for { 16453 v_0 := v.Args[0] 16454 if v_0.Op != OpConst32 { 16455 break 16456 } 16457 c := v_0.AuxInt 16458 v.reset(OpConst32) 16459 v.AuxInt = int64(-int32(c)) 16460 return true 16461 } 16462 // match: (Neg32 (Sub32 x y)) 16463 // cond: 16464 // result: (Sub32 y x) 16465 for { 16466 v_0 := v.Args[0] 16467 if v_0.Op != OpSub32 { 16468 break 16469 } 16470 _ = v_0.Args[1] 16471 x := v_0.Args[0] 16472 y := v_0.Args[1] 16473 v.reset(OpSub32) 16474 v.AddArg(y) 16475 v.AddArg(x) 16476 return true 16477 } 16478 return false 16479 } 16480 func rewriteValuegeneric_OpNeg32F_0(v *Value) bool { 16481 // match: (Neg32F (Const32F [c])) 16482 // cond: i2f(c) != 0 16483 // result: (Const32F [f2i(-i2f(c))]) 16484 for { 16485 v_0 := v.Args[0] 16486 if v_0.Op != OpConst32F { 16487 break 16488 } 16489 c := v_0.AuxInt 16490 if !(i2f(c) != 0) { 16491 break 16492 } 16493 v.reset(OpConst32F) 16494 v.AuxInt = f2i(-i2f(c)) 16495 return true 16496 } 16497 return false 16498 } 16499 func rewriteValuegeneric_OpNeg64_0(v *Value) bool { 16500 // match: (Neg64 (Const64 [c])) 16501 // cond: 16502 // result: (Const64 [-c]) 16503 for { 16504 v_0 := v.Args[0] 16505 if v_0.Op != OpConst64 { 16506 break 16507 } 16508 c := v_0.AuxInt 16509 v.reset(OpConst64) 16510 v.AuxInt = -c 16511 return true 16512 } 16513 // match: (Neg64 (Sub64 x y)) 16514 // cond: 16515 // result: (Sub64 y x) 16516 for { 16517 v_0 := v.Args[0] 16518 if v_0.Op != OpSub64 { 16519 break 16520 } 16521 _ = v_0.Args[1] 16522 x := v_0.Args[0] 16523 y := v_0.Args[1] 16524 v.reset(OpSub64) 16525 v.AddArg(y) 16526 v.AddArg(x) 16527 return true 16528 } 16529 return false 16530 } 16531 func rewriteValuegeneric_OpNeg64F_0(v *Value) bool { 16532 // match: (Neg64F (Const64F [c])) 16533 // cond: i2f(c) != 0 16534 // result: (Const64F [f2i(-i2f(c))]) 16535 for { 16536 v_0 := v.Args[0] 16537 if v_0.Op != OpConst64F { 16538 break 16539 } 16540 c := v_0.AuxInt 16541 if !(i2f(c) != 0) { 16542 break 16543 } 16544 v.reset(OpConst64F) 16545 v.AuxInt = f2i(-i2f(c)) 16546 return true 16547 } 16548 return false 16549 } 16550 func rewriteValuegeneric_OpNeg8_0(v *Value) bool { 16551 // match: (Neg8 (Const8 [c])) 16552 // cond: 16553 // result: (Const8 [int64( -int8(c))]) 16554 for { 16555 v_0 := v.Args[0] 16556 if v_0.Op != OpConst8 { 16557 break 16558 } 16559 c := v_0.AuxInt 16560 v.reset(OpConst8) 16561 v.AuxInt = int64(-int8(c)) 16562 return true 16563 } 16564 // match: (Neg8 (Sub8 x y)) 16565 // cond: 16566 // result: (Sub8 y x) 16567 for { 16568 v_0 := v.Args[0] 16569 if v_0.Op != OpSub8 { 16570 break 16571 } 16572 _ = v_0.Args[1] 16573 x := v_0.Args[0] 16574 y := v_0.Args[1] 16575 v.reset(OpSub8) 16576 v.AddArg(y) 16577 v.AddArg(x) 16578 return true 16579 } 16580 return false 16581 } 16582 func rewriteValuegeneric_OpNeq16_0(v *Value) bool { 16583 b := v.Block 16584 _ = b 16585 // match: (Neq16 x x) 16586 // cond: 16587 // result: (ConstBool [0]) 16588 for { 16589 _ = v.Args[1] 16590 x := v.Args[0] 16591 if x != v.Args[1] { 16592 break 16593 } 16594 v.reset(OpConstBool) 16595 v.AuxInt = 0 16596 return true 16597 } 16598 // match: (Neq16 (Const16 <t> [c]) (Add16 (Const16 <t> [d]) x)) 16599 // cond: 16600 // result: (Neq16 (Const16 <t> [int64(int16(c-d))]) x) 16601 for { 16602 _ = v.Args[1] 16603 v_0 := v.Args[0] 16604 if v_0.Op != OpConst16 { 16605 break 16606 } 16607 t := v_0.Type 16608 c := v_0.AuxInt 16609 v_1 := v.Args[1] 16610 if v_1.Op != OpAdd16 { 16611 break 16612 } 16613 _ = v_1.Args[1] 16614 v_1_0 := v_1.Args[0] 16615 if v_1_0.Op != OpConst16 { 16616 break 16617 } 16618 if v_1_0.Type != t { 16619 break 16620 } 16621 d := v_1_0.AuxInt 16622 x := v_1.Args[1] 16623 v.reset(OpNeq16) 16624 v0 := b.NewValue0(v.Pos, OpConst16, t) 16625 v0.AuxInt = int64(int16(c - d)) 16626 v.AddArg(v0) 16627 v.AddArg(x) 16628 return true 16629 } 16630 // match: (Neq16 (Const16 <t> [c]) (Add16 x (Const16 <t> [d]))) 16631 // cond: 16632 // result: (Neq16 (Const16 <t> [int64(int16(c-d))]) x) 16633 for { 16634 _ = v.Args[1] 16635 v_0 := v.Args[0] 16636 if v_0.Op != OpConst16 { 16637 break 16638 } 16639 t := v_0.Type 16640 c := v_0.AuxInt 16641 v_1 := v.Args[1] 16642 if v_1.Op != OpAdd16 { 16643 break 16644 } 16645 _ = v_1.Args[1] 16646 x := v_1.Args[0] 16647 v_1_1 := v_1.Args[1] 16648 if v_1_1.Op != OpConst16 { 16649 break 16650 } 16651 if v_1_1.Type != t { 16652 break 16653 } 16654 d := v_1_1.AuxInt 16655 v.reset(OpNeq16) 16656 v0 := b.NewValue0(v.Pos, OpConst16, t) 16657 v0.AuxInt = int64(int16(c - d)) 16658 v.AddArg(v0) 16659 v.AddArg(x) 16660 return true 16661 } 16662 // match: (Neq16 (Add16 (Const16 <t> [d]) x) (Const16 <t> [c])) 16663 // cond: 16664 // result: (Neq16 (Const16 <t> [int64(int16(c-d))]) x) 16665 for { 16666 _ = v.Args[1] 16667 v_0 := v.Args[0] 16668 if v_0.Op != OpAdd16 { 16669 break 16670 } 16671 _ = v_0.Args[1] 16672 v_0_0 := v_0.Args[0] 16673 if v_0_0.Op != OpConst16 { 16674 break 16675 } 16676 t := v_0_0.Type 16677 d := v_0_0.AuxInt 16678 x := v_0.Args[1] 16679 v_1 := v.Args[1] 16680 if v_1.Op != OpConst16 { 16681 break 16682 } 16683 if v_1.Type != t { 16684 break 16685 } 16686 c := v_1.AuxInt 16687 v.reset(OpNeq16) 16688 v0 := b.NewValue0(v.Pos, OpConst16, t) 16689 v0.AuxInt = int64(int16(c - d)) 16690 v.AddArg(v0) 16691 v.AddArg(x) 16692 return true 16693 } 16694 // match: (Neq16 (Add16 x (Const16 <t> [d])) (Const16 <t> [c])) 16695 // cond: 16696 // result: (Neq16 (Const16 <t> [int64(int16(c-d))]) x) 16697 for { 16698 _ = v.Args[1] 16699 v_0 := v.Args[0] 16700 if v_0.Op != OpAdd16 { 16701 break 16702 } 16703 _ = v_0.Args[1] 16704 x := v_0.Args[0] 16705 v_0_1 := v_0.Args[1] 16706 if v_0_1.Op != OpConst16 { 16707 break 16708 } 16709 t := v_0_1.Type 16710 d := v_0_1.AuxInt 16711 v_1 := v.Args[1] 16712 if v_1.Op != OpConst16 { 16713 break 16714 } 16715 if v_1.Type != t { 16716 break 16717 } 16718 c := v_1.AuxInt 16719 v.reset(OpNeq16) 16720 v0 := b.NewValue0(v.Pos, OpConst16, t) 16721 v0.AuxInt = int64(int16(c - d)) 16722 v.AddArg(v0) 16723 v.AddArg(x) 16724 return true 16725 } 16726 // match: (Neq16 (Const16 [c]) (Const16 [d])) 16727 // cond: 16728 // result: (ConstBool [b2i(c != d)]) 16729 for { 16730 _ = v.Args[1] 16731 v_0 := v.Args[0] 16732 if v_0.Op != OpConst16 { 16733 break 16734 } 16735 c := v_0.AuxInt 16736 v_1 := v.Args[1] 16737 if v_1.Op != OpConst16 { 16738 break 16739 } 16740 d := v_1.AuxInt 16741 v.reset(OpConstBool) 16742 v.AuxInt = b2i(c != d) 16743 return true 16744 } 16745 // match: (Neq16 (Const16 [d]) (Const16 [c])) 16746 // cond: 16747 // result: (ConstBool [b2i(c != d)]) 16748 for { 16749 _ = v.Args[1] 16750 v_0 := v.Args[0] 16751 if v_0.Op != OpConst16 { 16752 break 16753 } 16754 d := v_0.AuxInt 16755 v_1 := v.Args[1] 16756 if v_1.Op != OpConst16 { 16757 break 16758 } 16759 c := v_1.AuxInt 16760 v.reset(OpConstBool) 16761 v.AuxInt = b2i(c != d) 16762 return true 16763 } 16764 return false 16765 } 16766 func rewriteValuegeneric_OpNeq32_0(v *Value) bool { 16767 b := v.Block 16768 _ = b 16769 // match: (Neq32 x x) 16770 // cond: 16771 // result: (ConstBool [0]) 16772 for { 16773 _ = v.Args[1] 16774 x := v.Args[0] 16775 if x != v.Args[1] { 16776 break 16777 } 16778 v.reset(OpConstBool) 16779 v.AuxInt = 0 16780 return true 16781 } 16782 // match: (Neq32 (Const32 <t> [c]) (Add32 (Const32 <t> [d]) x)) 16783 // cond: 16784 // result: (Neq32 (Const32 <t> [int64(int32(c-d))]) x) 16785 for { 16786 _ = v.Args[1] 16787 v_0 := v.Args[0] 16788 if v_0.Op != OpConst32 { 16789 break 16790 } 16791 t := v_0.Type 16792 c := v_0.AuxInt 16793 v_1 := v.Args[1] 16794 if v_1.Op != OpAdd32 { 16795 break 16796 } 16797 _ = v_1.Args[1] 16798 v_1_0 := v_1.Args[0] 16799 if v_1_0.Op != OpConst32 { 16800 break 16801 } 16802 if v_1_0.Type != t { 16803 break 16804 } 16805 d := v_1_0.AuxInt 16806 x := v_1.Args[1] 16807 v.reset(OpNeq32) 16808 v0 := b.NewValue0(v.Pos, OpConst32, t) 16809 v0.AuxInt = int64(int32(c - d)) 16810 v.AddArg(v0) 16811 v.AddArg(x) 16812 return true 16813 } 16814 // match: (Neq32 (Const32 <t> [c]) (Add32 x (Const32 <t> [d]))) 16815 // cond: 16816 // result: (Neq32 (Const32 <t> [int64(int32(c-d))]) x) 16817 for { 16818 _ = v.Args[1] 16819 v_0 := v.Args[0] 16820 if v_0.Op != OpConst32 { 16821 break 16822 } 16823 t := v_0.Type 16824 c := v_0.AuxInt 16825 v_1 := v.Args[1] 16826 if v_1.Op != OpAdd32 { 16827 break 16828 } 16829 _ = v_1.Args[1] 16830 x := v_1.Args[0] 16831 v_1_1 := v_1.Args[1] 16832 if v_1_1.Op != OpConst32 { 16833 break 16834 } 16835 if v_1_1.Type != t { 16836 break 16837 } 16838 d := v_1_1.AuxInt 16839 v.reset(OpNeq32) 16840 v0 := b.NewValue0(v.Pos, OpConst32, t) 16841 v0.AuxInt = int64(int32(c - d)) 16842 v.AddArg(v0) 16843 v.AddArg(x) 16844 return true 16845 } 16846 // match: (Neq32 (Add32 (Const32 <t> [d]) x) (Const32 <t> [c])) 16847 // cond: 16848 // result: (Neq32 (Const32 <t> [int64(int32(c-d))]) x) 16849 for { 16850 _ = v.Args[1] 16851 v_0 := v.Args[0] 16852 if v_0.Op != OpAdd32 { 16853 break 16854 } 16855 _ = v_0.Args[1] 16856 v_0_0 := v_0.Args[0] 16857 if v_0_0.Op != OpConst32 { 16858 break 16859 } 16860 t := v_0_0.Type 16861 d := v_0_0.AuxInt 16862 x := v_0.Args[1] 16863 v_1 := v.Args[1] 16864 if v_1.Op != OpConst32 { 16865 break 16866 } 16867 if v_1.Type != t { 16868 break 16869 } 16870 c := v_1.AuxInt 16871 v.reset(OpNeq32) 16872 v0 := b.NewValue0(v.Pos, OpConst32, t) 16873 v0.AuxInt = int64(int32(c - d)) 16874 v.AddArg(v0) 16875 v.AddArg(x) 16876 return true 16877 } 16878 // match: (Neq32 (Add32 x (Const32 <t> [d])) (Const32 <t> [c])) 16879 // cond: 16880 // result: (Neq32 (Const32 <t> [int64(int32(c-d))]) x) 16881 for { 16882 _ = v.Args[1] 16883 v_0 := v.Args[0] 16884 if v_0.Op != OpAdd32 { 16885 break 16886 } 16887 _ = v_0.Args[1] 16888 x := v_0.Args[0] 16889 v_0_1 := v_0.Args[1] 16890 if v_0_1.Op != OpConst32 { 16891 break 16892 } 16893 t := v_0_1.Type 16894 d := v_0_1.AuxInt 16895 v_1 := v.Args[1] 16896 if v_1.Op != OpConst32 { 16897 break 16898 } 16899 if v_1.Type != t { 16900 break 16901 } 16902 c := v_1.AuxInt 16903 v.reset(OpNeq32) 16904 v0 := b.NewValue0(v.Pos, OpConst32, t) 16905 v0.AuxInt = int64(int32(c - d)) 16906 v.AddArg(v0) 16907 v.AddArg(x) 16908 return true 16909 } 16910 // match: (Neq32 (Const32 [c]) (Const32 [d])) 16911 // cond: 16912 // result: (ConstBool [b2i(c != d)]) 16913 for { 16914 _ = v.Args[1] 16915 v_0 := v.Args[0] 16916 if v_0.Op != OpConst32 { 16917 break 16918 } 16919 c := v_0.AuxInt 16920 v_1 := v.Args[1] 16921 if v_1.Op != OpConst32 { 16922 break 16923 } 16924 d := v_1.AuxInt 16925 v.reset(OpConstBool) 16926 v.AuxInt = b2i(c != d) 16927 return true 16928 } 16929 // match: (Neq32 (Const32 [d]) (Const32 [c])) 16930 // cond: 16931 // result: (ConstBool [b2i(c != d)]) 16932 for { 16933 _ = v.Args[1] 16934 v_0 := v.Args[0] 16935 if v_0.Op != OpConst32 { 16936 break 16937 } 16938 d := v_0.AuxInt 16939 v_1 := v.Args[1] 16940 if v_1.Op != OpConst32 { 16941 break 16942 } 16943 c := v_1.AuxInt 16944 v.reset(OpConstBool) 16945 v.AuxInt = b2i(c != d) 16946 return true 16947 } 16948 return false 16949 } 16950 func rewriteValuegeneric_OpNeq32F_0(v *Value) bool { 16951 // match: (Neq32F (Const32F [c]) (Const32F [d])) 16952 // cond: 16953 // result: (ConstBool [b2i(i2f(c) != i2f(d))]) 16954 for { 16955 _ = v.Args[1] 16956 v_0 := v.Args[0] 16957 if v_0.Op != OpConst32F { 16958 break 16959 } 16960 c := v_0.AuxInt 16961 v_1 := v.Args[1] 16962 if v_1.Op != OpConst32F { 16963 break 16964 } 16965 d := v_1.AuxInt 16966 v.reset(OpConstBool) 16967 v.AuxInt = b2i(i2f(c) != i2f(d)) 16968 return true 16969 } 16970 // match: (Neq32F (Const32F [d]) (Const32F [c])) 16971 // cond: 16972 // result: (ConstBool [b2i(i2f(c) != i2f(d))]) 16973 for { 16974 _ = v.Args[1] 16975 v_0 := v.Args[0] 16976 if v_0.Op != OpConst32F { 16977 break 16978 } 16979 d := v_0.AuxInt 16980 v_1 := v.Args[1] 16981 if v_1.Op != OpConst32F { 16982 break 16983 } 16984 c := v_1.AuxInt 16985 v.reset(OpConstBool) 16986 v.AuxInt = b2i(i2f(c) != i2f(d)) 16987 return true 16988 } 16989 return false 16990 } 16991 func rewriteValuegeneric_OpNeq64_0(v *Value) bool { 16992 b := v.Block 16993 _ = b 16994 // match: (Neq64 x x) 16995 // cond: 16996 // result: (ConstBool [0]) 16997 for { 16998 _ = v.Args[1] 16999 x := v.Args[0] 17000 if x != v.Args[1] { 17001 break 17002 } 17003 v.reset(OpConstBool) 17004 v.AuxInt = 0 17005 return true 17006 } 17007 // match: (Neq64 (Const64 <t> [c]) (Add64 (Const64 <t> [d]) x)) 17008 // cond: 17009 // result: (Neq64 (Const64 <t> [c-d]) x) 17010 for { 17011 _ = v.Args[1] 17012 v_0 := v.Args[0] 17013 if v_0.Op != OpConst64 { 17014 break 17015 } 17016 t := v_0.Type 17017 c := v_0.AuxInt 17018 v_1 := v.Args[1] 17019 if v_1.Op != OpAdd64 { 17020 break 17021 } 17022 _ = v_1.Args[1] 17023 v_1_0 := v_1.Args[0] 17024 if v_1_0.Op != OpConst64 { 17025 break 17026 } 17027 if v_1_0.Type != t { 17028 break 17029 } 17030 d := v_1_0.AuxInt 17031 x := v_1.Args[1] 17032 v.reset(OpNeq64) 17033 v0 := b.NewValue0(v.Pos, OpConst64, t) 17034 v0.AuxInt = c - d 17035 v.AddArg(v0) 17036 v.AddArg(x) 17037 return true 17038 } 17039 // match: (Neq64 (Const64 <t> [c]) (Add64 x (Const64 <t> [d]))) 17040 // cond: 17041 // result: (Neq64 (Const64 <t> [c-d]) x) 17042 for { 17043 _ = v.Args[1] 17044 v_0 := v.Args[0] 17045 if v_0.Op != OpConst64 { 17046 break 17047 } 17048 t := v_0.Type 17049 c := v_0.AuxInt 17050 v_1 := v.Args[1] 17051 if v_1.Op != OpAdd64 { 17052 break 17053 } 17054 _ = v_1.Args[1] 17055 x := v_1.Args[0] 17056 v_1_1 := v_1.Args[1] 17057 if v_1_1.Op != OpConst64 { 17058 break 17059 } 17060 if v_1_1.Type != t { 17061 break 17062 } 17063 d := v_1_1.AuxInt 17064 v.reset(OpNeq64) 17065 v0 := b.NewValue0(v.Pos, OpConst64, t) 17066 v0.AuxInt = c - d 17067 v.AddArg(v0) 17068 v.AddArg(x) 17069 return true 17070 } 17071 // match: (Neq64 (Add64 (Const64 <t> [d]) x) (Const64 <t> [c])) 17072 // cond: 17073 // result: (Neq64 (Const64 <t> [c-d]) x) 17074 for { 17075 _ = v.Args[1] 17076 v_0 := v.Args[0] 17077 if v_0.Op != OpAdd64 { 17078 break 17079 } 17080 _ = v_0.Args[1] 17081 v_0_0 := v_0.Args[0] 17082 if v_0_0.Op != OpConst64 { 17083 break 17084 } 17085 t := v_0_0.Type 17086 d := v_0_0.AuxInt 17087 x := v_0.Args[1] 17088 v_1 := v.Args[1] 17089 if v_1.Op != OpConst64 { 17090 break 17091 } 17092 if v_1.Type != t { 17093 break 17094 } 17095 c := v_1.AuxInt 17096 v.reset(OpNeq64) 17097 v0 := b.NewValue0(v.Pos, OpConst64, t) 17098 v0.AuxInt = c - d 17099 v.AddArg(v0) 17100 v.AddArg(x) 17101 return true 17102 } 17103 // match: (Neq64 (Add64 x (Const64 <t> [d])) (Const64 <t> [c])) 17104 // cond: 17105 // result: (Neq64 (Const64 <t> [c-d]) x) 17106 for { 17107 _ = v.Args[1] 17108 v_0 := v.Args[0] 17109 if v_0.Op != OpAdd64 { 17110 break 17111 } 17112 _ = v_0.Args[1] 17113 x := v_0.Args[0] 17114 v_0_1 := v_0.Args[1] 17115 if v_0_1.Op != OpConst64 { 17116 break 17117 } 17118 t := v_0_1.Type 17119 d := v_0_1.AuxInt 17120 v_1 := v.Args[1] 17121 if v_1.Op != OpConst64 { 17122 break 17123 } 17124 if v_1.Type != t { 17125 break 17126 } 17127 c := v_1.AuxInt 17128 v.reset(OpNeq64) 17129 v0 := b.NewValue0(v.Pos, OpConst64, t) 17130 v0.AuxInt = c - d 17131 v.AddArg(v0) 17132 v.AddArg(x) 17133 return true 17134 } 17135 // match: (Neq64 (Const64 [c]) (Const64 [d])) 17136 // cond: 17137 // result: (ConstBool [b2i(c != d)]) 17138 for { 17139 _ = v.Args[1] 17140 v_0 := v.Args[0] 17141 if v_0.Op != OpConst64 { 17142 break 17143 } 17144 c := v_0.AuxInt 17145 v_1 := v.Args[1] 17146 if v_1.Op != OpConst64 { 17147 break 17148 } 17149 d := v_1.AuxInt 17150 v.reset(OpConstBool) 17151 v.AuxInt = b2i(c != d) 17152 return true 17153 } 17154 // match: (Neq64 (Const64 [d]) (Const64 [c])) 17155 // cond: 17156 // result: (ConstBool [b2i(c != d)]) 17157 for { 17158 _ = v.Args[1] 17159 v_0 := v.Args[0] 17160 if v_0.Op != OpConst64 { 17161 break 17162 } 17163 d := v_0.AuxInt 17164 v_1 := v.Args[1] 17165 if v_1.Op != OpConst64 { 17166 break 17167 } 17168 c := v_1.AuxInt 17169 v.reset(OpConstBool) 17170 v.AuxInt = b2i(c != d) 17171 return true 17172 } 17173 return false 17174 } 17175 func rewriteValuegeneric_OpNeq64F_0(v *Value) bool { 17176 // match: (Neq64F (Const64F [c]) (Const64F [d])) 17177 // cond: 17178 // result: (ConstBool [b2i(i2f(c) != i2f(d))]) 17179 for { 17180 _ = v.Args[1] 17181 v_0 := v.Args[0] 17182 if v_0.Op != OpConst64F { 17183 break 17184 } 17185 c := v_0.AuxInt 17186 v_1 := v.Args[1] 17187 if v_1.Op != OpConst64F { 17188 break 17189 } 17190 d := v_1.AuxInt 17191 v.reset(OpConstBool) 17192 v.AuxInt = b2i(i2f(c) != i2f(d)) 17193 return true 17194 } 17195 // match: (Neq64F (Const64F [d]) (Const64F [c])) 17196 // cond: 17197 // result: (ConstBool [b2i(i2f(c) != i2f(d))]) 17198 for { 17199 _ = v.Args[1] 17200 v_0 := v.Args[0] 17201 if v_0.Op != OpConst64F { 17202 break 17203 } 17204 d := v_0.AuxInt 17205 v_1 := v.Args[1] 17206 if v_1.Op != OpConst64F { 17207 break 17208 } 17209 c := v_1.AuxInt 17210 v.reset(OpConstBool) 17211 v.AuxInt = b2i(i2f(c) != i2f(d)) 17212 return true 17213 } 17214 return false 17215 } 17216 func rewriteValuegeneric_OpNeq8_0(v *Value) bool { 17217 b := v.Block 17218 _ = b 17219 // match: (Neq8 x x) 17220 // cond: 17221 // result: (ConstBool [0]) 17222 for { 17223 _ = v.Args[1] 17224 x := v.Args[0] 17225 if x != v.Args[1] { 17226 break 17227 } 17228 v.reset(OpConstBool) 17229 v.AuxInt = 0 17230 return true 17231 } 17232 // match: (Neq8 (Const8 <t> [c]) (Add8 (Const8 <t> [d]) x)) 17233 // cond: 17234 // result: (Neq8 (Const8 <t> [int64(int8(c-d))]) x) 17235 for { 17236 _ = v.Args[1] 17237 v_0 := v.Args[0] 17238 if v_0.Op != OpConst8 { 17239 break 17240 } 17241 t := v_0.Type 17242 c := v_0.AuxInt 17243 v_1 := v.Args[1] 17244 if v_1.Op != OpAdd8 { 17245 break 17246 } 17247 _ = v_1.Args[1] 17248 v_1_0 := v_1.Args[0] 17249 if v_1_0.Op != OpConst8 { 17250 break 17251 } 17252 if v_1_0.Type != t { 17253 break 17254 } 17255 d := v_1_0.AuxInt 17256 x := v_1.Args[1] 17257 v.reset(OpNeq8) 17258 v0 := b.NewValue0(v.Pos, OpConst8, t) 17259 v0.AuxInt = int64(int8(c - d)) 17260 v.AddArg(v0) 17261 v.AddArg(x) 17262 return true 17263 } 17264 // match: (Neq8 (Const8 <t> [c]) (Add8 x (Const8 <t> [d]))) 17265 // cond: 17266 // result: (Neq8 (Const8 <t> [int64(int8(c-d))]) x) 17267 for { 17268 _ = v.Args[1] 17269 v_0 := v.Args[0] 17270 if v_0.Op != OpConst8 { 17271 break 17272 } 17273 t := v_0.Type 17274 c := v_0.AuxInt 17275 v_1 := v.Args[1] 17276 if v_1.Op != OpAdd8 { 17277 break 17278 } 17279 _ = v_1.Args[1] 17280 x := v_1.Args[0] 17281 v_1_1 := v_1.Args[1] 17282 if v_1_1.Op != OpConst8 { 17283 break 17284 } 17285 if v_1_1.Type != t { 17286 break 17287 } 17288 d := v_1_1.AuxInt 17289 v.reset(OpNeq8) 17290 v0 := b.NewValue0(v.Pos, OpConst8, t) 17291 v0.AuxInt = int64(int8(c - d)) 17292 v.AddArg(v0) 17293 v.AddArg(x) 17294 return true 17295 } 17296 // match: (Neq8 (Add8 (Const8 <t> [d]) x) (Const8 <t> [c])) 17297 // cond: 17298 // result: (Neq8 (Const8 <t> [int64(int8(c-d))]) x) 17299 for { 17300 _ = v.Args[1] 17301 v_0 := v.Args[0] 17302 if v_0.Op != OpAdd8 { 17303 break 17304 } 17305 _ = v_0.Args[1] 17306 v_0_0 := v_0.Args[0] 17307 if v_0_0.Op != OpConst8 { 17308 break 17309 } 17310 t := v_0_0.Type 17311 d := v_0_0.AuxInt 17312 x := v_0.Args[1] 17313 v_1 := v.Args[1] 17314 if v_1.Op != OpConst8 { 17315 break 17316 } 17317 if v_1.Type != t { 17318 break 17319 } 17320 c := v_1.AuxInt 17321 v.reset(OpNeq8) 17322 v0 := b.NewValue0(v.Pos, OpConst8, t) 17323 v0.AuxInt = int64(int8(c - d)) 17324 v.AddArg(v0) 17325 v.AddArg(x) 17326 return true 17327 } 17328 // match: (Neq8 (Add8 x (Const8 <t> [d])) (Const8 <t> [c])) 17329 // cond: 17330 // result: (Neq8 (Const8 <t> [int64(int8(c-d))]) x) 17331 for { 17332 _ = v.Args[1] 17333 v_0 := v.Args[0] 17334 if v_0.Op != OpAdd8 { 17335 break 17336 } 17337 _ = v_0.Args[1] 17338 x := v_0.Args[0] 17339 v_0_1 := v_0.Args[1] 17340 if v_0_1.Op != OpConst8 { 17341 break 17342 } 17343 t := v_0_1.Type 17344 d := v_0_1.AuxInt 17345 v_1 := v.Args[1] 17346 if v_1.Op != OpConst8 { 17347 break 17348 } 17349 if v_1.Type != t { 17350 break 17351 } 17352 c := v_1.AuxInt 17353 v.reset(OpNeq8) 17354 v0 := b.NewValue0(v.Pos, OpConst8, t) 17355 v0.AuxInt = int64(int8(c - d)) 17356 v.AddArg(v0) 17357 v.AddArg(x) 17358 return true 17359 } 17360 // match: (Neq8 (Const8 [c]) (Const8 [d])) 17361 // cond: 17362 // result: (ConstBool [b2i(c != d)]) 17363 for { 17364 _ = v.Args[1] 17365 v_0 := v.Args[0] 17366 if v_0.Op != OpConst8 { 17367 break 17368 } 17369 c := v_0.AuxInt 17370 v_1 := v.Args[1] 17371 if v_1.Op != OpConst8 { 17372 break 17373 } 17374 d := v_1.AuxInt 17375 v.reset(OpConstBool) 17376 v.AuxInt = b2i(c != d) 17377 return true 17378 } 17379 // match: (Neq8 (Const8 [d]) (Const8 [c])) 17380 // cond: 17381 // result: (ConstBool [b2i(c != d)]) 17382 for { 17383 _ = v.Args[1] 17384 v_0 := v.Args[0] 17385 if v_0.Op != OpConst8 { 17386 break 17387 } 17388 d := v_0.AuxInt 17389 v_1 := v.Args[1] 17390 if v_1.Op != OpConst8 { 17391 break 17392 } 17393 c := v_1.AuxInt 17394 v.reset(OpConstBool) 17395 v.AuxInt = b2i(c != d) 17396 return true 17397 } 17398 return false 17399 } 17400 func rewriteValuegeneric_OpNeqB_0(v *Value) bool { 17401 // match: (NeqB (ConstBool [c]) (ConstBool [d])) 17402 // cond: 17403 // result: (ConstBool [b2i(c != d)]) 17404 for { 17405 _ = v.Args[1] 17406 v_0 := v.Args[0] 17407 if v_0.Op != OpConstBool { 17408 break 17409 } 17410 c := v_0.AuxInt 17411 v_1 := v.Args[1] 17412 if v_1.Op != OpConstBool { 17413 break 17414 } 17415 d := v_1.AuxInt 17416 v.reset(OpConstBool) 17417 v.AuxInt = b2i(c != d) 17418 return true 17419 } 17420 // match: (NeqB (ConstBool [d]) (ConstBool [c])) 17421 // cond: 17422 // result: (ConstBool [b2i(c != d)]) 17423 for { 17424 _ = v.Args[1] 17425 v_0 := v.Args[0] 17426 if v_0.Op != OpConstBool { 17427 break 17428 } 17429 d := v_0.AuxInt 17430 v_1 := v.Args[1] 17431 if v_1.Op != OpConstBool { 17432 break 17433 } 17434 c := v_1.AuxInt 17435 v.reset(OpConstBool) 17436 v.AuxInt = b2i(c != d) 17437 return true 17438 } 17439 // match: (NeqB (ConstBool [0]) x) 17440 // cond: 17441 // result: x 17442 for { 17443 _ = v.Args[1] 17444 v_0 := v.Args[0] 17445 if v_0.Op != OpConstBool { 17446 break 17447 } 17448 if v_0.AuxInt != 0 { 17449 break 17450 } 17451 x := v.Args[1] 17452 v.reset(OpCopy) 17453 v.Type = x.Type 17454 v.AddArg(x) 17455 return true 17456 } 17457 // match: (NeqB x (ConstBool [0])) 17458 // cond: 17459 // result: x 17460 for { 17461 _ = v.Args[1] 17462 x := v.Args[0] 17463 v_1 := v.Args[1] 17464 if v_1.Op != OpConstBool { 17465 break 17466 } 17467 if v_1.AuxInt != 0 { 17468 break 17469 } 17470 v.reset(OpCopy) 17471 v.Type = x.Type 17472 v.AddArg(x) 17473 return true 17474 } 17475 // match: (NeqB (ConstBool [1]) x) 17476 // cond: 17477 // result: (Not x) 17478 for { 17479 _ = v.Args[1] 17480 v_0 := v.Args[0] 17481 if v_0.Op != OpConstBool { 17482 break 17483 } 17484 if v_0.AuxInt != 1 { 17485 break 17486 } 17487 x := v.Args[1] 17488 v.reset(OpNot) 17489 v.AddArg(x) 17490 return true 17491 } 17492 // match: (NeqB x (ConstBool [1])) 17493 // cond: 17494 // result: (Not x) 17495 for { 17496 _ = v.Args[1] 17497 x := v.Args[0] 17498 v_1 := v.Args[1] 17499 if v_1.Op != OpConstBool { 17500 break 17501 } 17502 if v_1.AuxInt != 1 { 17503 break 17504 } 17505 v.reset(OpNot) 17506 v.AddArg(x) 17507 return true 17508 } 17509 // match: (NeqB (Not x) (Not y)) 17510 // cond: 17511 // result: (NeqB x y) 17512 for { 17513 _ = v.Args[1] 17514 v_0 := v.Args[0] 17515 if v_0.Op != OpNot { 17516 break 17517 } 17518 x := v_0.Args[0] 17519 v_1 := v.Args[1] 17520 if v_1.Op != OpNot { 17521 break 17522 } 17523 y := v_1.Args[0] 17524 v.reset(OpNeqB) 17525 v.AddArg(x) 17526 v.AddArg(y) 17527 return true 17528 } 17529 // match: (NeqB (Not y) (Not x)) 17530 // cond: 17531 // result: (NeqB x y) 17532 for { 17533 _ = v.Args[1] 17534 v_0 := v.Args[0] 17535 if v_0.Op != OpNot { 17536 break 17537 } 17538 y := v_0.Args[0] 17539 v_1 := v.Args[1] 17540 if v_1.Op != OpNot { 17541 break 17542 } 17543 x := v_1.Args[0] 17544 v.reset(OpNeqB) 17545 v.AddArg(x) 17546 v.AddArg(y) 17547 return true 17548 } 17549 return false 17550 } 17551 func rewriteValuegeneric_OpNeqInter_0(v *Value) bool { 17552 b := v.Block 17553 _ = b 17554 typ := &b.Func.Config.Types 17555 _ = typ 17556 // match: (NeqInter x y) 17557 // cond: 17558 // result: (NeqPtr (ITab x) (ITab y)) 17559 for { 17560 _ = v.Args[1] 17561 x := v.Args[0] 17562 y := v.Args[1] 17563 v.reset(OpNeqPtr) 17564 v0 := b.NewValue0(v.Pos, OpITab, typ.BytePtr) 17565 v0.AddArg(x) 17566 v.AddArg(v0) 17567 v1 := b.NewValue0(v.Pos, OpITab, typ.BytePtr) 17568 v1.AddArg(y) 17569 v.AddArg(v1) 17570 return true 17571 } 17572 } 17573 func rewriteValuegeneric_OpNeqPtr_0(v *Value) bool { 17574 // match: (NeqPtr p (ConstNil)) 17575 // cond: 17576 // result: (IsNonNil p) 17577 for { 17578 _ = v.Args[1] 17579 p := v.Args[0] 17580 v_1 := v.Args[1] 17581 if v_1.Op != OpConstNil { 17582 break 17583 } 17584 v.reset(OpIsNonNil) 17585 v.AddArg(p) 17586 return true 17587 } 17588 // match: (NeqPtr (ConstNil) p) 17589 // cond: 17590 // result: (IsNonNil p) 17591 for { 17592 _ = v.Args[1] 17593 v_0 := v.Args[0] 17594 if v_0.Op != OpConstNil { 17595 break 17596 } 17597 p := v.Args[1] 17598 v.reset(OpIsNonNil) 17599 v.AddArg(p) 17600 return true 17601 } 17602 return false 17603 } 17604 func rewriteValuegeneric_OpNeqSlice_0(v *Value) bool { 17605 b := v.Block 17606 _ = b 17607 typ := &b.Func.Config.Types 17608 _ = typ 17609 // match: (NeqSlice x y) 17610 // cond: 17611 // result: (NeqPtr (SlicePtr x) (SlicePtr y)) 17612 for { 17613 _ = v.Args[1] 17614 x := v.Args[0] 17615 y := v.Args[1] 17616 v.reset(OpNeqPtr) 17617 v0 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr) 17618 v0.AddArg(x) 17619 v.AddArg(v0) 17620 v1 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr) 17621 v1.AddArg(y) 17622 v.AddArg(v1) 17623 return true 17624 } 17625 } 17626 func rewriteValuegeneric_OpNilCheck_0(v *Value) bool { 17627 b := v.Block 17628 _ = b 17629 config := b.Func.Config 17630 _ = config 17631 fe := b.Func.fe 17632 _ = fe 17633 // match: (NilCheck (GetG mem) mem) 17634 // cond: 17635 // result: mem 17636 for { 17637 _ = v.Args[1] 17638 v_0 := v.Args[0] 17639 if v_0.Op != OpGetG { 17640 break 17641 } 17642 mem := v_0.Args[0] 17643 if mem != v.Args[1] { 17644 break 17645 } 17646 v.reset(OpCopy) 17647 v.Type = mem.Type 17648 v.AddArg(mem) 17649 return true 17650 } 17651 // match: (NilCheck (Load (OffPtr [c] (SP)) (StaticCall {sym} _)) _) 17652 // cond: isSameSym(sym, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize && warnRule(fe.Debug_checknil() && v.Pos.Line() > 1, v, "removed nil check") 17653 // result: (Invalid) 17654 for { 17655 _ = v.Args[1] 17656 v_0 := v.Args[0] 17657 if v_0.Op != OpLoad { 17658 break 17659 } 17660 _ = v_0.Args[1] 17661 v_0_0 := v_0.Args[0] 17662 if v_0_0.Op != OpOffPtr { 17663 break 17664 } 17665 c := v_0_0.AuxInt 17666 v_0_0_0 := v_0_0.Args[0] 17667 if v_0_0_0.Op != OpSP { 17668 break 17669 } 17670 v_0_1 := v_0.Args[1] 17671 if v_0_1.Op != OpStaticCall { 17672 break 17673 } 17674 sym := v_0_1.Aux 17675 if !(isSameSym(sym, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize && warnRule(fe.Debug_checknil() && v.Pos.Line() > 1, v, "removed nil check")) { 17676 break 17677 } 17678 v.reset(OpInvalid) 17679 return true 17680 } 17681 // match: (NilCheck (OffPtr (Load (OffPtr [c] (SP)) (StaticCall {sym} _))) _) 17682 // cond: isSameSym(sym, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize && warnRule(fe.Debug_checknil() && v.Pos.Line() > 1, v, "removed nil check") 17683 // result: (Invalid) 17684 for { 17685 _ = v.Args[1] 17686 v_0 := v.Args[0] 17687 if v_0.Op != OpOffPtr { 17688 break 17689 } 17690 v_0_0 := v_0.Args[0] 17691 if v_0_0.Op != OpLoad { 17692 break 17693 } 17694 _ = v_0_0.Args[1] 17695 v_0_0_0 := v_0_0.Args[0] 17696 if v_0_0_0.Op != OpOffPtr { 17697 break 17698 } 17699 c := v_0_0_0.AuxInt 17700 v_0_0_0_0 := v_0_0_0.Args[0] 17701 if v_0_0_0_0.Op != OpSP { 17702 break 17703 } 17704 v_0_0_1 := v_0_0.Args[1] 17705 if v_0_0_1.Op != OpStaticCall { 17706 break 17707 } 17708 sym := v_0_0_1.Aux 17709 if !(isSameSym(sym, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize && warnRule(fe.Debug_checknil() && v.Pos.Line() > 1, v, "removed nil check")) { 17710 break 17711 } 17712 v.reset(OpInvalid) 17713 return true 17714 } 17715 return false 17716 } 17717 func rewriteValuegeneric_OpNot_0(v *Value) bool { 17718 // match: (Not (ConstBool [c])) 17719 // cond: 17720 // result: (ConstBool [1-c]) 17721 for { 17722 v_0 := v.Args[0] 17723 if v_0.Op != OpConstBool { 17724 break 17725 } 17726 c := v_0.AuxInt 17727 v.reset(OpConstBool) 17728 v.AuxInt = 1 - c 17729 return true 17730 } 17731 // match: (Not (Eq64 x y)) 17732 // cond: 17733 // result: (Neq64 x y) 17734 for { 17735 v_0 := v.Args[0] 17736 if v_0.Op != OpEq64 { 17737 break 17738 } 17739 _ = v_0.Args[1] 17740 x := v_0.Args[0] 17741 y := v_0.Args[1] 17742 v.reset(OpNeq64) 17743 v.AddArg(x) 17744 v.AddArg(y) 17745 return true 17746 } 17747 // match: (Not (Eq32 x y)) 17748 // cond: 17749 // result: (Neq32 x y) 17750 for { 17751 v_0 := v.Args[0] 17752 if v_0.Op != OpEq32 { 17753 break 17754 } 17755 _ = v_0.Args[1] 17756 x := v_0.Args[0] 17757 y := v_0.Args[1] 17758 v.reset(OpNeq32) 17759 v.AddArg(x) 17760 v.AddArg(y) 17761 return true 17762 } 17763 // match: (Not (Eq16 x y)) 17764 // cond: 17765 // result: (Neq16 x y) 17766 for { 17767 v_0 := v.Args[0] 17768 if v_0.Op != OpEq16 { 17769 break 17770 } 17771 _ = v_0.Args[1] 17772 x := v_0.Args[0] 17773 y := v_0.Args[1] 17774 v.reset(OpNeq16) 17775 v.AddArg(x) 17776 v.AddArg(y) 17777 return true 17778 } 17779 // match: (Not (Eq8 x y)) 17780 // cond: 17781 // result: (Neq8 x y) 17782 for { 17783 v_0 := v.Args[0] 17784 if v_0.Op != OpEq8 { 17785 break 17786 } 17787 _ = v_0.Args[1] 17788 x := v_0.Args[0] 17789 y := v_0.Args[1] 17790 v.reset(OpNeq8) 17791 v.AddArg(x) 17792 v.AddArg(y) 17793 return true 17794 } 17795 // match: (Not (EqB x y)) 17796 // cond: 17797 // result: (NeqB x y) 17798 for { 17799 v_0 := v.Args[0] 17800 if v_0.Op != OpEqB { 17801 break 17802 } 17803 _ = v_0.Args[1] 17804 x := v_0.Args[0] 17805 y := v_0.Args[1] 17806 v.reset(OpNeqB) 17807 v.AddArg(x) 17808 v.AddArg(y) 17809 return true 17810 } 17811 // match: (Not (Neq64 x y)) 17812 // cond: 17813 // result: (Eq64 x y) 17814 for { 17815 v_0 := v.Args[0] 17816 if v_0.Op != OpNeq64 { 17817 break 17818 } 17819 _ = v_0.Args[1] 17820 x := v_0.Args[0] 17821 y := v_0.Args[1] 17822 v.reset(OpEq64) 17823 v.AddArg(x) 17824 v.AddArg(y) 17825 return true 17826 } 17827 // match: (Not (Neq32 x y)) 17828 // cond: 17829 // result: (Eq32 x y) 17830 for { 17831 v_0 := v.Args[0] 17832 if v_0.Op != OpNeq32 { 17833 break 17834 } 17835 _ = v_0.Args[1] 17836 x := v_0.Args[0] 17837 y := v_0.Args[1] 17838 v.reset(OpEq32) 17839 v.AddArg(x) 17840 v.AddArg(y) 17841 return true 17842 } 17843 // match: (Not (Neq16 x y)) 17844 // cond: 17845 // result: (Eq16 x y) 17846 for { 17847 v_0 := v.Args[0] 17848 if v_0.Op != OpNeq16 { 17849 break 17850 } 17851 _ = v_0.Args[1] 17852 x := v_0.Args[0] 17853 y := v_0.Args[1] 17854 v.reset(OpEq16) 17855 v.AddArg(x) 17856 v.AddArg(y) 17857 return true 17858 } 17859 // match: (Not (Neq8 x y)) 17860 // cond: 17861 // result: (Eq8 x y) 17862 for { 17863 v_0 := v.Args[0] 17864 if v_0.Op != OpNeq8 { 17865 break 17866 } 17867 _ = v_0.Args[1] 17868 x := v_0.Args[0] 17869 y := v_0.Args[1] 17870 v.reset(OpEq8) 17871 v.AddArg(x) 17872 v.AddArg(y) 17873 return true 17874 } 17875 return false 17876 } 17877 func rewriteValuegeneric_OpNot_10(v *Value) bool { 17878 // match: (Not (NeqB x y)) 17879 // cond: 17880 // result: (EqB x y) 17881 for { 17882 v_0 := v.Args[0] 17883 if v_0.Op != OpNeqB { 17884 break 17885 } 17886 _ = v_0.Args[1] 17887 x := v_0.Args[0] 17888 y := v_0.Args[1] 17889 v.reset(OpEqB) 17890 v.AddArg(x) 17891 v.AddArg(y) 17892 return true 17893 } 17894 // match: (Not (Greater64 x y)) 17895 // cond: 17896 // result: (Leq64 x y) 17897 for { 17898 v_0 := v.Args[0] 17899 if v_0.Op != OpGreater64 { 17900 break 17901 } 17902 _ = v_0.Args[1] 17903 x := v_0.Args[0] 17904 y := v_0.Args[1] 17905 v.reset(OpLeq64) 17906 v.AddArg(x) 17907 v.AddArg(y) 17908 return true 17909 } 17910 // match: (Not (Greater32 x y)) 17911 // cond: 17912 // result: (Leq32 x y) 17913 for { 17914 v_0 := v.Args[0] 17915 if v_0.Op != OpGreater32 { 17916 break 17917 } 17918 _ = v_0.Args[1] 17919 x := v_0.Args[0] 17920 y := v_0.Args[1] 17921 v.reset(OpLeq32) 17922 v.AddArg(x) 17923 v.AddArg(y) 17924 return true 17925 } 17926 // match: (Not (Greater16 x y)) 17927 // cond: 17928 // result: (Leq16 x y) 17929 for { 17930 v_0 := v.Args[0] 17931 if v_0.Op != OpGreater16 { 17932 break 17933 } 17934 _ = v_0.Args[1] 17935 x := v_0.Args[0] 17936 y := v_0.Args[1] 17937 v.reset(OpLeq16) 17938 v.AddArg(x) 17939 v.AddArg(y) 17940 return true 17941 } 17942 // match: (Not (Greater8 x y)) 17943 // cond: 17944 // result: (Leq8 x y) 17945 for { 17946 v_0 := v.Args[0] 17947 if v_0.Op != OpGreater8 { 17948 break 17949 } 17950 _ = v_0.Args[1] 17951 x := v_0.Args[0] 17952 y := v_0.Args[1] 17953 v.reset(OpLeq8) 17954 v.AddArg(x) 17955 v.AddArg(y) 17956 return true 17957 } 17958 // match: (Not (Greater64U x y)) 17959 // cond: 17960 // result: (Leq64U x y) 17961 for { 17962 v_0 := v.Args[0] 17963 if v_0.Op != OpGreater64U { 17964 break 17965 } 17966 _ = v_0.Args[1] 17967 x := v_0.Args[0] 17968 y := v_0.Args[1] 17969 v.reset(OpLeq64U) 17970 v.AddArg(x) 17971 v.AddArg(y) 17972 return true 17973 } 17974 // match: (Not (Greater32U x y)) 17975 // cond: 17976 // result: (Leq32U x y) 17977 for { 17978 v_0 := v.Args[0] 17979 if v_0.Op != OpGreater32U { 17980 break 17981 } 17982 _ = v_0.Args[1] 17983 x := v_0.Args[0] 17984 y := v_0.Args[1] 17985 v.reset(OpLeq32U) 17986 v.AddArg(x) 17987 v.AddArg(y) 17988 return true 17989 } 17990 // match: (Not (Greater16U x y)) 17991 // cond: 17992 // result: (Leq16U x y) 17993 for { 17994 v_0 := v.Args[0] 17995 if v_0.Op != OpGreater16U { 17996 break 17997 } 17998 _ = v_0.Args[1] 17999 x := v_0.Args[0] 18000 y := v_0.Args[1] 18001 v.reset(OpLeq16U) 18002 v.AddArg(x) 18003 v.AddArg(y) 18004 return true 18005 } 18006 // match: (Not (Greater8U x y)) 18007 // cond: 18008 // result: (Leq8U x y) 18009 for { 18010 v_0 := v.Args[0] 18011 if v_0.Op != OpGreater8U { 18012 break 18013 } 18014 _ = v_0.Args[1] 18015 x := v_0.Args[0] 18016 y := v_0.Args[1] 18017 v.reset(OpLeq8U) 18018 v.AddArg(x) 18019 v.AddArg(y) 18020 return true 18021 } 18022 // match: (Not (Geq64 x y)) 18023 // cond: 18024 // result: (Less64 x y) 18025 for { 18026 v_0 := v.Args[0] 18027 if v_0.Op != OpGeq64 { 18028 break 18029 } 18030 _ = v_0.Args[1] 18031 x := v_0.Args[0] 18032 y := v_0.Args[1] 18033 v.reset(OpLess64) 18034 v.AddArg(x) 18035 v.AddArg(y) 18036 return true 18037 } 18038 return false 18039 } 18040 func rewriteValuegeneric_OpNot_20(v *Value) bool { 18041 // match: (Not (Geq32 x y)) 18042 // cond: 18043 // result: (Less32 x y) 18044 for { 18045 v_0 := v.Args[0] 18046 if v_0.Op != OpGeq32 { 18047 break 18048 } 18049 _ = v_0.Args[1] 18050 x := v_0.Args[0] 18051 y := v_0.Args[1] 18052 v.reset(OpLess32) 18053 v.AddArg(x) 18054 v.AddArg(y) 18055 return true 18056 } 18057 // match: (Not (Geq16 x y)) 18058 // cond: 18059 // result: (Less16 x y) 18060 for { 18061 v_0 := v.Args[0] 18062 if v_0.Op != OpGeq16 { 18063 break 18064 } 18065 _ = v_0.Args[1] 18066 x := v_0.Args[0] 18067 y := v_0.Args[1] 18068 v.reset(OpLess16) 18069 v.AddArg(x) 18070 v.AddArg(y) 18071 return true 18072 } 18073 // match: (Not (Geq8 x y)) 18074 // cond: 18075 // result: (Less8 x y) 18076 for { 18077 v_0 := v.Args[0] 18078 if v_0.Op != OpGeq8 { 18079 break 18080 } 18081 _ = v_0.Args[1] 18082 x := v_0.Args[0] 18083 y := v_0.Args[1] 18084 v.reset(OpLess8) 18085 v.AddArg(x) 18086 v.AddArg(y) 18087 return true 18088 } 18089 // match: (Not (Geq64U x y)) 18090 // cond: 18091 // result: (Less64U x y) 18092 for { 18093 v_0 := v.Args[0] 18094 if v_0.Op != OpGeq64U { 18095 break 18096 } 18097 _ = v_0.Args[1] 18098 x := v_0.Args[0] 18099 y := v_0.Args[1] 18100 v.reset(OpLess64U) 18101 v.AddArg(x) 18102 v.AddArg(y) 18103 return true 18104 } 18105 // match: (Not (Geq32U x y)) 18106 // cond: 18107 // result: (Less32U x y) 18108 for { 18109 v_0 := v.Args[0] 18110 if v_0.Op != OpGeq32U { 18111 break 18112 } 18113 _ = v_0.Args[1] 18114 x := v_0.Args[0] 18115 y := v_0.Args[1] 18116 v.reset(OpLess32U) 18117 v.AddArg(x) 18118 v.AddArg(y) 18119 return true 18120 } 18121 // match: (Not (Geq16U x y)) 18122 // cond: 18123 // result: (Less16U x y) 18124 for { 18125 v_0 := v.Args[0] 18126 if v_0.Op != OpGeq16U { 18127 break 18128 } 18129 _ = v_0.Args[1] 18130 x := v_0.Args[0] 18131 y := v_0.Args[1] 18132 v.reset(OpLess16U) 18133 v.AddArg(x) 18134 v.AddArg(y) 18135 return true 18136 } 18137 // match: (Not (Geq8U x y)) 18138 // cond: 18139 // result: (Less8U x y) 18140 for { 18141 v_0 := v.Args[0] 18142 if v_0.Op != OpGeq8U { 18143 break 18144 } 18145 _ = v_0.Args[1] 18146 x := v_0.Args[0] 18147 y := v_0.Args[1] 18148 v.reset(OpLess8U) 18149 v.AddArg(x) 18150 v.AddArg(y) 18151 return true 18152 } 18153 // match: (Not (Less64 x y)) 18154 // cond: 18155 // result: (Geq64 x y) 18156 for { 18157 v_0 := v.Args[0] 18158 if v_0.Op != OpLess64 { 18159 break 18160 } 18161 _ = v_0.Args[1] 18162 x := v_0.Args[0] 18163 y := v_0.Args[1] 18164 v.reset(OpGeq64) 18165 v.AddArg(x) 18166 v.AddArg(y) 18167 return true 18168 } 18169 // match: (Not (Less32 x y)) 18170 // cond: 18171 // result: (Geq32 x y) 18172 for { 18173 v_0 := v.Args[0] 18174 if v_0.Op != OpLess32 { 18175 break 18176 } 18177 _ = v_0.Args[1] 18178 x := v_0.Args[0] 18179 y := v_0.Args[1] 18180 v.reset(OpGeq32) 18181 v.AddArg(x) 18182 v.AddArg(y) 18183 return true 18184 } 18185 // match: (Not (Less16 x y)) 18186 // cond: 18187 // result: (Geq16 x y) 18188 for { 18189 v_0 := v.Args[0] 18190 if v_0.Op != OpLess16 { 18191 break 18192 } 18193 _ = v_0.Args[1] 18194 x := v_0.Args[0] 18195 y := v_0.Args[1] 18196 v.reset(OpGeq16) 18197 v.AddArg(x) 18198 v.AddArg(y) 18199 return true 18200 } 18201 return false 18202 } 18203 func rewriteValuegeneric_OpNot_30(v *Value) bool { 18204 // match: (Not (Less8 x y)) 18205 // cond: 18206 // result: (Geq8 x y) 18207 for { 18208 v_0 := v.Args[0] 18209 if v_0.Op != OpLess8 { 18210 break 18211 } 18212 _ = v_0.Args[1] 18213 x := v_0.Args[0] 18214 y := v_0.Args[1] 18215 v.reset(OpGeq8) 18216 v.AddArg(x) 18217 v.AddArg(y) 18218 return true 18219 } 18220 // match: (Not (Less64U x y)) 18221 // cond: 18222 // result: (Geq64U x y) 18223 for { 18224 v_0 := v.Args[0] 18225 if v_0.Op != OpLess64U { 18226 break 18227 } 18228 _ = v_0.Args[1] 18229 x := v_0.Args[0] 18230 y := v_0.Args[1] 18231 v.reset(OpGeq64U) 18232 v.AddArg(x) 18233 v.AddArg(y) 18234 return true 18235 } 18236 // match: (Not (Less32U x y)) 18237 // cond: 18238 // result: (Geq32U x y) 18239 for { 18240 v_0 := v.Args[0] 18241 if v_0.Op != OpLess32U { 18242 break 18243 } 18244 _ = v_0.Args[1] 18245 x := v_0.Args[0] 18246 y := v_0.Args[1] 18247 v.reset(OpGeq32U) 18248 v.AddArg(x) 18249 v.AddArg(y) 18250 return true 18251 } 18252 // match: (Not (Less16U x y)) 18253 // cond: 18254 // result: (Geq16U x y) 18255 for { 18256 v_0 := v.Args[0] 18257 if v_0.Op != OpLess16U { 18258 break 18259 } 18260 _ = v_0.Args[1] 18261 x := v_0.Args[0] 18262 y := v_0.Args[1] 18263 v.reset(OpGeq16U) 18264 v.AddArg(x) 18265 v.AddArg(y) 18266 return true 18267 } 18268 // match: (Not (Less8U x y)) 18269 // cond: 18270 // result: (Geq8U x y) 18271 for { 18272 v_0 := v.Args[0] 18273 if v_0.Op != OpLess8U { 18274 break 18275 } 18276 _ = v_0.Args[1] 18277 x := v_0.Args[0] 18278 y := v_0.Args[1] 18279 v.reset(OpGeq8U) 18280 v.AddArg(x) 18281 v.AddArg(y) 18282 return true 18283 } 18284 // match: (Not (Leq64 x y)) 18285 // cond: 18286 // result: (Greater64 x y) 18287 for { 18288 v_0 := v.Args[0] 18289 if v_0.Op != OpLeq64 { 18290 break 18291 } 18292 _ = v_0.Args[1] 18293 x := v_0.Args[0] 18294 y := v_0.Args[1] 18295 v.reset(OpGreater64) 18296 v.AddArg(x) 18297 v.AddArg(y) 18298 return true 18299 } 18300 // match: (Not (Leq32 x y)) 18301 // cond: 18302 // result: (Greater32 x y) 18303 for { 18304 v_0 := v.Args[0] 18305 if v_0.Op != OpLeq32 { 18306 break 18307 } 18308 _ = v_0.Args[1] 18309 x := v_0.Args[0] 18310 y := v_0.Args[1] 18311 v.reset(OpGreater32) 18312 v.AddArg(x) 18313 v.AddArg(y) 18314 return true 18315 } 18316 // match: (Not (Leq16 x y)) 18317 // cond: 18318 // result: (Greater16 x y) 18319 for { 18320 v_0 := v.Args[0] 18321 if v_0.Op != OpLeq16 { 18322 break 18323 } 18324 _ = v_0.Args[1] 18325 x := v_0.Args[0] 18326 y := v_0.Args[1] 18327 v.reset(OpGreater16) 18328 v.AddArg(x) 18329 v.AddArg(y) 18330 return true 18331 } 18332 // match: (Not (Leq8 x y)) 18333 // cond: 18334 // result: (Greater8 x y) 18335 for { 18336 v_0 := v.Args[0] 18337 if v_0.Op != OpLeq8 { 18338 break 18339 } 18340 _ = v_0.Args[1] 18341 x := v_0.Args[0] 18342 y := v_0.Args[1] 18343 v.reset(OpGreater8) 18344 v.AddArg(x) 18345 v.AddArg(y) 18346 return true 18347 } 18348 // match: (Not (Leq64U x y)) 18349 // cond: 18350 // result: (Greater64U x y) 18351 for { 18352 v_0 := v.Args[0] 18353 if v_0.Op != OpLeq64U { 18354 break 18355 } 18356 _ = v_0.Args[1] 18357 x := v_0.Args[0] 18358 y := v_0.Args[1] 18359 v.reset(OpGreater64U) 18360 v.AddArg(x) 18361 v.AddArg(y) 18362 return true 18363 } 18364 return false 18365 } 18366 func rewriteValuegeneric_OpNot_40(v *Value) bool { 18367 // match: (Not (Leq32U x y)) 18368 // cond: 18369 // result: (Greater32U x y) 18370 for { 18371 v_0 := v.Args[0] 18372 if v_0.Op != OpLeq32U { 18373 break 18374 } 18375 _ = v_0.Args[1] 18376 x := v_0.Args[0] 18377 y := v_0.Args[1] 18378 v.reset(OpGreater32U) 18379 v.AddArg(x) 18380 v.AddArg(y) 18381 return true 18382 } 18383 // match: (Not (Leq16U x y)) 18384 // cond: 18385 // result: (Greater16U x y) 18386 for { 18387 v_0 := v.Args[0] 18388 if v_0.Op != OpLeq16U { 18389 break 18390 } 18391 _ = v_0.Args[1] 18392 x := v_0.Args[0] 18393 y := v_0.Args[1] 18394 v.reset(OpGreater16U) 18395 v.AddArg(x) 18396 v.AddArg(y) 18397 return true 18398 } 18399 // match: (Not (Leq8U x y)) 18400 // cond: 18401 // result: (Greater8U x y) 18402 for { 18403 v_0 := v.Args[0] 18404 if v_0.Op != OpLeq8U { 18405 break 18406 } 18407 _ = v_0.Args[1] 18408 x := v_0.Args[0] 18409 y := v_0.Args[1] 18410 v.reset(OpGreater8U) 18411 v.AddArg(x) 18412 v.AddArg(y) 18413 return true 18414 } 18415 return false 18416 } 18417 func rewriteValuegeneric_OpOffPtr_0(v *Value) bool { 18418 // match: (OffPtr (OffPtr p [b]) [a]) 18419 // cond: 18420 // result: (OffPtr p [a+b]) 18421 for { 18422 a := v.AuxInt 18423 v_0 := v.Args[0] 18424 if v_0.Op != OpOffPtr { 18425 break 18426 } 18427 b := v_0.AuxInt 18428 p := v_0.Args[0] 18429 v.reset(OpOffPtr) 18430 v.AuxInt = a + b 18431 v.AddArg(p) 18432 return true 18433 } 18434 // match: (OffPtr p [0]) 18435 // cond: v.Type.Compare(p.Type) == types.CMPeq 18436 // result: p 18437 for { 18438 if v.AuxInt != 0 { 18439 break 18440 } 18441 p := v.Args[0] 18442 if !(v.Type.Compare(p.Type) == types.CMPeq) { 18443 break 18444 } 18445 v.reset(OpCopy) 18446 v.Type = p.Type 18447 v.AddArg(p) 18448 return true 18449 } 18450 return false 18451 } 18452 func rewriteValuegeneric_OpOr16_0(v *Value) bool { 18453 // match: (Or16 (Const16 [c]) (Const16 [d])) 18454 // cond: 18455 // result: (Const16 [int64(int16(c|d))]) 18456 for { 18457 _ = v.Args[1] 18458 v_0 := v.Args[0] 18459 if v_0.Op != OpConst16 { 18460 break 18461 } 18462 c := v_0.AuxInt 18463 v_1 := v.Args[1] 18464 if v_1.Op != OpConst16 { 18465 break 18466 } 18467 d := v_1.AuxInt 18468 v.reset(OpConst16) 18469 v.AuxInt = int64(int16(c | d)) 18470 return true 18471 } 18472 // match: (Or16 (Const16 [d]) (Const16 [c])) 18473 // cond: 18474 // result: (Const16 [int64(int16(c|d))]) 18475 for { 18476 _ = v.Args[1] 18477 v_0 := v.Args[0] 18478 if v_0.Op != OpConst16 { 18479 break 18480 } 18481 d := v_0.AuxInt 18482 v_1 := v.Args[1] 18483 if v_1.Op != OpConst16 { 18484 break 18485 } 18486 c := v_1.AuxInt 18487 v.reset(OpConst16) 18488 v.AuxInt = int64(int16(c | d)) 18489 return true 18490 } 18491 // match: (Or16 x x) 18492 // cond: 18493 // result: x 18494 for { 18495 _ = v.Args[1] 18496 x := v.Args[0] 18497 if x != v.Args[1] { 18498 break 18499 } 18500 v.reset(OpCopy) 18501 v.Type = x.Type 18502 v.AddArg(x) 18503 return true 18504 } 18505 // match: (Or16 (Const16 [0]) x) 18506 // cond: 18507 // result: x 18508 for { 18509 _ = v.Args[1] 18510 v_0 := v.Args[0] 18511 if v_0.Op != OpConst16 { 18512 break 18513 } 18514 if v_0.AuxInt != 0 { 18515 break 18516 } 18517 x := v.Args[1] 18518 v.reset(OpCopy) 18519 v.Type = x.Type 18520 v.AddArg(x) 18521 return true 18522 } 18523 // match: (Or16 x (Const16 [0])) 18524 // cond: 18525 // result: x 18526 for { 18527 _ = v.Args[1] 18528 x := v.Args[0] 18529 v_1 := v.Args[1] 18530 if v_1.Op != OpConst16 { 18531 break 18532 } 18533 if v_1.AuxInt != 0 { 18534 break 18535 } 18536 v.reset(OpCopy) 18537 v.Type = x.Type 18538 v.AddArg(x) 18539 return true 18540 } 18541 // match: (Or16 (Const16 [-1]) _) 18542 // cond: 18543 // result: (Const16 [-1]) 18544 for { 18545 _ = v.Args[1] 18546 v_0 := v.Args[0] 18547 if v_0.Op != OpConst16 { 18548 break 18549 } 18550 if v_0.AuxInt != -1 { 18551 break 18552 } 18553 v.reset(OpConst16) 18554 v.AuxInt = -1 18555 return true 18556 } 18557 // match: (Or16 _ (Const16 [-1])) 18558 // cond: 18559 // result: (Const16 [-1]) 18560 for { 18561 _ = v.Args[1] 18562 v_1 := v.Args[1] 18563 if v_1.Op != OpConst16 { 18564 break 18565 } 18566 if v_1.AuxInt != -1 { 18567 break 18568 } 18569 v.reset(OpConst16) 18570 v.AuxInt = -1 18571 return true 18572 } 18573 // match: (Or16 x (Or16 x y)) 18574 // cond: 18575 // result: (Or16 x y) 18576 for { 18577 _ = v.Args[1] 18578 x := v.Args[0] 18579 v_1 := v.Args[1] 18580 if v_1.Op != OpOr16 { 18581 break 18582 } 18583 _ = v_1.Args[1] 18584 if x != v_1.Args[0] { 18585 break 18586 } 18587 y := v_1.Args[1] 18588 v.reset(OpOr16) 18589 v.AddArg(x) 18590 v.AddArg(y) 18591 return true 18592 } 18593 // match: (Or16 x (Or16 y x)) 18594 // cond: 18595 // result: (Or16 x y) 18596 for { 18597 _ = v.Args[1] 18598 x := v.Args[0] 18599 v_1 := v.Args[1] 18600 if v_1.Op != OpOr16 { 18601 break 18602 } 18603 _ = v_1.Args[1] 18604 y := v_1.Args[0] 18605 if x != v_1.Args[1] { 18606 break 18607 } 18608 v.reset(OpOr16) 18609 v.AddArg(x) 18610 v.AddArg(y) 18611 return true 18612 } 18613 // match: (Or16 (Or16 x y) x) 18614 // cond: 18615 // result: (Or16 x y) 18616 for { 18617 _ = v.Args[1] 18618 v_0 := v.Args[0] 18619 if v_0.Op != OpOr16 { 18620 break 18621 } 18622 _ = v_0.Args[1] 18623 x := v_0.Args[0] 18624 y := v_0.Args[1] 18625 if x != v.Args[1] { 18626 break 18627 } 18628 v.reset(OpOr16) 18629 v.AddArg(x) 18630 v.AddArg(y) 18631 return true 18632 } 18633 return false 18634 } 18635 func rewriteValuegeneric_OpOr16_10(v *Value) bool { 18636 b := v.Block 18637 _ = b 18638 // match: (Or16 (Or16 y x) x) 18639 // cond: 18640 // result: (Or16 x y) 18641 for { 18642 _ = v.Args[1] 18643 v_0 := v.Args[0] 18644 if v_0.Op != OpOr16 { 18645 break 18646 } 18647 _ = v_0.Args[1] 18648 y := v_0.Args[0] 18649 x := v_0.Args[1] 18650 if x != v.Args[1] { 18651 break 18652 } 18653 v.reset(OpOr16) 18654 v.AddArg(x) 18655 v.AddArg(y) 18656 return true 18657 } 18658 // match: (Or16 (And16 x (Const16 [c2])) (Const16 <t> [c1])) 18659 // cond: ^(c1 | c2) == 0 18660 // result: (Or16 (Const16 <t> [c1]) x) 18661 for { 18662 _ = v.Args[1] 18663 v_0 := v.Args[0] 18664 if v_0.Op != OpAnd16 { 18665 break 18666 } 18667 _ = v_0.Args[1] 18668 x := v_0.Args[0] 18669 v_0_1 := v_0.Args[1] 18670 if v_0_1.Op != OpConst16 { 18671 break 18672 } 18673 c2 := v_0_1.AuxInt 18674 v_1 := v.Args[1] 18675 if v_1.Op != OpConst16 { 18676 break 18677 } 18678 t := v_1.Type 18679 c1 := v_1.AuxInt 18680 if !(^(c1 | c2) == 0) { 18681 break 18682 } 18683 v.reset(OpOr16) 18684 v0 := b.NewValue0(v.Pos, OpConst16, t) 18685 v0.AuxInt = c1 18686 v.AddArg(v0) 18687 v.AddArg(x) 18688 return true 18689 } 18690 // match: (Or16 (And16 (Const16 [c2]) x) (Const16 <t> [c1])) 18691 // cond: ^(c1 | c2) == 0 18692 // result: (Or16 (Const16 <t> [c1]) x) 18693 for { 18694 _ = v.Args[1] 18695 v_0 := v.Args[0] 18696 if v_0.Op != OpAnd16 { 18697 break 18698 } 18699 _ = v_0.Args[1] 18700 v_0_0 := v_0.Args[0] 18701 if v_0_0.Op != OpConst16 { 18702 break 18703 } 18704 c2 := v_0_0.AuxInt 18705 x := v_0.Args[1] 18706 v_1 := v.Args[1] 18707 if v_1.Op != OpConst16 { 18708 break 18709 } 18710 t := v_1.Type 18711 c1 := v_1.AuxInt 18712 if !(^(c1 | c2) == 0) { 18713 break 18714 } 18715 v.reset(OpOr16) 18716 v0 := b.NewValue0(v.Pos, OpConst16, t) 18717 v0.AuxInt = c1 18718 v.AddArg(v0) 18719 v.AddArg(x) 18720 return true 18721 } 18722 // match: (Or16 (Const16 <t> [c1]) (And16 x (Const16 [c2]))) 18723 // cond: ^(c1 | c2) == 0 18724 // result: (Or16 (Const16 <t> [c1]) x) 18725 for { 18726 _ = v.Args[1] 18727 v_0 := v.Args[0] 18728 if v_0.Op != OpConst16 { 18729 break 18730 } 18731 t := v_0.Type 18732 c1 := v_0.AuxInt 18733 v_1 := v.Args[1] 18734 if v_1.Op != OpAnd16 { 18735 break 18736 } 18737 _ = v_1.Args[1] 18738 x := v_1.Args[0] 18739 v_1_1 := v_1.Args[1] 18740 if v_1_1.Op != OpConst16 { 18741 break 18742 } 18743 c2 := v_1_1.AuxInt 18744 if !(^(c1 | c2) == 0) { 18745 break 18746 } 18747 v.reset(OpOr16) 18748 v0 := b.NewValue0(v.Pos, OpConst16, t) 18749 v0.AuxInt = c1 18750 v.AddArg(v0) 18751 v.AddArg(x) 18752 return true 18753 } 18754 // match: (Or16 (Const16 <t> [c1]) (And16 (Const16 [c2]) x)) 18755 // cond: ^(c1 | c2) == 0 18756 // result: (Or16 (Const16 <t> [c1]) x) 18757 for { 18758 _ = v.Args[1] 18759 v_0 := v.Args[0] 18760 if v_0.Op != OpConst16 { 18761 break 18762 } 18763 t := v_0.Type 18764 c1 := v_0.AuxInt 18765 v_1 := v.Args[1] 18766 if v_1.Op != OpAnd16 { 18767 break 18768 } 18769 _ = v_1.Args[1] 18770 v_1_0 := v_1.Args[0] 18771 if v_1_0.Op != OpConst16 { 18772 break 18773 } 18774 c2 := v_1_0.AuxInt 18775 x := v_1.Args[1] 18776 if !(^(c1 | c2) == 0) { 18777 break 18778 } 18779 v.reset(OpOr16) 18780 v0 := b.NewValue0(v.Pos, OpConst16, t) 18781 v0.AuxInt = c1 18782 v.AddArg(v0) 18783 v.AddArg(x) 18784 return true 18785 } 18786 // match: (Or16 (Or16 i:(Const16 <t>) z) x) 18787 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 18788 // result: (Or16 i (Or16 <t> z x)) 18789 for { 18790 _ = v.Args[1] 18791 v_0 := v.Args[0] 18792 if v_0.Op != OpOr16 { 18793 break 18794 } 18795 _ = v_0.Args[1] 18796 i := v_0.Args[0] 18797 if i.Op != OpConst16 { 18798 break 18799 } 18800 t := i.Type 18801 z := v_0.Args[1] 18802 x := v.Args[1] 18803 if !(z.Op != OpConst16 && x.Op != OpConst16) { 18804 break 18805 } 18806 v.reset(OpOr16) 18807 v.AddArg(i) 18808 v0 := b.NewValue0(v.Pos, OpOr16, t) 18809 v0.AddArg(z) 18810 v0.AddArg(x) 18811 v.AddArg(v0) 18812 return true 18813 } 18814 // match: (Or16 (Or16 z i:(Const16 <t>)) x) 18815 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 18816 // result: (Or16 i (Or16 <t> z x)) 18817 for { 18818 _ = v.Args[1] 18819 v_0 := v.Args[0] 18820 if v_0.Op != OpOr16 { 18821 break 18822 } 18823 _ = v_0.Args[1] 18824 z := v_0.Args[0] 18825 i := v_0.Args[1] 18826 if i.Op != OpConst16 { 18827 break 18828 } 18829 t := i.Type 18830 x := v.Args[1] 18831 if !(z.Op != OpConst16 && x.Op != OpConst16) { 18832 break 18833 } 18834 v.reset(OpOr16) 18835 v.AddArg(i) 18836 v0 := b.NewValue0(v.Pos, OpOr16, t) 18837 v0.AddArg(z) 18838 v0.AddArg(x) 18839 v.AddArg(v0) 18840 return true 18841 } 18842 // match: (Or16 x (Or16 i:(Const16 <t>) z)) 18843 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 18844 // result: (Or16 i (Or16 <t> z x)) 18845 for { 18846 _ = v.Args[1] 18847 x := v.Args[0] 18848 v_1 := v.Args[1] 18849 if v_1.Op != OpOr16 { 18850 break 18851 } 18852 _ = v_1.Args[1] 18853 i := v_1.Args[0] 18854 if i.Op != OpConst16 { 18855 break 18856 } 18857 t := i.Type 18858 z := v_1.Args[1] 18859 if !(z.Op != OpConst16 && x.Op != OpConst16) { 18860 break 18861 } 18862 v.reset(OpOr16) 18863 v.AddArg(i) 18864 v0 := b.NewValue0(v.Pos, OpOr16, t) 18865 v0.AddArg(z) 18866 v0.AddArg(x) 18867 v.AddArg(v0) 18868 return true 18869 } 18870 // match: (Or16 x (Or16 z i:(Const16 <t>))) 18871 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 18872 // result: (Or16 i (Or16 <t> z x)) 18873 for { 18874 _ = v.Args[1] 18875 x := v.Args[0] 18876 v_1 := v.Args[1] 18877 if v_1.Op != OpOr16 { 18878 break 18879 } 18880 _ = v_1.Args[1] 18881 z := v_1.Args[0] 18882 i := v_1.Args[1] 18883 if i.Op != OpConst16 { 18884 break 18885 } 18886 t := i.Type 18887 if !(z.Op != OpConst16 && x.Op != OpConst16) { 18888 break 18889 } 18890 v.reset(OpOr16) 18891 v.AddArg(i) 18892 v0 := b.NewValue0(v.Pos, OpOr16, t) 18893 v0.AddArg(z) 18894 v0.AddArg(x) 18895 v.AddArg(v0) 18896 return true 18897 } 18898 // match: (Or16 (Const16 <t> [c]) (Or16 (Const16 <t> [d]) x)) 18899 // cond: 18900 // result: (Or16 (Const16 <t> [int64(int16(c|d))]) x) 18901 for { 18902 _ = v.Args[1] 18903 v_0 := v.Args[0] 18904 if v_0.Op != OpConst16 { 18905 break 18906 } 18907 t := v_0.Type 18908 c := v_0.AuxInt 18909 v_1 := v.Args[1] 18910 if v_1.Op != OpOr16 { 18911 break 18912 } 18913 _ = v_1.Args[1] 18914 v_1_0 := v_1.Args[0] 18915 if v_1_0.Op != OpConst16 { 18916 break 18917 } 18918 if v_1_0.Type != t { 18919 break 18920 } 18921 d := v_1_0.AuxInt 18922 x := v_1.Args[1] 18923 v.reset(OpOr16) 18924 v0 := b.NewValue0(v.Pos, OpConst16, t) 18925 v0.AuxInt = int64(int16(c | d)) 18926 v.AddArg(v0) 18927 v.AddArg(x) 18928 return true 18929 } 18930 return false 18931 } 18932 func rewriteValuegeneric_OpOr16_20(v *Value) bool { 18933 b := v.Block 18934 _ = b 18935 // match: (Or16 (Const16 <t> [c]) (Or16 x (Const16 <t> [d]))) 18936 // cond: 18937 // result: (Or16 (Const16 <t> [int64(int16(c|d))]) x) 18938 for { 18939 _ = v.Args[1] 18940 v_0 := v.Args[0] 18941 if v_0.Op != OpConst16 { 18942 break 18943 } 18944 t := v_0.Type 18945 c := v_0.AuxInt 18946 v_1 := v.Args[1] 18947 if v_1.Op != OpOr16 { 18948 break 18949 } 18950 _ = v_1.Args[1] 18951 x := v_1.Args[0] 18952 v_1_1 := v_1.Args[1] 18953 if v_1_1.Op != OpConst16 { 18954 break 18955 } 18956 if v_1_1.Type != t { 18957 break 18958 } 18959 d := v_1_1.AuxInt 18960 v.reset(OpOr16) 18961 v0 := b.NewValue0(v.Pos, OpConst16, t) 18962 v0.AuxInt = int64(int16(c | d)) 18963 v.AddArg(v0) 18964 v.AddArg(x) 18965 return true 18966 } 18967 // match: (Or16 (Or16 (Const16 <t> [d]) x) (Const16 <t> [c])) 18968 // cond: 18969 // result: (Or16 (Const16 <t> [int64(int16(c|d))]) x) 18970 for { 18971 _ = v.Args[1] 18972 v_0 := v.Args[0] 18973 if v_0.Op != OpOr16 { 18974 break 18975 } 18976 _ = v_0.Args[1] 18977 v_0_0 := v_0.Args[0] 18978 if v_0_0.Op != OpConst16 { 18979 break 18980 } 18981 t := v_0_0.Type 18982 d := v_0_0.AuxInt 18983 x := v_0.Args[1] 18984 v_1 := v.Args[1] 18985 if v_1.Op != OpConst16 { 18986 break 18987 } 18988 if v_1.Type != t { 18989 break 18990 } 18991 c := v_1.AuxInt 18992 v.reset(OpOr16) 18993 v0 := b.NewValue0(v.Pos, OpConst16, t) 18994 v0.AuxInt = int64(int16(c | d)) 18995 v.AddArg(v0) 18996 v.AddArg(x) 18997 return true 18998 } 18999 // match: (Or16 (Or16 x (Const16 <t> [d])) (Const16 <t> [c])) 19000 // cond: 19001 // result: (Or16 (Const16 <t> [int64(int16(c|d))]) x) 19002 for { 19003 _ = v.Args[1] 19004 v_0 := v.Args[0] 19005 if v_0.Op != OpOr16 { 19006 break 19007 } 19008 _ = v_0.Args[1] 19009 x := v_0.Args[0] 19010 v_0_1 := v_0.Args[1] 19011 if v_0_1.Op != OpConst16 { 19012 break 19013 } 19014 t := v_0_1.Type 19015 d := v_0_1.AuxInt 19016 v_1 := v.Args[1] 19017 if v_1.Op != OpConst16 { 19018 break 19019 } 19020 if v_1.Type != t { 19021 break 19022 } 19023 c := v_1.AuxInt 19024 v.reset(OpOr16) 19025 v0 := b.NewValue0(v.Pos, OpConst16, t) 19026 v0.AuxInt = int64(int16(c | d)) 19027 v.AddArg(v0) 19028 v.AddArg(x) 19029 return true 19030 } 19031 return false 19032 } 19033 func rewriteValuegeneric_OpOr32_0(v *Value) bool { 19034 // match: (Or32 (Const32 [c]) (Const32 [d])) 19035 // cond: 19036 // result: (Const32 [int64(int32(c|d))]) 19037 for { 19038 _ = v.Args[1] 19039 v_0 := v.Args[0] 19040 if v_0.Op != OpConst32 { 19041 break 19042 } 19043 c := v_0.AuxInt 19044 v_1 := v.Args[1] 19045 if v_1.Op != OpConst32 { 19046 break 19047 } 19048 d := v_1.AuxInt 19049 v.reset(OpConst32) 19050 v.AuxInt = int64(int32(c | d)) 19051 return true 19052 } 19053 // match: (Or32 (Const32 [d]) (Const32 [c])) 19054 // cond: 19055 // result: (Const32 [int64(int32(c|d))]) 19056 for { 19057 _ = v.Args[1] 19058 v_0 := v.Args[0] 19059 if v_0.Op != OpConst32 { 19060 break 19061 } 19062 d := v_0.AuxInt 19063 v_1 := v.Args[1] 19064 if v_1.Op != OpConst32 { 19065 break 19066 } 19067 c := v_1.AuxInt 19068 v.reset(OpConst32) 19069 v.AuxInt = int64(int32(c | d)) 19070 return true 19071 } 19072 // match: (Or32 x x) 19073 // cond: 19074 // result: x 19075 for { 19076 _ = v.Args[1] 19077 x := v.Args[0] 19078 if x != v.Args[1] { 19079 break 19080 } 19081 v.reset(OpCopy) 19082 v.Type = x.Type 19083 v.AddArg(x) 19084 return true 19085 } 19086 // match: (Or32 (Const32 [0]) x) 19087 // cond: 19088 // result: x 19089 for { 19090 _ = v.Args[1] 19091 v_0 := v.Args[0] 19092 if v_0.Op != OpConst32 { 19093 break 19094 } 19095 if v_0.AuxInt != 0 { 19096 break 19097 } 19098 x := v.Args[1] 19099 v.reset(OpCopy) 19100 v.Type = x.Type 19101 v.AddArg(x) 19102 return true 19103 } 19104 // match: (Or32 x (Const32 [0])) 19105 // cond: 19106 // result: x 19107 for { 19108 _ = v.Args[1] 19109 x := v.Args[0] 19110 v_1 := v.Args[1] 19111 if v_1.Op != OpConst32 { 19112 break 19113 } 19114 if v_1.AuxInt != 0 { 19115 break 19116 } 19117 v.reset(OpCopy) 19118 v.Type = x.Type 19119 v.AddArg(x) 19120 return true 19121 } 19122 // match: (Or32 (Const32 [-1]) _) 19123 // cond: 19124 // result: (Const32 [-1]) 19125 for { 19126 _ = v.Args[1] 19127 v_0 := v.Args[0] 19128 if v_0.Op != OpConst32 { 19129 break 19130 } 19131 if v_0.AuxInt != -1 { 19132 break 19133 } 19134 v.reset(OpConst32) 19135 v.AuxInt = -1 19136 return true 19137 } 19138 // match: (Or32 _ (Const32 [-1])) 19139 // cond: 19140 // result: (Const32 [-1]) 19141 for { 19142 _ = v.Args[1] 19143 v_1 := v.Args[1] 19144 if v_1.Op != OpConst32 { 19145 break 19146 } 19147 if v_1.AuxInt != -1 { 19148 break 19149 } 19150 v.reset(OpConst32) 19151 v.AuxInt = -1 19152 return true 19153 } 19154 // match: (Or32 x (Or32 x y)) 19155 // cond: 19156 // result: (Or32 x y) 19157 for { 19158 _ = v.Args[1] 19159 x := v.Args[0] 19160 v_1 := v.Args[1] 19161 if v_1.Op != OpOr32 { 19162 break 19163 } 19164 _ = v_1.Args[1] 19165 if x != v_1.Args[0] { 19166 break 19167 } 19168 y := v_1.Args[1] 19169 v.reset(OpOr32) 19170 v.AddArg(x) 19171 v.AddArg(y) 19172 return true 19173 } 19174 // match: (Or32 x (Or32 y x)) 19175 // cond: 19176 // result: (Or32 x y) 19177 for { 19178 _ = v.Args[1] 19179 x := v.Args[0] 19180 v_1 := v.Args[1] 19181 if v_1.Op != OpOr32 { 19182 break 19183 } 19184 _ = v_1.Args[1] 19185 y := v_1.Args[0] 19186 if x != v_1.Args[1] { 19187 break 19188 } 19189 v.reset(OpOr32) 19190 v.AddArg(x) 19191 v.AddArg(y) 19192 return true 19193 } 19194 // match: (Or32 (Or32 x y) x) 19195 // cond: 19196 // result: (Or32 x y) 19197 for { 19198 _ = v.Args[1] 19199 v_0 := v.Args[0] 19200 if v_0.Op != OpOr32 { 19201 break 19202 } 19203 _ = v_0.Args[1] 19204 x := v_0.Args[0] 19205 y := v_0.Args[1] 19206 if x != v.Args[1] { 19207 break 19208 } 19209 v.reset(OpOr32) 19210 v.AddArg(x) 19211 v.AddArg(y) 19212 return true 19213 } 19214 return false 19215 } 19216 func rewriteValuegeneric_OpOr32_10(v *Value) bool { 19217 b := v.Block 19218 _ = b 19219 // match: (Or32 (Or32 y x) x) 19220 // cond: 19221 // result: (Or32 x y) 19222 for { 19223 _ = v.Args[1] 19224 v_0 := v.Args[0] 19225 if v_0.Op != OpOr32 { 19226 break 19227 } 19228 _ = v_0.Args[1] 19229 y := v_0.Args[0] 19230 x := v_0.Args[1] 19231 if x != v.Args[1] { 19232 break 19233 } 19234 v.reset(OpOr32) 19235 v.AddArg(x) 19236 v.AddArg(y) 19237 return true 19238 } 19239 // match: (Or32 (And32 x (Const32 [c2])) (Const32 <t> [c1])) 19240 // cond: ^(c1 | c2) == 0 19241 // result: (Or32 (Const32 <t> [c1]) x) 19242 for { 19243 _ = v.Args[1] 19244 v_0 := v.Args[0] 19245 if v_0.Op != OpAnd32 { 19246 break 19247 } 19248 _ = v_0.Args[1] 19249 x := v_0.Args[0] 19250 v_0_1 := v_0.Args[1] 19251 if v_0_1.Op != OpConst32 { 19252 break 19253 } 19254 c2 := v_0_1.AuxInt 19255 v_1 := v.Args[1] 19256 if v_1.Op != OpConst32 { 19257 break 19258 } 19259 t := v_1.Type 19260 c1 := v_1.AuxInt 19261 if !(^(c1 | c2) == 0) { 19262 break 19263 } 19264 v.reset(OpOr32) 19265 v0 := b.NewValue0(v.Pos, OpConst32, t) 19266 v0.AuxInt = c1 19267 v.AddArg(v0) 19268 v.AddArg(x) 19269 return true 19270 } 19271 // match: (Or32 (And32 (Const32 [c2]) x) (Const32 <t> [c1])) 19272 // cond: ^(c1 | c2) == 0 19273 // result: (Or32 (Const32 <t> [c1]) x) 19274 for { 19275 _ = v.Args[1] 19276 v_0 := v.Args[0] 19277 if v_0.Op != OpAnd32 { 19278 break 19279 } 19280 _ = v_0.Args[1] 19281 v_0_0 := v_0.Args[0] 19282 if v_0_0.Op != OpConst32 { 19283 break 19284 } 19285 c2 := v_0_0.AuxInt 19286 x := v_0.Args[1] 19287 v_1 := v.Args[1] 19288 if v_1.Op != OpConst32 { 19289 break 19290 } 19291 t := v_1.Type 19292 c1 := v_1.AuxInt 19293 if !(^(c1 | c2) == 0) { 19294 break 19295 } 19296 v.reset(OpOr32) 19297 v0 := b.NewValue0(v.Pos, OpConst32, t) 19298 v0.AuxInt = c1 19299 v.AddArg(v0) 19300 v.AddArg(x) 19301 return true 19302 } 19303 // match: (Or32 (Const32 <t> [c1]) (And32 x (Const32 [c2]))) 19304 // cond: ^(c1 | c2) == 0 19305 // result: (Or32 (Const32 <t> [c1]) x) 19306 for { 19307 _ = v.Args[1] 19308 v_0 := v.Args[0] 19309 if v_0.Op != OpConst32 { 19310 break 19311 } 19312 t := v_0.Type 19313 c1 := v_0.AuxInt 19314 v_1 := v.Args[1] 19315 if v_1.Op != OpAnd32 { 19316 break 19317 } 19318 _ = v_1.Args[1] 19319 x := v_1.Args[0] 19320 v_1_1 := v_1.Args[1] 19321 if v_1_1.Op != OpConst32 { 19322 break 19323 } 19324 c2 := v_1_1.AuxInt 19325 if !(^(c1 | c2) == 0) { 19326 break 19327 } 19328 v.reset(OpOr32) 19329 v0 := b.NewValue0(v.Pos, OpConst32, t) 19330 v0.AuxInt = c1 19331 v.AddArg(v0) 19332 v.AddArg(x) 19333 return true 19334 } 19335 // match: (Or32 (Const32 <t> [c1]) (And32 (Const32 [c2]) x)) 19336 // cond: ^(c1 | c2) == 0 19337 // result: (Or32 (Const32 <t> [c1]) x) 19338 for { 19339 _ = v.Args[1] 19340 v_0 := v.Args[0] 19341 if v_0.Op != OpConst32 { 19342 break 19343 } 19344 t := v_0.Type 19345 c1 := v_0.AuxInt 19346 v_1 := v.Args[1] 19347 if v_1.Op != OpAnd32 { 19348 break 19349 } 19350 _ = v_1.Args[1] 19351 v_1_0 := v_1.Args[0] 19352 if v_1_0.Op != OpConst32 { 19353 break 19354 } 19355 c2 := v_1_0.AuxInt 19356 x := v_1.Args[1] 19357 if !(^(c1 | c2) == 0) { 19358 break 19359 } 19360 v.reset(OpOr32) 19361 v0 := b.NewValue0(v.Pos, OpConst32, t) 19362 v0.AuxInt = c1 19363 v.AddArg(v0) 19364 v.AddArg(x) 19365 return true 19366 } 19367 // match: (Or32 (Or32 i:(Const32 <t>) z) x) 19368 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 19369 // result: (Or32 i (Or32 <t> z x)) 19370 for { 19371 _ = v.Args[1] 19372 v_0 := v.Args[0] 19373 if v_0.Op != OpOr32 { 19374 break 19375 } 19376 _ = v_0.Args[1] 19377 i := v_0.Args[0] 19378 if i.Op != OpConst32 { 19379 break 19380 } 19381 t := i.Type 19382 z := v_0.Args[1] 19383 x := v.Args[1] 19384 if !(z.Op != OpConst32 && x.Op != OpConst32) { 19385 break 19386 } 19387 v.reset(OpOr32) 19388 v.AddArg(i) 19389 v0 := b.NewValue0(v.Pos, OpOr32, t) 19390 v0.AddArg(z) 19391 v0.AddArg(x) 19392 v.AddArg(v0) 19393 return true 19394 } 19395 // match: (Or32 (Or32 z i:(Const32 <t>)) x) 19396 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 19397 // result: (Or32 i (Or32 <t> z x)) 19398 for { 19399 _ = v.Args[1] 19400 v_0 := v.Args[0] 19401 if v_0.Op != OpOr32 { 19402 break 19403 } 19404 _ = v_0.Args[1] 19405 z := v_0.Args[0] 19406 i := v_0.Args[1] 19407 if i.Op != OpConst32 { 19408 break 19409 } 19410 t := i.Type 19411 x := v.Args[1] 19412 if !(z.Op != OpConst32 && x.Op != OpConst32) { 19413 break 19414 } 19415 v.reset(OpOr32) 19416 v.AddArg(i) 19417 v0 := b.NewValue0(v.Pos, OpOr32, t) 19418 v0.AddArg(z) 19419 v0.AddArg(x) 19420 v.AddArg(v0) 19421 return true 19422 } 19423 // match: (Or32 x (Or32 i:(Const32 <t>) z)) 19424 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 19425 // result: (Or32 i (Or32 <t> z x)) 19426 for { 19427 _ = v.Args[1] 19428 x := v.Args[0] 19429 v_1 := v.Args[1] 19430 if v_1.Op != OpOr32 { 19431 break 19432 } 19433 _ = v_1.Args[1] 19434 i := v_1.Args[0] 19435 if i.Op != OpConst32 { 19436 break 19437 } 19438 t := i.Type 19439 z := v_1.Args[1] 19440 if !(z.Op != OpConst32 && x.Op != OpConst32) { 19441 break 19442 } 19443 v.reset(OpOr32) 19444 v.AddArg(i) 19445 v0 := b.NewValue0(v.Pos, OpOr32, t) 19446 v0.AddArg(z) 19447 v0.AddArg(x) 19448 v.AddArg(v0) 19449 return true 19450 } 19451 // match: (Or32 x (Or32 z i:(Const32 <t>))) 19452 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 19453 // result: (Or32 i (Or32 <t> z x)) 19454 for { 19455 _ = v.Args[1] 19456 x := v.Args[0] 19457 v_1 := v.Args[1] 19458 if v_1.Op != OpOr32 { 19459 break 19460 } 19461 _ = v_1.Args[1] 19462 z := v_1.Args[0] 19463 i := v_1.Args[1] 19464 if i.Op != OpConst32 { 19465 break 19466 } 19467 t := i.Type 19468 if !(z.Op != OpConst32 && x.Op != OpConst32) { 19469 break 19470 } 19471 v.reset(OpOr32) 19472 v.AddArg(i) 19473 v0 := b.NewValue0(v.Pos, OpOr32, t) 19474 v0.AddArg(z) 19475 v0.AddArg(x) 19476 v.AddArg(v0) 19477 return true 19478 } 19479 // match: (Or32 (Const32 <t> [c]) (Or32 (Const32 <t> [d]) x)) 19480 // cond: 19481 // result: (Or32 (Const32 <t> [int64(int32(c|d))]) x) 19482 for { 19483 _ = v.Args[1] 19484 v_0 := v.Args[0] 19485 if v_0.Op != OpConst32 { 19486 break 19487 } 19488 t := v_0.Type 19489 c := v_0.AuxInt 19490 v_1 := v.Args[1] 19491 if v_1.Op != OpOr32 { 19492 break 19493 } 19494 _ = v_1.Args[1] 19495 v_1_0 := v_1.Args[0] 19496 if v_1_0.Op != OpConst32 { 19497 break 19498 } 19499 if v_1_0.Type != t { 19500 break 19501 } 19502 d := v_1_0.AuxInt 19503 x := v_1.Args[1] 19504 v.reset(OpOr32) 19505 v0 := b.NewValue0(v.Pos, OpConst32, t) 19506 v0.AuxInt = int64(int32(c | d)) 19507 v.AddArg(v0) 19508 v.AddArg(x) 19509 return true 19510 } 19511 return false 19512 } 19513 func rewriteValuegeneric_OpOr32_20(v *Value) bool { 19514 b := v.Block 19515 _ = b 19516 // match: (Or32 (Const32 <t> [c]) (Or32 x (Const32 <t> [d]))) 19517 // cond: 19518 // result: (Or32 (Const32 <t> [int64(int32(c|d))]) x) 19519 for { 19520 _ = v.Args[1] 19521 v_0 := v.Args[0] 19522 if v_0.Op != OpConst32 { 19523 break 19524 } 19525 t := v_0.Type 19526 c := v_0.AuxInt 19527 v_1 := v.Args[1] 19528 if v_1.Op != OpOr32 { 19529 break 19530 } 19531 _ = v_1.Args[1] 19532 x := v_1.Args[0] 19533 v_1_1 := v_1.Args[1] 19534 if v_1_1.Op != OpConst32 { 19535 break 19536 } 19537 if v_1_1.Type != t { 19538 break 19539 } 19540 d := v_1_1.AuxInt 19541 v.reset(OpOr32) 19542 v0 := b.NewValue0(v.Pos, OpConst32, t) 19543 v0.AuxInt = int64(int32(c | d)) 19544 v.AddArg(v0) 19545 v.AddArg(x) 19546 return true 19547 } 19548 // match: (Or32 (Or32 (Const32 <t> [d]) x) (Const32 <t> [c])) 19549 // cond: 19550 // result: (Or32 (Const32 <t> [int64(int32(c|d))]) x) 19551 for { 19552 _ = v.Args[1] 19553 v_0 := v.Args[0] 19554 if v_0.Op != OpOr32 { 19555 break 19556 } 19557 _ = v_0.Args[1] 19558 v_0_0 := v_0.Args[0] 19559 if v_0_0.Op != OpConst32 { 19560 break 19561 } 19562 t := v_0_0.Type 19563 d := v_0_0.AuxInt 19564 x := v_0.Args[1] 19565 v_1 := v.Args[1] 19566 if v_1.Op != OpConst32 { 19567 break 19568 } 19569 if v_1.Type != t { 19570 break 19571 } 19572 c := v_1.AuxInt 19573 v.reset(OpOr32) 19574 v0 := b.NewValue0(v.Pos, OpConst32, t) 19575 v0.AuxInt = int64(int32(c | d)) 19576 v.AddArg(v0) 19577 v.AddArg(x) 19578 return true 19579 } 19580 // match: (Or32 (Or32 x (Const32 <t> [d])) (Const32 <t> [c])) 19581 // cond: 19582 // result: (Or32 (Const32 <t> [int64(int32(c|d))]) x) 19583 for { 19584 _ = v.Args[1] 19585 v_0 := v.Args[0] 19586 if v_0.Op != OpOr32 { 19587 break 19588 } 19589 _ = v_0.Args[1] 19590 x := v_0.Args[0] 19591 v_0_1 := v_0.Args[1] 19592 if v_0_1.Op != OpConst32 { 19593 break 19594 } 19595 t := v_0_1.Type 19596 d := v_0_1.AuxInt 19597 v_1 := v.Args[1] 19598 if v_1.Op != OpConst32 { 19599 break 19600 } 19601 if v_1.Type != t { 19602 break 19603 } 19604 c := v_1.AuxInt 19605 v.reset(OpOr32) 19606 v0 := b.NewValue0(v.Pos, OpConst32, t) 19607 v0.AuxInt = int64(int32(c | d)) 19608 v.AddArg(v0) 19609 v.AddArg(x) 19610 return true 19611 } 19612 return false 19613 } 19614 func rewriteValuegeneric_OpOr64_0(v *Value) bool { 19615 // match: (Or64 (Const64 [c]) (Const64 [d])) 19616 // cond: 19617 // result: (Const64 [c|d]) 19618 for { 19619 _ = v.Args[1] 19620 v_0 := v.Args[0] 19621 if v_0.Op != OpConst64 { 19622 break 19623 } 19624 c := v_0.AuxInt 19625 v_1 := v.Args[1] 19626 if v_1.Op != OpConst64 { 19627 break 19628 } 19629 d := v_1.AuxInt 19630 v.reset(OpConst64) 19631 v.AuxInt = c | d 19632 return true 19633 } 19634 // match: (Or64 (Const64 [d]) (Const64 [c])) 19635 // cond: 19636 // result: (Const64 [c|d]) 19637 for { 19638 _ = v.Args[1] 19639 v_0 := v.Args[0] 19640 if v_0.Op != OpConst64 { 19641 break 19642 } 19643 d := v_0.AuxInt 19644 v_1 := v.Args[1] 19645 if v_1.Op != OpConst64 { 19646 break 19647 } 19648 c := v_1.AuxInt 19649 v.reset(OpConst64) 19650 v.AuxInt = c | d 19651 return true 19652 } 19653 // match: (Or64 x x) 19654 // cond: 19655 // result: x 19656 for { 19657 _ = v.Args[1] 19658 x := v.Args[0] 19659 if x != v.Args[1] { 19660 break 19661 } 19662 v.reset(OpCopy) 19663 v.Type = x.Type 19664 v.AddArg(x) 19665 return true 19666 } 19667 // match: (Or64 (Const64 [0]) x) 19668 // cond: 19669 // result: x 19670 for { 19671 _ = v.Args[1] 19672 v_0 := v.Args[0] 19673 if v_0.Op != OpConst64 { 19674 break 19675 } 19676 if v_0.AuxInt != 0 { 19677 break 19678 } 19679 x := v.Args[1] 19680 v.reset(OpCopy) 19681 v.Type = x.Type 19682 v.AddArg(x) 19683 return true 19684 } 19685 // match: (Or64 x (Const64 [0])) 19686 // cond: 19687 // result: x 19688 for { 19689 _ = v.Args[1] 19690 x := v.Args[0] 19691 v_1 := v.Args[1] 19692 if v_1.Op != OpConst64 { 19693 break 19694 } 19695 if v_1.AuxInt != 0 { 19696 break 19697 } 19698 v.reset(OpCopy) 19699 v.Type = x.Type 19700 v.AddArg(x) 19701 return true 19702 } 19703 // match: (Or64 (Const64 [-1]) _) 19704 // cond: 19705 // result: (Const64 [-1]) 19706 for { 19707 _ = v.Args[1] 19708 v_0 := v.Args[0] 19709 if v_0.Op != OpConst64 { 19710 break 19711 } 19712 if v_0.AuxInt != -1 { 19713 break 19714 } 19715 v.reset(OpConst64) 19716 v.AuxInt = -1 19717 return true 19718 } 19719 // match: (Or64 _ (Const64 [-1])) 19720 // cond: 19721 // result: (Const64 [-1]) 19722 for { 19723 _ = v.Args[1] 19724 v_1 := v.Args[1] 19725 if v_1.Op != OpConst64 { 19726 break 19727 } 19728 if v_1.AuxInt != -1 { 19729 break 19730 } 19731 v.reset(OpConst64) 19732 v.AuxInt = -1 19733 return true 19734 } 19735 // match: (Or64 x (Or64 x y)) 19736 // cond: 19737 // result: (Or64 x y) 19738 for { 19739 _ = v.Args[1] 19740 x := v.Args[0] 19741 v_1 := v.Args[1] 19742 if v_1.Op != OpOr64 { 19743 break 19744 } 19745 _ = v_1.Args[1] 19746 if x != v_1.Args[0] { 19747 break 19748 } 19749 y := v_1.Args[1] 19750 v.reset(OpOr64) 19751 v.AddArg(x) 19752 v.AddArg(y) 19753 return true 19754 } 19755 // match: (Or64 x (Or64 y x)) 19756 // cond: 19757 // result: (Or64 x y) 19758 for { 19759 _ = v.Args[1] 19760 x := v.Args[0] 19761 v_1 := v.Args[1] 19762 if v_1.Op != OpOr64 { 19763 break 19764 } 19765 _ = v_1.Args[1] 19766 y := v_1.Args[0] 19767 if x != v_1.Args[1] { 19768 break 19769 } 19770 v.reset(OpOr64) 19771 v.AddArg(x) 19772 v.AddArg(y) 19773 return true 19774 } 19775 // match: (Or64 (Or64 x y) x) 19776 // cond: 19777 // result: (Or64 x y) 19778 for { 19779 _ = v.Args[1] 19780 v_0 := v.Args[0] 19781 if v_0.Op != OpOr64 { 19782 break 19783 } 19784 _ = v_0.Args[1] 19785 x := v_0.Args[0] 19786 y := v_0.Args[1] 19787 if x != v.Args[1] { 19788 break 19789 } 19790 v.reset(OpOr64) 19791 v.AddArg(x) 19792 v.AddArg(y) 19793 return true 19794 } 19795 return false 19796 } 19797 func rewriteValuegeneric_OpOr64_10(v *Value) bool { 19798 b := v.Block 19799 _ = b 19800 // match: (Or64 (Or64 y x) x) 19801 // cond: 19802 // result: (Or64 x y) 19803 for { 19804 _ = v.Args[1] 19805 v_0 := v.Args[0] 19806 if v_0.Op != OpOr64 { 19807 break 19808 } 19809 _ = v_0.Args[1] 19810 y := v_0.Args[0] 19811 x := v_0.Args[1] 19812 if x != v.Args[1] { 19813 break 19814 } 19815 v.reset(OpOr64) 19816 v.AddArg(x) 19817 v.AddArg(y) 19818 return true 19819 } 19820 // match: (Or64 (And64 x (Const64 [c2])) (Const64 <t> [c1])) 19821 // cond: ^(c1 | c2) == 0 19822 // result: (Or64 (Const64 <t> [c1]) x) 19823 for { 19824 _ = v.Args[1] 19825 v_0 := v.Args[0] 19826 if v_0.Op != OpAnd64 { 19827 break 19828 } 19829 _ = v_0.Args[1] 19830 x := v_0.Args[0] 19831 v_0_1 := v_0.Args[1] 19832 if v_0_1.Op != OpConst64 { 19833 break 19834 } 19835 c2 := v_0_1.AuxInt 19836 v_1 := v.Args[1] 19837 if v_1.Op != OpConst64 { 19838 break 19839 } 19840 t := v_1.Type 19841 c1 := v_1.AuxInt 19842 if !(^(c1 | c2) == 0) { 19843 break 19844 } 19845 v.reset(OpOr64) 19846 v0 := b.NewValue0(v.Pos, OpConst64, t) 19847 v0.AuxInt = c1 19848 v.AddArg(v0) 19849 v.AddArg(x) 19850 return true 19851 } 19852 // match: (Or64 (And64 (Const64 [c2]) x) (Const64 <t> [c1])) 19853 // cond: ^(c1 | c2) == 0 19854 // result: (Or64 (Const64 <t> [c1]) x) 19855 for { 19856 _ = v.Args[1] 19857 v_0 := v.Args[0] 19858 if v_0.Op != OpAnd64 { 19859 break 19860 } 19861 _ = v_0.Args[1] 19862 v_0_0 := v_0.Args[0] 19863 if v_0_0.Op != OpConst64 { 19864 break 19865 } 19866 c2 := v_0_0.AuxInt 19867 x := v_0.Args[1] 19868 v_1 := v.Args[1] 19869 if v_1.Op != OpConst64 { 19870 break 19871 } 19872 t := v_1.Type 19873 c1 := v_1.AuxInt 19874 if !(^(c1 | c2) == 0) { 19875 break 19876 } 19877 v.reset(OpOr64) 19878 v0 := b.NewValue0(v.Pos, OpConst64, t) 19879 v0.AuxInt = c1 19880 v.AddArg(v0) 19881 v.AddArg(x) 19882 return true 19883 } 19884 // match: (Or64 (Const64 <t> [c1]) (And64 x (Const64 [c2]))) 19885 // cond: ^(c1 | c2) == 0 19886 // result: (Or64 (Const64 <t> [c1]) x) 19887 for { 19888 _ = v.Args[1] 19889 v_0 := v.Args[0] 19890 if v_0.Op != OpConst64 { 19891 break 19892 } 19893 t := v_0.Type 19894 c1 := v_0.AuxInt 19895 v_1 := v.Args[1] 19896 if v_1.Op != OpAnd64 { 19897 break 19898 } 19899 _ = v_1.Args[1] 19900 x := v_1.Args[0] 19901 v_1_1 := v_1.Args[1] 19902 if v_1_1.Op != OpConst64 { 19903 break 19904 } 19905 c2 := v_1_1.AuxInt 19906 if !(^(c1 | c2) == 0) { 19907 break 19908 } 19909 v.reset(OpOr64) 19910 v0 := b.NewValue0(v.Pos, OpConst64, t) 19911 v0.AuxInt = c1 19912 v.AddArg(v0) 19913 v.AddArg(x) 19914 return true 19915 } 19916 // match: (Or64 (Const64 <t> [c1]) (And64 (Const64 [c2]) x)) 19917 // cond: ^(c1 | c2) == 0 19918 // result: (Or64 (Const64 <t> [c1]) x) 19919 for { 19920 _ = v.Args[1] 19921 v_0 := v.Args[0] 19922 if v_0.Op != OpConst64 { 19923 break 19924 } 19925 t := v_0.Type 19926 c1 := v_0.AuxInt 19927 v_1 := v.Args[1] 19928 if v_1.Op != OpAnd64 { 19929 break 19930 } 19931 _ = v_1.Args[1] 19932 v_1_0 := v_1.Args[0] 19933 if v_1_0.Op != OpConst64 { 19934 break 19935 } 19936 c2 := v_1_0.AuxInt 19937 x := v_1.Args[1] 19938 if !(^(c1 | c2) == 0) { 19939 break 19940 } 19941 v.reset(OpOr64) 19942 v0 := b.NewValue0(v.Pos, OpConst64, t) 19943 v0.AuxInt = c1 19944 v.AddArg(v0) 19945 v.AddArg(x) 19946 return true 19947 } 19948 // match: (Or64 (Or64 i:(Const64 <t>) z) x) 19949 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 19950 // result: (Or64 i (Or64 <t> z x)) 19951 for { 19952 _ = v.Args[1] 19953 v_0 := v.Args[0] 19954 if v_0.Op != OpOr64 { 19955 break 19956 } 19957 _ = v_0.Args[1] 19958 i := v_0.Args[0] 19959 if i.Op != OpConst64 { 19960 break 19961 } 19962 t := i.Type 19963 z := v_0.Args[1] 19964 x := v.Args[1] 19965 if !(z.Op != OpConst64 && x.Op != OpConst64) { 19966 break 19967 } 19968 v.reset(OpOr64) 19969 v.AddArg(i) 19970 v0 := b.NewValue0(v.Pos, OpOr64, t) 19971 v0.AddArg(z) 19972 v0.AddArg(x) 19973 v.AddArg(v0) 19974 return true 19975 } 19976 // match: (Or64 (Or64 z i:(Const64 <t>)) x) 19977 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 19978 // result: (Or64 i (Or64 <t> z x)) 19979 for { 19980 _ = v.Args[1] 19981 v_0 := v.Args[0] 19982 if v_0.Op != OpOr64 { 19983 break 19984 } 19985 _ = v_0.Args[1] 19986 z := v_0.Args[0] 19987 i := v_0.Args[1] 19988 if i.Op != OpConst64 { 19989 break 19990 } 19991 t := i.Type 19992 x := v.Args[1] 19993 if !(z.Op != OpConst64 && x.Op != OpConst64) { 19994 break 19995 } 19996 v.reset(OpOr64) 19997 v.AddArg(i) 19998 v0 := b.NewValue0(v.Pos, OpOr64, t) 19999 v0.AddArg(z) 20000 v0.AddArg(x) 20001 v.AddArg(v0) 20002 return true 20003 } 20004 // match: (Or64 x (Or64 i:(Const64 <t>) z)) 20005 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 20006 // result: (Or64 i (Or64 <t> z x)) 20007 for { 20008 _ = v.Args[1] 20009 x := v.Args[0] 20010 v_1 := v.Args[1] 20011 if v_1.Op != OpOr64 { 20012 break 20013 } 20014 _ = v_1.Args[1] 20015 i := v_1.Args[0] 20016 if i.Op != OpConst64 { 20017 break 20018 } 20019 t := i.Type 20020 z := v_1.Args[1] 20021 if !(z.Op != OpConst64 && x.Op != OpConst64) { 20022 break 20023 } 20024 v.reset(OpOr64) 20025 v.AddArg(i) 20026 v0 := b.NewValue0(v.Pos, OpOr64, t) 20027 v0.AddArg(z) 20028 v0.AddArg(x) 20029 v.AddArg(v0) 20030 return true 20031 } 20032 // match: (Or64 x (Or64 z i:(Const64 <t>))) 20033 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 20034 // result: (Or64 i (Or64 <t> z x)) 20035 for { 20036 _ = v.Args[1] 20037 x := v.Args[0] 20038 v_1 := v.Args[1] 20039 if v_1.Op != OpOr64 { 20040 break 20041 } 20042 _ = v_1.Args[1] 20043 z := v_1.Args[0] 20044 i := v_1.Args[1] 20045 if i.Op != OpConst64 { 20046 break 20047 } 20048 t := i.Type 20049 if !(z.Op != OpConst64 && x.Op != OpConst64) { 20050 break 20051 } 20052 v.reset(OpOr64) 20053 v.AddArg(i) 20054 v0 := b.NewValue0(v.Pos, OpOr64, t) 20055 v0.AddArg(z) 20056 v0.AddArg(x) 20057 v.AddArg(v0) 20058 return true 20059 } 20060 // match: (Or64 (Const64 <t> [c]) (Or64 (Const64 <t> [d]) x)) 20061 // cond: 20062 // result: (Or64 (Const64 <t> [c|d]) x) 20063 for { 20064 _ = v.Args[1] 20065 v_0 := v.Args[0] 20066 if v_0.Op != OpConst64 { 20067 break 20068 } 20069 t := v_0.Type 20070 c := v_0.AuxInt 20071 v_1 := v.Args[1] 20072 if v_1.Op != OpOr64 { 20073 break 20074 } 20075 _ = v_1.Args[1] 20076 v_1_0 := v_1.Args[0] 20077 if v_1_0.Op != OpConst64 { 20078 break 20079 } 20080 if v_1_0.Type != t { 20081 break 20082 } 20083 d := v_1_0.AuxInt 20084 x := v_1.Args[1] 20085 v.reset(OpOr64) 20086 v0 := b.NewValue0(v.Pos, OpConst64, t) 20087 v0.AuxInt = c | d 20088 v.AddArg(v0) 20089 v.AddArg(x) 20090 return true 20091 } 20092 return false 20093 } 20094 func rewriteValuegeneric_OpOr64_20(v *Value) bool { 20095 b := v.Block 20096 _ = b 20097 // match: (Or64 (Const64 <t> [c]) (Or64 x (Const64 <t> [d]))) 20098 // cond: 20099 // result: (Or64 (Const64 <t> [c|d]) x) 20100 for { 20101 _ = v.Args[1] 20102 v_0 := v.Args[0] 20103 if v_0.Op != OpConst64 { 20104 break 20105 } 20106 t := v_0.Type 20107 c := v_0.AuxInt 20108 v_1 := v.Args[1] 20109 if v_1.Op != OpOr64 { 20110 break 20111 } 20112 _ = v_1.Args[1] 20113 x := v_1.Args[0] 20114 v_1_1 := v_1.Args[1] 20115 if v_1_1.Op != OpConst64 { 20116 break 20117 } 20118 if v_1_1.Type != t { 20119 break 20120 } 20121 d := v_1_1.AuxInt 20122 v.reset(OpOr64) 20123 v0 := b.NewValue0(v.Pos, OpConst64, t) 20124 v0.AuxInt = c | d 20125 v.AddArg(v0) 20126 v.AddArg(x) 20127 return true 20128 } 20129 // match: (Or64 (Or64 (Const64 <t> [d]) x) (Const64 <t> [c])) 20130 // cond: 20131 // result: (Or64 (Const64 <t> [c|d]) x) 20132 for { 20133 _ = v.Args[1] 20134 v_0 := v.Args[0] 20135 if v_0.Op != OpOr64 { 20136 break 20137 } 20138 _ = v_0.Args[1] 20139 v_0_0 := v_0.Args[0] 20140 if v_0_0.Op != OpConst64 { 20141 break 20142 } 20143 t := v_0_0.Type 20144 d := v_0_0.AuxInt 20145 x := v_0.Args[1] 20146 v_1 := v.Args[1] 20147 if v_1.Op != OpConst64 { 20148 break 20149 } 20150 if v_1.Type != t { 20151 break 20152 } 20153 c := v_1.AuxInt 20154 v.reset(OpOr64) 20155 v0 := b.NewValue0(v.Pos, OpConst64, t) 20156 v0.AuxInt = c | d 20157 v.AddArg(v0) 20158 v.AddArg(x) 20159 return true 20160 } 20161 // match: (Or64 (Or64 x (Const64 <t> [d])) (Const64 <t> [c])) 20162 // cond: 20163 // result: (Or64 (Const64 <t> [c|d]) x) 20164 for { 20165 _ = v.Args[1] 20166 v_0 := v.Args[0] 20167 if v_0.Op != OpOr64 { 20168 break 20169 } 20170 _ = v_0.Args[1] 20171 x := v_0.Args[0] 20172 v_0_1 := v_0.Args[1] 20173 if v_0_1.Op != OpConst64 { 20174 break 20175 } 20176 t := v_0_1.Type 20177 d := v_0_1.AuxInt 20178 v_1 := v.Args[1] 20179 if v_1.Op != OpConst64 { 20180 break 20181 } 20182 if v_1.Type != t { 20183 break 20184 } 20185 c := v_1.AuxInt 20186 v.reset(OpOr64) 20187 v0 := b.NewValue0(v.Pos, OpConst64, t) 20188 v0.AuxInt = c | d 20189 v.AddArg(v0) 20190 v.AddArg(x) 20191 return true 20192 } 20193 return false 20194 } 20195 func rewriteValuegeneric_OpOr8_0(v *Value) bool { 20196 // match: (Or8 (Const8 [c]) (Const8 [d])) 20197 // cond: 20198 // result: (Const8 [int64(int8(c|d))]) 20199 for { 20200 _ = v.Args[1] 20201 v_0 := v.Args[0] 20202 if v_0.Op != OpConst8 { 20203 break 20204 } 20205 c := v_0.AuxInt 20206 v_1 := v.Args[1] 20207 if v_1.Op != OpConst8 { 20208 break 20209 } 20210 d := v_1.AuxInt 20211 v.reset(OpConst8) 20212 v.AuxInt = int64(int8(c | d)) 20213 return true 20214 } 20215 // match: (Or8 (Const8 [d]) (Const8 [c])) 20216 // cond: 20217 // result: (Const8 [int64(int8(c|d))]) 20218 for { 20219 _ = v.Args[1] 20220 v_0 := v.Args[0] 20221 if v_0.Op != OpConst8 { 20222 break 20223 } 20224 d := v_0.AuxInt 20225 v_1 := v.Args[1] 20226 if v_1.Op != OpConst8 { 20227 break 20228 } 20229 c := v_1.AuxInt 20230 v.reset(OpConst8) 20231 v.AuxInt = int64(int8(c | d)) 20232 return true 20233 } 20234 // match: (Or8 x x) 20235 // cond: 20236 // result: x 20237 for { 20238 _ = v.Args[1] 20239 x := v.Args[0] 20240 if x != v.Args[1] { 20241 break 20242 } 20243 v.reset(OpCopy) 20244 v.Type = x.Type 20245 v.AddArg(x) 20246 return true 20247 } 20248 // match: (Or8 (Const8 [0]) x) 20249 // cond: 20250 // result: x 20251 for { 20252 _ = v.Args[1] 20253 v_0 := v.Args[0] 20254 if v_0.Op != OpConst8 { 20255 break 20256 } 20257 if v_0.AuxInt != 0 { 20258 break 20259 } 20260 x := v.Args[1] 20261 v.reset(OpCopy) 20262 v.Type = x.Type 20263 v.AddArg(x) 20264 return true 20265 } 20266 // match: (Or8 x (Const8 [0])) 20267 // cond: 20268 // result: x 20269 for { 20270 _ = v.Args[1] 20271 x := v.Args[0] 20272 v_1 := v.Args[1] 20273 if v_1.Op != OpConst8 { 20274 break 20275 } 20276 if v_1.AuxInt != 0 { 20277 break 20278 } 20279 v.reset(OpCopy) 20280 v.Type = x.Type 20281 v.AddArg(x) 20282 return true 20283 } 20284 // match: (Or8 (Const8 [-1]) _) 20285 // cond: 20286 // result: (Const8 [-1]) 20287 for { 20288 _ = v.Args[1] 20289 v_0 := v.Args[0] 20290 if v_0.Op != OpConst8 { 20291 break 20292 } 20293 if v_0.AuxInt != -1 { 20294 break 20295 } 20296 v.reset(OpConst8) 20297 v.AuxInt = -1 20298 return true 20299 } 20300 // match: (Or8 _ (Const8 [-1])) 20301 // cond: 20302 // result: (Const8 [-1]) 20303 for { 20304 _ = v.Args[1] 20305 v_1 := v.Args[1] 20306 if v_1.Op != OpConst8 { 20307 break 20308 } 20309 if v_1.AuxInt != -1 { 20310 break 20311 } 20312 v.reset(OpConst8) 20313 v.AuxInt = -1 20314 return true 20315 } 20316 // match: (Or8 x (Or8 x y)) 20317 // cond: 20318 // result: (Or8 x y) 20319 for { 20320 _ = v.Args[1] 20321 x := v.Args[0] 20322 v_1 := v.Args[1] 20323 if v_1.Op != OpOr8 { 20324 break 20325 } 20326 _ = v_1.Args[1] 20327 if x != v_1.Args[0] { 20328 break 20329 } 20330 y := v_1.Args[1] 20331 v.reset(OpOr8) 20332 v.AddArg(x) 20333 v.AddArg(y) 20334 return true 20335 } 20336 // match: (Or8 x (Or8 y x)) 20337 // cond: 20338 // result: (Or8 x y) 20339 for { 20340 _ = v.Args[1] 20341 x := v.Args[0] 20342 v_1 := v.Args[1] 20343 if v_1.Op != OpOr8 { 20344 break 20345 } 20346 _ = v_1.Args[1] 20347 y := v_1.Args[0] 20348 if x != v_1.Args[1] { 20349 break 20350 } 20351 v.reset(OpOr8) 20352 v.AddArg(x) 20353 v.AddArg(y) 20354 return true 20355 } 20356 // match: (Or8 (Or8 x y) x) 20357 // cond: 20358 // result: (Or8 x y) 20359 for { 20360 _ = v.Args[1] 20361 v_0 := v.Args[0] 20362 if v_0.Op != OpOr8 { 20363 break 20364 } 20365 _ = v_0.Args[1] 20366 x := v_0.Args[0] 20367 y := v_0.Args[1] 20368 if x != v.Args[1] { 20369 break 20370 } 20371 v.reset(OpOr8) 20372 v.AddArg(x) 20373 v.AddArg(y) 20374 return true 20375 } 20376 return false 20377 } 20378 func rewriteValuegeneric_OpOr8_10(v *Value) bool { 20379 b := v.Block 20380 _ = b 20381 // match: (Or8 (Or8 y x) x) 20382 // cond: 20383 // result: (Or8 x y) 20384 for { 20385 _ = v.Args[1] 20386 v_0 := v.Args[0] 20387 if v_0.Op != OpOr8 { 20388 break 20389 } 20390 _ = v_0.Args[1] 20391 y := v_0.Args[0] 20392 x := v_0.Args[1] 20393 if x != v.Args[1] { 20394 break 20395 } 20396 v.reset(OpOr8) 20397 v.AddArg(x) 20398 v.AddArg(y) 20399 return true 20400 } 20401 // match: (Or8 (And8 x (Const8 [c2])) (Const8 <t> [c1])) 20402 // cond: ^(c1 | c2) == 0 20403 // result: (Or8 (Const8 <t> [c1]) x) 20404 for { 20405 _ = v.Args[1] 20406 v_0 := v.Args[0] 20407 if v_0.Op != OpAnd8 { 20408 break 20409 } 20410 _ = v_0.Args[1] 20411 x := v_0.Args[0] 20412 v_0_1 := v_0.Args[1] 20413 if v_0_1.Op != OpConst8 { 20414 break 20415 } 20416 c2 := v_0_1.AuxInt 20417 v_1 := v.Args[1] 20418 if v_1.Op != OpConst8 { 20419 break 20420 } 20421 t := v_1.Type 20422 c1 := v_1.AuxInt 20423 if !(^(c1 | c2) == 0) { 20424 break 20425 } 20426 v.reset(OpOr8) 20427 v0 := b.NewValue0(v.Pos, OpConst8, t) 20428 v0.AuxInt = c1 20429 v.AddArg(v0) 20430 v.AddArg(x) 20431 return true 20432 } 20433 // match: (Or8 (And8 (Const8 [c2]) x) (Const8 <t> [c1])) 20434 // cond: ^(c1 | c2) == 0 20435 // result: (Or8 (Const8 <t> [c1]) x) 20436 for { 20437 _ = v.Args[1] 20438 v_0 := v.Args[0] 20439 if v_0.Op != OpAnd8 { 20440 break 20441 } 20442 _ = v_0.Args[1] 20443 v_0_0 := v_0.Args[0] 20444 if v_0_0.Op != OpConst8 { 20445 break 20446 } 20447 c2 := v_0_0.AuxInt 20448 x := v_0.Args[1] 20449 v_1 := v.Args[1] 20450 if v_1.Op != OpConst8 { 20451 break 20452 } 20453 t := v_1.Type 20454 c1 := v_1.AuxInt 20455 if !(^(c1 | c2) == 0) { 20456 break 20457 } 20458 v.reset(OpOr8) 20459 v0 := b.NewValue0(v.Pos, OpConst8, t) 20460 v0.AuxInt = c1 20461 v.AddArg(v0) 20462 v.AddArg(x) 20463 return true 20464 } 20465 // match: (Or8 (Const8 <t> [c1]) (And8 x (Const8 [c2]))) 20466 // cond: ^(c1 | c2) == 0 20467 // result: (Or8 (Const8 <t> [c1]) x) 20468 for { 20469 _ = v.Args[1] 20470 v_0 := v.Args[0] 20471 if v_0.Op != OpConst8 { 20472 break 20473 } 20474 t := v_0.Type 20475 c1 := v_0.AuxInt 20476 v_1 := v.Args[1] 20477 if v_1.Op != OpAnd8 { 20478 break 20479 } 20480 _ = v_1.Args[1] 20481 x := v_1.Args[0] 20482 v_1_1 := v_1.Args[1] 20483 if v_1_1.Op != OpConst8 { 20484 break 20485 } 20486 c2 := v_1_1.AuxInt 20487 if !(^(c1 | c2) == 0) { 20488 break 20489 } 20490 v.reset(OpOr8) 20491 v0 := b.NewValue0(v.Pos, OpConst8, t) 20492 v0.AuxInt = c1 20493 v.AddArg(v0) 20494 v.AddArg(x) 20495 return true 20496 } 20497 // match: (Or8 (Const8 <t> [c1]) (And8 (Const8 [c2]) x)) 20498 // cond: ^(c1 | c2) == 0 20499 // result: (Or8 (Const8 <t> [c1]) x) 20500 for { 20501 _ = v.Args[1] 20502 v_0 := v.Args[0] 20503 if v_0.Op != OpConst8 { 20504 break 20505 } 20506 t := v_0.Type 20507 c1 := v_0.AuxInt 20508 v_1 := v.Args[1] 20509 if v_1.Op != OpAnd8 { 20510 break 20511 } 20512 _ = v_1.Args[1] 20513 v_1_0 := v_1.Args[0] 20514 if v_1_0.Op != OpConst8 { 20515 break 20516 } 20517 c2 := v_1_0.AuxInt 20518 x := v_1.Args[1] 20519 if !(^(c1 | c2) == 0) { 20520 break 20521 } 20522 v.reset(OpOr8) 20523 v0 := b.NewValue0(v.Pos, OpConst8, t) 20524 v0.AuxInt = c1 20525 v.AddArg(v0) 20526 v.AddArg(x) 20527 return true 20528 } 20529 // match: (Or8 (Or8 i:(Const8 <t>) z) x) 20530 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 20531 // result: (Or8 i (Or8 <t> z x)) 20532 for { 20533 _ = v.Args[1] 20534 v_0 := v.Args[0] 20535 if v_0.Op != OpOr8 { 20536 break 20537 } 20538 _ = v_0.Args[1] 20539 i := v_0.Args[0] 20540 if i.Op != OpConst8 { 20541 break 20542 } 20543 t := i.Type 20544 z := v_0.Args[1] 20545 x := v.Args[1] 20546 if !(z.Op != OpConst8 && x.Op != OpConst8) { 20547 break 20548 } 20549 v.reset(OpOr8) 20550 v.AddArg(i) 20551 v0 := b.NewValue0(v.Pos, OpOr8, t) 20552 v0.AddArg(z) 20553 v0.AddArg(x) 20554 v.AddArg(v0) 20555 return true 20556 } 20557 // match: (Or8 (Or8 z i:(Const8 <t>)) x) 20558 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 20559 // result: (Or8 i (Or8 <t> z x)) 20560 for { 20561 _ = v.Args[1] 20562 v_0 := v.Args[0] 20563 if v_0.Op != OpOr8 { 20564 break 20565 } 20566 _ = v_0.Args[1] 20567 z := v_0.Args[0] 20568 i := v_0.Args[1] 20569 if i.Op != OpConst8 { 20570 break 20571 } 20572 t := i.Type 20573 x := v.Args[1] 20574 if !(z.Op != OpConst8 && x.Op != OpConst8) { 20575 break 20576 } 20577 v.reset(OpOr8) 20578 v.AddArg(i) 20579 v0 := b.NewValue0(v.Pos, OpOr8, t) 20580 v0.AddArg(z) 20581 v0.AddArg(x) 20582 v.AddArg(v0) 20583 return true 20584 } 20585 // match: (Or8 x (Or8 i:(Const8 <t>) z)) 20586 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 20587 // result: (Or8 i (Or8 <t> z x)) 20588 for { 20589 _ = v.Args[1] 20590 x := v.Args[0] 20591 v_1 := v.Args[1] 20592 if v_1.Op != OpOr8 { 20593 break 20594 } 20595 _ = v_1.Args[1] 20596 i := v_1.Args[0] 20597 if i.Op != OpConst8 { 20598 break 20599 } 20600 t := i.Type 20601 z := v_1.Args[1] 20602 if !(z.Op != OpConst8 && x.Op != OpConst8) { 20603 break 20604 } 20605 v.reset(OpOr8) 20606 v.AddArg(i) 20607 v0 := b.NewValue0(v.Pos, OpOr8, t) 20608 v0.AddArg(z) 20609 v0.AddArg(x) 20610 v.AddArg(v0) 20611 return true 20612 } 20613 // match: (Or8 x (Or8 z i:(Const8 <t>))) 20614 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 20615 // result: (Or8 i (Or8 <t> z x)) 20616 for { 20617 _ = v.Args[1] 20618 x := v.Args[0] 20619 v_1 := v.Args[1] 20620 if v_1.Op != OpOr8 { 20621 break 20622 } 20623 _ = v_1.Args[1] 20624 z := v_1.Args[0] 20625 i := v_1.Args[1] 20626 if i.Op != OpConst8 { 20627 break 20628 } 20629 t := i.Type 20630 if !(z.Op != OpConst8 && x.Op != OpConst8) { 20631 break 20632 } 20633 v.reset(OpOr8) 20634 v.AddArg(i) 20635 v0 := b.NewValue0(v.Pos, OpOr8, t) 20636 v0.AddArg(z) 20637 v0.AddArg(x) 20638 v.AddArg(v0) 20639 return true 20640 } 20641 // match: (Or8 (Const8 <t> [c]) (Or8 (Const8 <t> [d]) x)) 20642 // cond: 20643 // result: (Or8 (Const8 <t> [int64(int8(c|d))]) x) 20644 for { 20645 _ = v.Args[1] 20646 v_0 := v.Args[0] 20647 if v_0.Op != OpConst8 { 20648 break 20649 } 20650 t := v_0.Type 20651 c := v_0.AuxInt 20652 v_1 := v.Args[1] 20653 if v_1.Op != OpOr8 { 20654 break 20655 } 20656 _ = v_1.Args[1] 20657 v_1_0 := v_1.Args[0] 20658 if v_1_0.Op != OpConst8 { 20659 break 20660 } 20661 if v_1_0.Type != t { 20662 break 20663 } 20664 d := v_1_0.AuxInt 20665 x := v_1.Args[1] 20666 v.reset(OpOr8) 20667 v0 := b.NewValue0(v.Pos, OpConst8, t) 20668 v0.AuxInt = int64(int8(c | d)) 20669 v.AddArg(v0) 20670 v.AddArg(x) 20671 return true 20672 } 20673 return false 20674 } 20675 func rewriteValuegeneric_OpOr8_20(v *Value) bool { 20676 b := v.Block 20677 _ = b 20678 // match: (Or8 (Const8 <t> [c]) (Or8 x (Const8 <t> [d]))) 20679 // cond: 20680 // result: (Or8 (Const8 <t> [int64(int8(c|d))]) x) 20681 for { 20682 _ = v.Args[1] 20683 v_0 := v.Args[0] 20684 if v_0.Op != OpConst8 { 20685 break 20686 } 20687 t := v_0.Type 20688 c := v_0.AuxInt 20689 v_1 := v.Args[1] 20690 if v_1.Op != OpOr8 { 20691 break 20692 } 20693 _ = v_1.Args[1] 20694 x := v_1.Args[0] 20695 v_1_1 := v_1.Args[1] 20696 if v_1_1.Op != OpConst8 { 20697 break 20698 } 20699 if v_1_1.Type != t { 20700 break 20701 } 20702 d := v_1_1.AuxInt 20703 v.reset(OpOr8) 20704 v0 := b.NewValue0(v.Pos, OpConst8, t) 20705 v0.AuxInt = int64(int8(c | d)) 20706 v.AddArg(v0) 20707 v.AddArg(x) 20708 return true 20709 } 20710 // match: (Or8 (Or8 (Const8 <t> [d]) x) (Const8 <t> [c])) 20711 // cond: 20712 // result: (Or8 (Const8 <t> [int64(int8(c|d))]) x) 20713 for { 20714 _ = v.Args[1] 20715 v_0 := v.Args[0] 20716 if v_0.Op != OpOr8 { 20717 break 20718 } 20719 _ = v_0.Args[1] 20720 v_0_0 := v_0.Args[0] 20721 if v_0_0.Op != OpConst8 { 20722 break 20723 } 20724 t := v_0_0.Type 20725 d := v_0_0.AuxInt 20726 x := v_0.Args[1] 20727 v_1 := v.Args[1] 20728 if v_1.Op != OpConst8 { 20729 break 20730 } 20731 if v_1.Type != t { 20732 break 20733 } 20734 c := v_1.AuxInt 20735 v.reset(OpOr8) 20736 v0 := b.NewValue0(v.Pos, OpConst8, t) 20737 v0.AuxInt = int64(int8(c | d)) 20738 v.AddArg(v0) 20739 v.AddArg(x) 20740 return true 20741 } 20742 // match: (Or8 (Or8 x (Const8 <t> [d])) (Const8 <t> [c])) 20743 // cond: 20744 // result: (Or8 (Const8 <t> [int64(int8(c|d))]) x) 20745 for { 20746 _ = v.Args[1] 20747 v_0 := v.Args[0] 20748 if v_0.Op != OpOr8 { 20749 break 20750 } 20751 _ = v_0.Args[1] 20752 x := v_0.Args[0] 20753 v_0_1 := v_0.Args[1] 20754 if v_0_1.Op != OpConst8 { 20755 break 20756 } 20757 t := v_0_1.Type 20758 d := v_0_1.AuxInt 20759 v_1 := v.Args[1] 20760 if v_1.Op != OpConst8 { 20761 break 20762 } 20763 if v_1.Type != t { 20764 break 20765 } 20766 c := v_1.AuxInt 20767 v.reset(OpOr8) 20768 v0 := b.NewValue0(v.Pos, OpConst8, t) 20769 v0.AuxInt = int64(int8(c | d)) 20770 v.AddArg(v0) 20771 v.AddArg(x) 20772 return true 20773 } 20774 return false 20775 } 20776 func rewriteValuegeneric_OpPhi_0(v *Value) bool { 20777 // match: (Phi (Const8 [c]) (Const8 [c])) 20778 // cond: 20779 // result: (Const8 [c]) 20780 for { 20781 _ = v.Args[1] 20782 v_0 := v.Args[0] 20783 if v_0.Op != OpConst8 { 20784 break 20785 } 20786 c := v_0.AuxInt 20787 v_1 := v.Args[1] 20788 if v_1.Op != OpConst8 { 20789 break 20790 } 20791 if v_1.AuxInt != c { 20792 break 20793 } 20794 if len(v.Args) != 2 { 20795 break 20796 } 20797 v.reset(OpConst8) 20798 v.AuxInt = c 20799 return true 20800 } 20801 // match: (Phi (Const16 [c]) (Const16 [c])) 20802 // cond: 20803 // result: (Const16 [c]) 20804 for { 20805 _ = v.Args[1] 20806 v_0 := v.Args[0] 20807 if v_0.Op != OpConst16 { 20808 break 20809 } 20810 c := v_0.AuxInt 20811 v_1 := v.Args[1] 20812 if v_1.Op != OpConst16 { 20813 break 20814 } 20815 if v_1.AuxInt != c { 20816 break 20817 } 20818 if len(v.Args) != 2 { 20819 break 20820 } 20821 v.reset(OpConst16) 20822 v.AuxInt = c 20823 return true 20824 } 20825 // match: (Phi (Const32 [c]) (Const32 [c])) 20826 // cond: 20827 // result: (Const32 [c]) 20828 for { 20829 _ = v.Args[1] 20830 v_0 := v.Args[0] 20831 if v_0.Op != OpConst32 { 20832 break 20833 } 20834 c := v_0.AuxInt 20835 v_1 := v.Args[1] 20836 if v_1.Op != OpConst32 { 20837 break 20838 } 20839 if v_1.AuxInt != c { 20840 break 20841 } 20842 if len(v.Args) != 2 { 20843 break 20844 } 20845 v.reset(OpConst32) 20846 v.AuxInt = c 20847 return true 20848 } 20849 // match: (Phi (Const64 [c]) (Const64 [c])) 20850 // cond: 20851 // result: (Const64 [c]) 20852 for { 20853 _ = v.Args[1] 20854 v_0 := v.Args[0] 20855 if v_0.Op != OpConst64 { 20856 break 20857 } 20858 c := v_0.AuxInt 20859 v_1 := v.Args[1] 20860 if v_1.Op != OpConst64 { 20861 break 20862 } 20863 if v_1.AuxInt != c { 20864 break 20865 } 20866 if len(v.Args) != 2 { 20867 break 20868 } 20869 v.reset(OpConst64) 20870 v.AuxInt = c 20871 return true 20872 } 20873 return false 20874 } 20875 func rewriteValuegeneric_OpPtrIndex_0(v *Value) bool { 20876 b := v.Block 20877 _ = b 20878 config := b.Func.Config 20879 _ = config 20880 typ := &b.Func.Config.Types 20881 _ = typ 20882 // match: (PtrIndex <t> ptr idx) 20883 // cond: config.PtrSize == 4 20884 // result: (AddPtr ptr (Mul32 <typ.Int> idx (Const32 <typ.Int> [t.ElemType().Size()]))) 20885 for { 20886 t := v.Type 20887 _ = v.Args[1] 20888 ptr := v.Args[0] 20889 idx := v.Args[1] 20890 if !(config.PtrSize == 4) { 20891 break 20892 } 20893 v.reset(OpAddPtr) 20894 v.AddArg(ptr) 20895 v0 := b.NewValue0(v.Pos, OpMul32, typ.Int) 20896 v0.AddArg(idx) 20897 v1 := b.NewValue0(v.Pos, OpConst32, typ.Int) 20898 v1.AuxInt = t.ElemType().Size() 20899 v0.AddArg(v1) 20900 v.AddArg(v0) 20901 return true 20902 } 20903 // match: (PtrIndex <t> ptr idx) 20904 // cond: config.PtrSize == 8 20905 // result: (AddPtr ptr (Mul64 <typ.Int> idx (Const64 <typ.Int> [t.ElemType().Size()]))) 20906 for { 20907 t := v.Type 20908 _ = v.Args[1] 20909 ptr := v.Args[0] 20910 idx := v.Args[1] 20911 if !(config.PtrSize == 8) { 20912 break 20913 } 20914 v.reset(OpAddPtr) 20915 v.AddArg(ptr) 20916 v0 := b.NewValue0(v.Pos, OpMul64, typ.Int) 20917 v0.AddArg(idx) 20918 v1 := b.NewValue0(v.Pos, OpConst64, typ.Int) 20919 v1.AuxInt = t.ElemType().Size() 20920 v0.AddArg(v1) 20921 v.AddArg(v0) 20922 return true 20923 } 20924 return false 20925 } 20926 func rewriteValuegeneric_OpRound32F_0(v *Value) bool { 20927 // match: (Round32F x:(Const32F)) 20928 // cond: 20929 // result: x 20930 for { 20931 x := v.Args[0] 20932 if x.Op != OpConst32F { 20933 break 20934 } 20935 v.reset(OpCopy) 20936 v.Type = x.Type 20937 v.AddArg(x) 20938 return true 20939 } 20940 return false 20941 } 20942 func rewriteValuegeneric_OpRound64F_0(v *Value) bool { 20943 // match: (Round64F x:(Const64F)) 20944 // cond: 20945 // result: x 20946 for { 20947 x := v.Args[0] 20948 if x.Op != OpConst64F { 20949 break 20950 } 20951 v.reset(OpCopy) 20952 v.Type = x.Type 20953 v.AddArg(x) 20954 return true 20955 } 20956 return false 20957 } 20958 func rewriteValuegeneric_OpRsh16Ux16_0(v *Value) bool { 20959 b := v.Block 20960 _ = b 20961 // match: (Rsh16Ux16 <t> x (Const16 [c])) 20962 // cond: 20963 // result: (Rsh16Ux64 x (Const64 <t> [int64(uint16(c))])) 20964 for { 20965 t := v.Type 20966 _ = v.Args[1] 20967 x := v.Args[0] 20968 v_1 := v.Args[1] 20969 if v_1.Op != OpConst16 { 20970 break 20971 } 20972 c := v_1.AuxInt 20973 v.reset(OpRsh16Ux64) 20974 v.AddArg(x) 20975 v0 := b.NewValue0(v.Pos, OpConst64, t) 20976 v0.AuxInt = int64(uint16(c)) 20977 v.AddArg(v0) 20978 return true 20979 } 20980 // match: (Rsh16Ux16 (Const16 [0]) _) 20981 // cond: 20982 // result: (Const16 [0]) 20983 for { 20984 _ = v.Args[1] 20985 v_0 := v.Args[0] 20986 if v_0.Op != OpConst16 { 20987 break 20988 } 20989 if v_0.AuxInt != 0 { 20990 break 20991 } 20992 v.reset(OpConst16) 20993 v.AuxInt = 0 20994 return true 20995 } 20996 return false 20997 } 20998 func rewriteValuegeneric_OpRsh16Ux32_0(v *Value) bool { 20999 b := v.Block 21000 _ = b 21001 // match: (Rsh16Ux32 <t> x (Const32 [c])) 21002 // cond: 21003 // result: (Rsh16Ux64 x (Const64 <t> [int64(uint32(c))])) 21004 for { 21005 t := v.Type 21006 _ = v.Args[1] 21007 x := v.Args[0] 21008 v_1 := v.Args[1] 21009 if v_1.Op != OpConst32 { 21010 break 21011 } 21012 c := v_1.AuxInt 21013 v.reset(OpRsh16Ux64) 21014 v.AddArg(x) 21015 v0 := b.NewValue0(v.Pos, OpConst64, t) 21016 v0.AuxInt = int64(uint32(c)) 21017 v.AddArg(v0) 21018 return true 21019 } 21020 // match: (Rsh16Ux32 (Const16 [0]) _) 21021 // cond: 21022 // result: (Const16 [0]) 21023 for { 21024 _ = v.Args[1] 21025 v_0 := v.Args[0] 21026 if v_0.Op != OpConst16 { 21027 break 21028 } 21029 if v_0.AuxInt != 0 { 21030 break 21031 } 21032 v.reset(OpConst16) 21033 v.AuxInt = 0 21034 return true 21035 } 21036 return false 21037 } 21038 func rewriteValuegeneric_OpRsh16Ux64_0(v *Value) bool { 21039 b := v.Block 21040 _ = b 21041 typ := &b.Func.Config.Types 21042 _ = typ 21043 // match: (Rsh16Ux64 (Const16 [c]) (Const64 [d])) 21044 // cond: 21045 // result: (Const16 [int64(int16(uint16(c) >> uint64(d)))]) 21046 for { 21047 _ = v.Args[1] 21048 v_0 := v.Args[0] 21049 if v_0.Op != OpConst16 { 21050 break 21051 } 21052 c := v_0.AuxInt 21053 v_1 := v.Args[1] 21054 if v_1.Op != OpConst64 { 21055 break 21056 } 21057 d := v_1.AuxInt 21058 v.reset(OpConst16) 21059 v.AuxInt = int64(int16(uint16(c) >> uint64(d))) 21060 return true 21061 } 21062 // match: (Rsh16Ux64 x (Const64 [0])) 21063 // cond: 21064 // result: x 21065 for { 21066 _ = v.Args[1] 21067 x := v.Args[0] 21068 v_1 := v.Args[1] 21069 if v_1.Op != OpConst64 { 21070 break 21071 } 21072 if v_1.AuxInt != 0 { 21073 break 21074 } 21075 v.reset(OpCopy) 21076 v.Type = x.Type 21077 v.AddArg(x) 21078 return true 21079 } 21080 // match: (Rsh16Ux64 (Const16 [0]) _) 21081 // cond: 21082 // result: (Const16 [0]) 21083 for { 21084 _ = v.Args[1] 21085 v_0 := v.Args[0] 21086 if v_0.Op != OpConst16 { 21087 break 21088 } 21089 if v_0.AuxInt != 0 { 21090 break 21091 } 21092 v.reset(OpConst16) 21093 v.AuxInt = 0 21094 return true 21095 } 21096 // match: (Rsh16Ux64 _ (Const64 [c])) 21097 // cond: uint64(c) >= 16 21098 // result: (Const16 [0]) 21099 for { 21100 _ = v.Args[1] 21101 v_1 := v.Args[1] 21102 if v_1.Op != OpConst64 { 21103 break 21104 } 21105 c := v_1.AuxInt 21106 if !(uint64(c) >= 16) { 21107 break 21108 } 21109 v.reset(OpConst16) 21110 v.AuxInt = 0 21111 return true 21112 } 21113 // match: (Rsh16Ux64 <t> (Rsh16Ux64 x (Const64 [c])) (Const64 [d])) 21114 // cond: !uaddOvf(c,d) 21115 // result: (Rsh16Ux64 x (Const64 <t> [c+d])) 21116 for { 21117 t := v.Type 21118 _ = v.Args[1] 21119 v_0 := v.Args[0] 21120 if v_0.Op != OpRsh16Ux64 { 21121 break 21122 } 21123 _ = v_0.Args[1] 21124 x := v_0.Args[0] 21125 v_0_1 := v_0.Args[1] 21126 if v_0_1.Op != OpConst64 { 21127 break 21128 } 21129 c := v_0_1.AuxInt 21130 v_1 := v.Args[1] 21131 if v_1.Op != OpConst64 { 21132 break 21133 } 21134 d := v_1.AuxInt 21135 if !(!uaddOvf(c, d)) { 21136 break 21137 } 21138 v.reset(OpRsh16Ux64) 21139 v.AddArg(x) 21140 v0 := b.NewValue0(v.Pos, OpConst64, t) 21141 v0.AuxInt = c + d 21142 v.AddArg(v0) 21143 return true 21144 } 21145 // match: (Rsh16Ux64 (Lsh16x64 (Rsh16Ux64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 21146 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 21147 // result: (Rsh16Ux64 x (Const64 <typ.UInt64> [c1-c2+c3])) 21148 for { 21149 _ = v.Args[1] 21150 v_0 := v.Args[0] 21151 if v_0.Op != OpLsh16x64 { 21152 break 21153 } 21154 _ = v_0.Args[1] 21155 v_0_0 := v_0.Args[0] 21156 if v_0_0.Op != OpRsh16Ux64 { 21157 break 21158 } 21159 _ = v_0_0.Args[1] 21160 x := v_0_0.Args[0] 21161 v_0_0_1 := v_0_0.Args[1] 21162 if v_0_0_1.Op != OpConst64 { 21163 break 21164 } 21165 c1 := v_0_0_1.AuxInt 21166 v_0_1 := v_0.Args[1] 21167 if v_0_1.Op != OpConst64 { 21168 break 21169 } 21170 c2 := v_0_1.AuxInt 21171 v_1 := v.Args[1] 21172 if v_1.Op != OpConst64 { 21173 break 21174 } 21175 c3 := v_1.AuxInt 21176 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 21177 break 21178 } 21179 v.reset(OpRsh16Ux64) 21180 v.AddArg(x) 21181 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 21182 v0.AuxInt = c1 - c2 + c3 21183 v.AddArg(v0) 21184 return true 21185 } 21186 // match: (Rsh16Ux64 (Lsh16x64 x (Const64 [8])) (Const64 [8])) 21187 // cond: 21188 // result: (ZeroExt8to16 (Trunc16to8 <typ.UInt8> x)) 21189 for { 21190 _ = v.Args[1] 21191 v_0 := v.Args[0] 21192 if v_0.Op != OpLsh16x64 { 21193 break 21194 } 21195 _ = v_0.Args[1] 21196 x := v_0.Args[0] 21197 v_0_1 := v_0.Args[1] 21198 if v_0_1.Op != OpConst64 { 21199 break 21200 } 21201 if v_0_1.AuxInt != 8 { 21202 break 21203 } 21204 v_1 := v.Args[1] 21205 if v_1.Op != OpConst64 { 21206 break 21207 } 21208 if v_1.AuxInt != 8 { 21209 break 21210 } 21211 v.reset(OpZeroExt8to16) 21212 v0 := b.NewValue0(v.Pos, OpTrunc16to8, typ.UInt8) 21213 v0.AddArg(x) 21214 v.AddArg(v0) 21215 return true 21216 } 21217 return false 21218 } 21219 func rewriteValuegeneric_OpRsh16Ux8_0(v *Value) bool { 21220 b := v.Block 21221 _ = b 21222 // match: (Rsh16Ux8 <t> x (Const8 [c])) 21223 // cond: 21224 // result: (Rsh16Ux64 x (Const64 <t> [int64(uint8(c))])) 21225 for { 21226 t := v.Type 21227 _ = v.Args[1] 21228 x := v.Args[0] 21229 v_1 := v.Args[1] 21230 if v_1.Op != OpConst8 { 21231 break 21232 } 21233 c := v_1.AuxInt 21234 v.reset(OpRsh16Ux64) 21235 v.AddArg(x) 21236 v0 := b.NewValue0(v.Pos, OpConst64, t) 21237 v0.AuxInt = int64(uint8(c)) 21238 v.AddArg(v0) 21239 return true 21240 } 21241 // match: (Rsh16Ux8 (Const16 [0]) _) 21242 // cond: 21243 // result: (Const16 [0]) 21244 for { 21245 _ = v.Args[1] 21246 v_0 := v.Args[0] 21247 if v_0.Op != OpConst16 { 21248 break 21249 } 21250 if v_0.AuxInt != 0 { 21251 break 21252 } 21253 v.reset(OpConst16) 21254 v.AuxInt = 0 21255 return true 21256 } 21257 return false 21258 } 21259 func rewriteValuegeneric_OpRsh16x16_0(v *Value) bool { 21260 b := v.Block 21261 _ = b 21262 // match: (Rsh16x16 <t> x (Const16 [c])) 21263 // cond: 21264 // result: (Rsh16x64 x (Const64 <t> [int64(uint16(c))])) 21265 for { 21266 t := v.Type 21267 _ = v.Args[1] 21268 x := v.Args[0] 21269 v_1 := v.Args[1] 21270 if v_1.Op != OpConst16 { 21271 break 21272 } 21273 c := v_1.AuxInt 21274 v.reset(OpRsh16x64) 21275 v.AddArg(x) 21276 v0 := b.NewValue0(v.Pos, OpConst64, t) 21277 v0.AuxInt = int64(uint16(c)) 21278 v.AddArg(v0) 21279 return true 21280 } 21281 // match: (Rsh16x16 (Const16 [0]) _) 21282 // cond: 21283 // result: (Const16 [0]) 21284 for { 21285 _ = v.Args[1] 21286 v_0 := v.Args[0] 21287 if v_0.Op != OpConst16 { 21288 break 21289 } 21290 if v_0.AuxInt != 0 { 21291 break 21292 } 21293 v.reset(OpConst16) 21294 v.AuxInt = 0 21295 return true 21296 } 21297 return false 21298 } 21299 func rewriteValuegeneric_OpRsh16x32_0(v *Value) bool { 21300 b := v.Block 21301 _ = b 21302 // match: (Rsh16x32 <t> x (Const32 [c])) 21303 // cond: 21304 // result: (Rsh16x64 x (Const64 <t> [int64(uint32(c))])) 21305 for { 21306 t := v.Type 21307 _ = v.Args[1] 21308 x := v.Args[0] 21309 v_1 := v.Args[1] 21310 if v_1.Op != OpConst32 { 21311 break 21312 } 21313 c := v_1.AuxInt 21314 v.reset(OpRsh16x64) 21315 v.AddArg(x) 21316 v0 := b.NewValue0(v.Pos, OpConst64, t) 21317 v0.AuxInt = int64(uint32(c)) 21318 v.AddArg(v0) 21319 return true 21320 } 21321 // match: (Rsh16x32 (Const16 [0]) _) 21322 // cond: 21323 // result: (Const16 [0]) 21324 for { 21325 _ = v.Args[1] 21326 v_0 := v.Args[0] 21327 if v_0.Op != OpConst16 { 21328 break 21329 } 21330 if v_0.AuxInt != 0 { 21331 break 21332 } 21333 v.reset(OpConst16) 21334 v.AuxInt = 0 21335 return true 21336 } 21337 return false 21338 } 21339 func rewriteValuegeneric_OpRsh16x64_0(v *Value) bool { 21340 b := v.Block 21341 _ = b 21342 typ := &b.Func.Config.Types 21343 _ = typ 21344 // match: (Rsh16x64 (Const16 [c]) (Const64 [d])) 21345 // cond: 21346 // result: (Const16 [int64(int16(c) >> uint64(d))]) 21347 for { 21348 _ = v.Args[1] 21349 v_0 := v.Args[0] 21350 if v_0.Op != OpConst16 { 21351 break 21352 } 21353 c := v_0.AuxInt 21354 v_1 := v.Args[1] 21355 if v_1.Op != OpConst64 { 21356 break 21357 } 21358 d := v_1.AuxInt 21359 v.reset(OpConst16) 21360 v.AuxInt = int64(int16(c) >> uint64(d)) 21361 return true 21362 } 21363 // match: (Rsh16x64 x (Const64 [0])) 21364 // cond: 21365 // result: x 21366 for { 21367 _ = v.Args[1] 21368 x := v.Args[0] 21369 v_1 := v.Args[1] 21370 if v_1.Op != OpConst64 { 21371 break 21372 } 21373 if v_1.AuxInt != 0 { 21374 break 21375 } 21376 v.reset(OpCopy) 21377 v.Type = x.Type 21378 v.AddArg(x) 21379 return true 21380 } 21381 // match: (Rsh16x64 (Const16 [0]) _) 21382 // cond: 21383 // result: (Const16 [0]) 21384 for { 21385 _ = v.Args[1] 21386 v_0 := v.Args[0] 21387 if v_0.Op != OpConst16 { 21388 break 21389 } 21390 if v_0.AuxInt != 0 { 21391 break 21392 } 21393 v.reset(OpConst16) 21394 v.AuxInt = 0 21395 return true 21396 } 21397 // match: (Rsh16x64 <t> (Rsh16x64 x (Const64 [c])) (Const64 [d])) 21398 // cond: !uaddOvf(c,d) 21399 // result: (Rsh16x64 x (Const64 <t> [c+d])) 21400 for { 21401 t := v.Type 21402 _ = v.Args[1] 21403 v_0 := v.Args[0] 21404 if v_0.Op != OpRsh16x64 { 21405 break 21406 } 21407 _ = v_0.Args[1] 21408 x := v_0.Args[0] 21409 v_0_1 := v_0.Args[1] 21410 if v_0_1.Op != OpConst64 { 21411 break 21412 } 21413 c := v_0_1.AuxInt 21414 v_1 := v.Args[1] 21415 if v_1.Op != OpConst64 { 21416 break 21417 } 21418 d := v_1.AuxInt 21419 if !(!uaddOvf(c, d)) { 21420 break 21421 } 21422 v.reset(OpRsh16x64) 21423 v.AddArg(x) 21424 v0 := b.NewValue0(v.Pos, OpConst64, t) 21425 v0.AuxInt = c + d 21426 v.AddArg(v0) 21427 return true 21428 } 21429 // match: (Rsh16x64 (Lsh16x64 x (Const64 [8])) (Const64 [8])) 21430 // cond: 21431 // result: (SignExt8to16 (Trunc16to8 <typ.Int8> x)) 21432 for { 21433 _ = v.Args[1] 21434 v_0 := v.Args[0] 21435 if v_0.Op != OpLsh16x64 { 21436 break 21437 } 21438 _ = v_0.Args[1] 21439 x := v_0.Args[0] 21440 v_0_1 := v_0.Args[1] 21441 if v_0_1.Op != OpConst64 { 21442 break 21443 } 21444 if v_0_1.AuxInt != 8 { 21445 break 21446 } 21447 v_1 := v.Args[1] 21448 if v_1.Op != OpConst64 { 21449 break 21450 } 21451 if v_1.AuxInt != 8 { 21452 break 21453 } 21454 v.reset(OpSignExt8to16) 21455 v0 := b.NewValue0(v.Pos, OpTrunc16to8, typ.Int8) 21456 v0.AddArg(x) 21457 v.AddArg(v0) 21458 return true 21459 } 21460 return false 21461 } 21462 func rewriteValuegeneric_OpRsh16x8_0(v *Value) bool { 21463 b := v.Block 21464 _ = b 21465 // match: (Rsh16x8 <t> x (Const8 [c])) 21466 // cond: 21467 // result: (Rsh16x64 x (Const64 <t> [int64(uint8(c))])) 21468 for { 21469 t := v.Type 21470 _ = v.Args[1] 21471 x := v.Args[0] 21472 v_1 := v.Args[1] 21473 if v_1.Op != OpConst8 { 21474 break 21475 } 21476 c := v_1.AuxInt 21477 v.reset(OpRsh16x64) 21478 v.AddArg(x) 21479 v0 := b.NewValue0(v.Pos, OpConst64, t) 21480 v0.AuxInt = int64(uint8(c)) 21481 v.AddArg(v0) 21482 return true 21483 } 21484 // match: (Rsh16x8 (Const16 [0]) _) 21485 // cond: 21486 // result: (Const16 [0]) 21487 for { 21488 _ = v.Args[1] 21489 v_0 := v.Args[0] 21490 if v_0.Op != OpConst16 { 21491 break 21492 } 21493 if v_0.AuxInt != 0 { 21494 break 21495 } 21496 v.reset(OpConst16) 21497 v.AuxInt = 0 21498 return true 21499 } 21500 return false 21501 } 21502 func rewriteValuegeneric_OpRsh32Ux16_0(v *Value) bool { 21503 b := v.Block 21504 _ = b 21505 // match: (Rsh32Ux16 <t> x (Const16 [c])) 21506 // cond: 21507 // result: (Rsh32Ux64 x (Const64 <t> [int64(uint16(c))])) 21508 for { 21509 t := v.Type 21510 _ = v.Args[1] 21511 x := v.Args[0] 21512 v_1 := v.Args[1] 21513 if v_1.Op != OpConst16 { 21514 break 21515 } 21516 c := v_1.AuxInt 21517 v.reset(OpRsh32Ux64) 21518 v.AddArg(x) 21519 v0 := b.NewValue0(v.Pos, OpConst64, t) 21520 v0.AuxInt = int64(uint16(c)) 21521 v.AddArg(v0) 21522 return true 21523 } 21524 // match: (Rsh32Ux16 (Const32 [0]) _) 21525 // cond: 21526 // result: (Const32 [0]) 21527 for { 21528 _ = v.Args[1] 21529 v_0 := v.Args[0] 21530 if v_0.Op != OpConst32 { 21531 break 21532 } 21533 if v_0.AuxInt != 0 { 21534 break 21535 } 21536 v.reset(OpConst32) 21537 v.AuxInt = 0 21538 return true 21539 } 21540 return false 21541 } 21542 func rewriteValuegeneric_OpRsh32Ux32_0(v *Value) bool { 21543 b := v.Block 21544 _ = b 21545 // match: (Rsh32Ux32 <t> x (Const32 [c])) 21546 // cond: 21547 // result: (Rsh32Ux64 x (Const64 <t> [int64(uint32(c))])) 21548 for { 21549 t := v.Type 21550 _ = v.Args[1] 21551 x := v.Args[0] 21552 v_1 := v.Args[1] 21553 if v_1.Op != OpConst32 { 21554 break 21555 } 21556 c := v_1.AuxInt 21557 v.reset(OpRsh32Ux64) 21558 v.AddArg(x) 21559 v0 := b.NewValue0(v.Pos, OpConst64, t) 21560 v0.AuxInt = int64(uint32(c)) 21561 v.AddArg(v0) 21562 return true 21563 } 21564 // match: (Rsh32Ux32 (Const32 [0]) _) 21565 // cond: 21566 // result: (Const32 [0]) 21567 for { 21568 _ = v.Args[1] 21569 v_0 := v.Args[0] 21570 if v_0.Op != OpConst32 { 21571 break 21572 } 21573 if v_0.AuxInt != 0 { 21574 break 21575 } 21576 v.reset(OpConst32) 21577 v.AuxInt = 0 21578 return true 21579 } 21580 return false 21581 } 21582 func rewriteValuegeneric_OpRsh32Ux64_0(v *Value) bool { 21583 b := v.Block 21584 _ = b 21585 typ := &b.Func.Config.Types 21586 _ = typ 21587 // match: (Rsh32Ux64 (Const32 [c]) (Const64 [d])) 21588 // cond: 21589 // result: (Const32 [int64(int32(uint32(c) >> uint64(d)))]) 21590 for { 21591 _ = v.Args[1] 21592 v_0 := v.Args[0] 21593 if v_0.Op != OpConst32 { 21594 break 21595 } 21596 c := v_0.AuxInt 21597 v_1 := v.Args[1] 21598 if v_1.Op != OpConst64 { 21599 break 21600 } 21601 d := v_1.AuxInt 21602 v.reset(OpConst32) 21603 v.AuxInt = int64(int32(uint32(c) >> uint64(d))) 21604 return true 21605 } 21606 // match: (Rsh32Ux64 x (Const64 [0])) 21607 // cond: 21608 // result: x 21609 for { 21610 _ = v.Args[1] 21611 x := v.Args[0] 21612 v_1 := v.Args[1] 21613 if v_1.Op != OpConst64 { 21614 break 21615 } 21616 if v_1.AuxInt != 0 { 21617 break 21618 } 21619 v.reset(OpCopy) 21620 v.Type = x.Type 21621 v.AddArg(x) 21622 return true 21623 } 21624 // match: (Rsh32Ux64 (Const32 [0]) _) 21625 // cond: 21626 // result: (Const32 [0]) 21627 for { 21628 _ = v.Args[1] 21629 v_0 := v.Args[0] 21630 if v_0.Op != OpConst32 { 21631 break 21632 } 21633 if v_0.AuxInt != 0 { 21634 break 21635 } 21636 v.reset(OpConst32) 21637 v.AuxInt = 0 21638 return true 21639 } 21640 // match: (Rsh32Ux64 _ (Const64 [c])) 21641 // cond: uint64(c) >= 32 21642 // result: (Const32 [0]) 21643 for { 21644 _ = v.Args[1] 21645 v_1 := v.Args[1] 21646 if v_1.Op != OpConst64 { 21647 break 21648 } 21649 c := v_1.AuxInt 21650 if !(uint64(c) >= 32) { 21651 break 21652 } 21653 v.reset(OpConst32) 21654 v.AuxInt = 0 21655 return true 21656 } 21657 // match: (Rsh32Ux64 <t> (Rsh32Ux64 x (Const64 [c])) (Const64 [d])) 21658 // cond: !uaddOvf(c,d) 21659 // result: (Rsh32Ux64 x (Const64 <t> [c+d])) 21660 for { 21661 t := v.Type 21662 _ = v.Args[1] 21663 v_0 := v.Args[0] 21664 if v_0.Op != OpRsh32Ux64 { 21665 break 21666 } 21667 _ = v_0.Args[1] 21668 x := v_0.Args[0] 21669 v_0_1 := v_0.Args[1] 21670 if v_0_1.Op != OpConst64 { 21671 break 21672 } 21673 c := v_0_1.AuxInt 21674 v_1 := v.Args[1] 21675 if v_1.Op != OpConst64 { 21676 break 21677 } 21678 d := v_1.AuxInt 21679 if !(!uaddOvf(c, d)) { 21680 break 21681 } 21682 v.reset(OpRsh32Ux64) 21683 v.AddArg(x) 21684 v0 := b.NewValue0(v.Pos, OpConst64, t) 21685 v0.AuxInt = c + d 21686 v.AddArg(v0) 21687 return true 21688 } 21689 // match: (Rsh32Ux64 (Lsh32x64 (Rsh32Ux64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 21690 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 21691 // result: (Rsh32Ux64 x (Const64 <typ.UInt64> [c1-c2+c3])) 21692 for { 21693 _ = v.Args[1] 21694 v_0 := v.Args[0] 21695 if v_0.Op != OpLsh32x64 { 21696 break 21697 } 21698 _ = v_0.Args[1] 21699 v_0_0 := v_0.Args[0] 21700 if v_0_0.Op != OpRsh32Ux64 { 21701 break 21702 } 21703 _ = v_0_0.Args[1] 21704 x := v_0_0.Args[0] 21705 v_0_0_1 := v_0_0.Args[1] 21706 if v_0_0_1.Op != OpConst64 { 21707 break 21708 } 21709 c1 := v_0_0_1.AuxInt 21710 v_0_1 := v_0.Args[1] 21711 if v_0_1.Op != OpConst64 { 21712 break 21713 } 21714 c2 := v_0_1.AuxInt 21715 v_1 := v.Args[1] 21716 if v_1.Op != OpConst64 { 21717 break 21718 } 21719 c3 := v_1.AuxInt 21720 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 21721 break 21722 } 21723 v.reset(OpRsh32Ux64) 21724 v.AddArg(x) 21725 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 21726 v0.AuxInt = c1 - c2 + c3 21727 v.AddArg(v0) 21728 return true 21729 } 21730 // match: (Rsh32Ux64 (Lsh32x64 x (Const64 [24])) (Const64 [24])) 21731 // cond: 21732 // result: (ZeroExt8to32 (Trunc32to8 <typ.UInt8> x)) 21733 for { 21734 _ = v.Args[1] 21735 v_0 := v.Args[0] 21736 if v_0.Op != OpLsh32x64 { 21737 break 21738 } 21739 _ = v_0.Args[1] 21740 x := v_0.Args[0] 21741 v_0_1 := v_0.Args[1] 21742 if v_0_1.Op != OpConst64 { 21743 break 21744 } 21745 if v_0_1.AuxInt != 24 { 21746 break 21747 } 21748 v_1 := v.Args[1] 21749 if v_1.Op != OpConst64 { 21750 break 21751 } 21752 if v_1.AuxInt != 24 { 21753 break 21754 } 21755 v.reset(OpZeroExt8to32) 21756 v0 := b.NewValue0(v.Pos, OpTrunc32to8, typ.UInt8) 21757 v0.AddArg(x) 21758 v.AddArg(v0) 21759 return true 21760 } 21761 // match: (Rsh32Ux64 (Lsh32x64 x (Const64 [16])) (Const64 [16])) 21762 // cond: 21763 // result: (ZeroExt16to32 (Trunc32to16 <typ.UInt16> x)) 21764 for { 21765 _ = v.Args[1] 21766 v_0 := v.Args[0] 21767 if v_0.Op != OpLsh32x64 { 21768 break 21769 } 21770 _ = v_0.Args[1] 21771 x := v_0.Args[0] 21772 v_0_1 := v_0.Args[1] 21773 if v_0_1.Op != OpConst64 { 21774 break 21775 } 21776 if v_0_1.AuxInt != 16 { 21777 break 21778 } 21779 v_1 := v.Args[1] 21780 if v_1.Op != OpConst64 { 21781 break 21782 } 21783 if v_1.AuxInt != 16 { 21784 break 21785 } 21786 v.reset(OpZeroExt16to32) 21787 v0 := b.NewValue0(v.Pos, OpTrunc32to16, typ.UInt16) 21788 v0.AddArg(x) 21789 v.AddArg(v0) 21790 return true 21791 } 21792 return false 21793 } 21794 func rewriteValuegeneric_OpRsh32Ux8_0(v *Value) bool { 21795 b := v.Block 21796 _ = b 21797 // match: (Rsh32Ux8 <t> x (Const8 [c])) 21798 // cond: 21799 // result: (Rsh32Ux64 x (Const64 <t> [int64(uint8(c))])) 21800 for { 21801 t := v.Type 21802 _ = v.Args[1] 21803 x := v.Args[0] 21804 v_1 := v.Args[1] 21805 if v_1.Op != OpConst8 { 21806 break 21807 } 21808 c := v_1.AuxInt 21809 v.reset(OpRsh32Ux64) 21810 v.AddArg(x) 21811 v0 := b.NewValue0(v.Pos, OpConst64, t) 21812 v0.AuxInt = int64(uint8(c)) 21813 v.AddArg(v0) 21814 return true 21815 } 21816 // match: (Rsh32Ux8 (Const32 [0]) _) 21817 // cond: 21818 // result: (Const32 [0]) 21819 for { 21820 _ = v.Args[1] 21821 v_0 := v.Args[0] 21822 if v_0.Op != OpConst32 { 21823 break 21824 } 21825 if v_0.AuxInt != 0 { 21826 break 21827 } 21828 v.reset(OpConst32) 21829 v.AuxInt = 0 21830 return true 21831 } 21832 return false 21833 } 21834 func rewriteValuegeneric_OpRsh32x16_0(v *Value) bool { 21835 b := v.Block 21836 _ = b 21837 // match: (Rsh32x16 <t> x (Const16 [c])) 21838 // cond: 21839 // result: (Rsh32x64 x (Const64 <t> [int64(uint16(c))])) 21840 for { 21841 t := v.Type 21842 _ = v.Args[1] 21843 x := v.Args[0] 21844 v_1 := v.Args[1] 21845 if v_1.Op != OpConst16 { 21846 break 21847 } 21848 c := v_1.AuxInt 21849 v.reset(OpRsh32x64) 21850 v.AddArg(x) 21851 v0 := b.NewValue0(v.Pos, OpConst64, t) 21852 v0.AuxInt = int64(uint16(c)) 21853 v.AddArg(v0) 21854 return true 21855 } 21856 // match: (Rsh32x16 (Const32 [0]) _) 21857 // cond: 21858 // result: (Const32 [0]) 21859 for { 21860 _ = v.Args[1] 21861 v_0 := v.Args[0] 21862 if v_0.Op != OpConst32 { 21863 break 21864 } 21865 if v_0.AuxInt != 0 { 21866 break 21867 } 21868 v.reset(OpConst32) 21869 v.AuxInt = 0 21870 return true 21871 } 21872 return false 21873 } 21874 func rewriteValuegeneric_OpRsh32x32_0(v *Value) bool { 21875 b := v.Block 21876 _ = b 21877 // match: (Rsh32x32 <t> x (Const32 [c])) 21878 // cond: 21879 // result: (Rsh32x64 x (Const64 <t> [int64(uint32(c))])) 21880 for { 21881 t := v.Type 21882 _ = v.Args[1] 21883 x := v.Args[0] 21884 v_1 := v.Args[1] 21885 if v_1.Op != OpConst32 { 21886 break 21887 } 21888 c := v_1.AuxInt 21889 v.reset(OpRsh32x64) 21890 v.AddArg(x) 21891 v0 := b.NewValue0(v.Pos, OpConst64, t) 21892 v0.AuxInt = int64(uint32(c)) 21893 v.AddArg(v0) 21894 return true 21895 } 21896 // match: (Rsh32x32 (Const32 [0]) _) 21897 // cond: 21898 // result: (Const32 [0]) 21899 for { 21900 _ = v.Args[1] 21901 v_0 := v.Args[0] 21902 if v_0.Op != OpConst32 { 21903 break 21904 } 21905 if v_0.AuxInt != 0 { 21906 break 21907 } 21908 v.reset(OpConst32) 21909 v.AuxInt = 0 21910 return true 21911 } 21912 return false 21913 } 21914 func rewriteValuegeneric_OpRsh32x64_0(v *Value) bool { 21915 b := v.Block 21916 _ = b 21917 typ := &b.Func.Config.Types 21918 _ = typ 21919 // match: (Rsh32x64 (Const32 [c]) (Const64 [d])) 21920 // cond: 21921 // result: (Const32 [int64(int32(c) >> uint64(d))]) 21922 for { 21923 _ = v.Args[1] 21924 v_0 := v.Args[0] 21925 if v_0.Op != OpConst32 { 21926 break 21927 } 21928 c := v_0.AuxInt 21929 v_1 := v.Args[1] 21930 if v_1.Op != OpConst64 { 21931 break 21932 } 21933 d := v_1.AuxInt 21934 v.reset(OpConst32) 21935 v.AuxInt = int64(int32(c) >> uint64(d)) 21936 return true 21937 } 21938 // match: (Rsh32x64 x (Const64 [0])) 21939 // cond: 21940 // result: x 21941 for { 21942 _ = v.Args[1] 21943 x := v.Args[0] 21944 v_1 := v.Args[1] 21945 if v_1.Op != OpConst64 { 21946 break 21947 } 21948 if v_1.AuxInt != 0 { 21949 break 21950 } 21951 v.reset(OpCopy) 21952 v.Type = x.Type 21953 v.AddArg(x) 21954 return true 21955 } 21956 // match: (Rsh32x64 (Const32 [0]) _) 21957 // cond: 21958 // result: (Const32 [0]) 21959 for { 21960 _ = v.Args[1] 21961 v_0 := v.Args[0] 21962 if v_0.Op != OpConst32 { 21963 break 21964 } 21965 if v_0.AuxInt != 0 { 21966 break 21967 } 21968 v.reset(OpConst32) 21969 v.AuxInt = 0 21970 return true 21971 } 21972 // match: (Rsh32x64 <t> (Rsh32x64 x (Const64 [c])) (Const64 [d])) 21973 // cond: !uaddOvf(c,d) 21974 // result: (Rsh32x64 x (Const64 <t> [c+d])) 21975 for { 21976 t := v.Type 21977 _ = v.Args[1] 21978 v_0 := v.Args[0] 21979 if v_0.Op != OpRsh32x64 { 21980 break 21981 } 21982 _ = v_0.Args[1] 21983 x := v_0.Args[0] 21984 v_0_1 := v_0.Args[1] 21985 if v_0_1.Op != OpConst64 { 21986 break 21987 } 21988 c := v_0_1.AuxInt 21989 v_1 := v.Args[1] 21990 if v_1.Op != OpConst64 { 21991 break 21992 } 21993 d := v_1.AuxInt 21994 if !(!uaddOvf(c, d)) { 21995 break 21996 } 21997 v.reset(OpRsh32x64) 21998 v.AddArg(x) 21999 v0 := b.NewValue0(v.Pos, OpConst64, t) 22000 v0.AuxInt = c + d 22001 v.AddArg(v0) 22002 return true 22003 } 22004 // match: (Rsh32x64 (Lsh32x64 x (Const64 [24])) (Const64 [24])) 22005 // cond: 22006 // result: (SignExt8to32 (Trunc32to8 <typ.Int8> x)) 22007 for { 22008 _ = v.Args[1] 22009 v_0 := v.Args[0] 22010 if v_0.Op != OpLsh32x64 { 22011 break 22012 } 22013 _ = v_0.Args[1] 22014 x := v_0.Args[0] 22015 v_0_1 := v_0.Args[1] 22016 if v_0_1.Op != OpConst64 { 22017 break 22018 } 22019 if v_0_1.AuxInt != 24 { 22020 break 22021 } 22022 v_1 := v.Args[1] 22023 if v_1.Op != OpConst64 { 22024 break 22025 } 22026 if v_1.AuxInt != 24 { 22027 break 22028 } 22029 v.reset(OpSignExt8to32) 22030 v0 := b.NewValue0(v.Pos, OpTrunc32to8, typ.Int8) 22031 v0.AddArg(x) 22032 v.AddArg(v0) 22033 return true 22034 } 22035 // match: (Rsh32x64 (Lsh32x64 x (Const64 [16])) (Const64 [16])) 22036 // cond: 22037 // result: (SignExt16to32 (Trunc32to16 <typ.Int16> x)) 22038 for { 22039 _ = v.Args[1] 22040 v_0 := v.Args[0] 22041 if v_0.Op != OpLsh32x64 { 22042 break 22043 } 22044 _ = v_0.Args[1] 22045 x := v_0.Args[0] 22046 v_0_1 := v_0.Args[1] 22047 if v_0_1.Op != OpConst64 { 22048 break 22049 } 22050 if v_0_1.AuxInt != 16 { 22051 break 22052 } 22053 v_1 := v.Args[1] 22054 if v_1.Op != OpConst64 { 22055 break 22056 } 22057 if v_1.AuxInt != 16 { 22058 break 22059 } 22060 v.reset(OpSignExt16to32) 22061 v0 := b.NewValue0(v.Pos, OpTrunc32to16, typ.Int16) 22062 v0.AddArg(x) 22063 v.AddArg(v0) 22064 return true 22065 } 22066 return false 22067 } 22068 func rewriteValuegeneric_OpRsh32x8_0(v *Value) bool { 22069 b := v.Block 22070 _ = b 22071 // match: (Rsh32x8 <t> x (Const8 [c])) 22072 // cond: 22073 // result: (Rsh32x64 x (Const64 <t> [int64(uint8(c))])) 22074 for { 22075 t := v.Type 22076 _ = v.Args[1] 22077 x := v.Args[0] 22078 v_1 := v.Args[1] 22079 if v_1.Op != OpConst8 { 22080 break 22081 } 22082 c := v_1.AuxInt 22083 v.reset(OpRsh32x64) 22084 v.AddArg(x) 22085 v0 := b.NewValue0(v.Pos, OpConst64, t) 22086 v0.AuxInt = int64(uint8(c)) 22087 v.AddArg(v0) 22088 return true 22089 } 22090 // match: (Rsh32x8 (Const32 [0]) _) 22091 // cond: 22092 // result: (Const32 [0]) 22093 for { 22094 _ = v.Args[1] 22095 v_0 := v.Args[0] 22096 if v_0.Op != OpConst32 { 22097 break 22098 } 22099 if v_0.AuxInt != 0 { 22100 break 22101 } 22102 v.reset(OpConst32) 22103 v.AuxInt = 0 22104 return true 22105 } 22106 return false 22107 } 22108 func rewriteValuegeneric_OpRsh64Ux16_0(v *Value) bool { 22109 b := v.Block 22110 _ = b 22111 // match: (Rsh64Ux16 <t> x (Const16 [c])) 22112 // cond: 22113 // result: (Rsh64Ux64 x (Const64 <t> [int64(uint16(c))])) 22114 for { 22115 t := v.Type 22116 _ = v.Args[1] 22117 x := v.Args[0] 22118 v_1 := v.Args[1] 22119 if v_1.Op != OpConst16 { 22120 break 22121 } 22122 c := v_1.AuxInt 22123 v.reset(OpRsh64Ux64) 22124 v.AddArg(x) 22125 v0 := b.NewValue0(v.Pos, OpConst64, t) 22126 v0.AuxInt = int64(uint16(c)) 22127 v.AddArg(v0) 22128 return true 22129 } 22130 // match: (Rsh64Ux16 (Const64 [0]) _) 22131 // cond: 22132 // result: (Const64 [0]) 22133 for { 22134 _ = v.Args[1] 22135 v_0 := v.Args[0] 22136 if v_0.Op != OpConst64 { 22137 break 22138 } 22139 if v_0.AuxInt != 0 { 22140 break 22141 } 22142 v.reset(OpConst64) 22143 v.AuxInt = 0 22144 return true 22145 } 22146 return false 22147 } 22148 func rewriteValuegeneric_OpRsh64Ux32_0(v *Value) bool { 22149 b := v.Block 22150 _ = b 22151 // match: (Rsh64Ux32 <t> x (Const32 [c])) 22152 // cond: 22153 // result: (Rsh64Ux64 x (Const64 <t> [int64(uint32(c))])) 22154 for { 22155 t := v.Type 22156 _ = v.Args[1] 22157 x := v.Args[0] 22158 v_1 := v.Args[1] 22159 if v_1.Op != OpConst32 { 22160 break 22161 } 22162 c := v_1.AuxInt 22163 v.reset(OpRsh64Ux64) 22164 v.AddArg(x) 22165 v0 := b.NewValue0(v.Pos, OpConst64, t) 22166 v0.AuxInt = int64(uint32(c)) 22167 v.AddArg(v0) 22168 return true 22169 } 22170 // match: (Rsh64Ux32 (Const64 [0]) _) 22171 // cond: 22172 // result: (Const64 [0]) 22173 for { 22174 _ = v.Args[1] 22175 v_0 := v.Args[0] 22176 if v_0.Op != OpConst64 { 22177 break 22178 } 22179 if v_0.AuxInt != 0 { 22180 break 22181 } 22182 v.reset(OpConst64) 22183 v.AuxInt = 0 22184 return true 22185 } 22186 return false 22187 } 22188 func rewriteValuegeneric_OpRsh64Ux64_0(v *Value) bool { 22189 b := v.Block 22190 _ = b 22191 typ := &b.Func.Config.Types 22192 _ = typ 22193 // match: (Rsh64Ux64 (Const64 [c]) (Const64 [d])) 22194 // cond: 22195 // result: (Const64 [int64(uint64(c) >> uint64(d))]) 22196 for { 22197 _ = v.Args[1] 22198 v_0 := v.Args[0] 22199 if v_0.Op != OpConst64 { 22200 break 22201 } 22202 c := v_0.AuxInt 22203 v_1 := v.Args[1] 22204 if v_1.Op != OpConst64 { 22205 break 22206 } 22207 d := v_1.AuxInt 22208 v.reset(OpConst64) 22209 v.AuxInt = int64(uint64(c) >> uint64(d)) 22210 return true 22211 } 22212 // match: (Rsh64Ux64 x (Const64 [0])) 22213 // cond: 22214 // result: x 22215 for { 22216 _ = v.Args[1] 22217 x := v.Args[0] 22218 v_1 := v.Args[1] 22219 if v_1.Op != OpConst64 { 22220 break 22221 } 22222 if v_1.AuxInt != 0 { 22223 break 22224 } 22225 v.reset(OpCopy) 22226 v.Type = x.Type 22227 v.AddArg(x) 22228 return true 22229 } 22230 // match: (Rsh64Ux64 (Const64 [0]) _) 22231 // cond: 22232 // result: (Const64 [0]) 22233 for { 22234 _ = v.Args[1] 22235 v_0 := v.Args[0] 22236 if v_0.Op != OpConst64 { 22237 break 22238 } 22239 if v_0.AuxInt != 0 { 22240 break 22241 } 22242 v.reset(OpConst64) 22243 v.AuxInt = 0 22244 return true 22245 } 22246 // match: (Rsh64Ux64 _ (Const64 [c])) 22247 // cond: uint64(c) >= 64 22248 // result: (Const64 [0]) 22249 for { 22250 _ = v.Args[1] 22251 v_1 := v.Args[1] 22252 if v_1.Op != OpConst64 { 22253 break 22254 } 22255 c := v_1.AuxInt 22256 if !(uint64(c) >= 64) { 22257 break 22258 } 22259 v.reset(OpConst64) 22260 v.AuxInt = 0 22261 return true 22262 } 22263 // match: (Rsh64Ux64 <t> (Rsh64Ux64 x (Const64 [c])) (Const64 [d])) 22264 // cond: !uaddOvf(c,d) 22265 // result: (Rsh64Ux64 x (Const64 <t> [c+d])) 22266 for { 22267 t := v.Type 22268 _ = v.Args[1] 22269 v_0 := v.Args[0] 22270 if v_0.Op != OpRsh64Ux64 { 22271 break 22272 } 22273 _ = v_0.Args[1] 22274 x := v_0.Args[0] 22275 v_0_1 := v_0.Args[1] 22276 if v_0_1.Op != OpConst64 { 22277 break 22278 } 22279 c := v_0_1.AuxInt 22280 v_1 := v.Args[1] 22281 if v_1.Op != OpConst64 { 22282 break 22283 } 22284 d := v_1.AuxInt 22285 if !(!uaddOvf(c, d)) { 22286 break 22287 } 22288 v.reset(OpRsh64Ux64) 22289 v.AddArg(x) 22290 v0 := b.NewValue0(v.Pos, OpConst64, t) 22291 v0.AuxInt = c + d 22292 v.AddArg(v0) 22293 return true 22294 } 22295 // match: (Rsh64Ux64 (Lsh64x64 (Rsh64Ux64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 22296 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 22297 // result: (Rsh64Ux64 x (Const64 <typ.UInt64> [c1-c2+c3])) 22298 for { 22299 _ = v.Args[1] 22300 v_0 := v.Args[0] 22301 if v_0.Op != OpLsh64x64 { 22302 break 22303 } 22304 _ = v_0.Args[1] 22305 v_0_0 := v_0.Args[0] 22306 if v_0_0.Op != OpRsh64Ux64 { 22307 break 22308 } 22309 _ = v_0_0.Args[1] 22310 x := v_0_0.Args[0] 22311 v_0_0_1 := v_0_0.Args[1] 22312 if v_0_0_1.Op != OpConst64 { 22313 break 22314 } 22315 c1 := v_0_0_1.AuxInt 22316 v_0_1 := v_0.Args[1] 22317 if v_0_1.Op != OpConst64 { 22318 break 22319 } 22320 c2 := v_0_1.AuxInt 22321 v_1 := v.Args[1] 22322 if v_1.Op != OpConst64 { 22323 break 22324 } 22325 c3 := v_1.AuxInt 22326 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 22327 break 22328 } 22329 v.reset(OpRsh64Ux64) 22330 v.AddArg(x) 22331 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 22332 v0.AuxInt = c1 - c2 + c3 22333 v.AddArg(v0) 22334 return true 22335 } 22336 // match: (Rsh64Ux64 (Lsh64x64 x (Const64 [56])) (Const64 [56])) 22337 // cond: 22338 // result: (ZeroExt8to64 (Trunc64to8 <typ.UInt8> x)) 22339 for { 22340 _ = v.Args[1] 22341 v_0 := v.Args[0] 22342 if v_0.Op != OpLsh64x64 { 22343 break 22344 } 22345 _ = v_0.Args[1] 22346 x := v_0.Args[0] 22347 v_0_1 := v_0.Args[1] 22348 if v_0_1.Op != OpConst64 { 22349 break 22350 } 22351 if v_0_1.AuxInt != 56 { 22352 break 22353 } 22354 v_1 := v.Args[1] 22355 if v_1.Op != OpConst64 { 22356 break 22357 } 22358 if v_1.AuxInt != 56 { 22359 break 22360 } 22361 v.reset(OpZeroExt8to64) 22362 v0 := b.NewValue0(v.Pos, OpTrunc64to8, typ.UInt8) 22363 v0.AddArg(x) 22364 v.AddArg(v0) 22365 return true 22366 } 22367 // match: (Rsh64Ux64 (Lsh64x64 x (Const64 [48])) (Const64 [48])) 22368 // cond: 22369 // result: (ZeroExt16to64 (Trunc64to16 <typ.UInt16> x)) 22370 for { 22371 _ = v.Args[1] 22372 v_0 := v.Args[0] 22373 if v_0.Op != OpLsh64x64 { 22374 break 22375 } 22376 _ = v_0.Args[1] 22377 x := v_0.Args[0] 22378 v_0_1 := v_0.Args[1] 22379 if v_0_1.Op != OpConst64 { 22380 break 22381 } 22382 if v_0_1.AuxInt != 48 { 22383 break 22384 } 22385 v_1 := v.Args[1] 22386 if v_1.Op != OpConst64 { 22387 break 22388 } 22389 if v_1.AuxInt != 48 { 22390 break 22391 } 22392 v.reset(OpZeroExt16to64) 22393 v0 := b.NewValue0(v.Pos, OpTrunc64to16, typ.UInt16) 22394 v0.AddArg(x) 22395 v.AddArg(v0) 22396 return true 22397 } 22398 // match: (Rsh64Ux64 (Lsh64x64 x (Const64 [32])) (Const64 [32])) 22399 // cond: 22400 // result: (ZeroExt32to64 (Trunc64to32 <typ.UInt32> x)) 22401 for { 22402 _ = v.Args[1] 22403 v_0 := v.Args[0] 22404 if v_0.Op != OpLsh64x64 { 22405 break 22406 } 22407 _ = v_0.Args[1] 22408 x := v_0.Args[0] 22409 v_0_1 := v_0.Args[1] 22410 if v_0_1.Op != OpConst64 { 22411 break 22412 } 22413 if v_0_1.AuxInt != 32 { 22414 break 22415 } 22416 v_1 := v.Args[1] 22417 if v_1.Op != OpConst64 { 22418 break 22419 } 22420 if v_1.AuxInt != 32 { 22421 break 22422 } 22423 v.reset(OpZeroExt32to64) 22424 v0 := b.NewValue0(v.Pos, OpTrunc64to32, typ.UInt32) 22425 v0.AddArg(x) 22426 v.AddArg(v0) 22427 return true 22428 } 22429 return false 22430 } 22431 func rewriteValuegeneric_OpRsh64Ux8_0(v *Value) bool { 22432 b := v.Block 22433 _ = b 22434 // match: (Rsh64Ux8 <t> x (Const8 [c])) 22435 // cond: 22436 // result: (Rsh64Ux64 x (Const64 <t> [int64(uint8(c))])) 22437 for { 22438 t := v.Type 22439 _ = v.Args[1] 22440 x := v.Args[0] 22441 v_1 := v.Args[1] 22442 if v_1.Op != OpConst8 { 22443 break 22444 } 22445 c := v_1.AuxInt 22446 v.reset(OpRsh64Ux64) 22447 v.AddArg(x) 22448 v0 := b.NewValue0(v.Pos, OpConst64, t) 22449 v0.AuxInt = int64(uint8(c)) 22450 v.AddArg(v0) 22451 return true 22452 } 22453 // match: (Rsh64Ux8 (Const64 [0]) _) 22454 // cond: 22455 // result: (Const64 [0]) 22456 for { 22457 _ = v.Args[1] 22458 v_0 := v.Args[0] 22459 if v_0.Op != OpConst64 { 22460 break 22461 } 22462 if v_0.AuxInt != 0 { 22463 break 22464 } 22465 v.reset(OpConst64) 22466 v.AuxInt = 0 22467 return true 22468 } 22469 return false 22470 } 22471 func rewriteValuegeneric_OpRsh64x16_0(v *Value) bool { 22472 b := v.Block 22473 _ = b 22474 // match: (Rsh64x16 <t> x (Const16 [c])) 22475 // cond: 22476 // result: (Rsh64x64 x (Const64 <t> [int64(uint16(c))])) 22477 for { 22478 t := v.Type 22479 _ = v.Args[1] 22480 x := v.Args[0] 22481 v_1 := v.Args[1] 22482 if v_1.Op != OpConst16 { 22483 break 22484 } 22485 c := v_1.AuxInt 22486 v.reset(OpRsh64x64) 22487 v.AddArg(x) 22488 v0 := b.NewValue0(v.Pos, OpConst64, t) 22489 v0.AuxInt = int64(uint16(c)) 22490 v.AddArg(v0) 22491 return true 22492 } 22493 // match: (Rsh64x16 (Const64 [0]) _) 22494 // cond: 22495 // result: (Const64 [0]) 22496 for { 22497 _ = v.Args[1] 22498 v_0 := v.Args[0] 22499 if v_0.Op != OpConst64 { 22500 break 22501 } 22502 if v_0.AuxInt != 0 { 22503 break 22504 } 22505 v.reset(OpConst64) 22506 v.AuxInt = 0 22507 return true 22508 } 22509 return false 22510 } 22511 func rewriteValuegeneric_OpRsh64x32_0(v *Value) bool { 22512 b := v.Block 22513 _ = b 22514 // match: (Rsh64x32 <t> x (Const32 [c])) 22515 // cond: 22516 // result: (Rsh64x64 x (Const64 <t> [int64(uint32(c))])) 22517 for { 22518 t := v.Type 22519 _ = v.Args[1] 22520 x := v.Args[0] 22521 v_1 := v.Args[1] 22522 if v_1.Op != OpConst32 { 22523 break 22524 } 22525 c := v_1.AuxInt 22526 v.reset(OpRsh64x64) 22527 v.AddArg(x) 22528 v0 := b.NewValue0(v.Pos, OpConst64, t) 22529 v0.AuxInt = int64(uint32(c)) 22530 v.AddArg(v0) 22531 return true 22532 } 22533 // match: (Rsh64x32 (Const64 [0]) _) 22534 // cond: 22535 // result: (Const64 [0]) 22536 for { 22537 _ = v.Args[1] 22538 v_0 := v.Args[0] 22539 if v_0.Op != OpConst64 { 22540 break 22541 } 22542 if v_0.AuxInt != 0 { 22543 break 22544 } 22545 v.reset(OpConst64) 22546 v.AuxInt = 0 22547 return true 22548 } 22549 return false 22550 } 22551 func rewriteValuegeneric_OpRsh64x64_0(v *Value) bool { 22552 b := v.Block 22553 _ = b 22554 typ := &b.Func.Config.Types 22555 _ = typ 22556 // match: (Rsh64x64 (Const64 [c]) (Const64 [d])) 22557 // cond: 22558 // result: (Const64 [c >> uint64(d)]) 22559 for { 22560 _ = v.Args[1] 22561 v_0 := v.Args[0] 22562 if v_0.Op != OpConst64 { 22563 break 22564 } 22565 c := v_0.AuxInt 22566 v_1 := v.Args[1] 22567 if v_1.Op != OpConst64 { 22568 break 22569 } 22570 d := v_1.AuxInt 22571 v.reset(OpConst64) 22572 v.AuxInt = c >> uint64(d) 22573 return true 22574 } 22575 // match: (Rsh64x64 x (Const64 [0])) 22576 // cond: 22577 // result: x 22578 for { 22579 _ = v.Args[1] 22580 x := v.Args[0] 22581 v_1 := v.Args[1] 22582 if v_1.Op != OpConst64 { 22583 break 22584 } 22585 if v_1.AuxInt != 0 { 22586 break 22587 } 22588 v.reset(OpCopy) 22589 v.Type = x.Type 22590 v.AddArg(x) 22591 return true 22592 } 22593 // match: (Rsh64x64 (Const64 [0]) _) 22594 // cond: 22595 // result: (Const64 [0]) 22596 for { 22597 _ = v.Args[1] 22598 v_0 := v.Args[0] 22599 if v_0.Op != OpConst64 { 22600 break 22601 } 22602 if v_0.AuxInt != 0 { 22603 break 22604 } 22605 v.reset(OpConst64) 22606 v.AuxInt = 0 22607 return true 22608 } 22609 // match: (Rsh64x64 <t> (Rsh64x64 x (Const64 [c])) (Const64 [d])) 22610 // cond: !uaddOvf(c,d) 22611 // result: (Rsh64x64 x (Const64 <t> [c+d])) 22612 for { 22613 t := v.Type 22614 _ = v.Args[1] 22615 v_0 := v.Args[0] 22616 if v_0.Op != OpRsh64x64 { 22617 break 22618 } 22619 _ = v_0.Args[1] 22620 x := v_0.Args[0] 22621 v_0_1 := v_0.Args[1] 22622 if v_0_1.Op != OpConst64 { 22623 break 22624 } 22625 c := v_0_1.AuxInt 22626 v_1 := v.Args[1] 22627 if v_1.Op != OpConst64 { 22628 break 22629 } 22630 d := v_1.AuxInt 22631 if !(!uaddOvf(c, d)) { 22632 break 22633 } 22634 v.reset(OpRsh64x64) 22635 v.AddArg(x) 22636 v0 := b.NewValue0(v.Pos, OpConst64, t) 22637 v0.AuxInt = c + d 22638 v.AddArg(v0) 22639 return true 22640 } 22641 // match: (Rsh64x64 (Lsh64x64 x (Const64 [56])) (Const64 [56])) 22642 // cond: 22643 // result: (SignExt8to64 (Trunc64to8 <typ.Int8> x)) 22644 for { 22645 _ = v.Args[1] 22646 v_0 := v.Args[0] 22647 if v_0.Op != OpLsh64x64 { 22648 break 22649 } 22650 _ = v_0.Args[1] 22651 x := v_0.Args[0] 22652 v_0_1 := v_0.Args[1] 22653 if v_0_1.Op != OpConst64 { 22654 break 22655 } 22656 if v_0_1.AuxInt != 56 { 22657 break 22658 } 22659 v_1 := v.Args[1] 22660 if v_1.Op != OpConst64 { 22661 break 22662 } 22663 if v_1.AuxInt != 56 { 22664 break 22665 } 22666 v.reset(OpSignExt8to64) 22667 v0 := b.NewValue0(v.Pos, OpTrunc64to8, typ.Int8) 22668 v0.AddArg(x) 22669 v.AddArg(v0) 22670 return true 22671 } 22672 // match: (Rsh64x64 (Lsh64x64 x (Const64 [48])) (Const64 [48])) 22673 // cond: 22674 // result: (SignExt16to64 (Trunc64to16 <typ.Int16> x)) 22675 for { 22676 _ = v.Args[1] 22677 v_0 := v.Args[0] 22678 if v_0.Op != OpLsh64x64 { 22679 break 22680 } 22681 _ = v_0.Args[1] 22682 x := v_0.Args[0] 22683 v_0_1 := v_0.Args[1] 22684 if v_0_1.Op != OpConst64 { 22685 break 22686 } 22687 if v_0_1.AuxInt != 48 { 22688 break 22689 } 22690 v_1 := v.Args[1] 22691 if v_1.Op != OpConst64 { 22692 break 22693 } 22694 if v_1.AuxInt != 48 { 22695 break 22696 } 22697 v.reset(OpSignExt16to64) 22698 v0 := b.NewValue0(v.Pos, OpTrunc64to16, typ.Int16) 22699 v0.AddArg(x) 22700 v.AddArg(v0) 22701 return true 22702 } 22703 // match: (Rsh64x64 (Lsh64x64 x (Const64 [32])) (Const64 [32])) 22704 // cond: 22705 // result: (SignExt32to64 (Trunc64to32 <typ.Int32> x)) 22706 for { 22707 _ = v.Args[1] 22708 v_0 := v.Args[0] 22709 if v_0.Op != OpLsh64x64 { 22710 break 22711 } 22712 _ = v_0.Args[1] 22713 x := v_0.Args[0] 22714 v_0_1 := v_0.Args[1] 22715 if v_0_1.Op != OpConst64 { 22716 break 22717 } 22718 if v_0_1.AuxInt != 32 { 22719 break 22720 } 22721 v_1 := v.Args[1] 22722 if v_1.Op != OpConst64 { 22723 break 22724 } 22725 if v_1.AuxInt != 32 { 22726 break 22727 } 22728 v.reset(OpSignExt32to64) 22729 v0 := b.NewValue0(v.Pos, OpTrunc64to32, typ.Int32) 22730 v0.AddArg(x) 22731 v.AddArg(v0) 22732 return true 22733 } 22734 return false 22735 } 22736 func rewriteValuegeneric_OpRsh64x8_0(v *Value) bool { 22737 b := v.Block 22738 _ = b 22739 // match: (Rsh64x8 <t> x (Const8 [c])) 22740 // cond: 22741 // result: (Rsh64x64 x (Const64 <t> [int64(uint8(c))])) 22742 for { 22743 t := v.Type 22744 _ = v.Args[1] 22745 x := v.Args[0] 22746 v_1 := v.Args[1] 22747 if v_1.Op != OpConst8 { 22748 break 22749 } 22750 c := v_1.AuxInt 22751 v.reset(OpRsh64x64) 22752 v.AddArg(x) 22753 v0 := b.NewValue0(v.Pos, OpConst64, t) 22754 v0.AuxInt = int64(uint8(c)) 22755 v.AddArg(v0) 22756 return true 22757 } 22758 // match: (Rsh64x8 (Const64 [0]) _) 22759 // cond: 22760 // result: (Const64 [0]) 22761 for { 22762 _ = v.Args[1] 22763 v_0 := v.Args[0] 22764 if v_0.Op != OpConst64 { 22765 break 22766 } 22767 if v_0.AuxInt != 0 { 22768 break 22769 } 22770 v.reset(OpConst64) 22771 v.AuxInt = 0 22772 return true 22773 } 22774 return false 22775 } 22776 func rewriteValuegeneric_OpRsh8Ux16_0(v *Value) bool { 22777 b := v.Block 22778 _ = b 22779 // match: (Rsh8Ux16 <t> x (Const16 [c])) 22780 // cond: 22781 // result: (Rsh8Ux64 x (Const64 <t> [int64(uint16(c))])) 22782 for { 22783 t := v.Type 22784 _ = v.Args[1] 22785 x := v.Args[0] 22786 v_1 := v.Args[1] 22787 if v_1.Op != OpConst16 { 22788 break 22789 } 22790 c := v_1.AuxInt 22791 v.reset(OpRsh8Ux64) 22792 v.AddArg(x) 22793 v0 := b.NewValue0(v.Pos, OpConst64, t) 22794 v0.AuxInt = int64(uint16(c)) 22795 v.AddArg(v0) 22796 return true 22797 } 22798 // match: (Rsh8Ux16 (Const8 [0]) _) 22799 // cond: 22800 // result: (Const8 [0]) 22801 for { 22802 _ = v.Args[1] 22803 v_0 := v.Args[0] 22804 if v_0.Op != OpConst8 { 22805 break 22806 } 22807 if v_0.AuxInt != 0 { 22808 break 22809 } 22810 v.reset(OpConst8) 22811 v.AuxInt = 0 22812 return true 22813 } 22814 return false 22815 } 22816 func rewriteValuegeneric_OpRsh8Ux32_0(v *Value) bool { 22817 b := v.Block 22818 _ = b 22819 // match: (Rsh8Ux32 <t> x (Const32 [c])) 22820 // cond: 22821 // result: (Rsh8Ux64 x (Const64 <t> [int64(uint32(c))])) 22822 for { 22823 t := v.Type 22824 _ = v.Args[1] 22825 x := v.Args[0] 22826 v_1 := v.Args[1] 22827 if v_1.Op != OpConst32 { 22828 break 22829 } 22830 c := v_1.AuxInt 22831 v.reset(OpRsh8Ux64) 22832 v.AddArg(x) 22833 v0 := b.NewValue0(v.Pos, OpConst64, t) 22834 v0.AuxInt = int64(uint32(c)) 22835 v.AddArg(v0) 22836 return true 22837 } 22838 // match: (Rsh8Ux32 (Const8 [0]) _) 22839 // cond: 22840 // result: (Const8 [0]) 22841 for { 22842 _ = v.Args[1] 22843 v_0 := v.Args[0] 22844 if v_0.Op != OpConst8 { 22845 break 22846 } 22847 if v_0.AuxInt != 0 { 22848 break 22849 } 22850 v.reset(OpConst8) 22851 v.AuxInt = 0 22852 return true 22853 } 22854 return false 22855 } 22856 func rewriteValuegeneric_OpRsh8Ux64_0(v *Value) bool { 22857 b := v.Block 22858 _ = b 22859 typ := &b.Func.Config.Types 22860 _ = typ 22861 // match: (Rsh8Ux64 (Const8 [c]) (Const64 [d])) 22862 // cond: 22863 // result: (Const8 [int64(int8(uint8(c) >> uint64(d)))]) 22864 for { 22865 _ = v.Args[1] 22866 v_0 := v.Args[0] 22867 if v_0.Op != OpConst8 { 22868 break 22869 } 22870 c := v_0.AuxInt 22871 v_1 := v.Args[1] 22872 if v_1.Op != OpConst64 { 22873 break 22874 } 22875 d := v_1.AuxInt 22876 v.reset(OpConst8) 22877 v.AuxInt = int64(int8(uint8(c) >> uint64(d))) 22878 return true 22879 } 22880 // match: (Rsh8Ux64 x (Const64 [0])) 22881 // cond: 22882 // result: x 22883 for { 22884 _ = v.Args[1] 22885 x := v.Args[0] 22886 v_1 := v.Args[1] 22887 if v_1.Op != OpConst64 { 22888 break 22889 } 22890 if v_1.AuxInt != 0 { 22891 break 22892 } 22893 v.reset(OpCopy) 22894 v.Type = x.Type 22895 v.AddArg(x) 22896 return true 22897 } 22898 // match: (Rsh8Ux64 (Const8 [0]) _) 22899 // cond: 22900 // result: (Const8 [0]) 22901 for { 22902 _ = v.Args[1] 22903 v_0 := v.Args[0] 22904 if v_0.Op != OpConst8 { 22905 break 22906 } 22907 if v_0.AuxInt != 0 { 22908 break 22909 } 22910 v.reset(OpConst8) 22911 v.AuxInt = 0 22912 return true 22913 } 22914 // match: (Rsh8Ux64 _ (Const64 [c])) 22915 // cond: uint64(c) >= 8 22916 // result: (Const8 [0]) 22917 for { 22918 _ = v.Args[1] 22919 v_1 := v.Args[1] 22920 if v_1.Op != OpConst64 { 22921 break 22922 } 22923 c := v_1.AuxInt 22924 if !(uint64(c) >= 8) { 22925 break 22926 } 22927 v.reset(OpConst8) 22928 v.AuxInt = 0 22929 return true 22930 } 22931 // match: (Rsh8Ux64 <t> (Rsh8Ux64 x (Const64 [c])) (Const64 [d])) 22932 // cond: !uaddOvf(c,d) 22933 // result: (Rsh8Ux64 x (Const64 <t> [c+d])) 22934 for { 22935 t := v.Type 22936 _ = v.Args[1] 22937 v_0 := v.Args[0] 22938 if v_0.Op != OpRsh8Ux64 { 22939 break 22940 } 22941 _ = v_0.Args[1] 22942 x := v_0.Args[0] 22943 v_0_1 := v_0.Args[1] 22944 if v_0_1.Op != OpConst64 { 22945 break 22946 } 22947 c := v_0_1.AuxInt 22948 v_1 := v.Args[1] 22949 if v_1.Op != OpConst64 { 22950 break 22951 } 22952 d := v_1.AuxInt 22953 if !(!uaddOvf(c, d)) { 22954 break 22955 } 22956 v.reset(OpRsh8Ux64) 22957 v.AddArg(x) 22958 v0 := b.NewValue0(v.Pos, OpConst64, t) 22959 v0.AuxInt = c + d 22960 v.AddArg(v0) 22961 return true 22962 } 22963 // match: (Rsh8Ux64 (Lsh8x64 (Rsh8Ux64 x (Const64 [c1])) (Const64 [c2])) (Const64 [c3])) 22964 // cond: uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3) 22965 // result: (Rsh8Ux64 x (Const64 <typ.UInt64> [c1-c2+c3])) 22966 for { 22967 _ = v.Args[1] 22968 v_0 := v.Args[0] 22969 if v_0.Op != OpLsh8x64 { 22970 break 22971 } 22972 _ = v_0.Args[1] 22973 v_0_0 := v_0.Args[0] 22974 if v_0_0.Op != OpRsh8Ux64 { 22975 break 22976 } 22977 _ = v_0_0.Args[1] 22978 x := v_0_0.Args[0] 22979 v_0_0_1 := v_0_0.Args[1] 22980 if v_0_0_1.Op != OpConst64 { 22981 break 22982 } 22983 c1 := v_0_0_1.AuxInt 22984 v_0_1 := v_0.Args[1] 22985 if v_0_1.Op != OpConst64 { 22986 break 22987 } 22988 c2 := v_0_1.AuxInt 22989 v_1 := v.Args[1] 22990 if v_1.Op != OpConst64 { 22991 break 22992 } 22993 c3 := v_1.AuxInt 22994 if !(uint64(c1) >= uint64(c2) && uint64(c3) >= uint64(c2) && !uaddOvf(c1-c2, c3)) { 22995 break 22996 } 22997 v.reset(OpRsh8Ux64) 22998 v.AddArg(x) 22999 v0 := b.NewValue0(v.Pos, OpConst64, typ.UInt64) 23000 v0.AuxInt = c1 - c2 + c3 23001 v.AddArg(v0) 23002 return true 23003 } 23004 return false 23005 } 23006 func rewriteValuegeneric_OpRsh8Ux8_0(v *Value) bool { 23007 b := v.Block 23008 _ = b 23009 // match: (Rsh8Ux8 <t> x (Const8 [c])) 23010 // cond: 23011 // result: (Rsh8Ux64 x (Const64 <t> [int64(uint8(c))])) 23012 for { 23013 t := v.Type 23014 _ = v.Args[1] 23015 x := v.Args[0] 23016 v_1 := v.Args[1] 23017 if v_1.Op != OpConst8 { 23018 break 23019 } 23020 c := v_1.AuxInt 23021 v.reset(OpRsh8Ux64) 23022 v.AddArg(x) 23023 v0 := b.NewValue0(v.Pos, OpConst64, t) 23024 v0.AuxInt = int64(uint8(c)) 23025 v.AddArg(v0) 23026 return true 23027 } 23028 // match: (Rsh8Ux8 (Const8 [0]) _) 23029 // cond: 23030 // result: (Const8 [0]) 23031 for { 23032 _ = v.Args[1] 23033 v_0 := v.Args[0] 23034 if v_0.Op != OpConst8 { 23035 break 23036 } 23037 if v_0.AuxInt != 0 { 23038 break 23039 } 23040 v.reset(OpConst8) 23041 v.AuxInt = 0 23042 return true 23043 } 23044 return false 23045 } 23046 func rewriteValuegeneric_OpRsh8x16_0(v *Value) bool { 23047 b := v.Block 23048 _ = b 23049 // match: (Rsh8x16 <t> x (Const16 [c])) 23050 // cond: 23051 // result: (Rsh8x64 x (Const64 <t> [int64(uint16(c))])) 23052 for { 23053 t := v.Type 23054 _ = v.Args[1] 23055 x := v.Args[0] 23056 v_1 := v.Args[1] 23057 if v_1.Op != OpConst16 { 23058 break 23059 } 23060 c := v_1.AuxInt 23061 v.reset(OpRsh8x64) 23062 v.AddArg(x) 23063 v0 := b.NewValue0(v.Pos, OpConst64, t) 23064 v0.AuxInt = int64(uint16(c)) 23065 v.AddArg(v0) 23066 return true 23067 } 23068 // match: (Rsh8x16 (Const8 [0]) _) 23069 // cond: 23070 // result: (Const8 [0]) 23071 for { 23072 _ = v.Args[1] 23073 v_0 := v.Args[0] 23074 if v_0.Op != OpConst8 { 23075 break 23076 } 23077 if v_0.AuxInt != 0 { 23078 break 23079 } 23080 v.reset(OpConst8) 23081 v.AuxInt = 0 23082 return true 23083 } 23084 return false 23085 } 23086 func rewriteValuegeneric_OpRsh8x32_0(v *Value) bool { 23087 b := v.Block 23088 _ = b 23089 // match: (Rsh8x32 <t> x (Const32 [c])) 23090 // cond: 23091 // result: (Rsh8x64 x (Const64 <t> [int64(uint32(c))])) 23092 for { 23093 t := v.Type 23094 _ = v.Args[1] 23095 x := v.Args[0] 23096 v_1 := v.Args[1] 23097 if v_1.Op != OpConst32 { 23098 break 23099 } 23100 c := v_1.AuxInt 23101 v.reset(OpRsh8x64) 23102 v.AddArg(x) 23103 v0 := b.NewValue0(v.Pos, OpConst64, t) 23104 v0.AuxInt = int64(uint32(c)) 23105 v.AddArg(v0) 23106 return true 23107 } 23108 // match: (Rsh8x32 (Const8 [0]) _) 23109 // cond: 23110 // result: (Const8 [0]) 23111 for { 23112 _ = v.Args[1] 23113 v_0 := v.Args[0] 23114 if v_0.Op != OpConst8 { 23115 break 23116 } 23117 if v_0.AuxInt != 0 { 23118 break 23119 } 23120 v.reset(OpConst8) 23121 v.AuxInt = 0 23122 return true 23123 } 23124 return false 23125 } 23126 func rewriteValuegeneric_OpRsh8x64_0(v *Value) bool { 23127 b := v.Block 23128 _ = b 23129 // match: (Rsh8x64 (Const8 [c]) (Const64 [d])) 23130 // cond: 23131 // result: (Const8 [int64(int8(c) >> uint64(d))]) 23132 for { 23133 _ = v.Args[1] 23134 v_0 := v.Args[0] 23135 if v_0.Op != OpConst8 { 23136 break 23137 } 23138 c := v_0.AuxInt 23139 v_1 := v.Args[1] 23140 if v_1.Op != OpConst64 { 23141 break 23142 } 23143 d := v_1.AuxInt 23144 v.reset(OpConst8) 23145 v.AuxInt = int64(int8(c) >> uint64(d)) 23146 return true 23147 } 23148 // match: (Rsh8x64 x (Const64 [0])) 23149 // cond: 23150 // result: x 23151 for { 23152 _ = v.Args[1] 23153 x := v.Args[0] 23154 v_1 := v.Args[1] 23155 if v_1.Op != OpConst64 { 23156 break 23157 } 23158 if v_1.AuxInt != 0 { 23159 break 23160 } 23161 v.reset(OpCopy) 23162 v.Type = x.Type 23163 v.AddArg(x) 23164 return true 23165 } 23166 // match: (Rsh8x64 (Const8 [0]) _) 23167 // cond: 23168 // result: (Const8 [0]) 23169 for { 23170 _ = v.Args[1] 23171 v_0 := v.Args[0] 23172 if v_0.Op != OpConst8 { 23173 break 23174 } 23175 if v_0.AuxInt != 0 { 23176 break 23177 } 23178 v.reset(OpConst8) 23179 v.AuxInt = 0 23180 return true 23181 } 23182 // match: (Rsh8x64 <t> (Rsh8x64 x (Const64 [c])) (Const64 [d])) 23183 // cond: !uaddOvf(c,d) 23184 // result: (Rsh8x64 x (Const64 <t> [c+d])) 23185 for { 23186 t := v.Type 23187 _ = v.Args[1] 23188 v_0 := v.Args[0] 23189 if v_0.Op != OpRsh8x64 { 23190 break 23191 } 23192 _ = v_0.Args[1] 23193 x := v_0.Args[0] 23194 v_0_1 := v_0.Args[1] 23195 if v_0_1.Op != OpConst64 { 23196 break 23197 } 23198 c := v_0_1.AuxInt 23199 v_1 := v.Args[1] 23200 if v_1.Op != OpConst64 { 23201 break 23202 } 23203 d := v_1.AuxInt 23204 if !(!uaddOvf(c, d)) { 23205 break 23206 } 23207 v.reset(OpRsh8x64) 23208 v.AddArg(x) 23209 v0 := b.NewValue0(v.Pos, OpConst64, t) 23210 v0.AuxInt = c + d 23211 v.AddArg(v0) 23212 return true 23213 } 23214 return false 23215 } 23216 func rewriteValuegeneric_OpRsh8x8_0(v *Value) bool { 23217 b := v.Block 23218 _ = b 23219 // match: (Rsh8x8 <t> x (Const8 [c])) 23220 // cond: 23221 // result: (Rsh8x64 x (Const64 <t> [int64(uint8(c))])) 23222 for { 23223 t := v.Type 23224 _ = v.Args[1] 23225 x := v.Args[0] 23226 v_1 := v.Args[1] 23227 if v_1.Op != OpConst8 { 23228 break 23229 } 23230 c := v_1.AuxInt 23231 v.reset(OpRsh8x64) 23232 v.AddArg(x) 23233 v0 := b.NewValue0(v.Pos, OpConst64, t) 23234 v0.AuxInt = int64(uint8(c)) 23235 v.AddArg(v0) 23236 return true 23237 } 23238 // match: (Rsh8x8 (Const8 [0]) _) 23239 // cond: 23240 // result: (Const8 [0]) 23241 for { 23242 _ = v.Args[1] 23243 v_0 := v.Args[0] 23244 if v_0.Op != OpConst8 { 23245 break 23246 } 23247 if v_0.AuxInt != 0 { 23248 break 23249 } 23250 v.reset(OpConst8) 23251 v.AuxInt = 0 23252 return true 23253 } 23254 return false 23255 } 23256 func rewriteValuegeneric_OpSignExt16to32_0(v *Value) bool { 23257 // match: (SignExt16to32 (Const16 [c])) 23258 // cond: 23259 // result: (Const32 [int64( int16(c))]) 23260 for { 23261 v_0 := v.Args[0] 23262 if v_0.Op != OpConst16 { 23263 break 23264 } 23265 c := v_0.AuxInt 23266 v.reset(OpConst32) 23267 v.AuxInt = int64(int16(c)) 23268 return true 23269 } 23270 // match: (SignExt16to32 (Trunc32to16 x:(Rsh32x64 _ (Const64 [s])))) 23271 // cond: s >= 16 23272 // result: x 23273 for { 23274 v_0 := v.Args[0] 23275 if v_0.Op != OpTrunc32to16 { 23276 break 23277 } 23278 x := v_0.Args[0] 23279 if x.Op != OpRsh32x64 { 23280 break 23281 } 23282 _ = x.Args[1] 23283 x_1 := x.Args[1] 23284 if x_1.Op != OpConst64 { 23285 break 23286 } 23287 s := x_1.AuxInt 23288 if !(s >= 16) { 23289 break 23290 } 23291 v.reset(OpCopy) 23292 v.Type = x.Type 23293 v.AddArg(x) 23294 return true 23295 } 23296 return false 23297 } 23298 func rewriteValuegeneric_OpSignExt16to64_0(v *Value) bool { 23299 // match: (SignExt16to64 (Const16 [c])) 23300 // cond: 23301 // result: (Const64 [int64( int16(c))]) 23302 for { 23303 v_0 := v.Args[0] 23304 if v_0.Op != OpConst16 { 23305 break 23306 } 23307 c := v_0.AuxInt 23308 v.reset(OpConst64) 23309 v.AuxInt = int64(int16(c)) 23310 return true 23311 } 23312 // match: (SignExt16to64 (Trunc64to16 x:(Rsh64x64 _ (Const64 [s])))) 23313 // cond: s >= 48 23314 // result: x 23315 for { 23316 v_0 := v.Args[0] 23317 if v_0.Op != OpTrunc64to16 { 23318 break 23319 } 23320 x := v_0.Args[0] 23321 if x.Op != OpRsh64x64 { 23322 break 23323 } 23324 _ = x.Args[1] 23325 x_1 := x.Args[1] 23326 if x_1.Op != OpConst64 { 23327 break 23328 } 23329 s := x_1.AuxInt 23330 if !(s >= 48) { 23331 break 23332 } 23333 v.reset(OpCopy) 23334 v.Type = x.Type 23335 v.AddArg(x) 23336 return true 23337 } 23338 return false 23339 } 23340 func rewriteValuegeneric_OpSignExt32to64_0(v *Value) bool { 23341 // match: (SignExt32to64 (Const32 [c])) 23342 // cond: 23343 // result: (Const64 [int64( int32(c))]) 23344 for { 23345 v_0 := v.Args[0] 23346 if v_0.Op != OpConst32 { 23347 break 23348 } 23349 c := v_0.AuxInt 23350 v.reset(OpConst64) 23351 v.AuxInt = int64(int32(c)) 23352 return true 23353 } 23354 // match: (SignExt32to64 (Trunc64to32 x:(Rsh64x64 _ (Const64 [s])))) 23355 // cond: s >= 32 23356 // result: x 23357 for { 23358 v_0 := v.Args[0] 23359 if v_0.Op != OpTrunc64to32 { 23360 break 23361 } 23362 x := v_0.Args[0] 23363 if x.Op != OpRsh64x64 { 23364 break 23365 } 23366 _ = x.Args[1] 23367 x_1 := x.Args[1] 23368 if x_1.Op != OpConst64 { 23369 break 23370 } 23371 s := x_1.AuxInt 23372 if !(s >= 32) { 23373 break 23374 } 23375 v.reset(OpCopy) 23376 v.Type = x.Type 23377 v.AddArg(x) 23378 return true 23379 } 23380 return false 23381 } 23382 func rewriteValuegeneric_OpSignExt8to16_0(v *Value) bool { 23383 // match: (SignExt8to16 (Const8 [c])) 23384 // cond: 23385 // result: (Const16 [int64( int8(c))]) 23386 for { 23387 v_0 := v.Args[0] 23388 if v_0.Op != OpConst8 { 23389 break 23390 } 23391 c := v_0.AuxInt 23392 v.reset(OpConst16) 23393 v.AuxInt = int64(int8(c)) 23394 return true 23395 } 23396 // match: (SignExt8to16 (Trunc16to8 x:(Rsh16x64 _ (Const64 [s])))) 23397 // cond: s >= 8 23398 // result: x 23399 for { 23400 v_0 := v.Args[0] 23401 if v_0.Op != OpTrunc16to8 { 23402 break 23403 } 23404 x := v_0.Args[0] 23405 if x.Op != OpRsh16x64 { 23406 break 23407 } 23408 _ = x.Args[1] 23409 x_1 := x.Args[1] 23410 if x_1.Op != OpConst64 { 23411 break 23412 } 23413 s := x_1.AuxInt 23414 if !(s >= 8) { 23415 break 23416 } 23417 v.reset(OpCopy) 23418 v.Type = x.Type 23419 v.AddArg(x) 23420 return true 23421 } 23422 return false 23423 } 23424 func rewriteValuegeneric_OpSignExt8to32_0(v *Value) bool { 23425 // match: (SignExt8to32 (Const8 [c])) 23426 // cond: 23427 // result: (Const32 [int64( int8(c))]) 23428 for { 23429 v_0 := v.Args[0] 23430 if v_0.Op != OpConst8 { 23431 break 23432 } 23433 c := v_0.AuxInt 23434 v.reset(OpConst32) 23435 v.AuxInt = int64(int8(c)) 23436 return true 23437 } 23438 // match: (SignExt8to32 (Trunc32to8 x:(Rsh32x64 _ (Const64 [s])))) 23439 // cond: s >= 24 23440 // result: x 23441 for { 23442 v_0 := v.Args[0] 23443 if v_0.Op != OpTrunc32to8 { 23444 break 23445 } 23446 x := v_0.Args[0] 23447 if x.Op != OpRsh32x64 { 23448 break 23449 } 23450 _ = x.Args[1] 23451 x_1 := x.Args[1] 23452 if x_1.Op != OpConst64 { 23453 break 23454 } 23455 s := x_1.AuxInt 23456 if !(s >= 24) { 23457 break 23458 } 23459 v.reset(OpCopy) 23460 v.Type = x.Type 23461 v.AddArg(x) 23462 return true 23463 } 23464 return false 23465 } 23466 func rewriteValuegeneric_OpSignExt8to64_0(v *Value) bool { 23467 // match: (SignExt8to64 (Const8 [c])) 23468 // cond: 23469 // result: (Const64 [int64( int8(c))]) 23470 for { 23471 v_0 := v.Args[0] 23472 if v_0.Op != OpConst8 { 23473 break 23474 } 23475 c := v_0.AuxInt 23476 v.reset(OpConst64) 23477 v.AuxInt = int64(int8(c)) 23478 return true 23479 } 23480 // match: (SignExt8to64 (Trunc64to8 x:(Rsh64x64 _ (Const64 [s])))) 23481 // cond: s >= 56 23482 // result: x 23483 for { 23484 v_0 := v.Args[0] 23485 if v_0.Op != OpTrunc64to8 { 23486 break 23487 } 23488 x := v_0.Args[0] 23489 if x.Op != OpRsh64x64 { 23490 break 23491 } 23492 _ = x.Args[1] 23493 x_1 := x.Args[1] 23494 if x_1.Op != OpConst64 { 23495 break 23496 } 23497 s := x_1.AuxInt 23498 if !(s >= 56) { 23499 break 23500 } 23501 v.reset(OpCopy) 23502 v.Type = x.Type 23503 v.AddArg(x) 23504 return true 23505 } 23506 return false 23507 } 23508 func rewriteValuegeneric_OpSliceCap_0(v *Value) bool { 23509 // match: (SliceCap (SliceMake _ _ (Const64 <t> [c]))) 23510 // cond: 23511 // result: (Const64 <t> [c]) 23512 for { 23513 v_0 := v.Args[0] 23514 if v_0.Op != OpSliceMake { 23515 break 23516 } 23517 _ = v_0.Args[2] 23518 v_0_2 := v_0.Args[2] 23519 if v_0_2.Op != OpConst64 { 23520 break 23521 } 23522 t := v_0_2.Type 23523 c := v_0_2.AuxInt 23524 v.reset(OpConst64) 23525 v.Type = t 23526 v.AuxInt = c 23527 return true 23528 } 23529 // match: (SliceCap (SliceMake _ _ (Const32 <t> [c]))) 23530 // cond: 23531 // result: (Const32 <t> [c]) 23532 for { 23533 v_0 := v.Args[0] 23534 if v_0.Op != OpSliceMake { 23535 break 23536 } 23537 _ = v_0.Args[2] 23538 v_0_2 := v_0.Args[2] 23539 if v_0_2.Op != OpConst32 { 23540 break 23541 } 23542 t := v_0_2.Type 23543 c := v_0_2.AuxInt 23544 v.reset(OpConst32) 23545 v.Type = t 23546 v.AuxInt = c 23547 return true 23548 } 23549 // match: (SliceCap (SliceMake _ _ (SliceCap x))) 23550 // cond: 23551 // result: (SliceCap x) 23552 for { 23553 v_0 := v.Args[0] 23554 if v_0.Op != OpSliceMake { 23555 break 23556 } 23557 _ = v_0.Args[2] 23558 v_0_2 := v_0.Args[2] 23559 if v_0_2.Op != OpSliceCap { 23560 break 23561 } 23562 x := v_0_2.Args[0] 23563 v.reset(OpSliceCap) 23564 v.AddArg(x) 23565 return true 23566 } 23567 // match: (SliceCap (SliceMake _ _ (SliceLen x))) 23568 // cond: 23569 // result: (SliceLen x) 23570 for { 23571 v_0 := v.Args[0] 23572 if v_0.Op != OpSliceMake { 23573 break 23574 } 23575 _ = v_0.Args[2] 23576 v_0_2 := v_0.Args[2] 23577 if v_0_2.Op != OpSliceLen { 23578 break 23579 } 23580 x := v_0_2.Args[0] 23581 v.reset(OpSliceLen) 23582 v.AddArg(x) 23583 return true 23584 } 23585 return false 23586 } 23587 func rewriteValuegeneric_OpSliceLen_0(v *Value) bool { 23588 // match: (SliceLen (SliceMake _ (Const64 <t> [c]) _)) 23589 // cond: 23590 // result: (Const64 <t> [c]) 23591 for { 23592 v_0 := v.Args[0] 23593 if v_0.Op != OpSliceMake { 23594 break 23595 } 23596 _ = v_0.Args[2] 23597 v_0_1 := v_0.Args[1] 23598 if v_0_1.Op != OpConst64 { 23599 break 23600 } 23601 t := v_0_1.Type 23602 c := v_0_1.AuxInt 23603 v.reset(OpConst64) 23604 v.Type = t 23605 v.AuxInt = c 23606 return true 23607 } 23608 // match: (SliceLen (SliceMake _ (Const32 <t> [c]) _)) 23609 // cond: 23610 // result: (Const32 <t> [c]) 23611 for { 23612 v_0 := v.Args[0] 23613 if v_0.Op != OpSliceMake { 23614 break 23615 } 23616 _ = v_0.Args[2] 23617 v_0_1 := v_0.Args[1] 23618 if v_0_1.Op != OpConst32 { 23619 break 23620 } 23621 t := v_0_1.Type 23622 c := v_0_1.AuxInt 23623 v.reset(OpConst32) 23624 v.Type = t 23625 v.AuxInt = c 23626 return true 23627 } 23628 // match: (SliceLen (SliceMake _ (SliceLen x) _)) 23629 // cond: 23630 // result: (SliceLen x) 23631 for { 23632 v_0 := v.Args[0] 23633 if v_0.Op != OpSliceMake { 23634 break 23635 } 23636 _ = v_0.Args[2] 23637 v_0_1 := v_0.Args[1] 23638 if v_0_1.Op != OpSliceLen { 23639 break 23640 } 23641 x := v_0_1.Args[0] 23642 v.reset(OpSliceLen) 23643 v.AddArg(x) 23644 return true 23645 } 23646 return false 23647 } 23648 func rewriteValuegeneric_OpSlicePtr_0(v *Value) bool { 23649 // match: (SlicePtr (SliceMake (SlicePtr x) _ _)) 23650 // cond: 23651 // result: (SlicePtr x) 23652 for { 23653 v_0 := v.Args[0] 23654 if v_0.Op != OpSliceMake { 23655 break 23656 } 23657 _ = v_0.Args[2] 23658 v_0_0 := v_0.Args[0] 23659 if v_0_0.Op != OpSlicePtr { 23660 break 23661 } 23662 x := v_0_0.Args[0] 23663 v.reset(OpSlicePtr) 23664 v.AddArg(x) 23665 return true 23666 } 23667 return false 23668 } 23669 func rewriteValuegeneric_OpSlicemask_0(v *Value) bool { 23670 // match: (Slicemask (Const32 [x])) 23671 // cond: x > 0 23672 // result: (Const32 [-1]) 23673 for { 23674 v_0 := v.Args[0] 23675 if v_0.Op != OpConst32 { 23676 break 23677 } 23678 x := v_0.AuxInt 23679 if !(x > 0) { 23680 break 23681 } 23682 v.reset(OpConst32) 23683 v.AuxInt = -1 23684 return true 23685 } 23686 // match: (Slicemask (Const32 [0])) 23687 // cond: 23688 // result: (Const32 [0]) 23689 for { 23690 v_0 := v.Args[0] 23691 if v_0.Op != OpConst32 { 23692 break 23693 } 23694 if v_0.AuxInt != 0 { 23695 break 23696 } 23697 v.reset(OpConst32) 23698 v.AuxInt = 0 23699 return true 23700 } 23701 // match: (Slicemask (Const64 [x])) 23702 // cond: x > 0 23703 // result: (Const64 [-1]) 23704 for { 23705 v_0 := v.Args[0] 23706 if v_0.Op != OpConst64 { 23707 break 23708 } 23709 x := v_0.AuxInt 23710 if !(x > 0) { 23711 break 23712 } 23713 v.reset(OpConst64) 23714 v.AuxInt = -1 23715 return true 23716 } 23717 // match: (Slicemask (Const64 [0])) 23718 // cond: 23719 // result: (Const64 [0]) 23720 for { 23721 v_0 := v.Args[0] 23722 if v_0.Op != OpConst64 { 23723 break 23724 } 23725 if v_0.AuxInt != 0 { 23726 break 23727 } 23728 v.reset(OpConst64) 23729 v.AuxInt = 0 23730 return true 23731 } 23732 return false 23733 } 23734 func rewriteValuegeneric_OpSqrt_0(v *Value) bool { 23735 // match: (Sqrt (Const64F [c])) 23736 // cond: 23737 // result: (Const64F [f2i(math.Sqrt(i2f(c)))]) 23738 for { 23739 v_0 := v.Args[0] 23740 if v_0.Op != OpConst64F { 23741 break 23742 } 23743 c := v_0.AuxInt 23744 v.reset(OpConst64F) 23745 v.AuxInt = f2i(math.Sqrt(i2f(c))) 23746 return true 23747 } 23748 return false 23749 } 23750 func rewriteValuegeneric_OpStaticCall_0(v *Value) bool { 23751 b := v.Block 23752 _ = b 23753 config := b.Func.Config 23754 _ = config 23755 // match: (StaticCall {sym} s1:(Store _ (Const64 [sz]) s2:(Store _ src s3:(Store {t} _ dst mem)))) 23756 // cond: isSameSym(sym,"runtime.memmove") && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && isInlinableMemmoveSize(sz,config) 23757 // result: (Move {t.(*types.Type).Elem()} [sz] dst src mem) 23758 for { 23759 sym := v.Aux 23760 s1 := v.Args[0] 23761 if s1.Op != OpStore { 23762 break 23763 } 23764 _ = s1.Args[2] 23765 s1_1 := s1.Args[1] 23766 if s1_1.Op != OpConst64 { 23767 break 23768 } 23769 sz := s1_1.AuxInt 23770 s2 := s1.Args[2] 23771 if s2.Op != OpStore { 23772 break 23773 } 23774 _ = s2.Args[2] 23775 src := s2.Args[1] 23776 s3 := s2.Args[2] 23777 if s3.Op != OpStore { 23778 break 23779 } 23780 t := s3.Aux 23781 _ = s3.Args[2] 23782 dst := s3.Args[1] 23783 mem := s3.Args[2] 23784 if !(isSameSym(sym, "runtime.memmove") && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && isInlinableMemmoveSize(sz, config)) { 23785 break 23786 } 23787 v.reset(OpMove) 23788 v.AuxInt = sz 23789 v.Aux = t.(*types.Type).Elem() 23790 v.AddArg(dst) 23791 v.AddArg(src) 23792 v.AddArg(mem) 23793 return true 23794 } 23795 // match: (StaticCall {sym} s1:(Store _ (Const32 [sz]) s2:(Store _ src s3:(Store {t} _ dst mem)))) 23796 // cond: isSameSym(sym,"runtime.memmove") && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && isInlinableMemmoveSize(sz,config) 23797 // result: (Move {t.(*types.Type).Elem()} [sz] dst src mem) 23798 for { 23799 sym := v.Aux 23800 s1 := v.Args[0] 23801 if s1.Op != OpStore { 23802 break 23803 } 23804 _ = s1.Args[2] 23805 s1_1 := s1.Args[1] 23806 if s1_1.Op != OpConst32 { 23807 break 23808 } 23809 sz := s1_1.AuxInt 23810 s2 := s1.Args[2] 23811 if s2.Op != OpStore { 23812 break 23813 } 23814 _ = s2.Args[2] 23815 src := s2.Args[1] 23816 s3 := s2.Args[2] 23817 if s3.Op != OpStore { 23818 break 23819 } 23820 t := s3.Aux 23821 _ = s3.Args[2] 23822 dst := s3.Args[1] 23823 mem := s3.Args[2] 23824 if !(isSameSym(sym, "runtime.memmove") && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && isInlinableMemmoveSize(sz, config)) { 23825 break 23826 } 23827 v.reset(OpMove) 23828 v.AuxInt = sz 23829 v.Aux = t.(*types.Type).Elem() 23830 v.AddArg(dst) 23831 v.AddArg(src) 23832 v.AddArg(mem) 23833 return true 23834 } 23835 return false 23836 } 23837 func rewriteValuegeneric_OpStore_0(v *Value) bool { 23838 b := v.Block 23839 _ = b 23840 fe := b.Func.fe 23841 _ = fe 23842 // match: (Store {t1} p1 (Load <t2> p2 mem) mem) 23843 // cond: isSamePtr(p1, p2) && t2.Size() == t1.(*types.Type).Size() 23844 // result: mem 23845 for { 23846 t1 := v.Aux 23847 _ = v.Args[2] 23848 p1 := v.Args[0] 23849 v_1 := v.Args[1] 23850 if v_1.Op != OpLoad { 23851 break 23852 } 23853 t2 := v_1.Type 23854 _ = v_1.Args[1] 23855 p2 := v_1.Args[0] 23856 mem := v_1.Args[1] 23857 if mem != v.Args[2] { 23858 break 23859 } 23860 if !(isSamePtr(p1, p2) && t2.Size() == t1.(*types.Type).Size()) { 23861 break 23862 } 23863 v.reset(OpCopy) 23864 v.Type = mem.Type 23865 v.AddArg(mem) 23866 return true 23867 } 23868 // match: (Store {t1} (OffPtr [o1] p1) (Load <t2> (OffPtr [o1] p2) oldmem) mem:(Store {t3} (OffPtr [o3] p3) _ oldmem)) 23869 // cond: isSamePtr(p1, p2) && isSamePtr(p1, p3) && t2.Size() == t1.(*types.Type).Size() && !overlap(o1, t2.Size(), o3, t3.(*types.Type).Size()) 23870 // result: mem 23871 for { 23872 t1 := v.Aux 23873 _ = v.Args[2] 23874 v_0 := v.Args[0] 23875 if v_0.Op != OpOffPtr { 23876 break 23877 } 23878 o1 := v_0.AuxInt 23879 p1 := v_0.Args[0] 23880 v_1 := v.Args[1] 23881 if v_1.Op != OpLoad { 23882 break 23883 } 23884 t2 := v_1.Type 23885 _ = v_1.Args[1] 23886 v_1_0 := v_1.Args[0] 23887 if v_1_0.Op != OpOffPtr { 23888 break 23889 } 23890 if v_1_0.AuxInt != o1 { 23891 break 23892 } 23893 p2 := v_1_0.Args[0] 23894 oldmem := v_1.Args[1] 23895 mem := v.Args[2] 23896 if mem.Op != OpStore { 23897 break 23898 } 23899 t3 := mem.Aux 23900 _ = mem.Args[2] 23901 mem_0 := mem.Args[0] 23902 if mem_0.Op != OpOffPtr { 23903 break 23904 } 23905 o3 := mem_0.AuxInt 23906 p3 := mem_0.Args[0] 23907 if oldmem != mem.Args[2] { 23908 break 23909 } 23910 if !(isSamePtr(p1, p2) && isSamePtr(p1, p3) && t2.Size() == t1.(*types.Type).Size() && !overlap(o1, t2.Size(), o3, t3.(*types.Type).Size())) { 23911 break 23912 } 23913 v.reset(OpCopy) 23914 v.Type = mem.Type 23915 v.AddArg(mem) 23916 return true 23917 } 23918 // match: (Store {t1} (OffPtr [o1] p1) (Load <t2> (OffPtr [o1] p2) oldmem) mem:(Store {t3} (OffPtr [o3] p3) _ (Store {t4} (OffPtr [o4] p4) _ oldmem))) 23919 // 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()) 23920 // result: mem 23921 for { 23922 t1 := v.Aux 23923 _ = v.Args[2] 23924 v_0 := v.Args[0] 23925 if v_0.Op != OpOffPtr { 23926 break 23927 } 23928 o1 := v_0.AuxInt 23929 p1 := v_0.Args[0] 23930 v_1 := v.Args[1] 23931 if v_1.Op != OpLoad { 23932 break 23933 } 23934 t2 := v_1.Type 23935 _ = v_1.Args[1] 23936 v_1_0 := v_1.Args[0] 23937 if v_1_0.Op != OpOffPtr { 23938 break 23939 } 23940 if v_1_0.AuxInt != o1 { 23941 break 23942 } 23943 p2 := v_1_0.Args[0] 23944 oldmem := v_1.Args[1] 23945 mem := v.Args[2] 23946 if mem.Op != OpStore { 23947 break 23948 } 23949 t3 := mem.Aux 23950 _ = mem.Args[2] 23951 mem_0 := mem.Args[0] 23952 if mem_0.Op != OpOffPtr { 23953 break 23954 } 23955 o3 := mem_0.AuxInt 23956 p3 := mem_0.Args[0] 23957 mem_2 := mem.Args[2] 23958 if mem_2.Op != OpStore { 23959 break 23960 } 23961 t4 := mem_2.Aux 23962 _ = mem_2.Args[2] 23963 mem_2_0 := mem_2.Args[0] 23964 if mem_2_0.Op != OpOffPtr { 23965 break 23966 } 23967 o4 := mem_2_0.AuxInt 23968 p4 := mem_2_0.Args[0] 23969 if oldmem != mem_2.Args[2] { 23970 break 23971 } 23972 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())) { 23973 break 23974 } 23975 v.reset(OpCopy) 23976 v.Type = mem.Type 23977 v.AddArg(mem) 23978 return true 23979 } 23980 // 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)))) 23981 // 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()) 23982 // result: mem 23983 for { 23984 t1 := v.Aux 23985 _ = v.Args[2] 23986 v_0 := v.Args[0] 23987 if v_0.Op != OpOffPtr { 23988 break 23989 } 23990 o1 := v_0.AuxInt 23991 p1 := v_0.Args[0] 23992 v_1 := v.Args[1] 23993 if v_1.Op != OpLoad { 23994 break 23995 } 23996 t2 := v_1.Type 23997 _ = v_1.Args[1] 23998 v_1_0 := v_1.Args[0] 23999 if v_1_0.Op != OpOffPtr { 24000 break 24001 } 24002 if v_1_0.AuxInt != o1 { 24003 break 24004 } 24005 p2 := v_1_0.Args[0] 24006 oldmem := v_1.Args[1] 24007 mem := v.Args[2] 24008 if mem.Op != OpStore { 24009 break 24010 } 24011 t3 := mem.Aux 24012 _ = mem.Args[2] 24013 mem_0 := mem.Args[0] 24014 if mem_0.Op != OpOffPtr { 24015 break 24016 } 24017 o3 := mem_0.AuxInt 24018 p3 := mem_0.Args[0] 24019 mem_2 := mem.Args[2] 24020 if mem_2.Op != OpStore { 24021 break 24022 } 24023 t4 := mem_2.Aux 24024 _ = mem_2.Args[2] 24025 mem_2_0 := mem_2.Args[0] 24026 if mem_2_0.Op != OpOffPtr { 24027 break 24028 } 24029 o4 := mem_2_0.AuxInt 24030 p4 := mem_2_0.Args[0] 24031 mem_2_2 := mem_2.Args[2] 24032 if mem_2_2.Op != OpStore { 24033 break 24034 } 24035 t5 := mem_2_2.Aux 24036 _ = mem_2_2.Args[2] 24037 mem_2_2_0 := mem_2_2.Args[0] 24038 if mem_2_2_0.Op != OpOffPtr { 24039 break 24040 } 24041 o5 := mem_2_2_0.AuxInt 24042 p5 := mem_2_2_0.Args[0] 24043 if oldmem != mem_2_2.Args[2] { 24044 break 24045 } 24046 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())) { 24047 break 24048 } 24049 v.reset(OpCopy) 24050 v.Type = mem.Type 24051 v.AddArg(mem) 24052 return true 24053 } 24054 // match: (Store _ (StructMake0) mem) 24055 // cond: 24056 // result: mem 24057 for { 24058 _ = v.Args[2] 24059 v_1 := v.Args[1] 24060 if v_1.Op != OpStructMake0 { 24061 break 24062 } 24063 mem := v.Args[2] 24064 v.reset(OpCopy) 24065 v.Type = mem.Type 24066 v.AddArg(mem) 24067 return true 24068 } 24069 // match: (Store dst (StructMake1 <t> f0) mem) 24070 // cond: 24071 // result: (Store {t.FieldType(0)} (OffPtr <t.FieldType(0).PtrTo()> [0] dst) f0 mem) 24072 for { 24073 _ = v.Args[2] 24074 dst := v.Args[0] 24075 v_1 := v.Args[1] 24076 if v_1.Op != OpStructMake1 { 24077 break 24078 } 24079 t := v_1.Type 24080 f0 := v_1.Args[0] 24081 mem := v.Args[2] 24082 v.reset(OpStore) 24083 v.Aux = t.FieldType(0) 24084 v0 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 24085 v0.AuxInt = 0 24086 v0.AddArg(dst) 24087 v.AddArg(v0) 24088 v.AddArg(f0) 24089 v.AddArg(mem) 24090 return true 24091 } 24092 // match: (Store dst (StructMake2 <t> f0 f1) mem) 24093 // cond: 24094 // 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)) 24095 for { 24096 _ = v.Args[2] 24097 dst := v.Args[0] 24098 v_1 := v.Args[1] 24099 if v_1.Op != OpStructMake2 { 24100 break 24101 } 24102 t := v_1.Type 24103 _ = v_1.Args[1] 24104 f0 := v_1.Args[0] 24105 f1 := v_1.Args[1] 24106 mem := v.Args[2] 24107 v.reset(OpStore) 24108 v.Aux = t.FieldType(1) 24109 v0 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) 24110 v0.AuxInt = t.FieldOff(1) 24111 v0.AddArg(dst) 24112 v.AddArg(v0) 24113 v.AddArg(f1) 24114 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) 24115 v1.Aux = t.FieldType(0) 24116 v2 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 24117 v2.AuxInt = 0 24118 v2.AddArg(dst) 24119 v1.AddArg(v2) 24120 v1.AddArg(f0) 24121 v1.AddArg(mem) 24122 v.AddArg(v1) 24123 return true 24124 } 24125 // match: (Store dst (StructMake3 <t> f0 f1 f2) mem) 24126 // cond: 24127 // 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))) 24128 for { 24129 _ = v.Args[2] 24130 dst := v.Args[0] 24131 v_1 := v.Args[1] 24132 if v_1.Op != OpStructMake3 { 24133 break 24134 } 24135 t := v_1.Type 24136 _ = v_1.Args[2] 24137 f0 := v_1.Args[0] 24138 f1 := v_1.Args[1] 24139 f2 := v_1.Args[2] 24140 mem := v.Args[2] 24141 v.reset(OpStore) 24142 v.Aux = t.FieldType(2) 24143 v0 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(2).PtrTo()) 24144 v0.AuxInt = t.FieldOff(2) 24145 v0.AddArg(dst) 24146 v.AddArg(v0) 24147 v.AddArg(f2) 24148 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) 24149 v1.Aux = t.FieldType(1) 24150 v2 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) 24151 v2.AuxInt = t.FieldOff(1) 24152 v2.AddArg(dst) 24153 v1.AddArg(v2) 24154 v1.AddArg(f1) 24155 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem) 24156 v3.Aux = t.FieldType(0) 24157 v4 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 24158 v4.AuxInt = 0 24159 v4.AddArg(dst) 24160 v3.AddArg(v4) 24161 v3.AddArg(f0) 24162 v3.AddArg(mem) 24163 v1.AddArg(v3) 24164 v.AddArg(v1) 24165 return true 24166 } 24167 // match: (Store dst (StructMake4 <t> f0 f1 f2 f3) mem) 24168 // cond: 24169 // 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)))) 24170 for { 24171 _ = v.Args[2] 24172 dst := v.Args[0] 24173 v_1 := v.Args[1] 24174 if v_1.Op != OpStructMake4 { 24175 break 24176 } 24177 t := v_1.Type 24178 _ = v_1.Args[3] 24179 f0 := v_1.Args[0] 24180 f1 := v_1.Args[1] 24181 f2 := v_1.Args[2] 24182 f3 := v_1.Args[3] 24183 mem := v.Args[2] 24184 v.reset(OpStore) 24185 v.Aux = t.FieldType(3) 24186 v0 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(3).PtrTo()) 24187 v0.AuxInt = t.FieldOff(3) 24188 v0.AddArg(dst) 24189 v.AddArg(v0) 24190 v.AddArg(f3) 24191 v1 := b.NewValue0(v.Pos, OpStore, types.TypeMem) 24192 v1.Aux = t.FieldType(2) 24193 v2 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(2).PtrTo()) 24194 v2.AuxInt = t.FieldOff(2) 24195 v2.AddArg(dst) 24196 v1.AddArg(v2) 24197 v1.AddArg(f2) 24198 v3 := b.NewValue0(v.Pos, OpStore, types.TypeMem) 24199 v3.Aux = t.FieldType(1) 24200 v4 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) 24201 v4.AuxInt = t.FieldOff(1) 24202 v4.AddArg(dst) 24203 v3.AddArg(v4) 24204 v3.AddArg(f1) 24205 v5 := b.NewValue0(v.Pos, OpStore, types.TypeMem) 24206 v5.Aux = t.FieldType(0) 24207 v6 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) 24208 v6.AuxInt = 0 24209 v6.AddArg(dst) 24210 v5.AddArg(v6) 24211 v5.AddArg(f0) 24212 v5.AddArg(mem) 24213 v3.AddArg(v5) 24214 v1.AddArg(v3) 24215 v.AddArg(v1) 24216 return true 24217 } 24218 // match: (Store {t} dst (Load src mem) mem) 24219 // cond: !fe.CanSSA(t.(*types.Type)) 24220 // result: (Move {t} [t.(*types.Type).Size()] dst src mem) 24221 for { 24222 t := v.Aux 24223 _ = v.Args[2] 24224 dst := v.Args[0] 24225 v_1 := v.Args[1] 24226 if v_1.Op != OpLoad { 24227 break 24228 } 24229 _ = v_1.Args[1] 24230 src := v_1.Args[0] 24231 mem := v_1.Args[1] 24232 if mem != v.Args[2] { 24233 break 24234 } 24235 if !(!fe.CanSSA(t.(*types.Type))) { 24236 break 24237 } 24238 v.reset(OpMove) 24239 v.AuxInt = t.(*types.Type).Size() 24240 v.Aux = t 24241 v.AddArg(dst) 24242 v.AddArg(src) 24243 v.AddArg(mem) 24244 return true 24245 } 24246 return false 24247 } 24248 func rewriteValuegeneric_OpStore_10(v *Value) bool { 24249 b := v.Block 24250 _ = b 24251 config := b.Func.Config 24252 _ = config 24253 fe := b.Func.fe 24254 _ = fe 24255 // match: (Store {t} dst (Load src mem) (VarDef {x} mem)) 24256 // cond: !fe.CanSSA(t.(*types.Type)) 24257 // result: (Move {t} [t.(*types.Type).Size()] dst src (VarDef {x} mem)) 24258 for { 24259 t := v.Aux 24260 _ = v.Args[2] 24261 dst := v.Args[0] 24262 v_1 := v.Args[1] 24263 if v_1.Op != OpLoad { 24264 break 24265 } 24266 _ = v_1.Args[1] 24267 src := v_1.Args[0] 24268 mem := v_1.Args[1] 24269 v_2 := v.Args[2] 24270 if v_2.Op != OpVarDef { 24271 break 24272 } 24273 x := v_2.Aux 24274 if mem != v_2.Args[0] { 24275 break 24276 } 24277 if !(!fe.CanSSA(t.(*types.Type))) { 24278 break 24279 } 24280 v.reset(OpMove) 24281 v.AuxInt = t.(*types.Type).Size() 24282 v.Aux = t 24283 v.AddArg(dst) 24284 v.AddArg(src) 24285 v0 := b.NewValue0(v.Pos, OpVarDef, types.TypeMem) 24286 v0.Aux = x 24287 v0.AddArg(mem) 24288 v.AddArg(v0) 24289 return true 24290 } 24291 // match: (Store _ (ArrayMake0) mem) 24292 // cond: 24293 // result: mem 24294 for { 24295 _ = v.Args[2] 24296 v_1 := v.Args[1] 24297 if v_1.Op != OpArrayMake0 { 24298 break 24299 } 24300 mem := v.Args[2] 24301 v.reset(OpCopy) 24302 v.Type = mem.Type 24303 v.AddArg(mem) 24304 return true 24305 } 24306 // match: (Store dst (ArrayMake1 e) mem) 24307 // cond: 24308 // result: (Store {e.Type} dst e mem) 24309 for { 24310 _ = v.Args[2] 24311 dst := v.Args[0] 24312 v_1 := v.Args[1] 24313 if v_1.Op != OpArrayMake1 { 24314 break 24315 } 24316 e := v_1.Args[0] 24317 mem := v.Args[2] 24318 v.reset(OpStore) 24319 v.Aux = e.Type 24320 v.AddArg(dst) 24321 v.AddArg(e) 24322 v.AddArg(mem) 24323 return true 24324 } 24325 // match: (Store (Load (OffPtr [c] (SP)) mem) x mem) 24326 // cond: isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize 24327 // result: mem 24328 for { 24329 _ = v.Args[2] 24330 v_0 := v.Args[0] 24331 if v_0.Op != OpLoad { 24332 break 24333 } 24334 _ = v_0.Args[1] 24335 v_0_0 := v_0.Args[0] 24336 if v_0_0.Op != OpOffPtr { 24337 break 24338 } 24339 c := v_0_0.AuxInt 24340 v_0_0_0 := v_0_0.Args[0] 24341 if v_0_0_0.Op != OpSP { 24342 break 24343 } 24344 mem := v_0.Args[1] 24345 x := v.Args[1] 24346 if mem != v.Args[2] { 24347 break 24348 } 24349 if !(isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize) { 24350 break 24351 } 24352 v.reset(OpCopy) 24353 v.Type = mem.Type 24354 v.AddArg(mem) 24355 return true 24356 } 24357 // match: (Store (OffPtr (Load (OffPtr [c] (SP)) mem)) x mem) 24358 // cond: isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize 24359 // result: mem 24360 for { 24361 _ = v.Args[2] 24362 v_0 := v.Args[0] 24363 if v_0.Op != OpOffPtr { 24364 break 24365 } 24366 v_0_0 := v_0.Args[0] 24367 if v_0_0.Op != OpLoad { 24368 break 24369 } 24370 _ = v_0_0.Args[1] 24371 v_0_0_0 := v_0_0.Args[0] 24372 if v_0_0_0.Op != OpOffPtr { 24373 break 24374 } 24375 c := v_0_0_0.AuxInt 24376 v_0_0_0_0 := v_0_0_0.Args[0] 24377 if v_0_0_0_0.Op != OpSP { 24378 break 24379 } 24380 mem := v_0_0.Args[1] 24381 x := v.Args[1] 24382 if mem != v.Args[2] { 24383 break 24384 } 24385 if !(isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize) { 24386 break 24387 } 24388 v.reset(OpCopy) 24389 v.Type = mem.Type 24390 v.AddArg(mem) 24391 return true 24392 } 24393 return false 24394 } 24395 func rewriteValuegeneric_OpStringLen_0(v *Value) bool { 24396 // match: (StringLen (StringMake _ (Const64 <t> [c]))) 24397 // cond: 24398 // result: (Const64 <t> [c]) 24399 for { 24400 v_0 := v.Args[0] 24401 if v_0.Op != OpStringMake { 24402 break 24403 } 24404 _ = v_0.Args[1] 24405 v_0_1 := v_0.Args[1] 24406 if v_0_1.Op != OpConst64 { 24407 break 24408 } 24409 t := v_0_1.Type 24410 c := v_0_1.AuxInt 24411 v.reset(OpConst64) 24412 v.Type = t 24413 v.AuxInt = c 24414 return true 24415 } 24416 return false 24417 } 24418 func rewriteValuegeneric_OpStringPtr_0(v *Value) bool { 24419 // match: (StringPtr (StringMake (Const64 <t> [c]) _)) 24420 // cond: 24421 // result: (Const64 <t> [c]) 24422 for { 24423 v_0 := v.Args[0] 24424 if v_0.Op != OpStringMake { 24425 break 24426 } 24427 _ = v_0.Args[1] 24428 v_0_0 := v_0.Args[0] 24429 if v_0_0.Op != OpConst64 { 24430 break 24431 } 24432 t := v_0_0.Type 24433 c := v_0_0.AuxInt 24434 v.reset(OpConst64) 24435 v.Type = t 24436 v.AuxInt = c 24437 return true 24438 } 24439 return false 24440 } 24441 func rewriteValuegeneric_OpStructSelect_0(v *Value) bool { 24442 // match: (StructSelect (StructMake1 x)) 24443 // cond: 24444 // result: x 24445 for { 24446 v_0 := v.Args[0] 24447 if v_0.Op != OpStructMake1 { 24448 break 24449 } 24450 x := v_0.Args[0] 24451 v.reset(OpCopy) 24452 v.Type = x.Type 24453 v.AddArg(x) 24454 return true 24455 } 24456 // match: (StructSelect [0] (StructMake2 x _)) 24457 // cond: 24458 // result: x 24459 for { 24460 if v.AuxInt != 0 { 24461 break 24462 } 24463 v_0 := v.Args[0] 24464 if v_0.Op != OpStructMake2 { 24465 break 24466 } 24467 _ = v_0.Args[1] 24468 x := v_0.Args[0] 24469 v.reset(OpCopy) 24470 v.Type = x.Type 24471 v.AddArg(x) 24472 return true 24473 } 24474 // match: (StructSelect [1] (StructMake2 _ x)) 24475 // cond: 24476 // result: x 24477 for { 24478 if v.AuxInt != 1 { 24479 break 24480 } 24481 v_0 := v.Args[0] 24482 if v_0.Op != OpStructMake2 { 24483 break 24484 } 24485 _ = v_0.Args[1] 24486 x := v_0.Args[1] 24487 v.reset(OpCopy) 24488 v.Type = x.Type 24489 v.AddArg(x) 24490 return true 24491 } 24492 // match: (StructSelect [0] (StructMake3 x _ _)) 24493 // cond: 24494 // result: x 24495 for { 24496 if v.AuxInt != 0 { 24497 break 24498 } 24499 v_0 := v.Args[0] 24500 if v_0.Op != OpStructMake3 { 24501 break 24502 } 24503 _ = v_0.Args[2] 24504 x := v_0.Args[0] 24505 v.reset(OpCopy) 24506 v.Type = x.Type 24507 v.AddArg(x) 24508 return true 24509 } 24510 // match: (StructSelect [1] (StructMake3 _ x _)) 24511 // cond: 24512 // result: x 24513 for { 24514 if v.AuxInt != 1 { 24515 break 24516 } 24517 v_0 := v.Args[0] 24518 if v_0.Op != OpStructMake3 { 24519 break 24520 } 24521 _ = v_0.Args[2] 24522 x := v_0.Args[1] 24523 v.reset(OpCopy) 24524 v.Type = x.Type 24525 v.AddArg(x) 24526 return true 24527 } 24528 // match: (StructSelect [2] (StructMake3 _ _ x)) 24529 // cond: 24530 // result: x 24531 for { 24532 if v.AuxInt != 2 { 24533 break 24534 } 24535 v_0 := v.Args[0] 24536 if v_0.Op != OpStructMake3 { 24537 break 24538 } 24539 _ = v_0.Args[2] 24540 x := v_0.Args[2] 24541 v.reset(OpCopy) 24542 v.Type = x.Type 24543 v.AddArg(x) 24544 return true 24545 } 24546 // match: (StructSelect [0] (StructMake4 x _ _ _)) 24547 // cond: 24548 // result: x 24549 for { 24550 if v.AuxInt != 0 { 24551 break 24552 } 24553 v_0 := v.Args[0] 24554 if v_0.Op != OpStructMake4 { 24555 break 24556 } 24557 _ = v_0.Args[3] 24558 x := v_0.Args[0] 24559 v.reset(OpCopy) 24560 v.Type = x.Type 24561 v.AddArg(x) 24562 return true 24563 } 24564 // match: (StructSelect [1] (StructMake4 _ x _ _)) 24565 // cond: 24566 // result: x 24567 for { 24568 if v.AuxInt != 1 { 24569 break 24570 } 24571 v_0 := v.Args[0] 24572 if v_0.Op != OpStructMake4 { 24573 break 24574 } 24575 _ = v_0.Args[3] 24576 x := v_0.Args[1] 24577 v.reset(OpCopy) 24578 v.Type = x.Type 24579 v.AddArg(x) 24580 return true 24581 } 24582 // match: (StructSelect [2] (StructMake4 _ _ x _)) 24583 // cond: 24584 // result: x 24585 for { 24586 if v.AuxInt != 2 { 24587 break 24588 } 24589 v_0 := v.Args[0] 24590 if v_0.Op != OpStructMake4 { 24591 break 24592 } 24593 _ = v_0.Args[3] 24594 x := v_0.Args[2] 24595 v.reset(OpCopy) 24596 v.Type = x.Type 24597 v.AddArg(x) 24598 return true 24599 } 24600 // match: (StructSelect [3] (StructMake4 _ _ _ x)) 24601 // cond: 24602 // result: x 24603 for { 24604 if v.AuxInt != 3 { 24605 break 24606 } 24607 v_0 := v.Args[0] 24608 if v_0.Op != OpStructMake4 { 24609 break 24610 } 24611 _ = v_0.Args[3] 24612 x := v_0.Args[3] 24613 v.reset(OpCopy) 24614 v.Type = x.Type 24615 v.AddArg(x) 24616 return true 24617 } 24618 return false 24619 } 24620 func rewriteValuegeneric_OpStructSelect_10(v *Value) bool { 24621 b := v.Block 24622 _ = b 24623 fe := b.Func.fe 24624 _ = fe 24625 // match: (StructSelect [i] x:(Load <t> ptr mem)) 24626 // cond: !fe.CanSSA(t) 24627 // result: @x.Block (Load <v.Type> (OffPtr <v.Type.PtrTo()> [t.FieldOff(int(i))] ptr) mem) 24628 for { 24629 i := v.AuxInt 24630 x := v.Args[0] 24631 if x.Op != OpLoad { 24632 break 24633 } 24634 t := x.Type 24635 _ = x.Args[1] 24636 ptr := x.Args[0] 24637 mem := x.Args[1] 24638 if !(!fe.CanSSA(t)) { 24639 break 24640 } 24641 b = x.Block 24642 v0 := b.NewValue0(v.Pos, OpLoad, v.Type) 24643 v.reset(OpCopy) 24644 v.AddArg(v0) 24645 v1 := b.NewValue0(v.Pos, OpOffPtr, v.Type.PtrTo()) 24646 v1.AuxInt = t.FieldOff(int(i)) 24647 v1.AddArg(ptr) 24648 v0.AddArg(v1) 24649 v0.AddArg(mem) 24650 return true 24651 } 24652 // match: (StructSelect [0] x:(IData _)) 24653 // cond: 24654 // result: x 24655 for { 24656 if v.AuxInt != 0 { 24657 break 24658 } 24659 x := v.Args[0] 24660 if x.Op != OpIData { 24661 break 24662 } 24663 v.reset(OpCopy) 24664 v.Type = x.Type 24665 v.AddArg(x) 24666 return true 24667 } 24668 return false 24669 } 24670 func rewriteValuegeneric_OpSub16_0(v *Value) bool { 24671 b := v.Block 24672 _ = b 24673 // match: (Sub16 (Const16 [c]) (Const16 [d])) 24674 // cond: 24675 // result: (Const16 [int64(int16(c-d))]) 24676 for { 24677 _ = v.Args[1] 24678 v_0 := v.Args[0] 24679 if v_0.Op != OpConst16 { 24680 break 24681 } 24682 c := v_0.AuxInt 24683 v_1 := v.Args[1] 24684 if v_1.Op != OpConst16 { 24685 break 24686 } 24687 d := v_1.AuxInt 24688 v.reset(OpConst16) 24689 v.AuxInt = int64(int16(c - d)) 24690 return true 24691 } 24692 // match: (Sub16 x (Const16 <t> [c])) 24693 // cond: x.Op != OpConst16 24694 // result: (Add16 (Const16 <t> [int64(int16(-c))]) x) 24695 for { 24696 _ = v.Args[1] 24697 x := v.Args[0] 24698 v_1 := v.Args[1] 24699 if v_1.Op != OpConst16 { 24700 break 24701 } 24702 t := v_1.Type 24703 c := v_1.AuxInt 24704 if !(x.Op != OpConst16) { 24705 break 24706 } 24707 v.reset(OpAdd16) 24708 v0 := b.NewValue0(v.Pos, OpConst16, t) 24709 v0.AuxInt = int64(int16(-c)) 24710 v.AddArg(v0) 24711 v.AddArg(x) 24712 return true 24713 } 24714 // match: (Sub16 <t> (Mul16 x y) (Mul16 x z)) 24715 // cond: 24716 // result: (Mul16 x (Sub16 <t> y z)) 24717 for { 24718 t := v.Type 24719 _ = v.Args[1] 24720 v_0 := v.Args[0] 24721 if v_0.Op != OpMul16 { 24722 break 24723 } 24724 _ = v_0.Args[1] 24725 x := v_0.Args[0] 24726 y := v_0.Args[1] 24727 v_1 := v.Args[1] 24728 if v_1.Op != OpMul16 { 24729 break 24730 } 24731 _ = v_1.Args[1] 24732 if x != v_1.Args[0] { 24733 break 24734 } 24735 z := v_1.Args[1] 24736 v.reset(OpMul16) 24737 v.AddArg(x) 24738 v0 := b.NewValue0(v.Pos, OpSub16, t) 24739 v0.AddArg(y) 24740 v0.AddArg(z) 24741 v.AddArg(v0) 24742 return true 24743 } 24744 // match: (Sub16 <t> (Mul16 y x) (Mul16 x z)) 24745 // cond: 24746 // result: (Mul16 x (Sub16 <t> y z)) 24747 for { 24748 t := v.Type 24749 _ = v.Args[1] 24750 v_0 := v.Args[0] 24751 if v_0.Op != OpMul16 { 24752 break 24753 } 24754 _ = v_0.Args[1] 24755 y := v_0.Args[0] 24756 x := v_0.Args[1] 24757 v_1 := v.Args[1] 24758 if v_1.Op != OpMul16 { 24759 break 24760 } 24761 _ = v_1.Args[1] 24762 if x != v_1.Args[0] { 24763 break 24764 } 24765 z := v_1.Args[1] 24766 v.reset(OpMul16) 24767 v.AddArg(x) 24768 v0 := b.NewValue0(v.Pos, OpSub16, t) 24769 v0.AddArg(y) 24770 v0.AddArg(z) 24771 v.AddArg(v0) 24772 return true 24773 } 24774 // match: (Sub16 <t> (Mul16 x y) (Mul16 z x)) 24775 // cond: 24776 // result: (Mul16 x (Sub16 <t> y z)) 24777 for { 24778 t := v.Type 24779 _ = v.Args[1] 24780 v_0 := v.Args[0] 24781 if v_0.Op != OpMul16 { 24782 break 24783 } 24784 _ = v_0.Args[1] 24785 x := v_0.Args[0] 24786 y := v_0.Args[1] 24787 v_1 := v.Args[1] 24788 if v_1.Op != OpMul16 { 24789 break 24790 } 24791 _ = v_1.Args[1] 24792 z := v_1.Args[0] 24793 if x != v_1.Args[1] { 24794 break 24795 } 24796 v.reset(OpMul16) 24797 v.AddArg(x) 24798 v0 := b.NewValue0(v.Pos, OpSub16, t) 24799 v0.AddArg(y) 24800 v0.AddArg(z) 24801 v.AddArg(v0) 24802 return true 24803 } 24804 // match: (Sub16 <t> (Mul16 y x) (Mul16 z x)) 24805 // cond: 24806 // result: (Mul16 x (Sub16 <t> y z)) 24807 for { 24808 t := v.Type 24809 _ = v.Args[1] 24810 v_0 := v.Args[0] 24811 if v_0.Op != OpMul16 { 24812 break 24813 } 24814 _ = v_0.Args[1] 24815 y := v_0.Args[0] 24816 x := v_0.Args[1] 24817 v_1 := v.Args[1] 24818 if v_1.Op != OpMul16 { 24819 break 24820 } 24821 _ = v_1.Args[1] 24822 z := v_1.Args[0] 24823 if x != v_1.Args[1] { 24824 break 24825 } 24826 v.reset(OpMul16) 24827 v.AddArg(x) 24828 v0 := b.NewValue0(v.Pos, OpSub16, t) 24829 v0.AddArg(y) 24830 v0.AddArg(z) 24831 v.AddArg(v0) 24832 return true 24833 } 24834 // match: (Sub16 x x) 24835 // cond: 24836 // result: (Const16 [0]) 24837 for { 24838 _ = v.Args[1] 24839 x := v.Args[0] 24840 if x != v.Args[1] { 24841 break 24842 } 24843 v.reset(OpConst16) 24844 v.AuxInt = 0 24845 return true 24846 } 24847 // match: (Sub16 (Add16 x y) x) 24848 // cond: 24849 // result: y 24850 for { 24851 _ = v.Args[1] 24852 v_0 := v.Args[0] 24853 if v_0.Op != OpAdd16 { 24854 break 24855 } 24856 _ = v_0.Args[1] 24857 x := v_0.Args[0] 24858 y := v_0.Args[1] 24859 if x != v.Args[1] { 24860 break 24861 } 24862 v.reset(OpCopy) 24863 v.Type = y.Type 24864 v.AddArg(y) 24865 return true 24866 } 24867 // match: (Sub16 (Add16 y x) x) 24868 // cond: 24869 // result: y 24870 for { 24871 _ = v.Args[1] 24872 v_0 := v.Args[0] 24873 if v_0.Op != OpAdd16 { 24874 break 24875 } 24876 _ = v_0.Args[1] 24877 y := v_0.Args[0] 24878 x := v_0.Args[1] 24879 if x != v.Args[1] { 24880 break 24881 } 24882 v.reset(OpCopy) 24883 v.Type = y.Type 24884 v.AddArg(y) 24885 return true 24886 } 24887 // match: (Sub16 (Add16 x y) y) 24888 // cond: 24889 // result: x 24890 for { 24891 _ = v.Args[1] 24892 v_0 := v.Args[0] 24893 if v_0.Op != OpAdd16 { 24894 break 24895 } 24896 _ = v_0.Args[1] 24897 x := v_0.Args[0] 24898 y := v_0.Args[1] 24899 if y != v.Args[1] { 24900 break 24901 } 24902 v.reset(OpCopy) 24903 v.Type = x.Type 24904 v.AddArg(x) 24905 return true 24906 } 24907 return false 24908 } 24909 func rewriteValuegeneric_OpSub16_10(v *Value) bool { 24910 b := v.Block 24911 _ = b 24912 // match: (Sub16 (Add16 y x) y) 24913 // cond: 24914 // result: x 24915 for { 24916 _ = v.Args[1] 24917 v_0 := v.Args[0] 24918 if v_0.Op != OpAdd16 { 24919 break 24920 } 24921 _ = v_0.Args[1] 24922 y := v_0.Args[0] 24923 x := v_0.Args[1] 24924 if y != v.Args[1] { 24925 break 24926 } 24927 v.reset(OpCopy) 24928 v.Type = x.Type 24929 v.AddArg(x) 24930 return true 24931 } 24932 // match: (Sub16 x (Sub16 i:(Const16 <t>) z)) 24933 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 24934 // result: (Sub16 (Add16 <t> x z) i) 24935 for { 24936 _ = v.Args[1] 24937 x := v.Args[0] 24938 v_1 := v.Args[1] 24939 if v_1.Op != OpSub16 { 24940 break 24941 } 24942 _ = v_1.Args[1] 24943 i := v_1.Args[0] 24944 if i.Op != OpConst16 { 24945 break 24946 } 24947 t := i.Type 24948 z := v_1.Args[1] 24949 if !(z.Op != OpConst16 && x.Op != OpConst16) { 24950 break 24951 } 24952 v.reset(OpSub16) 24953 v0 := b.NewValue0(v.Pos, OpAdd16, t) 24954 v0.AddArg(x) 24955 v0.AddArg(z) 24956 v.AddArg(v0) 24957 v.AddArg(i) 24958 return true 24959 } 24960 // match: (Sub16 x (Sub16 z i:(Const16 <t>))) 24961 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 24962 // result: (Add16 i (Sub16 <t> x z)) 24963 for { 24964 _ = v.Args[1] 24965 x := v.Args[0] 24966 v_1 := v.Args[1] 24967 if v_1.Op != OpSub16 { 24968 break 24969 } 24970 _ = v_1.Args[1] 24971 z := v_1.Args[0] 24972 i := v_1.Args[1] 24973 if i.Op != OpConst16 { 24974 break 24975 } 24976 t := i.Type 24977 if !(z.Op != OpConst16 && x.Op != OpConst16) { 24978 break 24979 } 24980 v.reset(OpAdd16) 24981 v.AddArg(i) 24982 v0 := b.NewValue0(v.Pos, OpSub16, t) 24983 v0.AddArg(x) 24984 v0.AddArg(z) 24985 v.AddArg(v0) 24986 return true 24987 } 24988 // match: (Sub16 (Const16 <t> [c]) (Sub16 x (Const16 <t> [d]))) 24989 // cond: 24990 // result: (Sub16 (Const16 <t> [int64(int16(c+d))]) x) 24991 for { 24992 _ = v.Args[1] 24993 v_0 := v.Args[0] 24994 if v_0.Op != OpConst16 { 24995 break 24996 } 24997 t := v_0.Type 24998 c := v_0.AuxInt 24999 v_1 := v.Args[1] 25000 if v_1.Op != OpSub16 { 25001 break 25002 } 25003 _ = v_1.Args[1] 25004 x := v_1.Args[0] 25005 v_1_1 := v_1.Args[1] 25006 if v_1_1.Op != OpConst16 { 25007 break 25008 } 25009 if v_1_1.Type != t { 25010 break 25011 } 25012 d := v_1_1.AuxInt 25013 v.reset(OpSub16) 25014 v0 := b.NewValue0(v.Pos, OpConst16, t) 25015 v0.AuxInt = int64(int16(c + d)) 25016 v.AddArg(v0) 25017 v.AddArg(x) 25018 return true 25019 } 25020 // match: (Sub16 (Const16 <t> [c]) (Sub16 (Const16 <t> [d]) x)) 25021 // cond: 25022 // result: (Add16 (Const16 <t> [int64(int16(c-d))]) x) 25023 for { 25024 _ = v.Args[1] 25025 v_0 := v.Args[0] 25026 if v_0.Op != OpConst16 { 25027 break 25028 } 25029 t := v_0.Type 25030 c := v_0.AuxInt 25031 v_1 := v.Args[1] 25032 if v_1.Op != OpSub16 { 25033 break 25034 } 25035 _ = v_1.Args[1] 25036 v_1_0 := v_1.Args[0] 25037 if v_1_0.Op != OpConst16 { 25038 break 25039 } 25040 if v_1_0.Type != t { 25041 break 25042 } 25043 d := v_1_0.AuxInt 25044 x := v_1.Args[1] 25045 v.reset(OpAdd16) 25046 v0 := b.NewValue0(v.Pos, OpConst16, t) 25047 v0.AuxInt = int64(int16(c - d)) 25048 v.AddArg(v0) 25049 v.AddArg(x) 25050 return true 25051 } 25052 return false 25053 } 25054 func rewriteValuegeneric_OpSub32_0(v *Value) bool { 25055 b := v.Block 25056 _ = b 25057 // match: (Sub32 (Const32 [c]) (Const32 [d])) 25058 // cond: 25059 // result: (Const32 [int64(int32(c-d))]) 25060 for { 25061 _ = v.Args[1] 25062 v_0 := v.Args[0] 25063 if v_0.Op != OpConst32 { 25064 break 25065 } 25066 c := v_0.AuxInt 25067 v_1 := v.Args[1] 25068 if v_1.Op != OpConst32 { 25069 break 25070 } 25071 d := v_1.AuxInt 25072 v.reset(OpConst32) 25073 v.AuxInt = int64(int32(c - d)) 25074 return true 25075 } 25076 // match: (Sub32 x (Const32 <t> [c])) 25077 // cond: x.Op != OpConst32 25078 // result: (Add32 (Const32 <t> [int64(int32(-c))]) x) 25079 for { 25080 _ = v.Args[1] 25081 x := v.Args[0] 25082 v_1 := v.Args[1] 25083 if v_1.Op != OpConst32 { 25084 break 25085 } 25086 t := v_1.Type 25087 c := v_1.AuxInt 25088 if !(x.Op != OpConst32) { 25089 break 25090 } 25091 v.reset(OpAdd32) 25092 v0 := b.NewValue0(v.Pos, OpConst32, t) 25093 v0.AuxInt = int64(int32(-c)) 25094 v.AddArg(v0) 25095 v.AddArg(x) 25096 return true 25097 } 25098 // match: (Sub32 <t> (Mul32 x y) (Mul32 x z)) 25099 // cond: 25100 // result: (Mul32 x (Sub32 <t> y z)) 25101 for { 25102 t := v.Type 25103 _ = v.Args[1] 25104 v_0 := v.Args[0] 25105 if v_0.Op != OpMul32 { 25106 break 25107 } 25108 _ = v_0.Args[1] 25109 x := v_0.Args[0] 25110 y := v_0.Args[1] 25111 v_1 := v.Args[1] 25112 if v_1.Op != OpMul32 { 25113 break 25114 } 25115 _ = v_1.Args[1] 25116 if x != v_1.Args[0] { 25117 break 25118 } 25119 z := v_1.Args[1] 25120 v.reset(OpMul32) 25121 v.AddArg(x) 25122 v0 := b.NewValue0(v.Pos, OpSub32, t) 25123 v0.AddArg(y) 25124 v0.AddArg(z) 25125 v.AddArg(v0) 25126 return true 25127 } 25128 // match: (Sub32 <t> (Mul32 y x) (Mul32 x z)) 25129 // cond: 25130 // result: (Mul32 x (Sub32 <t> y z)) 25131 for { 25132 t := v.Type 25133 _ = v.Args[1] 25134 v_0 := v.Args[0] 25135 if v_0.Op != OpMul32 { 25136 break 25137 } 25138 _ = v_0.Args[1] 25139 y := v_0.Args[0] 25140 x := v_0.Args[1] 25141 v_1 := v.Args[1] 25142 if v_1.Op != OpMul32 { 25143 break 25144 } 25145 _ = v_1.Args[1] 25146 if x != v_1.Args[0] { 25147 break 25148 } 25149 z := v_1.Args[1] 25150 v.reset(OpMul32) 25151 v.AddArg(x) 25152 v0 := b.NewValue0(v.Pos, OpSub32, t) 25153 v0.AddArg(y) 25154 v0.AddArg(z) 25155 v.AddArg(v0) 25156 return true 25157 } 25158 // match: (Sub32 <t> (Mul32 x y) (Mul32 z x)) 25159 // cond: 25160 // result: (Mul32 x (Sub32 <t> y z)) 25161 for { 25162 t := v.Type 25163 _ = v.Args[1] 25164 v_0 := v.Args[0] 25165 if v_0.Op != OpMul32 { 25166 break 25167 } 25168 _ = v_0.Args[1] 25169 x := v_0.Args[0] 25170 y := v_0.Args[1] 25171 v_1 := v.Args[1] 25172 if v_1.Op != OpMul32 { 25173 break 25174 } 25175 _ = v_1.Args[1] 25176 z := v_1.Args[0] 25177 if x != v_1.Args[1] { 25178 break 25179 } 25180 v.reset(OpMul32) 25181 v.AddArg(x) 25182 v0 := b.NewValue0(v.Pos, OpSub32, t) 25183 v0.AddArg(y) 25184 v0.AddArg(z) 25185 v.AddArg(v0) 25186 return true 25187 } 25188 // match: (Sub32 <t> (Mul32 y x) (Mul32 z x)) 25189 // cond: 25190 // result: (Mul32 x (Sub32 <t> y z)) 25191 for { 25192 t := v.Type 25193 _ = v.Args[1] 25194 v_0 := v.Args[0] 25195 if v_0.Op != OpMul32 { 25196 break 25197 } 25198 _ = v_0.Args[1] 25199 y := v_0.Args[0] 25200 x := v_0.Args[1] 25201 v_1 := v.Args[1] 25202 if v_1.Op != OpMul32 { 25203 break 25204 } 25205 _ = v_1.Args[1] 25206 z := v_1.Args[0] 25207 if x != v_1.Args[1] { 25208 break 25209 } 25210 v.reset(OpMul32) 25211 v.AddArg(x) 25212 v0 := b.NewValue0(v.Pos, OpSub32, t) 25213 v0.AddArg(y) 25214 v0.AddArg(z) 25215 v.AddArg(v0) 25216 return true 25217 } 25218 // match: (Sub32 x x) 25219 // cond: 25220 // result: (Const32 [0]) 25221 for { 25222 _ = v.Args[1] 25223 x := v.Args[0] 25224 if x != v.Args[1] { 25225 break 25226 } 25227 v.reset(OpConst32) 25228 v.AuxInt = 0 25229 return true 25230 } 25231 // match: (Sub32 (Add32 x y) x) 25232 // cond: 25233 // result: y 25234 for { 25235 _ = v.Args[1] 25236 v_0 := v.Args[0] 25237 if v_0.Op != OpAdd32 { 25238 break 25239 } 25240 _ = v_0.Args[1] 25241 x := v_0.Args[0] 25242 y := v_0.Args[1] 25243 if x != v.Args[1] { 25244 break 25245 } 25246 v.reset(OpCopy) 25247 v.Type = y.Type 25248 v.AddArg(y) 25249 return true 25250 } 25251 // match: (Sub32 (Add32 y x) x) 25252 // cond: 25253 // result: y 25254 for { 25255 _ = v.Args[1] 25256 v_0 := v.Args[0] 25257 if v_0.Op != OpAdd32 { 25258 break 25259 } 25260 _ = v_0.Args[1] 25261 y := v_0.Args[0] 25262 x := v_0.Args[1] 25263 if x != v.Args[1] { 25264 break 25265 } 25266 v.reset(OpCopy) 25267 v.Type = y.Type 25268 v.AddArg(y) 25269 return true 25270 } 25271 // match: (Sub32 (Add32 x y) y) 25272 // cond: 25273 // result: x 25274 for { 25275 _ = v.Args[1] 25276 v_0 := v.Args[0] 25277 if v_0.Op != OpAdd32 { 25278 break 25279 } 25280 _ = v_0.Args[1] 25281 x := v_0.Args[0] 25282 y := v_0.Args[1] 25283 if y != v.Args[1] { 25284 break 25285 } 25286 v.reset(OpCopy) 25287 v.Type = x.Type 25288 v.AddArg(x) 25289 return true 25290 } 25291 return false 25292 } 25293 func rewriteValuegeneric_OpSub32_10(v *Value) bool { 25294 b := v.Block 25295 _ = b 25296 // match: (Sub32 (Add32 y x) y) 25297 // cond: 25298 // result: x 25299 for { 25300 _ = v.Args[1] 25301 v_0 := v.Args[0] 25302 if v_0.Op != OpAdd32 { 25303 break 25304 } 25305 _ = v_0.Args[1] 25306 y := v_0.Args[0] 25307 x := v_0.Args[1] 25308 if y != v.Args[1] { 25309 break 25310 } 25311 v.reset(OpCopy) 25312 v.Type = x.Type 25313 v.AddArg(x) 25314 return true 25315 } 25316 // match: (Sub32 x (Sub32 i:(Const32 <t>) z)) 25317 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 25318 // result: (Sub32 (Add32 <t> x z) i) 25319 for { 25320 _ = v.Args[1] 25321 x := v.Args[0] 25322 v_1 := v.Args[1] 25323 if v_1.Op != OpSub32 { 25324 break 25325 } 25326 _ = v_1.Args[1] 25327 i := v_1.Args[0] 25328 if i.Op != OpConst32 { 25329 break 25330 } 25331 t := i.Type 25332 z := v_1.Args[1] 25333 if !(z.Op != OpConst32 && x.Op != OpConst32) { 25334 break 25335 } 25336 v.reset(OpSub32) 25337 v0 := b.NewValue0(v.Pos, OpAdd32, t) 25338 v0.AddArg(x) 25339 v0.AddArg(z) 25340 v.AddArg(v0) 25341 v.AddArg(i) 25342 return true 25343 } 25344 // match: (Sub32 x (Sub32 z i:(Const32 <t>))) 25345 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 25346 // result: (Add32 i (Sub32 <t> x z)) 25347 for { 25348 _ = v.Args[1] 25349 x := v.Args[0] 25350 v_1 := v.Args[1] 25351 if v_1.Op != OpSub32 { 25352 break 25353 } 25354 _ = v_1.Args[1] 25355 z := v_1.Args[0] 25356 i := v_1.Args[1] 25357 if i.Op != OpConst32 { 25358 break 25359 } 25360 t := i.Type 25361 if !(z.Op != OpConst32 && x.Op != OpConst32) { 25362 break 25363 } 25364 v.reset(OpAdd32) 25365 v.AddArg(i) 25366 v0 := b.NewValue0(v.Pos, OpSub32, t) 25367 v0.AddArg(x) 25368 v0.AddArg(z) 25369 v.AddArg(v0) 25370 return true 25371 } 25372 // match: (Sub32 (Const32 <t> [c]) (Sub32 x (Const32 <t> [d]))) 25373 // cond: 25374 // result: (Sub32 (Const32 <t> [int64(int32(c+d))]) x) 25375 for { 25376 _ = v.Args[1] 25377 v_0 := v.Args[0] 25378 if v_0.Op != OpConst32 { 25379 break 25380 } 25381 t := v_0.Type 25382 c := v_0.AuxInt 25383 v_1 := v.Args[1] 25384 if v_1.Op != OpSub32 { 25385 break 25386 } 25387 _ = v_1.Args[1] 25388 x := v_1.Args[0] 25389 v_1_1 := v_1.Args[1] 25390 if v_1_1.Op != OpConst32 { 25391 break 25392 } 25393 if v_1_1.Type != t { 25394 break 25395 } 25396 d := v_1_1.AuxInt 25397 v.reset(OpSub32) 25398 v0 := b.NewValue0(v.Pos, OpConst32, t) 25399 v0.AuxInt = int64(int32(c + d)) 25400 v.AddArg(v0) 25401 v.AddArg(x) 25402 return true 25403 } 25404 // match: (Sub32 (Const32 <t> [c]) (Sub32 (Const32 <t> [d]) x)) 25405 // cond: 25406 // result: (Add32 (Const32 <t> [int64(int32(c-d))]) x) 25407 for { 25408 _ = v.Args[1] 25409 v_0 := v.Args[0] 25410 if v_0.Op != OpConst32 { 25411 break 25412 } 25413 t := v_0.Type 25414 c := v_0.AuxInt 25415 v_1 := v.Args[1] 25416 if v_1.Op != OpSub32 { 25417 break 25418 } 25419 _ = v_1.Args[1] 25420 v_1_0 := v_1.Args[0] 25421 if v_1_0.Op != OpConst32 { 25422 break 25423 } 25424 if v_1_0.Type != t { 25425 break 25426 } 25427 d := v_1_0.AuxInt 25428 x := v_1.Args[1] 25429 v.reset(OpAdd32) 25430 v0 := b.NewValue0(v.Pos, OpConst32, t) 25431 v0.AuxInt = int64(int32(c - d)) 25432 v.AddArg(v0) 25433 v.AddArg(x) 25434 return true 25435 } 25436 return false 25437 } 25438 func rewriteValuegeneric_OpSub32F_0(v *Value) bool { 25439 // match: (Sub32F (Const32F [c]) (Const32F [d])) 25440 // cond: 25441 // result: (Const32F [f2i(float64(i2f32(c) - i2f32(d)))]) 25442 for { 25443 _ = v.Args[1] 25444 v_0 := v.Args[0] 25445 if v_0.Op != OpConst32F { 25446 break 25447 } 25448 c := v_0.AuxInt 25449 v_1 := v.Args[1] 25450 if v_1.Op != OpConst32F { 25451 break 25452 } 25453 d := v_1.AuxInt 25454 v.reset(OpConst32F) 25455 v.AuxInt = f2i(float64(i2f32(c) - i2f32(d))) 25456 return true 25457 } 25458 // match: (Sub32F x (Const32F [0])) 25459 // cond: 25460 // result: x 25461 for { 25462 _ = v.Args[1] 25463 x := v.Args[0] 25464 v_1 := v.Args[1] 25465 if v_1.Op != OpConst32F { 25466 break 25467 } 25468 if v_1.AuxInt != 0 { 25469 break 25470 } 25471 v.reset(OpCopy) 25472 v.Type = x.Type 25473 v.AddArg(x) 25474 return true 25475 } 25476 return false 25477 } 25478 func rewriteValuegeneric_OpSub64_0(v *Value) bool { 25479 b := v.Block 25480 _ = b 25481 // match: (Sub64 (Const64 [c]) (Const64 [d])) 25482 // cond: 25483 // result: (Const64 [c-d]) 25484 for { 25485 _ = v.Args[1] 25486 v_0 := v.Args[0] 25487 if v_0.Op != OpConst64 { 25488 break 25489 } 25490 c := v_0.AuxInt 25491 v_1 := v.Args[1] 25492 if v_1.Op != OpConst64 { 25493 break 25494 } 25495 d := v_1.AuxInt 25496 v.reset(OpConst64) 25497 v.AuxInt = c - d 25498 return true 25499 } 25500 // match: (Sub64 x (Const64 <t> [c])) 25501 // cond: x.Op != OpConst64 25502 // result: (Add64 (Const64 <t> [-c]) x) 25503 for { 25504 _ = v.Args[1] 25505 x := v.Args[0] 25506 v_1 := v.Args[1] 25507 if v_1.Op != OpConst64 { 25508 break 25509 } 25510 t := v_1.Type 25511 c := v_1.AuxInt 25512 if !(x.Op != OpConst64) { 25513 break 25514 } 25515 v.reset(OpAdd64) 25516 v0 := b.NewValue0(v.Pos, OpConst64, t) 25517 v0.AuxInt = -c 25518 v.AddArg(v0) 25519 v.AddArg(x) 25520 return true 25521 } 25522 // match: (Sub64 <t> (Mul64 x y) (Mul64 x z)) 25523 // cond: 25524 // result: (Mul64 x (Sub64 <t> y z)) 25525 for { 25526 t := v.Type 25527 _ = v.Args[1] 25528 v_0 := v.Args[0] 25529 if v_0.Op != OpMul64 { 25530 break 25531 } 25532 _ = v_0.Args[1] 25533 x := v_0.Args[0] 25534 y := v_0.Args[1] 25535 v_1 := v.Args[1] 25536 if v_1.Op != OpMul64 { 25537 break 25538 } 25539 _ = v_1.Args[1] 25540 if x != v_1.Args[0] { 25541 break 25542 } 25543 z := v_1.Args[1] 25544 v.reset(OpMul64) 25545 v.AddArg(x) 25546 v0 := b.NewValue0(v.Pos, OpSub64, t) 25547 v0.AddArg(y) 25548 v0.AddArg(z) 25549 v.AddArg(v0) 25550 return true 25551 } 25552 // match: (Sub64 <t> (Mul64 y x) (Mul64 x z)) 25553 // cond: 25554 // result: (Mul64 x (Sub64 <t> y z)) 25555 for { 25556 t := v.Type 25557 _ = v.Args[1] 25558 v_0 := v.Args[0] 25559 if v_0.Op != OpMul64 { 25560 break 25561 } 25562 _ = v_0.Args[1] 25563 y := v_0.Args[0] 25564 x := v_0.Args[1] 25565 v_1 := v.Args[1] 25566 if v_1.Op != OpMul64 { 25567 break 25568 } 25569 _ = v_1.Args[1] 25570 if x != v_1.Args[0] { 25571 break 25572 } 25573 z := v_1.Args[1] 25574 v.reset(OpMul64) 25575 v.AddArg(x) 25576 v0 := b.NewValue0(v.Pos, OpSub64, t) 25577 v0.AddArg(y) 25578 v0.AddArg(z) 25579 v.AddArg(v0) 25580 return true 25581 } 25582 // match: (Sub64 <t> (Mul64 x y) (Mul64 z x)) 25583 // cond: 25584 // result: (Mul64 x (Sub64 <t> y z)) 25585 for { 25586 t := v.Type 25587 _ = v.Args[1] 25588 v_0 := v.Args[0] 25589 if v_0.Op != OpMul64 { 25590 break 25591 } 25592 _ = v_0.Args[1] 25593 x := v_0.Args[0] 25594 y := v_0.Args[1] 25595 v_1 := v.Args[1] 25596 if v_1.Op != OpMul64 { 25597 break 25598 } 25599 _ = v_1.Args[1] 25600 z := v_1.Args[0] 25601 if x != v_1.Args[1] { 25602 break 25603 } 25604 v.reset(OpMul64) 25605 v.AddArg(x) 25606 v0 := b.NewValue0(v.Pos, OpSub64, t) 25607 v0.AddArg(y) 25608 v0.AddArg(z) 25609 v.AddArg(v0) 25610 return true 25611 } 25612 // match: (Sub64 <t> (Mul64 y x) (Mul64 z x)) 25613 // cond: 25614 // result: (Mul64 x (Sub64 <t> y z)) 25615 for { 25616 t := v.Type 25617 _ = v.Args[1] 25618 v_0 := v.Args[0] 25619 if v_0.Op != OpMul64 { 25620 break 25621 } 25622 _ = v_0.Args[1] 25623 y := v_0.Args[0] 25624 x := v_0.Args[1] 25625 v_1 := v.Args[1] 25626 if v_1.Op != OpMul64 { 25627 break 25628 } 25629 _ = v_1.Args[1] 25630 z := v_1.Args[0] 25631 if x != v_1.Args[1] { 25632 break 25633 } 25634 v.reset(OpMul64) 25635 v.AddArg(x) 25636 v0 := b.NewValue0(v.Pos, OpSub64, t) 25637 v0.AddArg(y) 25638 v0.AddArg(z) 25639 v.AddArg(v0) 25640 return true 25641 } 25642 // match: (Sub64 x x) 25643 // cond: 25644 // result: (Const64 [0]) 25645 for { 25646 _ = v.Args[1] 25647 x := v.Args[0] 25648 if x != v.Args[1] { 25649 break 25650 } 25651 v.reset(OpConst64) 25652 v.AuxInt = 0 25653 return true 25654 } 25655 // match: (Sub64 (Add64 x y) x) 25656 // cond: 25657 // result: y 25658 for { 25659 _ = v.Args[1] 25660 v_0 := v.Args[0] 25661 if v_0.Op != OpAdd64 { 25662 break 25663 } 25664 _ = v_0.Args[1] 25665 x := v_0.Args[0] 25666 y := v_0.Args[1] 25667 if x != v.Args[1] { 25668 break 25669 } 25670 v.reset(OpCopy) 25671 v.Type = y.Type 25672 v.AddArg(y) 25673 return true 25674 } 25675 // match: (Sub64 (Add64 y x) x) 25676 // cond: 25677 // result: y 25678 for { 25679 _ = v.Args[1] 25680 v_0 := v.Args[0] 25681 if v_0.Op != OpAdd64 { 25682 break 25683 } 25684 _ = v_0.Args[1] 25685 y := v_0.Args[0] 25686 x := v_0.Args[1] 25687 if x != v.Args[1] { 25688 break 25689 } 25690 v.reset(OpCopy) 25691 v.Type = y.Type 25692 v.AddArg(y) 25693 return true 25694 } 25695 // match: (Sub64 (Add64 x y) y) 25696 // cond: 25697 // result: x 25698 for { 25699 _ = v.Args[1] 25700 v_0 := v.Args[0] 25701 if v_0.Op != OpAdd64 { 25702 break 25703 } 25704 _ = v_0.Args[1] 25705 x := v_0.Args[0] 25706 y := v_0.Args[1] 25707 if y != v.Args[1] { 25708 break 25709 } 25710 v.reset(OpCopy) 25711 v.Type = x.Type 25712 v.AddArg(x) 25713 return true 25714 } 25715 return false 25716 } 25717 func rewriteValuegeneric_OpSub64_10(v *Value) bool { 25718 b := v.Block 25719 _ = b 25720 // match: (Sub64 (Add64 y x) y) 25721 // cond: 25722 // result: x 25723 for { 25724 _ = v.Args[1] 25725 v_0 := v.Args[0] 25726 if v_0.Op != OpAdd64 { 25727 break 25728 } 25729 _ = v_0.Args[1] 25730 y := v_0.Args[0] 25731 x := v_0.Args[1] 25732 if y != v.Args[1] { 25733 break 25734 } 25735 v.reset(OpCopy) 25736 v.Type = x.Type 25737 v.AddArg(x) 25738 return true 25739 } 25740 // match: (Sub64 x (Sub64 i:(Const64 <t>) z)) 25741 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 25742 // result: (Sub64 (Add64 <t> x z) i) 25743 for { 25744 _ = v.Args[1] 25745 x := v.Args[0] 25746 v_1 := v.Args[1] 25747 if v_1.Op != OpSub64 { 25748 break 25749 } 25750 _ = v_1.Args[1] 25751 i := v_1.Args[0] 25752 if i.Op != OpConst64 { 25753 break 25754 } 25755 t := i.Type 25756 z := v_1.Args[1] 25757 if !(z.Op != OpConst64 && x.Op != OpConst64) { 25758 break 25759 } 25760 v.reset(OpSub64) 25761 v0 := b.NewValue0(v.Pos, OpAdd64, t) 25762 v0.AddArg(x) 25763 v0.AddArg(z) 25764 v.AddArg(v0) 25765 v.AddArg(i) 25766 return true 25767 } 25768 // match: (Sub64 x (Sub64 z i:(Const64 <t>))) 25769 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 25770 // result: (Add64 i (Sub64 <t> x z)) 25771 for { 25772 _ = v.Args[1] 25773 x := v.Args[0] 25774 v_1 := v.Args[1] 25775 if v_1.Op != OpSub64 { 25776 break 25777 } 25778 _ = v_1.Args[1] 25779 z := v_1.Args[0] 25780 i := v_1.Args[1] 25781 if i.Op != OpConst64 { 25782 break 25783 } 25784 t := i.Type 25785 if !(z.Op != OpConst64 && x.Op != OpConst64) { 25786 break 25787 } 25788 v.reset(OpAdd64) 25789 v.AddArg(i) 25790 v0 := b.NewValue0(v.Pos, OpSub64, t) 25791 v0.AddArg(x) 25792 v0.AddArg(z) 25793 v.AddArg(v0) 25794 return true 25795 } 25796 // match: (Sub64 (Const64 <t> [c]) (Sub64 x (Const64 <t> [d]))) 25797 // cond: 25798 // result: (Sub64 (Const64 <t> [c+d]) x) 25799 for { 25800 _ = v.Args[1] 25801 v_0 := v.Args[0] 25802 if v_0.Op != OpConst64 { 25803 break 25804 } 25805 t := v_0.Type 25806 c := v_0.AuxInt 25807 v_1 := v.Args[1] 25808 if v_1.Op != OpSub64 { 25809 break 25810 } 25811 _ = v_1.Args[1] 25812 x := v_1.Args[0] 25813 v_1_1 := v_1.Args[1] 25814 if v_1_1.Op != OpConst64 { 25815 break 25816 } 25817 if v_1_1.Type != t { 25818 break 25819 } 25820 d := v_1_1.AuxInt 25821 v.reset(OpSub64) 25822 v0 := b.NewValue0(v.Pos, OpConst64, t) 25823 v0.AuxInt = c + d 25824 v.AddArg(v0) 25825 v.AddArg(x) 25826 return true 25827 } 25828 // match: (Sub64 (Const64 <t> [c]) (Sub64 (Const64 <t> [d]) x)) 25829 // cond: 25830 // result: (Add64 (Const64 <t> [c-d]) x) 25831 for { 25832 _ = v.Args[1] 25833 v_0 := v.Args[0] 25834 if v_0.Op != OpConst64 { 25835 break 25836 } 25837 t := v_0.Type 25838 c := v_0.AuxInt 25839 v_1 := v.Args[1] 25840 if v_1.Op != OpSub64 { 25841 break 25842 } 25843 _ = v_1.Args[1] 25844 v_1_0 := v_1.Args[0] 25845 if v_1_0.Op != OpConst64 { 25846 break 25847 } 25848 if v_1_0.Type != t { 25849 break 25850 } 25851 d := v_1_0.AuxInt 25852 x := v_1.Args[1] 25853 v.reset(OpAdd64) 25854 v0 := b.NewValue0(v.Pos, OpConst64, t) 25855 v0.AuxInt = c - d 25856 v.AddArg(v0) 25857 v.AddArg(x) 25858 return true 25859 } 25860 return false 25861 } 25862 func rewriteValuegeneric_OpSub64F_0(v *Value) bool { 25863 // match: (Sub64F (Const64F [c]) (Const64F [d])) 25864 // cond: 25865 // result: (Const64F [f2i(i2f(c) - i2f(d))]) 25866 for { 25867 _ = v.Args[1] 25868 v_0 := v.Args[0] 25869 if v_0.Op != OpConst64F { 25870 break 25871 } 25872 c := v_0.AuxInt 25873 v_1 := v.Args[1] 25874 if v_1.Op != OpConst64F { 25875 break 25876 } 25877 d := v_1.AuxInt 25878 v.reset(OpConst64F) 25879 v.AuxInt = f2i(i2f(c) - i2f(d)) 25880 return true 25881 } 25882 // match: (Sub64F x (Const64F [0])) 25883 // cond: 25884 // result: x 25885 for { 25886 _ = v.Args[1] 25887 x := v.Args[0] 25888 v_1 := v.Args[1] 25889 if v_1.Op != OpConst64F { 25890 break 25891 } 25892 if v_1.AuxInt != 0 { 25893 break 25894 } 25895 v.reset(OpCopy) 25896 v.Type = x.Type 25897 v.AddArg(x) 25898 return true 25899 } 25900 return false 25901 } 25902 func rewriteValuegeneric_OpSub8_0(v *Value) bool { 25903 b := v.Block 25904 _ = b 25905 // match: (Sub8 (Const8 [c]) (Const8 [d])) 25906 // cond: 25907 // result: (Const8 [int64(int8(c-d))]) 25908 for { 25909 _ = v.Args[1] 25910 v_0 := v.Args[0] 25911 if v_0.Op != OpConst8 { 25912 break 25913 } 25914 c := v_0.AuxInt 25915 v_1 := v.Args[1] 25916 if v_1.Op != OpConst8 { 25917 break 25918 } 25919 d := v_1.AuxInt 25920 v.reset(OpConst8) 25921 v.AuxInt = int64(int8(c - d)) 25922 return true 25923 } 25924 // match: (Sub8 x (Const8 <t> [c])) 25925 // cond: x.Op != OpConst8 25926 // result: (Add8 (Const8 <t> [int64(int8(-c))]) x) 25927 for { 25928 _ = v.Args[1] 25929 x := v.Args[0] 25930 v_1 := v.Args[1] 25931 if v_1.Op != OpConst8 { 25932 break 25933 } 25934 t := v_1.Type 25935 c := v_1.AuxInt 25936 if !(x.Op != OpConst8) { 25937 break 25938 } 25939 v.reset(OpAdd8) 25940 v0 := b.NewValue0(v.Pos, OpConst8, t) 25941 v0.AuxInt = int64(int8(-c)) 25942 v.AddArg(v0) 25943 v.AddArg(x) 25944 return true 25945 } 25946 // match: (Sub8 <t> (Mul8 x y) (Mul8 x z)) 25947 // cond: 25948 // result: (Mul8 x (Sub8 <t> y z)) 25949 for { 25950 t := v.Type 25951 _ = v.Args[1] 25952 v_0 := v.Args[0] 25953 if v_0.Op != OpMul8 { 25954 break 25955 } 25956 _ = v_0.Args[1] 25957 x := v_0.Args[0] 25958 y := v_0.Args[1] 25959 v_1 := v.Args[1] 25960 if v_1.Op != OpMul8 { 25961 break 25962 } 25963 _ = v_1.Args[1] 25964 if x != v_1.Args[0] { 25965 break 25966 } 25967 z := v_1.Args[1] 25968 v.reset(OpMul8) 25969 v.AddArg(x) 25970 v0 := b.NewValue0(v.Pos, OpSub8, t) 25971 v0.AddArg(y) 25972 v0.AddArg(z) 25973 v.AddArg(v0) 25974 return true 25975 } 25976 // match: (Sub8 <t> (Mul8 y x) (Mul8 x z)) 25977 // cond: 25978 // result: (Mul8 x (Sub8 <t> y z)) 25979 for { 25980 t := v.Type 25981 _ = v.Args[1] 25982 v_0 := v.Args[0] 25983 if v_0.Op != OpMul8 { 25984 break 25985 } 25986 _ = v_0.Args[1] 25987 y := v_0.Args[0] 25988 x := v_0.Args[1] 25989 v_1 := v.Args[1] 25990 if v_1.Op != OpMul8 { 25991 break 25992 } 25993 _ = v_1.Args[1] 25994 if x != v_1.Args[0] { 25995 break 25996 } 25997 z := v_1.Args[1] 25998 v.reset(OpMul8) 25999 v.AddArg(x) 26000 v0 := b.NewValue0(v.Pos, OpSub8, t) 26001 v0.AddArg(y) 26002 v0.AddArg(z) 26003 v.AddArg(v0) 26004 return true 26005 } 26006 // match: (Sub8 <t> (Mul8 x y) (Mul8 z x)) 26007 // cond: 26008 // result: (Mul8 x (Sub8 <t> y z)) 26009 for { 26010 t := v.Type 26011 _ = v.Args[1] 26012 v_0 := v.Args[0] 26013 if v_0.Op != OpMul8 { 26014 break 26015 } 26016 _ = v_0.Args[1] 26017 x := v_0.Args[0] 26018 y := v_0.Args[1] 26019 v_1 := v.Args[1] 26020 if v_1.Op != OpMul8 { 26021 break 26022 } 26023 _ = v_1.Args[1] 26024 z := v_1.Args[0] 26025 if x != v_1.Args[1] { 26026 break 26027 } 26028 v.reset(OpMul8) 26029 v.AddArg(x) 26030 v0 := b.NewValue0(v.Pos, OpSub8, t) 26031 v0.AddArg(y) 26032 v0.AddArg(z) 26033 v.AddArg(v0) 26034 return true 26035 } 26036 // match: (Sub8 <t> (Mul8 y x) (Mul8 z x)) 26037 // cond: 26038 // result: (Mul8 x (Sub8 <t> y z)) 26039 for { 26040 t := v.Type 26041 _ = v.Args[1] 26042 v_0 := v.Args[0] 26043 if v_0.Op != OpMul8 { 26044 break 26045 } 26046 _ = v_0.Args[1] 26047 y := v_0.Args[0] 26048 x := v_0.Args[1] 26049 v_1 := v.Args[1] 26050 if v_1.Op != OpMul8 { 26051 break 26052 } 26053 _ = v_1.Args[1] 26054 z := v_1.Args[0] 26055 if x != v_1.Args[1] { 26056 break 26057 } 26058 v.reset(OpMul8) 26059 v.AddArg(x) 26060 v0 := b.NewValue0(v.Pos, OpSub8, t) 26061 v0.AddArg(y) 26062 v0.AddArg(z) 26063 v.AddArg(v0) 26064 return true 26065 } 26066 // match: (Sub8 x x) 26067 // cond: 26068 // result: (Const8 [0]) 26069 for { 26070 _ = v.Args[1] 26071 x := v.Args[0] 26072 if x != v.Args[1] { 26073 break 26074 } 26075 v.reset(OpConst8) 26076 v.AuxInt = 0 26077 return true 26078 } 26079 // match: (Sub8 (Add8 x y) x) 26080 // cond: 26081 // result: y 26082 for { 26083 _ = v.Args[1] 26084 v_0 := v.Args[0] 26085 if v_0.Op != OpAdd8 { 26086 break 26087 } 26088 _ = v_0.Args[1] 26089 x := v_0.Args[0] 26090 y := v_0.Args[1] 26091 if x != v.Args[1] { 26092 break 26093 } 26094 v.reset(OpCopy) 26095 v.Type = y.Type 26096 v.AddArg(y) 26097 return true 26098 } 26099 // match: (Sub8 (Add8 y x) x) 26100 // cond: 26101 // result: y 26102 for { 26103 _ = v.Args[1] 26104 v_0 := v.Args[0] 26105 if v_0.Op != OpAdd8 { 26106 break 26107 } 26108 _ = v_0.Args[1] 26109 y := v_0.Args[0] 26110 x := v_0.Args[1] 26111 if x != v.Args[1] { 26112 break 26113 } 26114 v.reset(OpCopy) 26115 v.Type = y.Type 26116 v.AddArg(y) 26117 return true 26118 } 26119 // match: (Sub8 (Add8 x y) y) 26120 // cond: 26121 // result: x 26122 for { 26123 _ = v.Args[1] 26124 v_0 := v.Args[0] 26125 if v_0.Op != OpAdd8 { 26126 break 26127 } 26128 _ = v_0.Args[1] 26129 x := v_0.Args[0] 26130 y := v_0.Args[1] 26131 if y != v.Args[1] { 26132 break 26133 } 26134 v.reset(OpCopy) 26135 v.Type = x.Type 26136 v.AddArg(x) 26137 return true 26138 } 26139 return false 26140 } 26141 func rewriteValuegeneric_OpSub8_10(v *Value) bool { 26142 b := v.Block 26143 _ = b 26144 // match: (Sub8 (Add8 y x) y) 26145 // cond: 26146 // result: x 26147 for { 26148 _ = v.Args[1] 26149 v_0 := v.Args[0] 26150 if v_0.Op != OpAdd8 { 26151 break 26152 } 26153 _ = v_0.Args[1] 26154 y := v_0.Args[0] 26155 x := v_0.Args[1] 26156 if y != v.Args[1] { 26157 break 26158 } 26159 v.reset(OpCopy) 26160 v.Type = x.Type 26161 v.AddArg(x) 26162 return true 26163 } 26164 // match: (Sub8 x (Sub8 i:(Const8 <t>) z)) 26165 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 26166 // result: (Sub8 (Add8 <t> x z) i) 26167 for { 26168 _ = v.Args[1] 26169 x := v.Args[0] 26170 v_1 := v.Args[1] 26171 if v_1.Op != OpSub8 { 26172 break 26173 } 26174 _ = v_1.Args[1] 26175 i := v_1.Args[0] 26176 if i.Op != OpConst8 { 26177 break 26178 } 26179 t := i.Type 26180 z := v_1.Args[1] 26181 if !(z.Op != OpConst8 && x.Op != OpConst8) { 26182 break 26183 } 26184 v.reset(OpSub8) 26185 v0 := b.NewValue0(v.Pos, OpAdd8, t) 26186 v0.AddArg(x) 26187 v0.AddArg(z) 26188 v.AddArg(v0) 26189 v.AddArg(i) 26190 return true 26191 } 26192 // match: (Sub8 x (Sub8 z i:(Const8 <t>))) 26193 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 26194 // result: (Add8 i (Sub8 <t> x z)) 26195 for { 26196 _ = v.Args[1] 26197 x := v.Args[0] 26198 v_1 := v.Args[1] 26199 if v_1.Op != OpSub8 { 26200 break 26201 } 26202 _ = v_1.Args[1] 26203 z := v_1.Args[0] 26204 i := v_1.Args[1] 26205 if i.Op != OpConst8 { 26206 break 26207 } 26208 t := i.Type 26209 if !(z.Op != OpConst8 && x.Op != OpConst8) { 26210 break 26211 } 26212 v.reset(OpAdd8) 26213 v.AddArg(i) 26214 v0 := b.NewValue0(v.Pos, OpSub8, t) 26215 v0.AddArg(x) 26216 v0.AddArg(z) 26217 v.AddArg(v0) 26218 return true 26219 } 26220 // match: (Sub8 (Const8 <t> [c]) (Sub8 x (Const8 <t> [d]))) 26221 // cond: 26222 // result: (Sub8 (Const8 <t> [int64(int8(c+d))]) x) 26223 for { 26224 _ = v.Args[1] 26225 v_0 := v.Args[0] 26226 if v_0.Op != OpConst8 { 26227 break 26228 } 26229 t := v_0.Type 26230 c := v_0.AuxInt 26231 v_1 := v.Args[1] 26232 if v_1.Op != OpSub8 { 26233 break 26234 } 26235 _ = v_1.Args[1] 26236 x := v_1.Args[0] 26237 v_1_1 := v_1.Args[1] 26238 if v_1_1.Op != OpConst8 { 26239 break 26240 } 26241 if v_1_1.Type != t { 26242 break 26243 } 26244 d := v_1_1.AuxInt 26245 v.reset(OpSub8) 26246 v0 := b.NewValue0(v.Pos, OpConst8, t) 26247 v0.AuxInt = int64(int8(c + d)) 26248 v.AddArg(v0) 26249 v.AddArg(x) 26250 return true 26251 } 26252 // match: (Sub8 (Const8 <t> [c]) (Sub8 (Const8 <t> [d]) x)) 26253 // cond: 26254 // result: (Add8 (Const8 <t> [int64(int8(c-d))]) x) 26255 for { 26256 _ = v.Args[1] 26257 v_0 := v.Args[0] 26258 if v_0.Op != OpConst8 { 26259 break 26260 } 26261 t := v_0.Type 26262 c := v_0.AuxInt 26263 v_1 := v.Args[1] 26264 if v_1.Op != OpSub8 { 26265 break 26266 } 26267 _ = v_1.Args[1] 26268 v_1_0 := v_1.Args[0] 26269 if v_1_0.Op != OpConst8 { 26270 break 26271 } 26272 if v_1_0.Type != t { 26273 break 26274 } 26275 d := v_1_0.AuxInt 26276 x := v_1.Args[1] 26277 v.reset(OpAdd8) 26278 v0 := b.NewValue0(v.Pos, OpConst8, t) 26279 v0.AuxInt = int64(int8(c - d)) 26280 v.AddArg(v0) 26281 v.AddArg(x) 26282 return true 26283 } 26284 return false 26285 } 26286 func rewriteValuegeneric_OpTrunc16to8_0(v *Value) bool { 26287 // match: (Trunc16to8 (Const16 [c])) 26288 // cond: 26289 // result: (Const8 [int64(int8(c))]) 26290 for { 26291 v_0 := v.Args[0] 26292 if v_0.Op != OpConst16 { 26293 break 26294 } 26295 c := v_0.AuxInt 26296 v.reset(OpConst8) 26297 v.AuxInt = int64(int8(c)) 26298 return true 26299 } 26300 // match: (Trunc16to8 (ZeroExt8to16 x)) 26301 // cond: 26302 // result: x 26303 for { 26304 v_0 := v.Args[0] 26305 if v_0.Op != OpZeroExt8to16 { 26306 break 26307 } 26308 x := v_0.Args[0] 26309 v.reset(OpCopy) 26310 v.Type = x.Type 26311 v.AddArg(x) 26312 return true 26313 } 26314 // match: (Trunc16to8 (SignExt8to16 x)) 26315 // cond: 26316 // result: x 26317 for { 26318 v_0 := v.Args[0] 26319 if v_0.Op != OpSignExt8to16 { 26320 break 26321 } 26322 x := v_0.Args[0] 26323 v.reset(OpCopy) 26324 v.Type = x.Type 26325 v.AddArg(x) 26326 return true 26327 } 26328 // match: (Trunc16to8 (And16 (Const16 [y]) x)) 26329 // cond: y&0xFF == 0xFF 26330 // result: (Trunc16to8 x) 26331 for { 26332 v_0 := v.Args[0] 26333 if v_0.Op != OpAnd16 { 26334 break 26335 } 26336 _ = v_0.Args[1] 26337 v_0_0 := v_0.Args[0] 26338 if v_0_0.Op != OpConst16 { 26339 break 26340 } 26341 y := v_0_0.AuxInt 26342 x := v_0.Args[1] 26343 if !(y&0xFF == 0xFF) { 26344 break 26345 } 26346 v.reset(OpTrunc16to8) 26347 v.AddArg(x) 26348 return true 26349 } 26350 // match: (Trunc16to8 (And16 x (Const16 [y]))) 26351 // cond: y&0xFF == 0xFF 26352 // result: (Trunc16to8 x) 26353 for { 26354 v_0 := v.Args[0] 26355 if v_0.Op != OpAnd16 { 26356 break 26357 } 26358 _ = v_0.Args[1] 26359 x := v_0.Args[0] 26360 v_0_1 := v_0.Args[1] 26361 if v_0_1.Op != OpConst16 { 26362 break 26363 } 26364 y := v_0_1.AuxInt 26365 if !(y&0xFF == 0xFF) { 26366 break 26367 } 26368 v.reset(OpTrunc16to8) 26369 v.AddArg(x) 26370 return true 26371 } 26372 return false 26373 } 26374 func rewriteValuegeneric_OpTrunc32to16_0(v *Value) bool { 26375 // match: (Trunc32to16 (Const32 [c])) 26376 // cond: 26377 // result: (Const16 [int64(int16(c))]) 26378 for { 26379 v_0 := v.Args[0] 26380 if v_0.Op != OpConst32 { 26381 break 26382 } 26383 c := v_0.AuxInt 26384 v.reset(OpConst16) 26385 v.AuxInt = int64(int16(c)) 26386 return true 26387 } 26388 // match: (Trunc32to16 (ZeroExt8to32 x)) 26389 // cond: 26390 // result: (ZeroExt8to16 x) 26391 for { 26392 v_0 := v.Args[0] 26393 if v_0.Op != OpZeroExt8to32 { 26394 break 26395 } 26396 x := v_0.Args[0] 26397 v.reset(OpZeroExt8to16) 26398 v.AddArg(x) 26399 return true 26400 } 26401 // match: (Trunc32to16 (ZeroExt16to32 x)) 26402 // cond: 26403 // result: x 26404 for { 26405 v_0 := v.Args[0] 26406 if v_0.Op != OpZeroExt16to32 { 26407 break 26408 } 26409 x := v_0.Args[0] 26410 v.reset(OpCopy) 26411 v.Type = x.Type 26412 v.AddArg(x) 26413 return true 26414 } 26415 // match: (Trunc32to16 (SignExt8to32 x)) 26416 // cond: 26417 // result: (SignExt8to16 x) 26418 for { 26419 v_0 := v.Args[0] 26420 if v_0.Op != OpSignExt8to32 { 26421 break 26422 } 26423 x := v_0.Args[0] 26424 v.reset(OpSignExt8to16) 26425 v.AddArg(x) 26426 return true 26427 } 26428 // match: (Trunc32to16 (SignExt16to32 x)) 26429 // cond: 26430 // result: x 26431 for { 26432 v_0 := v.Args[0] 26433 if v_0.Op != OpSignExt16to32 { 26434 break 26435 } 26436 x := v_0.Args[0] 26437 v.reset(OpCopy) 26438 v.Type = x.Type 26439 v.AddArg(x) 26440 return true 26441 } 26442 // match: (Trunc32to16 (And32 (Const32 [y]) x)) 26443 // cond: y&0xFFFF == 0xFFFF 26444 // result: (Trunc32to16 x) 26445 for { 26446 v_0 := v.Args[0] 26447 if v_0.Op != OpAnd32 { 26448 break 26449 } 26450 _ = v_0.Args[1] 26451 v_0_0 := v_0.Args[0] 26452 if v_0_0.Op != OpConst32 { 26453 break 26454 } 26455 y := v_0_0.AuxInt 26456 x := v_0.Args[1] 26457 if !(y&0xFFFF == 0xFFFF) { 26458 break 26459 } 26460 v.reset(OpTrunc32to16) 26461 v.AddArg(x) 26462 return true 26463 } 26464 // match: (Trunc32to16 (And32 x (Const32 [y]))) 26465 // cond: y&0xFFFF == 0xFFFF 26466 // result: (Trunc32to16 x) 26467 for { 26468 v_0 := v.Args[0] 26469 if v_0.Op != OpAnd32 { 26470 break 26471 } 26472 _ = v_0.Args[1] 26473 x := v_0.Args[0] 26474 v_0_1 := v_0.Args[1] 26475 if v_0_1.Op != OpConst32 { 26476 break 26477 } 26478 y := v_0_1.AuxInt 26479 if !(y&0xFFFF == 0xFFFF) { 26480 break 26481 } 26482 v.reset(OpTrunc32to16) 26483 v.AddArg(x) 26484 return true 26485 } 26486 return false 26487 } 26488 func rewriteValuegeneric_OpTrunc32to8_0(v *Value) bool { 26489 // match: (Trunc32to8 (Const32 [c])) 26490 // cond: 26491 // result: (Const8 [int64(int8(c))]) 26492 for { 26493 v_0 := v.Args[0] 26494 if v_0.Op != OpConst32 { 26495 break 26496 } 26497 c := v_0.AuxInt 26498 v.reset(OpConst8) 26499 v.AuxInt = int64(int8(c)) 26500 return true 26501 } 26502 // match: (Trunc32to8 (ZeroExt8to32 x)) 26503 // cond: 26504 // result: x 26505 for { 26506 v_0 := v.Args[0] 26507 if v_0.Op != OpZeroExt8to32 { 26508 break 26509 } 26510 x := v_0.Args[0] 26511 v.reset(OpCopy) 26512 v.Type = x.Type 26513 v.AddArg(x) 26514 return true 26515 } 26516 // match: (Trunc32to8 (SignExt8to32 x)) 26517 // cond: 26518 // result: x 26519 for { 26520 v_0 := v.Args[0] 26521 if v_0.Op != OpSignExt8to32 { 26522 break 26523 } 26524 x := v_0.Args[0] 26525 v.reset(OpCopy) 26526 v.Type = x.Type 26527 v.AddArg(x) 26528 return true 26529 } 26530 // match: (Trunc32to8 (And32 (Const32 [y]) x)) 26531 // cond: y&0xFF == 0xFF 26532 // result: (Trunc32to8 x) 26533 for { 26534 v_0 := v.Args[0] 26535 if v_0.Op != OpAnd32 { 26536 break 26537 } 26538 _ = v_0.Args[1] 26539 v_0_0 := v_0.Args[0] 26540 if v_0_0.Op != OpConst32 { 26541 break 26542 } 26543 y := v_0_0.AuxInt 26544 x := v_0.Args[1] 26545 if !(y&0xFF == 0xFF) { 26546 break 26547 } 26548 v.reset(OpTrunc32to8) 26549 v.AddArg(x) 26550 return true 26551 } 26552 // match: (Trunc32to8 (And32 x (Const32 [y]))) 26553 // cond: y&0xFF == 0xFF 26554 // result: (Trunc32to8 x) 26555 for { 26556 v_0 := v.Args[0] 26557 if v_0.Op != OpAnd32 { 26558 break 26559 } 26560 _ = v_0.Args[1] 26561 x := v_0.Args[0] 26562 v_0_1 := v_0.Args[1] 26563 if v_0_1.Op != OpConst32 { 26564 break 26565 } 26566 y := v_0_1.AuxInt 26567 if !(y&0xFF == 0xFF) { 26568 break 26569 } 26570 v.reset(OpTrunc32to8) 26571 v.AddArg(x) 26572 return true 26573 } 26574 return false 26575 } 26576 func rewriteValuegeneric_OpTrunc64to16_0(v *Value) bool { 26577 // match: (Trunc64to16 (Const64 [c])) 26578 // cond: 26579 // result: (Const16 [int64(int16(c))]) 26580 for { 26581 v_0 := v.Args[0] 26582 if v_0.Op != OpConst64 { 26583 break 26584 } 26585 c := v_0.AuxInt 26586 v.reset(OpConst16) 26587 v.AuxInt = int64(int16(c)) 26588 return true 26589 } 26590 // match: (Trunc64to16 (ZeroExt8to64 x)) 26591 // cond: 26592 // result: (ZeroExt8to16 x) 26593 for { 26594 v_0 := v.Args[0] 26595 if v_0.Op != OpZeroExt8to64 { 26596 break 26597 } 26598 x := v_0.Args[0] 26599 v.reset(OpZeroExt8to16) 26600 v.AddArg(x) 26601 return true 26602 } 26603 // match: (Trunc64to16 (ZeroExt16to64 x)) 26604 // cond: 26605 // result: x 26606 for { 26607 v_0 := v.Args[0] 26608 if v_0.Op != OpZeroExt16to64 { 26609 break 26610 } 26611 x := v_0.Args[0] 26612 v.reset(OpCopy) 26613 v.Type = x.Type 26614 v.AddArg(x) 26615 return true 26616 } 26617 // match: (Trunc64to16 (SignExt8to64 x)) 26618 // cond: 26619 // result: (SignExt8to16 x) 26620 for { 26621 v_0 := v.Args[0] 26622 if v_0.Op != OpSignExt8to64 { 26623 break 26624 } 26625 x := v_0.Args[0] 26626 v.reset(OpSignExt8to16) 26627 v.AddArg(x) 26628 return true 26629 } 26630 // match: (Trunc64to16 (SignExt16to64 x)) 26631 // cond: 26632 // result: x 26633 for { 26634 v_0 := v.Args[0] 26635 if v_0.Op != OpSignExt16to64 { 26636 break 26637 } 26638 x := v_0.Args[0] 26639 v.reset(OpCopy) 26640 v.Type = x.Type 26641 v.AddArg(x) 26642 return true 26643 } 26644 // match: (Trunc64to16 (And64 (Const64 [y]) x)) 26645 // cond: y&0xFFFF == 0xFFFF 26646 // result: (Trunc64to16 x) 26647 for { 26648 v_0 := v.Args[0] 26649 if v_0.Op != OpAnd64 { 26650 break 26651 } 26652 _ = v_0.Args[1] 26653 v_0_0 := v_0.Args[0] 26654 if v_0_0.Op != OpConst64 { 26655 break 26656 } 26657 y := v_0_0.AuxInt 26658 x := v_0.Args[1] 26659 if !(y&0xFFFF == 0xFFFF) { 26660 break 26661 } 26662 v.reset(OpTrunc64to16) 26663 v.AddArg(x) 26664 return true 26665 } 26666 // match: (Trunc64to16 (And64 x (Const64 [y]))) 26667 // cond: y&0xFFFF == 0xFFFF 26668 // result: (Trunc64to16 x) 26669 for { 26670 v_0 := v.Args[0] 26671 if v_0.Op != OpAnd64 { 26672 break 26673 } 26674 _ = v_0.Args[1] 26675 x := v_0.Args[0] 26676 v_0_1 := v_0.Args[1] 26677 if v_0_1.Op != OpConst64 { 26678 break 26679 } 26680 y := v_0_1.AuxInt 26681 if !(y&0xFFFF == 0xFFFF) { 26682 break 26683 } 26684 v.reset(OpTrunc64to16) 26685 v.AddArg(x) 26686 return true 26687 } 26688 return false 26689 } 26690 func rewriteValuegeneric_OpTrunc64to32_0(v *Value) bool { 26691 // match: (Trunc64to32 (Const64 [c])) 26692 // cond: 26693 // result: (Const32 [int64(int32(c))]) 26694 for { 26695 v_0 := v.Args[0] 26696 if v_0.Op != OpConst64 { 26697 break 26698 } 26699 c := v_0.AuxInt 26700 v.reset(OpConst32) 26701 v.AuxInt = int64(int32(c)) 26702 return true 26703 } 26704 // match: (Trunc64to32 (ZeroExt8to64 x)) 26705 // cond: 26706 // result: (ZeroExt8to32 x) 26707 for { 26708 v_0 := v.Args[0] 26709 if v_0.Op != OpZeroExt8to64 { 26710 break 26711 } 26712 x := v_0.Args[0] 26713 v.reset(OpZeroExt8to32) 26714 v.AddArg(x) 26715 return true 26716 } 26717 // match: (Trunc64to32 (ZeroExt16to64 x)) 26718 // cond: 26719 // result: (ZeroExt16to32 x) 26720 for { 26721 v_0 := v.Args[0] 26722 if v_0.Op != OpZeroExt16to64 { 26723 break 26724 } 26725 x := v_0.Args[0] 26726 v.reset(OpZeroExt16to32) 26727 v.AddArg(x) 26728 return true 26729 } 26730 // match: (Trunc64to32 (ZeroExt32to64 x)) 26731 // cond: 26732 // result: x 26733 for { 26734 v_0 := v.Args[0] 26735 if v_0.Op != OpZeroExt32to64 { 26736 break 26737 } 26738 x := v_0.Args[0] 26739 v.reset(OpCopy) 26740 v.Type = x.Type 26741 v.AddArg(x) 26742 return true 26743 } 26744 // match: (Trunc64to32 (SignExt8to64 x)) 26745 // cond: 26746 // result: (SignExt8to32 x) 26747 for { 26748 v_0 := v.Args[0] 26749 if v_0.Op != OpSignExt8to64 { 26750 break 26751 } 26752 x := v_0.Args[0] 26753 v.reset(OpSignExt8to32) 26754 v.AddArg(x) 26755 return true 26756 } 26757 // match: (Trunc64to32 (SignExt16to64 x)) 26758 // cond: 26759 // result: (SignExt16to32 x) 26760 for { 26761 v_0 := v.Args[0] 26762 if v_0.Op != OpSignExt16to64 { 26763 break 26764 } 26765 x := v_0.Args[0] 26766 v.reset(OpSignExt16to32) 26767 v.AddArg(x) 26768 return true 26769 } 26770 // match: (Trunc64to32 (SignExt32to64 x)) 26771 // cond: 26772 // result: x 26773 for { 26774 v_0 := v.Args[0] 26775 if v_0.Op != OpSignExt32to64 { 26776 break 26777 } 26778 x := v_0.Args[0] 26779 v.reset(OpCopy) 26780 v.Type = x.Type 26781 v.AddArg(x) 26782 return true 26783 } 26784 // match: (Trunc64to32 (And64 (Const64 [y]) x)) 26785 // cond: y&0xFFFFFFFF == 0xFFFFFFFF 26786 // result: (Trunc64to32 x) 26787 for { 26788 v_0 := v.Args[0] 26789 if v_0.Op != OpAnd64 { 26790 break 26791 } 26792 _ = v_0.Args[1] 26793 v_0_0 := v_0.Args[0] 26794 if v_0_0.Op != OpConst64 { 26795 break 26796 } 26797 y := v_0_0.AuxInt 26798 x := v_0.Args[1] 26799 if !(y&0xFFFFFFFF == 0xFFFFFFFF) { 26800 break 26801 } 26802 v.reset(OpTrunc64to32) 26803 v.AddArg(x) 26804 return true 26805 } 26806 // match: (Trunc64to32 (And64 x (Const64 [y]))) 26807 // cond: y&0xFFFFFFFF == 0xFFFFFFFF 26808 // result: (Trunc64to32 x) 26809 for { 26810 v_0 := v.Args[0] 26811 if v_0.Op != OpAnd64 { 26812 break 26813 } 26814 _ = v_0.Args[1] 26815 x := v_0.Args[0] 26816 v_0_1 := v_0.Args[1] 26817 if v_0_1.Op != OpConst64 { 26818 break 26819 } 26820 y := v_0_1.AuxInt 26821 if !(y&0xFFFFFFFF == 0xFFFFFFFF) { 26822 break 26823 } 26824 v.reset(OpTrunc64to32) 26825 v.AddArg(x) 26826 return true 26827 } 26828 return false 26829 } 26830 func rewriteValuegeneric_OpTrunc64to8_0(v *Value) bool { 26831 // match: (Trunc64to8 (Const64 [c])) 26832 // cond: 26833 // result: (Const8 [int64(int8(c))]) 26834 for { 26835 v_0 := v.Args[0] 26836 if v_0.Op != OpConst64 { 26837 break 26838 } 26839 c := v_0.AuxInt 26840 v.reset(OpConst8) 26841 v.AuxInt = int64(int8(c)) 26842 return true 26843 } 26844 // match: (Trunc64to8 (ZeroExt8to64 x)) 26845 // cond: 26846 // result: x 26847 for { 26848 v_0 := v.Args[0] 26849 if v_0.Op != OpZeroExt8to64 { 26850 break 26851 } 26852 x := v_0.Args[0] 26853 v.reset(OpCopy) 26854 v.Type = x.Type 26855 v.AddArg(x) 26856 return true 26857 } 26858 // match: (Trunc64to8 (SignExt8to64 x)) 26859 // cond: 26860 // result: x 26861 for { 26862 v_0 := v.Args[0] 26863 if v_0.Op != OpSignExt8to64 { 26864 break 26865 } 26866 x := v_0.Args[0] 26867 v.reset(OpCopy) 26868 v.Type = x.Type 26869 v.AddArg(x) 26870 return true 26871 } 26872 // match: (Trunc64to8 (And64 (Const64 [y]) x)) 26873 // cond: y&0xFF == 0xFF 26874 // result: (Trunc64to8 x) 26875 for { 26876 v_0 := v.Args[0] 26877 if v_0.Op != OpAnd64 { 26878 break 26879 } 26880 _ = v_0.Args[1] 26881 v_0_0 := v_0.Args[0] 26882 if v_0_0.Op != OpConst64 { 26883 break 26884 } 26885 y := v_0_0.AuxInt 26886 x := v_0.Args[1] 26887 if !(y&0xFF == 0xFF) { 26888 break 26889 } 26890 v.reset(OpTrunc64to8) 26891 v.AddArg(x) 26892 return true 26893 } 26894 // match: (Trunc64to8 (And64 x (Const64 [y]))) 26895 // cond: y&0xFF == 0xFF 26896 // result: (Trunc64to8 x) 26897 for { 26898 v_0 := v.Args[0] 26899 if v_0.Op != OpAnd64 { 26900 break 26901 } 26902 _ = v_0.Args[1] 26903 x := v_0.Args[0] 26904 v_0_1 := v_0.Args[1] 26905 if v_0_1.Op != OpConst64 { 26906 break 26907 } 26908 y := v_0_1.AuxInt 26909 if !(y&0xFF == 0xFF) { 26910 break 26911 } 26912 v.reset(OpTrunc64to8) 26913 v.AddArg(x) 26914 return true 26915 } 26916 return false 26917 } 26918 func rewriteValuegeneric_OpXor16_0(v *Value) bool { 26919 b := v.Block 26920 _ = b 26921 // match: (Xor16 (Const16 [c]) (Const16 [d])) 26922 // cond: 26923 // result: (Const16 [int64(int16(c^d))]) 26924 for { 26925 _ = v.Args[1] 26926 v_0 := v.Args[0] 26927 if v_0.Op != OpConst16 { 26928 break 26929 } 26930 c := v_0.AuxInt 26931 v_1 := v.Args[1] 26932 if v_1.Op != OpConst16 { 26933 break 26934 } 26935 d := v_1.AuxInt 26936 v.reset(OpConst16) 26937 v.AuxInt = int64(int16(c ^ d)) 26938 return true 26939 } 26940 // match: (Xor16 (Const16 [d]) (Const16 [c])) 26941 // cond: 26942 // result: (Const16 [int64(int16(c^d))]) 26943 for { 26944 _ = v.Args[1] 26945 v_0 := v.Args[0] 26946 if v_0.Op != OpConst16 { 26947 break 26948 } 26949 d := v_0.AuxInt 26950 v_1 := v.Args[1] 26951 if v_1.Op != OpConst16 { 26952 break 26953 } 26954 c := v_1.AuxInt 26955 v.reset(OpConst16) 26956 v.AuxInt = int64(int16(c ^ d)) 26957 return true 26958 } 26959 // match: (Xor16 x x) 26960 // cond: 26961 // result: (Const16 [0]) 26962 for { 26963 _ = v.Args[1] 26964 x := v.Args[0] 26965 if x != v.Args[1] { 26966 break 26967 } 26968 v.reset(OpConst16) 26969 v.AuxInt = 0 26970 return true 26971 } 26972 // match: (Xor16 (Const16 [0]) x) 26973 // cond: 26974 // result: x 26975 for { 26976 _ = v.Args[1] 26977 v_0 := v.Args[0] 26978 if v_0.Op != OpConst16 { 26979 break 26980 } 26981 if v_0.AuxInt != 0 { 26982 break 26983 } 26984 x := v.Args[1] 26985 v.reset(OpCopy) 26986 v.Type = x.Type 26987 v.AddArg(x) 26988 return true 26989 } 26990 // match: (Xor16 x (Const16 [0])) 26991 // cond: 26992 // result: x 26993 for { 26994 _ = v.Args[1] 26995 x := v.Args[0] 26996 v_1 := v.Args[1] 26997 if v_1.Op != OpConst16 { 26998 break 26999 } 27000 if v_1.AuxInt != 0 { 27001 break 27002 } 27003 v.reset(OpCopy) 27004 v.Type = x.Type 27005 v.AddArg(x) 27006 return true 27007 } 27008 // match: (Xor16 x (Xor16 x y)) 27009 // cond: 27010 // result: y 27011 for { 27012 _ = v.Args[1] 27013 x := v.Args[0] 27014 v_1 := v.Args[1] 27015 if v_1.Op != OpXor16 { 27016 break 27017 } 27018 _ = v_1.Args[1] 27019 if x != v_1.Args[0] { 27020 break 27021 } 27022 y := v_1.Args[1] 27023 v.reset(OpCopy) 27024 v.Type = y.Type 27025 v.AddArg(y) 27026 return true 27027 } 27028 // match: (Xor16 x (Xor16 y x)) 27029 // cond: 27030 // result: y 27031 for { 27032 _ = v.Args[1] 27033 x := v.Args[0] 27034 v_1 := v.Args[1] 27035 if v_1.Op != OpXor16 { 27036 break 27037 } 27038 _ = v_1.Args[1] 27039 y := v_1.Args[0] 27040 if x != v_1.Args[1] { 27041 break 27042 } 27043 v.reset(OpCopy) 27044 v.Type = y.Type 27045 v.AddArg(y) 27046 return true 27047 } 27048 // match: (Xor16 (Xor16 x y) x) 27049 // cond: 27050 // result: y 27051 for { 27052 _ = v.Args[1] 27053 v_0 := v.Args[0] 27054 if v_0.Op != OpXor16 { 27055 break 27056 } 27057 _ = v_0.Args[1] 27058 x := v_0.Args[0] 27059 y := v_0.Args[1] 27060 if x != v.Args[1] { 27061 break 27062 } 27063 v.reset(OpCopy) 27064 v.Type = y.Type 27065 v.AddArg(y) 27066 return true 27067 } 27068 // match: (Xor16 (Xor16 y x) x) 27069 // cond: 27070 // result: y 27071 for { 27072 _ = v.Args[1] 27073 v_0 := v.Args[0] 27074 if v_0.Op != OpXor16 { 27075 break 27076 } 27077 _ = v_0.Args[1] 27078 y := v_0.Args[0] 27079 x := v_0.Args[1] 27080 if x != v.Args[1] { 27081 break 27082 } 27083 v.reset(OpCopy) 27084 v.Type = y.Type 27085 v.AddArg(y) 27086 return true 27087 } 27088 // match: (Xor16 (Xor16 i:(Const16 <t>) z) x) 27089 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 27090 // result: (Xor16 i (Xor16 <t> z x)) 27091 for { 27092 _ = v.Args[1] 27093 v_0 := v.Args[0] 27094 if v_0.Op != OpXor16 { 27095 break 27096 } 27097 _ = v_0.Args[1] 27098 i := v_0.Args[0] 27099 if i.Op != OpConst16 { 27100 break 27101 } 27102 t := i.Type 27103 z := v_0.Args[1] 27104 x := v.Args[1] 27105 if !(z.Op != OpConst16 && x.Op != OpConst16) { 27106 break 27107 } 27108 v.reset(OpXor16) 27109 v.AddArg(i) 27110 v0 := b.NewValue0(v.Pos, OpXor16, t) 27111 v0.AddArg(z) 27112 v0.AddArg(x) 27113 v.AddArg(v0) 27114 return true 27115 } 27116 return false 27117 } 27118 func rewriteValuegeneric_OpXor16_10(v *Value) bool { 27119 b := v.Block 27120 _ = b 27121 // match: (Xor16 (Xor16 z i:(Const16 <t>)) x) 27122 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 27123 // result: (Xor16 i (Xor16 <t> z x)) 27124 for { 27125 _ = v.Args[1] 27126 v_0 := v.Args[0] 27127 if v_0.Op != OpXor16 { 27128 break 27129 } 27130 _ = v_0.Args[1] 27131 z := v_0.Args[0] 27132 i := v_0.Args[1] 27133 if i.Op != OpConst16 { 27134 break 27135 } 27136 t := i.Type 27137 x := v.Args[1] 27138 if !(z.Op != OpConst16 && x.Op != OpConst16) { 27139 break 27140 } 27141 v.reset(OpXor16) 27142 v.AddArg(i) 27143 v0 := b.NewValue0(v.Pos, OpXor16, t) 27144 v0.AddArg(z) 27145 v0.AddArg(x) 27146 v.AddArg(v0) 27147 return true 27148 } 27149 // match: (Xor16 x (Xor16 i:(Const16 <t>) z)) 27150 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 27151 // result: (Xor16 i (Xor16 <t> z x)) 27152 for { 27153 _ = v.Args[1] 27154 x := v.Args[0] 27155 v_1 := v.Args[1] 27156 if v_1.Op != OpXor16 { 27157 break 27158 } 27159 _ = v_1.Args[1] 27160 i := v_1.Args[0] 27161 if i.Op != OpConst16 { 27162 break 27163 } 27164 t := i.Type 27165 z := v_1.Args[1] 27166 if !(z.Op != OpConst16 && x.Op != OpConst16) { 27167 break 27168 } 27169 v.reset(OpXor16) 27170 v.AddArg(i) 27171 v0 := b.NewValue0(v.Pos, OpXor16, t) 27172 v0.AddArg(z) 27173 v0.AddArg(x) 27174 v.AddArg(v0) 27175 return true 27176 } 27177 // match: (Xor16 x (Xor16 z i:(Const16 <t>))) 27178 // cond: (z.Op != OpConst16 && x.Op != OpConst16) 27179 // result: (Xor16 i (Xor16 <t> z x)) 27180 for { 27181 _ = v.Args[1] 27182 x := v.Args[0] 27183 v_1 := v.Args[1] 27184 if v_1.Op != OpXor16 { 27185 break 27186 } 27187 _ = v_1.Args[1] 27188 z := v_1.Args[0] 27189 i := v_1.Args[1] 27190 if i.Op != OpConst16 { 27191 break 27192 } 27193 t := i.Type 27194 if !(z.Op != OpConst16 && x.Op != OpConst16) { 27195 break 27196 } 27197 v.reset(OpXor16) 27198 v.AddArg(i) 27199 v0 := b.NewValue0(v.Pos, OpXor16, t) 27200 v0.AddArg(z) 27201 v0.AddArg(x) 27202 v.AddArg(v0) 27203 return true 27204 } 27205 // match: (Xor16 (Const16 <t> [c]) (Xor16 (Const16 <t> [d]) x)) 27206 // cond: 27207 // result: (Xor16 (Const16 <t> [int64(int16(c^d))]) x) 27208 for { 27209 _ = v.Args[1] 27210 v_0 := v.Args[0] 27211 if v_0.Op != OpConst16 { 27212 break 27213 } 27214 t := v_0.Type 27215 c := v_0.AuxInt 27216 v_1 := v.Args[1] 27217 if v_1.Op != OpXor16 { 27218 break 27219 } 27220 _ = v_1.Args[1] 27221 v_1_0 := v_1.Args[0] 27222 if v_1_0.Op != OpConst16 { 27223 break 27224 } 27225 if v_1_0.Type != t { 27226 break 27227 } 27228 d := v_1_0.AuxInt 27229 x := v_1.Args[1] 27230 v.reset(OpXor16) 27231 v0 := b.NewValue0(v.Pos, OpConst16, t) 27232 v0.AuxInt = int64(int16(c ^ d)) 27233 v.AddArg(v0) 27234 v.AddArg(x) 27235 return true 27236 } 27237 // match: (Xor16 (Const16 <t> [c]) (Xor16 x (Const16 <t> [d]))) 27238 // cond: 27239 // result: (Xor16 (Const16 <t> [int64(int16(c^d))]) x) 27240 for { 27241 _ = v.Args[1] 27242 v_0 := v.Args[0] 27243 if v_0.Op != OpConst16 { 27244 break 27245 } 27246 t := v_0.Type 27247 c := v_0.AuxInt 27248 v_1 := v.Args[1] 27249 if v_1.Op != OpXor16 { 27250 break 27251 } 27252 _ = v_1.Args[1] 27253 x := v_1.Args[0] 27254 v_1_1 := v_1.Args[1] 27255 if v_1_1.Op != OpConst16 { 27256 break 27257 } 27258 if v_1_1.Type != t { 27259 break 27260 } 27261 d := v_1_1.AuxInt 27262 v.reset(OpXor16) 27263 v0 := b.NewValue0(v.Pos, OpConst16, t) 27264 v0.AuxInt = int64(int16(c ^ d)) 27265 v.AddArg(v0) 27266 v.AddArg(x) 27267 return true 27268 } 27269 // match: (Xor16 (Xor16 (Const16 <t> [d]) x) (Const16 <t> [c])) 27270 // cond: 27271 // result: (Xor16 (Const16 <t> [int64(int16(c^d))]) x) 27272 for { 27273 _ = v.Args[1] 27274 v_0 := v.Args[0] 27275 if v_0.Op != OpXor16 { 27276 break 27277 } 27278 _ = v_0.Args[1] 27279 v_0_0 := v_0.Args[0] 27280 if v_0_0.Op != OpConst16 { 27281 break 27282 } 27283 t := v_0_0.Type 27284 d := v_0_0.AuxInt 27285 x := v_0.Args[1] 27286 v_1 := v.Args[1] 27287 if v_1.Op != OpConst16 { 27288 break 27289 } 27290 if v_1.Type != t { 27291 break 27292 } 27293 c := v_1.AuxInt 27294 v.reset(OpXor16) 27295 v0 := b.NewValue0(v.Pos, OpConst16, t) 27296 v0.AuxInt = int64(int16(c ^ d)) 27297 v.AddArg(v0) 27298 v.AddArg(x) 27299 return true 27300 } 27301 // match: (Xor16 (Xor16 x (Const16 <t> [d])) (Const16 <t> [c])) 27302 // cond: 27303 // result: (Xor16 (Const16 <t> [int64(int16(c^d))]) x) 27304 for { 27305 _ = v.Args[1] 27306 v_0 := v.Args[0] 27307 if v_0.Op != OpXor16 { 27308 break 27309 } 27310 _ = v_0.Args[1] 27311 x := v_0.Args[0] 27312 v_0_1 := v_0.Args[1] 27313 if v_0_1.Op != OpConst16 { 27314 break 27315 } 27316 t := v_0_1.Type 27317 d := v_0_1.AuxInt 27318 v_1 := v.Args[1] 27319 if v_1.Op != OpConst16 { 27320 break 27321 } 27322 if v_1.Type != t { 27323 break 27324 } 27325 c := v_1.AuxInt 27326 v.reset(OpXor16) 27327 v0 := b.NewValue0(v.Pos, OpConst16, t) 27328 v0.AuxInt = int64(int16(c ^ d)) 27329 v.AddArg(v0) 27330 v.AddArg(x) 27331 return true 27332 } 27333 return false 27334 } 27335 func rewriteValuegeneric_OpXor32_0(v *Value) bool { 27336 b := v.Block 27337 _ = b 27338 // match: (Xor32 (Const32 [c]) (Const32 [d])) 27339 // cond: 27340 // result: (Const32 [int64(int32(c^d))]) 27341 for { 27342 _ = v.Args[1] 27343 v_0 := v.Args[0] 27344 if v_0.Op != OpConst32 { 27345 break 27346 } 27347 c := v_0.AuxInt 27348 v_1 := v.Args[1] 27349 if v_1.Op != OpConst32 { 27350 break 27351 } 27352 d := v_1.AuxInt 27353 v.reset(OpConst32) 27354 v.AuxInt = int64(int32(c ^ d)) 27355 return true 27356 } 27357 // match: (Xor32 (Const32 [d]) (Const32 [c])) 27358 // cond: 27359 // result: (Const32 [int64(int32(c^d))]) 27360 for { 27361 _ = v.Args[1] 27362 v_0 := v.Args[0] 27363 if v_0.Op != OpConst32 { 27364 break 27365 } 27366 d := v_0.AuxInt 27367 v_1 := v.Args[1] 27368 if v_1.Op != OpConst32 { 27369 break 27370 } 27371 c := v_1.AuxInt 27372 v.reset(OpConst32) 27373 v.AuxInt = int64(int32(c ^ d)) 27374 return true 27375 } 27376 // match: (Xor32 x x) 27377 // cond: 27378 // result: (Const32 [0]) 27379 for { 27380 _ = v.Args[1] 27381 x := v.Args[0] 27382 if x != v.Args[1] { 27383 break 27384 } 27385 v.reset(OpConst32) 27386 v.AuxInt = 0 27387 return true 27388 } 27389 // match: (Xor32 (Const32 [0]) x) 27390 // cond: 27391 // result: x 27392 for { 27393 _ = v.Args[1] 27394 v_0 := v.Args[0] 27395 if v_0.Op != OpConst32 { 27396 break 27397 } 27398 if v_0.AuxInt != 0 { 27399 break 27400 } 27401 x := v.Args[1] 27402 v.reset(OpCopy) 27403 v.Type = x.Type 27404 v.AddArg(x) 27405 return true 27406 } 27407 // match: (Xor32 x (Const32 [0])) 27408 // cond: 27409 // result: x 27410 for { 27411 _ = v.Args[1] 27412 x := v.Args[0] 27413 v_1 := v.Args[1] 27414 if v_1.Op != OpConst32 { 27415 break 27416 } 27417 if v_1.AuxInt != 0 { 27418 break 27419 } 27420 v.reset(OpCopy) 27421 v.Type = x.Type 27422 v.AddArg(x) 27423 return true 27424 } 27425 // match: (Xor32 x (Xor32 x y)) 27426 // cond: 27427 // result: y 27428 for { 27429 _ = v.Args[1] 27430 x := v.Args[0] 27431 v_1 := v.Args[1] 27432 if v_1.Op != OpXor32 { 27433 break 27434 } 27435 _ = v_1.Args[1] 27436 if x != v_1.Args[0] { 27437 break 27438 } 27439 y := v_1.Args[1] 27440 v.reset(OpCopy) 27441 v.Type = y.Type 27442 v.AddArg(y) 27443 return true 27444 } 27445 // match: (Xor32 x (Xor32 y x)) 27446 // cond: 27447 // result: y 27448 for { 27449 _ = v.Args[1] 27450 x := v.Args[0] 27451 v_1 := v.Args[1] 27452 if v_1.Op != OpXor32 { 27453 break 27454 } 27455 _ = v_1.Args[1] 27456 y := v_1.Args[0] 27457 if x != v_1.Args[1] { 27458 break 27459 } 27460 v.reset(OpCopy) 27461 v.Type = y.Type 27462 v.AddArg(y) 27463 return true 27464 } 27465 // match: (Xor32 (Xor32 x y) x) 27466 // cond: 27467 // result: y 27468 for { 27469 _ = v.Args[1] 27470 v_0 := v.Args[0] 27471 if v_0.Op != OpXor32 { 27472 break 27473 } 27474 _ = v_0.Args[1] 27475 x := v_0.Args[0] 27476 y := v_0.Args[1] 27477 if x != v.Args[1] { 27478 break 27479 } 27480 v.reset(OpCopy) 27481 v.Type = y.Type 27482 v.AddArg(y) 27483 return true 27484 } 27485 // match: (Xor32 (Xor32 y x) x) 27486 // cond: 27487 // result: y 27488 for { 27489 _ = v.Args[1] 27490 v_0 := v.Args[0] 27491 if v_0.Op != OpXor32 { 27492 break 27493 } 27494 _ = v_0.Args[1] 27495 y := v_0.Args[0] 27496 x := v_0.Args[1] 27497 if x != v.Args[1] { 27498 break 27499 } 27500 v.reset(OpCopy) 27501 v.Type = y.Type 27502 v.AddArg(y) 27503 return true 27504 } 27505 // match: (Xor32 (Xor32 i:(Const32 <t>) z) x) 27506 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 27507 // result: (Xor32 i (Xor32 <t> z x)) 27508 for { 27509 _ = v.Args[1] 27510 v_0 := v.Args[0] 27511 if v_0.Op != OpXor32 { 27512 break 27513 } 27514 _ = v_0.Args[1] 27515 i := v_0.Args[0] 27516 if i.Op != OpConst32 { 27517 break 27518 } 27519 t := i.Type 27520 z := v_0.Args[1] 27521 x := v.Args[1] 27522 if !(z.Op != OpConst32 && x.Op != OpConst32) { 27523 break 27524 } 27525 v.reset(OpXor32) 27526 v.AddArg(i) 27527 v0 := b.NewValue0(v.Pos, OpXor32, t) 27528 v0.AddArg(z) 27529 v0.AddArg(x) 27530 v.AddArg(v0) 27531 return true 27532 } 27533 return false 27534 } 27535 func rewriteValuegeneric_OpXor32_10(v *Value) bool { 27536 b := v.Block 27537 _ = b 27538 // match: (Xor32 (Xor32 z i:(Const32 <t>)) x) 27539 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 27540 // result: (Xor32 i (Xor32 <t> z x)) 27541 for { 27542 _ = v.Args[1] 27543 v_0 := v.Args[0] 27544 if v_0.Op != OpXor32 { 27545 break 27546 } 27547 _ = v_0.Args[1] 27548 z := v_0.Args[0] 27549 i := v_0.Args[1] 27550 if i.Op != OpConst32 { 27551 break 27552 } 27553 t := i.Type 27554 x := v.Args[1] 27555 if !(z.Op != OpConst32 && x.Op != OpConst32) { 27556 break 27557 } 27558 v.reset(OpXor32) 27559 v.AddArg(i) 27560 v0 := b.NewValue0(v.Pos, OpXor32, t) 27561 v0.AddArg(z) 27562 v0.AddArg(x) 27563 v.AddArg(v0) 27564 return true 27565 } 27566 // match: (Xor32 x (Xor32 i:(Const32 <t>) z)) 27567 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 27568 // result: (Xor32 i (Xor32 <t> z x)) 27569 for { 27570 _ = v.Args[1] 27571 x := v.Args[0] 27572 v_1 := v.Args[1] 27573 if v_1.Op != OpXor32 { 27574 break 27575 } 27576 _ = v_1.Args[1] 27577 i := v_1.Args[0] 27578 if i.Op != OpConst32 { 27579 break 27580 } 27581 t := i.Type 27582 z := v_1.Args[1] 27583 if !(z.Op != OpConst32 && x.Op != OpConst32) { 27584 break 27585 } 27586 v.reset(OpXor32) 27587 v.AddArg(i) 27588 v0 := b.NewValue0(v.Pos, OpXor32, t) 27589 v0.AddArg(z) 27590 v0.AddArg(x) 27591 v.AddArg(v0) 27592 return true 27593 } 27594 // match: (Xor32 x (Xor32 z i:(Const32 <t>))) 27595 // cond: (z.Op != OpConst32 && x.Op != OpConst32) 27596 // result: (Xor32 i (Xor32 <t> z x)) 27597 for { 27598 _ = v.Args[1] 27599 x := v.Args[0] 27600 v_1 := v.Args[1] 27601 if v_1.Op != OpXor32 { 27602 break 27603 } 27604 _ = v_1.Args[1] 27605 z := v_1.Args[0] 27606 i := v_1.Args[1] 27607 if i.Op != OpConst32 { 27608 break 27609 } 27610 t := i.Type 27611 if !(z.Op != OpConst32 && x.Op != OpConst32) { 27612 break 27613 } 27614 v.reset(OpXor32) 27615 v.AddArg(i) 27616 v0 := b.NewValue0(v.Pos, OpXor32, t) 27617 v0.AddArg(z) 27618 v0.AddArg(x) 27619 v.AddArg(v0) 27620 return true 27621 } 27622 // match: (Xor32 (Const32 <t> [c]) (Xor32 (Const32 <t> [d]) x)) 27623 // cond: 27624 // result: (Xor32 (Const32 <t> [int64(int32(c^d))]) x) 27625 for { 27626 _ = v.Args[1] 27627 v_0 := v.Args[0] 27628 if v_0.Op != OpConst32 { 27629 break 27630 } 27631 t := v_0.Type 27632 c := v_0.AuxInt 27633 v_1 := v.Args[1] 27634 if v_1.Op != OpXor32 { 27635 break 27636 } 27637 _ = v_1.Args[1] 27638 v_1_0 := v_1.Args[0] 27639 if v_1_0.Op != OpConst32 { 27640 break 27641 } 27642 if v_1_0.Type != t { 27643 break 27644 } 27645 d := v_1_0.AuxInt 27646 x := v_1.Args[1] 27647 v.reset(OpXor32) 27648 v0 := b.NewValue0(v.Pos, OpConst32, t) 27649 v0.AuxInt = int64(int32(c ^ d)) 27650 v.AddArg(v0) 27651 v.AddArg(x) 27652 return true 27653 } 27654 // match: (Xor32 (Const32 <t> [c]) (Xor32 x (Const32 <t> [d]))) 27655 // cond: 27656 // result: (Xor32 (Const32 <t> [int64(int32(c^d))]) x) 27657 for { 27658 _ = v.Args[1] 27659 v_0 := v.Args[0] 27660 if v_0.Op != OpConst32 { 27661 break 27662 } 27663 t := v_0.Type 27664 c := v_0.AuxInt 27665 v_1 := v.Args[1] 27666 if v_1.Op != OpXor32 { 27667 break 27668 } 27669 _ = v_1.Args[1] 27670 x := v_1.Args[0] 27671 v_1_1 := v_1.Args[1] 27672 if v_1_1.Op != OpConst32 { 27673 break 27674 } 27675 if v_1_1.Type != t { 27676 break 27677 } 27678 d := v_1_1.AuxInt 27679 v.reset(OpXor32) 27680 v0 := b.NewValue0(v.Pos, OpConst32, t) 27681 v0.AuxInt = int64(int32(c ^ d)) 27682 v.AddArg(v0) 27683 v.AddArg(x) 27684 return true 27685 } 27686 // match: (Xor32 (Xor32 (Const32 <t> [d]) x) (Const32 <t> [c])) 27687 // cond: 27688 // result: (Xor32 (Const32 <t> [int64(int32(c^d))]) x) 27689 for { 27690 _ = v.Args[1] 27691 v_0 := v.Args[0] 27692 if v_0.Op != OpXor32 { 27693 break 27694 } 27695 _ = v_0.Args[1] 27696 v_0_0 := v_0.Args[0] 27697 if v_0_0.Op != OpConst32 { 27698 break 27699 } 27700 t := v_0_0.Type 27701 d := v_0_0.AuxInt 27702 x := v_0.Args[1] 27703 v_1 := v.Args[1] 27704 if v_1.Op != OpConst32 { 27705 break 27706 } 27707 if v_1.Type != t { 27708 break 27709 } 27710 c := v_1.AuxInt 27711 v.reset(OpXor32) 27712 v0 := b.NewValue0(v.Pos, OpConst32, t) 27713 v0.AuxInt = int64(int32(c ^ d)) 27714 v.AddArg(v0) 27715 v.AddArg(x) 27716 return true 27717 } 27718 // match: (Xor32 (Xor32 x (Const32 <t> [d])) (Const32 <t> [c])) 27719 // cond: 27720 // result: (Xor32 (Const32 <t> [int64(int32(c^d))]) x) 27721 for { 27722 _ = v.Args[1] 27723 v_0 := v.Args[0] 27724 if v_0.Op != OpXor32 { 27725 break 27726 } 27727 _ = v_0.Args[1] 27728 x := v_0.Args[0] 27729 v_0_1 := v_0.Args[1] 27730 if v_0_1.Op != OpConst32 { 27731 break 27732 } 27733 t := v_0_1.Type 27734 d := v_0_1.AuxInt 27735 v_1 := v.Args[1] 27736 if v_1.Op != OpConst32 { 27737 break 27738 } 27739 if v_1.Type != t { 27740 break 27741 } 27742 c := v_1.AuxInt 27743 v.reset(OpXor32) 27744 v0 := b.NewValue0(v.Pos, OpConst32, t) 27745 v0.AuxInt = int64(int32(c ^ d)) 27746 v.AddArg(v0) 27747 v.AddArg(x) 27748 return true 27749 } 27750 return false 27751 } 27752 func rewriteValuegeneric_OpXor64_0(v *Value) bool { 27753 b := v.Block 27754 _ = b 27755 // match: (Xor64 (Const64 [c]) (Const64 [d])) 27756 // cond: 27757 // result: (Const64 [c^d]) 27758 for { 27759 _ = v.Args[1] 27760 v_0 := v.Args[0] 27761 if v_0.Op != OpConst64 { 27762 break 27763 } 27764 c := v_0.AuxInt 27765 v_1 := v.Args[1] 27766 if v_1.Op != OpConst64 { 27767 break 27768 } 27769 d := v_1.AuxInt 27770 v.reset(OpConst64) 27771 v.AuxInt = c ^ d 27772 return true 27773 } 27774 // match: (Xor64 (Const64 [d]) (Const64 [c])) 27775 // cond: 27776 // result: (Const64 [c^d]) 27777 for { 27778 _ = v.Args[1] 27779 v_0 := v.Args[0] 27780 if v_0.Op != OpConst64 { 27781 break 27782 } 27783 d := v_0.AuxInt 27784 v_1 := v.Args[1] 27785 if v_1.Op != OpConst64 { 27786 break 27787 } 27788 c := v_1.AuxInt 27789 v.reset(OpConst64) 27790 v.AuxInt = c ^ d 27791 return true 27792 } 27793 // match: (Xor64 x x) 27794 // cond: 27795 // result: (Const64 [0]) 27796 for { 27797 _ = v.Args[1] 27798 x := v.Args[0] 27799 if x != v.Args[1] { 27800 break 27801 } 27802 v.reset(OpConst64) 27803 v.AuxInt = 0 27804 return true 27805 } 27806 // match: (Xor64 (Const64 [0]) x) 27807 // cond: 27808 // result: x 27809 for { 27810 _ = v.Args[1] 27811 v_0 := v.Args[0] 27812 if v_0.Op != OpConst64 { 27813 break 27814 } 27815 if v_0.AuxInt != 0 { 27816 break 27817 } 27818 x := v.Args[1] 27819 v.reset(OpCopy) 27820 v.Type = x.Type 27821 v.AddArg(x) 27822 return true 27823 } 27824 // match: (Xor64 x (Const64 [0])) 27825 // cond: 27826 // result: x 27827 for { 27828 _ = v.Args[1] 27829 x := v.Args[0] 27830 v_1 := v.Args[1] 27831 if v_1.Op != OpConst64 { 27832 break 27833 } 27834 if v_1.AuxInt != 0 { 27835 break 27836 } 27837 v.reset(OpCopy) 27838 v.Type = x.Type 27839 v.AddArg(x) 27840 return true 27841 } 27842 // match: (Xor64 x (Xor64 x y)) 27843 // cond: 27844 // result: y 27845 for { 27846 _ = v.Args[1] 27847 x := v.Args[0] 27848 v_1 := v.Args[1] 27849 if v_1.Op != OpXor64 { 27850 break 27851 } 27852 _ = v_1.Args[1] 27853 if x != v_1.Args[0] { 27854 break 27855 } 27856 y := v_1.Args[1] 27857 v.reset(OpCopy) 27858 v.Type = y.Type 27859 v.AddArg(y) 27860 return true 27861 } 27862 // match: (Xor64 x (Xor64 y x)) 27863 // cond: 27864 // result: y 27865 for { 27866 _ = v.Args[1] 27867 x := v.Args[0] 27868 v_1 := v.Args[1] 27869 if v_1.Op != OpXor64 { 27870 break 27871 } 27872 _ = v_1.Args[1] 27873 y := v_1.Args[0] 27874 if x != v_1.Args[1] { 27875 break 27876 } 27877 v.reset(OpCopy) 27878 v.Type = y.Type 27879 v.AddArg(y) 27880 return true 27881 } 27882 // match: (Xor64 (Xor64 x y) x) 27883 // cond: 27884 // result: y 27885 for { 27886 _ = v.Args[1] 27887 v_0 := v.Args[0] 27888 if v_0.Op != OpXor64 { 27889 break 27890 } 27891 _ = v_0.Args[1] 27892 x := v_0.Args[0] 27893 y := v_0.Args[1] 27894 if x != v.Args[1] { 27895 break 27896 } 27897 v.reset(OpCopy) 27898 v.Type = y.Type 27899 v.AddArg(y) 27900 return true 27901 } 27902 // match: (Xor64 (Xor64 y x) x) 27903 // cond: 27904 // result: y 27905 for { 27906 _ = v.Args[1] 27907 v_0 := v.Args[0] 27908 if v_0.Op != OpXor64 { 27909 break 27910 } 27911 _ = v_0.Args[1] 27912 y := v_0.Args[0] 27913 x := v_0.Args[1] 27914 if x != v.Args[1] { 27915 break 27916 } 27917 v.reset(OpCopy) 27918 v.Type = y.Type 27919 v.AddArg(y) 27920 return true 27921 } 27922 // match: (Xor64 (Xor64 i:(Const64 <t>) z) x) 27923 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 27924 // result: (Xor64 i (Xor64 <t> z x)) 27925 for { 27926 _ = v.Args[1] 27927 v_0 := v.Args[0] 27928 if v_0.Op != OpXor64 { 27929 break 27930 } 27931 _ = v_0.Args[1] 27932 i := v_0.Args[0] 27933 if i.Op != OpConst64 { 27934 break 27935 } 27936 t := i.Type 27937 z := v_0.Args[1] 27938 x := v.Args[1] 27939 if !(z.Op != OpConst64 && x.Op != OpConst64) { 27940 break 27941 } 27942 v.reset(OpXor64) 27943 v.AddArg(i) 27944 v0 := b.NewValue0(v.Pos, OpXor64, t) 27945 v0.AddArg(z) 27946 v0.AddArg(x) 27947 v.AddArg(v0) 27948 return true 27949 } 27950 return false 27951 } 27952 func rewriteValuegeneric_OpXor64_10(v *Value) bool { 27953 b := v.Block 27954 _ = b 27955 // match: (Xor64 (Xor64 z i:(Const64 <t>)) x) 27956 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 27957 // result: (Xor64 i (Xor64 <t> z x)) 27958 for { 27959 _ = v.Args[1] 27960 v_0 := v.Args[0] 27961 if v_0.Op != OpXor64 { 27962 break 27963 } 27964 _ = v_0.Args[1] 27965 z := v_0.Args[0] 27966 i := v_0.Args[1] 27967 if i.Op != OpConst64 { 27968 break 27969 } 27970 t := i.Type 27971 x := v.Args[1] 27972 if !(z.Op != OpConst64 && x.Op != OpConst64) { 27973 break 27974 } 27975 v.reset(OpXor64) 27976 v.AddArg(i) 27977 v0 := b.NewValue0(v.Pos, OpXor64, t) 27978 v0.AddArg(z) 27979 v0.AddArg(x) 27980 v.AddArg(v0) 27981 return true 27982 } 27983 // match: (Xor64 x (Xor64 i:(Const64 <t>) z)) 27984 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 27985 // result: (Xor64 i (Xor64 <t> z x)) 27986 for { 27987 _ = v.Args[1] 27988 x := v.Args[0] 27989 v_1 := v.Args[1] 27990 if v_1.Op != OpXor64 { 27991 break 27992 } 27993 _ = v_1.Args[1] 27994 i := v_1.Args[0] 27995 if i.Op != OpConst64 { 27996 break 27997 } 27998 t := i.Type 27999 z := v_1.Args[1] 28000 if !(z.Op != OpConst64 && x.Op != OpConst64) { 28001 break 28002 } 28003 v.reset(OpXor64) 28004 v.AddArg(i) 28005 v0 := b.NewValue0(v.Pos, OpXor64, t) 28006 v0.AddArg(z) 28007 v0.AddArg(x) 28008 v.AddArg(v0) 28009 return true 28010 } 28011 // match: (Xor64 x (Xor64 z i:(Const64 <t>))) 28012 // cond: (z.Op != OpConst64 && x.Op != OpConst64) 28013 // result: (Xor64 i (Xor64 <t> z x)) 28014 for { 28015 _ = v.Args[1] 28016 x := v.Args[0] 28017 v_1 := v.Args[1] 28018 if v_1.Op != OpXor64 { 28019 break 28020 } 28021 _ = v_1.Args[1] 28022 z := v_1.Args[0] 28023 i := v_1.Args[1] 28024 if i.Op != OpConst64 { 28025 break 28026 } 28027 t := i.Type 28028 if !(z.Op != OpConst64 && x.Op != OpConst64) { 28029 break 28030 } 28031 v.reset(OpXor64) 28032 v.AddArg(i) 28033 v0 := b.NewValue0(v.Pos, OpXor64, t) 28034 v0.AddArg(z) 28035 v0.AddArg(x) 28036 v.AddArg(v0) 28037 return true 28038 } 28039 // match: (Xor64 (Const64 <t> [c]) (Xor64 (Const64 <t> [d]) x)) 28040 // cond: 28041 // result: (Xor64 (Const64 <t> [c^d]) x) 28042 for { 28043 _ = v.Args[1] 28044 v_0 := v.Args[0] 28045 if v_0.Op != OpConst64 { 28046 break 28047 } 28048 t := v_0.Type 28049 c := v_0.AuxInt 28050 v_1 := v.Args[1] 28051 if v_1.Op != OpXor64 { 28052 break 28053 } 28054 _ = v_1.Args[1] 28055 v_1_0 := v_1.Args[0] 28056 if v_1_0.Op != OpConst64 { 28057 break 28058 } 28059 if v_1_0.Type != t { 28060 break 28061 } 28062 d := v_1_0.AuxInt 28063 x := v_1.Args[1] 28064 v.reset(OpXor64) 28065 v0 := b.NewValue0(v.Pos, OpConst64, t) 28066 v0.AuxInt = c ^ d 28067 v.AddArg(v0) 28068 v.AddArg(x) 28069 return true 28070 } 28071 // match: (Xor64 (Const64 <t> [c]) (Xor64 x (Const64 <t> [d]))) 28072 // cond: 28073 // result: (Xor64 (Const64 <t> [c^d]) x) 28074 for { 28075 _ = v.Args[1] 28076 v_0 := v.Args[0] 28077 if v_0.Op != OpConst64 { 28078 break 28079 } 28080 t := v_0.Type 28081 c := v_0.AuxInt 28082 v_1 := v.Args[1] 28083 if v_1.Op != OpXor64 { 28084 break 28085 } 28086 _ = v_1.Args[1] 28087 x := v_1.Args[0] 28088 v_1_1 := v_1.Args[1] 28089 if v_1_1.Op != OpConst64 { 28090 break 28091 } 28092 if v_1_1.Type != t { 28093 break 28094 } 28095 d := v_1_1.AuxInt 28096 v.reset(OpXor64) 28097 v0 := b.NewValue0(v.Pos, OpConst64, t) 28098 v0.AuxInt = c ^ d 28099 v.AddArg(v0) 28100 v.AddArg(x) 28101 return true 28102 } 28103 // match: (Xor64 (Xor64 (Const64 <t> [d]) x) (Const64 <t> [c])) 28104 // cond: 28105 // result: (Xor64 (Const64 <t> [c^d]) x) 28106 for { 28107 _ = v.Args[1] 28108 v_0 := v.Args[0] 28109 if v_0.Op != OpXor64 { 28110 break 28111 } 28112 _ = v_0.Args[1] 28113 v_0_0 := v_0.Args[0] 28114 if v_0_0.Op != OpConst64 { 28115 break 28116 } 28117 t := v_0_0.Type 28118 d := v_0_0.AuxInt 28119 x := v_0.Args[1] 28120 v_1 := v.Args[1] 28121 if v_1.Op != OpConst64 { 28122 break 28123 } 28124 if v_1.Type != t { 28125 break 28126 } 28127 c := v_1.AuxInt 28128 v.reset(OpXor64) 28129 v0 := b.NewValue0(v.Pos, OpConst64, t) 28130 v0.AuxInt = c ^ d 28131 v.AddArg(v0) 28132 v.AddArg(x) 28133 return true 28134 } 28135 // match: (Xor64 (Xor64 x (Const64 <t> [d])) (Const64 <t> [c])) 28136 // cond: 28137 // result: (Xor64 (Const64 <t> [c^d]) x) 28138 for { 28139 _ = v.Args[1] 28140 v_0 := v.Args[0] 28141 if v_0.Op != OpXor64 { 28142 break 28143 } 28144 _ = v_0.Args[1] 28145 x := v_0.Args[0] 28146 v_0_1 := v_0.Args[1] 28147 if v_0_1.Op != OpConst64 { 28148 break 28149 } 28150 t := v_0_1.Type 28151 d := v_0_1.AuxInt 28152 v_1 := v.Args[1] 28153 if v_1.Op != OpConst64 { 28154 break 28155 } 28156 if v_1.Type != t { 28157 break 28158 } 28159 c := v_1.AuxInt 28160 v.reset(OpXor64) 28161 v0 := b.NewValue0(v.Pos, OpConst64, t) 28162 v0.AuxInt = c ^ d 28163 v.AddArg(v0) 28164 v.AddArg(x) 28165 return true 28166 } 28167 return false 28168 } 28169 func rewriteValuegeneric_OpXor8_0(v *Value) bool { 28170 b := v.Block 28171 _ = b 28172 // match: (Xor8 (Const8 [c]) (Const8 [d])) 28173 // cond: 28174 // result: (Const8 [int64(int8(c^d))]) 28175 for { 28176 _ = v.Args[1] 28177 v_0 := v.Args[0] 28178 if v_0.Op != OpConst8 { 28179 break 28180 } 28181 c := v_0.AuxInt 28182 v_1 := v.Args[1] 28183 if v_1.Op != OpConst8 { 28184 break 28185 } 28186 d := v_1.AuxInt 28187 v.reset(OpConst8) 28188 v.AuxInt = int64(int8(c ^ d)) 28189 return true 28190 } 28191 // match: (Xor8 (Const8 [d]) (Const8 [c])) 28192 // cond: 28193 // result: (Const8 [int64(int8(c^d))]) 28194 for { 28195 _ = v.Args[1] 28196 v_0 := v.Args[0] 28197 if v_0.Op != OpConst8 { 28198 break 28199 } 28200 d := v_0.AuxInt 28201 v_1 := v.Args[1] 28202 if v_1.Op != OpConst8 { 28203 break 28204 } 28205 c := v_1.AuxInt 28206 v.reset(OpConst8) 28207 v.AuxInt = int64(int8(c ^ d)) 28208 return true 28209 } 28210 // match: (Xor8 x x) 28211 // cond: 28212 // result: (Const8 [0]) 28213 for { 28214 _ = v.Args[1] 28215 x := v.Args[0] 28216 if x != v.Args[1] { 28217 break 28218 } 28219 v.reset(OpConst8) 28220 v.AuxInt = 0 28221 return true 28222 } 28223 // match: (Xor8 (Const8 [0]) x) 28224 // cond: 28225 // result: x 28226 for { 28227 _ = v.Args[1] 28228 v_0 := v.Args[0] 28229 if v_0.Op != OpConst8 { 28230 break 28231 } 28232 if v_0.AuxInt != 0 { 28233 break 28234 } 28235 x := v.Args[1] 28236 v.reset(OpCopy) 28237 v.Type = x.Type 28238 v.AddArg(x) 28239 return true 28240 } 28241 // match: (Xor8 x (Const8 [0])) 28242 // cond: 28243 // result: x 28244 for { 28245 _ = v.Args[1] 28246 x := v.Args[0] 28247 v_1 := v.Args[1] 28248 if v_1.Op != OpConst8 { 28249 break 28250 } 28251 if v_1.AuxInt != 0 { 28252 break 28253 } 28254 v.reset(OpCopy) 28255 v.Type = x.Type 28256 v.AddArg(x) 28257 return true 28258 } 28259 // match: (Xor8 x (Xor8 x y)) 28260 // cond: 28261 // result: y 28262 for { 28263 _ = v.Args[1] 28264 x := v.Args[0] 28265 v_1 := v.Args[1] 28266 if v_1.Op != OpXor8 { 28267 break 28268 } 28269 _ = v_1.Args[1] 28270 if x != v_1.Args[0] { 28271 break 28272 } 28273 y := v_1.Args[1] 28274 v.reset(OpCopy) 28275 v.Type = y.Type 28276 v.AddArg(y) 28277 return true 28278 } 28279 // match: (Xor8 x (Xor8 y x)) 28280 // cond: 28281 // result: y 28282 for { 28283 _ = v.Args[1] 28284 x := v.Args[0] 28285 v_1 := v.Args[1] 28286 if v_1.Op != OpXor8 { 28287 break 28288 } 28289 _ = v_1.Args[1] 28290 y := v_1.Args[0] 28291 if x != v_1.Args[1] { 28292 break 28293 } 28294 v.reset(OpCopy) 28295 v.Type = y.Type 28296 v.AddArg(y) 28297 return true 28298 } 28299 // match: (Xor8 (Xor8 x y) x) 28300 // cond: 28301 // result: y 28302 for { 28303 _ = v.Args[1] 28304 v_0 := v.Args[0] 28305 if v_0.Op != OpXor8 { 28306 break 28307 } 28308 _ = v_0.Args[1] 28309 x := v_0.Args[0] 28310 y := v_0.Args[1] 28311 if x != v.Args[1] { 28312 break 28313 } 28314 v.reset(OpCopy) 28315 v.Type = y.Type 28316 v.AddArg(y) 28317 return true 28318 } 28319 // match: (Xor8 (Xor8 y x) x) 28320 // cond: 28321 // result: y 28322 for { 28323 _ = v.Args[1] 28324 v_0 := v.Args[0] 28325 if v_0.Op != OpXor8 { 28326 break 28327 } 28328 _ = v_0.Args[1] 28329 y := v_0.Args[0] 28330 x := v_0.Args[1] 28331 if x != v.Args[1] { 28332 break 28333 } 28334 v.reset(OpCopy) 28335 v.Type = y.Type 28336 v.AddArg(y) 28337 return true 28338 } 28339 // match: (Xor8 (Xor8 i:(Const8 <t>) z) x) 28340 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 28341 // result: (Xor8 i (Xor8 <t> z x)) 28342 for { 28343 _ = v.Args[1] 28344 v_0 := v.Args[0] 28345 if v_0.Op != OpXor8 { 28346 break 28347 } 28348 _ = v_0.Args[1] 28349 i := v_0.Args[0] 28350 if i.Op != OpConst8 { 28351 break 28352 } 28353 t := i.Type 28354 z := v_0.Args[1] 28355 x := v.Args[1] 28356 if !(z.Op != OpConst8 && x.Op != OpConst8) { 28357 break 28358 } 28359 v.reset(OpXor8) 28360 v.AddArg(i) 28361 v0 := b.NewValue0(v.Pos, OpXor8, t) 28362 v0.AddArg(z) 28363 v0.AddArg(x) 28364 v.AddArg(v0) 28365 return true 28366 } 28367 return false 28368 } 28369 func rewriteValuegeneric_OpXor8_10(v *Value) bool { 28370 b := v.Block 28371 _ = b 28372 // match: (Xor8 (Xor8 z i:(Const8 <t>)) x) 28373 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 28374 // result: (Xor8 i (Xor8 <t> z x)) 28375 for { 28376 _ = v.Args[1] 28377 v_0 := v.Args[0] 28378 if v_0.Op != OpXor8 { 28379 break 28380 } 28381 _ = v_0.Args[1] 28382 z := v_0.Args[0] 28383 i := v_0.Args[1] 28384 if i.Op != OpConst8 { 28385 break 28386 } 28387 t := i.Type 28388 x := v.Args[1] 28389 if !(z.Op != OpConst8 && x.Op != OpConst8) { 28390 break 28391 } 28392 v.reset(OpXor8) 28393 v.AddArg(i) 28394 v0 := b.NewValue0(v.Pos, OpXor8, t) 28395 v0.AddArg(z) 28396 v0.AddArg(x) 28397 v.AddArg(v0) 28398 return true 28399 } 28400 // match: (Xor8 x (Xor8 i:(Const8 <t>) z)) 28401 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 28402 // result: (Xor8 i (Xor8 <t> z x)) 28403 for { 28404 _ = v.Args[1] 28405 x := v.Args[0] 28406 v_1 := v.Args[1] 28407 if v_1.Op != OpXor8 { 28408 break 28409 } 28410 _ = v_1.Args[1] 28411 i := v_1.Args[0] 28412 if i.Op != OpConst8 { 28413 break 28414 } 28415 t := i.Type 28416 z := v_1.Args[1] 28417 if !(z.Op != OpConst8 && x.Op != OpConst8) { 28418 break 28419 } 28420 v.reset(OpXor8) 28421 v.AddArg(i) 28422 v0 := b.NewValue0(v.Pos, OpXor8, t) 28423 v0.AddArg(z) 28424 v0.AddArg(x) 28425 v.AddArg(v0) 28426 return true 28427 } 28428 // match: (Xor8 x (Xor8 z i:(Const8 <t>))) 28429 // cond: (z.Op != OpConst8 && x.Op != OpConst8) 28430 // result: (Xor8 i (Xor8 <t> z x)) 28431 for { 28432 _ = v.Args[1] 28433 x := v.Args[0] 28434 v_1 := v.Args[1] 28435 if v_1.Op != OpXor8 { 28436 break 28437 } 28438 _ = v_1.Args[1] 28439 z := v_1.Args[0] 28440 i := v_1.Args[1] 28441 if i.Op != OpConst8 { 28442 break 28443 } 28444 t := i.Type 28445 if !(z.Op != OpConst8 && x.Op != OpConst8) { 28446 break 28447 } 28448 v.reset(OpXor8) 28449 v.AddArg(i) 28450 v0 := b.NewValue0(v.Pos, OpXor8, t) 28451 v0.AddArg(z) 28452 v0.AddArg(x) 28453 v.AddArg(v0) 28454 return true 28455 } 28456 // match: (Xor8 (Const8 <t> [c]) (Xor8 (Const8 <t> [d]) x)) 28457 // cond: 28458 // result: (Xor8 (Const8 <t> [int64(int8(c^d))]) x) 28459 for { 28460 _ = v.Args[1] 28461 v_0 := v.Args[0] 28462 if v_0.Op != OpConst8 { 28463 break 28464 } 28465 t := v_0.Type 28466 c := v_0.AuxInt 28467 v_1 := v.Args[1] 28468 if v_1.Op != OpXor8 { 28469 break 28470 } 28471 _ = v_1.Args[1] 28472 v_1_0 := v_1.Args[0] 28473 if v_1_0.Op != OpConst8 { 28474 break 28475 } 28476 if v_1_0.Type != t { 28477 break 28478 } 28479 d := v_1_0.AuxInt 28480 x := v_1.Args[1] 28481 v.reset(OpXor8) 28482 v0 := b.NewValue0(v.Pos, OpConst8, t) 28483 v0.AuxInt = int64(int8(c ^ d)) 28484 v.AddArg(v0) 28485 v.AddArg(x) 28486 return true 28487 } 28488 // match: (Xor8 (Const8 <t> [c]) (Xor8 x (Const8 <t> [d]))) 28489 // cond: 28490 // result: (Xor8 (Const8 <t> [int64(int8(c^d))]) x) 28491 for { 28492 _ = v.Args[1] 28493 v_0 := v.Args[0] 28494 if v_0.Op != OpConst8 { 28495 break 28496 } 28497 t := v_0.Type 28498 c := v_0.AuxInt 28499 v_1 := v.Args[1] 28500 if v_1.Op != OpXor8 { 28501 break 28502 } 28503 _ = v_1.Args[1] 28504 x := v_1.Args[0] 28505 v_1_1 := v_1.Args[1] 28506 if v_1_1.Op != OpConst8 { 28507 break 28508 } 28509 if v_1_1.Type != t { 28510 break 28511 } 28512 d := v_1_1.AuxInt 28513 v.reset(OpXor8) 28514 v0 := b.NewValue0(v.Pos, OpConst8, t) 28515 v0.AuxInt = int64(int8(c ^ d)) 28516 v.AddArg(v0) 28517 v.AddArg(x) 28518 return true 28519 } 28520 // match: (Xor8 (Xor8 (Const8 <t> [d]) x) (Const8 <t> [c])) 28521 // cond: 28522 // result: (Xor8 (Const8 <t> [int64(int8(c^d))]) x) 28523 for { 28524 _ = v.Args[1] 28525 v_0 := v.Args[0] 28526 if v_0.Op != OpXor8 { 28527 break 28528 } 28529 _ = v_0.Args[1] 28530 v_0_0 := v_0.Args[0] 28531 if v_0_0.Op != OpConst8 { 28532 break 28533 } 28534 t := v_0_0.Type 28535 d := v_0_0.AuxInt 28536 x := v_0.Args[1] 28537 v_1 := v.Args[1] 28538 if v_1.Op != OpConst8 { 28539 break 28540 } 28541 if v_1.Type != t { 28542 break 28543 } 28544 c := v_1.AuxInt 28545 v.reset(OpXor8) 28546 v0 := b.NewValue0(v.Pos, OpConst8, t) 28547 v0.AuxInt = int64(int8(c ^ d)) 28548 v.AddArg(v0) 28549 v.AddArg(x) 28550 return true 28551 } 28552 // match: (Xor8 (Xor8 x (Const8 <t> [d])) (Const8 <t> [c])) 28553 // cond: 28554 // result: (Xor8 (Const8 <t> [int64(int8(c^d))]) x) 28555 for { 28556 _ = v.Args[1] 28557 v_0 := v.Args[0] 28558 if v_0.Op != OpXor8 { 28559 break 28560 } 28561 _ = v_0.Args[1] 28562 x := v_0.Args[0] 28563 v_0_1 := v_0.Args[1] 28564 if v_0_1.Op != OpConst8 { 28565 break 28566 } 28567 t := v_0_1.Type 28568 d := v_0_1.AuxInt 28569 v_1 := v.Args[1] 28570 if v_1.Op != OpConst8 { 28571 break 28572 } 28573 if v_1.Type != t { 28574 break 28575 } 28576 c := v_1.AuxInt 28577 v.reset(OpXor8) 28578 v0 := b.NewValue0(v.Pos, OpConst8, t) 28579 v0.AuxInt = int64(int8(c ^ d)) 28580 v.AddArg(v0) 28581 v.AddArg(x) 28582 return true 28583 } 28584 return false 28585 } 28586 func rewriteValuegeneric_OpZero_0(v *Value) bool { 28587 b := v.Block 28588 _ = b 28589 config := b.Func.Config 28590 _ = config 28591 // match: (Zero (Load (OffPtr [c] (SP)) mem) mem) 28592 // cond: mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize 28593 // result: mem 28594 for { 28595 _ = v.Args[1] 28596 v_0 := v.Args[0] 28597 if v_0.Op != OpLoad { 28598 break 28599 } 28600 _ = v_0.Args[1] 28601 v_0_0 := v_0.Args[0] 28602 if v_0_0.Op != OpOffPtr { 28603 break 28604 } 28605 c := v_0_0.AuxInt 28606 v_0_0_0 := v_0_0.Args[0] 28607 if v_0_0_0.Op != OpSP { 28608 break 28609 } 28610 mem := v_0.Args[1] 28611 if mem != v.Args[1] { 28612 break 28613 } 28614 if !(mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize) { 28615 break 28616 } 28617 v.reset(OpCopy) 28618 v.Type = mem.Type 28619 v.AddArg(mem) 28620 return true 28621 } 28622 return false 28623 } 28624 func rewriteValuegeneric_OpZeroExt16to32_0(v *Value) bool { 28625 // match: (ZeroExt16to32 (Const16 [c])) 28626 // cond: 28627 // result: (Const32 [int64(uint16(c))]) 28628 for { 28629 v_0 := v.Args[0] 28630 if v_0.Op != OpConst16 { 28631 break 28632 } 28633 c := v_0.AuxInt 28634 v.reset(OpConst32) 28635 v.AuxInt = int64(uint16(c)) 28636 return true 28637 } 28638 // match: (ZeroExt16to32 (Trunc32to16 x:(Rsh32Ux64 _ (Const64 [s])))) 28639 // cond: s >= 16 28640 // result: x 28641 for { 28642 v_0 := v.Args[0] 28643 if v_0.Op != OpTrunc32to16 { 28644 break 28645 } 28646 x := v_0.Args[0] 28647 if x.Op != OpRsh32Ux64 { 28648 break 28649 } 28650 _ = x.Args[1] 28651 x_1 := x.Args[1] 28652 if x_1.Op != OpConst64 { 28653 break 28654 } 28655 s := x_1.AuxInt 28656 if !(s >= 16) { 28657 break 28658 } 28659 v.reset(OpCopy) 28660 v.Type = x.Type 28661 v.AddArg(x) 28662 return true 28663 } 28664 return false 28665 } 28666 func rewriteValuegeneric_OpZeroExt16to64_0(v *Value) bool { 28667 // match: (ZeroExt16to64 (Const16 [c])) 28668 // cond: 28669 // result: (Const64 [int64(uint16(c))]) 28670 for { 28671 v_0 := v.Args[0] 28672 if v_0.Op != OpConst16 { 28673 break 28674 } 28675 c := v_0.AuxInt 28676 v.reset(OpConst64) 28677 v.AuxInt = int64(uint16(c)) 28678 return true 28679 } 28680 // match: (ZeroExt16to64 (Trunc64to16 x:(Rsh64Ux64 _ (Const64 [s])))) 28681 // cond: s >= 48 28682 // result: x 28683 for { 28684 v_0 := v.Args[0] 28685 if v_0.Op != OpTrunc64to16 { 28686 break 28687 } 28688 x := v_0.Args[0] 28689 if x.Op != OpRsh64Ux64 { 28690 break 28691 } 28692 _ = x.Args[1] 28693 x_1 := x.Args[1] 28694 if x_1.Op != OpConst64 { 28695 break 28696 } 28697 s := x_1.AuxInt 28698 if !(s >= 48) { 28699 break 28700 } 28701 v.reset(OpCopy) 28702 v.Type = x.Type 28703 v.AddArg(x) 28704 return true 28705 } 28706 return false 28707 } 28708 func rewriteValuegeneric_OpZeroExt32to64_0(v *Value) bool { 28709 // match: (ZeroExt32to64 (Const32 [c])) 28710 // cond: 28711 // result: (Const64 [int64(uint32(c))]) 28712 for { 28713 v_0 := v.Args[0] 28714 if v_0.Op != OpConst32 { 28715 break 28716 } 28717 c := v_0.AuxInt 28718 v.reset(OpConst64) 28719 v.AuxInt = int64(uint32(c)) 28720 return true 28721 } 28722 // match: (ZeroExt32to64 (Trunc64to32 x:(Rsh64Ux64 _ (Const64 [s])))) 28723 // cond: s >= 32 28724 // result: x 28725 for { 28726 v_0 := v.Args[0] 28727 if v_0.Op != OpTrunc64to32 { 28728 break 28729 } 28730 x := v_0.Args[0] 28731 if x.Op != OpRsh64Ux64 { 28732 break 28733 } 28734 _ = x.Args[1] 28735 x_1 := x.Args[1] 28736 if x_1.Op != OpConst64 { 28737 break 28738 } 28739 s := x_1.AuxInt 28740 if !(s >= 32) { 28741 break 28742 } 28743 v.reset(OpCopy) 28744 v.Type = x.Type 28745 v.AddArg(x) 28746 return true 28747 } 28748 return false 28749 } 28750 func rewriteValuegeneric_OpZeroExt8to16_0(v *Value) bool { 28751 // match: (ZeroExt8to16 (Const8 [c])) 28752 // cond: 28753 // result: (Const16 [int64( uint8(c))]) 28754 for { 28755 v_0 := v.Args[0] 28756 if v_0.Op != OpConst8 { 28757 break 28758 } 28759 c := v_0.AuxInt 28760 v.reset(OpConst16) 28761 v.AuxInt = int64(uint8(c)) 28762 return true 28763 } 28764 // match: (ZeroExt8to16 (Trunc16to8 x:(Rsh16Ux64 _ (Const64 [s])))) 28765 // cond: s >= 8 28766 // result: x 28767 for { 28768 v_0 := v.Args[0] 28769 if v_0.Op != OpTrunc16to8 { 28770 break 28771 } 28772 x := v_0.Args[0] 28773 if x.Op != OpRsh16Ux64 { 28774 break 28775 } 28776 _ = x.Args[1] 28777 x_1 := x.Args[1] 28778 if x_1.Op != OpConst64 { 28779 break 28780 } 28781 s := x_1.AuxInt 28782 if !(s >= 8) { 28783 break 28784 } 28785 v.reset(OpCopy) 28786 v.Type = x.Type 28787 v.AddArg(x) 28788 return true 28789 } 28790 return false 28791 } 28792 func rewriteValuegeneric_OpZeroExt8to32_0(v *Value) bool { 28793 // match: (ZeroExt8to32 (Const8 [c])) 28794 // cond: 28795 // result: (Const32 [int64( uint8(c))]) 28796 for { 28797 v_0 := v.Args[0] 28798 if v_0.Op != OpConst8 { 28799 break 28800 } 28801 c := v_0.AuxInt 28802 v.reset(OpConst32) 28803 v.AuxInt = int64(uint8(c)) 28804 return true 28805 } 28806 // match: (ZeroExt8to32 (Trunc32to8 x:(Rsh32Ux64 _ (Const64 [s])))) 28807 // cond: s >= 24 28808 // result: x 28809 for { 28810 v_0 := v.Args[0] 28811 if v_0.Op != OpTrunc32to8 { 28812 break 28813 } 28814 x := v_0.Args[0] 28815 if x.Op != OpRsh32Ux64 { 28816 break 28817 } 28818 _ = x.Args[1] 28819 x_1 := x.Args[1] 28820 if x_1.Op != OpConst64 { 28821 break 28822 } 28823 s := x_1.AuxInt 28824 if !(s >= 24) { 28825 break 28826 } 28827 v.reset(OpCopy) 28828 v.Type = x.Type 28829 v.AddArg(x) 28830 return true 28831 } 28832 return false 28833 } 28834 func rewriteValuegeneric_OpZeroExt8to64_0(v *Value) bool { 28835 // match: (ZeroExt8to64 (Const8 [c])) 28836 // cond: 28837 // result: (Const64 [int64( uint8(c))]) 28838 for { 28839 v_0 := v.Args[0] 28840 if v_0.Op != OpConst8 { 28841 break 28842 } 28843 c := v_0.AuxInt 28844 v.reset(OpConst64) 28845 v.AuxInt = int64(uint8(c)) 28846 return true 28847 } 28848 // match: (ZeroExt8to64 (Trunc64to8 x:(Rsh64Ux64 _ (Const64 [s])))) 28849 // cond: s >= 56 28850 // result: x 28851 for { 28852 v_0 := v.Args[0] 28853 if v_0.Op != OpTrunc64to8 { 28854 break 28855 } 28856 x := v_0.Args[0] 28857 if x.Op != OpRsh64Ux64 { 28858 break 28859 } 28860 _ = x.Args[1] 28861 x_1 := x.Args[1] 28862 if x_1.Op != OpConst64 { 28863 break 28864 } 28865 s := x_1.AuxInt 28866 if !(s >= 56) { 28867 break 28868 } 28869 v.reset(OpCopy) 28870 v.Type = x.Type 28871 v.AddArg(x) 28872 return true 28873 } 28874 return false 28875 } 28876 func rewriteBlockgeneric(b *Block) bool { 28877 config := b.Func.Config 28878 _ = config 28879 fe := b.Func.fe 28880 _ = fe 28881 typ := &config.Types 28882 _ = typ 28883 switch b.Kind { 28884 case BlockIf: 28885 // match: (If (Not cond) yes no) 28886 // cond: 28887 // result: (If cond no yes) 28888 for { 28889 v := b.Control 28890 if v.Op != OpNot { 28891 break 28892 } 28893 cond := v.Args[0] 28894 b.Kind = BlockIf 28895 b.SetControl(cond) 28896 b.Aux = nil 28897 b.swapSuccessors() 28898 return true 28899 } 28900 // match: (If (ConstBool [c]) yes no) 28901 // cond: c == 1 28902 // result: (First nil yes no) 28903 for { 28904 v := b.Control 28905 if v.Op != OpConstBool { 28906 break 28907 } 28908 c := v.AuxInt 28909 if !(c == 1) { 28910 break 28911 } 28912 b.Kind = BlockFirst 28913 b.SetControl(nil) 28914 b.Aux = nil 28915 return true 28916 } 28917 // match: (If (ConstBool [c]) yes no) 28918 // cond: c == 0 28919 // result: (First nil no yes) 28920 for { 28921 v := b.Control 28922 if v.Op != OpConstBool { 28923 break 28924 } 28925 c := v.AuxInt 28926 if !(c == 0) { 28927 break 28928 } 28929 b.Kind = BlockFirst 28930 b.SetControl(nil) 28931 b.Aux = nil 28932 b.swapSuccessors() 28933 return true 28934 } 28935 } 28936 return false 28937 }