x87 support (which I believe this is using) hasn't been fleshed out very much as far as I know. To use it reliably, you're probably going to need to implement some (maybe all) of those instructions it's warning about. The microcode ISA I used was based on a patent I found which I think was for the K6 microarchitecture, and if I remember right it was also fairly vague about how the FP stuff was supported. The microops themselves may need some design/implementation before their up to the task of supporting those instructions. Please keep me in the loop if you decide to go implement some of this stuff.
Gabe On Mon, Jan 29, 2018 at 11:15 AM, Gutierrez, Anthony < [email protected]> wrote: > We've started experiencing some heisenbugs in our benchmarks that use > <random> to generate input data randomly. It's been a bit painful to get a > trace, as that seems to perturb things enough such that the bug won't > trigger. Based on what we know, however, we suspect that the below > unimplemented instructions should be manipulating some FP registers (e.g., > ST). The FP registers do not seem to be initialized in initCPU(), and > therefore we hypothesize that in some cases, for example when the values > happen to be 0, the denominator has a value that can cause the div 0 fault. > > The fault is always preceded by this sequence of unimplemented instruction > warnings, then finally the simulation fails with the following error on a > div instruction: > > warn: instruction 'fsubrp' unimplemented > warn: instruction 'fxam' unimplemented > warn: instruction 'fcomp' unimplemented > warn: instruction 'fyl2xp1' unimplemented > warn: instruction 'fdivrp' unimplemented > warn: instruction 'fistp' unimplemented > panic: fault (Divide-Error) detected @ PC (0x400fad=>0x400fb1).(1=>2) > > This can be reproduced on master (fairly reliably) with the following > microbenchmark: > > scons -jN -sQ ./build/X86/gem5.opt > ./build/X86/gem5.opt configs/example/se.py -c /path/to/benchmark/binary > > Build the following with g++ 5.4.0, flags are -std=c++11. > > #include <array> > #include <iostream> > #include <random> > > using namespace std; > > constexpr int VEC_ELEMS = 64; > > struct Point2D > { > float x; > float y; > }; > > int main(int argc, char *argv[]) > { > uniform_real_distribution<float> rng_dist(-1.0, 1.0); > cout << "here" << endl; > > mt19937 rng; > array<Point2D, VEC_ELEMS> vec; > > for (int i = 0; i < VEC_ELEMS; ++i) { > vec[i].x = rng_dist(rng); > vec[i].y = rng_dist(rng); > > cout << "vec[" << i << "].x = " << vec[i].x << endl; > cout << "vec[" << i << "].y = " << vec[i].y << endl; > } > Return 0; > } > _______________________________________________ > gem5-dev mailing list > [email protected] > http://m5sim.org/mailman/listinfo/gem5-dev _______________________________________________ gem5-dev mailing list [email protected] http://m5sim.org/mailman/listinfo/gem5-dev
