From 1ef0706e1f2e97d0872eb801169de5023c3c8b7f Mon Sep 17 00:00:00 2001
From: Michael Forney <mforney@mforney.org>
Date: Sat, 27 Apr 2019 16:24:48 -0700
Subject: Sign-extend result of bit-field assignments

Fixes #51.

Thanks to Andrew Chambers for the bug report and test case.
---
 test/bitfield-assignment-sign-extend.c   |  6 ++++++
 test/bitfield-assignment-sign-extend.qbe | 21 +++++++++++++++++++++
 test/bitfield-compound-assign.qbe        | 12 +++++++-----
 3 files changed, 34 insertions(+), 5 deletions(-)
 create mode 100644 test/bitfield-assignment-sign-extend.c
 create mode 100644 test/bitfield-assignment-sign-extend.qbe

(limited to 'test')

diff --git a/test/bitfield-assignment-sign-extend.c b/test/bitfield-assignment-sign-extend.c
new file mode 100644
index 0000000..f466881
--- /dev/null
+++ b/test/bitfield-assignment-sign-extend.c
@@ -0,0 +1,6 @@
+struct {
+	signed x : 4;
+} s;
+int main(void) {
+	return (s.x = 15) != -1;
+}
diff --git a/test/bitfield-assignment-sign-extend.qbe b/test/bitfield-assignment-sign-extend.qbe
new file mode 100644
index 0000000..05ffbf9
--- /dev/null
+++ b/test/bitfield-assignment-sign-extend.qbe
@@ -0,0 +1,21 @@
+export
+function w $main() {
+@start.1
+@body.2
+	%.1 =l copy $s
+	%.2 =l mul 0, 1
+	%.3 =l add %.1, %.2
+	%.4 =l copy %.3
+	%.5 =w shl 15, 0
+	%.6 =w shl %.5, 28
+	%.7 =w sar %.6, 28
+	%.8 =w and %.5, 15
+	%.9 =w loaduw %.4
+	%.10 =w and %.9, 18446744073709551600
+	%.11 =w or %.8, %.10
+	storew %.11, %.4
+	%.12 =w sub 0, 1
+	%.13 =w cnew %.7, %.12
+	ret %.13
+}
+export data $s = align 4 { z 4 }
diff --git a/test/bitfield-compound-assign.qbe b/test/bitfield-compound-assign.qbe
index 5cc38de..8e08ff6 100644
--- a/test/bitfield-compound-assign.qbe
+++ b/test/bitfield-compound-assign.qbe
@@ -11,11 +11,13 @@ function $f() {
 	%.7 =w sar %.6, 23
 	%.8 =w add %.7, 3
 	%.9 =w shl %.8, 4
-	%.10 =w and %.9, 8176
-	%.11 =w loaduw %.4
-	%.12 =w and %.11, 18446744073709543439
-	%.13 =w or %.10, %.12
-	storew %.13, %.4
+	%.10 =w shl %.9, 19
+	%.11 =w sar %.10, 23
+	%.12 =w and %.9, 8176
+	%.13 =w loaduw %.4
+	%.14 =w and %.13, 18446744073709543439
+	%.15 =w or %.12, %.14
+	storew %.15, %.4
 	ret
 }
 export data $s = align 4 { z 4 }
-- 
cgit v1.2.3