1/* Tests instructions l.add, l.addc, l.addi and l.addic. 2 3 Copyright (C) 2017-2024 Free Software Foundation, Inc. 4 5 This program is free software; you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published by 7 the Free Software Foundation; either version 3 of the License, or 8 (at your option) any later version. 9 10 This program is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 17 18# mach: or1k 19# output: report(0x00000001);\n 20# output: report(0x00000002);\n 21# output: report(0x00000003);\n 22# output: report(0x00000000);\n 23# output: report(0x00000000);\n 24# output: report(0x00000000);\n 25# output: \n 26# output: report(0x00000001);\n 27# output: report(0x00000002);\n 28# output: report(0x00000003);\n 29# output: report(0x00000000);\n 30# output: report(0x00000000);\n 31# output: report(0x00000000);\n 32# output: \n 33# output: report(0xffffffff);\n 34# output: report(0xfffffffe);\n 35# output: report(0xfffffffd);\n 36# output: report(0x00000001);\n 37# output: report(0x00000000);\n 38# output: report(0x00000000);\n 39# output: \n 40# output: report(0x40000000);\n 41# output: report(0x3fffffff);\n 42# output: report(0x7fffffff);\n 43# output: report(0x00000000);\n 44# output: report(0x00000000);\n 45# output: report(0x00000000);\n 46# output: \n 47# output: report(0x40000000);\n 48# output: report(0x40000000);\n 49# output: report(0x80000000);\n 50# output: report(0x00000000);\n 51# output: report(0x00000001);\n 52# output: report(0x00000000);\n 53# output: \n 54# output: report(0xc0000000);\n 55# output: report(0xc0000000);\n 56# output: report(0x80000000);\n 57# output: report(0x00000001);\n 58# output: report(0x00000000);\n 59# output: report(0x00000000);\n 60# output: \n 61# output: report(0xbfffffff);\n 62# output: report(0xbfffffff);\n 63# output: report(0x7ffffffe);\n 64# output: report(0x00000001);\n 65# output: report(0x00000001);\n 66# output: report(0x00000000);\n 67# output: \n 68# output: report(0x40000000);\n 69# output: report(0x40000000);\n 70# output: report(0x80000000);\n 71# output: report(0x00000000);\n 72# output: report(0x00000001);\n 73# output: report(0x00000001);\n 74# output: \n 75# output: report(0xffffffff);\n 76# output: report(0xfffffffe);\n 77# output: report(0xfffffffd);\n 78# output: report(0x00000001);\n 79# output: report(0x00000000);\n 80# output: report(0x00000000);\n 81# output: \n 82# output: report(0xbfffffff);\n 83# output: report(0xbfffffff);\n 84# output: report(0x7ffffffe);\n 85# output: report(0x00000001);\n 86# output: report(0x00000001);\n 87# output: report(0x00000001);\n 88# output: \n 89# output: report(0x00000001);\n 90# output: report(0x00000002);\n 91# output: report(0x00000003);\n 92# output: report(0x00000000);\n 93# output: report(0x00000000);\n 94# output: report(0x00000000);\n 95# output: \n 96# output: report(0xffffffff);\n 97# output: report(0xfffffffe);\n 98# output: report(0xfffffffd);\n 99# output: report(0x00000001);\n 100# output: report(0x00000000);\n 101# output: report(0x00000000);\n 102# output: \n 103# output: report(0x40000000);\n 104# output: report(0x3fffffff);\n 105# output: report(0x7fffffff);\n 106# output: report(0x00000000);\n 107# output: report(0x00000000);\n 108# output: report(0x00000000);\n 109# output: \n 110# output: report(0x40000000);\n 111# output: report(0x3fffffff);\n 112# output: report(0x80000000);\n 113# output: report(0x00000000);\n 114# output: report(0x00000001);\n 115# output: report(0x00000000);\n 116# output: \n 117# output: report(0x40000000);\n 118# output: report(0x40000000);\n 119# output: report(0x80000000);\n 120# output: report(0x00000000);\n 121# output: report(0x00000001);\n 122# output: report(0x00000000);\n 123# output: \n 124# output: report(0xffffffff);\n 125# output: report(0x00000000);\n 126# output: report(0x00000000);\n 127# output: report(0x00000001);\n 128# output: report(0x00000000);\n 129# output: report(0x00000000);\n 130# output: \n 131# output: report(0x00000000);\n 132# output: report(0xffffffff);\n 133# output: report(0x00000000);\n 134# output: report(0x00000001);\n 135# output: report(0x00000000);\n 136# output: report(0x00000000);\n 137# output: \n 138# output: report(0xc0000000);\n 139# output: report(0xc0000000);\n 140# output: report(0x80000000);\n 141# output: report(0x00000001);\n 142# output: report(0x00000000);\n 143# output: report(0x00000000);\n 144# output: \n 145# output: report(0xc0000000);\n 146# output: report(0xbfffffff);\n 147# output: report(0x80000000);\n 148# output: report(0x00000001);\n 149# output: report(0x00000000);\n 150# output: report(0x00000000);\n 151# output: \n 152# output: report(0xbfffffff);\n 153# output: report(0xbfffffff);\n 154# output: report(0x7ffffffe);\n 155# output: report(0x00000001);\n 156# output: report(0x00000001);\n 157# output: report(0x00000000);\n 158# output: \n 159# output: report(0x40000000);\n 160# output: report(0x40000000);\n 161# output: report(0x80000000);\n 162# output: report(0x00000000);\n 163# output: report(0x00000001);\n 164# output: report(0x00000001);\n 165# output: \n 166# output: report(0x40000000);\n 167# output: report(0x3fffffff);\n 168# output: report(0x80000000);\n 169# output: report(0x00000000);\n 170# output: report(0x00000001);\n 171# output: report(0x00000001);\n 172# output: \n 173# output: report(0xffffffff);\n 174# output: report(0xfffffffe);\n 175# output: report(0xfffffffd);\n 176# output: report(0x00000001);\n 177# output: report(0x00000000);\n 178# output: report(0x00000000);\n 179# output: \n 180# output: report(0x00000000);\n 181# output: report(0xffffffff);\n 182# output: report(0x00000000);\n 183# output: report(0x00000001);\n 184# output: report(0x00000000);\n 185# output: report(0x00000000);\n 186# output: \n 187# output: report(0xbfffffff);\n 188# output: report(0xbfffffff);\n 189# output: report(0x7ffffffe);\n 190# output: report(0x00000001);\n 191# output: report(0x00000001);\n 192# output: report(0x00000001);\n 193# output: \n 194# output: report(0x00000001);\n 195# output: report(0x00000002);\n 196# output: report(0x00000003);\n 197# output: report(0x00000000);\n 198# output: report(0x00000000);\n 199# output: report(0x00000000);\n 200# output: \n 201# output: report(0x00000001);\n 202# output: report(0x00000002);\n 203# output: report(0x00000003);\n 204# output: report(0x00000000);\n 205# output: report(0x00000000);\n 206# output: report(0x00000000);\n 207# output: \n 208# output: report(0xffffffff);\n 209# output: report(0x0000fffe);\n 210# output: report(0xfffffffd);\n 211# output: report(0x00000001);\n 212# output: report(0x00000000);\n 213# output: report(0x00000000);\n 214# output: \n 215# output: report(0x7fff8000);\n 216# output: report(0x00007fff);\n 217# output: report(0x7fffffff);\n 218# output: report(0x00000000);\n 219# output: report(0x00000000);\n 220# output: report(0x00000000);\n 221# output: \n 222# output: report(0x7fffc000);\n 223# output: report(0x00004000);\n 224# output: report(0x80000000);\n 225# output: report(0x00000000);\n 226# output: report(0x00000001);\n 227# output: report(0x00000000);\n 228# output: \n 229# output: report(0x80008000);\n 230# output: report(0x00008000);\n 231# output: report(0x80000000);\n 232# output: report(0x00000001);\n 233# output: report(0x00000000);\n 234# output: report(0x00000000);\n 235# output: \n 236# output: report(0x80007fff);\n 237# output: report(0x00008000);\n 238# output: report(0x7fffffff);\n 239# output: report(0x00000001);\n 240# output: report(0x00000001);\n 241# output: report(0x00000000);\n 242# output: \n 243# output: report(0x7fffc000);\n 244# output: report(0x00004000);\n 245# output: report(0x80000000);\n 246# output: report(0x00000000);\n 247# output: report(0x00000001);\n 248# output: report(0x00000001);\n 249# output: \n 250# output: report(0xffffffff);\n 251# output: report(0x0000fffe);\n 252# output: report(0xfffffffd);\n 253# output: report(0x00000001);\n 254# output: report(0x00000000);\n 255# output: report(0x00000000);\n 256# output: \n 257# output: report(0x80007fff);\n 258# output: report(0x00008000);\n 259# output: report(0x7fffffff);\n 260# output: report(0x00000001);\n 261# output: report(0x00000001);\n 262# output: report(0x00000001);\n 263# output: \n 264# output: report(0x00000001);\n 265# output: report(0x00000002);\n 266# output: report(0x00000003);\n 267# output: report(0x00000000);\n 268# output: report(0x00000000);\n 269# output: report(0x00000000);\n 270# output: \n 271# output: report(0xffffffff);\n 272# output: report(0x0000fffe);\n 273# output: report(0xfffffffd);\n 274# output: report(0x00000001);\n 275# output: report(0x00000000);\n 276# output: report(0x00000000);\n 277# output: \n 278# output: report(0x7fff8000);\n 279# output: report(0x00007fff);\n 280# output: report(0x7fffffff);\n 281# output: report(0x00000000);\n 282# output: report(0x00000000);\n 283# output: report(0x00000000);\n 284# output: \n 285# output: report(0x7fff8000);\n 286# output: report(0x00007fff);\n 287# output: report(0x80000000);\n 288# output: report(0x00000000);\n 289# output: report(0x00000001);\n 290# output: report(0x00000000);\n 291# output: \n 292# output: report(0x7fffc000);\n 293# output: report(0x00004000);\n 294# output: report(0x80000000);\n 295# output: report(0x00000000);\n 296# output: report(0x00000001);\n 297# output: report(0x00000000);\n 298# output: \n 299# output: report(0xffffffff);\n 300# output: report(0x00000000);\n 301# output: report(0x00000000);\n 302# output: report(0x00000001);\n 303# output: report(0x00000000);\n 304# output: report(0x00000000);\n 305# output: \n 306# output: report(0x00000000);\n 307# output: report(0x0000ffff);\n 308# output: report(0x00000000);\n 309# output: report(0x00000001);\n 310# output: report(0x00000000);\n 311# output: report(0x00000000);\n 312# output: \n 313# output: report(0x80008000);\n 314# output: report(0x00008000);\n 315# output: report(0x80000000);\n 316# output: report(0x00000001);\n 317# output: report(0x00000000);\n 318# output: report(0x00000000);\n 319# output: \n 320# output: report(0x80007fff);\n 321# output: report(0x00008000);\n 322# output: report(0x80000000);\n 323# output: report(0x00000001);\n 324# output: report(0x00000000);\n 325# output: report(0x00000000);\n 326# output: \n 327# output: report(0x80007fff);\n 328# output: report(0x00008000);\n 329# output: report(0x7fffffff);\n 330# output: report(0x00000001);\n 331# output: report(0x00000001);\n 332# output: report(0x00000000);\n 333# output: \n 334# output: report(0x7fffc000);\n 335# output: report(0x00004000);\n 336# output: report(0x80000000);\n 337# output: report(0x00000000);\n 338# output: report(0x00000001);\n 339# output: report(0x00000001);\n 340# output: \n 341# output: report(0x7fffc000);\n 342# output: report(0x00003fff);\n 343# output: report(0x80000000);\n 344# output: report(0x00000000);\n 345# output: report(0x00000001);\n 346# output: report(0x00000001);\n 347# output: \n 348# output: report(0xffffffff);\n 349# output: report(0x0000fffe);\n 350# output: report(0xfffffffd);\n 351# output: report(0x00000001);\n 352# output: report(0x00000000);\n 353# output: report(0x00000000);\n 354# output: \n 355# output: report(0x00000000);\n 356# output: report(0x0000ffff);\n 357# output: report(0x00000000);\n 358# output: report(0x00000001);\n 359# output: report(0x00000000);\n 360# output: report(0x00000000);\n 361# output: \n 362# output: report(0x80007fff);\n 363# output: report(0x00008000);\n 364# output: report(0x7fffffff);\n 365# output: report(0x00000001);\n 366# output: report(0x00000001);\n 367# output: report(0x00000001);\n 368# output: \n 369# output: exit(0)\n 370 371#include "or1k-asm-test-helpers.h" 372 373 STANDARD_TEST_ENVIRONMENT 374 375 .section .exception_vectors 376 377 /* Range exception. */ 378 .org 0xb00 379 380 /* The handling is a bit dubious at present. We just patch the 381 instruction with l.nop and restart. This will go wrong in branch 382 delay slots. But we don't have those in this test. */ 383 l.addi r1, r1, -EXCEPTION_STACK_SKIP_SIZE 384 PUSH r2 385 PUSH r3 386 /* Save the address of the instruction that caused the problem. */ 387 MOVE_FROM_SPR r2, SPR_EPCR_BASE 388 LOAD_IMMEDIATE r3, 0x15000000 /* Opcode for l.nop */ 389 l.sw 0(r2), r3 390 POP r3 391 POP r2 392 l.addi r1, r1, EXCEPTION_STACK_SKIP_SIZE 393 l.rfe 394 395 .section .text 396start_tests: 397 PUSH LINK_REGISTER_R9 398 399 /* Test l.add */ 400 401 /* Add two small positive numbers */ 402 TEST_INST_FF_I32_I32 0, SPR_SR_CY | SPR_SR_OV, l.add, 1, 2 403 404 /* The carry flag should be ignored. */ 405 TEST_INST_FF_I32_I32 SPR_SR_CY, SPR_SR_OV, l.add, 1, 2 406 407 /* Add two small negative numbers, which should set the carry flag 408 but not the overflow flag. */ 409 TEST_INST_FF_I32_I32 0, SPR_SR_CY | SPR_SR_OV, l.add, -1, -2 410 411 /* Add two quite large positive numbers. Should set neither the 412 overflow nor the carry flag. */ 413 TEST_INST_FF_I32_I32 0, SPR_SR_CY | SPR_SR_OV, l.add, 0x40000000, \ 414 0x3fffffff 415 416 /* Add two large positive numbers. Should set the overflow, but 417 not the carry flag. */ 418 TEST_INST_FF_I32_I32 0, SPR_SR_CY | SPR_SR_OV, l.add, 0x40000000, \ 419 0x40000000 420 421 /* Add two quite large negative numbers. Should set the carry, but 422 not the overflow flag. */ 423 TEST_INST_FF_I32_I32 0, SPR_SR_CY | SPR_SR_OV, l.add, -1073741824, \ 424 -1073741824 /* -1073741824 = 0xC0000000 */ 425 426 /* Add two large negative numbers. Should set both the overflow 427 and carry flags. */ 428 TEST_INST_FF_I32_I32 0, SPR_SR_CY | SPR_SR_OV, l.add, 0xbfffffff, \ 429 0xbfffffff 430 431 /* Check that range exceptions are triggered. */ 432 433 SET_SPR_SR_FLAGS SPR_SR_OVE, r2, r3 434 435 /* Check that an overflow alone causes a RANGE Exception. */ 436 TEST_INST_FF_I32_I32 0, SPR_SR_CY | SPR_SR_OV, l.add, 0x40000000, \ 437 0x40000000 438 439 /* Check that a carry alone does not cause a RANGE Exception. */ 440 TEST_INST_FF_I32_I32 0, SPR_SR_CY | SPR_SR_OV, l.add, 0xffffffff, \ 441 0xfffffffe 442 443 /* Check that carry and overflow together cause an exception. */ 444 TEST_INST_FF_I32_I32 0, SPR_SR_CY | SPR_SR_OV, l.add, 0xbfffffff, \ 445 0xbfffffff 446 447 CLEAR_SPR_SR_FLAGS SPR_SR_OVE, r2, r3 448 449 /* Test l.addc */ 450 451 /* Add two small positive numbers */ 452 TEST_INST_FF_I32_I32 0, SPR_SR_CY | SPR_SR_OV, l.addc, 1, 2 453 454 /* Add two small negative numbers. Sets the carry flag but not the 455 overflow flag. */ 456 TEST_INST_FF_I32_I32 0, SPR_SR_CY | SPR_SR_OV, l.addc, -1, -2 457 458 /* Add two quite large positive numbers. Should set neither the 459 overflow nor the carry flag. */ 460 TEST_INST_FF_I32_I32 0, SPR_SR_CY | SPR_SR_OV, l.addc, 0x40000000, \ 461 0x3fffffff 462 463 /* Add two quite large positive numbers with a carry in. Should 464 set the overflow but not the carry flag. */ 465 TEST_INST_FF_I32_I32 SPR_SR_CY, SPR_SR_OV, l.addc, 0x40000000, \ 466 0x3fffffff 467 468 /* Add two large positive numbers. Should set the overflow, but 469 not the carry flag. */ 470 TEST_INST_FF_I32_I32 0, SPR_SR_CY | SPR_SR_OV, l.addc, 0x40000000, \ 471 0x40000000 472 473 /* Add the largest unsigned value to zero with a carry. This 474 potentially can break a simplistic test for carry that does not 475 consider the carry flag properly. Do it both ways around. */ 476 TEST_INST_FF_I32_I32 SPR_SR_CY, SPR_SR_OV, l.addc, -1, 0 477 TEST_INST_FF_I32_I32 SPR_SR_CY, SPR_SR_OV, l.addc, 0, -1 478 479 /* Add two quite large negative numbers. Should set the carry, but 480 not the overflow flag. Here -1073741824 is 0xC0000000. */ 481 TEST_INST_FF_I32_I32 0, SPR_SR_CY | SPR_SR_OV, l.addc, -1073741824, \ 482 -1073741824 483 484 /* Add two quite large negative numbers that would overflow, with a 485 carry that just avoids the overflow. Should set the carry, but 486 not the overflow flag. Here -1073741824 is 0xC0000000 and 487 -1073741825 is 0xBFFFFFFF. */ 488 TEST_INST_FF_I32_I32 SPR_SR_CY, SPR_SR_OV, l.addc, -1073741824, \ 489 -1073741825 490 491 /* Add two large negative numbers. Should set both the overflow 492 and carry flags. */ 493 TEST_INST_FF_I32_I32 0, SPR_SR_CY | SPR_SR_OV, l.addc, -1073741825, \ 494 -1073741825 495 496 /* Check that range exceptions are triggered. */ 497 498 SET_SPR_SR_FLAGS SPR_SR_OVE, r2, r3 499 500 /* Check that an overflow alone causes a RANGE Exception, even when 501 it is the carry that causes the overflow. */ 502 TEST_INST_FF_I32_I32 0, SPR_SR_CY | SPR_SR_OV, l.addc, 0x40000000, \ 503 0x40000000 504 TEST_INST_FF_I32_I32 SPR_SR_CY, SPR_SR_OV, l.addc, 0x40000000, \ 505 0x3fffffff 506 507 /* Check that a carry alone does not cause a RANGE Exception, even 508 when it is the carry that causes the overflow. */ 509 TEST_INST_FF_I32_I32 0, SPR_SR_CY | SPR_SR_OV, l.addc, 0xffffffff, \ 510 0xfffffffe 511 TEST_INST_FF_I32_I32 SPR_SR_CY, SPR_SR_OV, l.addc, 0x00000000, \ 512 0xffffffff 513 514 /* Check that carry and overflow together cause an exception. */ 515 TEST_INST_FF_I32_I32 0, SPR_SR_CY | SPR_SR_OV, l.addc, 0xbfffffff, \ 516 0xbfffffff 517 518 CLEAR_SPR_SR_FLAGS SPR_SR_OVE, r2, r3 519 520 /* Test l.addi */ 521 522 /* Add two small positive numbers */ 523 TEST_INST_FF_I32_I16 0, SPR_SR_CY | SPR_SR_OV, l.addi, 1, 2 524 525 /* Check carry in is ignored. */ 526 TEST_INST_FF_I32_I16 SPR_SR_CY, SPR_SR_OV, l.addi, 1, 2 527 528 /* Add two small negative numbers. Sets the carry flag but not the 529 overflow flag. */ 530 TEST_INST_FF_I32_I16 0, SPR_SR_CY | SPR_SR_OV, l.addi, 0xffffffff, \ 531 0xfffe 532 533 /* Add two quite large positive numbers. Should set neither the 534 overflow nor the carry flag. */ 535 TEST_INST_FF_I32_I16 0, SPR_SR_CY | SPR_SR_OV, l.addi, 0x7fff8000, \ 536 0x7fff 537 538 /* Add two large positive numbers. Should set the overflow, but 539 not the carry flag. */ 540 TEST_INST_FF_I32_I16 0, SPR_SR_CY | SPR_SR_OV, l.addi, 0x7fffc000, \ 541 0x4000 542 543 /* Add two quite large negative numbers. Should set the carry, but 544 not the overflow flag. */ 545 TEST_INST_FF_I32_I16 0, SPR_SR_CY | SPR_SR_OV, l.addi, 0x80008000, \ 546 0x8000 547 548 /* Add two large negative numbers. Should set both the overflow 549 and carry flags. */ 550 TEST_INST_FF_I32_I16 0, SPR_SR_CY | SPR_SR_OV, l.addi, 0x80007fff, \ 551 0x8000 552 553 /* Check that range exceptions are triggered. */ 554 555 SET_SPR_SR_FLAGS SPR_SR_OVE, r2, r3 556 557 /* Check that an overflow alone causes a RANGE Exception. */ 558 TEST_INST_FF_I32_I16 0, SPR_SR_CY | SPR_SR_OV, l.addi, 0x7fffc000, \ 559 0x4000 560 561 /* Check that a carry alone does not cause a RANGE Exception. */ 562 TEST_INST_FF_I32_I16 0, SPR_SR_CY | SPR_SR_OV, l.addi, 0xffffffff, \ 563 0xfffe 564 565 /* Check that carry and overflow together cause an exception. */ 566 TEST_INST_FF_I32_I16 0, SPR_SR_CY | SPR_SR_OV, l.addi, 0x80007fff, \ 567 0x8000 568 569 CLEAR_SPR_SR_FLAGS SPR_SR_OVE, r2, r3 570 571 /* Test l.addi */ 572 573 /* Add two small positive numbers */ 574 TEST_INST_FF_I32_I16 0, SPR_SR_CY | SPR_SR_OV, l.addic, 1, 2 575 576 /* Add two small negative numbers. Sets the carry flag but not the 577 overflow flag. */ 578 TEST_INST_FF_I32_I16 0, SPR_SR_CY | SPR_SR_OV, l.addic, 0xffffffff, \ 579 0xfffe 580 581 /* Add two quite large positive numbers. Should set neither the 582 overflow nor the carry flag. */ 583 TEST_INST_FF_I32_I16 0, SPR_SR_CY | SPR_SR_OV, l.addic, 0x7fff8000, \ 584 0x7fff 585 586 /* Add two quite large positive numbers with a carry in. Should 587 set the overflow but not the carry flag. */ 588 TEST_INST_FF_I32_I16 SPR_SR_CY, SPR_SR_OV, l.addic, 0x7fff8000, 0x7fff 589 590 /* Add two large positive numbers. Should set the overflow, but 591 not the carry flag. */ 592 TEST_INST_FF_I32_I16 0, SPR_SR_CY | SPR_SR_OV, l.addic, 0x7fffc000, \ 593 0x4000 594 595 /* Add the largest unsigned value to zero with a carry. This 596 potentially can break a simplistic test for carry that does not 597 consider the carry flag properly. Do it both ways around. */ 598 TEST_INST_FF_I32_I16 SPR_SR_CY, SPR_SR_OV, l.addic, 0xffffffff, 0x0000 599 TEST_INST_FF_I32_I16 SPR_SR_CY, SPR_SR_OV, l.addic, 0x00000000, 0xffff 600 601 /* Add two quite large negative numbers. Should set the carry, but 602 not the overflow flag. */ 603 TEST_INST_FF_I32_I16 0, SPR_SR_CY | SPR_SR_OV, l.addic, 0x80008000, \ 604 0x8000 605 606 /* Add two quite large negative numbers that would overflow, with a 607 carry that just avoids the overflow. This should set the carry, 608 but not the overflow flag. */ 609 TEST_INST_FF_I32_I16 SPR_SR_CY, SPR_SR_OV, l.addic, 0x80007fff, 0x8000 610 611 /* Add two large negative numbers. Should set both the overflow 612 and carry flags. */ 613 TEST_INST_FF_I32_I16 0, SPR_SR_CY | SPR_SR_OV, l.addic, 0x80007fff, \ 614 0x8000 615 616 /* Check that range exceptions are triggered. */ 617 618 SET_SPR_SR_FLAGS SPR_SR_OVE, r2, r3 619 620 /* Check that an overflow alone causes a RANGE Exception, even when 621 it is the carry that causes the overflow. */ 622 TEST_INST_FF_I32_I16 0, SPR_SR_CY | SPR_SR_OV, l.addic, 0x7fffc000, \ 623 0x4000 624 TEST_INST_FF_I32_I16 SPR_SR_CY, SPR_SR_OV, l.addic, 0x7fffc000, 0x3fff 625 626 /* Check that a carry alone does not cause a RANGE Exception, even 627 when it is the carry that causes the overflow. */ 628 TEST_INST_FF_I32_I16 0, SPR_SR_CY | SPR_SR_OV, l.addic, 0xffffffff, \ 629 0xfffe 630 TEST_INST_FF_I32_I16 SPR_SR_CY, SPR_SR_OV, l.addic, 0x00000000, 0xffff 631 632 /* Check that carry and overflow together cause an exception. */ 633 TEST_INST_FF_I32_I16 0, SPR_SR_CY | SPR_SR_OV, l.addic, 0x80007fff, \ 634 0x8000 635 636 CLEAR_SPR_SR_FLAGS SPR_SR_OVE, r2, r3 637 638 POP LINK_REGISTER_R9 639 RETURN_TO_LINK_REGISTER_R9 640