Skip to content

Commit 9b05e6f

Browse files
authored
Fix SSE Instructions for XED v2022.04.17 (#597)
* added logging * add logging * add op corresponding to read * same fix for movhps * add fillers to MOVLPD * add filler to MOVLPS * add filler to CVTSD2SS * filler for CVTSS2SD * remove logging * bump cxx-common * drop llvm-12 support * drop in other runs * add dummy read to MOVHLPS * change ISEL to match size from xed update * fix MOVLHPS * fix VMOVDDUP_XMMdq_XMMdq size
1 parent 85d287c commit 9b05e6f

File tree

5 files changed

+20
-18
lines changed

5 files changed

+20
-18
lines changed

.github/workflows/ci.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ jobs:
2323
matrix:
2424
image:
2525
- { name: 'ubuntu', tag: '20.04' }
26-
llvm: ['12', '13']
26+
llvm: ['13']
2727

2828
runs-on: ubuntu-20.04
2929
container:
@@ -94,7 +94,7 @@ jobs:
9494
fail-fast: false
9595
matrix:
9696
os: ['macos-11']
97-
llvm: ['12', '13']
97+
llvm: ['13']
9898

9999
runs-on: ${{ matrix.os }}
100100

@@ -215,7 +215,7 @@ jobs:
215215
runs-on: ubuntu-latest
216216
strategy:
217217
matrix:
218-
llvm: ["12", "13"]
218+
llvm: ["13"]
219219
ubuntu: ["20.04"]
220220
steps:
221221
- uses: actions/checkout@v2

lib/Arch/X86/Semantics/CONVERT.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,7 @@ IF_AVX(IF_64BIT(
307307
namespace {
308308

309309
template <typename S1>
310-
DEF_SEM(CVTSD2SS, V128W dst, S1 src) {
310+
DEF_SEM(CVTSD2SS, V128W dst, V128 _nop_read, S1 src) {
311311
FWriteV32(dst, FInsertV32(FReadV32(dst), 0,
312312
Float32(FExtractV64(FReadV64(src), 0))));
313313
return memory;
@@ -349,7 +349,7 @@ DEF_SEM(CVTSI2SD, V128W dst, V128 src1, S2 src2) {
349349
}
350350

351351
template <typename S2>
352-
DEF_SEM(CVTSS2SD, VV128W dst_src1, S2 src2) {
352+
DEF_SEM(CVTSS2SD, VV128W dst_src1, V128 _nop_read, S2 src2) {
353353
auto src1_vec = FReadV64(dst_src1);
354354
auto src2_vec = FReadV32(src2);
355355
auto conv_val = Float64(FExtractV32(src2_vec, 0));

lib/Arch/X86/Semantics/DATAXFER.cpp

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -84,16 +84,16 @@ DEF_SEM(MOVDQx, D dst, S src) {
8484
return memory;
8585
}
8686

87-
template <typename D, typename S>
88-
DEF_SEM(MOVLPS, D dst, S src) {
87+
template <typename D, typename S, typename... Fs>
88+
DEF_SEM(MOVLPS, D dst, Fs... _nop_fillers, S src) {
8989
auto src_vec = FReadV32(src);
9090
auto low1 = FExtractV32(src_vec, 0);
9191
auto low2 = FExtractV32(src_vec, 1);
9292
FWriteV32(dst, FInsertV32(FInsertV32(FReadV32(dst), 0, low1), 1, low2));
9393
return memory;
9494
}
9595

96-
DEF_SEM(MOVLHPS, V128W dst, V128 src) {
96+
DEF_SEM(MOVLHPS, V128W dst, V128 _noop_read, V128 src) {
9797
auto res = FReadV32(dst);
9898
auto src1 = FReadV32(src);
9999
res = FInsertV32(res, 2, FExtractV32(src1, 0));
@@ -102,7 +102,7 @@ DEF_SEM(MOVLHPS, V128W dst, V128 src) {
102102
return memory;
103103
}
104104

105-
DEF_SEM(MOVHLPS, V128W dst, V128 src) {
105+
DEF_SEM(MOVHLPS, V128W dst, V128 _nop_read, V128 src) {
106106
auto res = FReadV32(dst);
107107
auto src1 = FReadV32(src);
108108
res = FInsertV32(res, 0, FExtractV32(src1, 2));
@@ -111,8 +111,8 @@ DEF_SEM(MOVHLPS, V128W dst, V128 src) {
111111
return memory;
112112
}
113113

114-
template <typename D, typename S>
115-
DEF_SEM(MOVLPD, D dst, S src) {
114+
template <typename D, typename S, typename... Fs>
115+
DEF_SEM(MOVLPD, D dst, Fs... fargs, S src) {
116116
FWriteV64(dst, FInsertV64(FReadV64(dst), 0, FExtractV64(FReadV64(src), 0)));
117117
return memory;
118118
}
@@ -466,8 +466,8 @@ DEF_ISEL(VMOVDQA_MEMqq_YMMqq) = MOVDQx<MV256W, VV256>;
466466
DEF_ISEL(VMOVDQA_YMMqq_YMMqq_7F) = MOVDQx<VV256W, VV256>;
467467
#endif // HAS_FEATURE_AVX
468468

469-
DEF_ISEL(MOVLPS_MEMq_XMMps) = MOVLPS<MV64W, V128>;
470-
DEF_ISEL(MOVLPS_XMMq_MEMq) = MOVLPS<V128W, MV64>;
469+
DEF_ISEL(MOVLPS_MEMq_XMMq) = MOVLPS<MV64W, V128>;
470+
DEF_ISEL(MOVLPS_XMMq_MEMq) = MOVLPS<V128W, MV64, V128>;
471471
IF_AVX(DEF_ISEL(VMOVLPS_MEMq_XMMq) = MOVLPS<MV64W, VV128>;)
472472
IF_AVX(DEF_ISEL(VMOVLPS_XMMdq_XMMdq_MEMq) = VMOVLPS;)
473473

@@ -487,7 +487,7 @@ IF_AVX(DEF_ISEL(VMOVLHPS_XMMdq_XMMdq_XMMdq) = VMOVLHPS;)
487487
# endif // HAS_FEATURE_AVX512
488488
#endif // HAS_FEATURE_AVX
489489

490-
DEF_ISEL(MOVLPD_XMMsd_MEMq) = MOVLPD<V128W, MV64>;
490+
DEF_ISEL(MOVLPD_XMMsd_MEMq) = MOVLPD<V128W, MV64, V128>;
491491
DEF_ISEL(MOVLPD_MEMq_XMMsd) = MOVLPD<MV64W, V128>;
492492
IF_AVX(DEF_ISEL(VMOVLPD_MEMq_XMMq) = MOVLPD<MV64W, VV128>;)
493493
IF_AVX(DEF_ISEL(VMOVLPD_XMMdq_XMMdq_MEMq) = VMOVLPD;)
@@ -585,7 +585,8 @@ DEF_ISEL(MOVNTSS_MEMd_XMMd) = MOVSS_MEM<MV32W, V128>;
585585

586586
namespace {
587587

588-
DEF_SEM(MOVHPD, V128W dst, MV64 src) {
588+
// NOTE(Ian): Latest xed adds a read operand referring to the read of lower bits.
589+
DEF_SEM(MOVHPD, V128W dst, V128 _nop_read, MV64 src) {
589590
FWriteV64(dst, FInsertV64(FReadV64(dst), 1, FExtractV64(FReadV64(src), 0)));
590591
return memory;
591592
}
@@ -616,7 +617,8 @@ IF_AVX(DEF_ISEL(VMOVHPD_MEMq_XMMdq) = MOVHPD_STORE;)
616617

617618
namespace {
618619

619-
DEF_SEM(MOVHPS, V128W dst, MV64 src) {
620+
// NOTE(Ian): Xed adds a read op for the bits read but not written to.
621+
DEF_SEM(MOVHPS, V128W dst, V128 _nop_read, MV64 src) {
620622
auto dst_vec = FReadV32(dst);
621623
auto src_vec = FReadV32(src);
622624
auto low_entry = FExtractV32(src_vec, 0);

lib/Arch/X86/Semantics/SSE.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1616,7 +1616,7 @@ DEF_SEM(MOVDDUP, D dst, S1 src) {
16161616
DEF_ISEL(MOVDDUP_XMMdq_MEMq) = MOVDDUP<V128W, MV64>;
16171617
DEF_ISEL(MOVDDUP_XMMdq_XMMq) = MOVDDUP<V128W, V128>;
16181618
IF_AVX(DEF_ISEL(VMOVDDUP_XMMdq_MEMq) = MOVDDUP<VV128W, MV64>;)
1619-
IF_AVX(DEF_ISEL(VMOVDDUP_XMMdq_XMMdq) = MOVDDUP<VV128W, V128>;)
1619+
IF_AVX(DEF_ISEL(VMOVDDUP_XMMdq_XMMq) = MOVDDUP<VV128W, V128>;)
16201620
/*
16211621
2320 VMOVDDUP VMOVDDUP_YMMqq_MEMqq DATAXFER AVX AVX ATTRIBUTES:
16221622
2321 VMOVDDUP VMOVDDUP_YMMqq_YMMqq DATAXFER AVX AVX ATTRIBUTES:

scripts/build.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ LLVM_VERSION=llvm-13
2727
OS_VERSION=
2828
ARCH_VERSION=
2929
BUILD_FLAGS=
30-
CXX_COMMON_VERSION="v0.1.8"
30+
CXX_COMMON_VERSION="v0.2.7"
3131

3232
# There are pre-build versions of various libraries for specific
3333
# Ubuntu releases.

0 commit comments

Comments
 (0)