Re: new kernel patch

David Mosberger-Tang (davidm@AZStarNet.com)
Wed, 20 Dec 1995 09:28:02 -0700


>>>>> On Wed, 20 Dec 95 15:06:46 MET, "Ka'plaagh 20-Dec-1995 1406 +0000" <rusling@rdgeng.enet.dec.com> said:

Dave.R> David (et al), I tried to apply this patch and maybe I'm
Dave.R> being slow but I failed. Basically patch didn't create the
Dave.R> math-emu subdirectory of arch/alpha - don't know why. I did
Dave.R> create this by hand and proceed to build a kernel. However
Dave.R> it fell apart with asm problems trying to build the math-emu
Dave.R> stuff. I'm running Red Hat 2.1 on this development system,
Dave.R> do I need a later assembler/compiler?

Looks like this is due to a gcc 2.7.0 bug. Here is a patch that
should fix it (untried).

--david

--- arch/alpha/math-emu/fp-emul.c~ Tue Dec 19 04:01:09 1995
+++ arch/alpha/math-emu/fp-emul.c Wed Dec 20 16:17:04 1995
@@ -102,42 +102,56 @@
}


+#if 0
+/*
+ * This is IMHO the better way of implementing LDT(). But it
+ * has the disadvantage that gcc 2.7.0 refuses to compile it
+ * (invalid operand constraints), so instead, we use the uglier
+ * macro below.
+ */
+# define LDT(reg,val) \
+ asm volatile ("ldt $f"#reg",%0" :: "m"(val));
+#else
+# define LDT(reg,val) \
+ asm volatile ("ldt $f"#reg",0(%0)" :: "r"(&val));
+#endif
+
void
alpha_write_fp_reg (unsigned long reg, unsigned long val)
{
switch (reg) {
- case 0: asm volatile ("ldt $f0,%0" :: "m"(val)); break;
- case 1: asm volatile ("ldt $f1,%0" :: "m"(val)); break;
- case 2: asm volatile ("ldt $f2,%0" :: "m"(val)); break;
- case 3: asm volatile ("ldt $f3,%0" :: "m"(val)); break;
- case 4: asm volatile ("ldt $f4,%0" :: "m"(val)); break;
- case 5: asm volatile ("ldt $f5,%0" :: "m"(val)); break;
- case 6: asm volatile ("ldt $f6,%0" :: "m"(val)); break;
- case 7: asm volatile ("ldt $f7,%0" :: "m"(val)); break;
- case 8: asm volatile ("ldt $f8,%0" :: "m"(val)); break;
- case 9: asm volatile ("ldt $f9,%0" :: "m"(val)); break;
- case 10: asm volatile ("ldt $f10,%0" :: "m"(val)); break;
- case 11: asm volatile ("ldt $f11,%0" :: "m"(val)); break;
- case 12: asm volatile ("ldt $f12,%0" :: "m"(val)); break;
- case 13: asm volatile ("ldt $f13,%0" :: "m"(val)); break;
- case 14: asm volatile ("ldt $f14,%0" :: "m"(val)); break;
- case 15: asm volatile ("ldt $f15,%0" :: "m"(val)); break;
- case 16: asm volatile ("ldt $f16,%0" :: "m"(val)); break;
- case 17: asm volatile ("ldt $f17,%0" :: "m"(val)); break;
- case 18: asm volatile ("ldt $f18,%0" :: "m"(val)); break;
- case 19: asm volatile ("ldt $f19,%0" :: "m"(val)); break;
- case 20: asm volatile ("ldt $f20,%0" :: "m"(val)); break;
- case 21: asm volatile ("ldt $f21,%0" :: "m"(val)); break;
- case 22: asm volatile ("ldt $f22,%0" :: "m"(val)); break;
- case 23: asm volatile ("ldt $f23,%0" :: "m"(val)); break;
- case 24: asm volatile ("ldt $f24,%0" :: "m"(val)); break;
- case 25: asm volatile ("ldt $f25,%0" :: "m"(val)); break;
- case 26: asm volatile ("ldt $f26,%0" :: "m"(val)); break;
- case 27: asm volatile ("ldt $f27,%0" :: "m"(val)); break;
- case 28: asm volatile ("ldt $f28,%0" :: "m"(val)); break;
- case 29: asm volatile ("ldt $f29,%0" :: "m"(val)); break;
- case 30: asm volatile ("ldt $f30,%0" :: "m"(val)); break;
- case 31: asm volatile ("ldt $f31,%0" :: "m"(val)); break;
+ case 0: LDT( 0, val); break;
+ case 1: LDT( 1, val); break;
+ case 2: LDT( 2, val); break;
+ case 3: LDT( 3, val); break;
+ case 4: LDT( 4, val); break;
+ case 5: LDT( 5, val); break;
+ case 6: LDT( 6, val); break;
+ case 7: LDT( 7, val); break;
+ case 8: LDT( 8, val); break;
+ case 9: LDT( 9, val); break;
+ case 10: LDT(10, val); break;
+ case 11: LDT(11, val); break;
+ case 12: LDT(12, val); break;
+ case 13: LDT(13, val); break;
+ case 14: LDT(14, val); break;
+ case 15: LDT(15, val); break;
+ case 16: LDT(16, val); break;
+ case 17: LDT(17, val); break;
+ case 18: LDT(18, val); break;
+ case 19: LDT(19, val); break;
+ case 20: LDT(20, val); break;
+ case 21: LDT(21, val); break;
+ case 22: LDT(22, val); break;
+ case 23: LDT(23, val); break;
+ case 24: LDT(24, val); break;
+ case 25: LDT(25, val); break;
+ case 26: LDT(26, val); break;
+ case 27: LDT(27, val); break;
+ case 28: LDT(28, val); break;
+ case 29: LDT(29, val); break;
+ case 30: LDT(30, val); break;
+ case 31: LDT(31, val); break;
default:
break;
}