diff --git a/cli/Makefile b/cli/Makefile index 322a3e20..a441ce37 100644 --- a/cli/Makefile +++ b/cli/Makefile @@ -43,8 +43,8 @@ CPPFLAGS = -I../src -I../driver -MD -MF $@.d OBJS_com = \ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o \ - dec_float.o str_buffer.o str_scanner.o option_base.o error_reporter.o \ - insn_base.o formatters.o value_formatter.o \ + dec_float.o ibm_float.o str_buffer.o str_scanner.o option_base.o \ + error_reporter.o insn_base.o formatters.o value_formatter.o \ $(foreach a,$(ARCHS),$(OBJS_$(a))) \ bin_memory.o bin_decoder.o bin_encoder.o intel_hex.o moto_srec.o \ file_reader.o file_printer.o list_formatter.o text_common.o diff --git a/cli/build.ninja b/cli/build.ninja index 83e8db2e..8f6e9333 100644 --- a/cli/build.ninja +++ b/cli/build.ninja @@ -25,7 +25,7 @@ build asm: link asm.o $ parsers.o reg_base.o str_buffer.o str_scanner.o symbol_store.o $ text_common.o value.o value_formatter.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o $ + dec_float.o ibm_float.o $ asm_cdp1802.o reg_cdp1802.o table_cdp1802.o text_cdp1802.o $ asm_f3850.o reg_f3850.o table_f3850.o text_f3850.o $ asm_i8048.o reg_i8048.o table_i8048.o text_i8048.o $ @@ -60,7 +60,7 @@ build dis: link dis.o $ list_formatter.o moto_srec.o option_base.o reg_base.o str_buffer.o $ str_scanner.o text_common.o value.o value_formatter.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o $ + dec_float.o ibm_float.o $ dis_cdp1802.o reg_cdp1802.o table_cdp1802.o text_cdp1802.o $ dis_f3850.o reg_f3850.o table_f3850.o text_f3850.o $ dis_i8048.o reg_i8048.o table_i8048.o text_i8048.o $ diff --git a/src/ibm_float.cpp b/src/ibm_float.cpp new file mode 100644 index 00000000..6145f713 --- /dev/null +++ b/src/ibm_float.cpp @@ -0,0 +1,177 @@ +/* + * Copyright 2024 Tadashi G. Takaoka + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ibm_float.h" +#include "fixed64.h" +#include "str_buffer.h" + +namespace libasm { + +const char *__ibm_float32::str() const { + static char buf[16]; + StrBuffer out{buf, sizeof(buf)}; + const auto sig = _u32 & SIG_MASK; + out.hex(tag(), 2).letter('.').hex(sig, 6); + return buf; +} + +__ibm_float32 &__ibm_float32::set(uint8_t tag, uint32_t sig) { + return set((static_cast(tag) << TAG_POS) | (sig & SIG_MASK)); +} + +__ibm_float32 &__ibm_float32::set(uint32_t bits) { + _u32 = bits; + return *this; +} + +Error __ibm_float32::set(const float80_t &f80) { + auto error = OK; + if (f80.isNan()) + error = NOT_AN_EXPECTED; + if (f80.isInf()) + error = OVERFLOW_RANGE; + if (f80.isZero() || error) { + _u32 = bits(f80.isNegative(), 0, 0); + return error; + } + fixed64_t sig; + // IBM float fraction is [1/16 .. 1.0) + // IEEE float fraction is [1.0 .. 2.0) + auto ieee_exp = f80.decompose(sig) + 1; // +1 for adjust + ieee_exp += sig.normalize(); + while (ieee_exp % 4) { + ieee_exp++; + sig.shift_right(1); + } + sig.round_off(MANT_DIG); + auto ibm_exp = ieee_exp / 4; + auto ibm_sig = sig.value() >> (64 - TAG_POS); // has explicit MSB + if (ibm_exp >= EXP_BASE) { + error = OVERFLOW_RANGE; + ibm_exp = -EXP_BASE; // ibm_sig = 0 + } + if (ibm_exp < -EXP_BASE) { + ibm_exp = -EXP_BASE; + ibm_sig = 0; + } + _u32 = bits(f80.isNegative(), ibm_exp + EXP_BASE, ibm_sig); + return error; +} + +uint32_t __ibm_float32::bits(bool sign, uint8_t exp, uint32_t sig) { + const auto tag = (sign ? SGN_MASK : 0) | exp; + return (static_cast(tag) << TAG_POS) | (sig & SIG_MASK); +} + +__ibm_float32::operator float80_t() const { + const auto tag = static_cast(_u32 >> TAG_POS); + const auto sign = (tag & SGN_MASK) != 0; + const auto bexp = tag & EXP_MASK; + const auto ibm_exp = static_cast(bexp) - EXP_BASE; + const auto ibm_sig = (_u32 & SIG_MASK); + if (bexp == 0 && ibm_sig == 0) + return float80_t::zero(sign); + fixed64_t ieee_sig{static_cast(ibm_sig) << (64 - MANT_DIG)}; + // IBM float fraction is [1/16 .. 1.0) + // IEEE float fraction is [1.0 .. 2.0) + auto ieee_exp = ibm_exp * 4 - 1; // -1 for adjust + ieee_exp += ieee_sig.normalize(); + return float80_t::compose(sign, ieee_exp, ieee_sig); +} + +const char *__ibm_float64::str() const { + static char buf[20]; + StrBuffer out{buf, sizeof(buf)}; + const auto sig = _u64 & SIG_MASK; + out.hex(tag(), 2) + .letter('.') + .hex(static_cast(sig >> 32), 6) + .letter('-') + .hex(static_cast(sig), 8); + return buf; +} + +__ibm_float64 &__ibm_float64::set(uint8_t tag, uint64_t sig) { + return set((static_cast(tag) << TAG_POS) | (sig & SIG_MASK)); +} + +__ibm_float64 &__ibm_float64::set(uint64_t bits) { + _u64 = bits; + return *this; +} + +Error __ibm_float64::set(const float80_t &f80) { + auto error = OK; + if (f80.isNan()) + error = NOT_AN_EXPECTED; + if (f80.isInf()) + error = OVERFLOW_RANGE; + if (f80.isZero() || error) { + _u64 = bits(f80.isNegative(), 0, 0); + return error; + } + fixed64_t sig; + // IBM float fraction is [1/16 .. 1.0) + // IEEE float fraction is [1.0 .. 2.0) + auto ieee_exp = f80.decompose(sig) + 1; // +1 for adjust + while (ieee_exp % 4) { + ieee_exp++; + sig.shift_right(1); + } + sig.round_off(MANT_DIG); + auto ibm_exp = ieee_exp / 4; + auto ibm_sig = sig.value() >> (64 - TAG_POS); // has explicit MSB + if (ibm_exp >= EXP_BASE) { + error = OVERFLOW_RANGE; + ibm_exp = -EXP_BASE; // ibm_sig = 0 + } + if (ibm_exp < -EXP_BASE) { + ibm_exp = -EXP_BASE; + ibm_sig = 0; + } + _u64 = bits(f80.isNegative(), ibm_exp + EXP_BASE, ibm_sig); + return error; +} + +uint64_t __ibm_float64::bits(bool sign, uint8_t exp, uint64_t sig) { + const auto tag = (sign ? SGN_MASK : 0) | exp; + return (static_cast(tag) << TAG_POS) | (sig & SIG_MASK); +} + +__ibm_float64::operator float80_t() const { + const auto tag = static_cast(_u64 >> TAG_POS); + const auto sign = (tag & SGN_MASK) != 0; + const auto bexp = tag & EXP_MASK; + const auto ibm_exp = static_cast(bexp) - EXP_BASE; + const auto ibm_sig = (_u64 & SIG_MASK); + if (bexp == 0 && ibm_sig == 0) + return float80_t::zero(sign); + fixed64_t ieee_sig{static_cast(ibm_sig) << (64 - MANT_DIG)}; + // IBM float fraction is [1/16 .. 1.0) + // IEEE float fraction is [1.0 .. 2.0) + auto ieee_exp = ibm_exp * 4 - 1; // -1 for adjust + ieee_exp += ieee_sig.normalize(); + return float80_t::compose(sign, ieee_exp, ieee_sig); +} + +} // namespace libasm + +// Local Variables: +// mode: c++ +// c-basic-offset: 4 +// tab-width: 4 +// End: +// vim: set ft=cpp et ts=4 sw=4: diff --git a/src/ibm_float.h b/src/ibm_float.h new file mode 100644 index 00000000..e567a882 --- /dev/null +++ b/src/ibm_float.h @@ -0,0 +1,109 @@ +/* + * Copyright 2024 Tadashi G. Takaoka + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __LIBASM_IBM_FLOAT_H__ +#define __LIBASM_IBM_FLOAT_H__ + +#include +#include "error_reporter.h" +#include "float80.h" + +#define IBMF32_MAX 7.237005e+75 +#define IBMF32_MIN 5.397605e-79 +#define IBMF64_MAX 7.237005577332262114e+75 +#define IBMF64_MIN 5.397605346934027891e-79 + +namespace libasm { + +struct __ibm_float32 { + __ibm_float32(uint8_t tag = 0, uint32_t sig = 0) { set(tag, sig); } + __ibm_float32(const __ibm_float32 &f32) = default; + __ibm_float32 &operator=(const __ibm_float32 &f32) = default; + + __ibm_float32 &set(uint8_t tag, uint32_t sig); + __ibm_float32 &set(uint32_t bits); + + Error set(const float80_t &f80); + explicit operator float80_t() const; + + uint32_t bits() const { return _u32; } + uint8_t tag() const { return _u32 >> TAG_POS; } + static uint32_t bits(bool sign, uint8_t exp, uint32_t sig); + + const char *str() const; + + static constexpr auto MANT_DIG = 24; + static constexpr auto TAG_POS = MANT_DIG; + static constexpr auto SGN_MASK = UINT8_C(0x80); + static constexpr auto EXP_MASK = UINT8_C(0x7F); + static constexpr auto EXP_BASE = INT8_C(0x40); + static constexpr auto SIG_MASK = (UINT32_C(1) << TAG_POS) - 1; + static constexpr auto MSD_POS = MANT_DIG - 4; + +private: + // |sign| bexp(7) | frac(24) | + // sign: 1=negative + // bexp: biased radix 16 exponent, offset 0x40, 0=zero + // frac: fraction hexadecimal digits, 1/16 <= frac < 1 + uint32_t _u32; +}; + +struct __ibm_float64 { + __ibm_float64(uint8_t tag = 0, uint64_t sig = 0) { set(tag, sig); } + __ibm_float64(const __ibm_float64 &f64) = default; + __ibm_float64 &operator=(const __ibm_float64 &f64) = default; + + __ibm_float64 &set(uint8_t tag, uint64_t sig); + __ibm_float64 &set(uint64_t bits); + + Error set(const float80_t &f80); + explicit operator float80_t() const; + + uint64_t bits() const { return _u64; } + uint8_t tag() const { return _u64 >> TAG_POS; } + static uint64_t bits(bool sign, uint8_t exp, uint64_t sig); + + const char *str() const; + + static constexpr auto MANT_DIG = 56; + static constexpr auto TAG_POS = MANT_DIG; + static constexpr auto SGN_MASK = UINT8_C(0x80); + static constexpr auto EXP_MASK = UINT8_C(0x7F); + static constexpr auto EXP_BASE = INT8_C(0x40); + static constexpr auto SIG_MASK = (UINT64_C(1) << TAG_POS) - 1; + static constexpr auto MSD_POS = MANT_DIG - 4; + +private: + // |sign| bexp(7) | frac(56) | + // sign: 1=negative + // bexp: biased radix 16 exponent, offset 0x40, 0=zero + // frac: fraction hexadecimal digits, 1/16 <= frac < 1 + uint64_t _u64; +}; + +using ibm_float32_t = __ibm_float32; +using ibm_float64_t = __ibm_float64; + +} // namespace libasm + +#endif + +// Local Variables: +// mode: c++ +// c-basic-offset: 4 +// tab-width: 4 +// End: +// vim: set ft=cpp et ts=4 sw=4: diff --git a/src/ninja.rules b/src/ninja.rules index 2eca1827..37460cec 100644 --- a/src/ninja.rules +++ b/src/ninja.rules @@ -11,7 +11,8 @@ build float80_base.o: cxx ${root}/src/float80_base.cpp build float80_hard.o: cxx ${root}/src/float80_hard.cpp build float80_soft.o: cxx ${root}/src/float80_soft.cpp build formatters.o: cxx ${root}/src/formatters.cpp -build ieee_float.o: cxx ${root}/src/ieee_float.cpp +build ibm_float.o: cxx ${root}/src/ibm_float.cpp +build ieee_float.o: cxx ${root}/src/ieee_float.cpp build insn_base.o: cxx ${root}/src/insn_base.cpp build operators.o: cxx ${root}/src/operators.cpp build option_base.o: cxx ${root}/src/option_base.cpp diff --git a/test/Makefile b/test/Makefile index 5a4fa117..2cca758a 100644 --- a/test/Makefile +++ b/test/Makefile @@ -47,22 +47,22 @@ OBJS_asm = test_asm_helper.o asm_base.o \ config_base.o insn_base.o operators.o parsers.o reg_base.o value.o \ value_parser.o text_common.o \ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o \ - dec_float.o + dec_float.o ibm_float.o OBJS_dis = test_dis_helper.o dis_base.o \ config_base.o formatters.o insn_base.o reg_base.o value.o \ value_formatter.o text_common.o \ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o \ - dec_float.o + dec_float.o ibm_float.o OBJS_expr = test_expr_helper.o \ config_base.o formatters.o insn_base.o operators.o parsers.o \ value.o value_formatter.o value_parser.o text_common.o \ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o \ - dec_float.o + dec_float.o ibm_float.o OBJS_gen = gen_driver.o test_generator.o tokenized_text.o \ config_base.o dis_base.o dis_formatter.o formatters.o insn_base.o \ list_formatter.o reg_base.o value.o value_formatter.o text_common.o \ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o \ - dec_float.o + dec_float.o ibm_float.o TEST_OBJS = $(ARCHS:%=test_asm_%.o) $(ARCHS:%=test_dis_%.o) EXPR_OBJS = $(EXPRS:%=test_expr_%.o) diff --git a/test/build.ninja b/test/build.ninja index 174976e9..dd3891da 100644 --- a/test/build.ninja +++ b/test/build.ninja @@ -27,7 +27,7 @@ build test_asm_cdp1802: run test_asm_cdp1802.o $ option_base.o parsers.o reg_base.o str_buffer.o str_scanner.o $ text_common.o value.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_asm_helper.o test_asserter.o + dec_float.o ibm_float.o test_asm_helper.o test_asserter.o build test_dis_cdp1802: run test_dis_cdp1802.o $ dis_cdp1802.o reg_cdp1802.o table_cdp1802.o text_cdp1802.o $ dis_base.o config_base.o error_reporter.o formatters.o insn_base.o $ @@ -50,7 +50,7 @@ build test_asm_f3850: run test_asm_f3850.o $ option_base.o parsers.o reg_base.o str_buffer.o str_scanner.o $ text_common.o value.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_asm_helper.o test_asserter.o + dec_float.o ibm_float.o test_asm_helper.o test_asserter.o build test_dis_f3850: run test_dis_f3850.o $ dis_f3850.o reg_f3850.o table_f3850.o text_f3850.o $ dis_base.o config_base.o error_reporter.o formatters.o insn_base.o $ @@ -73,7 +73,7 @@ build test_asm_i8048: run test_asm_i8048.o $ option_base.o parsers.o reg_base.o str_buffer.o str_scanner.o $ text_common.o value.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_asm_helper.o test_asserter.o + dec_float.o ibm_float.o test_asm_helper.o test_asserter.o build test_dis_i8048: run test_dis_i8048.o $ dis_i8048.o reg_i8048.o table_i8048.o text_i8048.o $ dis_base.o config_base.o error_reporter.o formatters.o insn_base.o $ @@ -96,7 +96,7 @@ build test_asm_i8051: run test_asm_i8051.o $ option_base.o parsers.o reg_base.o str_buffer.o str_scanner.o $ text_common.o value.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_asm_helper.o test_asserter.o + dec_float.o ibm_float.o test_asm_helper.o test_asserter.o build test_dis_i8051: run test_dis_i8051.o $ dis_i8051.o reg_i8051.o table_i8051.o text_i8051.o $ dis_base.o config_base.o error_reporter.o formatters.o insn_base.o $ @@ -119,7 +119,7 @@ build test_asm_i8080: run test_asm_i8080.o $ option_base.o parsers.o reg_base.o str_buffer.o str_scanner.o $ text_common.o value.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_asm_helper.o test_asserter.o + dec_float.o ibm_float.o test_asm_helper.o test_asserter.o build test_dis_i8080: run test_dis_i8080.o $ dis_i8080.o reg_i8080.o table_i8080.o text_i8080.o $ dis_base.o config_base.o error_reporter.o formatters.o insn_base.o $ @@ -142,7 +142,7 @@ build test_asm_i8086: run test_asm_i8086.o $ option_base.o parsers.o reg_base.o str_buffer.o str_scanner.o $ text_common.o value.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_asm_helper.o test_asserter.o + dec_float.o ibm_float.o test_asm_helper.o test_asserter.o build test_dis_i8086: run test_dis_i8086.o $ dis_i8086.o reg_i8086.o table_i8086.o text_i8086.o $ dis_base.o config_base.o error_reporter.o formatters.o insn_base.o $ @@ -165,7 +165,7 @@ build test_asm_i8096: run test_asm_i8096.o $ option_base.o parsers.o reg_base.o str_buffer.o str_scanner.o $ text_common.o value.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_asm_helper.o test_asserter.o + dec_float.o ibm_float.o test_asm_helper.o test_asserter.o build test_dis_i8096: run test_dis_i8096.o $ dis_i8096.o reg_i8096.o table_i8096.o text_i8096.o $ dis_base.o config_base.o error_reporter.o formatters.o insn_base.o $ @@ -188,7 +188,7 @@ build test_asm_ins8060: run test_asm_ins8060.o $ option_base.o parsers.o reg_base.o str_buffer.o str_scanner.o $ text_common.o value.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_asm_helper.o test_asserter.o + dec_float.o ibm_float.o test_asm_helper.o test_asserter.o build test_dis_ins8060: run test_dis_ins8060.o $ dis_ins8060.o reg_ins8060.o table_ins8060.o text_ins8060.o $ dis_base.o config_base.o error_reporter.o formatters.o insn_base.o $ @@ -211,7 +211,7 @@ build test_asm_ins8070: run test_asm_ins8070.o $ option_base.o parsers.o reg_base.o str_buffer.o str_scanner.o $ text_common.o value.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_asm_helper.o test_asserter.o + dec_float.o ibm_float.o test_asm_helper.o test_asserter.o build test_dis_ins8070: run test_dis_ins8070.o $ dis_ins8070.o reg_ins8070.o table_ins8070.o text_ins8070.o $ dis_base.o config_base.o error_reporter.o formatters.o insn_base.o $ @@ -234,7 +234,7 @@ build test_asm_mc6800: run test_asm_mc6800.o $ option_base.o parsers.o reg_base.o str_buffer.o str_scanner.o $ text_common.o value.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_asm_helper.o test_asserter.o + dec_float.o ibm_float.o test_asm_helper.o test_asserter.o build test_dis_mc6800: run test_dis_mc6800.o $ dis_mc6800.o reg_mc6800.o table_mc6800.o text_mc6800.o $ dis_base.o config_base.o error_reporter.o formatters.o insn_base.o $ @@ -257,7 +257,7 @@ build test_asm_mc68000: run test_asm_mc68000.o $ option_base.o parsers.o reg_base.o str_buffer.o str_scanner.o $ text_common.o value.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_asm_helper.o test_asserter.o + dec_float.o ibm_float.o test_asm_helper.o test_asserter.o build test_dis_mc68000: run test_dis_mc68000.o $ dis_mc68000.o reg_mc68000.o table_mc68000.o text_mc68000.o $ dis_base.o config_base.o error_reporter.o formatters.o insn_base.o $ @@ -280,7 +280,7 @@ build test_asm_mc6805: run test_asm_mc6805.o $ option_base.o parsers.o reg_base.o str_buffer.o str_scanner.o $ text_common.o value.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_asm_helper.o test_asserter.o + dec_float.o ibm_float.o test_asm_helper.o test_asserter.o build test_dis_mc6805: run test_dis_mc6805.o $ dis_mc6805.o reg_mc6805.o table_mc6805.o text_mc6805.o $ dis_base.o config_base.o error_reporter.o formatters.o insn_base.o $ @@ -303,7 +303,7 @@ build test_asm_mc6809: run test_asm_mc6809.o $ option_base.o parsers.o reg_base.o str_buffer.o str_scanner.o $ text_common.o value.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_asm_helper.o test_asserter.o + dec_float.o ibm_float.o test_asm_helper.o test_asserter.o build test_dis_mc6809: run test_dis_mc6809.o $ dis_mc6809.o reg_mc6809.o table_mc6809.o text_mc6809.o $ dis_base.o config_base.o error_reporter.o formatters.o insn_base.o $ @@ -326,7 +326,7 @@ build test_asm_mn1610: run test_asm_mn1610.o $ option_base.o parsers.o reg_base.o str_buffer.o str_scanner.o $ text_common.o value.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_asm_helper.o test_asserter.o + dec_float.o ibm_float.o test_asm_helper.o test_asserter.o build test_dis_mn1610: run test_dis_mn1610.o $ dis_mn1610.o reg_mn1610.o table_mn1610.o text_mn1610.o $ dis_base.o config_base.o error_reporter.o formatters.o insn_base.o $ @@ -349,7 +349,7 @@ build test_asm_mos6502: run test_asm_mos6502.o $ option_base.o parsers.o reg_base.o str_buffer.o str_scanner.o $ text_common.o value.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_asm_helper.o test_asserter.o + dec_float.o ibm_float.o test_asm_helper.o test_asserter.o build test_dis_mos6502: run test_dis_mos6502.o $ dis_mos6502.o reg_mos6502.o table_mos6502.o text_mos6502.o $ dis_base.o config_base.o error_reporter.o formatters.o insn_base.o $ @@ -372,7 +372,7 @@ build test_asm_ns32000: run test_asm_ns32000.o $ option_base.o parsers.o reg_base.o str_buffer.o str_scanner.o $ text_common.o value.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_asm_helper.o test_asserter.o + dec_float.o ibm_float.o test_asm_helper.o test_asserter.o build test_dis_ns32000: run test_dis_ns32000.o $ dis_ns32000.o reg_ns32000.o table_ns32000.o text_ns32000.o $ dis_base.o config_base.o error_reporter.o formatters.o insn_base.o $ @@ -395,9 +395,9 @@ build test_asm_pdp11: run test_asm_pdp11.o $ option_base.o parsers.o reg_base.o str_buffer.o str_scanner.o $ text_common.o value.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_asm_helper.o test_asserter.o + dec_float.o ibm_float.o test_asm_helper.o test_asserter.o build test_dis_pdp11: run test_dis_pdp11.o $ - dis_pdp11.o reg_pdp11.o table_pdp11.o text_pdp11.o dec_float.o $ + dis_pdp11.o reg_pdp11.o table_pdp11.o text_pdp11.o dec_float.o ibm_float.o $ dis_base.o config_base.o error_reporter.o formatters.o insn_base.o $ option_base.o reg_base.o str_buffer.o str_scanner.o text_common.o value.o $ value_formatter.o $ @@ -418,7 +418,7 @@ build test_asm_pdp8: run test_asm_pdp8.o $ option_base.o parsers.o reg_base.o str_buffer.o str_scanner.o $ text_common.o value.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_asm_helper.o test_asserter.o + dec_float.o ibm_float.o test_asm_helper.o test_asserter.o build test_dis_pdp8: run test_dis_pdp8.o $ dis_pdp8.o reg_pdp8.o table_pdp8.o text_pdp8.o $ dis_base.o config_base.o error_reporter.o formatters.o insn_base.o $ @@ -441,7 +441,7 @@ build test_asm_scn2650: run test_asm_scn2650.o $ option_base.o parsers.o reg_base.o str_buffer.o str_scanner.o $ text_common.o value.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_asm_helper.o test_asserter.o + dec_float.o ibm_float.o test_asm_helper.o test_asserter.o build test_dis_scn2650: run test_dis_scn2650.o $ dis_scn2650.o reg_scn2650.o table_scn2650.o text_scn2650.o $ dis_base.o config_base.o error_reporter.o formatters.o insn_base.o $ @@ -464,7 +464,7 @@ build test_asm_tlcs90: run test_asm_tlcs90.o $ option_base.o parsers.o reg_base.o str_buffer.o str_scanner.o $ text_common.o value.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_asm_helper.o test_asserter.o + dec_float.o ibm_float.o test_asm_helper.o test_asserter.o build test_dis_tlcs90: run test_dis_tlcs90.o $ dis_tlcs90.o reg_tlcs90.o table_tlcs90.o text_tlcs90.o $ dis_base.o config_base.o error_reporter.o formatters.o insn_base.o $ @@ -487,7 +487,7 @@ build test_asm_tms32010: run test_asm_tms32010.o $ option_base.o parsers.o reg_base.o str_buffer.o str_scanner.o $ text_common.o value.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_asm_helper.o test_asserter.o + dec_float.o ibm_float.o test_asm_helper.o test_asserter.o build test_dis_tms32010: run test_dis_tms32010.o $ dis_tms32010.o reg_tms32010.o table_tms32010.o text_tms32010.o $ dis_base.o config_base.o error_reporter.o formatters.o insn_base.o $ @@ -510,7 +510,7 @@ build test_asm_tms7000: run test_asm_tms7000.o $ option_base.o parsers.o reg_base.o str_buffer.o str_scanner.o $ text_common.o value.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_asm_helper.o test_asserter.o + dec_float.o ibm_float.o test_asm_helper.o test_asserter.o build test_dis_tms7000: run test_dis_tms7000.o $ dis_tms7000.o reg_tms7000.o table_tms7000.o text_tms7000.o $ dis_base.o config_base.o error_reporter.o formatters.o insn_base.o $ @@ -533,7 +533,7 @@ build test_asm_tms9900: run test_asm_tms9900.o $ option_base.o parsers.o reg_base.o str_buffer.o str_scanner.o $ text_common.o value.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_asm_helper.o test_asserter.o + dec_float.o ibm_float.o test_asm_helper.o test_asserter.o build test_dis_tms9900: run test_dis_tms9900.o $ dis_tms9900.o reg_tms9900.o table_tms9900.o text_tms9900.o $ dis_base.o config_base.o error_reporter.o formatters.o insn_base.o $ @@ -556,7 +556,7 @@ build test_asm_z8: run test_asm_z8.o $ option_base.o parsers.o reg_base.o str_buffer.o str_scanner.o $ text_common.o value.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_asm_helper.o test_asserter.o + dec_float.o ibm_float.o test_asm_helper.o test_asserter.o build test_dis_z8: run test_dis_z8.o $ dis_z8.o reg_z8.o table_z8.o text_z8.o $ dis_base.o config_base.o error_reporter.o formatters.o insn_base.o $ @@ -579,7 +579,7 @@ build test_asm_z80: run test_asm_z80.o $ option_base.o parsers.o reg_base.o str_buffer.o str_scanner.o $ text_common.o value.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_asm_helper.o test_asserter.o + dec_float.o ibm_float.o test_asm_helper.o test_asserter.o build test_dis_z80: run test_dis_z80.o $ dis_z80.o reg_z80.o table_z80.o text_z80.o $ dis_base.o config_base.o error_reporter.o formatters.o insn_base.o $ @@ -602,7 +602,7 @@ build test_asm_z8000: run test_asm_z8000.o $ option_base.o parsers.o reg_base.o str_buffer.o str_scanner.o $ text_common.o value.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_asm_helper.o test_asserter.o + dec_float.o ibm_float.o test_asm_helper.o test_asserter.o build test_dis_z8000: run test_dis_z8000.o $ dis_z8000.o reg_z8000.o table_z8000.o text_z8000.o $ dis_base.o config_base.o error_reporter.o formatters.o insn_base.o $ @@ -624,37 +624,37 @@ build test_expr_base: run test_expr_base.o $ parsers.o str_buffer.o str_scanner.o test_asserter.o test_expr_helper.o $ value_formatter.o value.o value_parser.o text_common.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o + dec_float.o ibm_float.o build test_expr_fairchild: run test_expr_fairchild.o $ config_base.o error_reporter.o formatters.o operators.o option_base.o $ parsers.o str_buffer.o str_scanner.o test_asserter.o test_expr_helper.o $ value_formatter.o value.o value_parser.o text_common.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o + dec_float.o ibm_float.o build test_expr_intel: run test_expr_intel.o $ config_base.o error_reporter.o formatters.o operators.o option_base.o $ parsers.o str_buffer.o str_scanner.o test_asserter.o test_expr_helper.o $ value_formatter.o value.o value_parser.o text_common.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o + dec_float.o ibm_float.o build test_expr_motorola: run test_expr_motorola.o $ config_base.o error_reporter.o formatters.o operators.o option_base.o $ parsers.o str_buffer.o str_scanner.o test_asserter.o test_expr_helper.o $ value_formatter.o value.o value_parser.o text_common.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o + dec_float.o ibm_float.o build test_expr_national: run test_expr_national.o $ config_base.o error_reporter.o formatters.o operators.o option_base.o $ parsers.o str_buffer.o str_scanner.o test_asserter.o test_expr_helper.o $ value_formatter.o value.o value_parser.o text_common.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o + dec_float.o ibm_float.o build test_expr_zilog: run test_expr_zilog.o $ config_base.o error_reporter.o formatters.o operators.o option_base.o $ parsers.o str_buffer.o str_scanner.o test_asserter.o test_expr_helper.o $ value_formatter.o value.o value_parser.o text_common.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o + dec_float.o ibm_float.o build test_cdp1802: phony test_asm_cdp1802 test_dis_cdp1802 build test_f3850: phony test_asm_f3850 test_dis_f3850 diff --git a/test/driver/Makefile b/test/driver/Makefile index 3d78a394..dfbae4b3 100644 --- a/test/driver/Makefile +++ b/test/driver/Makefile @@ -37,8 +37,9 @@ CPPFLAGS = -I../../driver -I../../src -I../../test -MD -MF $@.d OBJS_common = \ test_driver_helper.o test_asserter.o error_reporter.o \ - fixed64.o dec_float.o ieee_float.o float80_base.o float80_hard.o \ - float80_soft.o str_buffer.o str_scanner.o value.o text_common.o + fixed64.o dec_float.o ibm_float.o ieee_float.o float80_base.o \ + float80_hard.o float80_soft.o str_buffer.o str_scanner.o value.o \ + text_common.o OBJS_encdec = \ bin_encoder.o bin_decoder.o intel_hex.o moto_srec.o bin_memory.o OBJS_formatter = \ diff --git a/test/driver/build.ninja b/test/driver/build.ninja index b1acc8f2..bdecca3c 100644 --- a/test/driver/build.ninja +++ b/test/driver/build.ninja @@ -40,7 +40,7 @@ build test_asm_formatter: test test_asm_formatter.o $ error_reporter.o value_formatter.o value.o value_parser.o parsers.o $ operators.o option_base.o str_buffer.o str_scanner.o text_common.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o $ + dec_float.o ibm_float.o $ asm_i8080.o reg_i8080.o table_i8080.o text_i8080.o $ asm_ins8060.o reg_ins8060.o table_ins8060.o text_ins8060.o $ asm_mc6809.o reg_mc6809.o table_mc6809.o text_mc6809.o $ @@ -56,7 +56,7 @@ build test_formatter_cdp1802: test test_formatter_cdp1802.o $ parsers.o reg_base.o str_buffer.o str_scanner.o symbol_store.o $ text_common.o value.o value_formatter.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_driver_helper.o test_asserter.o + dec_float.o ibm_float.o test_driver_helper.o test_asserter.o build test_formatter_f3850: test test_formatter_f3850.o $ asm_f3850.o dis_f3850.o reg_f3850.o table_f3850.o text_f3850.o $ @@ -67,7 +67,7 @@ build test_formatter_f3850: test test_formatter_f3850.o $ parsers.o reg_base.o str_buffer.o str_scanner.o symbol_store.o $ text_common.o value.o value_formatter.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_driver_helper.o test_asserter.o + dec_float.o ibm_float.o test_driver_helper.o test_asserter.o build test_formatter_i8048: test test_formatter_i8048.o $ asm_i8048.o dis_i8048.o reg_i8048.o table_i8048.o text_i8048.o $ @@ -78,7 +78,7 @@ build test_formatter_i8048: test test_formatter_i8048.o $ parsers.o reg_base.o str_buffer.o str_scanner.o symbol_store.o $ text_common.o value.o value_formatter.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_driver_helper.o test_asserter.o + dec_float.o ibm_float.o test_driver_helper.o test_asserter.o build test_formatter_i8051: test test_formatter_i8051.o $ asm_i8051.o dis_i8051.o reg_i8051.o table_i8051.o text_i8051.o $ @@ -89,7 +89,7 @@ build test_formatter_i8051: test test_formatter_i8051.o $ parsers.o reg_base.o str_buffer.o str_scanner.o symbol_store.o $ text_common.o value.o value_formatter.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_driver_helper.o test_asserter.o + dec_float.o ibm_float.o test_driver_helper.o test_asserter.o build test_formatter_i8080: test test_formatter_i8080.o $ asm_i8080.o dis_i8080.o reg_i8080.o table_i8080.o text_i8080.o $ @@ -100,7 +100,7 @@ build test_formatter_i8080: test test_formatter_i8080.o $ parsers.o reg_base.o str_buffer.o str_scanner.o symbol_store.o $ text_common.o value.o value_formatter.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_driver_helper.o test_asserter.o + dec_float.o ibm_float.o test_driver_helper.o test_asserter.o build test_formatter_i8086: test test_formatter_i8086.o $ asm_i8086.o dis_i8086.o reg_i8086.o table_i8086.o text_i8086.o $ @@ -111,7 +111,7 @@ build test_formatter_i8086: test test_formatter_i8086.o $ parsers.o reg_base.o str_buffer.o str_scanner.o symbol_store.o $ text_common.o value.o value_formatter.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_driver_helper.o test_asserter.o + dec_float.o ibm_float.o test_driver_helper.o test_asserter.o build test_formatter_i8096: test test_formatter_i8096.o $ asm_i8096.o dis_i8096.o reg_i8096.o table_i8096.o text_i8096.o $ @@ -122,7 +122,7 @@ build test_formatter_i8096: test test_formatter_i8096.o $ parsers.o reg_base.o str_buffer.o str_scanner.o symbol_store.o $ text_common.o value.o value_formatter.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_driver_helper.o test_asserter.o + dec_float.o ibm_float.o test_driver_helper.o test_asserter.o build test_formatter_ins8060: test test_formatter_ins8060.o $ asm_ins8060.o dis_ins8060.o reg_ins8060.o table_ins8060.o text_ins8060.o $ @@ -133,7 +133,7 @@ build test_formatter_ins8060: test test_formatter_ins8060.o $ parsers.o reg_base.o str_buffer.o str_scanner.o symbol_store.o $ text_common.o value.o value_formatter.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_driver_helper.o test_asserter.o + dec_float.o ibm_float.o test_driver_helper.o test_asserter.o build test_formatter_ins8070: test test_formatter_ins8070.o $ asm_ins8070.o dis_ins8070.o reg_ins8070.o table_ins8070.o text_ins8070.o $ @@ -144,7 +144,7 @@ build test_formatter_ins8070: test test_formatter_ins8070.o $ parsers.o reg_base.o str_buffer.o str_scanner.o symbol_store.o $ text_common.o value.o value_formatter.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_driver_helper.o test_asserter.o + dec_float.o ibm_float.o test_driver_helper.o test_asserter.o build test_formatter_mc6800: test test_formatter_mc6800.o $ asm_mc6800.o dis_mc6800.o reg_mc6800.o table_mc6800.o text_mc6800.o $ @@ -155,7 +155,7 @@ build test_formatter_mc6800: test test_formatter_mc6800.o $ parsers.o reg_base.o str_buffer.o str_scanner.o symbol_store.o $ text_common.o value.o value_formatter.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_driver_helper.o test_asserter.o + dec_float.o ibm_float.o test_driver_helper.o test_asserter.o build test_formatter_mc68000: test test_formatter_mc68000.o $ asm_mc68000.o dis_mc68000.o reg_mc68000.o table_mc68000.o text_mc68000.o $ @@ -166,7 +166,7 @@ build test_formatter_mc68000: test test_formatter_mc68000.o $ parsers.o reg_base.o str_buffer.o str_scanner.o symbol_store.o $ text_common.o value.o value_formatter.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_driver_helper.o test_asserter.o + dec_float.o ibm_float.o test_driver_helper.o test_asserter.o build test_formatter_mc6805: test test_formatter_mc6805.o $ asm_mc6805.o dis_mc6805.o reg_mc6805.o table_mc6805.o text_mc6805.o $ @@ -177,7 +177,7 @@ build test_formatter_mc6805: test test_formatter_mc6805.o $ parsers.o reg_base.o str_buffer.o str_scanner.o symbol_store.o $ text_common.o value.o value_formatter.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_driver_helper.o test_asserter.o + dec_float.o ibm_float.o test_driver_helper.o test_asserter.o build test_formatter_mc6809: test test_formatter_mc6809.o $ asm_mc6809.o dis_mc6809.o reg_mc6809.o table_mc6809.o text_mc6809.o $ @@ -188,7 +188,7 @@ build test_formatter_mc6809: test test_formatter_mc6809.o $ parsers.o reg_base.o str_buffer.o str_scanner.o symbol_store.o $ text_common.o value.o value_formatter.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_driver_helper.o test_asserter.o + dec_float.o ibm_float.o test_driver_helper.o test_asserter.o build test_formatter_mn1610: test test_formatter_mn1610.o $ asm_mn1610.o dis_mn1610.o reg_mn1610.o table_mn1610.o text_mn1610.o $ @@ -199,7 +199,7 @@ build test_formatter_mn1610: test test_formatter_mn1610.o $ parsers.o reg_base.o str_buffer.o str_scanner.o symbol_store.o $ text_common.o value.o value_formatter.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_driver_helper.o test_asserter.o + dec_float.o ibm_float.o test_driver_helper.o test_asserter.o build test_formatter_mos6502: test test_formatter_mos6502.o $ asm_mos6502.o dis_mos6502.o reg_mos6502.o table_mos6502.o text_mos6502.o $ @@ -210,7 +210,7 @@ build test_formatter_mos6502: test test_formatter_mos6502.o $ parsers.o reg_base.o str_buffer.o str_scanner.o symbol_store.o $ text_common.o value.o value_formatter.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_driver_helper.o test_asserter.o + dec_float.o ibm_float.o test_driver_helper.o test_asserter.o build test_formatter_ns32000: test test_formatter_ns32000.o $ asm_ns32000.o dis_ns32000.o reg_ns32000.o table_ns32000.o text_ns32000.o $ @@ -221,7 +221,7 @@ build test_formatter_ns32000: test test_formatter_ns32000.o $ parsers.o reg_base.o str_buffer.o str_scanner.o symbol_store.o $ text_common.o value.o value_formatter.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_driver_helper.o test_asserter.o + dec_float.o ibm_float.o test_driver_helper.o test_asserter.o build test_formatter_pdp11: test test_formatter_pdp11.o $ asm_pdp11.o dis_pdp11.o reg_pdp11.o table_pdp11.o text_pdp11.o $ @@ -232,7 +232,7 @@ build test_formatter_pdp11: test test_formatter_pdp11.o $ parsers.o reg_base.o str_buffer.o str_scanner.o symbol_store.o $ text_common.o value.o value_formatter.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_driver_helper.o test_asserter.o + dec_float.o ibm_float.o test_driver_helper.o test_asserter.o build test_formatter_pdp8: test test_formatter_pdp8.o $ asm_pdp8.o dis_pdp8.o reg_pdp8.o table_pdp8.o text_pdp8.o $ @@ -243,7 +243,7 @@ build test_formatter_pdp8: test test_formatter_pdp8.o $ parsers.o reg_base.o str_buffer.o str_scanner.o symbol_store.o $ text_common.o value.o value_formatter.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_driver_helper.o test_asserter.o + dec_float.o ibm_float.o test_driver_helper.o test_asserter.o build test_formatter_scn2650: test test_formatter_scn2650.o $ asm_scn2650.o dis_scn2650.o reg_scn2650.o table_scn2650.o text_scn2650.o $ @@ -254,7 +254,7 @@ build test_formatter_scn2650: test test_formatter_scn2650.o $ parsers.o reg_base.o str_buffer.o str_scanner.o symbol_store.o $ text_common.o value.o value_formatter.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_driver_helper.o test_asserter.o + dec_float.o ibm_float.o test_driver_helper.o test_asserter.o build test_formatter_tlcs90: test test_formatter_tlcs90.o $ asm_tlcs90.o dis_tlcs90.o reg_tlcs90.o table_tlcs90.o text_tlcs90.o $ @@ -265,7 +265,7 @@ build test_formatter_tlcs90: test test_formatter_tlcs90.o $ parsers.o reg_base.o str_buffer.o str_scanner.o symbol_store.o $ text_common.o value.o value_formatter.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_driver_helper.o test_asserter.o + dec_float.o ibm_float.o test_driver_helper.o test_asserter.o build test_formatter_tms32010: test test_formatter_tms32010.o $ asm_tms32010.o dis_tms32010.o reg_tms32010.o table_tms32010.o text_tms32010.o $ @@ -276,7 +276,7 @@ build test_formatter_tms32010: test test_formatter_tms32010.o $ parsers.o reg_base.o str_buffer.o str_scanner.o symbol_store.o $ text_common.o value.o value_formatter.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_driver_helper.o test_asserter.o + dec_float.o ibm_float.o test_driver_helper.o test_asserter.o build test_formatter_tms7000: test test_formatter_tms7000.o $ asm_tms7000.o dis_tms7000.o reg_tms7000.o table_tms7000.o text_tms7000.o $ @@ -287,7 +287,7 @@ build test_formatter_tms7000: test test_formatter_tms7000.o $ parsers.o reg_base.o str_buffer.o str_scanner.o symbol_store.o $ text_common.o value.o value_formatter.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_driver_helper.o test_asserter.o + dec_float.o ibm_float.o test_driver_helper.o test_asserter.o build test_formatter_tms9900: test test_formatter_tms9900.o $ asm_tms9900.o dis_tms9900.o reg_tms9900.o table_tms9900.o text_tms9900.o $ @@ -298,7 +298,7 @@ build test_formatter_tms9900: test test_formatter_tms9900.o $ parsers.o reg_base.o str_buffer.o str_scanner.o symbol_store.o $ text_common.o value.o value_formatter.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_driver_helper.o test_asserter.o + dec_float.o ibm_float.o test_driver_helper.o test_asserter.o build test_formatter_z8: test test_formatter_z8.o $ asm_z8.o dis_z8.o reg_z8.o table_z8.o text_z8.o $ @@ -309,7 +309,7 @@ build test_formatter_z8: test test_formatter_z8.o $ parsers.o reg_base.o str_buffer.o str_scanner.o symbol_store.o $ text_common.o value.o value_formatter.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_driver_helper.o test_asserter.o + dec_float.o ibm_float.o test_driver_helper.o test_asserter.o build test_formatter_z80: test test_formatter_z80.o $ asm_z80.o dis_z80.o reg_z80.o table_z80.o text_z80.o $ @@ -320,7 +320,7 @@ build test_formatter_z80: test test_formatter_z80.o $ parsers.o reg_base.o str_buffer.o str_scanner.o symbol_store.o $ text_common.o value.o value_formatter.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_driver_helper.o test_asserter.o + dec_float.o ibm_float.o test_driver_helper.o test_asserter.o build test_formatter_z8000: test test_formatter_z8000.o $ asm_z8000.o dis_z8000.o reg_z8000.o table_z8000.o text_z8000.o $ @@ -331,7 +331,7 @@ build test_formatter_z8000: test test_formatter_z8000.o $ parsers.o reg_base.o str_buffer.o str_scanner.o symbol_store.o $ text_common.o value.o value_formatter.o value_parser.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ - dec_float.o test_driver_helper.o test_asserter.o + dec_float.o ibm_float.o test_driver_helper.o test_asserter.o build test: phony test_helpers test_bin_memory test_intel_hex test_moto_srec $ test_asm_formatter $ diff --git a/test/unit/Makefile b/test/unit/Makefile index ab931f0f..2715b96d 100644 --- a/test/unit/Makefile +++ b/test/unit/Makefile @@ -16,8 +16,8 @@ help: @echo '"make test" run unit tests of libasm::src' TESTS = test_array_memory test_dec_float test_fixed64 test_float32 \ - test_float64 test_float80_hard test_float80_soft test_reg_base \ - test_str_buffer test_str_scanner test_value + test_float64 test_float80_hard test_float80_soft test_ibm_float \ + test_reg_base test_str_buffer test_str_scanner test_value .PHONY:: help test clean clean-objs @@ -34,7 +34,7 @@ CPPFLAGS = -I../../src -I../../test -MD -MF $@.d OBJS_common = test_unit_helper.o test_asserter.o error_reporter.o \ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o \ - dec_float.o str_buffer.o str_scanner.o text_common.o value.o + dec_float.o ibm_float.o str_buffer.o str_scanner.o text_common.o value.o OBJS = $(OBJS_common) $(TESTS:=.o) BINS = $(TESTS) @@ -61,6 +61,8 @@ test_float80_hard: test_float80_hard.o $(OBJS_common) $(CXX) -o $@ $^ test_float80_soft: test_float80_soft.o $(OBJS_common) $(CXX) -o $@ $^ +test_ibm_float: test_ibm_float.o $(OBJS_common) + $(CXX) -o $@ $^ test_reg_base: test_reg_base.o reg_base.o $(OBJS_common) $(CXX) -o $@ $^ test_str_buffer: test_str_buffer.o $(OBJS_common) diff --git a/test/unit/build.ninja b/test/unit/build.ninja index 8dc5b8ed..69b79888 100644 --- a/test/unit/build.ninja +++ b/test/unit/build.ninja @@ -43,6 +43,10 @@ build test_float80_soft: test test_float80_soft.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ str_buffer.o str_scanner.o text_common.o value.o $ test_unit_helper.o test_asserter.o error_reporter.o +build test_ibm_float: test test_ibm_float.o ibm_float.o $ + fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ + str_buffer.o str_scanner.o text_common.o value.o $ + test_unit_helper.o test_asserter.o error_reporter.o build test_reg_base: test test_reg_base.o reg_base.o $ fixed64.o ieee_float.o float80_base.o float80_hard.o float80_soft.o $ str_buffer.o str_scanner.o text_common.o value.o $ @@ -60,6 +64,6 @@ build test_value: test test_value.o value.o $ build test: phony test_array_memory test_dec_float test_fixed64 $ test_float32 test_float64 test_float80_hard test_float80_soft $ - test_reg_base test_str_buffer test_str_scanner test_value + test_ibm_float test_reg_base test_str_buffer test_str_scanner test_value default test diff --git a/test/unit/ninja.rules b/test/unit/ninja.rules index 5d537da9..67db1aef 100644 --- a/test/unit/ninja.rules +++ b/test/unit/ninja.rules @@ -8,6 +8,7 @@ build test_float32.o: cxx ${root}/test/unit/test_float32.cpp build test_float64.o: cxx ${root}/test/unit/test_float64.cpp build test_float80_hard.o: cxx ${root}/test/unit/test_float80_hard.cpp build test_float80_soft.o: cxx ${root}/test/unit/test_float80_soft.cpp +build test_ibm_float.o: cxx ${root}/test/unit/test_ibm_float.cpp build test_reg_base.o: cxx ${root}/test/unit/test_reg_base.cpp build test_str_buffer.o: cxx ${root}/test/unit/test_str_buffer.cpp build test_str_scanner.o: cxx ${root}/test/unit/test_str_scanner.cpp diff --git a/test/unit/test_ibm_float.cpp b/test/unit/test_ibm_float.cpp new file mode 100644 index 00000000..dc7a5b14 --- /dev/null +++ b/test/unit/test_ibm_float.cpp @@ -0,0 +1,179 @@ +/* + * Copyright 2024 Tadashi G. Takaoka + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include "ibm_float.h" +#include "test_unit_helper.h" + +#define __STR__(v) #v +#define STR(v) __STR__(v) +#define STR_DBL_MAX "1.79769313486231570814527423731704357e+308" +#define STR_DBL_MIN "2.22507385850720138309023271733240406e-308" + +namespace libasm { +namespace test { + +void set_up() {} + +void tear_down() {} + +float80_t f80; + +const float80_t &read_f80(const char *str) { + char *end; + f80.read(str, &end); + return f80; +} + +const char *gcvt(const ibm_float32_t &f32) { + static char buf[80]; + f80 = static_cast(f32); + f80.gcvt(buf, sizeof(buf), 7); + return buf; +} + +void test_ibm_float32() { + constexpr auto SGN_MASK = ibm_float32_t::SGN_MASK; + constexpr auto EXP_MASK = ibm_float32_t::EXP_MASK; + constexpr auto EXP_BASE = ibm_float32_t::EXP_BASE; + constexpr auto SIG_MASK = ibm_float32_t::SIG_MASK; + constexpr auto MSD_POS = ibm_float32_t::MSD_POS; + constexpr auto MSD2_POS = MSD_POS - 4; + constexpr auto MSD3_POS = MSD2_POS - 4; +#define EXP16(exp16) (exp16 + EXP_BASE) +#define SIG32(sig, pos) (UINT32_C(sig) << pos) + ibm_float32_t f32; + EQ("0.0", "00.000000", f32.set(0, 0).str()); + EQ("0.0", "0", gcvt(f32)); + EQ("0.0", OK, f32.set(f80)); + EQ("0.0", "00.000000", f32.str()); + + EQ("1.0", "41.100000", f32.set(EXP16(1), SIG32(1, MSD_POS)).str()); + EQ("1.0", "1", gcvt(f32)); + EQ("1.0", OK, f32.set(f80)); + EQ("1.0", "41.100000", f32.str()); + + EQ("-1.0", "C1.100000", f32.set(EXP16(1) + SGN_MASK, SIG32(1, MSD_POS)).str()); + EQ("-1.0", "-1", gcvt(f32)); + EQ("-1.0", OK, f32.set(f80)); + EQ("-1.0", "C1.100000", f32.str()); + + EQ("IBMF32_MAX", "7F.FFFFFF", f32.set(EXP_MASK, SIG_MASK).str()); + EQ("IBMF32_MAX", STR(IBMF32_MAX), gcvt(f32)); + EQ("IBMF32_MAX", OK, f32.set(f80)); + EQ("IBMF32_MAX", "7F.FFFFFF", f32.str()); + + EQ("IBMF32_MIN", "00.100000", f32.set(0, SIG32(1, MSD_POS)).str()); + EQ("IBMF32_MIN", STR(IBMF32_MIN), gcvt(f32)); + EQ("IBMF32_MIN", OK, f32.set(f80)); + EQ("IBMF32_MIN", "00.100000", f32.str()); + + EQ("DBL_MAX", OVERFLOW_RANGE, f32.set(read_f80(STR_DBL_MAX))); + EQ("DBL_MIN", OK, f32.set(read_f80(STR_DBL_MIN))); + EQ("DBL_MIN", "0", gcvt(f32)); + + EQ("1.0", "1", gcvt(f32.set(EXP16(1), SIG32(1, MSD_POS)))); // 1/16 * 16^1 + EQ("2.0", "2", gcvt(f32.set(EXP16(1), SIG32(2, MSD_POS)))); // 2/16 * 16^1 + EQ("4.0", "4", gcvt(f32.set(EXP16(1), SIG32(4, MSD_POS)))); // 4/16 * 16^1 + EQ("8.0", "8", gcvt(f32.set(EXP16(1), SIG32(8, MSD_POS)))); // 8/16 * 16^1 + EQ("16.0", "16", gcvt(f32.set(EXP16(2), SIG32(1, MSD_POS)))); // 1/16 * 16^2 + EQ("24.0", "24", gcvt(f32.set(EXP16(2), SIG32(24, MSD2_POS)))); // 24/16^2 * 16^2 + EQ("42.0", "42", gcvt(f32.set(EXP16(2), SIG32(42, MSD2_POS)))); // 42/16^2 * 16^2 + EQ("0.5", "0.5", gcvt(f32.set(EXP16(0), SIG32(8, MSD_POS)))); // 8/16 * 16^0 + EQ("0.125", "0.125", gcvt(f32.set(EXP16(0), SIG32(2, MSD_POS)))); // 2/16 * 16^0 + EQ("0.0078125", "0.0078125", gcvt(f32.set(EXP16(-1), SIG32(2, MSD_POS)))); // 2/16^2 * 16^-1 + EQ("1000.0", "1000", gcvt(f32.set(EXP16(3), SIG32(1000, MSD3_POS)))); // 1000/16^3 * 16^3 + EQ("118.625", "118.625", gcvt(f32.set(EXP16(2), SIG32(1898, MSD3_POS)))); // 1898/16 * 16^2 + EQ("101.0", "101", gcvt(f32.set(EXP16(2), SIG32(101, MSD2_POS)))); // 101/16^2 * 16^2 + EQ("0.03125", "0.03125", gcvt(f32.set(EXP16(-1), SIG32(8, MSD_POS)))); // 8/16 * 16^-1 +} + +const char *gcvt(const ibm_float64_t &f64) { + static char buf[80]; + f80 = static_cast(f64); + f80.gcvt(buf, sizeof(buf), 19); + return buf; +} + +void test_ibm_float64() { + constexpr auto SGN_MASK = ibm_float64_t::SGN_MASK; + constexpr auto EXP_MASK = ibm_float64_t::EXP_MASK; + constexpr auto EXP_BASE = ibm_float64_t::EXP_BASE; + constexpr auto SIG_MASK = ibm_float64_t::SIG_MASK; + constexpr auto MSD_POS = ibm_float64_t::MSD_POS; +#define SIG64(sig, pos) (UINT64_C(sig) << pos) + ibm_float64_t f64; + EQ("0.0", "00.000000-00000000", f64.set(0, 0).str()); + EQ("0.0", "0", gcvt(f64)); + EQ("0.0", OK, f64.set(f80)); + EQ("0.0", "00.000000-00000000", f64.str()); + + EQ("1.0", "41.100000-00000000", f64.set(EXP16(1), SIG64(1, MSD_POS)).str()); + EQ("1.0", "1", gcvt(f64)); + EQ("1.0", OK, f64.set(f80)); + EQ("1.0", "41.100000-00000000", f64.str()); + + EQ("-1.0", "C1.100000-00000000", f64.set(EXP16(1) + SGN_MASK, SIG64(1, MSD_POS)).str()); + EQ("-1.0", "-1", gcvt(f64)); + EQ("-1.0", OK, f64.set(f80)); + EQ("-1.0", "C1.100000-00000000", f64.str()); + + EQ("IBMF64_MAX", "7F.FFFFFF-FFFFFFFF", f64.set(EXP_MASK, SIG_MASK).str()); + EQ("IBMF64_MAX", STR(IBMF64_MAX), gcvt(f64)); + EQ("IBMF64_MAX", OK, f64.set(f80)); + EQ("IBMF64_MAX", "7F.FFFFFF-FFFFFFFF", f64.str()); + + EQ("IBMF64_MIN", "00.100000-00000000", f64.set(0, SIG64(1, MSD_POS)).str()); + EQ("IBMF64_MIN", STR(IBMF64_MIN), gcvt(f64)); + EQ("IBMF64_MIN", OK, f64.set(f80)); + EQ("IBMF64_MIN", "00.100000-00000000", f64.str()); + + EQ("DBL_MAX", OVERFLOW_RANGE, f64.set(read_f80(STR_DBL_MAX))); + EQ("DBL_MIN", OK, f64.set(read_f80(STR_DBL_MIN))); + EQ("DBL_MIN", "0", gcvt(f64)); + + constexpr auto MSD2_POS = MSD_POS - 4; + constexpr auto MSD3_POS = MSD2_POS - 4; + EQ("1.0", "1", gcvt(f64.set(EXP16(1), SIG64(1, MSD_POS)))); // 1/16 * 16^1 + EQ("2.0", "2", gcvt(f64.set(EXP16(1), SIG64(2, MSD_POS)))); // 2/16 * 16^1 + EQ("4.0", "4", gcvt(f64.set(EXP16(1), SIG64(4, MSD_POS)))); // 4/16 * 16^1 + EQ("8.0", "8", gcvt(f64.set(EXP16(1), SIG64(8, MSD_POS)))); // 8/16 * 16^1 + EQ("16.0", "16", gcvt(f64.set(EXP16(2), SIG64(1, MSD_POS)))); // 1/16 * 16^2 + EQ("24.0", "24", gcvt(f64.set(EXP16(2), SIG64(24, MSD2_POS)))); // 24/16^2 * 16^2 + EQ("42.0", "42", gcvt(f64.set(EXP16(2), SIG64(42, MSD2_POS)))); // 42/16^2 * 16^2 + EQ("0.5", "0.5", gcvt(f64.set(EXP16(0), SIG64(8, MSD_POS)))); // 8/16 * 16^0 + EQ("0.125", "0.125", gcvt(f64.set(EXP16(0), SIG64(2, MSD_POS)))); // 2/16 * 16^0 + EQ("0.0078125", "0.0078125", gcvt(f64.set(EXP16(-1), SIG64(2, MSD_POS)))); // 2/16^2 * 16^-1 + EQ("1000.0", "1000", gcvt(f64.set(EXP16(3), SIG64(1000, MSD3_POS)))); // 1000/16^3 * 16^3 + EQ("118.625", "118.625", gcvt(f64.set(EXP16(2), SIG64(1898, MSD3_POS)))); // 1898/16 * 16^2 + EQ("101.0", "101", gcvt(f64.set(EXP16(2), SIG64(101, MSD2_POS)))); // 101/16^2 * 16^2 + EQ("0.03125", "0.03125", gcvt(f64.set(EXP16(-1), SIG64(8, MSD_POS)))); // 8/16 * 16^-1 +} + +void run_tests() { + RUN_TEST(test_ibm_float32); + RUN_TEST(test_ibm_float64); +} + +} // namespace test +} // namespace libasm + +// Local Variables: +// mode: c++ +// c-basic-offset: 4 +// tab-width: 4 +// End: +// vim: set ft=cpp et ts=4 sw=4: