|
1008 | 1008 | (rd WritableReg) |
1009 | 1009 | (mem MemArg)) |
1010 | 1010 |
|
| 1011 | + ;; Load address referenced by `mem` into `rd`. |
| 1012 | + (LoadIndexedAddr |
| 1013 | + (rd WritableReg) |
| 1014 | + (base Reg) |
| 1015 | + (index Reg) |
| 1016 | + (offset SImm20) |
| 1017 | + (size u8)) |
| 1018 | + |
| 1019 | + ;; Load address referenced by `mem` into `rd`. |
| 1020 | + (LoadLogicalIndexedAddr |
| 1021 | + (rd WritableReg) |
| 1022 | + (base Reg) |
| 1023 | + (index Reg) |
| 1024 | + (offset SImm20) |
| 1025 | + (size u8)) |
| 1026 | + |
1011 | 1027 | ;; Meta-instruction to emit a loop around a sequence of instructions. |
1012 | 1028 | ;; This control flow is not visible to the compiler core, in particular |
1013 | 1029 | ;; the register allocator. Therefore, instructions in the loop may not |
|
1774 | 1790 | (decl uimm16shifted_from_value (UImm16Shifted) Value) |
1775 | 1791 | (extern extractor uimm16shifted_from_value uimm16shifted_from_value) |
1776 | 1792 |
|
| 1793 | +(decl simm20_from_value (SImm20) Value) |
| 1794 | +(extern extractor simm20_from_value simm20_from_value) |
| 1795 | + |
1777 | 1796 | (decl uimm32shifted_from_value (UImm32Shifted) Value) |
1778 | 1797 | (extern extractor uimm32shifted_from_value uimm32shifted_from_value) |
1779 | 1798 |
|
|
1927 | 1946 | (if-let final_offset (memarg_symbol_offset_sum offset sym_offset)) |
1928 | 1947 | (memarg_symbol name final_offset flags)) |
1929 | 1948 |
|
| 1949 | +(rule 2 (lower_address flags (has_type (mie4_enabled) |
| 1950 | + (iadd $I64 (ishl $I64 (uextend $I64 (iadd $I32 x (simm20_from_value z))) |
| 1951 | + (u8_from_value shift)) y)) (i64_from_offset offset)) |
| 1952 | + (memarg_reg_plus_off (load_logical_indexed_addr x y z shift) offset 0 flags)) |
| 1953 | + |
| 1954 | +(rule 3 (lower_address flags (has_type (mie4_enabled) |
| 1955 | + (iadd $I64 y (ishl $I64 (uextend $I64 (iadd $I32 x (simm20_from_value z))) |
| 1956 | + (u8_from_value shift)))) (i64_from_offset offset)) |
| 1957 | + (memarg_reg_plus_off (load_logical_indexed_addr y x z shift) offset 0 flags)) |
| 1958 | + |
| 1959 | +(rule 4 (lower_address flags (has_type (mie4_enabled) |
| 1960 | + (iadd $I64 (ishl $I64 (sextend $I64 (iadd $I32 x (simm20_from_value z))) (u8_from_value shift)) y)) (i64_from_offset offset)) |
| 1961 | + (memarg_reg_plus_off (load_indexed_addr x y z shift) offset 0 flags)) |
| 1962 | + |
| 1963 | +(rule 5 (lower_address flags (has_type (mie4_enabled) |
| 1964 | + (iadd $I64 y (ishl $I64 (sextend $I64 (iadd $I32 x (simm20_from_value z))) (u8_from_value shift)))) (i64_from_offset offset)) |
| 1965 | + (memarg_reg_plus_off (load_indexed_addr y x z shift) offset 0 flags)) |
1930 | 1966 |
|
1931 | 1967 | ;; Lower an address plus a small bias into a `MemArg`. |
1932 | 1968 |
|
|
2817 | 2853 | (_ Unit (emit (MInst.LoadAddr dst mem)))) |
2818 | 2854 | dst)) |
2819 | 2855 |
|
| 2856 | +;; Helper for emitting `MInst.LoadIndexedAddr` instructions. |
| 2857 | +(decl load_indexed_addr (Reg Reg SImm20 u8) Reg) |
| 2858 | +(rule (load_indexed_addr base index offset size) |
| 2859 | + (let ((dst WritableReg (temp_writable_reg $I64)) |
| 2860 | + (_ Unit (emit (MInst.LoadIndexedAddr dst base index offset size)))) |
| 2861 | + dst)) |
| 2862 | + |
| 2863 | +;; Helper for emitting `MInst.LoadLogicalIndexedAddr` instructions. |
| 2864 | +(decl load_logical_indexed_addr (Reg Reg SImm20 u8) Reg) |
| 2865 | +(rule (load_logical_indexed_addr base index offset size) |
| 2866 | + (let ((dst WritableReg (temp_writable_reg $I64)) |
| 2867 | + (_ Unit (emit (MInst.LoadLogicalIndexedAddr dst base index offset size)))) |
| 2868 | + dst)) |
| 2869 | + |
2820 | 2870 | ;; Helper for emitting `MInst.Call` instructions. |
2821 | 2871 | (decl call_impl (WritableReg BoxCallInfo) SideEffectNoResult) |
2822 | 2872 | (rule (call_impl reg info) |
|
0 commit comments