OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 3801 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3812 CHECK_EQUAL_64(0x0000000000000022UL, x10); | 3812 CHECK_EQUAL_64(0x0000000000000022UL, x10); |
3813 CHECK_EQUAL_64(0xfffcc844, x11); | 3813 CHECK_EQUAL_64(0xfffcc844, x11); |
3814 CHECK_EQUAL_64(0x0000000000019088UL, x12); | 3814 CHECK_EQUAL_64(0x0000000000019088UL, x12); |
3815 CHECK_EQUAL_64(0x65432110, x13); | 3815 CHECK_EQUAL_64(0x65432110, x13); |
3816 CHECK_EQUAL_64(0x0000000765432110UL, x14); | 3816 CHECK_EQUAL_64(0x0000000765432110UL, x14); |
3817 | 3817 |
3818 TEARDOWN(); | 3818 TEARDOWN(); |
3819 } | 3819 } |
3820 | 3820 |
3821 | 3821 |
| 3822 template <typename T, typename Op> |
| 3823 static void AdcsSbcsHelper(Op op, T left, T right, int carry, T expected, |
| 3824 StatusFlags expected_flags) { |
| 3825 int reg_size = sizeof(T) * 8; |
| 3826 auto left_reg = Register::Create(0, reg_size); |
| 3827 auto right_reg = Register::Create(1, reg_size); |
| 3828 auto result_reg = Register::Create(2, reg_size); |
| 3829 |
| 3830 SETUP(); |
| 3831 START(); |
| 3832 |
| 3833 __ Mov(left_reg, left); |
| 3834 __ Mov(right_reg, right); |
| 3835 __ Mov(x10, (carry ? CFlag : NoFlag)); |
| 3836 |
| 3837 __ Msr(NZCV, x10); |
| 3838 (masm.*op)(result_reg, left_reg, right_reg); |
| 3839 |
| 3840 END(); |
| 3841 RUN(); |
| 3842 |
| 3843 CHECK_EQUAL_64(left, left_reg.X()); |
| 3844 CHECK_EQUAL_64(right, right_reg.X()); |
| 3845 CHECK_EQUAL_64(expected, result_reg.X()); |
| 3846 CHECK_EQUAL_NZCV(expected_flags); |
| 3847 |
| 3848 TEARDOWN(); |
| 3849 } |
| 3850 |
| 3851 |
| 3852 TEST(adcs_sbcs_x) { |
| 3853 INIT_V8(); |
| 3854 uint64_t inputs[] = { |
| 3855 0x0000000000000000, 0x0000000000000001, 0x7ffffffffffffffe, |
| 3856 0x7fffffffffffffff, 0x8000000000000000, 0x8000000000000001, |
| 3857 0xfffffffffffffffe, 0xffffffffffffffff, |
| 3858 }; |
| 3859 static const size_t input_count = sizeof(inputs) / sizeof(inputs[0]); |
| 3860 |
| 3861 struct Expected { |
| 3862 uint64_t carry0_result; |
| 3863 StatusFlags carry0_flags; |
| 3864 uint64_t carry1_result; |
| 3865 StatusFlags carry1_flags; |
| 3866 }; |
| 3867 |
| 3868 static const Expected expected_adcs_x[input_count][input_count] = { |
| 3869 {{0x0000000000000000, ZFlag, 0x0000000000000001, NoFlag}, |
| 3870 {0x0000000000000001, NoFlag, 0x0000000000000002, NoFlag}, |
| 3871 {0x7ffffffffffffffe, NoFlag, 0x7fffffffffffffff, NoFlag}, |
| 3872 {0x7fffffffffffffff, NoFlag, 0x8000000000000000, NVFlag}, |
| 3873 {0x8000000000000000, NFlag, 0x8000000000000001, NFlag}, |
| 3874 {0x8000000000000001, NFlag, 0x8000000000000002, NFlag}, |
| 3875 {0xfffffffffffffffe, NFlag, 0xffffffffffffffff, NFlag}, |
| 3876 {0xffffffffffffffff, NFlag, 0x0000000000000000, ZCFlag}}, |
| 3877 {{0x0000000000000001, NoFlag, 0x0000000000000002, NoFlag}, |
| 3878 {0x0000000000000002, NoFlag, 0x0000000000000003, NoFlag}, |
| 3879 {0x7fffffffffffffff, NoFlag, 0x8000000000000000, NVFlag}, |
| 3880 {0x8000000000000000, NVFlag, 0x8000000000000001, NVFlag}, |
| 3881 {0x8000000000000001, NFlag, 0x8000000000000002, NFlag}, |
| 3882 {0x8000000000000002, NFlag, 0x8000000000000003, NFlag}, |
| 3883 {0xffffffffffffffff, NFlag, 0x0000000000000000, ZCFlag}, |
| 3884 {0x0000000000000000, ZCFlag, 0x0000000000000001, CFlag}}, |
| 3885 {{0x7ffffffffffffffe, NoFlag, 0x7fffffffffffffff, NoFlag}, |
| 3886 {0x7fffffffffffffff, NoFlag, 0x8000000000000000, NVFlag}, |
| 3887 {0xfffffffffffffffc, NVFlag, 0xfffffffffffffffd, NVFlag}, |
| 3888 {0xfffffffffffffffd, NVFlag, 0xfffffffffffffffe, NVFlag}, |
| 3889 {0xfffffffffffffffe, NFlag, 0xffffffffffffffff, NFlag}, |
| 3890 {0xffffffffffffffff, NFlag, 0x0000000000000000, ZCFlag}, |
| 3891 {0x7ffffffffffffffc, CFlag, 0x7ffffffffffffffd, CFlag}, |
| 3892 {0x7ffffffffffffffd, CFlag, 0x7ffffffffffffffe, CFlag}}, |
| 3893 {{0x7fffffffffffffff, NoFlag, 0x8000000000000000, NVFlag}, |
| 3894 {0x8000000000000000, NVFlag, 0x8000000000000001, NVFlag}, |
| 3895 {0xfffffffffffffffd, NVFlag, 0xfffffffffffffffe, NVFlag}, |
| 3896 {0xfffffffffffffffe, NVFlag, 0xffffffffffffffff, NVFlag}, |
| 3897 {0xffffffffffffffff, NFlag, 0x0000000000000000, ZCFlag}, |
| 3898 {0x0000000000000000, ZCFlag, 0x0000000000000001, CFlag}, |
| 3899 {0x7ffffffffffffffd, CFlag, 0x7ffffffffffffffe, CFlag}, |
| 3900 {0x7ffffffffffffffe, CFlag, 0x7fffffffffffffff, CFlag}}, |
| 3901 {{0x8000000000000000, NFlag, 0x8000000000000001, NFlag}, |
| 3902 {0x8000000000000001, NFlag, 0x8000000000000002, NFlag}, |
| 3903 {0xfffffffffffffffe, NFlag, 0xffffffffffffffff, NFlag}, |
| 3904 {0xffffffffffffffff, NFlag, 0x0000000000000000, ZCFlag}, |
| 3905 {0x0000000000000000, ZCVFlag, 0x0000000000000001, CVFlag}, |
| 3906 {0x0000000000000001, CVFlag, 0x0000000000000002, CVFlag}, |
| 3907 {0x7ffffffffffffffe, CVFlag, 0x7fffffffffffffff, CVFlag}, |
| 3908 {0x7fffffffffffffff, CVFlag, 0x8000000000000000, NCFlag}}, |
| 3909 {{0x8000000000000001, NFlag, 0x8000000000000002, NFlag}, |
| 3910 {0x8000000000000002, NFlag, 0x8000000000000003, NFlag}, |
| 3911 {0xffffffffffffffff, NFlag, 0x0000000000000000, ZCFlag}, |
| 3912 {0x0000000000000000, ZCFlag, 0x0000000000000001, CFlag}, |
| 3913 {0x0000000000000001, CVFlag, 0x0000000000000002, CVFlag}, |
| 3914 {0x0000000000000002, CVFlag, 0x0000000000000003, CVFlag}, |
| 3915 {0x7fffffffffffffff, CVFlag, 0x8000000000000000, NCFlag}, |
| 3916 {0x8000000000000000, NCFlag, 0x8000000000000001, NCFlag}}, |
| 3917 {{0xfffffffffffffffe, NFlag, 0xffffffffffffffff, NFlag}, |
| 3918 {0xffffffffffffffff, NFlag, 0x0000000000000000, ZCFlag}, |
| 3919 {0x7ffffffffffffffc, CFlag, 0x7ffffffffffffffd, CFlag}, |
| 3920 {0x7ffffffffffffffd, CFlag, 0x7ffffffffffffffe, CFlag}, |
| 3921 {0x7ffffffffffffffe, CVFlag, 0x7fffffffffffffff, CVFlag}, |
| 3922 {0x7fffffffffffffff, CVFlag, 0x8000000000000000, NCFlag}, |
| 3923 {0xfffffffffffffffc, NCFlag, 0xfffffffffffffffd, NCFlag}, |
| 3924 {0xfffffffffffffffd, NCFlag, 0xfffffffffffffffe, NCFlag}}, |
| 3925 {{0xffffffffffffffff, NFlag, 0x0000000000000000, ZCFlag}, |
| 3926 {0x0000000000000000, ZCFlag, 0x0000000000000001, CFlag}, |
| 3927 {0x7ffffffffffffffd, CFlag, 0x7ffffffffffffffe, CFlag}, |
| 3928 {0x7ffffffffffffffe, CFlag, 0x7fffffffffffffff, CFlag}, |
| 3929 {0x7fffffffffffffff, CVFlag, 0x8000000000000000, NCFlag}, |
| 3930 {0x8000000000000000, NCFlag, 0x8000000000000001, NCFlag}, |
| 3931 {0xfffffffffffffffd, NCFlag, 0xfffffffffffffffe, NCFlag}, |
| 3932 {0xfffffffffffffffe, NCFlag, 0xffffffffffffffff, NCFlag}}}; |
| 3933 |
| 3934 static const Expected expected_sbcs_x[input_count][input_count] = { |
| 3935 {{0xffffffffffffffff, NFlag, 0x0000000000000000, ZCFlag}, |
| 3936 {0xfffffffffffffffe, NFlag, 0xffffffffffffffff, NFlag}, |
| 3937 {0x8000000000000001, NFlag, 0x8000000000000002, NFlag}, |
| 3938 {0x8000000000000000, NFlag, 0x8000000000000001, NFlag}, |
| 3939 {0x7fffffffffffffff, NoFlag, 0x8000000000000000, NVFlag}, |
| 3940 {0x7ffffffffffffffe, NoFlag, 0x7fffffffffffffff, NoFlag}, |
| 3941 {0x0000000000000001, NoFlag, 0x0000000000000002, NoFlag}, |
| 3942 {0x0000000000000000, ZFlag, 0x0000000000000001, NoFlag}}, |
| 3943 {{0x0000000000000000, ZCFlag, 0x0000000000000001, CFlag}, |
| 3944 {0xffffffffffffffff, NFlag, 0x0000000000000000, ZCFlag}, |
| 3945 {0x8000000000000002, NFlag, 0x8000000000000003, NFlag}, |
| 3946 {0x8000000000000001, NFlag, 0x8000000000000002, NFlag}, |
| 3947 {0x8000000000000000, NVFlag, 0x8000000000000001, NVFlag}, |
| 3948 {0x7fffffffffffffff, NoFlag, 0x8000000000000000, NVFlag}, |
| 3949 {0x0000000000000002, NoFlag, 0x0000000000000003, NoFlag}, |
| 3950 {0x0000000000000001, NoFlag, 0x0000000000000002, NoFlag}}, |
| 3951 {{0x7ffffffffffffffd, CFlag, 0x7ffffffffffffffe, CFlag}, |
| 3952 {0x7ffffffffffffffc, CFlag, 0x7ffffffffffffffd, CFlag}, |
| 3953 {0xffffffffffffffff, NFlag, 0x0000000000000000, ZCFlag}, |
| 3954 {0xfffffffffffffffe, NFlag, 0xffffffffffffffff, NFlag}, |
| 3955 {0xfffffffffffffffd, NVFlag, 0xfffffffffffffffe, NVFlag}, |
| 3956 {0xfffffffffffffffc, NVFlag, 0xfffffffffffffffd, NVFlag}, |
| 3957 {0x7fffffffffffffff, NoFlag, 0x8000000000000000, NVFlag}, |
| 3958 {0x7ffffffffffffffe, NoFlag, 0x7fffffffffffffff, NoFlag}}, |
| 3959 {{0x7ffffffffffffffe, CFlag, 0x7fffffffffffffff, CFlag}, |
| 3960 {0x7ffffffffffffffd, CFlag, 0x7ffffffffffffffe, CFlag}, |
| 3961 {0x0000000000000000, ZCFlag, 0x0000000000000001, CFlag}, |
| 3962 {0xffffffffffffffff, NFlag, 0x0000000000000000, ZCFlag}, |
| 3963 {0xfffffffffffffffe, NVFlag, 0xffffffffffffffff, NVFlag}, |
| 3964 {0xfffffffffffffffd, NVFlag, 0xfffffffffffffffe, NVFlag}, |
| 3965 {0x8000000000000000, NVFlag, 0x8000000000000001, NVFlag}, |
| 3966 {0x7fffffffffffffff, NoFlag, 0x8000000000000000, NVFlag}}, |
| 3967 {{0x7fffffffffffffff, CVFlag, 0x8000000000000000, NCFlag}, |
| 3968 {0x7ffffffffffffffe, CVFlag, 0x7fffffffffffffff, CVFlag}, |
| 3969 {0x0000000000000001, CVFlag, 0x0000000000000002, CVFlag}, |
| 3970 {0x0000000000000000, ZCVFlag, 0x0000000000000001, CVFlag}, |
| 3971 {0xffffffffffffffff, NFlag, 0x0000000000000000, ZCFlag}, |
| 3972 {0xfffffffffffffffe, NFlag, 0xffffffffffffffff, NFlag}, |
| 3973 {0x8000000000000001, NFlag, 0x8000000000000002, NFlag}, |
| 3974 {0x8000000000000000, NFlag, 0x8000000000000001, NFlag}}, |
| 3975 {{0x8000000000000000, NCFlag, 0x8000000000000001, NCFlag}, |
| 3976 {0x7fffffffffffffff, CVFlag, 0x8000000000000000, NCFlag}, |
| 3977 {0x0000000000000002, CVFlag, 0x0000000000000003, CVFlag}, |
| 3978 {0x0000000000000001, CVFlag, 0x0000000000000002, CVFlag}, |
| 3979 {0x0000000000000000, ZCFlag, 0x0000000000000001, CFlag}, |
| 3980 {0xffffffffffffffff, NFlag, 0x0000000000000000, ZCFlag}, |
| 3981 {0x8000000000000002, NFlag, 0x8000000000000003, NFlag}, |
| 3982 {0x8000000000000001, NFlag, 0x8000000000000002, NFlag}}, |
| 3983 {{0xfffffffffffffffd, NCFlag, 0xfffffffffffffffe, NCFlag}, |
| 3984 {0xfffffffffffffffc, NCFlag, 0xfffffffffffffffd, NCFlag}, |
| 3985 {0x7fffffffffffffff, CVFlag, 0x8000000000000000, NCFlag}, |
| 3986 {0x7ffffffffffffffe, CVFlag, 0x7fffffffffffffff, CVFlag}, |
| 3987 {0x7ffffffffffffffd, CFlag, 0x7ffffffffffffffe, CFlag}, |
| 3988 {0x7ffffffffffffffc, CFlag, 0x7ffffffffffffffd, CFlag}, |
| 3989 {0xffffffffffffffff, NFlag, 0x0000000000000000, ZCFlag}, |
| 3990 {0xfffffffffffffffe, NFlag, 0xffffffffffffffff, NFlag}}, |
| 3991 {{0xfffffffffffffffe, NCFlag, 0xffffffffffffffff, NCFlag}, |
| 3992 {0xfffffffffffffffd, NCFlag, 0xfffffffffffffffe, NCFlag}, |
| 3993 {0x8000000000000000, NCFlag, 0x8000000000000001, NCFlag}, |
| 3994 {0x7fffffffffffffff, CVFlag, 0x8000000000000000, NCFlag}, |
| 3995 {0x7ffffffffffffffe, CFlag, 0x7fffffffffffffff, CFlag}, |
| 3996 {0x7ffffffffffffffd, CFlag, 0x7ffffffffffffffe, CFlag}, |
| 3997 {0x0000000000000000, ZCFlag, 0x0000000000000001, CFlag}, |
| 3998 {0xffffffffffffffff, NFlag, 0x0000000000000000, ZCFlag}}}; |
| 3999 |
| 4000 for (size_t left = 0; left < input_count; left++) { |
| 4001 for (size_t right = 0; right < input_count; right++) { |
| 4002 const Expected& expected = expected_adcs_x[left][right]; |
| 4003 AdcsSbcsHelper(&MacroAssembler::Adcs, inputs[left], inputs[right], 0, |
| 4004 expected.carry0_result, expected.carry0_flags); |
| 4005 AdcsSbcsHelper(&MacroAssembler::Adcs, inputs[left], inputs[right], 1, |
| 4006 expected.carry1_result, expected.carry1_flags); |
| 4007 } |
| 4008 } |
| 4009 |
| 4010 for (size_t left = 0; left < input_count; left++) { |
| 4011 for (size_t right = 0; right < input_count; right++) { |
| 4012 const Expected& expected = expected_sbcs_x[left][right]; |
| 4013 AdcsSbcsHelper(&MacroAssembler::Sbcs, inputs[left], inputs[right], 0, |
| 4014 expected.carry0_result, expected.carry0_flags); |
| 4015 AdcsSbcsHelper(&MacroAssembler::Sbcs, inputs[left], inputs[right], 1, |
| 4016 expected.carry1_result, expected.carry1_flags); |
| 4017 } |
| 4018 } |
| 4019 } |
| 4020 |
| 4021 |
| 4022 TEST(adcs_sbcs_w) { |
| 4023 INIT_V8(); |
| 4024 uint32_t inputs[] = { |
| 4025 0x00000000, 0x00000001, 0x7ffffffe, 0x7fffffff, |
| 4026 0x80000000, 0x80000001, 0xfffffffe, 0xffffffff, |
| 4027 }; |
| 4028 static const size_t input_count = sizeof(inputs) / sizeof(inputs[0]); |
| 4029 |
| 4030 struct Expected { |
| 4031 uint32_t carry0_result; |
| 4032 StatusFlags carry0_flags; |
| 4033 uint32_t carry1_result; |
| 4034 StatusFlags carry1_flags; |
| 4035 }; |
| 4036 |
| 4037 static const Expected expected_adcs_w[input_count][input_count] = { |
| 4038 {{0x00000000, ZFlag, 0x00000001, NoFlag}, |
| 4039 {0x00000001, NoFlag, 0x00000002, NoFlag}, |
| 4040 {0x7ffffffe, NoFlag, 0x7fffffff, NoFlag}, |
| 4041 {0x7fffffff, NoFlag, 0x80000000, NVFlag}, |
| 4042 {0x80000000, NFlag, 0x80000001, NFlag}, |
| 4043 {0x80000001, NFlag, 0x80000002, NFlag}, |
| 4044 {0xfffffffe, NFlag, 0xffffffff, NFlag}, |
| 4045 {0xffffffff, NFlag, 0x00000000, ZCFlag}}, |
| 4046 {{0x00000001, NoFlag, 0x00000002, NoFlag}, |
| 4047 {0x00000002, NoFlag, 0x00000003, NoFlag}, |
| 4048 {0x7fffffff, NoFlag, 0x80000000, NVFlag}, |
| 4049 {0x80000000, NVFlag, 0x80000001, NVFlag}, |
| 4050 {0x80000001, NFlag, 0x80000002, NFlag}, |
| 4051 {0x80000002, NFlag, 0x80000003, NFlag}, |
| 4052 {0xffffffff, NFlag, 0x00000000, ZCFlag}, |
| 4053 {0x00000000, ZCFlag, 0x00000001, CFlag}}, |
| 4054 {{0x7ffffffe, NoFlag, 0x7fffffff, NoFlag}, |
| 4055 {0x7fffffff, NoFlag, 0x80000000, NVFlag}, |
| 4056 {0xfffffffc, NVFlag, 0xfffffffd, NVFlag}, |
| 4057 {0xfffffffd, NVFlag, 0xfffffffe, NVFlag}, |
| 4058 {0xfffffffe, NFlag, 0xffffffff, NFlag}, |
| 4059 {0xffffffff, NFlag, 0x00000000, ZCFlag}, |
| 4060 {0x7ffffffc, CFlag, 0x7ffffffd, CFlag}, |
| 4061 {0x7ffffffd, CFlag, 0x7ffffffe, CFlag}}, |
| 4062 {{0x7fffffff, NoFlag, 0x80000000, NVFlag}, |
| 4063 {0x80000000, NVFlag, 0x80000001, NVFlag}, |
| 4064 {0xfffffffd, NVFlag, 0xfffffffe, NVFlag}, |
| 4065 {0xfffffffe, NVFlag, 0xffffffff, NVFlag}, |
| 4066 {0xffffffff, NFlag, 0x00000000, ZCFlag}, |
| 4067 {0x00000000, ZCFlag, 0x00000001, CFlag}, |
| 4068 {0x7ffffffd, CFlag, 0x7ffffffe, CFlag}, |
| 4069 {0x7ffffffe, CFlag, 0x7fffffff, CFlag}}, |
| 4070 {{0x80000000, NFlag, 0x80000001, NFlag}, |
| 4071 {0x80000001, NFlag, 0x80000002, NFlag}, |
| 4072 {0xfffffffe, NFlag, 0xffffffff, NFlag}, |
| 4073 {0xffffffff, NFlag, 0x00000000, ZCFlag}, |
| 4074 {0x00000000, ZCVFlag, 0x00000001, CVFlag}, |
| 4075 {0x00000001, CVFlag, 0x00000002, CVFlag}, |
| 4076 {0x7ffffffe, CVFlag, 0x7fffffff, CVFlag}, |
| 4077 {0x7fffffff, CVFlag, 0x80000000, NCFlag}}, |
| 4078 {{0x80000001, NFlag, 0x80000002, NFlag}, |
| 4079 {0x80000002, NFlag, 0x80000003, NFlag}, |
| 4080 {0xffffffff, NFlag, 0x00000000, ZCFlag}, |
| 4081 {0x00000000, ZCFlag, 0x00000001, CFlag}, |
| 4082 {0x00000001, CVFlag, 0x00000002, CVFlag}, |
| 4083 {0x00000002, CVFlag, 0x00000003, CVFlag}, |
| 4084 {0x7fffffff, CVFlag, 0x80000000, NCFlag}, |
| 4085 {0x80000000, NCFlag, 0x80000001, NCFlag}}, |
| 4086 {{0xfffffffe, NFlag, 0xffffffff, NFlag}, |
| 4087 {0xffffffff, NFlag, 0x00000000, ZCFlag}, |
| 4088 {0x7ffffffc, CFlag, 0x7ffffffd, CFlag}, |
| 4089 {0x7ffffffd, CFlag, 0x7ffffffe, CFlag}, |
| 4090 {0x7ffffffe, CVFlag, 0x7fffffff, CVFlag}, |
| 4091 {0x7fffffff, CVFlag, 0x80000000, NCFlag}, |
| 4092 {0xfffffffc, NCFlag, 0xfffffffd, NCFlag}, |
| 4093 {0xfffffffd, NCFlag, 0xfffffffe, NCFlag}}, |
| 4094 {{0xffffffff, NFlag, 0x00000000, ZCFlag}, |
| 4095 {0x00000000, ZCFlag, 0x00000001, CFlag}, |
| 4096 {0x7ffffffd, CFlag, 0x7ffffffe, CFlag}, |
| 4097 {0x7ffffffe, CFlag, 0x7fffffff, CFlag}, |
| 4098 {0x7fffffff, CVFlag, 0x80000000, NCFlag}, |
| 4099 {0x80000000, NCFlag, 0x80000001, NCFlag}, |
| 4100 {0xfffffffd, NCFlag, 0xfffffffe, NCFlag}, |
| 4101 {0xfffffffe, NCFlag, 0xffffffff, NCFlag}}}; |
| 4102 |
| 4103 static const Expected expected_sbcs_w[input_count][input_count] = { |
| 4104 {{0xffffffff, NFlag, 0x00000000, ZCFlag}, |
| 4105 {0xfffffffe, NFlag, 0xffffffff, NFlag}, |
| 4106 {0x80000001, NFlag, 0x80000002, NFlag}, |
| 4107 {0x80000000, NFlag, 0x80000001, NFlag}, |
| 4108 {0x7fffffff, NoFlag, 0x80000000, NVFlag}, |
| 4109 {0x7ffffffe, NoFlag, 0x7fffffff, NoFlag}, |
| 4110 {0x00000001, NoFlag, 0x00000002, NoFlag}, |
| 4111 {0x00000000, ZFlag, 0x00000001, NoFlag}}, |
| 4112 {{0x00000000, ZCFlag, 0x00000001, CFlag}, |
| 4113 {0xffffffff, NFlag, 0x00000000, ZCFlag}, |
| 4114 {0x80000002, NFlag, 0x80000003, NFlag}, |
| 4115 {0x80000001, NFlag, 0x80000002, NFlag}, |
| 4116 {0x80000000, NVFlag, 0x80000001, NVFlag}, |
| 4117 {0x7fffffff, NoFlag, 0x80000000, NVFlag}, |
| 4118 {0x00000002, NoFlag, 0x00000003, NoFlag}, |
| 4119 {0x00000001, NoFlag, 0x00000002, NoFlag}}, |
| 4120 {{0x7ffffffd, CFlag, 0x7ffffffe, CFlag}, |
| 4121 {0x7ffffffc, CFlag, 0x7ffffffd, CFlag}, |
| 4122 {0xffffffff, NFlag, 0x00000000, ZCFlag}, |
| 4123 {0xfffffffe, NFlag, 0xffffffff, NFlag}, |
| 4124 {0xfffffffd, NVFlag, 0xfffffffe, NVFlag}, |
| 4125 {0xfffffffc, NVFlag, 0xfffffffd, NVFlag}, |
| 4126 {0x7fffffff, NoFlag, 0x80000000, NVFlag}, |
| 4127 {0x7ffffffe, NoFlag, 0x7fffffff, NoFlag}}, |
| 4128 {{0x7ffffffe, CFlag, 0x7fffffff, CFlag}, |
| 4129 {0x7ffffffd, CFlag, 0x7ffffffe, CFlag}, |
| 4130 {0x00000000, ZCFlag, 0x00000001, CFlag}, |
| 4131 {0xffffffff, NFlag, 0x00000000, ZCFlag}, |
| 4132 {0xfffffffe, NVFlag, 0xffffffff, NVFlag}, |
| 4133 {0xfffffffd, NVFlag, 0xfffffffe, NVFlag}, |
| 4134 {0x80000000, NVFlag, 0x80000001, NVFlag}, |
| 4135 {0x7fffffff, NoFlag, 0x80000000, NVFlag}}, |
| 4136 {{0x7fffffff, CVFlag, 0x80000000, NCFlag}, |
| 4137 {0x7ffffffe, CVFlag, 0x7fffffff, CVFlag}, |
| 4138 {0x00000001, CVFlag, 0x00000002, CVFlag}, |
| 4139 {0x00000000, ZCVFlag, 0x00000001, CVFlag}, |
| 4140 {0xffffffff, NFlag, 0x00000000, ZCFlag}, |
| 4141 {0xfffffffe, NFlag, 0xffffffff, NFlag}, |
| 4142 {0x80000001, NFlag, 0x80000002, NFlag}, |
| 4143 {0x80000000, NFlag, 0x80000001, NFlag}}, |
| 4144 {{0x80000000, NCFlag, 0x80000001, NCFlag}, |
| 4145 {0x7fffffff, CVFlag, 0x80000000, NCFlag}, |
| 4146 {0x00000002, CVFlag, 0x00000003, CVFlag}, |
| 4147 {0x00000001, CVFlag, 0x00000002, CVFlag}, |
| 4148 {0x00000000, ZCFlag, 0x00000001, CFlag}, |
| 4149 {0xffffffff, NFlag, 0x00000000, ZCFlag}, |
| 4150 {0x80000002, NFlag, 0x80000003, NFlag}, |
| 4151 {0x80000001, NFlag, 0x80000002, NFlag}}, |
| 4152 {{0xfffffffd, NCFlag, 0xfffffffe, NCFlag}, |
| 4153 {0xfffffffc, NCFlag, 0xfffffffd, NCFlag}, |
| 4154 {0x7fffffff, CVFlag, 0x80000000, NCFlag}, |
| 4155 {0x7ffffffe, CVFlag, 0x7fffffff, CVFlag}, |
| 4156 {0x7ffffffd, CFlag, 0x7ffffffe, CFlag}, |
| 4157 {0x7ffffffc, CFlag, 0x7ffffffd, CFlag}, |
| 4158 {0xffffffff, NFlag, 0x00000000, ZCFlag}, |
| 4159 {0xfffffffe, NFlag, 0xffffffff, NFlag}}, |
| 4160 {{0xfffffffe, NCFlag, 0xffffffff, NCFlag}, |
| 4161 {0xfffffffd, NCFlag, 0xfffffffe, NCFlag}, |
| 4162 {0x80000000, NCFlag, 0x80000001, NCFlag}, |
| 4163 {0x7fffffff, CVFlag, 0x80000000, NCFlag}, |
| 4164 {0x7ffffffe, CFlag, 0x7fffffff, CFlag}, |
| 4165 {0x7ffffffd, CFlag, 0x7ffffffe, CFlag}, |
| 4166 {0x00000000, ZCFlag, 0x00000001, CFlag}, |
| 4167 {0xffffffff, NFlag, 0x00000000, ZCFlag}}}; |
| 4168 |
| 4169 for (size_t left = 0; left < input_count; left++) { |
| 4170 for (size_t right = 0; right < input_count; right++) { |
| 4171 const Expected& expected = expected_adcs_w[left][right]; |
| 4172 AdcsSbcsHelper(&MacroAssembler::Adcs, inputs[left], inputs[right], 0, |
| 4173 expected.carry0_result, expected.carry0_flags); |
| 4174 AdcsSbcsHelper(&MacroAssembler::Adcs, inputs[left], inputs[right], 1, |
| 4175 expected.carry1_result, expected.carry1_flags); |
| 4176 } |
| 4177 } |
| 4178 |
| 4179 for (size_t left = 0; left < input_count; left++) { |
| 4180 for (size_t right = 0; right < input_count; right++) { |
| 4181 const Expected& expected = expected_sbcs_w[left][right]; |
| 4182 AdcsSbcsHelper(&MacroAssembler::Sbcs, inputs[left], inputs[right], 0, |
| 4183 expected.carry0_result, expected.carry0_flags); |
| 4184 AdcsSbcsHelper(&MacroAssembler::Sbcs, inputs[left], inputs[right], 1, |
| 4185 expected.carry1_result, expected.carry1_flags); |
| 4186 } |
| 4187 } |
| 4188 } |
| 4189 |
| 4190 |
3822 TEST(adc_sbc_shift) { | 4191 TEST(adc_sbc_shift) { |
3823 INIT_V8(); | 4192 INIT_V8(); |
3824 SETUP(); | 4193 SETUP(); |
3825 | 4194 |
3826 START(); | 4195 START(); |
3827 __ Mov(x0, 0); | 4196 __ Mov(x0, 0); |
3828 __ Mov(x1, 1); | 4197 __ Mov(x1, 1); |
3829 __ Mov(x2, 0x0123456789abcdefL); | 4198 __ Mov(x2, 0x0123456789abcdefL); |
3830 __ Mov(x3, 0xfedcba9876543210L); | 4199 __ Mov(x3, 0xfedcba9876543210L); |
3831 __ Mov(x4, 0xffffffffffffffffL); | 4200 __ Mov(x4, 0xffffffffffffffffL); |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3880 CHECK_EQUAL_64(0xf0123456789abcddL + 1, x20); | 4249 CHECK_EQUAL_64(0xf0123456789abcddL + 1, x20); |
3881 CHECK_EQUAL_64(0x0111111111111110L + 1, x21); | 4250 CHECK_EQUAL_64(0x0111111111111110L + 1, x21); |
3882 CHECK_EQUAL_64(0x1222222222222221L + 1, x22); | 4251 CHECK_EQUAL_64(0x1222222222222221L + 1, x22); |
3883 | 4252 |
3884 CHECK_EQUAL_32(0xffffffff + 1, w23); | 4253 CHECK_EQUAL_32(0xffffffff + 1, w23); |
3885 CHECK_EQUAL_32((1 << 30) + 1, w24); | 4254 CHECK_EQUAL_32((1 << 30) + 1, w24); |
3886 CHECK_EQUAL_32(0xf89abcdd + 1, w25); | 4255 CHECK_EQUAL_32(0xf89abcdd + 1, w25); |
3887 CHECK_EQUAL_32(0x91111110 + 1, w26); | 4256 CHECK_EQUAL_32(0x91111110 + 1, w26); |
3888 CHECK_EQUAL_32(0x9a222221 + 1, w27); | 4257 CHECK_EQUAL_32(0x9a222221 + 1, w27); |
3889 | 4258 |
3890 // Check that adc correctly sets the condition flags. | |
3891 START(); | |
3892 __ Mov(x0, 1); | |
3893 __ Mov(x1, 0xffffffffffffffffL); | |
3894 // Clear the C flag. | |
3895 __ Adds(x0, x0, Operand(0)); | |
3896 __ Adcs(x10, x0, Operand(x1)); | |
3897 END(); | |
3898 | |
3899 RUN(); | |
3900 | |
3901 CHECK_EQUAL_NZCV(ZCFlag); | |
3902 CHECK_EQUAL_64(0, x10); | |
3903 | |
3904 START(); | |
3905 __ Mov(x0, 1); | |
3906 __ Mov(x1, 0x8000000000000000L); | |
3907 // Clear the C flag. | |
3908 __ Adds(x0, x0, Operand(0)); | |
3909 __ Adcs(x10, x0, Operand(x1, ASR, 63)); | |
3910 END(); | |
3911 | |
3912 RUN(); | |
3913 | |
3914 CHECK_EQUAL_NZCV(ZCFlag); | |
3915 CHECK_EQUAL_64(0, x10); | |
3916 | |
3917 START(); | |
3918 __ Mov(x0, 0x10); | |
3919 __ Mov(x1, 0x07ffffffffffffffL); | |
3920 // Clear the C flag. | |
3921 __ Adds(x0, x0, Operand(0)); | |
3922 __ Adcs(x10, x0, Operand(x1, LSL, 4)); | |
3923 END(); | |
3924 | |
3925 RUN(); | |
3926 | |
3927 CHECK_EQUAL_NZCV(NVFlag); | |
3928 CHECK_EQUAL_64(0x8000000000000000L, x10); | |
3929 | |
3930 // Check that sbc correctly sets the condition flags. | |
3931 START(); | |
3932 __ Mov(x0, 0); | |
3933 __ Mov(x1, 0xffffffffffffffffL); | |
3934 // Clear the C flag. | |
3935 __ Adds(x0, x0, Operand(0)); | |
3936 __ Sbcs(x10, x0, Operand(x1)); | |
3937 END(); | |
3938 | |
3939 RUN(); | |
3940 | |
3941 CHECK_EQUAL_NZCV(ZFlag); | |
3942 CHECK_EQUAL_64(0, x10); | |
3943 | |
3944 START(); | |
3945 __ Mov(x0, 1); | |
3946 __ Mov(x1, 0xffffffffffffffffL); | |
3947 // Clear the C flag. | |
3948 __ Adds(x0, x0, Operand(0)); | |
3949 __ Sbcs(x10, x0, Operand(x1, LSR, 1)); | |
3950 END(); | |
3951 | |
3952 RUN(); | |
3953 | |
3954 CHECK_EQUAL_NZCV(NFlag); | |
3955 CHECK_EQUAL_64(0x8000000000000001L, x10); | |
3956 | |
3957 START(); | |
3958 __ Mov(x0, 0); | |
3959 // Clear the C flag. | |
3960 __ Adds(x0, x0, Operand(0)); | |
3961 __ Sbcs(x10, x0, Operand(0xffffffffffffffffL)); | |
3962 END(); | |
3963 | |
3964 RUN(); | |
3965 | |
3966 CHECK_EQUAL_NZCV(ZFlag); | |
3967 CHECK_EQUAL_64(0, x10); | |
3968 | |
3969 START() | |
3970 __ Mov(w0, 0x7fffffff); | |
3971 // Clear the C flag. | |
3972 __ Adds(x0, x0, Operand(0)); | |
3973 __ Ngcs(w10, w0); | |
3974 END(); | |
3975 | |
3976 RUN(); | |
3977 | |
3978 CHECK_EQUAL_NZCV(NFlag); | |
3979 CHECK_EQUAL_64(0x80000000, x10); | |
3980 | |
3981 START(); | |
3982 // Clear the C flag. | |
3983 __ Adds(x0, x0, Operand(0)); | |
3984 __ Ngcs(x10, 0x7fffffffffffffffL); | |
3985 END(); | |
3986 | |
3987 RUN(); | |
3988 | |
3989 CHECK_EQUAL_NZCV(NFlag); | |
3990 CHECK_EQUAL_64(0x8000000000000000L, x10); | |
3991 | |
3992 START() | |
3993 __ Mov(x0, 0); | |
3994 // Set the C flag. | |
3995 __ Cmp(x0, Operand(x0)); | |
3996 __ Sbcs(x10, x0, Operand(1)); | |
3997 END(); | |
3998 | |
3999 RUN(); | |
4000 | |
4001 CHECK_EQUAL_NZCV(NFlag); | |
4002 CHECK_EQUAL_64(0xffffffffffffffffL, x10); | |
4003 | |
4004 START() | |
4005 __ Mov(x0, 0); | |
4006 // Set the C flag. | |
4007 __ Cmp(x0, Operand(x0)); | |
4008 __ Ngcs(x10, 0x7fffffffffffffffL); | |
4009 END(); | |
4010 | |
4011 RUN(); | |
4012 | |
4013 CHECK_EQUAL_NZCV(NFlag); | |
4014 CHECK_EQUAL_64(0x8000000000000001L, x10); | |
4015 | |
4016 TEARDOWN(); | 4259 TEARDOWN(); |
4017 } | 4260 } |
4018 | 4261 |
4019 | 4262 |
4020 TEST(adc_sbc_extend) { | 4263 TEST(adc_sbc_extend) { |
4021 INIT_V8(); | 4264 INIT_V8(); |
4022 SETUP(); | 4265 SETUP(); |
4023 | 4266 |
4024 START(); | 4267 START(); |
4025 // Clear the C flag. | 4268 // Clear the C flag. |
(...skipping 7249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11275 __ Mov(x0, 1); | 11518 __ Mov(x0, 1); |
11276 | 11519 |
11277 END(); | 11520 END(); |
11278 | 11521 |
11279 RUN(); | 11522 RUN(); |
11280 | 11523 |
11281 CHECK_EQUAL_64(0x1, x0); | 11524 CHECK_EQUAL_64(0x1, x0); |
11282 | 11525 |
11283 TEARDOWN(); | 11526 TEARDOWN(); |
11284 } | 11527 } |
OLD | NEW |