Khác biệt giữa bản sửa đổi của “Kiến trúc Universal”
Dòng 133: | Dòng 133: | ||
| 30 || JI || jmpri $imm24 bit || 10000000 imm24 || Nhảy vô điều kiện tới 20 bits liên quan |
| 30 || JI || jmpri $imm24 bit || 10000000 imm24 || Nhảy vô điều kiện tới 20 bits liên quan |
||
|- |
|- |
||
| 31 || JIcc || jmpiCC $ |
| 31 || JIcc || jmpiCC $imm21 bit || 10000001 ccc imm21 || Nhảy điều kiện tới 20 bit liên quan, 3 bít điều kiện là c |
||
|- |
|- |
||
| 32 || |
| 32 || JR || jmp (%rr) || 10000101 -rrrrrrr || Nhảy vô điều kiện tới thanh ghi (%rr),opcode 2 bytes |
||
|- |
|- |
||
| 33 || JRcc || Jcc %rd,(%rr) || 10000111 cccdddddddrrrrrrr 8 bit offset || Nhảy có điều kiện tới (%rr)+$offset |
| 33 || JRcc || Jcc %rd,(%rr) || 10000111 cccdddddddrrrrrrr 8 bit offset || Nhảy có điều kiện tới (%rr)+$offset |
||
|- |
|- |
||
| 60 || L{B,W,D,Q} || lb 0xoff_t(%rs),%rd || 11000000 tt sssssss ddddddd + 8 bit off_t || tải 1,2,4,8 byte bộ nhớ (%rs)+offset vào thanh ghi %rd |
| 60 || L{B,W,D,Q} || lb 0xoff_t(%rs),%rd || 11000000 tt sssssss ddddddd + 8 bit off_t || tải 1,2,4,8 byte bộ nhớ (%rs)+offset vào thanh ghi %rd |
||
|- |
|- |
||
| 62 || LQD || lqd 0xoffset(%rs),%rd || 11000001 --sssssssddddddd + |
| 62 || LQD || lqd 0xoffset(%rs),%rd || 11000001 ---sssssssddddddd + 7 bit off_t || tải 16 bytes bộ nhớ (%rs)+offset vào thanh ghi %rd |
||
|- |
|- |
||
| 63 || S{B,W,D,Q} || Ls 0xoff_t(%rs),%rd || 11111111 --sssssssddddddd + |
| 63 || S{B,W,D,Q} || Ls 0xoff_t(%rs),%rd || 11111111 ---sssssssddddddd + 7 bit off_t || Lưu 1,2,3,4,8 bytes từ %rd vào (%rs)+offset |
||
|- |
|||
| 64 || SQD || sqd 0xoff_t(%rs),%rd|| 11111111 ---sssssssddddddd + 7 bit off_t || Lưu 16 bytes từ %rd vào (%rs)+offset |
|||
|- |
|||
| 65 || LIR || li $imm16,%rd || 11111111 -ddddddd + imm16 || Lưu imm16 vào %rd |
|||
|} |
|} |
Phiên bản lúc 09:44, ngày 12 tháng 10 năm 2010
Kiến trúc Universal Architecture là kiến trúc 128 bit của bộ vi xử lý UAx. Kiến trúc này là kiến trúc hoàn toàn 128 bit ngay từ đầu khi thiết kế. Mục tiêu của kiến trúc này là nền tảng tính toán cho hầu hết tất cả thiết bị.
UAx cũng có thể dành cho các thiết bị nhúng, hoặc máy tính cầm tay.
Tổng quát
UA có 128 thanh ghi đa dụng 128 bit dành cho tính số nguyên. Số nguyên có thể là số âm hoặc không âm. Vì độ dài 128 bit khá lớn nên nó cũng có tập lệnh cho tính toán vector cho số nguyên. Ví dụ để tính phép tính cộng cho 4 số nguyên, nó cộng và dư carry của mỗi số ra thanh ghi da dụng khác tại vị trí dư bit
Ngoài ra UA cũng có 128 thanh ghi chấm động 128 bit.
127 63 31 0 [-------------------------|------------|-------------]
UA có một thanh ghi cờ có độ dài 128 bit gọi là uflag. Nó dùng kèm với các chỉ lệnh có điều kiện như CMOVcc, Jcc.
Mặc dù kích thước vi lệnh thay đổi từ 1 byte đến 10 bytes nhưng nó được thiết kế rất dễ giải mã. Điều này làm cho nó có sự lai giữa RISC và CISC, nên cực kì linh động trong mã hoá vi lệnh.
Thực hiện
Hiện tại thiết kế này chưa có bản ngôn ngữ mô tả phần cứng và cũng chưa có phiên bản hiện thực.
Vi lệnh UA
Mã vi lệnh của UA không cố định vì thế khá tốt cho nén mã. Điều này có thể làm được thông qua trình biên dịch. Chiều dài tối đa của mã lệnh là 4 bytes , trường hợp đặc biệt là 10 bytes. Các kiểu mã hoá vi lệnh:
kiểu 3 toán hạng
Kiểu này có 3 bit mode và 3 toán hạng, kiểu này phổ dụng nhất trong UA. Tuỳ theo mức độ thi công mà mode có thể.
Tuy nhiên mode 000 là mode của thanh ghi-thanh ghi. Kiểu này không mã hoá được displacement như x86 vì bị đóng trong 4 bytes.
8 bit 3 bit 7 bit 7 bit 7 bit
+--------+------+-------+--------+--------+
+ inst + mode + dst + rop1 + rop2 +
+--------+------+-------+--------+--------+
Kiểu 2 toán hạng
Chiều dài cũng 4 bytes
8 bit 4bit 3 bit 3bit 7 bit r 7bit r
+--------+------+-------+-------+--------+---------+
+ inst + 0000 + mode + size + op1 + op2 +
+--------+------+-------+-------+--------+---------+
Kiểu 1 toán hạng
Chiều dài 2 bytes
8 bit 1bit 7 bit
+--------+----+----------+
+ inst + M + op1 +
+--------+----+----------+
Kiểu này dành cho lệnh jmp hoặc call và các lệnh chỉ có một toán hạng. Bit M dùng để xác dịnh thanh ghi hay địa chỉ. Điều này cũng không cần thiết cho lệnh jmp và call.
Một byte
Kiểu này có thể không có toán hạng hoặc được bao hàm vi lệnh.
+---------------+ + instruction + +---------------+
Kiểu đặc biệt
Kiểu này dành cho giá trị tức thời mã trong vi lệnh. Vì kích thước giá trị tức thời thay đổi từ 2,4,8 bytes nên độ dài của vi lệnh từ 4,6,10 bytes.
8 bit 1 7 bit +---------+---+-------+--------------------+
+ inst + M + op1 + 16 bit immediate +
+---------+---+-------+--------------------+
+---------+---+-------+-------------------------------------------------+
+ inst + M + op1 + 32 bit immediate +
+---------+---+-------+-------------------------------------------------+
Bộ tập lệnh
Lệnh tính toán có thể tương tác trực tiếp với bộ nhớ mà không cần phải tải/lưu. Danh sách bộ tập lệnh :
- Tính toán
- ADD
- ADDC
- SUB
- SUBC
- MUL
- DIV
- NOT
- NEG
- SHL, SHR
- SSL, SSR
- ROL, ROR, RSL, RSR
- AND
- OR
- XOR
- CMP So sánh 2 số nguyên
- TEST
- POPCNT
- Di chuyển dữ liệu
- MOV
- CMOVcc di chuyển có điều kiện
- LDF/STF tải/lưu thanh ghi uflag
- XCHG Hoán chuyển 2 toán hạng
- Nhảy
Được phép nhảy từ giá trị tức thời encode trong vi lệnh lên đến 64 bit địa chỉ, và 128bit nếu thanh ghi.
- CALL gọi hàm, thủ tục
- JMP nhảy vô điều kiện
- Jcc nhảy theo điều kiện
- SYSCALL
- SYSRET
- Đặc biệt
- IDLE Nghỉ,
Bảng mã opcode
Các toán tử của vi lệnh là thanh ghi, tuy nhiên chỉ được một trong 2 hoặc 3. Dấu ghạch ngang '-' là thay đổi tuỳ thuộc vào câu lệnh.
STT | Tên | Hợp ngữ | Mã hoá | Mô tả |
---|---|---|---|---|
1 | ADD | add %rd,%rs,%rt | 00000001 ---ddddddsssssssttttttt | Cộng, %rd=%rs+%rt |
2 | ADC | adc %rd,%rs,%rt | 00000010 ---ddddddsssssssttttttt | Cộng với carry |
2 | ADDU | addu %rd,%rs,%rt | 00000011 ---ddddddsssssssttttttt | Cộng không dấu, %rd=%rs+%rt |
4 | ADDIW | addiw %rd,$0xfff | 00000100 -dddddddiiiiiiiiiiiiiiii | Cộng hằng, %rd=%rd+$imm16 |
5 | SUB | sub %rd,%rs,%rt | 00001000 ---dddddddsssssssttttttt | Trừ |
6 | SUBC | subc %rd,%rs,%rt | 00001001 ---dddddddsssssssttttttt | Trừ mượn carry |
7 | MUL | mul %rn,%rs,%rt | 00010000 ---dddddddsssssssttttttt | Nhân có dấu %rn+%r{n+1}=%rs+%rt, giá trị trả về 256 bits |
8 | UMUL | smul %rn,%rs,%rt | 00010001 ---dddddddsssssssttttttt | Nhân không dấu, trả về 256 bits |
9 | DIV | div %rq,%rs,%rt | 00001111 ---dddddddsssssssttttttt | Chia có dấu, trả về, %rq=%rs/%rt, remainer= %r{q+1) |
10 | UDIV | udiv %rq,%rs,%rt | 00001110 ---dddddddsssssssttttttt | Chia không dấu , như trên |
11 | SHR | shr %rd,%rs,$imm7 | 00001111 tttdddddddsssssssiiiiiii | rd=rs>>imm7, 3 bits t size |
12 | SHL | shl %rd,%rs,$imm7 | 00000000 tttdddddddssssssiiiiiii | rd=rs<<imm7, |
13 | ROTR | rotr $rd,%rs,$imm7 | 00000000 tttdddddddssssssiiiiiii | rotate right |
14 | ROTL | rotl %rd,%rs,$imm7 | 00000000 tttdddddddssssssiiiiiii | rotate left |
15 | BCNT | bcnt %rd,%rs | 00000000 tttdddddddsssssss------- | Điếm số bit có trong %rs -> %rd |
20 | AND | and %rd,%rs,%rt | 00000000 ---dddddddssssssssttttttt | and logic |
21 | OR | or %rd,%rs,%rt | 00000000 ---dddddddssssssssttttttt | or logic |
22 | XOR | xor %rd,%rs,%rt | 00000000 ---dddddddssssssssttttttt | xor logic |
23 | CMP | cmp %rd,%rs,%rt | 00000000 ---dddddddssssssssttttttt | rd = rs cmp rt |
30 | JI | jmpri $imm24 bit | 10000000 imm24 | Nhảy vô điều kiện tới 20 bits liên quan |
31 | JIcc | jmpiCC $imm21 bit | 10000001 ccc imm21 | Nhảy điều kiện tới 20 bit liên quan, 3 bít điều kiện là c |
32 | JR | jmp (%rr) | 10000101 -rrrrrrr | Nhảy vô điều kiện tới thanh ghi (%rr),opcode 2 bytes |
33 | JRcc | Jcc %rd,(%rr) | 10000111 cccdddddddrrrrrrr 8 bit offset | Nhảy có điều kiện tới (%rr)+$offset |
60 | L{B,W,D,Q} | lb 0xoff_t(%rs),%rd | 11000000 tt sssssss ddddddd + 8 bit off_t | tải 1,2,4,8 byte bộ nhớ (%rs)+offset vào thanh ghi %rd |
62 | LQD | lqd 0xoffset(%rs),%rd | 11000001 ---sssssssddddddd + 7 bit off_t | tải 16 bytes bộ nhớ (%rs)+offset vào thanh ghi %rd |
63 | S{B,W,D,Q} | Ls 0xoff_t(%rs),%rd | 11111111 ---sssssssddddddd + 7 bit off_t | Lưu 1,2,3,4,8 bytes từ %rd vào (%rs)+offset |
64 | SQD | sqd 0xoff_t(%rs),%rd | 11111111 ---sssssssddddddd + 7 bit off_t | Lưu 16 bytes từ %rd vào (%rs)+offset |
65 | LIR | li $imm16,%rd | 11111111 -ddddddd + imm16 | Lưu imm16 vào %rd |