On 12/12/2013 06:51 PM, Feng, Haitao wrote:
Why did not we use 4-byte stack slot and 4-byte snapshot slot for
float32 and use movss instead of movsd?

Can you be more precise? The Snapshot slots are unlikely to be 4 bytes, because they are written into a compact buffer and they are not directly addressable. Also the snapshot slots are used to indicate the location, such as if it is in a register or on the stack.

If you are talking about the spill of register made for bailouts, then, we will have trouble with Float32x4, as we are eagerly spilling Value-size content at the moment. This should not be a big deal to spill the full [xy]mm registers instead of the low parts.

If we introduced FLOAT32_REG
type in the LDefinition::Type and FLOAT32_REG in the LAllocation::Kind,
it should be relatively easier to add Float32x4_REG.

I will talk about the MIRType, as this is the example I took at the time , but I think we can do the same thing for the LAllocation and LDefinition.

This is one thing I discuss with Benjamin Bouvier before he added the Float32. We should think of the future when doing such design. At the moment we are running conditionals to check if this is a float32 or a double. As we have many vector sizes (1,2,4,8) and vector type (double, float, uint8, uint32), I think it would be better to abstract all of these and make the MIRType a structure which is using a bit-field to represent all of these vector type.

struct MIRType {
  enum Type {
    TYPE_VALUE,
    …,
    TYPE_DOUBLE,
    TYPE_FLOAT,
    TYPE_INT8,
    TYPE_INT16,
    TYPE_INT32
  };

  // Useful for finally supporting unsigned int 8
  // and URSH without hacks.
  const uint32_t signedValue:1;

  const uint32_t padding_: 12;

  // Shift index to obtain the number of element in the vector.
  const uint32_t vectorScale: 3;

  // use uint32_t instead of Type because of a
  // windows compiler issue.
  const uint32_t type:16;
};

static const MIRType MIRType_Value =
  {true,  /* 1 << */ 0, MIRType::TYPE_VALUE};
static const MIRType MIRType_Float32x4 =
  {true,  /* 1 << */ 2, MIRType::TYPE_FLOAT};
static const MIRType MIRType_UInt8x4 =
  {false, /* 1 << */ 2, MIRType::TYPE_INT8};

--
Nicolas B. Pierron
_______________________________________________
dev-tech-js-engine-internals mailing list
[email protected]
https://lists.mozilla.org/listinfo/dev-tech-js-engine-internals

Reply via email to