|
3844 | 3844 | (add_logical_mem_zext32_with_flags_paired ty y (sink_uload32 x))
|
3845 | 3845 | (trap_if_impl (mask_as_cond 3) tc)))
|
3846 | 3846 |
|
| 3847 | +;;;; Rules for `uadd_overflow` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
| 3848 | + |
| 3849 | +; options: |
| 3850 | +; 1. add BO (branch on overflow) to the backend |
| 3851 | +; 2. find how I can get and use the flags from a ProducesFlags instruction |
| 3852 | + |
| 3853 | +(rule 0 (lower (has_type (fits_in_64 ty) (uadd_overflow x y))) |
| 3854 | + (let ((one Reg (imm $I8 1)) |
| 3855 | + (overflow Reg (select_bool_reg ty (bool (add_logical_reg_with_flags_paired ty x y) (mask_as_cond 3)) one (zero_reg)))) |
| 3856 | + (value_reg overflow))) |
| 3857 | + |
| 3858 | +(rule 4 (lower (has_type (fits_in_64 ty) (uadd_overflow x (zext32_value y)))) |
| 3859 | + (let ((one Reg (imm $I8 1)) |
| 3860 | + (overflow Reg (select_bool_reg ty (bool (add_logical_reg_zext32_with_flags_paired ty x y) (mask_as_cond 3)) one (zero_reg)))) |
| 3861 | + (value_reg overflow))) |
| 3862 | + |
| 3863 | +(rule 8 (lower (has_type (fits_in_64 ty) (uadd_overflow (zext32_value x) y))) |
| 3864 | + (let ((one Reg (imm $I8 1)) |
| 3865 | + (overflow Reg (select_bool_reg ty (bool (add_logical_reg_zext32_with_flags_paired ty y x) (mask_as_cond 3)) one (zero_reg)))) |
| 3866 | + (value_reg overflow))) |
| 3867 | + |
| 3868 | +(rule 3 (lower (has_type (fits_in_64 ty) (uadd_overflow x (u32_from_value y)))) |
| 3869 | + (let ((one Reg (imm $I8 1)) |
| 3870 | + (overflow Reg (select_bool_reg ty (bool (add_logical_zimm32_with_flags_paired ty x y) (mask_as_cond 3)) one (zero_reg)))) |
| 3871 | + (value_reg overflow))) |
| 3872 | + |
| 3873 | +(rule 7 (lower (has_type (fits_in_64 ty) (uadd_overflow (u32_from_value x) y))) |
| 3874 | + (let ((one Reg (imm $I8 1)) |
| 3875 | + (overflow Reg (select_bool_reg ty (bool (add_logical_zimm32_with_flags_paired ty y x) (mask_as_cond 3)) one (zero_reg)))) |
| 3876 | + (value_reg overflow))) |
| 3877 | + |
| 3878 | +(rule 2 (lower (has_type (fits_in_64 ty) (uadd_overflow x (sinkable_load_32_64 y)))) |
| 3879 | + (let ((one Reg (imm $I8 1)) |
| 3880 | + (overflow Reg (select_bool_reg ty (bool (add_logical_mem_with_flags_paired ty x (sink_load y)) (mask_as_cond 3)) one (zero_reg)))) |
| 3881 | + (value_reg overflow))) |
| 3882 | + |
| 3883 | +(rule 6 (lower (has_type (fits_in_64 ty) (uadd_overflow (sinkable_load_32_64 x) y))) |
| 3884 | + (let ((one Reg (imm $I8 1)) |
| 3885 | + (overflow Reg (select_bool_reg ty (bool (add_logical_mem_with_flags_paired ty y (sink_load x)) (mask_as_cond 3)) one (zero_reg)))) |
| 3886 | + (value_reg overflow))) |
| 3887 | + |
| 3888 | +(rule 1 (lower (has_type (fits_in_64 ty) (uadd_overflow x (sinkable_uload32 y)))) |
| 3889 | + (let ((one Reg (imm $I8 1)) |
| 3890 | + (overflow Reg (select_bool_reg ty (bool (add_logical_mem_zext32_with_flags_paired ty x (sink_uload32 y)) (mask_as_cond 3)) one (zero_reg)))) |
| 3891 | + (value_reg overflow))) |
| 3892 | + |
| 3893 | +(rule 5 (lower (has_type (fits_in_64 ty) (uadd_overflow (sinkable_uload32 x) y))) |
| 3894 | + (let ((one Reg (imm $I8 1)) |
| 3895 | + (overflow Reg (select_bool_reg ty (bool (add_logical_mem_zext32_with_flags_paired ty y (sink_uload32 x)) (mask_as_cond 3)) one (zero_reg)))) |
| 3896 | + (value_reg overflow))) |
| 3897 | + |
3847 | 3898 | ;;;; Rules for `return` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
3848 | 3899 |
|
3849 | 3900 | (rule (lower (return args))
|
|
0 commit comments