1/* 2 * Copyright (C) 2013, 2014 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#include "config.h" 27#include "FTLValueFormat.h" 28 29#if ENABLE(FTL_JIT) 30 31#include "AssemblyHelpers.h" 32 33namespace JSC { namespace FTL { 34 35void reboxAccordingToFormat( 36 ValueFormat format, AssemblyHelpers& jit, GPRReg value, GPRReg scratch1, GPRReg scratch2) 37{ 38 switch (format) { 39 case ValueFormatInt32: { 40 jit.zeroExtend32ToPtr(value, value); 41 jit.or64(GPRInfo::tagTypeNumberRegister, value); 42 break; 43 } 44 45 case ValueFormatInt52: { 46 jit.rshift64(AssemblyHelpers::TrustedImm32(JSValue::int52ShiftAmount), value); 47 jit.moveDoubleTo64(FPRInfo::fpRegT0, scratch2); 48 jit.boxInt52(value, value, scratch1, FPRInfo::fpRegT0); 49 jit.move64ToDouble(scratch2, FPRInfo::fpRegT0); 50 break; 51 } 52 53 case ValueFormatStrictInt52: { 54 jit.moveDoubleTo64(FPRInfo::fpRegT0, scratch2); 55 jit.boxInt52(value, value, scratch1, FPRInfo::fpRegT0); 56 jit.move64ToDouble(scratch2, FPRInfo::fpRegT0); 57 break; 58 } 59 60 case ValueFormatBoolean: { 61 jit.zeroExtend32ToPtr(value, value); 62 jit.or32(MacroAssembler::TrustedImm32(ValueFalse), value); 63 break; 64 } 65 66 case ValueFormatJSValue: { 67 // Done already! 68 break; 69 } 70 71 case ValueFormatDouble: { 72 jit.moveDoubleTo64(FPRInfo::fpRegT0, scratch1); 73 jit.move64ToDouble(value, FPRInfo::fpRegT0); 74 jit.purifyNaN(FPRInfo::fpRegT0); 75 jit.boxDouble(FPRInfo::fpRegT0, value); 76 jit.move64ToDouble(scratch1, FPRInfo::fpRegT0); 77 break; 78 } 79 80 default: 81 RELEASE_ASSERT_NOT_REACHED(); 82 break; 83 } 84} 85 86} } // namespace JSC::FTL 87 88namespace WTF { 89 90using namespace JSC::FTL; 91 92void printInternal(PrintStream& out, ValueFormat format) 93{ 94 switch (format) { 95 case InvalidValueFormat: 96 out.print("Invalid"); 97 return; 98 case ValueFormatInt32: 99 out.print("Int32"); 100 return; 101 case ValueFormatInt52: 102 out.print("Int52"); 103 return; 104 case ValueFormatStrictInt52: 105 out.print("StrictInt52"); 106 return; 107 case ValueFormatBoolean: 108 out.print("Boolean"); 109 return; 110 case ValueFormatJSValue: 111 out.print("JSValue"); 112 return; 113 case ValueFormatDouble: 114 out.print("Double"); 115 return; 116 } 117 118 RELEASE_ASSERT_NOT_REACHED(); 119} 120 121} // namespace WTF 122 123#endif // ENABLE(FTL_JIT) 124 125