shithub: MicroHs

Download patch

ref: 3998e17925f21860600b24e575de5c4c34aca5fc
parent: 820ebb5f04f1c17c638d0c51f9957a8b78bbae08
author: Lennart Augustsson <lennart.augustsson@epicgames.com>
date: Fri Jan 12 20:24:15 EST 2024

Minor improvements.

--- a/STM32/Blinky.c
+++ /dev/null
@@ -1,156 +1,0 @@
-const unsigned char combexprdata[] = {
-118,55,46,48,10,50,54,10,83,39,32,85,32,75,50,32,75,32,64,32,
-64,32,58,55,48,49,32,66,32,66,32,66,32,67,32,64,32,64,32,64,
-32,66,32,66,32,67,32,64,32,64,32,80,32,64,32,64,32,66,32,66,
-32,66,32,66,32,67,32,64,32,64,32,64,32,64,32,66,32,66,32,66,
-32,67,32,64,32,64,32,64,32,66,32,66,32,67,32,64,32,64,32,80,
-32,64,32,64,32,64,32,80,32,66,32,67,32,73,79,46,62,62,61,32,
-64,32,64,32,66,32,73,79,46,114,101,116,117,114,110,32,64,32,64,32,
-64,32,67,39,32,66,32,64,32,85,32,75,32,64,32,58,52,56,55,55,
-32,64,32,75,32,64,32,95,49,51,54,53,53,32,64,32,64,32,58,49,
-51,54,53,53,32,64,32,73,79,46,114,101,116,117,114,110,32,64,32,83,
-39,32,67,39,66,32,64,32,85,32,75,32,90,32,75,32,64,32,64,32,
-64,32,58,54,57,55,32,64,32,83,39,32,67,39,66,32,64,32,95,54,
-57,55,32,64,32,66,39,32,85,32,75,50,32,65,32,64,32,64,32,58,
-55,48,52,32,64,32,64,32,64,32,95,49,51,54,55,48,32,64,32,64,
-32,83,39,32,66,32,64,32,85,32,75,50,32,90,32,75,32,64,32,64,
-32,64,32,58,54,49,49,32,64,32,67,39,32,85,32,65,32,64,32,64,
-32,85,32,90,32,90,32,90,32,75,32,64,32,64,32,64,32,64,32,58,
-54,48,50,32,64,32,73,32,64,32,64,32,95,49,51,54,54,53,32,64,
-32,64,32,83,39,32,66,32,64,32,95,54,49,49,32,64,32,67,39,32,
-95,52,56,55,55,32,64,32,95,54,48,50,32,64,32,75,32,64,32,64,
-32,95,49,51,54,54,53,32,64,32,64,32,58,49,51,54,54,53,32,64,
-32,73,79,46,62,62,61,32,64,32,73,79,46,62,62,32,64,32,73,79,
-46,114,101,116,117,114,110,32,64,32,58,49,51,54,55,48,32,64,32,64,
-32,67,32,66,32,66,32,73,32,66,32,67,32,64,32,66,32,66,32,89,
-32,64,32,64,32,83,39,32,66,32,64,32,66,39,32,66,32,80,32,64,
-32,67,32,95,55,48,52,32,64,32,73,32,64,32,64,32,64,32,64,32,
-67,39,32,67,39,66,32,64,32,66,32,66,32,67,39,66,32,64,32,64,
-32,66,39,32,95,54,57,55,32,64,32,64,32,64,32,90,32,64,32,64,
-32,64,32,64,32,95,49,51,54,55,48,32,64,32,85,32,75,50,32,75,
-52,32,75,32,64,32,64,32,64,32,66,32,66,32,66,32,66,32,66,32,
-66,32,66,32,67,32,64,32,64,32,64,32,64,32,64,32,64,32,64,32,
-66,32,66,32,66,32,66,32,66,32,66,32,67,32,64,32,64,32,64,32,
-64,32,64,32,64,32,66,32,66,32,66,32,66,32,66,32,67,32,64,32,
-64,32,64,32,64,32,64,32,66,32,66,32,66,32,66,32,67,32,64,32,
-64,32,64,32,64,32,66,32,66,32,66,32,67,32,64,32,64,32,64,32,
-66,32,66,32,67,32,64,32,64,32,80,32,64,32,64,32,64,32,64,32,
-64,32,64,32,67,32,85,32,90,32,90,32,90,32,90,32,90,32,75,32,
-64,32,64,32,64,32,64,32,64,32,64,32,58,56,55,54,51,32,66,32,
-66,32,66,32,66,32,66,32,66,32,67,32,64,32,64,32,64,32,64,32,
-64,32,64,32,66,32,66,32,66,32,66,32,66,32,67,32,64,32,64,32,
-64,32,64,32,64,32,66,32,66,32,66,32,66,32,67,32,64,32,64,32,
-64,32,64,32,66,32,66,32,66,32,67,32,64,32,64,32,64,32,66,32,
-66,32,67,32,64,32,64,32,80,32,64,32,64,32,64,32,64,32,64,32,
-43,32,64,32,45,32,64,32,42,32,64,32,110,101,103,32,64,32,83,32,
-83,32,67,32,85,32,75,50,32,90,32,90,32,90,32,90,32,75,32,64,
-32,64,32,64,32,64,32,64,32,64,32,66,32,66,32,66,32,66,32,66,
-32,66,32,66,32,67,32,64,32,64,32,64,32,64,32,64,32,64,32,64,
-32,66,32,66,32,66,32,66,32,66,32,66,32,67,32,64,32,64,32,64,
-32,64,32,64,32,64,32,66,32,66,32,66,32,66,32,66,32,67,32,64,
-32,64,32,64,32,64,32,64,32,66,32,66,32,66,32,66,32,67,32,64,
-32,64,32,64,32,64,32,66,32,66,32,66,32,67,32,64,32,64,32,64,
-32,66,32,66,32,67,32,64,32,64,32,80,32,64,32,64,32,64,32,64,
-32,64,32,64,32,80,32,61,61,32,64,32,47,61,32,64,32,58,52,57,
-55,53,32,64,32,99,111,109,112,97,114,101,32,64,32,60,32,64,32,60,
-61,32,64,32,62,32,64,32,62,61,32,64,32,67,39,32,67,39,32,83,
-32,64,32,64,32,67,39,32,83,39,32,67,32,64,32,64,32,85,32,75,
-51,32,90,32,90,32,90,32,75,32,64,32,64,32,64,32,64,32,64,32,
-58,56,57,48,50,32,64,32,73,32,64,32,64,32,73,32,64,32,95,52,
-57,57,49,32,64,32,64,32,67,39,32,83,39,32,67,32,64,32,64,32,
-67,39,32,67,39,32,83,32,64,32,64,32,95,56,57,48,50,32,64,32,
-73,32,64,32,64,32,73,32,64,32,95,52,57,57,49,32,64,32,64,32,
-58,52,57,57,49,32,64,32,64,32,35,48,32,64,32,64,32,73,32,64,
-32,64,32,85,32,75,51,32,90,32,90,32,75,32,64,32,64,32,64,32,
-64,32,58,56,55,56,49,32,95,52,57,50,54,32,64,32,64,32,64,32,
-67,32,67,32,67,32,67,32,85,32,75,32,90,32,90,32,90,32,90,32,
-90,32,75,32,64,32,64,32,64,32,64,32,64,32,64,32,64,32,95,52,
-57,57,49,32,64,32,64,32,35,48,32,64,32,64,32,95,56,55,56,49,
-32,95,52,57,50,54,32,64,32,85,32,75,32,75,52,32,65,32,64,32,
-64,32,64,32,58,56,55,57,51,32,95,52,57,50,54,32,64,32,83,32,
-67,39,32,67,32,64,32,83,32,83,39,32,67,39,32,64,32,66,32,83,
-39,32,64,32,60,61,32,35,48,32,64,32,64,32,64,32,67,39,32,67,
-32,64,32,67,39,32,83,39,32,67,39,32,64,32,64,32,61,61,32,64,
-32,66,32,66,32,65,32,110,111,77,97,116,99,104,32,102,114,111,109,85,
-84,70,56,32,34,46,46,47,108,105,98,47,68,97,116,97,47,73,110,116,
-101,103,101,114,95,84,121,112,101,46,104,115,34,32,64,32,64,32,35,50,
-52,32,64,32,35,49,32,64,32,64,32,64,32,64,32,66,32,66,32,80,
-32,65,32,64,32,64,32,64,32,85,32,64,32,64,32,64,32,64,32,80,
-32,65,32,64,32,79,32,35,48,32,64,32,79,32,35,48,32,64,32,79,
-32,35,50,32,64,32,75,32,64,32,64,32,64,32,64,32,64,32,64,32,
-64,32,66,32,66,32,80,32,75,32,64,32,64,32,64,32,85,32,64,32,
-64,32,64,32,89,32,67,39,32,67,32,64,32,66,32,83,32,61,61,32,
-35,48,32,64,32,64,32,64,32,66,32,83,39,32,79,32,64,32,67,32,
-114,101,109,32,64,32,61,61,32,89,32,67,39,32,67,32,64,32,66,32,
-83,39,32,83,39,32,64,32,61,61,32,35,48,32,64,32,64,32,64,32,
-67,39,32,67,39,66,32,64,32,67,32,66,32,64,32,67,32,115,104,114,
-32,64,32,35,49,32,64,32,64,32,64,32,43,32,35,49,32,64,32,64,
-32,64,32,64,32,73,32,64,32,64,32,105,110,118,32,35,48,32,64,32,
-64,32,35,48,32,64,32,64,32,35,54,52,32,64,32,35,51,50,55,54,
-56,32,64,32,35,50,49,52,55,52,56,51,54,52,56,32,64,32,58,54,
-51,55,52,32,64,32,64,32,64,32,67,32,66,32,64,32,67,32,113,117,
-111,116,32,64,32,95,54,51,55,52,32,64,32,64,32,64,32,64,32,64,
-32,75,32,64,32,64,32,64,32,64,32,45,32,35,48,32,64,32,64,32,
-58,54,52,52,49,32,35,49,32,64,32,64,32,64,32,64,32,64,32,35,
-48,32,64,32,64,32,35,49,32,64,32,64,32,85,32,67,39,66,32,66,
-32,42,32,64,32,80,32,35,49,32,64,32,45,32,35,48,32,64,32,35,
-49,32,64,32,64,32,64,32,64,32,80,32,35,48,32,64,32,83,32,80,
-32,64,32,83,39,32,83,39,32,80,32,64,32,64,32,67,39,66,32,43,
-32,64,32,42,32,95,54,51,55,52,32,64,32,64,32,64,32,66,32,66,
-32,90,32,64,32,64,32,67,39,66,32,66,39,32,43,32,64,32,64,32,
-66,32,66,32,42,32,95,54,51,55,52,32,64,32,64,32,64,32,67,39,
-66,32,43,32,64,32,42,32,95,54,51,55,52,32,64,32,64,32,64,32,
-64,32,64,32,64,32,64,32,64,32,64,32,64,32,64,32,58,52,57,50,
-54,32,64,32,64,32,95,56,55,57,51,32,95,52,57,50,54,32,64,32,
-95,54,52,52,49,32,35,49,32,64,32,64,32,64,32,64,32,67,32,85,
-32,75,32,90,32,90,32,90,32,90,32,75,32,64,32,64,32,64,32,64,
-32,64,32,64,32,58,56,55,55,48,32,95,52,57,50,54,32,64,32,64,
-32,95,56,55,57,51,32,95,52,57,50,54,32,64,32,95,54,52,52,49,
-32,35,49,32,64,32,64,32,64,32,64,32,73,32,64,32,73,32,64,32,
-83,32,79,32,64,32,66,32,85,32,75,52,32,90,32,90,32,75,32,64,
-32,64,32,64,32,64,32,58,51,51,54,49,32,95,51,54,55,52,32,64,
-32,64,32,67,32,95,56,55,54,51,32,95,52,57,50,54,32,64,32,64,
-32,35,49,32,64,32,64,32,64,32,64,32,83,39,32,67,39,32,89,32,
-64,32,64,32,66,32,66,32,66,32,83,32,79,32,64,32,64,32,64,32,
-64,32,66,32,66,32,67,32,66,32,64,32,64,32,64,32,66,32,66,32,
-67,32,95,56,55,54,51,32,95,52,57,50,54,32,64,32,64,32,64,32,
-64,32,67,32,95,56,55,55,48,32,95,52,57,50,54,32,64,32,64,32,
-64,32,64,32,64,32,64,32,73,32,64,32,64,32,66,32,67,39,32,66,
-32,89,32,64,32,66,32,66,32,80,32,75,32,64,32,64,32,64,32,67,
-39,66,32,66,32,83,39,32,66,32,64,32,64,32,82,32,75,32,64,32,
-64,32,64,32,67,39,66,32,79,32,64,32,64,32,64,32,64,32,58,55,
-54,56,50,32,64,32,67,32,95,56,57,48,50,32,95,52,57,57,49,32,
-64,32,64,32,64,32,64,32,95,51,51,54,49,32,95,51,54,55,52,32,
-64,32,64,32,64,32,83,39,32,83,32,64,32,83,39,32,83,39,32,83,
-39,32,64,32,64,32,67,32,85,32,75,52,32,90,32,90,32,75,32,64,
-32,64,32,64,32,64,32,95,52,57,57,49,32,64,32,64,32,64,32,66,
-32,66,32,67,39,32,95,55,54,56,50,32,64,32,67,32,85,32,75,32,
-75,52,32,90,32,75,32,64,32,64,32,64,32,64,32,95,52,57,57,49,
-32,64,32,64,32,64,32,64,32,64,32,85,32,75,32,75,52,32,90,32,
-75,32,64,32,64,32,64,32,64,32,58,51,51,54,55,32,95,51,54,55,
-52,32,64,32,64,32,64,32,64,32,66,32,66,32,67,39,32,95,55,54,
-56,50,32,64,32,67,32,95,56,57,48,50,32,95,52,57,57,49,32,64,
-32,64,32,64,32,64,32,64,32,95,51,51,54,55,32,95,51,54,55,52,
-32,64,32,64,32,64,32,64,32,58,51,54,55,52,32,64,32,95,56,55,
-57,51,32,95,52,57,50,54,32,64,32,95,54,52,52,49,32,35,48,32,
-64,32,64,32,64,32,95,56,55,57,51,32,95,52,57,50,54,32,64,32,
-95,54,52,52,49,32,35,51,32,64,32,64,32,64,32,64,32,64,32,64,
-32,64,32,66,32,67,39,32,83,39,32,95,55,48,49,32,95,49,51,54,
-55,48,32,64,32,64,32,64,32,67,32,67,39,66,32,66,32,73,32,64,
-32,94,115,101,116,95,108,101,100,32,64,32,64,32,80,32,35,48,32,64,
-32,35,49,32,64,32,64,32,64,32,64,32,64,32,66,32,66,32,67,39,
-32,115,101,113,32,64,32,67,32,83,32,67,32,85,32,75,32,64,32,95,
-52,57,55,53,32,64,32,64,32,35,48,32,64,32,64,32,66,32,95,52,
-56,51,32,64,32,67,32,95,56,55,55,48,32,95,52,57,50,54,32,64,
-32,64,32,35,49,32,64,32,64,32,64,32,64,32,73,32,64,32,58,52,
-56,51,32,64,32,95,55,48,52,32,95,49,51,54,55,48,32,64,32,73,
-32,64,32,64,32,64,32,64,32,95,56,55,54,51,32,95,52,57,50,54,
-32,64,32,64,32,64,32,64,32,58,52,52,55,32,64,32,65,32,64,32,
-64,32,83,39,32,95,55,48,49,32,95,49,51,54,55,48,32,64,32,64,
-32,67,32,95,52,52,55,32,64,32,75,32,64,32,64,32,66,32,95,52,
-49,50,32,64,32,67,32,95,56,55,54,51,32,95,52,57,50,54,32,64,
-32,64,32,35,49,32,64,32,64,32,64,32,64,32,58,52,49,50,32,35,
-53,48,48,32,64,32,125,
-0 };
-const unsigned char *combexpr = combexprdata;
-const int combexprlen = 3027;
--- a/STM32/Blinky.hs
+++ b/STM32/Blinky.hs
@@ -1,40 +1,11 @@
 module Blinky(main) where
