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

Side by Side Diff: test/unittests/compiler/arm64/instruction-selector-arm64-unittest.cc

Issue 1360603003: [arm64] Implement Float(32|64)(Min|Max) using fcsel. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 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
OLDNEW
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
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
OLDNEW
« src/compiler/arm64/code-generator-arm64.cc ('K') | « src/compiler/x87/code-generator-x87.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698