github.com/gagliardetto/golang-go@v0.0.0-20201020153340-53909ea70814/cmd/compile/internal/gc/testdata/fp_test.go (about) 1 // Copyright 2015 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // Tests floating point arithmetic expressions 6 7 package main 8 9 import ( 10 "fmt" 11 "testing" 12 ) 13 14 // manysub_ssa is designed to tickle bugs that depend on register 15 // pressure or unfriendly operand ordering in registers (and at 16 // least once it succeeded in this). 17 //go:noinline 18 func manysub_ssa(a, b, c, d float64) (aa, ab, ac, ad, ba, bb, bc, bd, ca, cb, cc, cd, da, db, dc, dd float64) { 19 aa = a + 11.0 - a 20 ab = a - b 21 ac = a - c 22 ad = a - d 23 ba = b - a 24 bb = b + 22.0 - b 25 bc = b - c 26 bd = b - d 27 ca = c - a 28 cb = c - b 29 cc = c + 33.0 - c 30 cd = c - d 31 da = d - a 32 db = d - b 33 dc = d - c 34 dd = d + 44.0 - d 35 return 36 } 37 38 // fpspill_ssa attempts to trigger a bug where phis with floating point values 39 // were stored in non-fp registers causing an error in doasm. 40 //go:noinline 41 func fpspill_ssa(a int) float64 { 42 43 ret := -1.0 44 switch a { 45 case 0: 46 ret = 1.0 47 case 1: 48 ret = 1.1 49 case 2: 50 ret = 1.2 51 case 3: 52 ret = 1.3 53 case 4: 54 ret = 1.4 55 case 5: 56 ret = 1.5 57 case 6: 58 ret = 1.6 59 case 7: 60 ret = 1.7 61 case 8: 62 ret = 1.8 63 case 9: 64 ret = 1.9 65 case 10: 66 ret = 1.10 67 case 11: 68 ret = 1.11 69 case 12: 70 ret = 1.12 71 case 13: 72 ret = 1.13 73 case 14: 74 ret = 1.14 75 case 15: 76 ret = 1.15 77 case 16: 78 ret = 1.16 79 } 80 return ret 81 } 82 83 //go:noinline 84 func add64_ssa(a, b float64) float64 { 85 return a + b 86 } 87 88 //go:noinline 89 func mul64_ssa(a, b float64) float64 { 90 return a * b 91 } 92 93 //go:noinline 94 func sub64_ssa(a, b float64) float64 { 95 return a - b 96 } 97 98 //go:noinline 99 func div64_ssa(a, b float64) float64 { 100 return a / b 101 } 102 103 //go:noinline 104 func neg64_ssa(a, b float64) float64 { 105 return -a + -1*b 106 } 107 108 //go:noinline 109 func add32_ssa(a, b float32) float32 { 110 return a + b 111 } 112 113 //go:noinline 114 func mul32_ssa(a, b float32) float32 { 115 return a * b 116 } 117 118 //go:noinline 119 func sub32_ssa(a, b float32) float32 { 120 return a - b 121 } 122 123 //go:noinline 124 func div32_ssa(a, b float32) float32 { 125 return a / b 126 } 127 128 //go:noinline 129 func neg32_ssa(a, b float32) float32 { 130 return -a + -1*b 131 } 132 133 //go:noinline 134 func conv2Float64_ssa(a int8, b uint8, c int16, d uint16, 135 e int32, f uint32, g int64, h uint64, i float32) (aa, bb, cc, dd, ee, ff, gg, hh, ii float64) { 136 aa = float64(a) 137 bb = float64(b) 138 cc = float64(c) 139 hh = float64(h) 140 dd = float64(d) 141 ee = float64(e) 142 ff = float64(f) 143 gg = float64(g) 144 ii = float64(i) 145 return 146 } 147 148 //go:noinline 149 func conv2Float32_ssa(a int8, b uint8, c int16, d uint16, 150 e int32, f uint32, g int64, h uint64, i float64) (aa, bb, cc, dd, ee, ff, gg, hh, ii float32) { 151 aa = float32(a) 152 bb = float32(b) 153 cc = float32(c) 154 dd = float32(d) 155 ee = float32(e) 156 ff = float32(f) 157 gg = float32(g) 158 hh = float32(h) 159 ii = float32(i) 160 return 161 } 162 163 func integer2floatConversions(t *testing.T) { 164 { 165 a, b, c, d, e, f, g, h, i := conv2Float64_ssa(0, 0, 0, 0, 0, 0, 0, 0, 0) 166 expectAll64(t, "zero64", 0, a, b, c, d, e, f, g, h, i) 167 } 168 { 169 a, b, c, d, e, f, g, h, i := conv2Float64_ssa(1, 1, 1, 1, 1, 1, 1, 1, 1) 170 expectAll64(t, "one64", 1, a, b, c, d, e, f, g, h, i) 171 } 172 { 173 a, b, c, d, e, f, g, h, i := conv2Float32_ssa(0, 0, 0, 0, 0, 0, 0, 0, 0) 174 expectAll32(t, "zero32", 0, a, b, c, d, e, f, g, h, i) 175 } 176 { 177 a, b, c, d, e, f, g, h, i := conv2Float32_ssa(1, 1, 1, 1, 1, 1, 1, 1, 1) 178 expectAll32(t, "one32", 1, a, b, c, d, e, f, g, h, i) 179 } 180 { 181 // Check maximum values 182 a, b, c, d, e, f, g, h, i := conv2Float64_ssa(127, 255, 32767, 65535, 0x7fffffff, 0xffffffff, 0x7fffFFFFffffFFFF, 0xffffFFFFffffFFFF, 3.402823e38) 183 expect64(t, "a", a, 127) 184 expect64(t, "b", b, 255) 185 expect64(t, "c", c, 32767) 186 expect64(t, "d", d, 65535) 187 expect64(t, "e", e, float64(int32(0x7fffffff))) 188 expect64(t, "f", f, float64(uint32(0xffffffff))) 189 expect64(t, "g", g, float64(int64(0x7fffffffffffffff))) 190 expect64(t, "h", h, float64(uint64(0xffffffffffffffff))) 191 expect64(t, "i", i, float64(float32(3.402823e38))) 192 } 193 { 194 // Check minimum values (and tweaks for unsigned) 195 a, b, c, d, e, f, g, h, i := conv2Float64_ssa(-128, 254, -32768, 65534, ^0x7fffffff, 0xfffffffe, ^0x7fffFFFFffffFFFF, 0xffffFFFFffffF401, 1.5e-45) 196 expect64(t, "a", a, -128) 197 expect64(t, "b", b, 254) 198 expect64(t, "c", c, -32768) 199 expect64(t, "d", d, 65534) 200 expect64(t, "e", e, float64(^int32(0x7fffffff))) 201 expect64(t, "f", f, float64(uint32(0xfffffffe))) 202 expect64(t, "g", g, float64(^int64(0x7fffffffffffffff))) 203 expect64(t, "h", h, float64(uint64(0xfffffffffffff401))) 204 expect64(t, "i", i, float64(float32(1.5e-45))) 205 } 206 { 207 // Check maximum values 208 a, b, c, d, e, f, g, h, i := conv2Float32_ssa(127, 255, 32767, 65535, 0x7fffffff, 0xffffffff, 0x7fffFFFFffffFFFF, 0xffffFFFFffffFFFF, 3.402823e38) 209 expect32(t, "a", a, 127) 210 expect32(t, "b", b, 255) 211 expect32(t, "c", c, 32767) 212 expect32(t, "d", d, 65535) 213 expect32(t, "e", e, float32(int32(0x7fffffff))) 214 expect32(t, "f", f, float32(uint32(0xffffffff))) 215 expect32(t, "g", g, float32(int64(0x7fffffffffffffff))) 216 expect32(t, "h", h, float32(uint64(0xffffffffffffffff))) 217 expect32(t, "i", i, float32(float64(3.402823e38))) 218 } 219 { 220 // Check minimum values (and tweaks for unsigned) 221 a, b, c, d, e, f, g, h, i := conv2Float32_ssa(-128, 254, -32768, 65534, ^0x7fffffff, 0xfffffffe, ^0x7fffFFFFffffFFFF, 0xffffFFFFffffF401, 1.5e-45) 222 expect32(t, "a", a, -128) 223 expect32(t, "b", b, 254) 224 expect32(t, "c", c, -32768) 225 expect32(t, "d", d, 65534) 226 expect32(t, "e", e, float32(^int32(0x7fffffff))) 227 expect32(t, "f", f, float32(uint32(0xfffffffe))) 228 expect32(t, "g", g, float32(^int64(0x7fffffffffffffff))) 229 expect32(t, "h", h, float32(uint64(0xfffffffffffff401))) 230 expect32(t, "i", i, float32(float64(1.5e-45))) 231 } 232 } 233 234 func multiplyAdd(t *testing.T) { 235 { 236 // Test that a multiply-accumulate operation with intermediate 237 // rounding forced by a float32() cast produces the expected 238 // result. 239 // Test cases generated experimentally on a system (s390x) that 240 // supports fused multiply-add instructions. 241 var tests = [...]struct{ x, y, z, res float32 }{ 242 {0.6046603, 0.9405091, 0.6645601, 1.2332485}, // fused multiply-add result: 1.2332486 243 {0.67908466, 0.21855305, 0.20318687, 0.3516029}, // fused multiply-add result: 0.35160288 244 {0.29311424, 0.29708257, 0.752573, 0.8396522}, // fused multiply-add result: 0.8396521 245 {0.5305857, 0.2535405, 0.282081, 0.41660595}, // fused multiply-add result: 0.41660598 246 {0.29711226, 0.89436173, 0.097454615, 0.36318043}, // fused multiply-add result: 0.36318046 247 {0.6810783, 0.24151509, 0.31152245, 0.47601312}, // fused multiply-add result: 0.47601315 248 {0.73023146, 0.18292491, 0.4283571, 0.5619346}, // fused multiply-add result: 0.56193465 249 {0.89634174, 0.32208398, 0.7211478, 1.009845}, // fused multiply-add result: 1.0098451 250 {0.6280982, 0.12675293, 0.2813303, 0.36094356}, // fused multiply-add result: 0.3609436 251 {0.29400632, 0.75316125, 0.15096405, 0.3723982}, // fused multiply-add result: 0.37239823 252 } 253 check := func(s string, got, expected float32) { 254 if got != expected { 255 fmt.Printf("multiplyAdd: %s, expected %g, got %g\n", s, expected, got) 256 } 257 } 258 for _, t := range tests { 259 check( 260 fmt.Sprintf("float32(%v * %v) + %v", t.x, t.y, t.z), 261 func(x, y, z float32) float32 { 262 return float32(x*y) + z 263 }(t.x, t.y, t.z), 264 t.res) 265 266 check( 267 fmt.Sprintf("%v += float32(%v * %v)", t.z, t.x, t.y), 268 func(x, y, z float32) float32 { 269 z += float32(x * y) 270 return z 271 }(t.x, t.y, t.z), 272 t.res) 273 } 274 } 275 { 276 // Test that a multiply-accumulate operation with intermediate 277 // rounding forced by a float64() cast produces the expected 278 // result. 279 // Test cases generated experimentally on a system (s390x) that 280 // supports fused multiply-add instructions. 281 var tests = [...]struct{ x, y, z, res float64 }{ 282 {0.4688898449024232, 0.28303415118044517, 0.29310185733681576, 0.42581369658590373}, // fused multiply-add result: 0.4258136965859037 283 {0.7886049150193449, 0.3618054804803169, 0.8805431227416171, 1.1658647029293308}, // fused multiply-add result: 1.1658647029293305 284 {0.7302314772948083, 0.18292491645390843, 0.4283570818068078, 0.5619346137829748}, // fused multiply-add result: 0.5619346137829747 285 {0.6908388315056789, 0.7109071952999951, 0.5637795958152644, 1.0549018919252924}, // fused multiply-add result: 1.0549018919252926 286 {0.4584424785756506, 0.6001655953233308, 0.02626515060968944, 0.3014065536855481}, // fused multiply-add result: 0.30140655368554814 287 {0.539210105890946, 0.9756748149873165, 0.7507630564795985, 1.2768567767840384}, // fused multiply-add result: 1.2768567767840386 288 {0.7830349733960021, 0.3932509992288867, 0.1304138461737918, 0.4383431318929343}, // fused multiply-add result: 0.43834313189293433 289 {0.6841751300974551, 0.6530402051353608, 0.524499759549865, 0.9712936268572192}, // fused multiply-add result: 0.9712936268572193 290 {0.3691117091643448, 0.826454125634742, 0.34768170859156955, 0.6527356034505334}, // fused multiply-add result: 0.6527356034505333 291 {0.16867966833433606, 0.33136826030698385, 0.8279280961505588, 0.8838231843956668}, // fused multiply-add result: 0.8838231843956669 292 } 293 check := func(s string, got, expected float64) { 294 if got != expected { 295 fmt.Printf("multiplyAdd: %s, expected %g, got %g\n", s, expected, got) 296 } 297 } 298 for _, t := range tests { 299 check( 300 fmt.Sprintf("float64(%v * %v) + %v", t.x, t.y, t.z), 301 func(x, y, z float64) float64 { 302 return float64(x*y) + z 303 }(t.x, t.y, t.z), 304 t.res) 305 306 check( 307 fmt.Sprintf("%v += float64(%v * %v)", t.z, t.x, t.y), 308 func(x, y, z float64) float64 { 309 z += float64(x * y) 310 return z 311 }(t.x, t.y, t.z), 312 t.res) 313 } 314 } 315 { 316 // Test that a multiply-accumulate operation with intermediate 317 // rounding forced by a complex128() cast produces the expected 318 // result. 319 // Test cases generated experimentally on a system (s390x) that 320 // supports fused multiply-add instructions. 321 var tests = [...]struct { 322 x, y float64 323 res complex128 324 }{ 325 {0.6046602879796196, 0.9405090880450124, (2.754489951983871 + 3i)}, // fused multiply-add result: (2.7544899519838713 + 3i) 326 {0.09696951891448456, 0.30091186058528707, (0.5918204173287407 + 3i)}, // fused multiply-add result: (0.5918204173287408 + 3i) 327 {0.544155573000885, 0.27850762181610883, (1.910974340818764 + 3i)}, // fused multiply-add result: (1.9109743408187638 + 3i) 328 {0.9769168685862624, 0.07429099894984302, (3.0050416047086297 + 3i)}, // fused multiply-add result: (3.00504160470863 + 3i) 329 {0.9269868035744142, 0.9549454404167818, (3.735905851140024 + 3i)}, // fused multiply-add result: (3.7359058511400245 + 3i) 330 {0.7109071952999951, 0.5637795958152644, (2.69650118171525 + 3i)}, // fused multiply-add result: (2.6965011817152496 + 3i) 331 {0.7558235074915978, 0.40380328579570035, (2.671273808270494 + 3i)}, // fused multiply-add result: (2.6712738082704934 + 3i) 332 {0.13065111702897217, 0.9859647293402467, (1.3779180804271633 + 3i)}, // fused multiply-add result: (1.3779180804271631 + 3i) 333 {0.8963417453962161, 0.3220839705208817, (3.0111092067095298 + 3i)}, // fused multiply-add result: (3.01110920670953 + 3i) 334 {0.39998376285699544, 0.497868113342702, (1.697819401913688 + 3i)}, // fused multiply-add result: (1.6978194019136883 + 3i) 335 } 336 check := func(s string, got, expected complex128) { 337 if got != expected { 338 fmt.Printf("multiplyAdd: %s, expected %v, got %v\n", s, expected, got) 339 } 340 } 341 for _, t := range tests { 342 check( 343 fmt.Sprintf("complex128(complex(%v, 1)*3) + complex(%v, 0)", t.x, t.y), 344 func(x, y float64) complex128 { 345 return complex128(complex(x, 1)*3) + complex(y, 0) 346 }(t.x, t.y), 347 t.res) 348 349 check( 350 fmt.Sprintf("z := complex(%v, 1); z += complex128(complex(%v, 1) * 3)", t.y, t.x), 351 func(x, y float64) complex128 { 352 z := complex(y, 0) 353 z += complex128(complex(x, 1) * 3) 354 return z 355 }(t.x, t.y), 356 t.res) 357 } 358 } 359 } 360 361 const ( 362 aa = 0x1000000000000000 363 ab = 0x100000000000000 364 ac = 0x10000000000000 365 ad = 0x1000000000000 366 ba = 0x100000000000 367 bb = 0x10000000000 368 bc = 0x1000000000 369 bd = 0x100000000 370 ca = 0x10000000 371 cb = 0x1000000 372 cc = 0x100000 373 cd = 0x10000 374 da = 0x1000 375 db = 0x100 376 dc = 0x10 377 dd = 0x1 378 ) 379 380 //go:noinline 381 func compares64_ssa(a, b, c, d float64) (lt, le, eq, ne, ge, gt uint64) { 382 if a < a { 383 lt += aa 384 } 385 if a < b { 386 lt += ab 387 } 388 if a < c { 389 lt += ac 390 } 391 if a < d { 392 lt += ad 393 } 394 395 if b < a { 396 lt += ba 397 } 398 if b < b { 399 lt += bb 400 } 401 if b < c { 402 lt += bc 403 } 404 if b < d { 405 lt += bd 406 } 407 408 if c < a { 409 lt += ca 410 } 411 if c < b { 412 lt += cb 413 } 414 if c < c { 415 lt += cc 416 } 417 if c < d { 418 lt += cd 419 } 420 421 if d < a { 422 lt += da 423 } 424 if d < b { 425 lt += db 426 } 427 if d < c { 428 lt += dc 429 } 430 if d < d { 431 lt += dd 432 } 433 434 if a <= a { 435 le += aa 436 } 437 if a <= b { 438 le += ab 439 } 440 if a <= c { 441 le += ac 442 } 443 if a <= d { 444 le += ad 445 } 446 447 if b <= a { 448 le += ba 449 } 450 if b <= b { 451 le += bb 452 } 453 if b <= c { 454 le += bc 455 } 456 if b <= d { 457 le += bd 458 } 459 460 if c <= a { 461 le += ca 462 } 463 if c <= b { 464 le += cb 465 } 466 if c <= c { 467 le += cc 468 } 469 if c <= d { 470 le += cd 471 } 472 473 if d <= a { 474 le += da 475 } 476 if d <= b { 477 le += db 478 } 479 if d <= c { 480 le += dc 481 } 482 if d <= d { 483 le += dd 484 } 485 486 if a == a { 487 eq += aa 488 } 489 if a == b { 490 eq += ab 491 } 492 if a == c { 493 eq += ac 494 } 495 if a == d { 496 eq += ad 497 } 498 499 if b == a { 500 eq += ba 501 } 502 if b == b { 503 eq += bb 504 } 505 if b == c { 506 eq += bc 507 } 508 if b == d { 509 eq += bd 510 } 511 512 if c == a { 513 eq += ca 514 } 515 if c == b { 516 eq += cb 517 } 518 if c == c { 519 eq += cc 520 } 521 if c == d { 522 eq += cd 523 } 524 525 if d == a { 526 eq += da 527 } 528 if d == b { 529 eq += db 530 } 531 if d == c { 532 eq += dc 533 } 534 if d == d { 535 eq += dd 536 } 537 538 if a != a { 539 ne += aa 540 } 541 if a != b { 542 ne += ab 543 } 544 if a != c { 545 ne += ac 546 } 547 if a != d { 548 ne += ad 549 } 550 551 if b != a { 552 ne += ba 553 } 554 if b != b { 555 ne += bb 556 } 557 if b != c { 558 ne += bc 559 } 560 if b != d { 561 ne += bd 562 } 563 564 if c != a { 565 ne += ca 566 } 567 if c != b { 568 ne += cb 569 } 570 if c != c { 571 ne += cc 572 } 573 if c != d { 574 ne += cd 575 } 576 577 if d != a { 578 ne += da 579 } 580 if d != b { 581 ne += db 582 } 583 if d != c { 584 ne += dc 585 } 586 if d != d { 587 ne += dd 588 } 589 590 if a >= a { 591 ge += aa 592 } 593 if a >= b { 594 ge += ab 595 } 596 if a >= c { 597 ge += ac 598 } 599 if a >= d { 600 ge += ad 601 } 602 603 if b >= a { 604 ge += ba 605 } 606 if b >= b { 607 ge += bb 608 } 609 if b >= c { 610 ge += bc 611 } 612 if b >= d { 613 ge += bd 614 } 615 616 if c >= a { 617 ge += ca 618 } 619 if c >= b { 620 ge += cb 621 } 622 if c >= c { 623 ge += cc 624 } 625 if c >= d { 626 ge += cd 627 } 628 629 if d >= a { 630 ge += da 631 } 632 if d >= b { 633 ge += db 634 } 635 if d >= c { 636 ge += dc 637 } 638 if d >= d { 639 ge += dd 640 } 641 642 if a > a { 643 gt += aa 644 } 645 if a > b { 646 gt += ab 647 } 648 if a > c { 649 gt += ac 650 } 651 if a > d { 652 gt += ad 653 } 654 655 if b > a { 656 gt += ba 657 } 658 if b > b { 659 gt += bb 660 } 661 if b > c { 662 gt += bc 663 } 664 if b > d { 665 gt += bd 666 } 667 668 if c > a { 669 gt += ca 670 } 671 if c > b { 672 gt += cb 673 } 674 if c > c { 675 gt += cc 676 } 677 if c > d { 678 gt += cd 679 } 680 681 if d > a { 682 gt += da 683 } 684 if d > b { 685 gt += db 686 } 687 if d > c { 688 gt += dc 689 } 690 if d > d { 691 gt += dd 692 } 693 694 return 695 } 696 697 //go:noinline 698 func compares32_ssa(a, b, c, d float32) (lt, le, eq, ne, ge, gt uint64) { 699 if a < a { 700 lt += aa 701 } 702 if a < b { 703 lt += ab 704 } 705 if a < c { 706 lt += ac 707 } 708 if a < d { 709 lt += ad 710 } 711 712 if b < a { 713 lt += ba 714 } 715 if b < b { 716 lt += bb 717 } 718 if b < c { 719 lt += bc 720 } 721 if b < d { 722 lt += bd 723 } 724 725 if c < a { 726 lt += ca 727 } 728 if c < b { 729 lt += cb 730 } 731 if c < c { 732 lt += cc 733 } 734 if c < d { 735 lt += cd 736 } 737 738 if d < a { 739 lt += da 740 } 741 if d < b { 742 lt += db 743 } 744 if d < c { 745 lt += dc 746 } 747 if d < d { 748 lt += dd 749 } 750 751 if a <= a { 752 le += aa 753 } 754 if a <= b { 755 le += ab 756 } 757 if a <= c { 758 le += ac 759 } 760 if a <= d { 761 le += ad 762 } 763 764 if b <= a { 765 le += ba 766 } 767 if b <= b { 768 le += bb 769 } 770 if b <= c { 771 le += bc 772 } 773 if b <= d { 774 le += bd 775 } 776 777 if c <= a { 778 le += ca 779 } 780 if c <= b { 781 le += cb 782 } 783 if c <= c { 784 le += cc 785 } 786 if c <= d { 787 le += cd 788 } 789 790 if d <= a { 791 le += da 792 } 793 if d <= b { 794 le += db 795 } 796 if d <= c { 797 le += dc 798 } 799 if d <= d { 800 le += dd 801 } 802 803 if a == a { 804 eq += aa 805 } 806 if a == b { 807 eq += ab 808 } 809 if a == c { 810 eq += ac 811 } 812 if a == d { 813 eq += ad 814 } 815 816 if b == a { 817 eq += ba 818 } 819 if b == b { 820 eq += bb 821 } 822 if b == c { 823 eq += bc 824 } 825 if b == d { 826 eq += bd 827 } 828 829 if c == a { 830 eq += ca 831 } 832 if c == b { 833 eq += cb 834 } 835 if c == c { 836 eq += cc 837 } 838 if c == d { 839 eq += cd 840 } 841 842 if d == a { 843 eq += da 844 } 845 if d == b { 846 eq += db 847 } 848 if d == c { 849 eq += dc 850 } 851 if d == d { 852 eq += dd 853 } 854 855 if a != a { 856 ne += aa 857 } 858 if a != b { 859 ne += ab 860 } 861 if a != c { 862 ne += ac 863 } 864 if a != d { 865 ne += ad 866 } 867 868 if b != a { 869 ne += ba 870 } 871 if b != b { 872 ne += bb 873 } 874 if b != c { 875 ne += bc 876 } 877 if b != d { 878 ne += bd 879 } 880 881 if c != a { 882 ne += ca 883 } 884 if c != b { 885 ne += cb 886 } 887 if c != c { 888 ne += cc 889 } 890 if c != d { 891 ne += cd 892 } 893 894 if d != a { 895 ne += da 896 } 897 if d != b { 898 ne += db 899 } 900 if d != c { 901 ne += dc 902 } 903 if d != d { 904 ne += dd 905 } 906 907 if a >= a { 908 ge += aa 909 } 910 if a >= b { 911 ge += ab 912 } 913 if a >= c { 914 ge += ac 915 } 916 if a >= d { 917 ge += ad 918 } 919 920 if b >= a { 921 ge += ba 922 } 923 if b >= b { 924 ge += bb 925 } 926 if b >= c { 927 ge += bc 928 } 929 if b >= d { 930 ge += bd 931 } 932 933 if c >= a { 934 ge += ca 935 } 936 if c >= b { 937 ge += cb 938 } 939 if c >= c { 940 ge += cc 941 } 942 if c >= d { 943 ge += cd 944 } 945 946 if d >= a { 947 ge += da 948 } 949 if d >= b { 950 ge += db 951 } 952 if d >= c { 953 ge += dc 954 } 955 if d >= d { 956 ge += dd 957 } 958 959 if a > a { 960 gt += aa 961 } 962 if a > b { 963 gt += ab 964 } 965 if a > c { 966 gt += ac 967 } 968 if a > d { 969 gt += ad 970 } 971 972 if b > a { 973 gt += ba 974 } 975 if b > b { 976 gt += bb 977 } 978 if b > c { 979 gt += bc 980 } 981 if b > d { 982 gt += bd 983 } 984 985 if c > a { 986 gt += ca 987 } 988 if c > b { 989 gt += cb 990 } 991 if c > c { 992 gt += cc 993 } 994 if c > d { 995 gt += cd 996 } 997 998 if d > a { 999 gt += da 1000 } 1001 if d > b { 1002 gt += db 1003 } 1004 if d > c { 1005 gt += dc 1006 } 1007 if d > d { 1008 gt += dd 1009 } 1010 1011 return 1012 } 1013 1014 //go:noinline 1015 func le64_ssa(x, y float64) bool { 1016 return x <= y 1017 } 1018 1019 //go:noinline 1020 func ge64_ssa(x, y float64) bool { 1021 return x >= y 1022 } 1023 1024 //go:noinline 1025 func lt64_ssa(x, y float64) bool { 1026 return x < y 1027 } 1028 1029 //go:noinline 1030 func gt64_ssa(x, y float64) bool { 1031 return x > y 1032 } 1033 1034 //go:noinline 1035 func eq64_ssa(x, y float64) bool { 1036 return x == y 1037 } 1038 1039 //go:noinline 1040 func ne64_ssa(x, y float64) bool { 1041 return x != y 1042 } 1043 1044 //go:noinline 1045 func eqbr64_ssa(x, y float64) float64 { 1046 if x == y { 1047 return 17 1048 } 1049 return 42 1050 } 1051 1052 //go:noinline 1053 func nebr64_ssa(x, y float64) float64 { 1054 if x != y { 1055 return 17 1056 } 1057 return 42 1058 } 1059 1060 //go:noinline 1061 func gebr64_ssa(x, y float64) float64 { 1062 if x >= y { 1063 return 17 1064 } 1065 return 42 1066 } 1067 1068 //go:noinline 1069 func lebr64_ssa(x, y float64) float64 { 1070 if x <= y { 1071 return 17 1072 } 1073 return 42 1074 } 1075 1076 //go:noinline 1077 func ltbr64_ssa(x, y float64) float64 { 1078 if x < y { 1079 return 17 1080 } 1081 return 42 1082 } 1083 1084 //go:noinline 1085 func gtbr64_ssa(x, y float64) float64 { 1086 if x > y { 1087 return 17 1088 } 1089 return 42 1090 } 1091 1092 //go:noinline 1093 func le32_ssa(x, y float32) bool { 1094 return x <= y 1095 } 1096 1097 //go:noinline 1098 func ge32_ssa(x, y float32) bool { 1099 return x >= y 1100 } 1101 1102 //go:noinline 1103 func lt32_ssa(x, y float32) bool { 1104 return x < y 1105 } 1106 1107 //go:noinline 1108 func gt32_ssa(x, y float32) bool { 1109 return x > y 1110 } 1111 1112 //go:noinline 1113 func eq32_ssa(x, y float32) bool { 1114 return x == y 1115 } 1116 1117 //go:noinline 1118 func ne32_ssa(x, y float32) bool { 1119 return x != y 1120 } 1121 1122 //go:noinline 1123 func eqbr32_ssa(x, y float32) float32 { 1124 if x == y { 1125 return 17 1126 } 1127 return 42 1128 } 1129 1130 //go:noinline 1131 func nebr32_ssa(x, y float32) float32 { 1132 if x != y { 1133 return 17 1134 } 1135 return 42 1136 } 1137 1138 //go:noinline 1139 func gebr32_ssa(x, y float32) float32 { 1140 if x >= y { 1141 return 17 1142 } 1143 return 42 1144 } 1145 1146 //go:noinline 1147 func lebr32_ssa(x, y float32) float32 { 1148 if x <= y { 1149 return 17 1150 } 1151 return 42 1152 } 1153 1154 //go:noinline 1155 func ltbr32_ssa(x, y float32) float32 { 1156 if x < y { 1157 return 17 1158 } 1159 return 42 1160 } 1161 1162 //go:noinline 1163 func gtbr32_ssa(x, y float32) float32 { 1164 if x > y { 1165 return 17 1166 } 1167 return 42 1168 } 1169 1170 //go:noinline 1171 func F32toU8_ssa(x float32) uint8 { 1172 return uint8(x) 1173 } 1174 1175 //go:noinline 1176 func F32toI8_ssa(x float32) int8 { 1177 return int8(x) 1178 } 1179 1180 //go:noinline 1181 func F32toU16_ssa(x float32) uint16 { 1182 return uint16(x) 1183 } 1184 1185 //go:noinline 1186 func F32toI16_ssa(x float32) int16 { 1187 return int16(x) 1188 } 1189 1190 //go:noinline 1191 func F32toU32_ssa(x float32) uint32 { 1192 return uint32(x) 1193 } 1194 1195 //go:noinline 1196 func F32toI32_ssa(x float32) int32 { 1197 return int32(x) 1198 } 1199 1200 //go:noinline 1201 func F32toU64_ssa(x float32) uint64 { 1202 return uint64(x) 1203 } 1204 1205 //go:noinline 1206 func F32toI64_ssa(x float32) int64 { 1207 return int64(x) 1208 } 1209 1210 //go:noinline 1211 func F64toU8_ssa(x float64) uint8 { 1212 return uint8(x) 1213 } 1214 1215 //go:noinline 1216 func F64toI8_ssa(x float64) int8 { 1217 return int8(x) 1218 } 1219 1220 //go:noinline 1221 func F64toU16_ssa(x float64) uint16 { 1222 return uint16(x) 1223 } 1224 1225 //go:noinline 1226 func F64toI16_ssa(x float64) int16 { 1227 return int16(x) 1228 } 1229 1230 //go:noinline 1231 func F64toU32_ssa(x float64) uint32 { 1232 return uint32(x) 1233 } 1234 1235 //go:noinline 1236 func F64toI32_ssa(x float64) int32 { 1237 return int32(x) 1238 } 1239 1240 //go:noinline 1241 func F64toU64_ssa(x float64) uint64 { 1242 return uint64(x) 1243 } 1244 1245 //go:noinline 1246 func F64toI64_ssa(x float64) int64 { 1247 return int64(x) 1248 } 1249 1250 func floatsToInts(t *testing.T, x float64, expected int64) { 1251 y := float32(x) 1252 expectInt64(t, "F64toI8", int64(F64toI8_ssa(x)), expected) 1253 expectInt64(t, "F64toI16", int64(F64toI16_ssa(x)), expected) 1254 expectInt64(t, "F64toI32", int64(F64toI32_ssa(x)), expected) 1255 expectInt64(t, "F64toI64", int64(F64toI64_ssa(x)), expected) 1256 expectInt64(t, "F32toI8", int64(F32toI8_ssa(y)), expected) 1257 expectInt64(t, "F32toI16", int64(F32toI16_ssa(y)), expected) 1258 expectInt64(t, "F32toI32", int64(F32toI32_ssa(y)), expected) 1259 expectInt64(t, "F32toI64", int64(F32toI64_ssa(y)), expected) 1260 } 1261 1262 func floatsToUints(t *testing.T, x float64, expected uint64) { 1263 y := float32(x) 1264 expectUint64(t, "F64toU8", uint64(F64toU8_ssa(x)), expected) 1265 expectUint64(t, "F64toU16", uint64(F64toU16_ssa(x)), expected) 1266 expectUint64(t, "F64toU32", uint64(F64toU32_ssa(x)), expected) 1267 expectUint64(t, "F64toU64", uint64(F64toU64_ssa(x)), expected) 1268 expectUint64(t, "F32toU8", uint64(F32toU8_ssa(y)), expected) 1269 expectUint64(t, "F32toU16", uint64(F32toU16_ssa(y)), expected) 1270 expectUint64(t, "F32toU32", uint64(F32toU32_ssa(y)), expected) 1271 expectUint64(t, "F32toU64", uint64(F32toU64_ssa(y)), expected) 1272 } 1273 1274 func floatingToIntegerConversionsTest(t *testing.T) { 1275 floatsToInts(t, 0.0, 0) 1276 floatsToInts(t, 0.5, 0) 1277 floatsToInts(t, 0.9, 0) 1278 floatsToInts(t, 1.0, 1) 1279 floatsToInts(t, 1.5, 1) 1280 floatsToInts(t, 127.0, 127) 1281 floatsToInts(t, -1.0, -1) 1282 floatsToInts(t, -128.0, -128) 1283 1284 floatsToUints(t, 0.0, 0) 1285 floatsToUints(t, 1.0, 1) 1286 floatsToUints(t, 255.0, 255) 1287 1288 for j := uint(0); j < 24; j++ { 1289 // Avoid hard cases in the construction 1290 // of the test inputs. 1291 v := int64(1<<62) | int64(1<<(62-j)) 1292 w := uint64(v) 1293 f := float32(v) 1294 d := float64(v) 1295 expectUint64(t, "2**62...", F32toU64_ssa(f), w) 1296 expectUint64(t, "2**62...", F64toU64_ssa(d), w) 1297 expectInt64(t, "2**62...", F32toI64_ssa(f), v) 1298 expectInt64(t, "2**62...", F64toI64_ssa(d), v) 1299 expectInt64(t, "2**62...", F32toI64_ssa(-f), -v) 1300 expectInt64(t, "2**62...", F64toI64_ssa(-d), -v) 1301 w += w 1302 f += f 1303 d += d 1304 expectUint64(t, "2**63...", F32toU64_ssa(f), w) 1305 expectUint64(t, "2**63...", F64toU64_ssa(d), w) 1306 } 1307 1308 for j := uint(0); j < 16; j++ { 1309 // Avoid hard cases in the construction 1310 // of the test inputs. 1311 v := int32(1<<30) | int32(1<<(30-j)) 1312 w := uint32(v) 1313 f := float32(v) 1314 d := float64(v) 1315 expectUint32(t, "2**30...", F32toU32_ssa(f), w) 1316 expectUint32(t, "2**30...", F64toU32_ssa(d), w) 1317 expectInt32(t, "2**30...", F32toI32_ssa(f), v) 1318 expectInt32(t, "2**30...", F64toI32_ssa(d), v) 1319 expectInt32(t, "2**30...", F32toI32_ssa(-f), -v) 1320 expectInt32(t, "2**30...", F64toI32_ssa(-d), -v) 1321 w += w 1322 f += f 1323 d += d 1324 expectUint32(t, "2**31...", F32toU32_ssa(f), w) 1325 expectUint32(t, "2**31...", F64toU32_ssa(d), w) 1326 } 1327 1328 for j := uint(0); j < 15; j++ { 1329 // Avoid hard cases in the construction 1330 // of the test inputs. 1331 v := int16(1<<14) | int16(1<<(14-j)) 1332 w := uint16(v) 1333 f := float32(v) 1334 d := float64(v) 1335 expectUint16(t, "2**14...", F32toU16_ssa(f), w) 1336 expectUint16(t, "2**14...", F64toU16_ssa(d), w) 1337 expectInt16(t, "2**14...", F32toI16_ssa(f), v) 1338 expectInt16(t, "2**14...", F64toI16_ssa(d), v) 1339 expectInt16(t, "2**14...", F32toI16_ssa(-f), -v) 1340 expectInt16(t, "2**14...", F64toI16_ssa(-d), -v) 1341 w += w 1342 f += f 1343 d += d 1344 expectUint16(t, "2**15...", F32toU16_ssa(f), w) 1345 expectUint16(t, "2**15...", F64toU16_ssa(d), w) 1346 } 1347 1348 expectInt32(t, "-2147483648", F32toI32_ssa(-2147483648), -2147483648) 1349 1350 expectInt32(t, "-2147483648", F64toI32_ssa(-2147483648), -2147483648) 1351 expectInt32(t, "-2147483647", F64toI32_ssa(-2147483647), -2147483647) 1352 expectUint32(t, "4294967295", F64toU32_ssa(4294967295), 4294967295) 1353 1354 expectInt16(t, "-32768", F64toI16_ssa(-32768), -32768) 1355 expectInt16(t, "-32768", F32toI16_ssa(-32768), -32768) 1356 1357 // NB more of a pain to do these for 32-bit because of lost bits in Float32 mantissa 1358 expectInt16(t, "32767", F64toI16_ssa(32767), 32767) 1359 expectInt16(t, "32767", F32toI16_ssa(32767), 32767) 1360 expectUint16(t, "32767", F64toU16_ssa(32767), 32767) 1361 expectUint16(t, "32767", F32toU16_ssa(32767), 32767) 1362 expectUint16(t, "65535", F64toU16_ssa(65535), 65535) 1363 expectUint16(t, "65535", F32toU16_ssa(65535), 65535) 1364 } 1365 1366 func fail64(s string, f func(a, b float64) float64, a, b, e float64) { 1367 d := f(a, b) 1368 if d != e { 1369 fmt.Printf("For (float64) %v %v %v, expected %v, got %v\n", a, s, b, e, d) 1370 } 1371 } 1372 1373 func fail64bool(s string, f func(a, b float64) bool, a, b float64, e bool) { 1374 d := f(a, b) 1375 if d != e { 1376 fmt.Printf("For (float64) %v %v %v, expected %v, got %v\n", a, s, b, e, d) 1377 } 1378 } 1379 1380 func fail32(s string, f func(a, b float32) float32, a, b, e float32) { 1381 d := f(a, b) 1382 if d != e { 1383 fmt.Printf("For (float32) %v %v %v, expected %v, got %v\n", a, s, b, e, d) 1384 } 1385 } 1386 1387 func fail32bool(s string, f func(a, b float32) bool, a, b float32, e bool) { 1388 d := f(a, b) 1389 if d != e { 1390 fmt.Printf("For (float32) %v %v %v, expected %v, got %v\n", a, s, b, e, d) 1391 } 1392 } 1393 1394 func expect64(t *testing.T, s string, x, expected float64) { 1395 if x != expected { 1396 println("F64 Expected", expected, "for", s, ", got", x) 1397 } 1398 } 1399 1400 func expect32(t *testing.T, s string, x, expected float32) { 1401 if x != expected { 1402 println("F32 Expected", expected, "for", s, ", got", x) 1403 } 1404 } 1405 1406 func expectUint64(t *testing.T, s string, x, expected uint64) { 1407 if x != expected { 1408 fmt.Printf("U64 Expected 0x%016x for %s, got 0x%016x\n", expected, s, x) 1409 } 1410 } 1411 1412 func expectInt64(t *testing.T, s string, x, expected int64) { 1413 if x != expected { 1414 fmt.Printf("%s: Expected 0x%016x, got 0x%016x\n", s, expected, x) 1415 } 1416 } 1417 1418 func expectUint32(t *testing.T, s string, x, expected uint32) { 1419 if x != expected { 1420 fmt.Printf("U32 %s: Expected 0x%08x, got 0x%08x\n", s, expected, x) 1421 } 1422 } 1423 1424 func expectInt32(t *testing.T, s string, x, expected int32) { 1425 if x != expected { 1426 fmt.Printf("I32 %s: Expected 0x%08x, got 0x%08x\n", s, expected, x) 1427 } 1428 } 1429 1430 func expectUint16(t *testing.T, s string, x, expected uint16) { 1431 if x != expected { 1432 fmt.Printf("U16 %s: Expected 0x%04x, got 0x%04x\n", s, expected, x) 1433 } 1434 } 1435 1436 func expectInt16(t *testing.T, s string, x, expected int16) { 1437 if x != expected { 1438 fmt.Printf("I16 %s: Expected 0x%04x, got 0x%04x\n", s, expected, x) 1439 } 1440 } 1441 1442 func expectAll64(t *testing.T, s string, expected, a, b, c, d, e, f, g, h, i float64) { 1443 expect64(t, s+":a", a, expected) 1444 expect64(t, s+":b", b, expected) 1445 expect64(t, s+":c", c, expected) 1446 expect64(t, s+":d", d, expected) 1447 expect64(t, s+":e", e, expected) 1448 expect64(t, s+":f", f, expected) 1449 expect64(t, s+":g", g, expected) 1450 } 1451 1452 func expectAll32(t *testing.T, s string, expected, a, b, c, d, e, f, g, h, i float32) { 1453 expect32(t, s+":a", a, expected) 1454 expect32(t, s+":b", b, expected) 1455 expect32(t, s+":c", c, expected) 1456 expect32(t, s+":d", d, expected) 1457 expect32(t, s+":e", e, expected) 1458 expect32(t, s+":f", f, expected) 1459 expect32(t, s+":g", g, expected) 1460 } 1461 1462 var ev64 [2]float64 = [2]float64{42.0, 17.0} 1463 var ev32 [2]float32 = [2]float32{42.0, 17.0} 1464 1465 func cmpOpTest(t *testing.T, 1466 s string, 1467 f func(a, b float64) bool, 1468 g func(a, b float64) float64, 1469 ff func(a, b float32) bool, 1470 gg func(a, b float32) float32, 1471 zero, one, inf, nan float64, result uint) { 1472 fail64bool(s, f, zero, zero, result>>16&1 == 1) 1473 fail64bool(s, f, zero, one, result>>12&1 == 1) 1474 fail64bool(s, f, zero, inf, result>>8&1 == 1) 1475 fail64bool(s, f, zero, nan, result>>4&1 == 1) 1476 fail64bool(s, f, nan, nan, result&1 == 1) 1477 1478 fail64(s, g, zero, zero, ev64[result>>16&1]) 1479 fail64(s, g, zero, one, ev64[result>>12&1]) 1480 fail64(s, g, zero, inf, ev64[result>>8&1]) 1481 fail64(s, g, zero, nan, ev64[result>>4&1]) 1482 fail64(s, g, nan, nan, ev64[result>>0&1]) 1483 1484 { 1485 zero := float32(zero) 1486 one := float32(one) 1487 inf := float32(inf) 1488 nan := float32(nan) 1489 fail32bool(s, ff, zero, zero, (result>>16)&1 == 1) 1490 fail32bool(s, ff, zero, one, (result>>12)&1 == 1) 1491 fail32bool(s, ff, zero, inf, (result>>8)&1 == 1) 1492 fail32bool(s, ff, zero, nan, (result>>4)&1 == 1) 1493 fail32bool(s, ff, nan, nan, result&1 == 1) 1494 1495 fail32(s, gg, zero, zero, ev32[(result>>16)&1]) 1496 fail32(s, gg, zero, one, ev32[(result>>12)&1]) 1497 fail32(s, gg, zero, inf, ev32[(result>>8)&1]) 1498 fail32(s, gg, zero, nan, ev32[(result>>4)&1]) 1499 fail32(s, gg, nan, nan, ev32[(result>>0)&1]) 1500 } 1501 } 1502 1503 func expectCx128(t *testing.T, s string, x, expected complex128) { 1504 if x != expected { 1505 t.Errorf("Cx 128 Expected %f for %s, got %f", expected, s, x) 1506 } 1507 } 1508 1509 func expectCx64(t *testing.T, s string, x, expected complex64) { 1510 if x != expected { 1511 t.Errorf("Cx 64 Expected %f for %s, got %f", expected, s, x) 1512 } 1513 } 1514 1515 //go:noinline 1516 func cx128sum_ssa(a, b complex128) complex128 { 1517 return a + b 1518 } 1519 1520 //go:noinline 1521 func cx128diff_ssa(a, b complex128) complex128 { 1522 return a - b 1523 } 1524 1525 //go:noinline 1526 func cx128prod_ssa(a, b complex128) complex128 { 1527 return a * b 1528 } 1529 1530 //go:noinline 1531 func cx128quot_ssa(a, b complex128) complex128 { 1532 return a / b 1533 } 1534 1535 //go:noinline 1536 func cx128neg_ssa(a complex128) complex128 { 1537 return -a 1538 } 1539 1540 //go:noinline 1541 func cx128real_ssa(a complex128) float64 { 1542 return real(a) 1543 } 1544 1545 //go:noinline 1546 func cx128imag_ssa(a complex128) float64 { 1547 return imag(a) 1548 } 1549 1550 //go:noinline 1551 func cx128cnst_ssa(a complex128) complex128 { 1552 b := 2 + 3i 1553 return a * b 1554 } 1555 1556 //go:noinline 1557 func cx64sum_ssa(a, b complex64) complex64 { 1558 return a + b 1559 } 1560 1561 //go:noinline 1562 func cx64diff_ssa(a, b complex64) complex64 { 1563 return a - b 1564 } 1565 1566 //go:noinline 1567 func cx64prod_ssa(a, b complex64) complex64 { 1568 return a * b 1569 } 1570 1571 //go:noinline 1572 func cx64quot_ssa(a, b complex64) complex64 { 1573 return a / b 1574 } 1575 1576 //go:noinline 1577 func cx64neg_ssa(a complex64) complex64 { 1578 return -a 1579 } 1580 1581 //go:noinline 1582 func cx64real_ssa(a complex64) float32 { 1583 return real(a) 1584 } 1585 1586 //go:noinline 1587 func cx64imag_ssa(a complex64) float32 { 1588 return imag(a) 1589 } 1590 1591 //go:noinline 1592 func cx128eq_ssa(a, b complex128) bool { 1593 return a == b 1594 } 1595 1596 //go:noinline 1597 func cx128ne_ssa(a, b complex128) bool { 1598 return a != b 1599 } 1600 1601 //go:noinline 1602 func cx64eq_ssa(a, b complex64) bool { 1603 return a == b 1604 } 1605 1606 //go:noinline 1607 func cx64ne_ssa(a, b complex64) bool { 1608 return a != b 1609 } 1610 1611 func expectTrue(t *testing.T, s string, b bool) { 1612 if !b { 1613 t.Errorf("expected true for %s, got false", s) 1614 } 1615 } 1616 func expectFalse(t *testing.T, s string, b bool) { 1617 if b { 1618 t.Errorf("expected false for %s, got true", s) 1619 } 1620 } 1621 1622 func complexTest128(t *testing.T) { 1623 var a complex128 = 1 + 2i 1624 var b complex128 = 3 + 6i 1625 sum := cx128sum_ssa(b, a) 1626 diff := cx128diff_ssa(b, a) 1627 prod := cx128prod_ssa(b, a) 1628 quot := cx128quot_ssa(b, a) 1629 neg := cx128neg_ssa(a) 1630 r := cx128real_ssa(a) 1631 i := cx128imag_ssa(a) 1632 cnst := cx128cnst_ssa(a) 1633 c1 := cx128eq_ssa(a, a) 1634 c2 := cx128eq_ssa(a, b) 1635 c3 := cx128ne_ssa(a, a) 1636 c4 := cx128ne_ssa(a, b) 1637 1638 expectCx128(t, "sum", sum, 4+8i) 1639 expectCx128(t, "diff", diff, 2+4i) 1640 expectCx128(t, "prod", prod, -9+12i) 1641 expectCx128(t, "quot", quot, 3+0i) 1642 expectCx128(t, "neg", neg, -1-2i) 1643 expect64(t, "real", r, 1) 1644 expect64(t, "imag", i, 2) 1645 expectCx128(t, "cnst", cnst, -4+7i) 1646 expectTrue(t, fmt.Sprintf("%v==%v", a, a), c1) 1647 expectFalse(t, fmt.Sprintf("%v==%v", a, b), c2) 1648 expectFalse(t, fmt.Sprintf("%v!=%v", a, a), c3) 1649 expectTrue(t, fmt.Sprintf("%v!=%v", a, b), c4) 1650 } 1651 1652 func complexTest64(t *testing.T) { 1653 var a complex64 = 1 + 2i 1654 var b complex64 = 3 + 6i 1655 sum := cx64sum_ssa(b, a) 1656 diff := cx64diff_ssa(b, a) 1657 prod := cx64prod_ssa(b, a) 1658 quot := cx64quot_ssa(b, a) 1659 neg := cx64neg_ssa(a) 1660 r := cx64real_ssa(a) 1661 i := cx64imag_ssa(a) 1662 c1 := cx64eq_ssa(a, a) 1663 c2 := cx64eq_ssa(a, b) 1664 c3 := cx64ne_ssa(a, a) 1665 c4 := cx64ne_ssa(a, b) 1666 1667 expectCx64(t, "sum", sum, 4+8i) 1668 expectCx64(t, "diff", diff, 2+4i) 1669 expectCx64(t, "prod", prod, -9+12i) 1670 expectCx64(t, "quot", quot, 3+0i) 1671 expectCx64(t, "neg", neg, -1-2i) 1672 expect32(t, "real", r, 1) 1673 expect32(t, "imag", i, 2) 1674 expectTrue(t, fmt.Sprintf("%v==%v", a, a), c1) 1675 expectFalse(t, fmt.Sprintf("%v==%v", a, b), c2) 1676 expectFalse(t, fmt.Sprintf("%v!=%v", a, a), c3) 1677 expectTrue(t, fmt.Sprintf("%v!=%v", a, b), c4) 1678 } 1679 1680 // TestFP tests that we get the right answer for floating point expressions. 1681 func TestFP(t *testing.T) { 1682 a := 3.0 1683 b := 4.0 1684 1685 c := float32(3.0) 1686 d := float32(4.0) 1687 1688 tiny := float32(1.5e-45) // smallest f32 denorm = 2**(-149) 1689 dtiny := float64(tiny) // well within range of f64 1690 1691 fail64("+", add64_ssa, a, b, 7.0) 1692 fail64("*", mul64_ssa, a, b, 12.0) 1693 fail64("-", sub64_ssa, a, b, -1.0) 1694 fail64("/", div64_ssa, a, b, 0.75) 1695 fail64("neg", neg64_ssa, a, b, -7) 1696 1697 fail32("+", add32_ssa, c, d, 7.0) 1698 fail32("*", mul32_ssa, c, d, 12.0) 1699 fail32("-", sub32_ssa, c, d, -1.0) 1700 fail32("/", div32_ssa, c, d, 0.75) 1701 fail32("neg", neg32_ssa, c, d, -7) 1702 1703 // denorm-squared should underflow to zero. 1704 fail32("*", mul32_ssa, tiny, tiny, 0) 1705 1706 // but should not underflow in float and in fact is exactly representable. 1707 fail64("*", mul64_ssa, dtiny, dtiny, 1.9636373861190906e-90) 1708 1709 // Intended to create register pressure which forces 1710 // asymmetric op into different code paths. 1711 aa, ab, ac, ad, ba, bb, bc, bd, ca, cb, cc, cd, da, db, dc, dd := manysub_ssa(1000.0, 100.0, 10.0, 1.0) 1712 1713 expect64(t, "aa", aa, 11.0) 1714 expect64(t, "ab", ab, 900.0) 1715 expect64(t, "ac", ac, 990.0) 1716 expect64(t, "ad", ad, 999.0) 1717 1718 expect64(t, "ba", ba, -900.0) 1719 expect64(t, "bb", bb, 22.0) 1720 expect64(t, "bc", bc, 90.0) 1721 expect64(t, "bd", bd, 99.0) 1722 1723 expect64(t, "ca", ca, -990.0) 1724 expect64(t, "cb", cb, -90.0) 1725 expect64(t, "cc", cc, 33.0) 1726 expect64(t, "cd", cd, 9.0) 1727 1728 expect64(t, "da", da, -999.0) 1729 expect64(t, "db", db, -99.0) 1730 expect64(t, "dc", dc, -9.0) 1731 expect64(t, "dd", dd, 44.0) 1732 1733 integer2floatConversions(t) 1734 1735 multiplyAdd(t) 1736 1737 var zero64 float64 = 0.0 1738 var one64 float64 = 1.0 1739 var inf64 float64 = 1.0 / zero64 1740 var nan64 float64 = sub64_ssa(inf64, inf64) 1741 1742 cmpOpTest(t, "!=", ne64_ssa, nebr64_ssa, ne32_ssa, nebr32_ssa, zero64, one64, inf64, nan64, 0x01111) 1743 cmpOpTest(t, "==", eq64_ssa, eqbr64_ssa, eq32_ssa, eqbr32_ssa, zero64, one64, inf64, nan64, 0x10000) 1744 cmpOpTest(t, "<=", le64_ssa, lebr64_ssa, le32_ssa, lebr32_ssa, zero64, one64, inf64, nan64, 0x11100) 1745 cmpOpTest(t, "<", lt64_ssa, ltbr64_ssa, lt32_ssa, ltbr32_ssa, zero64, one64, inf64, nan64, 0x01100) 1746 cmpOpTest(t, ">", gt64_ssa, gtbr64_ssa, gt32_ssa, gtbr32_ssa, zero64, one64, inf64, nan64, 0x00000) 1747 cmpOpTest(t, ">=", ge64_ssa, gebr64_ssa, ge32_ssa, gebr32_ssa, zero64, one64, inf64, nan64, 0x10000) 1748 1749 { 1750 lt, le, eq, ne, ge, gt := compares64_ssa(0.0, 1.0, inf64, nan64) 1751 expectUint64(t, "lt", lt, 0x0110001000000000) 1752 expectUint64(t, "le", le, 0x1110011000100000) 1753 expectUint64(t, "eq", eq, 0x1000010000100000) 1754 expectUint64(t, "ne", ne, 0x0111101111011111) 1755 expectUint64(t, "ge", ge, 0x1000110011100000) 1756 expectUint64(t, "gt", gt, 0x0000100011000000) 1757 // fmt.Printf("lt=0x%016x, le=0x%016x, eq=0x%016x, ne=0x%016x, ge=0x%016x, gt=0x%016x\n", 1758 // lt, le, eq, ne, ge, gt) 1759 } 1760 { 1761 lt, le, eq, ne, ge, gt := compares32_ssa(0.0, 1.0, float32(inf64), float32(nan64)) 1762 expectUint64(t, "lt", lt, 0x0110001000000000) 1763 expectUint64(t, "le", le, 0x1110011000100000) 1764 expectUint64(t, "eq", eq, 0x1000010000100000) 1765 expectUint64(t, "ne", ne, 0x0111101111011111) 1766 expectUint64(t, "ge", ge, 0x1000110011100000) 1767 expectUint64(t, "gt", gt, 0x0000100011000000) 1768 } 1769 1770 floatingToIntegerConversionsTest(t) 1771 complexTest128(t) 1772 complexTest64(t) 1773 }