---import Primitives
---import Data.Bool
 import Prelude
 
---foreign import ccall "set_led" setLed :: Int -> Int -> IO ()
-
-{-
 main :: IO ()
-main = --setLed (0::Int) (1::Int)
-  blinky (500::Int)
-
-blinky :: Int -> IO ()
-blinky n =
-  oneByOne n (1::Int) `primThen`
-  oneByOne n (0::Int) `primThen`
-  blinky (n `primIntAdd` 1)
-
-oneByOne :: Int -> Int -> IO ()
-oneByOne n on =
-  setLed (0::Int) on `primThen`
-  wait n `primThen`
-  setLed (1::Int) on `primThen`
-  wait n `primThen`
-  setLed (2::Int) on `primThen`
-  wait n `primThen`
-  setLed (3::Int) on `primThen`
-  wait n
-
-foreign import ccall "set_led" setLed :: Int -> Int -> IO ()
-
--}
-
-main :: IO ()
 main = blinky (500::Int)
 
 blinky :: Int -> IO ()
+blinky n | n > 1000 = return ()
 blinky n = do
   oneByOne n True
   oneByOne n False
@@ -44,28 +15,15 @@
 oneByOne n on = forM_ [0..3] $ \ led -> do
   setLed led on
   wait (n + led)
-{-
- do
-  setLed (0::Int) on
-  wait n
-  setLed (1::Int) on
-  wait n
-  setLed (2::Int) on
-  wait n
-  setLed (3::Int) on
-  wait n
--}
 
 foreign import ccall "set_led" set_led :: Int -> Int -> IO ()
