gem5.git
14 years agoARM: Implement the unsigned 8 bit and 16 bit vector adds and subtracts.
Gabe Black [Wed, 2 Jun 2010 17:58:06 +0000 (12:58 -0500)]
ARM: Implement the unsigned 8 bit and 16 bit vector adds and subtracts.

14 years agoARM: Decode the unsigned saturating instructions.
Gabe Black [Wed, 2 Jun 2010 17:58:06 +0000 (12:58 -0500)]
ARM: Decode the unsigned saturating instructions.

14 years agoARM: Implement the unsigned saturating instructions.
Gabe Black [Wed, 2 Jun 2010 17:58:06 +0000 (12:58 -0500)]
ARM: Implement the unsigned saturating instructions.

14 years agoARM: Decode the ssub instructions.
Gabe Black [Wed, 2 Jun 2010 17:58:06 +0000 (12:58 -0500)]
ARM: Decode the ssub instructions.

14 years agoARM: Implement the ssub instructions.
Gabe Black [Wed, 2 Jun 2010 17:58:06 +0000 (12:58 -0500)]
ARM: Implement the ssub instructions.

14 years agoARM: Decode the SADD8 and SADD16 instructions.
Gabe Black [Wed, 2 Jun 2010 17:58:06 +0000 (12:58 -0500)]
ARM: Decode the SADD8 and SADD16 instructions.

14 years agoARM: Implement the SADD8 and SADD16 instructions.
Gabe Black [Wed, 2 Jun 2010 17:58:06 +0000 (12:58 -0500)]
ARM: Implement the SADD8 and SADD16 instructions.

14 years agoARM: Support instructions that set the GE bits when they write the condition codes.
Gabe Black [Wed, 2 Jun 2010 17:58:06 +0000 (12:58 -0500)]
ARM: Support instructions that set the GE bits when they write the condition codes.

14 years agoARM: Decode 32 bit thumb data processing register instructions.
Gabe Black [Wed, 2 Jun 2010 17:58:06 +0000 (12:58 -0500)]
ARM: Decode 32 bit thumb data processing register instructions.

14 years agoARM: Decode the 16 bit thumb versions of the REV* instructions.
Gabe Black [Wed, 2 Jun 2010 17:58:06 +0000 (12:58 -0500)]
ARM: Decode the 16 bit thumb versions of the REV* instructions.

14 years agoARM: Decode the ARM version of the REV* instructions.
Gabe Black [Wed, 2 Jun 2010 17:58:05 +0000 (12:58 -0500)]
ARM: Decode the ARM version of the REV* instructions.

14 years agoARM: Pull decoding of ARM pack, unpack, saturate and reverse instructions into a...
Gabe Black [Wed, 2 Jun 2010 17:58:05 +0000 (12:58 -0500)]
ARM: Pull decoding of ARM pack, unpack, saturate and reverse instructions into a format.

14 years agoARM: Implement the REV* instructions.
Gabe Black [Wed, 2 Jun 2010 17:58:05 +0000 (12:58 -0500)]
ARM: Implement the REV* instructions.

14 years agoARM: Add base classes suitable for the REV* instructions.
Gabe Black [Wed, 2 Jun 2010 17:58:05 +0000 (12:58 -0500)]
ARM: Add base classes suitable for the REV* instructions.

14 years agoARM: Make LDM that loads the PC perform an interworking branch.
Gabe Black [Wed, 2 Jun 2010 17:58:05 +0000 (12:58 -0500)]
ARM: Make LDM that loads the PC perform an interworking branch.

14 years agoARM: Decode the swp and swpb instructions.
Gabe Black [Wed, 2 Jun 2010 17:58:05 +0000 (12:58 -0500)]
ARM: Decode the swp and swpb instructions.

14 years agoARM: Implement the swp and swpb instructions.
Gabe Black [Wed, 2 Jun 2010 17:58:05 +0000 (12:58 -0500)]
ARM: Implement the swp and swpb instructions.

14 years agoARM: Decode MRS and MSR for thumb.
Gabe Black [Wed, 2 Jun 2010 17:58:05 +0000 (12:58 -0500)]
ARM: Decode MRS and MSR for thumb.

