|
1639 | 1639 | (rule -1
|
1640 | 1640 | ;;
|
1641 | 1641 | (lower
|
1642 |
| - (has_type (valid_atomic_transaction ty) (atomic_rmw flags op addr x))) |
| 1642 | + (has_type (valid_atomic_transaction ty) (atomic_rmw (little_or_native_endian flags) op addr x))) |
1643 | 1643 | (gen_atomic (get_atomic_rmw_op ty op) addr x (atomic_amo)))
|
1644 | 1644 |
|
1645 | 1645 | ;;; for I8 and I16
|
1646 | 1646 | (rule 1
|
1647 | 1647 | (lower
|
1648 |
| - (has_type (valid_atomic_transaction (fits_in_16 ty)) (atomic_rmw flags op addr x))) |
| 1648 | + (has_type (valid_atomic_transaction (fits_in_16 ty)) (atomic_rmw (little_or_native_endian flags) op addr x))) |
1649 | 1649 | (gen_atomic_rmw_loop op ty addr x))
|
1650 | 1650 |
|
1651 | 1651 | ;;;special for I8 and I16 max min etc.
|
1652 | 1652 | ;;;because I need uextend or sextend the value.
|
1653 | 1653 | (rule 2
|
1654 | 1654 | (lower
|
1655 |
| - (has_type (valid_atomic_transaction (fits_in_16 ty)) (atomic_rmw flags (is_atomic_rmw_max_etc op true) addr x))) |
| 1655 | + (has_type (valid_atomic_transaction (fits_in_16 ty)) (atomic_rmw (little_or_native_endian flags) (is_atomic_rmw_max_etc op true) addr x))) |
1656 | 1656 | (gen_atomic_rmw_loop op ty addr (sext x)))
|
1657 | 1657 |
|
1658 | 1658 |
|
1659 | 1659 | (rule 2
|
1660 | 1660 | ;;
|
1661 | 1661 | (lower
|
1662 |
| - (has_type (valid_atomic_transaction (fits_in_16 ty)) (atomic_rmw flags (is_atomic_rmw_max_etc op false) addr x))) |
| 1662 | + (has_type (valid_atomic_transaction (fits_in_16 ty)) (atomic_rmw (little_or_native_endian flags) (is_atomic_rmw_max_etc op false) addr x))) |
1663 | 1663 | ;;
|
1664 | 1664 | (gen_atomic_rmw_loop op ty addr (zext x)))
|
1665 | 1665 |
|
1666 | 1666 | ;;;;; Rules for `AtomicRmwOp.Sub`
|
1667 | 1667 | (rule
|
1668 | 1668 | (lower
|
1669 |
| - (has_type (valid_atomic_transaction ty) (atomic_rmw flags (AtomicRmwOp.Sub) addr x))) |
| 1669 | + (has_type (valid_atomic_transaction ty) (atomic_rmw (little_or_native_endian flags) (AtomicRmwOp.Sub) addr x))) |
1670 | 1670 | (let
|
1671 | 1671 | ((tmp WritableReg (temp_writable_reg ty))
|
1672 | 1672 | (x2 Reg (rv_neg x)))
|
|
1684 | 1684 | ;;;;; Rules for `AtomicRmwOp.Nand`
|
1685 | 1685 | (rule
|
1686 | 1686 | (lower
|
1687 |
| - (has_type (valid_atomic_transaction ty) (atomic_rmw flags (AtomicRmwOp.Nand) addr x))) |
| 1687 | + (has_type (valid_atomic_transaction ty) (atomic_rmw (little_or_native_endian flags) (AtomicRmwOp.Nand) addr x))) |
1688 | 1688 | (gen_atomic_rmw_loop (AtomicRmwOp.Nand) ty addr x))
|
1689 | 1689 |
|
1690 | 1690 | (decl is_atomic_rmw_max_etc (AtomicRmwOp bool) AtomicRmwOp)
|
1691 | 1691 | (extern extractor is_atomic_rmw_max_etc is_atomic_rmw_max_etc)
|
1692 | 1692 |
|
1693 | 1693 | ;;;;; Rules for `atomic load`;;;;;;;;;;;;;;;;;
|
1694 | 1694 | (rule
|
1695 |
| - (lower (has_type (valid_atomic_transaction ty) (atomic_load flags p))) |
| 1695 | + (lower (has_type (valid_atomic_transaction ty) (atomic_load (little_or_native_endian flags) p))) |
1696 | 1696 | (gen_atomic_load p ty))
|
1697 | 1697 |
|
1698 | 1698 |
|
1699 | 1699 | ;;;;; Rules for `atomic store`;;;;;;;;;;;;;;;;;
|
1700 | 1700 | (rule
|
1701 |
| - (lower (atomic_store flags src @ (value_type (valid_atomic_transaction ty)) p)) |
| 1701 | + (lower (atomic_store (little_or_native_endian flags) src @ (value_type (valid_atomic_transaction ty)) p)) |
1702 | 1702 | (gen_atomic_store p ty src))
|
1703 | 1703 |
|
1704 | 1704 | (decl gen_atomic_offset (XReg Type) XReg)
|
|
1718 | 1718 |
|
1719 | 1719 | ;;;;; Rules for `atomic cas`;;;;;;;;;;;;;;;;;
|
1720 | 1720 | (rule
|
1721 |
| - (lower (has_type (valid_atomic_transaction ty) (atomic_cas flags p e x))) |
| 1721 | + (lower (has_type (valid_atomic_transaction ty) (atomic_cas (little_or_native_endian flags) p e x))) |
1722 | 1722 | (let
|
1723 | 1723 | ((t0 WritableReg (temp_writable_reg ty))
|
1724 | 1724 | (dst WritableReg (temp_writable_reg ty))
|
|
2105 | 2105 | (gen_trapif cc x y code))
|
2106 | 2106 |
|
2107 | 2107 | ;;;;; Rules for `uload8`;;;;;;;;;
|
2108 |
| -(rule (lower (uload8 flags addr offset)) |
| 2108 | +(rule (lower (uload8 (little_or_native_endian flags) addr offset)) |
2109 | 2109 | (gen_load (amode addr offset) (LoadOP.Lbu) flags))
|
2110 | 2110 |
|
2111 | 2111 | ;;;;; Rules for `sload8`;;;;;;;;;
|
2112 |
| -(rule (lower (sload8 flags addr offset)) |
| 2112 | +(rule (lower (sload8 (little_or_native_endian flags) addr offset)) |
2113 | 2113 | (gen_load (amode addr offset) (LoadOP.Lb) flags))
|
2114 | 2114 |
|
2115 | 2115 | ;;;;; Rules for `uload16`;;;;;;;;;
|
2116 |
| -(rule (lower (uload16 flags addr offset)) |
| 2116 | +(rule (lower (uload16 (little_or_native_endian flags) addr offset)) |
2117 | 2117 | (gen_load (amode addr offset) (LoadOP.Lhu) flags))
|
2118 | 2118 |
|
2119 | 2119 | ;;;;; Rules for `iload16`;;;;;;;;;
|
2120 |
| -(rule (lower (sload16 flags addr offset)) |
| 2120 | +(rule (lower (sload16 (little_or_native_endian flags) addr offset)) |
2121 | 2121 | (gen_load (amode addr offset) (LoadOP.Lh) flags))
|
2122 | 2122 |
|
2123 | 2123 | ;;;;; Rules for `uload32`;;;;;;;;;
|
2124 |
| -(rule (lower (uload32 flags addr offset)) |
| 2124 | +(rule (lower (uload32 (little_or_native_endian flags) addr offset)) |
2125 | 2125 | (gen_load (amode addr offset) (LoadOP.Lwu) flags))
|
2126 | 2126 |
|
2127 | 2127 | ;;;;; Rules for `sload32`;;;;;;;;;
|
2128 |
| -(rule (lower (sload32 flags addr offset)) |
| 2128 | +(rule (lower (sload32 (little_or_native_endian flags) addr offset)) |
2129 | 2129 | (gen_load (amode addr offset) (LoadOP.Lw) flags))
|
2130 | 2130 |
|
2131 | 2131 | ;;;;; Rules for `load`;;;;;;;;;
|
2132 |
| -(rule (lower (has_type ty (load flags addr offset))) |
| 2132 | +(rule (lower (has_type ty (load (little_or_native_endian flags) addr offset))) |
2133 | 2133 | (gen_load (amode addr offset) (load_op ty) flags))
|
2134 | 2134 |
|
2135 |
| -(rule 1 (lower (has_type (ty_reg_pair _) (load flags addr offset))) |
| 2135 | +(rule 1 (lower (has_type (ty_reg_pair _) (load (little_or_native_endian flags) addr offset))) |
2136 | 2136 | (if-let offset_plus_8 (s32_add_fallible offset 8))
|
2137 | 2137 | (let ((lo XReg (gen_load (amode addr offset) (LoadOP.Ld) flags))
|
2138 | 2138 | (hi XReg (gen_load (amode addr offset_plus_8) (LoadOP.Ld) flags)))
|
2139 | 2139 | (value_regs lo hi)))
|
2140 | 2140 |
|
2141 |
| -(rule 2 (lower (has_type (ty_supported_vec ty) (load flags addr offset))) |
| 2141 | +(rule 2 (lower (has_type (ty_supported_vec ty) (load (little_or_native_endian flags) addr offset))) |
2142 | 2142 | (let ((eew VecElementWidth (element_width_from_type ty))
|
2143 | 2143 | (amode AMode (amode addr offset)))
|
2144 | 2144 | (vec_load eew (VecAMode.UnitStride amode) flags (unmasked) ty)))
|
|
2165 | 2165 | (rv_vzext_vf2 loaded (unmasked) ty)))
|
2166 | 2166 |
|
2167 | 2167 | ;;;;; Rules for `uload8x8`;;;;;;;;;;
|
2168 |
| -(rule (lower (has_type (ty_supported_vec ty @ $I16X8) (uload8x8 flags addr offset))) |
| 2168 | +(rule (lower (has_type (ty_supported_vec ty @ $I16X8) (uload8x8 (little_or_native_endian flags) addr offset))) |
2169 | 2169 | (gen_load64_extend ty (ExtendOp.Zero) flags (amode addr offset)))
|
2170 | 2170 |
|
2171 | 2171 | ;;;;; Rules for `uload16x4`;;;;;;;;;
|
2172 |
| -(rule (lower (has_type (ty_supported_vec ty @ $I32X4) (uload16x4 flags addr offset))) |
| 2172 | +(rule (lower (has_type (ty_supported_vec ty @ $I32X4) (uload16x4 (little_or_native_endian flags) addr offset))) |
2173 | 2173 | (gen_load64_extend ty (ExtendOp.Zero) flags (amode addr offset)))
|
2174 | 2174 |
|
2175 | 2175 | ;;;;; Rules for `uload32x2`;;;;;;;;;
|
2176 |
| -(rule (lower (has_type (ty_supported_vec ty @ $I64X2) (uload32x2 flags addr offset))) |
| 2176 | +(rule (lower (has_type (ty_supported_vec ty @ $I64X2) (uload32x2 (little_or_native_endian flags) addr offset))) |
2177 | 2177 | (gen_load64_extend ty (ExtendOp.Zero) flags (amode addr offset)))
|
2178 | 2178 |
|
2179 | 2179 | ;;;;; Rules for `sload8x8`;;;;;;;;;;
|
2180 |
| -(rule (lower (has_type (ty_supported_vec ty @ $I16X8) (sload8x8 flags addr offset))) |
| 2180 | +(rule (lower (has_type (ty_supported_vec ty @ $I16X8) (sload8x8 (little_or_native_endian flags) addr offset))) |
2181 | 2181 | (gen_load64_extend ty (ExtendOp.Signed) flags (amode addr offset)))
|
2182 | 2182 |
|
2183 | 2183 | ;;;;; Rules for `sload16x4`;;;;;;;;;
|
2184 |
| -(rule (lower (has_type (ty_supported_vec ty @ $I32X4) (sload16x4 flags addr offset))) |
| 2184 | +(rule (lower (has_type (ty_supported_vec ty @ $I32X4) (sload16x4 (little_or_native_endian flags) addr offset))) |
2185 | 2185 | (gen_load64_extend ty (ExtendOp.Signed) flags (amode addr offset)))
|
2186 | 2186 |
|
2187 | 2187 | ;;;;; Rules for `sload32x2`;;;;;;;;;
|
2188 |
| -(rule (lower (has_type (ty_supported_vec ty @ $I64X2) (sload32x2 flags addr offset))) |
| 2188 | +(rule (lower (has_type (ty_supported_vec ty @ $I64X2) (sload32x2 (little_or_native_endian flags) addr offset))) |
2189 | 2189 | (gen_load64_extend ty (ExtendOp.Signed) flags (amode addr offset)))
|
2190 | 2190 |
|
2191 | 2191 | ;;;;; Rules for `istore8`;;;;;;;;;
|
2192 |
| -(rule (lower (istore8 flags src addr offset)) |
| 2192 | +(rule (lower (istore8 (little_or_native_endian flags) src addr offset)) |
2193 | 2193 | (rv_store (amode addr offset) (StoreOP.Sb) flags src))
|
2194 | 2194 |
|
2195 | 2195 | ;;;;; Rules for `istore16`;;;;;;;;;
|
2196 |
| -(rule (lower (istore16 flags src addr offset)) |
| 2196 | +(rule (lower (istore16 (little_or_native_endian flags) src addr offset)) |
2197 | 2197 | (rv_store (amode addr offset) (StoreOP.Sh) flags src))
|
2198 | 2198 |
|
2199 | 2199 | ;;;;; Rules for `istore32`;;;;;;;;;
|
2200 |
| -(rule (lower (istore32 flags src addr offset)) |
| 2200 | +(rule (lower (istore32 (little_or_native_endian flags) src addr offset)) |
2201 | 2201 | (rv_store (amode addr offset) (StoreOP.Sw) flags src))
|
2202 | 2202 |
|
2203 | 2203 | ;;;;; Rules for `store`;;;;;;;;;
|
2204 |
| -(rule (lower (store flags src @ (value_type ty) addr offset)) |
| 2204 | +(rule (lower (store (little_or_native_endian flags) src @ (value_type ty) addr offset)) |
2205 | 2205 | (gen_store (amode addr offset) flags src))
|
2206 | 2206 |
|
2207 |
| -(rule 1 (lower (store flags src @ (value_type (ty_reg_pair _)) addr offset)) |
| 2207 | +(rule 1 (lower (store (little_or_native_endian flags) src @ (value_type (ty_reg_pair _)) addr offset)) |
2208 | 2208 | (if-let offset_plus_8 (s32_add_fallible offset 8))
|
2209 | 2209 | (let ((_ InstOutput (rv_store (amode addr offset) (StoreOP.Sd) flags (value_regs_get src 0))))
|
2210 | 2210 | (rv_store (amode addr offset_plus_8) (StoreOP.Sd) flags (value_regs_get src 1))))
|
2211 | 2211 |
|
2212 |
| -(rule 2 (lower (store flags src @ (value_type (ty_supported_vec ty)) addr offset)) |
| 2212 | +(rule 2 (lower (store (little_or_native_endian flags) src @ (value_type (ty_supported_vec ty)) addr offset)) |
2213 | 2213 | (let ((eew VecElementWidth (element_width_from_type ty))
|
2214 | 2214 | (amode AMode (amode addr offset)))
|
2215 | 2215 | (vec_store eew (VecAMode.UnitStride amode) src flags (unmasked) ty)))
|
2216 | 2216 |
|
2217 | 2217 | ;; Avoid unnecessary moves to floating point registers for `F16` memory to memory copies when
|
2218 | 2218 | ;; `Zfhmin` is unavailable.
|
2219 |
| -(rule 3 (lower (store store_flags (sinkable_load inst $F16 load_flags load_addr load_offset) store_addr store_offset)) |
| 2219 | +(rule 3 (lower (store (little_or_native_endian store_flags) |
| 2220 | + (sinkable_load inst $F16 (little_or_native_endian load_flags) load_addr load_offset) store_addr store_offset)) |
2220 | 2221 | (if-let false (has_zfhmin))
|
2221 | 2222 | (rv_store (amode store_addr store_offset) (StoreOP.Sh) store_flags (gen_sunk_load inst (amode load_addr load_offset) (LoadOP.Lh) load_flags)))
|
2222 | 2223 |
|
|
0 commit comments