From a01ddfa22d2cbfcdfee43d2a8f7327e91ee4ccc7 Mon Sep 17 00:00:00 2001 From: Kartik Agaram Date: Mon, 25 May 2020 00:49:21 -0700 Subject: 6404 --- html/mu_instructions.html | 49 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 39 insertions(+), 10 deletions(-) (limited to 'html/mu_instructions.html') diff --git a/html/mu_instructions.html b/html/mu_instructions.html index cc6b0095..55443132 100644 --- a/html/mu_instructions.html +++ b/html/mu_instructions.html @@ -15,7 +15,7 @@ body { font-family: monospace; color: #000000; background-color: #c6c6c6; } * { font-size: 1em; } .Comment { color: #005faf; } .Constant { color: #008787; } -.Special { color: #ff6060; } +.Special { color: #d70000; } .PreProc { color: #c000c0; } .SalientComment { color: #0000af; } --> @@ -191,24 +191,53 @@ var/reg: (addr T) <- address var2: T Array operations (TODO: bounds-checking) -var/reg <- length arr/reg2: (addr array T) - => "8b/-> *" reg2 " " reg "/r32" -var/reg <- index arr/rega: (addr array T), idx/regi: int # if size(T) is 4 or 8 - => "8d/copy-address *(" rega "+" regi "<<" log2(size(T)) "+4) " reg "/r32" +var/reg <- index arr/rega: (addr array T), idx/regi: int + | if size-of(T) is 4 or 8 + => "8d/copy-address *(" rega "+" regi "<<" log2(size-of(T)) "+4) " reg "/r32" var/reg <- index arr: (array T sz), idx/regi: int - => "8d/copy-address *(ebp+" regi "<<" log2(size(T)) "+" (arr.stack-offset + 4) ") " reg "/r32" + => "8d/copy-address *(ebp+" regi "<<" log2(size-of(T)) "+" (arr.stack-offset + 4) ") " reg "/r32" var/reg <- index arr/rega: (addr array T), n - => "8d/copy-address *(" rega "+" (n*size(T)+4) ") " reg "/r32" + => "8d/copy-address *(" rega "+" (n*size-of(T)+4) ") " reg "/r32" var/reg <- index arr: (array T sz), n - => "8d/copy-address *(ebp+" (arr.stack-offset+4+n*size(T)) ") " reg "/r32" + => "8d/copy-address *(ebp+" (arr.stack-offset+4+n*size-of(T)) ") " reg "/r32" var/reg: (offset T) <- compute-offset arr: (addr array T), idx/regi: int # arr can be in reg or mem - => "69/multiply %" regi " " size(T) "/imm32 " reg "/r32" + => "69/multiply %" regi " " size-of(T) "/imm32 " reg "/r32" var/reg: (offset T) <- compute-offset arr: (addr array T), idx: int # arr can be in reg or mem - => "69/multiply *(ebp+" idx.stack-offset ") " size(T) "/imm32 " reg "/r32" + => "69/multiply *(ebp+" idx.stack-offset ") " size-of(T) "/imm32 " reg "/r32" var/reg <- index arr/rega: (addr array T), o/rego: offset => "8d/copy-address *(" rega "+" rego "+4) " reg "/r32" +Computing the length of an array is complex. + +var/reg <- length arr/reg2: (addr array T) + | if T is byte (TODO) + => "8b/-> *" reg2 " " reg "/r32" + | if size-of(T) is 4 or 8 or 16 or 32 or 64 or 128 + => "8b/-> *" reg2 " " reg "/r32" + "c1/shift 5/subop/logic-right %" reg " " log2(size-of(T)) "/imm8" + | otherwise + x86 has no instruction to divide by a literal, so + we need up to 3 extra registers! eax/edx for division and say ecx + => if reg is not eax + "50/push-eax" + if reg is not ecx + "51/push-ecx" + if reg is not edx + "52/push-edx" + "8b/-> *" reg2 " eax/r32" + "31/xor %edx 2/r32/edx" # sign-extend, but array size can't be negative + "b9/copy-to-ecx " size-of(T) "/imm32" + "f7 7/subop/idiv-eax-edx-by %ecx" + if reg is not eax + "89/<- %" reg " 0/r32/eax" + if reg is not edx + "5a/pop-to-edx" + if reg is not ecx + "59/pop-to-ecx" + if reg is not eax + "58/pop-to-eax" + # User-defined types If a record (product) type T was defined to have elements a, b, c, ... of -- cgit 1.4.1-2-gfad0