14 years agoARM: Replace the versions of MRS and MSR in the ARM decoder with the new ones.
Gabe Black [Wed, 2 Jun 2010 17:58:05 +0000 (12:58 -0500)]
ARM: Replace the versions of MRS and MSR in the ARM decoder with the new ones.

14 years agoARM: Define versions of MSR and MRS outside the decoder.
Gabe Black [Wed, 2 Jun 2010 17:58:05 +0000 (12:58 -0500)]
ARM: Define versions of MSR and MRS outside the decoder.

14 years agoARM: Hook up the push/pop versions of stm/ldm in thumb.
Gabe Black [Wed, 2 Jun 2010 17:58:05 +0000 (12:58 -0500)]
ARM: Hook up the push/pop versions of stm/ldm in thumb.

14 years agoARM: Hook SVC into the thumb decoder.
Gabe Black [Wed, 2 Jun 2010 17:58:05 +0000 (12:58 -0500)]
ARM: Hook SVC into the thumb decoder.

14 years agoARM: Implement SVC (was SWI) outside of the decoder.
Gabe Black [Wed, 2 Jun 2010 17:58:05 +0000 (12:58 -0500)]
ARM: Implement SVC (was SWI) outside of the decoder.

14 years agoARM: Update the stats for the new syscall behavior.
Gabe Black [Wed, 2 Jun 2010 17:58:05 +0000 (12:58 -0500)]
ARM: Update the stats for the new syscall behavior.

14 years agoARM: Trigger system calls from the SupervisorCall invoke method.
Gabe Black [Wed, 2 Jun 2010 17:58:05 +0000 (12:58 -0500)]
ARM: Trigger system calls from the SupervisorCall invoke method.

This simplifies the decoder slightly, and makes the system call mechanism
very slightly more realistic.

14 years agoARM: Fix multiply operations.
Gabe Black [Wed, 2 Jun 2010 17:58:05 +0000 (12:58 -0500)]
ARM: Fix multiply operations.

These fixes were provided by Ali and fix the saturation condition code and
various multiply instructions.

14 years agoARM: Decode the scalar saturating add/subtract instructions.
Gabe Black [Wed, 2 Jun 2010 17:58:05 +0000 (12:58 -0500)]
ARM: Decode the scalar saturating add/subtract instructions.

14 years agoARM: Decode the parallel add and subtract instructions.
Gabe Black [Wed, 2 Jun 2010 17:58:05 +0000 (12:58 -0500)]
ARM: Decode the parallel add and subtract instructions.

14 years agoARM: Implement signed saturating add and/or subtract instructions.
Gabe Black [Wed, 2 Jun 2010 17:58:05 +0000 (12:58 -0500)]
ARM: Implement signed saturating add and/or subtract instructions.

14 years agoARM: Implemented prefetch instructions/decoding (pli, pld, pldw).
Gabe Black [Wed, 2 Jun 2010 17:58:05 +0000 (12:58 -0500)]
ARM: Implemented prefetch instructions/decoding (pli, pld, pldw).

14 years agoARM: Decode unconditional ARM instructions.
Gabe Black [Wed, 2 Jun 2010 17:58:04 +0000 (12:58 -0500)]
ARM: Decode unconditional ARM instructions.

14 years agoARM: Make sure ldm exception return writes back its base in the right mode.
Gabe Black [Wed, 2 Jun 2010 17:58:04 +0000 (12:58 -0500)]
ARM: Make sure ldm exception return writes back its base in the right mode.

This change moves the writeback of load multiple instructions to the beginning
of the macroop. That way, the MicroLdrRetUop that changes the mode will
necessarily happen later, ensuring the writeback happens in the original mode.
The actual value in the base register if it also shows up in the register list
is undefined, so it's fine if it gets clobbered by one of the loads. For
stores where the base register is the lowest numbered in the register list,
the original value should be written back. That means stores can't write back
at the beginning, but the mode changing problem doesn't affect them so they
can continue to write back at the end.

14 years agoARM: Rework how unrecognized/unimplemented instructions are handled.
Gabe Black [Wed, 2 Jun 2010 17:58:04 +0000 (12:58 -0500)]
ARM: Rework how unrecognized/unimplemented instructions are handled.

