Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(756)

Side by Side Diff: test/cctest/wasm/test-run-wasm.cc

Issue 2240743003: [v8][wasm] Handles finally in try/finally blocks. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fixes broken windows build Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« src/wasm/ast-decoder.cc ('K') | « src/wasm/ast-decoder.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <stdint.h> 5 #include <stdint.h>
6 #include <stdlib.h> 6 #include <stdlib.h>
7 #include <string.h> 7 #include <string.h>
8 8
9 #include "src/base/platform/elapsed-timer.h" 9 #include "src/base/platform/elapsed-timer.h"
10 10
(...skipping 2758 matching lines...) Expand 10 before | Expand all | Expand 10 after
2769 MachineType::Int32()); 2769 MachineType::Int32());
2770 BUILD(r, WASM_I32_REMS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)), WASM_ZERO); 2770 BUILD(r, WASM_I32_REMS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)), WASM_ZERO);
2771 const int32_t kMin = std::numeric_limits<int32_t>::min(); 2771 const int32_t kMin = std::numeric_limits<int32_t>::min();
2772 CHECK_EQ(0, r.Call(133, 100)); 2772 CHECK_EQ(0, r.Call(133, 100));
2773 CHECK_EQ(0, r.Call(kMin, -1)); 2773 CHECK_EQ(0, r.Call(kMin, -1));
2774 CHECK_EQ(0, r.Call(0, 1)); 2774 CHECK_EQ(0, r.Call(0, 1));
2775 CHECK_TRAP(r.Call(100, 0)); 2775 CHECK_TRAP(r.Call(100, 0));
2776 CHECK_TRAP(r.Call(-1001, 0)); 2776 CHECK_TRAP(r.Call(-1001, 0));
2777 CHECK_TRAP(r.Call(kMin, 0)); 2777 CHECK_TRAP(r.Call(kMin, 0));
2778 } 2778 }
2779
2780 // TODO(jpp): WASM_EXEC_TEST(TryCatch)
2781
2782 // TODO(jpp): Move these macros to src/wasm/wasm-macro-gen.h once zero cost
2783 // exceptions are added to the spec.
2784 #define TRY_FINALLY(...) kExprTryFinally, __VA_ARGS__, kExprEnd
2785 #define FINALLY(...) kExprFinally, __VA_ARGS__
2786
2787 WASM_EXEC_TEST(TryFinally_single) {
2788 if (execution_mode == kExecuteInterpreted) {
2789 // TODO(jpp): implement eh support in the interpreter.
2790 return;
2791 }
2792
2793 FLAG_wasm_eh_prototype = true;
2794 WasmRunner<int32_t> r(execution_mode, MachineType::Int32(),
2795 MachineType::Int32());
2796 // r(i32 p, i32 q) -> i32 {
2797 // try {
2798 // if (q) {
2799 // break;
2800 // }
2801 // p += 0x0f0;
2802 // } finally {
2803 // p += 0x00f;
2804 // }
2805 // p += 0xf00
2806 // return p;
2807 // }
2808 BUILD(r, TRY_FINALLY(
2809 WASM_IF(WASM_GET_LOCAL(1), WASM_BREAK(0)),
2810 WASM_SET_LOCAL(
2811 0, WASM_I32_ADD(WASM_GET_LOCAL(0), WASM_I32V_2(0xf0))),
2812 FINALLY(WASM_SET_LOCAL(
2813 0, WASM_I32_ADD(WASM_GET_LOCAL(0), WASM_I32V_1(0x0f))))),
2814 WASM_SET_LOCAL(0, WASM_I32_ADD(WASM_GET_LOCAL(0), WASM_I32V(0xf00))),
2815 WASM_GET_LOCAL(0));
2816
2817 CHECK_EQ(0xFFFF, r.Call(0xF000, 0));
2818 CHECK_EQ(0xFF0F, r.Call(0xF000, 1));
2819 }
2820
2821 WASM_EXEC_TEST(TryFinally_double) {
2822 if (execution_mode == kExecuteInterpreted) {
2823 // TODO(jpp): implement eh support in the interpreter.
2824 return;
2825 }
2826
2827 FLAG_wasm_eh_prototype = true;
2828 WasmRunner<int32_t> r(execution_mode, MachineType::Int32(),
2829 MachineType::Int32());
2830 // r(i32 p, i32 q) -> i32 {
2831 // a: try {
2832 // b: try {
2833 // if (q == 40) {
2834 // break a;
2835 // } else {
2836 // if (q == 1) {
2837 // break b;
2838 // }
2839 // }
2840 // p += 0x00000f;
2841 // } finally {
2842 // p += 0x0000f0;
2843 // }
2844 // p += 0x000f00;
2845 // } finally {
2846 // p += 0x00f000;
2847 // }
2848 // return p;
2849 // }
2850 BUILD(
2851 r,
2852 TRY_FINALLY(
2853 TRY_FINALLY(
2854 WASM_IF_ELSE(WASM_I32_EQ(WASM_GET_LOCAL(1), WASM_I32V(40)),
2855 WASM_BREAK(1),
2856 WASM_IF(WASM_I32_EQ(WASM_GET_LOCAL(1), WASM_I32V(1)),
2857 WASM_BREAK(1))),
2858 WASM_SET_LOCAL(
2859 0, WASM_I32_ADD(WASM_GET_LOCAL(0), WASM_I32V(0x00000f))),
2860 FINALLY(WASM_SET_LOCAL(
2861 0, WASM_I32_ADD(WASM_GET_LOCAL(0), WASM_I32V(0x0000f0))))),
2862 WASM_SET_LOCAL(0,
2863 WASM_I32_ADD(WASM_GET_LOCAL(0), WASM_I32V(0x000f00))),
2864 FINALLY(WASM_SET_LOCAL(
2865 0, WASM_I32_ADD(WASM_GET_LOCAL(0), WASM_I32V(0x00f000))))),
2866 WASM_GET_LOCAL(0));
2867
2868 CHECK_EQ(0x7000ffff, r.Call(0x70000000, 2));
2869 CHECK_EQ(0x7000fff0, r.Call(0x70000000, 1));
2870 CHECK_EQ(0x7000f0f0, r.Call(0x70000000, 40));
2871 }
2872
2873 WASM_EXEC_TEST(TryFinally_multiple) {
2874 if (execution_mode == kExecuteInterpreted) {
John 2016/08/22 13:36:34 Yeah, this test is complicated, but I don't see an
2875 // TODO(jpp): implement eh support in the interpreter.
2876 return;
2877 }
2878
2879 FLAG_wasm_eh_prototype = true;
2880 WasmRunner<int32_t> r(execution_mode, MachineType::Int32(),
2881 MachineType::Int32());
2882
2883 // Handy-dandy shortcuts for recurring patterns for this test.
2884 #define I32_IOR_LOCAL(local, value) \
2885 WASM_SET_LOCAL(local, WASM_I32_IOR(WASM_GET_LOCAL(local), WASM_I32V(value)))
2886 #define IF_LOCAL_IS_BREAK_TO(local, value, depth) \
2887 WASM_IF(WASM_I32_EQ(WASM_GET_LOCAL(local), WASM_I32V(value)), \
2888 WASM_BREAK(depth))
2889
2890 // r(i32 p, i32 q) -> i32 {
2891 // a: try {
2892 // b: try {
2893 // c: try {
2894 // d: try {
2895 // e: try {
2896 // switch (q) {
2897 // case 1: break e;
2898 // case 2: break d;
2899 // case 3: break c;
2900 // case 4: break b;
2901 // case 5: break a;
2902 // }
2903 // p |= 0x00000001;
2904 // } finally {
2905 // p |= 0x00000002;
2906 // }
2907 // switch (q) {
2908 // case 6: break d;
2909 // case 7: break c;
2910 // case 8: break b;
2911 // case 9: break a;
2912 // }
2913 // p |= 0x00000004;
2914 // } finally {
2915 // p |= 0x00000008;
2916 // }
2917 // switch (q) {
2918 // case 10: break c;
2919 // case 11: break b;
2920 // case 12: break a;
2921 // }
2922 // p |= 0x00000010;
2923 // } finally {
2924 // p |= 0x00000020;
2925 // }
2926 // switch (q) {
2927 // case 13: break b;
2928 // case 14: break a;
2929 // }
2930 // p |= 0x00000040;
2931 // } finally {
2932 // p |= 0x00000080;
2933 // }
2934 // switch (q) {
2935 // case 15: break a;
2936 // }
2937 // p |= 0x00000100;
2938 // } finally {
2939 // p |= 0x00000200;
2940 // }
2941 // return p;
2942 // }
2943 BUILD(
2944 r,
2945 TRY_FINALLY(
2946 TRY_FINALLY(
2947 TRY_FINALLY(
2948 TRY_FINALLY(
2949 TRY_FINALLY(IF_LOCAL_IS_BREAK_TO(1, 1, 0),
2950 IF_LOCAL_IS_BREAK_TO(1, 2, 1),
2951 IF_LOCAL_IS_BREAK_TO(1, 3, 2),
2952 IF_LOCAL_IS_BREAK_TO(1, 4, 3),
2953 IF_LOCAL_IS_BREAK_TO(1, 5, 4),
2954 I32_IOR_LOCAL(0, 0x00000001),
2955 FINALLY(I32_IOR_LOCAL(0, 0x00000002))),
2956 IF_LOCAL_IS_BREAK_TO(1, 6, 0),
2957 IF_LOCAL_IS_BREAK_TO(1, 7, 1),
2958 IF_LOCAL_IS_BREAK_TO(1, 8, 2),
2959 IF_LOCAL_IS_BREAK_TO(1, 9, 3),
2960 I32_IOR_LOCAL(0, 0x00000004),
2961 FINALLY(I32_IOR_LOCAL(0, 0x00000008))),
2962 IF_LOCAL_IS_BREAK_TO(1, 10, 0),
2963 IF_LOCAL_IS_BREAK_TO(1, 11, 1),
2964 IF_LOCAL_IS_BREAK_TO(1, 12, 2), I32_IOR_LOCAL(0, 0x00000010),
2965 FINALLY(I32_IOR_LOCAL(0, 0x00000020))),
2966 IF_LOCAL_IS_BREAK_TO(1, 13, 0), IF_LOCAL_IS_BREAK_TO(1, 14, 1),
2967 I32_IOR_LOCAL(0, 0x00000040),
2968 FINALLY(I32_IOR_LOCAL(0, 0x00000080))),
2969 IF_LOCAL_IS_BREAK_TO(1, 15, 0), I32_IOR_LOCAL(0, 0x00000100),
2970 FINALLY(I32_IOR_LOCAL(0, 0x00000200))),
2971 WASM_GET_LOCAL(0));
2972 #undef WASM_IF_LOCAL_IS_BREAK_TO
2973 #undef WASM_I32_IOR_LOCAL
2974
2975 const struct {
2976 uint32_t inputs[2];
2977 uint32_t expected_output;
2978 } kTests[] = {
2979 {{0x80000000u, 0}, 0x800003ffu}, {{0x80000000u, 1}, 0x800003feu},
2980 {{0x80000000u, 2}, 0x800003fau}, {{0x80000000u, 3}, 0x800003eau},
2981 {{0x80000000u, 4}, 0x800003aau}, {{0x80000000u, 5}, 0x800002aau},
2982 {{0x80000000u, 6}, 0x800003fbu}, {{0x80000000u, 7}, 0x800003ebu},
2983 {{0x80000000u, 8}, 0x800003abu}, {{0x80000000u, 9}, 0x800002abu},
2984 {{0x80000000u, 10}, 0x800003efu}, {{0x80000000u, 11}, 0x800003afu},
2985 {{0x80000000u, 12}, 0x800002afu}, {{0x80000000u, 13}, 0x800003bfu},
2986 {{0x80000000u, 14}, 0x800002bfu}, {{0x80000000u, 15}, 0x800002ffu},
2987 };
2988
2989 for (uint32_t ii = 0; ii < arraysize(kTests); ++ii) {
2990 const auto& test_instance = kTests[ii];
2991 CHECK_EQ(test_instance.expected_output,
2992 static_cast<uint32_t>(
2993 r.Call(test_instance.inputs[0], test_instance.inputs[1])));
2994 }
2995 }
2996
2997 // TODO(jpp): WASM_EXEC_TEST(TryCatchFinally)
OLDNEW
« src/wasm/ast-decoder.cc ('K') | « src/wasm/ast-decoder.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698