001 /* 002 * This file is part of the Jikes RVM project (http://jikesrvm.org). 003 * 004 * This file is licensed to You under the Eclipse Public License (EPL); 005 * You may not use this file except in compliance with the License. You 006 * may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/eclipse-1.0.php 009 * 010 * See the COPYRIGHT.txt file distributed with this work for information 011 * regarding copyright ownership. 012 */ 013 package org.vmmagic.unboxed; 014 015 import org.vmmagic.Unboxed; 016 import org.vmmagic.pragma.RawStorage; 017 018 /** 019 * <b>Stub</b> implementation of an Address type, intended only to 020 * allow the core of MMTk to be compiled. This <b>must</b> be 021 * replaced with a concrete implementation appropriate to a specific 022 * VM.<p> 023 * 024 * The address type is used by the runtime system and collector to 025 * denote machine addresses. We use a separate type instead of the 026 * Java int type for coding clarity, machine-portability (it can map 027 * to 32 bit and 64 bit integral types), and access to unsigned 028 * operations (Java does not have unsigned int types). 029 */ 030 @Unboxed 031 @RawStorage(lengthInWords = true, length = 1) 032 public final class Address { 033 034 /**************************************************************************** 035 * 036 * Special values 037 */ 038 039 /** 040 * Return an <code>Address</code> instance that reflects the value 041 * zero. 042 * 043 * @return An address instance that reflects the value zero. 044 */ 045 public static Address zero() { 046 return null; 047 } 048 049 /** 050 * Return <code>true</code> if this instance is zero. 051 * 052 * @return <code>true</code> if this instance is zero. 053 */ 054 public boolean isZero() { 055 return false; 056 } 057 058 /** 059 * Return an <code>Address</code> instance that reflects the maximum 060 * allowable <code>Address</code> value. 061 * 062 * @return An <code>Address</code> instance that reflects the 063 * maximum allowable <code>Address</code> value. 064 */ 065 public static Address max() { 066 return null; 067 } 068 069 /** 070 * Return <code>true</code> if this instance is the maximum 071 * allowable <code>Address</code> value. 072 * 073 * @return <code>true</code> if this instance is the maximum 074 * allowable <code>Address</code> valu. 075 */ 076 public boolean isMax() { 077 return false; 078 } 079 080 /**************************************************************************** 081 * 082 * Conversions 083 */ 084 085 /** 086 * Fabricate an <code>Address</code> instance from an integer, after 087 * sign extending the integer. 088 * 089 * @param address the integer from which to create an <code>Address</code> 090 * instance 091 * @return An address instance 092 */ 093 public static Address fromIntSignExtend(int address) { 094 return null; 095 } 096 097 /** 098 * Fabricate an <code>Address</code> instance from an integer, after 099 * zero extending the integer. 100 * 101 * @param address the integer from which to create an <code>Address</code> 102 * instance 103 * @return An address instance 104 */ 105 public static Address fromIntZeroExtend(int address) { 106 return null; 107 } 108 109 /** 110 * Fabricate an <code>Address</code> instance from an integer 111 * 112 * @param address the integer from which to create an <code>Address</code> 113 * instance 114 * @return An address instance 115 */ 116 public static Address fromLong(long address) { 117 return null; 118 } 119 120 /** 121 * Fabricate an <code>ObjectReference</code> instance from an 122 * <code>Address</code> instance. It is the user's responsibility 123 * to ensure that the <code>Address</code> is suitable (i.e. it 124 * points to the object header, or satisfies any other VM-specific 125 * requirement for such a conversion). 126 * 127 * @return An <code>ObjectReference</code> instance. 128 */ 129 public ObjectReference toObjectReference() { 130 return null; 131 } 132 133 /** 134 * Return an integer that reflects the value of this 135 * <code>Address</code> instance. 136 * 137 * @return An integer that reflects the value of this 138 * <code>Address</code> instance. 139 */ 140 public int toInt() { 141 return 0; 142 } 143 144 /** 145 * Return an long that reflects the value of this 146 * <code>Address</code> instance. 147 * 148 * @return An long that reflects the value of this 149 * <code>Address</code> instance. 150 */ 151 public long toLong() { 152 return 0; 153 } 154 155 /** 156 * Return a <code>Word</code> instance that reflects the value of 157 * this <code>Address</code> instance. 158 * 159 * @return A <code>Word</code> instance that reflects the value of 160 * this <code>Address</code> instance. 161 */ 162 public Word toWord() { 163 return null; 164 } 165 166 /**************************************************************************** 167 * 168 * Arithemtic operators 169 */ 170 171 /** 172 * Add an integer to this <code>Address</code>, and return the sum. 173 * 174 * @param v the value to be added to this <code>Address</code> 175 * @return An <code>Address</code> instance that reflects the result 176 * of the addition. 177 */ 178 public Address plus(int v) { 179 return null; 180 } 181 182 /** 183 * Add an <code>Offset</code> to this <code>Address</code>, and 184 * return the sum. 185 * 186 * @param offset the <code>Offset</code> to be added to the address 187 * @return An <code>Address</code> instance that reflects the result 188 * of the addition. 189 */ 190 public Address plus(Offset offset) { 191 return null; 192 } 193 194 /** 195 * Add an <code>Extent</code> to this <code>Address</code>, and 196 * return the sum. 197 * 198 * @param extent the <code>Extent</code> to be added to this 199 * <code>Address</code> 200 * @return An <code>Address</code> instance that reflects the result 201 * of the addition. 202 */ 203 public Address plus(Extent extent) { 204 return null; 205 } 206 207 /** 208 * Subtract an integer from this <code>Address</code>, and return 209 * the result. 210 * 211 * @param v the integer to be subtracted from this 212 * <code>Address</code>. 213 * @return An <code>Address</code> instance that reflects the result 214 * of the subtraction. 215 */ 216 public Address minus(int v) { 217 return null; 218 } 219 220 /** 221 * Subtract an <code>Offset</code> from this <code>Address</code>, and 222 * return the result. 223 * 224 * @param offset the <code>Offset</code> to be subtracted from this 225 * <code>Address</code>. 226 * @return An <code>Address</code> instance that reflects the result 227 * of the subtraction. 228 */ 229 public Address minus(Offset offset) { 230 return null; 231 } 232 233 /** 234 * Subtract an <code>Extent</code> from this <code>Address</code>, and 235 * return the result. 236 * 237 * @param extent the <code>Extent</code> to be subtracted from this 238 * <code>Address</code>. 239 * @return An <code>Address</code> instance that reflects the result 240 * of the subtraction. 241 */ 242 public Address minus(Extent extent) { 243 return null; 244 } 245 246 /** 247 * Compute the difference between two <code>Address</code>es and 248 * return the result. 249 * 250 * @param addr2 the <code>Address</code> to be subtracted from this 251 * <code>Address</code>. 252 * @return An <code>Offset</code> instance that reflects the result 253 * of the subtraction. 254 */ 255 public Offset diff(Address addr2) { 256 return null; 257 } 258 259 /**************************************************************************** 260 * 261 * Boolean operators 262 */ 263 264 /** 265 * Return {@code true} if this <code>Address</code> instance is <i>less 266 * than</i> <code>addr2</code>. 267 * 268 * @param addr2 the <code>Address</code> to be compared to this 269 * <code>Address</code>. 270 * @return {@code true} if this <code>Address</code> instance is <i>less 271 * than</i> <code>addr2</code>. 272 */ 273 public boolean LT(Address addr2) { 274 return false; 275 } 276 277 /** 278 * Return {@code true} if this <code>Address</code> instance is <i>less 279 * than or equal to</i> <code>addr2</code>. 280 * 281 * @param addr2 the <code>Address</code> to be compared to this 282 * <code>Address</code>. 283 * @return {@code true} if this <code>Address</code> instance is <i>less 284 * than or equal to</i> <code>addr2</code>. 285 */ 286 public boolean LE(Address addr2) { 287 return false; 288 } 289 290 /** 291 * Return {@code true} if this <code>Address</code> instance is <i>greater 292 * than</i> <code>addr2</code>. 293 * 294 * @param addr2 the <code>Address</code> to be compared to this 295 * <code>Address</code>. 296 * @return {@code true} if this <code>Address</code> instance is <i>greater 297 * than</i> <code>addr2</code>. 298 */ 299 public boolean GT(Address addr2) { 300 return false; 301 } 302 303 /** 304 * Return {@code true} if this <code>Address</code> instance is <i>greater 305 * than or equal to</i> <code>addr2</code>. 306 * 307 * @param addr2 the <code>Address</code> to be compared to this 308 * <code>Address</code>. 309 * @return {@code true} if this <code>Address</code> instance is <i>greater 310 * than or equal to</i> <code>addr2</code>. 311 */ 312 public boolean GE(Address addr2) { 313 return false; 314 } 315 316 /** 317 * Return {@code true} if this <code>Address</code> instance is <i>equal 318 * to</i> <code>addr2</code>. 319 * 320 * @param addr2 the <code>Address</code> to be compared to this 321 * <code>Address</code>. 322 * @return {@code true} if this <code>Address</code> instance is <i>equal 323 * to</i> <code>addr2</code>. 324 */ 325 public boolean EQ(Address addr2) { 326 return false; 327 } 328 329 /** 330 * Return {@code true} if this <code>Address</code> instance is <i>not equal 331 * to</i> <code>addr2</code>. 332 * 333 * @param addr2 the <code>Address</code> to be compared to this 334 * <code>Address</code>. 335 * @return {@code true} if this <code>Address</code> instance is <i>not 336 * equal to</i> <code>addr2</code>. 337 */ 338 public boolean NE(Address addr2) { 339 return false; 340 } 341 342 /**************************************************************************** 343 * 344 * Software prefetch operators etc 345 */ 346 347 /** 348 * Prefetch a cache-line, architecture-independent 349 */ 350 public void prefetch() { 351 } 352 353 /**************************************************************************** 354 * 355 * Memory access operators 356 */ 357 358 /** 359 * Loads a reference from the memory location pointed to by the 360 * current instance. 361 * 362 * @return the read value 363 */ 364 public ObjectReference loadObjectReference() { 365 return null; 366 } 367 368 /** 369 * Loads a reference from the memory location pointed to by the 370 * current instance. 371 * 372 * @param offset the offset to the value. 373 * @return the read value 374 */ 375 public ObjectReference loadObjectReference(Offset offset) { 376 return null; 377 } 378 379 /** 380 * Loads a byte from the memory location pointed to by the 381 * current instance. 382 * 383 * @return the read value 384 */ 385 public byte loadByte() { 386 return (byte) 0; 387 } 388 389 /** 390 * Loads a byte from the memory location pointed to by the 391 * current instance. 392 * 393 * @param offset the offset to the value. 394 * @return the read value 395 */ 396 public byte loadByte(Offset offset) { 397 return (byte) 0; 398 } 399 400 /** 401 * Loads a char from the memory location pointed to by the 402 * current instance. 403 * 404 * @return the read value 405 */ 406 public char loadChar() { 407 return (char) 0; 408 } 409 410 /** 411 * Loads a char from the memory location pointed to by the 412 * current instance. 413 * 414 * @param offset the offset to the value. 415 * @return the read value 416 */ 417 public char loadChar(Offset offset) { 418 return (char) 0; 419 } 420 421 /** 422 * Loads a short from the memory location pointed to by the 423 * current instance. 424 * 425 * @return the read value 426 */ 427 public short loadShort() { 428 return (short) 0; 429 } 430 431 /** 432 * Loads a short from the memory location pointed to by the 433 * current instance. 434 * 435 * @param offset the offset to the value. 436 * @return the read value 437 */ 438 public short loadShort(Offset offset) { 439 return (short) 0; 440 } 441 442 /** 443 * Loads a float from the memory location pointed to by the 444 * current instance. 445 * 446 * @return the read value 447 */ 448 public float loadFloat() { 449 return 0; 450 } 451 452 /** 453 * Loads a float from the memory location pointed to by the 454 * current instance. 455 * 456 * @param offset the offset to the value. 457 * @return the read value 458 */ 459 public float loadFloat(Offset offset) { 460 return 0; 461 } 462 463 /** 464 * Loads an int from the memory location pointed to by the 465 * current instance. 466 * 467 * @return the read value 468 */ 469 public int loadInt() { 470 return 0; 471 } 472 473 /** 474 * Loads an int from the memory location pointed to by the 475 * current instance. 476 * 477 * @param offset the offset to the value. 478 * @return the read value 479 */ 480 public int loadInt(Offset offset) { 481 return 0; 482 } 483 484 485 /** 486 * Loads a long from the memory location pointed to by the 487 * current instance. 488 * 489 * @return the read value 490 */ 491 public long loadLong() { 492 return 0L; 493 } 494 495 /** 496 * Loads a long from the memory location pointed to by the 497 * current instance. 498 * 499 * @param offset the offset to the value. 500 * @return the read value 501 */ 502 public long loadLong(Offset offset) { 503 return 0L; 504 } 505 506 /** 507 * Loads a double from the memory location pointed to by the 508 * current instance. 509 * 510 * @return the read value 511 */ 512 public double loadDouble() { 513 return 0; 514 } 515 516 /** 517 * Loads a double from the memory location pointed to by the 518 * current instance. 519 * 520 * @param offset the offset to the value. 521 * @return the read value 522 */ 523 public double loadDouble(Offset offset) { 524 return 0; 525 } 526 527 528 /** 529 * Loads an address value from the memory location pointed to by the 530 * current instance. 531 * 532 * @return the read address value. 533 */ 534 public Address loadAddress() { 535 return null; 536 } 537 538 /** 539 * Loads an address value from the memory location pointed to by the 540 * current instance. 541 * 542 * @param offset the offset to the value. 543 * @return the read address value. 544 */ 545 public Address loadAddress(Offset offset) { 546 return null; 547 } 548 549 /** 550 * Loads a word value from the memory location pointed to by the 551 * current instance. 552 * 553 * @return the read word value. 554 */ 555 public Word loadWord() { 556 return null; 557 } 558 559 /** 560 * Loads a word value from the memory location pointed to by the 561 * current instance. 562 * 563 * @param offset the offset to the value. 564 * @return the read word value. 565 */ 566 public Word loadWord(Offset offset) { 567 return null; 568 } 569 570 /** 571 * Stores the address value in the memory location pointed to by the 572 * current instance. 573 * 574 * @param value The address value to store. 575 */ 576 public void store(ObjectReference value) { 577 } 578 579 /** 580 * Stores the object reference value in the memory location pointed 581 * to by the current instance. 582 * 583 * @param value The object reference value to store. 584 * @param offset the offset to the value. 585 */ 586 public void store(ObjectReference value, Offset offset) { 587 } 588 589 /** 590 * Stores the address value in the memory location pointed to by the 591 * current instance. 592 * 593 * @param value The address value to store. 594 */ 595 public void store(Address value) { 596 } 597 598 /** 599 * Stores the address value in the memory location pointed to by the 600 * current instance. 601 * 602 * @param value The address value to store. 603 * @param offset the offset to the value. 604 */ 605 public void store(Address value, Offset offset) { 606 } 607 608 /** 609 * Stores the float value in the memory location pointed to by the 610 * current instance. 611 * 612 * @param value The float value to store. 613 */ 614 public void store(float value) { 615 } 616 617 /** 618 * Stores the float value in the memory location pointed to by the 619 * current instance. 620 * 621 * @param value The float value to store. 622 * @param offset the offset to the value. 623 */ 624 public void store(float value, Offset offset) { 625 } 626 627 /** 628 * Stores the word value in the memory location pointed to by the 629 * current instance. 630 * 631 * @param value The word value to store. 632 */ 633 public void store(Word value) { 634 } 635 636 /** 637 * Stores the word value in the memory location pointed to by the 638 * current instance. 639 * 640 * @param value The word value to store. 641 * @param offset the offset to the value. 642 */ 643 public void store(Word value, Offset offset) { 644 } 645 646 /** 647 * Stores the boolean value in the memory location pointed to by the 648 * current instance. 649 * 650 * @param value The boolean value to store. 651 */ 652 public void store(boolean value) { 653 } 654 655 /** 656 * Stores the boolean value in the memory location pointed to by the 657 * current instance. 658 * 659 * @param value The boolean value to store. 660 * @param offset the offset to the value. 661 */ 662 public void store(boolean value, Offset offset) { 663 } 664 665 /** 666 * Stores the byte value in the memory location pointed to by the 667 * current instance. 668 * 669 * @param value The byte value to store. 670 */ 671 public void store(byte value) { 672 } 673 674 /** 675 * Stores the byte value in the memory location pointed to by the 676 * current instance. 677 * 678 * @param value The byte value to store. 679 * @param offset the offset to the value. 680 */ 681 public void store(byte value, Offset offset) { 682 } 683 684 /** 685 * Stores an int value in memory location pointed to by the 686 * current instance. 687 * 688 * @param value The int value to store. 689 */ 690 public void store(int value) { 691 } 692 693 /** 694 * Stores an int value in memory location pointed to by the 695 * current instance. 696 * 697 * @param value The int value to store. 698 * @param offset the offset to the value. 699 */ 700 public void store(int value, Offset offset) { 701 } 702 703 /** 704 * Stores a double value in memory location pointed to by the 705 * current instance. 706 * 707 * @param value The double value to store. 708 */ 709 public void store(double value) { 710 } 711 712 /** 713 * Stores a double value in memory location pointed to by the 714 * current instance. 715 * 716 * @param value The double value to store. 717 * @param offset the offset to the value. 718 */ 719 public void store(double value, Offset offset) { 720 } 721 722 723 /** 724 * Stores a double value in memory location pointed to by the 725 * current instance. 726 * 727 * @param value The double value to store. 728 */ 729 public void store(long value) { 730 } 731 732 /** 733 * Stores a double value in memory location pointed to by the 734 * current instance. 735 * 736 * @param value The double value to store. 737 * @param offset the offset to the value. 738 */ 739 public void store(long value, Offset offset) { 740 } 741 742 /** 743 * Stores a char value in the memory location pointed to by the 744 * current instance. 745 * 746 * @param value the char value to store. 747 */ 748 public void store(char value) { 749 } 750 751 /** 752 * Stores a char value in the memory location pointed to by the 753 * current instance. 754 * 755 * @param value the char value to store. 756 * @param offset the offset to the value. 757 */ 758 public void store(char value, Offset offset) { 759 } 760 761 /** 762 * Stores a short value in the memory location pointed to by the 763 * current instance. 764 * 765 * @param value the short value to store. 766 */ 767 public void store(short value) { 768 } 769 770 /** 771 * Stores a short value in the memory location pointed to by the 772 * current instance. 773 * 774 * @param value the short value to store. 775 * @param offset the offset to the value. 776 */ 777 public void store(short value, Offset offset) { 778 } 779 780 /**************************************************************************** 781 * 782 * Atomic memory access operators (compare and swap) 783 */ 784 785 /** 786 * Prepare for an atomic store operation. This must be associated with 787 * a related call to attempt. 788 * 789 * @return the old value to be passed to an attempt call. 790 */ 791 public Word prepareWord() { 792 return null; 793 } 794 795 /** 796 * Prepare for an atomic store operation. This must be associated with 797 * a related call to attempt. 798 * 799 * @param offset the offset to the value. 800 * @return the old value to be passed to an attempt call. 801 */ 802 public Word prepareWord(Offset offset) { 803 return null; 804 } 805 806 /** 807 * Prepare for an atomic store operation. This must be associated with 808 * a related call to attempt. 809 * 810 * @return the old value to be passed to an attempt call. 811 */ 812 public ObjectReference prepareObjectReference() { 813 return null; 814 } 815 816 /** 817 * Prepare for an atomic store operation. This must be associated with 818 * a related call to attempt. 819 * 820 * @param offset the offset to the value. 821 * @return the old value to be passed to an attempt call. 822 */ 823 public ObjectReference prepareObjectReference(Offset offset) { 824 return null; 825 } 826 827 /** 828 * Prepare for an atomic store operation. This must be associated with 829 * a related call to attempt. 830 * 831 * @return the old value to be passed to an attempt call. 832 */ 833 public Address prepareAddress() { 834 return null; 835 } 836 837 /** 838 * Prepare for an atomic store operation. This must be associated with 839 * a related call to attempt. 840 * 841 * @param offset the offset to the value. 842 * @return the old value to be passed to an attempt call. 843 */ 844 public Address prepareAddress(Offset offset) { 845 return null; 846 } 847 848 /** 849 * Prepare for an atomic store operation. This must be associated with 850 * a related call to attempt. 851 * 852 * @return the old value to be passed to an attempt call. 853 */ 854 public int prepareInt() { 855 return 0; 856 } 857 858 /** 859 * Prepare for an atomic store operation. This must be associated with 860 * a related call to attempt. 861 * 862 * @param offset the offset to the value. 863 * @return the old value to be passed to an attempt call. 864 */ 865 public int prepareInt(Offset offset) { 866 return 0; 867 } 868 869 /** 870 * Attempt an atomic store operation. This must be associated with a 871 * related call to prepare. 872 * 873 * @param old the old value. 874 * @param value the new value. 875 * @return {@code true} if the attempt was successful. 876 */ 877 public boolean attempt(int old, int value) { 878 return false; 879 } 880 881 /** 882 * Attempt an atomic store operation. This must be associated with a 883 * related call to prepare. 884 * 885 * @param old the old value. 886 * @param value the new value. 887 * @param offset the offset to the value. 888 * @return {@code true} if the attempt was successful. 889 */ 890 public boolean attempt(int old, int value, Offset offset) { 891 return false; 892 } 893 894 /** 895 * Attempt an atomic store operation. This must be associated with a 896 * related call to prepare. 897 * 898 * @param old the old value. 899 * @param value the new value. 900 * @return {@code true} if the attempt was successful. 901 */ 902 public boolean attempt(Word old, Word value) { 903 return false; 904 } 905 906 /** 907 * Attempt an atomic store operation. This must be associated with a 908 * related call to prepare. 909 * 910 * @param old the old value. 911 * @param value the new value. 912 * @param offset the offset to the value. 913 * @return {@code true} if the attempt was successful. 914 */ 915 public boolean attempt(Word old, Word value, Offset offset) { 916 return false; 917 } 918 919 /** 920 * Attempt an atomic store operation. This must be associated with a 921 * related call to prepare. 922 * 923 * @param old the old value. 924 * @param value the new value. 925 * @return {@code true} if the attempt was successful. 926 */ 927 public boolean attempt(ObjectReference old, ObjectReference value) { 928 return false; 929 } 930 931 /** 932 * Attempt an atomic store operation. This must be associated with a 933 * related call to prepare. 934 * 935 * @param old the old value. 936 * @param value the new value. 937 * @param offset the offset to the value. 938 * @return {@code true} if the attempt was successful. 939 */ 940 public boolean attempt(ObjectReference old, ObjectReference value, 941 Offset offset) { 942 return false; 943 } 944 945 /** 946 * Attempt an atomic store operation. This must be associated with a 947 * related call to prepare. 948 * 949 * @param old the old value. 950 * @param value the new value. 951 * @return {@code true} if the attempt was successful. 952 */ 953 public boolean attempt(Address old, Address value) { 954 return false; 955 } 956 957 /** 958 * Attempt an atomic store operation. This must be associated with a 959 * related call to prepare. 960 * 961 * @param old the old value. 962 * @param value the new value. 963 * @param offset the offset to the value. 964 * @return {@code true} if the attempt was successful. 965 */ 966 public boolean attempt(Address old, Address value, Offset offset) { 967 return false; 968 } 969 970 }