Instead of panic immediately when these instructions are executed, an
UndefinedInstruction fault is returned. In FS mode (not currently
implemented), this is the fault that should, to my knowledge, be triggered in
these situations and should be handled using the normal architected
mechanisms. In SE mode, the fault causes a panic when it's invoked that gives
the same information as the instruction did. When/if support for speculative
execution of ARM is supported, this will allow a mispeculated and unrecognized
and/or unimplemented instruction from causing a panic. Only once the
instruction is going to be committed will the fault be invoked, triggering the
panic.

14 years agoARM: Add support for "SUBS PC, LR and related instructions".
Gabe Black [Wed, 2 Jun 2010 17:58:04 +0000 (12:58 -0500)]
ARM: Add support for "SUBS PC, LR and related instructions".

14 years agoARM: Make ldrs into the PC and ldm exception return do interworking branches.
Gabe Black [Wed, 2 Jun 2010 17:58:04 +0000 (12:58 -0500)]
ARM: Make ldrs into the PC and ldm exception return do interworking branches.

14 years agoARM: Align the PC when using it as the base for a load.
Gabe Black [Wed, 2 Jun 2010 17:58:04 +0000 (12:58 -0500)]
ARM: Align the PC when using it as the base for a load.

14 years agoARM: Implement ADR as separate from ADD.
Gabe Black [Wed, 2 Jun 2010 17:58:04 +0000 (12:58 -0500)]
ARM: Implement ADR as separate from ADD.

14 years agoARM: Add support for interworking branch ALU instructions.
Gabe Black [Wed, 2 Jun 2010 17:58:04 +0000 (12:58 -0500)]
ARM: Add support for interworking branch ALU instructions.

14 years agoARM: Fix when the flag bits are updated for thumb.
Gabe Black [Wed, 2 Jun 2010 17:58:04 +0000 (12:58 -0500)]
ARM: Fix when the flag bits are updated for thumb.

14 years agoARM: Don't rely on undefined behavior to get arithmetic right shift.
Gabe Black [Wed, 2 Jun 2010 17:58:04 +0000 (12:58 -0500)]
ARM: Don't rely on undefined behavior to get arithmetic right shift.
Shifting to the right of a signed value when the MSB is one is technically
undefined behavior, even though in my experience it's done the "right thing"
and sign extended the value. This replaces the arithmetic right shift code in
ARM that uses that coincidence with some code that relies on bit math.

14 years agoARM: Restrict the shift amount from a register to 8 bits.
Gabe Black [Wed, 2 Jun 2010 17:58:04 +0000 (12:58 -0500)]
ARM: Restrict the shift amount from a register to 8 bits.
The shift amount when taken from a register is supposed to be truncated to an
8 bit value.

14 years agoARM: Update the stats now that VFP load/store multiple is implemented.
Gabe Black [Wed, 2 Jun 2010 17:58:04 +0000 (12:58 -0500)]
ARM: Update the stats now that VFP load/store multiple is implemented.

14 years agoARM: Define the VFP load/store multiple instructions.
Gabe Black [Wed, 2 Jun 2010 17:58:04 +0000 (12:58 -0500)]
ARM: Define the VFP load/store multiple instructions.

14 years agoARM: Decode the VFP load/store multiple instructions.
Gabe Black [Wed, 2 Jun 2010 17:58:04 +0000 (12:58 -0500)]
ARM: Decode the VFP load/store multiple instructions.

14 years agoARM: Fix the constant describing the number of floating point registers.
Gabe Black [Wed, 2 Jun 2010 17:58:04 +0000 (12:58 -0500)]
ARM: Fix the constant describing the number of floating point registers.

14 years agoARM: Add templates for VFP load/store multiple instructions.
Gabe Black [Wed, 2 Jun 2010 17:58:04 +0000 (12:58 -0500)]
ARM: Add templates for VFP load/store multiple instructions.

14 years agoARM: Add base classes for VFP load/store multiple.
Gabe Black [Wed, 2 Jun 2010 17:58:04 +0000 (12:58 -0500)]
ARM: Add base classes for VFP load/store multiple.

14 years agoARM: Add floating point load/store microops.
Gabe Black [Wed, 2 Jun 2010 17:58:04 +0000 (12:58 -0500)]
ARM: Add floating point load/store microops.

14 years agoARM: Add an fp version of one of the microop indexed registers.
Gabe Black [Wed, 2 Jun 2010 17:58:04 +0000 (12:58 -0500)]
ARM: Add an fp version of one of the microop indexed registers.

