OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
51 if (env.IsEmpty()) { | 51 if (env.IsEmpty()) { |
52 env = v8::Context::New(); | 52 env = v8::Context::New(); |
53 } | 53 } |
54 } | 54 } |
55 | 55 |
56 | 56 |
57 #define __ assm. | 57 #define __ assm. |
58 | 58 |
59 TEST(AssemblerIa320) { | 59 TEST(AssemblerIa320) { |
60 InitializeVM(); | 60 InitializeVM(); |
61 v8::HandleScope scope; | 61 Isolate* isolate = reinterpret_cast<Isolate*>(env->GetIsolate()); |
| 62 HandleScope scope(isolate); |
62 | 63 |
63 v8::internal::byte buffer[256]; | 64 v8::internal::byte buffer[256]; |
64 Isolate* isolate = Isolate::Current(); | |
65 Assembler assm(isolate, buffer, sizeof buffer); | 65 Assembler assm(isolate, buffer, sizeof buffer); |
66 | 66 |
67 __ mov(eax, Operand(esp, 4)); | 67 __ mov(eax, Operand(esp, 4)); |
68 __ add(eax, Operand(esp, 8)); | 68 __ add(eax, Operand(esp, 8)); |
69 __ ret(0); | 69 __ ret(0); |
70 | 70 |
71 CodeDesc desc; | 71 CodeDesc desc; |
72 assm.GetCode(&desc); | 72 assm.GetCode(&desc); |
73 Object* code = isolate->heap()->CreateCode( | 73 Object* code = isolate->heap()->CreateCode( |
74 desc, | 74 desc, |
75 Code::ComputeFlags(Code::STUB), | 75 Code::ComputeFlags(Code::STUB), |
76 Handle<Code>())->ToObjectChecked(); | 76 Handle<Code>())->ToObjectChecked(); |
77 CHECK(code->IsCode()); | 77 CHECK(code->IsCode()); |
78 #ifdef OBJECT_PRINT | 78 #ifdef OBJECT_PRINT |
79 Code::cast(code)->Print(); | 79 Code::cast(code)->Print(); |
80 #endif | 80 #endif |
81 F2 f = FUNCTION_CAST<F2>(Code::cast(code)->entry()); | 81 F2 f = FUNCTION_CAST<F2>(Code::cast(code)->entry()); |
82 int res = f(3, 4); | 82 int res = f(3, 4); |
83 ::printf("f() = %d\n", res); | 83 ::printf("f() = %d\n", res); |
84 CHECK_EQ(7, res); | 84 CHECK_EQ(7, res); |
85 } | 85 } |
86 | 86 |
87 | 87 |
88 TEST(AssemblerIa321) { | 88 TEST(AssemblerIa321) { |
89 InitializeVM(); | 89 InitializeVM(); |
90 v8::HandleScope scope; | 90 Isolate* isolate = reinterpret_cast<Isolate*>(env->GetIsolate()); |
| 91 HandleScope scope(isolate); |
91 | 92 |
92 v8::internal::byte buffer[256]; | 93 v8::internal::byte buffer[256]; |
93 Isolate* isolate = Isolate::Current(); | |
94 Assembler assm(isolate, buffer, sizeof buffer); | 94 Assembler assm(isolate, buffer, sizeof buffer); |
95 Label L, C; | 95 Label L, C; |
96 | 96 |
97 __ mov(edx, Operand(esp, 4)); | 97 __ mov(edx, Operand(esp, 4)); |
98 __ xor_(eax, eax); // clear eax | 98 __ xor_(eax, eax); // clear eax |
99 __ jmp(&C); | 99 __ jmp(&C); |
100 | 100 |
101 __ bind(&L); | 101 __ bind(&L); |
102 __ add(eax, edx); | 102 __ add(eax, edx); |
103 __ sub(edx, Immediate(1)); | 103 __ sub(edx, Immediate(1)); |
(...skipping 15 matching lines...) Expand all Loading... |
119 #endif | 119 #endif |
120 F1 f = FUNCTION_CAST<F1>(Code::cast(code)->entry()); | 120 F1 f = FUNCTION_CAST<F1>(Code::cast(code)->entry()); |
121 int res = f(100); | 121 int res = f(100); |
122 ::printf("f() = %d\n", res); | 122 ::printf("f() = %d\n", res); |
123 CHECK_EQ(5050, res); | 123 CHECK_EQ(5050, res); |
124 } | 124 } |
125 | 125 |
126 | 126 |
127 TEST(AssemblerIa322) { | 127 TEST(AssemblerIa322) { |
128 InitializeVM(); | 128 InitializeVM(); |
129 v8::HandleScope scope; | 129 Isolate* isolate = reinterpret_cast<Isolate*>(env->GetIsolate()); |
| 130 HandleScope scope(isolate); |
130 | 131 |
131 v8::internal::byte buffer[256]; | 132 v8::internal::byte buffer[256]; |
132 Isolate* isolate = Isolate::Current(); | |
133 Assembler assm(isolate, buffer, sizeof buffer); | 133 Assembler assm(isolate, buffer, sizeof buffer); |
134 Label L, C; | 134 Label L, C; |
135 | 135 |
136 __ mov(edx, Operand(esp, 4)); | 136 __ mov(edx, Operand(esp, 4)); |
137 __ mov(eax, 1); | 137 __ mov(eax, 1); |
138 __ jmp(&C); | 138 __ jmp(&C); |
139 | 139 |
140 __ bind(&L); | 140 __ bind(&L); |
141 __ imul(eax, edx); | 141 __ imul(eax, edx); |
142 __ sub(edx, Immediate(1)); | 142 __ sub(edx, Immediate(1)); |
(...skipping 23 matching lines...) Expand all Loading... |
166 CHECK_EQ(3628800, res); | 166 CHECK_EQ(3628800, res); |
167 } | 167 } |
168 | 168 |
169 | 169 |
170 typedef int (*F3)(float x); | 170 typedef int (*F3)(float x); |
171 | 171 |
172 TEST(AssemblerIa323) { | 172 TEST(AssemblerIa323) { |
173 InitializeVM(); | 173 InitializeVM(); |
174 if (!CpuFeatures::IsSupported(SSE2)) return; | 174 if (!CpuFeatures::IsSupported(SSE2)) return; |
175 | 175 |
176 v8::HandleScope scope; | 176 Isolate* isolate = reinterpret_cast<Isolate*>(env->GetIsolate()); |
| 177 HandleScope scope(isolate); |
177 | 178 |
178 v8::internal::byte buffer[256]; | 179 v8::internal::byte buffer[256]; |
179 Isolate* isolate = Isolate::Current(); | |
180 Assembler assm(isolate, buffer, sizeof buffer); | 180 Assembler assm(isolate, buffer, sizeof buffer); |
181 | 181 |
182 CHECK(CpuFeatures::IsSupported(SSE2)); | 182 CHECK(CpuFeatures::IsSupported(SSE2)); |
183 { CpuFeatureScope fscope(&assm, SSE2); | 183 { CpuFeatureScope fscope(&assm, SSE2); |
184 __ cvttss2si(eax, Operand(esp, 4)); | 184 __ cvttss2si(eax, Operand(esp, 4)); |
185 __ ret(0); | 185 __ ret(0); |
186 } | 186 } |
187 | 187 |
188 CodeDesc desc; | 188 CodeDesc desc; |
189 assm.GetCode(&desc); | 189 assm.GetCode(&desc); |
(...skipping 12 matching lines...) Expand all Loading... |
202 CHECK_EQ(-3, res); | 202 CHECK_EQ(-3, res); |
203 } | 203 } |
204 | 204 |
205 | 205 |
206 typedef int (*F4)(double x); | 206 typedef int (*F4)(double x); |
207 | 207 |
208 TEST(AssemblerIa324) { | 208 TEST(AssemblerIa324) { |
209 InitializeVM(); | 209 InitializeVM(); |
210 if (!CpuFeatures::IsSupported(SSE2)) return; | 210 if (!CpuFeatures::IsSupported(SSE2)) return; |
211 | 211 |
212 v8::HandleScope scope; | 212 Isolate* isolate = reinterpret_cast<Isolate*>(env->GetIsolate()); |
| 213 HandleScope scope(isolate); |
213 | 214 |
214 v8::internal::byte buffer[256]; | 215 v8::internal::byte buffer[256]; |
215 Isolate* isolate = Isolate::Current(); | |
216 Assembler assm(isolate, buffer, sizeof buffer); | 216 Assembler assm(isolate, buffer, sizeof buffer); |
217 | 217 |
218 CHECK(CpuFeatures::IsSupported(SSE2)); | 218 CHECK(CpuFeatures::IsSupported(SSE2)); |
219 CpuFeatureScope fscope(&assm, SSE2); | 219 CpuFeatureScope fscope(&assm, SSE2); |
220 __ cvttsd2si(eax, Operand(esp, 4)); | 220 __ cvttsd2si(eax, Operand(esp, 4)); |
221 __ ret(0); | 221 __ ret(0); |
222 | 222 |
223 CodeDesc desc; | 223 CodeDesc desc; |
224 assm.GetCode(&desc); | 224 assm.GetCode(&desc); |
225 Code* code = Code::cast(isolate->heap()->CreateCode( | 225 Code* code = Code::cast(isolate->heap()->CreateCode( |
226 desc, | 226 desc, |
227 Code::ComputeFlags(Code::STUB), | 227 Code::ComputeFlags(Code::STUB), |
228 Handle<Code>())->ToObjectChecked()); | 228 Handle<Code>())->ToObjectChecked()); |
229 // don't print the code - our disassembler can't handle cvttsd2si | 229 // don't print the code - our disassembler can't handle cvttsd2si |
230 // instead print bytes | 230 // instead print bytes |
231 Disassembler::Dump(stdout, | 231 Disassembler::Dump(stdout, |
232 code->instruction_start(), | 232 code->instruction_start(), |
233 code->instruction_start() + code->instruction_size()); | 233 code->instruction_start() + code->instruction_size()); |
234 F4 f = FUNCTION_CAST<F4>(code->entry()); | 234 F4 f = FUNCTION_CAST<F4>(code->entry()); |
235 int res = f(2.718281828); | 235 int res = f(2.718281828); |
236 ::printf("f() = %d\n", res); | 236 ::printf("f() = %d\n", res); |
237 CHECK_EQ(2, res); | 237 CHECK_EQ(2, res); |
238 } | 238 } |
239 | 239 |
240 | 240 |
241 static int baz = 42; | 241 static int baz = 42; |
242 TEST(AssemblerIa325) { | 242 TEST(AssemblerIa325) { |
243 InitializeVM(); | 243 InitializeVM(); |
244 v8::HandleScope scope; | 244 Isolate* isolate = reinterpret_cast<Isolate*>(env->GetIsolate()); |
| 245 HandleScope scope(isolate); |
245 | 246 |
246 v8::internal::byte buffer[256]; | 247 v8::internal::byte buffer[256]; |
247 Isolate* isolate = Isolate::Current(); | |
248 Assembler assm(isolate, buffer, sizeof buffer); | 248 Assembler assm(isolate, buffer, sizeof buffer); |
249 | 249 |
250 __ mov(eax, Operand(reinterpret_cast<intptr_t>(&baz), RelocInfo::NONE32)); | 250 __ mov(eax, Operand(reinterpret_cast<intptr_t>(&baz), RelocInfo::NONE32)); |
251 __ ret(0); | 251 __ ret(0); |
252 | 252 |
253 CodeDesc desc; | 253 CodeDesc desc; |
254 assm.GetCode(&desc); | 254 assm.GetCode(&desc); |
255 Code* code = Code::cast(isolate->heap()->CreateCode( | 255 Code* code = Code::cast(isolate->heap()->CreateCode( |
256 desc, | 256 desc, |
257 Code::ComputeFlags(Code::STUB), | 257 Code::ComputeFlags(Code::STUB), |
258 Handle<Code>())->ToObjectChecked()); | 258 Handle<Code>())->ToObjectChecked()); |
259 F0 f = FUNCTION_CAST<F0>(code->entry()); | 259 F0 f = FUNCTION_CAST<F0>(code->entry()); |
260 int res = f(); | 260 int res = f(); |
261 CHECK_EQ(42, res); | 261 CHECK_EQ(42, res); |
262 } | 262 } |
263 | 263 |
264 | 264 |
265 typedef double (*F5)(double x, double y); | 265 typedef double (*F5)(double x, double y); |
266 | 266 |
267 TEST(AssemblerIa326) { | 267 TEST(AssemblerIa326) { |
268 InitializeVM(); | 268 InitializeVM(); |
269 if (!CpuFeatures::IsSupported(SSE2)) return; | 269 if (!CpuFeatures::IsSupported(SSE2)) return; |
270 | 270 |
271 v8::HandleScope scope; | 271 Isolate* isolate = reinterpret_cast<Isolate*>(env->GetIsolate()); |
| 272 HandleScope scope(isolate); |
272 v8::internal::byte buffer[256]; | 273 v8::internal::byte buffer[256]; |
273 Isolate* isolate = Isolate::Current(); | |
274 Assembler assm(isolate, buffer, sizeof buffer); | 274 Assembler assm(isolate, buffer, sizeof buffer); |
275 | 275 |
276 CpuFeatureScope fscope(&assm, SSE2); | 276 CpuFeatureScope fscope(&assm, SSE2); |
277 __ movdbl(xmm0, Operand(esp, 1 * kPointerSize)); | 277 __ movdbl(xmm0, Operand(esp, 1 * kPointerSize)); |
278 __ movdbl(xmm1, Operand(esp, 3 * kPointerSize)); | 278 __ movdbl(xmm1, Operand(esp, 3 * kPointerSize)); |
279 __ addsd(xmm0, xmm1); | 279 __ addsd(xmm0, xmm1); |
280 __ mulsd(xmm0, xmm1); | 280 __ mulsd(xmm0, xmm1); |
281 __ subsd(xmm0, xmm1); | 281 __ subsd(xmm0, xmm1); |
282 __ divsd(xmm0, xmm1); | 282 __ divsd(xmm0, xmm1); |
283 // Copy xmm0 to st(0) using eight bytes of stack. | 283 // Copy xmm0 to st(0) using eight bytes of stack. |
(...skipping 23 matching lines...) Expand all Loading... |
307 CHECK(2.29 < res && res < 2.31); | 307 CHECK(2.29 < res && res < 2.31); |
308 } | 308 } |
309 | 309 |
310 | 310 |
311 typedef double (*F6)(int x); | 311 typedef double (*F6)(int x); |
312 | 312 |
313 TEST(AssemblerIa328) { | 313 TEST(AssemblerIa328) { |
314 InitializeVM(); | 314 InitializeVM(); |
315 if (!CpuFeatures::IsSupported(SSE2)) return; | 315 if (!CpuFeatures::IsSupported(SSE2)) return; |
316 | 316 |
317 v8::HandleScope scope; | 317 Isolate* isolate = reinterpret_cast<Isolate*>(env->GetIsolate()); |
| 318 HandleScope scope(isolate); |
318 v8::internal::byte buffer[256]; | 319 v8::internal::byte buffer[256]; |
319 Isolate* isolate = Isolate::Current(); | |
320 Assembler assm(isolate, buffer, sizeof buffer); | 320 Assembler assm(isolate, buffer, sizeof buffer); |
321 CpuFeatureScope fscope(&assm, SSE2); | 321 CpuFeatureScope fscope(&assm, SSE2); |
322 __ mov(eax, Operand(esp, 4)); | 322 __ mov(eax, Operand(esp, 4)); |
323 __ cvtsi2sd(xmm0, eax); | 323 __ cvtsi2sd(xmm0, eax); |
324 // Copy xmm0 to st(0) using eight bytes of stack. | 324 // Copy xmm0 to st(0) using eight bytes of stack. |
325 __ sub(esp, Immediate(8)); | 325 __ sub(esp, Immediate(8)); |
326 __ movdbl(Operand(esp, 0), xmm0); | 326 __ movdbl(Operand(esp, 0), xmm0); |
327 __ fld_d(Operand(esp, 0)); | 327 __ fld_d(Operand(esp, 0)); |
328 __ add(esp, Immediate(8)); | 328 __ add(esp, Immediate(8)); |
329 __ ret(0); | 329 __ ret(0); |
(...skipping 12 matching lines...) Expand all Loading... |
342 | 342 |
343 ::printf("f() = %f\n", res); | 343 ::printf("f() = %f\n", res); |
344 CHECK(11.99 < res && res < 12.001); | 344 CHECK(11.99 < res && res < 12.001); |
345 } | 345 } |
346 | 346 |
347 | 347 |
348 typedef int (*F7)(double x, double y); | 348 typedef int (*F7)(double x, double y); |
349 | 349 |
350 TEST(AssemblerIa329) { | 350 TEST(AssemblerIa329) { |
351 InitializeVM(); | 351 InitializeVM(); |
352 v8::HandleScope scope; | 352 Isolate* isolate = reinterpret_cast<Isolate*>(env->GetIsolate()); |
| 353 HandleScope scope(isolate); |
353 v8::internal::byte buffer[256]; | 354 v8::internal::byte buffer[256]; |
354 Isolate* isolate = Isolate::Current(); | |
355 MacroAssembler assm(isolate, buffer, sizeof buffer); | 355 MacroAssembler assm(isolate, buffer, sizeof buffer); |
356 enum { kEqual = 0, kGreater = 1, kLess = 2, kNaN = 3, kUndefined = 4 }; | 356 enum { kEqual = 0, kGreater = 1, kLess = 2, kNaN = 3, kUndefined = 4 }; |
357 Label equal_l, less_l, greater_l, nan_l; | 357 Label equal_l, less_l, greater_l, nan_l; |
358 __ fld_d(Operand(esp, 3 * kPointerSize)); | 358 __ fld_d(Operand(esp, 3 * kPointerSize)); |
359 __ fld_d(Operand(esp, 1 * kPointerSize)); | 359 __ fld_d(Operand(esp, 1 * kPointerSize)); |
360 __ FCmp(); | 360 __ FCmp(); |
361 __ j(parity_even, &nan_l); | 361 __ j(parity_even, &nan_l); |
362 __ j(equal, &equal_l); | 362 __ j(equal, &equal_l); |
363 __ j(below, &less_l); | 363 __ j(below, &less_l); |
364 __ j(above, &greater_l); | 364 __ j(above, &greater_l); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
398 CHECK_EQ(kLess, f(1.1, 2.2)); | 398 CHECK_EQ(kLess, f(1.1, 2.2)); |
399 CHECK_EQ(kEqual, f(2.2, 2.2)); | 399 CHECK_EQ(kEqual, f(2.2, 2.2)); |
400 CHECK_EQ(kGreater, f(3.3, 2.2)); | 400 CHECK_EQ(kGreater, f(3.3, 2.2)); |
401 CHECK_EQ(kNaN, f(OS::nan_value(), 1.1)); | 401 CHECK_EQ(kNaN, f(OS::nan_value(), 1.1)); |
402 } | 402 } |
403 | 403 |
404 | 404 |
405 TEST(AssemblerIa3210) { | 405 TEST(AssemblerIa3210) { |
406 // Test chaining of label usages within instructions (issue 1644). | 406 // Test chaining of label usages within instructions (issue 1644). |
407 InitializeVM(); | 407 InitializeVM(); |
408 v8::HandleScope scope; | 408 Isolate* isolate = reinterpret_cast<Isolate*>(env->GetIsolate()); |
409 Isolate* isolate = Isolate::Current(); | 409 HandleScope scope(isolate); |
410 Assembler assm(isolate, NULL, 0); | 410 Assembler assm(isolate, NULL, 0); |
411 | 411 |
412 Label target; | 412 Label target; |
413 __ j(equal, &target); | 413 __ j(equal, &target); |
414 __ j(not_equal, &target); | 414 __ j(not_equal, &target); |
415 __ bind(&target); | 415 __ bind(&target); |
416 __ nop(); | 416 __ nop(); |
417 } | 417 } |
418 | 418 |
419 | 419 |
420 TEST(AssemblerMultiByteNop) { | 420 TEST(AssemblerMultiByteNop) { |
421 InitializeVM(); | 421 InitializeVM(); |
422 v8::HandleScope scope; | 422 Isolate* isolate = reinterpret_cast<Isolate*>(env->GetIsolate()); |
| 423 HandleScope scope(isolate); |
423 v8::internal::byte buffer[1024]; | 424 v8::internal::byte buffer[1024]; |
424 Isolate* isolate = Isolate::Current(); | |
425 Assembler assm(isolate, buffer, sizeof(buffer)); | 425 Assembler assm(isolate, buffer, sizeof(buffer)); |
426 __ push(ebx); | 426 __ push(ebx); |
427 __ push(ecx); | 427 __ push(ecx); |
428 __ push(edx); | 428 __ push(edx); |
429 __ push(edi); | 429 __ push(edi); |
430 __ push(esi); | 430 __ push(esi); |
431 __ mov(eax, 1); | 431 __ mov(eax, 1); |
432 __ mov(ebx, 2); | 432 __ mov(ebx, 2); |
433 __ mov(ecx, 3); | 433 __ mov(ecx, 3); |
434 __ mov(edx, 4); | 434 __ mov(edx, 4); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
479 | 479 |
480 F0 f = FUNCTION_CAST<F0>(code->entry()); | 480 F0 f = FUNCTION_CAST<F0>(code->entry()); |
481 int res = f(); | 481 int res = f(); |
482 CHECK_EQ(42, res); | 482 CHECK_EQ(42, res); |
483 } | 483 } |
484 | 484 |
485 | 485 |
486 | 486 |
487 | 487 |
488 #undef __ | 488 #undef __ |
OLD | NEW |