Embodiments of the invention relate to microprocessors and microprocessor systems. In particular, at least one embodiment of the invention relates to an instruction encoding technique resulting in a compressed instruction format.
Microprocessor technology has evolved over the years at a fast rate. Advances in computer architecture and semiconductor technology have created many opportunities to design new processors. There are typically two options for designing new processors: (1) defining a completely new architecture, and (2) extending the current architecture to accommodate new features.
New processors involve new features in both hardware and software. A new processor based on existing design typically has an additional set of instructions that can take advantage of the new hardware design. However, extending an instruction set by adding a new set of instructions is a challenging problem because of the constraints in the encoding of the instructions and in storing instruction opcode maps. Therefore there is a need in the industry to provide an efficient method for extending an instruction set without increasing hardware complexity and without significantly expanding the number and size of opcode maps.
The features and advantages of the invention will become apparent from the following detailed description of the invention in which:
At least one method, apparatus and system for extending an instruction set using embodiments of a unique instruction attribute encoding. Disclosed embodiments further enable an instruction set architecture to expand while conserving storage area for storing opcode maps associated with the instruction set architecture. In at least one embodiment, a set of existing instruction fields are mapped, compressed, or replaced by instruction attribute fields that may retain information associated with prior art instruction fields, but may result in a more compact instruction requiring less storage area for storing the instructions and instruction opcode maps. In one embodiment, instruction attribute encodings may enable further instruction and micro-architectural features, including an extra source operand to be used by some instructions as well as an increased data size for instructions, such as vector instructions (e.g., single-instruction-multiple-data (SIMD) instructions).
In the following description, for purposes of explanation, numerous specific details such as processor types, instruction formats, logic gate types, and escape opcode values are set forth in order to provide a thorough understanding of embodiments of the invention. However, it will be apparent to one skilled in the art that these specific details are not required in order to practice embodiments the invention. In other instances, well-known electrical structures and circuits are shown in block diagram form in order not to obscure embodiments of the invention. In the following description, the notation ‘0x’ indicates the number that follows is in hexadecimal format.
Reference to
The decode unit 116 is shown to be capable of decoding instructions 106 that follow formats defined by an extended instruction set 118. The instruction set 118 includes an existing instruction set 118a and a new instruction set 118b, which may represent any new instructions that may be introduced to the architecture. The instruction set 118 includes instructions for performing operations on scalar and packed (or vector) data. The format for these operations can be any convenient format, including single-precision, double-precision, and extended floating-point numbers, signed and unsigned integers, and non-numeric data. For at least one embodiment, the instructions defined in the instruction set 118 may vary in length from one another.
Instructions 106, which follow the formats set forth by the instruction set 118, may be stored in a memory system 102. Memory system 102 is intended as a generalized representation of memory or memory hierarchies and may include a variety of forms of memory, such as a hard drive, CD-ROM, random access memory (RAM), dynamic random access memory (DRAM), static random access memory (SRAM), flash memory and related circuitry. Memory system 102 may store, in addition to instructions 106, data 104 represented by data signals that may be executed by processor 110.
In one embodiment, the term “escape opcode” refers to a two-byte value that indicates to decoder logic that an opcode to which an instruction corresponds may have various attributes, such as a three-byte opcode, in which two bytes correspond to the escape opcode and a third byte corresponds to an opcode indicating the function of the instruction. For example, in one embodiment, the two-byte value in the three-byte escape field may be one of the following values: 0x0F38, 0x0F39, 0x0F3A or 0x0F3B. The contents of the modR/M field 230 indicate an addressing-form. The modR/M field may specify registers and addressing modes.
Certain encodings of information in the modR/M field 230 may indicate that a second byte of addressing information is present in the SIB (Scale/Index/Base) field 240 to fully specify the addressing form of the instruction code. For instance, a base-plus-index addressing form and a scale-plus-index addressing form may each include information, such as scale factor, register number for the index, and/or register number of the base register, in the SIB field 240.
One skilled in the art will recognize that the format 200 set forth in
As used herein, an instruction (such as one of the instructions 106 illustrated in
The acceptable byte values for an actual instruction are specified in the instruction set 118 (
The prefix field 210 illustrated in
The contents of the opcode field 220 specify one or more operations to be performed by a processor executing the instruction. For at least one embodiment, the opcode field may include three bytes. In other embodiments, the opcode may include one, two or more than three bytes. For some instructions, the three-byte escape opcode value in the two-byte field 118c of the opcode field 220 is combined with the contents of a third byte 225 of the opcode field 220 to specify an operation. This third byte 225 is referenced to herein as an instruction-specific opcode. For some instructions, the three-byte escape opcode value in the two-byte field 118c of the opcode field 220 is combined with the contents of the prefix field 210 and the contents of the instruction-specific opcode field 225 of the opcode field 220 to specify an operation.
In general, the combination of the prefix field 210 and the opcode field 220 creates a number of different types of instructions. For illustrative purposes,
The regular one-byte instruction 212 includes regular instructions with one-byte instruction-specific opcodes in the opcode field 220. The regular instruction with prefix as qualifier 214 includes regular instructions that use the prefix as a qualifier for the opcode. For example, a string instruction may use a REPEAT prefix value to repeat the string instruction by a number of times specified in the count register or until a certain condition is met. The prefix value used in instruction 214 does not add a completely new meaning to the opcode value that follows in the opcode field 220. Rather, the prefix value is merely used as a qualifier to qualify the opcode with additional conditions. The use of the prefix in the instruction 214 may be different for different instruction types.
In one embodiment, the regular escape instruction 216 is a regular instruction that utilizes an escape opcode in a first field 215 of the opcode field 220 to indicate to decoder hardware that an instruction-specific opcode in a second field 217 of the opcode field 220 is used to define the instruction. For example, in one embodiment, a floating-point coprocessor escape opcode value 0xD8 through 0xDF in the first byte 215 of the opcode field 220 indicates that the opcode value that follows in the second byte 217 of the opcode field 220 should be interpreted as a coprocessor instruction and should be directed to coprocessor hardware for execution.
The first extended instruction type 222 is a particular type of escape instruction that is defined to contain a predefined escape opcode value, 0x0F, in a first field 221 of the opcode field 220. The escape opcode 0x0F indicates to decoder hardware that an instruction-specific opcode value in a second field 223 of the opcode field 220 is used to define the instruction. Instructions of the first extended instruction type 222 may, depending on the value of the second opcode byte (and, in some cases, the value of three bits of the modR/M field 230), be of varying lengths. For example, two instructions (Packed Shift Left Logical) of extended instruction type 222 may include the following instruction field values, respectively:
PSLLW (shift value in register): 0F:F1:1b“11xxxyyy”, where xxx defines a first register and yyy defines a second register
PSLLW (shift by immed. value): 0F:71:1b“11110xxx”: immed data (8 bits), where xxx defines a register
In each of the PSSLW instructions set forth, the first word of the opcode field 220 includes the escape value 0x0F. The first instruction is three bytes long but the second instruction is four bytes because it includes a byte of immediate data. Accordingly, for extended instruction type 222 decoder hardware (such as, for example, instruction length decoder 306 in
Instruction prefixes were originally developed to enhance a set of instructions. For example, the repeat prefix is developed to repeat a string instruction. The repeat prefix codes are 0xF3 (REP, REPE) and 0xF2 (REPNE). The prefix used as such does not define a new meaning for the opcode that follows. It merely defines additional operational conditions for the opcode.
Escape opcodes provide an extension to the instruction set. For example, the escape opcodes 0xD8 through 0xDF are used to indicate that the second opcode byte 217 contains a value defining an instruction for the floating-point unit. The decoder passes the opcode to the floating-point decoder.
For at least one\instruction set, a 3-byte escape opcode is a two-byte entity having a value of 0x0F3y, where y is 0x8, 0x9, 0xA or 0xB. The 3-byte escape opcode value in the 3-byte escape code field 118c indicates to the decoder that the instruction-specific opcode value in the third byte 225 of the opcode field 200 indicates an instruction in a new instruction set. A new instruction set may be any new instruction set added to the architecture.
In contrast to a 2-byte escape opcode, the value in the 3-byte escape opcode field 118c indicates to the decoder the method to be used to determine the length of the instruction. That is, each value for the 3-byte escape opcode is associated with a particular method to be used to determine the instruction length for every instruction in the map corresponding to the particular 3-byte escape code. For instance, the value 0x0F38 in the 3-byte escape opcode field 118c is associated with an associated opcode map. The length for each instruction in the 0x0F38 opcode map may be calculated using the same length-determination method used to determine the length of the other instructions in the 0x0F38 opcode map.
Similarly, the length of each instruction of the respective opcode maps associated with the remaining 3-byte escape opcode values (0x0F39, 0x0F3A, 0x0F3B) may be calculated with the same length-determination logic used to determine the length of the other instructions in the respective opcode map.
The length-determination logic used to determine the length of instructions for each instruction in one of the new opcode maps is simplified in that the same set of input terms is evaluated to determine the length of each instruction in the opcode map. Such length-determination logic is referred to herein as a “fixed-input” logic or method. That is, each input term evaluated to determine the length of one instruction in the map is also relevant to determination of the length of every other instruction in the map. The fixed set of terms to be evaluated may differ from opcode map to opcode map. While the set of inputs to be evaluated may differ among opcode maps, the inputs evaluated to determine instruction length are the same across all instructions in a give 3-byte opcode map.
The combination of a prefix and an escape opcode provides a significant enlargement of a processor's opcode table to allow additional new instruction sets. This combination uses the existing prefix codes to define a new set of instructions, in addition to the instruction set created by the escape opcodes. By using the existing prefix codes, the decoding circuitry for the existing instruction set may remain relatively unmodified to support decoding of the new instructions 118c (
The instruction-specific opcode values (in the third byte 225 of the opcode field 220) of some or all of the new instructions may be the same as the opcodes of the existing instructions. By using the same opcodes with the prefix and escape opcodes to define a new set of instructions, the decoding circuitry may be less complex than having a completely new set of opcodes for the new instruction set.
In one embodiment, the prefix value is used to define new instructions. Furthermore, prefixes can still be used in the traditional role of enhancing the opcode or qualifying the opcode under some operational condition.
Table 1, below, illustrates some prior art examples of an instruction set using prefixes and three-byte escape opcodes.
In the above examples, the instructions with the prefix 0x66 relate to instructions that utilize one or more extended-size registers (such as 128-bit register size), while the instructions without the prefix 0x66 relate to instructions that utilize one or more smaller-size registers (such as 64-bit register size). The smaller-size registers are referred to herein as “regular length” registers. As is known by one skilled in the art, the exact codes for prefixes are implementation-dependent and the 0x66 prefix value discussed above is merely for illustrative purposes.
The original x86 instruction set provided for a 1-byte opcode with various formats of address syllable and immediate operand contained in additional bytes whose presence was known from the first “opcode” byte. Additionally, there were certain byte values that were reserved as modifiers to the opcode (called prefixes, as they had to be placed before the instruction). When the original palette of 256 opcode bytes (including these special prefix values) was exhausted, a single byte was dedicated as an escape to a new set of 256 opcodes. As vector instructions (e.g., SIMD) were added, a need for more opcodes was generated, and the “two byte” opcode map also was insufficient, even when expanded through the use of prefixes. To this end, new instructions were added in additional maps which use 2 bytes plus an optional prefix as an identifier.
Additionally, in order to facilitate additional registers in 64-bit mode, an additional prefix may be used (called “REX”) in between the prefixes and the opcode (and any escape bytes necessary to determine the opcode). In one embodiment, the REX may have 4 “payload” bits to indicate use of additional registers in 64-bit mode. In other embodiments it may have fewer or more than 4 bits. The general format of at least one instruction set is illustrated generically by the following:
In this example “etc.” represents the address syllable (e.g., one to six bytes) and perhaps additional immediate information for the instruction.
As new instruction sets are added, it can be seen that the size of instructions, including prefix, data-size indicator, escape codes, opcodes, and intermediate, address fields, etc., are causing the code size to expand, which can be undesirable for a number of reasons.
In order to enable new instruction set extensions, while remaining backward compatible with existing and legacy instruction sets, a new instruction encoding technique may be desirable. Accordingly, at least one embodiment of the invention includes an instruction encoding that enables backward compatibility, enhanced functionality, while reducing code size. In one embodiment, the instruction encoding uses a new byte to indicate whether the instruction requires a second extension field or not. The following illustration shows a legacy instruction and how at least one embodiment of the invention at least maintains if not improves the code size to which the instruction contributes. In the example illustrated In
As can be seen above, the non-fixed part of the instruction (prefix, REX, escape code) has gone from a range of 1 to 3 bytes to 2 bytes. In the worst case, the instruction encoding according to one embodiment adds only one byte the legacy encoding, and in the best case, it saves one byte of encoding over the legacy encoding. In the above example, the byte-long prefix, “[66, F2, F3]”, is represented by two bits “pp”, a field of the REX byte is represented by one bit, “R”, and the escape byte is re-coded from “0F” to “C5” (which will be discussed below). Furthermore, a 4-bit field, “VVVV” has been added to specify an extra source operand, and an increased vector size has been provided for through vector size bit “L”, which may designate either a 128 bit or a 256 bit vector size.
The following illustrates an embodiment using two bytes to encode an instruction set instruction, which may be used when a second escape code is present in the original instruction, or when extra bits (e.g, the XB and W fields) in the REX field need to be used. In the embodiment illustrated in
In the above illustration, the original instruction is assumed to use either the REX or the “escape2” fields (or both), and as a result the length of the non-fixed part of the instruction has gone from a range of 2 to 4 bytes to 3 bytes. In the worst case, one embodiment of the invention increases the original instruction encoding by 1 byte, in the best case, the embodiment decreases the original instruction encoding by 1 byte. In contrast to the single escape code example mentioned before, the REX byte is represented by 4 bits (RXB and W) and the second escape field is present and encoded in 5 bits (“mmmmm”) instead of using a discrete byte as in the prior art encoding.
Although embodiments disclosed use 5 bits to compress up to 32 different values of escape2 code bytes, in other embodiments, bits from the escape2 code bits may be used for other functions, such as extending the vector length to 4 combinations (illustrated below, where the “mmmmm” bits are renamed as ‘L’) and maintaining the ability to encode 16 different escapes.
Similarly, if only 4 values of escape2 code are needed, then the upper “mmmmm” bits could be renamed to indicate the QRS feature, which may assume seven values other than the original “default behavior” value compatible with the original implementation.
In the above examples, the escape code is “C4”, indicating that the instruction is represented by the second encoding rather than one mentioned before, indicated by “C5”. It should be noted that the choice of values “C5” and “C4” values and the encoding of the payloads is chosen so that it will be backwards compatible with unimplemented opcodes on current processors of at least one architecture (e.g., x86). One of ordinary skill in the art will recognize that C5 and C4 correspond to the “LDS” and “LES” instructions, respectively, which are legal under opcodes in an x86 architecture.
In some embodiments, instructions in the format, “[prefixes] [REX] [escape bytes] opcode [additional bytes to end of instruction]”, may be translated into a more compact and efficient format, “[Attributes] [opcode] [additional bytes to end of instruction]”, where the “Attributes” field may include fewer bits than the original instruction from which it was translated.
In addition to instruction sets mentioned herein, other instructions from other instruction sets may also benefit from embodiments of the invention.
The instruction length decoder 306 determines the length of an actual instruction code that has been fetched from external memory (such as, e.g., memory 102,
For at least one embodiment, the five illustrates bytes of the instruction code are contiguous, such that K=N+8, L=K+8 and L=N+16, and M=L+8, M=K+16 and M=K+24, and so on. However, as is discussed above in connection with
One of skill in the art will recognize that logic of the instruction length decoder 306 may implement fairly complex length decode methods in a system that supports variable-length instructions. This is especially true in systems that require different methods, that evaluate different inputs, to determine instruction length for instructions within the same opcode map. In some embodiments, the length of each instruction within an opcode map is determined by a single fixed-input length-determination logic.
The rotator 308 rotates the raw instruction bytes such that the first byte to be decoded is in an initial position. The rotator 308 thus identifies the beginning of the instruction bytes to be decoded. It should be noted that, although the rotator 308 may identify the first byte of an instruction, such as a prefix byte, the first byte need not be identified.
The instruction buffer 310 receives and stores the instructions that have been fetched from the external memory. For at least one embodiment, the instructions are length-decoded and rotated before being received by the instruction buffer 310. For at least one embodiment, the instruction buffer 310 is implemented as an instruction cache.
The first phase instruction pre-decoder 320 receives the instruction bytes and detects the presence of one or more of a set of predefined prefixes and/or escape codes and/or opcodes used as part of an instruction set. The second phase pre-decode logic 330 utilizes the results of the pre-decoder 320 to translate the instruction information received from a prior art instruction format to one in accordance with one embodiment. The translated instruction is then sent to the opcode decoder 340 to generate instruction signals (e.g., micro-operations) consistent with the desired instruction operation.
In one embodiment, the translation logic 340 translates an instruction of format, “[prefixes] [REX] [escape bytes] opcode [additional bytes to end of instruction]”, into a more compact and efficient format, “[Attributes] [opcode] [additional bytes to end of instruction]”. In other embodiments, other instructions having other instruction formats are translated into the above compact format.
As illustrated in
While particular embodiments of the present invention have been shown and described, it will be obvious to those skilled in the art that changes and modifications can be made without departing from the present invention in its broader aspects. The appended claims are to encompass within their scope all such changes and modifications that fall within the true scope of the present invention.
Number | Name | Date | Kind |
---|---|---|---|
5438668 | Coon et al. | Aug 1995 | A |
5592635 | Chan | Jan 1997 | A |
5604876 | Matsui | Feb 1997 | A |
5680568 | Sakamura | Oct 1997 | A |
5689672 | Witt et al. | Nov 1997 | A |
5699536 | Hopkins et al. | Dec 1997 | A |
5740392 | Brennan | Apr 1998 | A |
5809273 | Favor | Sep 1998 | A |
5881260 | Raje et al. | Mar 1999 | A |
5884071 | Kosaraju | Mar 1999 | A |
6014735 | Chennupaty et al. | Jan 2000 | A |
6041403 | Parker | Mar 2000 | A |
6049862 | Bauer | Apr 2000 | A |
6101592 | Pechanek et al. | Aug 2000 | A |
6157996 | Christie | Dec 2000 | A |
6240506 | Miller | May 2001 | B1 |
6496923 | Gruner et al. | Dec 2002 | B1 |
6539470 | Mahurin et al. | Mar 2003 | B1 |
6557094 | Pechanek et al. | Apr 2003 | B2 |
6581131 | Vondran et al. | Jun 2003 | B2 |
6625724 | Kahn et al. | Sep 2003 | B1 |
6654874 | Lee | Nov 2003 | B1 |
6763449 | Sugano et al. | Jul 2004 | B1 |
6807622 | McGrath | Oct 2004 | B1 |
6877084 | Christie | Apr 2005 | B1 |
7058791 | Hughes et al. | Jun 2006 | B1 |
7313671 | Leijten et al. | Dec 2007 | B2 |
7328328 | Henry et al. | Feb 2008 | B2 |
7353368 | Chow et al. | Apr 2008 | B2 |
7395412 | Henry et al. | Jul 2008 | B2 |
7421566 | Gschwind | Sep 2008 | B2 |
7590832 | Taniuchi | Sep 2009 | B2 |
7703088 | Li et al. | Apr 2010 | B2 |
7793081 | Gschwind | Sep 2010 | B2 |
7836278 | Sudhakar et al. | Nov 2010 | B2 |
7849294 | Gschwind | Dec 2010 | B2 |
7877582 | Gschwind | Jan 2011 | B2 |
8166281 | Gschwind | Apr 2012 | B2 |
8312424 | Gschwind | Nov 2012 | B2 |
8893079 | Gschwind | Nov 2014 | B2 |
8893095 | Gschwind | Nov 2014 | B2 |
8918623 | Gschwind | Dec 2014 | B2 |
9395981 | Gschwind | Jul 2016 | B2 |
9411585 | Gschwind | Aug 2016 | B2 |
9727336 | Gschwind | Aug 2017 | B2 |
9727337 | Gschwind | Aug 2017 | B2 |
10635823 | Gutson | Apr 2020 | B2 |
20010044891 | McGrath et al. | Nov 2001 | A1 |
20030172252 | Henry et al. | Sep 2003 | A1 |
20030200426 | Lee et al. | Oct 2003 | A1 |
20030212879 | Henkel et al. | Nov 2003 | A1 |
20030236964 | Madduri | Dec 2003 | A1 |
20030236965 | Sheaffer | Dec 2003 | A1 |
20040210616 | Debes et al. | Oct 2004 | A1 |
20040250053 | McGrath et al. | Dec 2004 | A1 |
20040268090 | Coke et al. | Dec 2004 | A1 |
20060026401 | Chauvel | Feb 2006 | A1 |
20070038848 | Gschwind | Feb 2007 | A1 |
20070038984 | Gschwind | Feb 2007 | A1 |
20080189519 | Gschwind | Aug 2008 | A1 |
20080215856 | Gschwind | Sep 2008 | A1 |
20090172356 | Valentine | Jul 2009 | A1 |
20090198966 | Gschwind | Aug 2009 | A1 |
20090198977 | Gschwind | Aug 2009 | A1 |
20090300331 | Gschwind | Dec 2009 | A1 |
20110271083 | Raubuch | Nov 2011 | A1 |
20120265967 | Gschwind | Oct 2012 | A1 |
20120297171 | Gschwind | Nov 2012 | A1 |
20120297373 | Gschwind | Nov 2012 | A1 |
20120331271 | Valentine | Dec 2012 | A1 |
20130073836 | Gschwind | Mar 2013 | A1 |
20130073838 | Gschwind | Mar 2013 | A1 |
20130080745 | Gschwind | Mar 2013 | A1 |
20130103932 | Gschwind | Apr 2013 | A1 |
20140281398 | Rash | Sep 2014 | A1 |
20140281399 | Rash | Sep 2014 | A1 |
20190042760 | Gutson | Feb 2019 | A1 |
20200201633 | Madduri | Jun 2020 | A1 |
Number | Date | Country |
---|---|---|
1624653 | Jun 2005 | CN |
1846193 | Oct 2006 | CN |
H11259293 | Sep 1999 | JP |
Entry |
---|
IBM Technical Disclosure Bulletin NA9003349 “Opcode Remap and Compression in Hard Wired RISC Microprocessor,” Mar. 1990. (Year: 1990). |
‘An Instruction Stream Compression Technique’ by Peter L. Bird and Trevor N. Mudge, Nov. 27, 1996. (Year: 1996). |
Advisory Action from U.S. Appl. No. 11/965,669, dated Jul. 26, 2011, 3 pages. |
Advisory Action from U.S. Appl. No. 11/965,669, dated Sep. 9, 2011, 2 pages. |
Decision on Rejection from foreign counterpart Chinese Patent Application No. 200810189862.8, dated May 22, 2012, 6 pages. (English translation only available). |
Final Office Action from U.S. Appl. No. 11/965,669, dated May 12, 2011, 16 pages. |
First Office Action and Search Report from foreign counterpart Chinese Patent Application No. 201210328169.0, dated Nov. 3, 2014, 29 pages. |
First Office Action from foreign counterpart Chinese Patent Application No. 200810189862.8, dated Jul. 21, 2011, 9 pages. |
Non Final Office Action from U.S. Appl. No. 11/965,669, dated Oct. 7, 2010. |
Non Final Office Action from U.S. Appl. No. 11/965,669, dated Feb. 28, 2012, 9 pages. |
Non-Final Office Action from U.S. Appl. No. 15/431,652, dated Jan. 22, 2018, 13 pages. |
Non-Final Office Action from U.S. Appl. No. 13/607 594 dated Dec. 5, 2012, 13 pages. |
Non-Final Office Action from U.S. Appl. No. 13/843,993 dated Sep. 13, 2013, 19 pages. |
Non-Final Office Action from U.S. Appl. No. 14/307,468, dated Oct. 15, 2015, 7 pages. |
Notice of Allowance from U.S. Appl. No. 14/307,468, dated Apr. 4, 2016, 6 pages. |
Notice of Allowance from U.S. Appl. No. 14/307,468, dated Oct. 17, 2016, 13 pages. |
Notice of Allowance from U.S. Appl. No. 11/965,669, dated Jun. 15, 2012, 9 pages. |
Notice of Allowance from U.S. Appl. No. 13/607,594, dated Apr. 11, 2013, 8 pages. |
Notice of Allowance from U.S. Appl. No. 13/843,993, dated Feb. 5, 2014, 8 pages. |
Notice of Allowance from U.S. Appl. No. 15/431,652, dated Jun. 14, 2018, 16 pages. |
Notification to Grant Patent Right for Invention from foreign counterpart Chinese Patent Application No. 200810189862.8, dated Jan. 12, 2016, 4 pages. |
Notification to Grant Patent Right for Invention from foreign counterpart Chinese Patent Application No. 201210328169.0, dated May 16, 2016, 4 pages. |
Second Office Action and Search Report from foreign counterpart Chinese Patent Application No. 200810189862.8, dated Jan. 26, 2015, 17 pages. |
Second Office Action from foreign counterpart Chinese Patent Application No. 201210328169.0, dated Jun. 19, 2015, 11 pages. |
Third Office Action from foreign counterpart Chinese Patent Application No. 200810189862.8, dated Jun. 30, 2015, 8 pages. |
Third Office Action from foreign counterpart Chinese Patent Application No. 201210328169.0, dated Dec. 11, 2015, 7 pages. |
Number | Date | Country | |
---|---|---|---|
20190310846 A1 | Oct 2019 | US |
Number | Date | Country | |
---|---|---|---|
Parent | 15431652 | Feb 2017 | US |
Child | 16155028 | US | |
Parent | 14307468 | Jun 2014 | US |
Child | 15431652 | US | |
Parent | 13843993 | Mar 2013 | US |
Child | 14307468 | US | |
Parent | 13607594 | Sep 2012 | US |
Child | 13843993 | US | |
Parent | 11965669 | Dec 2007 | US |
Child | 13607594 | US |