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 |