github.com/freddyisaac/sicortex-golang@v0.0.0-20231019035217-e03519e66f60/src/cmd/compile/internal/gc/testdata/arith.go (about) 1 // run 2 3 // Copyright 2015 The Go Authors. All rights reserved. 4 // Use of this source code is governed by a BSD-style 5 // license that can be found in the LICENSE file. 6 7 // Tests arithmetic expressions 8 9 package main 10 11 import "fmt" 12 13 const ( 14 y = 0x0fffFFFF 15 ) 16 17 //go:noinline 18 func lshNop1(x uint64) uint64 { 19 // two outer shifts should be removed 20 return (((x << 5) >> 2) << 2) 21 } 22 23 //go:noinline 24 func lshNop2(x uint64) uint64 { 25 return (((x << 5) >> 2) << 3) 26 } 27 28 //go:noinline 29 func lshNop3(x uint64) uint64 { 30 return (((x << 5) >> 2) << 6) 31 } 32 33 //go:noinline 34 func lshNotNop(x uint64) uint64 { 35 // outer shift can't be removed 36 return (((x << 5) >> 2) << 1) 37 } 38 39 //go:noinline 40 func rshNop1(x uint64) uint64 { 41 return (((x >> 5) << 2) >> 2) 42 } 43 44 //go:noinline 45 func rshNop2(x uint64) uint64 { 46 return (((x >> 5) << 2) >> 3) 47 } 48 49 //go:noinline 50 func rshNop3(x uint64) uint64 { 51 return (((x >> 5) << 2) >> 6) 52 } 53 54 //go:noinline 55 func rshNotNop(x uint64) uint64 { 56 return (((x >> 5) << 2) >> 1) 57 } 58 59 func testShiftRemoval() { 60 allSet := ^uint64(0) 61 if want, got := uint64(0x7ffffffffffffff), rshNop1(allSet); want != got { 62 println("testShiftRemoval rshNop1 failed, wanted", want, "got", got) 63 failed = true 64 } 65 if want, got := uint64(0x3ffffffffffffff), rshNop2(allSet); want != got { 66 println("testShiftRemoval rshNop2 failed, wanted", want, "got", got) 67 failed = true 68 } 69 if want, got := uint64(0x7fffffffffffff), rshNop3(allSet); want != got { 70 println("testShiftRemoval rshNop3 failed, wanted", want, "got", got) 71 failed = true 72 } 73 if want, got := uint64(0xffffffffffffffe), rshNotNop(allSet); want != got { 74 println("testShiftRemoval rshNotNop failed, wanted", want, "got", got) 75 failed = true 76 } 77 if want, got := uint64(0xffffffffffffffe0), lshNop1(allSet); want != got { 78 println("testShiftRemoval lshNop1 failed, wanted", want, "got", got) 79 failed = true 80 } 81 if want, got := uint64(0xffffffffffffffc0), lshNop2(allSet); want != got { 82 println("testShiftRemoval lshNop2 failed, wanted", want, "got", got) 83 failed = true 84 } 85 if want, got := uint64(0xfffffffffffffe00), lshNop3(allSet); want != got { 86 println("testShiftRemoval lshNop3 failed, wanted", want, "got", got) 87 failed = true 88 } 89 if want, got := uint64(0x7ffffffffffffff0), lshNotNop(allSet); want != got { 90 println("testShiftRemoval lshNotNop failed, wanted", want, "got", got) 91 failed = true 92 } 93 } 94 95 //go:noinline 96 func parseLE64(b []byte) uint64 { 97 // skip the first two bytes, and parse the remaining 8 as a uint64 98 return uint64(b[2]) | uint64(b[3])<<8 | uint64(b[4])<<16 | uint64(b[5])<<24 | 99 uint64(b[6])<<32 | uint64(b[7])<<40 | uint64(b[8])<<48 | uint64(b[9])<<56 100 } 101 102 //go:noinline 103 func parseLE32(b []byte) uint32 { 104 return uint32(b[2]) | uint32(b[3])<<8 | uint32(b[4])<<16 | uint32(b[5])<<24 105 } 106 107 //go:noinline 108 func parseLE16(b []byte) uint16 { 109 return uint16(b[2]) | uint16(b[3])<<8 110 } 111 112 // testLoadCombine tests for issue #14694 where load combining didn't respect the pointer offset. 113 func testLoadCombine() { 114 testData := []byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09} 115 if want, got := uint64(0x0908070605040302), parseLE64(testData); want != got { 116 println("testLoadCombine failed, wanted", want, "got", got) 117 failed = true 118 } 119 if want, got := uint32(0x05040302), parseLE32(testData); want != got { 120 println("testLoadCombine failed, wanted", want, "got", got) 121 failed = true 122 } 123 if want, got := uint16(0x0302), parseLE16(testData); want != got { 124 println("testLoadCombine failed, wanted", want, "got", got) 125 failed = true 126 } 127 } 128 129 var loadSymData = [...]byte{0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08} 130 131 func testLoadSymCombine() { 132 w2 := uint16(0x0201) 133 g2 := uint16(loadSymData[0]) | uint16(loadSymData[1])<<8 134 if g2 != w2 { 135 println("testLoadSymCombine failed, wanted", w2, "got", g2) 136 failed = true 137 } 138 w4 := uint32(0x04030201) 139 g4 := uint32(loadSymData[0]) | uint32(loadSymData[1])<<8 | 140 uint32(loadSymData[2])<<16 | uint32(loadSymData[3])<<24 141 if g4 != w4 { 142 println("testLoadSymCombine failed, wanted", w4, "got", g4) 143 failed = true 144 } 145 w8 := uint64(0x0807060504030201) 146 g8 := uint64(loadSymData[0]) | uint64(loadSymData[1])<<8 | 147 uint64(loadSymData[2])<<16 | uint64(loadSymData[3])<<24 | 148 uint64(loadSymData[4])<<32 | uint64(loadSymData[5])<<40 | 149 uint64(loadSymData[6])<<48 | uint64(loadSymData[7])<<56 150 if g8 != w8 { 151 println("testLoadSymCombine failed, wanted", w8, "got", g8) 152 failed = true 153 } 154 } 155 156 //go:noinline 157 func invalidAdd_ssa(x uint32) uint32 { 158 return x + y + y + y + y + y + y + y + y + y + y + y + y + y + y + y + y + y 159 } 160 161 //go:noinline 162 func invalidSub_ssa(x uint32) uint32 { 163 return x - y - y - y - y - y - y - y - y - y - y - y - y - y - y - y - y - y 164 } 165 166 //go:noinline 167 func invalidMul_ssa(x uint32) uint32 { 168 return x * y * y * y * y * y * y * y * y * y * y * y * y * y * y * y * y * y 169 } 170 171 // testLargeConst tests a situation where larger than 32 bit consts were passed to ADDL 172 // causing an invalid instruction error. 173 func testLargeConst() { 174 if want, got := uint32(268435440), invalidAdd_ssa(1); want != got { 175 println("testLargeConst add failed, wanted", want, "got", got) 176 failed = true 177 } 178 if want, got := uint32(4026531858), invalidSub_ssa(1); want != got { 179 println("testLargeConst sub failed, wanted", want, "got", got) 180 failed = true 181 } 182 if want, got := uint32(268435455), invalidMul_ssa(1); want != got { 183 println("testLargeConst mul failed, wanted", want, "got", got) 184 failed = true 185 } 186 } 187 188 // testArithRshConst ensures that "const >> const" right shifts correctly perform 189 // sign extension on the lhs constant 190 func testArithRshConst() { 191 wantu := uint64(0x4000000000000000) 192 if got := arithRshuConst_ssa(); got != wantu { 193 println("arithRshuConst failed, wanted", wantu, "got", got) 194 failed = true 195 } 196 197 wants := int64(-0x4000000000000000) 198 if got := arithRshConst_ssa(); got != wants { 199 println("arithRshuConst failed, wanted", wants, "got", got) 200 failed = true 201 } 202 } 203 204 //go:noinline 205 func arithRshuConst_ssa() uint64 { 206 y := uint64(0x8000000000000001) 207 z := uint64(1) 208 return uint64(y >> z) 209 } 210 211 //go:noinline 212 func arithRshConst_ssa() int64 { 213 y := int64(-0x8000000000000000) 214 z := uint64(1) 215 return int64(y >> z) 216 } 217 218 //go:noinline 219 func arithConstShift_ssa(x int64) int64 { 220 return x >> 100 221 } 222 223 // testArithConstShift tests that right shift by large constants preserve 224 // the sign of the input. 225 func testArithConstShift() { 226 want := int64(-1) 227 if got := arithConstShift_ssa(-1); want != got { 228 println("arithConstShift_ssa(-1) failed, wanted", want, "got", got) 229 failed = true 230 } 231 want = 0 232 if got := arithConstShift_ssa(1); want != got { 233 println("arithConstShift_ssa(1) failed, wanted", want, "got", got) 234 failed = true 235 } 236 } 237 238 // overflowConstShift_ssa verifes that constant folding for shift 239 // doesn't wrap (i.e. x << MAX_INT << 1 doesn't get folded to x << 0). 240 //go:noinline 241 func overflowConstShift64_ssa(x int64) int64 { 242 return x << uint64(0xffffffffffffffff) << uint64(1) 243 } 244 245 //go:noinline 246 func overflowConstShift32_ssa(x int64) int32 { 247 return int32(x) << uint32(0xffffffff) << uint32(1) 248 } 249 250 //go:noinline 251 func overflowConstShift16_ssa(x int64) int16 { 252 return int16(x) << uint16(0xffff) << uint16(1) 253 } 254 255 //go:noinline 256 func overflowConstShift8_ssa(x int64) int8 { 257 return int8(x) << uint8(0xff) << uint8(1) 258 } 259 260 func testOverflowConstShift() { 261 want := int64(0) 262 for x := int64(-127); x < int64(127); x++ { 263 got := overflowConstShift64_ssa(x) 264 if want != got { 265 fmt.Printf("overflowShift64 failed, wanted %d got %d\n", want, got) 266 } 267 got = int64(overflowConstShift32_ssa(x)) 268 if want != got { 269 fmt.Printf("overflowShift32 failed, wanted %d got %d\n", want, got) 270 } 271 got = int64(overflowConstShift16_ssa(x)) 272 if want != got { 273 fmt.Printf("overflowShift16 failed, wanted %d got %d\n", want, got) 274 } 275 got = int64(overflowConstShift8_ssa(x)) 276 if want != got { 277 fmt.Printf("overflowShift8 failed, wanted %d got %d\n", want, got) 278 } 279 } 280 } 281 282 // test64BitConstMult tests that rewrite rules don't fold 64 bit constants 283 // into multiply instructions. 284 func test64BitConstMult() { 285 want := int64(103079215109) 286 if got := test64BitConstMult_ssa(1, 2); want != got { 287 println("test64BitConstMult failed, wanted", want, "got", got) 288 failed = true 289 } 290 } 291 292 //go:noinline 293 func test64BitConstMult_ssa(a, b int64) int64 { 294 return 34359738369*a + b*34359738370 295 } 296 297 // test64BitConstAdd tests that rewrite rules don't fold 64 bit constants 298 // into add instructions. 299 func test64BitConstAdd() { 300 want := int64(3567671782835376650) 301 if got := test64BitConstAdd_ssa(1, 2); want != got { 302 println("test64BitConstAdd failed, wanted", want, "got", got) 303 failed = true 304 } 305 } 306 307 //go:noinline 308 func test64BitConstAdd_ssa(a, b int64) int64 { 309 return a + 575815584948629622 + b + 2991856197886747025 310 } 311 312 // testRegallocCVSpill tests that regalloc spills a value whose last use is the 313 // current value. 314 func testRegallocCVSpill() { 315 want := int8(-9) 316 if got := testRegallocCVSpill_ssa(1, 2, 3, 4); want != got { 317 println("testRegallocCVSpill failed, wanted", want, "got", got) 318 failed = true 319 } 320 } 321 322 //go:noinline 323 func testRegallocCVSpill_ssa(a, b, c, d int8) int8 { 324 return a + -32 + b + 63*c*-87*d 325 } 326 327 func testBitwiseLogic() { 328 a, b := uint32(57623283), uint32(1314713839) 329 if want, got := uint32(38551779), testBitwiseAnd_ssa(a, b); want != got { 330 println("testBitwiseAnd failed, wanted", want, "got", got) 331 failed = true 332 } 333 if want, got := uint32(1333785343), testBitwiseOr_ssa(a, b); want != got { 334 println("testBitwiseOr failed, wanted", want, "got", got) 335 failed = true 336 } 337 if want, got := uint32(1295233564), testBitwiseXor_ssa(a, b); want != got { 338 println("testBitwiseXor failed, wanted", want, "got", got) 339 failed = true 340 } 341 if want, got := int32(832), testBitwiseLsh_ssa(13, 4, 2); want != got { 342 println("testBitwiseLsh failed, wanted", want, "got", got) 343 failed = true 344 } 345 if want, got := int32(0), testBitwiseLsh_ssa(13, 25, 15); want != got { 346 println("testBitwiseLsh failed, wanted", want, "got", got) 347 failed = true 348 } 349 if want, got := int32(0), testBitwiseLsh_ssa(-13, 25, 15); want != got { 350 println("testBitwiseLsh failed, wanted", want, "got", got) 351 failed = true 352 } 353 if want, got := int32(-13), testBitwiseRsh_ssa(-832, 4, 2); want != got { 354 println("testBitwiseRsh failed, wanted", want, "got", got) 355 failed = true 356 } 357 if want, got := int32(0), testBitwiseRsh_ssa(13, 25, 15); want != got { 358 println("testBitwiseRsh failed, wanted", want, "got", got) 359 failed = true 360 } 361 if want, got := int32(-1), testBitwiseRsh_ssa(-13, 25, 15); want != got { 362 println("testBitwiseRsh failed, wanted", want, "got", got) 363 failed = true 364 } 365 if want, got := uint32(0x3ffffff), testBitwiseRshU_ssa(0xffffffff, 4, 2); want != got { 366 println("testBitwiseRshU failed, wanted", want, "got", got) 367 failed = true 368 } 369 if want, got := uint32(0), testBitwiseRshU_ssa(13, 25, 15); want != got { 370 println("testBitwiseRshU failed, wanted", want, "got", got) 371 failed = true 372 } 373 if want, got := uint32(0), testBitwiseRshU_ssa(0x8aaaaaaa, 25, 15); want != got { 374 println("testBitwiseRshU failed, wanted", want, "got", got) 375 failed = true 376 } 377 } 378 379 //go:noinline 380 func testBitwiseAnd_ssa(a, b uint32) uint32 { 381 return a & b 382 } 383 384 //go:noinline 385 func testBitwiseOr_ssa(a, b uint32) uint32 { 386 return a | b 387 } 388 389 //go:noinline 390 func testBitwiseXor_ssa(a, b uint32) uint32 { 391 return a ^ b 392 } 393 394 //go:noinline 395 func testBitwiseLsh_ssa(a int32, b, c uint32) int32 { 396 return a << b << c 397 } 398 399 //go:noinline 400 func testBitwiseRsh_ssa(a int32, b, c uint32) int32 { 401 return a >> b >> c 402 } 403 404 //go:noinline 405 func testBitwiseRshU_ssa(a uint32, b, c uint32) uint32 { 406 return a >> b >> c 407 } 408 409 //go:noinline 410 func testShiftCX_ssa() int { 411 v1 := uint8(3) 412 v4 := (v1 * v1) ^ v1 | v1 - v1 - v1&v1 ^ uint8(3+2) + v1*1>>0 - v1 | 1 | v1<<(2*3|0-0*0^1) 413 v5 := v4>>(3-0-uint(3)) | v1 | v1 + v1 ^ v4<<(0+1|3&1)<<(uint64(1)<<0*2*0<<0) ^ v1 414 v6 := v5 ^ (v1+v1)*v1 | v1 | v1*v1>>(v1&v1)>>(uint(1)<<0*uint(3)>>1)*v1<<2*v1<<v1 - v1>>2 | (v4 - v1) ^ v1 + v1 ^ v1>>1 | v1 + v1 - v1 ^ v1 415 v7 := v6 & v5 << 0 416 v1++ 417 v11 := 2&1 ^ 0 + 3 | int(0^0)<<1>>(1*0*3) ^ 0*0 ^ 3&0*3&3 ^ 3*3 ^ 1 ^ int(2)<<(2*3) + 2 | 2 | 2 ^ 2 + 1 | 3 | 0 ^ int(1)>>1 ^ 2 // int 418 v7-- 419 return int(uint64(2*1)<<(3-2)<<uint(3>>v7)-2)&v11 | v11 - int(2)<<0>>(2-1)*(v11*0&v11<<1<<(uint8(2)+v4)) 420 } 421 422 func testShiftCX() { 423 want := 141 424 if got := testShiftCX_ssa(); want != got { 425 println("testShiftCX failed, wanted", want, "got", got) 426 failed = true 427 } 428 } 429 430 // testSubqToNegq ensures that the SUBQ -> NEGQ translation works correctly. 431 func testSubqToNegq() { 432 want := int64(-318294940372190156) 433 if got := testSubqToNegq_ssa(1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2); want != got { 434 println("testSubqToNegq failed, wanted", want, "got", got) 435 failed = true 436 } 437 } 438 439 //go:noinline 440 func testSubqToNegq_ssa(a, b, c, d, e, f, g, h, i, j, k int64) int64 { 441 return a + 8207351403619448057 - b - 1779494519303207690 + c*8810076340510052032*d - 4465874067674546219 - e*4361839741470334295 - f + 8688847565426072650*g*8065564729145417479 442 } 443 444 func testOcom() { 445 want1, want2 := int32(0x55555555), int32(-0x55555556) 446 if got1, got2 := testOcom_ssa(0x55555555, 0x55555555); want1 != got1 || want2 != got2 { 447 println("testSubqToNegq failed, wanted", want1, "and", want2, 448 "got", got1, "and", got2) 449 failed = true 450 } 451 } 452 453 //go:noinline 454 func testOcom_ssa(a, b int32) (int32, int32) { 455 return ^^^^a, ^^^^^b 456 } 457 458 func lrot1_ssa(w uint8, x uint16, y uint32, z uint64) (a uint8, b uint16, c uint32, d uint64) { 459 a = (w << 5) | (w >> 3) 460 b = (x << 13) | (x >> 3) 461 c = (y << 29) | (y >> 3) 462 d = (z << 61) | (z >> 3) 463 return 464 } 465 466 //go:noinline 467 func lrot2_ssa(w, n uint32) uint32 { 468 // Want to be sure that a "rotate by 32" which 469 // is really 0 | (w >> 0) == w 470 // is correctly compiled. 471 return (w << n) | (w >> (32 - n)) 472 } 473 474 //go:noinline 475 func lrot3_ssa(w uint32) uint32 { 476 // Want to be sure that a "rotate by 32" which 477 // is really 0 | (w >> 0) == w 478 // is correctly compiled. 479 return (w << 32) | (w >> (32 - 32)) 480 } 481 482 func testLrot() { 483 wantA, wantB, wantC, wantD := uint8(0xe1), uint16(0xe001), 484 uint32(0xe0000001), uint64(0xe000000000000001) 485 a, b, c, d := lrot1_ssa(0xf, 0xf, 0xf, 0xf) 486 if a != wantA || b != wantB || c != wantC || d != wantD { 487 println("lrot1_ssa(0xf, 0xf, 0xf, 0xf)=", 488 wantA, wantB, wantC, wantD, ", got", a, b, c, d) 489 failed = true 490 } 491 // Also test inputs with the top bit set, and make sure 492 // sub-word right shift has high bits cleared first. 493 // See issue #19270. 494 wantA, wantB, wantC, wantD = uint8(0xdf), uint16(0xdfff), 495 uint32(0xdfffffff), uint64(0xdfffffffffffffff) 496 a, b, c, d = lrot1_ssa(0xfe, 0xfffe, 0xfffffffe, 0xfffffffffffffffe) 497 if a != wantA || b != wantB || c != wantC || d != wantD { 498 println("lrot1_ssa(0xfe, 0xfffe, 0xfffffffe, 0xfffffffffffffffe)=", 499 wantA, wantB, wantC, wantD, ", got", a, b, c, d) 500 failed = true 501 } 502 x := lrot2_ssa(0xb0000001, 32) 503 wantX := uint32(0xb0000001) 504 if x != wantX { 505 println("lrot2_ssa(0xb0000001, 32)=", 506 wantX, ", got", x) 507 failed = true 508 } 509 x = lrot3_ssa(0xb0000001) 510 if x != wantX { 511 println("lrot3_ssa(0xb0000001)=", 512 wantX, ", got", x) 513 failed = true 514 } 515 516 } 517 518 //go:noinline 519 func sub1_ssa() uint64 { 520 v1 := uint64(3) // uint64 521 return v1*v1 - (v1&v1)&v1 522 } 523 524 //go:noinline 525 func sub2_ssa() uint8 { 526 v1 := uint8(0) 527 v3 := v1 + v1 + v1 ^ v1 | 3 + v1 ^ v1 | v1 ^ v1 528 v1-- // dev.ssa doesn't see this one 529 return v1 ^ v1*v1 - v3 530 } 531 532 func testSubConst() { 533 x1 := sub1_ssa() 534 want1 := uint64(6) 535 if x1 != want1 { 536 println("sub1_ssa()=", want1, ", got", x1) 537 failed = true 538 } 539 x2 := sub2_ssa() 540 want2 := uint8(251) 541 if x2 != want2 { 542 println("sub2_ssa()=", want2, ", got", x2) 543 failed = true 544 } 545 } 546 547 //go:noinline 548 func orPhi_ssa(a bool, x int) int { 549 v := 0 550 if a { 551 v = -1 552 } else { 553 v = -1 554 } 555 return x | v 556 } 557 558 func testOrPhi() { 559 if want, got := -1, orPhi_ssa(true, 4); got != want { 560 println("orPhi_ssa(true, 4)=", got, " want ", want) 561 } 562 if want, got := -1, orPhi_ssa(false, 0); got != want { 563 println("orPhi_ssa(false, 0)=", got, " want ", want) 564 } 565 } 566 567 //go:noinline 568 func addshiftLL_ssa(a, b uint32) uint32 { 569 return a + b<<3 570 } 571 572 //go:noinline 573 func subshiftLL_ssa(a, b uint32) uint32 { 574 return a - b<<3 575 } 576 577 //go:noinline 578 func rsbshiftLL_ssa(a, b uint32) uint32 { 579 return a<<3 - b 580 } 581 582 //go:noinline 583 func andshiftLL_ssa(a, b uint32) uint32 { 584 return a & (b << 3) 585 } 586 587 //go:noinline 588 func orshiftLL_ssa(a, b uint32) uint32 { 589 return a | b<<3 590 } 591 592 //go:noinline 593 func xorshiftLL_ssa(a, b uint32) uint32 { 594 return a ^ b<<3 595 } 596 597 //go:noinline 598 func bicshiftLL_ssa(a, b uint32) uint32 { 599 return a &^ (b << 3) 600 } 601 602 //go:noinline 603 func notshiftLL_ssa(a uint32) uint32 { 604 return ^(a << 3) 605 } 606 607 //go:noinline 608 func addshiftRL_ssa(a, b uint32) uint32 { 609 return a + b>>3 610 } 611 612 //go:noinline 613 func subshiftRL_ssa(a, b uint32) uint32 { 614 return a - b>>3 615 } 616 617 //go:noinline 618 func rsbshiftRL_ssa(a, b uint32) uint32 { 619 return a>>3 - b 620 } 621 622 //go:noinline 623 func andshiftRL_ssa(a, b uint32) uint32 { 624 return a & (b >> 3) 625 } 626 627 //go:noinline 628 func orshiftRL_ssa(a, b uint32) uint32 { 629 return a | b>>3 630 } 631 632 //go:noinline 633 func xorshiftRL_ssa(a, b uint32) uint32 { 634 return a ^ b>>3 635 } 636 637 //go:noinline 638 func bicshiftRL_ssa(a, b uint32) uint32 { 639 return a &^ (b >> 3) 640 } 641 642 //go:noinline 643 func notshiftRL_ssa(a uint32) uint32 { 644 return ^(a >> 3) 645 } 646 647 //go:noinline 648 func addshiftRA_ssa(a, b int32) int32 { 649 return a + b>>3 650 } 651 652 //go:noinline 653 func subshiftRA_ssa(a, b int32) int32 { 654 return a - b>>3 655 } 656 657 //go:noinline 658 func rsbshiftRA_ssa(a, b int32) int32 { 659 return a>>3 - b 660 } 661 662 //go:noinline 663 func andshiftRA_ssa(a, b int32) int32 { 664 return a & (b >> 3) 665 } 666 667 //go:noinline 668 func orshiftRA_ssa(a, b int32) int32 { 669 return a | b>>3 670 } 671 672 //go:noinline 673 func xorshiftRA_ssa(a, b int32) int32 { 674 return a ^ b>>3 675 } 676 677 //go:noinline 678 func bicshiftRA_ssa(a, b int32) int32 { 679 return a &^ (b >> 3) 680 } 681 682 //go:noinline 683 func notshiftRA_ssa(a int32) int32 { 684 return ^(a >> 3) 685 } 686 687 //go:noinline 688 func addshiftLLreg_ssa(a, b uint32, s uint8) uint32 { 689 return a + b<<s 690 } 691 692 //go:noinline 693 func subshiftLLreg_ssa(a, b uint32, s uint8) uint32 { 694 return a - b<<s 695 } 696 697 //go:noinline 698 func rsbshiftLLreg_ssa(a, b uint32, s uint8) uint32 { 699 return a<<s - b 700 } 701 702 //go:noinline 703 func andshiftLLreg_ssa(a, b uint32, s uint8) uint32 { 704 return a & (b << s) 705 } 706 707 //go:noinline 708 func orshiftLLreg_ssa(a, b uint32, s uint8) uint32 { 709 return a | b<<s 710 } 711 712 //go:noinline 713 func xorshiftLLreg_ssa(a, b uint32, s uint8) uint32 { 714 return a ^ b<<s 715 } 716 717 //go:noinline 718 func bicshiftLLreg_ssa(a, b uint32, s uint8) uint32 { 719 return a &^ (b << s) 720 } 721 722 //go:noinline 723 func notshiftLLreg_ssa(a uint32, s uint8) uint32 { 724 return ^(a << s) 725 } 726 727 //go:noinline 728 func addshiftRLreg_ssa(a, b uint32, s uint8) uint32 { 729 return a + b>>s 730 } 731 732 //go:noinline 733 func subshiftRLreg_ssa(a, b uint32, s uint8) uint32 { 734 return a - b>>s 735 } 736 737 //go:noinline 738 func rsbshiftRLreg_ssa(a, b uint32, s uint8) uint32 { 739 return a>>s - b 740 } 741 742 //go:noinline 743 func andshiftRLreg_ssa(a, b uint32, s uint8) uint32 { 744 return a & (b >> s) 745 } 746 747 //go:noinline 748 func orshiftRLreg_ssa(a, b uint32, s uint8) uint32 { 749 return a | b>>s 750 } 751 752 //go:noinline 753 func xorshiftRLreg_ssa(a, b uint32, s uint8) uint32 { 754 return a ^ b>>s 755 } 756 757 //go:noinline 758 func bicshiftRLreg_ssa(a, b uint32, s uint8) uint32 { 759 return a &^ (b >> s) 760 } 761 762 //go:noinline 763 func notshiftRLreg_ssa(a uint32, s uint8) uint32 { 764 return ^(a >> s) 765 } 766 767 //go:noinline 768 func addshiftRAreg_ssa(a, b int32, s uint8) int32 { 769 return a + b>>s 770 } 771 772 //go:noinline 773 func subshiftRAreg_ssa(a, b int32, s uint8) int32 { 774 return a - b>>s 775 } 776 777 //go:noinline 778 func rsbshiftRAreg_ssa(a, b int32, s uint8) int32 { 779 return a>>s - b 780 } 781 782 //go:noinline 783 func andshiftRAreg_ssa(a, b int32, s uint8) int32 { 784 return a & (b >> s) 785 } 786 787 //go:noinline 788 func orshiftRAreg_ssa(a, b int32, s uint8) int32 { 789 return a | b>>s 790 } 791 792 //go:noinline 793 func xorshiftRAreg_ssa(a, b int32, s uint8) int32 { 794 return a ^ b>>s 795 } 796 797 //go:noinline 798 func bicshiftRAreg_ssa(a, b int32, s uint8) int32 { 799 return a &^ (b >> s) 800 } 801 802 //go:noinline 803 func notshiftRAreg_ssa(a int32, s uint8) int32 { 804 return ^(a >> s) 805 } 806 807 // test ARM shifted ops 808 func testShiftedOps() { 809 a, b := uint32(10), uint32(42) 810 if want, got := a+b<<3, addshiftLL_ssa(a, b); got != want { 811 println("addshiftLL_ssa(10, 42) =", got, " want ", want) 812 failed = true 813 } 814 if want, got := a-b<<3, subshiftLL_ssa(a, b); got != want { 815 println("subshiftLL_ssa(10, 42) =", got, " want ", want) 816 failed = true 817 } 818 if want, got := a<<3-b, rsbshiftLL_ssa(a, b); got != want { 819 println("rsbshiftLL_ssa(10, 42) =", got, " want ", want) 820 failed = true 821 } 822 if want, got := a&(b<<3), andshiftLL_ssa(a, b); got != want { 823 println("andshiftLL_ssa(10, 42) =", got, " want ", want) 824 failed = true 825 } 826 if want, got := a|b<<3, orshiftLL_ssa(a, b); got != want { 827 println("orshiftLL_ssa(10, 42) =", got, " want ", want) 828 failed = true 829 } 830 if want, got := a^b<<3, xorshiftLL_ssa(a, b); got != want { 831 println("xorshiftLL_ssa(10, 42) =", got, " want ", want) 832 failed = true 833 } 834 if want, got := a&^(b<<3), bicshiftLL_ssa(a, b); got != want { 835 println("bicshiftLL_ssa(10, 42) =", got, " want ", want) 836 failed = true 837 } 838 if want, got := ^(a << 3), notshiftLL_ssa(a); got != want { 839 println("notshiftLL_ssa(10) =", got, " want ", want) 840 failed = true 841 } 842 if want, got := a+b>>3, addshiftRL_ssa(a, b); got != want { 843 println("addshiftRL_ssa(10, 42) =", got, " want ", want) 844 failed = true 845 } 846 if want, got := a-b>>3, subshiftRL_ssa(a, b); got != want { 847 println("subshiftRL_ssa(10, 42) =", got, " want ", want) 848 failed = true 849 } 850 if want, got := a>>3-b, rsbshiftRL_ssa(a, b); got != want { 851 println("rsbshiftRL_ssa(10, 42) =", got, " want ", want) 852 failed = true 853 } 854 if want, got := a&(b>>3), andshiftRL_ssa(a, b); got != want { 855 println("andshiftRL_ssa(10, 42) =", got, " want ", want) 856 failed = true 857 } 858 if want, got := a|b>>3, orshiftRL_ssa(a, b); got != want { 859 println("orshiftRL_ssa(10, 42) =", got, " want ", want) 860 failed = true 861 } 862 if want, got := a^b>>3, xorshiftRL_ssa(a, b); got != want { 863 println("xorshiftRL_ssa(10, 42) =", got, " want ", want) 864 failed = true 865 } 866 if want, got := a&^(b>>3), bicshiftRL_ssa(a, b); got != want { 867 println("bicshiftRL_ssa(10, 42) =", got, " want ", want) 868 failed = true 869 } 870 if want, got := ^(a >> 3), notshiftRL_ssa(a); got != want { 871 println("notshiftRL_ssa(10) =", got, " want ", want) 872 failed = true 873 } 874 c, d := int32(10), int32(-42) 875 if want, got := c+d>>3, addshiftRA_ssa(c, d); got != want { 876 println("addshiftRA_ssa(10, -42) =", got, " want ", want) 877 failed = true 878 } 879 if want, got := c-d>>3, subshiftRA_ssa(c, d); got != want { 880 println("subshiftRA_ssa(10, -42) =", got, " want ", want) 881 failed = true 882 } 883 if want, got := c>>3-d, rsbshiftRA_ssa(c, d); got != want { 884 println("rsbshiftRA_ssa(10, -42) =", got, " want ", want) 885 failed = true 886 } 887 if want, got := c&(d>>3), andshiftRA_ssa(c, d); got != want { 888 println("andshiftRA_ssa(10, -42) =", got, " want ", want) 889 failed = true 890 } 891 if want, got := c|d>>3, orshiftRA_ssa(c, d); got != want { 892 println("orshiftRA_ssa(10, -42) =", got, " want ", want) 893 failed = true 894 } 895 if want, got := c^d>>3, xorshiftRA_ssa(c, d); got != want { 896 println("xorshiftRA_ssa(10, -42) =", got, " want ", want) 897 failed = true 898 } 899 if want, got := c&^(d>>3), bicshiftRA_ssa(c, d); got != want { 900 println("bicshiftRA_ssa(10, -42) =", got, " want ", want) 901 failed = true 902 } 903 if want, got := ^(d >> 3), notshiftRA_ssa(d); got != want { 904 println("notshiftRA_ssa(-42) =", got, " want ", want) 905 failed = true 906 } 907 s := uint8(3) 908 if want, got := a+b<<s, addshiftLLreg_ssa(a, b, s); got != want { 909 println("addshiftLLreg_ssa(10, 42, 3) =", got, " want ", want) 910 failed = true 911 } 912 if want, got := a-b<<s, subshiftLLreg_ssa(a, b, s); got != want { 913 println("subshiftLLreg_ssa(10, 42, 3) =", got, " want ", want) 914 failed = true 915 } 916 if want, got := a<<s-b, rsbshiftLLreg_ssa(a, b, s); got != want { 917 println("rsbshiftLLreg_ssa(10, 42, 3) =", got, " want ", want) 918 failed = true 919 } 920 if want, got := a&(b<<s), andshiftLLreg_ssa(a, b, s); got != want { 921 println("andshiftLLreg_ssa(10, 42, 3) =", got, " want ", want) 922 failed = true 923 } 924 if want, got := a|b<<s, orshiftLLreg_ssa(a, b, s); got != want { 925 println("orshiftLLreg_ssa(10, 42, 3) =", got, " want ", want) 926 failed = true 927 } 928 if want, got := a^b<<s, xorshiftLLreg_ssa(a, b, s); got != want { 929 println("xorshiftLLreg_ssa(10, 42, 3) =", got, " want ", want) 930 failed = true 931 } 932 if want, got := a&^(b<<s), bicshiftLLreg_ssa(a, b, s); got != want { 933 println("bicshiftLLreg_ssa(10, 42, 3) =", got, " want ", want) 934 failed = true 935 } 936 if want, got := ^(a << s), notshiftLLreg_ssa(a, s); got != want { 937 println("notshiftLLreg_ssa(10) =", got, " want ", want) 938 failed = true 939 } 940 if want, got := a+b>>s, addshiftRLreg_ssa(a, b, s); got != want { 941 println("addshiftRLreg_ssa(10, 42, 3) =", got, " want ", want) 942 failed = true 943 } 944 if want, got := a-b>>s, subshiftRLreg_ssa(a, b, s); got != want { 945 println("subshiftRLreg_ssa(10, 42, 3) =", got, " want ", want) 946 failed = true 947 } 948 if want, got := a>>s-b, rsbshiftRLreg_ssa(a, b, s); got != want { 949 println("rsbshiftRLreg_ssa(10, 42, 3) =", got, " want ", want) 950 failed = true 951 } 952 if want, got := a&(b>>s), andshiftRLreg_ssa(a, b, s); got != want { 953 println("andshiftRLreg_ssa(10, 42, 3) =", got, " want ", want) 954 failed = true 955 } 956 if want, got := a|b>>s, orshiftRLreg_ssa(a, b, s); got != want { 957 println("orshiftRLreg_ssa(10, 42, 3) =", got, " want ", want) 958 failed = true 959 } 960 if want, got := a^b>>s, xorshiftRLreg_ssa(a, b, s); got != want { 961 println("xorshiftRLreg_ssa(10, 42, 3) =", got, " want ", want) 962 failed = true 963 } 964 if want, got := a&^(b>>s), bicshiftRLreg_ssa(a, b, s); got != want { 965 println("bicshiftRLreg_ssa(10, 42, 3) =", got, " want ", want) 966 failed = true 967 } 968 if want, got := ^(a >> s), notshiftRLreg_ssa(a, s); got != want { 969 println("notshiftRLreg_ssa(10) =", got, " want ", want) 970 failed = true 971 } 972 if want, got := c+d>>s, addshiftRAreg_ssa(c, d, s); got != want { 973 println("addshiftRAreg_ssa(10, -42, 3) =", got, " want ", want) 974 failed = true 975 } 976 if want, got := c-d>>s, subshiftRAreg_ssa(c, d, s); got != want { 977 println("subshiftRAreg_ssa(10, -42, 3) =", got, " want ", want) 978 failed = true 979 } 980 if want, got := c>>s-d, rsbshiftRAreg_ssa(c, d, s); got != want { 981 println("rsbshiftRAreg_ssa(10, -42, 3) =", got, " want ", want) 982 failed = true 983 } 984 if want, got := c&(d>>s), andshiftRAreg_ssa(c, d, s); got != want { 985 println("andshiftRAreg_ssa(10, -42, 3) =", got, " want ", want) 986 failed = true 987 } 988 if want, got := c|d>>s, orshiftRAreg_ssa(c, d, s); got != want { 989 println("orshiftRAreg_ssa(10, -42, 3) =", got, " want ", want) 990 failed = true 991 } 992 if want, got := c^d>>s, xorshiftRAreg_ssa(c, d, s); got != want { 993 println("xorshiftRAreg_ssa(10, -42, 3) =", got, " want ", want) 994 failed = true 995 } 996 if want, got := c&^(d>>s), bicshiftRAreg_ssa(c, d, s); got != want { 997 println("bicshiftRAreg_ssa(10, -42, 3) =", got, " want ", want) 998 failed = true 999 } 1000 if want, got := ^(d >> s), notshiftRAreg_ssa(d, s); got != want { 1001 println("notshiftRAreg_ssa(-42, 3) =", got, " want ", want) 1002 failed = true 1003 } 1004 } 1005 1006 var failed = false 1007 1008 func main() { 1009 1010 test64BitConstMult() 1011 test64BitConstAdd() 1012 testRegallocCVSpill() 1013 testSubqToNegq() 1014 testBitwiseLogic() 1015 testOcom() 1016 testLrot() 1017 testShiftCX() 1018 testSubConst() 1019 testOverflowConstShift() 1020 testArithConstShift() 1021 testArithRshConst() 1022 testLargeConst() 1023 testLoadCombine() 1024 testLoadSymCombine() 1025 testShiftRemoval() 1026 testShiftedOps() 1027 1028 if failed { 1029 panic("failed") 1030 } 1031 }