74 lines · cpp
1//===-- RegisterContextTest.cpp -------------------------------------------===//2//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-exception6//7//===----------------------------------------------------------------------===//8 9#include "gtest/gtest.h"10 11#include "Plugins/Process/Utility/RegisterContext_x86.h"12 13#include "llvm/ADT/STLExtras.h"14#include "llvm/Support/FormatVariadic.h"15 16#include <array>17 18using namespace lldb_private;19 20struct TagWordTestVector {21 uint16_t sw;22 uint16_t tw;23 uint8_t tw_abridged;24 int st_reg_num;25};26 27constexpr MMSReg st_from_comp(uint64_t mantissa, uint16_t sign_exp) {28 MMSReg ret = {};29 ret.comp.mantissa = mantissa;30 ret.comp.sign_exp = sign_exp;31 return ret;32}33 34const std::array<MMSReg, 8> st_regs = {35 st_from_comp(0x8000000000000000, 0x4000), // +2.036 st_from_comp(0x3f00000000000000, 0x0000), // 1.654785e-493237 st_from_comp(0x0000000000000000, 0x0000), // +038 st_from_comp(0x0000000000000000, 0x8000), // -039 st_from_comp(0x8000000000000000, 0x7fff), // +inf40 st_from_comp(0x8000000000000000, 0xffff), // -inf41 st_from_comp(0xc000000000000000, 0xffff), // nan42 st_from_comp(0x8000000000000000, 0xc000), // -2.043};44 45const 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},54};55 56TEST(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];62 EXPECT_EQ(63 AbridgedToFullTagWord(x.value().tw_abridged, x.value().sw, test_regs),64 x.value().tw);65 }66}67 68TEST(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);72 }73}74