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

Side by Side Diff: src/assembler-ia32.h

Issue 27046: Patch (SSE3) for faster To(U)Int32 conversion in bit (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 11 years, 10 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 | Annotate | Revision Log
« no previous file with comments | « src/api.cc ('k') | src/assembler-ia32.cc » ('j') | src/v8.cc » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 1994-2006 Sun Microsystems Inc. 1 // Copyright (c) 1994-2006 Sun Microsystems Inc.
2 // All Rights Reserved. 2 // All Rights Reserved.
3 // 3 //
4 // Redistribution and use in source and binary forms, with or without 4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are 5 // modification, are permitted provided that the following conditions are
6 // met: 6 // met:
7 // 7 //
8 // - Redistributions of source code must retain the above copyright notice, 8 // - Redistributions of source code must retain the above copyright notice,
9 // this list of conditions and the following disclaimer. 9 // this list of conditions and the following disclaimer.
10 // 10 //
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after
340 // CpuFeatures::Scope fscope(SSE2); 340 // CpuFeatures::Scope fscope(SSE2);
341 // // Generate SSE2 floating point code. 341 // // Generate SSE2 floating point code.
342 // } else { 342 // } else {
343 // // Generate standard x87 floating point code. 343 // // Generate standard x87 floating point code.
344 // } 344 // }
345 class CpuFeatures : public AllStatic { 345 class CpuFeatures : public AllStatic {
346 public: 346 public:
347 // Feature flags bit positions. They are mostly based on the CPUID spec. 347 // Feature flags bit positions. They are mostly based on the CPUID spec.
348 // (We assign CPUID itself to one of the currently reserved bits -- 348 // (We assign CPUID itself to one of the currently reserved bits --
349 // feel free to change this if needed.) 349 // feel free to change this if needed.)
350 enum Feature { SSE2 = 26, CMOV = 15, RDTSC = 4, CPUID = 10 }; 350 enum Feature { SSE3 = 32, SSE2 = 26, CMOV = 15, RDTSC = 4, CPUID = 10 };
351 // Detect features of the target CPU. Set safe defaults if the serializer 351 // Detect features of the target CPU. Set safe defaults if the serializer
352 // is enabled (snapshots must be portable). 352 // is enabled (snapshots must be portable).
353 static void Probe(); 353 static void Probe();
354 // Check whether a feature is supported by the target CPU. 354 // Check whether a feature is supported by the target CPU.
355 static bool IsSupported(Feature f) { return supported_ & (1 << f); } 355 static bool IsSupported(Feature f) { return supported_ & (1UL << f); }
356 // Check whether a feature is currently enabled. 356 // Check whether a feature is currently enabled.
357 static bool IsEnabled(Feature f) { return enabled_ & (1 << f); } 357 static bool IsEnabled(Feature f) { return enabled_ & (1UL << f); }
358 // Enable a specified feature within a scope. 358 // Enable a specified feature within a scope.
359 class Scope BASE_EMBEDDED { 359 class Scope BASE_EMBEDDED {
360 #ifdef DEBUG 360 #ifdef DEBUG
361 public: 361 public:
362 explicit Scope(Feature f) { 362 explicit Scope(Feature f) {
363 ASSERT(CpuFeatures::IsSupported(f)); 363 ASSERT(CpuFeatures::IsSupported(f));
364 old_enabled_ = CpuFeatures::enabled_; 364 old_enabled_ = CpuFeatures::enabled_;
365 CpuFeatures::enabled_ |= (1 << f); 365 CpuFeatures::enabled_ |= (1UL << f);
366 } 366 }
367 ~Scope() { CpuFeatures::enabled_ = old_enabled_; } 367 ~Scope() { CpuFeatures::enabled_ = old_enabled_; }
368 private: 368 private:
369 uint32_t old_enabled_; 369 uint64_t old_enabled_;
370 #else 370 #else
371 public: 371 public:
372 explicit Scope(Feature f) {} 372 explicit Scope(Feature f) {}
373 #endif 373 #endif
374 }; 374 };
375 private: 375 private:
376 static uint32_t supported_; 376 static uint64_t supported_;
377 static uint32_t enabled_; 377 static uint64_t enabled_;
378 }; 378 };
379 379
380 380
381 class Assembler : public Malloced { 381 class Assembler : public Malloced {
382 private: 382 private:
383 // The relocation writer's position is kGap bytes below the end of 383 // The relocation writer's position is kGap bytes below the end of
384 // the generated instructions. This leaves enough space for the 384 // the generated instructions. This leaves enough space for the
385 // longest possible ia32 instruction (17 bytes as of 9/26/06) and 385 // longest possible ia32 instruction (17 bytes as of 9/26/06) and
386 // allows for a single, fast space check per instruction. 386 // allows for a single, fast space check per instruction.
387 static const int kGap = 32; 387 static const int kGap = 32;
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after
628 void fstp_d(const Operand& adr); 628 void fstp_d(const Operand& adr);
629 629
630 void fild_s(const Operand& adr); 630 void fild_s(const Operand& adr);
631 void fild_d(const Operand& adr); 631 void fild_d(const Operand& adr);
632 632
633 void fist_s(const Operand& adr); 633 void fist_s(const Operand& adr);
634 634
635 void fistp_s(const Operand& adr); 635 void fistp_s(const Operand& adr);
636 void fistp_d(const Operand& adr); 636 void fistp_d(const Operand& adr);
637 637
638 void fisttp_s(const Operand& adr);
639
638 void fabs(); 640 void fabs();
639 void fchs(); 641 void fchs();
640 642
641 void fadd(int i); 643 void fadd(int i);
642 void fsub(int i); 644 void fsub(int i);
643 void fmul(int i); 645 void fmul(int i);
644 void fdiv(int i); 646 void fdiv(int i);
645 647
646 void fisub_s(const Operand& adr); 648 void fisub_s(const Operand& adr);
647 649
648 void faddp(int i = 1); 650 void faddp(int i = 1);
649 void fsubp(int i = 1); 651 void fsubp(int i = 1);
650 void fsubrp(int i = 1); 652 void fsubrp(int i = 1);
651 void fmulp(int i = 1); 653 void fmulp(int i = 1);
652 void fdivp(int i = 1); 654 void fdivp(int i = 1);
653 void fprem(); 655 void fprem();
654 void fprem1(); 656 void fprem1();
655 657
656 void fxch(int i = 1); 658 void fxch(int i = 1);
657 void fincstp(); 659 void fincstp();
658 void ffree(int i = 0); 660 void ffree(int i = 0);
659 661
660 void ftst(); 662 void ftst();
661 void fucomp(int i); 663 void fucomp(int i);
662 void fucompp(); 664 void fucompp();
663 void fcompp(); 665 void fcompp();
664 void fnstsw_ax(); 666 void fnstsw_ax();
665 void fwait(); 667 void fwait();
668 void fnclex();
666 669
667 void frndint(); 670 void frndint();
668 671
669 void sahf(); 672 void sahf();
670 673
671 void cpuid(); 674 void cpuid();
672 675
673 // SSE2 instructions 676 // SSE2 instructions
674 void cvttss2si(Register dst, const Operand& src); 677 void cvttss2si(Register dst, const Operand& src);
675 void cvttsd2si(Register dst, const Operand& src); 678 void cvttsd2si(Register dst, const Operand& src);
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
830 private: 833 private:
831 Assembler* assembler_; 834 Assembler* assembler_;
832 #ifdef DEBUG 835 #ifdef DEBUG
833 int space_before_; 836 int space_before_;
834 #endif 837 #endif
835 }; 838 };
836 839
837 } } // namespace v8::internal 840 } } // namespace v8::internal
838 841
839 #endif // V8_ASSEMBLER_IA32_H_ 842 #endif // V8_ASSEMBLER_IA32_H_
OLDNEW
« no previous file with comments | « src/api.cc ('k') | src/assembler-ia32.cc » ('j') | src/v8.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698