14 years agoARM: Move the mmap region to where Linux actually has it.
Gabe Black [Wed, 2 Jun 2010 17:58:04 +0000 (12:58 -0500)]
ARM: Move the mmap region to where Linux actually has it.

14 years agoARM: Eliminate the unused rhi and rlo operands.
Gabe Black [Wed, 2 Jun 2010 17:58:03 +0000 (12:58 -0500)]
ARM: Eliminate the unused rhi and rlo operands.

14 years agoARM: Move the macro mem constructor out of the isa desc.
Gabe Black [Wed, 2 Jun 2010 17:58:03 +0000 (12:58 -0500)]
ARM: Move the macro mem constructor out of the isa desc.
This code doesn't use the parser at all, and moving it out reduces the
conceptual complexity of that code.

14 years agoARM: Make macroops panic if executed directly.
Gabe Black [Wed, 2 Jun 2010 17:58:03 +0000 (12:58 -0500)]
ARM: Make macroops panic if executed directly.
The macroop should never be executed, only it's microops will.

14 years agoARM: GCC < 4.3 has some issues with attribute no return on some functions. Fix so...
Ali Saidi [Wed, 2 Jun 2010 17:58:03 +0000 (12:58 -0500)]
ARM: GCC < 4.3 has some issues with attribute no return on some functions. Fix so it works for older gccs.

14 years agoARM: Split out the "basic" templates and format.
Gabe Black [Wed, 2 Jun 2010 17:58:03 +0000 (12:58 -0500)]
ARM: Split out the "basic" templates and format.

--HG--
rename : src/arch/arm/isa/formats/basic.isa => src/arch/arm/isa/templates/basic.isa

14 years agoARM: Remove unnecessary cruft from includes.isa.
Gabe Black [Wed, 2 Jun 2010 17:58:03 +0000 (12:58 -0500)]
ARM: Remove unnecessary cruft from includes.isa.

14 years agoARM: Move the inst2string function out of the isa_desc.
Gabe Black [Wed, 2 Jun 2010 17:58:03 +0000 (12:58 -0500)]
ARM: Move the inst2string function out of the isa_desc.
Delete the now empty formats/util.isa.

14 years agoARM: Get rid of the unused ArmGenericCodeSubs.
Gabe Black [Wed, 2 Jun 2010 17:58:03 +0000 (12:58 -0500)]
ARM: Get rid of the unused ArmGenericCodeSubs.

14 years agoARM: Make the predecoder print out the ExtMachInst it gathered when traced.
Gabe Black [Wed, 2 Jun 2010 17:58:03 +0000 (12:58 -0500)]
ARM: Make the predecoder print out the ExtMachInst it gathered when traced.

14 years agoARM: Remove special naming for the new version of multiply.
Gabe Black [Wed, 2 Jun 2010 17:58:03 +0000 (12:58 -0500)]
ARM: Remove special naming for the new version of multiply.

14 years agoARM: Hook the new multiply instructions into all the decoders.
Gabe Black [Wed, 2 Jun 2010 17:58:03 +0000 (12:58 -0500)]
ARM: Hook the new multiply instructions into all the decoders.

14 years agoARM: Implement all integer multiply instructions.
Gabe Black [Wed, 2 Jun 2010 17:58:03 +0000 (12:58 -0500)]
ARM: Implement all integer multiply instructions.

14 years agoARM: Add templates for multiply instructions.
Gabe Black [Wed, 2 Jun 2010 17:58:03 +0000 (12:58 -0500)]
ARM: Add templates for multiply instructions.

14 years agoARM: Add base classes for multiply instructions.
Gabe Black [Wed, 2 Jun 2010 17:58:03 +0000 (12:58 -0500)]
ARM: Add base classes for multiply instructions.

14 years agoARM: Decode plain binary immediate thumb data processing instructions.
Gabe Black [Wed, 2 Jun 2010 17:58:03 +0000 (12:58 -0500)]
ARM: Decode plain binary immediate thumb data processing instructions.

14 years agoARM: Define a new "movt" data processing instruction.
Gabe Black [Wed, 2 Jun 2010 17:58:03 +0000 (12:58 -0500)]
ARM: Define a new "movt" data processing instruction.