+foreign import ccall "busy_wait" busy_wait :: Int -> IO ()
 
 setLed :: Int -> Bool -> IO ()
 setLed led on = set_led led $ if on then 1 else 0
-  --print ("setLed",led,on)
 
 wait :: Int -> IO ()
-wait n = do
-  --print ("wait", n)
-  seq (loop n) (return ())
+wait n = busy_wait (n*300)
 
 loop :: Int -> ()
 loop n = if n == 0 then () else loop (n - 1)
--- a/STM32/Makefile
+++ b/STM32/Makefile
@@ -6,7 +6,7 @@
 blinky.c:	Blinky.hs $(BIN)/Addcombs $(BIN)/mhseval $(BIN)/mhs
 	MHSDIR=$(MHSDIR) $(BIN)/mhs -i$(LIB) Blinky -oBlinky.comb
 	$(BIN)/mhseval +RTS -rBlinky.comb -oBlinky-opt.comb
-	$(BIN)/Addcombs Blinky-opt.comb Blinky.c
+	$(BIN)/Addcombs Blinky-opt.comb blinky.c
 
 $(BIN)/Addcombs:	$(TOOLS)/Addcombs.hs $(BIN)/mhs
 	MHSDIR=$(MHSDIR) $(BIN)/mhs -i$(TOOLS) Addcombs -o$(BIN)/Addcombs
