| Index: test/cctest/test-assembler-arm.cc
|
| ===================================================================
|
| --- test/cctest/test-assembler-arm.cc (revision 3686)
|
| +++ test/cctest/test-assembler-arm.cc (working copy)
|
| @@ -1,4 +1,4 @@
|
| -// Copyright 2006-2008 the V8 project authors. All rights reserved.
|
| +// Copyright 2010 the V8 project authors. All rights reserved.
|
| // Redistribution and use in source and binary forms, with or without
|
| // modification, are permitted provided that the following conditions are
|
| // met:
|
| @@ -224,4 +224,63 @@
|
| }
|
|
|
|
|
| +TEST(4) {
|
| + // Test the VFP floating point instructions.
|
| + InitializeVM();
|
| + v8::HandleScope scope;
|
| +
|
| + typedef struct {
|
| + double a;
|
| + double b;
|
| + double c;
|
| + } T;
|
| + T t;
|
| +
|
| + // Create a function that accepts &t, and loads, manipulates, and stores
|
| + // the doubles t.a, t.b, and t.c.
|
| + Assembler assm(NULL, 0);
|
| + Label L, C;
|
| +
|
| +
|
| + ASSERT(CpuFeatures::IsSupported(VFP3));
|
| + if (CpuFeatures::IsSupported(VFP3)) {
|
| + CpuFeatures::Scope scope(VFP3);
|
| +
|
| + __ mov(ip, Operand(sp));
|
| + __ stm(db_w, sp, r4.bit() | fp.bit() | lr.bit());
|
| + __ sub(fp, ip, Operand(4));
|
| +
|
| + __ mov(r4, Operand(r0));
|
| + __ vldr(d6, r4, OFFSET_OF(T, a));
|
| + __ vldr(d7, r4, OFFSET_OF(T, b));
|
| + __ vadd(d5, d6, d7);
|
| + __ vstr(d5, r4, OFFSET_OF(T, c));
|
| +
|
| + __ vmov(r2, r3, d5);
|
| + __ vmov(d4, r2, r3);
|
| + __ vstr(d4, r4, OFFSET_OF(T, b));
|
| +
|
| + __ ldm(ia_w, sp, r4.bit() | fp.bit() | pc.bit());
|
| + }
|
| + CodeDesc desc;
|
| + assm.GetCode(&desc);
|
| + Object* code = Heap::CreateCode(desc,
|
| + NULL,
|
| + Code::ComputeFlags(Code::STUB),
|
| + Handle<Object>(Heap::undefined_value()));
|
| + CHECK(code->IsCode());
|
| +#ifdef DEBUG
|
| + Code::cast(code)->Print();
|
| +#endif
|
| + F3 f = FUNCTION_CAST<F3>(Code::cast(code)->entry());
|
| + t.a = 1.5;
|
| + t.b = 2.75;
|
| + t.c = 17.17;
|
| + Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
|
| + USE(dummy);
|
| + CHECK_EQ(4.25, t.c);
|
| + CHECK_EQ(4.25, t.b);
|
| + CHECK_EQ(1.5, t.a);
|
| +}
|
| +
|
| #undef __
|
|
|