14 years agoARM: Hook the new branch instructions into the 32 bit thumb decoder.
Gabe Black [Wed, 2 Jun 2010 17:58:03 +0000 (12:58 -0500)]
ARM: Hook the new branch instructions into the 32 bit thumb decoder.

14 years agoARM: Hook the new branch instructions into the 16 bit thumb decoder.
Gabe Black [Wed, 2 Jun 2010 17:58:03 +0000 (12:58 -0500)]
ARM: Hook the new branch instructions into the 16 bit thumb decoder.

14 years agoARM: Eliminate the old style branch instructions.
Gabe Black [Wed, 2 Jun 2010 17:58:03 +0000 (12:58 -0500)]
ARM: Eliminate the old style branch instructions.

14 years agoARM: Hook the new branch instructions into the ARM decoder.
Gabe Black [Wed, 2 Jun 2010 17:58:02 +0000 (12:58 -0500)]
ARM: Hook the new branch instructions into the ARM decoder.

14 years agoARM: Implement branch instructions external to the decoder.
Gabe Black [Wed, 2 Jun 2010 17:58:02 +0000 (12:58 -0500)]
ARM: Implement branch instructions external to the decoder.

14 years agoARM: Add new templates for branch instructions.
Gabe Black [Wed, 2 Jun 2010 17:58:02 +0000 (12:58 -0500)]
ARM: Add new templates for branch instructions.

14 years agoARM: Implement new base classes for branches.
Gabe Black [Wed, 2 Jun 2010 17:58:02 +0000 (12:58 -0500)]
ARM: Implement new base classes for branches.

14 years agoARM: Replace the interworking branch base class with a special operand.
Gabe Black [Wed, 2 Jun 2010 17:58:02 +0000 (12:58 -0500)]
ARM: Replace the interworking branch base class with a special operand.

14 years agoARM: Fix PC operand handling.
Gabe Black [Wed, 2 Jun 2010 17:58:02 +0000 (12:58 -0500)]
ARM: Fix PC operand handling.

14 years agoARM: Remove the special naming from the new version of data processing instructions.
Gabe Black [Wed, 2 Jun 2010 17:58:02 +0000 (12:58 -0500)]
ARM: Remove the special naming from the new version of data processing instructions.

14 years agoARM: Get rid of unnecessary flag calculating functions.
Gabe Black [Wed, 2 Jun 2010 17:58:02 +0000 (12:58 -0500)]
ARM: Get rid of unnecessary flag calculating functions.

14 years agoARM: Get rid of the unused Jump format.
Gabe Black [Wed, 2 Jun 2010 17:58:02 +0000 (12:58 -0500)]
ARM: Get rid of the unused Jump format.

14 years agoARM: Get rid of obsoleted predicated inst formats, etc.
Gabe Black [Wed, 2 Jun 2010 17:58:02 +0000 (12:58 -0500)]
ARM: Get rid of obsoleted predicated inst formats, etc.

14 years agoARM: Implement disassembly for the new data processing classes.
Gabe Black [Wed, 2 Jun 2010 17:58:02 +0000 (12:58 -0500)]
ARM: Implement disassembly for the new data processing classes.

14 years agoARM: Hook the external data processing instructions into the Thumb decoder.
Gabe Black [Wed, 2 Jun 2010 17:58:02 +0000 (12:58 -0500)]
ARM: Hook the external data processing instructions into the Thumb decoder.

14 years agoARM: Move the modified_imm function from all ARM instructions to just data processing...
Gabe Black [Wed, 2 Jun 2010 17:58:02 +0000 (12:58 -0500)]
ARM: Move the modified_imm function from all ARM instructions to just data processing ones.

14 years agoARM: Hook the new external data processing instructions to the ARM decoder.
Gabe Black [Wed, 2 Jun 2010 17:58:02 +0000 (12:58 -0500)]
ARM: Hook the new external data processing instructions to the ARM decoder.

14 years agoARM: Implement data processing instructions external to the decoder.
Gabe Black [Wed, 2 Jun 2010 17:58:02 +0000 (12:58 -0500)]
ARM: Implement data processing instructions external to the decoder.

14 years agoARM: Add new base classes for data processing instructions.
Gabe Black [Wed, 2 Jun 2010 17:58:02 +0000 (12:58 -0500)]
ARM: Add new base classes for data processing instructions.

