|
409 | 409 | (res_hi Reg (add_reg $I64 res_hi_3 (add_reg $I64 res_hi_2 res_hi_1))))
|
410 | 410 | (mov_to_vec128 $I64X2 res_hi res_lo)))
|
411 | 411 |
|
| 412 | +;;;; Rules for `umul_overflow` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
| 413 | + |
| 414 | +(rule 0 (lower (has_type (fits_in_64 ty) (smul_overflow x y))) |
| 415 | + (let ((one Reg (imm $I8 1)) |
| 416 | + (overflow Reg (select_bool_reg ty (bool (mul_reg_with_flags_paired ty x y) (mask_as_cond 3)) one (zero_reg)))) |
| 417 | + (value_reg overflow))) |
| 418 | + |
| 419 | +(rule 1 (lower (has_type (fits_in_64 ty) (smul_overflow x (sext32_value y)))) |
| 420 | + (let ((one Reg (imm $I8 1)) |
| 421 | + (overflow Reg (select_bool_reg ty (bool (mul_reg_sext32_with_flags_paired ty x y) (mask_as_cond 3)) one (zero_reg)))) |
| 422 | + (value_reg overflow))) |
| 423 | + |
| 424 | +(rule 2 (lower (has_type (fits_in_64 ty) (smul_overflow (sext32_value x) y))) |
| 425 | + (let ((one Reg (imm $I8 1)) |
| 426 | + (overflow Reg (select_bool_reg ty (bool (mul_reg_sext32_with_flags_paired ty y x) (mask_as_cond 3)) one (zero_reg)))) |
| 427 | + (value_reg overflow))) |
| 428 | + |
| 429 | +(rule 3 (lower (has_type (fits_in_64 ty) (smul_overflow x (i16_from_value y)))) |
| 430 | + (let ((one Reg (imm $I8 1)) |
| 431 | + (overflow Reg (select_bool_reg ty (bool (mul_simm16_with_flags_paired ty x y) (mask_as_cond 3)) one (zero_reg)))) |
| 432 | + (value_reg overflow))) |
| 433 | + |
| 434 | +(rule 4 (lower (has_type (fits_in_64 ty) (smul_overflow (i16_from_value x) y))) |
| 435 | + (let ((one Reg (imm $I8 1)) |
| 436 | + (overflow Reg (select_bool_reg ty (bool (mul_simm16_with_flags_paired ty y x) (mask_as_cond 3)) one (zero_reg)))) |
| 437 | + (value_reg overflow))) |
| 438 | + |
| 439 | +(rule 5 (lower (has_type (fits_in_64 ty) (smul_overflow x (i32_from_value y)))) |
| 440 | + (let ((one Reg (imm $I8 1)) |
| 441 | + (overflow Reg (select_bool_reg ty (bool (mul_simm32_with_flags_paired ty x y) (mask_as_cond 3)) one (zero_reg)))) |
| 442 | + (value_reg overflow))) |
| 443 | + |
| 444 | +(rule 6 (lower (has_type (fits_in_64 ty) (smul_overflow (i32_from_value x) y))) |
| 445 | + (let ((one Reg (imm $I8 1)) |
| 446 | + (overflow Reg (select_bool_reg ty (bool (mul_simm32_with_flags_paired ty y x) (mask_as_cond 3)) one (zero_reg)))) |
| 447 | + (value_reg overflow))) |
| 448 | + |
| 449 | +(rule 7 (lower (has_type (fits_in_64 ty) (smul_overflow x (sinkable_load_32_64 y)))) |
| 450 | + (let ((one Reg (imm $I8 1)) |
| 451 | + (overflow Reg (select_bool_reg ty (bool (mul_mem_with_flags_paired ty x (sink_load y)) (mask_as_cond 3)) one (zero_reg)))) |
| 452 | + (value_reg overflow))) |
| 453 | + |
| 454 | +(rule 8 (lower (has_type (fits_in_64 ty) (smul_overflow (sinkable_load_32_64 x) y))) |
| 455 | + (let ((one Reg (imm $I8 1)) |
| 456 | + (overflow Reg (select_bool_reg ty (bool (mul_mem_with_flags_paired ty y (sink_load x)) (mask_as_cond 3)) one (zero_reg)))) |
| 457 | + (value_reg overflow))) |
| 458 | + |
| 459 | +(rule 9 (lower (has_type (fits_in_64 ty) (smul_overflow x (sinkable_load_16 y)))) |
| 460 | + (let ((one Reg (imm $I8 1)) |
| 461 | + (overflow Reg (select_bool_reg ty (bool (mul_mem_sext16_with_flags_paired ty x (sink_load y)) (mask_as_cond 3)) one (zero_reg)))) |
| 462 | + (value_reg overflow))) |
| 463 | + |
| 464 | +(rule 10 (lower (has_type (fits_in_64 ty) (smul_overflow (sinkable_load_16 x) y))) |
| 465 | + (let ((one Reg (imm $I8 1)) |
| 466 | + (overflow Reg (select_bool_reg ty (bool (mul_mem_sext16_with_flags_paired ty y (sink_load x)) (mask_as_cond 3)) one (zero_reg)))) |
| 467 | + (value_reg overflow))) |
| 468 | + |
| 469 | +(rule 11 (lower (has_type (fits_in_64 ty) (smul_overflow x (sinkable_sload16 y)))) |
| 470 | + (let ((one Reg (imm $I8 1)) |
| 471 | + (overflow Reg (select_bool_reg ty (bool (mul_mem_sext16_with_flags_paired ty x (sink_sload16 y)) (mask_as_cond 3)) one (zero_reg)))) |
| 472 | + (value_reg overflow))) |
| 473 | + |
| 474 | +(rule 12 (lower (has_type (fits_in_64 ty) (smul_overflow (sinkable_sload16 x) y))) |
| 475 | + (let ((one Reg (imm $I8 1)) |
| 476 | + (overflow Reg (select_bool_reg ty (bool (mul_mem_sext16_with_flags_paired ty y (sink_sload16 x)) (mask_as_cond 3)) one (zero_reg)))) |
| 477 | + (value_reg overflow))) |
| 478 | + |
| 479 | +(rule 13 (lower (has_type (fits_in_64 ty) (smul_overflow x (sinkable_sload32 y)))) |
| 480 | + (let ((one Reg (imm $I8 1)) |
| 481 | + (overflow Reg (select_bool_reg ty (bool (mul_mem_sext32_with_flags_paired ty x (sink_sload32 y)) (mask_as_cond 3)) one (zero_reg)))) |
| 482 | + (value_reg overflow))) |
| 483 | + |
| 484 | +(rule 14 (lower (has_type (fits_in_64 ty) (smul_overflow (sinkable_sload32 x) y))) |
| 485 | + (let ((one Reg (imm $I8 1)) |
| 486 | + (overflow Reg (select_bool_reg ty (bool (mul_mem_sext32_with_flags_paired ty y (sink_sload32 x)) (mask_as_cond 3)) one (zero_reg)))) |
| 487 | + (value_reg overflow))) |
| 488 | + |
412 | 489 |
|
413 | 490 | ;;;; Rules for `umulhi` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
414 | 491 |
|
|
3844 | 3921 | (add_logical_mem_zext32_with_flags_paired ty y (sink_uload32 x))
|
3845 | 3922 | (trap_if_impl (mask_as_cond 3) tc)))
|
3846 | 3923 |
|
| 3924 | +;;;; Rules for `uadd_overflow` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
| 3925 | + |
| 3926 | +(rule 0 (lower (has_type (fits_in_64 ty) (uadd_overflow x y))) |
| 3927 | + (let ((one Reg (imm $I8 1)) |
| 3928 | + (overflow Reg (select_bool_reg ty (bool (add_logical_reg_with_flags_paired ty x y) (mask_as_cond 3)) one (zero_reg)))) |
| 3929 | + (value_reg overflow))) |
| 3930 | + |
| 3931 | +(rule 4 (lower (has_type (fits_in_64 ty) (uadd_overflow x (zext32_value y)))) |
| 3932 | + (let ((one Reg (imm $I8 1)) |
| 3933 | + (overflow Reg (select_bool_reg ty (bool (add_logical_reg_zext32_with_flags_paired ty x y) (mask_as_cond 3)) one (zero_reg)))) |
| 3934 | + (value_reg overflow))) |
| 3935 | + |
| 3936 | +(rule 8 (lower (has_type (fits_in_64 ty) (uadd_overflow (zext32_value x) y))) |
| 3937 | + (let ((one Reg (imm $I8 1)) |
| 3938 | + (overflow Reg (select_bool_reg ty (bool (add_logical_reg_zext32_with_flags_paired ty y x) (mask_as_cond 3)) one (zero_reg)))) |
| 3939 | + (value_reg overflow))) |
| 3940 | + |
| 3941 | +(rule 3 (lower (has_type (fits_in_64 ty) (uadd_overflow x (u32_from_value y)))) |
| 3942 | + (let ((one Reg (imm $I8 1)) |
| 3943 | + (overflow Reg (select_bool_reg ty (bool (add_logical_zimm32_with_flags_paired ty x y) (mask_as_cond 3)) one (zero_reg)))) |
| 3944 | + (value_reg overflow))) |
| 3945 | + |
| 3946 | +(rule 7 (lower (has_type (fits_in_64 ty) (uadd_overflow (u32_from_value x) y))) |
| 3947 | + (let ((one Reg (imm $I8 1)) |
| 3948 | + (overflow Reg (select_bool_reg ty (bool (add_logical_zimm32_with_flags_paired ty y x) (mask_as_cond 3)) one (zero_reg)))) |
| 3949 | + (value_reg overflow))) |
| 3950 | + |
| 3951 | +(rule 2 (lower (has_type (fits_in_64 ty) (uadd_overflow x (sinkable_load_32_64 y)))) |
| 3952 | + (let ((one Reg (imm $I8 1)) |
| 3953 | + (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)))) |
| 3954 | + (value_reg overflow))) |
| 3955 | + |
| 3956 | +(rule 6 (lower (has_type (fits_in_64 ty) (uadd_overflow (sinkable_load_32_64 x) y))) |
| 3957 | + (let ((one Reg (imm $I8 1)) |
| 3958 | + (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)))) |
| 3959 | + (value_reg overflow))) |
| 3960 | + |
| 3961 | +(rule 1 (lower (has_type (fits_in_64 ty) (uadd_overflow x (sinkable_uload32 y)))) |
| 3962 | + (let ((one Reg (imm $I8 1)) |
| 3963 | + (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)))) |
| 3964 | + (value_reg overflow))) |
| 3965 | + |
| 3966 | +(rule 5 (lower (has_type (fits_in_64 ty) (uadd_overflow (sinkable_uload32 x) y))) |
| 3967 | + (let ((one Reg (imm $I8 1)) |
| 3968 | + (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)))) |
| 3969 | + (value_reg overflow))) |
| 3970 | + |
3847 | 3971 | ;;;; Rules for `return` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
3848 | 3972 |
|
3849 | 3973 | (rule (lower (return args))
|
|
0 commit comments