1 //===-- RegisterContextTest.cpp -------------------------------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #include "gtest/gtest.h"
11 #include "Plugins/Process/Utility/RegisterContext_x86.h"
13 #include "llvm/ADT/STLExtras.h"
14 #include "llvm/Support/FormatVariadic.h"
18 using namespace lldb_private
;
20 struct TagWordTestVector
{
27 constexpr MMSReg
st_from_comp(uint64_t mantissa
, uint16_t sign_exp
) {
29 ret
.comp
.mantissa
= mantissa
;
30 ret
.comp
.sign_exp
= sign_exp
;
34 const std::array
<MMSReg
, 8> st_regs
= {
35 st_from_comp(0x8000000000000000, 0x4000), // +2.0
36 st_from_comp(0x3f00000000000000, 0x0000), // 1.654785e-4932
37 st_from_comp(0x0000000000000000, 0x0000), // +0
38 st_from_comp(0x0000000000000000, 0x8000), // -0
39 st_from_comp(0x8000000000000000, 0x7fff), // +inf
40 st_from_comp(0x8000000000000000, 0xffff), // -inf
41 st_from_comp(0xc000000000000000, 0xffff), // nan
42 st_from_comp(0x8000000000000000, 0xc000), // -2.0
45 const std::array
<TagWordTestVector
, 8> tag_word_test_vectors
{
46 TagWordTestVector
{0x3800, 0x3fff, 0x80, 1},
47 TagWordTestVector
{0x3000, 0x2fff, 0xc0, 2},
48 TagWordTestVector
{0x2800, 0x27ff, 0xe0, 3},
49 TagWordTestVector
{0x2000, 0x25ff, 0xf0, 4},
50 TagWordTestVector
{0x1800, 0x25bf, 0xf8, 5},
51 TagWordTestVector
{0x1000, 0x25af, 0xfc, 6},
52 TagWordTestVector
{0x0800, 0x25ab, 0xfe, 7},
53 TagWordTestVector
{0x0000, 0x25a8, 0xff, 8},
56 TEST(RegisterContext_x86Test
, AbridgedToFullTagWord
) {
57 for (const auto &x
: llvm::enumerate(tag_word_test_vectors
)) {
58 SCOPED_TRACE(llvm::formatv("tag_word_test_vectors[{0}]", x
.index()));
59 std::array
<MMSReg
, 8> test_regs
;
60 for (int i
= 0; i
< x
.value().st_reg_num
; ++i
)
61 test_regs
[i
] = st_regs
[x
.value().st_reg_num
- i
- 1];
63 AbridgedToFullTagWord(x
.value().tw_abridged
, x
.value().sw
, test_regs
),
68 TEST(RegisterContext_x86Test
, FullToAbridgedTagWord
) {
69 for (const auto &x
: llvm::enumerate(tag_word_test_vectors
)) {
70 SCOPED_TRACE(llvm::formatv("tag_word_test_vectors[{0}]", x
.index()));
71 EXPECT_EQ(FullToAbridgedTagWord(x
.value().tw
), x
.value().tw_abridged
);