14 years agoARM: Hook up 32 bit thumb load/store multiple.
Gabe Black [Wed, 2 Jun 2010 17:58:02 +0000 (12:58 -0500)]
ARM: Hook up 32 bit thumb load/store multiple.

14 years agoARM: Hook up 16 bit thumb load/store multiple.
Gabe Black [Wed, 2 Jun 2010 17:58:02 +0000 (12:58 -0500)]
ARM: Hook up 16 bit thumb load/store multiple.

14 years agoARM: Reimplement load/store multiple external to the decoder.
Gabe Black [Wed, 2 Jun 2010 17:58:02 +0000 (12:58 -0500)]
ARM: Reimplement load/store multiple external to the decoder.

--HG--
rename : src/arch/arm/isa/formats/macromem.isa => src/arch/arm/isa/insts/macromem.isa
rename : src/arch/arm/isa/formats/macromem.isa => src/arch/arm/isa/templates/macromem.isa

14 years agoARM: Move the templates for predicated instructions into a separate file.
Gabe Black [Wed, 2 Jun 2010 17:58:01 +0000 (12:58 -0500)]
ARM: Move the templates for predicated instructions into a separate file.
This allows the templates to all be available at the same time before any of
the formats, etc. This breaks an artificial circular dependence.

--HG--
rename : src/arch/arm/isa/formats/pred.isa => src/arch/arm/isa/templates/pred.isa

14 years agoARM: Remove the special naming for the new memory instructions.
Gabe Black [Wed, 2 Jun 2010 17:58:01 +0000 (12:58 -0500)]
ARM: Remove the special naming for the new memory instructions.
These are the only memory instructions now.

14 years agoARM: Eliminate the old memory formats which are no longer used.
Gabe Black [Wed, 2 Jun 2010 17:58:01 +0000 (12:58 -0500)]
ARM: Eliminate the old memory formats which are no longer used.

14 years agoARM: Eliminate decoding for the very deprecated FPA instructions.
Gabe Black [Wed, 2 Jun 2010 17:58:01 +0000 (12:58 -0500)]
ARM: Eliminate decoding for the very deprecated FPA instructions.

14 years agoARM: Make the addressing mode 3 loads/stores use the externally defined instructions.
Gabe Black [Wed, 2 Jun 2010 17:58:01 +0000 (12:58 -0500)]
ARM: Make the addressing mode 3 loads/stores use the externally defined instructions.

14 years agoARM: Pull double memory instructions out of the decoder.
Gabe Black [Wed, 2 Jun 2010 17:58:01 +0000 (12:58 -0500)]
ARM: Pull double memory instructions out of the decoder.

14 years agoARM: Force the condition code for 16 bit thumb instructions to be unconditional.
Gabe Black [Wed, 2 Jun 2010 17:58:01 +0000 (12:58 -0500)]
ARM: Force the condition code for 16 bit thumb instructions to be unconditional.
Before, because 16 bit thumb instructions didn't set the upper 16 bits of the
ExtMachInst, that field would be interpretted as "equals".

14 years agoARM: Decode 16 bit thumb PC relative memory instructions.
Gabe Black [Wed, 2 Jun 2010 17:58:01 +0000 (12:58 -0500)]
ARM: Decode 16 bit thumb PC relative memory instructions.

14 years agoARM: Decode 16 bit thumb immediate addressed memory instructions.
Gabe Black [Wed, 2 Jun 2010 17:58:01 +0000 (12:58 -0500)]
ARM: Decode 16 bit thumb immediate addressed memory instructions.

14 years agoARM: Decode 16 bit thumb register addressed memory instructions.
Gabe Black [Wed, 2 Jun 2010 17:58:01 +0000 (12:58 -0500)]
ARM: Decode 16 bit thumb register addressed memory instructions.

14 years agoARM: Make single stores decode to the new external store instructions.
Gabe Black [Wed, 2 Jun 2010 17:58:01 +0000 (12:58 -0500)]
ARM: Make single stores decode to the new external store instructions.

14 years agoARM: Add a .w to the disassembly of 32 bit thumb instructions.
Gabe Black [Wed, 2 Jun 2010 17:58:01 +0000 (12:58 -0500)]
ARM: Add a .w to the disassembly of 32 bit thumb instructions.
This isn't technically correct since the .w should only be added if there are
32 and 16 bit encodings, but always having it always is better than never
having it.