| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 // | 4 // |
| 5 // Modified by the Subzero authors. | 5 // Modified by the Subzero authors. |
| 6 // | 6 // |
| 7 //===- subzero/src/assembler_ia32.cpp - Assembler for x86-32 -------------===// | 7 //===- subzero/src/assembler_ia32.cpp - Assembler for x86-32 -------------===// |
| 8 // | 8 // |
| 9 // The Subzero Code Generator | 9 // The Subzero Code Generator |
| 10 // | 10 // |
| (...skipping 930 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 941 } | 941 } |
| 942 | 942 |
| 943 void AssemblerX86::sqrtpd(XmmRegister dst) { | 943 void AssemblerX86::sqrtpd(XmmRegister dst) { |
| 944 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 944 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 945 EmitUint8(0x66); | 945 EmitUint8(0x66); |
| 946 EmitUint8(0x0F); | 946 EmitUint8(0x0F); |
| 947 EmitUint8(0x51); | 947 EmitUint8(0x51); |
| 948 EmitXmmRegisterOperand(dst, dst); | 948 EmitXmmRegisterOperand(dst, dst); |
| 949 } | 949 } |
| 950 | 950 |
| 951 void AssemblerX86::cvtps2pd(XmmRegister dst, XmmRegister src) { | |
| 952 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | |
| 953 EmitUint8(0x0F); | |
| 954 EmitUint8(0x5A); | |
| 955 EmitXmmRegisterOperand(dst, src); | |
| 956 } | |
| 957 | |
| 958 void AssemblerX86::cvtpd2ps(XmmRegister dst, XmmRegister src) { | |
| 959 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | |
| 960 EmitUint8(0x66); | |
| 961 EmitUint8(0x0F); | |
| 962 EmitUint8(0x5A); | |
| 963 EmitXmmRegisterOperand(dst, src); | |
| 964 } | |
| 965 | |
| 966 void AssemblerX86::shufpd(XmmRegister dst, XmmRegister src, | 951 void AssemblerX86::shufpd(XmmRegister dst, XmmRegister src, |
| 967 const Immediate &imm) { | 952 const Immediate &imm) { |
| 968 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 953 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 969 EmitUint8(0x66); | 954 EmitUint8(0x66); |
| 970 EmitUint8(0x0F); | 955 EmitUint8(0x0F); |
| 971 EmitUint8(0xC6); | 956 EmitUint8(0xC6); |
| 972 EmitXmmRegisterOperand(dst, src); | 957 EmitXmmRegisterOperand(dst, src); |
| 973 assert(imm.is_uint8()); | 958 assert(imm.is_uint8()); |
| 974 EmitUint8(imm.value()); | 959 EmitUint8(imm.value()); |
| 975 } | 960 } |
| 976 | 961 |
| 977 void AssemblerX86::cvtsi2ss(XmmRegister dst, GPRRegister src) { | 962 void AssemblerX86::cvtdq2ps(Type /* Ignore */, XmmRegister dst, |
| 963 XmmRegister src) { |
| 964 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 965 EmitUint8(0x0F); |
| 966 EmitUint8(0x5B); |
| 967 EmitXmmRegisterOperand(dst, src); |
| 968 } |
| 969 |
| 970 void AssemblerX86::cvtdq2ps(Type /* Ignore */, XmmRegister dst, |
| 971 const Address &src) { |
| 972 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 973 EmitUint8(0x0F); |
| 974 EmitUint8(0x5B); |
| 975 EmitOperand(dst, src); |
| 976 } |
| 977 |
| 978 void AssemblerX86::cvttps2dq(Type /* Ignore */, XmmRegister dst, |
| 979 XmmRegister src) { |
| 978 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 980 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 979 EmitUint8(0xF3); | 981 EmitUint8(0xF3); |
| 980 EmitUint8(0x0F); | 982 EmitUint8(0x0F); |
| 981 EmitUint8(0x2A); | 983 EmitUint8(0x5B); |
| 982 EmitOperand(dst, Operand(src)); | 984 EmitXmmRegisterOperand(dst, src); |
| 983 } | 985 } |
| 984 | 986 |
| 985 void AssemblerX86::cvtsi2sd(XmmRegister dst, GPRRegister src) { | 987 void AssemblerX86::cvttps2dq(Type /* Ignore */, XmmRegister dst, |
| 986 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 988 const Address &src) { |
| 987 EmitUint8(0xF2); | |
| 988 EmitUint8(0x0F); | |
| 989 EmitUint8(0x2A); | |
| 990 EmitOperand(dst, Operand(src)); | |
| 991 } | |
| 992 | |
| 993 void AssemblerX86::cvtss2si(GPRRegister dst, XmmRegister src) { | |
| 994 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 989 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 995 EmitUint8(0xF3); | 990 EmitUint8(0xF3); |
| 996 EmitUint8(0x0F); | 991 EmitUint8(0x0F); |
| 997 EmitUint8(0x2D); | 992 EmitUint8(0x5B); |
| 998 EmitXmmRegisterOperand(dst, src); | 993 EmitOperand(dst, src); |
| 999 } | 994 } |
| 1000 | 995 |
| 1001 void AssemblerX86::cvtss2sd(XmmRegister dst, XmmRegister src) { | 996 void AssemblerX86::cvtsi2ss(Type DestTy, XmmRegister dst, GPRRegister src) { |
| 1002 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 997 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1003 EmitUint8(0xF3); | 998 EmitUint8(isFloat32Asserting32Or64(DestTy) ? 0xF3 : 0xF2); |
| 999 EmitUint8(0x0F); |
| 1000 EmitUint8(0x2A); |
| 1001 EmitRegisterOperand(dst, src); |
| 1002 } |
| 1003 |
| 1004 void AssemblerX86::cvtsi2ss(Type DestTy, XmmRegister dst, const Address &src) { |
| 1005 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1006 EmitUint8(isFloat32Asserting32Or64(DestTy) ? 0xF3 : 0xF2); |
| 1007 EmitUint8(0x0F); |
| 1008 EmitUint8(0x2A); |
| 1009 EmitOperand(dst, src); |
| 1010 } |
| 1011 |
| 1012 void AssemblerX86::cvtfloat2float(Type SrcTy, XmmRegister dst, |
| 1013 XmmRegister src) { |
| 1014 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1015 // ss2sd or sd2ss |
| 1016 EmitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2); |
| 1004 EmitUint8(0x0F); | 1017 EmitUint8(0x0F); |
| 1005 EmitUint8(0x5A); | 1018 EmitUint8(0x5A); |
| 1006 EmitXmmRegisterOperand(dst, src); | 1019 EmitXmmRegisterOperand(dst, src); |
| 1007 } | 1020 } |
| 1008 | 1021 |
| 1009 void AssemblerX86::cvtsd2si(GPRRegister dst, XmmRegister src) { | 1022 void AssemblerX86::cvtfloat2float(Type SrcTy, XmmRegister dst, |
| 1023 const Address &src) { |
| 1010 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1024 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1011 EmitUint8(0xF2); | 1025 EmitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2); |
| 1012 EmitUint8(0x0F); | 1026 EmitUint8(0x0F); |
| 1013 EmitUint8(0x2D); | 1027 EmitUint8(0x5A); |
| 1014 EmitXmmRegisterOperand(dst, src); | 1028 EmitOperand(dst, src); |
| 1015 } | 1029 } |
| 1016 | 1030 |
| 1017 void AssemblerX86::cvttss2si(GPRRegister dst, XmmRegister src) { | 1031 void AssemblerX86::cvttss2si(Type SrcTy, GPRRegister dst, XmmRegister src) { |
| 1018 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1032 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1019 EmitUint8(0xF3); | 1033 EmitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2); |
| 1020 EmitUint8(0x0F); | 1034 EmitUint8(0x0F); |
| 1021 EmitUint8(0x2C); | 1035 EmitUint8(0x2C); |
| 1022 EmitXmmRegisterOperand(dst, src); | 1036 EmitXmmRegisterOperand(dst, src); |
| 1023 } | 1037 } |
| 1024 | 1038 |
| 1025 void AssemblerX86::cvttsd2si(GPRRegister dst, XmmRegister src) { | 1039 void AssemblerX86::cvttss2si(Type SrcTy, GPRRegister dst, const Address &src) { |
| 1026 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1040 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1027 EmitUint8(0xF2); | 1041 EmitUint8(isFloat32Asserting32Or64(SrcTy) ? 0xF3 : 0xF2); |
| 1028 EmitUint8(0x0F); | 1042 EmitUint8(0x0F); |
| 1029 EmitUint8(0x2C); | 1043 EmitUint8(0x2C); |
| 1030 EmitXmmRegisterOperand(dst, src); | 1044 EmitOperand(dst, src); |
| 1031 } | |
| 1032 | |
| 1033 void AssemblerX86::cvtsd2ss(XmmRegister dst, XmmRegister src) { | |
| 1034 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | |
| 1035 EmitUint8(0xF2); | |
| 1036 EmitUint8(0x0F); | |
| 1037 EmitUint8(0x5A); | |
| 1038 EmitXmmRegisterOperand(dst, src); | |
| 1039 } | |
| 1040 | |
| 1041 void AssemblerX86::cvtdq2pd(XmmRegister dst, XmmRegister src) { | |
| 1042 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | |
| 1043 EmitUint8(0xF3); | |
| 1044 EmitUint8(0x0F); | |
| 1045 EmitUint8(0xE6); | |
| 1046 EmitXmmRegisterOperand(dst, src); | |
| 1047 } | 1045 } |
| 1048 | 1046 |
| 1049 void AssemblerX86::ucomiss(Type Ty, XmmRegister a, XmmRegister b) { | 1047 void AssemblerX86::ucomiss(Type Ty, XmmRegister a, XmmRegister b) { |
| 1050 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 1048 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 1051 if (Ty == IceType_f64) | 1049 if (Ty == IceType_f64) |
| 1052 EmitUint8(0x66); | 1050 EmitUint8(0x66); |
| 1053 EmitUint8(0x0F); | 1051 EmitUint8(0x0F); |
| 1054 EmitUint8(0x2E); | 1052 EmitUint8(0x2E); |
| 1055 EmitXmmRegisterOperand(a, b); | 1053 EmitXmmRegisterOperand(a, b); |
| 1056 } | 1054 } |
| (...skipping 1290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2347 assert(shifter == RegX8632::Encoded_Reg_ecx); | 2345 assert(shifter == RegX8632::Encoded_Reg_ecx); |
| 2348 (void)shifter; | 2346 (void)shifter; |
| 2349 if (Ty == IceType_i16) | 2347 if (Ty == IceType_i16) |
| 2350 EmitOperandSizeOverride(); | 2348 EmitOperandSizeOverride(); |
| 2351 EmitUint8(isByteSizedArithType(Ty) ? 0xD2 : 0xD3); | 2349 EmitUint8(isByteSizedArithType(Ty) ? 0xD2 : 0xD3); |
| 2352 EmitOperand(rm, operand); | 2350 EmitOperand(rm, operand); |
| 2353 } | 2351 } |
| 2354 | 2352 |
| 2355 } // end of namespace x86 | 2353 } // end of namespace x86 |
| 2356 } // end of namespace Ice | 2354 } // end of namespace Ice |
| OLD | NEW |