--- a/src/runtime/config-stm32f4.h
+++ b/src/runtime/config-stm32f4.h
@@ -104,6 +104,15 @@
   GPIOD->BSRR = 1 << (12 + led + (on ? 0 : 16));
 }
 
+#pragma push
+#pragma O0
+void
+busy_wait(volatile uint32_t cnt) {
+  while(cnt--)
+    _nop_();
+}
+#pragma pop
+
 /* Instead of exit()ing, flash the green LED on exit code 0 else the red */
 void
 myexit(int n)
@@ -115,11 +124,9 @@
   int led = n ? 2 : 0;
   for(;;) {
     set_led(led, 1);
-    for(int i = 0; i < 100000; i++)
-      ;
+    busy_wait(1000000);
     set_led(led, 0);
-    for(int i = 0; i < 100000; i++)
-      ;
+    busy_wait(1000000);
   }
 }
 #define EXIT myexit
@@ -134,3 +141,7 @@
   return 32 - i;                /* 31 leading zeros should return 1 */
 }
 #define FFS ffs
+
+#define FFI_EXTRA \
+  { "set_led",   (funptr_t)set_led,   FFI_IIV }, \
+  { "busy_wait", (funptr_t)busy_wait, FFI_IV },
--- a/src/runtime/eval.c
+++ b/src/runtime/eval.c
@@ -20,14 +20,6 @@
 
 //#include "config.h"
 
