From 3cf03158599472b1f6713192d9fa2b120f9f209b Mon Sep 17 00:00:00 2001 From: Kartik Agaram Date: Sat, 7 Mar 2020 17:32:39 -0800 Subject: [PATCH] 6094 - new 'compute-offset' instruction If indexing into a type with power-of-2-sized elements we can access them in one instruction: x/reg1: (addr int) <- index A/reg2: (addr array int), idx/reg3: int This translates to a single instruction because x86 instructions support an addressing mode with left-shifts. For non-powers-of-2, however, we need a multiply. To keep things type-safe, it is performed like this: x/reg1: (offset T) <- compute-offset A: (addr array T), idx: int y/reg2: (addr T) <- index A, x An offset is just an int that is guaranteed to be a multiple of size-of(T). Offsets can only be used in index instructions, and the types will eventually be required to line up. In the process, I have to expand Input-size because mu.subx is growing big. --- apps/assort | Bin 40852 -> 40852 bytes apps/braces | Bin 42546 -> 42546 bytes apps/calls | Bin 47207 -> 47207 bytes apps/dquotes | Bin 44502 -> 44502 bytes apps/hex | Bin 43099 -> 43099 bytes apps/mu | Bin 177346 -> 180570 bytes apps/mu.subx | 186 +++++++++++++++++++++++++++++++++++++----- apps/pack | Bin 53244 -> 53244 bytes apps/sigils | Bin 54931 -> 54931 bytes apps/subx-params.subx | 2 +- apps/survey | Bin 50093 -> 50093 bytes apps/survey.subx | 2 +- apps/tests | Bin 39650 -> 39650 bytes mu_instructions | 14 +++- mu_summary | 11 ++- 15 files changed, 186 insertions(+), 29 deletions(-) diff --git a/apps/assort b/apps/assort index 92ac1ca1429285ac83d5896c3a2c899a0eff35d0..980e294d83d1f8325e144b2f7de407dae5843af0 100755 GIT binary patch delta 16 XcmbQTpJ~c|rVT>5j0&5Da~q8SHzEb$ delta 16 XcmbQTpJ~c|rVT>5j1rrLa~q8SHu448 diff --git a/apps/braces b/apps/braces index fcda2022285408254eaff8257a8d54f011c27061..1c4f85963e2df4b4677368587ac11e6a90b57100 100755 GIT binary patch delta 16 YcmdmVhH29orVYyr85K6KDC{x;07JM3bN~PV delta 16 YcmdmVhH29orVYyr86`HaDC{x;07HleYybcN diff --git a/apps/calls b/apps/calls index c7e2b7586e3a73fe1221f52d465b1d8cff4a4e75..f22a1b2cf4180852b4d9800e46725263346928b2 100755 GIT binary patch delta 16 YcmaFR delta 16 Ycmcb1o9WtZrVUR@7$r78E%|5x08Kpzy#N3J diff --git a/apps/hex b/apps/hex index 92241075d82f31afe9813e87b89775a62cea91e0..d91286e0b58f9f6e1c7a61063acdad1cb9edf71d 100755 GIT binary patch delta 16 Xcmcb8f$8=IrVW0@j0&6mi+M}|Lth4? delta 16 Xcmcb8f$8=IrVW0@j1rsui+M}|LoWuK diff --git a/apps/mu b/apps/mu index aca1649468bd929034a5c519f2a244acf47c93c4..6820aa8d5af528c39c0ab2a5efa5191a401ceeef 100755 GIT binary patch literal 180570 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Ν(>MK}@%k#KKi*0YmU>5zs{F&{Y}eP{ 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 diff --git a/apps/mu.subx b/apps/mu.subx index bf777231..89ee6af5 100644 --- a/apps/mu.subx +++ b/apps/mu.subx @@ -389,6 +389,7 @@ Type-id: # (stream (address array byte)) "handle"/imm32 # 4 "boolean"/imm32 # 5 "constant"/imm32 # 6: like a literal, but replaced with its value in Var-offset + "offset"/imm32 # 7: (offset T) is guaranteed to be a 32-bit multiple of size-of(T) 0/imm32 # 0x20 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 0/imm32 @@ -2311,6 +2312,58 @@ test-convert-index-into-array-with-literal: 5d/pop-to-ebp c3/return +test-convert-index-into-array-using-offset: + # . prologue + 55/push-ebp + 89/<- %ebp 4/r32/esp + # setup + (clear-stream _test-input-stream) + (clear-stream $_test-input-buffered-file->buffer) + (clear-stream _test-output-stream) + (clear-stream $_test-output-buffered-file->buffer) + c7 0/subop/copy *Next-block-index 1/imm32 + # + (write _test-input-stream "fn foo {\n") + (write _test-input-stream " var arr/eax: (addr array int) <- copy 0\n") + (write _test-input-stream " var idx/ecx: int <- copy 3\n") + (write _test-input-stream " var off/ecx: (offset int) <- compute-offset arr, idx\n") + (write _test-input-stream " var x/eax: (addr int) <- index arr, off\n") + (write _test-input-stream "}\n") + # convert + (convert-mu _test-input-buffered-file _test-output-buffered-file) + (flush _test-output-buffered-file) +#? # dump _test-output-stream {{{ +#? (write 2 "^") +#? (write-stream 2 _test-output-stream) +#? (write 2 "$\n") +#? (rewind-stream _test-output-stream) +#? # }}} + # check output + (check-next-stream-line-equal _test-output-stream "foo:" "F - test-convert-index-into-array-using-offset/0") + (check-next-stream-line-equal _test-output-stream " # . prologue" "F - test-convert-index-into-array-using-offset/1") + (check-next-stream-line-equal _test-output-stream " 55/push-ebp" "F - test-convert-index-into-array-using-offset/2") + (check-next-stream-line-equal _test-output-stream " 89/<- %ebp 4/r32/esp" "F - test-convert-index-into-array-using-offset/3") + (check-next-stream-line-equal _test-output-stream " {" "F - test-convert-index-into-array-using-offset/4") + (check-next-stream-line-equal _test-output-stream "$foo:0x00000001:loop:" "F - test-convert-index-into-array-using-offset/5") + (check-next-stream-line-equal _test-output-stream " ff 6/subop/push %eax" "F - test-convert-index-into-array-using-offset/6") + (check-next-stream-line-equal _test-output-stream " b8/copy-to-eax 0/imm32" "F - test-convert-index-into-array-using-offset/7") + (check-next-stream-line-equal _test-output-stream " ff 6/subop/push %ecx" "F - test-convert-index-into-array-using-offset/8") + (check-next-stream-line-equal _test-output-stream " b9/copy-to-ecx 3/imm32" "F - test-convert-index-into-array-using-offset/9") + (check-next-stream-line-equal _test-output-stream " 69/multiply 0x00000004/imm32 %ecx 0x00000001/r32" "F - test-convert-index-into-array-using-offset/10") + (check-next-stream-line-equal _test-output-stream " 8d/copy-address *(eax + ecx + 4) 0x00000000/r32" "F - test-convert-index-into-array-using-offset/11") + (check-next-stream-line-equal _test-output-stream " 8f 0/subop/pop %ecx" "F - test-convert-index-into-array-using-offset/12") + (check-next-stream-line-equal _test-output-stream " 8f 0/subop/pop %eax" "F - test-convert-index-into-array-using-offset/13") + (check-next-stream-line-equal _test-output-stream " }" "F - test-convert-index-into-array-using-offset/14") + (check-next-stream-line-equal _test-output-stream "$foo:0x00000001:break:" "F - test-convert-index-into-array-using-offset/15") + (check-next-stream-line-equal _test-output-stream " # . epilogue" "F - test-convert-index-into-array-using-offset/16") + (check-next-stream-line-equal _test-output-stream " 89/<- %esp 5/r32/ebp" "F - test-convert-index-into-array-using-offset/17") + (check-next-stream-line-equal _test-output-stream " 5d/pop-to-ebp" "F - test-convert-index-into-array-using-offset/18") + (check-next-stream-line-equal _test-output-stream " c3/return" "F - test-convert-index-into-array-using-offset/19") + # . epilogue + 89/<- %esp 5/r32/ebp + 5d/pop-to-ebp + c3/return + test-convert-function-and-type-definition: # . prologue 55/push-ebp @@ -6684,6 +6737,15 @@ emit-subx-stmt: # out: (addr buffered-file), stmt: (handle stmt), primitives: ( (translate-mu-index-stmt *(ebp+8) *(ebp+0xc)) e9/jump $emit-subx-stmt:end/disp32 } + # compute-offset for index into array + { + # if (!string-equal?(var->operation, "compute-offset")) break + (string-equal? *(ecx+4) "compute-offset") # Stmt1-operation => eax + 3d/compare-eax-and 0/imm32 + 0f 84/jump-if-= break/disp32 + (translate-mu-compute-index-stmt *(ebp+8) *(ebp+0xc)) + e9/jump $emit-subx-stmt:end/disp32 + } # get field from record { # if (!string-equal?(var->operation, "get")) break @@ -6788,23 +6850,46 @@ $translate-mu-index-stmt:emit-base: 81 7/subop/compare *(edx+0x10) 0/imm32 # Var-register { 0f 84/jump-if-= break/disp32 - # print inouts[1]->register "<<" log2(sizeof(element(inouts[0]->type))) " + 4) " $translate-mu-index-stmt:emit-register-index: - # . inouts[1]->register "<<" - (write-buffered *(ebp+8) *(edx+0x10)) # Var-register - (write-buffered *(ebp+8) "<<") - # . log2(sizeof(element(inouts[0]->type))) - # TODO: ensure size is a power of 2 - (array-element-type-id %ebx) # => eax - (size-of-type-id %eax) # => eax - (num-shift-rights %eax) # => eax - (print-int32-buffered *(ebp+8) %eax) - # . + # if inouts[1] is an int + (is-simple-mu-type? *(edx+4) 1) # Var-type, int => eax + 3d/compare-eax-and 0/imm32/false + { + 0f 84/jump-if-= break/disp32 +$translate-mu-index-stmt:emit-int-register-index: + # print inouts[1]->register "<<" log2(sizeof(element(inouts[0]->type))) " + 4) " + # . inouts[1]->register "<<" + (write-buffered *(ebp+8) *(edx+0x10)) # Var-register + (write-buffered *(ebp+8) "<<") + # . log2(sizeof(element(inouts[0]->type))) + # TODO: ensure size is a power of 2 + (array-element-type-id %ebx) # => eax + (size-of-type-id %eax) # => eax + (num-shift-rights %eax) # => eax + (print-int32-buffered *(ebp+8) %eax) + e9/jump $translate-mu-index-stmt:emit-register-index-done/disp32 + } + # if inouts[1]->type is any other atom, abort + 8b/-> *(edx+4) 0/r32/eax # Var-type + 8b/-> *eax 0/r32/eax # Tree-left or Atom-value + 3b/compare 0/r32/eax *Max-type-id + 0f 82/jump-if-addr< $translate-mu-index-stmt:error2/disp32 + # if inouts[1] is (offset ...) + (is-simple-mu-type? %eax 7) # offset => eax + 3d/compare-eax-and 0/imm32/false + { + 0f 84/jump-if-= break/disp32 + # print inouts[1]->register "<<" log2(sizeof(element(inouts[0]->type))) " + 4) " +$translate-mu-index-stmt:emit-offset-register-index: + # . inouts[1]->register + (write-buffered *(ebp+8) *(edx+0x10)) # Var-register + } +$translate-mu-index-stmt:emit-register-index-done: (write-buffered *(ebp+8) " + 4) ") e9/jump $translate-mu-index-stmt:emit-output/disp32 } # otherwise if inouts[1] is a literal - (is-literal-type? *(edx+4)) # Var-type => eax + (is-simple-mu-type? *(edx+4) 0) # Var-type => eax 3d/compare-eax-and 0/imm32/false { 0f 84/jump-if-= break/disp32 @@ -6825,7 +6910,7 @@ $translate-mu-index-stmt:emit-literal-index: e9/jump $translate-mu-index-stmt:emit-output/disp32 } # otherwise abort - e9/jump $translate-mu-index-stmt:abort/disp32 + e9/jump $translate-mu-index-stmt:error1/disp32 $translate-mu-index-stmt:emit-output: # outputs[0] "/r32" 8b/-> *(ecx+0xc) 0/r32/eax # Stmt1-outputs @@ -6844,7 +6929,7 @@ $translate-mu-index-stmt:end: 5d/pop-to-ebp c3/return -$translate-mu-index-stmt:abort: +$translate-mu-index-stmt:error1: (write-buffered Stderr "couldn't translate an index instruction. second (index) input must either lie in a register or be a literal\n") (flush Stderr) # . syscall(exit, 1) @@ -6853,6 +6938,60 @@ $translate-mu-index-stmt:abort: cd/syscall 0x80/imm8 # never gets here +$translate-mu-index-stmt:error2: + (write-buffered Stderr "couldn't translate an index instruction. second (index) input when in a register must be an int or offset\n") + (flush Stderr) + # . syscall(exit, 1) + bb/copy-to-ebx 1/imm32 + b8/copy-to-eax 1/imm32/exit + cd/syscall 0x80/imm8 + # never gets here + +translate-mu-compute-index-stmt: # out: (address buffered-file), stmt: (handle stmt) + # . prologue + 55/push-ebp + 89/<- %ebp 4/r32/esp + # . save registers + 50/push-eax + 51/push-ecx + 52/push-edx + 53/push-ebx + # + (emit-indent *(ebp+8) *Curr-block-depth) + (write-buffered *(ebp+8) "69/multiply ") +$translate-mu-compute-index-stmt:emit-elem-size: + # ecx = stmt + 8b/-> *(ebp+0xc) 1/r32/ecx + # var first-inout/edx: (handle stmt-var) = stmt->inouts[0] + 8b/-> *(ecx+8) 2/r32/edx # Stmt1-inouts + # var base/ebx: (handle var) + 8b/-> *edx 3/r32/ebx # Stmt-var-value + # print sizeof(element(base->type)) + (array-element-type-id %ebx) # => eax + (size-of-type-id %eax) # => eax + (print-int32-buffered *(ebp+8) %eax) + (write-buffered *(ebp+8) "/imm32") +$translate-mu-compute-index-stmt:emit-index: + (emit-subx-var-as-rm32 *(ebp+8) *(edx+4)) # Stmt-var-next + (write-buffered *(ebp+8) Space) +$translate-mu-compute-index-stmt:emit-output: + # outputs[0] "/r32" + 8b/-> *(ecx+0xc) 0/r32/eax # Stmt1-outputs + 8b/-> *eax 0/r32/eax # Stmt-var-value + (get Registers *(eax+0x10) 8 "Registers") # Var-register => eax + (print-int32-buffered *(ebp+8) *eax) + (write-buffered *(ebp+8) "/r32\n") +$translate-mu-compute-index-stmt:end: + # . restore registers + 5b/pop-to-ebx + 5a/pop-to-edx + 59/pop-to-ecx + 58/pop-to-eax + # . epilogue + 89/<- %esp 5/r32/ebp + 5d/pop-to-ebp + c3/return + translate-mu-get-stmt: # out: (address buffered-file), stmt: (handle stmt) # . prologue 55/push-ebp @@ -9114,10 +9253,10 @@ subx-type-equal?: # a: (handle tree type-id), b: (handle tree type-id) -> resul # . save registers 51/push-ecx # var alit/ecx: boolean = is-literal-type?(a) - (is-literal-type? *(ebp+8)) # => eax + (is-simple-mu-type? *(ebp+8) 0) # => eax 89/<- %ecx 0/r32/eax # var blit/eax: boolean = is-literal-type?(b) - (is-literal-type? *(ebp+0xc)) # => eax + (is-simple-mu-type? *(ebp+0xc) 0) # => eax # return alit == blit 39/compare %eax 1/r32/ecx 0f 94/set-if-= %eax @@ -9130,17 +9269,22 @@ $subx-type-equal?:end: 5d/pop-to-ebp c3/return -is-literal-type?: # a: (handle tree type-id) -> result/eax: boolean +is-simple-mu-type?: # a: (handle tree type-id), n: type-id -> result/eax: boolean # . prologue 55/push-ebp 89/<- %ebp 4/r32/esp - # + # . save registers + 51/push-ecx + # ecx = n + 8b/-> *(ebp+0xc) 1/r32/ecx + # return (a->value == n) 8b/-> *(ebp+8) 0/r32/eax - # return (*eax == 0) - 81 7/subop/compare *eax 0/imm32/literal-type-id # Atom-type + 39/compare *eax 1/r32/ecx # Atom-type 0f 94/set-if-= %eax 81 4/subop/and %eax 0xff/imm32 -$is-literal-type?:end: +$is-simple-mu-type?:end: + # . restore registers + 59/pop-to-ecx # . epilogue 89/<- %esp 5/r32/ebp 5d/pop-to-ebp diff --git a/apps/pack b/apps/pack index 8e60d188f494b37ad46c8feae1289f0f9561f9f4..ceeeb15387cd9be1aafb0d3c88ec43f825b7e62f 100755 GIT binary patch delta 16 Ycmew}pZU*x<_&kd85K6)>y~o?07{4l^Z)<= delta 16 Ycmew}pZU*x<_&kd86`H~>y~o?07_T~>;M1& diff --git a/apps/sigils b/apps/sigils index 9dffa2a854f5a2f0fadc59dbed759679ff2813e4..10877010c7a63474bbb938628f46546075b74149 100755 GIT binary patch delta 16 YcmbQdmU;48<_-Nlj0&44^e}q?06YQ)j{pDw delta 16 YcmbQdmU;48<_-Nlj1rqC^e}q?06WqKhX4Qo diff --git a/apps/subx-params.subx b/apps/subx-params.subx index 3bc02894..c3827ad7 100644 --- a/apps/subx-params.subx +++ b/apps/subx-params.subx @@ -8,7 +8,7 @@ Segment-size: # maximum size of input textual stream (spanning all segments) Input-size: - 0x180000/imm32/1.5MB + 0x200000/imm32/2MB # number of labels we can translate to addresses Max-labels: diff --git a/apps/survey b/apps/survey index 516ee21b761c929d2999ed936530473a6281b239..49905f1aa9c8e55f99b8e7129471d23f1ae5439d 100755 GIT binary patch delta 16 XcmZ46&b+prc|$@oqr&FIW*-LtIJ5>v delta 16 XcmZ46&b+prc|$@oqr~RKW*-LtID`g1 diff --git a/apps/survey.subx b/apps/survey.subx index fd7b212f..db8fb08c 100644 --- a/apps/survey.subx +++ b/apps/survey.subx @@ -115,7 +115,7 @@ $subx-survey-main:end: subx-survey: # infile: (addr buffered-file), out: (addr buffered-file) # pseudocode - # var in: (stream byte 4096) + # var in: (stream byte Input-size) # slurp(infile, in) # var segments: (stream segment-info) # var labels: (stream label-info Max-labels) diff --git a/apps/tests b/apps/tests index 9f0ea0343e836401f7771f3bdd4fe842d1c525c6..39c29b36b60cfd859bfd3cc893ebc113197aaea3 100755 GIT binary patch delta 16 XcmaE~mFdw|rVSBUj0&40vpNj`LS+W^ delta 16 XcmaE~mFdw|rVSBUj1rq8vpNj`LNx~M diff --git a/mu_instructions b/mu_instructions index 0b6da8b0..c8be987b 100644 --- a/mu_instructions +++ b/mu_instructions @@ -207,13 +207,21 @@ loop-if-addr>= label {.name="loop-if-addr>=", .inouts=[label], Array operations -var/reg <- length var2/reg2: (addr array T) +var/reg <- length arr/reg2: (addr array T) {.name="length", .inouts=[reg2], .outputs=[reg1], .subx-name="8b/copy-from", .rm32="*" inouts[0], .r32=outputs[0]} var/reg <- index arr/rega: (addr array T), idx/regi: int {.name="index", .inouts=[rega, regi], .outputs=[reg], .subx-name="8d/copy-address", .rm32="*(" inouts[0] "+" inouts[1] "<<2)", .r32=outputs[0]} var/reg <- index arr/rega: (addr array T), n -compare var, n {.name="compare", .inouts=[var, n], .subx-name="81 7/subop/compare", .rm32="*(ebp+" inouts[0].stack-offset ")", .imm32=inouts[1]} - {.name="index", .inouts=[rega, n], .outputs=[reg], .subx-name="8d/copy-address", .rm32="*(" inouts[0] "+" inouts[1] "<<2)", .r32=outputs[0]} + {.name="index", .inouts=[rega, n], .outputs=[reg], .subx-name="8d/copy-address", .rm32="*(" inouts[0] "+" inouts[1]*size(T) ")", .r32=outputs[0]} + +var/reg: (offset T) <- compute-offset arr: (addr array T), idx/regi: int # arr can be in reg or mem + {.name="compute-offset", .inouts=[arr, regi], .outputs=[reg], .subx-name="69/multiply", .rm32=inouts[1], .r32=outputs[0], .imm32=sizeof(T)} +var/reg: (offset T) <- compute-offset arr: (addr array T), idx: int # arr can be in reg or mem + {.name="compute-offset", .inouts=[arr, regi], .outputs=[reg], .subx-name="69/multiply", .rm32="*(ebp+" inouts[1].stack-offset ")", .r32=outputs[0], .imm32=sizeof(T)} +var: (offset T) <- compute-offset arr: (addr array T), n # arr can be in reg or mem + {.name="compute-offset", .inouts=[var, n], .outputs=[reg], .subx-name="c7 0/subop/copy", .rm32=outputs[0], .imm32=sizeof(T)*n} +var/reg <- index arr/rega: (addr array T), o/rego: offset + {.name="index", .inouts=[rega, rego], .outputs=[reg], .subx-name="8d/copy-address", .rm32="*(" inouts[0] "+" inouts[1] "+" "4)", .r32=outputs[0]} User-defined types diff --git a/mu_summary b/mu_summary index 179aa11f..e4e82905 100644 --- a/mu_summary +++ b/mu_summary @@ -197,9 +197,14 @@ Similarly, conditional loops: ## Array operations - var/reg: int <- length var: (addr array T) - var/reg: (addr T) <- index var: (addr array T), idx: int - var/reg: (addr T) <- index var: (addr array T), n + var/reg: int <- length arr/reg: (addr array T) + var/reg: (addr T) <- index arr/reg: (addr array T), idx/reg: int + var/reg: (addr T) <- index arr/reg: (addr array T), n + + var/reg: (offset T) <- compute-offset arr: (addr array T), idx/reg: int # arr can be in reg or mem + var/reg: (offset T) <- compute-offset arr: (addr array T), n # arr can be in reg or mem + var: (offset T) <- compute-offset arr: (addr array T), n # arr can be in reg or mem + var/reg: (addr T) <- index arr/reg: (addr array T), idx/reg: (offset T) ## User-defined types