diff options
Diffstat (limited to 'src/cmd/5c/swt.c')
-rw-r--r-- | src/cmd/5c/swt.c | 37 |
1 files changed, 26 insertions, 11 deletions
diff --git a/src/cmd/5c/swt.c b/src/cmd/5c/swt.c index 7cbaadba9..7268f9af2 100644 --- a/src/cmd/5c/swt.c +++ b/src/cmd/5c/swt.c @@ -28,12 +28,31 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. - #include "gc.h" void swit1(C1 *q, int nc, int32 def, Node *n) { + Node nreg; + + if(typev[n->type->etype]) { + regsalloc(&nreg, n); + nreg.type = types[TVLONG]; + cgen(n, &nreg); + swit2(q, nc, def, &nreg); + return; + } + + regalloc(&nreg, n, Z); + nreg.type = types[TLONG]; + cgen(n, &nreg); + swit2(q, nc, def, &nreg); + regfree(&nreg); +} + +void +swit2(C1 *q, int nc, int32 def, Node *n) +{ C1 *r; int i; int32 v; @@ -65,12 +84,12 @@ swit1(C1 *q, int nc, int32 def, Node *n) sp = p; gopcode(OEQ, nodconst(r->val), n, Z); /* just gen the B.EQ */ patch(p, r->label); - swit1(q, i, def, n); + swit2(q, i, def, n); if(debug['W']) print("case < %.8ux\n", r->val); patch(sp, pc); - swit1(r+1, nc-i-1, def, n); + swit2(r+1, nc-i-1, def, n); return; direct: @@ -460,17 +479,13 @@ outhist(Biobuf *b) for(h = hist; h != H; h = h->link) { p = h->name; op = 0; - /* on windows skip drive specifier in pathname */ if(systemtype(Windows) && p && p[1] == ':'){ - p += 2; - c = *p; - } - if(p && p[0] != c && h->offset == 0 && pathname){ - /* on windows skip drive specifier in pathname */ + c = p[2]; + } else if(p && p[0] != c && h->offset == 0 && pathname){ if(systemtype(Windows) && pathname[1] == ':') { op = p; - p = pathname+2; - c = *p; + p = pathname; + c = p[2]; } else if(pathname[0] == c){ op = p; p = pathname; |