OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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 "test/unittests/compiler/instruction-selector-unittest.h" | 5 #include "test/unittests/compiler/instruction-selector-unittest.h" |
6 | 6 |
7 namespace v8 { | 7 namespace v8 { |
8 namespace internal { | 8 namespace internal { |
9 namespace compiler { | 9 namespace compiler { |
10 | 10 |
(...skipping 3017 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3028 m.Return(n); | 3028 m.Return(n); |
3029 Stream s = m.Build(); | 3029 Stream s = m.Build(); |
3030 ASSERT_EQ(1U, s.size()); | 3030 ASSERT_EQ(1U, s.size()); |
3031 EXPECT_EQ(kArm64Float64Neg, s[0]->arch_opcode()); | 3031 EXPECT_EQ(kArm64Float64Neg, s[0]->arch_opcode()); |
3032 ASSERT_EQ(1U, s[0]->InputCount()); | 3032 ASSERT_EQ(1U, s[0]->InputCount()); |
3033 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(0))); | 3033 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(0))); |
3034 ASSERT_EQ(1U, s[0]->OutputCount()); | 3034 ASSERT_EQ(1U, s[0]->OutputCount()); |
3035 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output())); | 3035 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output())); |
3036 } | 3036 } |
3037 | 3037 |
| 3038 |
| 3039 TEST_F(InstructionSelectorTest, Float32Max) { |
| 3040 StreamBuilder m(this, kMachFloat32, kMachFloat32, kMachFloat32); |
| 3041 Node* const p0 = m.Parameter(0); |
| 3042 Node* const p1 = m.Parameter(1); |
| 3043 Node* const n = m.Float32Max(p0, p1); |
| 3044 m.Return(n); |
| 3045 Stream s = m.Build(); |
| 3046 // Float32Max is `(b < a) ? a : b`. |
| 3047 ASSERT_EQ(1U, s.size()); |
| 3048 EXPECT_EQ(kArm64Float32CmpAndFloat32Sel, s[0]->arch_opcode()); |
| 3049 EXPECT_EQ(kFlags_select, s[0]->flags_mode()); |
| 3050 EXPECT_EQ(kUnsignedLessThan, s[0]->flags_condition()); |
| 3051 ASSERT_EQ(4U, s[0]->InputCount()); |
| 3052 EXPECT_EQ(s.ToVreg(p1), s.ToVreg(s[0]->InputAt(0))); |
| 3053 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(1))); |
| 3054 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(2))); |
| 3055 EXPECT_EQ(s.ToVreg(p1), s.ToVreg(s[0]->InputAt(3))); |
| 3056 ASSERT_EQ(1U, s[0]->OutputCount()); |
| 3057 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output())); |
| 3058 } |
| 3059 |
| 3060 |
| 3061 TEST_F(InstructionSelectorTest, Float32Min) { |
| 3062 StreamBuilder m(this, kMachFloat32, kMachFloat32, kMachFloat32); |
| 3063 Node* const p0 = m.Parameter(0); |
| 3064 Node* const p1 = m.Parameter(1); |
| 3065 Node* const n = m.Float32Min(p0, p1); |
| 3066 m.Return(n); |
| 3067 Stream s = m.Build(); |
| 3068 // Float32Min is `(a < b) ? a : b`. |
| 3069 ASSERT_EQ(1U, s.size()); |
| 3070 EXPECT_EQ(kArm64Float32CmpAndFloat32Sel, s[0]->arch_opcode()); |
| 3071 EXPECT_EQ(kFlags_select, s[0]->flags_mode()); |
| 3072 EXPECT_EQ(kUnsignedLessThan, s[0]->flags_condition()); |
| 3073 ASSERT_EQ(4U, s[0]->InputCount()); |
| 3074 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(0))); |
| 3075 EXPECT_EQ(s.ToVreg(p1), s.ToVreg(s[0]->InputAt(1))); |
| 3076 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(2))); |
| 3077 EXPECT_EQ(s.ToVreg(p1), s.ToVreg(s[0]->InputAt(3))); |
| 3078 ASSERT_EQ(1U, s[0]->OutputCount()); |
| 3079 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output())); |
| 3080 } |
| 3081 |
| 3082 |
| 3083 TEST_F(InstructionSelectorTest, Float32MaxZeroOnLeft) { |
| 3084 float zeroes[] = {0.0f, -0.0f}; |
| 3085 TRACED_FOREACH(float, zero, zeroes) { |
| 3086 StreamBuilder m(this, kMachFloat32, kMachFloat32); |
| 3087 Node* const p0 = m.Float32Constant(zero); |
| 3088 Node* const p1 = m.Parameter(0); |
| 3089 Node* const n = m.Float32Max(p0, p1); |
| 3090 m.Return(n); |
| 3091 Stream s = m.Build(); |
| 3092 // Float32Max(a = 0.0f, b) is `(b < 0.0f) ? a : b`. |
| 3093 ASSERT_EQ(1U, s.size()); |
| 3094 EXPECT_EQ(kArm64Float32CmpAndFloat32Sel, s[0]->arch_opcode()); |
| 3095 EXPECT_EQ(kFlags_select, s[0]->flags_mode()); |
| 3096 EXPECT_EQ(kUnsignedLessThan, s[0]->flags_condition()); |
| 3097 ASSERT_EQ(4U, s[0]->InputCount()); |
| 3098 EXPECT_TRUE(s[0]->InputAt(1)->IsImmediate()); |
| 3099 EXPECT_EQ(s.ToVreg(p1), s.ToVreg(s[0]->InputAt(0))); |
| 3100 EXPECT_EQ(0.0f, s.ToFloat32(s[0]->InputAt(1))); |
| 3101 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(2))); |
| 3102 EXPECT_EQ(s.ToVreg(p1), s.ToVreg(s[0]->InputAt(3))); |
| 3103 ASSERT_EQ(1U, s[0]->OutputCount()); |
| 3104 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output())); |
| 3105 } |
| 3106 } |
| 3107 |
| 3108 |
| 3109 TEST_F(InstructionSelectorTest, Float32MinZeroOnRight) { |
| 3110 float zeroes[] = {0.0f, -0.0f}; |
| 3111 TRACED_FOREACH(float, zero, zeroes) { |
| 3112 StreamBuilder m(this, kMachFloat32, kMachFloat32); |
| 3113 Node* const p0 = m.Parameter(0); |
| 3114 Node* const p1 = m.Float32Constant(zero); |
| 3115 Node* const n = m.Float32Min(p0, p1); |
| 3116 m.Return(n); |
| 3117 Stream s = m.Build(); |
| 3118 // Float32Min(a, b = 0.0f) is `(a < 0.0f) ? a : b`. |
| 3119 ASSERT_EQ(1U, s.size()); |
| 3120 EXPECT_EQ(kArm64Float32CmpAndFloat32Sel, s[0]->arch_opcode()); |
| 3121 EXPECT_EQ(kFlags_select, s[0]->flags_mode()); |
| 3122 EXPECT_EQ(kUnsignedLessThan, s[0]->flags_condition()); |
| 3123 ASSERT_EQ(4U, s[0]->InputCount()); |
| 3124 EXPECT_TRUE(s[0]->InputAt(1)->IsImmediate()); |
| 3125 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(0))); |
| 3126 EXPECT_EQ(0.0f, s.ToFloat32(s[0]->InputAt(1))); |
| 3127 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(2))); |
| 3128 EXPECT_EQ(s.ToVreg(p1), s.ToVreg(s[0]->InputAt(3))); |
| 3129 ASSERT_EQ(1U, s[0]->OutputCount()); |
| 3130 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output())); |
| 3131 } |
| 3132 } |
| 3133 |
| 3134 |
| 3135 TEST_F(InstructionSelectorTest, Float64Max) { |
| 3136 StreamBuilder m(this, kMachFloat64, kMachFloat64, kMachFloat64); |
| 3137 Node* const p0 = m.Parameter(0); |
| 3138 Node* const p1 = m.Parameter(1); |
| 3139 Node* const n = m.Float64Max(p0, p1); |
| 3140 m.Return(n); |
| 3141 Stream s = m.Build(); |
| 3142 // Float64Max is `(b < a) ? a : b`. |
| 3143 ASSERT_EQ(1U, s.size()); |
| 3144 EXPECT_EQ(kArm64Float64CmpAndFloat64Sel, s[0]->arch_opcode()); |
| 3145 EXPECT_EQ(kFlags_select, s[0]->flags_mode()); |
| 3146 EXPECT_EQ(kUnsignedLessThan, s[0]->flags_condition()); |
| 3147 ASSERT_EQ(4U, s[0]->InputCount()); |
| 3148 EXPECT_EQ(s.ToVreg(p1), s.ToVreg(s[0]->InputAt(0))); |
| 3149 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(1))); |
| 3150 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(2))); |
| 3151 EXPECT_EQ(s.ToVreg(p1), s.ToVreg(s[0]->InputAt(3))); |
| 3152 ASSERT_EQ(1U, s[0]->OutputCount()); |
| 3153 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output())); |
| 3154 } |
| 3155 |
| 3156 |
| 3157 TEST_F(InstructionSelectorTest, Float64Min) { |
| 3158 StreamBuilder m(this, kMachFloat64, kMachFloat64, kMachFloat64); |
| 3159 Node* const p0 = m.Parameter(0); |
| 3160 Node* const p1 = m.Parameter(1); |
| 3161 Node* const n = m.Float64Min(p0, p1); |
| 3162 m.Return(n); |
| 3163 Stream s = m.Build(); |
| 3164 // Float64Min is `(a < b) ? a : b`. |
| 3165 ASSERT_EQ(1U, s.size()); |
| 3166 EXPECT_EQ(kArm64Float64CmpAndFloat64Sel, s[0]->arch_opcode()); |
| 3167 EXPECT_EQ(kFlags_select, s[0]->flags_mode()); |
| 3168 EXPECT_EQ(kUnsignedLessThan, s[0]->flags_condition()); |
| 3169 ASSERT_EQ(4U, s[0]->InputCount()); |
| 3170 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(0))); |
| 3171 EXPECT_EQ(s.ToVreg(p1), s.ToVreg(s[0]->InputAt(1))); |
| 3172 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(2))); |
| 3173 EXPECT_EQ(s.ToVreg(p1), s.ToVreg(s[0]->InputAt(3))); |
| 3174 ASSERT_EQ(1U, s[0]->OutputCount()); |
| 3175 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output())); |
| 3176 } |
| 3177 |
| 3178 |
| 3179 TEST_F(InstructionSelectorTest, Float64MaxZeroOnLeft) { |
| 3180 double zeroes[] = {0.0, -0.0}; |
| 3181 TRACED_FOREACH(double, zero, zeroes) { |
| 3182 StreamBuilder m(this, kMachFloat64, kMachFloat64); |
| 3183 Node* const p0 = m.Float64Constant(zero); |
| 3184 Node* const p1 = m.Parameter(0); |
| 3185 Node* const n = m.Float64Max(p0, p1); |
| 3186 m.Return(n); |
| 3187 Stream s = m.Build(); |
| 3188 // Float64Max(a = 0.0, b) is `(b < 0.0) ? a : b`. |
| 3189 ASSERT_EQ(1U, s.size()); |
| 3190 EXPECT_EQ(kArm64Float64CmpAndFloat64Sel, s[0]->arch_opcode()); |
| 3191 EXPECT_EQ(kFlags_select, s[0]->flags_mode()); |
| 3192 EXPECT_EQ(kUnsignedLessThan, s[0]->flags_condition()); |
| 3193 ASSERT_EQ(4U, s[0]->InputCount()); |
| 3194 EXPECT_TRUE(s[0]->InputAt(1)->IsImmediate()); |
| 3195 EXPECT_EQ(s.ToVreg(p1), s.ToVreg(s[0]->InputAt(0))); |
| 3196 EXPECT_EQ(0.0, s.ToFloat64(s[0]->InputAt(1))); |
| 3197 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(2))); |
| 3198 EXPECT_EQ(s.ToVreg(p1), s.ToVreg(s[0]->InputAt(3))); |
| 3199 ASSERT_EQ(1U, s[0]->OutputCount()); |
| 3200 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output())); |
| 3201 } |
| 3202 } |
| 3203 |
| 3204 |
| 3205 TEST_F(InstructionSelectorTest, Float64MinZeroOnRight) { |
| 3206 double zeroes[] = {0.0, -0.0}; |
| 3207 TRACED_FOREACH(double, zero, zeroes) { |
| 3208 StreamBuilder m(this, kMachFloat64, kMachFloat64); |
| 3209 Node* const p0 = m.Parameter(0); |
| 3210 Node* const p1 = m.Float64Constant(zero); |
| 3211 Node* const n = m.Float64Min(p0, p1); |
| 3212 m.Return(n); |
| 3213 Stream s = m.Build(); |
| 3214 // Float64Min(a, b = 0.0) is `(a < 0.0) ? a : b`. |
| 3215 ASSERT_EQ(1U, s.size()); |
| 3216 EXPECT_EQ(kArm64Float64CmpAndFloat64Sel, s[0]->arch_opcode()); |
| 3217 EXPECT_EQ(kFlags_select, s[0]->flags_mode()); |
| 3218 EXPECT_EQ(kUnsignedLessThan, s[0]->flags_condition()); |
| 3219 ASSERT_EQ(4U, s[0]->InputCount()); |
| 3220 EXPECT_TRUE(s[0]->InputAt(1)->IsImmediate()); |
| 3221 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(0))); |
| 3222 EXPECT_EQ(0.0, s.ToFloat64(s[0]->InputAt(1))); |
| 3223 EXPECT_EQ(s.ToVreg(p0), s.ToVreg(s[0]->InputAt(2))); |
| 3224 EXPECT_EQ(s.ToVreg(p1), s.ToVreg(s[0]->InputAt(3))); |
| 3225 ASSERT_EQ(1U, s[0]->OutputCount()); |
| 3226 EXPECT_EQ(s.ToVreg(n), s.ToVreg(s[0]->Output())); |
| 3227 } |
| 3228 } |
| 3229 |
| 3230 |
3038 } // namespace compiler | 3231 } // namespace compiler |
3039 } // namespace internal | 3232 } // namespace internal |
3040 } // namespace v8 | 3233 } // namespace v8 |
OLD | NEW |