-#if WANT_MD5                    /* XXX */
-void
-set_led(int led, int on)
-{
-  printf("set_led %d %d\n", led, on);
-}
-#endif
-
 #define VERSION "v7.0\n"
 
 typedef intptr_t value_t;       /* Make value the same size as pointers, since they are in a union */
@@ -496,9 +488,9 @@
  * are among the combinators.
  */
 struct {
-  char *name;
-  enum node_tag tag;
-  enum node_tag flipped;        /* What should (C op) reduce to? defaults to T_FREE */
+  const char *name;
+  const enum node_tag tag;
+  const enum node_tag flipped;        /* What should (C op) reduce to? defaults to T_FREE */
   NODEPTR node;
 } primops[] = {
   /* combinators */
@@ -612,7 +604,9 @@
   { "toDbl", T_TODBL },
 };
 
+#if GCRED
 enum node_tag flip_ops[T_LAST_TAG];
+#endif
 
 void
 init_nodes(void)
@@ -681,9 +675,11 @@
     }
   }
 #endif
+#if GCRED
   for (unsigned int j = 0; j < sizeof primops / sizeof primops[0]; j++) {
     flip_ops[primops[j].tag] = primops[j].flipped;
   }
+#endif
 
   /* The representation of the constructors of
    *  data Ordering = LT | EQ | GT
@@ -950,14 +946,15 @@
  *   PPP  void*   name(void*, void*)
  * more can easily be added.
  */
