1/* Tests the shift instructions. 2 3 Copyright (C) 2017-2023 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(0xb38f0f83);\n 20# output: report(0x00000000);\n 21# output: report(0xb38f0f83);\n 22# output: \n 23# output: report(0xb38f0f83);\n 24# output: report(0x00000001);\n 25# output: report(0x671e1f06);\n 26# output: \n 27# output: report(0xb38f0f83);\n 28# output: report(0x00000004);\n 29# output: report(0x38f0f830);\n 30# output: \n 31# output: report(0xb38f0f83);\n 32# output: report(0x00000010);\n 33# output: report(0x0f830000);\n 34# output: \n 35# output: report(0xb38f0f83);\n 36# output: report(0x0000001f);\n 37# output: report(0x80000000);\n 38# output: \n 39# output: report(0xb38f0f83);\n 40# output: report(0x00000021);\n 41# output: report(0x671e1f06);\n 42# output: \n 43# output: report(0xb38f0f83);\n 44# output: report(0x00002224);\n 45# output: report(0x38f0f830);\n 46# output: \n 47# output: report(0xb38f0f83);\n 48# output: report(0x00f789f0);\n 49# output: report(0x0f830000);\n 50# output: \n 51# output: report(0xb38f0f83);\n 52# output: report(0xffffffff);\n 53# output: report(0x80000000);\n 54# output: \n 55# output: report(0xb38f0f83);\n 56# output: report(0x00000000);\n 57# output: report(0xb38f0f83);\n 58# output: \n 59# output: report(0xb38f0f83);\n 60# output: report(0x00000001);\n 61# output: report(0x671e1f06);\n 62# output: \n 63# output: report(0xb38f0f83);\n 64# output: report(0x00000004);\n 65# output: report(0x38f0f830);\n 66# output: \n 67# output: report(0xb38f0f83);\n 68# output: report(0x00000010);\n 69# output: report(0x0f830000);\n 70# output: \n 71# output: report(0xb38f0f83);\n 72# output: report(0x0000001f);\n 73# output: report(0x80000000);\n 74# output: \n 75# output: report(0xb38f0f83);\n 76# output: report(0x00000021);\n 77# output: report(0x671e1f06);\n 78# output: \n 79# output: report(0xb38f0f83);\n 80# output: report(0x00000024);\n 81# output: report(0x38f0f830);\n 82# output: \n 83# output: report(0xb38f0f83);\n 84# output: report(0x00000030);\n 85# output: report(0x0f830000);\n 86# output: \n 87# output: report(0xb38f0f83);\n 88# output: report(0x0000003f);\n 89# output: report(0x80000000);\n 90# output: \n 91# output: report(0xb38f0f83);\n 92# output: report(0x00000000);\n 93# output: report(0xb38f0f83);\n 94# output: \n 95# output: report(0xb38f0f83);\n 96# output: report(0x00000001);\n 97# output: report(0xd9c787c1);\n 98# output: \n 99# output: report(0xb38f0f83);\n 100# output: report(0x00000004);\n 101# output: report(0xfb38f0f8);\n 102# output: \n 103# output: report(0xb38f0f83);\n 104# output: report(0x00000010);\n 105# output: report(0xffffb38f);\n 106# output: \n 107# output: report(0xb38f0f83);\n 108# output: report(0x0000001f);\n 109# output: report(0xffffffff);\n 110# output: \n 111# output: report(0x4c70f07c);\n 112# output: report(0x00000001);\n 113# output: report(0x2638783e);\n 114# output: \n 115# output: report(0x4c70f07c);\n 116# output: report(0x00000004);\n 117# output: report(0x04c70f07);\n 118# output: \n 119# output: report(0x4c70f07c);\n 120# output: report(0x00000010);\n 121# output: report(0x00004c70);\n 122# output: \n 123# output: report(0x4c70f07c);\n 124# output: report(0x0000001f);\n 125# output: report(0x00000000);\n 126# output: \n 127# output: report(0xb38f0f83);\n 128# output: report(0x00000021);\n 129# output: report(0xd9c787c1);\n 130# output: \n 131# output: report(0xb38f0f83);\n 132# output: report(0x00002224);\n 133# output: report(0xfb38f0f8);\n 134# output: \n 135# output: report(0xb38f0f83);\n 136# output: report(0x00f789f0);\n 137# output: report(0xffffb38f);\n 138# output: \n 139# output: report(0xb38f0f83);\n 140# output: report(0xffffffff);\n 141# output: report(0xffffffff);\n 142# output: \n 143# output: report(0x4c70f07c);\n 144# output: report(0x00000021);\n 145# output: report(0x2638783e);\n 146# output: \n 147# output: report(0x4c70f07c);\n 148# output: report(0x00002224);\n 149# output: report(0x04c70f07);\n 150# output: \n 151# output: report(0x4c70f07c);\n 152# output: report(0x00f789f0);\n 153# output: report(0x00004c70);\n 154# output: \n 155# output: report(0x4c70f07c);\n 156# output: report(0xffffffff);\n 157# output: report(0x00000000);\n 158# output: \n 159# output: report(0xb38f0f83);\n 160# output: report(0x00000000);\n 161# output: report(0xb38f0f83);\n 162# output: \n 163# output: report(0xb38f0f83);\n 164# output: report(0x00000001);\n 165# output: report(0xd9c787c1);\n 166# output: \n 167# output: report(0xb38f0f83);\n 168# output: report(0x00000004);\n 169# output: report(0xfb38f0f8);\n 170# output: \n 171# output: report(0xb38f0f83);\n 172# output: report(0x00000010);\n 173# output: report(0xffffb38f);\n 174# output: \n 175# output: report(0xb38f0f83);\n 176# output: report(0x0000001f);\n 177# output: report(0xffffffff);\n 178# output: \n 179# output: report(0x4c70f07c);\n 180# output: report(0x00000001);\n 181# output: report(0x2638783e);\n 182# output: \n 183# output: report(0x4c70f07c);\n 184# output: report(0x00000004);\n 185# output: report(0x04c70f07);\n 186# output: \n 187# output: report(0x4c70f07c);\n 188# output: report(0x00000010);\n 189# output: report(0x00004c70);\n 190# output: \n 191# output: report(0x4c70f07c);\n 192# output: report(0x0000001f);\n 193# output: report(0x00000000);\n 194# output: \n 195# output: report(0xb38f0f83);\n 196# output: report(0x00000021);\n 197# output: report(0xd9c787c1);\n 198# output: \n 199# output: report(0xb38f0f83);\n 200# output: report(0x00000024);\n 201# output: report(0xfb38f0f8);\n 202# output: \n 203# output: report(0xb38f0f83);\n 204# output: report(0x00000030);\n 205# output: report(0xffffb38f);\n 206# output: \n 207# output: report(0xb38f0f83);\n 208# output: report(0x0000003f);\n 209# output: report(0xffffffff);\n 210# output: \n 211# output: report(0x4c70f07c);\n 212# output: report(0x00000021);\n 213# output: report(0x2638783e);\n 214# output: \n 215# output: report(0x4c70f07c);\n 216# output: report(0x00000024);\n 217# output: report(0x04c70f07);\n 218# output: \n 219# output: report(0x4c70f07c);\n 220# output: report(0x00000030);\n 221# output: report(0x00004c70);\n 222# output: \n 223# output: report(0x4c70f07c);\n 224# output: report(0x0000003f);\n 225# output: report(0x00000000);\n 226# output: \n 227# output: report(0xb38f0f83);\n 228# output: report(0x00000000);\n 229# output: report(0xb38f0f83);\n 230# output: \n 231# output: report(0xb38f0f83);\n 232# output: report(0x00000001);\n 233# output: report(0x59c787c1);\n 234# output: \n 235# output: report(0xb38f0f83);\n 236# output: report(0x00000004);\n 237# output: report(0x0b38f0f8);\n 238# output: \n 239# output: report(0xb38f0f83);\n 240# output: report(0x00000010);\n 241# output: report(0x0000b38f);\n 242# output: \n 243# output: report(0xb38f0f83);\n 244# output: report(0x0000001f);\n 245# output: report(0x00000001);\n 246# output: \n 247# output: report(0x4c70f07c);\n 248# output: report(0x00000001);\n 249# output: report(0x2638783e);\n 250# output: \n 251# output: report(0x4c70f07c);\n 252# output: report(0x00000004);\n 253# output: report(0x04c70f07);\n 254# output: \n 255# output: report(0x4c70f07c);\n 256# output: report(0x00000010);\n 257# output: report(0x00004c70);\n 258# output: \n 259# output: report(0x4c70f07c);\n 260# output: report(0x0000001f);\n 261# output: report(0x00000000);\n 262# output: \n 263# output: report(0xb38f0f83);\n 264# output: report(0x00000021);\n 265# output: report(0x59c787c1);\n 266# output: \n 267# output: report(0xb38f0f83);\n 268# output: report(0x00002224);\n 269# output: report(0x0b38f0f8);\n 270# output: \n 271# output: report(0xb38f0f83);\n 272# output: report(0x00f789f0);\n 273# output: report(0x0000b38f);\n 274# output: \n 275# output: report(0xb38f0f83);\n 276# output: report(0xffffffff);\n 277# output: report(0x00000001);\n 278# output: \n 279# output: report(0x4c70f07c);\n 280# output: report(0x00000021);\n 281# output: report(0x2638783e);\n 282# output: \n 283# output: report(0x4c70f07c);\n 284# output: report(0x00002224);\n 285# output: report(0x04c70f07);\n 286# output: \n 287# output: report(0x4c70f07c);\n 288# output: report(0x00f789f0);\n 289# output: report(0x00004c70);\n 290# output: \n 291# output: report(0x4c70f07c);\n 292# output: report(0xffffffff);\n 293# output: report(0x00000000);\n 294# output: \n 295# output: report(0xb38f0f83);\n 296# output: report(0x00000000);\n 297# output: report(0xb38f0f83);\n 298# output: \n 299# output: report(0xb38f0f83);\n 300# output: report(0x00000001);\n 301# output: report(0x59c787c1);\n 302# output: \n 303# output: report(0xb38f0f83);\n 304# output: report(0x00000004);\n 305# output: report(0x0b38f0f8);\n 306# output: \n 307# output: report(0xb38f0f83);\n 308# output: report(0x00000010);\n 309# output: report(0x0000b38f);\n 310# output: \n 311# output: report(0xb38f0f83);\n 312# output: report(0x0000001f);\n 313# output: report(0x00000001);\n 314# output: \n 315# output: report(0x4c70f07c);\n 316# output: report(0x00000001);\n 317# output: report(0x2638783e);\n 318# output: \n 319# output: report(0x4c70f07c);\n 320# output: report(0x00000004);\n 321# output: report(0x04c70f07);\n 322# output: \n 323# output: report(0x4c70f07c);\n 324# output: report(0x00000010);\n 325# output: report(0x00004c70);\n 326# output: \n 327# output: report(0x4c70f07c);\n 328# output: report(0x0000001f);\n 329# output: report(0x00000000);\n 330# output: \n 331# output: report(0xb38f0f83);\n 332# output: report(0x00000021);\n 333# output: report(0x59c787c1);\n 334# output: \n 335# output: report(0xb38f0f83);\n 336# output: report(0x00000024);\n 337# output: report(0x0b38f0f8);\n 338# output: \n 339# output: report(0xb38f0f83);\n 340# output: report(0x00000030);\n 341# output: report(0x0000b38f);\n 342# output: \n 343# output: report(0xb38f0f83);\n 344# output: report(0x0000003f);\n 345# output: report(0x00000001);\n 346# output: \n 347# output: report(0x4c70f07c);\n 348# output: report(0x00000021);\n 349# output: report(0x2638783e);\n 350# output: \n 351# output: report(0x4c70f07c);\n 352# output: report(0x00000024);\n 353# output: report(0x04c70f07);\n 354# output: \n 355# output: report(0x4c70f07c);\n 356# output: report(0x00000030);\n 357# output: report(0x00004c70);\n 358# output: \n 359# output: report(0x4c70f07c);\n 360# output: report(0x0000003f);\n 361# output: report(0x00000000);\n 362# output: \n 363# output: exit(0)\n 364 365#include "or1k-asm-test-helpers.h" 366 367 .macro TEST_SHIFT opcode, op1, op2 368 LOAD_IMMEDIATE r5, \op1 369 LOAD_IMMEDIATE r6, \op2 370 REPORT_REG_TO_CONSOLE r5 371 REPORT_REG_TO_CONSOLE r6 372 \opcode r4, r5, r6 373 CHECK_CARRY_AND_OVERFLOW_NOT_SET r2, r3 374 REPORT_REG_TO_CONSOLE r4 375 PRINT_NEWLINE_TO_CONSOLE 376 .endm 377 378 .macro TEST_SHIFT_I opcode, op1, op2 379 LOAD_IMMEDIATE r5, \op1 380 REPORT_REG_TO_CONSOLE r5 381 REPORT_IMMEDIATE_TO_CONSOLE \op2 382 \opcode r4, r5, \op2 383 CHECK_CARRY_AND_OVERFLOW_NOT_SET r2, r3 384 REPORT_REG_TO_CONSOLE r4 385 PRINT_NEWLINE_TO_CONSOLE 386 .endm 387 388 STANDARD_TEST_ENVIRONMENT 389 390 .section .text 391start_tests: 392 PUSH LINK_REGISTER_R9 393 394 /* Always set OVE. We should never trigger an exception, even if 395 this bit is set. */ 396 SET_SPR_SR_FLAGS SPR_SR_OVE, r2, r3 397 398 /* Test l.sll */ 399 400 /* Shift left by zero. */ 401 TEST_SHIFT l.sll, 0xb38f0f83, 0x00000000 402 403 /* Shift left by amounts in the 1-31 range. */ 404 TEST_SHIFT l.sll, 0xb38f0f83, 0x00000001 405 TEST_SHIFT l.sll, 0xb38f0f83, 0x00000004 406 TEST_SHIFT l.sll, 0xb38f0f83, 0x00000010 407 TEST_SHIFT l.sll, 0xb38f0f83, 0x0000001f 408 409 /* Shift left by larger amounts - should be masked. */ 410 TEST_SHIFT l.sll, 0xb38f0f83, 0x00000021 411 TEST_SHIFT l.sll, 0xb38f0f83, 0x00002224 412 TEST_SHIFT l.sll, 0xb38f0f83, 0x00f789f0 413 TEST_SHIFT l.sll, 0xb38f0f83, 0xffffffff 414 415 /* Test l.slli */ 416 417 /* Shift left by zero. */ 418 TEST_SHIFT_I l.slli, 0xb38f0f83, 0x0000 419 420 /* Shift left by amounts in the 1-31 range. */ 421 TEST_SHIFT_I l.slli, 0xb38f0f83, 0x0001 422 TEST_SHIFT_I l.slli, 0xb38f0f83, 0x0004 423 TEST_SHIFT_I l.slli, 0xb38f0f83, 0x0010 424 TEST_SHIFT_I l.slli, 0xb38f0f83, 0x001f 425 426 /* Shift left by larger amounts - should be masked. */ 427 TEST_SHIFT_I l.slli, 0xb38f0f83, 0x0021 428 TEST_SHIFT_I l.slli, 0xb38f0f83, 0x0024 429 TEST_SHIFT_I l.slli, 0xb38f0f83, 0x0030 430 TEST_SHIFT_I l.slli, 0xb38f0f83, 0x003f 431 432 /* Test l.sra */ 433 434 /* Shift right by zero. */ 435 TEST_SHIFT l.sra, 0xb38f0f83, 0x00000000 436 437 /* Shift right by amounts in the 1-31 range. */ 438 TEST_SHIFT l.sra, 0xb38f0f83, 0x00000001 439 TEST_SHIFT l.sra, 0xb38f0f83, 0x00000004 440 TEST_SHIFT l.sra, 0xb38f0f83, 0x00000010 441 TEST_SHIFT l.sra, 0xb38f0f83, 0x0000001f 442 443 TEST_SHIFT l.sra, 0x4c70f07c, 0x00000001 444 TEST_SHIFT l.sra, 0x4c70f07c, 0x00000004 445 TEST_SHIFT l.sra, 0x4c70f07c, 0x00000010 446 TEST_SHIFT l.sra, 0x4c70f07c, 0x0000001f 447 448 /* Shift right by larger amounts - should be masked. */ 449 TEST_SHIFT l.sra, 0xb38f0f83, 0x00000021 450 TEST_SHIFT l.sra, 0xb38f0f83, 0x00002224 451 TEST_SHIFT l.sra, 0xb38f0f83, 0x00f789f0 452 TEST_SHIFT l.sra, 0xb38f0f83, 0xffffffff 453 454 TEST_SHIFT l.sra, 0x4c70f07c, 0x00000021 455 TEST_SHIFT l.sra, 0x4c70f07c, 0x00002224 456 TEST_SHIFT l.sra, 0x4c70f07c, 0x00f789f0 457 TEST_SHIFT l.sra, 0x4c70f07c, 0xffffffff 458 459 /* Test l.srai */ 460 461 /* Shift right by zero. */ 462 TEST_SHIFT_I l.srai, 0xb38f0f83, 0x0000 463 464 /* Shift right by amounts in the 1-31 range. */ 465 TEST_SHIFT_I l.srai, 0xb38f0f83, 0x0001 466 TEST_SHIFT_I l.srai, 0xb38f0f83, 0x0004 467 TEST_SHIFT_I l.srai, 0xb38f0f83, 0x0010 468 TEST_SHIFT_I l.srai, 0xb38f0f83, 0x001f 469 470 TEST_SHIFT_I l.srai, 0x4c70f07c, 0x0001 471 TEST_SHIFT_I l.srai, 0x4c70f07c, 0x0004 472 TEST_SHIFT_I l.srai, 0x4c70f07c, 0x0010 473 TEST_SHIFT_I l.srai, 0x4c70f07c, 0x001f 474 475 /* Shift right by larger amounts - should be masked. */ 476 TEST_SHIFT_I l.srai, 0xb38f0f83, 0x0021 477 TEST_SHIFT_I l.srai, 0xb38f0f83, 0x0024 478 TEST_SHIFT_I l.srai, 0xb38f0f83, 0x0030 479 TEST_SHIFT_I l.srai, 0xb38f0f83, 0x003f 480 481 TEST_SHIFT_I l.srai, 0x4c70f07c, 0x0021 482 TEST_SHIFT_I l.srai, 0x4c70f07c, 0x0024 483 TEST_SHIFT_I l.srai, 0x4c70f07c, 0x0030 484 TEST_SHIFT_I l.srai, 0x4c70f07c, 0x003f 485 486 /* Test l.srl */ 487 488 /* Shift right by zero. */ 489 TEST_SHIFT l.srl, 0xb38f0f83, 0x00000000 490 491 /* Shift right by amounts in the 1-31 range. */ 492 TEST_SHIFT l.srl, 0xb38f0f83, 0x00000001 493 TEST_SHIFT l.srl, 0xb38f0f83, 0x00000004 494 TEST_SHIFT l.srl, 0xb38f0f83, 0x00000010 495 TEST_SHIFT l.srl, 0xb38f0f83, 0x0000001f 496 497 TEST_SHIFT l.srl, 0x4c70f07c, 0x00000001 498 TEST_SHIFT l.srl, 0x4c70f07c, 0x00000004 499 TEST_SHIFT l.srl, 0x4c70f07c, 0x00000010 500 TEST_SHIFT l.srl, 0x4c70f07c, 0x0000001f 501 502 /* Shift right by larger amounts - should be masked. */ 503 TEST_SHIFT l.srl, 0xb38f0f83, 0x00000021 504 TEST_SHIFT l.srl, 0xb38f0f83, 0x00002224 505 TEST_SHIFT l.srl, 0xb38f0f83, 0x00f789f0 506 TEST_SHIFT l.srl, 0xb38f0f83, 0xffffffff 507 508 TEST_SHIFT l.srl, 0x4c70f07c, 0x00000021 509 TEST_SHIFT l.srl, 0x4c70f07c, 0x00002224 510 TEST_SHIFT l.srl, 0x4c70f07c, 0x00f789f0 511 TEST_SHIFT l.srl, 0x4c70f07c, 0xffffffff 512 513 /* Test l.srli */ 514 515 /* Shift right by zero. */ 516 TEST_SHIFT_I l.srli, 0xb38f0f83, 0x0000 517 518 /* Shift right by amounts in the 1-31 range. */ 519 TEST_SHIFT_I l.srli, 0xb38f0f83, 0x0001 520 TEST_SHIFT_I l.srli, 0xb38f0f83, 0x0004 521 TEST_SHIFT_I l.srli, 0xb38f0f83, 0x0010 522 TEST_SHIFT_I l.srli, 0xb38f0f83, 0x001f 523 524 TEST_SHIFT_I l.srli, 0x4c70f07c, 0x0001 525 TEST_SHIFT_I l.srli, 0x4c70f07c, 0x0004 526 TEST_SHIFT_I l.srli, 0x4c70f07c, 0x0010 527 TEST_SHIFT_I l.srli, 0x4c70f07c, 0x001f 528 529 /* Shift right by larger amounts - should be masked. */ 530 TEST_SHIFT_I l.srli, 0xb38f0f83, 0x0021 531 TEST_SHIFT_I l.srli, 0xb38f0f83, 0x0024 532 TEST_SHIFT_I l.srli, 0xb38f0f83, 0x0030 533 TEST_SHIFT_I l.srli, 0xb38f0f83, 0x003f 534 535 TEST_SHIFT_I l.srli, 0x4c70f07c, 0x0021 536 TEST_SHIFT_I l.srli, 0x4c70f07c, 0x0024 537 TEST_SHIFT_I l.srli, 0x4c70f07c, 0x0030 538 TEST_SHIFT_I l.srli, 0x4c70f07c, 0x003f 539 540 POP LINK_REGISTER_R9 541 RETURN_TO_LINK_REGISTER_R9 542