forked from TCShenanigans/symphony_stdlib
Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
160a66c1bf |
+1
-1
@@ -16,7 +16,7 @@ Performs a jump-and-link function call, with label size up to 32 bits.
|
||||
|
||||
_HARDWARE:_ Store PC+4 in the result register when in jump mode.
|
||||
|
||||
## `li %a(register) %b:U32(immediate | label)`
|
||||
## `li %a(register) %b:U32(immediate | label)
|
||||
Loads an immediate up to 32 bits long
|
||||
|
||||
_HARDWARE:_ No requirements
|
||||
|
||||
+12
-15
@@ -332,13 +332,12 @@ ret
|
||||
li %r(register), %a:S33(immediate | label)
|
||||
; assert(0 - 0x80000000 <= %a, "%a is too low")
|
||||
; assert(%a <= 0xffffffff, "%a is too high")
|
||||
%s = trailing_zeros(%a)
|
||||
%sa = %a >> %s
|
||||
%nota = %a ^ 0xffffffff
|
||||
when %a <=u 0xffff : 00110001 %r[3:0]0000 %a[15:0] ; First 64k
|
||||
when %nota <=u 0xffff: 00110001 %r[3:0]0000 %nota[15:0] 00100011 %r[3:0]0000 0000%r[3:0] 00000000 ; Last 64k
|
||||
when %sa <=u 0xffff : 00110001 %r[3:0]0000 %sa[15:0] 00110111 %r[3:0]%r[3:0] 00000000 %s[7:0] ; Aligned
|
||||
00110001 %r[3:0]0000 %a[31:16] 00110111 %r[3:0]%r[3:0] 00000000 00010000 00110001 %r[3:0]%r[3:0] %a[15:0] ; Any 32-bit
|
||||
%nota = ~%a
|
||||
when 0x0000 <= %a && %a <= 0xffff: 00110001 rrrr0000 %a[15:0] ; First 64k
|
||||
when %nota <= 0xffff : 00110001 rrrr0000 %nota[15:0] 00100011 rrrr0000 0000rrrr 00000000 ; Last 64k
|
||||
when !(%a & 0x0f) && %a < 0xffff0: 00110001 rrrr0000 %a[19:4] 00100111 rrrrrrrr 00000000 00000100 ; 16-byte aligned
|
||||
when !(%a & 0x03) && %a < 0x3fffc: 00110001 rrrr0000 %a[17:2] 00100111 rrrrrrrr 00000000 00000010 ; 4-byte aligned
|
||||
00110001 rrrr0000 %a[31:16] 00100111 rrrrrrrr 00000000 00010000 00110001 rrrrrrrr %a[15:0] ; Any 32-bit
|
||||
# Load 32-bit immediate %a into %r
|
||||
|
||||
qcall %a:U32(label)
|
||||
@@ -346,16 +345,14 @@ qcall %a:U32(label)
|
||||
; assert(%a <= 0xffffffff, "%a is too high")
|
||||
%r = 13
|
||||
%f = 15
|
||||
%s = trailing_zeros(%a)
|
||||
%sa = %a >> %s
|
||||
%nota = %a ^ 0xffffffff
|
||||
when %a <=u 0xffff : 01011000 %r[3:0]ffff %a[15:0] ; First 64k
|
||||
when %nota <=u 0xffff: 00110001 %r[3:0]0000 %nota[15:0] 00100011 %r[3:0]0000 0000%r[3:0] 00000000 01001000 %r[3:0]ffff 0000%r[3:0] 00000000 ; Last 64k
|
||||
when %sa <=u 0xffff : 00110001 %r[3:0]0000 %sa[15:0] 00110111 %r[3:0]%r[3:0] 00000000 %s[7:0] 01001000 %r[3:0]ffff 0000%r[3:0] 00000000 ; Aligned
|
||||
00110001 %r[3:0]0000 %a[31:16] 00110111 %r[3:0]%r[3:0] 00000000 00010000 00110001 %r[3:0]%r[3:0] %a[15:0] 01001000 %r[3:0]ffff 0000%r[3:0] 00000000 ; Any 32-bit
|
||||
%nota = ~%a
|
||||
when 0x0000 <= %a && %a <= 0xffff: 01011000 rrrrffff %a[15:0] ; First 64k
|
||||
when %nota <= 0xffff : 00110001 rrrr0000 %nota[15:0] 00100011 rrrr0000 0000rrrr 00000000 01001000 rrrrffff 0000rrrr 00000000 ; Last 64k
|
||||
when !(%a & 0x0f) && %a < 0xffff0: 00110001 rrrr0000 %a[19:4] 00100111 rrrrrrrr 00000000 00000100 01001000 rrrrffff 0000rrrr 00000000 ; 16-byte aligned
|
||||
when !(%a & 0x03) && %a < 0x3fffc: 00110001 rrrr0000 %a[17:2] 00100111 rrrrrrrr 00000000 00000010 01001000 rrrrffff 0000rrrr 00000000 ; 4-byte aligned
|
||||
00110001 rrrr0000 %a[31:16] 00100111 rrrrrrrr 00000000 00010000 00110001 rrrrrrrr %a[15:0] 01001000 rrrrffff 0000rrrr 00000000 ; Any 32-bit
|
||||
# Jump and link to 32-bit label
|
||||
|
||||
halt%c(condition)
|
||||
1000cccc 00001111 00000000 00000000
|
||||
# Halt on condition %c
|
||||
|
||||
|
||||
Reference in New Issue
Block a user