diff options
author | Michael Forney <mforney@mforney.org> | 2019-04-27 16:24:48 -0700 |
---|---|---|
committer | Michael Forney <mforney@mforney.org> | 2019-04-27 16:30:41 -0700 |
commit | 1ef0706e1f2e97d0872eb801169de5023c3c8b7f (patch) | |
tree | 088e05e25fdcba693006410bd0dffd7bf730ed7d /test | |
parent | 9b52864932ec81033b5c9d34a81828d54192b958 (diff) | |
download | cproc-1ef0706e1f2e97d0872eb801169de5023c3c8b7f.tar.xz |
Sign-extend result of bit-field assignments
Fixes #51.
Thanks to Andrew Chambers for the bug report and test case.
Diffstat (limited to 'test')
-rw-r--r-- | test/bitfield-assignment-sign-extend.c | 6 | ||||
-rw-r--r-- | test/bitfield-assignment-sign-extend.qbe | 21 | ||||
-rw-r--r-- | test/bitfield-compound-assign.qbe | 12 |
3 files changed, 34 insertions, 5 deletions
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 } |