-struct {
+struct ffi_info {
   const char *ffi_name;
   const funptr_t ffi_fun;
-  enum { FFI_V, FFI_I, FFI_IV, FFI_II, FFI_IIV, FFI_III, FFI_DD, FFI_DDD, FFI_PI,
-         FFI_i, FFI_Pi, FFI_iPi, FFI_PIIPI, FFI_PIV, FFI_IIP,
-         FFI_PPI, FFI_PP, FFI_PPP, FFI_IPI, FFI_PV, FFI_IP, FFI_PPV, FFI_PPzV,
+  const enum { FFI_V, FFI_I, FFI_IV, FFI_II, FFI_IIV, FFI_III, FFI_DD, FFI_DDD, FFI_PI,
+               FFI_i, FFI_Pi, FFI_iPi, FFI_PIIPI, FFI_PIV, FFI_IIP,
+               FFI_PPI, FFI_PP, FFI_PPP, FFI_IPI, FFI_PV, FFI_IP, FFI_PPV, FFI_PPzV,
   } ffi_how;
-} ffi_table[] = {
+};
+const struct ffi_info ffi_table[] = {
 #if WORD_SIZE == 64
   { "llabs",    (funptr_t)llabs,   FFI_II },
 #else  /* WORD_SIZE */
@@ -1026,7 +1023,9 @@
   { "pokeByte", (funptr_t)pokeByte,FFI_PIV },
   { "memcpy",   (funptr_t)memcpy,  FFI_PPzV },
   { "memmove",  (funptr_t)memmove, FFI_PPzV },
-  { "set_led",  (funptr_t)set_led, FFI_IIV },
+#if defined(FFI_EXTRA)
+FFI_EXTRA
+#endif  /* defined(FFI_EXTRA) */
 };
 
 /* Look up an FFI function by name */
@@ -2740,6 +2739,7 @@
   }
 }
 
+#if WANT_ARGS
 heapoffs_t
 memsize(const char *p)
 {
@@ -2754,6 +2754,7 @@
   }
   return n;
 }
+#endif
 
 extern uint8_t *combexpr;
 extern int combexprlen;
@@ -2761,15 +2762,17 @@
 int
 main(int argc, char **argv)
 {
+  NODEPTR prog;
+#if WANT_ARGS
   char *inname = 0;
   char **av;
-  NODEPTR prog;
   int inrts;
+  int dump_ticks = 0;
+#endif
 #if WANT_STDIO
   char *outname = 0;
   size_t file_size = 0;
 #endif
-  int dump_ticks = 0;
   
 #if 0
   /* MINGW doesn't do buffering right */
--